From 654934494616ee0302a44dc15dd661c91b8f31fe Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Mon, 19 Oct 2026 11:08:46 +0400 Subject: [PATCH 01/45] feat(sky): replace the blocky default sky box with catalogue stars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cesium's default Tycho-2 sky box is six 1024² JPEGs stretched 3–6× around the whole-globe view, so space read as an over-compressed JPEG (HAL-627). The scene now draws its own sky in the Scene#skyBox slot: the 9,096 stars of the Yale Bright Star Catalogue as point sprites sized in CSS pixels (magnitude → width and opacity, B−V → colour), over a soft, star-free Milky Way cube map built from ESO/S. Brunier's panorama (CC BY 4.0). Both layers share one ICRF→Earth-fixed rotation at the scene clock, with the TEME rotation filling in until Cesium's IAU 2006 tables load. Assets total 482 KB, built by scripts/build-bright-stars.mjs and scripts/build-milky-way.mjs. Frame time and the idle render governor are unchanged. Co-Authored-By: Claude Opus 5.5 --- DATA_SOURCES.md | 16 + scripts/build-bright-stars.mjs | 158 + scripts/build-milky-way.mjs | 372 + scripts/format-scope.json | 7 +- scripts/package-boundaries.json | 11 +- src/app/viewer.js | 5 + src/data/dataCredits.js | 7 + src/data/local_data/sky/README.md | 65 + src/data/local_data/sky/bright_stars.json | 9099 +++++++++++++++++++++ src/data/local_data/sky/milkyway_nx.webp | Bin 0 -> 40374 bytes src/data/local_data/sky/milkyway_ny.webp | Bin 0 -> 42866 bytes src/data/local_data/sky/milkyway_nz.webp | Bin 0 -> 45584 bytes src/data/local_data/sky/milkyway_px.webp | Bin 0 -> 36318 bytes src/data/local_data/sky/milkyway_py.webp | Bin 0 -> 41812 bytes src/data/local_data/sky/milkyway_pz.webp | Bin 0 -> 39850 bytes src/sky/starrySky.js | 430 + src/sky/starrySky.test.mjs | 89 + src/sky/stars.js | 146 + src/sky/stars.test.mjs | 134 + src/tooling/skyAssets.test.mjs | 107 + 20 files changed, 10644 insertions(+), 2 deletions(-) create mode 100644 scripts/build-bright-stars.mjs create mode 100644 scripts/build-milky-way.mjs create mode 100644 src/data/local_data/sky/README.md create mode 100644 src/data/local_data/sky/bright_stars.json create mode 100644 src/data/local_data/sky/milkyway_nx.webp create mode 100644 src/data/local_data/sky/milkyway_ny.webp create mode 100644 src/data/local_data/sky/milkyway_nz.webp create mode 100644 src/data/local_data/sky/milkyway_px.webp create mode 100644 src/data/local_data/sky/milkyway_py.webp create mode 100644 src/data/local_data/sky/milkyway_pz.webp create mode 100644 src/sky/starrySky.js create mode 100644 src/sky/starrySky.test.mjs create mode 100644 src/sky/stars.js create mode 100644 src/sky/stars.test.mjs create mode 100644 src/tooling/skyAssets.test.mjs diff --git a/DATA_SOURCES.md b/DATA_SOURCES.md index d930bcb8f..079213634 100644 --- a/DATA_SOURCES.md +++ b/DATA_SOURCES.md @@ -198,6 +198,8 @@ The [Bhote Koshi event pack](public/events/bhote-koshi-2026/README.md), under `p | **DataSF Analysis Neighborhoods** (41 SF neighborhood polygons) | `neighborhoods/` | **PDDL 1.0** (public domain) | ✅ (no restrictions) | "City & County of San Francisco — DataSF" (courtesy — not legally required) | | **Natural Earth countries, states and provinces** (260 admin-0/map units + 4,587 admin-1 polygons) | `natural_earth/` | **Public domain** | ✅ (no restrictions) | "Made with Natural Earth" (courtesy credit — not legally required) | | **US Census Bureau counties** (3,235 county polygons) | `us_census_counties/` | **Public domain** | ✅ (no restrictions) | "U.S. Census Bureau" (courtesy — not legally required) | +| **Yale Bright Star Catalogue** (9,096 stars, sky background) | `sky/` | **Public domain** | ✅ (no restrictions) | "Yale Bright Star Catalogue (Hoffleit & Warren, via CDS)" (courtesy credit) | +| **ESO Milky Way panorama** (eso0932a, blurred cube map, sky background) | `sky/` | **CC BY 4.0** | ✅ (attribution; changes stated) | "ESO/S. Brunier" | | **CCTV ground heights** (3,445 cameras) | `cctv_ground_heights/` | Precomputed camera placement heights, aligned to work with Google Photorealistic 3D Tiles (folder README) | — | — | | **CCTV Camera Database** model-enrichment extract v2.26.0 (17 camera-model records) | `src/layers/cctv/modelSpecs.js` | **CC0-1.0** (public domain dedication) | ✅ (no restrictions) | "Specs: cctv-database.com" (courtesy — not legally required) | @@ -270,6 +272,20 @@ https://www.naturalearthdata.com/about/terms-of-use/). We credit anyway: "Made w Earth". Registration in the in-app `dataCredits.js` attribution list ships with the resolver wiring (see below). +### Sky background (`sky/`) + +The space behind the globe is drawn from two bundled sources (details, hashes +and build commands in [`sky/README.md`](src/data/local_data/sky/README.md)): + +- **Stars:** the Yale Bright Star Catalogue, 5th Revised Edition (Hoffleit & + Warren 1991, CDS catalogue V/50) — public domain; credited as a courtesy. +- **Milky Way glow:** ESO image eso0932a, "The Milky Way panorama" — **CC BY + 4.0, credit "ESO/S. Brunier"**. Modified: stars removed, blurred, reprojected + to ICRF cube faces and tone-mapped, as the folder README states. + +NASA SVS "Deep Star Maps 2020" was not used for the glow: its Milky Way layer +derives from Gaia DR2, which ESA licenses CC BY-NC 3.0 IGO. + ### DataSF Analysis Neighborhoods (`neighborhoods/`) `neighborhoods/san-francisco.json` bundles the City & County of San Francisco's official diff --git a/scripts/build-bright-stars.mjs b/scripts/build-bright-stars.mjs new file mode 100644 index 000000000..45a6aaab3 --- /dev/null +++ b/scripts/build-bright-stars.mjs @@ -0,0 +1,158 @@ +#!/usr/bin/env node +/** + * Build src/data/local_data/sky/bright_stars.json from the Yale Bright Star + * Catalogue, 5th Revised Edition (Hoffleit & Warren 1991). + * + * Source: CDS VizieR catalogue V/50, https://cdsarc.cds.unistra.fr/viz-bin/cat/V/50 + * Fetched: https://cdsarc.cds.unistra.fr/ftp/V/50/catalog.gz + * Format: fixed-width ASCII, 197 bytes per record, byte layout in + * https://cdsarc.cds.unistra.fr/ftp/V/50/ReadMe + * License: public domain (Yale University Observatory / NASA ADC); CDS asks + * for an acknowledgement, which DATA_SOURCES.md carries. + * + * Transform (deterministic): + * 1. J2000 RA/Dec (bytes 76-90), V magnitude (103-107) and B−V (110-114). + * 2. The 14 records without a J2000 position (novae and other objects later + * found not to be stars) are dropped. + * 3. RA/Dec rounded to 3 decimals of a degree (3.6″ — a fraction of a pixel + * at any field of view the globe uses), magnitudes to 2. + * 4. Missing B−V is stored as null; the renderer gives it a neutral colour. + * 5. Records keep catalogue (HR) order for a stable diff. + * + * Usage: + * node scripts/build-bright-stars.mjs [catalog | catalog.gz] + * With no argument it downloads the catalogue from CDS. + */ + +import fs from 'node:fs'; +import path from 'node:path'; +import zlib from 'node:zlib'; +import { fileURLToPath } from 'node:url'; + +const SOURCE_URL = 'https://cdsarc.cds.unistra.fr/ftp/V/50/catalog.gz'; +const OUT = path.join( + path.dirname(fileURLToPath(import.meta.url)), + '..', + 'src', + 'data', + 'local_data', + 'sky', + 'bright_stars.json', +); + +/** Slice 1-based inclusive byte columns the way the CDS ReadMe numbers them. */ +function columns(line, from, to) { + return line.slice(from - 1, to).trim(); +} + +/** Parse a fixed-width float; blank fields are null. */ +function parseField(text) { + if (text === '') return null; + const value = Number(text); + return Number.isFinite(value) ? value : null; +} + +/** + * Parse one BSC5 record. Returns null for records without a J2000 position + * or V magnitude. + */ +export function parseBscRecord(line) { + const hr = parseField(columns(line, 1, 4)); + const raH = parseField(columns(line, 76, 77)); + const raM = parseField(columns(line, 78, 79)); + const raS = parseField(columns(line, 80, 83)); + const sign = columns(line, 84, 84); + const deD = parseField(columns(line, 85, 86)); + const deM = parseField(columns(line, 87, 88)); + const deS = parseField(columns(line, 89, 90)); + const vmag = parseField(columns(line, 103, 107)); + const bv = parseField(columns(line, 110, 114)); + if ( + hr === null || + raH === null || + raM === null || + raS === null || + deD === null || + deM === null || + deS === null || + vmag === null || + (sign !== '+' && sign !== '-') + ) + return null; + const raDeg = (raH + raM / 60 + raS / 3600) * 15; + const decDeg = (sign === '-' ? -1 : 1) * (deD + deM / 60 + deS / 3600); + return { hr, raDeg, decDeg, vmag, bv }; +} + +const round = (value, decimals) => { + const scale = 10 ** decimals; + return Math.round(value * scale) / scale; +}; + +/** Build the committed pack from the raw catalogue text. */ +export function buildStarPack(text, { fetched = null } = {}) { + const stars = []; + let dropped = 0; + for (const line of text.split('\n')) { + if (line.trim() === '') continue; + const record = parseBscRecord(line); + if (!record) { + dropped += 1; + continue; + } + stars.push( + round(record.raDeg, 3), + round(record.decDeg, 3), + round(record.vmag, 2), + record.bv === null ? null : round(record.bv, 2), + ); + } + return { + meta: { + source: + 'Yale Bright Star Catalogue, 5th Revised Ed. (Hoffleit & Warren 1991), CDS V/50', + url: SOURCE_URL, + license: 'public domain', + fetched, + frame: 'ICRF/J2000, epoch 2000.0', + columns: ['raDeg', 'decDeg', 'vmag', 'bv'], + count: stars.length / 4, + dropped, + }, + stars, + }; +} + +async function readCatalogue(file) { + if (!file) { + const response = await fetch(SOURCE_URL); + if (!response.ok) throw new Error(`${SOURCE_URL}: HTTP ${response.status}`); + return zlib + .gunzipSync(Buffer.from(await response.arrayBuffer())) + .toString('latin1'); + } + const bytes = fs.readFileSync(file); + return (file.endsWith('.gz') ? zlib.gunzipSync(bytes) : bytes).toString( + 'latin1', + ); +} + +async function main() { + const [file] = process.argv.slice(2); + const text = await readCatalogue(file); + const pack = buildStarPack(text, { + fetched: new Date().toISOString().slice(0, 10), + }); + // One star per line keeps the JSON compact and the diff readable. + const rows = []; + for (let i = 0; i < pack.stars.length; i += 4) + rows.push(JSON.stringify(pack.stars.slice(i, i + 4)).slice(1, -1)); + const body = `{"meta":${JSON.stringify(pack.meta)},\n"stars":[\n${rows.join(',\n')}\n]}\n`; + fs.mkdirSync(path.dirname(OUT), { recursive: true }); + fs.writeFileSync(OUT, body); + console.log( + `wrote ${pack.meta.count} stars (${pack.meta.dropped} dropped) → ${path.relative(process.cwd(), OUT)} (${body.length} bytes)`, + ); +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) await main(); diff --git a/scripts/build-milky-way.mjs b/scripts/build-milky-way.mjs new file mode 100644 index 000000000..4a482631d --- /dev/null +++ b/scripts/build-milky-way.mjs @@ -0,0 +1,372 @@ +#!/usr/bin/env node +/** + * Build the soft Milky Way cube map in src/data/local_data/sky/ from the ESO + * all-sky Milky Way panorama. + * + * Source page: https://www.eso.org/public/images/eso0932a/ + * Fetched: https://cdn.eso.org/images/original/eso0932a.tif + * (6000×3000 8-bit sRGB TIFF, 27.7 MB; sha256 in README.md) + * Credit: ESO/S. Brunier + * License: CC BY 4.0 (https://www.eso.org/public/outreach/copyright/). + * Modified: stars removed, blurred, reprojected to ICRF cube + * faces and tone-mapped, as below. + * Frame: plate carrée in galactic coordinates, centred on the Galactic + * Centre, galactic longitude increasing to the left. + * + * Transform (deterministic): + * 1. Resample to WORK_WIDTH×WORK_WIDTH/2 and convert sRGB to linear light. + * 2. Paint out the planets the 2008–2010 exposures caught (PLANETS): they + * sit where today's sky has nothing and are far brighter than any star. + * 3. Remove stars with a morphological opening (minimum, then maximum, over + * a (2·OPEN_RADIUS+1)² window): anything smaller than the window — every + * star — drops to the surrounding sky; the renderer draws catalogue stars + * itself, sharp and in the right place. + * 4. Blur with a three-pass box approximation of a Gaussian, σ = BLUR_DEG on + * the sky: rows wrap in longitude and widen by 1/cos(latitude) so the + * blur stays round towards the poles. + * 5. Resample into six FACE_SIZE² cube faces in the standard WebGL face + * orientation (the renderer uploads them without flipY), with the ICRF + * axes as the cube axes — +X to the March equinox, +Z to the north + * celestial pole — rotating each direction into galactic coordinates + * with the IAU J2000 matrix. + * 6. Map the darkest 25 % of the sky to black and the brightest 0.01 % to + * white, encode with gamma 1/2.2 and ±0.5 LSB dither against banding; + * WebP. + * + * Usage: + * node scripts/build-milky-way.mjs + * Needs the sharp dev dependency. + */ + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export const FACE_SIZE = 1024; +export const BLUR_DEG = 0.4; +const WORK_WIDTH = 4096; +const OPEN_RADIUS = 3; +const WEBP_QUALITY = 96; +// The darkest quarter of the sky is the black level: away from the galactic +// plane the panorama carries a mottled glow of unresolved stars that would +// read as grey fog around the globe. +const BLACK_PERCENTILE = 0.25; +const WHITE_PERCENTILE = 0.9999; +const OUT_DIR = path.join( + path.dirname(fileURLToPath(import.meta.url)), + '..', + 'src', + 'data', + 'local_data', + 'sky', +); + +/** + * Bright planets in the panorama, galactic longitude/latitude in degrees and + * the radius painted over with the surrounding sky. By position both are + * Jupiter, in Sagittarius (2008) and Aquarius (2010); no catalogue star lies + * under either. + */ +export const PLANETS = Object.freeze([ + { l: 13.4, b: -16.6, radiusDeg: 2.5 }, + { l: 69.0, b: -58.4, radiusDeg: 2.5 }, +]); + +/** Cube faces in WebGL upload order. */ +export const CUBE_FACES = Object.freeze([ + 'positiveX', + 'negativeX', + 'positiveY', + 'negativeY', + 'positiveZ', + 'negativeZ', +]); +export const FACE_FILE_SUFFIX = Object.freeze({ + positiveX: 'px', + negativeX: 'nx', + positiveY: 'py', + negativeY: 'ny', + positiveZ: 'pz', + negativeZ: 'nz', +}); + +/** + * ICRF (J2000 equatorial) → galactic rotation, rows = galactic axes + * (Hipparcos catalogue, ESA SP-1200 vol. 1 §1.5.3). + */ +export const ICRF_TO_GALACTIC = Object.freeze([ + [-0.0548755604162154, -0.873437090234885, -0.4838350155487132], + [0.4941094278755837, -0.4448296299600112, 0.7469822444972189], + [-0.867666149019004, -0.1980763734312015, 0.4559837761750669], +]); + +/** + * Direction (not normalized) that the WebGL cube-map lookup sends to texel + * coordinate (s, t) ∈ [0, 1]² of `face`, t = 0 being the first image row. + * Inverse of the OpenGL ES 3.0 §3.8.10 major-axis table. + */ +export function cubeFaceDirection(face, s, t) { + const sc = 2 * s - 1; + const tc = 2 * t - 1; + switch (face) { + case 'positiveX': + return [1, -tc, -sc]; + case 'negativeX': + return [-1, -tc, sc]; + case 'positiveY': + return [sc, 1, tc]; + case 'negativeY': + return [sc, -1, -tc]; + case 'positiveZ': + return [sc, -tc, 1]; + case 'negativeZ': + return [-sc, -tc, -1]; + default: + throw new RangeError(`Unknown cube face ${face}`); + } +} + +/** Rotate an ICRF direction into galactic coordinates. */ +export function icrfToGalactic([x, y, z]) { + return ICRF_TO_GALACTIC.map((row) => row[0] * x + row[1] * y + row[2] * z); +} + +/** + * Map a direction to (u, v) ∈ [0, 1)² of a plate carrée centred on + * longitude 0 with longitude increasing to the left and v = 0 at +90°. + */ +export function directionToPlateCarree(x, y, z) { + const longitude = Math.atan2(y, x); + const latitude = Math.atan2(z, Math.hypot(x, y)); + let u = 0.5 - longitude / (2 * Math.PI); + u -= Math.floor(u); + return [u, 0.5 - latitude / Math.PI]; +} + +/** Box widths whose three passes approximate a Gaussian of `sigma` (Kovesi). */ +function boxRadii(sigma) { + const ideal = Math.sqrt((12 * sigma * sigma) / 3 + 1); + let lower = Math.floor(ideal); + if (lower % 2 === 0) lower -= 1; + const upper = lower + 2; + const m = Math.round( + (12 * sigma * sigma - 3 * lower * lower - 12 * lower - 9) / + (-4 * lower - 4), + ); + return [0, 1, 2].map((i) => ((i < m ? lower : upper) - 1) / 2); +} + +/** Index along a line, wrapped or clamped at the ends. */ +function lineIndex(i, length, wrap) { + if (wrap) return ((i % length) + length) % length; + return i < 0 ? 0 : i >= length ? length - 1 : i; +} + +/** Running-sum box blur of one strided line. */ +function boxLine(src, dst, offset, stride, length, radius, wrap) { + if (radius < 1) { + for (let i = 0; i < length; i++) + dst[offset + i * stride] = src[offset + i * stride]; + return; + } + const r = wrap ? Math.min(radius, Math.floor((length - 1) / 2)) : radius; + const at = (i) => src[offset + lineIndex(i, length, wrap) * stride]; + let sum = 0; + for (let i = -r; i <= r; i++) sum += at(i); + const scale = 1 / (2 * r + 1); + for (let i = 0; i < length; i++) { + dst[offset + i * stride] = sum * scale; + sum += at(i + r + 1) - at(i - r); + } +} + +/** Minimum or maximum over a (2r+1) window of one strided line. */ +function extremumLine(src, dst, offset, stride, length, radius, wrap, pick) { + for (let i = 0; i < length; i++) { + let value = src[offset + lineIndex(i - radius, length, wrap) * stride]; + for (let k = -radius + 1; k <= radius; k++) + value = pick( + value, + src[offset + lineIndex(i + k, length, wrap) * stride], + ); + dst[offset + i * stride] = value; + } +} + +/** Separable minimum or maximum filter over a plate-carrée plane, in place. */ +function extremumPlane(plane, width, height, radius, pick) { + const scratch = new Float32Array(plane.length); + for (let y = 0; y < height; y++) + extremumLine(plane, scratch, y * width, 1, width, radius, true, pick); + for (let x = 0; x < width; x++) + extremumLine(scratch, plane, x, width, height, radius, false, pick); +} + +/** Blur one plate-carrée channel in place, round on the sphere. */ +function blurPlane(plane, width, height, sigmaPx) { + const scratch = new Float32Array(plane.length); + for (let y = 0; y < height; y++) { + const latitude = (0.5 - (y + 0.5) / height) * Math.PI; + const sigmaX = Math.min( + width / 4, + sigmaPx / Math.max(Math.cos(latitude), 1e-3), + ); + for (const radius of boxRadii(sigmaX)) { + boxLine(plane, scratch, y * width, 1, width, Math.round(radius), true); + plane.set(scratch.subarray(y * width, (y + 1) * width), y * width); + } + } + for (const radius of boxRadii(sigmaPx)) { + for (let x = 0; x < width; x++) + boxLine(plane, scratch, x, width, height, Math.round(radius), false); + plane.set(scratch); + } +} + +/** Unit vector for galactic longitude and latitude in degrees. */ +function galacticVector(l, b) { + const lr = (l * Math.PI) / 180; + const br = (b * Math.PI) / 180; + return [ + Math.cos(br) * Math.cos(lr), + Math.cos(br) * Math.sin(lr), + Math.sin(br), + ]; +} + +/** + * Replace a disc of the sky with the mean of the ring just outside it, per + * channel. The blur that follows hides the seam. + */ +function paintOut(planes, width, height, { l, b, radiusDeg }) { + const centre = galacticVector(l, b); + const inner = Math.cos((radiusDeg * Math.PI) / 180); + const outer = Math.cos(((radiusDeg + 0.5) * Math.PI) / 180); + const disc = []; + const ring = []; + const span = Math.ceil(((radiusDeg + 0.5) / 180) * height); + const row = Math.round((0.5 - b / 180) * height); + for (let y = Math.max(0, row - span); y < Math.min(height, row + span); y++) { + const latitude = 90 - ((y + 0.5) * 180) / height; + for (let x = 0; x < width; x++) { + const longitude = (0.5 - (x + 0.5) / width) * 360; + const p = galacticVector(longitude, latitude); + const cos = p[0] * centre[0] + p[1] * centre[1] + p[2] * centre[2]; + if (cos >= inner) disc.push(y * width + x); + else if (cos >= outer) ring.push(y * width + x); + } + } + for (const plane of planes) { + let sum = 0; + for (const index of ring) sum += plane[index]; + const mean = sum / ring.length; + for (const index of disc) plane[index] = mean; + } +} + +/** Bilinear sample with longitude wrap and latitude clamp. */ +function samplePlane(plane, width, height, u, v) { + const fx = u * width - 0.5; + const fy = Math.min(Math.max(v * height - 0.5, 0), height - 1); + const x0 = Math.floor(fx); + const y0 = Math.floor(fy); + const ax = fx - x0; + const ay = fy - y0; + const xa = ((x0 % width) + width) % width; + const xb = (xa + 1) % width; + const yb = Math.min(y0 + 1, height - 1); + const top = plane[y0 * width + xa] * (1 - ax) + plane[y0 * width + xb] * ax; + const bottom = + plane[yb * width + xa] * (1 - ax) + plane[yb * width + xb] * ax; + return top * (1 - ay) + bottom * ay; +} + +/** Deterministic hash noise in [-0.5, 0.5) for dithering. */ +function dither(index, channel) { + let h = (index * 374761393 + channel * 668265263) | 0; + h = Math.imul(h ^ (h >>> 13), 1274126177); + h ^= h >>> 16; + return (h >>> 0) / 4294967296 - 0.5; +} + +/** Value at `fraction` of the sorted luminance. */ +function luminancePercentile(planes, fraction) { + const [r, g, b] = planes; + const lum = new Float32Array(r.length); + for (let i = 0; i < lum.length; i++) lum[i] = (r[i] + g[i] + b[i]) / 3; + lum.sort(); + return lum[Math.min(lum.length - 1, Math.floor(fraction * lum.length))]; +} + +const srgbToLinear = (value) => + value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4; + +async function decodePanorama(sharp, file) { + const width = WORK_WIDTH; + const height = WORK_WIDTH / 2; + const raw = await sharp(file) + .resize(width, height, { fit: 'fill', kernel: 'lanczos3' }) + .removeAlpha() + .raw() + .toBuffer(); + const lut = Float32Array.from({ length: 256 }, (_, i) => + srgbToLinear(i / 255), + ); + const planes = [0, 1, 2].map(() => new Float32Array(width * height)); + for (let i = 0; i < width * height; i++) + for (let c = 0; c < 3; c++) planes[c][i] = lut[raw[i * 3 + c]]; + return { width, height, planes }; +} + +async function main() { + const [file] = process.argv.slice(2); + if (!file) throw new Error('usage: build-milky-way.mjs '); + const { default: sharp } = await import('sharp'); + const { width, height, planes } = await decodePanorama(sharp, file); + const sigmaPx = (BLUR_DEG / 180) * height; + for (const planet of PLANETS) paintOut(planes, width, height, planet); + for (const plane of planes) { + extremumPlane(plane, width, height, OPEN_RADIUS, Math.min); + extremumPlane(plane, width, height, OPEN_RADIUS, Math.max); + blurPlane(plane, width, height, sigmaPx); + } + const black = luminancePercentile(planes, BLACK_PERCENTILE); + const white = luminancePercentile(planes, WHITE_PERCENTILE); + let total = 0; + for (const face of CUBE_FACES) { + const pixels = Buffer.alloc(FACE_SIZE * FACE_SIZE * 3); + for (let j = 0; j < FACE_SIZE; j++) { + for (let i = 0; i < FACE_SIZE; i++) { + const direction = cubeFaceDirection( + face, + (i + 0.5) / FACE_SIZE, + (j + 0.5) / FACE_SIZE, + ); + const [u, v] = directionToPlateCarree(...icrfToGalactic(direction)); + const index = j * FACE_SIZE + i; + for (let c = 0; c < 3; c++) { + const linear = Math.max( + (samplePlane(planes[c], width, height, u, v) - black) / + (white - black), + 0, + ); + const encoded = Math.min(linear, 1) ** (1 / 2.2) * 255; + pixels[index * 3 + c] = Math.min( + 255, + Math.max(0, Math.round(encoded + dither(index, c))), + ); + } + } + } + const out = path.join(OUT_DIR, `milkyway_${FACE_FILE_SUFFIX[face]}.webp`); + const info = await sharp(pixels, { + raw: { width: FACE_SIZE, height: FACE_SIZE, channels: 3 }, + }) + .webp({ quality: WEBP_QUALITY, smartSubsample: true, effort: 6 }) + .toFile(out); + total += info.size; + console.log(`${path.relative(process.cwd(), out)}: ${info.size} bytes`); + } + console.log(`total ${total} bytes`); +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) await main(); diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 5ec1adb0c..9024224fe 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1062,5 +1062,10 @@ "src/ui/flyToDataSource.test.mjs", "scripts/assemble-changelog.mjs", "src/tooling/changelogFragments.test.mjs", - "src/data/gbfsProxyRateLimit.test.mjs" + "src/data/gbfsProxyRateLimit.test.mjs", + "scripts/build-bright-stars.mjs", + "scripts/build-milky-way.mjs", + "src/sky/stars.test.mjs", + "src/sky/starrySky.test.mjs", + "src/tooling/skyAssets.test.mjs" ] diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 43bc3d4de..61acc6a12 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -22,7 +22,14 @@ }, "viewer": { "exports": ["./application/viewer"], - "modules": ["src/app/viewer.js", "src/app/atmosphereCompat.js"], + "modules": [ + "src/app/viewer.js", + "src/app/atmosphereCompat.js", + "src/sky/starrySky.js", + "src/sky/stars.js", + "src/data/bundledJson.js", + "src/renderGovernor.js" + ], "external": ["cesium"] }, "vite-build": { @@ -1708,6 +1715,8 @@ "src/app/surfaceServices.js", "src/app/tools.js", "src/app/viewer.js", + "src/sky/starrySky.js", + "src/sky/stars.js", "src/app/atmosphereCompat.js", "src/bloom.js", "src/camera.js", diff --git a/src/app/viewer.js b/src/app/viewer.js index 9b6e7f631..582ecd9c5 100644 --- a/src/app/viewer.js +++ b/src/app/viewer.js @@ -1,5 +1,6 @@ import * as Cesium from 'cesium'; import { applyModelAtmosphereWorkaround } from './atmosphereCompat.js'; +import { StarrySky } from '../sky/starrySky.js'; const PINCH_ZOOM_MULTIPLIER = 8; const MAX_PINCH_PIXEL_DELTA = 120; @@ -119,6 +120,9 @@ export function createApplicationViewer({ container, creditContainer }) { selectionIndicator: false, infoBox: false, baseLayer: false, + // Replaced below: the default Tycho-2 cube map is too coarse for the + // whole-globe view and its JPEG blocks show around the Earth. + skyBox: false, creditContainer, msaaSamples: 4, contextOptions: { webgl: { preserveDrawingBuffer: true } }, @@ -130,6 +134,7 @@ export function createApplicationViewer({ container, creditContainer }) { // render loop. See app/atmosphereCompat.js. applyModelAtmosphereWorkaround(viewer.scene); viewer.scene.globe.show = false; + viewer.scene.skyBox = new StarrySky(); viewer.scene.skyAtmosphere.show = true; viewer.scene.skyAtmosphere.atmosphereLightIntensity = 18; viewer.scene.skyAtmosphere.saturationShift = -0.12; diff --git a/src/data/dataCredits.js b/src/data/dataCredits.js index 8d3949351..3fdf7aab8 100644 --- a/src/data/dataCredits.js +++ b/src/data/dataCredits.js @@ -386,6 +386,13 @@ export const DATA_CREDITS = [ 'ECMWF does not accept any liability whatsoever for any error or omission in the data, their availability, or for any loss or damage arising from their use.', }, // ── Bundled snapshots ─────────────────────────────────────────── + { + key: 'sky-background', + html: + 'Stars: Yale Bright Star Catalogue ' + + '(Hoffleit & Warren, via CDS). Milky Way: ESO/S. Brunier ' + + '(CC BY 4.0; stars removed, blurred and reprojected)', + }, { key: 'dams', html: 'Dams: Open Infrastructure Map', diff --git a/src/data/local_data/sky/README.md b/src/data/local_data/sky/README.md new file mode 100644 index 000000000..8c2d4a0d7 --- /dev/null +++ b/src/data/local_data/sky/README.md @@ -0,0 +1,65 @@ +# Sky background + +The space behind the globe (`src/sky/starrySky.js`): catalogue stars drawn as +sharp point sprites over a soft Milky Way cube map. It replaces Cesium's +default Tycho-2 sky box, whose six 1024² JPEGs stretch 3–6× around the +whole-globe view and show compression blocks. + +| File | Content | Size | +| ---- | ------- | ---- | +| `bright_stars.json` | 9,096 stars: J2000 RA/Dec, V magnitude, B−V | 235 KB | +| `milkyway_{px,nx,py,ny,pz,nz}.webp` | Milky Way glow, six 1024² cube faces, no stars | 247 KB | + +## Stars — Yale Bright Star Catalogue + +**Source:** Yale Bright Star Catalogue, 5th Revised Edition (Hoffleit & +Warren 1991), CDS VizieR catalogue +[V/50](https://cdsarc.cds.unistra.fr/viz-bin/cat/V/50), file +`https://cdsarc.cds.unistra.fr/ftp/V/50/catalog.gz` (sha256 +`3dc44b1e90be8fbe5bcc7656032560f51275f985c7e3f783c9028e1838ec7bed`, fetched +2026-10-19). + +**License:** public domain (Yale University Observatory / NASA Astronomical +Data Center). CDS asks for an acknowledgement; the in-app "Data attribution" +popover carries it. + +**Build:** `node scripts/build-bright-stars.mjs [catalog.gz]` — every record +with a J2000 position (14 novae and non-stellar entries dropped), RA/Dec +rounded to 0.001°, magnitudes to 0.01. The renderer maps magnitude to sprite +width and opacity and B−V to a desaturated black-body colour +(`src/sky/stars.js`). + +## Milky Way — ESO/S. Brunier + +**Source:** "The Milky Way panorama", ESO image +[eso0932a](https://www.eso.org/public/images/eso0932a/), full-size original +`https://cdn.eso.org/images/original/eso0932a.tif` (6000×3000 sRGB TIFF, sha256 +`10f209ab83e1fd89e7fa1ed70277ffc6ed19c43549f04ec637c6806d98aff035`, fetched +2026-10-19). Plate carrée in galactic coordinates, centred on the Galactic +Centre. + +**License:** [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) +(). **Credit: ESO/S. Brunier.** + +**Changes made** (CC BY 4.0 asks for them to be stated): resampled to +4096×2048, two planets (Jupiter, by position) painted over with the surrounding sky, +stars removed with a 7×7 morphological opening, blurred (σ = 0.4°), +reprojected from galactic coordinates to ICRF cube faces, black level set at +the darkest 25 % of the sky, gamma-encoded and saved as WebP. Build: +`node scripts/build-milky-way.mjs `. + +The panorama is a photographic mosaic, not an astrometric map: bright stars +sit up to ~2° from their catalogue positions. That is invisible in a glow +blurred this much, and every sharp star on screen comes from the catalogue. + +The NASA SVS "Deep Star Maps 2020" Milky Way layer was considered and not +used: it is derived from Gaia DR2, which ESA distributes under CC BY-NC 3.0 +IGO with prior authorization required for commercial use. + +## Frame + +Both layers are in ICRF/J2000. The cube faces use the standard WebGL face +layout with +X towards the March equinox and +Z towards the north celestial +pole, uploaded without `flipY`. At runtime one rotation — +`Transforms.computeIcrfToFixedMatrix` at the scene clock — turns both into +Earth-fixed coordinates. diff --git a/src/data/local_data/sky/bright_stars.json b/src/data/local_data/sky/bright_stars.json new file mode 100644 index 000000000..5bf6ea2dd --- /dev/null +++ b/src/data/local_data/sky/bright_stars.json @@ -0,0 +1,9099 @@ +{"meta":{"source":"Yale Bright Star Catalogue, 5th Revised Ed. (Hoffleit & Warren 1991), CDS V/50","url":"https://cdsarc.cds.unistra.fr/ftp/V/50/catalog.gz","license":"public domain","fetched":"2026-10-19","frame":"ICRF/J2000, epoch 2000.0","columns":["raDeg","decDeg","vmag","bv"],"count":9096,"dropped":14}, +"stars":[ +1.291,45.229,6.7,0.07, +1.266,-0.503,6.29,1.1, +1.334,-5.708,4.61,1.04, +1.425,13.396,5.51,0.9, +1.567,58.437,5.96,0.67, +1.579,-49.075,5.7,0.52, +1.61,64.196,5.59,-0.03, +1.653,29.021,6.13,0.75, +1.709,-23.107,6.18,0.38, +1.826,-17.386,6.19,0.14, +1.934,-2.549,6.43,-0.14, +1.945,-22.509,5.94,0.14, +2.015,-33.529,5.68,1.12, +2.05,-2.448,6.07,1.38, +2.097,29.091,2.06,-0.11, +2.073,-8.824,5.99,1.04, +2.171,36.627,6.19,0.48, +2.139,-17.577,6.06,1.67, +2.218,25.463,6.23,0.97, +2.334,79.715,6.01,0.19, +2.295,59.15,2.27,0.34, +2.26,18.212,5.53,1.04, +2.26,-54.002,6.33,0.74, +2.338,-27.988,5.42,0.42, +2.353,-45.747,3.88,1.03, +2.51,11.146,5.51,-0.07, +2.58,46.072,5.03,0.4, +2.624,57.166,6.74,-0.08, +2.578,-5.249,5.84,0.98, +2.509,-82.224,5.28,1.05, +2.678,-12.58,5.85,1.01, +2.661,-73.224,6.64,0.37, +2.816,-15.468,4.89,0.49, +2.893,-27.8,5.41,1.34, +2.933,-35.133,5.25,0.44, +2.996,48.152,6.16,1.45, +3.042,-17.938,5.25,1.48, +3.21,37.693,6.73,-0.13, +3.309,15.184,2.83,-0.23, +3.35,26.987,6.3,0.65, +3.378,41.035,5.72,0.31, +3.425,-26.022,5.94,1.55, +3.434,-26.285,6.31,1.48, +3.51,33.206,6.25,-0.01, +3.651,20.207,4.8,1.57, +3.615,-7.781,5.12,1.62, +3.331,-84.994,5.77,1.72, +3.66,-18.933,4.44,1.66, +3.734,22.284,6.24,-0.01, +3.745,8.821,5.79,0.31, +3.727,-9.57,5.75,-0.08, +3.779,31.536,6.45,null, +3.794,27.283,6.35,-0.02, +3.743,-34.904,6.17,1.34, +4.058,76.951,6.35,-0.07, +4.09,43.595,6.15,0.05, +4.037,-31.446,5.67,1.35, +3.98,-75.911,6.49,1, +4.142,8.24,6.11,0.92, +4.238,61.533,5.74,0.88, +4.177,-20.211,6.47,-0.09, +4.288,47.948,5.89,-0.09, +4.273,38.682,4.61,0.06, +4.204,-78.781,6.77,0.46, +4.429,51.433,6.14,-0.13, +4.386,-19.051,6.45,0.37, +4.449,1.689,6.17,0.94, +4.582,36.785,4.52,0.05, +4.572,11.206,6.05,1.03, +4.675,43.791,6.11,-0.08, +4.66,31.517,5.87,-0.01, +4.674,-8.053,6.46,0.68, +4.677,-43.235,6.33,1.21, +4.857,-8.824,3.56,1.22, +4.923,40.73,6.33,1.18, +5.022,48.865,6.52,null, +5.018,-64.875,4.23,0.58, +5.102,30.936,5.9,-0.1, +5.19,32.911,5.79,1.59, +5.15,8.19,5.37,1.34, +5.227,10.977,6.56,null, +5.28,37.969,5.18,0.42, +5.163,-69.625,5.51,-0.05, +5.38,-28.982,5.18,1, +5.443,-20.058,5.12,1.82, +5.606,13.483,6.23,1.22, +5.369,-77.427,5.97,1.4, +5.716,-12.209,6.39,0.66, +5.803,-31.036,6.55,0, +6.008,38.577,7.39,1.97, +6.065,52.02,5.57,-0.12, +6.198,61.831,5.4,0, +6.124,-2.219,6.07,1.22, +6.277,53.047,5.74,-0.06, +6.351,1.94,5.77,0.86, +6.438,-77.254,2.8,0.62, +6.571,-42.306,2.39,1.09, +6.551,-43.68,3.94,0.17, +6.656,-0.05,6.19,0.9, +6.811,-25.547,5.98,1.03, +7.012,17.893,5.06,1.65, +7.057,44.394,5.17,0.03, +6.982,-33.007,4.81,1.64, +7.053,16.445,6.06,1.58, +7.084,10.19,6.04,0.43, +7.088,-20.335,6.43,0.59, +7.11,-39.915,5.43,1.56, +7.236,36.9,6.26,0.92, +7.18,-50.533,6.26,1.09, +7.729,77.019,6.21,0.84, +7.583,59.977,5.94,0.01, +7.53,29.752,5.23,0.24, +7.466,-14.864,6.14,0.37, +7.454,-32.117,6.57,1.34, +7.51,-3.957,5.72,1.56, +7.595,-23.788,5.19,0.12, +7.616,-40.939,6.19,0.33, +7.609,-48.215,5.69,0.35, +7.855,66.519,6.18,-0.1, +7.857,33.582,5.87,1.14, +7.943,54.522,4.73,-0.1, +7.922,52.839,5.6,1.15, +7.854,-48.804,4.77,0.02, +7.886,-62.958,4.37,-0.07, +7.89,-62.966,4.54,0.15, +8.112,43.495,6.7,-0.01, +8.33,70.982,6.42,-0.01, +8.25,62.932,4.16,0.14, +8.148,20.294,5.38,1.08, +8.099,6.956,5.67,0, +8.144,27.581,6.67,null, +8.205,28.28,6.3,1, +8.293,54.895,5.93,1.04, +8.182,-63.031,5.09,0.04, +8.604,66.75,6.48,-0.08, +8.421,-29.558,5.55,1.27, +8.347,-71.266,6.13,0.23, +8.616,-52.373,5.57,0.47, +8.73,13.371,6.4,null, +8.812,-3.593,5.2,0.56, +8.887,-0.506,5.93,0.44, +9.035,54.169,5.08,-0.11, +8.978,13.207,6.41,0.52, +9.114,60.326,5.79,0.29, +8.921,-48.001,5.51,0.44, +8.889,-54.822,6.06,1.01, +9.083,27.255,6.5,-0.09, +9.013,-14.974,6.45,1.06, +9.029,-22.842,6.06,0.29, +9.194,44.489,5.13,1.6, +9.243,53.897,3.66,-0.2, +9.22,33.719,4.36,-0.14, +9.197,15.232,5.89,-0.15, +9.28,24.014,6.47,null, +9.338,35.399,5.48,0.88, +9.947,82.494,6.4,0.55, +9.336,-24.767,5.57,0.72, +9.156,-65.125,6.42,1.26, +9.377,3.135,6.39,1.33, +9.325,-54.394,6.41,1, +9.639,29.312,4.37,0.87, +9.791,49.354,5.43,1.64, +9.832,30.861,3.27,1.28, +9.841,21.251,5.87,0.85, +9.982,21.438,5.36,1.16, +10.127,56.537,2.23,1.17, +9.67,-73.137,6.85,0.11, +9.991,-33.962,6.69,0.51, +9.967,-44.797,6.01,1.14, +10.119,-16.517,6.49,0.92, +10.137,-23.804,6.14,0.7, +10.177,-4.352,5.91,1.1, +10.28,39.459,5.33,0.89, +10.11,-59.454,5.89,0.55, +10.514,66.148,5.83,1.04, +10.4,24.629,6.04,0.26, +10.516,50.513,4.8,-0.11, +10.332,-46.085,4.59,0.97, +10.63,58.753,6.17,-0.01, +10.443,-56.502,5.7,0.2, +10.867,47.025,4.94,0.18, +10.679,-38.463,6.06,-0.03, +10.674,-60.262,5.98,1.32, +10.618,-65.468,5.39,0.5, +10.898,-17.987,2.04,1.02, +11.11,47.864,5.67,-0.12, +10.959,-12.012,6.02,1.1, +10.838,-57.463,4.36,0, +11.413,74.988,5.66,0.05, +11.181,48.284,4.54,-0.07, +11.048,-10.609,4.76,1.01, +11.05,-38.422,5.9,1.16, +11.322,55.222,5.42,0.04, +11.185,-22.006,5.24,0.33, +11.238,-42.677,5.94,0.28, +11.135,-62.498,6.07,0.44, +11.663,69.325,6.33,null, +11.35,-4.629,6.15,1.62, +11.25,-53.715,6.15,0.53, +11.37,-12.881,6.15,0.61, +11.563,55.305,6.52,null, +11.545,44.861,6.05,-0.07, +11.424,-16.424,6.47,0.31, +11.677,59.574,6.39,1.09, +11.942,74.848,5.41,-0.08, +11.44,-47.552,5.8,0.64, +11.549,-22.522,5.5,0.98, +11.638,15.476,5.38,1.65, +12.038,72.675,5.87,1.01, +11.756,11.974,5.5,0.97, +11.807,19.579,6.13,0.27, +11.835,24.267,4.06,1.12, +11.848,6.741,5.99,0.94, +11.978,20.925,6.54,0.5, +11.93,-18.061,5.7,1.3, +12.275,57.816,3.44,0.57, +12.005,-21.722,5.57,-0.06, +12.073,7.3,5.93,1.1, +12.096,5.281,5.75,0.88, +12.209,50.968,4.89,-0.11, +12.171,7.585,4.43,1.5, +12.245,16.941,5.07,0.51, +12.453,41.079,4.53,-0.15, +12.357,-13.561,5.59,1.3, +12.308,-24.136,5.9,0.95, +12.236,-46.698,6.27,0.9, +12.47,27.711,7,0.36, +12.472,27.71,7.1,null, +12.389,-23.362,6.28,0.13, +12.682,64.248,5.39,0.49, +12.576,45.002,6.15,0.01, +12.532,-10.644,5.19,0.5, +12.148,-74.923,5.07,1.37, +12.818,61.806,6.07,1.88, +12.739,51.508,6.39,0.28, +12.515,-43.395,6.48,0.29, +13.721,83.707,5.62,0.09, +12.89,51.571,6.21,null, +12.672,-50.987,5.22,0.36, +12.826,3.385,6.37,1.07, +13.267,61.124,4.82,0.53, +12.967,-43.709,6.9,0.35, +13.223,38.549,6.69,0.02, +13.169,-24.006,5.46,1.24, +13.252,-1.144,4.77,1.57, +13.368,37.418,6.06,1.14, +13.448,52.689,6.27,0.19, +13.302,-24.777,6.46,0.44, +13.101,-69.504,6.22,0.56, +13.75,58.973,4.83,1.21, +13.647,19.188,5.74,-0.01, +13.573,-8.741,6.16,0.92, +13.772,48.679,6.27,1.68, +13.408,-62.871,5.7,1.56, +13.742,23.628,5.47,1, +13.811,24.557,6.2,1.62, +14.054,57.997,6.21,1.37, +14.232,68.776,6.37,0.38, +13.994,27.209,6.09,0.14, +13.927,-7.347,5.85,1.52, +14.177,60.717,2.47,-0.15, +14.166,59.181,4.63,0.96, +14.196,60.363,5.55,-0.07, +14.006,-11.267,5.31,1.52, +13.981,-27.776,6.1,1.67, +14.188,38.499,3.87,0.13, +13.751,-69.527,5.45,1.09, +14.302,23.418,4.42,0.94, +14.415,45.84,6.12,1.02, +14.63,66.352,5.97,-0.02, +14.459,28.992,5.42,1.08, +14.559,33.951,5.98,1, +14.477,13.696,6.32,0.89, +14.579,21.404,6.37,0.09, +15.129,70.983,6.39,0.13, +14.683,-11.38,5.61,0.97, +14.652,-29.357,4.31,-0.16, +14.593,-60.696,6.23,0.1, +15.014,44.711,6.84,null, +15.015,44.713,6.04,-0.01, +14.957,6.483,6.11,1.67, +17.186,86.257,4.25,1.21, +23.46,89.016,6.46,0.11, +15.577,51.035,6.47,null, +15.326,-38.917,5.59,1.18, +15.756,47.376,6.45,0.25, +15.726,41.345,5.98,0.16, +15.705,31.804,5.5,-0.05, +15.904,61.075,5.92,0.49, +15.61,-31.552,5.5,0.08, +15.736,7.89,4.28,0.96, +15.508,-57.002,6.11,0.94, +15.761,-4.837,5.43,1.11, +16.082,61.58,5.84,0.54, +16.01,52.502,5.99,1.47, +15.705,-46.397,5.36,0.9, +15.823,-29.526,6.29,0.93, +15.954,1.367,6.04,0.27, +16.195,51.01,6.54,-0.08, +16.115,29.659,6.19,0.43, +15.679,-65.456,6.21,1.64, +16.152,39.991,6.72,0.31, +19.056,87.145,6.25,1.12, +16.219,5.656,6,1.51, +16.273,14.946,5.68,0.41, +16.595,62.762,6.54,0.19, +16.42,21.473,5.34,-0.03, +16.424,21.465,5.56,-0.07, +17.301,80.012,6.29,null, +16.455,4.908,6.35,0.38, +16.464,4.909,7.25,0.49, +16.403,-9.979,6.12,1.01, +16.751,56.935,6.43,1.18, +16.521,-9.839,5.58,0.01, +16.79,53.498,6.38,null, +16.64,12.956,6.12,0.96, +16.532,-23.992,6.14,1.09, +17.068,54.92,5.17,0.69, +16.521,-46.719,3.31,0.89, +16.61,-35.661,6.61,0.14, +17.004,43.942,5.03,0.11, +16.805,-23.996,6.37,0.23, +17.139,58.264,5.79,-0.01, +17.005,32.012,6.25,0.4, +16.988,20.739,5.55,0.13, +16.943,-9.786,5.82,0.43, +17.093,5.65,5.52,0.34, +16.95,-41.487,5.21,0.16, +16.828,-61.775,5.37,0.88, +18.07,79.674,5.64,0.01, +17.148,-10.182,3.45,1.16, +17.376,47.242,4.25,-0.07, +17.664,68.779,5.29,-0.02, +17.433,35.621,2.06,1.58, +17.096,-55.246,3.92,-0.08, +17.455,19.659,5.55,0.69, +17.578,42.081,5.65,0.6, +17.581,25.458,5.8,1.47, +17.857,64.203,5.55,-0.07, +17.776,55.15,4.33,0.17, +17.548,15.674,6.06,1.49, +17.923,65.019,5.57,-0.09, +17.55,-8.906,6.4,1.04, +17.64,2.446,5.95,1.51, +17.793,37.724,5.81,-0.1, +17.778,31.425,5.16,0.23, +17.531,-57.694,6.41,0.89, +17.863,21.035,4.66,1.03, +17.915,30.09,4.51,1.09, +17.931,-2.251,5.94,1.4, +18.291,61.706,6.41,0.01, +18.142,45.338,6.11,1.64, +18.248,30.064,6.19,1, +19.128,79.91,6.26,0.42, +18.098,-30.802,6.52,0.48, +18.189,-37.856,5.92,0.28, +18.437,24.584,4.65,1.04, +18.433,7.575,5.24,0.32, +18.439,7.578,6.3,0.49, +18.521,28.53,6.43,1.7, +18.532,16.134,5.98,-0.08, +19.05,71.744,7.83,0.78, +18.6,-7.923,5.13,0.46, +18.677,6.995,6.03,1.08, +18.705,-0.974,5.7,0.42, +19.102,48.082,6.61,-0.05, +18.796,-45.531,4.96,0.58, +19.078,33.115,6.02,1.15, +19.271,44.902,6.34,null, +19.151,-2.5,5.41,0.9, +19.35,31.745,6.73,null, +20.081,77.571,6.31,0.92, +19.543,47.42,6.25,1.35, +18.942,-68.876,4.86,0.47, +19.45,3.614,5.16,0.07, +19.696,37.386,6.46,0.23, +19.265,-66.398,6.24,0.05, +20.496,76.239,6.38,0.28, +20.02,58.232,4.98,0.68, +19.867,27.264,4.76,0.03, +20.272,64.658,6.34,0.09, +19.951,-0.509,5.87,0.64, +20.945,78.726,6.07,0.39, +20.144,-3.247,6.23,1.02, +20.116,-11.239,6.15,1.11, +20.281,28.738,5.23,1.39, +20.585,45.529,4.88,1.08, +20.84,58.143,6.45,null, +20.654,1.726,6.2,1.52, +20.645,-0.45,6.49,1.08, +20.627,-19.081,6.35,0.48, +20.919,37.715,5.58,0.26, +20.906,34.246,6.29,0.83, +20.854,20.469,5.97,1.71, +21.444,70.98,6.49,null, +21.483,68.13,4.74,1.05, +20.879,-30.946,5.84,1.61, +21.01,-8.007,6.21,0.23, +21.006,-8.183,3.6,1.06, +21.454,60.235,2.68,0.13, +21.086,-6.915,5.91,0.41, +21.166,-15.66,6.14,0.91, +21.203,-2.849,6.15,0.96, +21.399,23.512,6.18,0.43, +21.17,-41.492,5.42,1.04, +21.578,43.458,5.96,0.49, +21.536,34.58,6.31,0.47, +21.175,-44.528,6.26,1.14, +21.405,-14.599,4.9,1.23, +21.564,19.172,5.38,0.39, +21.674,19.24,5.5,1.11, +21.776,34.378,6.27,0.46, +21.614,-0.399,6.41,1.24, +21.914,45.407,4.83,0.42, +21.861,41.101,6.46,0.27, +21.723,3.535,6.58,-0.04, +21.272,-64.369,5.93,1.56, +21.715,-13.057,5.66,0.35, +21.946,40.336,6.6,-0.04, +21.742,-32.543,5.79,3.86, +37.953,89.264,2.02,0.6, +21.944,-10.902,6.13,1.32, +22.095,7.961,6.2,1.12, +22.808,70.265,5.81,0.47, +22.718,66.098,6.14,0.08, +22.091,-43.318,3.41,1.57, +22.526,47.007,5.27,1, +22.18,-33.764,6.58,0.3, +22.47,18.356,6.02,0.14, +22.4,-21.629,5.12,0.02, +22.546,6.144,4.84,1.37, +22.377,-46.756,6.31,1.66, +22.595,-26.208,5.93,1.34, +22.871,15.346,3.62,0.97, +23.032,34.8,6.39,-0.12, +23.358,58.328,5.7,1.52, +22.813,-49.073,3.95,0.99, +22.93,-30.283,5.82,1.08, +23.483,59.232,4.71,1, +22.913,-45.576,6.17,0.06, +23.265,-9.015,6.59,-0.04, +23.233,-36.865,5.51,1.02, +23.569,37.237,5.88,-0.07, +23.151,-49.728,6.28,0.46, +23.429,-7.025,5.76,0.64, +24.344,74.301,6.58,0.03, +23.705,18.461,5.89,1.52, +23.658,-15.676,5.63,0.07, +23.969,41.076,6.38,1.11, +23.711,-31.892,6.12,1.11, +24.113,48.723,5.92,1.21, +23.943,14.661,6.22,-0.04, +24.629,73.04,5.28,0.96, +23.978,17.434,5.8,null, +24.199,41.406,4.09,0.54, +23.996,-15.4,5.42,1.21, +23.813,-58.139,6.01,0.38, +24.532,57.978,5.56,1.38, +24.035,-29.907,5.69,0.33, +24.275,12.142,5.57,0.35, +24.498,48.628,3.57,1.28, +24.632,45.4,6.36,0.04, +24.407,-9.404,6.24,0.53, +23.413,-78.505,6.11,0.97, +24.187,-58.271,6.18,1.61, +24.838,44.386,4.98,0.89, +25.055,53.868,6.39,1.61, +24.614,-36.528,5.94,1.05, +24.429,-57.237,0.46,-0.16, +24.716,-21.275,5.58,0.34, +24.708,-25.022,6.7,-0.08, +24.92,16.406,5.97,1.12, +25.166,43.298,5.61,0.21, +25.145,40.577,4.94,-0.09, +25.585,68.043,5.59,-0.07, +24.701,-53.439,6.84,0.44, +25.733,70.622,5.18,-0.04, +25.513,61.038,6.71,-0.03, +25.574,58.628,6.37,-0.02, +25.447,42.614,4.95,0.62, +25.327,25.746,6.17,0.44, +25.413,30.047,5.99,1.01, +24.948,-56.198,5.87,0.9, +24.949,-56.195,5.76,0.87, +25.743,61.422,6.34,0.01, +25.358,5.488,4.44,1.36, +25.515,35.246,5.64,-0.07, +25.832,60.551,5.78,-0.02, +25.436,-11.325,5.75,0.44, +25.624,20.269,5.24,0.84, +25.364,-38.133,6.17,0.42, +25.819,45.322,6.34,1.01, +25.915,50.689,4.07,-0.04, +25.536,-32.327,5.25,1.05, +25.513,-36.832,5.72,-0.01, +26.075,57.536,6.21,0.1, +25.681,-3.69,4.99,1.38, +25.421,-50.039,6.64,0.12, +26.192,57.089,6.25,0.04, +25.958,32.192,6.34,null, +26.11,46.14,6.35,null, +25.45,-60.789,5.71,1.27, +25.622,-53.741,5.52,0.53, +25.978,-4.766,6.19,1.54, +26.233,20.083,6.27,0.75, +26.017,-15.937,3.5,0.72, +26.348,9.158,4.26,0.96, +26.937,63.852,5.63,0.81, +24.482,-82.975,5.87,0.61, +26.497,-5.733,5.34,1.52, +26.412,-25.053,5.31,0.39, +26.647,17.413,6.55,0.25, +25.339,-79.148,6.33,0.94, +26.504,-27.349,6.39,0.36, +26.95,46.23,6.32,0.43, +26.524,-50.816,5.49,1.6, +26.526,-53.522,5.04,0.04, +27.162,37.953,5.94,0.97, +27.045,16.956,5.84,-0.03, +27.173,32.69,5.79,0.55, +26.82,-41.76,6.18,1.54, +24.367,-84.77,5.69,0.94, +27.315,47.897,5.82,0.29, +27.108,3.686,5.91,0.97, +26.949,-37.16,6.32,1.02, +27.738,51.933,5.9,0.43, +27.535,22.275,5.86,0.74, +27.396,-10.686,4.67,0.33, +27.331,-31.073,6.34,1.22, +27.997,55.148,5.52,-0.18, +27.717,11.043,5.94,0.3, +27.453,-38.404,6.37,0.52, +28.039,50.793,5.79,-0.07, +27.584,-47.816,6.14,1.01, +28.212,51.475,6.26,null, +27.865,-10.335,3.73,1.14, +28.452,55.598,6.45,0.18, +27.727,-50.206,5.94,0.14, +28.599,63.67,3.38,-0.15, +28.322,40.73,5.4,1.32, +28.27,29.579,3.41,0.49, +28.382,19.296,4.83,null, +28.382,19.294,4.75,-0.04, +28.217,-16.929,5.8,0.27, +29,68.685,4.99,-0.1, +28.389,3.188,4.62,0.94, +26.944,-80.177,6.06,0.34, +28.724,40.702,6.24,1.25, +28.74,37.128,6.26,1.17, +28.66,20.808,2.64,0.13, +28.347,-38.595,6.1,1.12, +28.412,-46.302,4.41,1.59, +28.977,37.278,5.89,1.63, +29.039,37.252,5.67,1.06, +28.592,-42.497,5.11,-0.06, +28.963,23.577,5.74,1.19, +28.974,1.85,6.01,0.56, +29.639,61.698,6.02,-0.04, +29.485,41.694,6.78,-0.06, +29.338,17.818,5.1,0.92, +29.432,27.804,5.82,1.6, +29.168,-22.527,4.85,1.42, +28.99,-51.609,3.7,0.85, +29.908,64.621,5.26,0.01, +29.64,49.204,5.69,1.01, +29.482,23.596,4.79,0.28, +28.734,-67.647,4.69,0.95, +28.943,-60.861,6.06,0.37, +30.738,77.916,6.04,1.14, +29.25,-51.766,6.1,0.48, +29.292,-47.385,4.83,0.88, +30.489,70.907,4.54,0.16, +29.611,-33.067,6.35,1.02, +29.899,21.058,5.87,1.03, +29.858,12.295,6.09,0.19, +30.794,73.851,6.23,null, +30.859,72.421,3.98,-0.01, +31.281,77.281,5.38,0.31, +30.038,3.097,5.88,0.62, +29.942,-20.824,5.41,1.65, +29.473,-65.425,6.37,0.9, +30.001,-21.078,4,1.57, +30.72,64.901,6,0.03, +30.112,-8.524,5.51,1.52, +29.912,-42.031,5.57,1.06, +30.751,64.39,5.58,0.38, +30.575,54.488,5.04,-0.08, +29.693,-61.57,2.86,0.28, +31.38,76.115,5.22,0.95, +28.96,-78.348,6.16,0.44, +30.311,-30.002,5.35,0.88, +30.512,2.764,5.23,null, +30.512,2.764,4.33,0.03, +32.355,81.296,6.05,0.11, +31.167,65.103,6.52,0, +30.742,33.284,5.5,0.03, +29.921,-66.066,6.1,1.17, +30.647,13.477,5.94,1.59, +30.427,-44.714,5.14,1.49, +30.975,42.33,2.26,1.37, +30.978,42.331,4.84,0.03, +30.914,25.936,5.63,0.54, +30.617,-29.665,6.42,0.14, +30.799,0.128,5.43,0.15, +30.744,-15.306,5.86,0.98, +30.927,18.253,6.21,1.42, +30.951,-0.34,5.93,0.88, +30.919,-4.104,5.62,1.59, +31.123,-29.297,4.69,-0.17, +31.641,22.648,5.03,0.11, +31.551,8.247,6.31,1.65, +31.705,25.705,6.15,-0.03, +31.622,0.035,6.28,0.9, +31.793,23.463,2,1.15, +32.169,58.424,5.67,0.61, +32.14,44.459,6.42,null, +32.122,37.859,4.82,0.12, +32.533,53.843,6.31,0.95, +32.386,34.987,3,0.14, +32.355,25.94,4.98,0.33, +32.346,17.224,6.43,null, +32.19,-17.779,6.1,1.61, +33.338,74.028,6.29,0.91, +32.871,57.646,6.36,0.33, +32.72,39.039,5.63,-0.02, +32.724,39.043,6.1,-0.07, +32.395,-24.346,6.48,0.29, +32.657,19.5,5.7,1.65, +32.289,-43.517,5.85,1.19, +32.8,25.937,6.02,1.36, +32.854,31.526,6.23,0.11, +32.838,8.57,5.63,0.56, +32.52,-43.816,6.32,0.9, +32.607,-50.824,6.12,0.82, +32.842,-10.052,6.01,0.39, +32.899,-1.825,5.93,0.97, +33.621,66.524,6.07,0.63, +33.423,58.561,6.44,0.6, +33.093,30.303,4.94,0.78, +33.305,44.232,4.83,1.48, +33.156,24.168,5.96,1.37, +33.401,51.066,5.31,0.93, +33.2,21.211,5.27,0.43, +33.511,47.484,6.06,0.4, +33.264,15.28,5.71,1.55, +33.25,8.847,4.37,0.89, +33.198,-2.394,5.54,0.57, +33.254,-21,5.86,1.01, +33.227,-30.724,5.28,-0.02, +33.991,47.811,6.33,null, +34.215,57.055,6.48,0.28, +33.984,33.359,5.28,-0.01, +33.942,25.783,5.79,0.44, +33.928,25.043,5.58,0.49, +33.868,-9.466,6.55,-0.02, +33.633,-41.167,5.91,0.97, +34.263,34.224,4.87,0.61, +34.5,57.9,5.75,1.17, +34.519,57.517,5.98,1.05, +34.389,44.307,6.7,null, +34.329,33.847,4.01,0.02, +34.293,23.768,6.55,1.02, +34.246,-6.422,5.51,0.96, +33.561,-67.842,5.55,1.55, +35.054,64.337,6.6,-0.03, +34.531,19.901,5.62,0.01, +34.82,47.38,5.3,-0.01, +34.795,46.473,6.21,null, +34.506,1.758,5.58,0.6, +34.845,48.955,6.37,null, +34.128,-51.512,3.56,-0.12, +34.738,28.643,5.03,0.04, +34.742,23.168,6.46,0.34, +34.905,39.835,6.63,-0.09, +33.869,-67.746,5.69,1.3, +35.173,47.311,6.11,-0.08, +35.018,30.188,6.47,null, +34.836,-2.977,3.04,1.42, +35.243,50.151,5.59,-0.13, +34.744,-25.946,6.34,0.73, +34.92,-4.346,6.5,0.08, +35.589,55.846,5.17,0.37, +34.853,-41.848,6.37,1.16, +35.71,41.396,5.82,0.27, +34.976,-55.945,5.81,1.55, +35.486,0.396,5.28,1.65, +35.966,55.364,6.28,0.86, +35.552,-0.885,5.42,0.31, +35.506,-10.778,5.46,0.35, +35.521,-17.662,5.87,1.23, +36.104,50.007,5.19,0.98, +35.636,-23.816,5.2,0.6, +36.317,56.61,6.25,0.31, +35.741,-18.354,6.22,0.94, +35.549,-43.2,6.31,1, +36.406,50.279,4.71,1.53, +35.777,-37.576,6.53,1.61, +35.728,-51.092,5.92,0.22, +36.204,10.611,5.47,-0.1, +36.084,-25.847,6.44,1.32, +36.243,-2.78,6.33,0, +35.437,-68.659,4.09,0.03, +36.141,-40.841,6.18,0.66, +37.267,67.403,4.52,0.12, +36.488,-12.291,4.89,-0.03, +36.966,50.57,6.12,0.41, +36.501,-15.341,5.83,0.15, +36.779,27.013,6.18,1.43, +36.865,31.801,5.54,1.12, +36.647,-20.043,5.88,1.26, +36.225,-60.312,5.35,0.39, +35.718,-73.646,5.01,1.09, +37.354,55.536,6.51,0.09, +37.042,29.669,5.29,null, +37.04,8.46,4.28,-0.06, +37,1.961,6.45,0.97, +37.202,29.932,5.89,0.58, +36.746,-47.704,4.25,-0.14, +36.36,-66.495,6.41,1.54, +37.307,23.469,6.19,0.15, +37.007,-33.811,5.14,0.1, +37.397,9.566,6.07,1.02, +37.569,33.834,6.25,1.07, +37.148,-31.103,6.11,1.11, +37.635,25.235,5.92,0.41, +37.66,19.855,6.15,0.25, +37.481,-22.683,6.77,0.19, +37.727,17.704,6.23,0.9, +37.688,0.255,6,0.17, +37.558,-25.186,6.51,0.29, +37.018,-64.3,6.37,-0.04, +37.637,-22.546,6.1,1.61, +38.026,36.147,5.15,1.47, +37.875,2.267,5.25,1.27, +38.219,34.543,5.83,1.07, +38.039,-1.035,5.35,1.02, +38.022,-15.245,4.75,0.45, +38.225,15.035,6.04,0.54, +38.062,-36.427,6.3,1.02, +39.508,72.818,5.16,0.88, +38.279,-34.65,5.9,1.06, +38.418,-20.002,6.21,1.1, +38.866,39.664,6.36,-0.1, +39.4,65.746,5.78,1.56, +38.912,37.312,5.71,1.39, +38.461,-28.232,4.9,-0.05, +38.945,34.688,5.35,1.66, +38.767,7.471,6.18,1.06, +38.678,-7.859,5.75,1.4, +39.02,6.887,5.82,0.98, +38.969,5.593,4.86,0.87, +38.477,-51.094,6.24,0.52, +39.238,38.733,5.9,0.48, +39.179,31.608,6.1,1.05, +39.26,34.264,5.3,1.55, +39,-7.832,5.53,1.59, +39.337,39.896,6.54,-0.12, +39.277,32.892,6.25,0.48, +38.39,-62.587,6.77,-0.06, +39.158,12.448,5.68,0.49, +39.24,24.648,7.09,0.5, +39.252,24.648,6.5,0.41, +39.146,7.73,5.81,1.04, +39.039,-30.045,5.75,1.02, +39.574,37.727,6.18,0.47, +39.616,38.089,6.3,-0.03, +39.503,7.695,6.39,0.44, +39.424,-3.396,5.65,1.02, +39.244,-34.578,5.79,0.66, +39.704,21.961,5.43,0.16, +41.948,81.448,5.78,1.3, +39.654,3.443,6.21,1, +37.919,-79.109,5.28,0.98, +39.578,-30.194,5.83,0.48, +39.352,-52.543,5.31,0.27, +39.871,0.329,4.07,-0.22, +39.603,-37.991,6.49,0.52, +39.891,-11.872,4.84,0.45, +40.171,27.061,5.3,0.09, +40.065,6.112,6.25,0.4, +40.051,-9.453,5.78,0.52, +40.762,55.106,5.77,-0.13, +40.01,-30.634,6.52,1.04, +40.749,53.526,5.84,1.12, +40.562,40.194,4.91,0.59, +39.95,-42.892,4.75,0.06, +40.308,-0.696,5.71,0.52, +41.207,67.825,5.95,0.1, +40.758,48.266,6.48,null, +40.592,20.012,5.69,-0.02, +40.167,-39.856,4.11,1.02, +40.451,-3.213,6.05,1.17, +40.392,-14.549,5.98,0.43, +40.62,10.742,6.3,0.06, +39.882,-64.282,6.55,-0.08, +41.05,49.228,4.12,0.49, +41.022,44.297,5.43,0.9, +40.863,27.707,4.66,-0.13, +40.165,-54.55,5.21,0.4, +40.963,25.638,6.35,0.08, +40.825,3.236,3.47,0.09, +40.528,-38.384,6.01,0.92, +39.898,-68.267,4.11,-0.06, +40.535,-46.524,6.1,0.88, +41.08,17.764,6.46,1.07, +41.137,15.312,5.77,-0.01, +40.64,-50.8,5.41,0.56, +41.031,-13.859,4.25,-0.14, +41.24,12.446,5.18,0.24, +41.235,10.114,4.27,0.31, +40.835,-40.527,6.36,-0.02, +42.231,69.634,6.18,0.18, +41.337,4.712,6.03,0.31, +41.085,-32.525,6.22,0.04, +41.276,-18.572,4.47,0.48, +41.743,35.984,6.25,0.93, +41.765,35.555,6.3,null, +41.045,-52.571,6.15,0.09, +41.319,-46.287,6.85,1.36, +40.861,-66.714,6.26,0.53, +41.977,29.247,4.51,1.11, +42.378,57.084,6.25,0.89, +41.688,-21.64,6.49,0.38, +41.797,-22.486,6.47,0.39, +42.134,18.284,5.82,1.2, +42.995,68.889,5.8,0.64, +42.191,25.188,5.86,-0.07, +42.363,37.326,6.45,0.43, +41.983,-12.461,6.9,1.56, +41.365,-63.704,5.74,0.93, +42.674,55.896,3.76,1.68, +41.89,-35.551,6.51,0.96, +42.323,17.464,5.22,-0.06, +41.386,-67.617,4.84,0.06, +42.496,27.261,3.63,-0.1, +42.94,58.315,6.45,0.1, +42.646,38.319,4.23,0.34, +42.272,-32.406,4.46,0.99, +42.924,46.842,5.88,0.89, +42.878,35.06,4.53,1.56, +42.463,-24.56,6.14,1.07, +42.476,-27.942,5.39,0.02, +43.217,52.998,6.36,0.07, +42.873,15.082,5.49,-0.09, +42.562,-35.844,5.92,0.9, +43.338,48.569,6.26,1.18, +42.76,-21.004,4.75,0.91, +42.668,-35.676,5.47,1.25, +42.256,-62.807,5.26,0.1, +42.7,-39.932,6.36,0.05, +43.565,52.763,3.95,0.74, +43.427,38.338,5.33,0.41, +43.299,16.483,6.31,null, +43.134,-12.769,6.04,0.87, +42.98,-30.814,6.4,0.48, +43.21,-9.441,6.32,0.19, +43.987,61.521,5.59,0.45, +44.103,64.332,6.24,2.03, +43.397,-22.376,5.95,1.04, +43.393,-38.437,5.92,0.44, +44.211,51.261,6.22,1.57, +44.139,47.164,6.02,1.34, +43.08,-62.91,6.03,1.25, +43.952,18.332,5.91,1.47, +43.47,-49.89,4,2.11, +44.109,18.023,5.63,0.43, +44.058,8.382,5.97,0.48, +43.527,-50.871,6.21,1.58, +42.619,-75.067,4.75,1.33, +44.322,31.934,5.11,-0.01, +44.107,-8.898,3.89,1.11, +44.156,-3.712,5.17,0.08, +44.51,38.615,6.04,1.41, +44.269,4.501,6.11,1.69, +44.522,20.669,5.8,0.41, +44.69,39.663,4.7,0.06, +43.587,-64.436,6.56,1.39, +46.533,79.419,5.49,1.57, +44.765,35.183,4.93,1.23, +44.349,-23.862,5.45,0.23, +44.305,-29.855,6.29,0.47, +44.958,47.221,5.47,0.89, +44.916,41.033,5.89,1.44, +44.803,21.34,4.63,0.04, +44.803,21.34,4.63,0.04, +44.524,-23.606,5.84,1.33, +45.218,52.352,5.28,-0.05, +45.223,52.352,6.74,0, +44.675,-2.782,5.23,0, +44.386,-38.191,6.41,-0.03, +45.049,38.132,6.11,-0.06, +44.698,-9.776,6.14,0.22, +44.929,8.908,4.7,-0.12, +44.565,-40.305,3.24,0.14, +44.568,-40.304,4.35,0.08, +44.922,-2.465,5.56,-0.08, +44.778,-28.907,6.14,1.04, +44.9,-25.274,5.71,0.4, +45.184,10.87,5.95,1.59, +44.91,-32.507,6.31,0, +45.213,-2.879,6.11,1.77, +45.475,26.462,5.9,0.14, +47.928,81.471,5.95,0.15, +45.292,-7.663,5.75,1.05, +45.468,5.336,6.25,1.05, +44.699,-64.071,4.99,0.13, +45.594,4.353,5.61,-0.1, +45.57,4.09,2.53,1.64, +45.484,-9.961,5.83,1.11, +45.539,-6.495,6.19,0.6, +45.407,-28.092,5.89,0.79, +46.199,53.506,2.93,0.7, +45.876,28.27,6.36,null, +45.676,-7.685,5.32,0.94, +46.385,56.706,4.76,1.02, +45.598,-23.624,4.09,0.16, +46.416,56.069,6.11,1.02, +46.294,38.84,3.39,1.65, +46.829,64.058,5.89,-0.03, +46.337,40.583,6.05,1.01, +46.17,15.856,6.49,null, +46.068,-7.601,5.26,0.2, +46.159,1.864,6.05,1.04, +46.361,25.255,6.8,-0.02, +46.361,25.255,7,null, +45.733,-46.975,5.82,1.3, +47.016,52.213,6.31,-0.01, +46.599,13.187,5.62,1.08, +47.985,74.394,4.87,0.02, +46.948,47.308,6.41,0.12, +45.903,-59.738,5.11,0.34, +46.64,-6.089,5.27,1.6, +47.042,40.956,2.12,-0.05, +47.267,49.613,4.05,0.59, +46.857,17.88,6.11,-0.12, +45.564,-71.902,5.53,-0.14, +47.088,18.795,6.27,1.58, +47.374,44.857,3.8,0.98, +47.161,8.471,6.28,1.06, +46.962,-27.831,6.19,0.16, +47.403,29.077,5.72,0.12, +47.537,27.82,6.42,0.01, +47.613,26.896,6.02,1.28, +47.823,39.612,4.63,1.11, +47.662,11.873,5.98,-0.06, +48.11,47.726,6.33,1.43, +48.04,42.376,6.15,-0.09, +47.908,19.727,4.35,1.03, +47.841,13.048,6.12,1.02, +47.648,-23.738,6.38,0.93, +48.059,27.257,5.79,-0.12, +47.828,-3.812,6.05,1.66, +48.35,48.177,5.9,0.97, +47.82,-16.025,6.26,1.2, +48.11,6.661,5.56,1.08, +46.955,-69.266,6.15,1.02, +47.614,-48.734,6.12,1.12, +50.082,77.735,5.45,0.19, +48.193,-1.196,5.06,0.57, +48.018,-28.987,3.87,0.52, +48.95,57.141,5.79,0.73, +53.084,84.911,5.61,0.92, +48.736,42.504,6.07,1.07, +49.382,65.659,6.36,0.09, +48.108,-44.42,5.93,0.44, +49.051,50.938,5.03,1.15, +48.256,-35.944,6.27,-0.08, +48.835,30.557,5.52,0.01, +48.725,21.044,4.89,-0.01, +49.02,45.346,6.16,1.67, +48.408,-29.804,6.16,1.05, +48.946,32.856,6.31,0.37, +49.008,34.689,6.25,0.28, +48.138,-57.322,5.74,2.28, +49.146,32.184,6.06,0.99, +49.298,40.483,6.45,null, +48.751,-26.1,6.25,0.04, +46.883,-78.989,5.57,0.3, +49.448,44.025,5.47,-0.06, +49.004,-5.919,6.17,-0.02, +48.958,-8.82,4.8,0.23, +49.998,65.652,4.84,-0.15, +49.441,39.283,5.96,0.07, +49.658,50.222,5.15,-0.06, +49.149,-9.154,6.14,0.4, +49.782,50.095,5.03,-0.06, +49.047,-30.827,6.65,-0.07, +49.683,34.223,4.82,1.49, +49.593,-0.93,5.38,1.04, +49.512,-28.797,5.91,0.33, +49.592,-22.511,4.88,0.9, +49.982,27.071,5.9,0.86, +49.84,3.37,4.83,0.68, +49.672,-18.56,5.71,0.37, +49.361,-47.752,5.85,1.24, +50.085,29.048,4.47,1.55, +50.107,25.663,6.12,1.24, +50.469,49.071,5.93,0.43, +50.36,43.329,4.95,0.04, +49.879,-21.758,3.69,1.62, +49.895,-24.123,5.61,1.66, +50.307,21.147,5.28,-0.07, +49.443,-62.575,5.54,0.64, +50.278,3.676,5.69,0.97, +49.982,-43.07,4.27,0.71, +51.169,64.586,5.23,2.08, +49.554,-62.506,5.24,0.6, +50.805,49.213,5.29,-0.07, +50.55,27.608,5.52,1.1, +50.188,-26.606,6.39,0.54, +49.496,-66.927,6.05,0.13, +50.688,20.742,5.09,1.24, +50.35,-23.635,5.52,0.88, +51.081,49.861,1.79,0.48, +50.568,-25.588,6.35,0.01, +51.124,33.536,5.61,-0.03, +51.452,53.922,6.51,0.29, +50.389,-47.777,6.39,1, +51.077,24.724,5.5,1.19, +50.913,4.882,6.38,0.86, +50.824,-7.794,6.2,0.7, +48.99,-77.388,5.52,0.44, +51.289,41.257,6.51,null, +51.109,20.804,6.08,-0.04, +51.042,12.629,6.04,1.23, +51.489,49.121,6.09,-0.07, +51.203,9.029,3.6,0.89, +50.936,-32.707,6.5,1.37, +52.581,71.864,6.32,1.8, +52.098,60.256,6.49,0.02, +52.013,49.063,4.98,-0.09, +52.267,59.94,4.21,0.41, +51.763,18.756,6.57,0.15, +52.218,49.848,5.58,-0.04, +51.793,9.733,3.74,-0.09, +51.828,12.735,6.28,-0.02, +52.479,58.879,4.54,0.56, +52.087,33.808,5.61,0.02, +51.482,-35.921,6.39,0.08, +52.547,59.366,6.13,0.08, +52.342,49.509,4.67,-0.09, +51.594,-27.317,5.93,0.94, +52.501,55.452,5.09,0.05, +52.359,46.938,6.24,0.13, +52.111,22.804,6.03,0.95, +51.549,-41.637,6.32,0.06, +52.004,-11.287,5.73,1.1, +52.654,48.104,5.82,-0.04, +52.644,47.995,4.36,1.35, +51.01,-69.625,6.15,0.48, +51.889,-35.681,5.71,1.29, +53.802,73.347,6.57,0.03, +52.873,49.21,6.29,0.09, +52.048,-35.853,6.5,0.13, +52.955,49.401,6.39,0.09, +52.413,-6.805,5.99,1.02, +52.602,11.336,5.14,-0.03, +52.4,-12.675,5.59,0.17, +53.036,48.024,5.47,-0.1, +51.401,-69.336,5.96,0.42, +52.837,27.572,5.96,null, +52.718,12.937,4.11,1.12, +52.689,6.189,5.94,0.96, +53.384,58.765,6.4,0.14, +53.11,46.057,5.31,0.4, +52.655,-5.075,4.73,-0.09, +53.422,57.869,6.37,0.51, +53.163,44.856,6.41,0.03, +53.412,54.975,5.98,0.11, +53.167,35.462,5.9,-0.06, +52.479,-42.634,5.78,0.22, +52.557,-41.37,6.12,0.48, +53.753,60.041,6.46,0.39, +53.396,39.899,5.81,0.11, +53.15,9.374,5.77,-0.08, +54.853,75.74,6.27,0.97, +52.654,-47.375,5.99,0.11, +52.975,-25.614,6.38,0.12, +52.345,-62.937,4.72,0.4, +53.232,-9.458,3.73,0.88, +53.535,17.833,6.17,0.89, +53.611,24.464,5.92,0.13, +54.123,48.193,4.23,-0.06, +53.447,-21.633,4.27,-0.11, +53.705,6.418,6.49,0.63, +53.145,-50.379,5.68,1.1, +53.656,-9.869,6.25,0.02, +52.715,-66.49,5.83,-0.06, +53.487,-31.08,6.2,0.48, +54.582,56.933,6.3,-0.13, +53.64,-31.875,6.4,1.4, +53.215,-61.017,6.41,1.04, +54.501,42.583,6.42,-0.06, +53.99,-11.194,5.57,0.91, +54.197,0.588,5.71,0.92, +54.073,-17.467,5.23,-0.13, +54.218,0.402,4.28,0.58, +54.449,15.431,6.39,0.17, +54.75,20.916,6.5,0.15, +53.603,-65.764,6.75,0.17, +55.539,63.217,5.1,1.63, +54.274,-40.275,4.58,1.04, +62.506,86.626,5.86,0.37, +54.622,-7.392,5.85,0.98, +52.495,-78.352,5.7,0.93, +54.857,16.537,6.16,1, +54.755,-5.626,5.96,0.92, +55.678,59.969,5.76,1.71, +55.283,37.58,5.57,-0.07, +54.699,-27.943,6.01,-0.02, +54.963,3.057,5.57,0.94, +54.91,-3.393,6.23,1.04, +54.856,-10.437,6.19,1.03, +55.193,25.329,6.11,0.06, +54.998,-1.121,6.12,1, +55.048,-15.227,6.33,0.88, +55.16,-5.211,5.53,-0.15, +55.731,47.788,3.01,-0.13, +55.594,33.965,4.97,-0.01, +56.504,67.202,5.8,0.35, +55.308,-11.803,6.49,0.36, +55.579,19.7,5.69,-0.01, +56.027,48.524,6.06,1.55, +55.343,-19.585,6.59,0.09, +56.51,63.345,4.8,0.8, +56.17,46.1,6.11,0.28, +56.08,32.288,3.83,0.05, +55.947,19.665,6.14,1.01, +56.131,36.46,5.59,0.06, +55.562,-31.938,5,-0.16, +56.298,42.579,3.77,0.42, +55.812,-9.763,3.54,0.92, +56.117,20.929,6.1,0.01, +57.307,70.871,5.44,0.09, +55.891,-10.486,5.6,0.22, +56.201,24.289,5.46,-0.04, +56.497,45.682,5.66,-0.07, +56.219,24.113,3.7,-0.11, +55.709,-37.314,4.59,1.2, +56.29,24.839,5.64,-0.07, +56.302,24.467,4.3,-0.11, +56.127,-1.163,5.25,-0.1, +56.884,55.923,6.1,-0.03, +57.59,71.332,4.63,0.03, +56.457,24.368,3.87,-0.07, +56.235,-0.297,5.55,1.42, +56.477,24.555,5.76,-0.04, +56.512,24.528,6.43,-0.02, +56.418,6.05,5.35,-0.12, +54.125,-78.323,6.29,1.15, +57.38,65.526,4.47,1.88, +56.582,23.948,4.18,-0.06, +56.026,-40.66,6.45,1.06, +57.403,63.297,5.85,0.18, +56.54,6.803,5.91,0.99, +57.076,50.737,6.14,0.06, +57.332,57.118,6.46,0.06, +56.535,-12.102,4.42,1.63, +56.969,33.6,6.57,0.08, +56.954,32.195,6.25,0.47, +56.871,24.105,2.87,-0.09, +57.924,68.508,6.32,-0.08, +56.211,-48.061,6.49,1.02, +56.141,-54.274,6.3,1.04, +56.316,-47.36,5.73,0.96, +57.284,43.963,6.02,0.29, +56.614,-29.338,5.9,0.12, +57.087,23.421,5.45,-0.07, +56.712,-23.25,4.23,0.42, +57.068,11.143,5.07,-0.13, +56.05,-64.807,3.85,1.13, +57.519,44.968,5.66,0.76, +57.386,33.091,5.11,0.07, +57.29,24.053,3.63,-0.09, +56.834,-29.902,6.55,0.49, +57.297,24.137,5.09,-0.08, +56.915,-23.875,5.24,0.07, +57.162,0.228,5.91,1.23, +57.431,23.712,6.17,-0.05, +56.983,-30.168,5.54,0.98, +57.479,22.244,6.07,-0.01, +56.957,-36.106,6.21,-0.1, +57.149,-20.903,5.81,1.64, +57.579,25.579,5.26,0.21, +57.148,-37.622,5.4,0.01, +57.15,-37.621,4.73,-0.03, +57.974,34.359,5.77,0, +58.43,57.975,5.8,0.18, +57.903,22.032,6.83,null, +57.816,13.046,6.3,-0.07, +57.364,-36.2,4.17,0.95, +59.126,71.822,6.34,0.3, +58.018,31.168,6.25,0.2, +58.411,48.651,5.76,1.05, +58.001,6.535,5.67,0.06, +57.657,-36.425,6.86,-0.04, +58.292,17.327,5.97,0.34, +58.173,-5.361,5.48,-0.1, +58.533,31.884,2.85,0.12, +59.356,63.072,5.03,-0.09, +59.285,61.109,5,1.45, +58.304,-18.434,6.22,0.88, +58.993,47.871,5.37,-0.08, +56.81,-74.239,3.24,1.62, +58.846,31.046,6.1,0.29, +59.152,50.695,5.28,0.41, +58.573,-2.953,6.14,0.09, +58.573,-2.955,4.79,0.94, +58.427,-24.612,4.65,-0.13, +58.412,-34.732,5.11,-0.13, +59.12,35.081,5.49,-0.03, +58.389,-46.894,5.93,1.24, +58.818,-12.099,6,0.32, +59.217,22.478,5.63,0.3, +58.597,-40.357,5.71,0.6, +59.463,40.01,2.89,-0.18, +59.266,23.176,6.06,0.02, +59.36,24.462,6.16,1.37, +59.513,34.814,6.53,0.23, +59.257,6.04,6.09,0.06, +59.158,-9.751,6.19,0.28, +59.621,38.84,6.3,1.08, +58.642,-52.691,6.46,0.16, +59.741,35.791,4.04,0.01, +59.917,38.821,6.38,0.1, +62.512,80.699,5.1,0.56, +59.508,-13.509,2.95,1.59, +59.718,-5.47,5.83,1, +59.92,10.331,6.37,0.42, +60.311,36.99,6.41,-0.01, +59.875,-12.574,5.6,1.48, +59.017,-63.464,6.14,1.1, +60.154,17.297,6.32,0.06, +60.203,18.194,5.89,0.32, +60.17,12.49,3.47,-0.12, +59.981,-24.016,4.66,-0.13, +61.513,68.68,5.87,1.54, +61.113,59.156,5.06,0.5, +60.442,9.998,5.67,0.02, +60.383,-1.55,5.28,-0.15, +59.679,-57.102,6.05,0.44, +60.17,-30.491,5.93,0.04, +59.686,-61.4,4.56,1.62, +61.662,65.521,6.17,0.14, +60.653,-0.269,5.38,0.5, +60.065,-51.565,6.51,1.64, +60.789,5.989,3.91,0.03, +61.09,24.106,5.47,0.86, +60.936,5.436,5.33,-0.08, +60.986,8.197,5.46,0.37, +61.652,54.009,6.31,0.99, +61.174,22.082,4.36,1.07, +61.041,2.827,5.36,0.5, +60.853,-20.144,6.46,-0.18, +60.903,-20.158,7.01,1.22, +61.963,62.33,6.99,0.42, +61.646,50.351,4.29,0.02, +61.334,22.009,5.9,0.62, +61.036,-16.589,6.39,1.26, +60.224,-62.159,4.51,1.65, +61.095,-12.792,5.61,1.08, +60.326,-61.079,4.97,1.42, +61.171,-20.382,6.13,1.16, +61.652,27.6,5.2,-0.13, +61.752,29.001,5.23,0.34, +62.365,59.908,6.28,1.14, +55.634,-85.262,6.41,-0.01, +61.485,-8.856,6.26,0.06, +62.165,47.713,4.04,-0.03, +61.445,-20.512,6.34,0.92, +61.406,-27.652,5.59,0.31, +62.343,54.829,6.18,null, +62.064,37.728,6.09,0.95, +62.153,38.04,5.51,0.46, +61.925,15.163,6.01,0.4, +61.997,17.34,5.89,1.5, +63.437,72.126,6.03,1.01, +63.215,68.502,6.32,1.18, +62.292,19.609,5.5,1.07, +62.257,13.398,5.95,0.05, +61.855,-42.917,6.59,0.93, +62.746,33.587,5.72,1.44, +62.708,26.481,5.41,0.34, +62.324,-16.386,5.37,-0.15, +67.054,83.808,5.57,-0.13, +62.594,-6.924,5.44,0.94, +62.141,-45.865,6.59,0.38, +62.835,5.523,5.72,0.36, +62.699,-8.82,5.7,1.06, +61.84,-64.222,6.38,0.64, +63.131,17.278,6.09,1.08, +63.757,57.46,6.08,0.61, +63.213,22.414,6.12,0.19, +62.966,-6.837,4.04,0.33, +62.691,-35.274,6.44,1.07, +62.901,-20.356,5.79,0.18, +63.498,37.967,6.45,null, +62.711,-41.994,4.93,0.33, +63.725,48.409,4.14,0.95, +67.5,83.341,5.46,0.87, +64.223,61.85,5.7,-0.14, +63.722,40.484,4.71,1.01, +63.395,10.212,6.23,0.05, +63.38,8.891,6.51,0.16, +63.388,7.716,5.29,0.36, +63.458,12.753,6.25,1.16, +63.485,9.264,4.84,0.8, +63.409,-1.15,6.44,-0.13, +64.284,57.861,5.71,1.09, +64.18,53.612,5.19,0.05, +63.651,10.011,5.22,-0.1, +63.132,-44.368,6.71,1.48, +66.762,80.824,5.43,1.17, +63.599,-10.256,4.87,1.17, +63.943,15.401,6.32,0.4, +63.884,8.892,4.29,-0.06, +63.858,6.2,6.93,0.7, +63.872,6.187,6.31,0.59, +63.399,-40.358,6.37,1.46, +64.561,50.296,4.61,0.04, +63.818,-7.653,4.43,0.82, +63.5,-42.294,3.86,1.1, +65.168,65.141,5.27,0.81, +64.534,42.141,6.22,-0.08, +64.315,20.579,4.94,0.26, +64.805,50.049,5.45,0.22, +64.597,21.579,5.65,0.28, +64.33,-6.472,5.94,1.08, +65.048,50.921,5.55,-0.01, +64.602,9.487,6.54,0.16, +65.448,60.736,5.39,1.49, +63.606,-62.474,3.35,0.91, +65.06,41.808,5.92,0.94, +64.007,-51.487,4.25,0.3, +64.859,21.142,5.35,-0.08, +63.703,-62.192,5.45,1.1, +64.903,21.774,5.38,-0.14, +65.466,56.507,5.88,null, +65.103,34.567,4.93,0.94, +65.042,31.953,6.16,1.71, +64.566,-20.716,6,1.67, +64.948,15.628,3.65,0.99, +64.474,-33.798,3.56,-0.12, +65.089,27.351,4.95,1.15, +64.906,10.121,6.31,1.43, +65.388,46.499,4.85,-0.03, +64.99,14.035,5.59,0.28, +65.741,59.616,6.19,null, +64.656,-22.97,6.07,0.3, +65.105,18.743,6.12,0.37, +64.12,-59.302,4.44,1.08, +65.151,15.095,5.26,0.22, +64.088,-60.949,6.37,0.07, +65.22,13.864,6.17,0.46, +64.763,-33.905,6.37,0.13, +65.172,6.131,5.77,0.92, +65.204,9.226,6.53,0.15, +65.161,-6.246,6.27,0.91, +65.178,-7.592,5.85,-0.13, +64.819,-44.268,5.34,1.08, +64.667,-52.86,6.09,0.49, +65.363,-0.098,5.86,1.32, +65.162,-20.64,5.38,-0.02, +65.515,14.077,5.72,0.32, +65.645,25.629,5.37,-0.05, +65.595,20.821,5.91,1.66, +65.9,42.428,6.23,0, +64.418,-63.256,5.87,-0.07, +65.734,17.543,3.76,0.98, +65.38,-25.728,6.01,0.35, +65.885,20.982,5.99,0.03, +65.854,16.777,5.64,0.3, +66.122,34.131,5.73,-0.06, +65.999,24.301,6.36,0.17, +66.156,33.96,5.76,0.4, +66.024,17.444,4.8,0.15, +65.966,9.461,5.12,0.07, +66.754,57.585,6.32,0.04, +65.92,-3.746,5.17,0.08, +65.774,-24.892,5.83,1.51, +66.238,19.042,5.98,0.37, +65.782,-35.545,6.39,1.24, +66.342,22.294,4.22,0.13, +66.354,22.2,5.28,0.25, +66.373,17.928,4.29,0.05, +66.526,31.439,5.28,0.97, +66.405,15.941,6.46,0.49, +66.577,22.814,4.28,0.26, +66.009,-34.017,3.96,1.49, +66.587,15.618,4.49,0.25, +65.472,-63.386,5.24,0.96, +66.652,14.714,4.69,0.98, +66.588,8.59,6.06,0.02, +66.235,-34.758,6.55,0.44, +66.823,22.996,5.53,-0.1, +66.753,2.079,6.23,1.09, +68.378,72.529,5.94,0.3, +66.87,11.212,5.88,0.05, +67.003,21.62,5.72,0.27, +66.33,-44.161,6.39,0.44, +66.051,-57.071,6.29,0.66, +67.216,30.361,6.4,0.52, +67.11,16.36,4.97,1.13, +67.098,14.741,5.9,0.32, +67.154,19.18,3.53,1.01, +66.738,-24.081,6.11,0.14, +67.144,15.962,3.84,0.95, +67.165,15.871,3.4,0.18, +67.015,1.859,6.15,1.02, +67.209,13.048,5.03,0.23, +67.134,1.381,5.55,-0.1, +66.272,-61.238,5.94,1.54, +68.008,53.911,5.77,0.18, +66.775,-46.947,6.1,0.46, +67.66,32.458,6.21,-0.04, +67.429,10.522,6.79,0.09, +67.163,-19.458,5.96,1.22, +67.536,15.638,5.58,0.32, +67.279,-13.048,5.6,-0.23, +67.85,40.01,6.26,0.04, +67.51,10.263,6.48,1.03, +64.496,-80.214,5.69,0.84, +67.64,16.194,4.78,0.17, +67.662,15.692,5.48,0.26, +67.039,-41.96,6.44,1.64, +67.655,13.724,5.4,0.26, +67.54,-13.592,6.24,1, +67.966,15.852,6.02,0.34, +67.333,-46.515,6.16,1.06, +68.354,43.064,6.09,0.38, +66.941,-62.521,5.75,1.01, +68.02,5.41,6.39,0.42, +67.97,-0.044,4.91,1.32, +67.858,-13.645,6.21,0.12, +67.668,-35.654,5.96,1, +69.101,64.262,5.94,-0.03, +68.156,-3.209,5.81,-0.14, +68.387,18.017,6.25,0.07, +67.709,-44.954,5.07,-0.19, +68.462,14.844,4.65,0.25, +68.658,28.961,5.88,-0.06, +68.45,9.413,6.01,1.06, +68.342,-10.786,6.06,1.38, +68.535,5.569,5.68,0.05, +68.478,-6.739,5.72,-0.13, +68.559,-6.838,6.09,1.38, +68.548,-8.231,5.11,1.7, +68.549,-8.97,5.26,1.47, +68.378,-29.767,4.51,0.98, +69.172,41.265,4.25,1.22, +68.928,19.882,6.36,null, +65.241,-81.58,5.79,0.35, +68.98,16.509,0.85,1.54, +68.914,10.161,4.25,0.18, +69.122,23.341,6.02,0.38, +68.808,-9.737,6.37,0.11, +68.752,-19.921,6.13,1.17, +69.007,-3.612,6.33,-0.1, +69.08,-3.352,3.93,-0.21, +68.887,-30.562,3.82,0.98, +68.499,-55.045,3.27,-0.1, +69.992,53.473,5.35,0.32, +69.978,53.08,5.05,1.07, +71.501,76.611,6.49,0.51, +69.307,0.998,5.31,-0.12, +69.623,26.94,6.47,null, +69.566,20.685,5.92,-0.05, +69.539,16.033,5.79,0.31, +69.54,12.511,4.27,0.12, +69.4,-2.473,5.23,0.28, +68.392,-62.824,5.79,1.04, +69.212,-30.717,6.3,-0.1, +69.846,25.218,6.22,0.16, +69.788,15.8,5.07,0.15, +69.819,15.918,4.69,0.15, +69.776,7.871,5.39,0.26, +69.545,-14.304,3.87,1.09, +70.35,48.301,5.67,-0.02, +69.723,-12.123,5.01,0.07, +70.014,12.198,5.46,-0.12, +65.712,-82.899,6.76,0.2, +70.825,59.521,6.5,null, +69.832,-14.359,5.45,1.06, +69.947,-1.053,6.1,0.94, +70.46,38.28,5.99,0.57, +70.333,28.615,5.78,-0.03, +72.21,75.941,6.06,0.28, +69.19,-62.077,5.4,1.58, +70.84,49.974,5.87,0.02, +70.726,43.365,5.29,0, +70.028,-24.482,5.58,0.92, +70.11,-19.672,4.32,1.61, +70.561,22.957,4.28,-0.13, +69.768,-51.673,6.44,1.32, +70.808,24.089,6.13,0.54, +71.054,40.787,6.08,0.06, +70.951,32.865,6.45,null, +70.14,-41.864,4.45,0.34, +70.515,-37.144,5.05,0.37, +70.076,-58.944,6.53,0.68, +70.894,-8.794,6.82,0.39, +70.896,-8.796,6.7,0.92, +71.108,11.146,5.4,0.25, +71.022,-8.504,5.9,-0.11, +70.789,-30.766,5.68,1.41, +72.652,70.942,6.37,-0.08, +72.001,56.757,5.3,0.25, +71.427,23.628,6.35,0.06, +71.033,-18.667,5.53,0.02, +71.685,40.313,5.97,0.93, +72.029,55.603,6.26,null, +70.693,-50.481,5.31,0.98, +71.57,18.735,6.01,1.21, +70.934,-41.065,6.25,1.46, +71.507,11.706,5.37,0.19, +71.375,-3.255,4.02,-0.15, +71.268,-21.284,5.72,1.47, +71.6,-2.954,6.33,0.04, +75.086,81.194,5.07,1.28, +71.457,-34.005,6.86,0, +71.608,-28.087,6.19,0.19, +71.481,-39.357,6.05,1.07, +73.022,63.505,5.44,1.57, +72.329,32.588,5.86,0.24, +72.303,31.437,5.58,1.12, +71.088,-59.733,5.27,0.2, +69.59,-77.656,6.05,1.1, +71.901,-16.934,5.51,0.63, +72.477,37.488,4.88,1.44, +72.186,3.588,6.03,1.19, +72.789,48.741,5.66,0.99, +72.151,-5.674,5.78,0.62, +72.434,15.904,6.08,1.6, +72.135,-16.329,5.77,0.55, +71.957,-30.02,6.37,1.07, +71.241,-63.23,6.46,1.08, +70.766,-70.931,5.54,-0.12, +73.513,66.343,4.29,0.03, +72.46,6.961,3.19,0.45, +72.653,8.9,4.36,0.01, +72.426,-13.77,6.26,0.44, +73.291,52.841,6.41,null, +72.844,18.84,5.1,0.21, +72.141,-43.98,6.72,0.95, +72.548,-16.217,5.03,0.98, +73.199,42.587,5.71,0.11, +73.158,36.703,4.78,1.41, +72.802,5.605,3.69,-0.17, +72.931,9.975,6.11,0.08, +73.196,27.898,5.97,0.37, +73.763,55.259,5.52,0.04, +73.133,14.251,4.74,1.84, +72.568,-41.321,6.07,0.37, +73.714,44.061,6.08,-0.02, +72.867,-34.906,5.86,0.08, +73.224,-5.453,4.39,0.25, +74.03,52.869,5.75,0.11, +73.345,2.508,5.33,1.64, +72.73,-53.461,5.61,0.33, +72.735,-53.46,6.42,null, +73.483,1.569,6.61,0.04, +73.743,19.485,6.37,0.29, +73.563,2.441,3.72,-0.18, +74.322,53.752,4.47,-0.02, +73.695,11.426,5.19,0.12, +73.724,10.151,4.65,0.09, +73.699,7.779,5.33,1.22, +75.584,74.269,6.06,1.57, +74.083,36.169,6.07,0.41, +73.711,0.468,5.99,-0.12, +74.065,24.592,6.37,0.33, +73.96,15.04,5.81,-0.08, +74.248,33.166,2.69,1.53, +73.993,5.399,6.5,0.02, +73.778,-16.741,5.7,0.96, +74.093,13.514,4.07,1.15, +73.828,-16.418,5.72,0.88, +74.101,-5.171,5.51,-0.13, +73.876,-25.728,6.72,0.27, +73.728,-39.629,6.1,1.42, +74.343,17.154,5.48,1.31, +74.453,23.949,5.79,1.11, +76.054,73.764,6.66,null, +74.943,53.156,6.08,1.46, +76.166,74.067,5.96,null, +74.539,25.05,5.81,0, +74.322,-1.067,6.23,0.42, +74.814,37.89,4.94,0.04, +75.4,61.078,6.03,0.41, +75.71,66.823,6.19,0.48, +74.437,-14.231,6.15,-0.21, +74.545,-2.213,6.35,0.1, +73.721,-58.547,6.12,0.44, +73.377,-66.676,6.41,1.63, +75.076,39.395,5.95,0.41, +74.748,14.543,6.09,0.04, +74.637,1.714,4.47,1.4, +75.097,39.655,6.58,null, +75.855,60.442,4.03,0.92, +74.755,-16.376,5.66,0.43, +75.492,43.823,2.99,0.54, +73.273,-72.407,6.28,0.52, +74.902,-14.806,7.71,5.74, +74.96,-10.263,5.38,0.8, +75.136,3.615,7.03,null, +75.141,3.616,6.66,-0.07, +74.983,-12.537,4.79,0.26, +75.62,41.076,3.75,1.22, +75.166,-2.066,6.32,0.28, +75.204,-5.753,6.22,1.06, +75.828,41.442,6.14,0.16, +82.95,85.939,6.51,0.32, +75.36,-7.174,4.81,-0.19, +75.46,0.722,5.92,1.27, +75.5,1.609,6.24,-0.04, +75.774,21.59,4.64,0.16, +75.357,-20.052,4.91,-0.05, +76.535,58.973,5.08,-0.08, +76.551,59.021,6.08,1.12, +76.624,61.17,6.04,1.37, +75.69,-4.21,5.85,1.21, +76.06,30.495,6.14,1.21, +76.154,32.32,6.62,0.27, +75.541,-26.275,5.02,1.07, +73.797,-74.937,5.47,1.52, +76.592,54.406,7.24,null, +75.394,-39.718,6.03,0.88, +76.158,27.696,6.6,0.24, +76.09,21.278,6.19,1.32, +75.687,-22.795,5.75,1.2, +75.595,-31.771,5.94,1.17, +77.403,69.639,6.41,1.11, +76.669,51.598,5,0.33, +76.142,15.404,4.68,-0.06, +76.504,35.936,6.52,0.16, +75.967,-14.369,6.41,-0.18, +76.629,41.234,3.17,-0.18, +76.384,19.806,6.44,0.21, +78.093,73.947,5.43,-0.12, +76.707,43.175,6.2,0.43, +75.972,-24.388,5.61,0.1, +76.227,-3.04,6.05,-0.11, +77.435,64.919,6.41,0.4, +76.349,1.178,6.17,3.45, +75.702,-49.151,5.38,0.42, +78.648,76.473,6.37,-0.02, +75.975,-41.745,6.31,0.53, +76.102,-35.483,4.55,1.2, +76.109,-35.705,6.34,0.3, +76.365,-22.371,3.19,1.46, +76.318,-26.152,5.73,1.17, +76.863,18.645,5,0.65, +76.69,-4.655,5.12,-0.06, +76.952,20.418,5.3,0.09, +77.028,24.265,5.5,0.06, +76.981,21.705,5.89,0.19, +76.653,-13.122,6.05,-0.06, +76.91,9.472,6.17,0.62, +76.242,-49.578,5.03,1.49, +76.97,8.498,5.34,0.33, +76.854,-12.491,5.97,0.6, +76.963,-5.086,2.79,0.13, +76.253,-54.407,6.27,1.54, +77.679,46.962,5.68,0.42, +77.579,37.302,6.02,0.72, +77.438,28.031,6.01,0.27, +77.084,-8.665,5.78,-0.06, +77.332,9.829,5.43,0.24, +77.182,-4.456,5.12,0.44, +76.378,-57.473,4.72,0.52, +78.263,61.85,6.17,0.02, +77.425,15.597,4.82,0.32, +75.679,-71.314,5.31,1, +78.38,62.691,6.5,0.21, +77.287,-8.754,4.27,-0.19, +77.062,-35.718,6.52,1.08, +77.513,-0.565,6.1,1.1, +75.055,-78.3,6.29,1.51, +79.555,73.268,5.74,null, +77.923,16.046,5.18,1.49, +77.742,-2.254,6.25,0.98, +80.64,79.231,5.05,0.47, +77.83,-2.491,5.9,0.46, +78.797,59.406,6.15,1.18, +78.357,38.484,4.86,0.18, +77.923,0.515,6.67,-0.07, +77.939,1.037,5.89,0.66, +78.685,53.214,6.2,0.07, +77.845,-11.849,5.68,1.46, +77.685,-25.909,6.41,1.25, +76.892,-63.4,5.2,1.65, +78.075,-11.869,4.45,-0.1, +78.201,-6.057,5.91,0.96, +78.323,2.861,4.46,1.19, +77.9,-37.395,6.57,1.62, +76.539,-73.038,6.27,-0.01, +78.382,1.968,6.09,0.42, +78.233,-16.206,3.31,-0.11, +78.447,0.56,6.32,1.46, +78.389,-8.148,6.37,-0.13, +78.308,-12.941,4.36,-0.1, +78.852,32.688,5.02,0.23, +79.324,53.586,6.5,1.66, +79.173,45.998,0.08,0.8, +78.684,5.156,5.5,1.37, +78.5,-14.607,6.21,0.37, +78.865,22.285,6.27,0.08, +79.076,34.312,5.96,0.22, +78.635,-8.202,0.12,-0.03, +85.953,85.668,6.6,null, +78.444,-35.826,6.98,1.47, +74.712,-82.471,5.85,0.93, +78.827,-1.409,6.15,0.39, +79.017,11.341,5.56,-0.04, +79.866,58.117,6.13,-0.03, +80.094,62.654,5.61,1.75, +78.62,-35.977,5.76,1.01, +79.566,42.792,5.48,1.65, +78.851,-26.943,5.07,-0.1, +79.171,1.947,6.42,-0.02, +79.668,40.465,6.18,1.37, +79.545,33.372,4.54,1.27, +78.472,-52.031,6.05,1.39, +79.579,33.767,6.14,-0.06, +79.785,40.099,4.71,0.63, +78.946,-34.927,6.66,0.15, +79.2,-17.142,6.56,-0.16, +79.75,33.748,5.41,-0.19, +80.01,44.426,6.62,null, +79.848,33.986,6.49,0.24, +79.402,-6.844,3.6,-0.11, +80.164,46.964,6.54,0.6, +79.418,-13.52,5.5,0.93, +80.062,41.086,5.52,0.11, +79.819,22.096,4.94,0.93, +80.004,33.958,5.03,0.27, +79.811,20.135,6.08,1.01, +78.912,-52.182,6.49,1.21, +79.371,-34.895,4.83,1, +78.439,-67.185,4.83,1.28, +82.357,77.978,6.56,0.14, +79.797,2.596,5.34,0.41, +79.71,-18.13,5.96,0.58, +79.897,-1.412,6.34,-0.11, +80.452,41.804,5.23,-0.15, +80.247,27.957,6.33,0.04, +80.866,57.544,5.28,-0.03, +80.303,29.57,5.76,0.06, +79.823,-18.52,6.36,-0.16, +79.826,-18.51,6.54,-0.11, +80.236,19.814,6.18,1.23, +79.894,-13.177,4.29,-0.26, +79.996,-12.316,5.3,-0.12, +79.849,-27.369,5.99,-0.04, +80.11,-5.367,6.39,-0.03, +80.71,41.029,5.54,0.12, +80.33,4.012,6.57,-0.09, +80.112,-21.239,4.71,-0.05, +80.432,8.429,5.8,-0.13, +80.383,-0.416,5.68,-0.12, +80.44,-0.382,4.73,-0.17, +80.086,-34.699,6.34,0.33, +79.842,-50.606,5.45,0.51, +80.845,28.937,6.46,-0.04, +80.463,-13.756,6.56,-0.09, +80.708,3.544,5,-0.15, +80.443,-24.773,5.06,0.67, +80.32,-34.345,6.09,-0.19, +81.163,37.386,4.99,1.42, +80.907,16.699,6.08,0.14, +81.16,31.224,6.28,1.24, +81.16,31.143,5.94,0.04, +80.88,5.323,6.35,0.12, +80.827,-8.416,5.9,-0.03, +81.304,34.855,6.55,1.11, +81.106,17.383,4.99,0.53, +80.926,-0.16,5.7,-0.21, +80.964,-0.867,6.11,0.5, +80.876,-13.927,5.25,-0.21, +80.987,-7.808,4.14,0.96, +80.8,-26.706,6.49,0.5, +81.151,2.353,6.32,-0.15, +81.12,-0.891,5.08,0.96, +81.119,-2.397,3.36,-0.17, +81.187,1.846,4.95,-0.2, +81.283,6.35,1.64,-0.22, +81.573,28.608,1.65,-0.13, +81.118,-16.976,5.65,0, +80.85,-39.679,5.71,1.62, +81.726,35.457,6.15,1.45, +81.704,34.392,5.94,0.14, +81.714,33.263,6.15,1.15, +80.913,-37.337,6.82,1.04, +81.524,16.7,6.25,-0.08, +81.257,-10.329,5.61,1.56, +81.38,-0.544,6.57,-0.05, +80.592,-56.134,6.11,-0.1, +82.543,63.067,5.42,1.71, +81.446,0.521,6.16,-0.18, +81.785,30.209,5.74,0.16, +81.912,34.476,5.07,1.4, +81.51,-5.518,6.23,-0.06, +81.662,6.869,6.42,-0.02, +81.792,17.962,5.42,-0.1, +81.808,15.258,6.16,0.08, +81.909,21.937,4.88,-0.15, +81.709,3.096,4.59,-0.21, +81.499,-19.696,5.89,0.4, +81.232,-44.226,6.08,1.2, +81.94,15.874,5.5,0.01, +78.107,-81.542,6.51,1.11, +82.007,17.239,5.77,1.63, +81.77,-11.901,6.35,0.51, +81.193,-52.316,6.27,0.07, +82.145,13.679,6.35,0.15, +82.007,1.298,6.41,-0.18, +82.319,25.151,5.47,-0.04, +82.419,29.186,6.24,0.45, +81.902,-21.376,6.07,1.04, +82.703,41.462,6,1.11, +82.688,39.826,6.37,0.97, +82.236,-3.307,6.39,-0.01, +81.772,-40.944,5.87,0.23, +83.141,57.221,6.48,0.57, +82.061,-20.759,2.84,0.82, +82.348,-3.446,5.79,1.15, +82.681,22.463,6.29,1.18, +82.609,15.36,5.94,0.14, +82.478,1.789,5.78,-0.2, +82.433,-1.092,4.71,1.57, +82.064,-37.231,5.57,0.02, +81.58,-58.912,5.14,1, +82.583,4.204,6.21,1.27, +82.278,-30.117,6.75,1.06, +82.696,5.948,4.2,-0.14, +82.586,-7.435,6.33,-0.19, +82.81,3.292,5.46,-0.18, +83.182,32.192,4.76,0.34, +84.932,75.044,6.17,1.57, +83.053,18.594,4.38,2.07, +83.37,42.109,6.55,-0.02, +83.059,17.058,5.46,-0.04, +82.837,-6.708,6.22,-0.17, +82.782,-20.864,5.55,0, +83.365,32.801,6.48,0.09, +83.002,-0.284,6.85,-0.16, +83.002,-0.299,2.23,-0.22, +84.318,66.696,6.26,null, +83.408,34.726,6.27,0.15, +82.983,-7.301,4.62,-0.26, +82.54,-47.078,5.46,0.62, +84.313,64.155,6.15,0.01, +83.382,18.54,5.69,0.01, +81.75,-68.623,6.03,0.34, +83.412,20.474,6.18,-0.07, +83.172,-1.592,5.35,-0.19, +82.803,-35.471,3.87,1.14, +83.28,-1.718,6.46,-0.09, +83.476,14.306,5.64,-0.14, +83.182,-17.822,2.58,0.21, +84.147,54.429,5.73,1.63, +82.322,-62.314,6.59,1.53, +83.381,-1.156,5.34,-0.18, +84.066,47.715,6.11,0.26, +82.9,-45.925,5.86,1.35, +83.49,1.408,6.59,-0.17, +83.57,3.767,5.36,0.05, +83.516,-1.036,6.22,-0.17, +83.517,-1.471,5.93,1.55, +83.863,24.039,5.38,-0.09, +83.705,9.489,4.41,-0.16, +83.214,-38.513,5.48,1.22, +83.981,27.662,6.27,1.54, +83.785,9.934,3.54,-0.18, +83.785,9.935,5.61,0.04, +83.281,-35.14,5.78,1.07, +82.566,-63.928,6.19,0.22, +83.806,10.24,5.6,0.12, +84.218,40.182,6.09,1.03, +90.334,85.182,6.11,1.57, +83.754,-6.009,5.67,-0.23, +83.761,-6.002,4.78,-0.25, +83.467,-29.849,6.53,-0.02, +84.126,25.939,6.49,0.43, +83.841,-4.493,6.56,-0.13, +83.844,-4.425,6.24,-0.15, +83.847,-4.838,4.59,-0.19, +83.816,-5.387,6.73,0.02, +83.817,-5.385,7.96,0.24, +83.819,-5.39,5.13,0.02, +83.822,-5.388,6.7,0.09, +83.845,-5.416,5.08,-0.09, +83.88,-4.365,6.38,-0.14, +83.858,-5.91,2.77,-0.24, +83.899,-3.253,6.4,-0.12, +83.915,-4.856,5.26,0.24, +84.287,26.924,5.83,-0.07, +84.053,-1.202,1.7,-0.19, +84.44,33.559,6.33,1.31, +84.266,17.04,5.54,0.22, +84.062,-5.648,6.54,-0.18, +84.226,9.291,4.09,0.95, +84.268,11.035,5.94,1.58, +83.814,-33.08,5.78,1.12, +84.411,21.143,3,-0.19, +84.149,-6.065,5.72,-0.22, +83.435,-54.902,6.43,0.55, +84.33,8.952,6.12,-0.17, +84.659,30.493,5.4,0.45, +84.043,-28.708,6.26,0.13, +85.61,65.698,5.6,1.24, +83.248,-64.228,5.34,1.04, +84.364,-5.938,6.05,-0.22, +84.287,-11.776,6.11,0.05, +84.505,7.541,5.88,-0.07, +84.739,26.618,6.37,null, +83.406,-62.49,3.76,0.82, +84.473,-4.814,6.19,-0.04, +84.827,29.215,5.96,0.16, +85.335,53.481,6.23,0.84, +84.319,-27.871,6.16,0.34, +84.011,-47.314,6.11,1.16, +84.934,25.897,5.18,-0.15, +84.863,21.763,6.34,0.06, +83.76,-58.871,6.75,1.45, +84.687,-2.6,3.81,-0.24, +84.696,-2.594,6.65,-0.19, +84.658,-6.574,5.96,-0.23, +84.796,4.121,4.57,-0.11, +84.436,-28.689,5.31,0.46, +83.74,-61.176,6.32,0.85, +84.721,-7.213,4.8,0.13, +85.15,31.358,6.04,0.04, +85.175,31.921,6.11,2.12, +84.88,-3.565,6,0.27, +85.757,56.582,6.05,0.95, +84.878,-9.707,6.5,-0.1, +86.036,61.477,6.15,0.9, +84.818,-17.849,6.38,-0.12, +85.338,29.488,6.43,-0.11, +85.324,16.534,4.86,-0.13, +84.682,-40.707,5.82,-0.09, +85.19,-1.943,2.05,-0.21, +85.19,-1.943,4.21,null, +85.155,-2.825,6.22,-0.2, +85.478,23.326,6.59,-0.06, +85.211,-1.129,4.95,-0.21, +82.97,-76.341,5.19,1.13, +85.516,22.66,6.36,null, +85.273,0.338,5.93,0.3, +84.912,-34.074,2.64,-0.12, +85.192,-10.409,6.52,-0.16, +84.958,-32.629,5.45,0.92, +85.418,-2.896,6.42,0.3, +84.228,-66.56,6.31,-0.07, +85.831,23.204,6.21,-0.06, +85.423,-16.726,6.21,-0.13, +85.619,1.475,4.91,1.17, +83.686,-73.741,5.78,1.71, +85.56,-17.53,6.15,1.38, +85.363,-33.401,6.34,-0.04, +85.724,-6.796,6.02,0.4, +85.558,-22.374,5.87,0.11, +86.627,56.116,5.94,0.17, +85.789,-1.613,6.31,1.47, +86.475,49.826,5.47,0.03, +85.548,-30.536,6.19,0.01, +85.563,-34.668,5.29,-0.05, +86.456,40.507,6.58,0.25, +85.84,-18.557,5.73,-0.01, +87.27,62.808,6.13,null, +86.414,20.695,6.95,3.03, +86.258,4.008,6.09,0.31, +86.811,42.527,6.29,1.35, +86.118,-20.126,6.34,0.58, +85.876,-39.407,6.25,0.37, +86.11,-22.422,6.15,0.94, +86.116,-22.448,3.6,0.47, +85.921,-45.833,6.39,0.29, +86.69,15.823,6,-0.06, +86.512,-4.268,6.34,1.05, +86.717,9.522,5.79,0.88, +86.646,1.168,5.95,0.78, +86.805,14.488,5.72,0.04, +86.859,17.729,5.49,0.3, +83.901,-78.821,6.05,-0.02, +87.642,56.919,6.54,null, +86.929,13.9,5.29,-0.17, +88.231,68.471,6.2,0.95, +87.294,39.181,4.52,0.94, +86.5,-32.306,5.17,-0.28, +87.093,20.869,6.07,-0.08, +86.739,-14.822,3.55,0.1, +87.001,6.454,5.27,0.23, +86.782,-16.238,6.17,0.89, +86.861,-10.533,6.03,0.16, +87.254,24.568,4.86,1.01, +87.735,51.515,6.29,1.05, +86.939,-9.67,2.06,-0.17, +86.77,-28.639,6.22,-0.15, +88.073,58.964,6.14,-0.04, +87.145,-4.095,5.97,0.64, +86.614,-46.597,5.31,1.04, +86.828,-35.675,6.32,1.18, +87.387,12.651,4.91,-0.07, +87.76,37.306,4.74,1.62, +87.873,39.149,3.97,1.13, +87.742,27.968,5.56,0.97, +87.511,9.871,5.8,0.87, +86.193,-65.736,4.35,0.21, +87.62,14.306,5.52,1.01, +86.992,-40.652,6.61,1.12, +87.857,32.125,6.25,1.75, +87.555,4.423,5.97,1.36, +86.821,-51.066,3.85,0.17, +87.402,-14.484,5.49,0.88, +84.291,-80.469,5.65,0.6, +86.804,-54.361,6.18,1.4, +87.625,2.024,5.98,0.91, +88.165,39.574,6.45,0.09, +87.473,-22.972,5.87,0.06, +88.741,59.888,5.2,0.02, +88.167,33.918,5.98,1.6, +88.712,55.707,4.99,0.05, +88.098,19.868,6.06,0.54, +87.842,-7.518,5.35,-0.2, +87.392,-44.875,6.38,1.27, +88.093,14.172,5.59,-0.05, +88.332,27.612,4.58,-0.02, +87.83,-20.879,3.81,0.99, +87.869,-22.926,6.17,1.02, +88.11,1.855,4.78,1.38, +88.33,20.299,6.71,-0.07, +88.032,-9.041,5.97,0.1, +87.74,-35.768,3.12,1.16, +89.396,66.096,6.25,1.36, +87.457,-56.167,4.51,1.1, +87.998,-29.449,6.45,1.48, +87.619,-52.768,6.35,0.76, +89.06,51.804,6.49,null, +88.746,31.702,5.9,0.14, +88.595,20.276,4.41,0.59, +88.556,10.587,6.12,1.47, +87.722,-52.109,5.17,0.99, +88.634,11.763,6.59,0.03, +88.565,3.225,6.31,1.29, +88.736,19.75,5.92,-0.17, +88.138,-37.631,5.63,1.04, +89.27,49.029,6.47,0.99, +88.199,-38.526,6.7,1.08, +88.279,-33.801,4.87,-0.15, +88.684,0.968,6,1.34, +88.645,-4.064,6.57,-0.18, +82.558,-84.785,6.2,-0.02, +88.489,-19.638,6.69,0.1, +88.793,7.407,0.5,1.85, +86.95,-72.702,6.53,1.08, +88.955,20.175,5.4,0.99, +87.473,-66.901,5.11,-0.14, +88.682,-11.774,5.66,1.53, +89.141,28.942,6.32,0.3, +89.015,13.925,6.6,0.65, +88.559,-29.148,6.36,0.37, +88.345,-42.921,6.55,1.37, +88.876,-4.616,5.87,1.18, +88.898,-4.788,6.28,0.06, +88.085,-57.156,5.94,0.66, +87.846,-64.034,6.36,0.86, +89.234,24.25,6.02,0.39, +89.117,9.51,5.99,-0.07, +89.206,11.521,5.87,1.1, +89.882,54.285,3.72,1, +91.289,75.586,6.4,null, +89.94,55.321,6.44,0.31, +89.95,54.547,6.14,1.2, +89.841,49.924,5.89,1.23, +88.719,-39.958,5.57,1.51, +88.545,-50.362,6.52,0.9, +89.499,25.954,4.82,-0.06, +89.101,-14.168,3.71,0.33, +89.06,-22.84,5.96,1.11, +88.875,-37.121,4.97,1.11, +89.882,44.948,1.9,0.03, +88.671,-49.627,6.1,-0.13, +89.144,-23.216,6.36,1.07, +89.984,45.937,4.26,1.72, +89.087,-31.382,5.5,null, +89.476,1.224,6.22,1.48, +88.709,-52.635,5.29,0.31, +89.93,37.213,2.62,-0.08, +90.079,44.592,6.22,null, +89.549,-0.994,6.22,1.14, +89.204,-31.976,6.44,1.07, +89.722,12.809,5.7,0.89, +89.602,1.837,5.9,0.21, +90.244,47.902,5.73,-0.01, +88.525,-63.09,4.65,1.05, +89.707,0.553,5.22,0.01, +88.55,-64.482,6.63,0.38, +90.43,48.959,5.96,1.45, +89.384,-35.283,4.36,-0.18, +89.754,-9.382,6.12,0.29, +89.768,-9.558,5.03,0.19, +89.907,-1.444,6.63,-0.07, +90.293,31.035,5.98,0.08, +90.252,27.572,6.05,0.25, +90.703,49.906,6.05,-0.06, +90.014,-3.074,4.53,1.22, +89.31,-53.426,6.45,1.48, +90.723,43.379,6.42,null, +90.423,22.401,6.37,-0.07, +89.657,-44.034,5.81,1.07, +90.074,-12.9,6.22,0.36, +90.825,42.912,6.1,0.97, +89.787,-42.815,3.96,1.14, +91.285,59.393,6.34,1.1, +90.73,32.636,6.24,0.42, +91.121,51.573,6.45,0.18, +90.596,9.647,4.12,0.16, +87.57,-79.361,5.47,-0.08, +91.663,63.454,6.39,null, +90.571,1.694,6.59,-0.05, +90.46,-10.598,4.95,-0.12, +90.305,-25.418,6.05,0.02, +90.864,19.691,5.14,-0.11, +90.318,-33.912,5.55,1.58, +91.264,42.982,5.87,0.3, +90.853,11.681,6.08,-0.04, +91.03,23.263,4.16,0.82, +90.98,20.138,4.63,0.28, +90.641,-14.497,6.2,0.96, +91.261,37.964,6.34,null, +90.205,-51.216,5.67,0.2, +91.392,33.599,6.23,-0.08, +90.815,-26.284,5.04,1.34, +91.535,35.388,6.12,0.6, +91.056,-6.709,5.21,-0.06, +91.646,38.483,5.36,0.25, +91.243,5.42,5.67,1.04, +91.243,4.159,5.63,1.04, +91.594,29.513,6.08,1.73, +91.862,41.854,6.12,1.22, +91.246,-16.484,4.93,0.24, +91.085,-32.172,5.65,-0.19, +91.363,-10.243,5.87,0.37, +90.538,-60.097,6.45,1.58, +92.496,58.936,5.36,1.09, +92.096,41.056,6.36,1.05, +91.661,-4.194,5.38,-0.13, +91.539,-14.935,4.67,0.05, +91.44,-24.196,6.95,1.63, +91.118,-45.037,6.35,0.52, +91.168,-45.079,5.93,0.49, +91.893,14.768,4.42,-0.17, +91.363,-35.514,5.8,0.02, +91.716,-11.174,6.66,-0.15, +91.195,-48.459,6.58,0.72, +91.633,-23.111,5.47,0.08, +91.523,-29.759,5.81,0.05, +93.213,65.718,5.32,1.34, +91.74,-21.813,5.78,1.64, +92.197,8.67,6.55,-0.07, +91.923,-19.166,5.31,1.68, +92.385,22.19,5.93,1.63, +91.765,-34.312,5.83,-0.13, +91.671,-42.299,6.12,0.25, +92.942,52.647,6.3,0.14, +92.433,23.113,5.75,0.21, +92.241,2.499,5.73,0.07, +92.902,48.713,6.82,null, +92.903,48.711,6.09,0.1, +91.882,-37.253,5.02,-0.11, +91.758,-45.091,6.51,1.16, +92.401,-5.711,6.17,0.34, +92.241,-22.428,5.5,-0.01, +91.97,-42.154,5.5,0, +92.335,-18.126,6.35,-0.03, +92.393,-14.584,5.56,1.16, +92.758,18.129,6.33,1.35, +92.885,24.42,5.8,1.11, +92.45,-22.774,5.71,0.44, +92.144,-44.356,6.27,-0.15, +93.439,51.173,6.04,1.06, +93.084,32.693,5.78,1.66, +92.964,21.869,6.56,2.25, +92.866,13.639,6.04,0, +92.447,-26.701,6.27,1.01, +93.005,19.791,5.75,-0.07, +91.539,-66.04,5.71,-0.03, +92.755,-6.754,6.15,0.01, +91.764,-62.155,5.05,1.25, +93.08,22.908,6.39,2.24, +93.014,16.131,4.95,-0.14, +92.985,14.209,4.48,-0.18, +92.644,-27.154,5.72,1.07, +93.919,59.999,5.35,1.34, +92.932,-4.666,6.18,-0.08, +92.543,-40.354,5.58,1.68, +92.347,-49.563,6.49,0.52, +92.966,-6.55,5.05,-0.2, +92.806,-26.482,6.09,-0.04, +93.389,18.68,6.58,-0.08, +93.303,10.628,6.45,0.67, +94.712,69.32,4.8,0.03, +93.185,-2.504,6.62,0.05, +92.666,-45.282,6.31,-0.03, +92.575,-54.969,4.81,-0.23, +93.193,-17.763,6.52,-0.17, +93.619,17.906,5.88,0.22, +94.478,61.515,4.98,1.83, +93.719,22.507,3.28,1.6, +93.913,36.149,6.92,0.45, +93.476,-3.741,5.83,0.94, +93.845,29.498,4.35,1.02, +93.712,19.156,5.2,0.44, +92.184,-68.843,5.06,-0.08, +93.785,13.851,5.91,-0.23, +93.855,16.143,5.3,-0.14, +93.653,-4.568,5.83,-0.17, +93.438,-23.862,6.39,0.72, +93.389,-29.396,6.54,-0.1, +93.714,-6.275,3.98,1.32, +94.395,46.424,6.52,0.27, +93.938,12.551,5.33,-0.02, +94.079,23.97,6.08,0.9, +93.917,6.066,6.07,-0.13, +93.946,4.284,6.64,-0.17, +93.893,-0.512,5.65,0.5, +93.874,-4.915,5.99,0.09, +94.099,17.181,6.39,1.58, +93.975,1.169,6.37,0.46, +93.858,-9.035,6.1,-0.08, +94.906,59.011,4.48,0.01, +94.57,46.361,6.38,1.11, +94.245,23.741,6.25,0.45, +94.111,12.272,5.04,0.42, +93.785,-20.272,5.91,1.32, +93.823,-18.477,5.99,1.06, +93.937,-13.718,5.01,-0.08, +92.813,-65.589,5.01,1.62, +94.088,1.08,6.63,-0.05, +94.277,9.943,5.39,0.1, +94.243,7.053,6.57,-0.12, +94.032,-16.618,5.92,-0.17, +94.389,14.058,6.59,-0.03, +94.317,5.1,5.71,0.61, +93.988,-29.788,6.67,1.55, +94.523,14.383,6.16,0.01, +94.265,-22.715,6.07,0.56, +94.397,-10.725,6.75,0.35, +94.138,-35.141,4.37,1, +95.515,59.372,5.94,null, +94.758,17.325,6.32,-0.07, +94.669,9.047,6.24,0.87, +94.424,-16.816,5.14,1.3, +92.56,-74.753,5.09,0.72, +94.148,-39.264,6,0.16, +94.255,-37.738,5.53,1.14, +95.442,53.452,5.36,0.43, +94.29,-37.253,5.87,0.14, +94.557,-19.967,5.52,-0.18, +94.711,-9.39,5.36,1.24, +94.703,-15.025,6.06,1.66, +95.017,14.651,5.69,1.61, +94.783,-8.586,6.22,-0.04, +94.746,-20.926,5.81,-0.15, +95.3,29.541,6.43,0.06, +94.928,-7.823,5.27,-0.19, +94.077,-59.214,6.43,0.59, +94.998,-2.944,4.9,1.6, +95.218,11.756,6.54,-0.1, +95.358,17.764,6.35,null, +94.465,-52.733,6.41,1.46, +94.921,-34.397,5.78,-0.08, +95.357,2.269,6.31,0.24, +94.695,-50.359,7.04,0.83, +95.078,-30.063,3.02,-0.19, +93.775,-71.703,6.64,0.56, +95.353,-11.773,5.64,-0.02, +97.061,70.536,5.97,null, +95.74,22.514,2.88,1.64, +95.652,12.57,6,null, +95.151,-34.144,5.53,-0.19, +96.225,49.288,4.91,1.97, +95.025,-48.741,6.6,0.66, +96.608,56.285,5.64,0.24, +95.827,3.764,6.4,-0.15, +96.704,58.417,5.21,1.53, +95.675,-17.956,1.98,-0.23, +95.845,-4.687,6.67,0.06, +95.528,-33.436,3.85,0.88, +96.219,29.707,6.71,-0.06, +95.942,4.593,4.44,0.18, +95.944,4.596,6.72,0.45, +96.01,8.885,6.26,-0.08, +95.9,-9.874,6.19,1.84, +96.22,16.057,6.33,1.08, +95.942,-15.072,6.24,1.53, +96.387,23.327,6.06,-0.03, +96.043,-11.53,5.22,1.24, +95.948,-19.785,6.6,-0.15, +95.81,-31.79,6.34,0.89, +96.367,14.722,6.24,2.34, +96.085,-12.962,6.12,-0.08, +96.305,7.086,5.98,1.22, +95.983,-25.578,5.63,1.56, +96.327,1.501,6.66,-0.04, +96.318,-0.946,5.87,0.56, +96.963,47.405,6.56,-0.04, +96.444,2.272,6.51,-0.03, +96.004,-36.708,5.62,1.04, +96.446,-3.889,6.35,1.02, +96.183,-28.78,6.39,0.62, +96.898,32.563,6.43,1.26, +95.733,-56.37,5.61,0.24, +96.495,-7.894,6.4,0.14, +95.907,-52.181,5.98,1.04, +96.185,-40.284,6.31,-0.05, +96.665,-1.507,5.87,0.08, +96.644,-4.597,6.15,-0.14, +95.988,-52.696,-0.72,0.15, +96.745,0.841,6.71,0.04, +96.687,-7.511,6.27,-0.04, +96.375,-35.064,6.25,1.36, +96.986,20.496,6.22,0.01, +97.697,58.163,5.88,0.94, +97.142,30.493,5.55,0.68, +96.835,2.908,5.55,1.04, +96.808,0.299,5.2,1.18, +96.815,-0.276,5.55,1.38, +95.945,-58.544,6.48,0.12, +95.755,-63.683,6.27,1.6, +97.513,46.686,5.9,1.44, +97.236,26.968,6.47,null, +97.117,16.238,6.23,0.9, +96.201,-52.806,6.51,1.7, +97.078,10.304,6.15,1.15, +97.241,20.212,4.15,-0.13, +96.99,-4.762,5.06,-0.17, +96.057,-60.281,5.8,0, +100.07,79.599,6.54,null, +97.07,1.912,6.48,-0.07, +96.432,-48.177,5.76,-0.06, +96.797,-25.857,6.07,0.53, +101.126,82.115,6.65,0.17, +97.25,11.019,6.59,null, +95.659,-69.984,5.56,1.51, +96.781,-37.896,6.48,0.39, +96.11,-63.429,6.46,0.66, +97.312,2.646,6.16,1.54, +97.204,-7.033,4.6,-0.1, +97.206,-7.034,5.4,-0.07, +97.206,-7.034,5.6,null, +97.155,-17.466,5.77,1.12, +96.232,-63.828,6.27,-0.13, +97.042,-32.58,4.48,-0.17, +97.523,9.029,6.57,0.14, +100.12,77.996,5.73,1.47, +97.163,-32.371,5.74,-0.17, +99.479,73.696,6.24,0.38, +97.792,16.939,6.2,1.16, +97.547,-10.081,5.93,1.38, +97.176,-41.074,6.32,0.4, +96.767,-58.002,5.82,1.28, +97.79,11.251,6.14,-0.08, +97.906,15.903,6.4,null, +98.113,32.455,5.87,0.14, +97.645,-13.148,6.16,-0.15, +97.913,11.792,6.65,-0.12, +97.951,11.544,5.23,0.15, +98.637,55.353,6.45,null, +96.369,-69.69,5.38,0.97, +98.097,11.674,6.03,1.07, +97.846,-12.392,5.15,1.27, +97.693,-27.769,5.93,-0.15, +97.959,-8.158,5.43,1.38, +98.08,4.856,5.84,0.99, +98.428,33.024,6.42,0.03, +97.455,-50.239,5.27,0.41, +98.226,7.333,4.5,0, +98.096,-5.869,5.6,0.25, +97.964,-23.418,4.33,-0.24, +97.804,-35.259,5.84,0.81, +97.369,-56.853,5.22,1.09, +97.749,-40.916,6.2,1.4, +98.4,14.155,5.53,1.11, +98.195,-11.166,6.24,1.11, +97.896,-36.94,6.34,1.63, +99.423,61.481,5.94,0.89, +98.408,-1.22,5.1,-0.14, +100.134,71.749,5.92,1.19, +98.163,-32.031,5.69,-0.17, +98.8,28.022,5.27,-0.03, +98.089,-37.697,5.24,1, +97.826,-51.826,5.6,0.54, +101.559,79.565,5.45,0.5, +99.41,56.858,5.85,null, +98.361,-20.924,6.4,0.83, +98.693,7.573,6.45,-0.02, +99.137,38.445,5.29,2.61, +98.823,9.988,5.88,1.51, +98.293,-38.625,6.44,1, +97.513,-65.568,6.29,0.33, +98.816,0.89,5.8,0, +97.794,-61.88,6.15,-0.15, +98.456,-36.232,5.42,1.44, +97.993,-58.754,5.7,-0.06, +99,4.498,6.55,-0.06, +98.764,-22.965,4.54,-0.05, +98.647,-32.716,5.62,-0.08, +98.359,-52.329,6.19,1.09, +99.363,24.591,6.44,0.1, +99.147,-5.211,5.52,-0.08, +99.665,39.391,5.69,1.35, +99.705,39.902,5.2,-0.07, +99.428,16.399,1.93,0, +99.35,6.135,6.06,0.05, +99.095,-18.66,5.7,0.85, +98.85,-36.78,5.59,-0.14, +99.596,28.984,5.79,0, +99.404,10.853,6.38,null, +99.833,42.489,4.79,1.23, +99.195,-13.321,5.97,1.56, +99.171,-19.256,3.95,1.06, +99.418,2.704,6.17,1.08, +98.975,-36.089,6.35,0.48, +99.47,4.957,6.15,0.14, +99.17,-22.615,6.35,-0.11, +99.992,44.014,6.41,null, +98.744,-52.976,4.39,-0.02, +99.772,22.031,6.04,1.03, +99.42,-12.985,6.12,1, +99.888,28.263,6.03,-0.08, +99.881,24.6,6.38,0.53, +99.585,-2.544,6.14,1.48, +99.706,4.701,6.57,-0.07, +99.659,1.614,6.21,0.15, +99.473,-18.237,4.43,1.15, +99.258,-38.147,6.04,1.03, +99.214,-41.557,6.34,1.15, +99.308,-36.991,5.71,-0.12, +99.448,-32.34,5.27,1.18, +99.647,-16.874,6.03,0.03, +99.948,12.983,5.97,0.06, +99.82,-14.146,4.82,1.5, +99.44,-43.196,3.17,-0.11, +100.407,35.932,6.46,0.49, +100.338,28.196,6.42,1.09, +100.133,6.372,6.51,-0.14, +99.901,-23.696,6.05,-0.03, +100.245,9.896,4.66,-0.25, +100.341,16.398,6.28,-0.01, +100.322,11.003,6.11,1.68, +100.771,44.524,5.02,1.48, +99.928,-30.47,5.71,1.14, +100.273,0.495,5.79,-0.1, +99.657,-48.22,4.93,0.87, +101.048,53.296,6.27,1.08, +100.808,37.147,6.19,1.03, +99.987,-38.159,6.58,1.18, +100.601,17.645,5.21,0.06, +100.497,6.345,6.37,-0.05, +99.503,-61.533,6.18,0.62, +100.485,-9.167,5.19,1.53, +101.559,59.442,4.87,0.08, +101.053,36.11,6.31,0.06, +100.983,25.131,2.98,1.4, +100.777,3.033,6.19,1.37, +100.309,-40.35,6.12,-0.14, +100.205,-47.675,6.65,1.58, +101.706,57.169,5.35,0.96, +100.997,13.228,4.49,1.16, +100.911,3.932,5.9,-0.02, +101.19,28.971,5.44,1.45, +100.691,-22.449,6.13,0.34, +100.568,-38.399,6.29,0.34, +101.685,43.578,5.25,0.56, +101.322,12.896,3.36,0.43, +102.054,55.704,6.33,null, +102.051,55.704,6.28,0.47, +101.915,48.789,5.22,1.12, +100.847,-39.193,6.3,0.26, +101.476,12.694,6.46,null, +102.738,67.572,5.14,-0.17, +101.287,-16.716,-1.46,0, +101.118,-31.071,5.2,-0.12, +101.216,-27.341,6.45,0.54, +101.635,8.587,5.93,-0.17, +101.347,-23.462,6.05,1.2, +101.26,-30.586,6.54,-0.11, +101.497,-14.796,5.32,0.07, +101.848,18.193,6.2,0.07, +101.345,-31.794,5.92,0.48, +101.38,-30.949,5.8,-0.19, +101.663,-10.107,5.66,-0.05, +101.833,8.037,4.77,1.4, +101.713,-14.426,5.29,-0.04, +100.241,-71.776,6.51,1.11, +101.965,2.412,4.47,1.11, +101.514,-39.54,6.62,-0.13, +101.905,-8.998,5.07,1.8, +101.756,-21.016,6.08,-0.19, +101.55,-37.776,6.21,-0.13, +103.426,68.888,5.12,-0.13, +102.422,32.607,5.71,1.29, +101.359,-52.201,6.57,1.08, +102.079,-1.319,5.75,0.28, +101.474,-52.41,5.8,1.53, +102.691,41.781,5.02,1.27, +102.265,1.002,6.15,-0.13, +101.839,-37.93,5.26,-0.08, +102.458,16.203,5.85,-0.13, +103.271,59.449,5.33,0.65, +102.318,-2.272,5.74,-0.1, +102.241,-15.145,5.39,-0.1, +101.72,-51.266,5.4,1.34, +101.673,-54.695,6.46,0.86, +102.606,13.413,5.65,1.34, +101.828,-55.54,5.61,1.52, +105.017,76.978,4.55,1.36, +102.433,-24.076,6.33,0.04, +102.887,21.761,5.27,-0.02, +102.708,-0.541,5.77,0.39, +100.903,-73.118,6.37,0.96, +103.282,44.839,6.26,0.21, +103,23.602,5.65,1.45, +102.676,-8.041,6.29,0, +102.591,-17.084,5.79,1.44, +101.234,-70.434,6.11,1.33, +102.525,-27.334,7.04,-0.18, +102.46,-32.509,3.96,-0.23, +103.256,38.869,6.12,0.37, +103.197,33.961,3.6,0.1, +103.306,38.438,6.3,0.49, +103.264,35.789,6.01,1.45, +102.914,3.042,6.38,0.04, +102.654,-25.778,6.33,-0.18, +102.597,-31.706,5.7,0.14, +102.491,-45.45,6.55,1.51, +103.487,38.505,6.48,-0.05, +102.477,-46.615,5.14,0.45, +102.718,-34.367,4.99,1.38, +102.048,-61.941,3.27,0.21, +103.206,8.38,5.77,0.26, +103.095,-5.316,6.3,0.99, +102.484,-50.615,2.93,1.2, +102.464,-53.622,4.4,0.92, +103.344,10.996,6.24,0.97, +103.813,45.826,6.34,0.94, +103.811,43.91,6.13,0.32, +102.926,-36.23,5.96,0.18, +100.011,-80.814,5.64,0.2, +104.319,58.423,4.35,0.85, +104.305,57.563,6.05,1.49, +102.505,-60.249,6.11,0.46, +102.887,-48.292,6.42,1.21, +103.661,13.178,4.65,0.3, +103.328,-19.033,5.64,0.28, +103.34,-18.933,6.14,0.15, +103.25,-26.957,6.4,1.53, +104.135,46.274,5.87,-0.06, +103.828,25.376,5.73,0.57, +103.535,-5.852,6.41,0.17, +103.387,-20.224,4.83,-0.21, +103.603,-1.127,5.45,0.18, +104.233,46.705,5.86,1.08, +103.548,-12.039,4.07,1.43, +103.165,-42.504,6.52,0.42, +103.391,-28.54,6.04,0.71, +103.675,-1.756,6.21,0.56, +103.48,-24.539,6.21,0.01, +103.196,-43.976,6.46,-0.1, +103.533,-24.184,3.87,1.73, +105.34,70.808,5.68,1.33, +103.745,-2.804,6.04,1.1, +103.554,-23.928,6.91,-0.28, +103.894,8.325,6.29,0.04, +104.405,45.094,4.9,0.03, +104.252,33.681,5.89,0.88, +103.195,-54.09,6.57,1.08, +103.761,-20.405,5.74,0.08, +104.108,9.956,5.92,-0.08, +103.906,-20.136,4.68,0.37, +103.611,-42.366,6.32,2.24, +103.189,-59.341,6.41,0.18, +104.028,-14.044,5,1.18, +103.51,-50.612,6.26,0.99, +103.945,-22.941,5.3,-0.18, +104.034,-17.054,4.37,-0.07, +104.357,11.908,6.27,0.34, +103.978,-31.79,6.36,null, +104.25,-8.179,6.34,0.64, +104.762,38.052,6,1.23, +104.698,26.081,6.1,0.46, +102.863,-70.963,5.4,-0.11, +104.312,-22.203,6.61,-0.19, +104.19,-35.342,6.29,1.29, +104.866,25.914,6.4,-0.11, +104.663,7.622,6.27,0.11, +104.391,-24.631,5.46,0.36, +104.067,-48.721,4.95,1.69, +115.127,87.02,5.07,1.63, +104.738,3.602,5.97,1.06, +104.427,-27.537,6.23,-0.14, +104.323,-35.507,6.23,0.46, +104.834,7.317,6.35,-0.11, +104.532,-27.165,6.37,-0.19, +105.066,16.079,5.68,1.66, +104.65,-25.414,5.59,-0.16, +106.466,70.732,6.5,null, +104.656,-28.972,1.5,-0.21, +104.605,-34.112,5.06,-0.16, +105.322,32.414,6.59,0.27, +104.683,-30.998,6.42,-0.14, +105.075,-5.367,6.3,0.57, +104.914,-21.603,6.26,-0.15, +105.099,-8.407,5.96,-0.08, +105.034,-20.159,6.31,-0.15, +104.674,-45.768,6.22,0, +105.164,-9.203,6.49,0.21, +105.08,-22.119,6.53,-0.17, +105.423,4.818,6.63,0.06, +105.603,24.215,5.18,0.94, +105.606,17.756,5.94,1.63, +105.572,15.336,5.74,null, +105.479,5.558,6.59,-0.02, +104.665,-55.729,6.27,1.16, +105.64,16.674,5.82,1.68, +105.47,-1.346,6.17,1.28, +105.178,-28.489,6.27,0.45, +104.651,-56.395,6.45,0.39, +105.485,-5.722,5.2,1.68, +105.275,-25.215,5.63,-0.17, +105.208,-33.465,6.4,1.05, +106.505,59.802,6.44,null, +105.877,29.337,5.93,0.6, +106.416,52.758,6.12,0.11, +106.288,47.775,6.38,-0.04, +105.43,-27.935,3.47,1.73, +105.825,9.138,5.97,0.12, +105.728,-4.239,4.99,-0.2, +105.908,10.952,5.13,1.39, +106.027,20.57,3.79,0.79, +105.965,12.594,5.98,1.58, +105.215,-51.402,5.14,1.61, +105.756,-23.833,3.02,-0.08, +106.084,1.488,6.57,0.01, +106.022,-5.324,5.62,1.29, +105.989,-10.124,6.45,-0.08, +105.94,-15.633,4.12,-0.12, +105.565,-43.404,6.43,-0.04, +106.327,22.637,6.02,-0.03, +106.548,34.474,5.55,0.91, +105.271,-58.94,6.02,0.3, +104.96,-67.916,5.17,1.4, +106.413,9.186,5.78,1.52, +106.196,-22.032,6.09,1.22, +106.843,34.009,5.91,1.51, +106.012,-42.337,5.2,0.2, +105.989,-43.608,5.54,0.64, +105.995,-43.612,6.79,0.8, +106.854,28.177,6.48,-0.09, +106.457,-10.661,6.49,-0.05, +106.839,22.704,7.68,2.21, +105.974,-49.584,4.93,0.13, +107.055,33.832,6.28,1.34, +105.815,-59.178,5.5,-0.11, +107.151,37.445,6.16,1.21, +106.777,4.91,6.11,-0.13, +106.383,-34.778,6.14,0.37, +106.67,-11.294,5.39,0.05, +106.65,-12.394,6.48,-0.1, +106.503,-30.656,6.34,-0.16, +108.492,71.817,6.35,1.12, +106.956,7.471,5.75,1.18, +106.076,-56.75,5.17,-0.04, +107.092,15.931,5.44,1.03, +106.51,-38.383,6.11,0.7, +106.718,-24.961,6.08,1.34, +106.319,-50.36,6.46,null, +106.75,-26.658,6.62,-0.17, +104.143,-79.42,5.45,0.05, +106.844,-23.84,5.71,-0.1, +106.78,-40.893,5.79,-0.17, +107.528,21.247,6.43,0.89, +107.098,-26.393,1.84,0.68, +107.335,-10.347,6.21,0.03, +107.205,-24.044,6.65,-0.19, +107.914,39.321,4.9,1.45, +107.785,30.245,4.41,1.26, +106.805,-51.968,5.96,1, +107.388,-16.235,6.03,0.06, +107.846,26.857,5.78,0.1, +107.557,-4.237,4.92,1.03, +107.213,-39.656,4.83,-0.18, +108.348,51.429,5.47,1.67, +107.429,-25.231,5.69,-0.16, +107.539,-18.685,6.23,0.4, +108.11,24.128,5.85,0.36, +107.848,-0.302,5.45,0.29, +107.581,-27.491,5.46,1, +111.341,81.258,6.31,-0.04, +107.964,5.655,6.09,-0.02, +108.204,27.225,6.43,0.49, +106.559,-68.837,6.47,1.04, +108.031,5.475,6.16,1.14, +107.966,-0.493,4.15,-0.01, +108.979,59.638,5.2,1.07, +107.923,-20.883,5.84,-0.04, +108.343,16.159,5,1.66, +108.051,-25.942,5.92,-0.17, +107.698,-48.932,5.14,1.24, +108.017,-30.822,6.1,0.27, +108.959,47.24,5.58,0.58, +108.611,24.711,6.89,-0.03, +108.28,-11.251,5.78,1.51, +108.1,-27.474,6.59,0.19, +108.675,24.885,5.82,1.56, +108.107,-36.544,5.96,-0.14, +108.066,-40.499,5.31,0.06, +108.636,12.116,5.62,1.01, +108.583,3.111,5.35,1.19, +108.35,-22.673,6.01,1.48, +108.546,-3.901,5.75,1.58, +108.565,-9.947,5.9,1.52, +108.451,-22.906,6.36,-0.21, +108.401,-27.356,6.12,-0.23, +107.176,-70.497,5.69,0.4, +107.187,-70.499,3.78,1.04, +109.39,52.131,5.92,1.26, +108.988,27.898,5.71,1.63, +108.617,-10.317,6.03,-0.18, +108.14,-46.759,4.49,0.32, +108.446,-31.084,6.6,-0.17, +112.768,82.411,4.96,1.66, +108.488,-30.34,6.33,-0.2, +108.83,-0.161,6.41,0.9, +108.563,-26.353,4.66,-0.19, +108.306,-45.183,4.89,-0.02, +108.914,7.978,5.82,1.6, +108.385,-44.64,5.1,1.56, +108.703,-26.773,3.85,-0.17, +108.713,-27.038,5.58,1.22, +109.633,49.465,5.05,0.08, +108.93,-10.584,5.95,1.18, +109.509,40.883,5.78,0.17, +108.008,-63.19,6.02,-0.02, +108.948,-23.741,6.32,null, +108.838,-30.686,5.36,-0.17, +109.517,30.956,6.24,-0.03, +109.06,-15.586,5.46,0.08, +108.738,-41.426,5.94,-0.16, +109.324,6.681,6.65,-0.11, +108.691,-46.85,5.72,-0.11, +108.659,-48.272,4.76,-0.1, +109.523,16.54,3.58,0.11, +109.153,-23.316,4.79,1.71, +109.382,-6.68,6.29,1.62, +109.146,-27.881,4.64,1.6, +108.838,-52.5,5.97,1.1, +109.238,-30.897,6.32,0.2, +109.133,-38.319,5.8,-0.13, +109.206,-36.593,5.03,-0.17, +109.065,-46.774,5.66,1.44, +110.572,59.902,6.35,null, +109.286,-37.098,2.7,1.62, +109.45,-26.798,6.46,-0.15, +110.263,42.656,6.35,1.46, +110.323,45.228,5.77,0.32, +110.031,21.982,3.53,0.34, +109.843,2.741,5.89,1.07, +109.948,7.143,5.91,0.53, +110.029,15.143,6.45,-0.02, +109.668,-24.559,4.98,-0.15, +109.677,-24.954,4.4,-0.15, +110.712,55.284,6.53,null, +110.717,55.281,5.45,null, +109.758,-19.28,6.09,0.62, +109.713,-26.586,5.28,0.96, +109.577,-36.734,4.66,-0.1, +109.867,-16.395,5.7,0.35, +109.518,-43.987,5.85,-0.12, +109.659,-36.743,5.11,-0.16, +109.64,-39.21,5.25,0.01, +110.556,38.996,6.4,1.22, +110.511,36.761,5.13,1.08, +109.807,-33.727,6.3,1.31, +110.487,20.444,5.1,1.52, +110.242,-14.36,5.45,0.98, +113.665,80.897,6.41,null, +110.32,-8.878,6.55,0.54, +110.222,-22.852,6.61,-0.15, +110.229,-26.964,6.01,-0.17, +110.515,0.177,5.99,-0.07, +110.268,-25.891,5.87,1.64, +109.208,-67.957,3.98,0.79, +111.238,51.887,5.8,1.61, +111.035,40.672,5.19,1.23, +110.508,-8.979,6.43,-0.19, +110.577,-2.979,6.23,0.68, +110.869,25.051,5.03,0.9, +111.858,66.332,6.47,-0.09, +110.868,22.945,6.02,-0.01, +110.606,-5.983,5.82,0.35, +110.556,-19.017,4.96,-0.04, +110.089,-52.312,6.05,0.42, +110.09,-52.31,6.6,0.59, +110.161,-52.086,5.39,-0.07, +111.139,27.638,5.76,0.34, +111.115,15.517,6.41,-0.18, +111.678,49.211,4.64,-0.02, +110.753,-31.924,5.43,-0.15, +111.243,11.67,5.3,0.1, +111.432,27.798,3.79,1.03, +110.871,-27.834,5.38,1.53, +110.883,-32.202,5.39,-0.18, +110.976,-30.217,6.6,-0.2, +111.167,-16.201,5.33,-0.05, +111.072,-22.913,6.19,-0.09, +111.024,-29.303,2.45,-0.08, +111.412,9.276,4.99,1.01, +110.993,-35.838,6.31,-0.15, +112.72,68.466,5.64,1.11, +111.211,-19.012,6.24,0.29, +111.285,-13.752,5.78,0.42, +111.463,-5.775,5.97,0.92, +111.183,-31.809,5.35,1.07, +111.709,21.536,6.54,0.46, +111.616,10.608,6.37,0.09, +111.735,20.257,5.93,0.3, +111.515,-4.537,6.76,-0.01, +111.333,-21.983,6.05,0.23, +111.672,11.009,6.41,-0.13, +111.355,-25.218,5.78,-0.1, +111.197,-37.29,6.97,0.22, +111.197,-37.291,6.84,0.27, +112.215,48.184,5.72,-0.1, +111.788,8.289,2.9,-0.09, +111.935,21.445,5.22,0.39, +111.429,-31.739,6.31,-0.17, +101.745,-87.025,6.47,0.42, +112.483,49.673,5.36,0.45, +111.67,-23.712,6.56,0.01, +112.009,6.942,5.25,0.22, +112.278,31.784,4.18,0.32, +111.783,-17.864,5.63,0.32, +112.041,8.926,4.32,1.43, +111.748,-23.086,5.61,-0.13, +111.676,-34.141,5.9,-0.17, +112.335,28.118,5.05,0.11, +112.197,15.109,6.22,-0.05, +111.965,-11.557,5.79,0.58, +111.929,-22.86,5.95,-0.09, +112.453,27.916,5.01,1.11, +111.591,-51.018,5.1,1.06, +111.997,-29.156,5.54,-0.08, +112.449,12.007,4.54,1.28, +112.328,-1.905,5.59,1.5, +112.357,-7.551,5.86,0.48, +112.342,-10.327,5.75,1.62, +112.341,-14.999,6.05,0.47, +112.095,-37.81,6.58,0.06, +112.214,-31.848,6.38,-0.17, +112.215,-31.847,7.13,-0.15, +112.982,38.896,6.54,0.07, +112.27,-31.456,5.77,-0.19, +112.464,-23.024,4.85,0.23, +112.274,-38.812,5.43,-0.16, +112.713,-5.226,6.24,1.18, +112.952,17.086,5.42,1.13, +112.308,-43.301,3.25,1.51, +113.211,22.888,6.54,1.01, +113.025,1.914,5.25,0.22, +112.677,-30.962,4.65,0.93, +112.677,-37.34,6.65,0.63, +113.024,-8.881,5.9,0.54, +112.498,-52.651,5.87,1.01, +112.858,-36.153,6.68,-0.12, +113.402,15.827,5.25,0.05, +113.298,3.29,5.59,0.31, +112.214,-64.51,6.39,1.56, +112.928,-35.888,6.61,-0.08, +113.65,31.889,2.88,0.04, +113.65,31.888,1.98,0.03, +112.629,-54.399,5.96,1.56, +113.521,10.568,6.28,-0.01, +114.196,55.755,5.92,1.12, +113.093,-35.961,6.3,-0.1, +113.786,30.961,5.33,1.01, +113.342,-14.338,6.21,-0.04, +113.983,43.031,6.3,null, +113.331,-19.412,5.66,1.12, +113.29,-24.711,5.85,0.17, +113.566,3.371,5.81,-0.02, +113.45,-14.524,4.97,1.41, +114.132,46.18,5.65,1.56, +113.692,2.725,6.55,0.22, +113.98,26.896,4.06,1.54, +113.513,-22.296,4.45,0.51, +113.306,-40.059,6.26,-0.12, +113.305,-43.086,6.52,0.92, +113.578,-23.474,5.83,0.44, +113.58,-23.475,5.87,null, +113.463,-36.338,5.54,-0.06, +113.62,-26.117,6.65,-0.01, +113.553,-33.463,6.11,0.29, +114.475,48.774,5.92,0.22, +114.324,40.025,6.38,null, +113.645,-27.012,5.77,1.06, +113.494,-39.906,6.76,1.13, +114.145,5.862,5.91,0.6, +111.408,-79.094,5.53,1.28, +114.069,-8.311,6.27,1.54, +114.016,-14.493,5.7,-0.12, +113.845,-28.369,4.64,-0.11, +114.033,-22.161,6.34,0.99, +114.637,35.049,5.56,0.93, +113.665,-51.475,6.28,0.08, +114.56,24.36,6.27,null, +114.32,-4.111,5.13,0.44, +114.171,-19.702,5.74,-0.19, +115.206,57.083,6.06,1.46, +114.791,34.584,4.9,0.4, +114.8,24.222,6.17,0.01, +114.412,-14.441,6.53,-0.01, +114.32,-23.775,6.37,0.54, +113.915,-52.534,4.94,1.4, +115.061,38.344,5.73,1.63, +114.975,32.01,6.17,0.35, +114.342,-34.969,4.53,-0.09, +114.869,17.675,5.05,1.56, +115.302,48.132,5.56,1.01, +114.183,-48.83,5.72,-0.06, +114.007,-55.887,6.39,1.18, +114.437,-35.277,6.6,1.14, +114.825,5.225,0.38,0.42, +114.575,-25.365,4.7,-0.11, +114.438,-38.011,6.38,1.48, +115.752,58.71,4.99,0.08, +114.78,-18.679,6.72,-0.1, +114.705,-26.802,4.5,-0.17, +114.708,-26.804,4.62,null, +115.029,5.231,6.02,-0.04, +115.244,23.019,5.89,1.58, +114.601,-39.991,6.59,-0.05, +115.197,13.771,6.24,null, +114.683,-36.497,5.8,-0.16, +114.636,-38.781,6.19,1.02, +114.862,-26.863,6.5,-0.1, +114.576,-48.601,5.68,0.65, +115.148,-8.186,6.01,0.15, +115.097,-15.264,4.94,1.56, +115.057,-19.661,5.93,1.16, +114.864,-38.308,4.84,-0.19, +115.681,34,6.02,null, +114.933,-38.139,5.73,-0.12, +114.949,-38.261,5.76,-0.07, +115.466,13.481,5.77,1.67, +115.397,3.625,5.94,-0.04, +115.513,14.208,5.56,1.64, +114.992,-37.579,6,-0.04, +116.018,50.434,5.27,0, +115.312,-9.551,3.93,1.02, +114.752,-53.273,6.06,-0.11, +115.181,-27.946,6.76,-0.16, +115.828,28.884,4.28,1.12, +115.22,-31.661,6.56,1.18, +116.667,65.456,5.92,1.18, +115.348,-22.337,6.18,1.62, +116.614,62.831,6.49,0.26, +115.843,22.399,6.21,0.93, +113.84,-74.276,7.16,-0.02, +113.841,-74.276,7.26,null, +115.316,-38.534,5.42,-0.15, +115.773,0.189,6.19,1.02, +116.029,25.784,5.31,1.54, +115.341,-44.632,6.41,0, +116.112,24.398,3.57,0.93, +115.492,-38.529,6.54,-0.09, +116.058,12.859,6.43,null, +115.7,-26.351,5.64,0.99, +116.031,2.405,6.47,0.2, +116.329,28.026,1.14,1, +116.289,20.316,6.33,0, +115.913,-25.504,6.55,0.06, +115.885,-28.411,4.59,1.63, +115.8,-36.05,5.6,-0.13, +115.779,-38.864,6.89,1.02, +115.952,-28.955,3.96,0.18, +119.072,80.266,6.56,0.73, +115.738,-45.173,5.06,0.78, +116.664,37.518,5.18,1.58, +114.017,-77.634,6.18,1.73, +115.929,-38.202,6.4,-0.16, +115.925,-40.934,5.17,1.1, +116.531,18.51,4.88,1.45, +116.142,-24.674,5.62,-0.19, +115.779,-49.993,6.57,0.07, +115.543,-58.631,6.43,-0.1, +116.04,-36.063,5.8,0.31, +116.568,10.768,5.3,0.01, +116.37,-14.686,6.89,null, +116.371,-14.691,6.07,0.11, +116.143,-37.943,5.88,-0.11, +115.722,-58.23,6.21,1.05, +116.876,33.416,5.14,1.6, +116.509,-6.772,5.49,1.38, +116.487,-14.564,5.04,0.33, +116.269,-37.888,6.54,-0.1, +116.314,-37.969,3.61,1.73, +116.396,-34.173,5.37,0.6, +116.687,-12.675,6.39,-0.02, +116.325,-43.752,6.03,-0.07, +117.14,23.141,6.18,null, +116.543,-37.934,5.88,-0.11, +116.802,-22.52,5.9,-0.19, +115.455,-72.606,3.95,1.04, +116.639,-40.06,6.57,-0.13, +116.91,-15.991,6.34,1.78, +116.938,-16.014,6.43,1.7, +117.774,54.129,6.02,0.46, +116.986,-12.193,5.48,0.48, +117.258,13.371,6.04,1.38, +116.398,-56.723,6.12,0.39, +116.774,-39.331,6.31,-0.17, +117.245,4.333,6.53,0.78, +117.022,-25.937,4.5,-0.05, +116.854,-38.511,5.08,-0.1, +116.183,-66.072,6.38,0.95, +116.881,-46.609,5.23,-0.14, +116.054,-69.821,6.18,-0.06, +118.153,55.209,6.38,null, +117.76,33.234,6.03,0.15, +117.035,-40.652,6.14,1.58, +117.369,-13.353,6.23,-0.09, +117.257,-24.912,5.33,0.76, +117.422,-17.228,5.18,1.28, +117.324,-24.86,3.34,1.24, +117.085,-47.078,4.71,1.06, +117.544,-9.183,5.61,1.44, +117.438,-20.207,6.56,0.58, +117.311,-35.243,5.93,-0.05, +117.697,3.277,6.18,1.12, +117.524,-19.524,6.12,1.26, +117.398,-33.289,5.6,1.61, +117.986,19.325,5.99,1.13, +117.73,-11.129,6.16,1.13, +117.31,-46.373,4.11,-0.18, +117.08,-56.471,6.33,1.01, +117.367,-44.752,6.32,0.96, +117.304,-46.858,5.84,-0.14, +117.925,1.767,5.14,-0.12, +117.75,-24.528,6.45,-0.01, +118.03,3.277,6.31,1.59, +117.278,-56.411,5.59,1.13, +117.92,-12.819,6.36,0.39, +117.943,-13.898,5.17,0.6, +118.622,47.386,6.25,1.15, +118.678,47.565,5.45,1.46, +118.374,26.766,4.97,0.09, +117.929,-21.174,5.63,0.96, +117.677,-44.58,6.45,0.9, +117.304,-60.284,5.78,0.42, +117.6,-50.51,5.91,1.09, +118.2,-5.428,5.76,0.41, +118.079,-14.846,5.69,0.37, +117.835,-43.096,6.32,-0.17, +120.049,73.918,5.41,1.42, +117.478,-60.051,6.72,1.24, +119.112,56.504,6.72,null, +117.918,-42.888,6.04,-0.18, +118.065,-34.705,5.01,0.44, +118.054,-40.576,3.73,1.04, +117.421,-66.196,5.79,-0.04, +121.196,79.48,5.42,-0.06, +118.92,35.413,6.23,0.28, +118.161,-38.863,4.49,-0.19, +118.265,-36.364,5.43,1.16, +118.916,19.884,5.35,-0.04, +118.881,8.863,5.86,0.35, +118.124,-54.367,5.7,-0.15, +118.265,-49.613,4.63,-0.23, +118.326,-48.103,4.24,-0.14, +118.546,-35.877,5.49,-0.19, +118.666,-34.847,6.15,1.53, +119.1,4.486,6.17,0.98, +119.569,43.978,6.34,1.06, +119.248,15.79,5.78,1.28, +118.807,-30.917,6.44,null, +119.316,8.641,6.05,1, +119.318,1.127,6.35,0.5, +119.095,-30.285,6.33,1.66, +118.752,-52.583,6.38,-0.01, +118.944,-43.845,6.02,-0.11, +119.215,-22.88,4.2,0.72, +119.524,7.214,6.41,-0.04, +119.631,16.519,5.99,1.47, +118.722,-57.303,5.63,1.3, +120.336,59.048,5.77,0.39, +119.101,-40.736,6.78,-0.18, +124.224,84.058,6.49,0.03, +120.427,60.324,6.01,0.14, +119.586,2.225,5.29,0.92, +119.241,-42.406,6.09,1.36, +120.628,63.09,6.4,0.59, +119.417,-30.335,4.79,0.15, +119.241,-43.5,5.35,-0.18, +119.896,13.242,6.02,1.32, +119.327,-44.11,5.09,-0.17, +119.195,-52.982,3.47,-0.18, +119.333,-47.89,6.22,-0.1, +120.649,57.274,6.49,0.62, +119.078,-60.526,5.74,1.55, +119.466,-45.578,5.17,1.27, +119.934,-3.68,4.93,1.21, +119.774,-23.311,5.11,1.12, +120.233,25.393,5.83,1.02, +120.2,19.816,6.25,1.11, +119.211,-59.126,6.25,2.08, +120.253,23.583,6.34,null, +120.197,17.309,5.55,1.32, +119.56,-49.245,4.41,-0.17, +120.48,35.413,6.34,1.56, +119.967,-18.399,4.61,0.08, +120.433,25.09,6.31,0.01, +119.589,-51.449,6.44,0.25, +120.376,16.455,5.99,-0.02, +120.184,-2.882,6.51,-0.07, +120.308,4.88,5.65,0, +119.758,-45.216,5.99,-0.14, +119.445,-60.303,5.6,0.57, +119.302,-63.297,6.14,-0.1, +119.868,-39.297,5.24,0.39, +120.305,-1.392,4.68,1.49, +119.801,-49.977,6.32,null, +119.806,-49.974,6.34,null, +120.461,8.914,6.22,0.57, +120.566,2.334,4.39,1.25, +120.082,-45.457,6.61,1.27, +119.71,-60.824,5.81,-0.09, +120.062,-48.981,6.02,0.04, +120.88,27.794,4.94,1.12, +120.608,-6.337,6.33,0.62, +120.12,-48.871,6.12,-0.11, +119.918,-60.207,6.33,-0.06, +119.907,-60.587,5.17,1.74, +120.406,-37.284,5.95,0.14, +120.526,-37.051,6.34,1.62, +120.208,-54.151,5.87,-0.14, +120.345,-54.515,6.1,-0.04, +121.188,18.842,6.15,-0.05, +120.083,-63.567,4.82,-0.17, +120.767,-32.464,5.82,1.22, +120.381,-55.455,6.28,-0.15, +120.687,-41.31,5.52,-0.15, +121.269,13.118,5.12,0.01, +121.404,27.53,6.21,0.01, +120.896,-40.003,2.25,-0.26, +120.873,-42.949,6.29,1.01, +121.791,43.26,6.26,-0.02, +121.173,-19.728,6.13,-0.16, +121.577,22.636,5.99,1.66, +121.068,-32.675,5.31,1.91, +119.817,-73.245,6.34,0.14, +121.457,-0.574,6.41,1.05, +122.114,51.507,4.84,0.05, +121.615,-9.245,6.23,-0.07, +122.516,58.248,5.93,1.39, +121.941,21.582,5.3,0.63, +121.437,-33.569,6.14,1.11, +121.177,-50.591,5.95,1.21, +121.335,-46.979,6.19,-0.15, +121.267,-53.108,5.53,1.34, +122.346,42.431,6.27,1.27, +123.203,68.474,5.32,1.04, +121.825,-20.555,5.38,0.1, +122.177,13.641,6.27,0.43, +121.886,-24.304,2.81,0.43, +121.179,-62.836,6.3,-0.1, +121.668,-45.266,5.05,1.5, +122.148,-2.984,4.34,0.97, +122.237,-11.34,6.32,0.01, +122.181,-20.363,6.36,0.16, +122.613,25.507,5.73,0.81, +122.257,-19.245,4.4,-0.15, +122.84,38.731,6.58,0.59, +122.369,-16.249,5.68,-0.17, +122.157,-37.681,6.37,-0.04, +122.278,-30.322,6.65,1.4, +126.137,82.431,6.32,0.01, +122.745,14.629,6.23,0.02, +122.293,-35.455,6.2,0.89, +123.459,56.452,5.85,1.01, +122.819,9.821,6.07,-0.1, +122.666,-13.799,5.54,0.49, +122.29,-48.684,5.7,-0.12, +122.4,-44.123,5.21,-0.19, +122.449,-42.641,6.26,-0.04, +122.372,-47.346,4.27,-0.23, +122.383,-47.337,1.78,-0.22, +123.053,17.648,5.63,0.54, +123.053,17.648,6.02,0.54, +123.055,17.648,6.2,0.6, +122.818,-12.927,4.72,0.95, +122.888,-7.772,5.36,0.89, +122.43,-47.937,5.23,-0.21, +123.092,14.004,6.54,null, +123.287,29.657,5.64,-0.07, +124.884,75.757,5.54,0.9, +122.102,-63.801,6.28,-0.06, +122.39,-56.086,5.66,0.21, +122.757,-37.292,6.44,-0.01, +122.253,-61.302,4.76,0.43, +123.96,60.381,6.45,0.2, +123.249,16.514,6.01,0.89, +121.983,-68.617,4.35,-0.11, +123.424,23.138,6.56,0.11, +122.84,-39.619,4.45,1.62, +122.858,-42.987,4.75,0.18, +122.796,-48.462,5.82,-0.15, +123.546,17.676,6.47,0.3, +123.333,-15.788,4.99,1.07, +123.192,-29.911,6.52,0.06, +123.587,13.048,6.38,null, +123,-46.644,5.76,0.59, +123.215,-37.924,6.43,0.1, +123.129,-46.264,6.03,-0.11, +124.46,59.571,5.64,0.16, +125.168,72.407,5.98,1.54, +123.373,-35.9,4.78,-0.11, +123.421,-33.569,6.37,1.14, +123.546,-32.141,6.06,-0.16, +123.493,-36.323,5.08,-0.19, +123.495,-36.341,6.11,-0.18, +123.555,-35.491,5.78,1.02, +123.512,-40.348,4.44,1.17, +123.401,-46.992,5.13,-0.14, +124.822,62.507,5.71,0.89, +124.566,54.144,6.27,1.54, +123.392,-50.196,5.51,1.61, +124.141,11.726,7.13,1.56, +124.129,9.186,3.52,1.48, +123.6,-45.834,5.83,-0.2, +123.969,-30.926,6.21,0.78, +124.382,8.866,6.29,0.98, +123.995,-35.903,6.16,1.55, +125.109,57.743,5.89,0.39, +124.226,-21.32,6.6,0.02, +123.847,-50.449,6.44,1.49, +124.346,-16.285,6.16,0.01, +125.121,53.574,6.49,0.28, +124.6,-12.632,5.98,0.76, +123.816,-62.916,5.16,0.09, +124.493,-30.003,6.45,1.04, +125.016,27.218,5.14,0.47, +125.684,60.631,6.41,0.97, +125.088,20.748,5.83,1.13, +124.813,-10.166,6.32,0.33, +124.573,-35.452,5.58,1.24, +124.553,-37.374,6.7,0.23, +125.134,24.022,5.98,-0.03, +124.958,3.948,6.05,0.97, +124.639,-36.659,4.45,0.22, +125.055,-0.909,6.18,0.6, +125.071,-5.329,6.13,1.33, +124.872,-34.59,6.43,-0.08, +124.482,-59.167,6.42,0.39, +125.709,43.188,4.25,1.55, +125.114,-22.925,6.13,1.04, +125.952,53.22,5.51,0.11, +125.334,-1.602,6.5,0.02, +125.338,-20.079,5.58,0.77, +124.579,-65.613,5.07,1.15, +125.478,-17.586,5.75,1.05, +125.346,-33.054,4.83,1.45, +125.337,-36.484,5.2,-0.19, +125.841,18.332,5.95,0.17, +125.626,-6.179,6.15,0.22, +125.351,-39.621,6.16,0.17, +126.178,42.005,6.02,1.59, +125.725,-7.543,5.96,1.67, +125.695,-13.055,6.11,1, +125.98,10.632,6.08,1.49, +125.708,-26.348,5.9,0.37, +126.27,35.011,6.06,1.27, +125.3,-57.973,5.97,-0.09, +125.632,-48.49,4.82,-0.15, +126.152,-4.717,6.01,0.46, +125.822,-38.286,6.32,1.63, +126.146,-3.751,5.61,0.46, +125.282,-64.106,6.12,0.93, +126.458,17.046,6.14,0.41, +125.73,-52.124,5.85,0.01, +124.954,-71.515,5.37,-0.06, +125.003,-71.505,5.65,-0.1, +127.442,67.298,5.88,0.97, +126.615,27.894,5.57,1.4, +126.398,2.102,5.73,1.53, +126.478,7.564,5.13,0.94, +125.628,-59.51,1.86,1.28, +126.23,-23.154,5.68,0.06, +126.903,45.653,6.32,0.62, +126.695,26.934,6.32,0.18, +126.696,26.935,6.3,0.18, +126.666,24.534,7.02,0.32, +126.667,24.535,7.81,0.52, +126.415,-3.906,3.9,-0.02, +126.265,-24.046,5.28,1.48, +126.33,-21.046,6.01,0.4, +126.414,-17.439,6.44,null, +124.632,-76.92,4.07,0.39, +126.683,12.654,5.5,1.6, +126.482,-14.93,5.98,0.17, +126.613,-3.988,5.59,0.22, +126.238,-42.769,5.98,-0.17, +127.566,60.718,3.36,0.84, +126.675,-12.534,5.54,1.19, +126.822,-6.41,6.59,0.51, +126.466,-42.153,5.47,-0.15, +126.573,-39.059,6.53,-0.09, +126.576,-39.06,7.25,0.08, +127.153,24.145,6.1,0.24, +126.379,-51.728,5.17,-0.16, +126.712,-29.215,6.73,-0.05, +128.223,69.32,6.31,1.35, +127.155,14.211,5.95,0.19, +125.518,-73.4,5.29,0.01, +126.889,-20.844,6.56,0.04, +126.818,-31.673,6.33,0.9, +127.122,-2.517,6.39,0.33, +127.082,-8.816,6.43,1.2, +126.973,-26.132,6.62,0.11, +125.16,-77.484,4.35,1.16, +126.605,-52.807,6.05,0.06, +127.212,-9.748,6,0.42, +126.997,-35.114,5.75,-0.15, +127.15,-23.072,6.51,0.05, +127.222,-20.95,6.67,-0.06, +126.465,-64.601,5.97,0.96, +126.434,-66.137,3.77,1.13, +127.833,37.266,6.18,-0.03, +126.864,-55.012,6.53,-0.02, +126.902,-53.089,5.09,0.25, +128.14,53.115,6.24,1.01, +129.203,74.724,6.31,null, +127.365,-27.332,6.7,-0.13, +128.651,65.145,5.47,0.18, +127.877,24.081,5.75,0.28, +127.282,-44.161,5.79,-0.16, +127.899,18.094,5.35,1.56, +127.27,-47.929,5.33,-0.14, +127.365,-44.725,4.99,-0.16, +128.229,38.016,5.9,1.11, +127.978,9.814,6.83,-0.07, +127.619,-32.159,5.65,1.49, +127.44,-46.332,5.99,-0.15, +127.623,-36.721,6.69,1.95, +128.341,36.436,6.24,0.36, +128.177,20.441,5.33,1.25, +127.879,-19.577,5.42,-0.06, +127.401,-55.191,6.36,0.8, +128.25,24.085,6.36,1.02, +126.82,-70.093,5.53,-0.03, +127.663,-44.737,6.3,-0.02, +128.166,10.066,6.46,-0.02, +127.853,-39.064,6.31,-0.15, +128.139,-15.029,6.38,0.27, +127.795,-47.867,6.39,-0.15, +128.438,13.257,6.28,1.17, +128.683,36.419,5.78,0.04, +128.431,4.757,5.87,1.07, +129.928,73.63,6.15,1.02, +128.555,8.452,6.03,0.33, +128.27,-24.606,6.19,0.27, +127.873,-54.394,6.34,1.31, +128.507,-2.152,5.81,0, +128.215,-31.501,6.38,0.79, +128.244,-34.634,6.36,0.95, +128.02,-53.212,5.69,0.58, +128.831,19.59,6.58,0.68, +128.333,-38.371,6.49,-0.18, +128.41,-38.849,5.96,-0.14, +128.377,-46.971,6.24,1.56, +129.799,65.021,5.64,0.62, +128.854,2.744,6.33,1.02, +126.083,-80.914,5.69,1.02, +129.032,15.314,6.32,null, +128.963,6.62,5.99,0.52, +128.964,6.623,7.25,0.71, +128.632,-32.599,6.43,0.75, +128.868,-7.982,5.72,-0.03, +128.622,-37.611,6.3,1.56, +129.593,53.401,5.66,0.96, +129.793,59.939,6.48,null, +128.87,-26.844,5.96,0.37, +130.053,64.328,4.6,1.17, +128.803,-39.97,6.47,0.58, +129.75,52.925,6.42,null, +129.274,9.656,5.88,0.09, +128.682,-49.944,5.01,1.33, +129.823,52.712,5.91,1.17, +129.579,32.802,5.94,1.12, +129.414,5.704,4.16,0, +129.363,-4.934,6.19,1.05, +129.522,9.575,6.53,-0.02, +128.967,-50.97,5.8,-0.13, +128.832,-58.009,4.86,1, +128.814,-58.225,5.26,-0.14, +129.585,-6.663,6.51,0.44, +128.176,-73.357,6.12,0.95, +129.689,3.341,4.44,1.21, +129.374,-33.746,6.48,0.33, +129.468,-26.255,5.27,-0.04, +129.333,-40.147,6.55,0.6, +130.255,45.834,5.37,0.99, +130.076,31.942,6.1,null, +129.852,8.017,6.45,1.08, +129.668,-19.737,6.33,1.59, +129.411,-42.989,4.14,0.11, +130.027,20.008,6.39,0.98, +130.092,19.67,6.44,1.02, +130.112,19.545,6.3,0.17, +129.783,-22.662,5.05,0.73, +130.006,-12.475,4.98,1.42, +129.328,-62.854,5.47,1.02, +129.927,-29.561,4.89,0.9, +129.842,-36.607,6.13,0.42, +129.687,-53.091,6.47,-0.1, +130.751,46.901,6.22,0.96, +130.257,-9.052,6.63,-0.02, +130.026,-35.308,3.97,0.94, +130.08,-40.264,5.2,-0.01, +129.849,-53.44,5.48,-0.16, +130.43,-15.943,4.88,1.06, +129.99,-53.055,5.19,-0.14, +129.805,-60.317,6.36,0, +130.147,-45.191,5.71,1.65, +130.157,-46.649,3.84,0.71, +130.541,-11.966,6.45,0.16, +130.073,-52.922,3.62,-0.18, +130.072,-53.015,5.61,-0.14, +130.821,21.469,4.66,0.02, +130.801,12.681,5.64,0.39, +131.042,36.918,6.33,null, +130.305,-47.317,4.77,0.12, +130.272,-48.922,5.9,-0.21, +130.806,3.399,4.3,-0.2, +130.182,-57.545,6.34,0.2, +130.487,-45.411,5.23,0.21, +130.154,-59.761,4.33,-0.11, +130.999,4.335,6.37,-0.06, +130.918,-7.234,4.62,0.84, +129.772,-70.387,5.2,0.01, +131.171,18.154,3.94,1.08, +130.567,-48.099,5.51,-0.18, +130.737,-35.943,6.42,0.02, +131.339,30.698,6.13,0.94, +131.187,10.082,5.66,-0.11, +130.579,-53.1,5.52,-0.15, +130.606,-53.114,4.86,-0.17, +130.898,-33.186,3.68,-0.18, +131.255,5.681,6.13,0.2, +132.206,66.708,6.2,-0.11, +130.587,-55.774,6.29,1.18, +131.337,-2.601,6.41,0.52, +131.23,-21.168,6.11,0.22, +131.667,28.765,6.57,0.04, +131.674,28.76,4.02,1.01, +130.918,-49.823,5.16,-0.2, +131.1,-42.649,4.07,0.87, +131.51,-2.049,5.7,1.1, +131.216,-37.147,5.76,-0.15, +131.529,-11.006,6.25,1.61, +131.733,12.11,5.87,0.11, +131.694,6.419,3.38,0.68, +131.455,-25.387,6.1,0.08, +131.594,-13.548,4.32,0.9, +131.176,-54.708,1.96,0.04, +131.813,-1.897,5.29,0.04, +131.507,-46.042,3.91,0, +131.599,-41.126,6.21,-0.05, +131.272,-58.725,6.21,-0.09, +131.705,-34.623,6.37,-0.13, +130.976,-68.212,6.32,1.5, +132.108,5.838,4.36,-0.04, +132.02,-6.559,6.09,1.28, +131.628,-45.913,5.46,0.27, +131.125,-65.826,6.05,0.2, +131.829,-46.156,5.75,0.56, +131.919,-41.737,6.36,0.58, +131.677,-56.77,4.49,-0.17, +132.634,33.285,6.25,0.49, +132.34,-3.443,5.31,-0.09, +132.037,-42.464,6.43,-0.2, +130.331,-78.963,5.47,-0.1, +132.001,-52.851,6.3,-0.1, +132.688,18.832,6.16,-0.01, +133.344,61.962,5.73,0.28, +133.275,59.056,6.25,null, +132.437,-21.049,6.47,0.23, +132.987,43.727,5.15,0.98, +133.048,45.313,5.99,1.26, +132.756,15.351,6.38,0.64, +133.042,42.003,5.99,1.25, +132.465,-32.781,5.21,0.87, +132.509,-29.463,5.87,0.95, +132.413,-40.321,5.48,0.06, +132.59,-28.618,6.17,-0.08, +132.468,-39.142,6.39,0.23, +132.633,-27.71,4.01,1.27, +133.144,32.474,5.66,0.22, +132.449,-45.308,4.93,0.05, +133.119,28.259,6.23,1.62, +133.149,28.331,5.95,0.87, +132.894,-7.177,5.54,0.15, +130.802,-79.07,6.05,0.23, +132.588,-42.09,6,-0.1, +133.101,5.34,6.33,0.12, +132.64,-46.529,5.1,-0.21, +133.482,35.538,6.14,0.04, +133.128,-13.234,6.13,1.14, +132.866,-42.504,6.55,0.04, +134.156,64.604,5.58,0.86, +133.561,30.579,5.39,1.05, +133.109,-32.509,6.5,1.46, +133.161,-36.546,6.42,0.56, +133.2,-38.724,5.82,1.5, +132.903,-57.634,5.59,-0.11, +132.645,-66.793,5.35,0.42, +133.575,-5.434,6,0.67, +133.161,-48.359,5.91,-0.15, +133.915,27.928,5.22,1, +133.845,17.231,6.64,3.36, +133.17,-52.129,6.39,0, +131.48,-79.504,5.79,1.6, +132.46,-72.551,6.11,0.2, +134.208,45.632,5.74,1.09, +134.127,40.202,5.89,0.35, +133.848,5.946,3.11,1, +133.461,-40.447,6.47,0.96, +133.266,-56.649,6.03,-0.02, +133.982,11.626,5.41,1.46, +133.461,-47.521,5.33,0.26, +133.873,-7.97,6.91,null, +133.873,-7.971,6.67,0.22, +133.802,-18.241,5.75,1.32, +134.236,32.91,5.45,0.12, +133.881,-27.682,4.89,0.11, +134.154,4.237,6.14,1, +134.284,17.144,6.17,1, +133.983,-23.818,6.39,0.16, +133.453,-60.354,5.78,-0.08, +134.312,15.323,5.2,0.15, +133.83,-45.042,6.26,-0.16, +134.495,30.234,6.29,0.43, +134.142,-16.709,5.96,1.54, +134.397,15.581,5.67,0.2, +134.615,35.802,6.51,-0.01, +134.425,9.388,6.19,0.98, +133.725,-58.24,6.38,-0.11, +134.802,48.042,3.14,0.19, +133.8,-54.966,5.71,0.48, +133.762,-60.645,3.84,-0.1, +134.622,11.858,4.25,0.14, +134.534,1.542,6.59,0.06, +134.081,-52.724,4.69,-0.12, +134.886,32.419,5.2,0.93, +135.636,67.63,4.76,1.53, +134.795,18.135,6.38,1.55, +134.683,-16.133,5.86,0.53, +135.16,41.783,3.97,0.44, +135.128,37.604,6.44,null, +138.838,84.181,6.33,0.3, +134.243,-59.229,4.92,-0.19, +134.483,-48.573,5.87,1.07, +134.916,-19.208,6.18,0.46, +134.815,-28.806,6.25,1, +135.419,39.713,6.36,0.3, +135.35,32.252,5.82,0, +134.718,-47.235,5.18,0.25, +135.454,27.903,6.07,null, +135.381,5.641,6.07,1.11, +135.023,-41.254,4.45,0.65, +136.002,54.284,5.75,0.02, +135.093,-43.173,6.07,-0.16, +135.906,47.157,3.6,0, +135.685,24.453,5.45,-0.04, +135.492,-0.483,5.67,1.15, +135.298,-26.664,6.2,1.13, +134.85,-59.084,5.16,0.42, +135.687,7.298,5.85,1.11, +135.337,-41.864,5.55,-0.14, +136.041,27.898,6.38,0, +135.527,-39.402,6.27,1, +136.35,48.53,5.95,0.45, +135.19,-60.964,5.79,1.21, +135.436,-52.188,5.23,-0.12, +136.23,32.377,6.46,0.24, +135.787,-25.504,6.74,-0.03, +136.68,59.344,6.45,0.04, +137.098,66.873,5.14,1.51, +135.285,-68.684,5.88,1.63, +135.772,-53.55,6.4,-0.09, +136.633,38.452,4.56,1.04, +136.493,5.092,4.97,1.22, +136.039,-47.098,3.75,1.2, +135.612,-66.396,4,0.14, +137.597,67.135,4.8,0.49, +136.862,22.981,6.4,null, +136.75,1.463,6.17,1.65, +137.218,51.605,4.48,0.27, +137.017,32.541,6.5,0.36, +137,29.654,5.43,0.89, +136.2,-57.852,6.44,0.25, +136.937,10.668,5.24,-0.11, +137.73,63.514,4.67,0.35, +137.213,33.882,5.93,0.6, +137.197,26.629,5.98,0.66, +137.34,22.046,5.14,0.97, +137.012,-25.858,4.58,1.59, +136.642,-55.803,6.11,-0.15, +137.176,-8.589,5.6,-0.06, +136.811,-51.212,6.73,1.62, +136.532,-64.5,6.37,1.35, +138.513,71.656,6.55,0.96, +136.999,-43.432,2.21,1.66, +137.443,11.564,6.48,0.34, +137.298,-12.358,5.77,0.94, +137.181,-26.768,6.15,0.17, +137.268,-18.329,5.73,0, +137.661,30.963,5.95,1.67, +137.587,21.996,6.01,0.9, +137.398,-8.788,5.46,1.01, +136.41,-70.539,4.71,-0.15, +136.287,-72.603,4.48,0.61, +137.485,-30.365,5.59,0.19, +138.969,72.946,5.96,0.18, +137.596,-23.177,6.53,0, +137.438,-49.425,6.48,0.17, +138.586,61.423,5.13,0.58, +137.982,5.468,6.35,0.32, +138.073,14.996,6.51,0.73, +138.054,3.867,6.14,-0.01, +138.451,43.218,5.32,-0.14, +137.995,-19.748,5.73,0.98, +137.768,-44.868,5,0.23, +138.108,-7.11,6.11,0.22, +137.921,-39.259,6,-0.11, +138.405,21.283,6.48,0.02, +137.888,-46.584,5.79,-0.21, +137.742,-58.967,3.44,-0.19, +138.958,56.741,5.27,1.56, +138.128,-43.614,5.57,-0.11, +139.047,54.022,4.83,0.19, +137.819,-62.317,3.97,-0.18, +138.81,34.634,5.97,0.86, +138.591,2.314,3.88,-0.06, +139.983,74.016,6.5,null, +138.358,-38.616,6.31,0, +138.328,-42.274,6.29,1.25, +138.808,14.941,5.34,1.32, +138.394,-47.339,5.92,-0.05, +138.534,-44.146,5.85,-0.12, +138.232,-59.414,5.54,0.85, +138.602,-43.227,5.25,-0.14, +138.854,-15.025,6.35,0.02, +139.38,46.817,5.97,0.04, +138.738,-37.602,5.86,0.83, +134.171,-85.663,5.42,0.31, +138.575,-55.57,5.27,0.99, +138.811,-45.556,6.25,-0.08, +139.174,-6.353,5.24,1.17, +138.903,-38.57,4.94,1.11, +139.172,-8.745,5.47,-0.09, +138.938,-37.413,4.62,0.45, +138.3,-69.717,1.68,0, +139.608,35.364,5.75,null, +139.281,-14.574,5.84,1.06, +139.018,-44.899,6.04,0.28, +139.464,11.501,6.41,0.07, +139.711,36.802,3.82,0.06, +138.823,-58.389,6.02,-0.1, +139.096,-44.266,5.12,1.67, +138.896,-57.578,6.32,1.04, +139.238,-39.401,5.33,1.17, +138.051,-76.663,6.14,1.09, +139.051,-57.541,4.34,1.63, +140.183,51.266,6.13,0.42, +140.43,56.699,5.47,1.61, +139.273,-59.275,2.25,0.18, +139.426,-54.495,6.33,1.41, +140.247,38.188,6.12,0.38, +139.89,-11.314,6.62,0.08, +139.524,-51.051,5.26,-0.07, +139.888,-15.834,5.78,1.29, +140.264,34.393,3.13,1.55, +139.943,-11.975,4.79,0.93, +140.363,32.902,6.16,1.09, +139.676,-51.561,5.87,0.54, +140.121,-9.556,4.8,0.93, +139.95,-34.103,6.39,-0.1, +140.314,15.371,6.53,-0.01, +139.322,-68.689,5.39,0.42, +139.465,-67.051,6.11,1.26, +140.231,-15.618,6.33,0.46, +140.184,-31.761,6.82,0, +140.123,-37.581,6.05,1.39, +139.886,-55.187,6.28,-0.1, +140.373,-25.966,4.72,1.63, +141.965,75.098,6.29,0.07, +139.356,-74.894,5.29,0.02, +139.364,-74.735,5.86,-0.02, +141.434,63.941,6.28,1.46, +140.883,25.183,6.41,0.82, +140.712,-9.839,6.53,0.22, +141.232,51.574,6.31,0.75, +140.462,-42.195,5.58,1.63, +141.094,36.587,6.67,0.21, +140.237,-62.405,4.81,0.94, +140.653,-39.775,6.54,1.13, +140.6,-46.047,5.75,0.92, +141.164,26.182,4.46,1.23, +140.458,-55.515,5.63,0.19, +140.801,-28.834,4.69,0.92, +140.528,-55.011,2.5,-0.18, +140.937,-37.757,6.48,0.18, +141.385,16.586,6.29,0.97, +141.068,-39.426,6.06,0.2, +141.35,-5.117,5.59,1.52, +140.998,-51.737,6.08,0.57, +140.864,-60.302,6.3,1.48, +141.593,-1.464,6.01,1.32, +141.024,-61.649,5.99,1.06, +142.167,45.601,5.41,0.98, +141.811,-9.224,6.54,0.05, +141.687,-28.787,6.1,-0.1, +141.619,-40.502,6.2,0.25, +142.448,55.746,6.45,null, +141.897,-8.659,1.98,1.44, +141.827,-22.344,4.69,1.14, +141.945,-6.071,5.38,0.64, +144.272,81.326,4.29,1.48, +141.363,-61.95,5.77,0.15, +141.575,-53.379,5.11,-0.11, +142.115,9.057,5.41,0.6, +142.122,8.188,5.71,1.04, +141.91,-35.008,6.65,0.2, +142.882,63.062,3.67,0.33, +142.259,-1.257,6.27,0.27, +142.287,-2.769,4.6,0.46, +142.352,-2.205,6.14,0.22, +141.684,-64.93,6.05,0.15, +142.385,-4.247,6.26,0.84, +142.303,-20.749,5.66,1.6, +142.68,33.656,5.85,1.05, +142.311,-35.951,4.51,1.44, +142.318,-38.404,6.19,0.22, +142.458,-23.345,6.24,1.57, +143.723,72.206,5.72,0.48, +142.885,35.103,5.37,1.53, +142.477,-26.59,5.48,1.36, +143.62,69.83,4.56,0.77, +142.594,-15.577,5.85,1.2, +142.93,22.968,4.31,1.54, +144.028,74.318,6.46,-0.1, +143.214,51.677,3.17,0.46, +142.196,-62.273,5.92,1.1, +141.777,-71.602,5.47,1.08, +143.28,49.439,6.76,null, +142.99,9.716,5.07,1.37, +142.689,-31.891,7,0.09, +142.692,-31.889,6.18,0.03, +142.986,11.3,4.97,1.05, +142.128,-66.702,5.91,0.01, +142.522,-51.517,5.45,-0.1, +142.912,-10.552,6.14,0.24, +142.675,-40.467,3.6,0.36, +142.995,-1.185,4.57,0.1, +142.983,-10.371,6.13,1.19, +142.884,-31.872,5.93,0.26, +142.887,-35.715,5.87,1.29, +143.376,36.487,6.18,1.27, +143.326,28.368,6.53,0.12, +142.598,-58.362,5.88,1.7, +143.172,1.864,6.11,0.62, +141.038,-80.787,5.36,0.45, +143.085,-19.4,5.74,0.14, +143.582,46.902,6.52,0.22, +143.077,-28.628,6.46,0.33, +143.706,52.051,4.5,0.01, +143.556,36.398,4.55,0.92, +143.259,-8.505,6.12,0.98, +143.233,-13.517,5.94,1.5, +142.805,-57.034,3.13,1.55, +143.496,23.454,6.25,1.46, +143.334,-7.19,6.24,1.17, +144.484,73.081,6.42,null, +143.08,-40.649,5.35,0.9, +143.302,-21.116,5.01,1.02, +143.766,39.621,4.81,0.99, +143.359,-22.864,5.91,0.02, +143.843,39.963,6.76,0.35, +143.283,-39.129,6.43,0.33, +142.887,-66.719,6.27,1.35, +143.636,-5.915,5.56,1.16, +143.915,35.81,5.41,0.77, +143.061,-62.789,6.1,1.43, +143.435,-49.005,5.12,-0.12, +143.97,14.38,6.36,0.01, +143.537,-51.255,5.01,-0.18, +144.179,31.162,5.56,1.59, +142.901,-73.081,5.47,1.56, +143.89,-19.584,6.31,0.06, +143.799,-35.824,6.49,0.42, +144.866,67.272,5.94,1.52, +143.611,-59.229,4.08,0.01, +144.261,16.438,5.69,1.25, +144.303,6.836,5,1.05, +144.14,-24.703,6.53,0.38, +144.59,40.24,5.25,0.22, +144.251,-25.297,5.7,1.12, +144.105,-48.751,6.17,0.27, +144.465,-9.424,6.4,-0.04, +144.291,-32.179,5.63,1.02, +144.614,4.649,4.68,1.32, +144.368,-36.096,5.98,1.12, +144.207,-49.355,4.35,0.17, +144.193,-52.944,6.19,1.05, +145.562,69.238,5.69,1.14, +145.738,72.253,5.17,1.04, +144.301,-53.669,5.45,0.15, +144.021,-64.951,6.56,0.1, +144.506,-43.191,5.5,1, +146.378,78.135,6.23,1.35, +144.67,-39.614,6.7,0.49, +144.964,-1.143,3.91,1.32, +144.948,-10.57,6.31,-0.03, +146.825,79.137,6.17,0.25, +145.084,-10.769,6.37,0.08, +145.077,-14.332,5.06,-0.15, +145.397,31.278,5.89,1.6, +145.501,39.758,5.62,0.95, +145.288,9.892,3.52,0.49, +145.41,25.913,6.24,1.25, +145.68,48.431,6.39,-0.01, +145.779,54.364,6.47,0.13, +144.838,-61.328,4.52,-0.07, +145.678,35.093,6.14,0.36, +145.321,-23.592,4.77,-0.12, +146.153,64.984,6.17,null, +143.472,-80.941,5.11,-0.14, +145.889,29.974,5.64,0.12, +145.56,-23.916,4.94,0.53, +145.177,-57.984,5.32,0.2, +145.259,-57.26,5.8,1.09, +146.481,63.653,6.34,0.31, +145.933,14.022,5.35,1.63, +145.672,-35.502,6.41,-0.06, +145.449,-55.214,6,-0.13, +146.125,18.864,6.5,null, +146.632,57.128,5.2,1.62, +146.05,-27.769,4.79,0.51, +145.865,-51.228,6.15,-0.1, +146.463,23.774,2.98,0.8, +146.066,-39.571,6.82,0.3, +145.926,-53.892,5.56,-0.04, +146.542,6.709,5.79,1.64, +146.597,11.81,5.63,1.49, +146.341,-30.203,6.45,-0.13, +146.598,1.786,5.65,0.34, +146.858,11.568,6.45,0.43, +147.148,46.021,5.09,0.62, +146.89,11.429,6.02,1.3, +146.419,-57.186,6.46,-0.11, +146.312,-62.508,3.69,1.22, +147.599,65.593,6.31,0.28, +146.627,-44.755,5.55,-0.18, +146.481,-58.794,6.22,0.46, +147.748,59.039,3.8,0.29, +147.459,21.179,6.09,0.25, +146.775,-65.072,3.01,0.28, +146.778,-65.072,6.26,0.08, +147.367,-37.186,5.97,1.24, +147.625,4.344,6.24,0.48, +148.027,54.064,4.59,0.03, +147.167,-56.412,6.06,0.94, +147.758,13.066,6.46,1.58, +147.464,-36.269,6.37,1.01, +147.488,-45.733,5.08,-0.1, +147.808,-4.243,6.01,0.17, +147.971,24.395,5.32,0.23, +147.84,-6.182,6.42,0.58, +146.586,-76.776,5.45,0.89, +147.87,-14.847,4.12,0.92, +147.675,-46.934,5.73,1.08, +148.191,26.007,3.88,1.22, +148.051,2.454,6.02,-0.04, +148.05,0.076,6.35,0.94, +147.998,-16.535,6.08,1.04, +148.127,-8.105,5.05,0.04, +147.832,-46.194,5.62,1.17, +148.764,61.116,6.27,1.05, +147.92,-46.548,4.58,1.2, +147.8,-59.426,5.79,1.36, +147.732,-62.745,5.57,1.32, +148.429,5.958,5.95,1.66, +148.242,-27.332,6.3,0.62, +148.929,49.82,5.27,0.07, +149.595,72.879,5.83,1.14, +148.551,-25.932,4.88,1.23, +148.25,-55.373,6.48,-0.14, +148.632,-22.488,6.24,0.04, +149.307,57.418,5.93,0.89, +148.718,-19.009,4.94,1.57, +148.459,-51.147,5.93,-0.15, +148.573,-45.284,5.71,-0.11, +149.108,8.933,5.85,1.13, +148.714,-50.244,5.72,-0.01, +149.421,41.056,5.14,0.46, +149.487,45.414,6.3,1.11, +149.023,-40.825,6.41,1.61, +149.194,-26.55,6.28,0.22, +149.148,-33.419,5.84,1.2, +149.225,-27.475,6.32,0.17, +152.143,83.918,6.37,1.52, +149.091,-51.336,6.37,-0.17, +149.609,27.759,6.3,null, +149.556,12.445,5.26,-0.04, +149.532,8.314,6.04,1.36, +149.965,56.812,5.48,1.46, +149.216,-54.568,3.54,-0.08, +149.295,-52.639,6.12,-0.13, +149.901,29.645,5.73,1.06, +149.427,-48.414,6.05,-0.14, +149.04,-71.389,6.35,-0.08, +149.93,3.385,6.7,0.27, +149.775,-23.95,6.21,-0.1, +149.718,-35.891,5.23,0.31, +149.313,-64.489,6.58,1.13, +149.249,-69.102,6.2,-0.1, +150.053,8.044,4.7,1.6, +150.253,31.924,5.36,0.66, +150.704,21.949,5.66,-0.19, +150.143,-56.947,6.52,0.98, +151.151,53.892,5.74,0.48, +150.419,-53.364,6.2,-0.13, +150.705,-30.577,6.54,1.19, +150.492,-57.35,6.2,1.12, +151.294,52.371,6.14,null, +150.921,-9.574,6.12,1.66, +150.5,-60.421,5.94,0.26, +151.035,3.201,6.45,0.4, +150.923,-25.317,6.7,0, +151.012,-18.102,5.86,-0.06, +150.835,-46.636,6.12,0.02, +151.088,-24.286,5.7,0.3, +150.75,-60.179,6.19,0.17, +150.706,-62.156,6.42,1.72, +151.098,-39.976,6.43,1.3, +151.42,15.758,6.37,0.37, +151.281,-13.065,4.6,-0.09, +150.893,-61.884,6.14,-0.04, +151.313,-36.384,6.27,1.11, +151.698,5.611,6.21,0.94, +151.858,35.245,4.48,0.18, +151.833,16.763,3.52,-0.03, +151.547,-47.37,5.08,0.88, +151.79,-17.142,5.6,1.5, +151.53,-52.188,6.52,0.98, +152.066,31.604,6.24,0.45, +151.976,9.997,4.37,1.45, +151.985,-0.372,4.49,-0.04, +152.093,11.967,1.35,-0.11, +150.182,-82.215,5.52,0.03, +152.007,-37.334,6.36,0.98, +152.19,-10.885,6.53,0.02, +152.148,-15.612,6.27,-0.01, +152.745,40.661,6.32,1.25, +152.485,-12.096,6.24,0.18, +152.531,-8.408,5.91,0.02, +152.235,-51.811,4.86,-0.12, +152.525,-12.816,5.31,0.36, +152.383,-35.857,6.13,0.6, +152.803,37.402,5.85,1.29, +152.647,-12.354,3.61,1.01, +152.178,-65.815,5.28,0.98, +152.733,-8.418,5.65,1.3, +151.032,-81.566,6.6,0.92, +152.909,13.355,6.44,0.46, +152.341,-61.549,5.6,1.6, +152.824,-7.317,6.25,0.01, +152.658,-41.715,5.98,1.24, +152.377,-68.683,5.81,0.02, +153.012,-28.606,6.28,0.01, +153.201,4.615,5.77,1.18, +153.158,-19.154,6.44,0.5, +153.457,27.136,6.04,0.85, +152.897,-58.828,6.4,1.66, +153.782,59.986,6.25,1.6, +152.944,-58.061,5.72,-0.08, +153.096,-52.163,6.16,1.17, +153.331,-27.029,6.25,0.31, +153.624,21.168,6.02,0.56, +153.353,-33.032,6.38,0.59, +153.776,31.468,6.46,null, +153.441,-40.346,5.9,1.21, +154.505,73.073,6.4,0.23, +153.345,-51.233,5.28,0.25, +153.255,-59.918,6.1,-0.08, +153.486,-40.311,6.35,0.94, +153.367,-51.756,5.78,0.14, +154.461,71.061,6.66,0.32, +153.338,-61.659,6.41,-0.11, +153.684,-42.122,3.85,0.05, +154.06,29.311,5.35,0.01, +153.378,-66.373,5.16,0.21, +154.508,65.108,5.82,0.12, +154.117,28.683,6.49,0.6, +154.067,17.74,6.55,null, +153.837,-36.518,6.19,1.06, +154.135,23.503,5.97,0.67, +154.173,23.417,3.44,0.31, +154.175,25.371,5.84,1.2, +154.274,42.914,3.45,0.03, +154.038,-11.203,6.08,1.1, +154.17,13.728,5.41,1.61, +153.881,-43.113,5.6,1.52, +153.434,-70.038,3.32,-0.08, +153.819,-54.974,6.16,-0.17, +154.311,23.106,5.82,0.5, +154.19,-20.671,6.57,0.48, +154.543,27.415,6.52,-0.02, +154.408,-8.069,5.24,0.31, +154.013,-59.903,6.22,0.2, +154.746,46.761,6.43,null, +154.168,-51.205,6.3,1.54, +154.862,48.397,6,1.02, +155.264,68.748,5.96,0.2, +154.753,24.712,6.4,null, +154.532,-28.992,5.34,0.24, +154.271,-61.332,3.4,1.54, +155.062,53.779,6.45,0.54, +155.13,54.217,6,1.13, +154.658,-36.805,6.3,1.28, +154.934,19.471,4.79,0.45, +154.82,-12.528,6,0.26, +154.618,-41.668,5.96,-0.06, +154.993,19.842,2.61,1.15, +154.994,19.841,3.8,null, +154.884,-5.106,6.37,0.9, +154.998,-9.059,6.32,0.33, +154.657,-56.11,5.81,0.48, +157.423,84.252,5.5,null, +154.903,-55.029,4.57,1.62, +155.258,2.29,6.66,-0.08, +154.77,-64.676,5.67,0.05, +155.07,-47.699,5.65,1.67, +155.544,41.229,5.76,0.54, +155.283,-17.985,6.51,0.4, +155.582,41.499,3.05,1.59, +155.46,14.976,6.12,0.02, +155.37,-23.711,6.5,0.2, +156.033,65.566,4.97,-0.06, +155.4,-22.528,6.51,0.07, +155.228,-56.043,4.5,-0.12, +155.776,33.908,5.9,0.14, +155.554,-19.867,6.13,0.03, +155.752,6.542,6.07,1.12, +155.924,29.616,6.39,1.09, +155.811,5.694,6.54,0.46, +155.582,-41.65,4.83,1.12, +156.036,33.719,5.5,1.18, +155.86,-4.074,5.97,-0.1, +155.805,-30.162,6.27,0.31, +157.769,82.559,5.26,0.37, +156.055,2.368,6.32,1, +155.872,-38.01,5.33,0.25, +155.918,-41.953,6.27,0.88, +156.313,8.785,5.61,1.62, +155.742,-66.902,4.99,-0.13, +156.479,33.796,4.74,0.25, +155.962,-57.954,6.35,1.52, +156.435,-7.06,5.57,1.52, +156.322,-42.468,6.18,1, +156.523,-16.836,3.81,1.48, +156.248,-58.576,5.95,0.32, +156.867,41.601,6.02,0.17, +156.752,19.364,6.15,1.14, +157.016,48.785,6.44,0.6, +156.54,-42.739,6.13,1.13, +156.971,36.707,4.21,0.9, +156.913,9.763,6.04,-0.06, +156.099,-74.032,4,0.35, +157.152,45.212,6.35,1.32, +156.788,-31.068,4.25,1.45, +156.185,-73.972,6.19,0.07, +157.476,65.626,6.32,1.14, +156.704,-54.877,5.58,1.56, +157.611,64.257,6.12,0.16, +157.183,-3.742,6.05,0.05, +156.852,-57.639,4.66,0.51, +157.008,-49.406,6.1,1.51, +157.657,55.981,4.84,0.52, +157.527,38.925,5.77,0.08, +156.97,-58.739,3.82,0.31, +156.855,-65.705,6.01,0.09, +157.37,-2.739,5.21,-0.06, +157.371,-29.664,5.58,1.42, +157.397,-30.607,5.56,-0.04, +157.573,-0.637,5.09,-0.14, +157.219,-64.172,5.29,1.86, +159.007,80.494,6.52,0.95, +157.745,-7.637,6.2,1.38, +157.749,-13.588,5.58,-0.04, +157.964,32.379,5.9,0.11, +157.714,-26.484,6.51,0.54, +158.773,75.713,4.84,0.96, +158.049,14.137,5.46,1.68, +157.663,-61.356,6.43,1.76, +157.536,-66.985,6.19,0.01, +157.953,-28.237,6.05,0.51, +158.432,53.498,6.45,null, +158.308,40.426,4.75,0.23, +158.203,9.307,3.85,-0.14, +157.841,-53.716,4.89,0.5, +157.99,-45.067,5.74,-0.15, +157.986,-45.069,6.09,-0.11, +158.379,34.989,5.58,0.02, +157.584,-71.993,4.74,0.04, +158.14,-44.619,5.91,0.92, +158.006,-61.685,3.32,-0.09, +158.79,57.083,5.16,0.34, +157.758,-73.222,4.93,1.68, +158.237,-47.003,5.02,1.04, +158.198,-58.667,6,0.32, +158.504,-23.745,5.08,1.6, +158.7,6.954,5.08,0.94, +158.355,-58.19,6.14,0.35, +158.759,8.65,5.67,0.05, +158.74,-23.176,6.1,0.5, +159.089,36.327,6.28,0.39, +158.554,-60.988,6.23,1.4, +158.912,-18.569,6.49,0.2, +158.804,-39.563,5.38,2.88, +158.794,-43.665,6.08,0.94, +159.073,-10.583,6.57,0.29, +159.07,-16.344,6.03,1.65, +159.019,-26.675,6.29,0.48, +159.135,-12.23,5.7,0.52, +158.897,-57.558,4.45,1.62, +159.298,-11.749,6.52,0.29, +157.963,-81.921,7.07,-0.08, +159.307,-27.412,4.89,1.62, +159.388,-13.384,4.82,2.68, +159.085,-59.565,5.08,1.18, +159.774,53.668,5.52,1.27, +159.68,31.976,4.71,0.81, +159.325,-48.226,3.84,0.3, +159.782,37.91,5.85,0.57, +159.362,-58.733,5.45,0.5, +158.853,-76.309,6.3,1.2, +159.646,-16.877,4.91,0.92, +159.71,-12.444,6.04,0, +159.51,-57.256,5.91,-0.14, +158.867,-78.608,4.11,1.58, +159.71,-42.754,6.11,0.66, +160.451,68.443,5.75,1.3, +159.688,-59.183,4.66,1.48, +160.486,65.716,5.12,1.2, +159.748,-58.817,5.92,1.65, +159.827,-55.603,4.28,1.04, +160.767,69.076,5,1.38, +160.351,-1.742,6.26,0.88, +160.215,-35.742,6.37,0.92, +160.547,31.697,6.02,1.62, +160.047,-65.101,5.52,-0.16, +159.819,-74.494,6.07,1.71, +160.93,57.199,5.8,-0.02, +160.323,-59.677,6.42,0.08, +160.758,26.326,5.51,0.17, +160.63,-13.975,6.24,1.54, +160.887,46.204,5.18,0.33, +160.854,23.188,5.08,0.04, +160.837,4.748,5.79,1.17, +160.68,-32.716,5.64,0, +161.267,67.411,6,2.39, +160.558,-64.466,4.82,-0.14, +161.06,19.759,6.27,0.17, +160.669,-59.216,5.38,0.26, +160.739,-64.394,2.76,-0.22, +160.884,-60.567,4.57,1.71, +161.289,2.488,6.28,1.21, +161.594,57.366,6.34,1.56, +161.466,30.682,5.24,-0.06, +160.963,-64.249,5.77,0, +161.029,-63.961,4.82,-0.13, +160.464,-79.783,5.97,-0.07, +161.524,6.373,6.37,1.12, +161.602,18.891,5.49,1.12, +161.605,14.195,5.48,0.91, +161.265,-59.684,6.21,0.61, +161.081,-70.86,6.26,0.2, +161.134,-70.855,6.46,0.23, +161.11,-72.444,6.27,0.49, +161.717,-17.297,5.42,0.11, +162.208,65.132,6.39,-0.02, +161.693,-49.42,2.69,0.9, +161.57,-60.603,6.25,0.04, +161.908,-15.262,6.67,-0.01, +161.569,-64.515,5.34,-0.1, +161.624,-64.263,5.23,-0.07, +161.74,-56.757,5.23,-0.08, +161.713,-64.383,4.85,-0.15, +162.238,29.416,6.15,1.15, +162.169,-1.959,5.93,1.6, +162.059,-31.688,5.88,0.03, +161.911,-57.468,6.36,1.62, +162.314,10.545,5.34,0.03, +162.023,-59.919,6,0.27, +162.322,-4.024,6.61,0.22, +162.474,27.974,6.04,0.37, +161.315,-80.47,5.47,0.95, +162.406,-16.194,3.11,1.25, +162.431,-9.853,5.86,1.07, +161.445,-80.54,4.45,-0.19, +162.796,56.582,5.67,1.12, +162.849,59.32,5.58,1.14, +162.575,-8.898,5.79,0.16, +162.487,-34.058,5.61,0.04, +162.35,-59.324,5.91,0, +162.773,-3.093,5.95,1.48, +163.128,52.565,6.65,null, +163.133,52.504,6.44,1.11, +163.378,69.854,5.93,0.99, +163.057,1.025,6.38,0.08, +163.15,-0.201,6.31,1.5, +163.394,54.585,5.1,1.36, +163.328,34.215,3.83,1.04, +163.495,43.19,4.71,-0.05, +163.354,-2.255,6.12,0.9, +163.129,-57.241,5.25,0.16, +163.373,-20.139,5.24,0.47, +163.387,-15.446,6.38,1.16, +163.432,-2.129,5.45,0.96, +163.676,25.491,6.2,0.28, +163.574,-13.758,5.66,0.83, +163.743,34.035,5.72,1.01, +163.373,-58.853,3.78,0.95, +163.935,33.507,5.03,1.1, +163.903,24.75,4.5,0.01, +163.905,24.749,6.3,null, +163.798,-20.665,6.44,1.1, +163.425,-70.72,5.99,-0.02, +163.754,-42.251,6.11,-0.08, +164.06,42.008,6.03,1.13, +163.927,0.737,5.91,0.42, +163.623,-61.827,5.93,1.75, +164.006,6.185,5.81,1.45, +163.115,-79.559,6.33,1.46, +164.07,22.352,6.14,1.55, +164.143,25.5,6.35,1.03, +163.822,-60.517,5.92,1.08, +164.987,77.77,6.2,0.97, +164.18,-37.138,4.6,1.03, +164.283,-50.765,5.91,0.18, +164.825,51.882,6.17,1.38, +164.452,-59.732,6.11,1.1, +164.867,40.43,5.05,0.61, +164.887,36.093,6,1.59, +164.315,-75.1,6.13,1.53, +165.061,45.526,5.47,1.47, +164.921,11.706,6.55,0.43, +164.808,-33.737,5.71,0.37, +165.107,51.502,6.43,null, +164.879,-16.354,5.89,1.63, +165.086,42.911,6.02,0.57, +165.274,63.421,6.39,0.16, +164.944,-18.299,4.08,1.09, +165.21,39.212,5.08,0.24, +165.048,-14.083,5.88,1.5, +164.808,-61.32,6.16,-0.06, +165.14,3.618,4.84,1.16, +164.998,-43.807,5.81,-0.08, +165.039,-42.226,4.39,0.11, +165.187,6.101,4.99,0.16, +165.46,56.383,2.37,-0.02, +165.036,-51.818,6.15,0.18, +165.238,-15.793,6.34,1.18, +165.17,-31.839,6.07,0.52, +165.457,-2.485,4.74,1.62, +165.582,20.18,4.42,0.05, +165.932,61.751,1.79,1.07, +165.602,-26.831,6.23,0.31, +165.811,-0.752,6.14,0.26, +164.804,-81.556,6.71,0.55, +165.812,-11.304,5.5,0.94, +165.903,-0.001,5.95,1.22, +165.817,-31.961,6.46,1.62, +165.902,-13.434,6.34,0.88, +166.13,38.241,6,0.16, +166.254,7.336,4.63,0.33, +166.13,-47.679,5.67,0.24, +164.807,-84.594,6.19,0.11, +166.226,-35.805,5.43,0.03, +166.333,-27.294,4.94,0.36, +166.392,-11.089,6.09,0.3, +166.268,-49.392,6.13,-0.02, +166.49,-27.288,5.71,-0.06, +166.524,-51.213,6.3,0.95, +166.726,1.956,5.52,0.97, +166.661,-28.728,6.77,0.04, +166.614,-50.957,6.32,1.16, +166.915,23.324,6.46,0.16, +166.622,-58.675,6.02,1.24, +166.785,-32.587,6.59,0.34, +166.635,-62.424,4.61,1.03, +166.601,-64.84,6.41,0.12, +166.819,-42.639,5.15,0.03, +166.977,-30.175,6.54,0.6, +166.708,-70.878,5.57,-0.05, +167.416,67.21,6.06,0.22, +167.066,-29.973,6.49,0.03, +167.205,24.658,5.68,0.06, +167.33,36.309,5.74,1.51, +167.183,-28.081,5.44,0.07, +167.416,44.499,3.01,1.14, +167.41,43.208,5.89,1.57, +167.147,-58.975,3.91,1.23, +167.142,-61.947,5.13,0.22, +167.473,-32.367,5.81,0.04, +168.046,68.272,6.4,null, +167.932,14.4,6.3,0.21, +167.728,-58.455,6.88,-0.08, +167.915,-22.826,4.48,0.03, +168.185,54.894,6.63,null, +168.134,35.814,6.41,0.61, +168.062,-32.434,6.38,1.7, +168.127,-18.5,6.13,-0.01, +168.144,-21.749,6.4,1.38, +167.873,-71.436,6.35,1.37, +168.138,-49.101,5.36,0.18, +168.418,41.089,6.33,1.15, +168.15,-60.317,4.6,0.55, +168.237,-49.736,6.11,1.06, +168.311,-44.372,5.8,1.66, +168.188,-64.17,5.23,-0.06, +168.44,-0.07,5.42,-0.03, +168.527,20.524,2.56,0.12, +168.508,8.061,5.79,1.12, +168.56,15.429,3.34,-0.01, +168.414,-53.232,5.76,1.32, +168.378,-59.619,5.74,-0.1, +168.801,23.096,4.63,1.66, +169.017,52.773,6.5,0.43, +168.725,-43.734,6.21,1.61, +168.966,13.308,5.32,1.2, +168.991,12.845,6.67,0.27, +169.175,49.476,5.88,1.08, +169.165,-3.652,4.47,0.21, +169.243,-7.135,6.14,0.2, +169.115,-45.88,6.31,0.4, +169.323,2.011,5.18,1.52, +169.299,-38.014,6.27,0.1, +169.413,-34.737,6.45,0.4, +169.545,31.529,4.87,null, +169.546,31.529,4.41,0.59, +169.429,-36.534,6.68,0.98, +169.62,33.094,3.48,1.4, +169.588,11.985,6.66,0.07, +169.329,-67.824,6.06,1.76, +169.783,38.186,4.78,0.12, +169.729,1.651,5.91,1.04, +169.835,-14.779,3.56,1.12, +170.224,67.101,6.21,1.01, +169.819,-64.582,5.99,0.46, +169.643,-79.669,6.35,0.26, +170.284,6.029,4.05,-0.06, +169.901,-75.143,6.27,-0.03, +170.455,57.075,6.43,0.15, +170.016,-71.994,6.41,0.05, +170.252,-54.491,3.89,-0.15, +170.714,64.331,6.02,0.09, +170.707,43.483,4.99,0.99, +170.596,-44.646,6.12,0.92, +170.825,0.132,6.05,1.46, +170.841,-18.78,5.09,0.42, +170.803,-36.165,5,1.46, +170.488,-77.608,6.43,0.2, +170.784,-56.779,5.79,0.01, +170.981,10.529,3.94,0.41, +171.01,1.408,5.39,0.94, +170.841,-64.955,5.11,-0.08, +171.153,-10.859,4.83,1.56, +171.092,-42.669,6.12,-0.18, +171.245,11.43,5.8,1.38, +171.22,-17.684,4.08,0.21, +171.046,-72.257,5.59,0.06, +171.488,55.851,5.75,null, +171.402,16.456,5.57,0.36, +171.372,-36.063,5.22,0.99, +171.458,3.86,6.37,0.33, +171.388,-37.748,5.89,1.54, +171.606,33.451,6.32,0.43, +171.43,-63.973,5.17,0.5, +171.689,3.013,6.5,0.79, +171.647,-61.115,5.3,-0.08, +171.79,-12.357,5.94,0.49, +171.697,-53.16,5.81,0.52, +171.984,2.856,4.95,1, +171.974,-1.7,6.25,1.04, +171.994,-35.329,6.45,null, +172.269,61.778,5.83,0.36, +172.267,39.337,5.31,0.01, +172.146,-42.674,5.08,-0.03, +172.431,56.738,6.28,0.15, +172.076,-72.474,6.09,0.16, +172.425,15.413,5.74,1.32, +172.554,54.362,6.41,null, +172.411,-24.463,5.76,0.07, +172.96,81.127,6.15,0.24, +172.604,46.658,6.35,1.27, +172.63,43.173,5.94,0.49, +172.579,-3.004,4.77,1.54, +172.621,18.41,5.52,1.05, +172.851,69.331,3.84,1.62, +172.72,47.929,6.42,0.88, +172.793,48.789,6.56,0.93, +172.937,14.364,6.2,0.57, +172.813,-61.278,6.38,0.52, +173.087,61.083,5.48,0.5, +172.948,-20.777,6.24,0.54, +172.942,-59.442,5.13,1.08, +172.953,-59.516,5.15,0.49, +173.067,-29.263,5.81,0.53, +173.068,-29.261,5.64,0.53, +173.097,-26.747,6.16,1.66, +173.198,-7.827,5.95,1.38, +173.2,-40.436,5.64,1.58, +173.083,-66.962,5.9,1.13, +173.225,-31.087,5.04,1.58, +173.25,-31.858,3.54,0.94, +173.311,-16.281,6.05,0.6, +173.485,36.816,6.4,1.05, +173.405,-40.587,5.39,0.12, +173.542,11.024,6.55,0.18, +173.592,3.06,5.77,0.46, +173.677,16.797,5.95,-0.16, +173.77,54.785,5.63,1.02, +173.623,-32.831,5.98,0.81, +173.766,20.441,6.45,1.01, +173.69,-54.264,4.62,-0.08, +174.012,69.323,5.2,1.01, +173.737,-49.137,5.5,1.04, +173.805,-47.372,5.71,1.66, +173.931,10.911,6.56,0.13, +174.075,27.781,5.8,0.23, +173.982,-47.642,5.25,0.25, +173.945,-63.02,3.13,-0.04, +174.17,-9.802,4.7,-0.08, +174.146,-33.57,5.74,1.02, +174.17,-37.238,6.31,0.06, +174.237,-0.824,4.3,1, +174.093,-61.052,5.83,-0.09, +174.255,-32.988,6.29,0.46, +174.471,50.618,6.14,1.07, +174.253,-61.283,5.15,1.12, +174.391,-47.747,5.44,1.24, +174.586,43.626,5.59,0.33, +174.541,8.884,6.17,1.08, +174.315,-75.897,5.65,0.35, +174.64,46.834,6.1,0.38, +174.705,64.347,6.46,null, +174.634,33.626,6.27,1.32, +174.615,8.134,5.36,1.57, +174.6,-2.436,6.22,1.12, +174.452,-67.62,5.96,1.02, +174.687,45.109,6.44,0.56, +174.53,-61.826,5.15,-0.02, +174.667,-13.202,5.48,0.52, +174.752,-24.721,6.42,0.82, +174.963,-14.469,6.21,0, +174.96,-16.62,6.19,1.62, +174.873,-65.398,5.17,0.8, +175.114,57.971,6.37,-0.12, +175.053,-34.745,4.7,-0.07, +175.196,21.353,5.26,0.98, +175.263,34.202,5.33,0.72, +175.178,-53.969,5.96,1.66, +175.285,-29.196,6.44,0.66, +175.223,-62.09,4.94,1.15, +175.432,55.173,6.27,1.49, +175.393,31.746,5.73,0.43, +175.333,-43.096,5.55,null, +175.433,-32.5,5.22,1.48, +175.618,66.745,5.3,1.28, +175.522,22.211,6.59,null, +175.515,-20.294,6.22,0.95, +175.255,-83.1,6.33,1.08, +175.863,-37.19,5.98,1.46, +175.731,-79.306,6.39,0.9, +175.98,-6.677,6.07,0.96, +175.88,-62.489,5.03,0.8, +176.055,25.218,6.02,1.53, +175.97,-62.878,6.1,0.06, +176.191,-18.351,4.73,0.97, +176.321,8.258,4.85,0.18, +176.303,-49.07,6.26,1.17, +176.465,6.529,4.03,1.51, +176.513,47.779,3.71,1.18, +176.433,-45.69,5.29,-0.12, +176.402,-66.729,3.64,0.16, +176.732,55.628,5.27,1.27, +176.628,-61.178,4.11,0.9, +176.63,-40.501,4.91,0.66, +176.779,-35.907,6.17,0.96, +176.815,-30.287,6.48,0.68, +176.83,-57.696,5.41,1.67, +176.996,20.219,4.53,0.55, +176.979,8.246,5.32,0.02, +177.098,-10.313,6.26,0.58, +177.06,-66.815,4.72,1.54, +177.161,14.284,5.88,0.29, +177.188,-26.75,5.11,1.6, +177.255,-0.319,6.15,0.52, +177.265,14.572,2.14,0.09, +177.312,16.243,6.04,0.27, +177.424,34.932,5.7,0.46, +177.421,-63.788,4.32,-0.15, +177.486,-70.226,4.97,1.4, +177.581,-15.864,6.13,0.95, +177.674,1.765,3.61,0.55, +177.613,-62.649,5.7,0.26, +177.655,-27.278,6.48,0.98, +177.73,12.279,6.35,0.27, +177.759,-5.333,5.64,1.06, +177.789,33.375,6.27,0.32, +177.786,-45.174,4.46,1.3, +177.841,-12.188,6.35,0.4, +177.923,-30.835,5.85,0.56, +177.963,-65.206,4.9,-0.11, +178.245,37.719,6.45,0.75, +178.042,-56.988,5.57,0.07, +178.228,-33.908,4.28,-0.1, +178.362,-35.067,6.17,0.08, +178.457,53.695,2.44,0, +178.46,0.552,6.3,0.2, +178.548,-57.41,6.06,0.05, +178.608,-37.749,6.46,0.52, +178.677,-25.714,5.3,0.88, +178.763,8.444,5.58,0.94, +178.774,46.477,6.54,0.1, +178.797,46.47,7.03,0.01, +178.809,36.756,6.49,1.58, +178.749,-63.279,5.91,0.19, +178.919,15.647,5.53,0.11, +178.917,-28.477,5.93,1.5, +178.993,56.599,5.84,1.1, +179.004,-17.151,5.18,-0.02, +178.978,-39.689,6.13,1.02, +179.222,61.549,6.22,0.96, +179.183,-47.073,6.26,0.4, +179.265,-33.315,6.21,-0.04, +179.311,40.344,6.62,0.46, +179.417,-62.449,5.57,-0.15, +179.53,32.274,6.42,0.29, +179.586,61.465,6.76,null, +179.563,-56.317,5.44,-0.08, +179.585,-40.947,6.79,0.97, +179.699,-64.339,5.61,0.18, +179.727,-25.909,6.43,0.03, +179.764,0.531,6.17,1.26, +179.823,33.168,5.96,1.15, +179.795,-51.697,6.05,1.28, +179.905,-78.222,4.91,-0.06, +179.988,34.035,6.5,0.22, +179.987,3.655,5.37,0, +180.078,80.853,6.17,1.61, +180.185,-10.446,5.55,0.77, +180.177,-21.837,6.28,1.22, +180.218,6.614,4.66,0.13, +180.213,-19.659,5.26,-0.2, +180.258,-1.768,6.31,1.21, +180.371,-57.504,6.16,0, +180.415,36.042,5.59,1.01, +180.528,43.046,5.21,0.26, +180.584,-85.632,6.05,1.29, +180.619,-71.489,6.42,1.17, +180.657,-69.192,5.89,-0.08, +180.715,-7.684,6.22,1.49, +180.756,-63.313,4.33,0.27, +180.915,-42.434,5.15,0.41, +180.935,-74.214,6.44,1.23, +181.069,21.459,5.87,0.22, +181.08,-63.166,4.72,-0.08, +181.161,-68.329,5.35,-0.01, +181.194,-76.519,5.04,1.49, +181.117,85.587,6.27,0.59, +181.238,-60.969,5.96,1.67, +181.302,8.733,4.12,0.98, +181.313,76.906,5.8,1.01, +181.415,62.933,6.13,1.17, +181.472,-65.547,6.33,0.22, +181.486,-35.694,6.23,-0.08, +181.499,-3.132,6.37,1, +181.582,-68.651,6.23,1.24, +181.596,-65.709,6.06,0.65, +181.72,-64.614,4.15,0.34, +181.957,-75.367,5.18,1.3, +182.022,-50.661,4.47,-0.15, +182.02,-50.763,6.37,-0.05, +182.061,-48.693,5.34,-0.01, +182.09,-50.723,2.6,-0.12, +182.103,-60.847,6.22,1.74, +182.103,-24.729,4.02,0.32, +182.224,-44.326,5.75,0.24, +182.227,-41.231,5.48,-0.07, +182.422,1.898,5.95,1.12, +182.447,74.661,6.35,0.5, +182.51,-34.705,6.17,0.03, +182.514,5.807,5.72,0.35, +182.531,-22.62,3,1.33, +182.641,-37.87,6.06,0.2, +182.632,16.809,6.39,0.06, +182.692,27.281,6.01,0.11, +182.77,-61.277,6.08,0.39, +182.766,-23.603,5.46,0.06, +182.762,-45.423,6.61,1.08, +182.881,-51.359,6.23,0.82, +182.913,-52.369,3.96,-0.15, +182.75,81.71,6,1.62, +182.963,25.87,5.66,1.41, +182.937,57.054,6.43,null, +183.005,28.536,6.49,0.36, +183.039,20.542,5.57,0.95, +183.092,-62.951,5.92,0.29, +183.195,-70.152,6.17,0.84, +183.05,77.616,5.14,0.33, +183.304,-34.126,6.5,1.66, +183.355,-38.929,5.76,-0.13, +183.482,-78.574,6.35,1.24, +183.358,10.262,5.85,0.27, +183.403,-33.793,6.33,0.08, +183.511,-45.724,5.31,1.43, +183.57,-64.409,6.22,0.12, +183.681,53.435,6.16,1.04, +183.748,-20.844,5.83,1.05, +183.786,-58.749,2.8,-0.23, +183.794,-10.312,6.11,0.46, +183.877,-41.913,6.26,1.01, +183.785,70.2,5.71,1.19, +183.857,57.033,3.31,0.08, +183.946,-23.354,6.54,0.45, +183.952,-17.542,2.59,-0.11, +184.001,14.899,5.1,0.06, +184.098,-72.615,6.22,-0.01, +183.922,72.551,6.29,1.14, +184.032,40.66,5.66,1.55, +184.085,23.945,4.95,0.97, +184.125,33.061,5,1.14, +184.275,-65.693,6.06,0.03, +184.264,-16.694,6.05,0.1, +184.392,-67.961,4.11,1.58, +184.373,53.191,5.81,1.3, +184.377,28.937,5.7,0.16, +184.586,-79.312,4.26,-0.12, +184.447,-36.094,6.15,0.01, +184.435,15.144,6.34,1.37, +184.538,-3.954,6.99,0.36, +184.54,-3.949,6.54,0.33, +184.609,-64.003,4.04,-0.17, +184.632,30.249,6.23,0.3, +184.668,-0.787,5.9,0.17, +184.749,-55.143,5,1.59, +184.214,86.436,6.33,0.43, +184.759,26.008,6.48,0.18, +184.83,23.035,6.27,0.17, +183.835,87.7,6.28,0.35, +184.708,75.161,5.38,-0.02, +184.873,28.157,6.33,0.5, +184.977,-0.667,3.89,0.02, +184.953,48.984,5.29,1.66, +185.045,-22.176,5.97,0.82, +185.117,-65.843,6.21,-0.04, +185.082,26.619,5.54,1.09, +185.074,26.002,6.15,0.3, +185.088,3.313,4.96,1.16, +185.14,-22.216,5.21,-0.1, +185.179,17.793,4.74,1.01, +185.172,27.055,7.13,0.36, +185.232,-13.566,5.14,1.05, +185.34,-60.401,3.59,1.42, +185.212,57.864,5.55,1.43, +185.49,-56.375,5.92,1.57, +185.53,-67.522,5.15,0.19, +185.55,-68.307,5.74,1.04, +185.545,24.774,6.19,-0.01, +185.705,-57.676,5.39,-0.1, +185.626,25.846,4.81,0.49, +185.633,5.306,6.4,0.6, +186.406,-86.151,6.33,1.08, +185.807,-67.632,6.36,0.89, +185.84,-24.841,5.68,1.16, +185.897,-35.413,5.32,-0.08, +185.904,-39.303,6.4,0.29, +185.937,-38.911,5.79,-0.08, +185.946,42.543,6.06,0.33, +186.006,51.562,4.8,0.87, +186.077,26.099,5.18,0.08, +186.186,-41.384,6.25,1.18, +186.111,25.583,6.42,0.27, +186.322,-65.771,6.3,0.96, +186.285,-42.514,6.11,0.65, +186.299,-11.61,5.95,0.03, +186.327,-27.749,6.09,1.27, +186.341,-35.186,5.73,-0.06, +186.313,23.926,6.03,1.1, +186.263,56.777,5.81,1.62, +186.277,63.803,6.32,0.91, +186.462,39.019,5.02,0.96, +186.629,-63.122,4.86,-0.12, +186.65,-63.099,1.33,-0.24, +186.652,-63.099,1.73,-0.26, +186.632,-51.451,4.82,-0.14, +186.6,27.268,4.95,0.27, +186.701,-48.913,6.26,0.68, +186.715,-32.83,5.55,0.01, +186.853,-63.789,6,0.07, +186.735,28.268,4.36,1.13, +186.747,26.826,5,0.08, +186.87,-58.992,5.5,1.45, +186.601,71.93,6.24,1.06, +186.925,8.61,6.37,0.93, +186.956,-16.632,6.35,0.84, +187.01,-50.231,3.91,-0.19, +187.079,-64.341,6.04,0.02, +186.896,55.713,5.7,1.55, +186.965,-4.615,6.22,0.44, +187.106,-61.795,6.22,1.26, +187.094,-39.041,5.44,-0.08, +187.139,-56.408,6.15,0.92, +187.159,26.227,6.54,0.17, +187.186,25.899,6.65,0.22, +187.228,25.913,5.29,-0.05, +187.362,24.109,5.48,0.43, +187.475,-56.525,5.8,1.56, +187.491,-41.736,6.02,1.52, +187.43,20.896,5.69,0.07, +187.466,-16.516,2.95,-0.05, +187.52,-13.393,6.35,0.56, +187.573,-23.697,5.63,1.67, +187.489,58.406,5.35,0.2, +187.512,51.536,6.21,0.51, +187.518,58.768,6.08,0.98, +187.791,-57.113,1.63,1.59, +187.82,-57.081,6.42,0.16, +187.528,69.201,4.95,1.62, +187.753,24.567,5.46,0.05, +187.709,53.077,6.21,0.54, +187.918,-59.424,5.48,0.63, +188.042,-73.002,5.88,1.11, +187.839,7.604,6.05,1.52, +187.983,-63.506,5.95,0.27, +187.911,-5.052,6.19,1.04, +188.117,-72.133,3.87,-0.15, +188.019,-32.534,6.46,0.2, +188.017,-16.196,4.31,0.38, +188.15,-13.859,5.74,0.4, +188.262,10.296,6.26,0.95, +188.343,-19.792,6.26,0.29, +188.393,-12.83,5.58,0.86, +188.392,24.283,6.29,0.11, +188.445,-9.452,5.48,-0.03, +188.497,-49.909,6.38,0.46, +188.412,33.248,5.42,1, +188.448,33.385,6.24,1.05, +188.435,41.358,4.26,0.59, +188.597,-23.397,2.65,0.89, +188.371,69.788,3.87,-0.13, +188.676,-44.673,5.77,0.7, +188.713,22.629,4.81,0, +188.871,-61.842,6.22,0.73, +188.776,18.377,6.56,0.25, +188.783,18.377,5.02,1.15, +188.784,21.881,5.85,1.22, +188.94,-41.022,5.13,0.22, +188.683,70.022,4.94,1.31, +189.005,-39.87,5.8,0.01, +188.994,-20.527,6.2,0.33, +189.296,-69.136,2.69,-0.2, +189.198,-5.832,5.87,0.07, +189.097,59.487,5.5,null, +189.243,17.089,5.68,1.41, +189.426,-48.541,3.86,0.05, +189.426,-27.139,5.45,0.32, +189.81,-75.369,6.49,0.08, +189.518,3.282,6.33,0.01, +189.719,-67.193,6.25,0.06, +189.593,1.855,5.71,1.6, +189.625,6.988,7.08,1.44, +189.686,-18.25,6,0.29, +189.765,-30.422,5.89,1.21, +189.693,40.874,6.37,0.18, +189.759,22.659,6.38,1.1, +189.812,-7.996,4.66,1.23, +189.982,-66.512,6.26,-0.05, +189.78,21.063,5.46,0.96, +189.82,35.952,6.45,0.06, +189.969,-39.988,4.64,-0.08, +190.346,-46.146,5.84,1.52, +190.379,-48.96,2.17,-0.01, +190.521,-69.407,6.33,0.78, +190.317,-13.014,6.08,null, +190.318,-13.015,5.98,0.42, +190.486,-59.686,4.93,-0.04, +190.393,10.426,6.19,0.19, +190.415,-1.449,3.65,0.36, +190.415,-1.449,3.68,null, +190.455,-19.759,6.03,0.39, +190.471,10.236,4.88,0.09, +190.488,6.807,5.59,0, +190.71,-63.059,5.31,0.27, +190.647,-48.813,4.66,1.09, +190.707,-55.947,6.08,-0.03, +190.391,62.713,6.07,0.01, +190.788,-56.176,6,-0.08, +190.868,-58.903,6.4,1.09, +190.86,-40.178,6.44,0.25, +190.909,-1.577,5.93,0.86, +190.995,-36.349,6.39,-0.06, +191.002,-28.324,5.48,1.34, +190.767,61.156,6.38,1.26, +191.257,-68.831,6.16,0.69, +191.408,-60.981,4.69,1.05, +191.113,44.103,6.33,0.43, +191.57,-68.108,3.05,-0.18, +191.248,39.279,5.95,0.55, +191.283,45.44,4.99,2.54, +191.405,7.673,5.22,0.33, +191.595,-56.489,4.65,-0.16, +191.594,9.54,5.67,0.99, +191.692,-33.316,5.86,1.34, +191.661,16.578,5.12,1.35, +191.108,80.621,6.4,0.12, +191.93,-59.689,1.25,-0.23, +191.76,5.951,6.34,-0.05, +191.807,11.958,6.07,0.12, +191.889,-6.302,6.26,0.55, +191.974,-24.852,6.44,-0.06, +191.964,3.573,6.41,1.6, +191.829,62.781,5.89,null, +192.11,-27.597,5.66,0.95, +192.06,13.553,6.56,0.01, +192.437,-71.986,5.55,1.17, +191.893,66.79,5.43,1.56, +192.196,24.84,6.31,0.7, +192.226,14.123,5.7,0.02, +192.174,48.467,6.27,0.18, +192.164,60.32,5.85,0.46, +192.55,-60.401,6.75,0.35, +192.323,27.552,5.78,0.03, +193.744,-85.123,5.46,1.02, +192.582,-48.46,6.24,0.05, +192.741,-52.787,5.73,0.13, +192.573,22.863,6.43,1, +192.672,-33.999,4.91,-0.04, +192.545,37.517,5.89,0.15, +192.824,-60.33,5.72,0.38, +192.845,-10.338,6.41,1.02, +192.904,3.057,6.02,1.29, +192.987,-39.681,5.98,-0.1, +193.022,-48.094,6.33,0.03, +192.991,-26.738,6.15,0.23, +193.103,-53.829,6.24,1.13, +192.925,27.541,4.94,0.67, +193.051,17.074,6.32,1.59, +193.266,-54.952,5.93,1.31, +193.115,16.122,6.3,0.16, +193.341,-60.329,5.76,0.33, +193.279,-48.943,4.33,1.37, +193.359,-40.179,4.27,0.21, +193.455,-60.377,5.9,0.2, +193.297,-3.553,6.11,0.5, +192.278,83.418,5.85,-0.06, +192.307,83.413,5.28,-0.03, +193.324,21.245,4.9,0.9, +193.592,-58.431,6.58,0.76, +193.409,-4.224,6.44,1.1, +193.663,-59.147,4.62,-0.15, +193.648,-57.178,4.03,-0.17, +193.653,-57.168,5.17,-0.12, +193.457,12.419,6.25,0.27, +193.578,-11.649,6,0.08, +193.588,-9.539,4.79,1.6, +193.744,-44.152,5.89,0.64, +193.555,33.534,6.26,0.2, +193.507,55.96,1.77,-0.02, +193.831,-42.916,5.47,1.68, +194.131,-72.185,5.93,1.13, +193.987,-56.836,5.32,0.01, +193.735,47.197,5.84,1.55, +193.901,3.398,3.38,1.58, +193.972,-15.327,6.17,0, +194.125,-26.46,6.62,0.68, +194.268,-51.199,5.16,-0.06, +194.002,38.315,5.6,0.34, +194.007,38.318,2.9,-0.12, +193.869,65.439,5.24,0.28, +194.073,54.099,5.82,0.19, +194.388,-22.754,6.31,1.07, +194.282,46.177,6.12,1.01, +194.731,17.409,4.78,1.56, +194.915,-3.812,5.79,0.18, +195.136,-33.505,6.02,0.38, +195.568,-71.549,3.62,1.18, +195.069,30.785,4.9,1.17, +195.15,-3.369,5.99,1.12, +195.162,18.373,6.2,0.42, +194.697,75.473,6.01,0.99, +194.98,66.597,5.32,1.29, +195.29,17.123,5.96,0.96, +195.772,-71.476,6.03,0.05, +195.183,56.366,4.93,0.36, +195.544,10.959,2.83,0.94, +195.888,-49.527,4.85,0.02, +195.445,63.61,6,0.41, +195.942,-20.583,5.58,0.56, +195.668,59.716,6.53,0.05, +195.977,-3.663,6.59,0.29, +196.2,-41.197,6.26,1.68, +196.378,-52.115,6.43,1.7, +196.57,-48.464,4.71,-0.14, +196.646,-41.589,5.59,1.05, +196.728,-49.906,4.27,-0.19, +196.435,35.799,5.25,-0.08, +196.851,-59.861,5.99,0.48, +196.468,45.269,5.63,1.13, +196.588,21.153,5.99,0.39, +196.726,-35.862,6.54,-0.02, +196.543,29.029,6.54,0.05, +196.594,22.616,5.6,1.59, +196.207,73.025,6.31,null, +196.91,-53.46,5.71,-0.07, +197.029,-65.306,5.51,-0.02, +196.595,62.042,6.14,0.99, +196.795,27.625,4.8,1.48, +196.974,-10.74,5.19,1.14, +196.973,27.556,6.19,1.36, +197.135,-8.984,5.55,1.18, +197.264,-23.118,4.95,1.05, +197.31,-9.538,6.32,1.02, +197.302,10.022,5.78,1, +197.439,-10.329,5.94,1.49, +197.449,16.849,5.91,1.45, +197.488,-5.539,4.38,-0.01, +197.411,37.423,6.02,1.15, +197.743,-52.567,6.06,-0.09, +197.965,-69.942,5.91,0.42, +197.425,38.534,6.28,-0.12, +197.497,17.529,5.22,0.45, +197.497,17.529,5.22,null, +197.787,-42.233,5.79,0.52, +197.513,38.499,5.91,0.29, +197.971,-63.303,6.33,0.44, +197.847,-43.369,5.25,1.05, +197.459,62.229,6.54,-0.02, +198.073,-59.921,4.6,-0.08, +198.572,-78.447,5.85,1.07, +198.204,-66.227,5.9,0.06, +197.913,-26.552,6.5,0.19, +198.013,-37.803,4.85,0.7, +198.233,-59.817,6.16,0.6, +198.015,-16.199,5.04,0.46, +198.212,-42.7,6.22,1.06, +197.968,27.878,4.26,0.57, +198.035,24.258,6.33,0.98, +198.348,-50.7,5.89,-0.02, +198.137,11.556,5.77,1.51, +198.15,18.752,6.53,0.88, +198.55,-58.684,5.89,1.08, +198.562,-59.103,4.92,0.48, +198.362,-18.827,6.28,0.09, +198.49,-43.139,6.16,1.38, +198.302,18.727,6.11,1.2, +198.812,-67.894,4.8,-0.08, +198.857,-69.68,6.37,1.21, +198.545,-19.931,5.33,0.87, +198.68,-48.957,5.89,1.06, +198.429,40.153,4.92,1.06, +198.63,11.332,5.67,1.5, +198.79,-36.371,6.19,0.97, +199.187,-65.138,6.07,0.44, +198.995,-19.943,5.22,1.03, +199.304,-66.784,4.87,1.5, +198.383,72.799,6.59,0.08, +198.883,40.855,5.79,0.19, +199.106,-1.391,6.68,0.31, +199.221,-31.506,5.1,0.96, +199.06,19.052,6.45,0.98, +199.308,-43.979,5.84,0.2, +198.106,80.471,6.25,0.94, +199.135,19.785,6.45,0.25, +199.194,9.424,5.22,0.59, +199.829,-72.036,6.04,1.35, +199.315,13.676,5.33,1.31, +199.375,-0.677,6.37,0.26, +199.401,5.47,4.8,1.67, +199.644,-51.286,6.19,0.01, +199.385,40.573,4.73,0.3, +199.119,68.408,6.2,-0.06, +199.601,-18.311,4.74,0.71, +199.73,-23.172,3,0.92, +199.713,3.688,6.62,0.06, +199.616,34.098,5.82,1.35, +199.56,49.682,5.15,-0.07, +200.145,-59.773,6.18,0.43, +199.767,35.128,6.02,0.24, +200.158,-52.748,5.48,-0.13, +200.201,-55.801,6.02,0.29, +200.149,-36.712,2.75,0.04, +200.24,-46.881,5.77,1.12, +200.719,-72.147,6.05,0.09, +200.173,2.942,6.26,0.1, +200.079,40.151,5.6,1.2, +200.375,-19.489,6.21,0.09, +200.649,-60.972,6.18,0.01, +200.658,-60.988,4.53,-0.13, +200.568,-52.183,5.83,0.12, +200.423,2.087,5.69,0.06, +200.72,-47.943,6.16,0.18, +200.761,-48.563,6.38,-0.07, +200.54,5.155,5.87,0.12, +201.002,-64.536,4.53,0.85, +201.28,-74.888,5.05,1.11, +200.786,-33.19,6.22,1.65, +200.755,-17.735,5.37,0.99, +200.516,43.903,6.35,0.24, +200.968,-49.823,6.48,0.96, +200.829,-4.924,5.89,1.43, +201.308,-64.485,5.31,0.4, +201.459,-70.627,5.67,-0.03, +201.138,-5.164,5.75,0.42, +201.826,-74.692,6.63,-0.06, +200.975,37.034,6.07,1.68, +201.127,12.432,6.44,1.06, +200.981,54.925,2.27,0.02, +200.985,54.922,3.95,0.13, +201.298,-11.161,0.98,-0.23, +201.278,23.854,5.78,0.06, +201.533,-39.755,5.09,1.2, +201.548,-1.193,5.97,0.19, +201.734,-41.498,5.69,1.47, +201.776,-49.144,6.31,null, +201.306,54.988,4.01,0.16, +201.837,-49.381,6.28,-0.12, +201.68,-12.708,5.25,1.52, +201.811,-40.163,6.4,0.98, +202.193,-69.628,6.2,0.02, +201.569,46.028,5.88,0.97, +201.863,-15.974,4.76,1.09, +202.282,-64.676,6.11,0.11, +201.5,63.261,6.5,0.74, +202.355,-51.165,5.06,0.07, +202.108,13.779,4.98,0.71, +201.534,72.391,5.79,1.63, +201.769,64.736,6.66,0.37, +201.795,64.719,7.04,0.39, +201.998,52.746,6.34,0.23, +202.109,40.73,6.47,0.92, +202.312,-1.364,6.43,1.11, +202.049,50.587,6.8,null, +202.428,-23.281,4.97,1.6, +202.304,10.818,5.65,1.05, +203.312,-77.568,6.48,0.48, +202.19,50.718,6.43,0.37, +205.231,-85.786,5.58,0.18, +202.113,59.946,5.4,-0.01, +202.5,7.179,6.17,1.47, +202.49,6.013,6.51,0.96, +202.607,-6.47,6.09,0.33, +202.761,-39.407,3.88,1.17, +202.889,-28.113,6.47,0.1, +201.736,78.644,5.77,0.77, +203.022,-38.399,6.16,1.04, +203.399,-65.632,6.37,-0.02, +203.012,-18.729,6.01,0.18, +202.991,-6.256,4.69,1.62, +202.816,42.106,6.08,1.05, +203.15,-28.693,5.69,0.04, +203.144,-29.565,6.45,0.44, +203.215,-15.363,5.55,1.23, +203.242,-10.165,5.21,0.96, +203.253,-7.195,6.68,1.28, +203.2,24.346,6.11,0.96, +203.62,-48.272,6.33,-0.05, +203.682,-33.311,6.44,1.26, +203.533,3.659,4.94,0.03, +203.669,-13.214,5.91,0.02, +203.673,-0.596,3.37,0.11, +203.591,38.789,6.37,0.21, +203.53,55.349,5.6,-0.03, +203.699,37.183,4.98,0.4, +203.88,-5.396,5.73,0.95, +203.614,49.016,4.7,0.12, +204.301,-61.692,5.63,0.5, +203.889,10.205,6.49,1.03, +204.8,-75.684,6.34,0.01, +203.809,44.197,6.84,0.2, +204.21,-34.468,6.5,1.03, +204.275,-44.143,5.98,0.94, +204.69,-70.445,6.1,1.42, +204.202,-26.495,5.78,0.22, +204.349,-46.428,5.9,-0.12, +204.532,-58.415,6.42,1.12, +204.246,24.613,5.74,1.55, +204.705,-57.623,6.01,1.14, +205.003,-70.788,6.59,1.3, +204.166,49.487,6.49,null, +204.365,36.295,4.82,0.23, +204.675,-29.561,5.83,0.4, +204.533,14.302,6.52,0.25, +205.045,-64.577,5.79,0.39, +203.678,76.547,6.57,null, +204.972,-53.466,2.3,-0.22, +204.429,50.715,6.48,1.55, +204.999,-49.95,6,1.5, +204.92,-39.748,6.27,1.66, +204.953,-40.052,5.6,1.3, +204.76,18.265,6.48,1.2, +204.894,10.746,5.57,0.33, +204.296,71.242,5.5,1.2, +205.505,-58.787,5.38,-0.03, +205.436,-54.56,5.01,-0.05, +204.877,52.921,5.46,0.1, +205.065,31.012,6.21,0.96, +205.169,19.956,5.75,0.01, +205.163,28.065,6.23,1.28, +205.379,-23.45,6.59,0.06, +205.44,-33.597,6.05,1.44, +205.097,50.519,6.32,0.54, +205.26,22.496,5.62,1.01, +205.403,-8.703,5.01,1.63, +205.734,-56.768,6,-0.08, +205.728,-50.791,6.41,1.67, +205.089,57.208,6.29,0.1, +205.185,54.682,4.66,1.64, +205.729,-41.401,5.98,1.02, +205.553,8.388,6.16,0.42, +205.917,-42.067,5.98,-0.08, +206.066,-51.013,6.47,-0.13, +205.765,3.538,5.36,1.11, +205.62,41.674,6.3,0.86, +205.681,34.989,5.98,0.85, +205.375,64.822,5.85,0.07, +205.976,-5.499,6.51,0.05, +205.938,22.7,6.13,1.42, +206.124,-16.179,5.6,0.81, +206.19,-25.501,6.21,1.38, +206.404,-26.116,5.81,0.02, +206.422,-33.044,4.23,0.38, +205.978,52.064,6.02,0, +206.396,-15.767,6.19,0.05, +206.795,-62.59,6.51,1.98, +206.664,-51.433,4.65,0.96, +206.485,-12.427,5.51,0.9, +206.735,-36.252,5.15,-0.02, +206.865,-50.249,5.91,0.29, +206.91,-50.321,5.45,1.36, +206.305,55.879,6.5,0.47, +206.806,-9.709,6.05,1.42, +206.556,41.089,5.87,0.21, +206.579,38.504,5.94,0.94, +206.856,-17.86,5.43,1.62, +206.68,25.702,5.95,0.49, +206.738,6.351,6.33,0.63, +205.664,78.064,5.91,1.01, +206.815,17.457,4.5,0.48, +206.749,38.543,5.5,1.03, +206.649,54.433,5.7,-0.08, +208.911,-82.666,5.95,1.46, +207.23,-35.704,6.53,0.57, +207.376,-41.688,3.41,-0.22, +206.885,49.313,1.86,-0.19, +207.361,-34.451,4.19,1.5, +207.404,-42.474,3.04,-0.17, +207.948,-69.401,5.75,1.73, +207.161,31.19,5.62,1.01, +207.468,-18.134,4.97,1.06, +207.527,-29.081,6.18,-0.03, +207.581,-39.901,6.44,0.99, +207.238,39.543,7.4,null, +207.369,15.798,4.07,1.52, +207.428,21.264,4.91,1.43, +207.644,-19.897,6.53,0.51, +205.596,82.753,5.98,1.01, +207.438,36.633,6.38,null, +207.603,5.497,6.01,0.9, +207.947,-46.899,5.77,-0.16, +208.02,-52.812,5.25,-0.09, +207.903,-36.433,6.35,0.48, +207.835,-24.391,6.45,0.69, +207.957,-32.994,4.56,-0.13, +207.959,-32.995,6.06,-0.04, +208.004,-31.619,6.12,0.48, +207.44,61.489,5.96,0.96, +207.769,34.773,6.65,0.12, +207.788,34.664,5.87,1.62, +207.615,58.539,6.46,0.09, +208.43,-53.374,5.89,0.01, +208.704,-67.652,5.71,1.49, +207.948,34.444,4.74,1.66, +208.077,12.165,6.04,0.04, +208.302,-31.928,4.73,-0.14, +208.387,-35.664,5.54,0.44, +208.487,-47.128,6.1,-0.07, +208.468,-35.314,6.19,1.02, +208.304,17.933,5.7,0.84, +207.858,64.723,4.65,1.58, +207.747,68.315,6.4,1.17, +208.569,-28.57,6.04,1.13, +208.293,28.648,5.9,0.2, +208.801,-52.161,5.71,-0.08, +208.885,-47.288,2.55,-0.22, +208.675,-1.503,5.15,1.08, +208.743,-8.059,6.19,0.53, +209.083,-54.132,6.14,0.07, +208.671,18.398,2.68,0.58, +209.138,-54.704,6,0.78, +208.935,-31.285,6.51,0.9, +208.462,53.729,5.7,-0.05, +209.081,-46.592,5.83,1.14, +210.137,-78.59,6.09,0.03, +209.412,-63.687,4.71,1.11, +209.63,-65.801,6.2,1.05, +208.958,14.056,6.16,0.5, +209.116,1.051,5.91,0.2, +209.044,32.033,6.32,0.37, +209.365,-23.023,6.14,1.43, +209.142,27.492,5.01,1.42, +209.568,-42.101,3.83,-0.21, +209.67,-44.804,3.87,-0.2, +209.63,-24.972,5.15,-0.1, +209.822,-50.37,5.91,0.96, +210.072,-61.481,6.49,0.33, +210.218,-66.269,5.97,0.35, +209.666,14.649,6,1.44, +209.662,21.696,5.76,-0.03, +209.384,61.493,6.37,null, +210,-25.01,5.77,0.48, +209.955,-3.55,6.4,0.49, +210.329,-40.222,6.13,1.25, +210.431,-45.604,4.34,0.6, +211.333,-76.797,5.5,1.55, +210.335,8.895,5.99,0.09, +210.294,27.387,6.23,0.17, +210.412,1.544,4.26,0.1, +210.595,-27.43,5.48,1.34, +210.859,-56.214,5.92,1.22, +210.956,-60.373,0.61,-0.23, +210.757,-31.684,6.18,0.48, +210.865,-41.423,6.11,-0.11, +210.633,9.686,6.2,0.9, +210.551,45.754,6.27,1.32, +210.971,-22.422,6.3,0.45, +210.885,10.787,6.3,0.74, +210.903,7.546,6.26,0.94, +210.983,4.901,6.24,0.39, +211.061,-5.381,6.39,1.32, +211.113,-14.972,6.28,1.08, +211.444,-54.669,6.17,0.23, +212.113,-74.85,6.02,0.58, +210.749,50.972,6.15,0.01, +211.605,-59.716,6.42,0.12, +210.461,68.679,6.34,1.4, +211.156,2.298,6.28,1.02, +211.308,-16.336,6.56,0.1, +211.512,-41.18,4.36,-0.19, +211.545,-43.092,6.2,0.98, +211.593,-26.682,3.27,1.12, +211.671,-36.37,2.06,1.01, +212.06,-63.208,6.4,1.02, +211.678,-9.313,5.46,0.34, +211.097,64.376,3.65,-0.05, +212.235,-59.277,6.34,0.05, +212.629,-70.306,6.05,1.74, +212.216,-43.471,6.17,-0.06, +212.758,-69.72,6.06,0.18, +212.396,-51.505,6,-0.06, +212.478,-53.439,4.75,0.94, +212.253,-10.334,6.47,1, +211.983,43.854,5.27,1.59, +212.072,49.458,5.25,1.65, +212.71,-16.302,4.91,1.72, +212.192,59.338,6.46,1.02, +214.558,-81.008,4.91,0.25, +212.6,25.092,4.83,0.54, +211.735,74.594,6.45,0.14, +214.229,-77.664,6.47,1.42, +212.88,1.362,6.43,0.48, +213.318,-53.666,5.56,1.44, +213.102,-24.364,6.34,1.35, +212.813,32.296,6.11,1.26, +213.416,-54.626,6.11,0.05, +213.192,-27.261,5.08,1.16, +213.066,2.409,5.01,-0.12, +213.305,-26.612,6.24,1.08, +213.224,-10.274,4.19,1.33, +213.737,-57.086,5.07,-0.08, +213.42,-0.846,5.91,0.47, +213.677,-41.838,5.61,0.93, +213.838,-53.51,6.39,1.57, +214.161,-66.588,5.75,-0.06, +212.212,77.548,4.82,1.36, +213.589,-5.948,6.36,0.6, +213.522,12.959,5.54,0.54, +213.755,-29.282,6.08,null, +213.912,-45.001,6.31,0.6, +214.143,-59.914,6.39,2.04, +216.097,-82.849,6.42,0.02, +213.365,51.788,6.69,0.39, +213.371,51.79,4.54,0.2, +213.712,10.101,5.29,1, +213.721,3.336,6.45,1.6, +213.85,-18.201,5.43,-0.03, +213.671,21.873,6.39,0.18, +213.017,69.433,5.24,1.58, +213.598,41.519,6.24,1.04, +215.595,-80.109,5.06,-0.1, +214.076,-33.241,6.55,0.3, +214.004,-6.001,4.08,0.52, +216.729,-83.668,4.32,1.31, +213.915,19.183,-0.04,1.23, +214.09,-6.622,6.44,0.28, +214.125,-3.196,6.15,-0.01, +214.018,18.912,5.98,0.26, +214.266,-18.585,6.22,0.98, +213.82,52.536,6.58,0.1, +214.137,20.121,6.25,0.49, +214.101,39.745,6.38,0.36, +214.599,-33.221,6.54,0.27, +214.965,-61.273,5.23,0.29, +214.041,51.367,4.75,0.2, +214.096,46.088,4.18,0.08, +214.368,15.263,5.8,1.71, +214.503,-7.542,6.47,0.73, +214.851,-46.058,3.55,-0.18, +214.66,-18.716,5.9,0, +214.753,-25.816,5.87,0.5, +214.85,-37.004,5.94,0.08, +215.081,-56.387,4.33,0.12, +214.778,-13.371,4.52,0.13, +214.338,51.307,6.2,0.04, +214.499,35.509,4.81,1.06, +215.04,-43.059,5.56,0.92, +214.455,48.002,6.32,0.44, +215.177,-45.187,4.77,0.31, +214.818,13.004,5.41,0.38, +214.885,-2.266,5.14,1.02, +215.139,-37.885,4.05,-0.03, +214.92,0.384,6.19,0.2, +214.732,38.768,6.86,1.06, +214.938,16.307,4.86,1.23, +215.654,-58.459,4.92,0.86, +214.733,54.864,6.53,null, +214.949,38.794,6.33,0.05, +215.036,30.429,6.44,0.15, +215.661,-48.32,6.09,-0.13, +215.582,-34.787,5.56,-0.09, +215.835,-50.772,6.02,1.36, +215.759,-39.512,4.42,-0.18, +216.276,-68.195,5.61,0.49, +215.952,-53.177,6,1.1, +215.774,-27.754,4.77,1.31, +216.415,-66.173,6.36,0.13, +215.857,-11.714,6.21,0.99, +215.814,1.242,6.27,0.63, +215.844,8.445,6.86,0.43, +215.845,8.447,5.12,-0.02, +215.778,25.338,6.22,0.37, +216.004,8.244,5.95,0.06, +217.403,-76.729,6.07,1.18, +216.203,-24.806,5.32,0.96, +216.78,-65.822,5.85,1.5, +216.047,5.82,5.1,0.12, +216.17,-11.67,6.49,0.42, +216.076,8.085,6.19,1.2, +216.534,-45.221,4.56,-0.15, +216.545,-45.379,4.35,0.43, +216.374,-19.97,6.61,0.14, +216.556,-42.319,6.32,1.19, +216.449,-26.853,6.48,0.94, +216.708,-39.874,6.35,-0.08, +216.801,-46.134,5.83,0.31, +216.372,38.393,6.27,1.23, +217.181,-59.198,6.45,0.14, +216.299,51.851,4.05,0.5, +216.614,19.227,5.39,0.23, +216.852,-6.12,6.17,0.09, +217.043,-29.492,4.97,-0.07, +217.819,-67.717,5.83,1, +217.05,-2.228,4.81,0.7, +217.174,-6.901,5.42,1.49, +216.864,41.025,6.63,0.37, +217.536,-45.322,5.5,-0.08, +217.587,-49.519,5.37,0.05, +217.131,28.289,7.62,-0.01, +217.139,28.291,7.12,-0.03, +217.068,36.197,6.1,null, +217.735,-40.845,6.39,1.44, +217.46,0.829,5.94,0.16, +217.795,-38.87,5.97,1.06, +217.158,49.845,5.59,0.85, +218.137,-56.888,6.93,0.91, +217.457,31.791,6.06,-0.03, +217.403,41.796,6.35,0.7, +217.689,4.772,6.02,1.42, +218.154,-50.457,4.42,-0.19, +218.385,-54.998,5.87,0.48, +218.375,-52.68,5.87,1.09, +218.29,-30.714,6.09,1.03, +217.958,30.371,3.58,1.3, +216.881,75.696,4.25,1.44, +218.533,-42.1,6.6,0.06, +218.822,-60.016,6.4,1.26, +218.084,26.677,6.01,0.22, +218.135,22.26,5.92,0.35, +218.02,38.308,3.03,0.19, +217.692,63.186,6.09,0.41, +217.928,60.226,6.27,0.24, +218.711,-20.439,6.5,0.14, +218.881,-41.517,5.87,-0.08, +218.877,-42.158,2.31,-0.19, +218.335,36.959,6.43,null, +218.129,55.398,5.76,1.5, +219.443,-67.932,6.04,0.5, +219.079,-46.245,5.55,1.48, +218.549,32.534,6.33,0.4, +219.101,-39.597,6.13,1.05, +218.67,29.745,4.46,0.36, +218.66,36.626,6.03,1.38, +219.184,-40.212,5.74,-0.12, +219.334,-46.134,5.41,1.01, +218.566,57.065,6.48,0.49, +218.665,49.368,5.74,1.56, +219.472,-49.426,4.05,-0.15, +219.029,23.25,6.38,1.06, +219.249,-12.305,6.2,0.46, +219.582,-38.794,6.02,1.43, +219.796,-46.584,6.07,0.51, +219.853,-49.056,6.39,0.44, +219.9,-60.835,-0.01,0.71, +219.9,-60.836,1.33,0.88, +220.137,-56.441,6.3,1.18, +219.558,18.298,5.91,1.1, +220.627,-64.975,3.19,0.24, +219.552,43.642,5.7,1.48, +220.482,-58.616,6.22,0.45, +220.256,-36.135,5.67,-0.08, +219.563,54.023,5.85,-0.01, +219.709,44.404,5.39,0, +220.483,-47.388,2.3,-0.2, +221.965,-79.045,3.83,1.43, +220.49,-37.794,4,-0.17, +220.091,21.976,6.1,0.4, +220.177,13.534,5.91,0.21, +220.463,-30.933,6.37,-0.09, +220.182,16.418,4.94,-0.03, +220.183,16.418,5.88,0.24, +220.287,13.728,4.83,null, +220.287,13.728,4.43,0.05, +218.41,79.66,6.26,1.3, +220.412,8.162,4.86,1, +220.431,11.661,5.56,0.94, +221.322,-62.876,5.36,0.29, +220.476,21.124,6.38,null, +220.807,-24.998,5.73,-0.01, +220.914,-35.174,4.05,1.35, +221.231,-58.478,6.11,1.02, +220.765,-5.658,3.88,0.38, +221.295,-55.602,6.1,-0.06, +221.247,-35.192,4.92,0.01, +220.856,26.528,4.81,1.66, +232.08,-88.133,6.48,0.3, +220.513,61.262,6.25,0.41, +220.935,40.459,5.73,1.39, +221.621,-47.441,5.74,0.07, +221.755,-52.384,5.21,0.98, +221.299,-1.418,6.07,1.61, +221.5,-25.443,4.94,0.35, +221.801,-52.206,6.07,0.09, +221.528,-23.153,5.81,0.98, +222.185,-66.594,5.91,-0.07, +221.376,0.717,5.69,-0.03, +221.31,16.964,4.6,0.98, +221.491,-15.46,6.33,1.19, +221.545,-21.176,6.4,0.58, +221.247,27.075,5.12,null, +221.247,27.074,2.7,0.97, +221.336,18.885,6.13,0.83, +221.771,-38.291,5.94,1.33, +221.884,-43.557,6.3,1.08, +221.307,32.788,6.28,1.58, +221.562,1.893,3.72,-0.01, +221.525,15.132,5.63,1.57, +221.807,-21.325,6.06,1.65, +221.844,-25.624,5.63,null, +222.279,-56.668,6.23,1.13, +221.937,-26.087,5.24,0.94, +221.99,-26.646,5.77,-0.02, +221.979,-12.84,6.35,1.1, +222.159,-36.635,6.04,1.54, +223.307,-73.19,5.6,0.82, +222.328,-24.252,5.68,1.3, +222.225,-0.848,6.14,-0.04, +222.33,-14.149,5.31,0.07, +222.097,24.367,6.14,0.48, +225.462,-83.228,5.65,0.95, +222.572,-27.96,4.41,1.4, +223.146,-63.81,5.87,0.72, +222.91,-43.576,4.32,-0.15, +222.278,37.811,6.16,0.36, +222.672,-15.997,5.15,0.41, +222.72,-16.042,2.75,0.15, +222.493,28.616,5.8,0.05, +222.328,46.116,5.74,0.48, +222.566,23.912,5.85,0.56, +222.754,-2.299,4.94,0.98, +222.75,-0.257,6.18,1.4, +222.385,51.375,6.51,0.4, +222.422,48.721,5.69,0.47, +223.677,-65.991,6.09,-0.06, +224.47,-76.663,5.34,1.45, +222.623,37.272,5.48,1.02, +223.138,-30.577,6.29,0.6, +223.213,-37.803,5.03,-0.16, +222.847,19.101,4.55,0.76, +226.195,-83.038,5.65,1.3, +223.894,-60.114,5.2,1.16, +225.049,-77.16,5.93,1.05, +223.584,-24.642,5.3,1.32, +223.658,-33.301,5.82,1.42, +223.347,15.704,6.4,0.57, +224.183,-62.781,5.11,0, +222.86,59.294,5.46,1.36, +223.349,19.153,6.01,0.83, +223.595,-11.898,5.8,0.97, +224.983,-75.032,6.2,-0.04, +224.072,-52.81,5.38,0.13, +227.785,-84.787,5.91,-0.06, +223.936,-33.856,5.32,0.04, +224.133,-47.879,5.64,-0.04, +224.256,-51.447,6.64,1.7, +224.149,-39.416,6.36,0.06, +224.129,-32.637,6.06,1.41, +222.676,74.156,2.08,1.47, +224.192,-11.41,5.46,1.49, +224.307,-29.158,6.29,-0.04, +224.537,-48.863,6.35,0.71, +224.055,14.446,5.77,-0.06, +224.367,-21.416,5.74,1.11, +223.995,32.3,6.12,0.1, +224.296,-4.346,4.49,0.32, +224.633,-43.134,2.68,-0.22, +224.653,-39.907,6.15,1.23, +224.389,-0.167,5.53,1.13, +224.265,21.555,6.49,-0.01, +224.299,16.388,5.71,0.94, +224.79,-42.104,3.13,-0.2, +224.663,-27.657,5.65,0.24, +224.556,-11.155,6.6,0.01, +224.808,-37.881,6.47,-0.08, +224.863,-43.16,6.1,0.6, +224.096,49.629,5.63,0.5, +224.723,-11.144,5.87,1.26, +224.72,-4.989,6.09,0.5, +224.846,4.568,5.93,1.6, +225.304,-38.058,5.89,1.24, +225.243,-8.519,4.92,0, +225.492,-34.359,6.22,0.24, +224.904,39.265,5.64,0.31, +224.396,65.933,4.6,1.59, +225.333,-2.755,5.52,1.68, +225.527,-28.061,5.85,0.16, +225.218,22.046,6.38,null, +226.201,-64.032,5.17,0.93, +225.454,-0.141,5.71,1.52, +225.747,-32.643,5.44,-0.12, +222.585,82.512,5.64,0.68, +225.161,47.278,6.37,-0.14, +226.786,-71.905,6.52,1.59, +225.687,-3.031,6.61,0.2, +225.527,25.008,4.81,1.5, +225.725,2.091,4.4,1.04, +225.487,40.391,3.5,0.97, +226.017,-25.282,3.29,1.7, +226.179,-40.861,6.41,1.46, +226.28,-47.051,4.72,-0.14, +226.28,-47.051,4.82,null, +226.33,-41.067,5.15,1.01, +225.363,60.204,5.93,0.09, +225.775,35.206,5.51,1.02, +226.027,5.493,6.5,0.31, +226.987,-65.276,6.17,1.47, +225.778,44.644,6.65,0.46, +225.902,34.566,6.59,1.02, +226.449,-25.79,6.67,-0.01, +226.558,-36.264,6.27,1.65, +226.111,26.948,4.54,1.24, +226.858,-49.088,5.77,0.92, +225.948,47.654,4.76,0.65, +226.639,-30.919,5.96,-0.08, +226.613,-22.032,6.17,1.05, +227.375,-67.084,5.76,0.69, +226.657,-16.257,5.2,1.58, +227.356,-63.643,6.28,0.06, +227.05,-40.584,5.79,-0.14, +227.163,-42.868,5.85,-0.11, +227.211,-45.28,4.05,-0.18, +226.358,48.151,5.57,0, +228.141,-72.77,6.01,0, +225.991,65.92,6.13,null, +226.646,36.456,6.35,0.52, +226.918,5.498,6.16,0.94, +227.686,-61.422,6.3,0.63, +226.835,18.442,6.02,0.06, +226.825,24.869,4.93,0.43, +226.57,54.556,5.25,0.96, +227.531,-38.792,5.98,null, +227.817,-55.346,5.54,1.14, +227.099,26.301,5.67,1.24, +227.223,13.235,6.1,0.96, +227.148,25.109,5.81,1.24, +227.578,-26.333,5.76,1.05, +227.895,-45.277,6.44,1.04, +227.883,-45.279,7.39,1.08, +228.58,-70.079,5.81,3.38, +228.254,-61.744,6.32,1.9, +227.984,-48.738,3.87,-0.05, +227.99,-48.744,5.69,0.14, +227.081,50.055,6.39,1.03, +228.071,-52.099,3.41,0.92, +228.13,-48.219,6.33,1.12, +228.206,-44.501,4.82,-0.17, +228.055,-19.792,4.54,-0.08, +228.281,-36.091,6.1,-0.08, +228.018,18.976,5.89,1.53, +228.323,-24.008,6.47,-0.04, +228.33,-19.647,6.08,0.12, +228.37,-25.309,6.45,0.7, +228.472,-26.194,5.84,1.14, +228.181,19.286,6.68,0.68, +228.655,-31.519,4.91,0.37, +229.152,-60.904,5.73,-0.08, +228.64,-17.769,6.17,-0.05, +228.974,-48.074,5.95,0.21, +229.236,-60.957,5.09,-0.06, +228.383,22.983,6.3,0.06, +229.412,-63.611,4.86,1.25, +229.017,-41.491,5.16,0.58, +229.044,-43.485,6.04,-0.14, +228.711,-5.503,6.28,1.47, +229.378,-58.801,4.07,0.09, +229.728,-68.679,2.89,0, +227.684,67.781,6.17,null, +228.398,38.265,6.2,1.2, +228.525,31.788,5.99,1.52, +228.798,4.939,5.33,1.09, +228.622,29.164,5.26,0.03, +228.543,42.171,6.13,1.66, +229.096,-22.399,5.5,1.38, +228.955,0.372,5.63,0.18, +229.704,-60.496,5.46,-0.1, +228.876,33.315,3.47,0.95, +229.539,-41.061,6.28,0.18, +229.633,-47.875,4.27,-0.08, +230.17,-67.481,6.28,-0.09, +229.252,-9.383,2.61,-0.11, +229.458,-30.149,4.34,1.1, +229.735,-40.788,5.59,-0.1, +229.672,-31.209,6.18,1.23, +229.882,-37.097,6.2,0.96, +229.609,-0.461,5.89,1.51, +228.66,67.347,5.13,0.53, +229.602,20.573,5.7,0.97, +228.716,68.945,6.51,null, +229.828,1.765,5.06,0.54, +230.343,-40.647,3.22,-0.22, +230.397,-40.75,6.2,0.07, +230.375,-38.219,6.48,-0.06, +230.535,-47.928,5,0.5, +230.451,-48.318,5.65,0.65, +230.793,-60.657,5.67,0.48, +230.224,-18.159,6.17,1.02, +229.876,32.515,6.32,0.24, +230.256,-15.548,6.3,0.41, +230.845,-59.321,4.51,0.19, +230.452,-36.261,3.56,1.54, +230.196,-2.413,6.35,1.06, +230.282,-5.825,5.54,1.04, +230.67,-44.689,3.37,-0.18, +230.035,29.616,5.51,1.02, +230.258,0.715,5.35,1.19, +230.279,24.958,6.39,1.23, +230.789,-36.859,4.54,-0.15, +231.561,-68.309,5.89,1.02, +229.275,71.824,5.02,1.37, +230.022,51.959,5.66,0.11, +230.173,44.434,6.19,0.39, +230.597,12.567,6.28,-0.02, +230.453,32.934,5.37,-0.07, +231.187,-39.71,5.37,-0.11, +230.968,-12.369,5.72,1.04, +230.932,-1.022,6.12,0.25, +231.278,-38.169,7.03,0.09, +231.05,-10.322,4.94,0.44, +231.334,-38.734,4.6,0, +231.888,-64.531,5.71,1.64, +230.656,39.581,5.5,1.59, +230.801,30.288,5.58,0.58, +230.801,30.288,6.08,null, +235.82,-84.465,5.57,0.11, +232.878,-73.389,5.49,-0.12, +230.655,62.047,5.98,-0.03, +231.021,45.271,6.01,1.2, +231.123,37.377,4.31,0.31, +231.129,37.348,6.5,0.59, +230.182,71.834,3.05,0.05, +231.826,-36.768,5.45,-0.15, +230.66,63.341,5.79,1.27, +232.113,-51.598,6.1,1.09, +231.448,15.428,5.17,1.66, +231.472,19.481,6.27,0.6, +231.573,34.336,5.46,1.4, +232.351,-46.733,5.24,1.74, +232.064,-16.716,5.64,1.55, +231.233,58.966,3.29,1.16, +231.912,25.102,6.02,1.62, +232.159,1.842,5.17,0.23, +231.957,29.106,3.68,0.28, +231.635,54.02,6.45,0.05, +232.651,-20.728,6.22,0.17, +232.668,-16.609,5.82,1.06, +233.018,-38.623,6.25,0.2, +232.185,47.201,6.15,0.1, +232.96,-32.881,6.46,0.09, +231.92,62.276,6.5,0.14, +231.964,60.67,5.9,1.44, +232.931,-20.165,6.22,0.22, +234.826,-77.918,6.18,1.2, +232.731,8.579,6.57,0.37, +232.237,55.195,6.43,0.08, +232.595,31.286,6.46,0.19, +232.616,36.804,6.37,null, +233.153,-19.671,5.52,0.18, +232.733,40.833,5.02,1.59, +233.23,-16.853,5.5,-0.14, +233.288,-24.489,7,0.27, +234.073,-65.613,6.51,0.35, +233.507,-40.066,5.82,1.68, +232.338,62.1,6.38,null, +232.843,36.616,6.38,0.5, +233.04,16.056,6.22,-0.05, +234.18,-66.317,4.11,1.17, +233.241,-1.186,5.51,1.09, +233.587,-39.349,6.36,-0.03, +232.946,40.899,5.02,0.07, +233.655,-28.047,5.15,1.3, +233.785,-41.167,2.78,-0.2, +233.545,-10.064,4.62,1.01, +233.233,31.359,4.14,-0.13, +233.587,-5.695,6.51,0.58, +233.611,-9.183,5.17,-0.09, +233.972,-44.959,4.54,-0.18, +235.088,-73.447,5.65,-0.04, +233.47,17.138,6.45,null, +234.05,-44.397,5.43,1.5, +232.732,64.209,5.79,0.96, +235.478,-76.082,5.95,-0.04, +233.882,-14.789,3.91,1.01, +233.7,10.538,3.8,0.26, +233.7,10.539,3.8,0.26, +234.048,-33.093,6.24,null, +233.769,1.669,6.56,0.28, +235.048,-70.228,6.44,0.08, +233.672,26.715,2.23,-0.02, +234.256,-28.135,3.58,1.38, +233.888,17.656,6.12,0.94, +233.973,11.266,6.07,1.09, +234.513,-42.567,4.33,1.42, +234.706,-52.373,5.44,0, +234.14,-0.562,6.51,0.72, +233.813,39.01,5.11,1.64, +234.369,-26.28,6.19,0.01, +234.123,10.01,5.26,0.95, +234.985,-59.908,5.95,0.48, +234.122,16.119,5.93,0.29, +234.636,-39.161,6.57,-0.07, +234.45,-23.142,5.78,1.1, +234.676,-39.128,6.04,0.21, +233.955,38.374,6.42,null, +234.565,-28.207,6.32,1.17, +234.568,-21.016,5.84,1.08, +233.818,53.922,5.97,1.18, +234.664,-29.778,3.66,-0.17, +234.223,29.991,6.52,null, +234.727,-19.302,5.38,0.86, +234.667,-8.794,6.5,0.53, +234.667,-8.791,6.48,0.52, +234.017,52.07,6.74,0.32, +233.988,54.631,5.74,null, +234.839,-23.15,6.34,0.02, +234.942,-34.412,4.67,0.99, +235.243,-47.736,6.23,1.63, +235.064,-31.214,6.34,1.43, +234.457,40.353,5.24,0.88, +235.07,-23.818,4.96,1.33, +235.297,-44.661,4.64,0.4, +232.854,77.349,4.96,1.58, +234.704,34.675,6.11,1.02, +234.383,54.509,5.87,1.07, +232.296,80.449,6.58,0.67, +234.568,46.798,5.75,0.36, +235.043,12.053,6.25,0.94, +235.655,-49.489,6.04,1.31, +234.843,36.637,6,null, +234.845,36.636,5.07,-0.12, +234.643,50.423,5.84,0.83, +235.98,-60.287,6.48,1.05, +235.66,-37.425,5.24,0.98, +235.487,-19.679,4.74,1.57, +235.671,-34.711,4.75,-0.14, +235.247,16.025,6.01,0.9, +234.79,57.924,6.45,1.09, +235.388,19.67,4.52,0.04, +235.448,12.848,5.33,0.04, +234.413,69.283,5.62,1.35, +235.478,18.464,5.81,0.2, +236.094,-41.819,5.94,0, +235.854,-15.043,6.31,1.16, +236.018,-15.673,5.41,0.23, +235.686,26.296,3.84,0, +235.794,13.668,6.48,0.86, +236.973,-65.443,6.18,0.22, +236.974,-65.443,6.39,0.24, +236.008,2.515,5.88,0.68, +236.067,6.426,2.65,1.17, +235.997,32.516,5.56,1.06, +236.553,-28.062,6.51,0.32, +235.711,52.361,5.51,-0.07, +236.175,17.264,6.14,0, +236.348,5.447,5.58,0.04, +236.684,-34.682,5.61,-0.11, +236.415,0.891,6.33,1.19, +236.856,-40.194,6.42,0.88, +236.523,-1.804,5.4,-0.03, +236.871,-37.916,6.01,0.72, +237.21,-52.438,6.07,1.38, +236.689,-6.12,6.24,1.17, +236.547,15.422,3.67,0.06, +236.611,7.353,4.43,0.6, +237.529,-53.209,5.77,-0.08, +236.822,14.115,5.71,0.09, +237.49,-48.912,5.84,0.07, +237.568,-45.402,6.12,0.29, +237.778,-55.056,5.73,0.06, +237.055,13.789,6,1.25, +237.237,-3.819,5.53,0.12, +238.236,-65.152,6.54,0.19, +237.008,31.736,6.44,null, +236.645,55.475,5.92,1.39, +237.185,18.142,4.09,1.62, +237.143,28.157,5.85,0.77, +237.405,-3.43,3.53,-0.04, +237.881,-47.061,6.01,1.16, +237.74,-33.627,3.95,-0.04, +238.345,-62.607,6.19,1.47, +237.745,-25.751,4.64,-0.05, +236.667,62.599,5.19,0.04, +236.908,55.377,5.86,0.25, +237.573,2.196,5.23,1.02, +237.399,26.068,4.63,0.8, +238.215,-50.615,6.6,1.53, +238.873,-68.603,5.09,1.13, +237.704,4.478,3.71,0.15, +238.053,-29.887,6.4,0.98, +237.674,15.134,5.2,null, +237.815,-3.091,5.11,0.12, +237.91,-14.134,6.19,1, +238.785,-63.431,2.85,0.29, +238.719,-60.743,6.15,0.1, +237.816,20.978,4.76,1.54, +238.885,-60.178,5.77,0.35, +237.808,35.658,4.82,1, +238.334,-20.167,5.03,-0.01, +236.015,77.794,4.32,0.04, +238.403,-25.327,4.59,-0.07, +239.025,-60.483,5.76,0.06, +238.474,-24.533,5.39,-0.02, +238.483,-23.978,5.42,-0.04, +238.456,-16.729,4.15,1.02, +238.234,17.404,6.36,null, +238.625,-27.339,6.14,-0.07, +238.3,13.197,6.1,0.6, +238.665,-25.244,5.87,-0.06, +238.395,16.075,6.09,null, +238.169,42.452,4.62,0.56, +238.751,-19.383,5.94,-0.01, +238.877,-31.084,6.21,1.37, +238.875,-26.266,5.62,0.15, +239.027,-39.864,6.03,0.15, +238.668,8.58,6.29,0.18, +239.742,-65.038,5.75,-0.06, +239.266,-48.162,6.31,0.38, +238.069,55.827,5.81,0.96, +239.058,-31.786,6.29,0.43, +238.644,20.311,5.44,1.59, +239.223,-33.966,5.12,0.12, +239.226,-33.964,5.62,0.05, +239.06,-14.399,6.37,0.48, +239.221,-29.214,3.88,-0.2, +239.339,-36.185,5.8,1.01, +239.139,-14.829,6.13,0.23, +238.916,18.621,6.26,-0.11, +238.658,43.139,5.37,1.65, +239.113,15.662,3.85,0.48, +239.418,-20.983,5.85,0.02, +239.628,-37.503,6.31,1.01, +238.948,37.947,5.45,0.33, +239.975,-54.021,6.1,0, +238.878,42.566,5.75,-0.11, +240.295,-63.777,6.41,0.78, +239.311,14.414,5.54,1.14, +239.548,-14.279,4.88,-0.1, +239.645,-24.831,5.43,-0.09, +239.876,-41.744,4.99,1, +239.713,-26.114,2.89,-0.19, +239.992,-40.653,6.49,1.52, +240.277,-54.578,6.13,0.25, +239.397,26.878,4.15,1.23, +240.03,-38.397,3.41,-0.22, +238.957,58.912,6.31,-0.02, +239.375,39.695,6.31,1.07, +240.718,-62.542,6.25,-0.04, +240.224,-40.435,6.21,0.01, +240.083,-22.622,2.32,-0.12, +240.082,-16.533,5.47,0.52, +241.482,-72.401,5.7,1.17, +240.331,-31.889,6.33,1.45, +239.74,36.644,5.62,1.49, +239.876,25.92,2,0.1, +240.198,-8.411,5.55,0.05, +239.448,54.75,4.95,0.26, +240.883,-57.775,4.63,0.24, +240.804,-49.23,4.65,0.92, +240.213,4.428,5.83,1, +239.768,49.881,6.05,0.29, +240.664,-29.136,6.03,1.31, +240.31,17.818,5.12,0.99, +240.851,-38.602,4.89,-0.14, +240.261,33.304,5.41,0.6, +240.836,-25.865,5,1.22, +240.893,-32.001,6.01,0.47, +240.361,29.851,4.99,-0.07, +240.574,22.804,4.83,0.07, +240.978,-24.726,6.21,1.38, +241.074,-33.214,6.1,0.34, +241.153,-37.863,5.9,0.4, +240.94,4.987,6.08,0.96, +241.092,-11.373,5.07,null, +241.092,-11.373,4.77,0.47, +241.85,-56.191,6.16,0.58, +241.623,-45.173,4.72,0.23, +240.523,52.916,5.93,1.48, +240.7,46.037,4.76,-0.11, +240.831,36.632,5.83,0.56, +241.359,-19.806,2.62,-0.07, +241.36,-19.802,4.92,-0.02, +240.472,58.565,4.01,0.52, +241.648,-36.802,4.23,-0.17, +241.526,-23.606,5.92,-0.08, +241.435,-6.292,6.53,0.48, +241.499,-6.139,6.41,1.03, +241.818,-36.756,5.73,0.29, +241.408,8.096,6.29,0.08, +241.702,-20.669,3.96,-0.04, +242.328,-57.934,5.57,-0.04, +240.789,59.411,6.19,1.58, +241.764,-14.071,6.32,0.66, +241.851,-20.869,4.32,0.84, +241.966,-24.462,6.33,-0.06, +242.142,-39.105,7.05,0.36, +242.143,-39.093,6.65,-0.07, +242.032,-26.327,5.38,1.65, +241.902,-12.746,5.78,0.01, +242.182,-23.686,5.88,0.02, +241.906,9.892,5.63,0.2, +241.842,21.822,6.14,1.37, +242.382,-32.65,6.19,0.79, +242.469,-33.546,5.54,-0.1, +242.019,17.047,5,0.95, +242.02,17.054,6.25,1.14, +242.117,8.534,5.73,1.61, +242.245,3.454,5.91,1.47, +242.48,-18.341,6.47,0.44, +242.194,17.206,6.14,0, +242.297,6.379,5.97,1, +242.824,-41.12,5.86,0.27, +242.46,-3.467,5.37,1.45, +242.758,-29.416,5.13,1.12, +242.243,36.491,4.76,1.01, +243.344,-55.541,5.81,0.34, +245.087,-78.696,4.68,1.69, +245.112,-78.667,5.27,1.41, +243.32,-53.672,5.83,1.96, +242.193,44.935,4.26,-0.07, +243.37,-54.631,4.94,1.04, +241.582,67.81,5.44,-0.02, +242.994,-19.45,6.3,0.13, +242.999,-19.461,4.01,0.04, +243.076,-27.926,4.59,-0.16, +243.066,-28.417,5.67,0.01, +243.86,-63.686,3.85,1.11, +243,-10.064,4.94,0.09, +242.874,9.712,6.53,0.24, +243.03,-8.547,5.43,0.12, +240.88,76.794,5.56,null, +242.87,16.666,6.08,0.02, +242.262,57.938,6.33,null, +244.273,-67.941,5.75,0.15, +242.358,55.829,6.49,null, +242.908,23.495,5.7,1.56, +243.957,-57.912,5.63,0.14, +243.235,-4.221,6.25,0.13, +243.44,-24.422,6.41,0.04, +242.915,33.343,6.29,1.2, +243.593,-33.011,5.92,1.02, +243.814,-47.372,5.14,-0.13, +242.95,36.425,5.63,1.34, +243.314,5.021,5.48,1.47, +243.462,-11.837,5.22,1.42, +243.85,-42.9,6.14,1.11, +242.948,42.374,5.87,1.45, +243.62,-21.107,6.41,-0.01, +243.189,26.671,6.5,0.39, +243.663,-18.535,6.32,1.09, +243.723,-25.477,6.05,0.04, +244.18,-53.811,5.44,1.73, +243.586,-3.694,2.74,1.58, +243.556,5.902,6.31,1.15, +244.254,-50.068,4.99,0.8, +244.337,-53.087,6.33,0.27, +243.905,-8.369,5.5,0.65, +243.965,-14.849,6.09,0.06, +244.716,-57.9,6.49,1, +243.67,33.859,5.64,0.51, +243.67,33.858,6.66,null, +243.87,18.808,5.69,1.12, +244.245,-21.304,6.61,0.02, +244.23,-3.953,6.18,0.31, +243.948,27.422,6.14,1.31, +243.105,67.144,6.21,0.99, +244.575,-28.614,4.78,0.02, +244.824,-42.674,5.45,0.1, +244.96,-50.156,4.02,1.08, +245.105,-55.14,5.77,0.97, +244.187,29.15,5.78,0.07, +244.58,-4.692,3.24,0.96, +244.782,-20.218,6.29,1.08, +244.886,-30.907,5.49,0.47, +244.752,-14.872,5.94,1.52, +242.706,75.878,5.48,-0.11, +245.136,-39.431,6.12,-0.07, +245.159,-24.169,4.55,0.84, +243.134,75.211,6.39,null, +245.617,-49.572,5.33,-0.04, +245.297,-25.593,2.89,0.13, +245.62,-43.912,5.88,1.16, +244.314,59.755,5.4,1.63, +245.018,21.133,6.05,0.94, +243.64,73.395,5.98,0.08, +246.342,-63.125,6.15,0.03, +244.797,49.038,5.91,1.37, +244.98,39.709,5.46,0.4, +244.935,46.313,3.89,-0.15, +245.518,1.029,4.82,0.34, +246.005,-39.193,5.4,0.62, +245.48,19.153,3.75,0.27, +245.662,-2.08,6.23,0.07, +245.986,-33.199,6.47,0.01, +247.117,-70.084,4.91,0.55, +246.226,-45.349,6.33,0.19, +246.132,-37.566,5.42,-0.11, +244.539,68.554,6.41,null, +248.363,-78.897,3.89,0.91, +245.524,30.892,4.85,0.97, +246.026,-20.037,4.5,1.01, +246.165,-29.703,6.63,0.59, +246.165,-29.705,5.84,0.59, +245.589,33.799,5.2,1.6, +245.622,33.704,5.39,1.53, +246.989,-64.058,5.27,0.36, +245.735,32.333,6.4,0.08, +246.045,6.948,5.85,-0.01, +246.397,-23.447,5.02,0.24, +246.396,-23.446,5.92,null, +247.063,-58.6,5.69,0, +246.796,-47.555,4.47,-0.07, +244.376,75.755,4.95,0.37, +246.354,14.033,4.57,0, +246.756,-18.456,4.42,0.28, +246.449,18.893,6.7,null, +247.438,-57.756,6.06,1.48, +246.548,11.408,6.11,1.03, +247.061,-37.179,5.79,1.1, +246.351,37.394,5.54,0.17, +246.709,2.348,6.07,0.92, +247.706,-61.634,5.2,1.23, +245.453,69.109,5.25,1.12, +246.105,55.205,5.74,0, +246.931,-7.598,5.23,1.72, +246.95,-8.372,4.63,0.17, +245.946,61.697,5.67,0.96, +247.426,-46.243,5.35,0.56, +245.998,61.514,2.74,0.91, +258.997,-87.566,6.57,0.91, +247.352,-26.432,0.96,1.83, +248.58,-70.988,5.5,1.22, +247.142,0.665,5.39,1.46, +247.204,-8.129,6.48,0.4, +251.473,-83.239,6.57,1.57, +255.244,-86.364,6.04,0.05, +247.445,-14.551,5.68,0.82, +247.552,-25.115,4.79,-0.11, +247.924,-41.817,5.33,0.33, +247.845,-34.704,4.23,-0.16, +247.625,-7.515,6.5,0.37, +247.845,-26.538,6.1,1.08, +247.16,41.882,5.04,1.52, +247.785,-16.613,4.28,0.92, +247.555,21.49,2.77,0.94, +247.728,1.984,3.82,0.01, +247.181,51.408,6.29,1.05, +248.937,-65.495,5.52,0.93, +247.64,20.479,5.25,1.29, +248.034,-21.466,4.45,0.13, +247.806,22.195,5.76,1.61, +248.521,-44.045,4.94,0.05, +247.525,48.961,6.45,0.03, +247.762,35.225,6.25,1.64, +248.149,5.521,5.63,-0.06, +248.151,11.488,4.84,1.49, +248.783,-45.245,6.46,1.34, +246.996,68.768,5,-0.06, +247.947,45.598,5.65,0.12, +250.769,-77.517,4.24,1.06, +249.094,-42.859,5.47,0.4, +248.971,-28.216,2.82,-0.25, +249.094,-35.256,4.16,1.57, +249.72,-60.99,6.18,-0.08, +248.526,42.437,4.2,-0.01, +248.86,17.057,6.41,0.05, +248.107,60.823,5.94,0.02, +249.09,-2.325,5.75,0.82, +250.347,-68.296,5.91,-0.08, +246.43,78.964,5.56,0.26, +249.609,-43.399,5.83,-0.02, +249.29,-10.567,2.56,0.02, +249.179,15.498,6.3,-0.11, +250.21,-60.446,6.18,0.48, +249.772,-37.217,5.91,0, +249.507,-6.538,6.09,0.16, +247.867,72.612,6.3,1.32, +249.45,13.687,6.31,0.41, +250.842,-67.432,6.03,0.02, +249.047,46.613,5.79,1.04, +249.048,52.9,5.53,-0.07, +249.057,52.924,5.08,-0.04, +249.059,52.924,6.53,-0.06, +250.335,-48.763,5.65,0.13, +250.418,-49.652,5.65,-0.03, +249.913,-9.554,6.35,0.48, +250.144,-20.409,6.26,1.08, +247.662,77.447,6.34,1, +250.44,-33.146,5.87,0.65, +250.401,-24.468,6.09,0.2, +250.146,4.207,6.93,0.13, +250.161,4.22,5.77,-0.02, +250.393,-17.742,4.96,1.11, +250.764,-46.071,6.23,0.85, +249.229,63.073,6.16,1.53, +249.502,56.016,5.29,1.08, +249.687,48.928,4.9,1.55, +250.298,-1.001,6.24,0.3, +250.474,-19.924,5.57,0.43, +250.214,12.395,6.08,0.05, +251.667,-67.11,5.13,-0.08, +250.427,1.181,5.74,0.32, +250.94,-41.119,6.2,0.14, +251.166,-53.152,5.96,1.26, +250.252,24.859,6.06,1.31, +250.975,-41.113,6.12,-0.07, +250.948,-38.157,6.05,-0.06, +250.911,-32.106,6.46,-0.08, +250.322,31.603,2.81,0.65, +250.403,26.917,5.92,0.4, +251.177,-40.84,5.71,-0.12, +251.588,-58.504,5.74,-0.09, +251.072,-27.456,6.58,0.1, +252.166,-69.028,1.92,1.44, +251.251,-28.51,6.02,0.09, +251.831,-58.341,5.58,-0.08, +250.724,38.922,3.53,0.92, +251.699,-39.377,5.48,0.98, +250.965,34.039,5.99,0.29, +250.23,64.589,4.83,1.22, +251.374,1.02,6.03,-0.02, +251.714,-25.529,6.71,1.18, +250.743,55.69,6.16,0.07, +251.344,15.745,5.56,1.66, +251.458,8.583,5.15,1.53, +252.446,-59.041,3.76,1.57, +251.299,43.217,6.05,1.4, +253.073,-67.682,6.32,1.28, +251.791,2.064,6.1,0.14, +252.975,-65.376,6.13,-0.02, +251.943,5.247,5.24,-0.02, +252.113,-14.909,6.03,0.2, +252.65,-50.046,6.47,0.31, +251.324,56.782,4.85,0.38, +249.47,78.918,6.32,1.14, +252.037,13.591,6.35,0.87, +252.366,-15.667,6.1,null, +252.541,-34.293,2.29,1.15, +251.833,42.239,5.87,1.61, +252.458,-10.783,4.65,0.47, +252.749,-37.514,6.11,0.12, +252.89,-41.231,5.22,0.07, +252.394,13.261,5.91,0.03, +252.968,-38.047,3.08,-0.2, +252.593,-2.654,6.32,0.42, +253.08,-41.854,6.49,0.23, +252.581,7.248,5.49,0.1, +253.502,-57.909,5.94,1.59, +253.084,-38.017,3.57,-0.21, +253.853,-63.27,6.02,0.05, +252.309,45.983,4.82,0.09, +252.854,1.216,5.51,0.05, +252.419,43.431,6.13,1.26, +253.427,-43.051,5.96,1.73, +252.663,29.807,5.72,1.6, +252.68,32.554,6.13,1.01, +253.507,-41.806,5.45,0.19, +253.495,-41.995,6.32,0.5, +253.499,-42.362,4.73,0.49, +253.549,-41.85,6.45,0.2, +252.65,41.897,6.29,1.08, +253.582,-41.82,6.59,0.21, +253.612,-42.479,5.88,0.64, +250.775,77.514,5.98,0.42, +253.02,14.974,6.52,-0.05, +253.355,-20.416,5.88,0.68, +252.939,24.656,5.04,1.25, +253.646,-42.361,3.62,1.37, +253.743,-41.151,5.77,0.15, +253.65,-30.587,6.35,0.21, +254.037,-50.675,6.33,-0.02, +254.12,-52.284,5.94,-0.08, +254.891,-69.268,5.79,-0.1, +253.544,-1.612,6.25,0.28, +253.668,-11.792,6.57,0.14, +253.242,31.702,5.32,0.29, +253.649,-6.154,5.25,1.08, +253.502,10.165,4.38,-0.08, +253.991,-33.507,6.37,1.71, +254.15,-40.824,6.15,0.26, +254.008,-16.806,6.37,0.92, +254.655,-55.99,3.13,1.6, +253.323,47.417,6,1.32, +253.73,20.959,5.41,0.97, +254.296,-33.259,5.48,1.59, +254.575,-50.641,5.55,0.02, +253.817,13.62,6.34,0.34, +254.2,-23.15,5.58,-0.02, +253.759,25.731,6.08,0.92, +253.843,18.433,5.35,1.41, +254.267,-19.54,6.27,0.07, +254.896,-53.161,4.06,1.45, +254.359,-10.963,6.19,1, +255.026,-54.597,5.65,0.19, +254.718,-37.621,6.09,0.19, +254.417,9.375,3.2,1.15, +255.113,-48.648,6,0.88, +254.383,13.884,6.37,0.94, +254.673,-14.87,6.59,0.4, +255.135,-45.452,6.65,1.8, +255.448,-58.958,6.11,-0.03, +254.379,25.353,6.28,0.9, +254.027,50.039,6.56,1.62, +254.426,24.381,6.32,1.1, +254.99,-25.092,5.86,1.62, +255.04,-24.989,5.75,0.41, +255.154,-35.934,5.97,1.16, +255.442,-51.131,6.45,0.27, +254.459,42.513,6.34,1.28, +255.787,-53.237,5.29,0.48, +254.007,65.135,4.89,0.48, +255.47,-32.144,5.03,-0.1, +255.123,6.584,6.59,0.23, +255.265,-4.222,4.82,1.48, +254.105,65.039,6.41,0.38, +256.103,-57.712,5.73,-0.1, +255.463,-18.886,6.26,1.38, +251.492,82.037,4.23,0.89, +255.924,-47.16,6.06,null, +255.073,30.926,3.92,-0.01, +255.242,22.632,5.65,1.33, +255.387,14.949,6.31,0.04, +255.962,-38.152,5.91,0.38, +255.29,27.196,6.55,0.41, +255.496,8.451,6.33,0.09, +254.84,56.689,6.03,1.16, +256.272,-45.502,6.28,0.07, +255.402,33.568,5.25,0.02, +255.578,25.506,5.75,1.02, +256.206,-34.123,4.87,0.26, +254.07,73.128,6.3,0.24, +255.572,31.885,6.36,1.13, +255.783,14.092,4.98,1.6, +256.453,-44.105,6.19,0.28, +255.793,14.511,6.52,0.76, +256.189,-20.495,6.3,-0.02, +255.914,13.605,5.93,0, +255.992,13.567,6.08,1.03, +255.97,19.691,6.35,1.52, +256.585,-37.227,5.98,0.07, +254.761,69.186,6.4,null, +255.876,35.414,6.69,null, +256.618,-35.451,6.13,0.5, +255.32,60.649,6.13,1, +256.32,0.702,6.01,0.58, +256.549,-21.565,6.3,0.13, +255.973,34.79,6.04,0.22, +256.172,19.599,6.17,-0.01, +256.385,-0.892,5.64,0.16, +256.722,-26.513,6.29,-0.04, +256.345,12.741,4.91,0.12, +257.526,-61.676,6.39,-0.04, +258.082,-70.721,6.22,1.06, +256.54,9.733,6.37,1.45, +256.555,10.454,6.37,0.87, +255.564,64.601,6.1,0.96, +256.72,-1.656,6.38,0.2, +256.271,43.812,6.43,0.09, +256.207,48.804,6.09,1.09, +256.575,22.084,5.56,1.3, +257.062,-17.609,5.99,1.01, +257.198,-30.404,5.97,0.25, +257.057,-1.079,6.06,0.08, +258.323,-67.197,5.89,1.06, +256.332,54.47,5.83,null, +256.332,54.47,5.8,0.48, +257.676,-44.557,5.08,0.86, +257.227,-3.883,6.36,0.69, +259.148,-74.533,6.25,-0.01, +257.912,-48.874,5.84,1.84, +257.45,-10.523,5.56,0.52, +256.945,40.516,6.34,0.03, +257.008,35.935,5.39,0.31, +257.595,-15.725,2.43,0.06, +255.418,75.297,6.21,null, +258.038,-43.239,3.33,0.41, +258.068,-39.507,5.67,0.04, +258.069,-38.822,6.3,1.05, +257.071,50.842,6.46,0, +258.555,-56.888,6.09,1.78, +257.691,12.467,6.57,0.08, +258.057,-25.255,6.54,-0.04, +258.104,-27.762,6.14,-0.04, +257.389,40.777,5.08,1.28, +258.245,-32.439,6.01,0.07, +257.938,7.895,6.33,1.04, +257.763,24.238,6.19,0.23, +258.615,-39.767,6.6,2.21, +258.116,10.585,5.33,1.59, +258.227,0.352,6.65,0.5, +257.628,52.409,6.29,0, +257.197,65.715,3.17,-0.12, +258.83,-33.548,5.53,-0.01, +258.9,-38.594,5.96,0.58, +257.918,49.747,6.04,null, +260.053,-70.046,6.53,0.6, +258.837,-26.603,5.11,0.86, +258.837,-26.601,5.07,0.85, +258.965,-30.211,6.21,-0.03, +258.835,-14.584,5.99,1.1, +259.09,-35.749,6.12,0.48, +258.662,14.39,3.48,1.44, +258.663,14.39,5.39,null, +259.802,-59.694,5.91,1.37, +259.265,-32.663,5.55,0.5, +258.758,24.839,3.14,0.08, +260.525,-70.123,5.41,-0.04, +259.059,2.186,6.17,0.22, +259.178,-6.245,6.09,1.1, +259.132,1.211,5.88,0.06, +259.153,-0.445,4.73,1.14, +259.763,-46.634,5.48,0.8, +260.498,-67.771,4.78,1.21, +258.762,36.809,3.16,1.44, +258.923,23.743,5.96,1.31, +259.7,-44.13,5.76,-0.05, +258.136,62.874,5.56,0.21, +259.585,-32.553,6.36,0.15, +259.876,-50.063,6.27,0.41, +259.503,-24.287,5.2,1.1, +259.502,-24.284,6.8,0.51, +259.738,-34.99,5.91,1.04, +259.852,-44.223,6.65,0.2, +259.58,-16.312,6.43,1.66, +262.864,-80.859,5.88,1.67, +259.4,23.091,6.45,null, +259.331,33.1,4.82,-0.17, +259.521,17.318,6,0.01, +259.654,10.864,5.03,1.55, +259.72,6.085,6.51,0.39, +259.972,-17.756,6.02,0.04, +259.418,37.292,4.65,0.05, +259.203,49.691,7.48,null, +260.729,-58.01,5.88,1.07, +259.998,-5.917,6.32,0.85, +261.005,-62.864,5.7,-0.14, +260.142,-19.333,6.52,0.58, +260.779,-56.525,5.8,1, +259.702,28.823,5.65,0.98, +259.597,38.811,5.94,1, +260.251,-21.113,4.39,0.39, +260.207,-12.847,4.33,0.03, +261.078,-60.674,5.77,-0.08, +259.123,60.671,6.32,1.09, +260.22,-10.696,6.46,0.33, +260.664,-37.805,6.41,0.64, +260.817,-47.468,5.25,-0.11, +260.079,18.057,5,1.62, +260.503,-24.999,3.27,-0.22, +260.658,-35.91,6.47,0.54, +260.041,25.538,5.38,0.03, +260.729,-37.221,5.93,1.08, +260.226,24.499,5.12,-0.03, +260.165,32.468,5.39,0.62, +260.84,-28.143,5.35,1.55, +261.054,-44.162,5.12,-0.06, +261.325,-55.53,2.85,1.46, +261.348,-56.377,3.34,-0.13, +260.389,16.731,6.35,1.61, +260.088,46.241,5.59,1.57, +260.714,-2.388,6.29,0.68, +260.38,28.758,6.35,0.7, +260.14,48.188,6.43,0.43, +261.5,-50.634,5.23,1.06, +260.432,39.974,5.51,0.68, +261.261,-34.696,6.16,0.02, +262.032,-63.036,6.24,-0.09, +261.175,-21.442,5.85,0.93, +261.155,-18.446,6.21,0.03, +261.276,-24.244,6.19,1.1, +261.735,-51.949,6.19,-0.03, +260.99,8.853,5.77,1.25, +261.715,-45.844,5.29,-0.07, +261.802,-50.63,5.92,0.08, +260.439,53.421,5.67,1.47, +261.027,22.96,5.74,0.21, +261.131,16.301,5.71,0.07, +261.141,15.606,6.35,-0.02, +261.99,-52.297,5.75,1.17, +260.92,37.147,5.47,null, +260.921,37.146,4.52,-0.03, +261.592,-24.175,4.17,0.28, +262.161,-55.17,5.94,1.11, +261.009,38.583,6.49,0.73, +261.491,-1.652,6.44,0.46, +261.73,-25.943,6.44,-0.06, +261.113,36.952,6.28,0.88, +261.839,-29.867,4.29,0.4, +261.658,-5.087,4.54,0.39, +261.906,-29.724,6,0, +261.477,16.918,5.98,1.62, +261.759,-12.512,6.21,0.51, +261.579,7.596,6.06,0.58, +261.629,4.14,4.34,1.5, +261.504,26.879,6.41,0.1, +262.775,-60.684,3.62,-0.1, +262.234,-36.778,6.02,1.11, +261.705,20.081,5.54,-0.13, +262.357,-38.517,6.39,0.09, +262.01,-8.208,6.37,0.58, +262.846,-56.921,5.95,-0.08, +261.693,34.696,5.94,-0.01, +262.207,0.331,5.44,0.22, +262.691,-37.296,2.69,-0.22, +261.684,48.26,5.85,0.12, +262.96,-49.876,2.95,-0.17, +261.422,60.048,5.65,0.03, +262.448,-5.92,6.37,0.93, +262.955,-46.036,6.03,0.83, +261.52,58.652,6.51,0.14, +262.599,-1.062,5.31,0.72, +262.948,-33.703,6.44,1.19, +261.251,67.306,6.43,0.76, +262.854,-23.963,4.81,0, +262.935,-26.27,6.05,-0.06, +262.593,11.925,6.39,0.06, +263.102,-34.28,6.17,0.35, +263.281,-41.174,5.84,0.06, +262.839,2.724,5.59,0.84, +263.895,-59.846,6.28,-0.08, +262.685,26.111,4.41,1.44, +263.402,-37.104,1.63,-0.22, +262.731,31.158,5.61,0.95, +259.904,80.136,5.72,1.5, +263.833,-53.353,6.1,0.02, +262.668,38.882,6.43,0.49, +263.063,11.93,6.42,-0.01, +262.957,28.408,5.62,0, +263.375,-5.745,5.62,0.18, +263.677,-32.582,5.7,0.04, +262.608,52.301,2.79,0.98, +263.915,-46.506,4.59,-0.03, +263.005,34.271,6.56,0.65, +263.929,-37.44,6.48,0.01, +262.683,57.876,6.4,null, +263.345,19.257,5.64,0.48, +263.414,16.317,5.69,1.01, +263.428,14.842,6.48,1.6, +263.693,-11.242,5.55,0.02, +263.827,-22.044,6.57,0.01, +264.137,-38.635,4.29,1.09, +264.363,-50.06,5.93,1.1, +263.653,9.587,5.81,0.02, +264.523,-54.5,5.25,0.2, +263.28,41.244,5.74,1.09, +263.613,16.504,6.4,null, +270.392,-85.215,6.45,0.44, +264.33,-42.998,1.87,0.4, +263.044,55.184,4.88,0.26, +263.067,55.173,4.87,0.28, +263.734,12.56,2.08,0.15, +264.362,-38.066,6.26,1.25, +264.535,-42.881,6.1,-0.06, +263.998,20.996,6.1,0.19, +263.382,57.559,6.17,0.59, +264.397,-15.399,3.54,0.26, +264.401,-15.571,5.94,0.37, +263.927,37.302,6.1,0.98, +264.033,28.185,6.38,null, +266.082,-72.221,6.49,0.48, +262.991,68.135,5.05,1.08, +264.461,-8.119,4.62,0.11, +264.54,-10.926,5.75,1.23, +265.098,-49.416,4.77,0.4, +264.153,30.785,6.02,0.16, +264.38,24.31,5.77,0.11, +265.318,-46.922,5.79,-0.01, +263.748,61.875,5.23,0.61, +264.157,48.586,5.37,1.15, +264.785,2.028,6.26,1.03, +265.516,-50.511,6.24,1.76, +264.741,13.329,6.12,0.56, +265.049,-2.152,6.19,1.67, +264.707,32.739,6.37,null, +265.622,-39.03,2.41,-0.22, +265.354,-12.875,4.26,0.08, +266.433,-64.724,3.62,1.19, +265.713,-36.946,5.54,1.55, +264.99,31.203,6.03,1.58, +266.036,-51.834,5.15,0.7, +266.233,-57.545,6.01,0.9, +265.779,-33.051,6.4,1.81, +264.866,46.006,3.8,-0.18, +265.296,15.178,6.34,0.03, +265.385,6.313,5.95,1.26, +265.172,31.288,6.28,1.05, +265.273,24.513,6.36,1.2, +265.824,-27.884,6.36,0.47, +265.495,15.952,5.52,0.38, +265.857,-21.683,4.87,0.47, +264.238,68.758,4.8,0.43, +266.175,-42.729,5.87,0.16, +264.165,69.571,6.42,0.58, +265.157,43.471,6.59,null, +265.953,-13.509,6.39,0.37, +265.946,-7.079,6.3,0.38, +265.618,24.564,5.52,1.46, +265.868,4.567,2.77,1.16, +265.842,14.295,6.24,0.42, +265.151,57.31,6.77,0.92, +264.287,72.456,5.86,1.01, +265.341,51.818,5.99,1.05, +265.84,24.328,5.71,0.65, +266.142,2.579,6.17,0.07, +266.148,2.579,6.56,null, +266.072,14.41,6.19,0.21, +265.773,44.084,6.34,1.54, +266.78,-38.112,6.43,-0.02, +267.159,-55.402,6.11,0.28, +266.896,-40.127,3.03,0.51, +266.89,-27.831,4.54,0.8, +266.94,-22.478,6.18,1.49, +265.997,53.802,5.75,0.01, +266.418,31.505,6.23,0, +266.903,-14.726,5.94,0.05, +267.116,-26.975,6.35,0.12, +267.618,-53.612,5.92,-0.08, +266.615,27.721,3.42,0.75, +267.898,-60.164,5.78,1, +266.474,38.881,6.52,1, +266.494,39.323,6.68,1.39, +266.783,17.697,5.72,0.01, +267.294,-31.703,4.83,-0.04, +266.973,2.707,3.75,0.04, +267.465,-37.043,3.21,1.17, +267.547,-40.091,4.81,0.26, +267.796,-53.131,6.09,0, +267.084,3.804,6.22,0.16, +268.327,-65.489,6.49,1.08, +269.424,-76.178,6.07,1.2, +265.485,72.149,4.58,0.42, +265.492,72.157,5.79,0.53, +267.103,20.566,5.69,0.94, +267.329,1.961,6.47,1.24, +267.935,-45.601,6.11,0.95, +266.784,47.612,6.43,0.11, +267.2,19.255,6.12,0.02, +267.887,-40.772,5.96,1.59, +267.205,25.623,5.12,1.16, +267.802,-30.557,6.66,0.04, +271.361,-81.486,6.35,1.5, +268.057,-34.799,5.9,-0.1, +268.082,-34.417,5.84,1.13, +268.22,-41.997,6.2,0.54, +267.681,11.947,6.17,1.25, +268.205,-34.114,6.06,1.23, +268.233,-35.019,6.45,0.02, +268.241,-35.624,6.03,0.34, +267.595,29.322,5.5,1.05, +267.702,22.316,5.98,null, +267.268,50.781,5.02,0.02, +268.332,-34.731,6.17,-0.03, +268.347,-34.895,5.6,1.14, +267.998,-1.237,6.35,1.12, +268.44,-34.786,6.38,0, +268.162,-6.144,6.21,1.4, +268.479,-34.752,5.96,-0.01, +268.492,-34.832,6.42,0.01, +267.514,48.394,6.68,-0.11, +267.994,15.326,6.46,null, +268.265,-10.9,6.18,1.11, +268.148,1.305,5.95,1.58, +268.613,-34.466,5.96,-0.01, +267.808,40.073,6.46,null, +268.309,6.101,5.77,0.42, +268.783,-36.476,6.06,0.08, +268.725,-24.887,6.2,0.04, +268.02,39.982,6.04,1.33, +268.004,46.643,6.38,1.09, +269.198,-44.342,4.86,1.21, +268.559,11.131,6.38,0.45, +268.325,40.008,5.16,1.18, +269.233,-40.306,6.43,1.43, +268.979,-18.802,6.52,0.05, +269.175,-28.065,5.8,0.21, +269.079,-15.812,5.89,0.05, +269.449,-41.716,4.88,1.65, +269.491,-39.137,6.29,0.01, +269.077,0.67,5.82,0.09, +268.855,26.05,5.46,0.34, +269.199,-4.082,5.47,1.16, +268.962,22.464,5.58,1.24, +268.382,56.873,3.75,1.18, +269.268,0.066,5.97,0.1, +269.233,6.488,6.29,0, +269.732,-36.858,5.74,0.9, +269.663,-28.759,6.01,-0.08, +269.772,-30.253,5.16,1.77, +269.773,-30.253,7.04,1.06, +269.063,37.251,3.86,1.35, +269.362,11.044,6.36,0.11, +269.31,23.996,6.3,0.63, +269.757,-9.774,3.34,0.99, +268.849,55.971,6.1,0.32, +269.948,-23.816,4.76,-0.04, +267.363,76.963,5.04,0.49, +269.202,45.351,6.02,1.64, +269.441,29.248,3.7,0.94, +270,-20.339,6.21,1.4, +269.152,51.489,2.23,1.52, +269.903,-4.821,5.87,1.56, +269.626,30.189,4.41,0.39, +270.451,-36.378,6.3,-0.03, +270.065,0.629,6.37,0.15, +270.121,-3.69,4.62,0.38, +269.676,36.288,6,0.94, +270.066,4.369,4.64,-0.03, +270.014,16.751,4.67,1.26, +270.161,2.932,3.97,0.02, +270.346,-17.157,6.28,1.8, +270.477,-22.781,5.77,0, +267.544,78.307,6.24,1.44, +269.718,45.476,6.48,-0.08, +270.22,6.268,6.34,-0.08, +270.115,19.506,6.5,-0.06, +283.695,-87.606,5.28,1.28, +270.238,15.093,6.26,0.69, +270.438,1.305,4.45,0.02, +270.713,-24.282,5.34,0.52, +268.797,72.005,5.45,0.3, +270.152,33.214,5.99,1.51, +270.757,-22.718,6.74,-0.05, +269.984,45.501,5.67,1.57, +270.375,21.595,5.18,0.95, +270.377,21.596,4.96,0.12, +272.815,-75.891,5.86,1.24, +270.693,-5.359,6.76,0.16, +270.771,-8.18,5.94,null, +270.77,-8.181,5.24,0.38, +268.611,75.171,6.36,0.98, +270.968,-24.361,5.97,0, +270.4,33.311,6.15,1.55, +270.596,20.834,5.28,-0.09, +271.21,-35.901,6,1.16, +271.951,-64.55,6.41,1.26, +270.625,22.923,6.21,-0.1, +271.255,-29.58,4.69,0.78, +271.658,-50.092,3.66,-0.08, +270.811,19.613,6.5,0.01, +272.145,-63.668,4.35,0.22, +271.452,-30.424,2.99,1, +271.155,1.919,6.14,0, +271.599,-36.02,5.95,0.62, +271.708,-43.425,5.77,0.22, +271.708,-43.425,5.77,null, +273.144,-73.672,5.85,0.46, +271.364,2.499,4.03,0.86, +270.788,48.464,6.21,0.03, +271.168,23.943,6.34,0.3, +271.531,-8.324,5.85,0.21, +271.563,-4.751,5.77,0.96, +271.531,-0.447,6.34,1.06, +271.43,12.004,7.04,0.3, +272.125,-45.767,6.15,-0.08, +272.49,-59.04,6.38,1.55, +272.609,-62.002,5.49,0.58, +271.798,-21.444,6.28,0.12, +271.376,21.647,6.15,1.23, +271.18,40.084,6.52,0.46, +271.508,22.219,5.06,1.58, +272.021,-28.457,4.57,0.94, +271.253,41.947,6.34,0.26, +271.457,32.231,5.71,1.16, +271.952,-17.154,5.52,1.11, +271.827,8.734,4.64,0.96, +271.838,9.564,3.73,0.12, +272.343,-36.672,6.58,-0.03, +272.225,-25.472,6.61,0.02, +273.6,-70.751,6.73,-0.03, +271.756,30.562,5.04,0.52, +271.952,13.071,6.63,0.07, +272.5,-32.72,6.43,1.02, +272.769,-47.513,6.07,1.2, +271.886,28.763,3.83,-0.03, +272.524,-30.729,5.53,0.97, +271.956,26.101,5.86,0.12, +271.956,26.098,5.9,0.14, +272.808,-45.954,4.53,1.01, +272.14,14.285,6.37,0.17, +272.431,-13.934,6.39,1.42, +272.773,-41.359,5.86,0.29, +272.19,20.814,4.36,-0.16, +272.73,-33.8,6.16,-0.14, +263.054,86.586,4.36,0.02, +271.723,50.823,6.29,1.04, +271.87,43.462,5,0.91, +271.776,49.711,6.32,null, +272.009,36.401,5.48,1.17, +272.22,20.045,5.1,0.15, +272.391,3.993,5.73,0.37, +273.568,-63.689,6.47,1.41, +272.475,3.12,5.69,0.47, +272.812,-19.842,6.36,0.16, +272.293,30.469,6.38,1.19, +272.668,3.324,5.51,1.19, +272.931,-23.701,4.98,1.05, +272.993,-28.901,6.51,-0.01, +272.536,16.477,6.09,null, +273.302,-41.336,5.47,-0.17, +273.92,-63.056,5.6,0.92, +272.406,38.458,6.4,0.87, +272.496,36.466,5.58,0.91, +274.504,-68.229,6.33,-0.04, +270.014,80.001,6.04,0.51, +270.038,80.004,5.68,0.5, +262.7,86.968,5.79,0.25, +273.441,-21.059,3.86,0.23, +273.292,-4.012,6.59,0.27, +272.938,33.447,5.88,0.01, +272.976,31.405,4.97,1.65, +273.566,-21.713,5.44,1.52, +272.632,54.287,5.95,0.94, +273.97,-44.207,5.46,0.96, +274.281,-56.023,5.33,-0.05, +273.319,21.88,6.12,1.47, +274.254,-51.068,6.06,-0.06, +273.804,-20.728,5.38,0.07, +273.804,-20.388,5.95,0.02, +273.177,41.147,6.36,1.03, +273.878,-18.661,6.07,0.2, +273.27,38.774,6.04,-0.08, +272.78,60.409,6.49,0, +274.918,-63.887,6.18,0.58, +275.9,-75.044,5.47,0.02, +273.992,-3.617,6.36,0.2, +273.683,29.207,6.56,0.54, +274.407,-36.762,3.11,1.56, +274.4,-34.107,6.16,-0.11, +274.023,2.378,6.01,1.59, +274.35,-28.652,6.19,0.18, +274.349,-28.289,6.4,0.54, +277.331,-80.233,5.95,1.16, +274.298,-17.374,5.75,1.58, +274.667,-42.288,6.3,-0.11, +274.221,-3.007,6,0.89, +274.369,-18.463,6.54,0.11, +274.513,-27.042,4.65,1.66, +274.351,-9.759,6.31,0.38, +274.27,1.006,6.63,0.31, +273.912,42.159,5.59,-0.1, +274.674,-25.605,6.51,1.34, +273.886,45.209,6.29,0.62, +274.68,-18.619,6.84,0.31, +273.671,56.588,6.37,0.34, +273.474,64.397,5.03,0.38, +274.512,13.777,6.3,-0.03, +274.532,18.131,5.99,0.03, +274.278,40.937,6.11,0.99, +274.532,23.297,6.63,null, +275.807,-61.494,4.36,1.48, +275.23,-37.488,6.45,1.31, +274.79,7.26,5.39,1.07, +275.037,-15.832,5.39,1.47, +275.249,-29.828,2.7,1.38, +274.795,24.446,5.27,1.53, +275.381,-24.915,6.25,1.84, +275.578,-38.657,5.1,1.49, +275.346,-18.86,5.75,0.94, +275.501,-28.43,6.16,0.26, +273.821,68.756,5.95,1.06, +275.217,3.377,4.86,0.91, +274.967,29.666,5.99,1.29, +275.075,21.961,4.95,1.59, +275.328,-2.899,3.26,0.94, +275.721,-36.669,5.34,-0.14, +276.381,-63.021,6.14,0.2, +274.965,36.064,4.33,1.17, +275.369,5.436,6.13,-0.04, +275.87,-36.238,5.55,1.02, +276.076,-44.11,5.25,-0.19, +275.238,29.859,5.63,0.21, +275.254,28.87,5.12,0.2, +275.759,-10.219,6.33,0.14, +276.043,-34.385,1.85,-0.03, +274.984,51.348,6.3,1.1, +275.801,-12.015,5.73,0.01, +275.536,23.285,5.41,1.6, +275.647,12.029,5.89,0.04, +275.915,-8.934,4.68,0.95, +275.704,17.827,5.25,1.27, +275.28,49.726,6.4,1.07, +275.762,16.688,6.22,1.2, +276.256,-30.757,5.6,1.14, +276.34,-35.992,6.15,1, +276.015,-3.583,6.38,0.34, +275.386,49.122,5.05,1.66, +276.175,-7.075,6.31,1.16, +276.478,-33.945,6.3,-0.08, +276.725,-48.117,5.46,0.84, +275.925,21.77,3.84,1.18, +276.338,-20.542,4.81,1.31, +276.743,-45.968,3.51,-0.17, +276.237,-1.579,6.15,0.37, +278.23,-73.966,5.89,0.98, +276.287,5.085,6.74,0.02, +275.989,38.739,6.36,null, +276.412,8.032,5.65,0.92, +276.057,39.507,5.12,0.03, +276.244,27.395,6.27,0.05, +277.208,-49.071,4.13,1.02, +276.481,14.967,6.37,0.01, +276.956,-29.816,5.92,0.52, +277.486,-57.523,5.76,0.98, +276.932,-26.635,6.31,0.26, +277.113,-38.996,5.64,0.13, +275.949,53.301,6.32,0.16, +280.559,-81.808,6.27,-0.13, +276.993,-25.422,2.81,1.04, +277.026,-26.757,6.27,0.16, +277.304,-43.846,6.36,0.9, +277.843,-62.278,4.64,-0.11, +276.495,29.829,5.83,0.06, +276.802,0.196,5.21,0.5, +276.985,-17.8,6.2,0.01, +275.19,71.338,4.22,-0.1, +277.32,-38.851,6.63,-0.02, +277.483,-47.22,5.7,1.26, +275.977,58.801,4.98,0.08, +276.67,26.449,6.53,-0.11, +276.96,3.749,6.07,1.62, +277.239,-26.582,6.5,0.11, +275.264,72.733,3.57,0.49, +276.995,6.194,5.73,-0.03, +277.342,-25.256,6.59,0.07, +277.3,-14.566,4.7,0.06, +277.763,-41.914,6.04,0.14, +277.445,-14.582,5.96,-0.04, +277.55,-18.729,5.66,1.06, +277.939,-45.915,4.96,-0.11, +277.421,-1.985,5.39,0.96, +277.77,-32.989,5.34,0.16, +277.984,-43.508,5.72,1.34, +278.008,-45.757,5.07,-0.14, +278.373,-58.709,6.44,0.68, +277.56,-5.724,6.28,0.95, +277.521,4.065,6.69,0.11, +278.089,-39.704,5.16,0.08, +277.399,23.866,5.9,-0.1, +277.86,-18.403,5.14,0, +276.496,65.564,4.82,1.19, +277.857,-10.796,5.72,0.24, +277.972,-19.125,6.68,1.13, +278.254,-39.892,6.22,0.42, +276.926,59.549,6.43,null, +277.673,20.815,6.5,0.79, +278.376,-42.312,4.64,1.01, +278.347,-38.72,6.32,null, +278.346,-38.726,5.65,-0.06, +278.63,-52.892,6.22,1.25, +277.768,16.929,5.77,0.04, +278.087,-14.644,6.37,0.22, +277.987,-1.003,5.94,0.16, +278.029,3.66,6.43,-0.04, +278.18,-14.866,5.5,1.97, +278.491,-33.017,5.28,-0.11, +278.473,-24.032,5.49,1.79, +278.413,-14.854,5.76,0.04, +278.345,-5.911,6.36,0.02, +282.991,-83.316,7.16,1.26, +278.637,-24.222,6.51,0.54, +278.193,23.617,5.84,1.46, +278.347,8.268,6.42,-0.03, +278.208,30.554,5.48,-0.1, +278.839,-20.841,6.48,0.28, +278.76,-10.977,5.14,0.92, +278.346,30.893,6.59,-0.12, +278.999,-29.699,6.37,1.27, +278.802,-8.244,3.85,1.33, +278.048,52.116,6.56,-0.07, +278.582,20.466,6.57,0.11, +278.698,10.892,6.4,0.08, +278.802,18.203,5.78,0, +278.144,57.046,4.77,0.61, +277.812,65.436,6.59,0.3, +278.877,23.606,5.61,1, +278.972,16.976,6.21,0.53, +280.759,-71.428,4.01,1.14, +278.486,52.354,5.36,1.09, +278.806,34.458,6.1,-0.11, +279.116,9.123,5.39,0.37, +279.81,-47.91,5.86,0.23, +279.163,6.672,5.45,0.37, +279.477,-21.398,5.94,0.19, +279.519,-14.005,6.47,0.21, +279.628,-23.505,5.81,0.02, +279.896,-43.186,5.37,1.68, +279.303,11.422,6.42,-0.02, +279.4,-0.309,5.75,0.07, +281.956,-77.867,6.39,0.6, +279.288,16.198,6.29,0.9, +280.594,-64.643,6.37,0.15, +279.155,33.469,5.42,-0.1, +279.722,-21.052,5.86,0.68, +279.599,-3.194,6.49,0.55, +279.58,-1.113,6.66,0.42, +279.235,38.784,0.03,0, +279.588,8.834,6.4,1.32, +279.19,43.222,6.2,0.24, +280.905,-64.551,5.78,0.96, +280.378,-48.095,6.49,1.22, +277.437,77.547,5.64,1.18, +280.002,-7.791,5.84,1.55, +279.904,5.264,6.38,0.78, +279.527,39.668,6.04,1.65, +279.965,7.358,6.28,0.96, +280.465,-23.833,6.23,0.23, +281.362,-64.871,4.79,0.2, +279.055,65.489,6.06,0.28, +280.427,-14.564,6.42,0.81, +281.298,-61.095,6.04,1.46, +280.008,30.849,6.36,null, +279.888,40.935,6.25,-0.06, +279.39,62.527,5.74,-0.06, +280.051,38.367,6.45,0.21, +280.568,-9.052,4.72,0.35, +280.945,-38.324,5.13,0.09, +281.349,-56.882,6.22,1.38, +280.73,-19.284,6.35,1.75, +280.65,-7.073,6.15,1, +276.038,83.175,6.17,0.05, +281.032,-36.719,6.32,0.98, +282.431,-72.995,6.06,0, +279.97,52.196,6,-0.07, +281.081,-35.642,4.87,-0.18, +280.422,31.618,6.41,-0.04, +281.238,-39.686,5.43,0.87, +280.88,-8.275,4.9,1.12, +280.534,34.747,6.47,-0.13, +280.964,-6.819,6.31,0.48, +281.207,-25.011,5.83,0.05, +282.158,-65.078,5.73,0.24, +281.746,-50.094,6.54,0.28, +281.328,-21.001,6.36,0.45, +281.414,-26.991,3.17,-0.11, +281.208,2.06,5.02,-0.06, +280.82,39.3,6.45,1.59, +280.235,62.75,6.09,0.98, +280.9,36.557,6.01,1.04, +280.965,31.927,5.7,0.34, +281.505,-19.606,6.42,1.65, +281.586,-22.392,5.37,1.64, +281.168,23.59,6.31,0.4, +281.368,5.5,5.83,0.04, +280.658,55.539,5.04,-0.09, +281.936,-40.406,5.24,0.78, +281.085,39.67,5.06,0.16, +281.085,39.671,6.02,null, +281.095,39.613,5.14,0.19, +281.095,39.613,5.37,null, +281.68,-10.125,5.71,0.59, +281.193,37.605,4.36,0.19, +281.201,37.594,5.73,0.28, +281.399,21.985,6.51,0.02, +281.619,-0.962,5.9,0.13, +280.871,53.872,6.11,0.12, +281.415,20.546,4.19,0.46, +282.21,-43.68,5.49,0.13, +281.794,-4.748,4.22,1.1, +281.519,26.662,4.83,1.2, +282.364,-45.81,5.81,0.9, +281.871,-5.705,5.2,1.47, +281.673,18.706,6.17,1.59, +282.396,-43.434,5.61,-0.08, +281.755,18.181,4.36,0.13, +282.322,-34.749,6.62,1.08, +281.231,54.897,6.23,0.82, +282.189,-18.601,6.47,null, +281.554,41.442,6.07,-0.13, +283.054,-62.187,4.22,-0.14, +281.076,61.048,5.99,0.96, +282.011,4.241,6.21,1.51, +282.398,-19.142,6.75,0.2, +282.417,-20.325,5.24,1.41, +282.068,23.514,6.15,0.49, +281.746,46.315,6.52,0.07, +281.99,31.757,6.06,-0.13, +280.793,70.793,6.44,null, +282.421,-5.913,5.99,1.6, +281.68,52.988,5.88,-0.09, +282.405,0.836,6.25,0.04, +282.222,19.329,5.88,0.03, +283.165,-52.107,5.17,0.94, +282.71,-22.162,6.61,0.38, +282.583,-7.908,6.8,3.09, +281.917,49.075,6.4,null, +282.31,25.046,6.59,null, +283.113,-46.595,5.54,1.63, +283.3,-51.931,6.31,-0.09, +282.744,-9.774,5.83,0.61, +283.26,-48.36,6.19,0.14, +282.067,48.768,6.12,0.21, +283.248,-46.586,6.19,0.03, +282.433,31.629,6.64,0.02, +282.69,10.976,6.55,null, +282.441,32.813,5.91,-0.16, +282.842,-3.318,6.1,0.3, +282.47,32.551,5.25,0.08, +283.119,-26.65,6.29,0.94, +283.154,-29.379,6.13,1.35, +283.174,-30.734,6.63,-0.05, +282.52,33.363,3.45,0, +284.238,-67.234,4.44,0.71, +283.635,-49.879,6.6,0.08, +283.008,13.966,6.14,0, +283.258,-9.576,6.34,0.2, +284.228,-62.801,6.48,1.53, +282.9,28.784,6.18,1.18, +283.068,21.425,5.48,-0.07, +283.5,-21.36,5.69,1.23, +282.902,36.539,6.09,-0.11, +283.543,-22.745,4.83,1.41, +281.445,74.086,5.27,0.92, +283.03,41.383,6.28,-0.09, +283.68,-15.603,5.1,0.17, +283.78,-22.671,4.99,1.33, +283.816,-26.297,2.02,-0.22, +284.07,-42.711,5.36,1, +282.896,52.975,5.51,0.84, +281.593,75.434,5.35,0.05, +282.8,59.388,4.66,1.19, +283.879,-16.377,5.79,0.36, +284.652,-60.201,5.14,1.37, +284.003,-23.174,5.93,-0.02, +284.169,-37.343,5.38,-0.14, +285.015,-66.653,6.01,0.97, +283.432,36.972,5.58,-0.15, +283.555,27.909,5.62,1.35, +283.687,22.645,4.59,0.78, +284.615,-52.939,4.87,-0.05, +283.865,6.615,5.57,1.04, +284.395,-39.823,6.31,0.2, +283.307,50.708,4.92,0.9, +283.56,41.226,7.3,null, +283.626,36.899,4.3,1.68, +283.719,33.969,6.02,0.91, +284.055,4.204,4.62,0.17, +284.061,4.202,4.98,0.2, +284.095,-1.8,6.22,-0.05, +284.107,2.471,6.15,0.97, +284.335,-20.656,5.08,0.13, +283.718,41.603,5.44,1.03, +284.016,17.995,6.63,-0.04, +284.026,18.105,5.69,1.09, +284.265,-5.846,4.83,1.08, +284.432,-21.107,3.51,1.18, +284.589,-31.036,6.12,1.35, +284.681,-37.107,4.87,0.41, +283.443,57.487,6.22,1.23, +283.696,48.86,5.77,0.43, +284.585,-24.877,6.62,0.08, +284.796,-39.535,6.49,-0.04, +283.834,43.946,4.04,1.59, +284.319,2.535,5.57,0, +284.602,-22.529,6.14,0.09, +281.409,79.943,6.39,0.28, +285.874,-68.755,5.88,0.56, +284.257,32.901,5.22,0.59, +284.599,6.24,6.21,0.46, +284.862,-18.567,6.37,0.99, +284.561,17.361,5.38,0.8, +284.849,-12.841,5.53,-0.04, +284.695,13.907,5.89,0.25, +285.103,-24.942,6.36,1.25, +285.263,-37.061,6.69,null, +285.268,-37.062,6.4,-0.03, +284.688,19.794,6.5,-0.04, +284.774,13.623,5.23,0.53, +284.823,10.141,6.75,0.25, +284.508,38.266,5.89,-0.17, +284.188,57.815,5.66,1.15, +284.906,15.068,4.02,1.08, +285.536,-41.91,6.23,0, +284.736,32.689,3.24,-0.05, +284.694,40.679,6.22,-0.16, +283.6,71.297,4.82,1.15, +284.94,26.231,5.27,1.24, +285.407,-22.696,6.24,1.66, +284.992,22.815,6.29,1.75, +284.368,58.225,6.46,0.08, +284.801,39.218,6.41,-0.17, +285.39,-15.282,6.32,1, +284.107,65.258,5.63,0.95, +285.779,-42.095,4.75,-0.02, +285.989,-51.019,5.93,1.24, +284.323,62.397,6.45,0.93, +285.004,32.146,4.93,1.47, +285.42,-5.739,4.02,1.09, +285.653,-29.88,2.6,0.08, +285.615,-24.847,5.65,1.23, +284.748,50.809,6.3,0.98, +285.824,-38.253,5.74,0.32, +285.273,19.31,6.39,null, +283.388,75.788,6.22,null, +285.344,20.834,6.69,0.02, +285.079,40.684,6.65,null, +285.323,26.291,5.69,-0.08, +285.766,-19.245,6.05,1.29, +285.23,33.802,6.01,0.97, +285.779,-19.103,6.37,0.48, +285.395,25.026,6.72,null, +285.456,22.264,6.4,0.16, +285.59,8.374,6.3,1.67, +285.727,-3.699,5.42,0, +285.057,50.534,5.38,-0.18, +286.105,-31.047,5.5,0.03, +285.451,33.621,6.39,-0.12, +286.583,-52.341,5.16,0.53, +285.884,1.819,5.83,0.18, +285.36,46.935,5.01,0.19, +285.719,19.661,6.09,1.34, +286.171,-21.742,3.77,1.01, +285.181,55.658,5.48,0.86, +286.045,3.331,6.73,0.13, +286.101,-5.685,6.9,4.19, +287.47,-68.425,5.33,0.91, +285.927,21.268,6.52,0.32, +286.732,-48.299,5.97,-0.02, +284.719,69.531,6.52,-0.15, +286.24,-4.031,5.42,1.12, +286.605,-37.063,4.93,0.52, +286.605,-37.063,4.99,0.52, +317.193,-88.956,5.47,0.27, +285.529,52.261,6.31,1, +286.422,-15.66,5.97,-0.02, +286.328,-1.513,6.53,0.35, +286.719,-37.81,6.16,0.72, +287.217,-55.72,6.49,1.1, +286.735,-27.671,3.32,1.19, +286.352,13.863,2.99,0.01, +286.562,-4.882,3.44,-0.09, +286.241,31.744,5.56,1.54, +286.243,30.733,6.06,1.55, +286.718,-16.229,6.03,-0.04, +286.879,-28.637,6.04,1.61, +286.785,-18.738,6.29,-0.04, +287.087,-40.497,4.59,1.09, +286.593,8.23,6.09,1.6, +286.446,29.922,6.31,1.65, +286.788,0.642,6.56,0.05, +287.061,-24.657,6.3,0.04, +284.488,77.051,6.54,0.38, +286.744,11.071,5.09,-0.07, +287.07,-19.29,5.54,-0.11, +286.66,24.251,5.77,0.09, +286.23,53.397,5.38,-0.01, +286.291,49.923,6.43,null, +286.657,28.629,5.55,0.29, +287.368,-37.904,4.11,0.04, +287.415,-39.828,6.46,1.06, +287.402,-36.165,6.56,-0.02, +287.491,-41.892,5.88,-0.08, +286.571,41.414,6.49,-0.15, +287.507,-39.341,4.11,1.2, +286.989,16.853,6.07,0.7, +286.857,32.502,5.23,0.34, +286.825,36.1,5.28,-0.11, +287.015,21.699,6.23,0.4, +287.441,-21.024,2.89,0.35, +287.45,-19.804,6.13,1.16, +287.25,6.073,5.22,0.35, +287.168,16.851,6.48,0.52, +287.758,-39.005,6.36,0.01, +287.465,-0.428,6.34,-0.04, +287.829,-29.502,6.3,-0.04, +288.192,-50.486,6.13,0.95, +287.268,34.601,6.74,0.63, +288.041,-37.583,6.57,1.02, +289.119,-69.191,6.27,0.17, +287.108,52.426,5.81,1.09, +288.117,-21.658,6.41,1.13, +288.307,-25.907,5.8,1.38, +289.3,-66.661,5.53,0.18, +288.17,-7.939,5.34,0.13, +287.879,26.736,6.36,0.41, +288.665,-45.193,5.92,0.9, +288.315,-12.282,5.51,1.44, +287.942,31.283,5.98,-0.07, +287.846,40.429,6.18,0.09, +288.143,16.846,6.73,-0.01, +288.153,21.554,5.93,0.03, +288.428,2.294,5.15,-0.07, +288.434,5.516,6.49,0.09, +289.09,-45.466,5.4,1.35, +287.441,65.979,6.25,0, +288.888,-24.179,6.25,0.54, +288.885,-25.257,4.85,0.56, +288.019,49.854,6.75,0.65, +288.021,49.856,6.57,0.65, +287.919,56.859,5.12,1.01, +289.137,-33.522,6.25,0.02, +289.539,-53.387,6.38,0.49, +288.44,39.146,4.39,-0.15, +288.761,20.203,6,0.88, +288.834,15.084,5.57,1.07, +288.823,21.232,5.64,0.11, +288.853,30.526,5.85,1.67, +289.129,4.835,5.59,0.08, +289.409,-18.953,4.96,1.02, +288.988,27.456,6.54,-0.06, +289.054,21.39,4.77,-0.05, +289.112,14.545,5.63,-0.02, +288.998,27.927,6.16,0.61, +288.48,57.705,4.99,1.16, +288.139,67.662,3.07,1, +288.83,50.071,6.27,null, +287.291,76.561,5.13,0.31, +289.451,2.032,6.19,0.02, +289.092,38.134,4.36,1.26, +289.454,11.595,5.28,0.2, +289.917,-35.421,5.59,-0.13, +289.75,-15.536,6.06,1.43, +289.432,23.026,5.43,0.02, +289.635,1.085,5.1,1.15, +291.023,-68.371,6.34,1.23, +289.712,0.339,6.41,1.05, +289.214,46.999,6,0.44, +290.109,-31.818,6.58,1.67, +289.503,31.022,6.68,0.08, +289.72,9.618,6.32,1.05, +289.702,19.611,6.58,0.03, +290.159,-22.402,5.58,0.27, +289.276,53.369,3.77,0.96, +290.713,-54.424,5.05,0.02, +290.375,-34.984,6.48,0.63, +289.914,12.375,5.53,0.26, +289.971,11.535,6.02,0.08, +290.137,-5.416,5.01,0.92, +290.54,-42.016,6.34,1.14, +289.766,33.389,6.6,-0.19, +290.149,-0.892,5.49,-0.04, +290.66,-44.459,4.01,-0.1, +289.755,37.445,6.22,-0.03, +290.405,-19.234,6.26,-0.1, +290.418,-17.847,3.93,0.22, +289.657,49.57,6.31,1.12, +290.432,-15.955,4.61,0.1, +290.805,-44.8,4.29,0.34, +290.462,-18.308,5.87,1.06, +289.912,37.331,6.31,0.68, +290.138,35.186,6.31,-0.12, +290.586,-8.201,6.31,-0.1, +290.972,-40.616,3.97,-0.1, +290.59,-0.252,5.83,1.09, +291.089,-43.723,6.17,1.6, +289.902,54.376,6.26,0.03, +288.888,73.356,4.45,1.25, +290.769,-7.4,6.32,1.45, +290.702,9.913,6.35,0.44, +291.125,-27.866,6.04,-0.13, +290.067,57.645,5.91,1.58, +290.784,14.921,6.64,0.27, +290.712,26.263,5.18,-0.12, +290.639,33.518,6.06,1.03, +291.267,-29.309,5.93,1.26, +289.942,64.391,6.52,-0.04, +291.319,-24.509,5.03,0.23, +291.374,-23.962,5.43,1.43, +290.945,20.264,6.4,0.01, +290.356,57.767,6.43,null, +291.257,-4.884,6.52,0.33, +291.34,-13.897,5.69,1.43, +290.892,33.222,6.37,0.81, +291.092,16.938,6.25,0.08, +291.95,-54.325,5.69,1.4, +290.167,65.715,4.59,0.02, +291.032,29.621,4.97,-0.1, +291.243,11.944,5.16,0.77, +291.093,28.088,6.53,-0.08, +291.58,-21.777,5.59,1.22, +291.025,36.452,6.36,null, +291.375,3.115,3.36,0.32, +291.546,-15.053,5.72,0.02, +291.603,-14.551,6.7,0.05, +291.735,-29.743,5.67,0, +290.849,50.271,6.51,-0.08, +290.985,43.388,5.84,0.92, +292.795,-68.434,5.96,1.64, +291.343,20.271,6.31,-0.02, +291.369,19.799,5.16,0.98, +291.358,24.913,6.19,0.51, +291.63,0.339,4.66,0.6, +292.469,-55.441,6.13,0.98, +291.6,13.024,5.74,0.47, +291.555,20.098,5.63,-0.01, +291.62,19.891,5.81,1.55, +292.35,-43.446,5.71,0.22, +292.644,-55.11,6.3,0.45, +259.237,89.038,6.38,1.57, +291.538,36.318,5.15,-0.12, +291.891,14.283,6.32,-0.06, +292.087,2.93,5.85,0.01, +292.468,-26.986,5.52,1.12, +292.561,-32.092,6.6,0.39, +292.254,1.95,5.8,0.08, +291.445,58.027,6.6,-0.15, +292.34,-7.044,6.61,1.1, +291.902,37.941,6.34,-0.14, +292.325,0.246,6.25,1.32, +292.176,24.665,4.44,1.5, +292.237,24.769,5.81,1.03, +292.342,14.596,5.56,1.05, +291.858,52.321,5.75,0, +292.337,20.28,6.33,-0.1, +292.725,-21.312,6.13,0.12, +293.224,-53.186,5.75,0.3, +292.544,2.904,6.09,1.82, +291.61,62.557,6.38,1.39, +292.666,-2.789,5.03,1.75, +292.638,3.444,6.05,0.01, +293.34,-45.272,5.61,-0.04, +292.68,27.96,3.08,1.13, +292.689,27.965,5.11,-0.1, +292.695,36.229,6.25,-0.04, +292.426,51.73,3.79,0.14, +292.841,26.617,5.87,0.93, +293.535,-40.035,5.89,0.09, +290.418,79.603,6.05,0.07, +293.804,-48.099,4.9,1.09, +288.783,83.463,6.53,0.1, +292.943,34.453,4.74,-0.14, +292.83,50.307,5.53,1.25, +292.807,55.732,6.37,1.16, +293.523,7.379,4.45,1.17, +293.78,-10.56,5.12,1.13, +294.007,-24.719,5.65,0.19, +293.874,-7.46,6.34,1.12, +293.89,-12.253,6.27,1.09, +294.608,-57.983,6.18,0.97, +294.967,-66.686,6.39,0.02, +293.402,38.762,6.61,0.03, +293.645,19.773,5,-0.09, +293.855,2.913,6.38,0.41, +294.109,-18.853,6.11,0.27, +294.177,-24.884,4.6,-0.07, +293.712,29.463,5.38,0.55, +293.423,49.263,5.96,1.64, +294.264,-18.231,5.64,1.26, +293.672,42.413,5.35,0.05, +294.033,11.15,6.68,null, +294.223,-7.027,4.95,0, +294.18,-1.286,4.36,-0.08, +293.292,60.159,6.29,1.57, +294.066,14.392,6.38,1.04, +292.751,70.989,6.07,1.41, +293.583,51.237,5.73,0.48, +294.035,22.586,6.32,-0.07, +293.666,48.165,6.67,0.24, +294.393,-14.302,5.47,0.5, +295.406,-65.854,6.09,1.55, +294.219,11.273,5.98,0.88, +293.951,36.944,6.05,-0.11, +294.157,20.333,7.14,1.32, +295.076,-54.417,6.26,1, +294.447,-4.647,5.46,0.43, +294.925,-45.278,6.25,0.28, +293.09,69.661,4.68,0.79, +294.323,16.463,5.66,1.02, +294.982,-39.433,6.61,0.23, +293.983,50.239,6.52,1.06, +294.289,29.334,6.43,-0.09, +294.236,38.384,6.5,-0.15, +294.158,44.695,5.17,0.93, +294.11,50.221,4.48,0.38, +294.956,-23.428,6.34,0.03, +294.704,3.382,6.35,0.04, +294.573,20.783,6.48,1.08, +295.03,-23.429,5.97,1.04, +294.798,5.398,5.17,0.03, +294.856,16.571,6.38,2.07, +295.181,-16.293,6.2,1.13, +294.486,49.284,6.47,0.99, +294.844,30.153,4.69,0.97, +295.024,18.014,4.37,0.78, +295.18,-0.621,5.67,0.11, +294.937,33.979,6.1,0.08, +295.118,20.477,6.5,0.39, +294.86,42.818,5.4,-0.08, +294.672,54.974,5.82,0.44, +295.165,23.717,6.64,0.01, +295.273,13.816,6.01,-0.08, +294.893,45.958,6.2,0.9, +295.262,17.476,4.37,1.05, +295.63,-16.124,5.06,0.33, +295.312,22.453,6.36,1.53, +295.907,-37.539,6.16,0.01, +295.172,43.078,6.16,1.56, +295.553,12.193,6.34,-0.03, +299.006,-81.35,6.39,1.4, +295.209,45.525,5.06,0.4, +295.89,-15.47,5.49,0.46, +295.642,11.827,5.27,0.57, +297.355,-72.503,5.41,0.22, +295.49,40.254,6.23,0.18, +295.054,60.507,6.51,0.22, +295.705,29.332,6.49,0.33, +295.686,32.427,5.94,0.11, +295.454,50.525,5.96,0.64, +295.467,50.518,6.2,0.66, +295.79,30.679,6.05,0, +295.929,25.772,5.49,0.93, +296.505,-31.909,5.52,0.02, +295.983,27.136,6.28,1.1, +295.517,55.463,6.48,1.61, +297.005,-56.363,5.35,0.2, +296.142,13.303,6.26,-0.03, +295.964,34.163,6.05,-0.06, +297.472,-66.813,6.45,1.48, +295.937,41.773,5.84,1.57, +296.59,-19.761,4.86,0.93, +296.468,-2.883,6.48,0.05, +296.069,37.354,4.89,0.95, +296.203,29.265,6.82,0.64, +296.416,7.613,5.91,0.18, +296.159,34.414,6.57,null, +297.23,-52.888,6.25,1.13, +295.811,58.016,6.22,0.56, +296.204,40.717,6.34,1.64, +297.755,-65.605,6.05,0.3, +296.565,10.613,2.72,1.52, +295.915,57.043,6.27,0.88, +297.59,-61.061,6.21,-0.14, +296.244,45.131,2.87,-0.03, +296.415,36.091,6.43,-0.03, +296.464,35.013,6.09,1.06, +297.687,-59.193,5.42,0.08, +297.013,-13.703,6.11,0.2, +296.665,25.134,6.62,0.27, +296.607,33.728,4.99,0.47, +296.646,32.889,6.18,1.13, +296.847,18.534,3.82,1.41, +297.557,-47.557,5.94,1.7, +297.298,-28.789,6.05,0.4, +296.953,25.384,5.95,0.99, +297.259,-10.871,6.04,1.24, +297.127,10.694,6.44,0.96, +296.866,38.408,5.77,-0.06, +297.175,11.816,5.72,null, +296.077,69.337,5.92,0.05, +297.245,19.142,5,0.1, +296.862,47.908,6.12,1.64, +298.157,-54.971,5.74,0.92, +298.163,-54.977,6.5,0.1, +297.183,35.311,6.53,0.44, +297.211,33.437,6.44,0.2, +297.961,-39.874,5.33,-0.06, +297.695,-10.764,5.39,0.38, +297.573,7.903,6.51,-0.1, +297.365,38.71,6.11,0.9, +297.477,28.441,6.38,-0.06, +297.696,8.868,0.77,0.22, +298.668,-61.171,6.24,0.16, +297.796,-2.461,6.13,1.57, +297.757,10.416,5.11,0.55, +298.05,-19.045,5.92,0.98, +297.824,9.63,6.25,0.1, +296.686,68.438,6.34,0.28, +297.641,32.914,4.23,1.82, +297.767,22.61,4.95,-0.14, +297.642,38.723,5.12,1.69, +297.655,40.6,5.69,-0.04, +297.696,37.826,6.06,1.7, +298.015,11.629,6.13,0.65, +298.118,1.006,3.9,0.89, +298.277,-14.603,6.48,0.14, +298.065,10.351,6.54,-0.01, +298.007,24.992,5.57,0.71, +298.091,18.672,6.23,0.01, +298.328,-3.114,5.65,0.2, +297.657,52.988,5.03,1.28, +297.831,47.377,6.2,0.36, +298.574,-23.941,6.18,1.02, +299.672,-69.164,5.75,0.23, +298.344,4.401,6.53,0.02, +298.815,-41.868,4.13,1.08, +297.043,70.268,3.83,0.89, +298.068,36.432,6.1,1.43, +298.534,-8.574,5.79,1.64, +298.771,-33.046,6.46,1.48, +299.24,-57.926,6.53,1.53, +299.276,-58.901,5.26,-0.01, +299.721,-68.762,6.39,0.16, +297.996,47.027,5.62,-0.07, +300.148,-72.911,3.96,-0.03, +298.03,47.932,5.91,-0.18, +298.365,24.08,4.58,-0.06, +298.657,-8.227,5.71,-0.08, +298.659,-8.237,6.49,-0.04, +298.562,8.461,4.71,1.05, +298.687,0.274,5.61,0.1, +298.96,-26.299,4.7,0.75, +298.668,7.14,6.15,0.03, +298.832,-6.734,6.51,0.39, +298.255,47.808,6.29,-0.11, +298.63,24.319,5.52,-0.02, +298.828,6.407,3.71,0.86, +300.096,-66.949,5.76,1.04, +299.237,-27.17,4.52,1.46, +299.422,-38.058,6.55,0.39, +298.701,36.996,5.76,0.75, +298.777,30.195,6.57,-0.08, +298.323,57.524,5.14,-0.13, +299.005,16.635,5.36,0.67, +299.06,11.424,5.28,-0.01, +298.398,59.709,6.06,0.02, +300.468,-66.944,5.31,1.22, +298.965,38.487,4.94,-0.08, +299.488,-15.491,5.02,0.05, +299.077,35.083,3.89,1.02, +299.251,20.998,6.48,0.07, +299.735,-30.538,6.28,1.05, +299.738,-26.196,4.83,0.9, +298.908,52.439,4.92,0.12, +299.184,36.251,6.02,-0.15, +300.105,-49.351,6.17,1.06, +299.439,16.789,5.53,-0.05, +299.934,-35.276,4.37,-0.15, +299.964,-34.698,5.3,0.17, +300.436,-59.376,5.13,1.53, +298.842,58.25,6.09,1.02, +300.11,-43.043,6.14,1.64, +299.308,40.368,5.45,-0.1, +300.066,-37.702,5.95,1, +300.201,-45.113,5.81,0.28, +300.085,-33.704,5.66,0.49, +299.188,50.902,6.43,-0.01, +298.981,58.846,4.96,1.59, +299.079,56.687,6.12,null, +299.689,19.492,3.47,1.57, +299.845,1.378,6.17,1.13, +299.948,-9.958,5.88,0.58, +299.484,42.261,6.43,null, +300.36,-40.814,6.29,0.11, +299.658,30.984,5.49,-0.06, +299.794,23.101,5.67,null, +299.643,38.106,6.32,-0.09, +300.35,-22.737,6.01,0.97, +301.387,-67.321,6.07,0.64, +300.014,17.517,5.37,1.67, +299.835,45.772,5.92,0.16, +299.98,37.043,5.19,-0.17, +300.245,8.558,5.91,1.52, +300.494,-13.637,5.71,0.08, +300.665,-27.71,4.58,1.65, +299.814,52.056,6.15,-0.19, +300.89,-37.941,4.77,1.41, +300.275,27.754,4.64,0.18, +299.62,63.534,5.96,0.09, +300.314,37.099,6.2,1.31, +300.436,24.8,5.88,-0.12, +300.506,24.938,5.22,0.36, +300.935,-22.596,6.45,0.5, +301.082,-32.056,4.99,1.21, +300.34,50.105,5.05,1.11, +301.005,-7.47,6.72,0.35, +300.818,18.501,5.96,1.42, +302.085,-66.355,6.45,1.58, +300.875,16.031,5.67,-0.1, +302.182,-66.182,3.56,0.76, +299.675,70.367,6.33,0.88, +301.097,-0.709,5.68,1.3, +301.384,-33,6.53,-0.08, +301.035,7.278,5.52,1.06, +300.906,29.897,5.71,0.73, +301.273,-11.599,6.34,0.52, +301.026,17.07,5.8,0.61, +301.847,-52.881,4.94,1.62, +301.896,-55.016,6.26,0.53, +301.36,-12.665,6.55,0.04, +300.369,64.821,5.27,1.56, +301.244,23.21,6.45,null, +301.15,32.219,5.64,0.54, +301.29,19.991,5.1,1.06, +301.36,15.5,6.34,1.64, +301.551,-4.078,6.47,1.16, +300.585,64.634,6.57,null, +301.291,38.478,6.19,0.64, +301.12,48.23,6.16,0.04, +300.705,67.874,4.51,1.32, +299.903,76.481,6.2,1.61, +301.278,51.839,6.14,1.6, +301.723,23.614,5.07,-0.18, +301.591,35.973,5.36,0.85, +302.008,-0.678,5.99,1.02, +302.78,-57.524,6.37,0.06, +301.34,56.341,6.21,0.43, +301.96,9.4,6.43,0.46, +302.13,-10.063,6.18,0.06, +301.186,63.891,6.26,0.1, +302.027,16.664,6.42,1.91, +301.558,53.166,5.85,0.39, +306.227,-83.311,6.17,0.2, +301.923,34.423,6.11,0.16, +302.16,10.726,6.31,-0.12, +301.387,61.996,5.39,1.18, +301.798,50.229,6.54,0.13, +302.8,-36.101,5.32,0.87, +301.222,68.027,6.28,1.65, +302.486,20.915,6.48,0.38, +303.1,-42.781,6.22,1.23, +303.612,-63.416,6.09,0.31, +302.357,36.84,4.93,-0.13, +302.792,-8.842,6.49,-0.15, +302.826,-0.821,3.23,-0.07, +302.64,26.904,5.52,0.08, +302.991,-12.392,6.34,1.21, +302.765,21.135,6.22,0.9, +303.579,-52.446,5.65,1.5, +303.108,-12.617,5.85,0.48, +302.838,21.876,6.26,-0.02, +303.147,0.868,6.27,0.02, +302.95,26.809,5.49,1.41, +303.003,26.479,5.92,-0.11, +303.308,-1.009,5.47,1.43, +303.016,47.737,6.92,-0.12, +303.823,-27.033,5.73,0.88, +303.419,24.239,6.56,0.29, +303.569,15.198,4.95,0.08, +303.961,-30.005,6.3,1.51, +303.132,51.464,6.01,1.14, +302.895,62.079,5.75,0.47, +304.099,-36.454,6.39,1.54, +304.11,-35.198,6.53,0.37, +303.325,46.816,4.83,0.09, +303.56,28.695,5.18,0.18, +304.763,-63.231,6.27,1.04, +303.428,43.379,6.14,1.5, +303.521,36.605,6.45,0, +303.408,46.741,3.79,1.28, +303.633,36.806,4.97,0.14, +303.59,42.104,6.71,-0.04, +304.095,-12.337,6.32,0.01, +303.816,25.592,4.78,-0.18, +303.35,56.568,4.3,0.11, +303.876,23.509,5.15,1.04, +303.365,60.641,5.79,1.47, +303.849,33.729,5.66,0.91, +303.942,27.814,4.52,1.26, +304.733,-47.711,6.31,1.67, +304.082,21.599,6.13,1.04, +304.412,-12.508,4.24,1.07, +304.506,-21.81,5.87,1, +304.825,-47.58,6.13,0.46, +302.222,77.711,4.39,-0.05, +303.868,47.714,3.98,1.52, +304.014,38.898,6.27,0.01, +304.196,24.671,5.32,0.95, +304.514,-12.545,3.57,0.94, +303.931,50.233,6.31,null, +304.002,45.579,5.91,0.38, +304.118,37.056,6.48,-0.09, +305.135,-55.051,6.27,1.59, +304.23,40.365,5.24,1.65, +304.381,29.148,6.22,1.01, +304.848,-19.119,5.28,1.4, +304.371,42.722,6.29,1.64, +304.447,38.033,4.81,0.42, +305.117,-29.197,6.3,0.17, +305.216,-35.674,6.46,1.31, +305.421,-49.999,6.27,0.55, +304.529,40.732,5.84,0.1, +304.93,-1.079,6.06,1.09, +304.619,37,5.58,0.06, +304.663,34.983,5.17,0.65, +304.872,13.217,6.21,1.63, +305.109,-6.362,6.63,1.55, +305.166,-12.759,4.76,-0.05, +305.001,13.548,5.95,0.31, +305.194,-14.785,6.1,-0.02, +305.253,-14.781,3.08,0.79, +304.707,46.323,6.45,-0.13, +305.085,14.569,6.13,0.91, +305.615,-42.05,5.59,0, +305.089,17.793,5.8,1.49, +304.603,55.397,5.76,0.11, +304.951,37.133,6.57,0, +304.38,66.854,5.93,0.58, +305.063,39.403,6.23,0.06, +308.323,-80.965,5.77,1.14, +304.984,46.838,6.5,-0.06, +305.972,-42.423,5.64,0.2, +305.753,-9.655,6.3,0.91, +305.514,24.446,5.54,-0.06, +306.412,-56.735,1.94,-0.2, +305.127,53.596,6.18,1.56, +304.903,62.258,5.72,-0.05, +305.718,14.551,6.17,0.51, +305.795,5.343,5.31,0.97, +305.513,41.131,6.39,1.07, +305.557,40.257,2.2,0.68, +305.656,31.265,6.09,1.35, +305.523,45.795,5.58,1.08, +306.45,-40.796,6.09,1.36, +305.689,41.026,5.93,1.6, +306.362,-28.663,5.85,1.1, +305.731,42.983,6.2,0.95, +306.156,1.069,6.15,-0.04, +305.025,68.88,5.55,1.59, +305.298,63.98,5.69,1.56, +305.965,32.19,4.43,1.33, +305.935,37.476,5.9,-0.2, +306.721,-37.403,6.25,0.97, +306.427,-2.8,6.11,1.19, +306.433,10.056,6.33,1.56, +306.419,21.41,5.66,0.93, +309.578,-81.289,5.91,1.71, +306.505,19.865,6.41,1.02, +306.83,-18.212,5.25,-0.07, +306.135,53.552,6.51,0.01, +306.597,17.316,6.22,1.01, +307.195,-35.596,6.1,-0.11, +306.271,59.6,6.44,0.09, +307.182,-15.742,6.41,0.99, +307.031,8.438,6.25,1.08, +307.104,-3.358,6.13,-0.06, +307.215,-17.814,4.78,0.38, +306.782,34.329,6.39,0.48, +307.07,2.937,6.21,0.9, +307.38,-22.392,6.16,1.55, +306.893,38.44,5.62,0.06, +306.598,56.639,6.36,0, +306.76,49.383,5.69,0.26, +307.469,-18.587,6.74,0.22, +307.475,-18.583,5.94,0.08, +307.413,-2.886,4.91,1.15, +307.737,-29.112,6.39,0.21, +307.338,20.088,6.55,0.23, +307.349,30.369,4.01,0.4, +307.335,36.455,5.88,0.52, +307.575,10.896,6.08,-0.03, +307.768,-15.056,6.12,0.79, +308.965,-69.611,6.11,1.29, +307.742,20.606,6.18,0.15, +307.804,11.261,7.11,0.03, +307.5,45.929,6.41,1.13, +308.218,-24.944,6.36,-0.01, +307.363,56.068,5.91,-0.04, +307.515,48.952,4.95,-0.09, +308.099,-9.853,5.65,0.69, +308.48,-44.516,5.11,1.01, +307.747,36.936,6.19,1.01, +308.895,-60.582,4.76,0.28, +307.993,25.804,6.34,0.26, +307.395,62.994,4.22,0.2, +307.828,49.22,5.44,1.55, +308.303,11.303,4.03,-0.13, +308.731,-38.09,6.44,0.26, +307.838,52.31,6.18,1.01, +308.549,-13.721,6.13,0.54, +308.698,-30.474,6.4,-0.08, +308.473,10.06,6.56,0.08, +308.488,13.027,5.38,0.07, +309.397,-61.53,4.88,0.43, +307.944,56.78,6.14,1.43, +308.218,43.192,6.6,-0.11, +308.542,20.985,6.48,-0.14, +310.512,-76.181,6,0.44, +310.432,-75.351,6.55,0.62, +308.884,-16.526,6.19,0.2, +308.476,35.251,4.61,1.6, +308.452,41.772,6.49,1, +307.503,72.532,6.27,1.35, +309.392,-47.291,3.11,1, +308.479,46.694,5.78,-0.16, +308.827,14.674,4.68,0.11, +309.964,-62.908,6.22,1.1, +309.182,-2.55,4.89,1.6, +309.035,25.883,6.41,0.21, +310.011,-60.549,5.12,0.53, +308.71,51.854,6.11,0.41, +309.467,-25.109,6.36,0.33, +309.326,0.097,6.22,-0.08, +307.877,74.955,5.2,0.07, +309.27,26.462,5.59,-0.07, +310.488,-66.761,5.15,-0.06, +309.388,14.595,3.63,0.44, +309.455,11.378,5.43,0.06, +309.585,-1.105,4.32,0.95, +309.383,31.572,6.32,-0.09, +309.477,18.269,6.25,1.48, +309.386,31.522,6.49,0.34, +309.348,38.329,6.2,0.99, +309.818,-14.955,5.22,-0.12, +309.805,-2.413,6.22,-0.1, +309.63,21.201,4.82,-0.02, +309.683,13.315,5.72,1.53, +310.083,-33.432,5.47,1.12, +309.633,24.116,5.04,-0.14, +309.646,23.681,5.91,0.98, +309.782,10.086,5.05,0.72, +309.854,0.486,5.16,1.06, +310.049,-23.774,6.37,0.72, +309.771,15.838,5.97,-0.14, +310.013,-18.139,5.1,1.66, +307.061,81.423,5.46,1.02, +310.15,-26.645,6.51,0.57, +309.794,21.817,6.08,-0.06, +309.748,30.334,5.68,1.09, +310.135,-16.124,5.8,1, +309.91,15.912,3.77,-0.06, +309.966,11.25,6.42,0.55, +307.365,81.091,5.96,0.92, +310.349,-31.598,5.76,1.53, +310.35,-26,6.28,1.22, +309.889,40.579,6.06,-0.16, +309.846,45.667,6.58,-0.06, +311.24,-66.203,3.42,0.16, +310.188,19.935,6.45,0.63, +310.721,-39.559,6.29,1.08, +309.751,56.005,6.48,null, +310.151,29.805,6.08,0.14, +310.318,14.583,5.99,1.24, +310.013,43.459,5.95,1.19, +311.01,-51.921,4.51,0.27, +310.261,32.307,5.51,0.88, +310.252,39.082,6.51,-0.12, +310.493,17.521,6.22,0.94, +310.358,45.28,1.25,0.09, +310.075,60.505,6.01,0.46, +310.485,41.717,5.67,-0.12, +310.593,35.456,6.66,-0.16, +310.865,15.074,4.43,0.32, +310.552,50.34,5.39,-0.1, +307.263,83.626,6.19,0.13, +311.305,-27.247,6.5,0.94, +310.851,35.588,6.47,1.23, +311.584,-39.199,5.5,-0.1, +312.325,-68.776,5.41,1.12, +311.578,-36.12,6.49,0.39, +311.524,-25.271,4.14,0.43, +311.542,-21.514,5.93,0.04, +310.665,60.601,6.15,0.01, +311.219,25.271,4.91,1.18, +310.806,57.114,6.32,0.33, +311.368,18.09,6.38,1.68, +311.415,30.72,4.22,1.05, +312.122,-43.989,5.11,0.35, +311.092,56.488,5.78,1.67, +310.796,66.658,5.58,0.22, +311.765,-2.487,6.27,1.55, +311.661,16.124,5.14,0.49, +311.665,16.124,4.27,1.04, +311.553,33.97,2.46,1.03, +311.919,-9.496,3.77,0, +311.934,-5.028,4.42,1.65, +312.371,-46.227,4.89,1.52, +311.951,6.008,5.58,-0.02, +311.949,3.307,6.4,-0.02, +311.338,57.58,4.51,0.54, +311.795,34.374,4.92,1.32, +311.323,61.839,3.43,0.92, +311.66,46.532,6.3,0.03, +312.91,-62.429,6.28,0.15, +312.912,-62.429,6.59,0.17, +312.323,-25.781,5.86,-0.07, +311.588,52.995,6.33,1.12, +311.852,36.491,4.53,-0.11, +312.335,-18.036,6.21,1.42, +312.492,-33.78,4.9,1, +311.837,45.58,6.4,1.61, +311.138,69.752,6.41,null, +312.875,-51.608,5.05,1.13, +311.955,47.832,5.57,1.46, +312.696,-32.054,6.36,1.54, +312.753,-37.913,5.52,1.38, +311.97,52.407,6.27,0.89, +312.408,12.545,5.98,0.43, +312.451,7.864,6.33,0.02, +312.496,5.545,6.21,0.98, +312.674,-12.545,5.88,1.07, +312.235,46.114,4.84,0.41, +312.178,51.911,6.29,-0.07, +312.995,-33.177,6.04,0.03, +312.955,-26.919,4.11,1.64, +312.654,18.051,6.52,0.04, +312.857,-5.626,5.99,0.46, +312.478,46.661,6.33,-0.07, +312.52,44.059,5.04,0.2, +313.036,-5.507,5.55,-0.08, +313.703,-58.454,3.65,1.25, +313.418,-39.81,5.35,1.32, +312.868,28.251,5.77,0.72, +313.255,-23.783,6.33,0.88, +313.163,-8.983,4.73,0.32, +313.354,-30.719,6.35,1.09, +313.646,-50.728,6.24,-0.12, +312.323,64.042,6.45,0.07, +313.273,-11.574,6.38,0.67, +313.032,27.097,4.59,0.83, +313.001,32.849,6.44,-0.15, +313.528,-27.926,6.41,1.6, +313.493,-6.89,6.44,0.37, +313.281,29.649,6.34,1.09, +313.7,-17.923,5.78,1.12, +313.312,44.387,4.78,-0.14, +310.647,82.531,5.75,0, +313.328,45.182,5.45,1.1, +313.36,42.41,6.66,-0.04, +313.475,33.438,5.47,1.52, +313.784,-1.373,6.55,0.29, +313.593,28.522,6.56,-0.13, +313.64,28.058,5.01,1.48, +313.593,40.703,6.7,-0.07, +313.92,4.533,6.05,0.82, +313.903,13.721,5.17,1.12, +313.911,12.569,5.58,0.12, +314.197,-26.296,5.7,0.5, +314.076,-3.561,6.57,-0.1, +314.225,-9.697,5.51,1.47, +311.889,80.552,5.39,1.12, +314.294,0.464,6.05,1.22, +314.419,-16.032,5.87,0.18, +315.367,-68.21,6.37,0.1, +313.958,47.418,5.67,0.47, +316.179,-77.024,5.15,0.49, +314.054,51.075,6.63,-0.1, +314.145,44.925,5.96,0.05, +314.675,-14.483,6.01,0.23, +314.106,50.729,5.81,0.3, +314.108,49.196,5.9,1.04, +315.09,-51.265,5.76,0.47, +314.293,41.167,3.94,0.02, +314.071,56.888,6.23,-0.18, +314.608,10.839,5.48,0.93, +314.999,-36.13,6.11,0.39, +314.568,22.326,5.31,1.4, +314.9,-19.035,6.25,-0.13, +314.768,4.294,5.23,0.46, +314.581,44.472,5.55,0.97, +314.628,41.94,6.16,-0.08, +314.962,16.824,6.66,0.38, +315.016,7.516,5.99,0.26, +315.323,-32.258,4.67,0.89, +314.625,50.462,5.61,-0.15, +315.141,-4.73,6.21,0.63, +315.553,-43.002,6.64,0.68, +313.685,75.926,6.05,0.93, +315.115,19.329,5.65,1.61, +315.439,-26.881,6.05,0.06, +315.613,-38.531,5.94,1.11, +314.957,47.521,4.74,-0.05, +315.742,-38.632,5.3,0.41, +314.856,59.439,5.51,1.4, +315.793,-27.732,6.25,0.95, +315.304,36.026,5.97,0.98, +317.2,-76.212,6.58,1.23, +315.295,46.156,5.37,-0.21, +315.748,-0.925,6.5,-0.1, +316.309,-54.727,5.16,1.21, +315.763,1.532,6.25,0.48, +315.758,14.73,6.31,1.67, +316.019,-5.823,7.31,null, +316.02,-5.823,5.89,0.68, +316.101,-19.855,4.84,0.17, +317.343,-73.173,5.68,0.59, +315.6,44.791,6.19,1.69, +315.77,38.658,6.07,1.01, +315.702,45.849,6.48,-0.15, +315.538,56.67,5.83,-0.07, +316.145,5.503,5.61,1.65, +316.174,2.942,6.42,1.05, +316.189,2.27,6.33,0.97, +316.606,-41.386,5.53,1.35, +316.505,-30.125,5.68,1.03, +315.967,41.628,6.33,0.38, +315.858,50.352,6.37,0.98, +317.137,-63.929,5.76,1.18, +315.93,46.862,6.32,0.25, +316.487,-17.233,4.07,-0.01, +316.603,-32.342,5.18,1.1, +316.361,5.958,5.94,0.54, +315.948,53.286,5.9,0.99, +316.233,43.928,3.72,1.65, +316.782,-25.006,4.5,1.61, +317.836,-72.544,6.2,1.08, +316.598,26.924,6.12,1.05, +316.936,-17.455,6.17,0.02, +316.626,31.185,5.82,0.56, +316.728,38.746,5.21,1.18, +316.73,38.743,6.03,1.37, +317.14,-21.194,5.3,0.01, +316.89,15.659,6.34,1.01, +316.65,47.648,4.55,1.57, +317.118,6.989,6.15,1.66, +317.387,-20.556,6.25,0.38, +318.335,-70.126,5.02,1.58, +317.399,-11.372,4.51,0.94, +317.162,30.206,5.59,-0.1, +317.493,2.943,6.45,0.37, +317.695,-9.354,6.27,1.16, +317.585,10.132,4.69,0.26, +317.63,10.049,6.07,0.02, +316.597,71.432,5.87,0.4, +318.057,-40.269,5.83,0.45, +317.633,22.455,6.68,0.03, +317.922,-14.472,6.48,0.28, +317.494,45.503,6.63,-0.16, +318.263,-39.425,5.26,0.44, +317.766,36.299,6.54,-0.14, +317.565,53.563,5.73,-0.12, +317.629,47.692,6.46,-0.01, +318.329,-36.424,5.96,0.98, +317.37,63.296,6.54,-0.13, +318.322,-27.619,5.42,1.42, +319.567,-75.347,6.63,0.03, +316.372,78.126,5.91,-0.07, +317.383,68.49,7.33,1.49, +318.941,-53.263,5.75,0.19, +318.234,30.227,3.2,0.99, +318.37,15.983,6.27,0.24, +318.811,-40.506,6.21,1.14, +318.57,-10.605,6.77,-0.08, +317.951,59.986,5.64,0.11, +318.36,36.634,6.05,0.21, +318.654,0.092,6.38,1.61, +318.778,-17.345,6.04,0.96, +318.62,10.007,4.49,0.5, +318.945,-36.211,6.12,1.37, +319.501,-64.682,6.31,-0.07, +318.543,29.901,6.17,1.09, +318.908,-20.652,5.24,1.17, +318.937,-15.171,5.28,1.64, +323.018,-84.81,6.45,1.4, +318.698,38.046,3.72,0.39, +318.956,5.248,3.92,0.53, +319.165,-1.608,6.48,0.98, +318.427,64.404,6.39,0.6, +319.306,-13.279,6.4,0.04, +319.485,-32.172,4.71,0.06, +318.903,47.974,6.46,-0.15, +319.489,-17.985,5.43,-0.12, +319.123,42.251,6.43,null, +319.565,-17.462,7.05,0.34, +319.967,-53.45,4.39,0.19, +319.546,-4.519,5.82,-0.13, +319.727,-28.766,6.4,0.97, +319.354,39.395,4.23,0.12, +319.347,42.683,6.19,-0.11, +320.04,-45.022,6,2.33, +319.48,34.897,4.43,-0.11, +319.258,53.998,6.13,0.05, +319.941,-26.353,6.56,0.73, +319.717,11.203,5.96,1.65, +319.31,55.798,5.98,1.45, +320.19,-40.81,4.82,0.02, +320.318,-49.938,6.38,1.32, +319.328,58.612,6.42,0.2, +319.613,43.946,5,-0.01, +319.73,41.041,6.15,0.3, +321.07,-69.734,6.41,2.82, +319.843,38.238,5.83,0.5, +320.058,22.026,6.29,-0.08, +321.325,-71.799,6.09,1.26, +320.268,-4.56,5.87,0.92, +319.87,49.51,5.76,-0.15, +319.645,62.586,2.44,0.22, +320.27,7.354,5.82,1.66, +319.816,58.624,5.66,1.38, +320.268,23.856,5.57,1.05, +320.209,32.453,5.68,1.08, +320.562,-16.834,4.28,0.9, +318.926,77.012,5.95,1.5, +320.342,32.613,6.04,0.03, +320.256,40.346,6.4,0.53, +319.843,64.872,5.18,-0.04, +320.752,-22.669,5.6,1.63, +320.522,19.804,4.08,1.11, +318.34,81.231,6.15,0.09, +320.735,-9.319,5.99,1.54, +323.477,-82.683,6.38,0.13, +321.087,-46.615,6.31,0.2, +320.723,6.811,5.16,0.05, +320.14,60.757,6.11,1, +321.103,-41.007,5.77,-0.05, +321.611,-65.366,4.22,0.49, +320.675,30.31,6.05,1.08, +321.04,-20.852,5.41,1.16, +321.033,-22.747,6.38,1.02, +320.502,49.389,5.69,1.1, +320.695,38.634,6.63,0.01, +321.048,-12.878,5.49,0.29, +321.564,-54.661,6.12,0.34, +320.846,37.407,6.58,null, +320.995,24.274,5.71,0.32, +321.102,10.174,6.35,0.47, +321.215,-3.398,6.36,0.33, +320.951,37.351,6.47,null, +321.031,25.312,6.15,null, +321.305,-9.749,5.7,0.2, +322.187,-69.505,5.34,1.55, +321.096,24.529,6.32,1.04, +321.142,26.174,5.68,0.31, +321.321,-3.557,5.49,1.46, +321.595,-37.829,5.63,1.19, +323.336,-80.039,6.47,0.04, +321.757,-42.548,5.51,0.39, +321.465,0.534,6.46,0.16, +321.667,-22.411,3.74,1, +321.617,1.103,6.13,0.44, +321.231,49.323,6.58,-0.03, +321.812,-21.196,5.78,1.44, +321.332,46.714,5.6,0.32, +321.446,36.668,5.94,-0.08, +321.611,19.376,6.07,0.22, +322.251,-53.706,6.39,1.14, +322.058,-11.568,6.61,0.49, +322.181,-21.807,4.51,0.91, +322.266,-31.239,6.5,0.03, +321.839,37.117,5.31,-0.14, +321.715,48.835,5.31,0.07, +321.917,27.609,5.41,0.04, +321.688,52.899,6.03,-0.12, +322.103,8.196,6.4,1.64, +322.035,32.225,5.8,0.32, +322.25,17.906,6.44,1.39, +322.498,-19.148,6.57,0.41, +322.25,22.179,5.93,1.53, +321.855,59.75,6.1,1.75, +322.487,23.639,4.57,1.62, +322.22,55.419,6.12,0.14, +321.942,66.809,5.44,-0.11, +322.363,46.541,5.24,0.97, +323.025,-41.179,5.29,1.1, +323.061,-33.945,5.97,0.05, +322.79,12.138,6.08,-0.05, +322.89,-5.571,2.91,0.83, +323.324,-52.738,6.41,1.48, +324.734,-79.443,6.18,0.46, +323.139,-24.591,6.43,0.2, +323.348,-44.849,5.57,1.04, +322.585,52.958,6.02,0.08, +322.165,70.561,3.23,-0.22, +321.207,80.525,5.97,0.92, +323.113,23.394,6.7,-0.09, +323.571,-42.925,6.32,1.09, +322.865,52.62,6.16,0.9, +322.747,60.459,5.53,0.12, +323.721,-29.696,6.41,-0.11, +323.713,-20.084,5.69,0.4, +323.236,49.978,5.75,-0.03, +323.816,-23.454,6.4,1.1, +323.325,45.854,6.25,1.81, +324.512,-64.824,6.2,0.03, +323.642,22.755,6.47,0.51, +323.823,-3.983,5.77,1.11, +323.495,45.592,4.02,0.89, +324.046,-26.171,5.73,0.22, +325.369,-77.39,3.76,1, +323.694,38.534,4.9,1.08, +324.204,-33.048,6.11,0.22, +323.829,28.197,6.31,0.35, +323.863,24.452,6.11,null, +323.615,51.698,6.15,0.02, +324.27,-19.466,4.68,-0.17, +324.058,30.056,6.36,null, +324.01,45.375,5.53,1.58, +324.391,-0.39,6.25,0.06, +324.438,-7.854,4.69,0.17, +324.432,6.618,6.18,0.02, +324.238,40.414,5.01,0.18, +324.439,19.319,5.45,0.3, +324.775,-33.679,6.28,0.92, +324.999,-52.359,6.21,0.6, +324.633,5.772,5.67,0.25, +325.14,-55.738,6.33,1.06, +324.366,44.697,6.2,0.19, +324.867,-10.577,6.08,1.03, +324.688,25.499,6.16,1.02, +324.411,54.042,6.15,0.99, +324.755,20.265,5.85,0.32, +324.889,2.244,5.1,1.04, +325.023,-16.662,3.68,0.32, +324.48,62.082,4.73,0.3, +327.726,-82.719,5.29,0.75, +324.74,57.489,5.62,0.21, +325.442,-25.102,6.49,1.19, +325.387,-14.047,5.18,0.65, +325.046,43.274,5.11,1.6, +325.503,-23.263,5.24,0.95, +326.37,-71.009,6.01,-0.1, +325.542,1.285,5.67,1.44, +325.665,-18.866,4.73,0.88, +325.565,5.68,5.3,1.64, +325.18,54.872,6.2,1.16, +325.393,40.805,6.11,0.07, +325.638,10.825,6.09,-0.11, +325.806,-19.621,6.22,0.27, +341.369,-88.818,6.57,0.28, +325.768,-14.4,5.88,0.25, +325.505,35.51,6.07,2.52, +325.535,45.766,6.17,1.55, +326.123,-38.552,6.3,1.12, +325.595,41.077,5.69,0.01, +325.524,51.19,4.67,-0.12, +326.004,-14.749,5.99,0.21, +326.329,-49.499,6.45,1.15, +325.662,49.6,6.09,1, +326.237,-33.026,4.34,-0.05, +325.777,41.155,5.49,1.59, +325.857,38.284,5.65,0, +326.047,9.875,2.39,1.53, +326.036,28.743,4.73,0.48, +326.035,28.743,6.08,0.36, +326.251,-9.082,5.09,1.11, +325.689,59.271,6.08,1.34, +326.128,17.35,4.34,1.17, +326.13,14.772,5.94,0.59, +326.161,25.645,4.13,0.43, +325.877,58.78,4.08,2.35, +325.48,71.311,4.56,1.1, +326.568,-9.276,6,1.66, +326.634,-11.366,5.58,-0.01, +326.435,35.857,6.4,1, +326.518,22.949,5.29,1.41, +326.76,-16.127,2.87,0.29, +327.066,-47.304,5.58,0.6, +325.767,72.32,5.17,1.05, +326.6,25.563,6.28,1.21, +326.934,-30.898,5.01,0.04, +326.222,62.461,5.95,0.31, +326.808,2.686,5.64,0, +326.569,43.061,6.54,0.28, +326.77,17.194,6.21,0.34, +327.5,-64.713,5.62,1.02, +326.909,-5.917,6.17,0.22, +327.696,-69.629,5.53,1.37, +326.362,61.121,4.29,0.52, +326.698,49.309,4.23,-0.12, +327.035,36.581,6.47,null, +327.421,-12.723,6.31,0.22, +327.123,38.649,6.12,-0.08, +326.855,60.693,5.52,1.52, +327.555,-16.845,6.38,1.42, +327.362,20.463,6.29,-0.1, +326.754,70.151,6.29,null, +327.461,30.174,5.04,-0.03, +327.536,17.286,5.29,0.37, +327.417,41.149,6.48,0.42, +327.924,-18.623,6.16,0.36, +327.329,61.273,6.17,1.67, +327.893,19.827,5.77,-0.1, +327.77,39.537,6.17,-0.08, +328.076,21.273,6.89,null, +328.324,-13.552,5.08,0.37, +328.798,-61.886,5.9,0.39, +328.482,-37.365,3.01,-0.12, +328.125,28.793,5.53,0.42, +328.4,-10.312,6.59,-0.12, +328.266,25.925,5.08,-0.17, +328.004,55.797,5.71,-0.13, +328.406,19.668,5.68,0.01, +328.491,6.864,6.15,0.8, +328.543,-4.276,5.71,1.18, +327.905,65.753,6.37,null, +329.058,-57.899,6.19,0.21, +328.65,-3.301,6.2,0.48, +328.573,19.718,6.39,0.97, +328.982,-30.606,6.41,0.93, +329.095,-37.254,5.46,0.08, +329.259,-37.747,6.18,0.33, +329.48,-54.992,4.4,0.28, +329.625,-59.012,6.12,0.46, +330.467,-77.663,6.41,0.22, +328.722,56.611,5.8,0.73, +329.1,21.24,6.4,1.7, +329.235,12.076,5.54,0.05, +328.836,61.542,6.13,1.6, +328.88,65.321,5.86,-0.06, +329.555,-5.425,6.33,0.37, +329.259,48.669,6.42,-0.08, +329.682,-21.183,6.12,1.65, +329.825,-38.395,5.5,1, +330.766,-76.119,5.95,0.39, +330.1,-55.883,6.01,-0.1, +329.729,-4.373,6.22,1, +329.163,63.626,4.91,1.77, +329.296,66.156,6.43,-0.05, +330.033,6.718,6,-0.12, +330.209,-28.454,5.42,-0.09, +330.84,-56.786,4.69,1.06, +329.722,62.698,5.93,1.67, +329.846,57.658,6.59,0.03, +330.271,0.605,5.58,1.28, +330.112,33.006,6.46,null, +330.273,13.12,5.6,0.34, +330.288,8.257,5.65,1.44, +330.55,-17.904,6.28,1.01, +329.463,74.997,6.35,1.56, +330.611,-16.964,6.37,0.42, +330.506,10.974,6.37,-0.1, +330.822,-29.904,7.1,0.32, +330.164,62.488,6.66,0.06, +329.813,73.18,5.03,0.44, +330.818,-6.522,5.54,0.96, +330.829,-2.155,4.69,-0.06, +330.461,52.882,5.78,-0.11, +330.829,11.386,5.8,-0.07, +331.1,-29.917,6.47,1.63, +330.519,58.001,5.56,0.06, +330.736,44.65,5.6,-0.03, +331.153,-26.822,5.96,-0.14, +331.462,-59.636,5.62,1.46, +331.198,-0.907,5.3,0.23, +331.529,-39.543,4.46,1.37, +331.143,32.942,6.38,1.1, +331.42,5.059,4.84,1.44, +331.446,-0.32,2.96,0.98, +331.297,26.674,5.78,1.25, +330.97,63.12,5.29,1.58, +330.948,64.628,4.29,0.34, +331.609,-13.87,4.27,-0.07, +331.395,28.964,5.7,-0.06, +332.677,-75.881,6.55,1.18, +331.318,46.745,6.13,1.61, +331.461,45.112,6.44,-0.03, +329.553,82.87,6.98,0.52, +331.508,45.014,5.14,1.57, +332.058,-46.961,1.74,-0.13, +331.252,62.786,5.27,1.41, +331.463,48.232,6.27,-0.06, +331.287,62.28,5.11,0.08, +331.552,45.249,6.19,0.09, +331.753,25.345,3.76,0.44, +332.096,-32.989,4.5,0.05, +332.98,-76.116,6.15,1, +332.108,-34.044,4.99,1.48, +331.556,56.343,6.39,-0.1, +331.869,19.476,5.75,null, +331.875,18.001,6.35,1.64, +332.178,-33.126,6.37,0.2, +331.96,21.703,5.78,-0.1, +332.246,-18.52,5.81,-0.17, +332.492,-48.107,6.43,1.39, +332.072,25.544,6.11,0.27, +331.79,58.841,6.32,0.88, +331.856,53.307,6.14,0.43, +332.482,-34.015,5.37,0.24, +332.069,49.796,6.42,null, +332.5,-28.292,6.44,0.15, +332.537,-32.548,4.92,0.48, +332.171,45.742,6.11,0.72, +332.307,33.172,5.58,1, +332.55,6.198,3.53,0.08, +332.588,-3.894,6.27,-0.01, +332.656,-11.565,5.46,-0.12, +332.641,-4.267,6.01,0.98, +332.497,33.178,4.29,0.46, +332.579,19.617,6.18,0.69, +332.593,14.63,6.33,1.08, +332.76,-21.232,6.09,0.5, +332.656,11.624,5.78,1.58, +332.626,20.978,6.46,0.12, +332.715,30.553,6.32,0.18, +332.964,16.041,5.95,0.95, +333.107,-14.194,6.03,0.38, +332.791,50.823,5.4,0.15, +333.24,-26.328,6.17,0.17, +332.714,58.201,3.35,1.57, +333.033,24.95,5.92,1.51, +333.182,-4.721,6.39,0.5, +332.452,72.341,4.79,0.92, +332.878,59.414,5.04,0.25, +333.435,-25.181,5.58,0.49, +334.46,-77.512,5.51,0.31, +332.953,56.839,5.24,0.51, +332.564,72.111,6.37,-0.06, +332.662,70.133,5.5,0.38, +333.199,34.605,5.33,1.13, +332.987,59.085,6.3,1.13, +333.661,-41.382,6.23,0.65, +333.578,-27.767,5.43,-0.16, +333.008,60.759,5.35,1.17, +333.575,-21.074,5.32,0.8, +335.006,-80.44,5.1,1.47, +333.411,28.608,5.89,1.15, +333.093,63.291,5.79,1.67, +333.896,-44.452,6.1,1.02, +333.47,39.715,4.49,1.39, +333.904,-41.347,4.79,0.8, +333.455,45.441,5.53,0.04, +334.111,-41.627,5.1,0.92, +333.685,42.954,5.71,0, +333.456,63.163,6.11,-0.08, +333.999,8.549,6.21,0.02, +334.156,-25.898,6.15,1.11, +333.22,73.307,6.08,1.01, +333.758,57.044,4.19,0.28, +334.14,-1.596,6.15,0.19, +334.2,-12.831,5.34,1.14, +334.249,-23.14,6.17,1.05, +333.993,37.749,4.13,1.46, +334.208,-7.783,4.16,0.98, +334.219,-9.04,5.79,1.16, +334.565,-53.628,5.37,0.6, +334.625,-60.26,2.86,1.39, +334.124,27.804,6.37,0.99, +334.277,-5.387,5.75,0.88, +337.906,-85.967,5.77,1.02, +334.11,57.22,5.88,0.93, +334.518,-0.238,6.39,0.44, +334.753,-13.305,5.95,1.06, +335.151,-57.51,6.34,1.37, +334.734,37.769,6.17,0.28, +334.553,62.804,5.75,1.26, +335.05,-7.821,5.37,-0.06, +335.115,5.789,5.37,-0.02, +335.232,8.187,6.17,0.44, +336.153,-72.256,5.29,0.65, +335.398,-21.598,5.13,1.07, +335.25,26.935,6.47,1.59, +335.414,-1.387,3.84,-0.05, +335.165,50.981,6.42,null, +335.38,12.205,5.01,-0.13, +335.683,-45.948,6.62,2.01, +335.33,28.331,4.81,0, +335.257,46.537,4.57,-0.1, +335.783,-45.929,5.62,0.36, +334.585,76.488,6.66,0, +336.463,-75.016,6.04,0.64, +336.294,-70.432,5.78,0.38, +335.462,42.078,6.41,-0.08, +335.879,-24.762,5.53,0.99, +335.884,-7.194,5.93,1, +336.235,-57.797,5.32,0.67, +335.915,20.848,6.04,null, +336.029,-4.837,5.78,-0.04, +336.113,-13.529,5.76,0.97, +335.751,57.284,6.16,-0.13, +335.976,38.574,6.22,0.49, +335.751,62.42,6.04,0.05, +335.89,52.229,4.43,1.02, +336.319,1.378,4.66,-0.03, +336.833,-64.966,4.48,-0.03, +336.129,49.476,4.57,0.09, +336.545,-23.682,6.29,-0.03, +336.42,18.444,6.26,1.22, +336.643,-16.741,6.57,null, +336.643,-16.742,6.35,0.61, +333.294,86.108,5.27,-0.03, +337.157,-67.489,5.55,0.2, +336.656,4.394,5.75,0.52, +336.69,37.444,6.46,-0.13, +335.922,78.243,6.76,-0.06, +336.965,4.696,4.79,1.05, +337.163,-39.132,5.47,0.95, +336.86,39.81,6.14,-0.14, +336.747,56.433,6.57,-0.1, +336.943,31.84,5.98,1.45, +337.318,-43.496,3.97,1.03, +336.503,70.771,5.47,1.2, +337.207,-0.02,4.59,null, +337.209,-0.02,4.42,0.38, +337.44,-43.749,4.11,1.57, +336.772,65.132,5.46,0.37, +337.283,9.129,5.58,1.55, +337.442,-27.107,5.95,0.33, +337.293,26.763,5.79,1.25, +337.506,-12.915,6.4,0.32, +337.492,4.432,5.48,0.38, +337.573,-14.586,6.37,-0.04, +337.082,64.086,6.29,1.08, +337.433,35.726,6.56,null, +337.724,-26.074,6.43,1.08, +337.293,58.415,3.75,0.6, +337.383,47.707,4.36,1.68, +337.662,-10.678,4.82,-0.06, +337.508,32.573,5.65,-0.04, +337.527,49.356,6.4,1.15, +337.876,-32.346,4.29,0.01, +338.86,-78.772,6.15,1.38, +336.677,78.786,5.83,0.15, +337.622,43.123,4.51,-0.09, +337.827,-2.911,6.16,1.08, +337.827,-6.555,6.14,0.56, +338.25,-61.982,4.81,1.61, +337.922,-10.906,6.38,0.28, +337.893,29.543,6.35,0.19, +337.823,50.283,3.77,0.01, +338.148,20.23,6.42,0.32, +338.195,15.863,6.32,1.19, +338.11,39.78,5.88,0.16, +338.078,54.038,6.35,null, +338.512,-1.574,5.89,0.99, +337.47,78.824,5.5,0.06, +338.673,-20.708,5.2,0.44, +338.97,-57.884,6.23,0.2, +338.419,56.625,5.71,0.96, +338.262,69.914,6.6,0.32, +338.902,-23.991,5.97,0.99, +338.839,-0.118,4.02,-0.09, +338.321,70.374,6.34,0, +338.068,76.226,5.68,0.05, +339.122,-40.583,6.28,0.12, +339.148,-31.664,5.82,1.09, +339.245,-40.591,5.86,0.06, +338.968,39.634,5.73,-0.15, +339.033,35.577,6.1,1, +339.152,11.697,6.4,0, +338.972,50.071,6.29,-0.05, +338.966,56.07,6.38,0.12, +339.27,12.577,6.3,null, +339.203,35.652,6.3,1.37, +339.439,-4.228,5.03,1.14, +339.785,-52.692,6.65,0.35, +339.593,-7.898,6.23,0.78, +339.343,51.545,4.63,0.24, +339.686,-28.748,6.47,1.04, +338.942,73.643,5.08,0.39, +339.715,-33.081,5.66,0.05, +339.573,45.183,6.4,null, +339.719,19.522,5.82,0.92, +339.933,-28.325,6.31,1.01, +340.204,-57.422,5.97,1.46, +339.658,56.796,5.21,1.58, +339.815,39.05,4.88,-0.2, +340.093,-30.659,5.87,1.3, +339.946,19.681,6.21,0, +339.304,75.372,5.79,1.57, +339.893,37.593,6.03,0.86, +339.663,63.584,5.19,0.06, +340.164,-27.044,4.17,-0.11, +340.2,-3.554,6.31,0.52, +341.514,-81.382,4.15,0.2, +340.22,14.549,5.71,0.72, +340.129,44.276,4.46,1.33, +340.077,53.846,5.93,0.93, +340.365,10.831,3.4,-0.09, +340.654,-47.211,5.98,0.58, +340.667,-46.885,2.1,1.6, +340.592,-29.361,6.17,1.54, +340.381,30.966,6.34,null, +340.68,-44.248,6.07,0.98, +340.369,40.226,5.25,-0.14, +340.439,29.308,4.79,-0.01, +340.489,14.516,5.9,1.11, +340.4,41.549,5.94,null, +340.875,-41.414,4.85,1.03, +340.765,-8.312,6.45,0.17, +341.069,-60.499,6.3,0.56, +340.81,-6.963,6.41,-0.04, +340.587,53.909,6.12,1.62, +340.897,-18.83,4.69,1.37, +340.75,30.221,2.94,0.86, +340.731,37.803,6.43,-0.09, +340.769,47.169,6.39,0.47, +340.928,10.939,6.51,0.46, +341.022,39.466,5.95,1.48, +341.408,-53.5,4.85,1.18, +341.023,41.819,5.08,0.96, +341.42,-46.547,5.51,1.32, +341.533,-48.979,6.62,0.63, +341.618,-49.686,6.48,1.14, +341.368,19.367,6.25,1.05, +341.205,52.517,6.55,null, +341.682,-46.939,6.56,0.3, +342.595,-80.124,5.35,-0.15, +342.42,-77.051,6.73,0.11, +341.673,12.173,4.19,0.5, +341.543,44.546,5.76,0.36, +341.633,23.566,3.95,1.07, +341.83,-34.161,6.28,1.16, +342.089,-61.684,6.37,1.06, +341.888,-19.613,5.26,0.94, +341.946,-38.222,6.71,0.48, +342.323,-70.348,6.34,0.07, +341.928,-14.056,5.66,-0.05, +341.984,-25.912,6.3,0.91, +342.139,-51.317,3.49,0.08, +342.126,-10.556,6.19,0.28, +341.847,58.483,6.36,-0.04, +342.045,37.417,5.9,1.03, +342.398,-13.593,4.01,1.57, +342.496,-32.805,6.33,0.31, +342.385,10.479,6.54,0.29, +342.199,54.415,6.12,-0.07, +342.184,62.938,6.06,1.2, +342.501,24.602,3.48,0.93, +342.759,-39.157,5.42,1.43, +342.937,-59.881,6.46,1.13, +342.253,68.57,6.19,null, +342.443,55.903,5.43,1.17, +343.041,-63.189,6.12,1.03, +342.591,41.954,5.92,0.08, +342.663,19.141,6.4,null, +342.543,50.677,6.21,1.14, +342.837,-29.536,5.97,0.91, +342.42,66.201,3.52,1.05, +343.132,-32.876,4.46,-0.04, +342.845,61.697,5.6,0.78, +343.1,9.836,5.16,0.48, +343.154,-7.58,3.74,1.64, +343.008,43.313,4.94,1.56, +343.408,-48.598,6.04,0.62, +343.664,-70.074,6.05,0.66, +341.871,83.154,4.74,1.26, +343.26,16.841,5.64,1.12, +343.37,-11.617,5.8,-0.08, +343.218,50.412,6.46,-0.04, +343.297,40.167,6.34,-0.08, +343.266,60.101,6.01,1.75, +343.417,44.749,5.81,0.26, +343.662,-15.821,3.27,0.05, +343.642,-7.205,6.19,1.28, +343.69,-16.272,5.56,1.14, +343.529,40.377,5.81,1.13, +343.812,-36.389,6.4,1.31, +343.649,16.942,6.12,1.77, +343.748,1.065,6.11,0.2, +343.796,-4.988,5.72,0.88, +343.807,8.816,4.9,0, +343.761,37.077,5.91,0.42, +343.964,-31.633,6.1,1.36, +343.987,-32.54,4.21,0.97, +344.1,-31.566,6.48,1.1, +344.199,-47.969,5.7,0.22, +343.935,36.352,5.74,-0.05, +344.215,11.848,6.51,0.18, +344.098,41.604,5.59,-0.14, +344.108,49.734,4.95,1.78, +344.322,-4.81,6.31,0.94, +344.413,-29.622,1.16,0.09, +344.366,20.769,5.49,0.67, +344.387,3.81,6.28,1.12, +344.269,48.684,5.43,-0.09, +344.646,-35.523,6.13,0.58, +344.42,39.309,6.18,-0.15, +344.565,-2.395,6.16,0.74, +344.599,-1.41,6.37,0.35, +342.759,85.374,5.9,1.32, +344.646,9.357,6.43,0.64, +344.677,7.34,6.33,0.06, +344.799,11.729,5.75,0.32, +344.899,-29.462,5.51,0.25, +344.899,-13.071,6.07,1.45, +344.864,0.963,5.43,0.98, +345.024,-25.164,5.65,1.25, +344.793,52.654,6.29,1.42, +344.788,59.815,6.43,0.03, +345.102,-25.627,6.29,1.13, +345.22,-52.754,4.12,0.98, +343.603,84.346,4.71,1.43, +345.281,-50.95,5.68,1.42, +345.158,0.186,6.21,0.89, +345.179,3.012,5.83,1.34, +345.021,56.945,5,1.42, +345.177,31.083,6.6,-0.04, +345.331,-28.854,5.55,1.35, +345.143,45.375,6.5,null, +345.346,-22.791,6.28,0.13, +345.348,-7.061,6.21,1.41, +345.228,38.708,6.54,-0.11, +345.382,-4.711,5.94,1, +345.642,-36.421,6.47,0.94, +345.378,57.106,6.2,1.5, +345.48,42.326,3.62,-0.09, +345.636,-6.574,6.15,1.58, +345.685,-20.871,5.97,0.94, +345.638,31.781,6.57,0.35, +345.651,42.758,5.1,0.09, +345.874,-34.749,5.11,0.29, +345.688,44.059,6.39,0, +346.218,-68.82,5.52,0.36, +345.683,55.236,6.5,-0.08, +345.998,-41.478,5.79,1.08, +345.989,-4.795,6.68,0.58, +345.969,3.82,4.53,-0.12, +346.165,-53.965,5.37,1.45, +345.944,28.083,2.42,1.67, +346.004,6.617,6.41,0.39, +345.849,60.445,6.74,-0.02, +345.84,58.565,6.43,0.9, +345.887,67.209,5.24,1.26, +346.046,50.052,4.65,1.06, +346.19,15.205,2.49,-0.04, +346.291,-7.694,5.43,0.3, +346.303,-17.079,6.14,1.37, +346.276,16.563,6.44,0.83, +346.323,1.307,6.39,0.94, +347.099,-79.481,6.12,0.14, +346.72,-43.521,4.28,0.42, +346.576,18.518,6.13,0.44, +346.67,-23.743,4.47,0.9, +346.723,-38.892,5.61,0.01, +346.79,-49.607,6.33,1.45, +346.633,19.911,6.3,0.49, +346.811,-50.686,5.83,0.48, +347.149,-73.586,6.15,1.42, +346.751,9.409,4.52,1.57, +346.778,25.468,4.76,1.34, +346.654,59.42,4.85,-0.03, +346.865,32.826,6.02,0.12, +346.87,21.134,5.99,0.26, +346.825,46.068,6.66,-0.05, +346.792,52.816,6.11,1.05, +347.088,-28.823,5.6,0.88, +346.793,59.728,6.4,-0.01, +346.914,46.387,5.33,1.41, +346.939,49.296,5.7,0.44, +347.051,44.562,6.56,0.17, +347.17,2.128,5.4,0.91, +346.949,63.633,6.26,-0.02, +347.549,-66.857,6.47,0.95, +348.05,-80.913,6.41,1.5, +346.988,64.223,6.21,1.1, +347.362,-21.172,3.66,1.22, +347.436,-28.089,5.87,1.31, +347.489,-42.861,5.81,0.48, +347.381,8.677,5.12,1.47, +347.457,-14.511,6.42,0.01, +347.478,-22.457,4.69,0.65, +347.541,-40.592,5.83,1.62, +346.975,75.388,4.41,0.8, +347.59,-45.247,3.9,1.02, +347.506,9.822,5.39,-0.08, +347.434,59.333,5.7,0.33, +347.694,-29.525,6.51,0.27, +347.678,17.594,5.71,1.34, +347.613,43.544,5.94,0.44, +347.934,8.72,5.16,0.13, +347.955,26.847,6.17,0.94, +348.313,-49.619,6.8,0.92, +348.528,-62.7,6.12,0.79, +348.138,49.406,4.52,0.29, +348.267,29.442,6.35,0.93, +348.321,57.168,5.56,1.01, +348.36,11.065,5.82,1.01, +348.581,-6.049,4.22,1.56, +348.744,-41.106,5.77,1.18, +348.668,-10.689,6.12,1.49, +348.56,50.618,6.31,null, +348.59,29.772,6.41,0.45, +348.652,24.103,6.36,null, +348.893,-3.496,5.55,0.06, +348.973,-9.088,4.21,1.11, +348.943,28.248,6.49,0.85, +349.24,-62.001,5.66,0.51, +348.655,74.231,5.84,null, +348.991,24.771,6.6,0.4, +349.165,-44.489,5.92,1.06, +349.208,-41.194,6.47,1.08, +349.358,-58.236,3.99,0.4, +349.784,-79.473,6.33,0.91, +349.212,-7.727,5.06,1.6, +348.908,70.888,5.56,0.24, +349.291,3.282,3.69,0.92, +349.176,53.214,5.54,0.52, +349.112,61.963,6.53,0.23, +349.583,-67.471,6.13,1.35, +349.417,-11.713,6.34,0.05, +349.319,45.164,6.43,1.07, +349.476,-9.182,4.39,-0.15, +349.541,-40.824,5.53,0.44, +349.436,49.015,4.85,1.67, +349.484,45.489,6.48,-0.03, +352.015,-87.482,5.49,1.27, +349.706,-32.532,4.41,1.13, +349.597,41.774,6.02,null, +349.74,-9.611,4.98,-0.02, +349.778,-13.459,5.08,0.8, +349.329,75.299,6.38,0.03, +349.85,-5.124,5.55,0.39, +349.85,-18.075,5.93,1.52, +349.76,45.137,6.5,null, +349.93,-33.708,6.37,1.3, +349.656,68.112,4.75,0.84, +349.864,34.793,6.32,-0.08, +349.874,48.625,5.44,1.03, +349.923,48.381,6.32,1.12, +349.968,42.078,5.79,1.48, +350.208,-50.307,6.05,0.42, +350.086,5.381,5.05,1.2, +350.17,-5.908,6.17,1.07, +350.159,23.74,4.6,0.17, +350.06,61.97,6.45,null, +350.207,30.415,5.59,1.5, +350.315,-26.987,5.64,0.82, +350.183,44.116,6.13,0.17, +350.222,38.182,5.77,0.46, +350.144,62.213,6.39,1.61, +350.479,31.813,5.32,-0.11, +350.493,26.609,6.62,0.37, +350.737,-60.056,6.09,1.6, +350.663,-15.039,5.2,0.2, +350.669,20.829,6.29,-0.04, +350.743,-20.101,3.97,1.1, +350.769,12.314,5.08,1.31, +350.635,60.134,5.56,1.68, +350.976,-53.808,6.15,0.26, +350.939,-43.124,6.1,1.46, +350.883,0.291,6.31,1.61, +351.055,-51.891,5.75,1.59, +350.948,32.531,6.69,0.45, +351.032,-18.687,6.19,1.02, +351.331,-56.849,5.59,1.07, +351.146,41.113,6.72,0.06, +351.212,32.385,5.57,-0.11, +351.21,62.283,4.98,1.68, +351.345,23.404,4.4,0.61, +351.512,-20.642,4.39,1.47, +351.653,-52.722,5.52,0.4, +351.78,-66.581,6.45,1.47, +351.813,-58.476,5.63,0.98, +351.788,-50.157,6.2,-0.08, +351.733,1.256,4.94,0.03, +351.812,1.123,6.25,1.02, +351.781,42.912,5.75,0, +352.003,-35.544,6.32,1.2, +351.918,25.167,5.98,-0.06, +351.992,6.379,4.28,1.07, +352.022,-11.45,6.37,0.9, +351.819,70.36,5.6,0.19, +352.254,-63.111,5.68,-0.17, +352.253,-44.498,6.43,1.18, +352.253,-9.266,6.18,1.44, +352.273,23.048,6.35,null, +352.289,12.761,4.55,0.94, +352.384,-4.533,6.25,1.09, +352.531,49.133,6.17,1.46, +352.508,58.549,4.91,-0.12, +352.665,38.662,6.05,0.99, +352.755,-6.288,6.39,1.26, +352.863,-44.844,6.02,1.02, +352.823,39.236,5.22,1.02, +352.881,-4.087,6.49,0.54, +352.925,-21.369,6.29,0.33, +352.93,28.404,6.41,0.01, +352.99,-1.086,6.38,1.18, +353.331,-77.385,5.81,0.68, +353.103,34.953,6.65,-0.06, +353.243,-37.818,4.37,-0.09, +351.753,87.307,5.58,0.23, +353.319,-20.914,4.71,0.02, +353.367,22.499,5.32,1.6, +353.428,45.058,6.24,0.98, +353.481,20.841,6.06,1.73, +353.488,31.325,4.98,1.38, +353.538,-1.247,5.87,0.3, +353.803,-64.689,7.4,null, +353.706,-15.246,5.96,1.36, +353.656,40.236,5.59,0.1, +353.659,33.497,5.63,1.03, +353.769,-42.615,4.71,0.08, +353.695,38.024,6.18,1.58, +353.884,-7.464,6.39,0.88, +353.746,71.642,5.84,1.8, +353.983,24.561,6.45,1.73, +354.097,2.102,5.68,0.44, +354.127,32.904,6.35,0.46, +354.273,-31.871,6.52,1.26, +354.6,-76.87,6,0.9, +354.415,-13.06,5.65,1.03, +354.463,-45.492,4.74,0.08, +354.416,16.826,6.26,0, +354.391,46.458,3.82,1.01, +354.383,44.429,5.8,-0.06, +354.487,18.401,5.53,0, +354.494,46.2,6.58,0.66, +354.534,43.268,4.29,-0.1, +354.867,-46.638,6.09,0.24, +354.785,50.472,5.3,-0.06, +354.946,-14.222,5,0.24, +354.987,5.626,4.13,0.51, +354.98,9.677,5.97,0.2, +354.793,75.293,5.95,0.13, +354.838,74.003,5.98,0.89, +355.012,37.652,6.53,0.35, +354.837,77.633,3.21,1.03, +355.159,-32.073,5.31,0.97, +355.102,44.334,4.14,-0.08, +355.169,36.721,6.23,0.39, +355.279,-24.16,6.6,1.57, +355.287,-11.681,5.89,1, +355.394,-18.027,5.34,1.57, +355.362,49.512,6.26,0.19, +355.441,-17.816,4.82,0.82, +355.486,7.251,5.89,0.1, +355.512,1.78,4.5,0.2, +355.477,57.26,6.24,null, +355.562,44.992,6.57,null, +355.616,-15.448,5.28,1.37, +355.68,-14.545,4.49,-0.04, +355.587,64.516,6.56,1.88, +355.631,61.679,6.4,1.24, +355.843,10.331,5.06,1.68, +355.956,-15.284,6.36,1.58, +356.006,-45.083,6.09,0.98, +356.106,-70.49,6.07,0.91, +356.17,-78.791,5.75,1.11, +356.05,-64.404,5.72,1.4, +355.998,29.362,4.93,0.95, +356.05,-18.277,5.24,-0.08, +356.12,-26.246,6.17,0.5, +356.201,55.8,6.51,null, +356.505,-40.182,6.31,0.2, +356.504,-18.678,5.29,0.28, +356.509,46.42,4.95,1.11, +356.598,3.487,5.04,2.6, +356.653,66.782,5.95,-0.04, +356.817,-50.227,5.18,-0.19, +356.847,-68.394,6.89,0.46, +356.765,58.652,4.87,1.11, +356.816,-11.911,5.73,1.08, +356.758,57.451,5.51,1.65, +356.888,46.833,6.07,-0.14, +356.985,-2.762,5.49,0.94, +356.978,67.807,5.04,-0.01, +357.135,-6.381,6.07,1.45, +357.205,2.214,6.46,0.44, +357.232,-28.13,4.57,0.01, +357.163,64.876,6.41,0.06, +357.209,62.214,5.43,0.67, +357.225,59.979,6.34,-0.01, +357.3,58.963,6.33,0.4, +357.382,-15.861,6.24,1.22, +357.365,1.076,5.77,0.16, +357.436,-62.839,6.59,1.48, +357.421,36.425,5.9,0.79, +357.414,28.842,5.97,0.19, +357.457,-25.331,6.42,0.12, +357.561,-9.974,5.94,1.13, +357.593,51.622,6.44,0.37, +357.639,-14.402,5.72,1.51, +357.838,9.313,5.79,1.66, +357.839,-18.909,5.18,-0.14, +358.027,-82.019,5.11,0.92, +357.991,2.93,5.55,1.53, +357.99,77.599,6.55,0.44, +358.097,21.671,6.11,1.59, +358.122,19.12,5.08,1.6, +358.125,-14.251,5.87,1.28, +358.105,75.545,6.39,0.98, +358.155,10.948,5.3,0.18, +358.21,-8.997,5.75,1.17, +358.232,-3.156,5.93,1.07, +358.27,2.091,6.28,-0.01, +358.337,-24.229,6.24,0.19, +358.589,-27.042,6.35,0.2, +358.596,57.499,4.54,1.22, +358.661,-40.3,6.03,0.57, +358.694,0.109,5.61,1.59, +358.783,7.071,6.21,-0.07, +358.819,-31.922,6.1,-0.08, +358.819,-31.884,6.83,-0.08, +358.846,25.955,6.54,null, +358.89,57.412,6,0.21, +358.89,47.356,6,1.16, +359.125,-24.737,6.31,0.92, +359.173,22.648,6.15,1.6, +359.115,83.191,6.59,0.05, +359.265,42.658,5.97,0.69, +359.285,-26.624,6.26,1.45, +359.285,55.706,5.55,0.49, +359.333,-62.956,5.97,0.11, +359.386,-82.17,5.73,1.05, +359.397,-64.298,5,0.06, +359.39,60.024,6.47,0.01, +359.44,25.141,4.66,1.59, +359.588,-15.847,6.26,1.08, +359.603,51.389,4.8,1.83, +359.668,-3.556,4.86,0.93, +359.705,32.382,6.52,-0.11, +359.732,-52.746,5.13,1.13, +359.694,46.413,6.54,-0.09, +359.752,55.755,4.88,-0.07, +359.828,6.863,4.01,0.42, +359.866,-29.485,5.62,1.6, +359.872,33.724,6.58,0.55, +359.872,33.724,6.58,null, +359.979,-65.577,4.5,-0.08, +0.08,-44.291,6.29,0.76, +0.1,26.918,6.46,0.5, +0.129,59.56,6.19,1.01, +0.182,45.253,6.38,-0.07, +0.269,-48.81,5.71,0.91, +0.333,-50.337,5.53,1.6, +0.33,49.982,6.22,0.97, +0.399,-77.066,4.78,1.27, +0.404,61.223,5.55,0.41, +0.433,42.367,6.25,-0.03, +0.456,-3.027,5.1,-0.12, +0.543,27.082,5.75,0.67, +0.49,-6.014,4.41,1.63, +0.53,-14.676,7.1,1.8, +0.583,-29.72,5.01,-0.15, +0.601,8.957,6.32,0.18, +0.624,8.486,5.63,0.29, +0.65,66.099,5.86,1.09, +0.74,-20.046,6.25,0.53, +0.782,-24.145,6.44,1.18, +0.857,63.642,6.24,0.33, +0.935,-17.336,4.55,-0.05, +0.966,66.712,6.29,1.67, +1.057,62.288,5.88,0.3, +1.082,-16.529,5.78,1.1, +1.085,-29.269,6.4,0, +1.125,-10.509,4.94,1.63, +1.175,67.167,5.67,1.07, +1.153,42.092,6.01,null, +1.128,-72.898,7.31,0.44, +1.224,34.66,6.12,0.62, +1.172,-71.437,5.59,-0.12, +1.233,26.649,6.25,1.4, +1.276,61.314,5.8,-0.09 +]} diff --git a/src/data/local_data/sky/milkyway_nx.webp b/src/data/local_data/sky/milkyway_nx.webp new file mode 100644 index 0000000000000000000000000000000000000000..6c6ca774ae57380799b04f181cf70e9aff121a5a GIT binary patch literal 40374 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�iVh!6+F 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 literal 0 HcmV?d00001 diff --git a/src/data/local_data/sky/milkyway_ny.webp b/src/data/local_data/sky/milkyway_ny.webp new file mode 100644 index 0000000000000000000000000000000000000000..8968f251f39532001c5c10184e36f397f5ff74e3 GIT binary patch literal 42866 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�>{mWR^N`hp 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 literal 0 HcmV?d00001 diff --git a/src/data/local_data/sky/milkyway_nz.webp b/src/data/local_data/sky/milkyway_nz.webp new file mode 100644 index 0000000000000000000000000000000000000000..31cc013e435ea6af53894f0e2dd4e641b6b08179 GIT binary patch literal 45584 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 Y)w*;cIl6U@@~0h78wcY>=?=^Q0Km1yCjbBd literal 0 HcmV?d00001 diff --git a/src/data/local_data/sky/milkyway_pz.webp b/src/data/local_data/sky/milkyway_pz.webp new file mode 100644 index 0000000000000000000000000000000000000000..a541fec696832e2f660fd9779f6711e474be93bd GIT binary patch literal 39850 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

J!y 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�m6DHzvY~VK}qNuuVH>e`+#|+ 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 literal 0 HcmV?d00001 diff --git a/src/sky/starrySky.js b/src/sky/starrySky.js new file mode 100644 index 000000000..daa24fabf --- /dev/null +++ b/src/sky/starrySky.js @@ -0,0 +1,430 @@ +import * as Cesium from 'cesium'; +import { loadBundledJson } from '../data/bundledJson.js'; +import { governorRequestRender } from '../renderGovernor.js'; +import { buildStarVertices, STAR_VERTEX_FLOATS } from './stars.js'; + +/** + * Space background: catalogue stars drawn as point sprites over a soft Milky + * Way cube map, replacing Cesium's default Tycho-2 sky box (six 1024² JPEGs + * stretched 3–6× on screen, which read as compression blocks around the + * globe). + * + * Narrow, version-tested engine adapter. It takes the `Scene#skyBox` slot: + * Cesium calls `update(frameState, useHdr)` once per frame and executes the + * returned command first in the environment pass, before the atmosphere, sun, + * moon and every globe or tile command — so the sky stays behind everything + * without depth testing. Only `execute()` and `derivedCommands` of that + * command are read. An engine upgrade must revalidate this adapter. + * + * Both layers share one ICRF→Earth-fixed rotation (IAU 2006 precession, + * nutation and Earth rotation at the scene clock), so stars and the Milky + * Way agree with each other and with the real sky over the globe. Until + * Cesium's ICRF tables load, the TEME approximation the default sky box uses + * fills in; the arrival renders one frame through the idle governor. + */ +export const STARRY_SKY_CESIUM_VERSION = '1.138.0'; + +/** Opacity of the Milky Way glow over black; the stars carry the sky. */ +export const MILKY_WAY_INTENSITY = 0.4; +/** Overall star brightness multiplier. */ +export const STAR_INTENSITY = 1; +/** Clock change, in seconds, below which the sky rotation is reused. */ +export const SKY_ROTATION_EPSILON_SECONDS = 1; + +const STAR_PACK_URL = new URL( + '../data/local_data/sky/bright_stars.json', + import.meta.url, +); +const MILKY_WAY_FACE_URLS = Object.freeze({ + positiveX: new URL( + '../data/local_data/sky/milkyway_px.webp', + import.meta.url, + ), + negativeX: new URL( + '../data/local_data/sky/milkyway_nx.webp', + import.meta.url, + ), + positiveY: new URL( + '../data/local_data/sky/milkyway_py.webp', + import.meta.url, + ), + negativeY: new URL( + '../data/local_data/sky/milkyway_ny.webp', + import.meta.url, + ), + positiveZ: new URL( + '../data/local_data/sky/milkyway_pz.webp', + import.meta.url, + ), + negativeZ: new URL( + '../data/local_data/sky/milkyway_nz.webp', + import.meta.url, + ), +}); + +// Directions, not points: w = 0 drops the camera translation, and z = w puts +// every fragment on the far plane, inside the clip volume at any frustum. +const SKY_DIRECTION_GLSL = ` +uniform mat3 u_icrfToFixed; +vec4 skyClipPosition(vec3 icrfDirection) +{ + vec3 eye = czm_viewRotation * (u_icrfToFixed * icrfDirection); + vec4 clip = czm_projection * vec4(eye, 0.0); + clip.z = clip.w * 0.99999; + return clip; +} +`; + +const MILKY_WAY_VS = `${SKY_DIRECTION_GLSL} +in vec3 position; +out vec3 v_direction; +void main() +{ + gl_Position = skyClipPosition(position); + v_direction = position; +} +`; + +const MILKY_WAY_FS = ` +uniform samplerCube u_milkyWay; +uniform float u_intensity; +in vec3 v_direction; +void main() +{ + vec3 color = czm_textureCube(u_milkyWay, normalize(v_direction)).rgb * u_intensity; + // Interleaved-gradient dither: the dim glow spans only a few 8-bit steps. + float noise = fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715)))); + color = max(color + (noise - 0.5) / 255.0, 0.0); + out_FragColor = vec4(czm_gammaCorrect(color), 1.0); +} +`; + +const STAR_VS = `${SKY_DIRECTION_GLSL} +in vec3 position; +in float sigma; +in vec4 color; +out vec4 v_color; +out float v_sigma; +out float v_radius; +void main() +{ + gl_Position = skyClipPosition(position); + // σ is in CSS pixels; the sprite holds ±3σ plus a pixel of margin. + v_sigma = sigma * czm_pixelRatio; + v_radius = ceil(3.0 * v_sigma) + 1.0; + gl_PointSize = 2.0 * v_radius; + v_color = color; +} +`; + +const STAR_FS = ` +uniform float u_intensity; +in vec4 v_color; +in float v_sigma; +in float v_radius; +void main() +{ + vec2 offset = (gl_PointCoord - 0.5) * (2.0 * v_radius); + float alpha = v_color.a * u_intensity * + exp(-0.5 * dot(offset, offset) / (v_sigma * v_sigma)); + if (alpha < 1.0 / 512.0) discard; + out_FragColor = vec4(czm_gammaCorrect(v_color.rgb) * alpha, alpha); +} +`; + +/** Pick the ICRF→fixed rotation for `time`, or TEME while tables load. */ +export function computeSkyRotation( + time, + result, + transforms = Cesium.Transforms, +) { + const icrf = transforms.computeIcrfToFixedMatrix(time, result); + if (icrf) return { matrix: icrf, precise: true }; + return { + matrix: transforms.computeTemeToPseudoFixedMatrix(time, result), + precise: false, + }; +} + +/** Whether a cached rotation at `cachedTime` still serves `time`. */ +export function isSkyRotationCurrent(cachedTime, time) { + return ( + cachedTime !== undefined && + Math.abs(Cesium.JulianDate.secondsDifference(time, cachedTime)) < + SKY_ROTATION_EPSILON_SECONDS + ); +} + +export class StarrySky { + /** + * @param {object} [options] + * @param {() => void} [options.requestRender] renders one frame when an + * asset or the precise rotation arrives; the idle governor by default. + */ + constructor({ + requestRender = () => governorRequestRender('sky-assets'), + } = {}) { + /** Matches `SkyBox#show`. */ + this.show = true; + this.milkyWayIntensity = MILKY_WAY_INTENSITY; + this.starIntensity = STAR_INTENSITY; + this._requestRender = requestRender; + this._rotation = Cesium.Matrix3.clone(Cesium.Matrix3.IDENTITY); + this._rotationTime = undefined; + this._rotationPrecise = false; + this._icrfRequest = undefined; + this._icrfUnavailable = false; + this._loading = false; + this._starData = undefined; + this._faceImages = undefined; + this._cubeMap = undefined; + this._milkyWayCommand = undefined; + this._milkyWayAttributes = undefined; + this._starCommand = undefined; + this._useHdr = undefined; + this._destroyed = false; + const uniforms = { + u_icrfToFixed: () => this._rotation, + }; + this._milkyWayUniforms = { + ...uniforms, + u_milkyWay: () => this._cubeMap, + u_intensity: () => this.milkyWayIntensity, + }; + this._starUniforms = { + ...uniforms, + u_intensity: () => this.starIntensity, + }; + const commands = []; + this._commands = commands; + // The environment pass reads `derivedCommands` (log depth, HDR, picking) + // before calling `execute`; none apply to a far-plane background. + this._compositeCommand = { + derivedCommands: {}, + execute(context, passState) { + for (const command of commands) command.execute(context, passState); + }, + }; + } + + /** Start loading assets; failures leave a plain black sky. */ + _load() { + if (this._loading) return; + this._loading = true; + loadBundledJson(STAR_PACK_URL) + .then((pack) => { + if (this._destroyed) return; + this._starData = buildStarVertices(pack); + this._requestRender(); + }) + .catch((error) => + console.warn('[sky] star catalogue unavailable', error), + ); + const faces = Object.entries(MILKY_WAY_FACE_URLS); + Promise.all( + faces.map(([, url]) => Cesium.Resource.fetchImage({ url: url.href })), + ) + .then((images) => { + if (this._destroyed) return; + this._faceImages = Object.fromEntries( + faces.map(([face], index) => [face, images[index]]), + ); + this._requestRender(); + }) + .catch((error) => console.warn('[sky] Milky Way unavailable', error)); + } + + _updateRotation(time) { + // An approximate rotation is final only while nothing better can come. + const settled = + this._rotationPrecise || this._icrfRequest || this._icrfUnavailable; + if (settled && isSkyRotationCurrent(this._rotationTime, time)) return; + const { precise } = computeSkyRotation(time, this._rotation); + this._rotationPrecise = precise; + this._rotationTime = Cesium.JulianDate.clone(time, this._rotationTime); + if (!precise) this._preloadIcrf(time); + } + + /** Fetch Cesium's IAU 2006 tables around `time` once; retry on new spans. */ + _preloadIcrf(time) { + if (this._icrfRequest || this._icrfUnavailable) return; + const interval = new Cesium.TimeInterval({ + start: Cesium.JulianDate.addDays(time, -1, new Cesium.JulianDate()), + stop: Cesium.JulianDate.addDays(time, 1, new Cesium.JulianDate()), + }); + this._icrfRequest = Promise.resolve( + Cesium.Transforms.preloadIcrfFixed(interval), + ) + .then( + () => { + this._rotationTime = undefined; + }, + (error) => { + // TEME is within a fraction of a degree; do not retry every frame. + this._icrfUnavailable = true; + console.warn('[sky] ICRF tables unavailable, using TEME', error); + }, + ) + .finally(() => { + this._icrfRequest = undefined; + if (!this._destroyed) this._requestRender(); + }); + } + + _createMilkyWayCommand(context) { + const cubeMap = new Cesium.CubeMap({ + context, + source: this._faceImages, + flipY: false, + }); + cubeMap.generateMipmap(); + cubeMap.sampler = new Cesium.Sampler({ + minificationFilter: Cesium.TextureMinificationFilter.LINEAR_MIPMAP_LINEAR, + }); + this._cubeMap = cubeMap; + this._faceImages = undefined; + const geometry = Cesium.BoxGeometry.createGeometry( + Cesium.BoxGeometry.fromDimensions({ + dimensions: new Cesium.Cartesian3(2, 2, 2), + vertexFormat: Cesium.VertexFormat.POSITION_ONLY, + }), + ); + const attributeLocations = + Cesium.GeometryPipeline.createAttributeLocations(geometry); + this._milkyWayCommand = new Cesium.DrawCommand({ + owner: this, + vertexArray: Cesium.VertexArray.fromGeometry({ + context, + geometry, + attributeLocations, + bufferUsage: Cesium.BufferUsage.STATIC_DRAW, + }), + renderState: Cesium.RenderState.fromCache({}), + uniformMap: this._milkyWayUniforms, + }); + this._milkyWayAttributes = attributeLocations; + } + + _createStarCommand(context) { + const { count, vertices } = this._starData; + this._starData = undefined; + if (count === 0) return; + const vertexBuffer = Cesium.Buffer.createVertexBuffer({ + context, + typedArray: vertices, + usage: Cesium.BufferUsage.STATIC_DRAW, + }); + const stride = STAR_VERTEX_FLOATS * Float32Array.BYTES_PER_ELEMENT; + const attribute = (index, components, offsetFloats) => ({ + index, + vertexBuffer, + componentsPerAttribute: components, + componentDatatype: Cesium.ComponentDatatype.FLOAT, + offsetInBytes: offsetFloats * Float32Array.BYTES_PER_ELEMENT, + strideInBytes: stride, + }); + this._starCommand = new Cesium.DrawCommand({ + owner: this, + primitiveType: Cesium.PrimitiveType.POINTS, + count, + vertexArray: new Cesium.VertexArray({ + context, + attributes: [ + attribute(0, 3, 0), + attribute(1, 1, 3), + attribute(2, 4, 4), + ], + }), + // Premultiplied additive: starlight adds to the Milky Way glow and + // leaves the framebuffer alpha alone. + renderState: Cesium.RenderState.fromCache({ + blending: { + enabled: true, + equationRgb: Cesium.BlendEquation.ADD, + equationAlpha: Cesium.BlendEquation.ADD, + functionSourceRgb: Cesium.BlendFunction.ONE, + functionDestinationRgb: Cesium.BlendFunction.ONE, + functionSourceAlpha: Cesium.BlendFunction.ZERO, + functionDestinationAlpha: Cesium.BlendFunction.ONE, + }, + }), + uniformMap: this._starUniforms, + }); + } + + _updateShaders(context, useHdr) { + if (this._useHdr === useHdr) return; + this._useHdr = useHdr; + const defines = useHdr ? ['HDR'] : []; + for (const [command, vs, fs, attributeLocations] of [ + [ + this._milkyWayCommand, + MILKY_WAY_VS, + MILKY_WAY_FS, + this._milkyWayAttributes, + ], + [ + this._starCommand, + STAR_VS, + STAR_FS, + { position: 0, sigma: 1, color: 2 }, + ], + ]) { + if (!command) continue; + command.shaderProgram?.destroy(); + command.shaderProgram = Cesium.ShaderProgram.fromCache({ + context, + vertexShaderSource: vs, + fragmentShaderSource: new Cesium.ShaderSource({ + defines, + sources: [fs], + }), + attributeLocations, + }); + } + } + + /** `Scene#skyBox` contract: the command to draw this frame, if any. */ + update(frameState, useHdr) { + if (!this.show) return undefined; + const { mode, passes, context } = frameState; + if (mode !== Cesium.SceneMode.SCENE3D) return undefined; + if (!passes.render) return undefined; + this._load(); + let rebuilt = false; + if (this._faceImages && !this._milkyWayCommand) { + this._createMilkyWayCommand(context); + rebuilt = true; + } + if (this._starData && !this._starCommand) { + this._createStarCommand(context); + rebuilt = true; + } + if (rebuilt) this._useHdr = undefined; + this._updateShaders(context, Boolean(useHdr)); + this._commands.length = 0; + if (this._milkyWayCommand) this._commands.push(this._milkyWayCommand); + if (this._starCommand) this._commands.push(this._starCommand); + if (this._commands.length === 0) return undefined; + this._updateRotation(frameState.time); + return this._compositeCommand; + } + + isDestroyed() { + return this._destroyed; + } + + destroy() { + for (const command of [this._milkyWayCommand, this._starCommand]) { + if (!command) continue; + command.vertexArray?.destroy(); + command.shaderProgram?.destroy(); + } + this._cubeMap = this._cubeMap?.destroy(); + this._milkyWayCommand = undefined; + this._starCommand = undefined; + this._commands.length = 0; + this._destroyed = true; + return undefined; + } +} diff --git a/src/sky/starrySky.test.mjs b/src/sky/starrySky.test.mjs new file mode 100644 index 000000000..6575b1121 --- /dev/null +++ b/src/sky/starrySky.test.mjs @@ -0,0 +1,89 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import * as Cesium from 'cesium'; +import { + STARRY_SKY_CESIUM_VERSION, + SKY_ROTATION_EPSILON_SECONDS, + StarrySky, + computeSkyRotation, + isSkyRotationCurrent, +} from './starrySky.js'; + +test('the sky-box adapter was validated against this engine version', () => { + assert.equal( + Cesium.VERSION, + STARRY_SKY_CESIUM_VERSION, + 'engine upgrades require revalidating the Scene#skyBox contract', + ); +}); + +test('the ICRF rotation is preferred and TEME fills in while tables load', () => { + const time = Cesium.JulianDate.fromIso8601('2026-10-19T00:00:00Z'); + const icrf = Cesium.Matrix3.fromRotationZ(0.3); + const teme = Cesium.Matrix3.fromRotationZ(0.2); + const precise = computeSkyRotation(time, new Cesium.Matrix3(), { + computeIcrfToFixedMatrix: (_, result) => Cesium.Matrix3.clone(icrf, result), + computeTemeToPseudoFixedMatrix: () => assert.fail('TEME not needed'), + }); + assert.equal(precise.precise, true); + assert.ok(Cesium.Matrix3.equals(precise.matrix, icrf)); + const approximate = computeSkyRotation(time, new Cesium.Matrix3(), { + computeIcrfToFixedMatrix: () => undefined, + computeTemeToPseudoFixedMatrix: (_, result) => + Cesium.Matrix3.clone(teme, result), + }); + assert.equal(approximate.precise, false); + assert.ok(Cesium.Matrix3.equals(approximate.matrix, teme)); +}); + +test('the TEME fallback keeps the celestial pole on the Earth axis', () => { + // TEME only spins about Z; ICRF differs from it by precession (~0.36° by + // 2026), so the fallback sky is right up to a fraction of a degree. + const time = Cesium.JulianDate.fromIso8601('2026-10-19T00:00:00Z'); + const teme = Cesium.Transforms.computeTemeToPseudoFixedMatrix(time); + const pole = Cesium.Matrix3.multiplyByVector( + teme, + Cesium.Cartesian3.UNIT_Z, + new Cesium.Cartesian3(), + ); + assert.ok(Math.abs(pole.z - 1) < 1e-9); +}); + +test('the rotation is reused only within the clock epsilon', () => { + const time = Cesium.JulianDate.fromIso8601('2026-10-19T00:00:00Z'); + const later = (seconds) => + Cesium.JulianDate.addSeconds(time, seconds, new Cesium.JulianDate()); + assert.equal(isSkyRotationCurrent(undefined, time), false); + assert.equal(isSkyRotationCurrent(time, later(0.5)), true); + assert.equal(isSkyRotationCurrent(time, later(-0.5)), true); + assert.equal( + isSkyRotationCurrent(time, later(SKY_ROTATION_EPSILON_SECONDS)), + false, + ); +}); + +test('the sky draws nothing when hidden, outside 3D, or in a pick pass', () => { + const sky = new StarrySky({ requestRender: () => {} }); + const frameState = (overrides) => ({ + mode: Cesium.SceneMode.SCENE3D, + passes: { render: true }, + ...overrides, + }); + sky._loading = true; // keep the test off the network + sky.show = false; + assert.equal(sky.update(frameState()), undefined); + sky.show = true; + assert.equal( + sky.update(frameState({ mode: Cesium.SceneMode.SCENE2D })), + undefined, + ); + assert.equal( + sky.update(frameState({ passes: { render: false, pick: true } })), + undefined, + ); + // Nothing has loaded yet, so even a render pass has no command. + assert.equal(sky.update(frameState()), undefined); + assert.equal(sky.isDestroyed(), false); + assert.equal(sky.destroy(), undefined); + assert.equal(sky.isDestroyed(), true); +}); diff --git a/src/sky/stars.js b/src/sky/stars.js new file mode 100644 index 000000000..b7ef7aa41 --- /dev/null +++ b/src/sky/stars.js @@ -0,0 +1,146 @@ +/** + * Bright-star appearance: catalogue pack → GPU vertex data. + * + * Pure functions, no Cesium. The pack is `local_data/sky/bright_stars.json` + * (Yale Bright Star Catalogue, built by scripts/build-bright-stars.mjs): a + * flat `[raDeg, decDeg, vmag, bv, …]` array in ICRF/J2000. + * + * Every star is drawn as a point sprite holding a small Gaussian. Its width + * is set in CSS pixels and scaled by the device pixel ratio in the shader, so + * a star covers the same screen area at any DPR and stays a crisp dot rather + * than a texel stretched across several pixels. + * + * @module sky/stars + */ + +/** Faintest catalogue magnitude; also the reference for brightness. */ +export const STAR_LIMIT_MAGNITUDE = 6.5; +/** Gaussian σ of the faintest star, CSS pixels. */ +export const STAR_MIN_SIGMA_PX = 0.55; +/** Gaussian σ cap for the brightest star, CSS pixels. */ +export const STAR_MAX_SIGMA_PX = 1.35; +/** Peak opacity of the faintest star. */ +export const STAR_MIN_ALPHA = 0.22; +/** B−V for stars the catalogue gives no colour (a solar-type white). */ +export const STAR_DEFAULT_BV = 0.6; +/** Floats per star in the vertex buffer: xyz, σ, rgb, alpha. */ +export const STAR_VERTEX_FLOATS = 8; + +const DEG = Math.PI / 180; +// Fraction of the colour kept: the eye sees all but the most extreme stars +// as nearly white, and saturated dots read as UI markers on the globe. +const COLOR_SATURATION = 0.55; + +function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); +} + +/** ICRF unit vector for J2000 right ascension and declination in degrees. */ +export function raDecToUnitVector(raDeg, decDeg) { + const ra = raDeg * DEG; + const dec = decDeg * DEG; + const cosDec = Math.cos(dec); + return [cosDec * Math.cos(ra), cosDec * Math.sin(ra), Math.sin(dec)]; +} + +/** + * Perceived brightness relative to the limit magnitude. Flux grows 2.512× + * per magnitude; the square root compresses Sirius-to-6.5m (≈ 1600×) into a + * range a display can show without the bright stars turning into discs. + */ +export function starBrightness(vmag) { + const magnitude = Number.isFinite(vmag) ? vmag : STAR_LIMIT_MAGNITUDE; + return ( + 10 ** + (-0.2 * (Math.min(magnitude, STAR_LIMIT_MAGNITUDE) - STAR_LIMIT_MAGNITUDE)) + ); +} + +/** + * Sprite parameters for a visual magnitude: `sigmaPx` is the Gaussian σ in + * CSS pixels and `alpha` its peak opacity. Faint stars keep the minimum width + * and fade; bright stars saturate and grow slowly. + */ +export function starAppearance(vmag) { + const brightness = starBrightness(vmag); + return { + sigmaPx: clamp( + STAR_MIN_SIGMA_PX * brightness ** 0.3, + STAR_MIN_SIGMA_PX, + STAR_MAX_SIGMA_PX, + ), + alpha: clamp(STAR_MIN_ALPHA * brightness, STAR_MIN_ALPHA, 1), + }; +} + +/** Effective temperature from B−V (Ballesteros 2012). */ +export function bvToTemperature(bv) { + const index = clamp(Number.isFinite(bv) ? bv : STAR_DEFAULT_BV, -0.4, 2.0); + return 4600 * (1 / (0.92 * index + 1.7) + 1 / (0.92 * index + 0.62)); +} + +/** Black-body colour of a temperature, sRGB 0..1 (Helland's fit). */ +export function temperatureToRgb(kelvin) { + const t = clamp(kelvin, 1000, 40000) / 100; + const red = t <= 66 ? 255 : 329.698727446 * (t - 60) ** -0.1332047592; + const green = + t <= 66 + ? 99.4708025861 * Math.log(t) - 161.1195681661 + : 288.1221695283 * (t - 60) ** -0.0755148492; + const blue = + t >= 66 + ? 255 + : t <= 19 + ? 0 + : 138.5177312231 * Math.log(t - 10) - 305.0447927307; + return [red, green, blue].map((channel) => clamp(channel, 0, 255) / 255); +} + +/** + * Display colour for a B−V index: the black-body hue, desaturated towards + * white and normalized so the brightest channel is 1 (brightness belongs to + * the magnitude alone). + */ +export function bvToRgb(bv) { + const rgb = temperatureToRgb(bvToTemperature(bv)).map( + (channel) => 1 - COLOR_SATURATION + COLOR_SATURATION * channel, + ); + const peak = Math.max(...rgb); + return rgb.map((channel) => channel / peak); +} + +/** + * Decode a catalogue pack into interleaved vertex data, `STAR_VERTEX_FLOATS` + * per star. Malformed rows are skipped, never thrown on: a damaged pack must + * not take the globe down with it. + */ +export function buildStarVertices(pack) { + const stars = Array.isArray(pack?.stars) ? pack.stars : []; + const count = Math.floor(stars.length / 4); + const vertices = new Float32Array(count * STAR_VERTEX_FLOATS); + let written = 0; + for (let i = 0; i < count; i++) { + const [raDeg, decDeg, vmag, bv] = stars.slice(i * 4, i * 4 + 4); + if ( + !Number.isFinite(raDeg) || + !Number.isFinite(decDeg) || + !Number.isFinite(vmag) + ) + continue; + const [x, y, z] = raDecToUnitVector(raDeg, decDeg); + const { sigmaPx, alpha } = starAppearance(vmag); + const [r, g, b] = bvToRgb(bv); + vertices.set( + [x, y, z, sigmaPx, r, g, b, alpha], + written * STAR_VERTEX_FLOATS, + ); + written += 1; + } + return { + count: written, + vertices: + written === count + ? vertices + : vertices.slice(0, written * STAR_VERTEX_FLOATS), + }; +} diff --git a/src/sky/stars.test.mjs b/src/sky/stars.test.mjs new file mode 100644 index 000000000..6dba55971 --- /dev/null +++ b/src/sky/stars.test.mjs @@ -0,0 +1,134 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync, statSync } from 'node:fs'; +import { + STAR_LIMIT_MAGNITUDE, + STAR_MAX_SIGMA_PX, + STAR_MIN_ALPHA, + STAR_MIN_SIGMA_PX, + STAR_VERTEX_FLOATS, + buildStarVertices, + bvToRgb, + bvToTemperature, + raDecToUnitVector, + starAppearance, + starBrightness, +} from './stars.js'; + +const close = (actual, expected, epsilon = 1e-9) => + assert.ok( + Math.abs(actual - expected) <= epsilon, + `${actual} is not within ${epsilon} of ${expected}`, + ); + +const skyFile = (name) => + new URL(`../data/local_data/sky/${name}`, import.meta.url); + +test('right ascension and declination map onto the ICRF axes', () => { + const equinox = raDecToUnitVector(0, 0); + close(equinox[0], 1); + close(equinox[1], 0); + close(equinox[2], 0); + const sixHours = raDecToUnitVector(90, 0); + close(sixHours[0], 0); + close(sixHours[1], 1); + const pole = raDecToUnitVector(123, 90); + close(pole[2], 1); + const south = raDecToUnitVector(200, -30); + close(Math.hypot(...south), 1); + close(south[2], -0.5); +}); + +test('brightness grows with each magnitude and stops at the catalogue limit', () => { + close(starBrightness(STAR_LIMIT_MAGNITUDE), 1); + close(starBrightness(STAR_LIMIT_MAGNITUDE + 1.5), 1); + close(starBrightness(STAR_LIMIT_MAGNITUDE - 5), 10); + close(starBrightness(Number.NaN), 1); +}); + +test('brighter stars are never smaller or fainter, and both ends clamp', () => { + let previous = starAppearance(8); + assert.deepEqual(previous, { + sigmaPx: STAR_MIN_SIGMA_PX, + alpha: STAR_MIN_ALPHA, + }); + for (let vmag = 7.5; vmag >= -1.5; vmag -= 0.25) { + const next = starAppearance(vmag); + assert.ok(next.sigmaPx >= previous.sigmaPx, `σ shrank at ${vmag}`); + assert.ok(next.alpha >= previous.alpha, `alpha dropped at ${vmag}`); + previous = next; + } + const sirius = starAppearance(-1.46); + assert.equal(sirius.alpha, 1); + assert.ok(sirius.sigmaPx <= STAR_MAX_SIGMA_PX); + assert.ok(sirius.sigmaPx > starAppearance(2).sigmaPx); + // Sprites stay point-like: ±3σ of the brightest star is a few pixels. + assert.ok(6 * STAR_MAX_SIGMA_PX < 10); +}); + +test('B−V colours run from blue-white to orange with the peak channel at 1', () => { + close(bvToTemperature(0.65), 5_800, 120); + close(bvToTemperature(0), 10_100, 200); + const hot = bvToRgb(-0.3); + const sunLike = bvToRgb(0.65); + const cool = bvToRgb(1.6); + for (const rgb of [hot, sunLike, cool]) { + close(Math.max(...rgb), 1); + assert.ok(Math.min(...rgb) > 0.5, 'colours stay desaturated'); + } + assert.ok(hot[2] > hot[0], 'hot stars are blue'); + assert.ok(cool[0] > cool[2], 'cool stars are orange'); + assert.deepEqual(bvToRgb(null), bvToRgb(0.6)); + assert.deepEqual(bvToRgb(9), bvToRgb(2)); +}); + +test('vertex data is interleaved per star and skips malformed rows', () => { + const { count, vertices } = buildStarVertices({ + stars: [0, 0, 1, 0.5, 'bad', 10, 2, 0, 90, 45, 3, null, 10, 20], + }); + assert.equal(count, 2); + assert.equal(vertices.length, 2 * STAR_VERTEX_FLOATS); + assert.deepEqual(Array.from(vertices.subarray(0, 3)), [1, 0, 0]); + close(vertices[STAR_VERTEX_FLOATS + 1], Math.SQRT1_2, 1e-6); + close(vertices[STAR_VERTEX_FLOATS + 2], Math.SQRT1_2, 1e-6); + close(vertices[3], starAppearance(1).sigmaPx, 1e-6); + close(vertices[7], starAppearance(1).alpha, 1e-6); + assert.deepEqual(buildStarVertices(null), { + count: 0, + vertices: new Float32Array(0), + }); +}); + +test('the committed catalogue holds the Yale Bright Star Catalogue', () => { + const pack = JSON.parse(readFileSync(skyFile('bright_stars.json'), 'utf8')); + assert.deepEqual(pack.meta.columns, ['raDeg', 'decDeg', 'vmag', 'bv']); + assert.equal(pack.stars.length, pack.meta.count * 4); + assert.equal(pack.meta.count, 9096); + let brightest = 0; + for (let i = 0; i < pack.stars.length; i += 4) { + const [ra, dec, vmag] = pack.stars.slice(i, i + 4); + assert.ok(ra >= 0 && ra < 360 && dec >= -90 && dec <= 90); + assert.ok(Number.isFinite(vmag)); + if (vmag < pack.stars[brightest + 2]) brightest = i; + } + // Sirius, α CMa: 06h45m08.9s −16°42′58″, V = −1.46. + assert.deepEqual( + pack.stars.slice(brightest, brightest + 4), + [101.287, -16.716, -1.46, 0], + ); + assert.equal(buildStarVertices(pack).count, pack.meta.count); +}); + +test('sky assets stay inside the 5 MB budget', () => { + const files = [ + 'bright_stars.json', + ...['px', 'nx', 'py', 'ny', 'pz', 'nz'].map( + (face) => `milkyway_${face}.webp`, + ), + ]; + const total = files.reduce( + (sum, name) => sum + statSync(skyFile(name)).size, + 0, + ); + assert.ok(total < 5 * 1024 * 1024, `${total} bytes`); +}); diff --git a/src/tooling/skyAssets.test.mjs b/src/tooling/skyAssets.test.mjs new file mode 100644 index 000000000..697c8f13e --- /dev/null +++ b/src/tooling/skyAssets.test.mjs @@ -0,0 +1,107 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { + buildStarPack, + parseBscRecord, +} from '../../scripts/build-bright-stars.mjs'; +import { + CUBE_FACES, + cubeFaceDirection, + directionToPlateCarree, + icrfToGalactic, +} from '../../scripts/build-milky-way.mjs'; +import { raDecToUnitVector } from '../sky/stars.js'; + +// Verbatim CDS V/50 records: HR 1, Sirius (HR 2491) and a nova with no J2000 +// position. Columns matter, so the padding is part of the fixture. +const HR_1 = + ' 1 BD+44 4550 3 36042 46 000001.1+444022000509.9+451345114.44-16.88 6.70 +0.07 +0.08 A1Vn -0.012-0.018 -018 195 4.2 21.6AC 3'; +const SIRIUS = + '2491 9Alp CMaBD-16 1591 48915151881 257I 5423 064044.6-163444064508.9-164258227.22-08.88-1.46 0.00 -0.05 -0.03 A1Vm -0.553-1.205 +.375-008SBO 13 10.3 11.2AB 4*'; +const NOVA = + ' 92 NOVA 1572 B Cas *'; + +const close = (actual, expected, epsilon = 1e-9) => + assert.ok( + Math.abs(actual - expected) <= epsilon, + `${actual} is not within ${epsilon} of ${expected}`, + ); + +test('BSC5 records parse J2000 position, V magnitude and B−V', () => { + const sirius = parseBscRecord(SIRIUS); + assert.equal(sirius.hr, 2491); + close(sirius.raDeg, (6 + 45 / 60 + 8.9 / 3600) * 15); + close(sirius.decDeg, -(16 + 42 / 60 + 58 / 3600)); + assert.equal(sirius.vmag, -1.46); + assert.equal(sirius.bv, 0); + const first = parseBscRecord(HR_1); + close(first.raDeg, (5 / 60 + 9.9 / 3600) * 15); + close(first.decDeg, 45 + 13 / 60 + 45 / 3600); + assert.equal(first.vmag, 6.7); + assert.equal(first.bv, 0.07); + assert.equal(parseBscRecord(NOVA), null); +}); + +test('the star pack is a flat, rounded column array that counts its drops', () => { + const pack = buildStarPack([HR_1, NOVA, SIRIUS, ''].join('\n'), { + fetched: '2026-10-19', + }); + assert.deepEqual( + pack.stars, + [1.291, 45.229, 6.7, 0.07, 101.287, -16.716, -1.46, 0], + ); + assert.equal(pack.meta.count, 2); + assert.equal(pack.meta.dropped, 1); + assert.equal(pack.meta.fetched, '2026-10-19'); +}); + +test('cube faces use the WebGL major-axis layout', () => { + // Each face centre looks down its own axis … + const axes = { + positiveX: [1, 0, 0], + negativeX: [-1, 0, 0], + positiveY: [0, 1, 0], + negativeY: [0, -1, 0], + positiveZ: [0, 0, 1], + negativeZ: [0, 0, -1], + }; + for (const face of CUBE_FACES) + assert.deepEqual( + cubeFaceDirection(face, 0.5, 0.5).map((v) => v + 0), + axes[face], + ); + // … and the first texel row and column follow OpenGL ES 3.0 §3.8.10: + // on +X, s grows towards −Z and t towards −Y. + assert.deepEqual(cubeFaceDirection('positiveX', 0, 0), [1, 1, 1]); + assert.deepEqual(cubeFaceDirection('positiveZ', 1, 1), [1, -1, 1]); + assert.deepEqual(cubeFaceDirection('negativeY', 0, 1), [-1, -1, -1]); + assert.throws(() => cubeFaceDirection('up', 0, 0), RangeError); +}); + +test('plate carrée is centred on longitude 0, growing to the left, north up', () => { + assert.deepEqual(directionToPlateCarree(1, 0, 0), [0.5, 0.5]); + const sixHours = directionToPlateCarree(0, 1, 0); + close(sixHours[0], 0.25); + const eighteenHours = directionToPlateCarree(0, -1, 0); + close(eighteenHours[0], 0.75); + close(directionToPlateCarree(0, 0, 1)[1], 0); + close(directionToPlateCarree(0, 0, -1)[1], 1); + const twelveHours = directionToPlateCarree(-1, 0, 0); + assert.ok(twelveHours[0] === 0 || twelveHours[0] === 1); +}); + +test('the galactic rotation puts the Galactic Centre and pole where the IAU does', () => { + // Sgr A*-adjacent origin l = b = 0 at RA 266.405°, Dec −28.936° (J2000). + const centre = icrfToGalactic(raDecToUnitVector(266.40499, -28.93617)); + close(centre[0], 1, 1e-6); + // North galactic pole at RA 192.85948°, Dec +27.12825°. + const pole = icrfToGalactic(raDecToUnitVector(192.85948, 27.12825)); + close(pole[2], 1, 1e-6); + // ESO's panorama: the Large Magellanic Cloud (l ≈ 280.5°, b ≈ −32.9°) sits + // right of and below the centre. + const [u, v] = directionToPlateCarree( + ...icrfToGalactic(raDecToUnitVector(80.894, -69.756)), + ); + close(u, 0.5 + (360 - 280.47) / 360, 2e-3); + close(v, 0.5 + 32.89 / 180, 2e-3); +}); From fb81e155b7dfd99b9bd156925b4c8ed6f3efb57d Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Mon, 19 Oct 2026 19:43:25 +0400 Subject: [PATCH 02/45] fix(sky): keep the Sun and Moon, settle outside the ICRF tables - Pass the custom sky box to the Viewer instead of `skyBox: false`, which also stopped CesiumWidget from creating the Sun and the Moon. Guarded by scripts/qa-sky-sun-moon.mjs. - Outside the IAU 2006 tables (before 1975, after ~2050) the preload resolves without data; remember that span and stay on TEME instead of preloading and rendering every frame. - The anime style no longer cel-shades the far plane, where four bands turned the faint Milky Way into blotches. - Paint the planets out after the star-removing opening and with the ring median, so no brighter plateau is left; faces rebuilt. Co-Authored-By: Claude Opus 5.5 --- scripts/build-milky-way.mjs | 29 ++++--- scripts/format-scope.json | 3 +- scripts/qa-sky-sun-moon.mjs | 96 +++++++++++++++++++++++ src/app/viewer.js | 8 +- src/data/local_data/sky/README.md | 9 ++- src/data/local_data/sky/milkyway_nx.webp | Bin 40374 -> 40384 bytes src/data/local_data/sky/milkyway_ny.webp | Bin 42866 -> 42904 bytes src/data/local_data/sky/milkyway_nz.webp | Bin 45584 -> 45580 bytes src/data/local_data/sky/milkyway_px.webp | Bin 36318 -> 36230 bytes src/data/local_data/sky/milkyway_py.webp | Bin 41812 -> 41794 bytes src/data/local_data/sky/milkyway_pz.webp | Bin 39850 -> 39850 bytes src/sky/starrySky.js | 26 +++++- src/sky/starrySky.test.mjs | 28 +++++++ src/styles/anime.js | 8 +- src/tooling/skyAssets.paintOut.test.mjs | 64 +++++++++++++++ 15 files changed, 243 insertions(+), 28 deletions(-) create mode 100644 scripts/qa-sky-sun-moon.mjs create mode 100644 src/tooling/skyAssets.paintOut.test.mjs diff --git a/scripts/build-milky-way.mjs b/scripts/build-milky-way.mjs index 4a482631d..19b2ea1e9 100644 --- a/scripts/build-milky-way.mjs +++ b/scripts/build-milky-way.mjs @@ -15,12 +15,12 @@ * * Transform (deterministic): * 1. Resample to WORK_WIDTH×WORK_WIDTH/2 and convert sRGB to linear light. - * 2. Paint out the planets the 2008–2010 exposures caught (PLANETS): they - * sit where today's sky has nothing and are far brighter than any star. - * 3. Remove stars with a morphological opening (minimum, then maximum, over + * 2. Remove stars with a morphological opening (minimum, then maximum, over * a (2·OPEN_RADIUS+1)² window): anything smaller than the window — every * star — drops to the surrounding sky; the renderer draws catalogue stars * itself, sharp and in the right place. + * 3. Paint out the planets the 2008–2010 exposures caught (PLANETS): they + * sit where today's sky has nothing and are far brighter than any star. * 4. Blur with a three-pass box approximation of a Gaussian, σ = BLUR_DEG on * the sky: rows wrap in longitude and widen by 1/cos(latitude) so the * blur stays round towards the poles. @@ -234,16 +234,18 @@ function galacticVector(l, b) { } /** - * Replace a disc of the sky with the mean of the ring just outside it, per - * channel. The blur that follows hides the seam. + * Replace a disc of the sky with the median of the ring just outside it, per + * channel. A median, not a mean: the planet's diffraction spikes reach far + * past the disc and would lift a mean well above the sky. The blur that + * follows hides the seam. */ function paintOut(planes, width, height, { l, b, radiusDeg }) { const centre = galacticVector(l, b); const inner = Math.cos((radiusDeg * Math.PI) / 180); - const outer = Math.cos(((radiusDeg + 0.5) * Math.PI) / 180); + const outer = Math.cos(((radiusDeg + 1) * Math.PI) / 180); const disc = []; const ring = []; - const span = Math.ceil(((radiusDeg + 0.5) / 180) * height); + const span = Math.ceil(((radiusDeg + 1) / 180) * height); const row = Math.round((0.5 - b / 180) * height); for (let y = Math.max(0, row - span); y < Math.min(height, row + span); y++) { const latitude = 90 - ((y + 0.5) * 180) / height; @@ -256,10 +258,9 @@ function paintOut(planes, width, height, { l, b, radiusDeg }) { } } for (const plane of planes) { - let sum = 0; - for (const index of ring) sum += plane[index]; - const mean = sum / ring.length; - for (const index of disc) plane[index] = mean; + const values = Float32Array.from(ring, (index) => plane[index]).sort(); + const median = values[values.length >> 1]; + for (const index of disc) plane[index] = median; } } @@ -323,12 +324,14 @@ async function main() { const { default: sharp } = await import('sharp'); const { width, height, planes } = await decodePanorama(sharp, file); const sigmaPx = (BLUR_DEG / 180) * height; - for (const planet of PLANETS) paintOut(planes, width, height, planet); for (const plane of planes) { extremumPlane(plane, width, height, OPEN_RADIUS, Math.min); extremumPlane(plane, width, height, OPEN_RADIUS, Math.max); - blurPlane(plane, width, height, sigmaPx); } + // After the opening: it sinks the starry sky to the dark gaps between + // stars, and a fill taken before it would stay brighter than the sky. + for (const planet of PLANETS) paintOut(planes, width, height, planet); + for (const plane of planes) blurPlane(plane, width, height, sigmaPx); const black = luminancePercentile(planes, BLACK_PERCENTILE); const white = luminancePercentile(planes, WHITE_PERCENTILE); let total = 0; diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 9024224fe..fe15d0ea0 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1067,5 +1067,6 @@ "scripts/build-milky-way.mjs", "src/sky/stars.test.mjs", "src/sky/starrySky.test.mjs", - "src/tooling/skyAssets.test.mjs" + "src/tooling/skyAssets.test.mjs", + "src/tooling/skyAssets.paintOut.test.mjs" ] diff --git a/scripts/qa-sky-sun-moon.mjs b/scripts/qa-sky-sun-moon.mjs new file mode 100644 index 000000000..12ec7e780 --- /dev/null +++ b/scripts/qa-sky-sun-moon.mjs @@ -0,0 +1,96 @@ +#!/usr/bin/env node +/** + * qa-sky-sun-moon — the custom sky must keep Cesium's Sun and Moon. + * + * CesiumWidget creates `scene.sun` and `scene.moon` only when the `skyBox` + * option is not `false`, so replacing the sky box the wrong way silently + * removes the Sun disc and its bloom. Points the camera at the Sun from + * 22 000 km and fails unless both bodies exist; saves a screenshot. + * + * Usage: node scripts/qa-sky-sun-moon.mjs [--url http://localhost:4317] [--out qa-shots/sky-sun.png] + */ +import puppeteer from 'puppeteer'; +import { mkdirSync } from 'node:fs'; +import path from 'node:path'; + +const argv = process.argv; +const option = (name, fallback) => + argv.includes(name) ? argv[argv.indexOf(name) + 1] : fallback; +const url = option('--url', 'http://localhost:4317'); +const out = option('--out', 'qa-shots/sky-sun.png'); +mkdirSync(path.dirname(out), { recursive: true }); + +const browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--ignore-gpu-blocklist'], +}); +try { + const page = await browser.newPage(); + await page.setViewport({ width: 1280, height: 800 }); + await page.evaluateOnNewDocument(() => + localStorage.setItem('gev:first-run-mission:v1', 'suppressed'), + ); + await page.goto(url, { waitUntil: 'domcontentloaded' }); + await page.waitForFunction(() => window.__godsEyeView?.viewer?.scene, { + timeout: 90_000, + }); + await new Promise((r) => setTimeout(r, 10_000)); + const info = await page.evaluate(async () => { + // The page's own Cesium instance, as Vite served it. + const entry = performance + .getEntriesByType('resource') + .map((e) => e.name) + .find((n) => /\.vite\/deps\/cesium\.js/.test(n)); + const C = await import(entry); + const { viewer } = window.__godsEyeView; + const scene = viewer.scene; + scene.camera.cancelFlight(); + const time = viewer.clock.currentTime; + const sun = C.Cartesian3.normalize( + C.Matrix3.multiplyByVector( + C.Transforms.computeTemeToPseudoFixedMatrix(time), + C.Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame( + time, + ), + new C.Cartesian3(), + ), + new C.Cartesian3(), + ); + // Off to the side of the Earth, looking straight at the Sun. + const side = C.Cartesian3.normalize( + C.Cartesian3.cross(sun, C.Cartesian3.UNIT_Z, new C.Cartesian3()), + new C.Cartesian3(), + ); + const destination = C.Cartesian3.add( + C.Cartesian3.multiplyByScalar(side, 2.2e7, new C.Cartesian3()), + C.Cartesian3.multiplyByScalar(sun, -0.6e7, new C.Cartesian3()), + new C.Cartesian3(), + ); + const up = C.Cartesian3.normalize( + C.Cartesian3.cross( + C.Cartesian3.cross(sun, C.Cartesian3.UNIT_Z, new C.Cartesian3()), + sun, + new C.Cartesian3(), + ), + new C.Cartesian3(), + ); + scene.camera.setView({ destination, orientation: { direction: sun, up } }); + scene.requestRender(); + return { + sun: Boolean(scene.sun), + moon: Boolean(scene.moon), + skyBox: scene.skyBox?.constructor?.name, + }; + }); + await new Promise((r) => setTimeout(r, 4_000)); + await page.evaluate(() => window.__godsEyeView.viewer.scene.requestRender()); + await new Promise((r) => setTimeout(r, 1_500)); + await page.screenshot({ path: out }); + console.log(JSON.stringify({ url, ...info, screenshot: out })); + if (!info.sun || !info.moon) { + console.error('FAIL: scene.sun and scene.moon must both exist'); + process.exitCode = 1; + } +} finally { + await browser.close(); +} diff --git a/src/app/viewer.js b/src/app/viewer.js index 582ecd9c5..a09836775 100644 --- a/src/app/viewer.js +++ b/src/app/viewer.js @@ -120,9 +120,10 @@ export function createApplicationViewer({ container, creditContainer }) { selectionIndicator: false, infoBox: false, baseLayer: false, - // Replaced below: the default Tycho-2 cube map is too coarse for the - // whole-globe view and its JPEG blocks show around the Earth. - skyBox: false, + // Instead of the default Tycho-2 cube map, whose JPEG blocks show around + // the whole globe. Passed here, not assigned later: `skyBox: false` would + // also stop CesiumWidget from creating the Sun and the Moon. + skyBox: new StarrySky(), creditContainer, msaaSamples: 4, contextOptions: { webgl: { preserveDrawingBuffer: true } }, @@ -134,7 +135,6 @@ export function createApplicationViewer({ container, creditContainer }) { // render loop. See app/atmosphereCompat.js. applyModelAtmosphereWorkaround(viewer.scene); viewer.scene.globe.show = false; - viewer.scene.skyBox = new StarrySky(); viewer.scene.skyAtmosphere.show = true; viewer.scene.skyAtmosphere.atmosphereLightIntensity = 18; viewer.scene.skyAtmosphere.saturationShift = -0.12; diff --git a/src/data/local_data/sky/README.md b/src/data/local_data/sky/README.md index 8c2d4a0d7..e224e7bb0 100644 --- a/src/data/local_data/sky/README.md +++ b/src/data/local_data/sky/README.md @@ -42,10 +42,11 @@ Centre. (). **Credit: ESO/S. Brunier.** **Changes made** (CC BY 4.0 asks for them to be stated): resampled to -4096×2048, two planets (Jupiter, by position) painted over with the surrounding sky, -stars removed with a 7×7 morphological opening, blurred (σ = 0.4°), -reprojected from galactic coordinates to ICRF cube faces, black level set at -the darkest 25 % of the sky, gamma-encoded and saved as WebP. Build: +4096×2048, stars removed with a 7×7 morphological opening, two planets +(Jupiter, by position) painted over with the median of the surrounding sky, +blurred (σ = 0.4°), reprojected from galactic coordinates to ICRF cube faces, +black level set at the darkest 25 % of the sky, gamma-encoded and saved as +WebP. Build: `node scripts/build-milky-way.mjs `. The panorama is a photographic mosaic, not an astrometric map: bright stars diff --git a/src/data/local_data/sky/milkyway_nx.webp b/src/data/local_data/sky/milkyway_nx.webp index 6c6ca774ae57380799b04f181cf70e9aff121a5a..d74db8e5222e2a29d69eb961b040b2d202db49f5 100644 GIT binary patch delta 40178 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 C7VYK$ delta 40169 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

io0aL4C6?&OM<{$Zt_(cJty$yA+z-1h|Eaa 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 YX7TVqc4V%%g@A2HfaG(83bp3|0PSKx+yDRo literal 42866 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�>{mWR^N`hp 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 diff --git a/src/data/local_data/sky/milkyway_nz.webp b/src/data/local_data/sky/milkyway_nz.webp index 31cc013e435ea6af53894f0e2dd4e641b6b08179..de654a4f2a9bae97d18dfa01a5a33df17c6477af 100644 GIT binary patch literal 45580 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 literal 45584 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 literal 36318 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 bGkng~x^y8qx^<57ryWll2jfNQ4$J@mcLTAB diff --git a/src/data/local_data/sky/milkyway_pz.webp b/src/data/local_data/sky/milkyway_pz.webp index a541fec696832e2f660fd9779f6711e474be93bd..8fecc2d52fdd4b717f51f24e830c87d000ecf1cd 100644 GIT binary patch delta 38478 zcmV(_K-9mgw*soS0+19p@K6Sw0V)6l00cf22!lbP5Xe*@3;?29TfY*`@QiwJ& z8)$Q1Y0m+(#9(hg4m3IGdBW9^OC5iA@L%_N>i_ZVC;OlOZ&=?Y%#?f=k^;UD~e{`%bbZ~hzy9-E_pV@n{`6Di!WdT)QujLBy*YQ*d)d9$v(?C-|jC9I3f%BX9|l)lOx*Cuq6ShH!);Dnf&a#?G;1;aKEu$K)#QNS?L6L zh@kUmgn<#yy`S#$yWOzpi-^{8VLF9{A=TTB=QUJeWn%nFFZi)l7{h2SV0TpLaRRKQ-%wuM<`)EGo}7rUZ&mdaXJe!unOi!T*_nL)Ld>Gy z{IGaOlPQv<>#AW`=@*;+!wx6@9S+M_kR9v;4cheA*mB(pGBP~*2EF z_d(%+lX(|J@{!v?(^h~$lM5PyJ|A`s8fJwCjv1cqO(wge{D-Vz6&r;!KS-y>b1 zE|JO6@iOx@Hz{dr@dG_q?Ux<-gwIXgAeaRi`Hd9fdb8BMf<_bbx;zGpEYdu2P!}m| zaaDc}y7oy6;7xye!z{!YCJoSUBzZT=>S2}K%U+@IEAS8)HayeiJ!C9Gk62TE=FL>o zb$J0-O^C1YFr~6f#%_wo#*HQKPaZo9&cjQYSO0m6R=*lGm?HkxYb!M-$aZJ?Zo#87 z0(CVa?q3L1`yH4c4WYxQQKTmFe0c!-BG*a{6PIE0!_|LjGY^j;hr4n3WU@XBa0=QZcZQBGU z5@N)4up#|a5+nKR?Szx%4MNF(EQ#K@*Y_aFSX4(FpOFQsjdtnA1k)R^VH%ta%=_(S z{i84!>2IchE^@|~3s^<18)#C-7H=@%X{u!BbsB#V2rQ%_P^z3{naaFRE{LMp&hXLV zn+Wqu`vR?NQK`Kj<3d#b_GFvxevlrWi89mZ-k$7|k%0T-iBNd}$t5D*>|^w#YpdV+ z%0`m2$PN=xGOEP7PD`Brm0f77b<;#WV74V1q!v)jIfaVxZ1%No);@*=dLd{92&91| zJ28J=&ZvRBm=TE(Lb{oL3eHe3wJ=rMT8*q^I%I}xDQO{OQ3u-U-*WR)5QK`b5z?ed z2;k&81uLC+Pe9ef-?O&nq3-Dc-!H;AKzN1IPzuleq*L~vu7_nyPB%J~>%fbV6nZ87 z(him{=!_xkIf0!4z-T|d=js;!qa6))*P?$(!)AQppPE6jQA;8>2^&q&8KNn5J-6gV zzk>BX9m1JKHbXo9x$c~KQ~s?Pbl=SN4W3rRG56jIGcZ|{)CKAhZBXukn_b^ipCI0u zN0Q=|l(r}1)YlFWU~={!{t;u|(2!~lEVo0abD=ViA4IoAO?00-Qp!oGcqwR_^>cs0 zOCrc9wr`63NFKwnyuhMem1J?G9E+svB4SmdM>0GVU_$QTj6zHNpSGnunU{SdCK?J% zmvAEOVQ_Xh4d_i@kOZj+CCLk&Bv<2Ax@bkj22S&NFL59DqqoB)cS}8aRehg*IKr+vs09@gQMiAitF|pN z485XZKcRzO?N{@ME1!UYYggGK>4VLsi+}Osc7#bGh&1VI3S=OkK6WM9t&}Vjw@%E+ zM?XXExrSw#zV!5|EUxOlI@BsX>k}=o3 z2yxl%VX87vbxws&`|ZAG*El~BbS#l7Qe3eoRC{4jCucL)!|(Lz5~4EBU0SaB?~MFZ zIBkqKnD8!s-0ig5?jGqOWV;bWetjiBuGbYFzb9PxFAfFpX(4QB`uTrT4Hp5b0-(DBQKrLpfvS0)UweEWGpIGLRpG zNJXOKkSy;^HIaX_>FCDsjvPc5?%-S*5Ayx9A{Gl!u*;Ontah(?*MUJXP1O?)C5=pT z?ki8|=AF6}a;umx7`PO}M;9{t&R+GC^AdQ#z7Qf#H?E?#s*}JTa^bMm#>^3dFR-6xLEnEH1dNl`weIJCXFEu3%kR2BQNBX`hy59aCE|H<^FC*CAqw;pPvfLpsgkol#XuV!s6=|_$%IFA zW9}7)@&-=S0SW<}wc|65oO=P>;f!ZveZwy;zoENUhoi;zgcabp{hpS5cgd=^M+mUw zQ&N8*?;e;jZJSaQt8I8p=L|)HJTLF5D=7W7TWJEvO-d@7D=MZ}Tsy*=YgCOpKfN;} z7qrs4(Vw}kaRLDMQjongEWN$oiOJLTi!dmv;ur|LpJ43BlN zFELvZNqZ!ailQ{VMu)No8oXSfqSOy7ez1QQY9GwKr3U}l_=!q&_bw;DQBh>17^5+O zz^&YWy&WaCcW^wMRMJa<`C^8v-z+yL#Lmu$76FQ8ZW~kIxs2<3A+w!*Y;sRvQCSG+ zYfOhD>;-TYGbJ8KzIbxNhmM$#|7WS{#@QfQmXgYtf zK%as6GI-~W`O!zv{ppcp{q}C+7oSk-Mh&M-?|!kmMOam*LzF_x=gaZGWQT9sn%9~p zw$CjpQIgHm&Wo;d)wYpwI6@Tc`v-_(x6#B6%=6#Gt!}_$*MAgDGG*b#h_kJ;R5ghw zvOy-jbuv^jlxd?~A)V(w{UI#K_4|K4B{tAYcp1I_)a_iFS*1%IuUIvHS{TTmJ~AcE z8(%K}%NJ~O`el)(V*9QKS36l96qNX@mI>|~lRj^a^^VylVcEMJD7?u&3Iygk3^S|$8%n=BR7A7hoJl% z5cjAoC6}kLAmr^ogLA}s2RI4w#dGV5zw@7yi>8U!ODF)RWGo1H5w+*PJ4g#V`^G)I zQX6e>>o8&E1Y`a>?#TE~E`>#zbQT)*-GHxLTcU?i;n!c}l6DhvOa82sc7_DX4U_vO{ z7D^tY+`ngj1)v8qzp!hc>0Q__54&L||7wV?F{VKN?u`P%C3kiej`cSYvz!hc1Aj%Z zo}`^$u3X94POryWoaAy8kv$_u1b&*NnY!7gwi?*S5tT3Qnj!6+aZbpUeSZ97sz-di z^WpM4SPwD{TE&a{A=hd*NK&1Pf&$>LL+A$^->@K2IJgA_gO$k06y>u^=YQ3~?`k=v zUa8uIu{@$Fex}Pp-*y(j7o8M9|C9rDi{G?~2>J39XIJ<3_ z82&0TiZV!JIW9Y)mWj2Ua+|pG8HKQv&$w4OaLkAm1)vIL1{GVFHiIAU{xOfLJ2x32G{(*}EE|V>4CxP?%P7egzw+|LyM%vq zpUxh(<;-kk>ioXQ$f9!N1%I<@p5>L_+qN(#3{^ic3a|o)lu9&Qh5Xw}n)$BcJfep=H$q4;ctvRO3C46_dv0RPaMM&o5Ex zQPK0mClpw$H)-^VK8L2i8j);o$8S^dh&_6D_C7a8tJr(LBroNeH3t-PoxA!Z7n8gb z)qlq0$wOCSN5SE%4UZh~4GIRmtW!A0z zjBD9sFW#c3$4t4Y(Fju!h|B+#)&AM3ai9$VZ5|qz2;*w9!gNEJ==8=#fgci_mSm)^ z?8>(N%bnce>|q}}WqJ*A|7fP8(l|dR4S#cyRUggmlQ2|+=)4xlR!c?I}zsd07Yh^>Gg;!CjpEo-{l)?6@ZSdY;Mjt(ODh7OlukUN^-jh;pP z)R)>Sg#yIpl!)L&1=TkMf7W1s{s_{fKwCG!w@YY{(K=QE`f`eX{Dmrr7+@vDK*Mna zHAL7866r|Z)jO9lm2+edJ5VPnj63m!^Es&yT zKP}34_=jW#?QSPR**}g}3Y{5UF_2+)Nv&fNVn=c>YIe;!di|tCSsxQ;Ip*pjs zD3Jo&F#m$7N~(1i+(u^VhJ6n?SEYZMBi{kQL%_(yWL% z+P6HcS*eTA3wcOqMo^rT0A%x3iTyvm#Q}^;73FZ0X|U!&;zvMKL&)}Dc8-6fhVZk7 zC{YyVzUhb=1pUtpkw-D_wL<;2qId{AaV8t{<-p=w4;;DPR*gf!;}$>?yL zpuco~lOvk-AdA$mEs^*W!2N;_80+@E@<)_hg?GAt?n*^_kJJswnST@0`14bQNZ>V^ z%meNC^PqiY2{NlM+!FTSuo|gC065W-s3yd4xK5&=xYqm)YD6cP0MhsKwS{GzykT0I z(dplYjdMb~hFNEHyk5w>)1kL;^Gn5v1o` zgJ4oq&(l=cw3CDjl2qwV_Cj|fulG6zu{olzFSTl^lGE$X!GBc^sgbSOmJc3!AJe2} z(L|X~S$KnG48wXZdF-S?TmCN_EOaO)RIiPr3x$wv6oV1?Ag5*W)#Lep?cFJd%(6)}t%XCK9yQg5bDe zv>#i3() zrxyFAeht_G zeG!q%hZq+<3xK^gZS+7a({5!OGe>JfynhtV+t>pc{HWJJAKF6Nqp_awMVo)Q`_JJ} zf%udt27q^yof9DYKhOwNB(V%s9kyC{+q%8+nh+IPO-NGFHw#}039LJeDXHl$u#)|d z-)+gD()-(to#rz&NKPZ7OaDq+!8?$Tg`fj*N3+3#iv<|TYuv% zlkra|59Rx?6}Qw;Lp_ZLbk#hKilOfIrfL#;fWroaid5fQ83YH#K}99jgU@Jal*hp` z7D8-HK^2l=+qO)cYR5A$IUMP=Oo-(~vdr>OMp{27%9GZipg~7>9n2ew0>ID6elike zwE4b_{E!vH%zVTzewQB}lPn#^(tqesj6t;3*sc4k$B7t-6`1=f7#9%jbbA&WohvPL zF{uuk#Uzg`;ALmAE=1~aPP)-&x`m=z!qTSkT)qZmgv$QMTwWSqIXZdhVwI({WVKYY z-}70$h-8>=xuZvNviod=C_u1fYq#v^NUfFMbKd=MPpw$a0p;mOjBPvUmw!hNzR@v& zH)`ZrI*Xeo8`qZk(fvqa2pTPZ+A;l2WIk`NR62#s00~0Gk(6rn;-kHypH8^@O-L11 zrTw0SXiwlg3~2?E(9gV3n4EIKs^3qD31tGWx&Wfbs<*Z@zk;YgQ zNa7BRoq9Ef*YYXXL6!A+>wh@x)7J9czSVjn|BU!{Tm2d}r}yHQqQ<76%o{9nS~- z%%Qv%?W(fJuRpNRZz&<13-dC9Ro1bgzgiukpz(==>-itk-?D0OTpK~j0g1_()!Ufj zlz9Xa6o;9kE1GZO#IP#fgX$=Qg#R2ueW$pRp@hH|!;{d7p4mUaV)WQs=NG^NKoccw z6rtRt-Jfo>ETQ#+*MA*lM-|sSUI$2qY!%JqRh6p-ZnW3rb9aVz|2~MvvT+XLLB~g65rst|J zeS}YF?3bXeD7gM<20A=0kiyc~0H6=A3;r6ZpE;Tlu)DP|V1LA4#+acY%^Na=!ZrRN zqP_6A6~FQVdaRE2t%^TfC;f=?StY<8m=(Is@u1c)9E38br2y9K3D76?a(Z1!Wg;*9 z8i+j}n8mNdD33lmNt4N8(2A)DC{~tYx0Bg|Krv;6Qu6>y!^&I|;SdC}_0mo~$OhPN zM7k~e0V`0)$$u|A6L{sQd<(3vNB=3OfF+Cu42)F1y=kNZ69s6hb{;_bIg96T)Ts+R{G$&+U|44=O7d0R@@T&v3=t~u75jkwdV-4VTAv=o`|x7*0oc1 z7-YAIB=?yWdMUkj0STjDSKdO&#Jf;HbIx&n*0?Jjh4#pI@wuAt&3eslUVWRgn1}Ae z43>vAa)Vw%6c^HM>Idx}xtkLBAsN9Y5MuF8ZZMg|gvmT5E&aJNLc(wXJpvVVS@;Ip z;hqs%95KYg4{@;vc!OOv++rAl$^S!d6gYTf@T4Trj6t*|xwei$O?$<5c%7>vs1Yt1 zs!vn1v>-bIe@AmDhWvEJV)vwg9wl>XWUIcs!9_yiv$o$!b~>URO@Y!N$ijSstLkrs z2n@<&w8)S0A<+IF0d>uk)!B*o1_?m&#d5hWY{~@UebdEhq+TEi#J?&Cw|;o!>&Nx= zr3*zY9B^@jF@0f4Jow8q^N0WS@;N7X&N?@YH``?tuJLca2Pue=kMNJQRhFYJ1qv$%A0E2kTW(pgCMIOQp ziw0oFBpgD$DF*r4>4|mp+E+^)ZuhY=RkXS`e>+~iWDGdcy&kN?drgg6yZCUk4>gO6 z1!~vIR5$XzJ-dgPf6So{ovlrf!#^0)H>qsIg~~m8MJY00{|&N^l+|2lGQUdZuq!9q zCbV=-5fsn%WnGXI#jl~M6}6G5lR;Cfft)+KQUr16HVN|WOHueF#e5`Hxd-FT#wJX1 zEp3%?885B?{4Ggu{a~RfR+emI$n3{fe`cXTKxGl}JXRJbyxSKvz`SL7WUl+r)r`Z) z%S3JU;dHlxf2{n4jOEu+U=b#?SVqRAVs8MUGYp6kq>lTYL?O%eiBSEO?!bVdn^!V2 z6C>+pox>(!VUo-;k^@(0;_+JhV>`Rgt2s}zw!tMO|-g&Q{c7qYF@Ek?o zAlB?igb~Fwc*oXfmEiNAn*D`hdrg?=_AlBmAC^M$dFBCZH8ms}2j=$@z0N4pM3#Ud z)pi6);R?cq=(@a?Tz*O z(8k0zd6hT?^bM7XP1j;x$1$N{lUIX5fH@BG~#j>s4e7ly{f2eHo z^xq-uE1%Yya%-N7-N8wM2O`&i-B}?WnSSN@%Rl{#PQ6mj&{^B8yL|ViE@4MIkO4kB zrN~s`_+#1N!Hr<(qYVjwtj#V{Eeg0M5y$3KZh(cUa|Tk%S1z^3T@%N_LWS1&>#7)q zDeb-}vV2~*@1o-n2Si6_rs#&ye>XsHfAwhxk)x^{UB0#X-!OUT3-a;FQ1(q9ny z>^fWCzo-$WlI7+UzoAR^LG&GibUVK{P;0scIu0;Wa2BFPmnQ-v%pMkRIEC>q7)Dy6 z#z7Nfn(B|?3Q-`hNLcYRz>Fe4BXEHS)IP<#kDLrd&@wo#@CH}3UR1!pf3k*iCpAsm z7P^vUVIH6?%-(^ks5aL2%#jWOuwK(p7hWXO#JoC(NXu&O!}eQ0Z2zoSu&$vbQEyjG zvWY=4llZax$NA&4bdmfnN)!us?Uq?D&Aj`dXl4jB5Ci@pN60Kez& z$Dj&Reln>x@2!8x^=#7E)gh@6TWvkce#G3@!YIU+#Piy?e^<$GOCubBi9MClbN_DL zyLRm(=Wsm-JZOx9ntz-w!ott$NZRsyos-K?f0}Ibi z1VpDqZmKI0hYxt8e?!Q;tl?-APlQovELgEz43}ubWYRDr6aP>lk}n}7oTAJkQp7e< zAxp`cYx`&lVj=IXz~}iL|DcyahqLU`I=oJO8(rT%)vDa-!i%2~OnrRF4PzhU%X!Ve zTZ(s(!6m# zW$4;Ui4LDouK)cEM7ztnDYhU$l~xqXf5rU}*4Ehe-7D5@E)z|+r>5YASTZA;c%)iT zN5Z~yGm$~zf1MjKNxZi|@A>@g#3+OZK?p`w=@Q!l)->jx9CaZ=d}J+V+0gq0{`>rX z$O1#u4IuLKDN@v4@jta$%uyE{^I*=4GSJ#-Me<} z+qFf>m3+}@EL|YA;LVEY8uxjq#K+aud5T}YKpWn;e=Z1*S+Q0LcgmcVwq6W3yP3c_ zdhJpzIt;|Ze51;f*=5cRoUbF`2KoXp&ev#){RCk}`RAikXw)sPzI-`wSzjB?wP` zSoU0w*rmL5o(0lr>*h`sE-}pK)aS`1Fx6ghfnW{VG|$FttIz}i2qe%b=F0B&O4e4- zb@afwl#%-g$JF`ru78$7*C^RC84eSg8d3NJf7H*ewvJ<44x{nR+qiuG8wzQ(SZIxF z>2Mfx^dY3xN>1PY6OsIeD^Pm^5~L^H43deZ{1i#?9Wszd!8?hEC5sj;SgzkNv*Hhx zr6u0)GI76bZc&H%al+t<-ME}sP)c{7wx<55ckh2oqtKPSR}@eU?=OUfYv69ok6Wmb ze>zZ^(QNfrvl`_vmYwm_dylwvGVQ>3fV%(qhP9sc^1)D64UU6Q4SPZhil;ZblTZa%0QFGf#!tR?SM!S&ELgEz zOM;-Ri^dtSyAtUu7YGGkCI>HAK`_FLe>8(_G{AH`sxZK1DWMO|y0n<82zt}z4swqC zH1)YV{xx9;Uk2so%8apjrnSA>U9LK|-$^CDEVoMao3Jr$=?|0#lJ1Fc`gO}MvYt^A zWyF-sIv%k*u4y#cPwdee0=zxZAOUgb%&{-N!v_4N7){8<6S`|2O6lBWL{mkfe`!NO zv~&j@#(!*cuzw|cO`A4s*|TQKTDV_SF9Stp#TRR7+`pjQR<;SaO^%#v6@q$AHp5yL zAesTCx(8)#7B;=)OnRg)3mI|CD(?xZnfpXag}~~NeJSK!Y7%bG4Tt!(&Xd-93M@%r z@xanumalE|DYn-SjcX%#s=fWwf1FI{B-Aqixa>vj8h+SNna#$F#B8w7y2C1)%$Y_-W=87nSkp6wVlqP-)17M@!4?SCFirB3SwP$H_ISly68hS@B#bsMS(mZfXE(b>MnVx}U1}tIq_^(~I+^F5LfWBI;=?DOO1Ugd2c5`_-t4nKqe{~1pf4H8|_1zWWaH^(x z6|z=G5=rkVW==Zyv)B(_y?XWQ*8RcmG;L$VzpbVU<>}*psDS7<-S%2r#qdLPO?^`- zt+7&$-Mm!F{?P+9$r5PGOA~k)Q$oln9e+?aZ*%TbB$*^Fam^vZK zRtEi~GqS6yE%)vA9hs${!mcqZ-@u^}{nJ4J-Lab}6F2>bnZaba!LQztyDAH;*iHFi zB8r$ry)lxUFjdE+^@SP@9z5L_;I01nA(w(oRRz&g9W~@lG6h#+eN>%dBP(6=a zipL&@`fm#6d@wMn9U(K0L2-dEXkZ+yVp21;bs6mp4k6)2Ba% z&7LTX9=VF<1@E7*baqEK`0S*APA#*3_+~ynsvTw-5YRUA)52Ut43TPz=B#i-H-mnL zeS83odFW_q`KCDZ199fA8-m&8eICvjJm^7A#nb|r?k}*)y7$HTKBkTr5O=8t_J&s6Y@a~%x$p+{E zfBygf?nWz#nRb4^!3$#U*ihOhfJgEml&QXqs57&dbwKU z5HO1UZK^ZyEvhS_gE%2ATkSbQmoy199$O%}=VO8E zg<7Gua0wDWrmSk^ykQm;mA5XM4h_W(e>k?@u!aOi<9)20m@OSQTBmVCa36#wK9!*( z1u85*zR)!_J!>KoE*ETHSxQjvU(i0b#^FIp- zkdh}DDVEYf@ju)Y>5BC1Q!yH8YD~w*x3bXi(fs&H6|5W5ewUuVARndX1VDA^e-2q$ zQ;r(Bs+wRtcqr_Di#x5~%M4{1yi}e-Qu|i_aY=_hV zn9K4Yr$=UA2aL;2`bIhq#$0U)-_564YA9D5(-af(4e&a6L!6MdPQGe+64*K@}A z+b#;lc511An2MAVsI znSQxr|M>vB$=w=m*Q}DYxyNRVz^U8>{o{N@nsfWqs{n2`HoE7dxfkouf063BVhD7U z^iBvA=T;Ll*u5LVA_J03gC(EQhlTZ;!DR?<@vo73y?8SeU)d<<+pH=)T@K)nUd{+P zjPBIAxsHzNN4?=H(G+%>h`r|ltFc1Hki@#$YX*g(Qc5Lfxarz*!UGuRGo}jP)Z<4h z)I~to$g;^B2RB!_10O7Uf67}iN6+XZwUSBKeg@1uiY_7mU?RHTQM5VD@i_`zWj{+^ zma>ozpK$hO7$NSLqE`k(!;@)QtBcu|ki~U)IT5ZcoZ;E*6$^v7jq{;N+4B zY7{_Hq{Y6qgp&GOG&a2AejiRA@Vbvs!duH@9rfsx%5O60@%(|We=1wm=>bqJUs?f7 zZ(?`%sGacqLk(2&H6fUXP)4z~1s7m$SJ^(D z;{^2MepRh?9||8YE{)-|_+CUurcOuhxP2)SH*xd;#0i+4L47AJM|xH_rzs@cU8Q$2 z(b1t1iY=VmrGLu*f9nM_>ufEh7T>a1K<)8fg{fh5arCp-{w%j+9zHaH+GuAz5cyYe z)IL}tR0Rul8I)0=O7!Dz$BQ`D(kSIq$HmCek;q3>Q;hINS1r_fI1slH)Ru@Du2=Vk0L zQeK`sdXYC_;EV*ah&e5#4jcSC7h6WC#-jf*a3ZlJa5@RfFy>=&Rhm37^AUrPhwbs` za1M%MPS$Z`e}W(Fs|bzijBB$j%v=E*!sGJXyXTh1J23urmB`IfNEpK@p>dn~ID(B~ zQkT(kbQOMy>6>_nX894<>z8jf=AO9Pt2f1Rz2GrGYpOqY7Z6}59Y)@PIMh>gn=9~6 zB61I%L{+i`w7l3>WOxKuSVDfQi!+ozOPZL7c?sm*e@0MIcgR564LX#HXE9@VR_K5jF_zCVf)5#7RB~&0oA$to3ua-?hijtba_6- zim#>tf3@L@S(`0nZ~V3vP1R+EUEpB=Yg~yjI#75`2!p>7A zT-72Cv>a4I*W|v^Ge#Az$LT6jl6L1bXudP(>uLh!j82 zBpPmKUfy>l;lCZOa44SDhL5-=*;GgBe`f0)aK@1lXZ)>ABy)$9fSC-t zjQv=T(5t6sDVm_(X-w{`G#nL~<7@wfH4pU|>N_Z0VQ_F-aV0pACxV%sh9-Nv>gwv) zbTh);MoHTI4gI`@T6pri#3U}biqtxp?_ZK%zPm;K(zl(DbxRNbkeuDIZTP#W+_WSj zf82A9E+5_I<6}ninTk*VX_OI9MobgvBF&3O{+y{C(t7tuA|3f z_Wt|_fcZ!Ai5sUDEWr90u?N7RXMZD4HK6ZXQF;_aU!UQA04)i*p%?%h^K`!9Gv;soJ~hE&N1k~mB-m%`wsk^JL=f5X&U z8&CU?QbRkxL;pr6{WS2D-%YvJFC*^#D_^yBHSGgfXBG*P!oMV5ns)LJ2Vy@|`zWFN zIMe6CGW+t`BMW}&;BbWm@Hyk*GnAZDH$@eJye+4f!Jqo7<4ite`lGefthBybPFRFqhTcT(6xBZ|p zS{BRhc6AXCOO2rc`kc0P3cTE@b(u;#rYl3?phl{uBt=fV{RgLxO*Y08#-y;#chR?=M)-XmcR@=!@PSr{_n9QH74 zDX7BqLf$SoE1m%5UY1-ZKXCBSAaD3YZR8>EkCBuAK!vF4{*071_RwYuKmU_}XTtnU z#VfMF;)tit{ot5HYS9RoCTAz?C10NA;lb94_0OdUUrz1*b?bcLe+22tKD~+b$oUCM z18@Gw$j@vU5NlGD>BxWs;+&`@it-ywC|3yvmb6>_`@N*gI;Vat^IDVKTvPaHfTvoSzj|DMJ0$#k*R0g62B{@G% z+C$!cSW*2rUHB8!fBsgnX3V%<)i0}xDEa|qr?oWuNOI09;!o>t_##k+GW`lk)CGsT z%vl2b>g1#Hxhbof$|Ulz>l?x1l#sSSny(44llw=~UVScZIrGG5D)pxm2=BHLO1TLR zIY^O8UKDR*u_8SzWXtd#a*$^UUiW{C3gSV!m5M;#Y-1Uye_ym=A1yT+DFz^=+tRW9 z)!=SCvQalAnE~NN0uVLZ-D6>(mNM>T$VO>izh>qiKNyH#eZxG7n~a*C@(Go1AP49^ z@=Qj}*h;XEuJ>~!B1krl|NOX`%^u}oy=jyA`^`UVdV*5k>Oi8=5y5eW1$f>KRtspP zFKpdRV1u~*e}?8B!ghHcsK}tD9D+XDi3My={0bFX$jF>vkvN9wx6PIOx8>##@7l~G zXCqfk-?yLvQznb-v2Rs9@wh#VW%-o= zFUn}Mx9YJ&fVEy*j;~CV@*U8YxVf_tOfFU;6Mp|!IFFeca;m`z>4xznJ{54&}w=)j+pYVG`yaCju{Ajz5oocxbQ>#rxxvTOb zyfRk6phb5%(Nr^iop7?s1VflnODa9A*M1m#e;4Q*ODpOG0+*W6wcgtobq$Z5&YPf| zTaQ&6KnA2h{IP*Q-8D2x{jxwTruEu#@7V& zb#wATC*Sv>ipGer_&^Sol|Buq!D^Ys+Lkw&&{k+x+d5F$pA8VBEblrVBQm@A;Xnq( zf2loF93HgN*#W&}552yfr_7a`3P5P&Uuxo^MGbf+f84Qkt!5^bEiK}L&p@?#%Nd%A zO%6|xdrHFhYNSfttCKV4gm$6A7KyGaPxho3B;T(h^NdTC?j#Wyyf`n^T-TgwYS;j1 zD1@!Rf)~1lDE?o}YJ+Ck6uf1lD{23Ce`q8r(coUuVga)GTF5_)Ia5TJYuD?4ZWEfH zvErjFun6j~YZ43n5?Tnz$&Nd4L!z(a2;Oz%_ecDD)D)aiT6OAr9yboMrt%h8;YN!Q?%DOrI=y%;2W5$jWPN?|5hy|^kBHgsXZ%*v?hbozaB zItNq&u6{#waZ#0@D^Q4(f7-W26dEFNxup7)vxpHm%GbweU~XBm=5(6{%Zu-IxmdXA z?f~B>C{rJK{Xq@iQNA{Q~Kb# zs(PULes$)Xp$pPr^7;pQ<(%4WuaFyO>~?rS|3<(B#qQ*K-QOU;e+Fys5XB!EtV3#9c5~13op@jZULbX%4pKT5$_~AYI*(S7h#* ze&+wTYA7vearFHhe~t|qi8sIm1U&%O3KCsm%I2e(41u)0Ek;#efEpR5eX%|p-XUHS z!09G1=Qv`}k6TdVn{RXVV<1B>r3DQ77t78|R0_WMM@_u;U;Al$!4Nl6W{(AewNZ7nzgnWuwN`p!`(e+Wi#Bw%o)J>Kye*Bohk z$L-E(!0kudL5T;13`)ER@;hg|j3B9}M$JoWfjLaBRmgF6Y~}oCkl{l!``z`~A(qq; zu5J^JCB(f0lN99_C27haLnXZ~0mX^`Jl`o#Vx)&H1F2lXB8WLC#{+glzHcb1Z>3&@ zT6l1QF!jM@e@2*Tt>!C@8Fxsqqh5up#l%2ptFjhSQKR=S9mAn7gzG|ekCL%`H7y#3 zl_k9P5F1d8%fVoK6$D{pu3hX2Mzpr&~DMHIN-3kDjF<*WB-z)x9AevWnnlodY&#bp_- zf`B#34~aLz=0f=p9-2ucs5 zPL!>wf4WvCYB~Zh?M^N-3E6bt2Gtg`KMnjG`;zT(bwH7WNS73WiLe(mO5ION{+_I7 zRW1|jlChR=dQW=c=KJ<(E_z~~A?3uWx~ob~9Y8Y(gz&@uHeJ^)61M;?EV46dq;3B_ z#Uad5POI8}p6`y)B*ZQi#GahP=n&EXdeQStrKw7)9A=2 z%pjt#IYye9($A?!{OOu@Q^w##{XtMMJZ-7gxO5v%gNCKy7aUz-mA~YHXI>igX>J;9?I>Ph^ zK?bgGWQ_|`3sma%Kw6 zMbCP^bM#WJS6YeNATI1CG1obE9bG>JD8?Z9;tjaFsDyTh=L{91T79#BQ1)0qhH_6~ zqhmSVleJZ&0`?~t=&R=%49PZ{+SCPwGhZKv@0IJI+86*%EkL_Vfzo{*8;1{Kmh~$) z8-J+a@KsAVydQbxI(IFXEdz>ORmouqSVhuK++Zo2#Jus!_zRgL3Zj^P+LTSO-oASy zcS=n+kf}^?LpZmo{a0H0r3fw=zYMJT7!^;ad}=Lb(I-GcM&(K9#9FZmr4g|)-6dv) ziNazzuR9~r<+j>D(PC~)`K(`~r3I&TC4W>nW;|xc@Fq$dWD;BT@UmyQG{)jMu#EG~ z;s61!JoE<5`Yg0a(ZyKMYRg4V(2|?Z%^e4`6do%bUGx`#c+@eG?W~!WctnQ5m{M-C z>e@LTdB82&1`Te~i}9XV=l_Fy?Px%w{9TwtI1S{tFy}m5qO&}tQmK=7)ymgCNPp7C zf2&WvzlBhH-DsR79OfA$`W}Aa%|LbHXvb}sn?)>@LLS9ZWbseA$#wY9JmrgciM%-kcz-d2v3@?lrD-6QCWVCiM~H%hQxy5wIR^p;-q@LW zu7lFQN)H*O3JQU`4}`~iXuHzaN2&Q#XN13iAqxo#zYzW1NJBN`oN3G6BFkRIuaW^L zo9VlMYq*|JQfy|jy0p_I8vF7yCCj+Fb6o)-1iye>7an5VW6T{*sxyD#D}NW7u)ocY zIbz`!cf5;6|K`H&9p07ll-t>JfgGd`i=O_-)zkKG+MTeAP{O>Yajzq&Uals~zVKhK zCyJ-yGu7))NT*4oY1)|x@0FN4RX*Etn3)Kb;(--Lp39W9i<9^N0-W4ie27c7+svvk z>BPu##eG|*#CD^bEo*pW5r1KAThuXk+Th29>S2C}0$aR!M@E{0Z}T~={*d(>E_3ia zmz?H*i{$G-&=A4%$_3?%g4Sn!m!D4^nOnHEe9NOwxx-18L@od>bW=FuZy=fHOxu(NA!CX ze_`9@9h&McGDO!1QF83Nfk+S!Y0td)7)e4N>_qe1{7D5D@ys+Y=1v52SIXBFvDZBN zG?j+Nx1yT|`d5LJS${g)9LJ?bD`w1RY(%19ftWKDT76~$kLxjYltegQP_?!}vN;*5 z^|11zCwxJ-Rzs4=6DX4l-#cU~Co>`XraeB&(=p8LV zN!pAzVkrzjj&~zbGQOaIh5X9(bH-a4}acgs`#GKoDF9aC5=F; zE8MzQ4@sTKlfyI}D3cw70RvNENj`MYy~^i5-<}Mo;21w_qg$sUe=RwKQcI_l)uj4sv3yuE2szj2Euw5a{oI;3Z{+ruBp&^iV(M6bZfCxgFoorr|GqI^xu#TnCC91 z@>`&qB!7YXPT-Wdd>oz#9tmxU6+ad49@-F4!;TcM#Hc@$9|Z*FE}! z|CR}8&V3VP>#?5rcDG)_ue1|U?c|HcT_1M=^?bb!aM^Ej-%%`|*3L1z9ZXD9#Gr~A zj*&RopA7THta$^&NUKTxC{v;n4_y`;pSS+@oPYAxWSD5s&UmI7-2)KmGa9a5Cp5Kd zua&W=-w=Mbd&5-qv-3TyA}B5kWHIM+_SoUSyWAx%6Dzh;X>8)sJ~r_awK4I`whM)c z#pyPJJ5mQ~NYw&zGGoz{s`B)@q^q|ldLP8%oT+D+Ecza|xu1dcK1~=PU^=iSkkP-P z{(qjp+{HoP?qB5&-@P&{I+xO{IDScqckaVwx7|YSkK2S{F-y6!1f3f6$0>ww-rBC;#3!#g-*H~Q9ygd1>OMh{X zwP$s;FYY7hWLEe`q|~47ka+)sWyesflX+9J zsoy`>&qc09TyVqpyA2Wx;q;;Bp)7_^ac%6~tL4m(5Li`in*+|qbsRnH3n)J4ykWl^ z(WrRi7pwDnMG;tiFO3x~UD+0^`+tz(X=*K%SIU;~@_i%Y5PM4vNz|_nspZ&Lc656mbspBd_vu@P|>6xORw7{jU8WVXS~>aeSeEFzB{F% zs45%GPGfq)MMB;}S6s6!kv|-$Bm|EAw*j}ZW#YB?hcEq|R)7RbO>@_P!W5e|$@q1Y zPB-YJRvF@Pv>jO|h7kX4V>Fc1`-_Vje-m@!?*><>EnJy`pRv=}VqDTdenq z)ui*wWe9I@SR=e^TAWB&GJhNS)0%$$Xh#P6b}0&SBHO}Cj>;!_*Ge;k1>%qzQPJtC zvHOc5RM6v~*wCi~KnHakbjcjy&Rk9*)9Ef!ZAnU)0e3tgqo({w2bfI0J0@@Q)d*6G zuLRcTzzwUQZ>QbT%V7Ko6X-&`4xwD!K|G@>-ExECX{;k2siKnSrhg9{p2drIwDzn{ zMcpdzO$RKX;`1?^56V)zV*k#SKz$;xvKhQ{6~O6cE3MysZd#J3B7M z3S3#0ch~dk)uxpAw13#I*xRovnGC`N&rWrDUwdsxfhsT!fVewEu%qxvy~3?KuxIdY ztP{FQ16gM$EW7?~kroKFI_g6PwyrDT_DyCIa1NzLchnE#Qq)_dbJc_;ip3i5!>H_IJ${Occ*U?3lh)CCaAfnt8B#bBFU zUljWaTuucGX@4mrS4w7f%ln2QLw>#YL0`nv1oiC^{UOhr1HPCWQBa9Fcx~Vh=H0}x z4l=8<{qxlb(YW)~RB5ay(wog87(6Wsv3o3JhXlpk-Qz!oo3-2 zvnC4o2pn{W93#~--+q=_fchsps=YR%PC}qc;ZT2PN=PTvs;LY)}O3|k*wpOgo^8x!+ zmeGj6(SLd@!RZe-XO!9&x(GMR<1=*r}5C4}S#$Ui}>nFqo-`v5N+kMCj4kT#*O48NulWjp7pupLqI< z5;g_;fq@!~4gYj5k{^ZGqnV749-y@19_DrsU4I@;6|wh`OHKZeNGbFrRI%Uo$#W?L zIUYR)bz~Pwb4uRpR@)UYLXt0{sk*6o@kLOKz^6?%J(v01%WE~IH-uq22E&z1Jepi$nVUdAr@8UfPJdHq>}G>qXal0KC>>C9 zJb(It_Bj02W=^@X8#Ihq^?|MoZvMn%*9)LO`I~8ov?f7ZB?`1FVZ6jDvDSr5Lw&cg z|EK_#deQMpAUR;~;WaLOrYtCXa{k>AVma2>-Z)gM#LIXzSaffl2aivYHHOlgZaA)! zFu$HTn-wRL*i$(R>z&U*oaVYt+#_HG@qadsdQ)1I4n0byATE~PDRlIpyi5i-I?g}m z(Rg(!{^TwmTZTSCf7Qdc@0NN9GlWNW`t@KZ2#PEo9{Hc4QJ9_g_HaCa`e&`jf{Bv* z-24p=5R{~7l&h*nC*2`Sy4(_$I$%;N49vt|(uYk3xS}NZZ}Fx`xBW~r^gk-a;eRIz zL&Q1(@Vx{>$bzry6m)Ix!yjR5HqWq6`5)GLpjRL088x`t6lXj|+OKu5lZUe74n84u z{HY9!8HkjDWV@Kc1kO_@7f!tX1uw#io!;Sa_E!^ofFZSTWJE>S7b0cvF2c~x+4%p- zhhI{p7j-t;z<^A%7aDAT);BINe}7PiUe89jQ=BBCpWcY-MW{rn>3Axtb=VQKMCw@R z#MJE}+eiIv`?IA$1Pddl!vWi+FA@e9ef91+pG<+T-Z2#+*K`c2tT?CZ1J4M3tEP(g zSUl`@9m$a#R(_i*cqj~YX5sdV0D6qG;{~G$Xcy0!-VygBOpK8X)D-r-EPqKwMvNbl z88X@^jyCO^Qc_??f9x}j?M=|Fkau=LRTT}$jafeiM4xWeJzo%WzjHPH)5Sw6gl1

{H7$Nx<~S^5#-ThR1;I$!J%%h1Yi<>7XR|@{#8v|S zu~7*Qq`T`)B)sdOvwg7_Cx4F&_`iOL7;KY^U4$IUNrV(5fS?Vgp2LQP0EtnI7u@Uu5K`m?p-w(S+rWI*dq zI)}{}9XC#ziDj(R#%N)2XXyLckuWec(`NnG!K-OO6aFP75=+bt6@Nv!6Y@0{ut`O* za13@e<2W7Ufm;pz($m~>S21gYx&4s&ywHrYSi#kENtD|XVKdg7{p z+#BCc!i?xZe5k!ElNWy`Hrq&SBD{ilvtHZ1Kjj`*Cj2DtXcvbG1voNmN5pAsF8D>c zo4ov7;y7i}q$S9o1%E-R9-?N2f0a8=L#0gcH`$R%H@_&OCLw;X24r{zXyyptEOnYJ zwz0Da1LQ6;2P~MaR$HW&oJ1%cl)8PbLm|Za@L1wc+O1fFGzBz^iypioXkkOq8R^Le zfD*}4G+bf52uPHfe7R;QiZG;)K;tJrsM`mm6PxAEw~aoF`F}Rp8E@6A3DF}&+6OCZ z1SasEq7$<>T#+l6z>Yciu}gy+X7Z>?hpl-*!#(X&oiC|J0b|FexxITU_xBQLY(ll? z#X*ZHd1iGeUx@dSVB1qEl(RI`2Or+LQ@$gS^`Xpex0F~i(2^2*&2RMOmn5?zMs9)5 z40iY*8xbK9gn#69m(`6X+16%HLD2Fi=&0hUjYG*5GY{(j@)}4YyV+)9l}}#x;EUqV zpoC*0|CLUJI+tGb%8W?sRJ8=bcLybkw$h;gHFwxiG=P#yl@yv(@de+H1flH#Cv7f6 z{GOXj%k3H=g^yM0u~SQAU)_2R&_?H9u0P;>+qH%al7CmV@F;q|romYq5&;I!z~(ly zl`T_ZoX>-0l0oZK%V#VynJw_D53ve=AH>T1-*<-Hcm0d&x)^Y+S*)a{`m<2f@hYI| z#sahJuFZD8TbX=tjL64rZXaM%vfV3$l{Tavrbw^wPmw#ae;J`cj>0XtLmKa{9@80<0-+8! zEs6}BhX39^Xc3?Wv$3P{d1YkO@#Re5>67m&>VL8Y6msJ{f|}Dud}BjZ(a5$g1t~39 zxQyrDl}Q~%+IV>T7}tew{9C3(h!*DPh`*76QW!sTO!c@ziM~&3lz!ctZV+{uC#><%cs&GozDa z*Ud1(`<-RZ6hK}ro!Yvh3^i+5x-(g=bS#1;hPMoafsqCe$sfX9$7p1kvz}+-o{^9#HgDk9+QGCqH6Y2EZC9$KEe#)wFY>=J@AB-Vbw2!E8N6bPAr za6-4@bS>a{cMit7wL9eOruI;*y`cat$WsO){PSoPk`9&?eQsrcB0a`B>$3k467ihO zP8aJ`z9#0?=&;%bg##0!vMY;S=N2T!jWAqLUD3t@Ia8?l8^@aPM}x`^ncfQgmVEv2!V z?%ViVCryfunaY|qi%Bw4(GZGG1x-MH#VQ<`WY!M%DX8#)CFP-3U zjaA!f@Wb{z`e@(``G5HCky7oZ0F|uBsOvy;iQ2Z`j9Z^%C?fQdjjnZk0ZlLuVb>-3@Se^*IzuE+b$@2^xh@m~?6#sBdtVPoLA5u3rJ! zo|2~X3S58E@PEAbf}sg;2s~Fy=3j8I8y1aN$|*ij^$t^jsR9qpG<$foVp24ym{Ave z&iz5i3>|#V6jVerhb#W@Uv9*bN9&cMb^W5Y$ozmiqksVy*MoIsrfJ^uGE7sY70=l0 z;^0n%7YJ1fWlgs`wynA=Fu^cFO9>!6ZP#prDl^|A;D1cij~6b*5frRE<8V4x^`9Y; z09C=?l)YzT$0(J?%uviVrl6ZfMGuTvdPGS5qG3TRPlQfL%Z>QK#vQTzIB28@KNT)? z$X`v|AX=_|Cm%c_$X5ar9%WVl#_j||`I)&FK07&^%JHC_Y@|>I{&S?#k%6h+L^4-x zyI|mJvwt`fHdB3U>!9Dw#v#|9tEp=k5}P^+zL8$M8kV!jiL{AqbLHGQISK$XXP`|G zI$RYZiz=%LNiy6kvTC&!33Z(2=e18^j#qs3`Pxv?qXu?)qLCHd>HKuzPTB+aJD2pD z3t{r4)F3FhWyZ5tSmA1tT;(wPLf#=TVvCjtJAVoB74;JAD29Yqq)I6$Pzby_R4i=c z3kDTV>qi1VhG8JMa?4FNP@Y38q_Bm3wvC{pMmi9RpViTfUg-|JA7N4g07mQ&Bv z2!CiDhhKiVQy*sdiW7PU#R-$`1;tP+Oc-7(xGk6Mvg z6vrE?hVfi{Q4Bf6)f5Xciz7%?f=h zK%7n;&jgGJ5_3*!H-)q6cUH7@;Wx+@dxpRIz~4J%6d3 zHACMvwXbD;#mtlX{MR_h?65?iYjteniRFq<#^nseK~RxEWyepz1yhc zpoi9kY<&PHcXUt^ke>GT&t%#6qJMY+RfJ7NqIdEosGz$EfW*|+3d=NOXmNqYMy@ql z-SwUX2~U1p9Wcqk5Sc17n2h-_Gfb!7lBAHencfY7?MO5x51q6FCI}NNTVPVN4IU!e zaDW3ufF(+EC3dS0`~x00LA8)jv0Y|9u=ekE?Y@q8A(ON@;yCX)uY$KPMt^?g8UJsB z44y#Lp?Z=3c~q;V*PRrzbx%I79{Ut(2ZR{I_@&9BVmp8Qg6QL-bKX+sAPtPWQxT0& z+6&?hvII`Mv?g)4d{%ej%FDm?fBBj4HmqQfC!c`@qB8%UONMjd%PzaH;ZrOJ9Z{YU zC~af$M~$n-(wRe@(3*;X1AhUIvX4V;h}0-et8SJrm8y#HkPD5?1(nrW#&JKEO4;U7 znIzz3FF6P>kH`sSNJx4WLM|q&l`c=vMA2>$Hnc|Li_&(iRv^vX{=q*imDn5r=0@N! z=y7Pc=6{E%;LMzzc>(ybubv2)54UQ5gKNR6ERJ9{yvV@kxZtt-kbeM+=cL`A^NK(G zWc_bpsS7!6>`nFSu5wAQX7P%5Rra8i`y?)sLz3OCmrBVKSGWsN`9Cr9aqtq?rRkX zG%e#7oln4L_b+(3v478T*a;jHwFm-rh}ys1wY3d}*fU1EX0xiL)UN{6s|<#907vPP z*Z*`qu*?lS^CAyc+H%rmqnAF}UpP0r^`RVI4urn4hVhgm>a14MU4=)Ol&6ZJvO*mc zJ>%y(YN95R2#BI}DL1)2#%zFL!qEkijMwXeda-iNi|9B+iGQUbc9RSq%ssVmi0)m@ z7Z3=NgDq=N4#j!{3X9iokFJGqIV==Zxt`!OFKQ=jGyKV z=9Hui#=DwB zd}L?YETDrB(SH`HBZ)LP#8i=1F~`aO91lahuAj&Y#bAdja-^M>9|m|5TCL6!9k^n0 zXh4_CFhk>Gi`n* zKLvH(665LJstWwqv0UMimyj+J52(LNa95hdA~sj?C!uc_N|-*Nxp)P_hyJU79p*z7 z&mU^d5yY_*-$)e0bcdzq(61LZGxBeGFKKppqOs*!mUK&Cf)b#q@wPJp;-&=972}e( z%~pDY;(s<|MVp+sdYmP?KtOFWy2?4r!A*dYv7E&?QycEmFIs?lt*0;=@ZN`|W7Iek z7w2TfAq^jdPFhS>K%O#m?)Tl8%g}-Q)a?mI2iivWEJ? zim&|#sWR9TnVVL1lANLQRHMAonQzm`BzG8?vwsd*=0WYnY^}^gYJnb1^Xs_eS3=Th zL&)DmN{f7qf><{0jSr4?q3B@?KvT8QrvnHm_4M8nvNnr5rHseJ#|>IB+^kqe^unEB z4HCW>c4&HwD~7|~yH)`@! z?ti`;a)lXvKkqL(fx1!-%x?7_R>u8XXO@xW(Ea!i>4*DGLJV}h9m<4zvAJRCrA#l< z>q@)Lq|At3D{{p1dF@SX&$Rm0!2*CkDAa0DeXj3uLoO@N?AxkJMaxo|BY!EgldkpukDWel1xBr1NSF_luE|p#zE-^V zCSt8WV#2vV&kWg`En$2&)OeoW`@j8qp4EX!N%ujx^OA~F)_UMDq+|-X0J{B1LPzfp zuOJyoMXT03}8UXu{6TRe|9_A6fMR^*$ISl#|@OZC3+M}CUn6sqzG36|4c!GCo#W2V(~^lSa#>1(Ek%U{No@xLO!f}XH*9-<|g zYNBOo62)V`N!60j(H>cbG2*{+)vvU8)Ao)AC#$|2YoUakx@OJlgO6^1DVIiaqnktv z6ic%q5lEqu8W{NfbKFsgLKfAYVyy&Iuys@SN^7)(1Qc~HN|kl=;%E21T&GtN!Sr{o75+} zR)x1O)n;|$^~RMjOryjV_|}kJgYw5EkA3iqRIU3X;w4QkbchbKSbtZ|@BNjDDN$pI zjl1$b6qV|t3egYs#-@oT!L9mgsbW>I?YKOs}NoRT-MHgp>&4pS2Yf5y@Cf1ysRfW9;gG?C!!wgv_eioe0LzSP){h0M#lL;*Q{_44p5PP=t5Dq z%gas46ndKhmc&L*`F~2jJiT^eS@aCx1~*gG8WB~qtB!#`&O(tk+UTdn-=w-B3S6g8 z$smXw^Zq08q`#qh<`*T<4e?Z>Kc8kg7-RRA=c__CkV3=4+d|i-2*|_)xZ0|uKM!fc zS?^sOuxt3%!vXK};xYAs>2I6ago1Q8z0D@1P8`<=bE4|KC|9!b5eHXCDEq&%sq-KeWW(!dUSt4Zc5BC}B;!ik$E)yK zf%ieEbQ7MA!XJDxH}_Fe;gY0@s;aSU-;rO9VBU*H3aD}dIyx%l{)fR*c>*{<01zW6 z)w(GcpMTaa>SB1&RSl+Wq8p_Ich>_43Us%Y4usM2RtG~{psllu3Rf@JI9Wzxkz zI@vJ+47L80FtUB~n3a)X!9_trkhDYVfoj2A-(|2mN`Heh33#>GmDLN|+l#wrn48jxonut; z`9fiTb9TpD+%UsCQevi75I;gg=4=Lg=(cK5=0H=*sm=RK@|F;5%bR# zil4?~AXEOCJ!gTcG@`K&_txO9qo&-L7Af#DQuVw*` zVO5*juJm2B*$d^ZAiU2n+XERL3NrG57k?AEMahnUX@h(MBHg;kUjdpGgQDi}3o|nI zcHqq0zfu+z%dy)jXc~k6KEUoJo#BF)q<)o`GnvsEA(73#?AR$Y{4Y-t3L<&~(1T{r z{Ngq1N7nY-vEB8K)NUl80005wX+y_`l@A&iIJ$v?RVHD~fA~(3PPCa!n!R4VhJT2A zf@vS-RVJngqgQ>U#)hdO5VCpb7Tj=_SY!Q|yN(}HjP6Vm%tohhptEVeI4;}R^rZNI;Z^?(0;KtAk3F(r{1Q#S)P(5J!Gl_5BBf0&u7(6dcmwd84uggNv~eU0?ap)e5bf}$@lbuFpCpMU))1QbuN zKKyO1@m5hHf#A4rgECdPi(_^5FUyKPsWiCRNtdBHwR0H=e4L=8ck1c+uMGasjc(wX3p>NFuCG zYxYHnq|mQo{8tdM;Z$eWa+k1ys7Ounc#foUI=?UIsx7xNYAtK$`*oaSRE8O?0oPQ-b{f-6_E|pRuM`+ z_G9q$ep4TY0CD{D)4A6#@-kdH=$uvOHO&H)?6W|d*t5ekN6c^)1Il#8gp2| zR@&c0^mB`k-(nn(?tfk8&FR!4_&S2^ikYaa@?@rSWnj?lVQg1f4IY6BFY#F07{gJ% zK)+g>yVVK`4OZLzLeGP8WIWm7a*C7bh%G3SUQyN}&E|XDU4rU>zgJciKp7{P35SvL zH->*YAcf7Yah&=u20ezthq>Z*ALO563o-4|3az_UP}wI0co-d}W*yoXip^ z5V&$|6O{1w2e73o_LgM)29FW)d&h&t#ewB@RANJ)PjAM?^+>xd%@eg7Dly4sj;dh> zdPC+^5WmNloY z1RMGo%{G8^<6P6R+I14R6mD0F3<*#?&XX+80xW^y*$0eyG1EW*r&p7B))SOgepf2A z;A_moZO^9GHIjRQ71fb{k9%T*nUP5$uOfcQ{6vbN5PvH|&lmM)K*a_Y8aNb1n9Aea}e@$^G*^WYf^-Sftl|B)@DUgE!+*U z;IB_BWb&&419J2axB})V=^;UP2DLsK)|ZImg@4w)(<)Pn;*>-ms3syVInLYwIW^C~ z?f$A}!~rVFgfHp|1Fs6(L{BNI-!k^gF0b+aV8;(S#mqbV6_d2+R$Ec=u#0uYT9sLwef;OSUuxc)081>w1S3Yv3@u zL7mE!G+PIyZJ~?Jj>HVpL5ctp?=DT(HKP*)}cqeC>&7pS2ntiMpWaF)4fdO z3wAWjyix{;I4HG^JECF|%0!hk7nZR|zdE)?uY1Njo74U@B)$plxE0muAj-4n{rLJZ zcu3Km7FRw32-aXa=seQ{QJ{%4%Bs~MY%+6e&)qqlsiaD(1ZW>!f@j=~YCVR~BY%3* zk%>n~^7Tdin7k7JrqD1^;HxxZj1T-)EZ2pLa8)v4D)JYx8M2*px&=E1hSZ-$3*m?x z0ok;eE9n5$;x^Vn+EFiP8`$FlmQZ@XKGzI>G@|C?-NS{`>ZxbWS_hk zCXykLUsd~u=vT66i##1u6>ODLVhY2?PDe?Te!M96fgk}e5c>Da&J@OkHJiPu51W+! zV*oB+A?dJ*Yynvcq&R_Yd?aOy0%R1BQa%#wB>xd_j(9xdHF{oCVC+VU+J7+$^La1o z2GbppzZw7qjAVTc%aNm9|2EC;pIvANyrj1#HxmKtD>GK=^S~(~Y0@pI&NnziR18%S z%n|Qs&a=M1mB^~&i%%i~+tw&}A&F`1)2_}fvElol65R$EZ!AS4s*PW*5&ASW=&@14 z39KW`pRA1p_c+hXi|w`N<9`j|Yf@1ELmtgsrVt))(>g2OUGYC^`A5PMg|*UmL(_l~ z0AEF|*aQr4QqRe_-Ze8$4+c=uTKe$Uqw3nbUdq+6I9hG9{!u~`vB)7EaEe!Zr7si5gGFq_;U+||fFXzv^xFv+pP z>!|D_al-YWXW2lB)PF*j`{BUd&(}BwWmT}(;TdJRu?EZ1+oCc{w$RQnR!j7w5jow? ze-nN0#F7%iH;-~4hMM38&#@Vq#dB1_AI4l5=EzTZmabl(XDd}ID`G_W;)~aO)r?Pk zuLYNZC?1~{7!bA-Vti@8HA7dfdEG6Om+UjiF6C@=cT}M^9Dkgxsl2_B@*Z%2RpXg= z{0R&@v8M3-^7F3*1E~uOGy!k&KMI(3Gv;4jdOzZ>l?-iW_26tEjIj>zDaOB`I5J49 zrKj62M(eK`{widh;84Op$t5%C;-=$rvoNe2E`{#hVKF*!bLviIla9IE>|dVP&Hwrv zf}Ys(GMBQD(SPWgp+yt{02L)$5rktG2#2?g;wJ$vnqBR6XK51d;P1l&-W&ccqt!-I zzCt)Tq0{lUlIjeC99>-Fa~>xS5I03A4?v#C@_DNlHPlainRs{r9A@{_P~;RnS}BQZ zC6kIpU+xi=QHsEY=hZQGvaIHuYI8n!m<&4gkEpp`{eKJ^{w^ld@X#)6hK$ zDSMNu<=15f7?1`Q7wNGE#)>(@1YS6C5D(GM3bVaY{6r7{F$z}aIDTB$9`Mv~rXq|> zc20gBf`7?pTX_$JS@|C3N2!Frh zrSPLR4gk}qL%Jd%zI6gfAX&Dxpo)Qu5o1h+rS;H_RuwYKRld|4&T~)h_Z#b| z5W;R~^=Q{;^c;s6i^^2+M@`1$kaY`yr^Vq^ME>+=^TbQ0H!$A(!r~?c+fp5)#Joxa zg-#Z{S_+{}L~)Xphe&?UYZr+F2LpRaHd)Omz`s&P$O#ww-OzH;sgUq%7N0%&;%u*? z34d(D3)LVLf7CDx1}AVs^K!tVnB+lcz#dIwry&DQ)dSkzFA&dErR%zceV3Kt9zkr! zJwQ}P({lEBw;J^7jaE!)tR@nyHGH-k|2-iLf30+Y$TQo-vtKX6a?+1=OuFB>Jq1i7 zSX2X-7Ib~_`1qS$WM!O7}Lw~>kI}i3&UyM6xS;_O1jTYxzgidJ&(wo+w z37u$)y_PfEXL+KMxVdL+J1&5`X2}kfKba~6e#%t=(XUU?EwAF<8c}tq18m4%Ab-qA z>)t&YD-&+W1f(uI9ow!gGfU$)KVEE8WrYKJt_C2YESR^=fiuU(oGH~Ui5S>=jDKlP zYt-U)#zg90CAnlI&`PO|nE08Ur!t%yplIaa0yiZWz#+3U zLJteM2sXWII#BHxDl)ow-45|bD(~o^k^jTm;>YM)${C%eKv zXqUO28|9Jys|h!J*J>WVz=44~R5LZY$I0>38IOTah%6wtIF&b1Q6 z1J9YE4G!3aQ;UJA&_fBRDCbqFZ!LH3^eSVLN`c<5ihcM~!HlBop$tkOzHywyjr4E! zcK@^fB_~mpyx@XDYHy_Ll^HdssOb&xmKfd7%OH=zdz$c-Xjfs@=6}QwHam`e5Sf*h zCz8OKOyU`f4;JvdSH_UTI20D8T{wRbw4e&`&%;ozp__wMH~$YT(fp0Y$Fvf>cS5d~ zxG`yfd}tC?;P%}HvAI@H0OsU#gF9WF31-a+%WldUMqeZ^39iriE4k^gJurEbCRH zF#W@Xt)T!+{R1&;6p8_^UG#HnL(O^A1mZ0qu7mCukSthjY0>JoqowZ!azj7D9vok? zRj^WtqR*kpYy1a5qcK#Vk=2QUh!KXogpk*3`xN|CykA><8Q>gSjJVJ2X8GGP(ol(0&S-ip31B8lT(UZa5o`;(!ZyiTt4gJaBNO{_XXZ3m$ z1WF|K6`gE0xnneq!Kj*n5m2!kw&K_n3yM>KKY7}k#H_QrpphflK@iH4w<~H3R6*Fh zB=@&jkR@20ZVCX|A*kWs1*Ty#0}a<$AMlacrSRpjhJOseF!~+{$<#sETg*|LT=fBL z0vWUU6bN9^$r4U4fHQqaN$D)}>ZkCBGvx`qh9cGU`U&!eS-eFpK-7J}WxgYQrI{g) zz&XTO82UlfS?G~v8&#nj0-W*u?i|S(g#-78j+IQNA^KQ`PW+4J1*An{{9F$(X#CYA z4)GLMSbxYCfNtz$=OvWc8Z42#h#M_k9EQiy<@-nR=BnYZA>&Sb?AIbJ6HbR#Js4*2 ztwHgp4cn_Y+!u@Ymf5iw*0! z`ZLSbV<<94|ESWo9oUW!6O2UvLLJw)MvB}L7Jq!sUQ%T53B_uq!S~v;a+Tp5u{V*M zSQk%K#f#1_>|z{%DV;m9w>)joqm|{|F?Z;xWrM4vA?Ry@^*szWC9AI>UjmD=2%(9zZaLEd8uYxZZ-vwC)g~pii@-W ziGP2%OuZj|b)G}s7*d*0nvS`O`yXmJ+GR%pynWQLHDZeWI+3@YSu&xRZ?hI?a7z>h zaTYN^SOS0oY9LvS=c}3ST2}eNzR@4?J*lU|^p{Q&k*z3)F9e7!WWoTTT1t z)Ai@|(g_&Q@C0&|F?r2Hq*Qc%H{g=iSAPv_T(2Q?d@gxek}@Rue);_S7zmB?uf%$ny)}O zpkXqgxHGEEC7LzF67lj5K4SrA7RBIf5@{yHsCFl20#CBvJ%AHcmenZv9)k~ zroUgsv#Nu#@J#i<7>;D$I4d{1D12kejzoPAS>KI1& z6B+BK@)wyPuD}|<-e~%^*69~FSE~4rLVr`jf+B7~o2=D*J=S(RQgrNxznt&q1nmb4 z(X~UJxE3S8G_Q5_PI7=;b$=Ma*g{ZGu8B=y6C+$J0S7ukBu{(?#72xVIWm6}lu|18 z*#(DbO3OC7m7X+nY%^2Z*Ofac9 zb>X)@ghuK}$DAfTT|vw((Pkro1A9yI5*>#5IBoCF=qYNq3-=*MZTEFlq9A{RDJWmH z3s%NEnE{X&@4rI|@qalUI=5G9PMgJaQlDOk%gW=%LCx_50UsRnS`b|Q)|2DOfI&HF{OzeedQQ#bzO{6j#uVaIWwe5*101MiH(muz%1Lo+cCrlM+c=7 z2S*Sc3hYX|bqoVM;CZq?9a6&LEpn|@ppT(P0Ojgph|Ba?se%aN@93Qr|)oc*tC za1fn0c)2!SBcTjwZGq0bdieQ}pr+cNHiw7fV*DvuJF~s}JJbRU-JcVAzqN|@%5&VK zA2v1*(w=@bT-&A-HzK*k@vd~46tx|gdzsA`|HX0vY~&+_p9b51DtCDCAy&uWu6)9& zsotb7Od0>iOM-twDuIdIL~-pCP2{1>W&H<8Tc2PO=%(H);ej3*2Ci2Vjlt@-xTi;~ z{&jiyDjdGM;h{{_hYXekr3?)b_B^?Qr zc1wsu@e|ZobL>_U7oO`;{uY{3mnQ2uQbF=F(ZVU13X^|NSh^Mtpb+?$fB*ml1~VGh zvT$4g3jsAdyBu>{)MOLp?ROq#0Tw^cJ5yVOGJxuU*mIbf8pxIp)*Iw+k<*0EVSO}6 zASfSXFuGKy+@b-wL)%F+!z&T6r+!yJl`49Oo#j<=k(%DzZAB%vuM~w6Nt1DRN0q<9 zrfhX=bWeYj4+6eB{w}J^8Vmedt#x`PCW=FdYRHFhKv;2W9~WEE2^#&Ogq(=Yl#N6= z_Am|6zn~(Ybw*Tn!C|1978t0d9oDzZSj<(i1`;qdwzN~4z)!~84Zz$TsnhG5ZuEiiofWj>1 z+MmV|z>^#GrlT&*H8Z=?YE;2AV*8+jf_#6J0Rv%?(c2#cGU5MFeB|wa^|hU0^Pi#il6dcqN&FcubhhF~I0bGjXt!_Jll@={&`f_n z7_LN>PEf2nYa?ZG1kIB+^+l?KmQvry(SN7}VfJ)zD}(<~omLXj;maz};SjE~i)1;666|g!Onmyy zFY^3-mju8700000D4ify0rjl&SG<2`huE`?<(g)XqFmR8Q6w7yX{^_p`);J5zk;5P=P%mk2!KIB+S91ZL>Q+JecP?Mx=NZ~qB~7i zKjWF5jS*1bb=5gfiK+g`tin=kBf7nkdAkdU>0*btH?0<`2W6A)2J9q=W=t8C4` zZi^hOh67;4L8V^VGQ=C#x>A4n#VXJHI)L{ZJINf|-ZwlcNK@}&7@m(kEg#*tf#|6% z`pjwjfNcFc*3?A90w7E9X7%g1n7%Mhby8;Vf%g4&$hcoJNRrpBw(?YP1h%q!PdtR8 zhvOlv=JD(B==2^H{is7Iw1`!)+u1}nn4G1bB22<(Y{~Dy000004S#=Llkb=|I}){7 zCG`YzepoBM*j>zQ?yRlF3tWz`)hjy?C_B|=Cbky|+7Xd*8|YgChJ+zJRMJ7+-PFPO%uv)Wn>DfU|i-%ouF-^^&`s zOM2;=&&S0Fj-b}&I~sp`kZ?S@bU2|FD*Ns$8x1^X#zneAyP^CHH^#P z>NoH8PulFiEbi;#bbd)rf*CUY=xZwN*4gL+Mp1x_iA@WnzQ}xHsXUkjQa@Uq3-1dz z%IIkJ=fYR{VT=P1e%^%F(Xsb%vYIF_Hn;Go{y0hT+N0HnmMeek|LZwgjN~Lnhr%Ex4OZ_9n|Zh!9ZH;DnWu(*g{Z2#MpPS7vUy#5dZ)H00L7fr9H|bPNX*9#+wt1XtjLe zI-6aA zRyI%iqdUb;Klt)nMR5G6EG2udu7tc9Y-?>p%&PPB;zJ)|3gs|i`RK~2W)P3Ll0yL| z_B)Dwl=0g1oJ5$%ixDGx9I@Zx#<^(sr(gUakq_PL0(Q80Fm+@otS%vl#A|XHG_sYC z-Ps2gMdyDI>J4$6Oo#GL<9OV5ZC}Bw)u^8kY^@OSXBdNtbG-2yV2gM};?EN~GSuD} zBv>8IpTv8srdb-w9w~b3M%5H=)lW*Q1^!k-0D!@NY9t0D8w~5909uwMp|!Kg${1O@ z030`hychrg0000*beeVAFPO@hROL1KKQNcFJad1|5V9=5(uWV2F^)W>fByXE=|ciA z6bP0>wM)w|0<#VOtAE77;j>S>+C&9;98qC~p@|5ntSsmX_6khQcW3Hn0q11i3s{vy zNIlMftOA(HX?fz9A(rZV&Ef!1dH13S+^bzaFgN+?laL!jWJKA?2#l;eO+SNG_Gx5E zT2+73ib43zDoe(`HcZ9*XOWd1jESj`++9QZB64ti8r^A#CDU$tv8By$8u_7P8zyiX z+x$Uo{A-Cp?q&lnwp|{l0Z?wnJ)9$BLf-X^gkKah(=EUciYoTVqe=>kiV~I3CWpCfD+qNJM8xxy2Zqy#*v1pc$6`j zmzsHxuV!6QC5nvdLmJZwCI{htDn>(!{fOq{*%bwYp6S<$I+ zfC`NO!2{of_U5wE8_dbXWqUWZuoSfzSg}3E@xCd*wHHB;eC8brC>e(4sfKb4@4|ek zg$?}q_va~D+TZ|n0par)fk;>qA7B6g00Px-;+lMCE>s-VzkzgsRXA85^_FjTi*6QqWhTRqJCJ5Nim!@(Vy z@MgUMlYZ0lnE1pd)%zFh$x=O`RMQdif>i$Tv$(lu3$tgWWXhsO-0gp^xV*(JP$98j zz8uC*Gp`|m>H>+QQ{-BHRb~iAXV6~1;syW{B1tS7&9pLz_>Qavn>}v$Iy>|L;6e00 zIX~8P`GJPiWkyKag8kHH6>Dzn0*_YtHtU^4LV1M&yn*mY#p>2!<0}FW!q6DFZ4G&H zVEm=-A~<1+DFfDM>&<^OX=T9^9KTOpuom+j!O#%9FL z%-JUEynFHyS5RXC)vT-ac^rJq2_4)Ay*?ksYrEfW&*-Z0$DDuZX)0NQT8%GHR4b#- zAb1bH`R|dASYXP8jkwmDnyVL-J?_CZz-r@lw942)Z3qs(=a8mkiidg_9S_f!!upoq21wAb-;i1s#bLSPR+*$WjswgV-dn% zlFJAP&4P<--$F5jb5sG}G2A76UHdw;%gTv0zyJUM000)IJK=$`66O0l1{d{Rk^zaO zw~L3 zU3(I?#2$aN!xRakoKl=x;G#KWs!&aifV_vn*t3}4TgFddJqLQMjP^3RjIt?B0yHXc zbp3ifu0be9Vmd4a<4Yk?r)fFGwXjKDBm|w4(7y>hTzVA%j~USvC0OP9>T)#Dz(^Pi z2iBG?kpyQj`6WwQ-2f>)r36=3`sRR0j1l(1Y>(f`5=whd$lB@0ETKOfT!kCt+I`+k z`c;_@cz6bd0}+xEWe#>?l7e&;oV0e63^plCL0s%p9--qfP|n#Qa>N&CROA12KwK^= z=_-FTiuMQvmQUb_h8*^7U1j2q_;UPnZRip|1E?w&-&HITZ=md#%X zjS(!c|I_Eh290QwcOZ}$GeL(ogG;9Pw$Q43Pv47PG*bOFo6G~w4}C{#W1N%x(A5OG$>^yk4Y`Z#J*?E6Ny=i`)GrWHl z57p1~!>V1J0JX;?lGJ-7yTu>0E>K^6h%Ai-u^%z>zQDE)IZab`m9?GVxN>@0xIAD000013;S9L0g7H13m1(v zj85^@hRS%tulDeCusQKK!davDIJvv(lO6rXnvx-m>fs8Zs$k41OHv`owt$%Ujv$_f zX$T6v`i@JBW=Vv>dREx$!*Su7wE_SEoW>GnKB1{2G#lRJgSLlDMuK9ofW&`^NQTeG zX!C^su1XN(9eC;?Tc()tD6 zUvw^2+5SPKjQKD=@{Rv1K~8_$q{XkmvnfnRR88+bAe9DDmj6PDgD4)>^JsR+ z^k9Q{={?ONPFC6kLE$%f6vG??j4X^H1lja)dh#x+4e0k;rPJxXIHKXGW}w$XP)sEG zx+F;1aWd_P_`_KAJg|z*ff2f$-!R4i000Y<_rk47Usgyk_1#XO6=;7nDV2t&@%;ta z2_d0eZw6TJ==&@OmtD&G<;BbJF-=?zv<8KrkN;noP%xynmS#@jO1NT52OrgKL=o{$ z@*eq?Y~8T5NAGUiUm(|{?1Hq_*GNU0R*QdkD@5wr#A<4m&vA|&oO@IB{bpnE!kh;L zXnd_as$P}?NW}yI1U!EarU8R$vjsxdn&1n}y6aeelowyzM)$bck5&u)Mb8Y5`sug6 zeKhtZw_QqE$Y4l#gO}^mZ%&r~pQXu$6qH1SKruLI0!0;5Pq&c5et;GQ&OB&RK@6sl zg5Gba1HJib36Z(5CHuQKYtg=!axeXS`?6zF*vPl4I@3sw!<>K3W1j0qKOkursFgkM ziC;*74mr?$I)G`WzCkzu0030V3pdbyxPYhMcI81H_9~I=WRkPk-QaIb`C?MNk)~s0 zt;X%aYx?ipXs)6^gRu6!Arto|4h!9BB)|azqo4o)0zQlhbwGyP`2y6sfp(C8F)Cb_ zw-hoT6Cd1w)OCNi_l^S(19=-M24&RKE6s+U?$a8*W|&*2M%C{2dx2H{%fD3mc-nPO z?cR9L)!b^QPG1};yacdQ@#W1z){#CXS*I%6^QCLDDx-;~nf4!E=j9^1^E5C@J0Dat znbg2YqI%8OG>8fjM{g(sPH_Z}04fVm=9Ynea3SR*`PqN#FM&>spkY$yRa%+nqRCvD zoy?Zzb?HnoW z!zCtu=r4bke%`eJ0ACZwA6B2u5ApH)APs+8tIM?BRuq|sv(F>nfd-#8lNhjvr%#VU zoA%rbF|DoTte>c;1=Y`pzr`HaY_MGZRfG)_tBC~zGl45Gs`?VwN^B z8)6e*Y0m+(!C-Gd4m3IG`N36@OC5iI@IUwY>i_ZVC;OlOZ&?3KUaUXfbYuD6@89%Y zfB*K-|2fhD|Nq|MUFY|Gj_x=C|*J!2kW|&){GC zdk;yj^Ju&Mg8&DjS?{Ko(#8(7#+qW0@-V@CHw)ffU6H>|lXfA_P#&R?jzE8U45ZIQ z{Z*kr1mJz2>_0p9Pj|Jipr~2{^yhdqD|1Ju5fy?TS~%b5N$2H3S}7=G9p)Vbb4$22 zz;}HXrFq$Su5-O_O)y|0c$r^k*~yCdH{LSyyTR=?ebyN^-Xp$i=bX0N;`5>~Q6Fc% zwT)$UG(YZr0%f2Y?nTqHK+J#i-<=tf&Scez*ip;h<1%vl`9a>zo5mQNOFRD7^blNX z*}jixw7ZghmT|w_UKVgf7xc~*7LO)JwVz;015$2c$bmEY*>~D1hyvk%V!VNU9}u(B z2=Ng?=FtfPBcFRe-RF0^VbK>6tmMLV3kpN4w;RrCsKUy{_>^DqVyb^JhkChpss68n z8FF(mT>>k)Qrhv&RL;QesnFsDSxLU2y}8UT2**7+5nkS_>L|{~NIf#PbuqIt`TT{M zMZfuA@Q)@_B}vy*!m-jXH~oejPy9L^ma!l^*ajQ5>94Tmx)fw&dGZZ=^i1R_y?z|M z=0=_2$DmMD=GN$!w}XG?n{19&zWRHaD?N z8LL%Z)?YT-kKVdI9JN^nK_(tJn27GP?x?TrZ>->8ys>vMZb2Hd`;gVtZiGGM$B`saGe z!;S8P!vV=uy}PFJsI`U-dN~ov8sH%R0WL%#pQ3twc~%Jwzg=tyO|85n4?j;L54XNX zyFgtdlcVBg=4x(I(%0e!dav6qJM#&io4P?T3N!N>Da7?>se1&BC+Bo{4Hj9Xc;cWg zQrP0E{2g`dk{5r#n)QZRh%ihWpx#LGZ5Uch(Fg_bYhfbqNP2~9U0ro|%lo}^4!{>j8s?ug39zzdy1o zA)`&)mB(bbrQB5m8XgfV9Z?CXJG`2!f^H`~puf?!0nl6yFd(l10Zh}QMDW2zYnx`o zKgrF~g|UB2zG_O5m&h6c)~9DgbL&;nRx#~G(oaA)j+6s`YMZL6WejjyFFd3soBJ(~JqGH(0ji&{3&rHm}zVZhT=$&nb5+H?jGW->spkHcWtF*NnSjcqA4AxT8Ldc>Iwbj1m=B6PD6<{N! zNRko3$aD%tB1d5ZOud7(gVIU=weGKy@5cl~qSIP$0cS~BUsnd%!nt%hUoycA|&vni+x)FRrU-2*nezNbDx zy)us_#VaXnPsgdQ93a5u>_7Y>$GxE-)ErrEhfe20Wgb3>Zit%cK6a&)lTz?f(KUbS z=Yp0+kWp;k75I=nhhuqxM7t`;<48FdN!Ucht3-}ucqqVy-N6`w+69W@Vghtd=0Na15h0SeHf zW{R;Qro9{txTIe=&8-M>0VR!M1JEaJ`8f`&Ax}x&EcNA8_I>o@3b^W^6jXmnM&gRD z*tEzp_KAf4h7EhQU(Ot^egXxpUu27>4>p!9|HqBm5hR8n)1|B_kb->q*q3IuP_Ro*dbu2$|QvQ*J6LorD3@eLBPrd=F>y$8Whj81jf)<&642g@t1MSic?S(|0oX=kmztf~jh|4*3YP;vY zGx1R2wlLmfz`6T#w$p34d!&Vu>_rjz^pyU)TvU4eopap0I2XaBg|UC9>*Y)|Tn9Nh zbVtLVhNxwo@k=K#e5ZRpGs&M9i*e=Lr%V-3UWop>tU|A2qGRG~bKoNtsvcg)N^=M= zi>|b|ES(>N^KNTaqi+rML*$a|AQZ5_rDZZKzllO>VfxOp_zJ%1Z@AhP$0*m8dH-7T=v z0uD7;=zG-#d0)L9E+Wr@d^$}}zqwfMrO#wNb;;+9t4=sE>kM8+P&vq1q8)6R7^OQ zH8Ib)tv{ohcIZ*cu3)@k;8P78T+8n{d)80PN#g?eRW!v(?83%5&mQm=Eo|(o0nFaM zUy$N%{6^R19499A!%{@vx{BJWPXKw#hQn7IFh&Tz!hL_42YhT2GEZ99yPf@Qw76p?V%_kEfQ9GSO`A zk8jfj!N`BN{;z-6cZUOmM1-Y&b;C7JGs+p5M6Cc!0P2^KD&?n>f4_<3DW6j)| zO};y8T!)O13|JS%gy8B>*3V4D)OD}ZT)|gpz*7mjkIr6JP&ew3x4XFY1-3_O1v(~1 zPX#uM5hUC?|A{VGJ+`*!V1G;+j0`2Fep!@tO>BR}-e&Jyg^DMKm_C^d>o<#&T0ICM ztzoi){V%1G3I~G5|7)mq*NzX5Dw-0!-T9R$4fsdVCOYH<4p(F`bR~47|4fhV5D&j~ChySAygAdRg(`CaT>W zBEx@?O-O^hdSJ!2ZAenBwc#_IF%}5$zrLibqxRKpqzfH2D5_|zs+nDI?+R(HQZ(%T z^vsN2(@N_`e&)5r2m{?pLiJ6b8N=n{!C25tVU8kTaa#Q+wBz*emyeC?fso>#sR;No zJ=Vay#cW9>?2^SO@p6KTP&|LF`oLMJe=_!z8~VAc6(VpjNS?! zgYa-e-k`9SUY@{%leGQ~&k^Vx;3vlw&#o%}&VEiVnkQW>paPwcup!_^*Pi_CAT00i z820f7&SUphV?!2)_^F*A*fuwU=Rm z2%~ISD0+`_{hjz0fE>#H!LEO$cw4U^q=zu!hj$!7K_vG<(<NsT_qQPe{>$AEv1$ZnkNyhPE-pWlQ^}h4+T_gs&=6)Pbi9Csj|?w-G#6@74``(fB*AX+`7Cb_tcB{>4iac+J*rsS&!-puw;Q? z{1#2A?rB)Lp785wLt>xQ;D=FfOeeBhx17`zan*&;Ad91E!X~YW>#p-Uep26hgHX=S zF56}XKZ=ZEjFK46OOEJeqHSkfrtUn(VQeKc?iJ1)Ga>~+Xabo*g;wSbqE6Fcf4akc z0(gAMx-7rTYATWgJ?p?_wJHLNYf-o7HSYvqj>vqHq0;-)0Kh>8jW`~G(nUEF0UV99 ze)PhZ@(TOlT3Y>Om4GBTTmvp=D&4(e#$q_2#g`uqgO?e$9 z0+u?E#yACd`gyptTW3->7rk>Pe<(y^f>Fe9YMO&0SF0DCI*o+Y{STUFqlGZ|= z48J(?cxNe$`~*1~h6!V*!wOQ1z)3%!C#-69V2*^)vg&~cjD#;Lah}Ht$>VaWcp;o; zm#Fn9==tH3iY!(d@;)KOy)wPpk!5891s%1EFnNDV6aPaUVONkirtzxF2Rh;gze*Xa zlerVsf6xRh@2a?iO%-HxP4JJaJW;Z|%xk~9XGV=htv+_JF>phlL}*#V^-916LkweP zF5fPul_ho*XR}}RBl!hCQ%1&8%CxoFF@P8)({^+Ae_si}c zu3j*b>-6!t>{U$|zb9suNWBINJ@Vhv5zXpyU*Z>5ggVc(->slu!~b02*Z?RBgSJE|3{5wyd#8xY(n ze93CW-gjnEicyPkt@pbeo<^ zl$wM+vo|d=y`v!CMP^p*oB_qAxnQ@>ycUZme;nrCBMzz|Sv0qF?$ltsEkAN;A9hTLMCw3or{#C(^&6G45XRlgN z)Aa+N?MfAT)wy)qAts|bFhx0Wj&U+W)1i~tVc!05_gFb-6~3^^2bTK3Er?TNf17b( z^8n8^zn=bFc8|i^8+NaY&RnMWcUrh+lB6!?@MaoJ89+2Yid(ZnWrQ}QPF49JE5zfa zSrBuzZh2UysQ`hR_iweQ`d@)ZSj%pzwePEz0v_4?bEVaAz% zCuN{UB++*7t@r}RzOnVPK7-?wf6eTbtC=+7uqcp&6MR-D$B^NhC(`^{4+nHJewXRc zAri9dQ zuEl`&&TZ zDQ;o6;Y!a%73#~{ZXa<*Py_QbEZ_l1Mn^rMSa{Is96BN+z`4`}s$lztFvVT}$v56h zPw&9_qDbaSeo<1$=J?^5RdD&#M@_6Ivp~tVlmwBotMAnG)&V3u!3nrzSNz(5#6w#( zR>7_;sG6`(bg-<44b3Hie{JH$A9&Q7o$xt0{HZ=3B`Outv$#$mBkycDEY-BMWag$v z%c)3md5#fq`9L(JVL52U@_XX2%oT20_g#Bnq&ZAK-jF2VOF){4`3$8_m=_ddW*O9l z3G;+>NM#m4=w)BqYV^D*=1D4ar+Xngk=Og316Z8VSC`tgRLN=ef9GJThSbQ`?8^s_ zJrC*9Giahrr>wj|vW8*37d-Y-Ag%uwjg~qT6Dn86(S^duHi|)r{18*J`D*d}zxMIV z0bGlfqFAI3ZuIxWnDV*#vP_9Q!dDB`fZdvdCfvB6b`+?$&p&22L$ApJ{T?HJ15 z{Mw>~pEuTMsM(`42V*zk%KjYtp8^1Cvy9f>T0)EWDG^lre|$lRYRRGJf5_R8vGR<< zq#>(nBf@+!M7@t7y-5x^2X`xtNeSd85@T!F#K69cQW zNe_=0_Fa0g^V1+KZ}4PXRSt8piCuc zuLZ$y!^fx>e;~UhYTI)f;9>R}j|AWzjm}<&>$N)qmkaFXQ0xW7N2$W5y`Y4n=B3|W z8<_o4iF#`Y&QJm^K$CMIb?;>fN~*hAKC1bB$uM6Yt7pv%Icp@ZP}`%kSCyNiKUoCz z6=BZIWH$KZersbg{V0ZZh>xq;%LerOOmTyjxhWRme|ilJi84qvnZ13Ow^&=iBFy@) z-hJl+bFBF1&UW3|DX8;X9P8w~r88CO18bM_CSLj}kr1!MhnPjDYt6@`6(~*c#0hSF zeQgL>gtw-0ynKsGYNlG>6aobu$N_mI?$=LTE@wh--s@kg(tH7Wm_Y7&_SeG?VIJ(G z5#fbmfB05}b_T;xtD*ZQg_fF@@_9kxv4^5mvHL{SZYHZW>YI<+p#HLpUX*q`wCDXi zyxWE?3meZJ)&|hm);4v-fq(wS)R_FA$6j7C@AR4K08%<%PXF$&asP3mU5hyn4^PQ> zZ++o;HGxoz!=ZvM!Eq0(iYVpU$J2mg~8Z0iHhQue?F3~#&>~&`s%}RwD2{BSxq~B8ilJM<~Ib8L>BX2qIKcz zf4ebh)?(K9%Vhjh$^-hufrVbiaze#Z391$V`S}Z6_uLc{l?P>N;1M5#jWXwAF#JIx zW7-_@g(GtPk4Sy>>-C54#p+VSjrV>vI`oV|Wh;!6wgc*Qs<^Qwk?W>QrM=;R^l-fR z8QZ@r14tSE`50sVJ_cb7DVEy-u)UlvewG4@n2 zE+N|J_AE6zR$Ay|QXMslNgi3i%Fkk4iPYkqb)wI83q-YrrA^|wd<@A6mHmwbv5v@x z;5?Z8!iQ~L9$LdH1VNdZc0Ifc%+!vEx4Tn17bIDqjt{df?@T#uP*_}5~Vzh{P1jmodh)G zClB{#vdqX)5&Z@v!h8xg6k*Vc6UnvR#8PeRZ`dch6;diw=;ll&jU2wANf0817k5n+ z+K5J;n3~Y{SAOgyem}ib3`fN@e`yBTpqs@n3P}XU0|kegXe%7{9r9*UfYff4-F8I# z7Ha`YJ!=r~$A$G022k&PmBN|4{|2k4E6C(~()~w{zkR@Dru&207{T23!Rnro!(^wT z6Ul@bqZ3giKU=8P5oHNelmjsU<=Vqbgc{c=}GBGakQQKe-i#stH!R9 zUN1o!AC%$lj4{K^}_ZrZCXdh`1Y2J(^_z`rvnC0%P88}*^u8V?wlKEILuJ^Lo7 z1;Ml&kQkhqon5((DMye&AxL?eGP$PyEK35d=su!|I8X7!C)#_7Di}-wY&ks$neCJO z7B5YOzHxj2Bmpv3!Ac#q5#OSS@kZRB>H%)!=l9X2D$EMOj*~X6sFUM>lw9 zZ}aGkeno4I7MSgUl&_iBkc3@Y__pFr#TTbToDw?DI}eQ)Sog$5E_2ues(9o^CgrMY z@*9PSEO5#!P3g}YYocJuqWf`C$G-ZYp@QgDw4t{iHRi0`%BROze~#O52HG)12^`8( zMgmj;RBrsQd?C23GvoYai4X+srgqfCUcAM+4X8$dUys8$4Y%)mm)&d(4K!C5z@rZN15t4CS<)eN^dZEH+dW?$341ALF!8eXthrqhZ^ndc2cmi0!V93Qx+;0WQc59y( zNsT!5)(~I^Ny*&hU9Yk!wzve01hmj7oJgvc(!7%pm5b6{abUQ<|Dyl^kSMDxpjy_s z;FN09**$`t>PS0t6CU_`4bqg??AI>f>Xp8@F1EXz@wvzZfB6-+1ivg_c+hK(+wFP6 zEZAW`?q{MbptY@3-G&)0;t4(GMP7<;U4TMp*VXrsvT-id5FGQIUv;hu$6Gn|gu!N3LeXz6eHeNrV`@Q=5z?aUn8K2}^%& zOpvgg08c=LJ6%?O0k*hjgjRB*~ev!@_C0)Iu+VeoXtV)s*STso{)N`E0A9yO~u&u=I7tz(I- z1lAnKFwrP3W0=dIb(~7v!zW8&&MaFA3y8GvsRBQA`puRmzrJY%@&U}ZRR9H~6xheo zx{k2b91k%aQL!kswZz<=0*b>f2H1+PDQ7GI-QPsRh6x3-(DfgxzDxPRm3mIgOp zuNrMtYRP;EtF(t%Y&f9g=paktN}R-+od@ir5DhMcBayptizG982hTPK8#6?X#wiRu z5H}?mCvi8f6(AT?zUZ8^!asGWWW%7^^tpayeka4(4{HQxS2ADU7I17>zxcTx=yny$ zTmA3KW1aJFfG6!8WTK{rynn+jPry<19ZUd0yk)Zm4ZtFgVFty6Fk_MqAzqY&eC>3^ zy83M^rH(gy*qJKYT^k**Ua|%pX8YG@uw@r*iZe&cDL?ODa{q8EL+c4Vr6bb zbzTk`aRwRq#+kiKW+X0A>(VJnlK=Q^lys)5<3W}BS2clIKG`*+qG*Vwf3qs=fTk^d z4M?r5jYOIXom>pz-G9=MBacC_PnT+1kHID@;UcZbKOSx|GGmczY^#XLeQ*ciYD<6X z1qn*Dvtu4dW;(Mq3IYQtkBQ>2u|4M4xuyl| zO@xas`V{Le)=-X5lXfLZfA9I7|`MNRko>zm;erxs>iQV6XToq|t$dXES{cNmZ z4iuxRkuN;~l{vepv$h1^Xl;mbBJO@w!yF(@J_B&N#ULEyiIW|@f5k^c{DW`5jakuX zWVyce!HOI09UqGM#=ZS>%6aQ`54@k;E1Sjrd4|xzu_tDmby149s{>F*0xTL}>peENDRe3${yNkRl zxt2un@KB+3zB=lLAxe91iY%WOt^4S>!~xL}+3C6=v<=W3f8YIDLF8!ahZk?Hes|0s zdIJ2sa#TH&N9M@*QM(S7_pkWR5!6u(8;P8b;1ZKw2x5-LID+$SvmQ6KU6Mx?F=|z^ z#^)r~LuWLrFH94mbgTKgz$0Bz{2@vt73m8eG3-WLQ=a)3*$Vn+jZUvH;Mes)y;$5( zG0{1S=pY}Pf5EH&le*O`g>973^LwSVd#i63$%a%CW-b}|r}*{ccfJs5FAky7GTOVa z{g%($KkF7OE2v2nTh-HSqEJj^{w#kn{&?)&B!3H%g#z9CWrzQ})g{ZB%n-MM16G3d zw!tB+ql5b-iG{X!520kD{*1%*O>GuBUDXMb z!sE3j;|5K1$o_PAfWsLwLwtdB1sVHKKKQev$BINocAI+8OAb#Me&v zB3E6y@g+a8k|CChYkwg{j?jlY5+{NP0=gM>WTrkBoZ+jy7nb!R8}Jn9`Qzpf021v!q4{dwsF;Z_3O>jl`dO}W0+h= z{_rfB>0QG>%HSO)q*70wDX=B|v;{E`_txNZ{Eq+7OQ6Hq_GuknCq9j?@1JVbZgk;A z&xoczzGMcmkMZTa=HIQwKIxY^_xqC z({1VLxFJ>yh~}Ot7L*b2ubj-}P%AgTJCVJZl(H$ev1jyF3N$G zP;+=x$k!Z%xs1ILm?}^%0vD=crW<{(bHl&(1YfZ~k4P4-9@q3oDXmhKK~u~A#{1s< zR=(}nb|3iGEaAh44jedY0}>Mx_)3mp=spAY)7qzDccC<3pJJI3cy|n8%HX&ne?4Z! zSS8;oa#q=RFy8KG0OjkoNVMoP6AAKFVwW0#2|Z!&t0x*<=BP4|_~&?O#VWq7US8 zD66N$%GA~?U)nQUk1GQO%@|O_e+r1fh0Ww!f=qjV;Z8{`Sg~TocuqfOCC6>Ra}_fu z!%^x4qxKj_SV|C{{ITr09kEMz={yUh)7Q+LDqLfk&#BLnN@1$J;{w1Nv}vD=*;k+l z0uV`{QO%Xz?3Jvop6ls=bexir8d9YKb>)mWn~)A6LC1GVwoQ51v^7Scf3fH$Y_8GL zB5))nAXxvNxaG_x>I_#g8 zAAbG&_wRg>vb0mWb&uB=p4QWwVJ#Nc917ccHfc4>uFr)dLw`>60sSCPCUaZs?b$wy zOMX3n#+Bxjlchtbez6HJe@>kU+(9q(oQrW5gL;q7VJkymW=7E}suCV$uCCPD{NxQ2 z)_q5hvsA-9} zb?|d4b`@;SVVpQ{;bU;xTFAU%n+v7&MjNqr9I{OAidMx;Ze2!>fAm*<#wOHPSN+Ug z>1uHZY|#`aKdNt40%m$v-0~&4@^y(wk$rjpVt8bU=k#CRZj(+6vQy(V9$eBU)hk>g zUmTZoONZ00S$&l9h?6cPreVwUbj14%TrCKUoxTkN)v}^!7u!L^)DMk~c>Q%A zBuxeWFT_fx2qi9~DD{N_OvD~`^{j8DqivXnG&vB0VvDV4f6NMCrXvBatl2$`RH83ly?XWG8-}brqchJj{VL03LB~gQe-7erC7(m;df)?jXK6w~m5p}_ zcK3xUCJCsxK_~rCKLqW`bPwY@%~D5xEUNiPuhiw1Z@($n{&BkQDslDnWM0WDY+kl> zhU&9jPZiry45#Qz3+BjYqKci!Fl zgRN>J(krWoU_NrbBgWR`O>3gNgc2L;#SsqB+JwR?a6Um! zf6^qkirMFAG_7F+h?`a=uMLpcc4n4;3b@3te*%O@_e}%?cE)U=OyBk%X9bey2ETen z?5HlYVK?Q3iYj3i#x0w@Dp?%T*kNNe!w$gchGVUJ@I!{%pkF&|u3X@+x<0`i`730X z9)_Jdbm`6Gmy`bbE-|qM03js~#7!>#f0MO4)oE{!;W#lUK32v@E0Os=Ow5_FgSHCk zi^rCoHAG)%Fa)Q$DD-v-cth9Lkk0+wA0GeEeihU%`u39v&B=_f#1~NmNp16YOe9{o zTS+ox{*9P_mJ21UZri+HO{3QpCMQWUGDP2p$z9BkEsT~~C+TP)qF`}AKqSBrf0VIe z#fn1R?52=)k(000O=?clD^`k8(733Dz)H3p@q7%T!!RgL^3Abr?TW~4WQ$Z+HDiJq zyc_g0>)-@y&qG5`%`wNI8;^_dBZ?35KzL<1U1JE7L}$i@@K5k=1NvU<7ISJG1X@cG zyQXdMJcVGE54fWcB@_2i$ACr0MTt zVqkp>bb}V1NOjolD(w`S>rNy|A!hk5zL?~2mOzlO4 zdo@Y@6;o@0Wy|8>a@zMhX7uDFX_!48SoD-heq%SY*=y*`!gYc*Ek3<^fA#Br@k~S~ z*w=vd3(HIYfCW;Up-^TSV#vh)lVYP#vd)h4`Bix5&qvc#8^J&B0b|QQCC@3aX}e%p3o*7$%Jf zX5at-{{R2(Ml0c(dVhbye~V);Fyd1sK%GUop+fRb8b-J4zcAM?Wjr66uwB5ya|fl> z{s|Fa=vb9TZYneIO`=R8gf}?t8sn3gQvk^e4R)-iX2JSFnYs{(k<)CHLU0ZK`@Cgzw7isF|%xM-B%isi@WPRUJG1bRmyCJ*l$3Sltf4gFo^ZhfIKe54H ztW!{(#ue4F`}NqfyT1hXdiz$9-XmyktBdg)Kzr}}hl%*s)+!B#y*NZI!iVoo8VZu3 z>EB#VAMHwzrSaj$*3mnD2VrT4R*y8`60MN)%sy~56;j+v{gAjSmo(0QupNGfc!8~~ zFsd{A&TGS-eV*~dfBMBjEkr}U*3mDRjip1c89~hM|F|AA$$Wn0Gp=jq!lr*h+jaJGV_gnWYv#-0rFh~_GJ(~R8GE{AYO zuTKnkl?WLzhvir6n!;R`QNiuhEK|Xy$YIcu%QK;OB|L=!A)o9B4T6mnN?RUz%VfYA zateo9f;K}2`XX9rq|eqo&PG(Ao&9athw=UUvc(W0_&3&H0aKugSGvet z70xPuq#!3ACM7JcQXH~VNxK%`SwS9T?1_53MbqDlv;0A|-Rfp@DU;JmW`<)Wh)%w6 z+5Vwh?`Amwf5+3U3x71~%Y zL~i#Z$FENwS;(RR5(ux&r`xb+du;BrLA|3?V^M#YxDhxm^%{^d&<)vmCQ5@`#?qu5 z?p))vI0{r8n|!8rl(gE*9w7lhAYm;tXn}tuy(G{x z3(`oGw1fop+<7&lFhu*5eGA6)e|dsD57T7L$|7jV26;g0^o|&+b!#IG`eqN*Vgq#} z^E)x3qz!Qgx_o*qYw|v+8K0bZs^n0x_`xF*shmnNvBoLE6lc?nYB-EW(mk1pDI&60 zYHAgwv$=L1imM-=<~4gI`iT6sEi#%?%Jip>Y-ZBgt2jqI)Lnzr_=1!-Ug5O;nv z@>w=a9%s=z-0*b$&89}Xe{1cSTsYL(A@}}F(<2jryI3`mRLTt{r@BITO{+z34l1xP z8l%o;_x}V3dH5&ti5sUBij2QCD^HKwN>mfcSASEIn4ECNak!Mxe z6Q-poHb;99AMWlFn^2U!a~lzx6L=E|Mq8-~^80?25E+%exBx*^LHI z#G8;+LZ5vQ;Y>86X@u@`B_cGCj-{Wx5uvrJsGIpj5q^d|s_Q!ulrF#MF z1k}?cc7tXqf1>g?V%z@m;;7Gd8ka)ry`yE&LFJ3yk6;i#2ndIj#LNdf?Y0VjiAP?# zH3^zfxDJW?XUBd;6OI$);bJ@dH%r~ohZHxq*}#Ok1APW5*9)i2D(z6w>#rZ*WD2{zf7I)AlNmj(~(^tNcm7q*QbU`5-x+qOdc_gr+Y}2bx!GlB5Q0qgAeIMyb&s_=^w)}lhh>dzB!yuf6LJN6+}NIngbb;;*Kg(Le4F%)Xm0x z5Sr7O&#i>!sc!dZ_o~RKI=n~hOVB_sVB;O3Xetz~DyzOaqQadhK()RQMK||^hpHyq z3{lCLX4f$m{XCB2vOnbfwHh|n=&l!f9!h2`Hm8KF_H9j97NT);(weUAZq^t0hMZTB zf4QVqQNs^E6(SxmJ=CkEv!F*JexCW^Qm03Vc69t~l8%{IkiL5_K@g)Plp?3+bjYO- zZ3CJaccw*n$kCJeFH6*7=04MY%s~dV*Bo>OjL4k-@Q%wRqkc zSFSv$FKt~!T7$U#hUOl^jG&THiPwm9ee#H(CtTQ~DmjjCA=_7=7P|KGR2Y{3jCt!~TGqU7R>;f0kF> z))j7Sn*0FsKcpv0Wn~s7=I&R%W_J1n3z|-n<0ohjmQ~xYy7bFpApV;CA*LGup+6L9 zhPuz8wU;0p#WOyFpt(89SUvE1R)UeB1LEY-aaCZq7jjm-tRt8ki+fg^kz2jO)NLfO z5GNrDcwILiPCP@1HW;RBJ%sc@e{jcMvN5LRElh_uZ40_H; zJ!c#N%+}{_0V`J98qd$KnoBu?Vah{*?0U-3iJDPS3jGcdJ5r50WK_1rqCX;6&5-}# zZ_ZpLzG&)N@lfodT8ydl%t!nSF7XKUFdG^gxyh)pNxif=y&C(QmKi!@e^uKWo1l+E z1d62?Hg4FZTayF$$#d$_Y|b{oKek|f_Ssk0PDpr-*7ynM2;_knJhSJSa_3sN4OafQ&xBTt3_ALLrB1tSnH(JJWse3VDNppS#DX$h1lv;T|yaI42U%R zK@5WPNu0iZR2fip%p?UikM}=bn%^ToTOaK5wQE^UCVL-ODOW>-f4Bt!=Pf^^^WcAW z+r@h~zUx1lH3dw{4;*iw`VN6`E{@;`+Jd~?uP20A#uc-M_3EN~Xw|}sMTJY<9kCP6 ziZjRGwxKRs`4a&>pf82l@wcpzsX?uXl^}Vq=xJ?S9mn(kldnq7_ci;14NR z)gYZ@W2DNS8HY8#oxzb<-&&LNnefmJG^N!EhaI=Si6QqO*e_mBvmY88GPe4h9$bMr zexB0iwb?0E>7Gs|UL@>!@V(pa!E7wgyxMRT(CT%+RnbBge-lZI}skhHeP2re8bb!C&2vMgVl~=ecL$sZ1q|1=ku&`E>v7Tt6o}_QWb-r7xB}$d+ zQ*oTGR4)JPF*7)EG0pUFKKxXzaaz=}RmwDWc@Vg#lqXHLh!q+(DTsSI9QV@Mjp zu6*x+%qj(3e}yUXKQOs}$M>kmRS|wL4C3eGvf`{-rTDzV!~;3*VBHbYbMtd!{!S^3F))h>upll=2tf0>g<+iPwfWBj*P_0{e6u4z7N zAR0697V72G2Qo7qxzYs{XUw}$NTz_u|0aM-eYkAm)GARJs*o`cu8xE7e~7y%WeWOj zwfB#p$^p*vtXWSak}G_9+p?M9)$At;|xmFgF?-mTH>>z5^ujH%DA?w< zy`&QDAg+j`9woqu=Q9`C;3qb+e6!8lsrH7DN(5wKO@eH)A(JC24q^7gYbM| z8@L26rK_>lm32Jf-uyNftLc(z?uW)_j&qpO78$=$NJ~NzBNXKxD3v_Jy9&Mr;pQp; zf0(MQ(rg-h-0fU`DLozJu1pjmuhx*8W_pqqPh+sGw}gn@lGr8Dui^)D@RfF7_poKp z*@v*9hAX8q3aQ>;22_ZY=U<Tx zmGu#-3ELN)^KGwZuxBke!ob+L^4!w+Tn@Z`le?s=H`*8qEQFTM*R59>|vH}^H`$*sr~X%&PwHf`j^*a#^rOMx^1DL~f0 z&PP(DyCsx%sZ~@)JaE`_0N_VioP~mq8pbfS*Zug7U_gKXd_*V6-T4p)6YG?Zhf${X z8P(ls?>;qyvs#nxD8|O5L2Ej<+P#2~N4ovHI!wAx1L@5n2FDi?ArVXU(x=a?|c0k+$sm zfu{y*4I3JwS|*dhG)xWJ{~r%C{}Ff!oxZ_Ra`Ax?n=MSH)?&b6W826|r`n$Ebn~DV zcMevLTa-mxs8?q^IW>AJz<)nuBtEz$s$jQrQq8zm=LG>S8lv|W3S?R^u2Jz%zvDr( ztO`FNjF?h7NSRl)W)g~_Egy3|t3*?4D(2Q0ByKNlxD8zPQW2NB@hHhR0oQx`%Wjp; zFB{@9G?^+;Ha|Srzt+nwqFb~>%6=Wy?c?amE^Fyhct#w@CU1;mIe!3}H0y{4auSA0 zX!MB3T<`!pq}kNdfs>|46_qKi?J`*DaN8-W&So^yD1^mxtB?>V<@km&J++fI9&55# zLkgZReLE)W5PnOR5E^pjN>^U(c*F>Aa#nbGn18zWYZZ-T+IXSUbXI065XrJ%NJ(1f z%>q{4mq6%(@9Gk)LVr!iJ0EQ|y4TPAIw2htO&IO6RTE}Wr*44-@&uVe84hNgQ)G!I zasWflGeD3Q?;5qEB_!()xBTF3Twq;9TfdyLe+S2%94_)-eshyA@!n`=4it#;E8k8= z!D<=Z$$u8wOr8`r5bnPk2i&o55m%R}k123=FUQ!J?IaSU(0{O>&^XmGYnV32YB28* z-4Txl9SwSV=|ST)0aCAvvlWqh0#Jixl{ne#%rh?2iTUg-;>$iElDa0mlbtqm8-xqk zwenuZr$agA$iH^6!odJU*y=oqUuaHBWVv@3PK&=tNr)0Gl;ml4IX4cGkw$O)Eob`b za#qG`0ljhcqkrG&qXqEF1%8&CQmC?^AS0ZB$#Sn{i$PfOb`r-v4o9hkYBBBA3EvZlzbtlOa316 zT1oR8xNP{eOzux3WaiLL%5prZ&^=*stQ^{WkA5sU@EtNtM_h*E5ijacfs zoe850u75m>^0zt5H>G__nCHyY7f>@xeQ337gTp4RcLl(oy-|5p3zwAB2SUD2?@Gn% zW^SrX09c|JbTetV6<2!g4m!FUxDC`7LXR%)^ACjfx>^H3V{@fBS|;Kz&VM4)dmUGyK{tA$1CJJ2(AaA9 z*?)uwqP@$laP*nni99nxa)}k#FYW8LRHTs%6V7-v1;~;4vikrD?1;sO3QD4Xpu*Vr z0W7vgm8T3DN%IWULUNPCjP{4}YaLryXW}HtBErmnV-z4Jvi-}n*y?5)^y%1AZZPma z0R@2sXO^*aFu*TE^&9Q2(?w4Rj4C_#z<;rThd${FEb~i;=)y9FbwVt)XEqGuSMsgS zPMOE#a}`S~A}5|N^-WvjR@@Q8CMz`{Oll@GDw?0&=W#tI%zES6YUZIWWFw*If@dNT zvO#2!=;1W-E-dXd-4b5srcCrFdxLUpfnLWrzR;#eTa`_1zx*C;a8N#hkugVd>3`xo z1jX!6jTd)Of?HiXRF_DYYMr>68yYC76%b0GnS>G^xVHs{<6|vIa!TErj(VhSG=0#6jO{!cql?Ta zG~X-RS9~r6SL?g68DELM9)(;@-$I!_o!aEE-TlA#7mF_J!9rOb{-~c#0Dn4PNu2p~ z5j&-)k9@6}M)-sEunh92v4(WZDi~fty^ZEd-?qmM$mF)f@R?nq@tc}b_q*QW)>&;H zOI4&iW(~xWxv-GYA?z^AR_C+1OAVzn$7!fmH-)X*bM{VZPK>CSR8hHkN=8NRo_?FU z=`Th%ARq^@ro&OtqG&;{3V)-phio`U0mJ`OfrL!4SjF%2F2$f#mHdAQ_T|nEo|_Ee zTU>;FXvnftryy!?b&Kc=ks7I1Fc6EN1SCcJ3LjVO6-K!D(kuby-IOz<@_+nW!(;#u zK!MHIL3$NhY6D|PU-yn%LM|pTWEdw&8bWw1XT`q&YzsAAM!No)&wp%eJOz>r2NW#D zALN1pia2M)cmGY7j;VN6NV0<(sWEPam)~yX=W$<_G=_3y+fwK6{ioCX*ZKq^*Wk2w z{xF>e{s0^=kL?UrY^VmmSngSpNVk{?T zu7;0hv2iX1LP{=@HMo=0&cry7Uk+S&_Ly5wJ3iloWV6L!lBk?A8+OXQES~+>h8B#{ zvrDae8t#!g{oy%*s)45_hKgkWsNjiO-IC2y^X@G&pZ7b5lz(X-B~6hXzK*5%{CqNM zj-@isZk>+$;H3FHqC*F{#>rham#Ns3&{o&|!3W-SnPtiM%F*+VV zX3+$bxwNzMTy~TyTR_3$FKk`}xQ8Nt*>A)@zGt|AxPhu`;i#m>oQ;o-rkj>DZo;Se zll-Q78qM%$UVjwCwG<#t@a@w3X?f5!*ECgUg|^pFgduhYv&$BIidEE1q(x8)YN*4T z@Xoo0Se&^@6^3}5?FV*WgbhL8So0;dKH}oWpS&LRrIkzxLzgIzv+OcD`E_8BYcAl4 zv(kd19`hQm4ruf$BM7y&&66d-NlJP=rF5IF-r<#?xqsf@xNy+>8SQm@3N;Mt)y~9+ zzprenP?Vp*RWvxLHWvxMPyyXYYB5JRbC(kNjI@sHm8$kP?z56Cp{`!7R64pJwGN^6 zssEE&ONTrg^L@_oSt(u zs8rw^VpeZ0^cxTgGP5Ll9K46ip?aiBn^rktM_b+vvp_unL|KtuZ)Y+AXFG%DRvNE0P2F+q%$^GEVPup>vf}`T-%O zym*L*O4-YwH0{4Np@Y1gx}y^Q;lzkC(+q)TG}Niv1bz|rOGb*w3(5&Yga0!wc0mj- z@qfQWgTuZfb$UOs`O#W^d_I*09E!ve<{{6#c{v6>a8OAq29UJ-Xp%zp!8(0geh`(G zfT)C)<49Qd^<xquPcnE3*U~oO6K`RH+R?_OxsFsw$?@0i!`NjXUO4?Ey%t zPKYqyB$#U<2IKvL+DBlO(wUt4{^5u=(SNHReBS$X!9{y!vJY2fS#rIi(^KM3UKmV& z2B2YVMXCTb^}(a|MS*)u%eg<;5+WlTLr#v%FJ>=;4W_Q9*9`YKVnU`W>MAKOXR$+z zgc1WXT&~EXS4X&{4s;2|>(ZUYiY98p9Geuvu&1Im5Huw5Z7g%V;TN0mAj*C7IDbuH zrZ2~25o-%B+$Mu6>?~?JMa8Vj!IbZsTREvQrZdv=)L{K(-rl>Q?aZm5?%mw5*FkWP zFV9g66PhVN772trJqYLv$o`9%xk=3gcx+>m+Q2_1R$718lZrMlvVt@r%$wUeB`cc5 zFpVeFbFX#mS#S&rZD~tw{JW0vUw_BL>x%qVYGV&L!sc>UR2x-fUz0H`gFGS)J=Lt@ zMRFHY0}*)B8h;M`^v^n)w@eRS)-}i|@--!+qAC@NW3up37qBv5_3A7pXyOLpaP-e= zKpB*GI;1~RWF65~uujeN8mOj7E4lp?Y=_}9Yr;MS`PAInTpK+~ZmzJVZ-2m~Hjb4! z0mkAzpXb=)TX$@ffs?~62kB3w7n0#U9H8&|VODIB$Nu)iO3Ev(-LTI1aFv`|T@2!E zCO=tbzIxDV-vq5g-$nKJC`+&GsV8ECHwqy4es1hq*`D{fV0bMn!r7>@X-I*jofyzq z6SPZ3W?rXFTSxfRvI>25Ab&`}D=Shd=GoxhYLDSlxYyP(=?OG0IE&LcLsJ+Il{^

{|YKB>W$fM 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�m6DHzvY~VL4Qf;8n0n~L;HYvr93su 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 { + // The tables cover roughly 1975–2050; outside them the preload + // resolves with nothing, and TEME stays for this span. + if (!Cesium.Transforms.computeIcrfToFixedMatrix(time)) { + this._icrfMissing = interval; + return; + } this._rotationTime = undefined; + if (!this._destroyed) this._requestRender(); }, (error) => { // TEME is within a fraction of a degree; do not retry every frame. @@ -267,7 +286,6 @@ export class StarrySky { ) .finally(() => { this._icrfRequest = undefined; - if (!this._destroyed) this._requestRender(); }); } diff --git a/src/sky/starrySky.test.mjs b/src/sky/starrySky.test.mjs index 6575b1121..10d483914 100644 --- a/src/sky/starrySky.test.mjs +++ b/src/sky/starrySky.test.mjs @@ -87,3 +87,31 @@ test('the sky draws nothing when hidden, outside 3D, or in a pick pass', () => { assert.equal(sky.destroy(), undefined); assert.equal(sky.isDestroyed(), true); }); + +const frame = () => new Promise((resolve) => setImmediate(resolve)); + +for (const iso of ['1970-01-01T00:00:00Z', '2060-01-01T00:00:00Z']) { + test(`a clock outside the IAU 2006 tables (${iso}) settles on TEME instead of re-rendering every frame`, async () => { + const time = Cesium.JulianDate.fromIso8601(iso); + let renders = 0; + let preloads = 0; + const original = Cesium.Transforms.preloadIcrfFixed; + Cesium.Transforms.preloadIcrfFixed = (interval) => { + preloads += 1; + return original(interval); + }; + try { + const sky = new StarrySky({ requestRender: () => (renders += 1) }); + for (let i = 0; i < 20; i += 1) { + sky._updateRotation(time); // what update() does once per frame + await frame(); + } + assert.ok( + renders <= 1 && preloads <= 1, + `20 frames at a frozen clock -> ${preloads} preloads, ${renders} render requests (expected <= 1 each)`, + ); + } finally { + Cesium.Transforms.preloadIcrfFixed = original; + } + }); +} diff --git a/src/styles/anime.js b/src/styles/anime.js index deb79c355..26504830b 100644 --- a/src/styles/anime.js +++ b/src/styles/anime.js @@ -12,6 +12,7 @@ export const animeShader = { }, fragmentShader: /* glsl */ ` uniform sampler2D colorTexture; + uniform sampler2D depthTexture; uniform vec2 colorTextureDimensions; uniform float intensity; uniform float saturation; @@ -38,9 +39,12 @@ export const animeShader = { vec2 texel = 1.0 / colorTextureDimensions; vec4 color = texture(colorTexture, uv); - // Cel-shade: quantize luminance into bands + // Cel-shade: quantize luminance into bands. Not the far plane: four + // bands turn the faint Milky Way behind the globe into blotches. Its + // packed depth reads a few 1e-7 short of 1.0. float luma = dot(color.rgb, vec3(0.299, 0.587, 0.114)); - float bands = mix(256.0, 4.0, intensity); + bool space = czm_readDepth(depthTexture, uv) > 0.99999; + float bands = space ? 256.0 : mix(256.0, 4.0, intensity); float celLuma = floor(luma * bands + 0.5) / bands; float lumaScale = (luma > 0.001) ? celLuma / luma : 1.0; vec3 celColor = color.rgb * lumaScale; diff --git a/src/tooling/skyAssets.paintOut.test.mjs b/src/tooling/skyAssets.paintOut.test.mjs new file mode 100644 index 000000000..ddb57589a --- /dev/null +++ b/src/tooling/skyAssets.paintOut.test.mjs @@ -0,0 +1,64 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import sharp from 'sharp'; +import { + CUBE_FACES, + FACE_FILE_SUFFIX, + PLANETS, + cubeFaceDirection, + icrfToGalactic, +} from '../../scripts/build-milky-way.mjs'; +import { raDecToUnitVector } from '../sky/stars.js'; + +const SKY = new URL('../data/local_data/sky/', import.meta.url); +// Allowed excess of the painted disc over the surrounding sky, in 8-bit +// levels of the encoded face: the blur and dither move values by a few. +const TOLERANCE = 4; + +test('painted-out planets leave no disc brighter than the sky around them', async () => { + const centres = PLANETS.map((planet) => ({ + planet, + vector: raDecToUnitVector(planet.l, planet.b), + disc: [], + ring: [], + })); + for (const face of CUBE_FACES) { + const { data, info } = await sharp( + new URL(`milkyway_${FACE_FILE_SUFFIX[face]}.webp`, SKY).pathname, + ) + .raw() + .toBuffer({ resolveWithObject: true }); + const size = info.width; + for (let j = 0; j < size; j++) { + for (let i = 0; i < size; i++) { + const d = cubeFaceDirection(face, (i + 0.5) / size, (j + 0.5) / size); + const n = Math.hypot(...d); + const g = icrfToGalactic(d.map((x) => x / n)); + for (const centre of centres) { + const cos = + g[0] * centre.vector[0] + + g[1] * centre.vector[1] + + g[2] * centre.vector[2]; + const degrees = (Math.acos(Math.min(1, cos)) * 180) / Math.PI; + const k = (j * size + i) * info.channels; + const luma = (data[k] + data[k + 1] + data[k + 2]) / 3; + if (degrees <= centre.planet.radiusDeg - 0.5) centre.disc.push(luma); + else if ( + degrees >= centre.planet.radiusDeg + 1 && + degrees <= centre.planet.radiusDeg + 3.5 + ) + centre.ring.push(luma); + } + } + } + } + const median = (values) => values.sort((a, b) => a - b)[values.length >> 1]; + for (const { planet, disc, ring } of centres) { + const discMean = disc.reduce((s, v) => s + v, 0) / disc.length; + const ringMedian = median(ring); + assert.ok( + discMean <= ringMedian + TOLERANCE, + `l=${planet.l} b=${planet.b}: disc mean ${discMean.toFixed(1)} vs surrounding sky ${ringMedian.toFixed(1)}`, + ); + } +}); From adeee122091086a73bbd9c03be1ee86d840f4323 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Mon, 19 Oct 2026 20:11:32 +0400 Subject: [PATCH 03/45] docs(changelog): add the starfield sky entry Co-Authored-By: Claude Opus 5.5 --- changelog.d/1243-starfield-sky.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog.d/1243-starfield-sky.md diff --git a/changelog.d/1243-starfield-sky.md b/changelog.d/1243-starfield-sky.md new file mode 100644 index 000000000..91096628f --- /dev/null +++ b/changelog.d/1243-starfield-sky.md @@ -0,0 +1,5 @@ +- Replace the blocky JPEG sky around the globe with the 9,096 stars of the + Yale Bright Star Catalogue, drawn as sharp points where each star really is + at the scene clock, over a soft Milky Way built from ESO/S. Brunier's + panorama (CC BY 4.0). The Sun and Moon stay; the new assets weigh 482 KB + (gekh, #1243). From e652e50d5c0582d7103267f6d57f5f573d67ff1a Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Mon, 19 Oct 2026 22:27:28 +0400 Subject: [PATCH 04/45] fix(anime): fade the Milky Way out instead of masking the sky by depth The far-plane mask in the anime shader read the post-process depth, which cannot tell the sky from far geometry: with a layer that clamps the near plane to 0.1 m (satellites) the whole Earth lost its cel bands, keyless terrain above the ellipsoid horizon did too, and the atmosphere, Sun and Moon stopped banding. Restore the anime shader from main and fade the Milky Way glow with the style instead: VisualEffects sets skyBox.milkyWayVisibility to 1 - anime intensity. scripts/qa-anime-space-mask.mjs checks all three cases headless and that the anime sky shows no bands. Co-Authored-By: Claude Opus 5.5 --- scripts/qa-anime-space-mask.mjs | 310 ++++++++++++++++++++++++++++++++ src/sky/starrySky.js | 4 +- src/sky/starrySky.test.mjs | 12 ++ src/styles/anime.js | 8 +- src/ui/visualEffects.js | 9 + src/ui/visualEffects.test.mjs | 21 +++ 6 files changed, 357 insertions(+), 7 deletions(-) create mode 100644 scripts/qa-anime-space-mask.mjs diff --git a/scripts/qa-anime-space-mask.mjs b/scripts/qa-anime-space-mask.mjs new file mode 100644 index 000000000..c73561e94 --- /dev/null +++ b/scripts/qa-anime-space-mask.mjs @@ -0,0 +1,310 @@ +// Repro for revmain-opus-1 (+ revmain-opus-6, + a guard for the fix). +// Anime exempts "space" pixels from cel-shading (src/styles/anime.js). This +// script compiles the CURRENT anime fragment shader from the checkout with its +// last line swapped for a debug output (R = pixel exempt from quantization, +// G = raw depth 1.0), runs it as an extra post-process stage in the running app +// (headless) and counts misclassified pixels. +// +// Cases: +// satellites whole globe from 20 000 km with the satellites layer on +// (near clamps to 0.1 m): Earth pixels must NOT be exempt. [revmain-opus-1] +// keyless keyless stack, Denver 1700 m looking west: terrain above the +// ellipsoid horizon must NOT be exempt. [revmain-opus-6] +// milkyway the real anime style, looking away from the Earth at the +// Galactic Centre: the sky must show no cel bands (the faint +// glow used to turn into blotches; the glow now fades out +// with the style, src/ui/visualEffects.js). +// +// Usage: node scripts/qa-anime-space-mask.mjs --url http://localhost:4333/ [--case satellites|keyless|milkyway|all] +// [--space-expr ""] (try a candidate fix without editing anime.js) +// Exit: 0 all pass, 1 a case failed, 2 a scenario was not reached. +import { readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const opt = (name, fallback) => { + const i = process.argv.indexOf(`--${name}`); + return i > 0 && process.argv[i + 1] ? process.argv[i + 1] : fallback; +}; +const ROOT = path.resolve(opt('repo', process.cwd())); +const URL_ = opt('url', 'http://localhost:4333/'); +const CASES = + opt('case', 'all') === 'all' + ? ['satellites', 'keyless', 'milkyway'] + : [opt('case')]; +const SPACE_EXPR = opt('space-expr'); +// Run from the repository root, or pass --repo. +const { default: puppeteer } = await import( + path.join(ROOT, 'node_modules/puppeteer/lib/puppeteer/puppeteer.js') +); + +let fs = readFileSync(path.join(ROOT, 'src/styles/anime.js'), 'utf8'); +fs = fs + .slice(fs.indexOf('/* glsl */ `') + 12, fs.lastIndexOf('`')) + .replace('uniform float intensity;', 'const float intensity = 1.0;') + .replace('uniform float saturation;', 'const float saturation = 1.0;') + .replace('uniform float edgeThick;', 'const float edgeThick = 0.5;'); +if (!/uniform\s+sampler2D\s+depthTexture/.test(fs)) + fs = fs.replace( + 'uniform sampler2D colorTexture;', + 'uniform sampler2D colorTexture;\n uniform sampler2D depthTexture;', + ); +if (SPACE_EXPR) { + const m = fs.match(/bool space = ([^;]+);/); + if (!m) throw new Error('--space-expr: no `bool space = …;` in anime.js'); + fs = fs.replace(m[0], `bool space = ${SPACE_EXPR};`); +} +if (!/float bands\b/.test(fs)) + throw new Error( + 'anime.js has no `bands` variable: adapt the debug line of this script', + ); +fs = fs + .replace( + /out_FragColor = [^;]+;\s*}\s*$/, + `out_FragColor = mode < 0.5 ? texture(colorTexture, uv) + : vec4(bands > 255.0 ? 1.0 : 0.0, texture(depthTexture, uv).r >= 1.0 ? 1.0 : 0.0, 0.0, 1.0); + }`, + ) + .replace('void main()', 'uniform float mode;\n void main()'); + +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); +const browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--ignore-gpu-blocklist'], +}); +let failed = false, + unreached = false; +try { + const page = await browser.newPage(); + page.on('pageerror', (e) => console.log('PAGEERR', String(e).slice(0, 300))); + await page.setViewport({ width: 1000, height: 700 }); + await page.evaluateOnNewDocument(() => + localStorage.setItem('gev:first-run-mission:v1', 'suppressed'), + ); + await page.goto(URL_, { waitUntil: 'domcontentloaded' }); + await page.waitForFunction(() => window.__godsEyeView?.viewer?.scene, { + timeout: 120000, + }); + await sleep(12000); + await page.evaluate(async (fs) => { + const entry = performance + .getEntriesByType('resource') + .map((e) => e.name) + .find((n) => /\.vite\/deps\/cesium\.js/.test(n)); + if (!entry) + throw new Error( + 'run against the Vite dev server (needs .vite/deps/cesium.js)', + ); + const C = (window.__C = await import(entry)); + window.__dbg = window.__godsEyeView.viewer.scene.postProcessStages.add( + new C.PostProcessStage({ fragmentShader: fs, uniforms: { mode: 1 } }), + ); + }, fs); + const setView = (v) => + page.evaluate((v) => { + const C = window.__C, + s = window.__godsEyeView.viewer.scene; + s.camera.cancelFlight(); + s.camera.setView({ + destination: C.Cartesian3.fromDegrees(v.lon, v.lat, v.h), + orientation: { + heading: C.Math.toRadians(v.heading ?? 0), + pitch: C.Math.toRadians(v.pitch), + roll: 0, + }, + }); + s.requestRender(); + }, v); + // returns per-pixel {exempt, raw1, ground?} counts + const measure = (truth) => + page.evaluate((truth) => { + const s = window.__godsEyeView.viewer.scene; + const read = () => { + s.requestRender(); + s.render(); + const gl = s.context._gl, + w = gl.drawingBufferWidth, + h = gl.drawingBufferHeight, + px = new Uint8Array(w * h * 4); + gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, px); + return px; + }; + window.__dbg.uniforms.mode = 1; + const px = read(); + let g; + if (truth) { + const keep = [s.skyAtmosphere, s.skyBox, s.sun, s.moon].map( + (o) => o && o.show, + ); + [s.skyAtmosphere, s.skyBox, s.sun, s.moon].forEach( + (o) => o && (o.show = false), + ); + window.__dbg.uniforms.mode = 0; + g = read(); + [s.skyAtmosphere, s.skyBox, s.sun, s.moon].forEach( + (o, i) => o && (o.show = keep[i]), + ); + window.__dbg.uniforms.mode = 1; + } + const r = { + total: px.length / 4, + near: s._view.frustumCommandsList[0]?.near ?? null, + frusta: s._view.frustumCommandsList.length, + geom: 0, + geomExempt: 0, + raw1: 0, + raw1Exempt: 0, + ground: 0, + groundRaw1: 0, + groundExempt: 0, + clearGlobeDepth: s._environmentState.clearGlobeDepth, + }; + for (let i = 0; i < px.length; i += 4) { + const ex = px[i] > 127, + raw1 = px[i + 1] > 127; + if (raw1) { + r.raw1++; + if (ex) r.raw1Exempt++; + } else { + r.geom++; + if (ex) r.geomExempt++; + } + if (g && g[i] + g[i + 1] + g[i + 2] > 6) { + r.ground++; + if (raw1) r.groundRaw1++; + if (ex) r.groundExempt++; + } + } + return r; + }, truth); + const verdict = (name, ok, reached, msg, r) => { + const tag = !reached ? 'UNREACHED' : ok ? 'PASS' : 'FAIL'; + if (!reached) unreached = true; + else if (!ok) failed = true; + console.log(`${tag} ${name}: ${msg}\n ${JSON.stringify(r)}`); + }; + + for (const c of CASES) { + if (c === 'satellites') { + await page.evaluate(() => + window.__godsEyeView.dataManager.setEnabled('satellites', true, { + origin: 'user', + }), + ); + await sleep(20000); + await setView({ lon: 10, lat: 20, h: 2.0e7, pitch: -90 }); + await sleep(5000); + const r = await measure(false); + verdict( + 'satellites', + r.geomExempt <= 0.01 * r.geom, + r.frusta > 0 && r.near !== null && r.near < 1 && r.geom > 50000, + `${r.geomExempt} of ${r.geom} Earth pixels exempt from cel-shading (near ${r.near} m)`, + r, + ); + await page.evaluate(() => + window.__godsEyeView.dataManager.setEnabled('satellites', false, { + origin: 'user', + }), + ); + await sleep(5000); + } else if (c === 'keyless') { + await setView({ + lon: -104.99, + lat: 39.74, + h: 1700, + heading: 270, + pitch: 0, + }); + await sleep(25000); + const r = await measure(true); + verdict( + 'keyless', + r.groundExempt <= 0.01 * r.ground, + r.clearGlobeDepth && r.groundRaw1 > 1000, + `${r.groundExempt} of ${r.ground} terrain pixels exempt (${r.groundRaw1} terrain pixels have raw depth 1.0)`, + r, + ); + } else if (c === 'milkyway') { + const r = await page.evaluate(async () => { + const C = window.__C, + g = window.__godsEyeView, + v = g.viewer, + s = v.scene; + window.__dbg.enabled = false; + g.styleManager.setStyle('anime', { userInitiated: true }); + const t = v.clock.currentTime; + await C.Transforms.preloadIcrfFixed( + new C.TimeInterval({ + start: C.JulianDate.addDays(t, -1, new C.JulianDate()), + stop: C.JulianDate.addDays(t, 1, new C.JulianDate()), + }), + ); + const m = C.Transforms.computeIcrfToFixedMatrix(t); + const ra = C.Math.toRadians(266.4), + dec = C.Math.toRadians(-29); + const look = C.Matrix3.multiplyByVector( + m, + new C.Cartesian3( + Math.cos(dec) * Math.cos(ra), + Math.cos(dec) * Math.sin(ra), + Math.sin(dec), + ), + new C.Cartesian3(), + ); + const north = C.Matrix3.multiplyByVector( + m, + C.Cartesian3.UNIT_Z, + new C.Cartesian3(), + ); + const right = C.Cartesian3.normalize( + C.Cartesian3.cross(look, north, new C.Cartesian3()), + new C.Cartesian3(), + ); + s.camera.cancelFlight(); + s.camera.setView({ + destination: C.Cartesian3.multiplyByScalar( + look, + 3e7, + new C.Cartesian3(), + ), + orientation: { + direction: look, + up: C.Cartesian3.cross(right, look, new C.Cartesian3()), + }, + }); + await new Promise((res) => setTimeout(res, 2500)); + s.requestRender(); + s.render(); + const gl = s.context._gl, + w = gl.drawingBufferWidth, + h = gl.drawingBufferHeight, + px = new Uint8Array(w * h * 4); + gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, px); + let banded = 0; + for (let i = 0; i < px.length; i += 4) + if (0.299 * px[i] + 0.587 * px[i + 1] + 0.114 * px[i + 2] >= 51) + banded++; + const out = { + total: px.length / 4, + banded, + visibility: s.skyBox.milkyWayVisibility, + anime: g.styleManager.currentStyle ?? null, + }; + g.styleManager.setStyle('normal', { userInitiated: true }); + window.__dbg.enabled = true; + return out; + }); + verdict( + 'milkyway', + r.banded <= 0.005 * r.total, + r.total > 0, + `${r.banded} of ${r.total} sky pixels at or above the first cel band (luma >= 0.2)`, + r, + ); + } + } +} finally { + await browser.close(); +} +process.exitCode = failed ? 1 : unreached ? 2 : 0; diff --git a/src/sky/starrySky.js b/src/sky/starrySky.js index 7cdc3b5d7..d77892d6a 100644 --- a/src/sky/starrySky.js +++ b/src/sky/starrySky.js @@ -167,6 +167,8 @@ export class StarrySky { /** Matches `SkyBox#show`. */ this.show = true; this.milkyWayIntensity = MILKY_WAY_INTENSITY; + /** 0..1 multiplier a style sets to hide the glow (see visualEffects.js). */ + this.milkyWayVisibility = 1; this.starIntensity = STAR_INTENSITY; this._requestRender = requestRender; this._rotation = Cesium.Matrix3.clone(Cesium.Matrix3.IDENTITY); @@ -190,7 +192,7 @@ export class StarrySky { this._milkyWayUniforms = { ...uniforms, u_milkyWay: () => this._cubeMap, - u_intensity: () => this.milkyWayIntensity, + u_intensity: () => this.milkyWayIntensity * this.milkyWayVisibility, }; this._starUniforms = { ...uniforms, diff --git a/src/sky/starrySky.test.mjs b/src/sky/starrySky.test.mjs index 10d483914..1d9d2f8a0 100644 --- a/src/sky/starrySky.test.mjs +++ b/src/sky/starrySky.test.mjs @@ -2,6 +2,7 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import * as Cesium from 'cesium'; import { + MILKY_WAY_INTENSITY, STARRY_SKY_CESIUM_VERSION, SKY_ROTATION_EPSILON_SECONDS, StarrySky, @@ -9,6 +10,9 @@ import { isSkyRotationCurrent, } from './starrySky.js'; +const close = (actual, expected, epsilon = 1e-9) => + assert.ok(Math.abs(actual - expected) <= epsilon, `${actual} vs ${expected}`); + test('the sky-box adapter was validated against this engine version', () => { assert.equal( Cesium.VERSION, @@ -115,3 +119,11 @@ for (const iso of ['1970-01-01T00:00:00Z', '2060-01-01T00:00:00Z']) { } }); } + +test('the Milky Way glow scales with its visibility, for styles that hide it', () => { + const sky = new StarrySky({ requestRender: () => {} }); + close(sky._milkyWayUniforms.u_intensity(), MILKY_WAY_INTENSITY); + sky.milkyWayVisibility = 0; + assert.equal(sky._milkyWayUniforms.u_intensity(), 0); + sky.destroy(); +}); diff --git a/src/styles/anime.js b/src/styles/anime.js index 26504830b..deb79c355 100644 --- a/src/styles/anime.js +++ b/src/styles/anime.js @@ -12,7 +12,6 @@ export const animeShader = { }, fragmentShader: /* glsl */ ` uniform sampler2D colorTexture; - uniform sampler2D depthTexture; uniform vec2 colorTextureDimensions; uniform float intensity; uniform float saturation; @@ -39,12 +38,9 @@ export const animeShader = { vec2 texel = 1.0 / colorTextureDimensions; vec4 color = texture(colorTexture, uv); - // Cel-shade: quantize luminance into bands. Not the far plane: four - // bands turn the faint Milky Way behind the globe into blotches. Its - // packed depth reads a few 1e-7 short of 1.0. + // Cel-shade: quantize luminance into bands float luma = dot(color.rgb, vec3(0.299, 0.587, 0.114)); - bool space = czm_readDepth(depthTexture, uv) > 0.99999; - float bands = space ? 256.0 : mix(256.0, 4.0, intensity); + float bands = mix(256.0, 4.0, intensity); float celLuma = floor(luma * bands + 0.5) / bands; float lumaScale = (luma > 0.001) ? celLuma / luma : 1.0; vec3 celColor = color.rgb * lumaScale; diff --git a/src/ui/visualEffects.js b/src/ui/visualEffects.js index 6533bb748..da21b781c 100644 --- a/src/ui/visualEffects.js +++ b/src/ui/visualEffects.js @@ -112,6 +112,15 @@ export class VisualEffects { if (this.stopped || !stage) return; stage.uniforms.intensity = value; stage.enabled = value > 0.001; + // Anime's four luminance bands turn the faint Milky Way into blotches, and + // a post-process cannot tell the sky from far geometry reliably (near + // plane clamps, keyless terrain above the ellipsoid horizon): fade the + // glow out with the style instead. Stars survive as banded points. + if (stage === this.stages.anime) { + const sky = this.viewer.scene?.skyBox; + if (sky && 'milkyWayVisibility' in sky) + sky.milkyWayVisibility = 1 - value; + } if (stage.enabled && stage.uniforms.time !== undefined) this.startAnimationLoop(); this.requestRender('style-stage'); diff --git a/src/ui/visualEffects.test.mjs b/src/ui/visualEffects.test.mjs index 76615d0e8..62f9771d3 100644 --- a/src/ui/visualEffects.test.mjs +++ b/src/ui/visualEffects.test.mjs @@ -158,6 +158,27 @@ test('direct Cockpit intensity writes are reconciled before rendering', () => { f.effects.destroy(); }); +test('the anime stage fades the Milky Way out with its own intensity', () => { + const f = fixture(); + const sky = { milkyWayVisibility: 1 }; + f.effects.viewer.scene.skyBox = sky; + f.effects.initStyles(); + f.effects.setStageIntensity(f.effects.stages.thermal, 1); + assert.equal(sky.milkyWayVisibility, 1, 'other styles keep the glow'); + f.effects.setStageIntensity(f.effects.stages.anime, 0.25); + assert.equal(sky.milkyWayVisibility, 0.75); + f.effects.setStageIntensity(f.effects.stages.anime, 1); + assert.equal(sky.milkyWayVisibility, 0); + f.effects.setStageIntensity(f.effects.stages.anime, 0); + assert.equal(sky.milkyWayVisibility, 1); + // A sky box without the knob (Cesium's own) is left alone. + const plain = {}; + f.effects.viewer.scene.skyBox = plain; + f.effects.setStageIntensity(f.effects.stages.anime, 1); + assert.deepEqual(plain, {}); + f.effects.destroy(); +}); + test('bloom retains its dead zone, normalized intensity and independent toggle', () => { const f = fixture(); f.effects.initPostProcess(); From 8deb47560e05fb964f02e3f7ec14e347279b8ed1 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 20 Oct 2026 00:42:22 +0400 Subject: [PATCH 05/45] fix(sky): restore the Milky Way on teardown, tidy the anime QA script - VisualEffects.destroy() puts skyBox.milkyWayVisibility back to 1, as it already restores the borrowed bloom stage, so a surviving viewer does not keep a faded sky. - Rename scripts/qa-anime-space-mask.mjs to qa-anime-sky.mjs: rewrite the header for the current approach, drop --space-expr and --repo, import puppeteer as a package, reject unknown cases and count the milkyway case as reached only while the anime stage is on. - Put both sky QA scripts under format:check. Co-Authored-By: Claude Opus 5.5 --- scripts/format-scope.json | 4 +- ...-anime-space-mask.mjs => qa-anime-sky.mjs} | 88 +++++++++++-------- src/ui/visualEffects.js | 10 ++- src/ui/visualEffects.test.mjs | 18 ++++ 4 files changed, 78 insertions(+), 42 deletions(-) rename scripts/{qa-anime-space-mask.mjs => qa-anime-sky.mjs} (80%) diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 2c5009537..203fa7ed5 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1076,5 +1076,7 @@ "src/sky/stars.test.mjs", "src/sky/starrySky.test.mjs", "src/tooling/skyAssets.test.mjs", - "src/tooling/skyAssets.paintOut.test.mjs" + "src/tooling/skyAssets.paintOut.test.mjs", + "scripts/qa-sky-sun-moon.mjs", + "scripts/qa-anime-sky.mjs" ] diff --git a/scripts/qa-anime-space-mask.mjs b/scripts/qa-anime-sky.mjs similarity index 80% rename from scripts/qa-anime-space-mask.mjs rename to scripts/qa-anime-sky.mjs index c73561e94..ae7ee69dc 100644 --- a/scripts/qa-anime-space-mask.mjs +++ b/scripts/qa-anime-sky.mjs @@ -1,44 +1,51 @@ -// Repro for revmain-opus-1 (+ revmain-opus-6, + a guard for the fix). -// Anime exempts "space" pixels from cel-shading (src/styles/anime.js). This -// script compiles the CURRENT anime fragment shader from the checkout with its -// last line swapped for a debug output (R = pixel exempt from quantization, -// G = raw depth 1.0), runs it as an extra post-process stage in the running app -// (headless) and counts misclassified pixels. -// -// Cases: -// satellites whole globe from 20 000 km with the satellites layer on -// (near clamps to 0.1 m): Earth pixels must NOT be exempt. [revmain-opus-1] -// keyless keyless stack, Denver 1700 m looking west: terrain above the -// ellipsoid horizon must NOT be exempt. [revmain-opus-6] -// milkyway the real anime style, looking away from the Earth at the -// Galactic Centre: the sky must show no cel bands (the faint -// glow used to turn into blotches; the glow now fades out -// with the style, src/ui/visualEffects.js). -// -// Usage: node scripts/qa-anime-space-mask.mjs --url http://localhost:4333/ [--case satellites|keyless|milkyway|all] -// [--space-expr ""] (try a candidate fix without editing anime.js) -// Exit: 0 all pass, 1 a case failed, 2 a scenario was not reached. +#!/usr/bin/env node +/** + * qa-anime-sky — the anime style must cel-shade the Earth, and leave the sky + * without bands. + * + * Earlier the anime shader exempted the far plane, judged from the + * post-process depth, from its luminance bands. That depth cannot tell the + * sky from far geometry, so the Earth lost its bands. The shader now matches + * main, and src/ui/visualEffects.js fades the Milky Way out with the style. + * Each case runs headless against a Vite dev server: + * + * satellites whole globe from 20 000 km with the satellites layer on + * (near clamps to 0.1 m): no Earth pixel may skip the bands. + * keyless keyless stack, Denver 1700 m looking west: no terrain pixel + * above the ellipsoid horizon may skip the bands. + * milkyway the real anime style, looking away from the Earth at the + * Galactic Centre: at most 0.5 % of the sky (the stars) may + * reach the first band. + * + * The first two cases compile the checkout's anime shader with a debug + * output (R = pixel skipped the bands, G = raw depth 1.0) as an extra stage. + * + * Usage: node scripts/qa-anime-sky.mjs [--url http://localhost:4333/] [--case satellites|keyless|milkyway|all] + * Exit: 0 all pass, 1 a case failed, 2 a scenario was not reached or the case is unknown. + */ +import puppeteer from 'puppeteer'; import { readFileSync } from 'node:fs'; -import path from 'node:path'; import { fileURLToPath } from 'node:url'; const opt = (name, fallback) => { const i = process.argv.indexOf(`--${name}`); return i > 0 && process.argv[i + 1] ? process.argv[i + 1] : fallback; }; -const ROOT = path.resolve(opt('repo', process.cwd())); const URL_ = opt('url', 'http://localhost:4333/'); -const CASES = - opt('case', 'all') === 'all' - ? ['satellites', 'keyless', 'milkyway'] - : [opt('case')]; -const SPACE_EXPR = opt('space-expr'); -// Run from the repository root, or pass --repo. -const { default: puppeteer } = await import( - path.join(ROOT, 'node_modules/puppeteer/lib/puppeteer/puppeteer.js') -); +const ALL_CASES = ['satellites', 'keyless', 'milkyway']; +const requested = opt('case', 'all'); +const CASES = requested === 'all' ? ALL_CASES : [requested]; +if (!CASES.every((c) => ALL_CASES.includes(c))) { + console.error( + `unknown case ${requested}; expected ${ALL_CASES.join('|')}|all`, + ); + process.exit(2); +} -let fs = readFileSync(path.join(ROOT, 'src/styles/anime.js'), 'utf8'); +let fs = readFileSync( + fileURLToPath(new URL('../src/styles/anime.js', import.meta.url)), + 'utf8', +); fs = fs .slice(fs.indexOf('/* glsl */ `') + 12, fs.lastIndexOf('`')) .replace('uniform float intensity;', 'const float intensity = 1.0;') @@ -49,11 +56,6 @@ if (!/uniform\s+sampler2D\s+depthTexture/.test(fs)) 'uniform sampler2D colorTexture;', 'uniform sampler2D colorTexture;\n uniform sampler2D depthTexture;', ); -if (SPACE_EXPR) { - const m = fs.match(/bool space = ([^;]+);/); - if (!m) throw new Error('--space-expr: no `bool space = …;` in anime.js'); - fs = fs.replace(m[0], `bool space = ${SPACE_EXPR};`); -} if (!/float bands\b/.test(fs)) throw new Error( 'anime.js has no `bands` variable: adapt the debug line of this script', @@ -289,7 +291,15 @@ try { total: px.length / 4, banded, visibility: s.skyBox.milkyWayVisibility, - anime: g.styleManager.currentStyle ?? null, + animeOn: (() => { + const stages = s.postProcessStages; + for (let i = 0; i < stages.length; i++) { + const stage = stages.get(i); + if (stage.name === 'godsEyeView_anime') + return stage.enabled && stage.uniforms.intensity > 0.99; + } + return false; + })(), }; g.styleManager.setStyle('normal', { userInitiated: true }); window.__dbg.enabled = true; @@ -298,7 +308,7 @@ try { verdict( 'milkyway', r.banded <= 0.005 * r.total, - r.total > 0, + r.total > 0 && r.animeOn, `${r.banded} of ${r.total} sky pixels at or above the first cel band (luma >= 0.2)`, r, ); diff --git a/src/ui/visualEffects.js b/src/ui/visualEffects.js index da21b781c..b4a3cec0b 100644 --- a/src/ui/visualEffects.js +++ b/src/ui/visualEffects.js @@ -115,7 +115,7 @@ export class VisualEffects { // Anime's four luminance bands turn the faint Milky Way into blotches, and // a post-process cannot tell the sky from far geometry reliably (near // plane clamps, keyless terrain above the ellipsoid horizon): fade the - // glow out with the style instead. Stars survive as banded points. + // glow out with the style instead. Bright stars survive as banded points. if (stage === this.stages.anime) { const sky = this.viewer.scene?.skyBox; if (sky && 'milkyWayVisibility' in sky) @@ -228,7 +228,7 @@ export class VisualEffects { this.transitions.clear(); } - /** Remove owned stages and restore the borrowed bloom stage after callers release it. */ + /** Remove owned stages and restore the borrowed bloom stage and sky after callers release them. */ destroy() { if (this.destroyed) return; this.stop(); @@ -240,5 +240,11 @@ export class VisualEffects { Object.assign(this.bloomStage.uniforms, this.previousBloom.uniforms); this.bloomStage.enabled = this.previousBloom.enabled; } + // Anime may have faded the Milky Way out; a surviving viewer gets it back. + const sky = this.viewer.scene.skyBox; + if (sky && 'milkyWayVisibility' in sky) { + sky.milkyWayVisibility = 1; + this.requestRender('style-stage'); + } } } diff --git a/src/ui/visualEffects.test.mjs b/src/ui/visualEffects.test.mjs index 62f9771d3..21f744985 100644 --- a/src/ui/visualEffects.test.mjs +++ b/src/ui/visualEffects.test.mjs @@ -179,6 +179,24 @@ test('the anime stage fades the Milky Way out with its own intensity', () => { f.effects.destroy(); }); +test('destroying the effects gives a surviving viewer its Milky Way back', () => { + const f = fixture(); + const sky = { milkyWayVisibility: 1 }; + f.effects.viewer.scene.skyBox = sky; + f.effects.initStyles(); + f.effects.startTransition('anime', 0, 1); + f.tick(250); + f.effects.stop(); + const frozen = sky.milkyWayVisibility; + assert.ok( + frozen > 0 && frozen < 1, + 'stop keeps the stages, and the fade, as they are', + ); + f.effects.destroy(); + assert.equal(sky.milkyWayVisibility, 1); + assert.equal(f.requests.at(-1), 'style-stage'); +}); + test('bloom retains its dead zone, normalized intensity and independent toggle', () => { const f = fixture(); f.effects.initPostProcess(); From e8fd1f2d0198bc69164c55b4ad786c7d1ec0dc4c Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 20 Oct 2026 00:42:23 +0400 Subject: [PATCH 06/45] fix(sky): ease the Milky Way black level in at the median sky Away from the galactic plane the ESO panorama keeps a mottled glow of unresolved stars and dust. With the black level at the darkest quarter of the sky and a hard cut, it showed as grey clouds with black holes around the globe. The black level now sits at the median sky and eases in with a soft knee on luminance, keeping each pixel's hue: high galactic latitudes are black, the band keeps its glow. Faces shrink from 247 to 85 KB. The changelog fragment also notes the anime fade and the new asset weight. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1243-starfield-sky.md | 8 ++--- scripts/build-milky-way.mjs | 37 +++++++++++++++-------- src/data/local_data/sky/README.md | 5 +-- src/data/local_data/sky/milkyway_nx.webp | Bin 40384 -> 9118 bytes src/data/local_data/sky/milkyway_ny.webp | Bin 42904 -> 23212 bytes src/data/local_data/sky/milkyway_nz.webp | Bin 45580 -> 19634 bytes src/data/local_data/sky/milkyway_px.webp | Bin 36230 -> 5478 bytes src/data/local_data/sky/milkyway_py.webp | Bin 41794 -> 15028 bytes src/data/local_data/sky/milkyway_pz.webp | Bin 39850 -> 12354 bytes src/tooling/skyAssets.test.mjs | 16 ++++++++++ 10 files changed, 48 insertions(+), 18 deletions(-) diff --git a/changelog.d/1243-starfield-sky.md b/changelog.d/1243-starfield-sky.md index 91096628f..7d4557672 100644 --- a/changelog.d/1243-starfield-sky.md +++ b/changelog.d/1243-starfield-sky.md @@ -1,5 +1,5 @@ - Replace the blocky JPEG sky around the globe with the 9,096 stars of the - Yale Bright Star Catalogue, drawn as sharp points where each star really is - at the scene clock, over a soft Milky Way built from ESO/S. Brunier's - panorama (CC BY 4.0). The Sun and Moon stay; the new assets weigh 482 KB - (gekh, #1243). + Yale Bright Star Catalogue, drawn as sharp points at their catalogue + positions for the scene clock, over a soft Milky Way built from ESO/S. + Brunier's panorama (CC BY 4.0). The Sun and Moon stay, the anime style fades + the Milky Way out, and the new assets weigh 319 kB (gekh, #1243). diff --git a/scripts/build-milky-way.mjs b/scripts/build-milky-way.mjs index 19b2ea1e9..5e5d3d253 100644 --- a/scripts/build-milky-way.mjs +++ b/scripts/build-milky-way.mjs @@ -29,9 +29,9 @@ * axes as the cube axes — +X to the March equinox, +Z to the north * celestial pole — rotating each direction into galactic coordinates * with the IAU J2000 matrix. - * 6. Map the darkest 25 % of the sky to black and the brightest 0.01 % to - * white, encode with gamma 1/2.2 and ±0.5 LSB dither against banding; - * WebP. + * 6. Map the median sky to black, easing in with a soft knee, and the + * brightest 0.01 % to white (on luminance, keeping each pixel's hue), + * encode with gamma 1/2.2 and ±0.5 LSB dither against banding; WebP. * * Usage: * node scripts/build-milky-way.mjs @@ -46,10 +46,12 @@ export const BLUR_DEG = 0.4; const WORK_WIDTH = 4096; const OPEN_RADIUS = 3; const WEBP_QUALITY = 96; -// The darkest quarter of the sky is the black level: away from the galactic -// plane the panorama carries a mottled glow of unresolved stars that would -// read as grey fog around the globe. -const BLACK_PERCENTILE = 0.25; +// The median sky is the black level: away from the galactic plane the +// panorama carries a mottled glow of unresolved stars and dust that reads as +// grey blotches around the globe. A hard cut there draws edges of its own, so +// the level eases in over SOFT_KNEE (a fraction of the black-to-white range). +const BLACK_PERCENTILE = 0.5; +const SOFT_KNEE = 0.03; const WHITE_PERCENTILE = 0.9999; const OUT_DIR = path.join( path.dirname(fileURLToPath(import.meta.url)), @@ -289,6 +291,15 @@ function dither(index, channel) { return (h >>> 0) / 4294967296 - 0.5; } +/** + * Black level with a soft knee: 0 at and below the level, then a quadratic + * ease that joins the straight line, so faint sky fades out instead of + * ending in a contour. + */ +export function softBlack(x, knee = SOFT_KNEE) { + return x <= 0 ? 0 : (x * x) / (x + knee); +} + /** Value at `fraction` of the sorted luminance. */ function luminancePercentile(planes, fraction) { const [r, g, b] = planes; @@ -346,12 +357,14 @@ async function main() { ); const [u, v] = directionToPlateCarree(...icrfToGalactic(direction)); const index = j * FACE_SIZE + i; + const rgb = [0, 1, 2].map((c) => + samplePlane(planes[c], width, height, u, v), + ); + const luminance = (rgb[0] + rgb[1] + rgb[2]) / 3; + const level = softBlack((luminance - black) / (white - black)); for (let c = 0; c < 3; c++) { - const linear = Math.max( - (samplePlane(planes[c], width, height, u, v) - black) / - (white - black), - 0, - ); + // Scale every channel by the luminance curve to keep the hue. + const linear = luminance > 0 ? (rgb[c] / luminance) * level : 0; const encoded = Math.min(linear, 1) ** (1 / 2.2) * 255; pixels[index * 3 + c] = Math.min( 255, diff --git a/src/data/local_data/sky/README.md b/src/data/local_data/sky/README.md index e224e7bb0..175542da5 100644 --- a/src/data/local_data/sky/README.md +++ b/src/data/local_data/sky/README.md @@ -8,7 +8,7 @@ whole-globe view and show compression blocks. | File | Content | Size | | ---- | ------- | ---- | | `bright_stars.json` | 9,096 stars: J2000 RA/Dec, V magnitude, B−V | 235 KB | -| `milkyway_{px,nx,py,ny,pz,nz}.webp` | Milky Way glow, six 1024² cube faces, no stars | 247 KB | +| `milkyway_{px,nx,py,ny,pz,nz}.webp` | Milky Way glow, six 1024² cube faces, no stars | 85 KB | ## Stars — Yale Bright Star Catalogue @@ -45,7 +45,8 @@ Centre. 4096×2048, stars removed with a 7×7 morphological opening, two planets (Jupiter, by position) painted over with the median of the surrounding sky, blurred (σ = 0.4°), reprojected from galactic coordinates to ICRF cube faces, -black level set at the darkest 25 % of the sky, gamma-encoded and saved as +black level set at the median sky with a soft knee (the faint glow away +from the galactic plane fades to black), gamma-encoded and saved as WebP. Build: `node scripts/build-milky-way.mjs `. diff --git a/src/data/local_data/sky/milkyway_nx.webp b/src/data/local_data/sky/milkyway_nx.webp index d74db8e5222e2a29d69eb961b040b2d202db49f5..9c75115c513f0cc1b79c690018d4434858504772 100644 GIT binary patch literal 9118 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 a;*58%DaZSsBdJZeXoKjHrQQqp@B2R=;zJMs literal 40384 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 AXaE2J diff --git a/src/data/local_data/sky/milkyway_ny.webp b/src/data/local_data/sky/milkyway_ny.webp index bec3fb4d373c77578ee6b2e51feaa3fe6f974ab0..a85f3d47e2a864284f64c047109510208b3938a4 100644 GIT binary patch literal 23212 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

io0aL4C6?&OM<{$Zt_(cJty$yA+z-1h|Eaa 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 YX7TVqc4V%%g@A2HfaG(83bp3|0PSKx+yDRo diff --git a/src/data/local_data/sky/milkyway_nz.webp b/src/data/local_data/sky/milkyway_nz.webp index de654a4f2a9bae97d18dfa01a5a33df17c6477af..154e0454fc8354b10e50f7b3d9579ca2c627177a 100644 GIT binary patch literal 19634 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 diff --git a/src/data/local_data/sky/milkyway_px.webp b/src/data/local_data/sky/milkyway_px.webp index 3c0aead6f7325e65ba6ac9cdc7838961dd9c06ce..2bbb491745b92a4d51a5b489d45e691a1d938732 100644 GIT binary patch literal 5478 zcmZWrby$<{*B>b*jXLQNN2jBEbccYHV<1RKN=P@1(WSybq*J;@T0%fN1QY@3md=;b zufOZvU(a>ze$IW)`P8E!FC$|_1_0a`lScr~moq z*z~6dGb5FXl$*<`$VI&hh`~R_O+q|d$g(RXVo8F^bM7cs%*=h(SaYqpxmpKXUvBl; zzjux>tz8zmZYlzB>%T5%PtN76gl|fh^x~n7wq}FpM-dloPh9rPpU3*zs_k-+Cl42) zb=(Pu57?M7V%A)%e;xHtZj5DEjv+_?3}%m?#x6!?JayIa#btc&<%gviWnNspP{Rcx zqnm}+O5YT?=+@0Qu1m$RG6CgsFC$24FmMF29db3#<@TCCO5L7fjiViszFH(Pd@g62 z-^0G=?<5_z5Qsxl%G~AQ_QOU`?rvbhXZbBtO-Dm`6$!yjTTcpiCavYgu{EyYSYs4l zU`mz5tv|4&*4G&7S7EXe6#@W6lT-R1LT zHRZWAc?GrW5xT%vm~kLoAC8c0+#i%HEOt$hK~2t5DXrb-7AxE>1I`9REGk$bAwkj) z6?Qg@C}`>wd`;^(ex)%SXYdZejW

F*RAHu;&FylDRD@l49QwSV~sO^Aw%pT;so! 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 diff --git a/src/data/local_data/sky/milkyway_py.webp b/src/data/local_data/sky/milkyway_py.webp index 44409300736940185a8a3ee997e8d1913de31106..779353c642cb97be7b9bed56df26cae61f6f2ef9 100644 GIT binary patch literal 15028 zcmZ8{V}K@W((K!|&1u`lv~AnAZQHhOO?%pyw(V)#=AE;9&hEGOSJkfvnURqZS*0i; zDq7720H}!w%B#wA5aj=PuLlFk0iptc0zi4uAcF)7kix%{U;+v?wR$j$O3hH?2w6)V z3nsan9u;9%i4{=pyRIJk7WlrtCeKbX{5&nm&91)Qa$G;?S-X5*0eoL?e%FD19}lG0 zb)P@)-r2u&zrC$rt<%5v`hA_(?O^BjLS1S#wBo~L-L))0q@qeRntL~l@^XCVw(7;f zwz-a&0Pn`@zEaTFfig+>vG9m#Vmx?>0(0^##du1JRlxh$F%*SPquyZnp9ccEu7ns! zod@CR0m_=l3EsH_fRH18y>GeJb^APW{_^9*%OV+)cWN&g1+;RK@X==~rw6Aq4nIbE z$az({05CYym|#)j@~>6(SeTMv^MLGj*k864#bQ9B{EK->*?zB~U9uBFF+oW|vig-d8cG%tDfcev3W8o=EM5o{4IuHe)z0uXsIJY#X9wip(>@qeiskZ%i?ipCFwxqIglwpSafw_R9%E6V1xQ9icC@Z7piayqh z`xSAW9^ARa+m~yTRWg2dHTJjMX};P5bpHn!|2{W&V-rJe*=1Q0$&t+-cl@jR=K%rF zfq6c&=cH|~(I|_mjt!$#&{^}~nyzt3p#X_D{0j=xf+1O3^&S_xYQWpqAZ6xB4G3YeYGnFiO=^Ny-OZHZdS-jyMM` z4Nhw2P;c2*bF*6b-G&sCN3FkD#LSw@SrHh0gNJDE5q{$HP*?xoB0{H8o4;JNRx%qI zF1e0a;RHa2%RJYDT|V5jLcxCRFL+_9)>3JyD11*J zh*RuMq&&Lii%goSJM;cYpBM8j`&6-3ue0Qa51>!>OO6y-(YkRuzs_b4y>@(PEkk=t z9%Ml)5dEK1vf7e@AQZ*r%V7O*62GdrdrOdLV~z3 z!SqGPO_wV+yp=YgngZ<4D&wTbF#XP@#V#p*%=clM^BUGH2`RuraP;bNc^kjymTQ|7 z(+(|3CXmJ|z=z;sGcG;lZ+4gQ8;g30dBG|n zL%$bugX0rK^kXs{X_Wh&VrKpq1AkS!=KFm(RUiIm0>f3=u&?8Q;XL88`2fsuwAPSu zI_@uO+?3DoEpLwJYdX1nU|88&p@JV;HAfCiz zPef{>n<{PNaRs`+x#uK!m5zit4(pd+F?bSc`aEyAxaivu5|wt%tbkz9Xf2!A(TKa| zow2}p9J7j1;AKT&sF*aOr}TITI?zXZlg4#}BI3WY{$JV}yoqL2wk%T`J1Uo#>Ts&iK*+U?9S=vAKR0Swt3e@6Jo5xx>hAbgz;pKP76gvb z$+{uEJ(d3O;XR3Nj=0_Nar6XNqft2&Gb*)d+VueuPuF__n*TR;{E*}*ng4QP{jT`L zT}F!zP?Q8Z1a77sY*y`t0)bO?>E+IfLTdKH$Kg)iM|#4U_Z93yAa+C`xpS_vv^e@J zhglJ!3PagP5=!_`3H}u6lSy~oEv7{Y$dZfz?e!bN%jxmIdY=36zlDqzRG?~YF!t;P zBt{r#3OU!4BA=fk;-#-Bkq}y}xc-?cdt1|-zg^0nLdrg3B<9lU!%Jh-Oxp>}QutOl z?rGD+6>Ue?TNz~6S}@UO714i0(OsM}B*&P?|QW1@hnOw0tBH13k#6jqHNRmE~VeP8iRQ>LSs0 zyo*O4PLI{ZoHSX(hQ)0*#|BIrG}JWxc0P4h!q&S%CLQxTOc4$s8MQc?ti~8J`kZp) zT^mZDrdui`WtF=>Sr63zr(+kg+yOmYkmWJNQcBX7R0kfFh!U2rDbHr}f9o1wauhiu z35mLgnAi#D3J{A8DOl|hHm6f{LS4?Cz*qi>+fMdQXWoCx1=&DtW_@KL`d1J7S2sm_ zV3x9_ov4D4gYnC;gMyy1HBDw7aeR_bq2#RBR3nPcLk*Cl&Jg{U;NJpP9O(Ux^0f!e zmmi#D2jqoROX14Wc)Ff;fB2L*lKP7R0WSH(a`Fhk*Dg&5fb|POCH_lw=so=rtKoUA z?La}{B0O4Kd5Z?C^%+4no;G0iKi^05@JWOe(LmF6n2~r_XYfun0C6Yi-lj9znaP=F zgVP7`>!#)}Tub$f@rS;^GVhx0TogpO3rq4r=iQ+=!%_YRf z1apnNta3F5w_%ya={~BJ!JG`Zr_`D-HZwlnW1;PvqPA0Lf~eAZiKa2)BcM&8s(6Xg z!)C&8XK*rZOwSFhkRG>6)J7;b54A-TLM~!Lma{W5OyuWT>tg6xP<>aVAN2G?h?~D` z{v$O9uTO;FF5D4NS`Y2{0vGQg%!!7?`Q6h7*zd=;f@aNn_fQW5_v@Q>lR>p`*_pn1 zqX zkuOz$DF_}POP9k8hBpTI*`4bBc@gCr$A}$X)QPBI-%(VzGk5ToM6%h(Tcb@HNldou< zy8N8;QwBm=?dKn&&Bag^!Ii_@T2{~5_J+#V%vf#rCsK}XNuQRIkN7r)Rtgvtc^i*P z>~%9} z+~*5AwU7|1Ai>QI(K(y`diQ0mrJqEezmo7oJAJdcz|E0;EoC|3sQl?*~S`@}tfd8hx(7g)}HKPpFn*&~&gRT;#O?hLYvp zhFO;m8*p&V0$0Nyr{`Vfbr_5uK*37Fcmo@XW<*$)=>fGPd`(xy#v{`fj{gkb!Hly; zlnGSfe3o-W>ha^sD0{mVgMQ3Xkp!0Jk3@Dp6Q%LpRecuqi8}D=@Qoxj5ty@)g(LgO{D+tziu@-sR zyApofmGzY}OuOcfpVWlxoMIB7^r#n9$Dieet@bvkl5B1=FQR`68@j+r;ZJGkroFcv zI0Frjz?3ZJ$+;i%2O zVJX??@vMxs4ts`Ablovbc&CXd+@*jo$)pLwd%;r0P+*fd_ina)OU|`Vsx={Kch|(l zpK_zKxaHvd8T%$^lQ*&R*w~H#4*pprv8R$b?e7-MVr(C!{_z}IlyidvnkAJ}3PlM& z*&F_+e*Zlq$i=WTCN~D&fjT4KB{P6qp3m=`Js5jYI`>X7{t-=~+hQ0jMo-_tA7UM> zo~tyZH{OmicJbR6h8V)tq~hOB_YV?fBWz%|ayMA-nN(r0E9J-OE*OXWOs5H=+ECtn zk-20#W5tU?x544l)6tc-TA?TL^ntZLXe*SS4~6-ug0DVVXWJkUzb z-%~1XxYj7`@ADtoQv5dmw!F^X?0)Mv{0t$&_QinOE|o*cY-?>R1cqjM>)++_ai2Lb zk*i~xg~}kZK}t8!a`K1HBz2QrT)4a>#KD^ujz%tnEfjXbvLnXy4fJU^YkyA|B41Lp zr-+3(Y3t$RZ3yq&bzlw#ksm!RLCZPEb3md8;pCp>g#CGQ&ECSW6MD&Nj1k}3g&)(@ zdc&l;l&KWtK^be3dMXaw1n=e)<@94<+Q4oGjPof#%#9>#8K%--p=ZOEQ$A6g}P~c@Q$msi)LPlNGkf1doZM1 z>`3$51;}mD>IYi%w+RFJ@9_)J-?X}_n{9rQ{*KRs!FGID3+}3HK47y zfWzV#a5_)gaqf4B_MLPYaJwZI^CWBF&v5?dMiccfhLaAzSMAfxiK|wo;(QMIe_afA zHK#IW`4_!Co@h7r9qL`j@NCdB7IVBlPgW_-A9vK8$OJ2fCT877Xmyk#LAmg)LlI2; zP)UlE>96f%hk~&2P&xelx9bt)JMs@~)qiv}kH5BE94@?tH_db#4~xKojzC_QC20v- zQ1r4O5t}@rL_4+{^%DNFHvG03tzh_+y~akw&2P!yj{vPjw>Opf&kPBjhP{Xi4OmJ< z{$-D@htq;ysU7%RYov=4Oy47mTF@~s4nCS91|^@2wpV}l}uJ- zZpN3;(*%$Laa!BP^SnRM@;Q7L!_6NfEA=KeRp))#HC0u$Gr<{sI7g^nkv7EjaW@@)YN$ujRjX2 zI{UXqtIJRWAuTFT;b+p^yoIeI#)R=xWpYpmZsD>p*%G(5dsu|}76JR_l_gsc89dL9 zx_*wk3Zl6z>q(P{Uc_qrZ>fC009xEegc70dL{yLfG=gnBpmXnqYqoYl7s{zwgknW$ z`D8m^tv#HU@$Nt+M=q7~2{fVCv&5*s{Bxr2C z`j>W>ULo)=lo=%NZarFFpSsK2@}Eqj9AMKkQ?P6R`}Ri^kD_O){jqD@<(%>1%sQ)?mOQ?uh_Q!FD3a-|`8&3IQZfuf zJy@y1DeIpboFql3ZFBPknU3{e-Z3Dc>a{K?df{iOz=|}FNrf$fD$F8H%*YjZv&I0Opq@W7BiR3!&$~Er@aC{9KGTRjL#rJAOVlN$gi&a(ZZy9(U?7lOsV}d5)6At zc^<_8008FGRMQ1C<=B!;9FrdUSULa2`j*CpELvx%ZNwLkFQ0roH;ZatQ7D&tn6LK53;bCj0)A zNl-tY+9P81cLh34KmV*C;w0CtW!;fS>`6W>Eyh1bP>&-iS;N+J!_V9^f-Lz}93AAP zs%kpuZ&ZY5V&sbW#22mYL?JSCchvTaQP674CXL z95?But0Rtx359O|XypOY=E%!$pCL|e%l84%`=A%7(soX>hC^4aCWJwL5@h%nzoVIZ-mLE9H|UpFA)u&o}MRWu3Hvu4G@2-*z9 ztkIat4hy0)o~ixi;=TC+4e|Lr7)ON``ypE+CxS(FURXvP>y=gLyFk+yPsgha1+nEVXx$eAQ>rlV?WP6M=z!3bzyq_0bswuq0n|9`dMT~;lnWS6ahrm z@1GhB0aX1_-E0q*(cE2Px;xV04M6xw$LbRB7{?u z0Dz{==03UaR!XT9g9RDOYMl55tcjtFJqFkvDl35{#=&f4l|^Oq2?p_CaEw^SXvL6S zu}(7H-u3T}&5@xM=Jnc@Z4jB5$lek-inLgQCdAq-v%jCMV5jr}VQNzZExN^I4oYZE z?wTUR3-LX;Jl5XQJL94H|3Mg_(o-PJj-WpbpA(h7idAXJYIv=y_BZnEv8N*|a#Tc| z9$9kjSMKJ*(x$#2I}e)dHOzC#$Ds2984;K6yp`efwDcZuD4Y!NYdReajI8A0Nu_b0 zH?;!-#FXqLe8CPa-{;7;Cw%G~3cP^Vg^=(+JA%QS+@W0HP93A`j5L8IZ4Budh9DeJ zf%gM3wXcXhCycz@V7J~YK~}~C3ucdKK|6zOV$?h3nrv&R!_~&%7aSnG=UUFu?;i?r z&*H*GWK0x&hsq=>-#gQ-;ynqdY5uMBiYxDI_5Oy*W4?thN|e5A)ce=AK~A~f%u7w+ zDt~{#xk`6|!O(*^3G#OtJ+7pO#EWo{vBjV>!SO6u7qTe_e^E&kn7t{y7c?ys^YV6= zh}IG5^g56Ce_SChwwdJOq%jZ}dP!^EJujQK{aG96{L%+aAM2!YK;5@^TE6Iawe$}$ zFv#v=K4^pPcWCdMWn5bc{?*k+m1HxU2k7kJj;HaRCGDCo86px~CKRu3_!ojH*GlhM z7k*L;^OPJGtoNbkD%M!ma{}3oAj~Xir?)8HmoH@iplk+!fB@(@faIL=F=88p*2(Da z>h)J^)=Z8aayY*fHfqxar4CJDvuIQVsbrwO(fY$as5~XR^Pil3R?_|vde0q=YwB|~odNn-4(c$iNzVw(wSo{F~ zaCCnm?bKv0-<0SiUhF>Fu6x6J`ZInQjYO7~JOOy>ltHa0S!^N?gPEvg*6_B*fNaWm zlV-@^k&L-->}MMuAd{NI)cr=IE%zD2eO)91Vl~VX{=G5j(w?G0InzijK7yDKRAHY5 zJKH4gB<^Y)0DupR3GL>Y@wD(z(ArN!jrM>ujHJdKH4orey{MZuSE}XxUzOD!_*_8@ z`PyBE+F#rqK4Z%z zxA><3`MXKy{NYUJ;GYW(yUbFS<6In42j7(aSjo1OLDEb1*Nh>%CMyyLk>cIYI&y@Bn7++r7#>j_`=8D4kPA zy8w`X?7U&~0t2lbkfYUC%l0R;318H)X7hd^1eSw{!CX8#SSn)cf*c4@6w!c%8!^S> z%t=Yj#)iN^z=ezHQ(heY%KHwNwqU#AF??+54v2ALh}D{W2traCBKH77HHqD(m`uGZ ziZq$&@QQhV8}M|gEs8Q`r_#Fj2LO zLArBpFp9ajMu~^LCKpRgi_<1rF-*)suNoOxW+PPqP=K6`rrE1d{ppbulHExwIcaqp zM1R<<0vY|T_#tuSI83b-2oD01IMm9{qqVy>U~m~neHN2ctcR0q9RtXFKw!}>sM;w#Yu*{3z!4p^&SOXdk=qnYxRRFUKVw5?$7Vi;QdprMsEiC zv38WECr{nc!R~*Ue{5qtIajbL=YS&4-QCecAM7jS1bGIOleNVsP}Y?%86s^2k>mTC zMMS=%yF!Q50--3TR73zmu#R)#JH~jNTOr3OL*!Il^t4gJd_0}HWV8BHs_cU!a*;^- zI34Lspmjlg{e-_Hf;U%Od~_4{pL>y=uNKcR&(*~Ty_T*_{2DhV)W&@tDWu+8TN(|el$HYRn|Cah|qF*%c0rxbs=_bO?wK(P#fRsiLZ%yTHiZPJx2XSOrFkDKV zXbh|a2C^~nGp;MFWD!odnz{5n!r@!iva`<98_%KGQ=~LWFIwXedlKdLSsMVvcOURt zx$(1hc1XRI5}p>P$TU-OCWBz2j`a?;(td zy1zw{F=)EY2?_;WIup7o0kr7Z`R>&P?Ala7g8%@a zV?u%5Dg1_ghHwTBF#)NvRQ1^}RmCdeT0?`Qj(8fVIXhzO4o)wS-JIxrH{#j=a} z`gb9B>AS9G6>^t}EGuCN$6#aN5b(svJAT#l5TlrmFX@F|CQ0-YPPa@S)iVpuob zImcEWT@bfU6z!KqUmsh>(*vqNo6}C{I$LQdV=Qg#qdGC-Ge6)zMe@s*!?PjW#gSmI)zy1Vx>pd+rOs5{k>IX)$T!;fpf_%fo>O8|NKC$G zp})KS@PbP^COF1g`kwjgoHk{CFeefgu1i zUJ4E%8Dz|zic8G5L*Z#l-dh%>aJo(sZiy20og?J@@zjO}bC;4SAi!QgZ3|7l?cI3SN~6XNUcl-Z)es2%L^WVB{rjF>ltR@-T_9L{ z2u=o50w2>fjD4hpKY+{zUjh1K%C?N45;Y@R6YQ%H)m{S3jTT8QYc!KjLa!R`8T!>! zz-6OSGMgsLWC&5_h-f`BL=F?OzQR7#G#9Scf86`(0SNZ;MX4obnbGya`O;3WoWe+j z&nOsCXi4<(`x}^*ny#d{m6*ki<^_s;^%QsX;J4sLw{vuiHFL@Ako=>(8~w4wWhQbo%6$M17BvuYT)gcaYn91&UcOo@AQA?7v-iD% zXwaAeUD;)@gX;p2+TM~`q(^o6gPsMKaMZXHHA15NofxD|)ges&(3ZUcG48d{ir%ZC zC!OCV_p^gc(gYOxBnaD)k!0a@D~VF%k84CG+O5$0a}tkIjq*Q`_>?wCRDk5c&yjH@JG#9Yn)3$H zGGVy-cAn$ki`o3aNNR9;nqUt()9K;DykG^Xkap=F)stPXVIl7y;i9$BbZkyVjX5zz zSbJOqwjJhwc3PuvB$Ye};)!6dw~4eYswGml?Y3k3L+vo!2QXg@r=)_B1(L80GX8R= zzwHsM=1Cg5+80ji_$Wh5IW=26GY0lCS$A77*$Z)y_Yv~90C(qTRgF!2IJ5sLs-%J@ zKAcPU^qYbE;YTcY{9x)WT%+|_DJr(}XU#-HA;JEQ5}P$irkWms^QxyIViq4K^C)?l zT$V^`N_t(W6t%e^UOWtMYyku5bn*dHW~p&->T2XXLeY9dK66R>E4Qcl7!asYBsp>= zl9uJ0W#U$E1u*w)i{?NM_T|nzqJMcb^Wq1a?u=!S1@9OVz#y?-dIt6-gL-lvtOdG_ z2^Jiig2&PnE3FFtbuClpdTNNOg8QC`LE8<8`GI$#afAKX3fosNaNMpveLsY=009xG z07}`pPx$6@bx3E{bSIDlTlTzqOv@%UnKbCh5xw3TM+l*vBruPX2)U#mK`g<4j3eA7 zWCq`H=flQde&E*{RFu6)56e_yOWX3PT~dWYlJuda1POL6NxDgK zL&ZG&yNz~*f4FK6AKC<5JM}o!`us+5Y4;@&-H2-~-_|ox9*L>@OeVbp6AVx}dAer{ zB4G|pGrf@mkpT|n!H(M@Mn@*#2P0j6%QR`#WWORph-!2{QP)=$)lMab_h*l=e9 zuu3cXU%ruwmCR;_Ae(d3NtjJb^{Y!mFmjNoHAo=oH6;q1lgpC&c*>dYV7P^g)27*t z2?d}P3!p=()eVqHh$c$jMEV;%NQ#{c33I${R8)8ZdX7AgxLVrtAW@ge?Qc&2kMQNt zhR4MZQp_=B4zfkuJy|0DEyQ0tgBEeL+>qzz;rHwOY;0Yct7RU$&rdC@H;prYM5hrX1n%G5pq##m4XY{a~jk>Z{tbW&+z&ra&imq*$|1O)pY>pD8e zYZBKgqs%2Ps_C{P29X-CrqgNesj{fR>JeVR61A=NIZ#%kNcj#PY2tM)OfXi z*Th;T4xK(%e1?>DhR5UExRI&L$)I-L1I-$HC!WJXrRHUm%p~#HCdYc0W|C<4{BbcS zkEOa?3=|)hWX~(3yrf5Xgjt5}YI{J8qsdQZL3xBt(r2+(WvfLU`A*{lGjC@KC~F<) zqeUrk!cuuhhd1K7HJkRJQ+bv_UzHEAPeRj@sdIQvU@&C{4&2c(WI;+Vp3e4*WwhgH zyO5KwHoSOAoAiD5^V}@6{)tyV;!aTBTAS78-0djbfah+x3o_`S1(P??`SuY^Q%5P`z0o#-aTc|G1D4?E5|h-)uB3olk_Bpk$XI3|XCji{{+iGr ziL8k|n5o|u)W(J5Wk;a$;t43FqXe!q1dsJBv$!2)P$p5e(23Z4=7#cW6OC@~E}FV< zJ6cAioro|nV%V&wu{x*uWd7hiao=ZYsQ20RSB}CyQQ0$n2U~h1u9YAaE*lIVd%9G` ziApq6wDE7tP;t;+v&crNE_SCFg2m`~-x6YQn9FZal=-MFwL5a7MQ$)~dM$|juD8EH zOKeSX7c7OninqSo7{92DIKA_M=4B*zCJ77XI$cATGM_}cw3}BkShoDb>iT^}J?c(W>Py@bo}Z2dYnHlALg#C&k5 zZ9Th`DL1RVHLuYSr0@sS>3g3(zp--Ni$+5df0iGgH>v)-a;yTH)>{s#U4#_AJ$%QzkCs>IhABqeQRz%so@{=gWlL=M)pw* zCx5!cGy*r-e&8lJMLxD79K2DVBYlb=j*|}Vtn@4dO0OkgBKgI7fzQ0aCb7V4j6C2X z?Wnx|LLSe2WnSj$`FgNE>H-ATcFIzdGoJ(>mjA_rpF_STf6=X{=|kYlg-ZGh4qQ zZv?0u8nO`j*9C>ywAcp;jIB#UB*Qxes3KTZ_X!F9ktU$7h zx5Gq>2v)Ek&QmLG7=vWJZcH5%Wli4qM|4$6W%pa|`5m};`hG8 zPWODkph0077C*{KPWE?}jDCJ2_b9&wb0 z(u$dZxo>V9L28_!OHk|%a6@CP0zV*ra|-M6fn{dkz53SYdAasdsFX47zof<^(u^a| z0q12rEj^Gm(xX!%r1Ym?3JSr`s@d4jhLVYv2pM07s^|_FIOBs6wzH;7wSN4&# z+>cR>E?dP*$JOMf8oVvOz;f5?F1Z!vFY!RK-q}l^mp~|T%HT&Y^X7;Lfgc7cA@mEG zza-+Sad>`bW7D`TXG0(P^LG@-S1M?cIyEaUSWs9jd<#{H%ltm1DQ*t-PO*#d5Q{B) zXZX?A@2$xRT`jYxvY46X$gd}6Lf2?^caa{kLh9U5g&rT@qJopq0VjxCD~Ax(>}(aC zpcN&GRL&0Phizm+nUc@@cb`}ql}Z^-l*hw$`>V{_dwJE^kA_s~^*sSwtk~U4502Na zLybU0fXnL$s_`P!iBqCsaFhy_Ni?qDasDr&=T1V*aaZAAxS}O0-9@e#_#Xn8hoHVI7d9OiF} z*ZO^8JbbKGBVH}$6{}rXXOtnzuq=Kbk7;wHaL8&m-LkwE!%;OwK|HkfHZ!uF8geM_ zq!A{%1jX=B#0V;|Ch31C6WnUj-6q6Px&9WM0H)zphSHU3-Lqqj`2hLcx-}owLK+re z^h3-)ObH8>f0?w<=fH2~?bO9<(Nh2k(@zrn=qz_k=g;h)lqOL44eX1wgft&TF+-3L zqLiI!-}7WrG=kBw?}`rX5lxURB+5Z#hj}kml@H!Q-x|&KF^>P|06=^n>QYBXMgkvVMuiz%Uw80U{%8vLM6La#(ahUe_SCI}HQOESn`Yc4^mUbiB z1fzS9DlUmZyuAGml|O*GzWS_Erz&7#1TMr|PGE^Uz^@AAdKmu|vgepV+rxMz;I|#) zO(_g0&Qy=~Fur|}?^$b!tI8phLI4_5Oq?6f$?^6p-aUKynSWV33D1~6$5L!+(zt?} z+G_EYQMn^EnA(wj$j`T#?|h6WaA`&jj$4b`5mdwCQ?TW#A|x(YXy2vx4G;A#P;sX^ z>^mtzzAb)0kD7qkd@5mE50L`AffU2PgwhdxA>{XCqW@MW#?ENa*_FS zJyvA*)f(B##Z)43Dr1fL>F0NOweJ8>eU5U@b z*rNIY$r{_}B}m?+5phZ1=12`anV!4NDs z)XyGQ9uWc1HNP9y@`IbN-5-?@Br&&+D2kzuLf0^fJX{xkTa4}D0BcoE`6W1y2GSPs zq%dq_W%{z<-I_FZR??aPA>znvqF1=3@Wft6iBd0nSo<1ezM{rvm!q5KBo^d-&f?qP zRX&vZI2VWNT^51T`Ng^k?SKqpG?piejm8;LYB0Pc=^5}J#^LyZfri19%)>;Yr{=UZ z=>w^4Unk`wttfdieW?ZHs?q|HP2PQaC~e>}RDXAZ2A->US035Co)WYSJu3PTk>r#p z;RhJg_1%Vn*9jk9ntUG_|Q`)BhmKd0Wf|AsNAB)%_4#kj2#>*sHII;5|crY z6{ZYH4JPeMLD!g6#;FJ@O9}gv7QL6MZ=-deiDWGIr-Zu{sh3f6F?%7;w-i$r(h&QF zMVy(6l=am?YbunTg$`MG;Yn)=Oz_@j2IO&H%b#N>xg24t?8NMlSZqG)i5rY+4JZ*sB$(Vo0`n6pXB!2nl ztA-A)FF%;9sDfj+(pt;ZWjg~Wnhfn0FW7xYVb!Eb_l!%sa9D@8LYU~F?)ua|xHPqx zA?cM5baLx;G9k|ofTYCa#7lGx`YZV+frRQ8ew9yGoQ190ar1V@9h%*Yhz!VL&e6uL!M=*LczDyRpfUTHO~DXMJ6CG^bnEbgUV0-kHpg66Tn*MuTD={YQ7iY?DRs2cRyV=PNUd zEMLYK=a;db^vZ_oh9x3tGH`hM<%pma5~B(1obnZm7FQor)vS@3bHn*-(!%APig!lM T_ySA3J5#y%kyk2W0O0=tCamzp literal 41794 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

QH1|y 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 { + assert.equal(softBlack(-0.2), 0); + assert.equal(softBlack(0), 0); + // Continuous, rising, with no step at the black level. + let previous = 0; + for (let x = 0.001; x <= 1; x += 0.001) { + const y = softBlack(x); + assert.ok(y > previous && y - previous < 0.0011, `step at ${x.toFixed(3)}`); + previous = y; + } + // Starts flat, then joins the straight line just below it. + assert.ok(softBlack(0.003) < 0.0003); + close(softBlack(1), 1 - 0.03, 1e-3); +}); From ac9cd4ab84e8d7858aaeafcf485c3da793b7ca2e Mon Sep 17 00:00:00 2001 From: Said Date: Mon, 19 Oct 2026 23:02:46 +0100 Subject: [PATCH 07/45] fix(overpass): bound query validation and reject cross-site requests --- docs/CURRENT-STATE.md | 15 +- scripts/format-scope.json | 3 +- scripts/package-boundaries.json | 2 + server/providers/overpass.js | 20 ++ server/providers/overpass/query.js | 36 +++- .../overpass/requestAdmission.test.mjs | 178 ++++++++++++++++++ 6 files changed, 243 insertions(+), 11 deletions(-) create mode 100644 server/providers/overpass/requestAdmission.test.mjs diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 60937dd05..bcc4e6fd3 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2733,11 +2733,16 @@ down | auth-failed` (plus the unchanged `missing-key`/`unsupported`) with > first later successful fetch. Smaller chunks reduce timeout risk; complete > camera batches still wait for their sequential requests, and unresolved > placement continues to use the existing prior until real heights arrive. -> - **Overpass cache admission:** `/api/overpass` parses and sanitizes requests, -> then checks fresh memory, identical in-flight work, and fresh disk entries -> before invoking its local 90/min limiter. Cache and single-flight responses -> therefore do not spend quota; upstream-bound misses retain the existing -> limiter, configured-upstream, stale, and sanitization behavior. An unconfigured transport serves dated stale data or a non-retryable capability error. +> - **Overpass cache admission:** `/api/overpass` refuses cross-site and forwarded +> POSTs through the shared local-request gate, then limits requests to 300/min +> per socket peer and 900/min globally before reading or validating bodies. +> Tag-filter brackets are scanned once; nested or unmatched brackets return 400. +> It then checks fresh memory, identical in-flight work, and fresh disk entries +> before invoking its separate local 90/min upstream limiter. Cache and +> single-flight responses therefore do not spend upstream quota; upstream-bound +> misses retain the existing limiter, configured-upstream, stale, and sanitization +> behavior. An unconfigured transport serves dated stale data or a non-retryable +> capability error. > - **CCTV world-click focus:** clicking an in-world CCTV icon or ambient card > activates it and routes the camera flight through the panel FOCUS policy. > Aircraft/satellite tracking releases outside cockpit; cockpit retains the diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 543b0f9a4..c7a95e6e3 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1070,5 +1070,6 @@ "scripts/assemble-changelog.mjs", "src/tooling/changelogFragments.test.mjs", "src/data/gbfsProxyRateLimit.test.mjs", - "src/terrainHeightsBounds.test.mjs" + "src/terrainHeightsBounds.test.mjs", + "server/providers/overpass/requestAdmission.test.mjs" ] diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index ca5dc0c7f..55effa760 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -253,6 +253,7 @@ "server/providers/common/http.js", "server/providers/common/rate-limit.js", "server/providers/common/request.js", + "server/providers/common/same-site.js", "server/providers/overpass.js", "server/providers/overpass/cache.js", "server/providers/overpass/constants.js", @@ -262,6 +263,7 @@ "server/providers/places/routes.js", "src/data/placeProviderPayloads.js", "src/data/routeSteps.js", + "src/localRequestGate.mjs", "src/sources/httpBody.js", "src/i18n/marker.js", "src/sources/overpass.js", diff --git a/server/providers/overpass.js b/server/providers/overpass.js index e6631e889..3b5a2e575 100644 --- a/server/providers/overpass.js +++ b/server/providers/overpass.js @@ -1,5 +1,6 @@ import { makeRateLimiter, clientKey } from './common/rate-limit.js'; import { readRequestBodyCapped } from './common/request.js'; +import { admitSameSite } from './common/same-site.js'; import { OVERPASS_MAX_BODY_BYTES, OVERPASS_MAX_CONCURRENT, @@ -27,6 +28,14 @@ const _overpassInFlight = new Map(); let _overpassConcurrent = 0; +// Bound body-reading and validation work, including malformed requests and +// cache hits. Keep the tighter upstream budget below independent of this gate. +const _overpassRequestLimiter = makeRateLimiter({ + windowMs: 60_000, + max: 300, + globalMax: 900, +}); + const _overpassRateLimiter = makeRateLimiter({ windowMs: 60_000, max: 90, @@ -94,6 +103,17 @@ function overpassProxy({ routing = {} } = {}) { return; } + if (admitSameSite(req, res)) return; + if (!_overpassRequestLimiter(clientKey(req))) { + res.writeHead(429, { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-store', + 'Retry-After': '60', + }); + res.end(JSON.stringify({ error: 'Rate limit exceeded' })); + return; + } + // Collect POST body with a hard byte cap (Overpass QL queries are small) let body; try { diff --git a/server/providers/overpass/query.js b/server/providers/overpass/query.js index cee444d3a..4091c9efd 100644 --- a/server/providers/overpass/query.js +++ b/server/providers/overpass/query.js @@ -18,6 +18,29 @@ function isOverpassBoundaryQuery(cacheKey) { return /is_in\s*\(|\bpivot\b/i.test(String(cacheKey || '')); } +// Input has already had quoted literals and comments removed. Consume each +// character once: a regex that searches for a closing bracket from every `[` is +// quadratic on an unterminated filter. Nested or unmatched brackets are invalid. +function stripTagFilters(text) { + const parts = []; + let start = 0; + let inFilter = false; + for (let i = 0; i < text.length; i += 1) { + if (text[i] === '[') { + if (inFilter) return null; + parts.push(text.slice(start, i), ' '); + inFilter = true; + } else if (text[i] === ']') { + if (!inFilter) return null; + inFilter = false; + start = i + 1; + } + } + if (inFilter) return null; + parts.push(text.slice(start)); + return parts.join(''); +} + /** * Validate + clamp an Overpass form body. Defends the generic proxy against * planet-scale abuse: requires exactly one `data` query in which EVERY element @@ -50,6 +73,10 @@ function sanitizeOverpassBody(rawBody) { // Blank quoted literals + strip comments in one lexer pass so a fake bound or a // `//` inside a string can't hide an unbounded selector (or satisfy a bound). const stripped = stripOverpassNoise(data); + const withoutTags = stripTagFilters(stripped); + if (withoutTags === null) { + return { ok: false, error: 'Malformed Overpass tag filter' }; + } // Reject oversized radii in EVERY around form — point `around:r,lat,lon` AND the // input-set form `around.set:r` — and parse the full numeric token so scientific @@ -93,20 +120,19 @@ function sanitizeOverpassBody(rawBody) { // statement. So `way[...]->.a` (global assigned to a set) is rejected, while the // app's `is_in(...)->.a; area.a[...]` and `area(id)->.x; rel(pivot.x)` validate. const boundedSets = new Set(); - for (let stmt of stripped.split(';')) { + for (let stmt of withoutTags.split(';')) { stmt = stmt.trim(); if (!stmt || stmt.startsWith('[') || /^out\b/.test(stmt)) continue; - // Strip output-set assignments (NOT input bounds), then strip bracket tag - // filters so a tag KEY/value (e.g. `way[is_in]`, `node[around]`) can never be + // Strip output-set assignments (NOT input bounds). Bracket tag filters were + // removed above so a tag KEY/value (e.g. `way[is_in]`, `node[around]`) cannot be // misread as a spatial bound. Bounds live in (...) / function calls / set // refs, never inside [...], so the probe loses nothing real. const outSets = []; - const body = stmt.replace(/->\s*\.(\w+)/g, (_, name) => { + const probe = stmt.replace(/->\s*\.(\w+)/g, (_, name) => { outSets.push(name); return ' '; }); - const probe = body.replace(/\[[^\]]*\]/g, ' '); // Reject element-in-area scans on the TAG-STRIPPED probe, so a tag filter // between the selector and the area filter (way["highway"](area.a)) can't hide diff --git a/server/providers/overpass/requestAdmission.test.mjs b/server/providers/overpass/requestAdmission.test.mjs new file mode 100644 index 000000000..ecd642320 --- /dev/null +++ b/server/providers/overpass/requestAdmission.test.mjs @@ -0,0 +1,178 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { Readable } from 'node:stream'; +import { spawnSync } from 'node:child_process'; +import { overpassProxy } from '../overpass.js'; +import { sanitizeOverpassBody } from './query.js'; + +const form = (query) => `data=${encodeURIComponent(query)}`; + +test('bracket validation rejects malformed filters without trusting their contents as bounds', () => { + for (const query of [ + 'node[', + 'node]', + 'node[[name]](around:20,1,1);out;', + 'node[name=around:20];out;', + 'node[is_in];out;', + 'node[name="(around:20,1,1)"];out;', + 'node(around:20,1,1);way[name];out;', + 'way[highway](area.a);out;', + 'node[->.a](around:20,1,1);way.a;out;', + ]) { + assert.equal(sanitizeOverpassBody(form(query)).ok, false, query); + } +}); + +test('bounded queries preserve quoted brackets, comments, multiple tags and timeout clamping', () => { + for (const query of [ + '[out:json][timeout:999];node[name="[Town]; ]"](around:20,1,1);out;', + '/* [ */way[highway][name](30.1,-97.9,30.5,-97.5);out geom;', + 'is_in(30.2,-97.7)->.a;area.a[boundary="administrative"];out tags;', + 'area(3600039152)->.x;rel(pivot.x);out geom;', + ]) { + const result = sanitizeOverpassBody(form(query)); + assert.equal(result.ok, true, query); + assert.equal( + new URLSearchParams(result.body).get('data'), + query.replace('[timeout:999]', '[timeout:30]'), + ); + } +}); + +test('a burst of maximum-size unterminated filters completes within a bounded process deadline', () => { + // A child deadline can stop synchronous regex backtracking; a test timeout in + // the same event loop cannot. The old parser takes several seconds for this. + const result = spawnSync( + process.execPath, + [ + '--input-type=module', + '-e', + `import { sanitizeOverpassBody } from ${JSON.stringify(new URL('./query.js', import.meta.url).href)}; + for (let i = 0; i < 20; i++) { + if (sanitizeOverpassBody('data=node' + '['.repeat(24000)).ok) process.exit(1); + }`, + ], + { timeout: 2000, encoding: 'utf8' }, + ); + assert.ifError(result.error); + assert.equal(result.status, 0, result.stderr); +}); + +function handler(hook = 'configureServer') { + let route; + overpassProxy()[hook]({ + middlewares: { + use(path, fn) { + if (path === '/api/overpass') route = fn; + }, + }, + }); + return route; +} + +async function call( + route, + { + headers = {}, + peer = '127.0.0.1', + body = 'data=node[', + forbidRead = false, + method = 'POST', + url = '/', + } = {}, +) { + let reads = 0; + const req = new Readable({ + read() { + reads++; + assert.equal(forbidRead, false, 'refused request must not read its body'); + this.push(Buffer.from(body)); + this.push(null); + }, + }); + Object.assign(req, { + method, + url, + headers: { host: 'localhost:4173', ...headers }, + socket: { remoteAddress: peer }, + }); + const res = { + statusCode: 200, + headers: {}, + setHeader(key, value) { + this.headers[key.toLowerCase()] = value; + }, + writeHead(status, values) { + this.statusCode = status; + for (const [key, value] of Object.entries(values)) + this.setHeader(key, value); + }, + end(value) { + this.body = value; + }, + }; + await route(req, res); + return { ...res, reads }; +} + +for (const hook of ['configureServer', 'configurePreviewServer']) { + test(`${hook}: cross-site requests are rejected before consuming a body or fetching`, async (t) => { + t.mock.method(globalThis, 'fetch', () => + assert.fail('unexpected upstream fetch'), + ); + const route = handler(hook); + for (const headers of [ + { origin: 'https://foreign.example', 'content-type': 'text/plain' }, + { 'sec-fetch-site': 'cross-site' }, + { 'sec-fetch-site': 'same-site' }, + { origin: 'null' }, + { 'x-forwarded-for': '127.0.0.1' }, + ]) { + const response = await call(route, { headers, forbidRead: true }); + assert.equal(response.statusCode, 403); + assert.equal(response.reads, 0); + assert.equal(response.headers['cache-control'], 'no-store'); + } + }); +} + +test('same-origin, LAN and non-browser requests still reach validation; GET status stays available', async () => { + const route = handler(); + for (const headers of [ + {}, + { origin: 'http://localhost:4173', 'sec-fetch-site': 'same-origin' }, + { host: '192.168.1.10:4173', origin: 'http://192.168.1.10:4173' }, + ]) { + const response = await call(route, { headers }); + assert.equal(response.statusCode, 400); + assert.equal(response.reads, 1); + assert.match(response.body, /Malformed Overpass tag filter/); + } + const response = await call(route, { + method: 'GET', + url: '/status', + forbidRead: true, + }); + assert.equal(response.statusCode, 200); + assert.equal(typeof JSON.parse(response.body).configured, 'boolean'); +}); + +test('invalid requests spend admission quota before parsing, including on an unconfigured server', async (t) => { + let now = Date.now() + 120000; + t.mock.method(Date, 'now', () => now); + t.mock.method(globalThis, 'fetch', () => + assert.fail('unexpected upstream fetch'), + ); + const route = handler(); + const peer = 'admission-limit-test'; + for (let i = 0; i < 300; i++) { + assert.equal((await call(route, { peer })).statusCode, 400); + } + const denied = await call(route, { peer, forbidRead: true }); + assert.equal(denied.statusCode, 429); + assert.equal(denied.reads, 0); + assert.equal(denied.headers['retry-after'], '60'); + assert.equal((await call(route, { peer: 'other-peer' })).statusCode, 400); + now += 60001; + assert.equal((await call(route, { peer })).statusCode, 400); +}); From c5086f8d6d1a7c155e46d792bf5491d8033d2912 Mon Sep 17 00:00:00 2001 From: Said Date: Mon, 19 Oct 2026 23:14:52 +0100 Subject: [PATCH 08/45] docs: add changelog entry for PR 1264 --- changelog.d/1264-overpass-request-admission.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog.d/1264-overpass-request-admission.md diff --git a/changelog.d/1264-overpass-request-admission.md b/changelog.d/1264-overpass-request-admission.md new file mode 100644 index 000000000..2a4794e1d --- /dev/null +++ b/changelog.d/1264-overpass-request-admission.md @@ -0,0 +1,3 @@ +- Prevent malformed Overpass filters from blocking the local server, and reject + cross-site or excessive query requests before reading their bodies + (asturksever, #1264; fixes #1248). From 37acb4842f65c6725146216367eb54b31cf2cadc Mon Sep 17 00:00:00 2001 From: Said Date: Mon, 19 Oct 2026 23:23:52 +0100 Subject: [PATCH 09/45] fix(docker): honor trusted-peer environment overrides --- README.md | 10 ++ SECURITY.md | 5 + compose.yaml | 5 + docs/CURRENT-STATE.md | 9 ++ scripts/docker-start.mjs | 12 ++- scripts/format-scope.json | 3 +- src/dockerLauncher.test.mjs | 3 +- src/dockerTrustedPeers.test.mjs | 179 ++++++++++++++++++++++++++++++++ 8 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 src/dockerTrustedPeers.test.mjs diff --git a/README.md b/README.md index 3b005c8dc..eb00b9635 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,16 @@ Publishing it wider is the [Sharing an instance](#-sharing-an-instance) opt-in, When you widen the publish, also set `GEV_KEY_SETUP_TRUSTED_PEERS=none` so the launcher trusts no gateway address. +```bash +GEV_KEY_SETUP_TRUSTED_PEERS=none docker compose up +``` + +Compose forwards `GEV_KEY_SETUP_TRUSTED_PEERS` and `GEV_ALLOWED_HOSTS` from your +shell or the project's `.env`; an exported shell value takes precedence. You can +also put `GEV_KEY_SETUP_TRUSTED_PEERS=none` in `.env` for a persistent setting. +Unset or blank trusted peers retain automatic gateway discovery; `none` explicitly +disables it. The startup log confirms that no additional peers are trusted. +

Running on Linux, a NAS, or behind a reverse proxy diff --git a/SECURITY.md b/SECURITY.md index b694d8dcd..aa2f5a397 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -98,6 +98,11 @@ The dev server is a **key broker**: every server-side key above is spendable by `compose.yaml` publishes on `127.0.0.1`: **widen that mapping and every LAN client arrives from the same gateway address, which hands them Provider Settings too.** Treat publishing beyond loopback as the LAN opt-in above. + Compose forwards `GEV_KEY_SETUP_TRUSTED_PEERS` and `GEV_ALLOWED_HOSTS` from + the shell or project `.env` before the launcher runs. Set trusted peers to + `none` when widening the publish: it becomes an explicit empty list before + Vite loads configuration, so the gateway cannot regain Provider Settings + access. Unset or blank values preserve automatic gateway discovery. - **Provider-side budgets are the real backstop.** For hard spend protection, configure limits where the money is: OpenAI platform usage limits, Google Cloud budget alerts + per-API quotas, and equivalent controls for any other keyed provider. - **Pinokio LAN and Cloudflare sharing are refused.** The current supported Pinokio release re-reads sharing state when an app registers its Open URL and diff --git a/compose.yaml b/compose.yaml index 7826bf376..c2d3bf3d4 100644 --- a/compose.yaml +++ b/compose.yaml @@ -5,6 +5,11 @@ services: # lands in the bind-mounted repo, so run as you, not root. UID/GID are # unset on Docker Desktop, where the 1000 fallback is ignored anyway. user: "${UID:-1000}:${GID:-1000}" + # Forward explicit shell/.env policy before the launcher discovers a gateway. + # Unset values stay unset so the default loopback-only install still works. + environment: + - GEV_KEY_SETUP_TRUSTED_PEERS + - GEV_ALLOWED_HOSTS ports: # Publish to loopback only. Docker's default ("4173:4173") would bind # every host interface, which quietly turns the LAN warning in the README diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 60937dd05..300ee9279 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1,5 +1,14 @@ # God's Eye View Current State +Docker Compose forwards `GEV_KEY_SETUP_TRUSTED_PEERS` and `GEV_ALLOWED_HOSTS` +from the shell or project `.env` before `scripts/docker-start.mjs` runs; shell +values take precedence. The launcher's `none` policy resolves to an empty trusted +peer list and is assigned before importing Vite, preventing later dotenv loading +from replacing it. Unset or blank values retain automatic gateway discovery. +Startup logs distinguish an explicit `none` policy from a missing default route. +This changes neither loopback-only port publishing nor the Provider Settings +Host, Origin, proxy-header and sharing checks. + Shared distance checks use `src/geoDistance.js` with `{ lat, lon }` points and the IUGG mean spherical Earth radius, 6371.0088 km. `greatCircleKm` is canonical; `greatCircleMeters` is its exact metre conversion. Missing, diff --git a/scripts/docker-start.mjs b/scripts/docker-start.mjs index 3935f2b3b..c77d6335f 100644 --- a/scripts/docker-start.mjs +++ b/scripts/docker-start.mjs @@ -48,7 +48,8 @@ export function defaultGatewayFromRouteTable(text) { /** * Decide this launch's trusted-peer list. An operator value always wins, so a - * compose override stays authoritative; otherwise the gateway alone is + * compose override stays authoritative; `none` trusts no additional peers. + * An unset or blank value means the gateway alone is * trusted. No gateway trusts nothing and Provider Settings stays loopback-only, * exactly as under `npm run dev`. * @param {{env?: NodeJS.ProcessEnv, routeTable?: string}} input @@ -56,6 +57,7 @@ export function defaultGatewayFromRouteTable(text) { */ export function resolveTrustedPeers({ env = process.env, routeTable = '' } = {}) { const explicit = String(env.GEV_KEY_SETUP_TRUSTED_PEERS ?? '').trim(); + if (explicit.toLowerCase() === 'none') return ''; if (explicit) return explicit; return defaultGatewayFromRouteTable(routeTable) ?? ''; } @@ -109,15 +111,17 @@ async function start() { String(process.env.GEV_KEY_SETUP_TRUSTED_PEERS ?? '').trim(), ); const trustedPeers = resolveTrustedPeers({ routeTable: readRouteTable() }); + // Set even an empty list before Vite loads .env: the resolved launcher policy + // must remain authoritative when there is no trusted gateway. + process.env.GEV_KEY_SETUP_TRUSTED_PEERS = trustedPeers; if (trustedPeers) { - // Set before Vite is imported: the dev server snapshots process.env during - // configuration, and the admission gate reads it per request. - process.env.GEV_KEY_SETUP_TRUSTED_PEERS = trustedPeers; console.log( fromOperator ? `[Docker] Provider Settings trusted peers: ${trustedPeers} (GEV_KEY_SETUP_TRUSTED_PEERS).` : `[Docker] Provider Settings trusts the container gateway (${trustedPeers}).`, ); + } else if (fromOperator) { + console.log('[Docker] Provider Settings trusts no additional peers (GEV_KEY_SETUP_TRUSTED_PEERS=none).'); } else { console.log('[Docker] No default gateway; Provider Settings stays loopback-only.'); } diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 543b0f9a4..faac60584 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1070,5 +1070,6 @@ "scripts/assemble-changelog.mjs", "src/tooling/changelogFragments.test.mjs", "src/data/gbfsProxyRateLimit.test.mjs", - "src/terrainHeightsBounds.test.mjs" + "src/terrainHeightsBounds.test.mjs", + "src/dockerTrustedPeers.test.mjs" ] diff --git a/src/dockerLauncher.test.mjs b/src/dockerLauncher.test.mjs index ae9987b01..213fe59dc 100644 --- a/src/dockerLauncher.test.mjs +++ b/src/dockerLauncher.test.mjs @@ -72,6 +72,7 @@ test('the Docker install path keeps its loopback-only, launcher-owned contract', const compose = readFileSync(new URL('../compose.yaml', import.meta.url), 'utf8'); assert.match(compose, /^\s+- "127\.0\.0\.1:4173:4173"$/m, 'the port is published on the host loopback only'); - assert.doesNotMatch(compose, /GEV_KEY_SETUP_TRUSTED_PEERS/, 'trust is derived at launch, never hard-coded'); + assert.match(compose, /^\s+- GEV_KEY_SETUP_TRUSTED_PEERS$/m, 'the operator policy reaches the launcher without a hard-coded address'); + assert.match(compose, /^\s+- GEV_ALLOWED_HOSTS$/m, 'the host allowlist reaches Vite'); assert.doesNotMatch(compose, /network_mode/, 'the container keeps its own network namespace'); }); diff --git a/src/dockerTrustedPeers.test.mjs b/src/dockerTrustedPeers.test.mjs new file mode 100644 index 000000000..74343bd04 --- /dev/null +++ b/src/dockerTrustedPeers.test.mjs @@ -0,0 +1,179 @@ +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import test from 'node:test'; +import { resolveTrustedPeers } from '../scripts/docker-start.mjs'; + +const ROUTES = 'Iface Destination Gateway Flags\neth0 00000000 0100A8C0 0003\n'; +const launcher = fileURLToPath( + new URL('../scripts/docker-start.mjs', import.meta.url), +); +const gateUrl = new URL('./keySetupCore.mjs', import.meta.url).href; + +test('none resolves to an empty trust list even with a valid container gateway', () => { + for (const value of ['none', ' NONE ', 'None']) { + assert.equal( + resolveTrustedPeers({ + env: { GEV_KEY_SETUP_TRUSTED_PEERS: value }, + routeTable: ROUTES, + }), + '', + ); + } +}); + +function launchWithPolicy(value, routeTable = ROUTES) { + // Run the real entry point and routing-table reader. Replace only the Linux + // route file and Vite's listening server so this works on macOS and CI too. + const fakeVite = ` + import { admitKeySetupRequest } from ${JSON.stringify(gateUrl)}; + const trustedAtImport = process.env.GEV_KEY_SETUP_TRUSTED_PEERS; + export async function createServer() { + const request = { + method: 'POST', hostHeader: 'localhost:4173', + origin: 'http://localhost:4173', contentType: 'application/json', + env: { GEV_KEY_SETUP_TRUSTED_PEERS: process.env.GEV_KEY_SETUP_TRUSTED_PEERS } + }; + console.log('POLICY ' + JSON.stringify({ + trustedAtImport, + allowedHosts: process.env.GEV_ALLOWED_HOSTS, + gateway: admitKeySetupRequest({ ...request, remoteAddress: '192.168.0.1' }), + loopback: admitKeySetupRequest({ ...request, remoteAddress: '127.0.0.1' }), + foreignOrigin: admitKeySetupRequest({ ...request, remoteAddress: '192.168.0.1', origin: 'https://foreign.example' }) + })); + return { async listen() {}, printUrls() {}, async close() {} }; + } + `; + const preload = ` + import fs from 'node:fs'; + import { registerHooks, syncBuiltinESMExports } from 'node:module'; + const originalRead = fs.readFileSync; + fs.readFileSync = (file, ...args) => file === '/proc/net/route' + ? ${JSON.stringify(routeTable)} : originalRead(file, ...args); + syncBuiltinESMExports(); + registerHooks({ resolve(specifier, context, next) { + if (specifier === 'vite') return { + url: ${JSON.stringify(`data:text/javascript,${encodeURIComponent(fakeVite)}`)}, shortCircuit: true + }; + return next(specifier, context); + }}); + `; + const env = { ...process.env, GEV_ALLOWED_HOSTS: 'globe.example.lan' }; + delete env.GEV_KEY_SETUP_TRUSTED_PEERS; + if (value !== undefined) env.GEV_KEY_SETUP_TRUSTED_PEERS = value; + const child = spawnSync( + process.execPath, + [ + '--import', + `data:text/javascript,${encodeURIComponent(preload)}`, + launcher, + ], + { env, encoding: 'utf8', timeout: 10000 }, + ); + assert.ifError(child.error); + assert.equal(child.status, 0, child.stderr); + const line = child.stdout + .split('\n') + .find((line) => line.startsWith('POLICY ')); + assert.ok(line, child.stdout); + return { ...JSON.parse(line.slice(7)), output: child.stdout }; +} + +test('the real Docker entry point seals none before importing Vite and the setup gate refuses the gateway', () => { + const result = launchWithPolicy('none'); + assert.equal(result.trustedAtImport, ''); + assert.equal(result.gateway.status, 403); + assert.equal(result.gateway.code, 'not-loopback'); + assert.equal(result.loopback.ok, true); + assert.equal(result.allowedHosts, 'globe.example.lan'); + assert.match(result.output, /trusts no additional peers/); + assert.doesNotMatch(result.output, /No default gateway/); +}); + +test('unset, blank and explicit peers retain gateway admission without weakening Origin checks', () => { + for (const value of [undefined, '', ' ', '192.168.0.1']) { + const result = launchWithPolicy(value); + assert.equal(result.trustedAtImport, '192.168.0.1'); + assert.equal(result.gateway.ok, true); + assert.equal(result.foreignOrigin.ok, false); + } + const result = launchWithPolicy(undefined, ''); + assert.equal(result.trustedAtImport, ''); + assert.equal(result.gateway.status, 403); + assert.match(result.output, /No default gateway/); +}); + +test('Compose resolves shell and project dotenv policy before the launcher starts', (t) => { + const version = spawnSync('docker', ['compose', 'version'], { + encoding: 'utf8', + timeout: 10000, + }); + if (version.error || version.status !== 0) + return t.skip('Docker Compose CLI is not installed'); + const root = mkdtempSync(path.join(tmpdir(), 'gev-compose-policy-')); + t.after(() => rmSync(root, { recursive: true, force: true })); + writeFileSync( + path.join(root, 'compose.yaml'), + readFileSync(new URL('../compose.yaml', import.meta.url)), + ); + const baseEnv = { ...process.env }; + for (const key of Object.keys(baseEnv)) { + if ( + key.startsWith('COMPOSE_') || + ['GEV_KEY_SETUP_TRUSTED_PEERS', 'GEV_ALLOWED_HOSTS'].includes(key) + ) + delete baseEnv[key]; + } + function config(dotenv = '', overrides = {}) { + writeFileSync(path.join(root, '.env'), dotenv); + const child = spawnSync( + 'docker', + [ + 'compose', + '-f', + 'compose.yaml', + '--env-file', + '.env', + 'config', + '--format', + 'json', + ], + { + cwd: root, + env: { ...baseEnv, ...overrides }, + encoding: 'utf8', + timeout: 10000, + }, + ); + assert.ifError(child.error); + assert.equal(child.status, 0, child.stderr); + return JSON.parse(child.stdout).services['gods-eye-view'].environment || {}; + } + const unset = config(); + assert.ok(unset.GEV_KEY_SETUP_TRUSTED_PEERS == null); + assert.ok(unset.GEV_ALLOWED_HOSTS == null); + const dotenv = + 'GEV_KEY_SETUP_TRUSTED_PEERS=none\nGEV_ALLOWED_HOSTS=globe.example.lan\n'; + assert.deepEqual(config(dotenv), { + GEV_KEY_SETUP_TRUSTED_PEERS: 'none', + GEV_ALLOWED_HOSTS: 'globe.example.lan', + }); + assert.equal( + config(dotenv, { GEV_KEY_SETUP_TRUSTED_PEERS: '10.9.8.7' }) + .GEV_KEY_SETUP_TRUSTED_PEERS, + '10.9.8.7', + ); + assert.equal( + config('', { GEV_KEY_SETUP_TRUSTED_PEERS: 'none' }) + .GEV_KEY_SETUP_TRUSTED_PEERS, + 'none', + ); + assert.equal( + config(dotenv, { GEV_KEY_SETUP_TRUSTED_PEERS: '' }) + .GEV_KEY_SETUP_TRUSTED_PEERS, + '', + ); +}); From f11fd3cb0525645431ede32980a65fbe55e4363a Mon Sep 17 00:00:00 2001 From: Said Date: Mon, 19 Oct 2026 23:49:59 +0100 Subject: [PATCH 10/45] docs: add changelog for Docker trusted-peer fix --- changelog.d/1265-docker-trusted-peers.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog.d/1265-docker-trusted-peers.md diff --git a/changelog.d/1265-docker-trusted-peers.md b/changelog.d/1265-docker-trusted-peers.md new file mode 100644 index 000000000..f86fe3732 --- /dev/null +++ b/changelog.d/1265-docker-trusted-peers.md @@ -0,0 +1,3 @@ +- Honor Docker Compose trusted-peer and allowed-host settings from the shell + or project `.env`, and let `GEV_KEY_SETUP_TRUSTED_PEERS=none` disable gateway + access to Provider Settings before Vite starts (asturksever, #1265). From 84d96971df6c8279b74e6628acddc330abd11452 Mon Sep 17 00:00:00 2001 From: Said Turksever Date: Tue, 20 Oct 2026 00:15:49 +0100 Subject: [PATCH 11/45] fix: let keyless browser validation settle --- changelog.d/1264-overpass-request-admission.md | 3 +++ docs/CURRENT-STATE.md | 6 ++++++ scripts/qa-overpass-offload.mjs | 11 ++++++++++- src/maps/googleTokens.js | 5 ++++- src/maps/googleTokens.test.mjs | 17 +++++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/changelog.d/1264-overpass-request-admission.md b/changelog.d/1264-overpass-request-admission.md index 2a4794e1d..e49322df1 100644 --- a/changelog.d/1264-overpass-request-admission.md +++ b/changelog.d/1264-overpass-request-admission.md @@ -1,3 +1,6 @@ - Prevent malformed Overpass filters from blocking the local server, and reject cross-site or excessive query requests before reading their bodies (asturksever, #1264; fixes #1248). +- Release unread responses from the optional Google-token probe so keyless + browser validation can settle; the Overpass gate recognizes only that probe's + expected 404 as an unavailable capability (asturksever, #1264). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 001967ce3..f59f6c5d9 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -4557,6 +4557,12 @@ Retry-After; absent delays back off from 30 seconds to five minutes. Empty remain. Malformed capability-probe responses remain unknown and are retried after the existing 30-second backoff; valid configured decisions remain memoized. Consumer capability misses never schedule automatic retries. +Keyless browser validation also probes the optional Google tiles-token route. +The token client cancels rejected response bodies before returning unavailable, +so they do not remain pending in browser network observation. The Overpass gate +accepts only that same-origin route's expected 404 console diagnostic; other +HTTP and JavaScript errors still fail acceptance. + Operator-configured Overpass area and focus-footprint queries use body-level `out geom` (with `center` for focus), preserving relation member outlines. Member geometry is printed only inside a box around the point (6 km for diff --git a/scripts/qa-overpass-offload.mjs b/scripts/qa-overpass-offload.mjs index e04a05b86..8f6594011 100644 --- a/scripts/qa-overpass-offload.mjs +++ b/scripts/qa-overpass-offload.mjs @@ -306,7 +306,16 @@ try { await observeNetwork(page); page.on('pageerror', (error) => result.errors.push(error.message)); page.on('console', (message) => { - if (message.type() === 'error' && result.consoleErrors.length < 30) + if (message.type() !== 'error') return; + // A keyless server does not offer optional Google tokens. Keep every other + // HTTP or JavaScript error visible, including failures of this route other + // than its expected capability-miss 404. + const optionalTokenMiss = + message.location().url === new URL('/api/google/tiles-token', url).href && + /^Failed to load resource: the server responded with a status of 404\b/.test( + message.text(), + ); + if (!optionalTokenMiss && result.consoleErrors.length < 30) result.consoleErrors.push(message.text()); }); page.on('requestfailed', (request) => { diff --git a/src/maps/googleTokens.js b/src/maps/googleTokens.js index 7896c8f5c..884c5b199 100644 --- a/src/maps/googleTokens.js +++ b/src/maps/googleTokens.js @@ -38,7 +38,10 @@ export function createGoogleTokenSource({ headers: { Accept: 'application/json' }, cache: 'no-store', }); - if (!response.ok) return null; + if (!response.ok) { + await response.body?.cancel(); + return null; + } return parseToken(await response.json(), now()); } catch { return null; diff --git a/src/maps/googleTokens.test.mjs b/src/maps/googleTokens.test.mjs index 87b7cf8dc..d8a1e84ed 100644 --- a/src/maps/googleTokens.test.mjs +++ b/src/maps/googleTokens.test.mjs @@ -50,6 +50,23 @@ test('requests refused for the same token renew it once', async () => { assert.equal(calls.length, 2); }); +test('a refused token response releases its unread body before returning', async () => { + for (const status of [404, 429, 500]) { + let cancelled = false; + const response = new Response( + new ReadableStream({ + cancel() { + cancelled = true; + }, + }), + { status }, + ); + const tokens = createGoogleTokenSource({ fetchImpl: async () => response }); + assert.equal(await tokens.token(), null); + assert.equal(cancelled, true, `HTTP ${status} body released`); + } +}); + test('a server that does not offer tokens yields none', async () => { for (const answer of [ new Response('Not found', { status: 404 }), From 69a87fe23807a3132b58e653ed947b1024c63083 Mon Sep 17 00:00:00 2001 From: Said Turksever Date: Tue, 20 Oct 2026 00:44:51 +0100 Subject: [PATCH 12/45] test: observe aircraft arrival before idle refresh --- .../1264-overpass-request-admission.md | 3 + docs/CURRENT-STATE.md | 2 +- scripts/format-scope.json | 3 +- scripts/track-regression.mjs | 85 ++++------ src/tooling/trackArrivalObservation.mjs | 100 ++++++++++++ src/tooling/trackArrivalObservation.test.mjs | 151 ++++++++++++++++++ 6 files changed, 291 insertions(+), 53 deletions(-) create mode 100644 src/tooling/trackArrivalObservation.mjs create mode 100644 src/tooling/trackArrivalObservation.test.mjs diff --git a/changelog.d/1264-overpass-request-admission.md b/changelog.d/1264-overpass-request-admission.md index e49322df1..c5e763e30 100644 --- a/changelog.d/1264-overpass-request-admission.md +++ b/changelog.d/1264-overpass-request-admission.md @@ -4,3 +4,6 @@ - Release unread responses from the optional Google-token probe so keyless browser validation can settle; the Overpass gate recognizes only that probe's expected 404 as an unavailable capability (asturksever, #1264). +- Make tracking arrival checks respect the aircraft update cadence while checking + orientation on the first reveal, avoiding false failures at faster render + rates (asturksever, #1264). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index f59f6c5d9..16817cd44 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -5011,7 +5011,7 @@ pins and share links already supply complete boxes. - Fleet model eligibility is distance-based with on-screen priority and hard caps (`MODEL_MAX`, `MODEL_MAX_ALL`) to avoid draw-call explosions. Each model owns its own `modelMatrix`; shared scratch matrices are forbidden because they caused stacking/flicker. - Tracked aircraft use standalone model primitives driven from the already-settled dead-reckoned display position, while the tracked Cesium entity remains billboard-backed so `viewer.trackedEntity` always has a ready bounding sphere. - Flights and military layers mirror the same tracking invariants: no warm-up freeze/jump, altitude-scaled framing, trail head glued to the displayed plane, no pull-out when switching targets, and no cross-layer orphan when switching between commercial and military tracks. -- Regression surface: `npm run test:track` drives the real app headless with synthetic aircraft feeds and asserts the tracking invariants without depending on live OpenSky/adsb data. `src/data/trackedModelRegime.test.mjs` pins the tracked contact's threshold math, the enter/exit asymmetry, and the default-on / cockpit / TR-3B / deselect wiring in both layers. +- Regression surface: `npm run test:track` drives the real app headless with synthetic aircraft feeds and asserts the tracking invariants without depending on live OpenSky/adsb data. Arrival-rotation checks observe the first reveal within a bounded wall-clock window before the one-second idle fallback, rather than assuming the 80 ms fleet cadence fits inside four rendered frames; an incorrect first orientation fails immediately. `src/data/trackedModelRegime.test.mjs` pins the tracked contact's threshold math, the enter/exit asymmetry, and the default-on / cockpit / TR-3B / deselect wiring in both layers. ### TR-3B conversion Easter egg (August 2026) diff --git a/scripts/format-scope.json b/scripts/format-scope.json index c7a95e6e3..690a33f3e 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1071,5 +1071,6 @@ "src/tooling/changelogFragments.test.mjs", "src/data/gbfsProxyRateLimit.test.mjs", "src/terrainHeightsBounds.test.mjs", - "server/providers/overpass/requestAdmission.test.mjs" + "server/providers/overpass/requestAdmission.test.mjs", + "src/tooling/trackArrivalObservation.test.mjs" ] diff --git a/scripts/track-regression.mjs b/scripts/track-regression.mjs index 756daccfc..044fdf74f 100644 --- a/scripts/track-regression.mjs +++ b/scripts/track-regression.mjs @@ -94,6 +94,7 @@ import fs from 'node:fs'; import puppeteer from 'puppeteer'; +import { arrivalRotationPassed } from '../src/tooling/trackArrivalObservation.mjs'; import { classifyAircraft, CLASS_SCALE_3D, CLASS_MODEL_REAL } from '../src/data/aircraftClass.js'; import { ensureGeoidReady, geoidHeight } from '../src/data/geoid.js'; @@ -2695,16 +2696,17 @@ async function main() { // reappear wearing its stale/creation-north nose for up to 1 s). // Staged deterministically: park the camera nadir over the synthetic // cluster, let rotations settle, TAMPER a billboard's rotation, then - // trigger each path with the camera idle. The idle-drift catch-up - // (ROTATION_REFRESH_MS = 1 s) can coincidentally mask a regression in a - // ~300 ms SwiftShader frame window, so a regression shows as an - // intermittent (not guaranteed) failure — never a false failure. + // trigger each path with the camera idle. The fleet runs every 80 ms, + // independently of rendered FPS. Observe the first completed settle and + // reveal frames within 500 ms of forcing moveEnd, before the 1 s idle + // rotation refresh can repair an incorrect first reveal. // ============================================================ console.log('\nChange 4 — arrival rotation: moveEnd settle pass + horizon-reveal pass'); const arrival = await evalPage(async () => { const v = window.__godsEyeView.viewer; const dm = window.__godsEyeView.dataManager; const { screenProjectedRotation } = await import(`${window.__gevQaSourceBase || '/src'}/data/iconOrientation.js`); + const { observeArrivalRotation } = await import(`${window.__gevQaSourceBase || '/src'}/tooling/trackArrivalObservation.mjs`); // 3D models OFF for this phase: a model-handed-off billboard is hidden // and skips rotation updates entirely — the probes need live billboards // (this is also the app's default state the field report came from). @@ -2766,39 +2768,29 @@ async function main() { const bb = findBB(id); if (!bb || !bb.show) return { error: `${id} missing/hidden` }; const r0 = bb.rotation; // settled tamper origin; correctness uses a fresh projection below - // (a) settle pass: tamper, then raise moveEnd with the camera IDLE — - // the pose signature is unchanged, so only the moveEnd hook can fix - // this before the 1 s catch-up. - bb.rotation = r0 + 1.5; - v.camera.moveEnd.raiseEvent(); - await nextFrames(2); - const afterMoveEnd = bb.rotation; - // A real-GPU fleet tick can land near the edge of the frame budget and - // advance the contact before the probe reads it. Compare with the - // production projection at the CURRENT position, not the now-stale r0. - const expectedMoveEnd = screenProjectedRotation(v.scene, bb.position, course, null); - // (b) reveal pass: tamper + hide — the next fleet tick must flip it - // visible AND correct the nose in that same tick (camera still idle, - // no moveEnd raised). Diagnostic fields (round 5): record WHICH frame - // the flip landed on (flipFrame; -1 = never within the extended - // window) and whether a 3D model owns this id — distinguishes "tick - // slow under load" from "occluder says hidden" from "model handoff". - bb.rotation = r0 + 1.5; - bb.show = false; - let flipFrame = -1; - for (let f = 1; f <= 6; f++) { - await nextFrames(1); - if (bb.show && flipFrame === -1) flipFrame = f; - if (f >= 2 && flipFrame !== -1) break; - } - const expectedReveal = screenProjectedRotation(v.scene, bb.position, course, null); + const observed = await observeArrivalRotation({ + scene: v.scene, + startMoveEnd() { + // Only moveEnd can repair the tampered angle at the idle pose. + bb.rotation = r0 + 1.5; + v.camera.moveEnd.raiseEvent(); + }, + startReveal() { + // Hide immediately after the confirmed settle frame. The next + // eligible fleet tick must reveal AND re-aim in that same tick. + bb.rotation = r0 + 1.5; + bb.show = false; + }, + read() { + return { + shown: bb.show, + rotationError: angDiff(bb.rotation, + screenProjectedRotation(v.scene, bb.position, course, null)), + }; + }, + }); const hasModel = !!(window.__g3dFindModel && window.__g3dFindModel(id)); - return { - r0, - dMoveEnd: angDiff(afterMoveEnd, expectedMoveEnd), - dReveal: angDiff(bb.rotation, expectedReveal), - shown: bb.show, flipFrame, hasModel, - }; + return { r0, ...observed, hasModel }; }; const flightCourse = window.__SYNTH.flights.find((f) => f.icao === 'aaa002')?.track ?? 0; const militaryCourse = window.__SYNTH.military.find((m) => m.hex === 'bbb101')?.track ?? 0; @@ -2807,22 +2799,13 @@ async function main() { military: await probe('bbb101', militaryCourse), }; }); - const fmtArr = (a) => (!a ? `no result (${arrival?.error || 'phase error'})` : a.error ? a.error - : `settle-err=${(a.dMoveEnd * 180 / Math.PI).toFixed(1)}° reveal-err=${(a.dReveal * 180 / Math.PI).toFixed(1)}° shown=${a.shown} flipFrame=${a.flipFrame} hasModel=${a.hasModel}`); + const fmtArr = (a) => (!a ? `no result (${arrival?.error || 'phase error'})` : a.error ? `${a.error}; elapsed=${Number(a.elapsedMs).toFixed(1)} ms` + : `settle-err=${(a.dMoveEnd * 180 / Math.PI).toFixed(1)}° reveal-err=${(a.dReveal * 180 / Math.PI).toFixed(1)}° shown=${a.shown} flipFrame=${a.flipFrame} settle=${a.moveEndMs.toFixed(1)} ms reveal=${a.revealMs.toFixed(1)} ms total=${a.elapsedMs.toFixed(1)} ms hasModel=${a.hasModel}`); const TAMPER_DEG = 1.5 * 180 / Math.PI; // ≈ 86° — an uncorrected nose stays this far off - // Reveal budget re-pinned 2 → 4 frames (round 5): the diagnostic probe - // shows the military flip consistently lands on frame 2 — the exact edge - // of the old budget — so any load hiccup flaked it (flights lands frame - // 1). The regression this protects against is a reveal that waits for - // the 1 s idle catch-up (~30-60 frames) or never re-aims; 4 frames still - // catches that with a wide margin, with zero-headroom flakes gone. - const arrOk = (a) => !!a && !a.error && a.shown - && (a.flipFrame === -1 ? false : a.flipFrame <= 4) - && a.dMoveEnd * 180 / Math.PI < 10 && a.dReveal * 180 / Math.PI < 10; - record(`arrival: moveEnd + reveal both re-aim within 4 frames, flights (tamper was ${TAMPER_DEG.toFixed(0)}°)`, - arrOk(arrival.flights), fmtArr(arrival.flights)); - record(`arrival: moveEnd + reveal both re-aim within 4 frames, military (tamper was ${TAMPER_DEG.toFixed(0)}°)`, - arrOk(arrival.military), fmtArr(arrival.military)); + record(`arrival: moveEnd + first reveal both re-aim before idle refresh, flights (tamper was ${TAMPER_DEG.toFixed(0)}°)`, + arrivalRotationPassed(arrival.flights), fmtArr(arrival.flights)); + record(`arrival: moveEnd + first reveal both re-aim before idle refresh, military (tamper was ${TAMPER_DEG.toFixed(0)}°)`, + arrivalRotationPassed(arrival.military), fmtArr(arrival.military)); // ============================================================ // DISPLAY FLOOR (2026-08-19): a grounded contact must never render below diff --git a/src/tooling/trackArrivalObservation.mjs b/src/tooling/trackArrivalObservation.mjs new file mode 100644 index 000000000..370624891 --- /dev/null +++ b/src/tooling/trackArrivalObservation.mjs @@ -0,0 +1,100 @@ +/** A reveal must beat the one-second idle rotation refresh, regardless of FPS. */ +export const ARRIVAL_OBSERVATION_MS = 500; + +/** + * Observe the first completed moveEnd frame and the first subsequent reveal. + * The deadline starts when moveEnd is forced, before its rotation baseline, so + * waiting for either frame cannot let the one-second idle refresh mask a bug. + * `read` snapshots visibility and rotation error against the current position. + */ +export function observeArrivalRotation({ + scene, + startMoveEnd, + startReveal, + read, + now = () => performance.now(), + setTimer = setTimeout, + clearTimer = clearTimeout, +}) { + return new Promise((resolve, reject) => { + const startedAt = now(); + let moveEnd = null; + let moveEndMs = null; + let revealFrames = 0; + let done = false; + let remove; + let timer; + const cleanup = () => { + done = true; + remove?.(); + clearTimer(timer); + }; + const finish = (result) => { + if (done) return; + cleanup(); + resolve(result); + }; + const expired = () => ({ + error: `arrival ${moveEnd ? 'reveal' : 'moveEnd'} observation exceeded ${ARRIVAL_OBSERVATION_MS} ms`, + elapsedMs: now() - startedAt, + moveEndMs, + flipFrame: -1, + }); + remove = scene.postRender.addEventListener(() => { + if (done) return; + try { + const elapsedMs = now() - startedAt; + if (elapsedMs >= ARRIVAL_OBSERVATION_MS) { + finish(expired()); + return; + } + const sample = read(); + if (moveEnd === null) { + moveEnd = sample; + moveEndMs = elapsedMs; + startReveal(); + } else { + revealFrames++; + if (sample.shown) { + // Keep the FIRST visible result, including a wrong angle. Never + // wait for a subsequent tick to repair a failed reveal. + finish({ + dMoveEnd: moveEnd.rotationError, + dReveal: sample.rotationError, + shown: sample.shown, + flipFrame: revealFrames, + moveEndMs, + revealMs: elapsedMs - moveEndMs, + elapsedMs, + }); + return; + } + } + scene.requestRender(); + } catch (error) { + cleanup(); + reject(error); + } + }); + timer = setTimer(() => finish(expired()), ARRIVAL_OBSERVATION_MS); + try { + startMoveEnd(); + scene.requestRender(); + } catch (error) { + cleanup(); + reject(error); + } + }); +} + +/** Test the captured frames without retrying a bad first observation. */ +export function arrivalRotationPassed(observation) { + return ( + !!observation && + !observation.error && + observation.shown === true && + observation.elapsedMs < ARRIVAL_OBSERVATION_MS && + (observation.dMoveEnd * 180) / Math.PI < 10 && + (observation.dReveal * 180) / Math.PI < 10 + ); +} diff --git a/src/tooling/trackArrivalObservation.test.mjs b/src/tooling/trackArrivalObservation.test.mjs new file mode 100644 index 000000000..7c140bf37 --- /dev/null +++ b/src/tooling/trackArrivalObservation.test.mjs @@ -0,0 +1,151 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { + ARRIVAL_OBSERVATION_MS, + arrivalRotationPassed, + observeArrivalRotation, +} from './trackArrivalObservation.mjs'; + +function fixture() { + let time = 0; + let state = { shown: true, rotationError: 0 }; + const listeners = new Set(); + const timers = new Map(); + let renders = 0; + let moveEnds = 0; + const observation = observeArrivalRotation({ + scene: { + postRender: { + addEventListener(listener) { + listeners.add(listener); + return () => listeners.delete(listener); + }, + }, + requestRender() { + renders++; + }, + }, + startMoveEnd() { + moveEnds++; + state.rotationError = 1.5; + }, + startReveal() { + state = { shown: false, rotationError: 1.5 }; + }, + read: () => ({ ...state }), + now: () => time, + setTimer(callback, delay) { + const handle = {}; + timers.set(handle, { callback, at: time + delay }); + return handle; + }, + clearTimer(handle) { + timers.delete(handle); + }, + }); + return { + observation, + frame(at, nextState) { + time = at; + state = { ...state, ...nextState }; + for (const listener of [...listeners]) listener(); + }, + expire(at) { + time = at; + for (const timer of [...timers.values()]) + if (timer.at <= at) timer.callback(); + }, + get resources() { + return { + listeners: listeners.size, + timers: timers.size, + renders, + moveEnds, + }; + }, + }; +} + +test('80 ms fleet scheduling passes after more than four fast rendered frames', async () => { + const f = fixture(); + f.frame(8, { shown: true, rotationError: 0 }); + // The forced fleet tick was at 8 ms. A 125 FPS renderer can complete nine + // more frames before the next 80 ms fleet interval becomes eligible. + for (let at = 16; at < 88; at += 8) f.frame(at); + f.frame(88, { shown: true, rotationError: 0 }); + const result = await f.observation; + assert.equal(result.flipFrame, 10); + assert.equal(result.moveEndMs, 8); + assert.equal(result.revealMs, 80); + assert.equal(result.elapsedMs, 88); + assert.equal(arrivalRotationPassed(result), true); + assert.equal(f.resources.listeners, 0); + assert.equal(f.resources.timers, 0); + assert.equal(f.resources.moveEnds, 1); +}); + +test('a wrong first visible angle fails even if the next frame corrects it', async () => { + const f = fixture(); + f.frame(8, { shown: true, rotationError: 0 }); + f.frame(88, { shown: true, rotationError: 1.5 }); + f.frame(96, { shown: true, rotationError: 0 }); + const result = await f.observation; + assert.equal(result.dReveal, 1.5); + assert.equal(result.flipFrame, 1); + assert.equal(result.elapsedMs, 88); + assert.equal(arrivalRotationPassed(result), false); +}); + +test('a wrong first moveEnd angle is retained rather than repaired by reveal', async () => { + const f = fixture(); + f.frame(8, { shown: true, rotationError: 1.5 }); + f.frame(88, { shown: true, rotationError: 0 }); + const result = await f.observation; + assert.equal(result.dMoveEnd, 1.5); + assert.equal(arrivalRotationPassed(result), false); +}); + +test('no reveal fails at a deadline before the one-second idle catch-up', async () => { + const f = fixture(); + assert.equal(ARRIVAL_OBSERVATION_MS, 500); + f.frame(8, { shown: true, rotationError: 0 }); + f.frame(480); + f.expire(500); + const result = await f.observation; + assert.match(result.error, /reveal.*500 ms/); + assert.equal(arrivalRotationPassed(result), false); + assert.equal(f.resources.listeners, 0); + assert.equal(f.resources.timers, 0); + f.frame(1000, { shown: true, rotationError: 0 }); + assert.equal(result.flipFrame, -1); +}); + +test('a late visible frame fails even if the timeout callback is delayed', async () => { + const f = fixture(); + f.frame(8, { shown: true, rotationError: 0 }); + f.frame(501, { shown: true, rotationError: 0 }); + const result = await f.observation; + assert.match(result.error, /reveal.*500 ms/); + assert.equal(result.elapsedMs, 501); + assert.equal(arrivalRotationPassed(result), false); +}); + +test('the deadline includes moveEnd setup rather than restarting when hidden', async () => { + const f = fixture(); + f.frame(400, { shown: true, rotationError: 0 }); + f.frame(600, { shown: true, rotationError: 0 }); + const result = await f.observation; + assert.equal(result.moveEndMs, 400); + assert.equal(result.elapsedMs, 600); + assert.equal(arrivalRotationPassed(result), false); +}); + +test('missing moveEnd frames fail without waiting for a render callback', async () => { + const f = fixture(); + f.expire(500); + const result = await f.observation; + assert.match(result.error, /moveEnd.*500 ms/); + assert.equal(arrivalRotationPassed(result), false); + assert.equal(f.resources.listeners, 0); + assert.equal(f.resources.timers, 0); +}); From 86ae5e9cf46680893147e57f24cc85db6d715ac0 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 20 Oct 2026 13:02:48 +0400 Subject: [PATCH 13/45] fix(sky): blur the faint Milky Way glow wider so unresolved stars leave no clumps The fine 0.4 degree blur kept the residual glow of unresolved stars as mottled patches at the band's edges. Blend towards a 2 degree blur where the coarse copy is faint (smoothstep over 0.5-8 % of the range), so the core keeps its dust lanes and the faint sky goes smooth. Faces 85 -> 62 kB. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1243-starfield-sky.md | 2 +- scripts/build-milky-way.mjs | 39 ++++++++++++++++++++++- src/data/local_data/sky/README.md | 5 +-- src/data/local_data/sky/milkyway_nx.webp | Bin 9118 -> 4638 bytes src/data/local_data/sky/milkyway_ny.webp | Bin 23212 -> 19124 bytes src/data/local_data/sky/milkyway_nz.webp | Bin 19634 -> 15880 bytes src/data/local_data/sky/milkyway_px.webp | Bin 5478 -> 3434 bytes src/data/local_data/sky/milkyway_py.webp | Bin 15028 -> 10138 bytes src/data/local_data/sky/milkyway_pz.webp | Bin 12354 -> 8264 bytes src/tooling/skyAssets.test.mjs | 9 ++++++ 10 files changed, 51 insertions(+), 4 deletions(-) diff --git a/changelog.d/1243-starfield-sky.md b/changelog.d/1243-starfield-sky.md index 7d4557672..d3ecbaf95 100644 --- a/changelog.d/1243-starfield-sky.md +++ b/changelog.d/1243-starfield-sky.md @@ -2,4 +2,4 @@ Yale Bright Star Catalogue, drawn as sharp points at their catalogue positions for the scene clock, over a soft Milky Way built from ESO/S. Brunier's panorama (CC BY 4.0). The Sun and Moon stay, the anime style fades - the Milky Way out, and the new assets weigh 319 kB (gekh, #1243). + the Milky Way out, and the new assets weigh 296 kB (gekh, #1243). diff --git a/scripts/build-milky-way.mjs b/scripts/build-milky-way.mjs index 5e5d3d253..e0703f882 100644 --- a/scripts/build-milky-way.mjs +++ b/scripts/build-milky-way.mjs @@ -23,7 +23,8 @@ * sit where today's sky has nothing and are far brighter than any star. * 4. Blur with a three-pass box approximation of a Gaussian, σ = BLUR_DEG on * the sky: rows wrap in longitude and widen by 1/cos(latitude) so the - * blur stays round towards the poles. + * blur stays round towards the poles. Faint glow blends to a second, + * FAINT_BLUR_DEG blur, so it carries no clumps of unresolved stars. * 5. Resample into six FACE_SIZE² cube faces in the standard WebGL face * orientation (the renderer uploads them without flipY), with the ICRF * axes as the cube axes — +X to the March equinox, +Z to the north @@ -43,6 +44,12 @@ import { fileURLToPath } from 'node:url'; export const FACE_SIZE = 1024; export const BLUR_DEG = 0.4; +// Faint glow takes a much wider blur: there the panorama is grain of +// unresolved stars, which a 0.4° blur leaves as clumps. Bright parts keep the +// fine blur and their dust lanes; FAINT_RANGE (fraction of black-to-white) +// is where the two blend. +export const FAINT_BLUR_DEG = 2; +const FAINT_RANGE = [0.005, 0.08]; const WORK_WIDTH = 4096; const OPEN_RADIUS = 3; const WEBP_QUALITY = 96; @@ -300,6 +307,26 @@ export function softBlack(x, knee = SOFT_KNEE) { return x <= 0 ? 0 : (x * x) / (x + knee); } +export function smoothstep(edge0, edge1, x) { + const t = Math.min(Math.max((x - edge0) / (edge1 - edge0), 0), 1); + return t * t * (3 - 2 * t); +} + +/** + * Per pixel, keep `fine` where `weight(luminance of coarse)` is 1 and take + * `coarse` where it is 0, blending in between. The weight follows the coarse + * copy, so it is smooth itself and draws no seams along dark lanes. Writes + * into `fine`. + */ +function blendByBrightness(fine, coarse, weight) { + const [r] = fine; + for (let i = 0; i < r.length; i++) { + const w = weight((coarse[0][i] + coarse[1][i] + coarse[2][i]) / 3); + for (let c = 0; c < 3; c++) + fine[c][i] = coarse[c][i] + (fine[c][i] - coarse[c][i]) * w; + } +} + /** Value at `fraction` of the sorted luminance. */ function luminancePercentile(planes, fraction) { const [r, g, b] = planes; @@ -342,9 +369,19 @@ async function main() { // After the opening: it sinks the starry sky to the dark gaps between // stars, and a fill taken before it would stay brighter than the sky. for (const planet of PLANETS) paintOut(planes, width, height, planet); + const wide = planes.map((plane) => Float32Array.from(plane)); for (const plane of planes) blurPlane(plane, width, height, sigmaPx); + for (const plane of wide) + blurPlane(plane, width, height, (FAINT_BLUR_DEG / 180) * height); const black = luminancePercentile(planes, BLACK_PERCENTILE); const white = luminancePercentile(planes, WHITE_PERCENTILE); + blendByBrightness(planes, wide, (luminance) => + smoothstep( + FAINT_RANGE[0], + FAINT_RANGE[1], + (luminance - black) / (white - black), + ), + ); let total = 0; for (const face of CUBE_FACES) { const pixels = Buffer.alloc(FACE_SIZE * FACE_SIZE * 3); diff --git a/src/data/local_data/sky/README.md b/src/data/local_data/sky/README.md index 175542da5..e20b1fb77 100644 --- a/src/data/local_data/sky/README.md +++ b/src/data/local_data/sky/README.md @@ -8,7 +8,7 @@ whole-globe view and show compression blocks. | File | Content | Size | | ---- | ------- | ---- | | `bright_stars.json` | 9,096 stars: J2000 RA/Dec, V magnitude, B−V | 235 KB | -| `milkyway_{px,nx,py,ny,pz,nz}.webp` | Milky Way glow, six 1024² cube faces, no stars | 85 KB | +| `milkyway_{px,nx,py,ny,pz,nz}.webp` | Milky Way glow, six 1024² cube faces, no stars | 62 KB | ## Stars — Yale Bright Star Catalogue @@ -44,7 +44,8 @@ Centre. **Changes made** (CC BY 4.0 asks for them to be stated): resampled to 4096×2048, stars removed with a 7×7 morphological opening, two planets (Jupiter, by position) painted over with the median of the surrounding sky, -blurred (σ = 0.4°), reprojected from galactic coordinates to ICRF cube faces, +blurred (σ = 0.4°, blending to σ = 2° in the faint glow so unresolved +stars leave no clumps), reprojected from galactic coordinates to ICRF cube faces, black level set at the median sky with a soft knee (the faint glow away from the galactic plane fades to black), gamma-encoded and saved as WebP. Build: diff --git a/src/data/local_data/sky/milkyway_nx.webp b/src/data/local_data/sky/milkyway_nx.webp index 9c75115c513f0cc1b79c690018d4434858504772..fb14fb996abdb5682b8fbd45603a7bd448fff628 100644 GIT binary patch literal 4638 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 a;*58%DaZSsBdJZeXoKjHrQQqp@B2R=;zJMs diff --git a/src/data/local_data/sky/milkyway_ny.webp b/src/data/local_data/sky/milkyway_ny.webp index a85f3d47e2a864284f64c047109510208b3938a4..fb0a48760534f7441499320af9aff841ea82c674 100644 GIT binary patch literal 19124 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 fMH688yZ}_K!D;yn1Vl269oHt*R|A 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 literal 19634 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 Peck$eGHpLqu+#nqZ73H4 literal 5478 zcmZWrby$<{*B>b*jXLQNN2jBEbccYHV<1RKN=P@1(WSybq*J;@T0%fN1QY@3md=;b zufOZvU(a>ze$IW)`P8E!FC$|_1_0a`lScr~moq z*z~6dGb5FXl$*<`$VI&hh`~R_O+q|d$g(RXVo8F^bM7cs%*=h(SaYqpxmpKXUvBl; zzjux>tz8zmZYlzB>%T5%PtN76gl|fh^x~n7wq}FpM-dloPh9rPpU3*zs_k-+Cl42) zb=(Pu57?M7V%A)%e;xHtZj5DEjv+_?3}%m?#x6!?JayIa#btc&<%gviWnNspP{Rcx zqnm}+O5YT?=+@0Qu1m$RG6CgsFC$24FmMF29db3#<@TCCO5L7fjiViszFH(Pd@g62 z-^0G=?<5_z5Qsxl%G~AQ_QOU`?rvbhXZbBtO-Dm`6$!yjTTcpiCavYgu{EyYSYs4l zU`mz5tv|4&*4G&7S7EXe6#@W6lT-R1LT zHRZWAc?GrW5xT%vm~kLoAC8c0+#i%HEOt$hK~2t5DXrb-7AxE>1I`9REGk$bAwkj) z6?Qg@C}`>wd`;^(ex)%SXYdZejW

${escapeMarkup(t('Clouds are preserved from the source imagery.'))}

+

${escapeMarkup(t(' Clouds are preserved from the source imagery.'))}

`; const refs = collectPanelReferences(panel); diff --git a/src/hudLocalityFormat.js b/src/hudLocalityFormat.js index 4a82fdbb3..84278564b 100644 --- a/src/hudLocalityFormat.js +++ b/src/hudLocalityFormat.js @@ -35,7 +35,16 @@ export const LOCALIZED_LOCALITY = Object.freeze({ }), sector: ({ latDeg, lonDeg }) => t('SECTOR {lat} {lon}', { - lat: hudCoordinate(latDeg, t('N'), t('S')), - lon: hudCoordinate(lonDeg, t('E'), t('W')), + // Hemisphere letters, not compass words: 21.33N, never 21.33北. + lat: hudCoordinate( + latDeg, + t('N', { context: 'hemisphere' }), + t('S', { context: 'hemisphere' }), + ), + lon: hudCoordinate( + lonDeg, + t('E', { context: 'hemisphere' }), + t('W', { context: 'hemisphere' }), + ), }), }); diff --git a/src/i18n/i18n.test.mjs b/src/i18n/i18n.test.mjs index a662130a1..70eaf7e86 100644 --- a/src/i18n/i18n.test.mjs +++ b/src/i18n/i18n.test.mjs @@ -35,6 +35,12 @@ test('normalizeLocale folds regional variants and rejects unshipped tags', () => assert.equal(normalizeLocale(' RU '), 'ru'); assert.equal(normalizeLocale('en_GB'), 'en'); assert.equal(normalizeLocale('xx'), null); + // Simplified Chinese by default; Traditional tags wait for zh-TW. + assert.equal(normalizeLocale('zh'), 'zh-CN'); + assert.equal(normalizeLocale('zh-CN'), 'zh-CN'); + assert.equal(normalizeLocale('zh-Hans-SG'), 'zh-CN'); + assert.equal(normalizeLocale('zh-TW'), null); + assert.equal(normalizeLocale('zh-Hant-HK'), null); assert.equal(normalizeLocale(undefined), null); }); diff --git a/src/i18n/index.js b/src/i18n/index.js index ccc54a5e6..d5698aa5b 100644 --- a/src/i18n/index.js +++ b/src/i18n/index.js @@ -18,8 +18,9 @@ import { } from './locale.js'; import es from './locales/es.json' with { type: 'json' }; import ru from './locales/ru.json' with { type: 'json' }; +import zhCN from './locales/zh-CN.json' with { type: 'json' }; -const CATALOGS = Object.freeze({ es, ru }); +const CATALOGS = Object.freeze({ es, ru, 'zh-CN': zhCN }); let currentLocale = DEFAULT_LOCALE; diff --git a/src/i18n/locale.js b/src/i18n/locale.js index 626303ad7..fab95e5cc 100644 --- a/src/i18n/locale.js +++ b/src/i18n/locale.js @@ -8,25 +8,32 @@ export const LOCALE_STORAGE_KEY = 'gev:locale:v1'; export const DEFAULT_LOCALE = 'en'; /** Shipped locales; order does not matter. Adding one: docs/TRANSLATORS.md. */ -export const LOCALES = Object.freeze(['en', 'es', 'ru']); +export const LOCALES = Object.freeze(['en', 'es', 'ru', 'zh-CN']); /** Each locale named in its own language, for the selector. */ export const LOCALE_NAMES = Object.freeze({ en: 'English', es: 'Español', ru: 'Русский', + 'zh-CN': '简体中文', }); /** Right-to-left locales. */ const RTL_LOCALES = Object.freeze([]); /** - * Map any language tag to a shipped locale: 'ru-RU' and 'RU' → 'ru'. + * Map any language tag to a shipped locale: 'ru-RU' and 'RU' → 'ru', + * 'zh', 'zh-CN' and 'zh-Hans-SG' → 'zh-CN'. * @returns {string|null} */ export function normalizeLocale(candidate) { if (typeof candidate !== 'string') return null; - const primary = candidate.trim().toLowerCase().split(/[-_]/)[0]; + const [primary, ...rest] = candidate.trim().toLowerCase().split(/[-_]/); + // Traditional Chinese readers are not given Simplified: no zh-TW yet. + if (primary === 'zh') + return rest.some((part) => ['hant', 'tw', 'hk', 'mo'].includes(part)) + ? null + : 'zh-CN'; return LOCALES.includes(primary) ? primary : null; } diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index f93f42070..b0d4dbef5 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -1096,7 +1096,7 @@ "FIELD REPORTS · {count}": "INFORMES DE CAMPO · {count}", "GEOLOCATIONS · {credit}": "GEOLOCALIZACIONES · {credit}", "↗ OPEN PUBLIC MAP": "↗ ABRIR MAPA PÚBLICO", - "Clouds are preserved from the source imagery.": "Las nubes provienen de las imágenes de origen.", + " Clouds are preserved from the source imagery.": " Las nubes provienen de las imágenes de origen.", "Show the Nepal context callout without a border or country fill": "Muestra la etiqueta de contexto de Nepal sin frontera ni relleno del país", "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "Presenta Nepal, dibuja su frontera y luego revela el incidente del Bhote Koshi", "CITIES": "CIUDADES", @@ -2890,5 +2890,9 @@ "USB work abandoned after a stalled transfer": "Trabajo USB cancelado tras una transferencia bloqueada", "SDR decoder did not start; receiver stopped": "El decodificador SDR no arrancó; receptor detenido", "SDR decoder stopped responding; receiver stopped": "El decodificador SDR dejó de responder; receptor detenido", - "SDR decoder fell behind; receiver stopped": "El decodificador SDR se quedó atrás; receptor detenido" + "SDR decoder fell behind; receiver stopped": "El decodificador SDR se quedó atrás; receptor detenido", + "hemisphere|N": "N", + "hemisphere|S": "S", + "hemisphere|E": "E", + "hemisphere|W": "O" } diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 6a58ab901..cce27c3d4 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -1110,7 +1110,7 @@ "FIELD REPORTS · {count}": "СООБЩЕНИЯ С МЕСТА · {count}", "GEOLOCATIONS · {credit}": "ГЕОЛОКАЦИИ · {credit}", "↗ OPEN PUBLIC MAP": "↗ ОТКРЫТЬ ПУБЛИЧНУЮ КАРТУ", - "Clouds are preserved from the source imagery.": "Облака оставлены такими, как на исходных снимках.", + " Clouds are preserved from the source imagery.": " Облака оставлены такими, как на исходных снимках.", "Show the Nepal context callout without a border or country fill": "Показать выноску с контекстом Непала без границы и заливки страны", "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "Представить Непал, нарисовать его границу, затем показать инцидент на Bhote Koshi", "CITIES": "ГОРОДА", @@ -2957,5 +2957,9 @@ "USB work abandoned after a stalled transfer": "Работа с USB прервана: передача данных зависла", "SDR decoder did not start; receiver stopped": "Декодер SDR не запустился; приёмник остановлен", "SDR decoder stopped responding; receiver stopped": "Декодер SDR перестал отвечать; приёмник остановлен", - "SDR decoder fell behind; receiver stopped": "Декодер SDR не успевает; приёмник остановлен" + "SDR decoder fell behind; receiver stopped": "Декодер SDR не успевает; приёмник остановлен", + "hemisphere|N": "С", + "hemisphere|S": "Ю", + "hemisphere|E": "В", + "hemisphere|W": "З" } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 3a5972058..0a56bc76a 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -7,12 +7,16 @@ }, "Those points are in a line — move one off it to enclose an area.": "这些点都在同一条直线上——请移开其中一个点才能围出面。", "That line has no length — click somewhere further away.": "这条线没有长度——请在更远处点击。", + " · {max}-point limit reached": " · 已达 {max} 个点上限", + "{measure} · double-click or Enter to finish, Backspace undoes, Esc cancels.{full}": "{measure} · 双击或按 Enter 完成,按 Backspace 撤销,按 Esc 取消。{full}", + "drawings on the map": "地图上的绘图", "That shape already has {count} points — finish it or press Backspace.": "该形状已有 {count} 个点——请完成绘制或按 Backspace。", "That point is off the globe — click on the world.": "该点在地球之外——请点击地球上的位置。", "That shape could not be placed.": "该形状无法放置。", "Could not place the shape: {error}": "无法放置形状:{error}", "Board cleared.": "画板已清除。", "{owner} is using the pointer — close it first.": "{owner} 正在使用指针——请先关闭它。", + "{label} · Detailed outline unavailable": "{label} · 无法获取详细轮廓", "Flying to Austin, TX...": "正在飞往德克萨斯州奥斯汀…", "Restoring shared view...": "正在恢复共享视图…", "Configuring viewer...": "正在配置视图…", @@ -20,6 +24,9 @@ "Loading the keyless globe...": "正在加载免密钥地球…", "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tiles 不可用({detail})。正在加载免密钥地球…", "Initializing systems...": "正在初始化系统…", + "Space Missions isolates replay data. Exit the mode to enable {layer}.": "太空任务模式会隔离回放数据。退出该模式后才能启用“{layer}”。", + "Data attribution": "数据来源说明", + "Data provided by:": "数据提供方:", "Close data attribution": "关闭数据来源说明", "Light aircraft": "轻型飞机", "Glider": "滑翔机", @@ -31,18 +38,86 @@ "Fast jet": "喷气战机", "Business jet": "公务机", "Drone": "无人机", + "General emergency": "一般紧急情况", + "Unlawful interference": "非法干扰", + "Radio failure": "无线电失效", + "Downed aircraft": "飞机坠毁", + "Minimum fuel": "最低油量", + "Lifeguard (medical priority)": "救护飞行(医疗优先)", + "Rasuwagadhi witness video": "Rasuwagadhi 目击视频", + "Bhote Koshi valley footage": "Bhote Koshi 河谷画面", + "Flood footage": "洪水画面", + "Compilation and casualty claims": "视频合集与伤亡说法", + "SOURCE GEOCONFIRMED · WORLD-PINNED": "来源已地理核实 · 已标定于地图", + "SOURCE CREDITED · LOCATION UNRESOLVED": "来源已署名 · 位置未确定", + "REFERENCE ONLY · CLAIMS UNVERIFIED": "仅供参考 · 说法未核实", + "SOURCE GEOCONFIRMED": "来源已地理核实", + "2021 historical reference versus 2026 post-event imagery; changes are cumulative and include the July 2025 Rasuwagadhi flood. Schematic downstream progression, not modeled arrival time; not an official hazard model.": "2021 年历史参考影像与 2026 年灾后影像对比;变化为累计结果,包含 2025 年 7 月的 Rasuwagadhi 洪水。下游演进为示意,并非模拟的到达时间;也不是官方灾害模型。", + "Immediate collapse viewpoint": "近距离崩塌观察点", + "Collapse viewpoint": "崩塌观察点", + "Debris-dammed lake": "碎屑堰塞湖", + "Dammed lake": "堰塞湖", + "Second landslide": "第二次滑坡", + "Gyirong border gate": "Gyirong 边境口岸", + "Border gate": "边境口岸", + "Timure evidence cluster": "Timure 证据群", + "Mailung / Upper Trishuli bridge": "Mailung / Upper Trishuli 桥", + "Dandagaun viewpoint restaurant": "Dandagaun 观景餐厅", + "Dandagaun viewpoint": "Dandagaun 观景点", + "Bidur - Trishuli bridge": "Bidur - Trishuli 桥", + "Bidur bridge": "Bidur 桥", + "Devighat / Taadi Khola Bridge": "Devighat / Taadi Khola 桥", + "Devighat bridge": "Devighat 桥", + "Facebook player API did not initialize.": "Facebook 播放器 API 未能初始化。", + "Facebook player API could not load.": "无法加载 Facebook 播放器 API。", + "Facebook player API timed out.": "Facebook 播放器 API 超时。", + "X embed API did not initialize.": "X 嵌入 API 未能初始化。", + "X embed could not load.": "无法加载 X 嵌入内容。", + "X embed timed out.": "X 嵌入内容超时。", "UNAVAILABLE": "不可用", + "TIMEOUT": "超时", + "BLOCKED": "被拦截", "SOURCE": "来源", + "Facebook embed unavailable. The post may be private, removed, region-restricted, or blocked.": "Facebook 嵌入内容不可用。该帖子可能为私密、已删除、受地区限制或被拦截。", + "Preloading {provider} media": "正在预加载 {provider} 媒体", + "LOADING X POST…": "正在加载 X 帖子…", + "The X post is unavailable or cannot be embedded.": "该 X 帖子不可用或无法嵌入。", + "X POST · PROVIDER CONTROLS": "X 帖子 · 平台控件", + "{reason} OPEN ORIGINAL.": "{reason} 请打开原始来源。", + "X embed unavailable": "X 嵌入内容不可用。", + "FACEBOOK · PROVIDER CONTROLS": "FACEBOOK · 平台控件", + "Facebook embed unavailable": "Facebook 嵌入内容不可用。", + "AUTOPLAY BLOCKED · USE PROVIDER CONTROLS": "自动播放被拦截 · 请使用平台控件", + "Embedded {provider} media for {source}": "{source} 的嵌入 {provider} 媒体", + "witness source": "目击来源", + "Witness source": "目击来源", + "{provider} · EMBEDDED SOURCE": "{provider} · 嵌入来源", + "OPEN ORIGINAL ↗": "打开原始来源 ↗", + "{provider} media: {source}": "{provider} 媒体:{source}", + "{provider} · PROVIDER CONTROLS": "{provider} · 平台控件", + "YOUTUBE {state} · OPEN ORIGINAL": "YOUTUBE {state} · 打开原始来源", + "INITIATION": "起始", + "DAMMING": "堰塞", + "SECONDARY FAILURE": "二次溃决", + "BORDER ARRIVAL": "抵达边境", + "PROPAGATION": "演进", + "DOWNSTREAM PASSAGE": "向下游推进", + "CONSEQUENCE": "后果", + "DOWNSTREAM CONSEQUENCE": "下游后果", "EVIDENCE": "证据", + "{year} HISTORICAL REFERENCE": "{year} 年历史参考", + "{year} POST-EVENT": "{year} 年灾后", "{count} GEOLOCATED SOURCE-MAP PLACEMENTS": { "other": "{count} 个地理定位来源点位" }, "NO PREVIEW": "无预览", + "YouTube source": "YouTube 来源", + "Facebook source": "Facebook 来源", "SOURCE LINK": "来源链接", "{publisher} / OPEN": "{publisher} / 打开", "Bhote Koshi flood reconstruction controls": "Bhote Koshi 洪水重构控制", "EVENT RECONSTRUCTION · 26 AUG 2026": "事件重构 · 2026-08-26", - "BHOTE KOSHI OUTBURST FLOOD": "BHOTE KOSHI 冰湖溃决洪水", + "BHOTE KOSHI OUTBURST FLOOD": "BHOTE KOSHI 溃决洪水", "Close event layer": "关闭事件图层", "OBSERVED IMAGERY": "实测影像", "SCHEMATIC CORRIDOR": "示意走廊", @@ -63,12 +138,13 @@ "↗ OPEN ORIGINAL": "↗ 打开原始来源", "⌖ LOWER GORGE": "⌖ 下游峡谷", "FIELD REPORTS · {count}": "现场报道 · {count}", + "GEOLOCATIONS · {credit}": "地理定位 · {credit}", "↗ OPEN PUBLIC MAP": "↗ 打开公共地图", - "Clouds are preserved from the source imagery.": " 云层按源影像原样保留。", + " Clouds are preserved from the source imagery.": "云层按源影像原样保留。", "Rasuwagadhi witness": "Rasuwagadhi 目击", "Open original source for {source}; capture time unverified": "打开 {source} 的原始来源;拍摄时间未核实", "Historical reference and post-event image divider": "历史参考与灾后影像的分割线", - "A historical reference {before} percent, B post-event {after} percent": "历史参考 {before}%,灾后 {after}%", + "A historical reference {before} percent, B post-event {after} percent": "A 历史参考 {before}%,B 灾后 {after}%", "■ RELEASE CAMERA": "■ 释放相机", "Seek Nepal scene clock": "定位尼泊尔场景时钟", "NEPAL SCENE CLOCK": "尼泊尔场景时钟", @@ -86,7 +162,7 @@ "{count} SOURCES": { "other": "{count} 个来源" }, - "OUTSIDE IMAGERY SWIPE": "影像范围外滑动", + "OUTSIDE IMAGERY SWIPE": "不在影像对比范围内", "{scene} / AUTHORED SHOT": "{scene} / 排定镜头", "NEPAL FLOOD INCIDENT": "尼泊尔洪水事件", "Play {shot}": "播放 {shot}", @@ -94,38 +170,103 @@ "Play reconstruction": "播放重构", "Load previous scene shot": "载入上一个场景镜头", "Load next scene shot": "载入下一个场景镜头", + "SCHEMATIC CORRIDOR, NOT MODELED ARRIVAL TIME.": "示意走廊,并非模拟的到达时间。", "Rasuwa · 26 Aug 2026": "Rasuwa · 2026-08-26", "Event reconstruction": "事件重构", + "BHOTE KOSHI FLOOD INCIDENT": "BHOTE KOSHI 洪水事件", + "NEPAL · 26 AUG 2026": "尼泊尔 · 2026-08-26", + "USGS INITIAL REPORT": "USGS 初始报告", + "26 AUG 2026 · 08:37 NPT": "2026-08-26 · 08:37 NPT", + "28.2710° N · 85.5150° E": "北纬 28.2710° · 东经 85.5150°", + "INITIAL M4.4 · RECLASSIFIED M5.2 LANDSLIDE": "初报 M4.4 · 重新归类为 M5.2 滑坡", + "USGS EVENT us7000tbwb · OPEN SOURCE": "USGS 事件 us7000tbwb · 打开来源", + "Open the USGS initial report for the 26 August 2026 Nepal landslide": "打开 USGS 关于 2026 年 8 月 26 日尼泊尔滑坡的初始报告", + "Show the Nepal context callout without a border or country fill": "显示尼泊尔背景标注,不绘制边界和国家填充", + "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "介绍尼泊尔,绘制其边界,再展示 Bhote Koshi 事件", + "CITIES": "城市", + "Keep the regional incident context and introduce nearby city labels": "保留区域事件背景,并加入附近城市标注", + "PLACES": "地点", + "Introduce the reconstruction scene key places from trigger to downstream": "依次介绍重构场景的关键地点,从触发点到下游", + "PATH": "路径", + "Animate the sourced cyan river-centerline route to Trishuli Bazaar": "以动画展示有来源依据的青色河道中线路径,直至 Trishuli Bazaar", + "OVERVIEW": "总览", + "Keep the completed flood path and location labels visible": "保持完整的洪水路径和地点标注可见", + "RECORD": "记录", + "Reveal the trigger record while making a slow camera approach": "镜头缓慢推近,同时展示触发事件记录", + "{speed} kn": "{speed} kn", + "That file is not valid JSON.": "该文件不是有效的 JSON。", + "That JSON file is not GeoJSON.": "该 JSON 文件不是 GeoJSON。", + "That FeatureCollection has no features list.": "该 FeatureCollection 没有 features 列表。", + "Every GeoJSON feature must have type Feature.": "每个 GeoJSON 要素的类型都必须是 Feature。", + "That GeoJSON has invalid geometries.": "该 GeoJSON 包含无效的几何图形。", + "That GeoJSON contains an unsupported geometry.": "该 GeoJSON 包含不受支持的几何图形。", + "That GeoJSON has invalid coordinates.": "该 GeoJSON 包含无效坐标。", + "That file creates more than {limit} map objects (the limit).": "该文件生成的地图对象超过上限 {limit} 个。", + "That file has more than {limit} style definitions and image links after cleanup (the limit).": "清理后,该文件的样式定义和图像链接仍超过上限 {limit} 个。", + "That file has more than {limit} features (the limit).": "该文件的要素超过上限 {limit} 个。", + "That file has more than {limit} points (the limit) across {features} features.": "该文件的点数超过上限 {limit} 个(共 {features} 个要素)。", + "That file has more than {limit} points (the limit).": "该文件的点数超过上限 {limit} 个。", + "That KMZ unpacks to more than the import limit.": "该 KMZ 解压后超过导入上限。", + "That KMZ is damaged and could not be unpacked.": "该 KMZ 已损坏,无法解压。", + "That KMZ is not a readable zip archive.": "该 KMZ 不是可读取的 zip 压缩包。", + "That KMZ uses a zip format this import does not read.": "该 KMZ 使用的 zip 格式无法导入。", + "That KMZ is encrypted.": "该 KMZ 已加密。", + "That KMZ uses a compression method this import does not read.": "该 KMZ 使用的压缩方式无法导入。", + "That KML has invalid geometry bounds.": "该 KML 的几何范围无效。", + "That KML has invalid coordinates.": "该 KML 包含无效坐标。", + "That GPX file has no document.": "该 GPX 文件没有 文档。", + "That {format} file is not valid XML.": "该 {format} 文件不是有效的 XML。", + "That file has an unreadable image or exceeds the 16-megapixel image limit.": "该文件包含无法读取的图像,或图像超过 1600 万像素上限。", + "That KML could not be read.": "无法读取该 KML。", + "That file has invalid point coordinates.": "该文件的点坐标无效。", + "Ground heights are not available for that file. Try again when the map has loaded.": "该文件无法获取地面高度。请在地图加载完成后重试。", + "That file took too long to read.": "读取该文件耗时过长。", + "Nothing to import.": "没有可导入的内容。", + "That file is larger than {size} MiB.": "该文件大于 {size} MiB。", + "Only GeoJSON, KML, KMZ and GPX files can be imported.": "只能导入 GeoJSON、KML、KMZ 和 GPX 文件。", + "That file has nothing to draw.": "该文件没有可在地图上绘制的内容。", + "That KMZ holds no KML document.": "该 KMZ 中没有 KML 文档。", + "That {format} file could not be read.": "无法读取该 {format} 文件。", + "That file has {count} map objects; the limit is {limit}.": "该文件有 {count} 个地图对象,上限为 {limit} 个。", + "Ground heights could not be read. Try that file again.": "无法读取地面高度。请重新导入该文件。", + "That file has invalid point graphics.": "该文件的点样式无效。", "Overpass rate-limited": "Overpass 已限流", "Overpass timed out": "Overpass 超时", "Overpass could not complete the query": "Overpass 无法完成查询", "Map tiles temporarily unavailable": "地图瓦片暂时不可用", "Mapped names temporarily unavailable": "地点名称暂时不可用", "Overpass temporarily unavailable": "Overpass 暂时不可用", - "Retrying mapped sites…": "正在重试地图站点…", - "Fetching mapped sites…": "正在获取地图站点…", + "Retrying mapped sites…": "正在重试加载地图标注设施…", + "Fetching mapped sites…": "正在获取地图标注设施…", "{reason} — retrying in {seconds}s": "{reason}——{seconds} 秒后重试", "{reason} — retry pending": "{reason}——等待重试", "Zoom in to search mapped installations": "请放大地图以搜索地图标注的设施", - "Showing cached mapped sites": "正在显示缓存的地图站点", - "Mapped sites not loaded": "地图站点未加载", - "Mapped sites loaded": "已加载地图站点", + "Showing cached mapped sites": "正在显示缓存的地图标注设施", + "Mapped sites not loaded": "地图标注设施未加载", + "Mapped sites loaded": "已加载地图标注设施", + "Military airfield": "军用机场", + "Naval base": "海军基地", + "Firing range": "靶场", + "Military land": "军事用地", "Mapped installation": "地图标注设施", + "Military area": "军事区域", + "flight": "航班", "military flight": "军用航班", + "satellite": "卫星", "feed unavailable": "数据源不可用", "feed stale": "数据源过期", - "observed or mapped nearby context": "附近有观测或地图标注的上下文", + "observed or mapped nearby context": "附近的观测或地图标注态势", "no observed or mapped objects in current feeds": "当前数据源中没有观测或地图标注的对象", "Draw": "绘制", "Directions": "路线导航", "Recent imagery": "近期影像", - "STATION": "电台", + "STATION": "空间站", "Crewed stations and their visiting vehicles": "载人空间站及其访问飞行器", "NAV": "导航", "GNSS navigation — GPS, GLONASS, Galileo": "GNSS 导航:GPS、GLONASS、Galileo", "GEO": "GEO", "Geostationary belt — comms and weather, fixed over the equator": "地球静止轨道带:通信和气象,固定在赤道上空", - "VISUAL": "可见", + "VISUAL": "目视可见", "Brightest naked-eye objects — CelesTrak visual group": "最亮的肉眼可见天体:CelesTrak visual 组", "COMMS": "通信", "Broadband constellation shell — shown only in DENSE mode": "宽带星座:仅在“密集”模式下显示", @@ -168,10 +309,10 @@ "NVG": "NVG", "FLIR": "FLIR", "ANIME": "动漫", - "NOIR": "黑色电影", + "NOIR": "黑白", "SNOW": "雪景", "ARCTIC": "北极", - "ANTARCTIC": "南极洲", + "ANTARCTIC": "南极", "NORTH AMERICA": "北美洲", "SOUTH AMERICA": "南美洲", "EUROPE": "欧洲", @@ -186,16 +327,51 @@ "PARTIAL": "部分", "FALLBACK": "备用", "{state} {layers}": "{state} {layers}", + "view band|STREET": "街道", + "view band|CITY": "城市", + "view band|METRO": "都市圈", + "view band|REGIONAL": "区域", + "view band|GLOBAL": "全球", "SUMMARY": "摘要", "Awaiting telemetry...": "等待遥测数据…", "REC": "REC", "AIS: --": "AIS: --", + "N/A": "无", + "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} {band} {locality} | {region} | ALT {alt} | 视窗 {window} | SUN {sun}° | ONA {ona}° | {zone}", + "NEAR {poi} ({city}) {distance}": "邻近 {poi}({city}){distance}", "SECTOR {lat} {lon}": "扇区 {lat} {lon}", + "N": "北", + "S": "南", + "E": "东", + "W": "西", "POWER UP · {count} KEYS WAITING": { - "other": "启动 · {count} 个密钥待配置" + "other": "增强 · {count} 个密钥待配置" }, - "POWERED UP": "已启动", + "POWERED UP": "已增强", + "Provider Settings does not answer proxied requests": "服务商设置不响应经代理的请求", + "Provider Settings is disabled while sharing is enabled": "启用共享时,服务商设置不可用", + "Provider Settings answers only the machine running the server": "服务商设置只响应运行服务器的本机", + "Provider Settings answers only local hostnames": "服务商设置只响应本地主机名", + "Provider Settings requires an exact local Origin": "服务商设置要求完全匹配的本地 Origin", + "Unrecognized Origin refused": "已拒绝无法识别的 Origin", + "Cross-origin requests are refused": "拒绝跨源请求", + "Content-Type must be application/json": "Content-Type 必须为 application/json", + "Method not allowed": "不允许的方法", + "Request too large": "请求过大", "Invalid JSON": "无效的 JSON", + "Body must be a JSON object of {ENV_VAR: value}": "请求体必须是 {ENV_VAR: value} 形式的 JSON 对象", + "No keys provided": "未提供密钥", + "At most {limit} keys per save": "每次最多保存 {limit} 个密钥", + "Unknown key: {name}": "未知密钥:{name}", + "{name} must be a string": "{name} 必须是字符串", + "{name} is empty": "{name} 为空", + "{name} is longer than any real key ({limit} max)": "{name} 比任何真实密钥都长(最多 {limit} 个字符)", + "{name} may only contain printable characters with no spaces": "{name} 只能包含可打印字符,且不能有空格", + "{name} contains a character that is not valid in a key (#, quotes, $, \\, or backtick)": "{name} 包含密钥中不允许的字符(#、引号、$、\\ 或反引号)", + "{name} is configured outside Provider Settings and can only be changed where it was set": "{name} 是在服务商设置之外配置的,只能在原设置处修改", + "The key was not saved: could not restrict the credential file to your account; nothing was saved": "密钥未保存:无法将凭据文件限制为仅你的账户可访问;未保存任何内容", + "The key was not saved: the existing configuration could not be read, so nothing was changed": "密钥未保存:无法读取现有配置,因此未做任何更改", + "Could not write the {store} store": "无法写入{store}存储", "Save failed ({status}).": "保存失败({status})。", "OAuth check failed: {detail}": "OAuth 检查失败:{detail}", "Could not check ChatGPT sign-in. Try again.": "无法检查 ChatGPT 登录状态,请重试。", @@ -206,6 +382,7 @@ "Use OPENAI_API_KEY for the next cloud voice session": "下次云语音会话使用 OPENAI_API_KEY", "Use the signed-in local ChatGPT/Codex OAuth session for the next cloud voice session": "下次云语音会话使用本机已登录的 ChatGPT/Codex OAuth 会话", "Metered — a billing-enabled account": "按量计费——需要启用结算的账号", + "Optional paid token — public access works without one": "可选的付费令牌——无需令牌也可公开访问", "Free key — register, paste, done": "免费密钥——注册、粘贴,即可使用", "browser-side": "浏览器端", "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "此密钥按设计在浏览器中运行——请在服务商处设置限制(见 SECURITY.md)", @@ -217,6 +394,7 @@ "paste {envVar}": "粘贴 {envVar}", "REMOVE": "移除", "Remove {title} from this app's saved keys": "从本应用已保存的密钥中移除 {title}", + "unsaved provider keys": "未保存的服务商密钥", "Project keys: {status}": "项目密钥:{status}", "your app configuration": "你的应用配置", "your local .env": "你的本地 .env", @@ -229,14 +407,15 @@ "Could not check ChatGPT sign-in.": "无法检查 ChatGPT 登录状态。", "ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "已为云语音选择 ChatGPT OAuth。你的 API 密钥仍会保留并可用。", "ChatGPT sign-in expired. Opening sign-in again…": "ChatGPT 登录已过期。正在重新打开登录…", - "Opening ChatGPT sign-in in your browser…": "正在在你的浏览器中打开 ChatGPT 登录…", + "Opening ChatGPT sign-in in your browser…": "正在浏览器中打开 ChatGPT 登录…", "Could not start ChatGPT sign-in on this machine.": "无法在此机器上启动 ChatGPT 登录。", "Finish ChatGPT sign-in in the browser. Waiting for it to complete…": "请在浏览器中完成 ChatGPT 登录,正在等待其完成…", "ChatGPT sign-in timed out. Click {button} to try again.": "ChatGPT 登录超时。点击“{button}”重试。", "ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "ChatGPT 登录完成。下次云语音会话将使用 OAuth。", "Remove this key from your saved configuration?": "要从已保存的配置中移除此密钥吗?", "Removed from {store}. Restarting — this page reloads itself.": "已从{store}中移除。正在重启——本页面将自动重新加载。", - "Places context + Street View fallback; optional separate key": "地点上下文 + 街景备用;可选的独立密钥", + "The photorealistic 3D planet, place search + Street View": "照片级 3D 地球、地点搜索 + 街景", + "Places context + Street View fallback; optional separate key": "地点信息 + 街景备用;可选的独立密钥", "Voice control — API key or ChatGPT OAuth": "语音控制——API 密钥或 ChatGPT OAuth", "Live ships, worldwide": "全球实时船舶", "Live active-fire detections": "实时活跃火点探测", @@ -244,51 +423,88 @@ "Bing imagery map stacks + world terrain": "Bing 影像地图组合 + 全球地形", "More flight-polling credits (anonymous works without)": "更多航班轮询额度(匿名也可使用)", "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "街景影像与街景图层中的覆盖范围。免费:在 Mapillary 开发者控制台注册一个应用,并粘贴其 Client Token", + "Public space-missions access needs no key. Leave blank for standard use; paid tokens only raise request limits.": "公开的太空任务数据无需密钥。常规使用请留空;付费令牌只会提高请求上限。", + "Air quality request failed": "空气质量请求失败", + "No readings available": "暂无读数", + "No current readings": "暂无当前读数", + "{count} stations reporting": { + "other": "{count} 个站点上报数据" + }, + "Highest air-quality readings in view": "视野内空气质量读数最高的站点", "Low": "低", + "Low health risk": "低健康风险", + "Moderate": "中等", + "Moderate health risk": "中等健康风险", "High": "高", + "High health risk": "高健康风险", + "Very High": "极高", + "Very High health risk": "极高健康风险", + "Air quality": "空气质量", + "Canada only · ECCC AQHI network": "仅限加拿大 · ECCC AQHI 站网", + "ECCC request timed out": "ECCC 请求超时", + "Malformed AQHI station response": "AQHI 站点响应格式错误", + "No AQHI stations available": "没有可用的 AQHI 站点", + "Malformed AQHI observation response": "AQHI 观测响应格式错误", + "Camera source temporarily unavailable": "摄像头数据源暂时不可用", + "Mapped camera locations": "地图标注的摄像头位置", "SHOW NEAREST": "最近摄像头", "Stop following the current object before navigating to a camera": "请先停止跟踪当前目标,再前往摄像头", "Move to the nearest loaded camera and show its details": "前往最近已加载的摄像头并显示详情", "Camera badges": "摄像头徽标", "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "选中后青色摄像头变为珊瑚色。扇形仅示意已标绘方向,并非实测覆盖范围。附近的摄像头可能不在屏幕内。", + "{count} nearby · {onScreen} on screen": { + "other": "附近 {count} 个 · 屏幕上 {onScreen} 个" + }, + "{count} nearby": { + "other": "附近 {count} 个" + }, "retrying mapped ALPR cameras": "正在重试加载 ALPR 摄像头", "loading mapped ALPR cameras": "正在加载 ALPR 摄像头", - "No ALPR data for this area — US and Canada only": "此区域没有 ALPR 数据 —— 仅覆盖美国和加拿大", - "Zoom in to load mapped cameras": "放大以加载标绘摄像头", + "No ALPR data for this area — US and Canada only": "此区域没有 ALPR 数据——仅覆盖美国和加拿大", + "Zoom in to load mapped cameras": "放大以加载地图标注的摄像头", "Showing cached locations": "正在显示缓存位置", - "Coverage limited — zoom in": "覆盖受限 —— 请放大", + "Coverage limited — zoom in": "覆盖受限——请放大", "No ALPR data for this area": "此区域没有 ALPR 数据", - "None on screen — nearby cameras are outside the view": "屏幕上没有摄像头 —— 附近的摄像头在视野之外", + "None on screen — nearby cameras are outside the view": "屏幕上没有摄像头——附近的摄像头在视野之外", "ALPR camera": "ALPR 摄像头", + "Camera coverage unavailable": "摄像头覆盖不可用", + "OpenStreetMap · community mapped": "OpenStreetMap · 社区标注", + "Overpass returned an incomplete camera response": "Overpass 返回的摄像头数据不完整", "At least {count}": "至少 {count}", - "CONTEXT READY": "上下文就绪", - "GLOBAL CONTEXT OFF": "全局上下文已关闭", + "CONTEXT READY": "态势就绪", + "GLOBAL CONTEXT OFF": "全局态势已关闭", "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "选择一个航班、船舶或地图标注设施", "ENABLE TO LOAD OBSERVED / MAPPED PROXIMITY": "启用以加载观测 / 地图标注的邻近信息", "Unavailable": "不可用", "Focus {label}": "聚焦 {label}", - "Global Context navigation": "全局上下文导航", + "Global Context navigation": "全局态势导航", "Previous — prior visited contact in the 250 km window": "上一个:250 km 范围内先前访问过的目标", "PREVIOUS": "上一个", "FOCUS": "聚焦", "Next — nearest unvisited contact in the 250 km window": "下一个:250 km 范围内最近的未访问目标", "NEXT": "下一个", - "Named areas ({n})": "指定区域({n})", - "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "开源的地图标注/观测上下文。缺失的广播、未加载的地图区域或未标注的站点不能作为不存在的证据。", + "Named areas ({n})": "已命名区域({n})", + "{distance} FLIGHT / VESSEL WINDOW": "{distance} 航班 / 船舶范围", + "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "开源的地图标注/观测态势信息。缺失的广播、未加载的地图区域或未标注的设施不能作为不存在的证据。", + "mapped matches within {km} km of the subject": "所选对象 {km} km 内的地图标注匹配", + "none mapped within {km} km; not a complete 250 km survey": "{km} km 内无地图标注;并非完整的 250 km 普查", + "mapped matches from the loaded viewport": "来自已加载视口的地图标注匹配", + "viewport feed is not a complete 250 km survey": "视口数据源并非完整的 250 km 普查", "HDG {value}°": "HDG {value}°", "BRG {value}°": "BRG {value}°", "BRG —": "BRG —", "CRS {value}°": "CRS {value}°", "CURRENT VIEWPORT ONLY": "仅限当前视口", - "WITHIN {km} KM": "{km} KM 以内", + "WITHIN {km} KM": "{km} km 以内", "Flights": "航班", "Military flights": "军用航班", "AIS vessels": "AIS 船舶", "Mapped installations": "地图标注设施", "syncing {count} city feeds...": "正在同步 {count} 个城市数据源…", "scanning nearby systems...": "正在扫描附近系统…", + "GBFS fetch error": "GBFS 获取错误", "Station {id}": "站点 {id}", - "Station": "电台", + "Station": "站点", "🚲 {bikes} avail · {docks} docks · {capacity} cap": "🚲 可用 {bikes} · 车桩 {docks} · 容量 {capacity}", "⚠️ Not installed": "⚠️ 未安装", "⚠️ Not renting": "⚠️ 暂停租车", @@ -297,25 +513,29 @@ "{count} CAMERAS STANDING BY · NO CAMERA SELECTED · CLICK A CAMERA TO ACTIVATE": "{count} 个摄像头待命 · 未选择摄像头 · 点击摄像头以激活", "No cameras available in catalog.": "目录中没有可用摄像头。", "{city} CCTV": "{city} CCTV", + "FOV {value}° (DATASHEET)": "FOV {value}°(规格书)", "FOV {value}°": "FOV {value}°", + "SPEC FOV {span}° (CAPABILITY)": "规格 FOV {span}°(可调范围)", "COVERAGE {value}km²": "覆盖 {value}km²", "OVERLAP {count} cams": "重叠 {count} 个摄像头", "ISOLATED VIEW": "孤立视角", - "PROJ MONITOR": "投影 监视器", - "PROJ OFF": "投影 关", + "PROJ MONITOR": "投影:监视器", + "PROJ OFF": "投影:关", "VIEWSHED": "可视域", "CAL {value}": "CAL {value}", "SRC {value}": "SRC {value}", - "{value} CONTEXT": "{value} 上下文", + "{value} CONTEXT": "{value} 态势", + "{spec} · SPECS: CCTV-DATABASE.COM": "{spec} · 规格:CCTV-DATABASE.COM", "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "覆盖大西洋及北太平洋东部/中部;不含全球气旋。", "Cyclone advisories unavailable": "气旋公告不可用", + "Cyclone data unavailable": "气旋数据不可用", "Potential tropical cyclone": "潜在热带气旋", "Hurricane": "飓风", "Tropical storm": "热带风暴", "Tropical depression": "热带低压", "Subtropical storm": "亚热带风暴", "Subtropical depression": "亚热带低压", - "Track and cone match this advisory": "路径与锥体与本份公告一致", + "Track and cone match this advisory": "路径和锥体与本期公告一致", "Track/cone awaiting advisory {number}": "路径/锥体等待第 {number} 号公告", "Track/cone unavailable": "路径/锥体不可用", "Cached advisory · stale source": "缓存公告 · 数据源已过期", @@ -330,26 +550,103 @@ "Advisories unavailable": "公告不可用", "Cyclones · NHC / CPHC": "气旋 · NHC / CPHC", "Atlantic · E/C Pacific": "大西洋 · 东/中太平洋", + "{storms} · {name} selected": "{storms} · 已选择 {name}", "Official advisory ↗": "官方公告 ↗", "Active NHC and CPHC cyclone advisories": "活跃的 NHC 与 CPHC 气旋公告", "Wind unavailable": "风场数据不可用", "Advisory center / forecast track": "公告中心 / 预报路径", "Center-track uncertainty cone": "中心路径不确定锥", - "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "在地图上点选气旋,或在列表中选择以选中并移动相机。点击空白地图区域可清除选择。内容来自 NOAA NHC/CPHC 公报。锥体描述的是预报中心路径的不确定范围,不代表气旋尺寸或全部灾害区域。预报点标注的是数据源的前导小时数,不是按公告发布时刻推算的时间。几何图形贴地显示;显示高度并非天气高度。请以官方公告为准。", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "在地图上点选气旋,或在列表中选择以选中并移动相机。点击空白地图区域可清除选择。内容来自 NOAA NHC/CPHC 公告。锥体描述的是预报中心路径的不确定范围,不代表气旋尺寸或全部灾害区域。预报点标注的是数据源的前导小时数,不是按公告发布时刻推算的时间。几何图形贴地显示;显示高度并非天气高度。请以官方公告为准。", "DRIVE": "驾车", "Drive": "驾车", "WALK": "步行", "Walk": "步行", "BIKE": "骑行", "Bike": "骑行", - "{error} — try again in a moment": "{error} — 请稍后重试", - "Routing is rate limited — try again in a moment": "路线请求过于频繁 — 请稍后重试", + "rate limited": "已限流", + "routing service is rate limited": "路线服务已限流", + "route leg too long": "路段过长", + "route too long": "路线过长", + "{error} — try again in a moment": "{error}——请稍后重试", + "Routing is rate limited — try again in a moment": "路线请求过于频繁——请稍后重试", "Routing unavailable (HTTP {status})": "路线服务不可用(HTTP {status})", "Routing unavailable": "路线规划不可用", - "Head out on {road}": "沿{road}出发", + "direction|left": "向左", + "direction|right": "向右", + "direction|slightly left": "向左前方", + "direction|slightly right": "向右前方", + "direction|sharply left": "向左后方", + "direction|sharply right": "向右后方", + "direction|straight": "向前", + "direction|around": "向后", + "fork direction|left": "靠左行驶", + "fork direction|right": "靠右行驶", + "fork direction|slightly left": "稍靠左行驶", + "fork direction|slightly right": "稍靠右行驶", + "fork direction|sharply left": "向左后方行驶", + "fork direction|sharply right": "向右后方行驶", + "fork direction|straight": "直行", + "lane direction|left": "左转", + "lane direction|right": "右转", + "lane direction|slightly left": "稍左转", + "lane direction|slightly right": "稍右转", + "lane direction|sharply left": "急左转", + "lane direction|sharply right": "急右转", + "lane direction|straight": "直行", + "ordinal|{number}st": "第 {number} 个", + "ordinal|{number}nd": "第 {number} 个", + "ordinal|{number}rd": "第 {number} 个", + "ordinal|{number}th": "第 {number} 个", + "Head out on {road}": "沿 {road} 出发", "Head out": "出发", + "Arrive at your destination, on the left": "到达目的地,目的地在左侧", + "Arrive at your destination, on the right": "到达目的地,目的地在右侧", "Arrive at your destination": "到达目的地", - "{mode} — reroute for {modeLower}": "{mode} — 按{modeLower}重新规划路线", + "Make a U-turn onto {road}": "掉头进入 {road}", + "Make a U-turn": "掉头", + "Continue straight onto {road}": "直行进入 {road}", + "Continue straight": "继续直行", + "Turn {direction} onto {road}": "{direction}转,进入 {road}", + "Turn {direction}": "{direction}转", + "Turn onto {road}": "转弯进入 {road}", + "maneuver|Turn": "转弯", + "Continue {direction} onto {road}": "继续{direction}行驶,进入 {road}", + "Continue {direction}": "继续{direction}行驶", + "At the end of the road, turn {direction} onto {road}": "在道路尽头{direction}转,进入 {road}", + "At the end of the road, turn {direction}": "在道路尽头{direction}转", + "At the end of the road, continue onto {road}": "在道路尽头继续行驶,进入 {road}", + "At the end of the road, continue": "在道路尽头继续行驶", + "Keep {direction} at the fork onto {road}": "在岔路口{direction},进入 {road}", + "Keep {direction} at the fork": "在岔路口{direction}", + "Continue at the fork onto {road}": "在岔路口继续行驶,进入 {road}", + "Continue at the fork": "在岔路口继续行驶", + "Merge {direction} onto {road}": "{direction}并道,进入 {road}", + "Merge {direction}": "{direction}并道", + "Merge onto {road}": "并入 {road}", + "maneuver|Merge": "并道", + "Take the ramp on the {direction} onto {road}": "{direction}驶入匝道,进入 {road}", + "Take the ramp on the {direction}": "{direction}驶入匝道", + "Take the ramp onto {road}": "驶入匝道,进入 {road}", + "Take the ramp": "驶入匝道", + "Take the exit on the {direction} onto {road}": "从出口{direction}驶出,进入 {road}", + "Take the exit on the {direction}": "从出口{direction}驶出", + "Take the exit onto {road}": "从出口驶出,进入 {road}", + "Take the exit": "从出口驶出", + "At the roundabout, take the {exit} exit onto {road}": "在环岛从{exit}出口驶出,进入 {road}", + "At the roundabout, take the {exit} exit": "在环岛从{exit}出口驶出", + "Enter the roundabout onto {road}": "驶入环岛,进入 {road}", + "Enter the roundabout": "驶入环岛", + "At the roundabout, turn {direction} onto {road}": "在环岛{direction}转,进入 {road}", + "At the roundabout, turn {direction}": "在环岛{direction}转", + "At the roundabout, continue onto {road}": "在环岛继续行驶,进入 {road}", + "At the roundabout, continue": "在环岛继续行驶", + "Exit the roundabout onto {road}": "驶出环岛,进入 {road}", + "Exit the roundabout": "驶出环岛", + "Use the {direction} lane onto {road}": "使用{direction}车道,进入 {road}", + "Use the {direction} lane": "使用{direction}车道", + "Continue onto {road}": "继续行驶,进入 {road}", + "maneuver|Continue": "继续行驶", + "{mode} — reroute for {modeLower}": "{mode}——按{modeLower}重新规划路线", "CLICK MAP": "点击地图", "SET A": "设置 A", "Click a spot on the globe to place A (click again to cancel)": "点击地球上的位置放置 A(再次点击取消)", @@ -363,29 +660,33 @@ "FLY": "飞行", "Fly the camera along the route": "沿路线飞行相机", "Place A and B first": "请先放置 A 和 B", + "action|CLEAR": "清除", "Remove the route and both markers": "移除路线和两个标记点", - "press Escape twice to leave Draw": "按两次 Escape 退出绘图", - "{name} is active — {leave}, then set {endpoint}": "{name} 正在使用 — {leave},然后设置 {endpoint}", + "press Escape twice to leave Draw": "按两次 Escape 退出“绘制”", + "{name} is active — turn {name} off, then set {endpoint}": "{name} 正在使用——请先关闭 {name},再设置 {endpoint}", + "{name} is active — {leave}, then set {endpoint}": "{name} 正在使用——请先{leave},再设置 {endpoint}", "Only the first {count} turns of this route are shown": "此路线仅显示前 {count} 个转向", "Turn-by-turn directions": "逐向导航路线", - "Another map tool is using clicks — close it, then SET A again": "另一个地图工具正在占用点击 — 关闭它,然后重新设置 A", + "Another map tool is using clicks — close it, then SET A again": "另一个地图工具正在占用点击——请先关闭它,再重新设置 A", "Routing…": "正在规划路线…", "No route found": "未找到路线", + "{distance} · {duration} · {mode} · first {count} turns": "{distance} · {duration} · {mode} · 前 {count} 个转向", "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", "Click the globe to place {endpoint}": "点击地球放置 {endpoint}", "SET B, then click the globe": "设置 B,然后点击地球", "SET A, then click the globe": "设置 A,然后点击地球", + "Step {step} of {total} · then {leg}": "第 {step}/{total} 步 · 随后 {leg}", "Step {step} of {total}": "第 {step} 步,共 {total} 步", "Then: {instruction}": "接下来:{instruction}", "No route found between A and B": "在 A 和 B 之间未找到路线", "Routing failed: {error}": "路线规划失败:{error}", "Routing timed out": "路线规划超时", - "Routing unavailable — no response from the routing service": "路线服务无响应 — 路线规划不可用", + "Routing unavailable — no response from the routing service": "路线规划不可用——路线服务无响应", "Earthquake source unavailable": "地震数据源不可用", "Focus fire detection {title}, {details}": "聚焦火点探测 {title},{details}", "live feed unavailable": "实时数据不可用", "{value} conf": "置信度 {value}", - "{value} ago": "{value} 前", + "{value} ago": "{value}前", "sensor n/a": "传感器 n/a", "FIRE · {frp} MW": "火点 · {frp} MW", "NIGHT": "夜间", @@ -393,20 +694,62 @@ "FIRE": "火点", "FIRES": "火点", "max {value} MW": "最大 {value} MW", - "new {value}": "新增 {value}", + "new {value}": "最新 {value}前", + "{value}°N": "{value}°N", + "{value}°S": "{value}°S", + "{value}°E": "{value}°E", + "{value}°W": "{value}°W", "just now": "刚刚", "<1m ago": "不到 1 分钟前", "{count}m ago": "{count} 分钟前", "{count}h ago": "{count} 小时前", + "fire confidence|high": "高", + "fire confidence|nominal": "中", + "fire confidence|low": "低", + "age|<1h": "<1 小时", + "age|{count}h": "{count} 小时", + "age|{count}d": "{count} 天", "Fire · FRP {frp} MW": "火点 · FRP {frp} MW", - "STALE · cached {age}": "过期 · 缓存于 {age}", + "STALE · cached {age}": "过期 · {age}前缓存", "refreshing...": "刷新中…", "loading...": "加载中…", "KEY REQUIRED": "需要密钥", "LIVE · updated {age}": "实时 · 更新于 {age}", - "loading mapped installation context": "正在加载地图标注设施上下文", - "Too many mapped sites in view to list them all": "视野内标绘地点过多,无法全部列出", - "Installation context unavailable": "设施背景信息不可用", + "Source snapshot time unavailable": "来源快照时间不可用", + "Live data unavailable": "实时数据不可用", + "Low-accuracy score < 2%": "低精度评分 < 2%", + "Low-accuracy score 2–10%": "低精度评分 2–10%", + "Low-accuracy score > 10%": "低精度评分 > 10%", + "GNSS integrity source unavailable": "GNSS 完好性数据源不可用", + "Regional sample · 250 nm radius · cells from visited views over 30 min": "区域采样 · 半径 250 海里 · 30 分钟内已访问视图中的网格", + "Retrying automatically at {time} UTC": "将于 {time} UTC 自动重试", + "Retrying automatically after provider cooldown": "服务商冷却结束后自动重试", + "Updates automatically after pan or zoom and once a minute. The public feed covers a 250-nautical-mile circle around the view centre; zooming out does not make it a worldwide snapshot. Blank cells are outside sampled coverage or have insufficient observations.": "平移或缩放后以及每分钟自动更新。公共数据源覆盖以视图中心为圆心、半径 250 海里的范围;缩小地图并不会使其成为全球快照。空白网格位于采样覆盖范围之外,或观测数据不足。", + "Low-accuracy score = 100 × max(0, bad − 1) / total: one aircraft is discounted, so this is not the raw share. Cells need {aircraft} aircraft over {minutes} minutes. Navigation-integrity anomalies are not a detection of jamming or spoofing.": "低精度评分 = 100 × max(0, bad − 1) / total:扣除一架飞机,因此并非原始占比。每个网格需在 {minutes} 分钟内有 {aircraft} 架飞机。导航完好性异常不等于检测到干扰或欺骗。", + "GNSS snapshot needs a view anchor": "GNSS 快照需要视图锚点", + "GNSS feed rate limited (HTTP 429)": "GNSS 数据源已限流(HTTP 429)", + "Malformed GNSS integrity snapshot": "GNSS 完好性快照格式错误", + "GNSS integrity snapshot has no observation time": "GNSS 完好性快照缺少观测时间", + "installation class|AIRFIELD": "机场", + "installation class|NAVAL BASE": "海军基地", + "installation class|RANGE": "靶场", + "installation class|MILITARY LAND": "军事用地", + "installation class|BASE": "基地", + "installation class|BARRACKS": "营房", + "installation class|TRAINING AREA": "训练区", + "installation class|PLACES CANDIDATE": "Places 候选", + "installation class|INSTALLATION": "设施", + "No mapped sites within {km} km of the contact": "目标 {km} km 内无地图标注设施", + "{count} mapped sites within {km} km of the contact": { + "other": "目标 {km} km 内有 {count} 个地图标注设施" + }, + "No mapped sites in view": "视野内无地图标注设施", + "{count} mapped sites in view": { + "other": "视野内有 {count} 个地图标注设施" + }, + "loading mapped installation context": "正在加载地图标注设施信息", + "Too many mapped sites in view to list them all": "视野内地图标注设施过多,无法全部列出", + "Installation context unavailable": "设施信息不可用", "MAPPED INSTALLATION": "地图标注设施", "Unknown": "未知", "LAUNCH SITE · {site}": "发射场 · {site}", @@ -422,7 +765,7 @@ "UNSPECIFIED": "未指明", "+{count} additional payload records": "另有 {count} 条有效载荷记录", "PAYLOAD DATA UNAVAILABLE": "有效载荷数据不可用", - "{value} KM DOWNRANGE": "下射程 {value} KM", + "{value} KM DOWNRANGE": "射程 {value} km", "POSITION UNAVAILABLE": "位置不可用", "FLIGHT {count}": "第 {count} 次飞行", "REUSED": "复用", @@ -432,8 +775,8 @@ "DATE UNAVAILABLE": "日期不可用", "UNSPECIFIED OPERATOR": "运营方未指明", "Select {mission}": "选择 {mission}", - "{value} KM": "{value} KM", - "{value} KM/S": "{value} KM/S", + "{value} KM": "{value} km", + "{value} KM/S": "{value} km/s", "Selected Space Mission": "已选太空任务", "SELECTED SPACE MISSION": "已选太空任务", "Show all missions": "显示所有任务", @@ -463,7 +806,7 @@ "SHOW ALL / DESELECT": "显示全部 / 取消选择", "Pause replay": "暂停回放", "Cancel replay": "取消回放", - "EST. DOWNRANGE": "预估下射程", + "EST. DOWNRANGE": "预估射程", "PLANNED · ": "计划 · ", "SUPPLIED TRAJECTORY POINTS": "提供的轨迹点", "RECONSTRUCTED ESTIMATE": "重建估算", @@ -475,13 +818,24 @@ "Ascent replay": "上升回放", "Orbit replay": "轨道回放", ", paused": ",已暂停", + "Malformed launch snapshot": "发射快照格式错误", "Heard by your receiver": "由你的接收机接收", + "1090 MHz": "1090 MHz", + "978 MHz UAT": "978 MHz UAT", "browser SDR": "浏览器 SDR", "decoder feed": "解码器数据源", "Your RTL-SDR receiver and decoder feed": "你的 RTL-SDR 接收机和解码器数据源", "Your decoder feed": "你的解码器数据源", "Your RTL-SDR receiver": "你的 RTL-SDR 接收机", "NO CALLSIGN": "无呼号", + "ALT {altitude} FT · GS {speed} KT · TRK {track}": "高度 {altitude} FT · 地速 {speed} KT · 航迹 {track}", + "V/S {rate}": "升降 {rate}", + "V/S {rate} FPM": "升降 {rate} FPM", + "POSITION {age}": "位置 {age}", + "POSITION {seconds} S AGO": "位置 {seconds} 秒前", + "{count} MSGS": { + "other": "{count} 条消息" + }, "Decoder feeds": "解码器数据源", "WebUSB + decoder feeds": "WebUSB + 解码器数据源", "opening receiver": "正在打开接收机", @@ -489,12 +843,25 @@ "WebUSB needs desktop Chrome or Edge": "WebUSB 需要桌面版 Chrome 或 Edge", "connect a receiver in Radio": "在电台面板连接接收机", "receiver is in FM mode": "接收机处于 FM 模式", - "listening": "聆听中", + "listening": "监听中", "USB error": "USB 错误", "Alt unknown": "高度未知", "Type unknown": "类型未知", "Reg unknown": "注册号未知", "Operator unknown": "运营方未知", + "${amount}K": "{amount} 千美元", + "${amount}M": "{amount} 百万美元", + "${amount}B": "{amount} 十亿美元", + "fire cause|Human": "人为", + "fire cause|Natural": "自然", + "fire cause|Undetermined": "待定", + "fire cause|Unknown": "未知", + "fire behavior|Minimal": "微弱", + "fire behavior|Moderate": "中等", + "fire behavior|Active": "活跃", + "fire behavior|Extreme": "极端", + "Type {level} Incident": "{level} 类事件", + "age|{count}m": "{count} 分钟", "{acres} ac": { "other": "{acres} 英亩" }, @@ -505,7 +872,7 @@ "other": "{personnel} 名人员" }, "{county} County": "{county} 县", - "{cost} to date": "迄今损失 {cost}", + "{cost} to date": "迄今扑救费用 {cost}", "discovered {age} ago": "发现于 {age}前", "updated {age} ago": "更新于 {age}前", "part of {complex}": "属于 {complex} 复合火场", @@ -518,19 +885,32 @@ "Under 50% contained": "控制低于 50%", "50–99% contained": "控制 50–99%", "Fully contained": "已全部控制", - "Colour shows reported containment. Perimeters are simplified to about 100 m.": "颜色表示报告的控制比例。周界简化至约 100 米。", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "颜色表示报告的控制比例。周界简化至约 100 m。", + "Malformed perimeter snapshot": "周界快照格式错误", + "radio tag|All": "全部", "News": "新闻", - "Talk": "谈话", + "Talk": "访谈", "Weather / Emergency": "天气 / 应急", "Public Safety": "公共安全", "Aviation / Marine": "航空 / 海事", - "Traffic / Transit": "交通 / 公交", + "Traffic / Transit": "交通 / 公共交通", "Music": "音乐", "Other": "其他", "Directory refresh degraded; showing the previous station catalog.": "目录刷新降级;正在显示上一次的电台目录。", "Radio directory coverage is degraded.": "电台目录覆盖已降级。", "Directory refresh failed; showing the previous station catalog.": "目录刷新失败;正在显示上一次的电台目录。", "Radio directory is temporarily unavailable.": "电台目录暂时不可用。", + "radio|NEWS": "新闻", + "radio|TALK": "访谈", + "radio|WEATHER": "天气", + "radio|SAFETY": "安全", + "radio|AIR / SEA": "航空 / 海事", + "radio|TRANSIT": "公共交通", + "radio|MUSIC": "音乐", + "radio|OTHER": "其他", + "Broadcaster stream is unavailable or blocked by the browser.": "广播流不可用,或被浏览器阻止。", + "Playback requires a direct click or tap.": "需直接点击或轻触才能播放。", + "Broadcaster stream could not be started.": "无法启动广播流。", "Alternative": "另类", "Ambient": "氛围", "Blues": "蓝调", @@ -556,7 +936,32 @@ "Techno": "Techno", "Trance": "Trance", "World": "世界音乐", + "overview": "概览", "cloud unknown": "云量未知", + "{percent}% scene cloud": "场景云量 {percent}%", + "{min}–{max}% scene cloud": "场景云量 {min}–{max}%", + "Comparison in use by another scene": "对比功能正被另一个场景占用", + "Esri map unavailable · no swipe": "Esri 地图不可用 · 无法滑动对比", + "Swipe needs a globe map": "滑动对比需要球体地图", + "Imagery stays on Esri · CLEAR to use Google 3D": "影像保留在 Esri · 清除后改用 Google 3D", + "Imagery catalog unavailable": "影像目录不可用", + "Catalog truncated · a newer clear day may exist": "目录已截断 · 可能还有更新的晴天", + "{label} catalog unavailable · {detail}": "{label} 目录不可用 · {detail}", + "Daily overview for today may still be empty until the pass": "卫星过境前,今天的每日概览可能仍为空", + "Box and images cleared": "框选及影像已清除", + "MORE DETAIL · 30 m": "更多细节 · 30 m", + "Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "Sentinel-2 与 Landsat,经 HLS,30 m,每 2–6 天", + "DAILY OVERVIEW · 250 m": "每日概览 · 250 m", + "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "VIIRS 每日拼图,250 m,反映大范围变化;25 km 以下几乎没有细节", + "Sentinel-2": "Sentinel-2", + "Sentinel-2 via HLS": "Sentinel-2(经 HLS)", + "Landsat 8/9": "Landsat 8/9", + "Landsat 8/9 via HLS": "Landsat 8/9(经 HLS)", + "Daily overview": "每日概览", + "Box edges must be finite": "框选边界必须是有限值", + "Longitudes must be within ±180°": "经度必须在 ±180° 以内", + "Select one side of the dateline": "请只选择日界线的一侧", + "Box must enclose an area": "框选必须包含一定面积", "Add the full Starlink broadband shell (thousands of extra points)": "添加完整的 Starlink 宽带星座(数千个额外点位)", "Loading the Starlink shell…": "正在加载 Starlink 星座…", "Starlink {detail} — click to retry": "Starlink {detail}——点击重试", @@ -565,10 +970,66 @@ "DENSE ···": "密集 ···", "DENSE ✕": "密集 ✕", "DENSE": "密集", + "CelesTrak unreachable": "CelesTrak 无法连接", + "DOCKED · {name} · +{extra}": "对接 · {name} · +{extra}", "DOCKED · {name}": "对接 · {name}", + "{name} needs the Google 3D map: choose it under MAP SOURCE": "{name} 需要 Google 3D 地图:请在地图源(MAP SOURCE)中选择", + "zoom in to a street to open {name}": "放大到街道以打开 {name}", "KEY REJECTED": "密钥被拒绝", - "loading coverage...": "正在加载覆盖范围...", + "loading coverage...": "正在加载覆盖范围…", + "No street-level imagery within {radius} m of that point": "该点 {radius} m 范围内没有街景影像", + "No street-level imagery within {radius} m of the view centre": "视野中心 {radius} m 范围内没有街景影像", + "Coverage tile failed": "覆盖瓦片加载失败", + "Point the camera at the globe for street-level coverage": "将相机对准地球以查看街景覆盖范围", + "The photo could not be loaded": "照片无法加载", + "{name} photo. ← and → step along the sequence. On a 360° photo, drag or use Shift+← →, ↑ ↓ to look around, and + − to zoom": "{name} 照片。← 和 → 沿序列切换。在 360° 照片上,拖动或使用 Shift+← →、↑ ↓ 环视,+ − 缩放", + "{name} street-level photo": "{name} 街景照片", + "Previous photo in this sequence (←)": "此序列中的上一张照片(←)", + "Next photo in this sequence (→)": "此序列中的下一张照片(→)", + "Aim the middle of the view at a street to look for imagery there": "将视野中心对准街道以查找该处影像", + "GOOGLE_MAPS_API_KEY is not set": "未设置 GOOGLE_MAPS_API_KEY", + "The Google Maps JavaScript API could not load": "Google Maps JavaScript API 无法加载", + "Google Street View": "Google 街景", + "GOOGLE STREET VIEW": "Google 街景", + "Google refused GOOGLE_MAPS_API_KEY for Street View — check that the Maps JavaScript API is enabled for it and this site is an allowed referrer": "Google 拒绝了用于街景的 GOOGLE_MAPS_API_KEY——请检查该密钥已启用 Maps JavaScript API,且本站点在允许的引荐来源(referrer)中", + "Street View did not answer — check the network, and that the Maps JavaScript API is enabled for GOOGLE_MAPS_API_KEY": "街景无响应——请检查网络,并确认 GOOGLE_MAPS_API_KEY 已启用 Maps JavaScript API", + "click a street to open Street View": "点击街道以打开街景", + "Street View has no imagery for this place": "街景没有此地的影像", + "KartaView has no position for this photo": "KartaView 没有此照片的位置", + "The KartaView photo could not be loaded": "KartaView 照片无法加载", + "zoom in to see KartaView coverage": "放大以查看 KartaView 覆盖范围", + "no KartaView photos in view": "视野内没有 KartaView 照片", + "KartaView is rate-limiting requests — they resume on their own": "KartaView 正在限制请求频率——稍后会自动恢复", + "KartaView’s photos here are archived and cannot be shown": "KartaView 在此处的照片已归档,无法显示", + "KartaView did not filter this area in time — move the map to ask again": "KartaView 未能及时筛选此区域——移动地图以重新请求", + "None of KartaView’s photos here pass the imagery filter": "此处没有 KartaView 照片通过影像筛选", + "KartaView did not answer in time — try again": "KartaView 未及时响应——请重试", + "KartaView could not be reached — check the network": "无法连接 KartaView——请检查网络", + "KartaView sent an answer that could not be read": "KartaView 返回的响应无法读取", + "KartaView is rate-limiting requests": "KartaView 正在限制请求频率", + "KartaView sent too much data": "KartaView 返回的数据过多", + "KartaView is rate-limiting requests — try again in a moment": "KartaView 正在限制请求频率——请稍后重试", + "KartaView has no such photo": "KartaView 没有这张照片", + "Mapillary rejected MAPILLARY_CLIENT_TOKEN — replace it in Provider Settings": "Mapillary 拒绝了 MAPILLARY_CLIENT_TOKEN——请在服务商设置中更换", + "Coverage requests are being rate-limited — they resume on their own": "覆盖范围请求受到频率限制——稍后会自动恢复", + "The Panoramax photo could not be loaded": "Panoramax 照片无法加载", + "Panoramax is busy — coverage resumes on its own": "Panoramax 繁忙——覆盖范围稍后会自动恢复", + "no Panoramax photos in view": "视野内没有 Panoramax 照片", + "no Panoramax photos here match the filters": "此处没有符合筛选条件的 Panoramax 照片", + "Panoramax sent a map tile that could not be read": "Panoramax 返回的地图瓦片无法读取", + "This Panoramax photo is no longer available": "这张 Panoramax 照片已不可用", + "zoom in to see Panoramax coverage": "放大以查看 Panoramax 覆盖范围", + "Panoramax did not answer in time — try again": "Panoramax 未及时响应——请重试", + "Panoramax could not be reached — check the connection": "无法连接 Panoramax——请检查网络连接", + "Panoramax sent too much data": "Panoramax 返回的数据过多", + "Panoramax is busy": "Panoramax 繁忙", + "Panoramax sent an unreadable answer": "Panoramax 返回的响应无法读取", + "No street-level imagery providers configured": "未配置街景影像提供商", + "{names}: by upload date": "{names}:按上传日期", "Selected": "所选", + "Open the Street Level panel to view imagery": "打开街景面板以查看影像", + "Image could not be opened": "图像无法打开", + "TeleGeography load failed": "TeleGeography 加载失败", "UNAVAILABLE · {source} · Roads unavailable": "不可用 · {source} · 道路不可用", "Roads: {source}": "道路:{source}", "TomTom roads unavailable while the traffic service is unreachable": "交通服务不可达期间 TomTom 道路不可用", @@ -579,25 +1040,71 @@ "Partial coverage": "部分覆盖", "Detailed roads unavailable": "详细道路不可用", "Reduced detail coverage": "详细覆盖范围受限", + "TomTom roads only, each with its live flow": "仅 TomTom 道路,各自带实时路况", + "TomTom roads only, each with its live flow (needs a TomTom key)": "仅 TomTom 道路,各自带实时路况(需要 TomTom 密钥)", "OpenStreetMap roads, with TomTom flow matched when available": "OpenStreetMap 道路,可用时匹配 TomTom 路况", - "SIMULATED — {reason}": "模拟 — {reason}", - "Syncing flow · Roads: {source}": "正在同步流量 · 道路:{source}", - "LIVE · Roads: {source} · Roads without flow hidden": "实时 · 道路:{source} · 已隐藏无流量道路", - "LIVE · Roads: {source} · No flow roads in view": "实时 · 道路:{source} · 视野内无流量道路", - "LIVE · Roads: {source} · Flow {percent}%": "实时 · 道路:{source} · 流量 {percent}%", - "SIMULATED · Roads: {source} · Flow {percent}%": "模拟 · 道路:{source} · 流量 {percent}%", - "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "正在同步流量 · 道路:OpenStreetMap · 流量:TomTom · 未匹配:模拟", - "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov · Unmatched: simulated": "实时 · 道路:OpenStreetMap · 流量:TomTom · 覆盖 {percent}% · 未匹配:模拟", - "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov": "实时 · 道路:OpenStreetMap · 流量:TomTom · 覆盖 {percent}%", - "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "模拟 · 道路:OpenStreetMap · 流量:TomTom(无匹配)", + "TomTom roads first; OpenStreetMap fills the rest, simulated": "优先 TomTom 道路;其余由 OpenStreetMap 补足,路况为模拟", + "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "优先 TomTom 道路;其余由 OpenStreetMap 补足,路况为模拟(需要 TomTom 密钥)", + "Hybrid": "混合", + "TomTom key unavailable": "TomTom 密钥不可用", + "TomTom daily budget reached": "已达 TomTom 每日配额", + "TomTom upstream unreachable": "TomTom 上游服务无法连接", + "TomTom flow unavailable": "TomTom 路况不可用", + "SIMULATED — {reason}": "模拟——{reason}", + "Syncing flow · Roads: {source}": "正在同步路况 · 道路:{source}", + "LIVE · Roads: {source} · Roads without flow hidden": "实时 · 道路:{source} · 已隐藏无路况道路", + "LIVE · Roads: {source} · No flow roads in view": "实时 · 道路:{source} · 视野内无路况道路", + "LIVE · Roads: {source} · Flow {percent}%": "实时 · 道路:{source} · 路况 {percent}%", + "SIMULATED · Roads: {source} · Flow {percent}%": "模拟 · 道路:{source} · 路况 {percent}%", + "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "正在同步路况 · 道路:OpenStreetMap · 路况:TomTom · 未匹配:模拟", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov · Unmatched: simulated": "实时 · 道路:OpenStreetMap · 路况:TomTom · 覆盖 {percent}% · 未匹配:模拟", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov": "实时 · 道路:OpenStreetMap · 路况:TomTom · 覆盖 {percent}%", + "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "模拟 · 道路:OpenStreetMap · 路况:TomTom(无匹配)", "SIMULATED — traffic service unreachable": "模拟——交通服务无法连接", "SIMULATED — add TomTom key for live": "模拟——添加 TomTom 密钥以获取实时数据", - "Route {route}": "航线{route}", + "OpenFreeMap tiles rate-limited": "OpenFreeMap 瓦片受到频率限制", + "OpenFreeMap tiles timed out": "OpenFreeMap 瓦片超时", + "OpenFreeMap tiles unavailable": "OpenFreeMap 瓦片不可用", + "occupancy|empty": "空车", + "occupancy|many seats available": "空座较多", + "occupancy|few seats available": "空座较少", + "occupancy|standing room only": "仅剩站位", + "occupancy|crushed standing room only": "拥挤,仅剩站位", + "occupancy|full": "已满", + "occupancy|not accepting passengers": "不载客", + "occupancy|not boardable": "无法上车", + "Route {route}": "线路 {route}", + "Vehicle {vehicle}": "车辆 {vehicle}", + "vehicle motion|Stopped": "停驶", + "No recent fix": "无近期定位", + "Waiting for update": "等待更新", + "Moving": "行驶中", + "reported {speed} km/h": "上报 {speed} km/h", + "reported hdg {heading}°": "上报航向 {heading}°", + "Last report: stopped at stop {stop}": "最近上报:停靠站点 {stop}", + "Last report: arriving at stop {stop}": "最近上报:即将到达站点 {stop}", + "Last report: next stop {stop}": "最近上报:下一站 {stop}", + "Shown at street level · depth not in the feed": "按地面高度显示 · 数据源未提供深度", + "Reported {seconds} s ago": "{seconds} 秒前上报", + "Reported {minutes} min ago": "{minutes} 分钟前上报", + "shown {seconds} s behind": "显示滞后 {seconds} 秒", + "{reported} (feed time)": "{reported}(数据源时间)", + "Available trail: {minutes} min (limited)": "可用轨迹:{minutes} 分钟(受限)", + "Available trail: {minutes} min": "可用轨迹:{minutes} 分钟", + "Bus": "公交车", + "Tram": "有轨电车", + "Subway": "地铁", + "Train": "火车", + "Ferry": "渡轮", + "Transit vehicle": "公共交通车辆", "AIS: {name}": "AIS: {name}", "{type} SPD: {speed} HDG: {heading}": "{type} SPD: {speed} HDG: {heading}", "VESSEL": "船舶", - "POS: LIVE": "位置:实时", - "POS: {time}Z": "位置:{time}Z", + "{speed}KT": "{speed} kn", + "{heading}DEG": "{heading}°", + "POS: LIVE": "POS:实时", + "POS: {time}Z": "POS:{time}Z", + "AIS live load failed": "AIS 实时数据加载失败", "awaiting first AIS position…": "等待首个 AIS 位置…", "awaiting usable AIS positions…": "等待可用的 AIS 位置…", "awaiting first AIS message…": "等待首条 AIS 消息…", @@ -607,32 +1114,44 @@ "feed disconnected": "数据源已断开", "feed down": "数据源中断", "feed idle": "数据源空闲", - "API key rejected — check AISSTREAM_API_KEY": "API 密钥被拒绝 — 请检查 AISSTREAM_API_KEY", - "feed silent {seconds}s — no AIS data": "数据源已静默 {seconds} 秒 — 无 AIS 数据", - "feed silent — no AIS data": "数据源已静默 — 无 AIS 数据", + "API key rejected — check AISSTREAM_API_KEY": "API 密钥被拒绝——请检查 AISSTREAM_API_KEY", + "feed silent {seconds}s — no AIS data": "数据源已静默 {seconds} 秒——无 AIS 数据", + "feed silent — no AIS data": "数据源已静默——无 AIS 数据", + "feed down — retrying slowly (attempt {attempt})": "数据源中断——正在低频重试(第 {attempt} 次)", + "reconnecting to feed… (attempt {attempt})": "正在重新连接数据源…(第 {attempt} 次)", + "feed down — retrying slowly": "数据源中断——正在低频重试", + "reconnecting to feed…": "正在重新连接数据源…", + "Focus vessel {name}, MMSI {mmsi}": "聚焦船舶 {name},MMSI {mmsi}", "Hidden by this map source · choose a globe map": "已被当前地图源隐藏 · 请选择球体地图", + "Weather image HTTP {status}": "天气图像 HTTP {status}", + "Weather HTTP {status}": "天气 HTTP {status}", "Frame unavailable; previous observation retained": "帧不可用;保留上一帧观测", "Weather imagery unavailable": "天气影像不可用", "Weather source unavailable; previous observation retained": "天气数据源不可用;保留上一帧观测", "Weather unavailable": "天气数据不可用", - "{hours}h {minutes}m ago": "{hours} 小时 {minutes} 分前", + "No frame within {gap} min of {time}": "{time} 前后 {gap} 分钟内没有帧", + "No frame within {gap} h of {time}": "{time} 前后 {gap} 小时内没有帧", + "{hours}h {minutes}m ago": "{hours} 小时 {minutes} 分钟前", "{minutes}m ago": "{minutes} 分钟前", "{state} · {time} · {lag}": "{state} · {time} · {lag}", "Observed": "观测", "History": "历史", "Observation unavailable": "观测不可用", "Waiting for observation": "等待观测数据", + "{detail} · synced": "{detail} · 已同步", + "{detail} · nearest": "{detail} · 最近", "RADAR REFLECTIVITY · dBZ": "雷达反射率 · dBZ", "LIGHTNING DENSITY · 15 min accumulation": "闪电密度 · 15 分钟累计", "GLOBAL INFRARED · hourly": "全球红外 · 每小时", "GOES INFRARED · ~5 min": "GOES 红外 · 约 5 分钟", "{state}: {time}": "{state}:{time}", "Latest observation": "最新观测", + "frame {index}/{total}": "第 {index}/{total} 帧", "loading": "加载中", "Observation: unavailable": "观测:不可用", "Contiguous US · gaps ≠ no rain": "美国本土 · 无回波 ≠ 无降雨", "Americas + Pacific · not individual strikes": "美洲与太平洋 · 非单次闪击", - "Color: strikes/km²/min ×10³": "颜色:次闪/km²/分钟 ×10³", + "Color: strikes/km²/min ×10³": "颜色:次闪击/km²/分钟 ×10³", "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · 通常延迟 2–3 小时", "North America · infrared imagery": "北美洲 · 红外影像", "Reduced motion · history playback unavailable": "减弱动效 · 历史回放不可用", @@ -647,38 +1166,50 @@ "Stale source": "数据源已过期", "Loading next frame…": "正在加载下一帧…", "Map center outside coverage": "地图中心在覆盖范围之外", + "strikes/km²/min ×10³": "次闪击/km²/分钟 ×10³", "N. America": "北美", "Global": "全球", "Hourly global mosaic; usually 2–3 hours delayed": "每小时全球拼图;通常延迟 2–3 小时", "GOES regional clouds; approximately 5-minute updates": "GOES 区域云图;约 5 分钟更新", "Clouds only": "仅云区", + "Apply the full cloud brightness key; 100% filter strength": "应用完整的云层亮度映射;滤镜强度 100%", "Full": "完整", + "Show the complete infrared image; 0% filter strength": "显示完整红外图像;滤镜强度 0%", "Soft": "柔和", "Vivid": "鲜明", "Image opacity; does not alter the observed values": "图像不透明度;不改变观测值", "View US radar": "查看美国雷达", "View Americas & Pacific": "查看美洲与太平洋", "View coverage": "查看覆盖范围", - "{value} strikes/km²/min ×10³ (15-minute density)": "{value} 次闪/km²/分钟 ×10³(15 分钟密度)", + "{value} strikes/km²/min ×10³ (15-minute density)": "{value} 次闪击/km²/分钟 ×10³(15 分钟密度)", "{value} dBZ radar reflectivity": "{value} dBZ 雷达反射率", "STALE · cached source metadata": "已过期 · 数据源元数据为缓存", "Map center is outside source coverage": "地图中心在数据源覆盖范围之外", "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "NOAA/NWS 15 分钟闪电密度,来源为 Vaisala NLDN/GLD360。覆盖自 110°E 经太平洋/美洲至 0°,25°S–80°N。不是实时闪击计数、不是全球覆盖,也不构成安全警示。", - "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "NOAA MRMS 雷达回波反映降水形态,不代表降雨强度、风暴警报或未来预报。原始数据约 1 公里分辨率;显示限制在第 6 级。各帧使用数据源公布的精确观测时间。", + "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "NOAA MRMS 雷达回波反映降水形态,不代表降雨强度、风暴警报或未来预报。原始数据分辨率约 1 km;显示限制在第 6 级。各帧使用数据源公布的精确观测时间。", "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "GOES-19/18 第 14 波段长波红外区域图;NESDIS 全球长波拼图。“仅云区”会调暗除明亮冷云顶之外的一切;这是亮度滤镜,不是云掩膜。覆盖范围与新鲜度因区域而异。", "REGION": "区域", "IMAGE": "图像", + "FILTER": "滤镜", + "Cloud filter strength": "云层滤镜强度", "OPACITY": "不透明度", + "Infrared decode failed": "红外图像解码失败", + "Weather prefetch unavailable": "天气预取不可用", "Weather tiles unavailable · previous frame retained": "天气瓦片不可用 · 保留上一帧", "Some weather tiles unavailable": "部分天气瓦片不可用", + "Malformed weather manifest": "天气清单格式错误", + "Weather request timed out": "天气请求超时", "Temperature field unavailable": "温度字段不可用", + "Mean sea level pressure field unavailable": "平均海平面气压场不可用", + "Wind upstream unavailable": "风场上游数据源不可用", + "{source} HTTP {status}": "{source} HTTP {status}", "Wind": "风", "Wind source unavailable": "风场数据源不可用", "Forecast · does not follow history": "预报 · 不随观测历史变化", "Wind motion": "风场运动", "Wind speed": "风速", "Sea-level pressure": "海平面气压", - "Air temperature · 2 m": "2 米气温", + "Air temperature · 2 m": "气温 · 2 m", "Global · 1° grid": "全球 · 1° 网格", "{model} forecast · {time}": "{model} 预报 · {time}", "Loading forecast": "正在加载预报", @@ -703,32 +1234,69 @@ "Read wind at map center": "读取地图中心风速", "Read the forecast at the center of the map without changing selection": "读取地图中心的预报值,不改变当前选择", "{model} forecast · {field} ({unit})": "{model} 预报 · {field}({unit})", - "Valid: {time}": "生效:{time}", + "Valid: {time}": "有效时间:{time}", + "preparing": "准备中", "Issued: {time}": "发布:{time}", "Selected field unavailable · wind remains visible": "所选字段不可用 · 风场仍可见", "{error} · wind remains visible": "{error} · 风场仍可见", - "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "10 米高度的地表风。约 1° 全球网格。流线沿 10 米风场绘制,为便于观看抬升至 12 公里;显示高度并非天气高度。视图光照仅为可读性服务。动画展示的是单一固定预报内的流场,不推进时间。颜色字段贴附于球体底图或当前的照片级 3D Tiles。", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "10 m 高度的地表风。约 1° 全球网格。流线沿 10 m 风场绘制,为便于观看抬升至 12 km;显示高度并非天气高度。视图光照仅为可读性服务。动画展示的是单一固定预报内的流场,不推进时间。颜色字段贴附于球体底图或当前的照片级 3D Tiles。", "MODEL": "模型", "FIELD": "字段", "UNITS": "单位", "MOTION": "运动", "Forecast": "预报", + "NNE": "北东北", + "NE": "东北", + "ENE": "东东北", + "ESE": "东东南", + "SE": "东南", + "SSE": "南东南", + "SSW": "南西南", + "SW": "西南", + "WSW": "西西南", + "WNW": "西西北", + "NW": "西北", + "NNW": "北西北", "No surface reading": "暂无地表读数", "Aim the map center at Earth": "请将地图中心对准地球", "A location reading needs a loaded forecast and the Earth at the center of the view.": "位置读数需要已加载的预报,且地图中心对准地球。", "Interpolated model forecast on an approximately 1° grid. Broad weather patterns, not a street-level measurement.": "按约 1° 网格插值的模式预报。反映大范围天气形势,不是街道级实测。", - " from {direction}": "从{direction}出发", + " · calm": " · 静风", + " from {direction}": ",{direction}风", "WIND AT {coordinates}": "{coordinates} 的风", - "{model} · valid {time}": "{model} · 生效 {time}", + "{model} · valid {time}": "{model} · 有效时间 {time}", + "Wind speed field unavailable": "风速场不可用", "Globe imagery unavailable": "球体影像不可用", "Globe field image unavailable": "球体字段图像不可用", + "Unknown wind model": "未知风场模式", + "Unknown weather overlay": "未知天气叠加层", + "Wind request timed out": "风场请求超时", + "Malformed wind manifest": "风场清单格式错误", + "Malformed wind grid": "风场网格格式错误", "Error: {message}": "错误:{message}", "Needs {envVars} — add it in Provider Settings": "需要 {envVars},请在服务商设置中添加", "{label} is unavailable": "{label} 不可用", "This map stack": "此地图组合", "{label} unavailable: {hint}": "{label} 不可用:{hint}", - "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Google 3D 瓦片不可用 — 请检查密钥的 API 限制、配额或网络", + "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Google 3D 瓦片不可用——请检查密钥的 API 限制、配额或网络", + "Needs {envVars} — add it in Provider Settings — or a Cesium ion token for the ion-hosted route": "需要 {envVars}(请在服务商设置中添加),或使用 Cesium ion 令牌走 ion 托管通道", + "Exit cockpit to fly to a camera": "请先退出座舱,再飞往摄像头", + "Exit cockpit to fly to a location": "请先退出座舱,再飞往该地点", + "Exit cockpit to fly to a photo": "请先退出座舱,再飞往照片", + "Exit cockpit to fly to a shared view": "请先退出座舱,再飞往分享的视图", + "Exit cockpit to fly to a target": "请先退出座舱,再飞往目标", + "Exit cockpit to fly to a vessel": "请先退出座舱,再飞往船舶", + "Exit cockpit to fly to a fire": "请先退出座舱,再飞往火点", + "Exit cockpit to fly to a route": "请先退出座舱,再飞往路线", + "Exit cockpit to fly to a file": "请先退出座舱,再飞往文件位置", + "Exit cockpit to fly to a scene": "请先退出座舱,再飞往场景", + "Exit cockpit to view weather coverage": "请先退出座舱,再查看天气覆盖范围", + "Exit cockpit to fly to a cyclone": "请先退出座舱,再飞往气旋", + "Exit cockpit to fly to an aircraft": "请先退出座舱,再飞往飞机", + "Exit cockpit to fly to a satellite": "请先退出座舱,再飞往卫星", + "Exit cockpit to frame contacts": "请先退出座舱,再取景目标", "Visible map targets": "可见的地图目标", + "Focusing {label}": "正在聚焦 {label}", "Source": "来源", "Camera ownership changed": "相机所有权已变更", "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "已保存的项目无法读取;存储已保留。请导入有效文件以恢复保存。", @@ -782,11 +1350,41 @@ "Thermal Threat Board": "热源威胁看板", "City Overload": "城市过载", "Omniscience Pullback": "全知拉远", + "Global Incident Context": "全球事件背景", + "Nepal-Focused Globe Rotation": "聚焦尼泊尔的地球旋转", + "Bhote Koshi Regional Approach": "Bhote Koshi 区域接近", + "Bhote Koshi Nearby Cities": "Bhote Koshi 周边城市", + "Bhote Koshi Incident Corridor": "Bhote Koshi 事件走廊", + "Bhote Koshi Flood Path": "Bhote Koshi 洪水路径", + "Bhote Koshi Corridor Overview": "Bhote Koshi 走廊概览", + "Bhote Koshi Upper Valley": "Bhote Koshi 上游河谷", + "Upper Valley Collapse": "上游河谷崩塌", + "Debris-Dammed Lake": "碎屑堰塞湖", + "Nepal-China Border Gate": "尼中边境口岸", + "Timure Evidence Cluster": "Timure 证据群", + "Syabru Besi Passage": "Syabru Besi 通道", + "Bidur / Trishuli Consequence": "Bidur / Trishuli 后果", + "Final view": "最终视图", "Scene {n}": "场景 {n}", "Shot {n}": "镜头 {n}", + "the title of scene {scene} is empty or longer than {max} characters": "场景 {scene} 的标题为空或超过 {max} 个字符", + "the title of shot {shot} in scene {scene} is empty or longer than {max} characters": "场景 {scene} 中镜头 {shot} 的标题为空或超过 {max} 个字符", + "the project is larger than 5 MiB": "项目大于 5 MiB", + "the project has too many shots": "项目中的镜头过多", + "the scene data failed validation": "场景数据未通过校验", "Could not complete this action. Check the file, references and selected assets.": "无法完成此操作。请检查文件、引用和所选资源。", + "{count} scenes": { + "other": "{count} 个场景" + }, + "{count} shots": { + "other": "{count} 个镜头" + }, + "{count} data packs": { + "other": "{count} 个数据包" + }, "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack}:{status}。文件:{path}。{attribution} · {license}", "Unavailable layers: {layers}": "不可用图层:{layers}", + "Uses registered content or linked media. Those external files are not included in a scene bundle. Their original notices still apply.": "使用了已注册内容或链接媒体。这些外部文件不包含在场景资源包中。其原始声明仍然适用。", "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "已校验 {bytes} 个打包字节。文件仅保留在本次会话的内存中。重新加载应用后请再次导入资源包。", "Review scene import": "审查场景导入", "Nothing is loaded or changed until you apply this file.": "在你应用此文件之前,不会载入或更改任何内容。", @@ -815,35 +1413,115 @@ "Or choose a data-pack folder": "或选择数据包文件夹", "Download asset bundle": "下载资源包", "Asset bundle downloaded": "资源包已下载", + "No RTL-SDR device selected": "未选择 RTL-SDR 设备", + "WebUSB requires desktop Chrome or Edge on localhost/HTTPS": "WebUSB 需要在 localhost/HTTPS 上使用桌面版 Chrome 或 Edge", + "RTL-SDR access failed; close other SDR apps and check USB permissions": "RTL-SDR 访问失败;请关闭其他 SDR 应用并检查 USB 权限", + "RTL-SDR connection failed": "RTL-SDR 连接失败", + "Receiving 1090 MHz ADS-B": "正在接收 1090 MHz ADS-B", + "Receiving broadcast FM": "正在接收广播 FM", + "Connect an RTL-SDR to begin.": "连接 RTL-SDR 即可开始。", + "WebUSB is unavailable in this browser": "此浏览器不支持 WebUSB", + "USB work abandoned after a stalled transfer": "USB 传输停滞,已放弃操作", + "SDR decoder worker failed": "SDR 解码器工作线程失败", + "SDR decoder did not start; receiver stopped": "SDR 解码器未能启动;接收机已停止", + "SDR decoder stopped responding; receiver stopped": "SDR 解码器停止响应;接收机已停止", + "SDR decoder fell behind; receiver stopped": "SDR 解码器处理滞后;接收机已停止", + "WebUSB requires desktop Chrome or Edge": "WebUSB 需要桌面版 Chrome 或 Edge", + "Waiting for an RTL-SDR device…": "正在等待 RTL-SDR 设备…", + "Browser audio is suspended; press Connect again to resume it": "浏览器音频已挂起;再次按“连接”以恢复", + "RTL-SDR sample stream stopped": "RTL-SDR 采样流已停止", + "Switching to {mode}…": "正在切换到 {mode}…", + "Browser audio is suspended; select FM again to resume it": "浏览器音频已挂起;再次选择 FM 以恢复", + "RTL-SDR gain change failed": "RTL-SDR 增益调整失败", + "Tuned to {mhz} MHz FM": "已调谐到 FM {mhz} MHz", + "Seeking up…": "正在向上搜台…", + "Seeking down…": "正在向下搜台…", + "Seek stopped": "搜台已停止", + "Scanning {mhz} MHz…": "正在扫描 {mhz} MHz…", + "Found {mhz} MHz · {snr} dB": "找到 {mhz} MHz · {snr} dB", + "FM signal found at {mhz} MHz": "在 {mhz} MHz 找到 FM 信号", + "No FM signal found": "未找到 FM 信号", + "Browser location is unavailable": "浏览器位置不可用", + "Receiver location was not granted": "未授予接收机位置权限", + "RTL-SDR disconnected": "RTL-SDR 已断开", + "Upstream response too large": "上游响应过大", + "Vector tile request timed out": "矢量瓦片请求超时", + "Vector tiles unavailable": "矢量瓦片不可用", + "Vector tile metadata unavailable": "矢量瓦片元数据不可用", + "Zoom in for vector tile coverage": "放大以查看矢量瓦片覆盖", + "Saturation": "饱和度", + "Edge Thickness": "描边粗细", + "Contrast": "对比度", + "Grain": "颗粒", + "Vignette": "暗角", + "Pixelation": "像素化", + "Distortion": "畸变", + "Instability": "不稳定", "Density": "密度", "Gain": "增益", "Bloom": "泛光", + "Scanlines": "扫描线", + "Sensitivity": "灵敏度", + "WHOT/BHOT": "WHOT/BHOT", + "Ironbow": "Ironbow", + "unsaved CCTV calibration": "未保存的 CCTV 校准", + "the open cockpit": "当前打开的座舱", + "Switching language reloads the page. This will be lost: {items}. Switch anyway?": "切换语言会重新加载页面。以下内容将会丢失:{items}。仍要切换吗?", "VISUAL PRESETS": "视觉预设", "LOCATION": "位置", - "CONTACTS — nearest planes · vessels · sites": "目标:最近的飞机 · 船舶 · 站点", + "CONTACTS — nearest planes · vessels · sites": "目标:最近的飞机 · 船舶 · 设施", "SPACE MISSIONS — launches & orbital assets": "太空任务:发射与在轨资产", "LIVE SIGNALS": "实时信号", "CCTV layer unavailable": "CCTV 图层不可用", "Link copied!": "链接已复制!", "Copy failed": "复制失败", + "Return map to straight-down view": "将地图恢复为垂直俯视", "Tilt map to oblique view": "将地图倾斜至斜视角", + "Reset map to north up. Current heading {heading} degrees": "将地图重置为朝北。当前航向 {heading} 度", + "Tilted view": "倾斜视角", + "Straight-down view": "垂直俯视", + "North up": "朝北", "CCTV calibration saved": "CCTV 校准已保存", + "HDG": "HDG", + "PITCH": "俯仰", + "FOV": "FOV", "RANGE": "范围", - "{value}m": "{value}分钟", + "HGT": "高度", + "ΔN": "ΔN", + "ΔE": "ΔE", + "{value}m": "{value} m", "CCTV calibration reset": "CCTV 校准已重置", "ADJUST ON": "调整开", "ADJUST": "调整", + "SNAPSHOT": "快照", "LIVE": "实时", + "UPSTREAM": "上游", + "SYNTHETIC": "合成", + "CONFIGURED": "已配置", + "SEED": "种子", "UNKNOWN": "未知", "ERROR": "错误", + "Live HLS connected": "实时 HLS 已连接", + "Live HLS unavailable": "实时 HLS 不可用", + "No stream URL configured": "未配置流 URL", + "Live stream connected": "实时流已连接", + "Snapshot feed connected": "快照数据源已连接", + "Media fetch failed": "媒体获取失败", + "Upstream snapshot active": "上游快照已启用", + "Fallback Street View frame": "备用街景画面", + "Upstream unavailable": "上游不可用", + "No source configured": "未配置来源", "Configured source": "已配置数据源", "Configured Source": "已配置数据源", + "Synthetic fallback": "合成备用", + "Upstream HTTP {status}": "上游 HTTP {status}", + "Unexpected media type {type}": "意外的媒体类型 {type}", "SOURCE · UNKNOWN": "来源 · 未知", "FRAME · LOADING": "画面 · 加载中", "FRAME · UNAVAILABLE": "画面 · 不可用", "CALIBRATED": "已校准", "CURATED": "已整理", - "RAW PRIOR": "原始默认", + "RAW PRIOR": "初始估计", "CCTV ON": "CCTV 开", "CCTV OFF": "CCTV 关", "VIEWSHED ON": "可视域开", @@ -857,14 +1535,14 @@ "CAL · {badge}": "CAL · {badge}", "MONITOR": "监视器", "OFF": "关", - "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · 范围 {range}m · {projection}{calBadge} · {provider}{status}", + "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · 范围 {range} m · {projection}{calBadge} · {provider}{status}", "{count} cameras loaded · click a camera to activate": { "other": "已加载 {count} 个摄像头 · 点击摄像头以激活" }, "{count} cameras loaded · enable CCTV to activate": { "other": "已加载 {count} 个摄像头 · 启用 CCTV 以激活" }, - "Enable CCTV to load camera intersections": "启用 CCTV 以加载摄像头路口", + "Enable CCTV to load camera intersections": "启用 CCTV 以加载路口摄像头", "Enable CCTV to start camera-linked intelligence summaries.": "启用 CCTV 以开始生成与摄像头关联的情报摘要。", "No summary available.": "暂无摘要。", "loading frames": "正在加载画面", @@ -884,7 +1562,7 @@ "MIXED CONDITIONS": "混合天气", "CYCLE ON": "轮换开", "CYCLE OFF": "轮换关", - "Stop automatic page cycling. Previous, Next, and the SIG/NEWS/LOCAL tabs stay available.": "停止自动翻页。上一页、下一页以及 SIG/NEWS/LOCAL 标签仍可使用。", + "Stop automatic page cycling. Previous, Next, and the SIG/NEWS/LOCAL tabs stay available.": "停止自动翻页。上一页、下一页以及“信号”“新闻”“本地”标签仍可使用。", "Cycle briefing pages automatically every 9 seconds (Signals → News → Local). Pauses while you hover or focus the panel. Live signal data refreshes continuously either way.": "每 9 秒自动轮换简报页面(信号 → 新闻 → 本地)。悬停或聚焦面板时暂停。无论是否轮换,实时信号数据都会持续刷新。", "ACQUIRING REGIONAL NEWS": "正在获取地区新闻", "REGIONAL NEWS UNAVAILABLE": "地区新闻不可用", @@ -892,12 +1570,15 @@ "REGION UNAVAILABLE": "区域不可用", "NO RECENT LOCATION MATCHES": "暂无近期位置匹配结果", "{domain} · {age}": "{domain} · {age}", + "{value} KM/H": "{value} km/h", "CLOUD {pct}%": "云量 {pct}%", "CLOUD UNKNOWN": "云量未知", "{source} · LOCATION QUERY": "{source} · 位置查询", "REGIONAL NEWS": "地区新闻", - "CONTEXT STANDBY": "上下文待机", - "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "启用全局上下文以获取邻近 PING", + "{label} · {radius} AIR/SEA WINDOW": "{label} · {radius} 空中 / 海上范围", + "{scope} · INSTALLATIONS {coverage}": "{scope} · 设施 {coverage}", + "CONTEXT STANDBY": "态势待机", + "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "启用全局态势以获取邻近提示", "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "目标丢失 · 最后已知读数 · 不代表安全无虞", "CONTACT LOST · {subject}": "目标丢失 · {subject}", "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "目标已脱离其数据源 · 读数保持最后已知值", @@ -912,6 +1593,9 @@ "other": "{count} 项输入未知 · 不代表安全无虞" }, "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "可用输入均为最新 · 不代表安全无虞", + "SQUAWK {code} · {status}": "应答码 {code} · {status}", + "ADS-B PRIORITY · {status}": "ADS-B 优先 · {status}", + "ADS-B EMERGENCY · {status}": "ADS-B 紧急 · {status}", "AIRCRAFT": "飞机", "ACQUIRING SURFACE": "正在获取地面数据", "SURFACE FALLBACK": "地面数据备用", @@ -930,7 +1614,7 @@ "Night vision": "夜视", "Thermal": "热成像", "Anime": "动漫", - "Noir": "黑色电影", + "Noir": "黑白", "Snow": "雪景", "Current cockpit vision style: {style}. Activate for next style.": "当前座舱视觉样式:{style}。激活可切换到下一个样式。", "Current style: {style} — click for next": "当前样式:{style}——点击切换下一个", @@ -942,9 +1626,10 @@ "Expand cockpit briefing panel": "展开座舱简报面板", "Collapse briefing panel": "收起简报面板", "Expand briefing panel": "展开简报面板", - "OBSERVED / MAPPED PINGS": "观测 / 地图标注 PING", + "OBSERVED / MAPPED PINGS": "观测 / 地图标注提示", "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "来源可查的事件 · 无合成新闻", "LATEST LOCATION-MATCHED REPORTING": "最新的位置匹配报道", + "{source} · LOCATION QUERY · RECENT": "{source} · 位置查询 · 近期", "LOCAL INFO": "本地信息", "PLACE / CONDITIONS / POSITION": "地点 / 状况 / 位置", "TIME UNKNOWN": "时间未知", @@ -966,7 +1651,7 @@ "Reclassify as TR-3B": "重新归类为 TR-3B", "TRACK ACQUIRED": "已锁定航迹", "{label} · COURSE {heading}°": "{label} · 航向 {heading}°", - "Context could not restore every layer; try again": "上下文未能恢复所有图层,请重试", + "Context could not restore every layer; try again": "态势未能恢复所有图层,请重试", "No selected data layers": "没有已选数据图层", "{count} data layers could not be cleared": { "other": "{count} 个数据图层无法清除" @@ -980,18 +1665,40 @@ "Nearby installations refreshed": "附近设施已刷新", "Nearby installations could not be refreshed; try again": "无法刷新附近设施,请重试", "Space Missions cancellation could not restore the previous layer state": "取消太空任务后无法恢复先前的图层状态", - "That layer is unavailable in the current Context mode": "该图层在当前上下文模式下不可用", + "That layer is unavailable in the current Context mode": "该图层在当前态势模式下不可用", "{layerId} could not {action} cleanly": "{layerId} 未能正常{action}", "start": "启动", "stop": "停止", "{mode} could not start because another layer did not stop cleanly": "{mode}无法启动,因为另一个图层未能正常停止", "Space Missions": "太空任务", - "Context": "上下文", + "Context": "态势", "Rendered globe frames per second · toggle with `": "每秒渲染的地球帧数 · 按 ` 键切换", + "imported map files": "已导入的地图文件", + "Ground heights could not be refreshed. Try the file again when the map has loaded.": "无法刷新地面高度。请在地图加载完成后重新尝试该文件。", + "{count} map objects": { + "other": "{count} 个地图对象" + }, + ", drawn with its own styles": ",使用其自带样式绘制", + "Hide {name}": "隐藏 {name}", "Show {name}": "显示 {name}", - "Fly to {name}": "飞往{name}", + "Fly to {name}": "飞往 {name}", + "Remove {name}": "移除 {name}", + "At most {count} files at once — remove one first.": "一次最多 {count} 个文件——请先移除一个。", + "Reading {name}…": "正在读取 {name}…", + "That file could not be read.": "无法读取该文件。", + "Added {count} files.": { + "other": "已添加 {count} 个文件。" + }, + "{count} files could not be added ({name}: {error})": { + "other": "{count} 个文件无法添加({name}:{error})" + }, + "Some KML content was left out.": "部分 KML 内容未被导入。", "Press on the ground, not the sky": "请按在地面,而不是天空", "Drag to size the box": "拖动以调整框选大小", + "light {source} to use your {name} key": "开启 {source} 以使用你的 {name} 密钥", + "light {source}": "开启 {source}", + ", or ": ",或", + "{requirement}, or {offer}": "{requirement},或{offer}", "Live Flights": "实时航班", "Military Flights": "军用航班", "Earthquakes (24h)": "地震(24 小时)", @@ -1003,32 +1710,39 @@ "Bikeshare": "共享单车", "Live AIS Vessels": "实时 AIS 船舶", "Mapped Installations": "地图标注设施", - "Global Context": "全局上下文", + "Global Context": "全局态势", "Datacenters": "数据中心", "Dams": "水坝", "Submarine Cables": "海底电缆", "FIRMS Active Fires": "FIRMS 活跃火点", "Local ADS-B": "本地 ADS-B", - "Transit": "交通", + "Transit": "公共交通", "Recent Imagery": "近期影像", "Fire Perimeters": "火场周界", + "GNSS Integrity": "GNSS 完好性", "Rain radar": "降雨雷达", "Lightning density": "闪电密度", "Cyclone advisories": "气旋公告", "ALPR Cameras": "ALPR 摄像头", "Live Vessels": "实时船舶", - "Bike Share": "公共自行车", - "Cameras": "相机", + "Bike Share": "共享单车", + "Cameras": "摄像头", "Street Level": "街景", "Mapped ALPR Cameras": "ALPR 摄像头", "Data Centers": "数据中心", "Active Fires": "活跃火点", "Military aircraft": "军用飞机", + "Vessels": "船舶", + "CCTV + Street View fallback": "CCTV + 街景备用", + "OpenStreetMap + optional Google Maps Places": "OpenStreetMap + 可选 Google Maps Places", "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · 预报", "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · 观测", + "NASA FIRMS · LIVE": "NASA FIRMS · 实时", + "OSM routing": "OSM 路线规划", + "data source|Local": "本地", "ENABLING": "启用中", "DISABLING": "停用中", - "Movement": "移动", + "Movement": "动态目标", "Infrastructure": "基础设施", "Events": "事件", "Weather": "天气", @@ -1038,7 +1752,7 @@ "UNCERTAIN · {source} · lifecycle state requires reconciliation": "不确定 · {source} · 生命周期状态需要核对", "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · {seconds} 秒后重试", "{state} · {source} · {detail}": "{state} · {source} · {detail}", - "never": "从未", + "never": "未更新", "{source} · {loadingLabel}": "{source} · {loadingLabel}", "{accepted} of {raw} records accepted": "已接受 {accepted} / {raw} 条记录", "incomplete snapshot": "快照不完整", @@ -1047,20 +1761,33 @@ "{state} · {source} · {ago}": "{state} · {source} · {ago}", "{source} · {ago}": "{source} · {ago}", "UNCERTAIN": "不确定", + "status chip|UNAVAILABLE": "不可用", "Data source unavailable": "数据源不可用", "{name}: {state}": "{name}:{state}", "{count}s ago": "{count} 秒前", + "Local FM stopped: internet radio started": "本地 FM 已停止:网络电台已开始播放", + "IDLE": "空闲", "CONNECTING": "连接中", "TUNING": "调谐中", - "STREAMING": "正在流式接收", + "STREAMING": "接收中", + "UNSUPPORTED": "不支持", + "idle": "空闲", + "running": "运行中", + "suspended": "已挂起", + "closed": "已关闭", + "feed status|live": "实时", + "feed status|stale": "过期", + "feed status|unreachable": "无法访问", + "feed status|invalid": "无效", "waiting for IQ": "等待 IQ 数据", "{count} messages": { "other": "{count} 条消息" }, "DSP {count} blocks": { - "other": "DSP {count} 个模块" + "other": "DSP {count} 个数据块" }, "DSP waiting": "DSP 等待中", + "{level} dBFS audio": "音频 {level} dBFS", "audio signal --": "音频信号 --", "audio {state}": "音频 {state}", "{count} HEARD": { @@ -1072,7 +1799,12 @@ "LOCATED": "已定位", "LOCATE": "定位", " · read while Local ADS-B is on": " · 仅在本地 ADS-B 开启时读取", + "Decoder feeds: {feeds}": "解码器数据源:{feeds}", + "Language: {language}": "语言:{language}", + "Change the interface language": "更改界面语言", "Interface language": "界面语言", + "Search languages": "搜索语言", + "No matching languages": "没有匹配的语言", "📍 Location: --": "📍 位置:--", "Landmark: --": "地标:--", "Searched location": "已搜索的位置", @@ -1093,7 +1825,9 @@ "Collapse Radio": "收起电台", "Expand Radio section": "展开电台区域", "Collapse Radio section": "收起电台区域", + "Double-click the header to snap the panel back": "双击标题栏可将面板复位", "Panel layout updated — positions reset to new defaults": "面板布局已更新——位置已重置为新的默认值", + "Drag to resize · double-click the header to snap back": "拖动以调整大小 · 双击标题栏复位", "Austin": "奥斯汀", "San Francisco": "旧金山", "New York": "纽约", @@ -1103,6 +1837,7 @@ "Dubai": "迪拜", "Washington DC": "华盛顿特区", "Tallinn": "塔林", + "Los Angeles": "洛杉矶", "Collapse Cockpit display options": "收起座舱显示选项", "Expand Cockpit display options": "展开座舱显示选项", "Collapse Cockpit Radio controls": "收起座舱电台控件", @@ -1116,8 +1851,8 @@ "STATION UNAVAILABLE": "电台不可用", "Station unavailable after directory refresh": "目录刷新后该电台不可用", "Radio could not {action} cleanly": "电台未能正常{action}", - "Go to expanded Radio section": "前往展开的电台分区", - "Expand Radio section in Context": "在态势面板中展开电台分区", + "Go to expanded Radio section": "前往展开的电台区域", + "Expand Radio section in Context": "在态势面板中展开电台区域", "Close compact Radio controls": "关闭精简电台控件", "Open compact Radio controls": "打开精简电台控件", "SYNC": "同步", @@ -1128,7 +1863,7 @@ "Disable Radio": "停用电台", "Enable Radio": "启用电台", "DIRECTORY BAND": "目录频段", - "{category} BAND": "{category}频段", + "{category} BAND": "{category} 频段", "NO STATION SELECTED": "未选择电台", "Directory metadata only": "仅目录元数据", "Loading station directory…": "正在加载电台目录…", @@ -1174,7 +1909,12 @@ "Newest frame per product": "每个产品的最新一帧", "Replay observed history": "回放观测历史", "Imagery on Esri · Google 3D returns when cleared": "影像来自 Esri · 清除后恢复 Google 3D", + "Point the camera at the ground to use the view": "将相机对准地面才能使用当前视野", + "That point cannot anchor a box": "该点无法作为框选锚点", + "Imagery stops at ±{limit}° latitude": "影像仅覆盖到纬度 ±{limit}°", "{owner} is using the pointer — close it first": "{owner} 正在使用指针——请先将其关闭", + "Box is {size} wide · limit {limit}": "框选宽 {size} · 上限 {limit}", + "View is {size} wide · limit {limit}": "视野宽 {size} · 上限 {limit}", "VS BASEMAP": "对比底图", "A / B": "A / B", "Newest low-cloud day for this box · scene cloud, not box cloud": "此框选最新的低云日 · 云量为场景云量,而非框内云量", @@ -1187,6 +1927,8 @@ "newest overview": "最新概览", "No imagery": "无影像", "Loading": "加载中", + "coverage|full": "完整", + "coverage|partial": "部分", "unknown": "未知", "no imagery": "无影像", "{percent}% cloud": "{percent}% 云量", @@ -1215,7 +1957,7 @@ "Trade the two sides of the divider": "互换分割线两侧", "SELECT BOX": "框选区域", "Drag a box on the map (Esc cancels)": "在地图上拖出框选(Esc 取消)", - "USE VIEW": "使用当前视野", + "USE VIEW": "使用视野", "Use the current view as the box": "以当前视野作为框选", "Forget the box and its images": "清除框选及其影像", "START HERE": "从此开始", @@ -1225,19 +1967,24 @@ "SHOW": "显示", "Pin {day} as {slot}": "将 {day} 钉为 {slot}", "Show {day}": "显示 {day}", + "pinned {slot}": "已钉为 {slot}", + "shown": "显示中", "preview": "预览", "start here": "从此开始", "No box": "无框选", "Searching": "搜索中", "Every day is empty here": "此处每天都为空", "Sources off": "数据源未开启", + "VS": "对比", "Not set": "未设置", "Basemap": "底图", + "Source off": "数据源已关", "Unpin {slot}": "取消钉住 {slot}", "Unpin the image": "取消钉住图像", "EXPORT {slot}": "导出 {slot}", "EXPORT": "导出", "Download {slot} as a PNG": "将 {slot} 下载为 PNG", + "Download the image as a PNG": "将图像下载为 PNG", "Box {width} × {height} km": "框选 {width} × {height} km", "Acquired {time}": "获取于 {time}", "Coverage {coverage}": "覆盖 {coverage}", @@ -1264,14 +2011,29 @@ "Stopped (Esc)": "已停止(Esc)", "SPARSE": "稀疏", "BALANCED": "均衡", - "No shots yet. Use CAPTURE SHOT to save current look.": "暂无镜头。使用“采集镜头”保存当前画面。", + "No shots yet. Use CAPTURE SHOT to save current look.": "暂无镜头。使用“截取镜头”保存当前画面。", "Double-click to rename": "双击重命名", "Shot name": "镜头名称", "LOAD": "载入", "DEL": "删除", + "{duration}s + {hold}s": "{duration} 秒 + {hold} 秒", + "Choose files": "选择文件", + "{count} files selected": { + "other": "已选择 {count} 个文件" + }, + "No file chosen": "未选择文件", "Cancel": "取消", "EDIT DETAILS": "编辑详情", "SHARE SCENE": "分享场景", + "Shared flight follow expired": "共享的航班跟随已过期", + "Shared military flight follow expired": "共享的军用航班跟随已过期", + "Shared satellite follow expired": "共享的卫星跟随已过期", + "Shared flight could not be restored — feed unavailable": "无法恢复共享的航班——数据源不可用", + "Shared military flight could not be restored — feed unavailable": "无法恢复共享的军用航班——数据源不可用", + "Shared satellite could not be restored — feed unavailable": "无法恢复共享的卫星——数据源不可用", + "Shared flight is unavailable": "共享的航班不可用", + "Shared military flight is unavailable": "共享的军用航班不可用", + "Shared satellite is unavailable": "共享的卫星不可用", "entity": "实体", "Shared {subject} follow expired": "共享的 {subject} 跟随已过期", "Shared {subject} could not be restored — feed unavailable": "无法恢复共享的 {subject}——数据源不可用", @@ -1284,9 +2046,9 @@ "LOAD CANCELLED": "加载已取消", "LOAD FAILED": "加载失败", "LIVE DATA OFF": "实时数据已关闭", - "MAPPED SITES LOADED": "已加载地图站点", - "RETRYING MAPPED SITES": "正在重试地图站点", - "FETCHING MAPPED SITES": "正在获取地图站点", + "MAPPED SITES LOADED": "已加载地图标注设施", + "RETRYING MAPPED SITES": "正在重试地图标注设施", + "FETCHING MAPPED SITES": "正在获取地图标注设施", "RETRYING ALPR CAMERAS": "正在重试 ALPR 摄像头", "FETCHING ALPR CAMERAS": "正在获取 ALPR 摄像头", "OVERPASS TEMPORARILY UNAVAILABLE": "Overpass 暂时不可用", @@ -1301,11 +2063,48 @@ "retry pending": "等待重试", "retrying in {seconds}s": "{seconds} 秒后重试", "ALPR cameras": "ALPR 摄像头", + "OpenSky OAuth client missing/invalid": "OpenSky OAuth 客户端缺失/无效", + "OpenSky OAuth rejected credentials": "OpenSky OAuth 拒绝了凭据", + "OpenSky username/password rejected": "OpenSky 用户名/密码被拒绝", + "OpenSky auth missing": "OpenSky 缺少认证", + "OpenSky auth required": "OpenSky 需要认证", + "OpenSky auth invalid": "OpenSky 认证无效", + "OpenSky auth failed": "OpenSky 认证失败", + "KartaView answered HTTP {status}": "KartaView 返回 HTTP {status}", + "Panoramax answered HTTP {status}": "Panoramax 返回 HTTP {status}", + "KartaView refused the request (code {code})": "KartaView 拒绝了请求(代码 {code})", + "Vector tiles unavailable (HTTP {status})": "矢量瓦片不可用(HTTP {status})", + "GNSS feed unavailable (HTTP {status})": "GNSS 数据源不可用(HTTP {status})", + "{count} CelesTrak groups unavailable": { + "other": "{count} 个 CelesTrak 分组不可用" + }, + "{feed} feed unavailable": "{feed} 数据源不可用", + "Source snapshot {minutes} min old": "数据源快照:{minutes} 分钟前", + "{source} rate limited (anonymous)": "{source} 已限流(匿名)", + "{source} rate limited": "{source} 已限流", + "{source} network error": "{source} 网络错误", + "Malformed {source} aircraft rows": "{source} 飞机数据行格式错误", + "Malformed {source} response": "{source} 响应格式错误", + "entry {n}": "条目 {n}", + "feeds {names} stale": { + "other": "数据源 {names} 过期" + }, + "feeds {names} unreachable": { + "other": "数据源 {names} 无法连接" + }, + "feeds {names} invalid": { + "other": "数据源 {names} 无效" + }, "Loading {feeds}": "正在加载 {feeds}", "{count} heard": { "other": "已收到 {count} 架" }, + "USB {rate} msg/s": "USB {rate} msg/s", "{rate} msg/s": "{rate} msg/s", + "{count} feeds live": { + "other": "实时数据源 {count} 个" + }, + "{feed} {count} ({seconds}s old)": "{feed} {count}({seconds} 秒前)", "Street Level could not start": "街景未能启动", "Street Level toggle failed": "街景切换失败", "Street-level image": "街景图像", @@ -1332,15 +2131,38 @@ "{name} imagery off": "{name} 影像已关闭", "Image by {creator}": "图像作者:{creator}", "Camera follows view: move the globe camera wherever the street-level view looks": "相机跟随视野:街景看向哪里,地球相机就移到哪里", - "Camera follow needs the Google 3D map: choose Google 3D under MAP SOURCE": "相机跟随需要 Google 3D 地图:请在地图源(MAP SOURCE)中选择 Google 3D", + "Camera follow needs the Google 3D map: choose Google 3D under MAP SOURCE": "相机跟随需要 Google 3D 地图:请在“地图源”中选择 Google 3D", + " or ": " 或 ", + "OPEN {labels}": "打开 {labels}", + "Open {names} at the centre of the view": "在视野中心打开 {names}", + "Zoom in to a street to open {names} here": "放大到街道以在此处打开 {names}", "Switch a provider on to draw its coverage.": "开启一个提供商以绘制其覆盖范围。", "Loading this sequence…": "正在加载此序列…", "{n} images in this sequence · Esc clears": { "other": "此序列共 {n} 张图像 · Esc 清除" }, + "{n} streets in view · click a line for its nearest photo": { + "other": "视野内共 {n} 条街道 · 点击线段查看最近的照片" + }, + "{n} sequences in view · click a line for its nearest photo": { + "other": "视野内共 {n} 条序列 · 点击线段查看最近的照片" + }, "{n} sequences in view · click a line for its photos": { "other": "视野内共 {n} 条序列 · 点击线段查看其照片" }, + "km/h": "km/h", + "m/s": "m/s", + "mph": "mph", + "hPa": "hPa", + "kt": "kn", + "kts": "kn", + "ft": "ft", + "km": "km", + "m": "m", + "h": "小时", + "min": "分钟", + "s": "秒", + "dB": "dB", "Celestial ring — reveal the full globe": "天球环——显示完整地球", "Celestial ring — available in Normal style": "天球环——仅在常规样式下可用", "Detection overlay: {mode}": "探测叠加层:{mode}", @@ -1350,9 +2172,16 @@ "Active weather": "活跃天气", "LATEST · newest per product": "最新 · 每个产品的最新一帧", "Forecast · valid {valid} · issued {issued}": "预报 · 生效 {valid} · 发布 {issued}", + "{detail} · Does not follow history": "{detail} · 不随观测历史变化", "Forecast · valid {valid}": "预报 · 生效 {valid}", + "voice|OFF": "关", + "voice|CONNECTING": "连接中", + "voice|LISTENING": "聆听中", + "voice|EXECUTING": "执行中", + "voice|ERROR": "错误", "AI AGENT": "AI 代理", "Voice model tier — applies next session": "语音模型档位——下次会话生效", + "STD": "标准", "Estimated session cost": "预估会话费用", "Voice control — activate to toggle voice; hold Space to speak": "语音控制——激活可切换语音;按住空格键说话", "ON/OFF": "开/关", @@ -1363,13 +2192,14 @@ "VOICE": "语音", "Dismiss voice card": "关闭语音卡片", "YOU": "用户", - "THIS": "此目标", + "THIS": "目标", "Plan": "计划", "Referenced items": "引用条目", "NOTES & SOURCES": "笔记与来源", "VOICE SYSTEM ERROR": "语音系统错误", "DISMISS": "关闭", "Check microphone permission and network access, then try again.": "请检查麦克风权限和网络连接,然后重试。", + "Stopped by voice": "已通过语音停止", "WebRTC microphone support unavailable": "不支持 WebRTC 麦克风", "Requesting microphone": "正在请求麦克风", "Release Space to send": "松开空格键发送", @@ -1379,32 +2209,99 @@ "VOICE UNAVAILABLE": "语音不可用", "VOICE ACTIVE": "语音已启用", "Voice session could not be started.": "无法启动语音会话。", + "MINI": "迷你", "Next session: {pendingId} — this session stays on {modelId}": "下次会话:{pendingId}——本次会话仍使用 {modelId}", "Voice model: {pendingId} — click to switch to {target}; applies next session": "语音模型:{pendingId}——点击切换到 {target};下次会话生效", + "standard": "标准", + "mini": "迷你", "COST UNKNOWN": "费用未知", "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "ChatGPT OAuth 会话:已报告 {responses} 个响应、{input} 个输入 token、{output} 个输出 token、{captions} 次字幕转写。", "USD cost and the API spend cap are unavailable for this auth mode.": "此认证模式下无法提供美元费用与 API 消费上限。", "Usage is incomplete because a response was still in flight when the session ended.": "用量不完整,因为会话结束时仍有响应在处理中。", "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "{modelId} 的预估会话费用——{responses} 次响应。达到 {warn} 时警告,达到 {cap} 时结束会话。", - "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "估算不完整 — 会话结束时仍有响应在处理中,因此其用量从未上报。", + "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "估算不完整——会话结束时仍有响应在处理中,因此其用量从未上报。", + "STANDARD": "标准", "{tier} applies next session": "{tier} 将在下次会话生效", "Session ended — cost cap {cost}": "会话已结束——已达费用上限 {cost}", + "MIC": "麦克风", "Radio did not start": "电台未能启动", "Running command": "正在执行指令", + "{n} aircraft": { + "other": "{n} 架飞机" + }, + "{n} military aircraft": { + "other": "{n} 架军用飞机" + }, + "{n} ships": { + "other": "{n} 艘船舶" + }, + "{n} satellites": { + "other": "{n} 颗卫星" + }, + "{n} launches": { + "other": "{n} 次发射" + }, + "{n} earthquakes": { + "other": "{n} 次地震" + }, "{n} fires": { "other": "{n} 处火点" }, + "{n} fire perimeters": { + "other": "{n} 处火场周界" + }, + "{n} cyclones": { + "other": "{n} 个气旋" + }, + "{n} buses": { + "other": "{n} 辆公交车" + }, + "{n} bike share": { + "other": "{n} 个共享单车站点" + }, + "{n} flock cameras": { + "other": "{n} 个 Flock 摄像头" + }, + "{n} military bases": { + "other": "{n} 处军事基地" + }, + "{n} datacenters": { + "other": "{n} 个数据中心" + }, + "{n} dams": { + "other": "{n} 座水坝" + }, + "{n} air quality": { + "other": "{n} 个空气质量站点" + }, + "{n} results": { + "other": "{n} 条结果" + }, "anywhere in the loaded data": "已加载数据中的任意位置", "in view": "视野内", + "within {radius} of the view centre": "视野中心 {radius} 范围内", + "within {radius} of {place} (Contacts window)": "{place} {radius} 范围内(目标窗口)", + "within {radius} of {place}": "{place} {radius} 范围内", + "within {radius}": "{radius} 范围内", "over {region}": "{region} 范围内", "At least {items}": "至少 {items}", "{items} {scope}": "{items} {scope}", + "last 24 h": "过去 24 小时", + "past 30 d and upcoming": "过去 30 天及未来", + "the flights layer loads by viewport": "航班图层按视口加载", + "distance is ground distance, not overhead": "距离为地面距离,而非空中直线距离", + "the count is a lower bound because at least one layer reached its retained limit.": "该计数为下限,因为至少一个图层已达到其保留上限。", "{label} off": "{label} 已关闭", + "{label} loading": "{label} 加载中", + "{label} error": "{label} 出错", "counted the first {returned} loaded records": "已统计最先加载的 {returned} 条记录", "counted {returned} of {total} loaded records": "已统计已加载 {total} 条记录中的 {returned} 条", - "Fly below {km} km to a covered region": "请飞行至 {km} 公里以下的覆盖区域", + "{layers} just turned on — still loading, counts will rise": "{layers} 刚开启——仍在加载,计数还会增加", + "Contacts panel snapshot at {time} — the same retained cohort supplies the card, speech, and follow-up memory": "目标面板快照({time})——卡片、语音播报和后续追问记忆均来自同一组保留目标", + "Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "目标面板快照——卡片、语音播报和后续追问记忆均来自同一组保留目标", + "Fly below {km} km to a covered region": "请降至 {km} km 以下并飞往有覆盖的区域", "No feed here yet · {n} regions available": { - "other": "此区域暂无线路 · 有 {n} 个覆盖区域" + "other": "此处暂无数据源 · 有 {n} 个覆盖区域" }, "degraded": "降级", "stale": "过期", @@ -1416,21 +2313,72 @@ "Activate to toggle voice": "点击切换语音", "Voice active": "语音已启用", "Voice could not be started.": "无法启动语音。", + "the active voice session": "当前语音会话", "{value} feet": "{value} 英尺", + "The flights layer is not enabled": "航班图层未开启", + "The military layer is not enabled": "军用航班图层未开启", + "The satellites layer is not enabled": "卫星图层未开启", + "The ais-live-vessels layer is not enabled": "ais-live-vessels 图层未开启", + "Could not enable the requested layer": "无法开启所请求的图层", + "Could not disable the requested layer": "无法关闭所请求的图层", + "Radio layer unavailable": "电台图层不可用", + "Camera navigation is unavailable in the current view": "当前视图下无法进行相机导航", + "Camera navigation policy unavailable": "相机导航策略不可用", + "Nearest-aircraft selection supports Flights or Military Flights only": "最近飞机选择仅支持航班或军用航班", + "Nearest-aircraft selection needs a preset, place name, or latitude and longitude": "最近飞机选择需要预设、地名或经纬度", + "Could not arrive at the requested place": "无法抵达所请求的地点", + "The nearest airborne aircraft could not be selected": "无法选中最近的空中飞机", + "No flights within {radius} of the current view": "当前视野 {radius} 范围内没有航班", + "No military within {radius} of the current view": "当前视野 {radius} 范围内没有军用航班", + "No satellites within {radius} of the current view": "当前视野 {radius} 范围内没有卫星", + "No vessels within {radius} of the current view": "当前视野 {radius} 范围内没有船舶", + "{layer} is enabled on the {source} feed, but no airborne aircraft is loaded in the {place} view yet": "{layer} 已在 {source} 数据源上开启,但 {place} 视野中尚未加载空中飞机", + "{layer} is enabled, but no airborne aircraft is loaded in the {place} view yet": "{layer} 已开启,但 {place} 视野中尚未加载空中飞机", + "{layer} is enabled, but its aircraft feed is unavailable": "{layer} 已开启,但其飞机数据源不可用", + "{layer} is enabled, but its destination refresh did not complete": "{layer} 已开启,但目的地刷新未完成", + "{layer} is enabled, but {source} is unavailable": "{layer} 已开启,但 {source} 不可用", + "Could not arrive at {place}": "无法抵达 {place}", + "{name} is no longer loaded": "{name} 已不在加载数据中", + "Unknown target layer: {target}": "未知目标图层:{target}", "nominal": "正常", "{label} on": "{label} 已开启", + "Frame aircraft": "取景飞机", + "Frame military aircraft": "取景军用飞机", + "Frame ships": "取景船舶", + "Frame satellites": "取景卫星", + "Frame contacts": "取景目标", + "{count} aircraft in frame": { + "other": "画面中 {count} 架飞机" + }, + "{count} military aircraft in frame": { + "other": "画面中 {count} 架军用飞机" + }, + "{count} ships in frame": { + "other": "画面中 {count} 艘船舶" + }, + "{count} satellites in frame": { + "other": "画面中 {count} 颗卫星" + }, + "{count} contacts in frame": { + "other": "画面中 {count} 个目标" + }, + "Nearest military aircraft": "最近的军用飞机", + "Nearest ships": "最近的船舶", + "Nearest satellites": "最近的卫星", + "Nearest aircraft": "最近的飞机", + "{first} and {second}": "{first}和{second}", "Layer": "图层", "there": "那里", - "Camera range {range}": "相机距离{range}", - "Within {radius} of the view": "距当前视野{radius}内", + "Camera range {range}": "相机距离 {range}", + "Within {radius} of the view": "距当前视野 {radius} 内", "Labels on": "标签已开启", "Framing uses the nearest 80 loaded contacts": "取景仅使用已加载的最近 80 个目标", - "{distance} from {location}": "{distance} 自 {location}", - "Altitude {altitude}": "高度{altitude}", + "{distance} from {location}": "距 {location} {distance}", + "Altitude {altitude}": "高度 {altitude}", "{origin} to {destination}": "{origin} 至 {destination}", - "from {origin}": "从{origin}出发", - "to {destination}": "前往{destination}", - "Registration {registration}": "注册号{registration}", + "from {origin}": "从 {origin} 出发", + "to {destination}": "前往 {destination}", + "Registration {registration}": "注册号 {registration}", "View state": "视野状态", "Marked {count} places": { "other": "已标记 {count} 个地点" @@ -1438,10 +2386,42 @@ "Nothing marked": "没有标记", "Not found: {places}": "未找到:{places}", "Tracing outlines": "正在描画边界", - "Frame {target}": "取景{target}", + "Frame flights": "取景航班", + "Frame military": "取景军用航班", + "Frame vessels": "取景船舶", + "Frame {target}": "取景 {target}", + "Zoom out to globe": "缩小至地球视图", + "Open data layers": "打开数据图层", + "Open or close a panel": "打开或关闭面板", + "Change context mode": "切换态势模式", + "Control cockpit": "控制座舱", + "Change visual style": "切换视觉样式", + "Adjust HUD": "调整 HUD", + "Adjust cyber sonar": "调整赛博声呐", + "Adjust detection overlay": "调整探测叠加层", + "Change map stack": "切换地图组合", + "Adjust post-processing": "调整后期处理", + "Control scene": "控制场景", + "Control CCTV": "控制 CCTV", + "Control radio": "控制电台", + "Track contact": "跟踪目标", + "Stop tracking": "停止跟踪", + "Clear marks": "清除标注", + "Move camera": "移动相机", + "Fly route": "沿路线飞行", + "Analyst query": "分析查询", + "Next ISS pass": "下一次 ISS 过境", + "Next satellite pass": "下一次卫星过境", "Mark the map": "在地图上标注", - "Fly to {place}": "飞往{place}", - "Nearest aircraft to {place}": "距离{place}最近的飞机", + "Mark {targets} +{more}": "标注 {targets} +{more}", + "Mark {targets}": "标注 {targets}", + "Fly to {place}": "飞往 {place}", + "Fly to Location": "飞往地点", + "Nearest aircraft to {place}": "距离 {place} 最近的飞机", + "Nearest aircraft to Here": "距离此处最近的飞机", + "Layer on": "图层已开启", + "Layer off": "图层已关闭", + "Zoom out": "缩小", "Zoom in": "放大", "Read the view": "读取视野", "Check view state": "检查视野状态", @@ -1465,13 +2445,13 @@ "DONE": "完成", "HERE": "此处", "Aircraft cockpit view": "飞机座舱视图", - "LEVEL": "等级", + "LEVEL": "水平", "Estimated destination direction": "预估目的地方向", "DEST ---°": "目的地 ---°", "OPTICAL PLANE · 01": "光学平面 · 01", "VISOR LOCK · ACTIVE": "面罩锁定 · 激活", - "GROUND SPEED · KTS": "地速 · KTS", - "ALTITUDE · FT": "高度 · FT", + "GROUND SPEED · KTS": "地速 · kn", + "ALTITUDE · FT": "高度 · ft", "FIRST PERSON": "第一人称", "LIVE TRACK · COURSE ALIGNED": "实时航迹 · 航向对准", "Cockpit vision style": "座舱视觉样式", @@ -1484,15 +2464,21 @@ "Next vision style": "下一个视觉样式", "Current aircraft heading": "飞机当前航向", "GROUND SPEED": "地速", + "KTS": "kn", "ALTITUDE": "高度", + "FT": "ft", "Contact cockpit summary": "目标座舱摘要", "CONTACT": "目标", - "CONTACTS · 250 KM": "目标 · 250 KM", + "CONTACTS · 250 KM": "目标 · 250 km", "Contact navigation": "目标导航", "CONTEXT ONLY": "仅供参考", "Nearby cohort counts": "附近各类目标数量", + "FLT": "航班", + "MIL": "军用", + "SITE": "设施", "NEAREST OBSERVED / MAPPED": "最近的观测 / 地图标注目标", "AVAILABLE INPUTS ONLY · NOT AN ALL-CLEAR": "仅限可用输入 · 不代表安全无虞", + "WX": "天气", "Cockpit briefing carousel": "座舱简报轮播", "Estimated flight plan": "预估飞行计划", "ESTIMATED FLIGHT PLAN": "预估飞行计划", @@ -1508,8 +2494,9 @@ "WIND": "风", "SKY": "天空", "PRECIP": "降水", + "MM": "mm", "Weather data by Open-Meteo.com": "天气数据由 Open-Meteo.com 提供", - "Cockpit briefing pages": "驾驶舱简报页面", + "Cockpit briefing pages": "座舱简报页面", "SIG": "信号", "Show Live Signals": "显示实时信号", "NEWS": "新闻", @@ -1542,7 +2529,7 @@ "Simulate night-vision goggles with green intensification and a tube vignette.": "模拟夜视仪,带绿色增强和镜筒暗角。", "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "模拟 FLIR 风格的热成像对比。调高 Ironbow 可显示色彩。", "Apply bright cel-shaded color and illustrated outlines.": "应用明亮的赛璐珞色彩和插画轮廓线。", - "Apply high-contrast monochrome film-noir grading.": "应用高对比度的黑白黑色电影调色。", + "Apply high-contrast monochrome film-noir grading.": "应用高对比度的黑白电影风格调色。", "Add a cold, snowy whiteout treatment to the scene.": "为场景添加寒冷的雪天白茫茫效果。", "MAP SOURCE": "地图源", "Map source": "地图源", @@ -1557,24 +2544,24 @@ "WEATHER": "天气", "Active weather products": "活跃天气产品", "RECENT IMAGERY": "近期影像", - "Imagery days in the box": "影像盒内的天数", - "CONTEXT": "上下文", + "Imagery days in the box": "框选内的影像日期", + "CONTEXT": "态势", "Compact Radio controls": "精简电台控件", "Open detailed Radio controls": "打开详细电台控件", "Previous station": "上一个电台", "Next station": "下一个电台", "Compact Radio volume": "精简电台音量", "Expand panel": "展开面板", - "Context mode": "上下文模式", + "Context mode": "态势模式", "CONTACTS": "目标", "Cycles the nearest contacts of whatever type you select — planes, vessels, installations. Satellites track independently.": "循环切换你所选类型中最近的目标,包括飞机、船舶、设施。卫星独立跟踪。", "SPACE MISSIONS": "太空任务", - "SELECT CONTEXT": "选择上下文", - "Contact Context actions": "目标上下文操作", + "SELECT CONTEXT": "选择态势", + "Contact Context actions": "目标态势操作", "COCKPIT": "座舱", - "SEARCH NEARBY SITES": "搜索附近站点", + "SEARCH NEARBY SITES": "搜索附近设施", "Reclassify tracked contact as TR-3B": "将跟踪目标重新归类为 TR-3B", - "CONTACTS CONTEXT OFF": "目标上下文已关闭", + "CONTACTS CONTEXT OFF": "目标态势已关闭", "SELECT CONTACTS TO LOAD OBSERVED / MAPPED PROXIMITY": "选择目标以加载观测 / 地图标注的邻近信息", "Available Space Missions": "可用太空任务", "AVAILABLE MISSIONS": "可用任务", @@ -1610,7 +2597,7 @@ "GAIN": "增益", "RTL-SDR tuner gain for the current mode": "当前模式下的 RTL-SDR 调谐器增益", "AUTO": "自动", - "MSG/S": "消息/秒", + "MSG/S": "msg/s", "HEARD": "已收到", "POSITIONED": "已定位", "FM MHZ": "FM MHz", @@ -1628,7 +2615,7 @@ "Minimal": "精简", "Cyber": "赛博", "Sonar": "声呐", - "Cyber sonar contact scanner": "赛博声呐接触扫描器", + "Cyber sonar contact scanner": "赛博声呐目标扫描器", "Rings": "圈数", "Sonar ring count": "声呐圈数", "Range": "范围", @@ -1636,8 +2623,8 @@ "Power": "强度", "Sonar intensity": "声呐强度", "Opacity": "不透明度", - "Cyber contact and label opacity": "赛博接触与标注不透明度", - "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "声呐扫描期间地图点、图标、模型、括标与标注的最低不透明度", + "Cyber contact and label opacity": "赛博目标与标签不透明度", + "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "两次声呐扫描之间地图点、图标、模型、括标与标签的最低不透明度", "Sector": "扇区", "Sonar sector width": "声呐扇区宽度", "Detection Overlay (D)": "探测叠加层(D)", @@ -1663,23 +2650,26 @@ "Feather": "羽化", "Scope edge feather": "视域边缘羽化", "Scope edge feather as a percentage of the keyhole radius": "视域边缘羽化,以锁孔半径的百分比表示", - "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "在世界上绘制 — 单击顶点,双击或按 Enter 完成,按 Esc 取消", + "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "在地球上绘制——单击顶点,双击或按 Enter 完成,按 Esc 取消", "Shape": "形状", "Shape to draw": "要绘制的形状", "Area": "面", "Line": "线", - "Pin": "标记", + "Pin": "图钉", "Label (optional)": "标签(可选)", "Label for the drawn shape": "绘制形状的标签", "Colour of the drawn shape": "绘制形状的颜色", - "Primary": "主色", - "Amber": "琥珀", + "Primary": "主题色", + "Amber": "琥珀色", "Cyan": "青色", "Green": "绿色", "Red": "红色", - "Clear": "晴", + "Clear": "清除", "Remove every mark from the board": "清除图板上的所有标记", + "Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "在地球上显示自己的 GeoJSON、KML、KMZ 或 GPX 文件(也可直接拖放到地球上)。文件内容仅保留在本设备上;叠加层可能出现在共享给语音的地图截图中。", "Import": "导入", + "Choose GeoJSON, KML, KMZ or GPX files": "选择 GeoJSON、KML、KMZ 或 GPX 文件", + "Imported files": "已导入的文件", "Celestial": "天球", "Hide UI chrome": "隐藏界面控件", "Clean UI": "纯净界面", @@ -1692,6 +2682,7 @@ "Return UI controls": "恢复界面控件", "Initializing photorealistic world...": "正在初始化逼真世界…", "DATA LAYERS": "数据图层", + "ACQUIRING FRAME": "正在获取画面", "NEAREST": "最近", "CCTV camera": "CCTV 摄像头", "CALIBRATION": "校准", @@ -1708,6 +2699,7 @@ "RESET CAL": "重置校准", "SCENE SUMMARY": "场景摘要", "STREET LEVEL": "街景", + "Turn Street Level on or off": "开启或关闭街景", "Expand the street-level view (Esc shrinks it)": "放大街景视图(Esc 缩小)", "Image fit": "图像适配", "FIT": "适应", @@ -1727,7 +2719,7 @@ "Panorama filter": "全景筛选", "ALL": "全部", "FLAT": "平面", - "SINCE": "时间范围", + "SINCE": "时间", "Coverage colours": "覆盖图例", "SCENES": "场景", "Scene recipe": "场景方案", @@ -1738,10 +2730,10 @@ "EXPORT PRESETS": "导出预设", "IMPORT": "导入", "RUN LOG": "运行日志", - "POWER UP": "启动", + "POWER UP": "增强", "GROUND STATION · PROVIDER SETTINGS": "地面站 · 服务商设置", "Close key setup": "关闭密钥设置", - "Power up the globe": "启动地球", + "Power up the globe": "增强地球", "The globe already flies keyless. Every key below switches on another real feed — paste one and it's saved into this app's local configuration, then the server restarts itself. Server-side keys stay on this machine; Google Maps and Cesium ion run in the browser and must be provider-restricted. Keys you configured elsewhere are shown but never touched.": "地球无需密钥即可运行。下面的每个密钥都会启用一个新的真实数据源:粘贴后会保存到本应用的本地配置,随后服务器自动重启。服务端密钥只保存在本机;Google Maps 和 Cesium ion 在浏览器中运行,必须设置服务商限制。你在其他位置配置的密钥会显示,但不会被改动。", "SAVE KEYS": "保存密钥", "ESC to close": "按 ESC 关闭", @@ -1764,5 +2756,9 @@ "Begin with a clean globe": "从干净的地球开始", "Don't show this again": "不再显示", "ESC to dismiss": "按 ESC 关闭", - "Tip: the GEV MIC button in the dock lets you talk to the map.": "提示:停靠栏中的 GEV MIC 按钮可让你用语音操控地图。" + "Tip: the GEV MIC button in the dock lets you talk to the map.": "提示:停靠栏中的 GEV 麦克风按钮可让你用语音操控地图。", + "hemisphere|N": "N", + "hemisphere|S": "S", + "hemisphere|E": "E", + "hemisphere|W": "W" } diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index c159beaab..821b154b9 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -98,6 +98,9 @@ "fire confidence|nominal", "ft", "hPa", + "hemisphere|E", + "hemisphere|N", + "hemisphere|S", "installation class|BASE", "km", "km/h", @@ -133,5 +136,60 @@ "REC", "VS", "WHOT/BHOT" + ], + "zh-CN": [ + "1090 MHz", + "978 MHz UAT", + "AIS: --", + "AIS: {name}", + "BRG {value}°", + "BRG —", + "CAL {value}", + "CAL · {badge}", + "CCTV", + "CRS {value}°", + "CRT", + "FLIR", + "FOV", + "FOV {value}°", + "FT", + "GEO", + "HDG", + "HDG {value}°", + "House", + "Ironbow", + "KTS", + "Landsat 8/9", + "MM", + "NVG", + "REC", + "SRC {value}", + "Sentinel-2", + "Techno", + "Trance", + "USB {rate} msg/s", + "WHOT/BHOT", + "dB", + "ft", + "hPa", + "hemisphere|E", + "hemisphere|N", + "hemisphere|S", + "hemisphere|W", + "km", + "km/h", + "kt", + "kts", + "mph", + "{city} CCTV", + "{rate} msg/s", + "{source} HTTP {status}", + "{speed} kn", + "{type} SPD: {speed} HDG: {heading}", + "{value} KM", + "{value} KM/S", + "ΔE", + "ΔN", + "▲ {frp} MW" ] } diff --git a/src/ui/localePicker.test.mjs b/src/ui/localePicker.test.mjs index 35b473e42..7f6d11f9b 100644 --- a/src/ui/localePicker.test.mjs +++ b/src/ui/localePicker.test.mjs @@ -40,7 +40,7 @@ test('the current language comes first, the rest by their own names', () => { nativeNames: LOCALE_NAMES, }), ), - ['ru', 'en', 'es'], + ['ru', 'en', 'es', 'zh-CN'], ); assert.deepEqual( codes( @@ -50,7 +50,7 @@ test('the current language comes first, the rest by their own names', () => { nativeNames: LOCALE_NAMES, }), ), - ['es', 'en', 'ru'], + ['es', 'en', 'ru', 'zh-CN'], ); assert.deepEqual( codes( @@ -60,7 +60,7 @@ test('the current language comes first, the rest by their own names', () => { nativeNames: LOCALE_NAMES, }), ), - ['en', 'es', 'ru'], + ['en', 'es', 'ru', 'zh-CN'], ); const rows = buildLocaleOptions({ locales: MANY, @@ -263,7 +263,7 @@ test('keyboard model: open on the current language, move, choose, close', () => assert.deepEqual(model.keydown({ key: 'ArrowDown' }), { handled: true }); assert.equal(model.activeOption.code, 'en'); model.keydown({ key: 'End' }); - assert.equal(model.activeOption.code, 'es'); + assert.equal(model.activeOption.code, 'zh-CN'); model.keydown({ key: 'Home' }); assert.equal(model.activeOption.code, 'ru'); model.keydown({ key: 'ArrowUp' }); diff --git a/src/ui/styles/cjk.css b/src/ui/styles/cjk.css new file mode 100644 index 000000000..c44431520 --- /dev/null +++ b/src/ui/styles/cjk.css @@ -0,0 +1,29 @@ +/* Chinese text. The UI sets Latin capitals with wide tracking; Chinese set + that way falls apart into single glyphs, so its tracking stays tight. The + intel HUD readouts (codes, coordinates) and text kept in English on purpose + (translate="no", and whatever holds it) keep the Latin look. */ +html:lang(zh) + body + :not( + #intel-hud, + #intel-hud *, + [translate='no'], + [translate='no'] *, + :has([translate='no']) + ) { + letter-spacing: 0.02em !important; +} + +/* Below about 9px a Chinese glyph blurs: lift the dock's voice labels and the + panel layer buttons to that floor. */ +html:lang(zh) #command-dock .gev-mic-label, +html:lang(zh) #command-dock #gev-voice-detail, +html:lang(zh) .gev-voice-tier-btn, +html:lang(zh) .panel-layer-toggle { + font-size: 9px; +} + +/* A two-glyph button label must not break between its glyphs. */ +html:lang(zh) .pp-mode-btn { + white-space: nowrap; +} diff --git a/style.css b/style.css index 44b7e07bc..8c4599e89 100644 --- a/style.css +++ b/style.css @@ -27,4 +27,5 @@ @import './src/ui/styles/weather.css'; @import './src/ui/styles/panel-surfaces.css'; +@import './src/ui/styles/cjk.css'; @import './src/ui/styles/cyber.css'; From f3fa1fa0227b7519c29834d42d3e79ae202e77d2 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Wed, 21 Oct 2026 12:54:55 +0400 Subject: [PATCH 20/45] i18n(zh-CN): translate the strings from the latest main Gemini Live voice and the street-level coverage hints; drop the entries the code no longer uses. Co-Authored-By: Claude Opus 5.5 --- src/i18n/locales/zh-CN.json | 73 ++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 0a56bc76a..a83d35cc0 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -980,7 +980,6 @@ "No street-level imagery within {radius} m of that point": "该点 {radius} m 范围内没有街景影像", "No street-level imagery within {radius} m of the view centre": "视野中心 {radius} m 范围内没有街景影像", "Coverage tile failed": "覆盖瓦片加载失败", - "Point the camera at the globe for street-level coverage": "将相机对准地球以查看街景覆盖范围", "The photo could not be loaded": "照片无法加载", "{name} photo. ← and → step along the sequence. On a 360° photo, drag or use Shift+← →, ↑ ↓ to look around, and + − to zoom": "{name} 照片。← 和 → 沿序列切换。在 360° 照片上,拖动或使用 Shift+← →、↑ ↓ 环视,+ − 缩放", "{name} street-level photo": "{name} 街景照片", @@ -1026,7 +1025,6 @@ "Panoramax sent an unreadable answer": "Panoramax 返回的响应无法读取", "No street-level imagery providers configured": "未配置街景影像提供商", "{names}: by upload date": "{names}:按上传日期", - "Selected": "所选", "Open the Street Level panel to view imagery": "打开街景面板以查看影像", "Image could not be opened": "图像无法打开", "TeleGeography load failed": "TeleGeography 加载失败", @@ -1825,9 +1823,7 @@ "Collapse Radio": "收起电台", "Expand Radio section": "展开电台区域", "Collapse Radio section": "收起电台区域", - "Double-click the header to snap the panel back": "双击标题栏可将面板复位", "Panel layout updated — positions reset to new defaults": "面板布局已更新——位置已重置为新的默认值", - "Drag to resize · double-click the header to snap back": "拖动以调整大小 · 双击标题栏复位", "Austin": "奥斯汀", "San Francisco": "旧金山", "New York": "纽约", @@ -2107,7 +2103,6 @@ "{feed} {count} ({seconds}s old)": "{feed} {count}({seconds} 秒前)", "Street Level could not start": "街景未能启动", "Street Level toggle failed": "街景切换失败", - "Street-level image": "街景图像", "SHRINK": "缩小", "EXPAND": "展开", "Shrink": "缩小", @@ -2130,13 +2125,10 @@ "{name} imagery on": "{name} 影像已开启", "{name} imagery off": "{name} 影像已关闭", "Image by {creator}": "图像作者:{creator}", - "Camera follows view: move the globe camera wherever the street-level view looks": "相机跟随视野:街景看向哪里,地球相机就移到哪里", - "Camera follow needs the Google 3D map: choose Google 3D under MAP SOURCE": "相机跟随需要 Google 3D 地图:请在“地图源”中选择 Google 3D", " or ": " 或 ", "OPEN {labels}": "打开 {labels}", "Open {names} at the centre of the view": "在视野中心打开 {names}", "Zoom in to a street to open {names} here": "放大到街道以在此处打开 {names}", - "Switch a provider on to draw its coverage.": "开启一个提供商以绘制其覆盖范围。", "Loading this sequence…": "正在加载此序列…", "{n} images in this sequence · Esc clears": { "other": "此序列共 {n} 张图像 · Esc 清除" @@ -2700,14 +2692,11 @@ "SCENE SUMMARY": "场景摘要", "STREET LEVEL": "街景", "Turn Street Level on or off": "开启或关闭街景", - "Expand the street-level view (Esc shrinks it)": "放大街景视图(Esc 缩小)", "Image fit": "图像适配", "FIT": "适应", "Fit: show the whole photo, with dark bars where its shape differs from the frame": "适应:显示整张照片,比例与画框不同处留黑边", "FILL": "填充", "Fill: fill the frame edge to edge, cropping the photo": "填充:图像铺满画框并裁剪照片", - "Camera follows view": "相机跟随视野", - "FOLLOW": "跟随", "Close the image and deselect it on the map": "关闭图像并取消其在地图上的选中", "Close the street-level image": "关闭街景图像", "Street-level viewer": "街景查看器", @@ -2720,7 +2709,6 @@ "ALL": "全部", "FLAT": "平面", "SINCE": "时间", - "Coverage colours": "覆盖图例", "SCENES": "场景", "Scene recipe": "场景方案", "NEW": "新建", @@ -2760,5 +2748,64 @@ "hemisphere|N": "N", "hemisphere|S": "S", "hemisphere|E": "E", - "hemisphere|W": "W" + "hemisphere|W": "W", + "Gemini Live voice control": "Gemini Live 语音控制", + "Zoom in to see street-level coverage": "放大地图以查看街景覆盖范围", + "Point the camera at the ground for street-level coverage": "将相机朝向地面以查看街景覆盖范围", + "Sequence images unavailable": "序列影像不可用", + "Switch Street Level on to draw its coverage.": "开启“街景”以绘制其覆盖范围。", + "Every provider is switched off: light a chip to draw its coverage.": "所有服务商均已关闭:点亮一个标签即可绘制其覆盖范围。", + "No sequences in view match the filter": "视野内没有符合筛选条件的序列", + "No coverage in view": "视野内没有覆盖", + "Voice provider": "语音服务商", + "Changing provider reconnects voice if it is on.": "如语音已开启,切换服务商会重新连接语音。", + "Gemini returned an oversized audio chunk": "Gemini 返回的音频块过大", + "Gemini returned an unsupported audio format": "Gemini 返回了不支持的音频格式", + "Gemini returned an invalid audio sample rate": "Gemini 返回了无效的音频采样率", + "Gemini returned incomplete PCM audio": "Gemini 返回的 PCM 音频不完整", + "This browser does not support Gemini microphone audio": "当前浏览器不支持 Gemini 麦克风音频", + "Microphone audio processing failed": "麦克风音频处理失败", + "Gemini audio playback fell behind. Reconnect to continue.": "Gemini 音频播放滞后。请重新连接以继续。", + "Gemini token response did not include an ephemeral credential": "Gemini 令牌响应中没有临时凭据", + "Invalid Gemini connection endpoint": "Gemini 连接端点无效", + "Gemini voice could not connect. Try again.": "Gemini 语音无法连接。请重试。", + "Gemini voice requires a same-origin app request": "Gemini 语音需要来自本应用同源的请求", + "Add a Gemini API key in Provider Settings": "请在服务商设置中添加 Gemini API 密钥", + "The Gemini Live model configuration is invalid": "Gemini Live 模型配置无效", + "Gemini voice is starting too often. Try again shortly.": "Gemini 语音启动过于频繁。请稍后重试。", + "Gemini quota is unavailable. Try again later.": "Gemini 配额不可用。请稍后重试。", + "Gemini access was refused. Check the API key and model access.": "Gemini 拒绝了访问。请检查 API 密钥和模型访问权限。", + "Gemini Live is unavailable for the configured model.": "所配置的模型无法使用 Gemini Live。", + "Token request is too large": "令牌请求过大", + "Use an empty JSON token request": "请使用空的 JSON 令牌请求", + "Voice command context is too large": "语音命令上下文过大", + "Gemini reliable transport exceeded its queue limit. Start voice again.": "Gemini 可靠传输超出了队列上限。请重新启动语音。", + "Gemini reliable transport did not drain. Start voice again.": "Gemini 可靠传输的队列未能清空。请重新启动语音。", + "Gemini token request failed (HTTP {status})": "Gemini 令牌请求失败(HTTP {status})", + "Gemini token response did not include a valid model": "Gemini 令牌响应中没有有效的模型", + "Gemini token response did not include session settings": "Gemini 令牌响应中没有会话设置", + "Gemini session settings do not match the input mode": "Gemini 会话设置与输入模式不匹配", + "Gemini could not submit this input. Start voice again.": "Gemini 无法提交此输入。请重新启动语音。", + "Connecting to Gemini": "正在连接 Gemini", + "Gemini returned an oversized message": "Gemini 返回的消息过大", + "Gemini Live connection failed. Check network access, then start voice again.": "Gemini Live 连接失败。请检查网络连接,然后重新启动语音。", + "Gemini Live connection ended. Start voice again for a new conversation.": "Gemini Live 连接已结束。请重新启动语音以开始新对话。", + "Gemini Live could not start. Start voice again to request a fresh session.": "Gemini Live 无法启动。请重新启动语音以申请新的会话。", + "Start voice again for a fresh token and a new conversation.": "请重新启动语音,以获取新令牌并开始新对话。", + "Start voice again to request a fresh session credential.": "请重新启动语音以申请新的会话凭据。", + "Microphone permission was denied. Allow microphone access and try again.": "麦克风权限被拒绝。请允许访问麦克风后重试。", + "Gemini connection timed out. Try again.": "Gemini 连接超时。请重试。", + "Gemini voice could not start": "Gemini 语音无法启动", + "Gemini did not finish the interrupted reply. Start voice again.": "Gemini 未能完成被打断的回复。请重新启动语音。", + "Gemini session expiring; finishing the current reply": "Gemini 会话即将到期,正在完成当前回复", + "Gemini rejected the voice session. Start voice again to request a fresh session.": "Gemini 拒绝了语音会话。请重新启动语音以申请新的会话。", + "Start voice again for a fresh session credential. If it repeats, check Gemini model and API access.": "请重新启动语音以获取新的会话凭据。如问题重复出现,请检查 Gemini 模型和 API 访问权限。", + "Gemini action history is full. Start voice again for a fresh session.": "Gemini 操作历史已满。请重新启动语音以开始新的会话。", + "Gemini requested too many simultaneous actions": "Gemini 请求的同时操作过多", + "Voice text command is too long": "语音文本命令过长", + "Gemini voice is not connected": "Gemini 语音未连接", + "Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "Gemini 被打断的输入超出了缓冲区或等待上限。请重新启动语音。", + "Gemini Live connection is expiring. Start voice again for a new conversation.": "Gemini Live 连接即将到期。请重新启动语音以开始新对话。", + "Gemini voice sessions have a time limit. When a session expires, start voice again for a new conversation.": "Gemini 语音会话有时长限制。会话到期后,请重新启动语音以开始新对话。", + "Show the street-level view full screen (Esc shrinks it)": "全屏显示街景视图(按 Esc 缩小)" } From da1dd928efc5bb35cd3e4da9740bb93d6fe98088 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Wed, 21 Oct 2026 12:55:21 +0400 Subject: [PATCH 21/45] docs(changelog): Simplified Chinese (#1298) Co-Authored-By: Claude Opus 5.5 --- changelog.d/1298-simplified-chinese.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 changelog.d/1298-simplified-chinese.md diff --git a/changelog.d/1298-simplified-chinese.md b/changelog.d/1298-simplified-chinese.md new file mode 100644 index 000000000..ffae0cd41 --- /dev/null +++ b/changelog.d/1298-simplified-chinese.md @@ -0,0 +1,6 @@ +- Add Simplified Chinese (zh-CN) as an interface language, selectable from + the globe picker. The catalog builds on the Chinese translations by + abiyeenzo (#914) and EDIT-Aeterna (#979); the rest was translated and the + whole catalog reviewed against the screens. Chinese text gets tight tracking + and readable minimum sizes, and year-first dates read 2021年10月16日 + (German, @gekh, #1298). From 6a40b30d12ce506e47a229d76f5d05f7534ff611 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Wed, 21 Oct 2026 13:02:34 +0400 Subject: [PATCH 22/45] docs(changelog): credit the zh-CN translators by GitHub handle Enzo's commit email is not linked to his GitHub account, so credit his #914 translation here as well. Co-authored-by: Enzo Abyie <93532759+abiyeenzo@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 --- changelog.d/1298-simplified-chinese.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/1298-simplified-chinese.md b/changelog.d/1298-simplified-chinese.md index ffae0cd41..e6850e964 100644 --- a/changelog.d/1298-simplified-chinese.md +++ b/changelog.d/1298-simplified-chinese.md @@ -1,6 +1,6 @@ - Add Simplified Chinese (zh-CN) as an interface language, selectable from the globe picker. The catalog builds on the Chinese translations by - abiyeenzo (#914) and EDIT-Aeterna (#979); the rest was translated and the + @abiyeenzo (#914) and @EDIT-Aeterna (#979); the rest was translated and the whole catalog reviewed against the screens. Chinese text gets tight tracking and readable minimum sizes, and year-first dates read 2021年10月16日 (German, @gekh, #1298). From d6c4d58a2da252c1ebeca2f682c1164e2d57255a Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Wed, 21 Oct 2026 13:35:52 +0400 Subject: [PATCH 23/45] i18n(zh-CN): apply the language review Correct weather, imagery, scene, voice, and status wording after the Chinese UI review. Align the translation glossary with the revised terminology. Co-Authored-By: Codex (GPT-6) --- docs/translations/zh-CN.md | 22 ++- src/i18n/locales/zh-CN.json | 332 ++++++++++++++++++------------------ 2 files changed, 187 insertions(+), 167 deletions(-) diff --git a/docs/translations/zh-CN.md b/docs/translations/zh-CN.md index 9b779e0b7..33f7c7251 100644 --- a/docs/translations/zh-CN.md +++ b/docs/translations/zh-CN.md @@ -46,10 +46,11 @@ for the current English and reviewed against both. | preset / visual preset | 预设 / 视觉预设 | | Display / HUD layout | 显示 / HUD 布局 | | Tactical / Operator / Minimal / Cyber | 战术 / 操作员 / 精简 / 赛博 | -| Scope (circular viewport mask) | 视域 | +| Scope (circular viewport mask) / keyhole | 视域 | | Clean UI | 纯净界面 | | cockpit | 座舱 | | heading / altitude / ground speed | 航向 / 高度 / 地速 | +| map heading / North up | 方位 / 正北朝上 | | Street Level / Street View (Google) | 街景 / 街景(Google) | | Recent Imagery | 近期影像 | | Global Context / Context (panel) | 全局态势 / 态势 | @@ -57,3 +58,22 @@ for the current English and reviewed against both. | transit / bikeshare | 公共交通 / 共享单车 | | Previous / Next | 上一个 / 下一个 | | compass points (N, NNE, …) | 北, 北东北, … | +| weather field / FIELD (selector) | 气象场 / 要素 | +| weather model / forecast lead hours | 模式 / 预报时效 | +| valid (forecast time) | 有效时间 | +| scene cloud / mosaic | 整景云量 / 镶嵌图 | +| pin (Recent Imagery) | 固定 | +| THIS (voice pointer) | 所指 | +| outline / trace an outline | 轮廓 / 绘制轮廓 | +| mark (map annotation) | 标注 | +| camera badge | 摄像头标记 | +| provider / embedded provider controls | 服务商 / 平台控件 | +| share (a view or link) | 分享 | +| AI agent | AI 智能体 | +| stage (rocket) / downrange | 子级 / 航程 | +| capture shot / camera move | 保存镜头 / 运镜 | +| story beat / evidence beat | 事件节点 / 证据节点 | +| camera pose | 位姿 | +| forecast uncertainty cone | 预报不确定范围 | +| seed (catalog data) | 预置 | +| frame (bring into view) | 将…纳入视野 | diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index a83d35cc0..8b5240e12 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -18,7 +18,7 @@ "{owner} is using the pointer — close it first.": "{owner} 正在使用指针——请先关闭它。", "{label} · Detailed outline unavailable": "{label} · 无法获取详细轮廓", "Flying to Austin, TX...": "正在飞往德克萨斯州奥斯汀…", - "Restoring shared view...": "正在恢复共享视图…", + "Restoring shared view...": "正在恢复分享视图…", "Configuring viewer...": "正在配置视图…", "Loading Google 3D Tiles...": "正在加载 Google 3D Tiles…", "Loading the keyless globe...": "正在加载免密钥地球…", @@ -31,7 +31,7 @@ "Light aircraft": "轻型飞机", "Glider": "滑翔机", "Turboprop": "涡桨飞机", - "Airliner": "喷气客机", + "Airliner": "民航客机", "Widebody": "宽体机", "Four-engine jet": "四发喷气机", "Helicopter": "直升机", @@ -48,10 +48,10 @@ "Bhote Koshi valley footage": "Bhote Koshi 河谷画面", "Flood footage": "洪水画面", "Compilation and casualty claims": "视频合集与伤亡说法", - "SOURCE GEOCONFIRMED · WORLD-PINNED": "来源已地理核实 · 已标定于地图", + "SOURCE GEOCONFIRMED · WORLD-PINNED": "来源位置已核实 · 已在地图上标注", "SOURCE CREDITED · LOCATION UNRESOLVED": "来源已署名 · 位置未确定", "REFERENCE ONLY · CLAIMS UNVERIFIED": "仅供参考 · 说法未核实", - "SOURCE GEOCONFIRMED": "来源已地理核实", + "SOURCE GEOCONFIRMED": "来源位置已核实", "2021 historical reference versus 2026 post-event imagery; changes are cumulative and include the July 2025 Rasuwagadhi flood. Schematic downstream progression, not modeled arrival time; not an official hazard model.": "2021 年历史参考影像与 2026 年灾后影像对比;变化为累计结果,包含 2025 年 7 月的 Rasuwagadhi 洪水。下游演进为示意,并非模拟的到达时间;也不是官方灾害模型。", "Immediate collapse viewpoint": "近距离崩塌观察点", "Collapse viewpoint": "崩塌观察点", @@ -98,7 +98,7 @@ "YOUTUBE {state} · OPEN ORIGINAL": "YOUTUBE {state} · 打开原始来源", "INITIATION": "起始", "DAMMING": "堰塞", - "SECONDARY FAILURE": "二次溃决", + "SECONDARY FAILURE": "第二次滑坡", "BORDER ARRIVAL": "抵达边境", "PROPAGATION": "演进", "DOWNSTREAM PASSAGE": "向下游推进", @@ -125,11 +125,11 @@ "Historical reference and post-event image split": "历史参考与灾后影像的分割", "RECONSTRUCTION CLOCK": "重构时钟", "Schematic downstream progression": "下游演进示意", - "Story beat navigation": "故事节拍导航", - "Previous story beat": "上一个故事节拍", + "Story beat navigation": "事件节点导航", + "Previous story beat": "上一个事件节点", "CAUSE": "成因", "CAPTURE TIME UNVERIFIED": "拍摄时间未核实", - "Next story beat": "下一个故事节拍", + "Next story beat": "下一个事件节点", "▶ PLAY": "▶ 播放", "Play the next shot and continue through this scene": "播放下一个镜头并继续整个场景", "▶ PLAY SCENE": "▶ 播放场景", @@ -300,7 +300,7 @@ "Opening space missions…": "正在打开太空任务…", "Scanning active events…": "正在扫描活跃事件…", "Live earthquakes and active fires, from USGS and NASA": "来自 USGS 和 NASA 的实时地震与活跃火点", - "It feels like a forbidden cockpit—then you realize the sources are public and the data is real.": "它像一座禁地座舱——然后你会发现,数据来源都是公开的,数据都是真实的。", + "It feels like a forbidden cockpit—then you realize the sources are public and the data is real.": "仿佛闯进了一间机密座舱——随后你会发现,数据来源全部公开,数据全部真实。", "Working…": "处理中…", "Could not open that mission{detail}. Retry or explore manually.": "无法打开该任务{detail}。请重试或手动探索。", "This browser is blocking storage, so that could not be saved.": "此浏览器阻止了存储,因此无法保存。", @@ -338,7 +338,7 @@ "AIS: --": "AIS: --", "N/A": "无", "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} {band} {locality} | {region} | ALT {alt} | 视窗 {window} | SUN {sun}° | ONA {ona}° | {zone}", - "NEAR {poi} ({city}) {distance}": "邻近 {poi}({city}){distance}", + "NEAR {poi} ({city}) {distance}": "{poi}({city})附近 {distance}", "SECTOR {lat} {lon}": "扇区 {lat} {lon}", "N": "北", "S": "南", @@ -349,7 +349,7 @@ }, "POWERED UP": "已增强", "Provider Settings does not answer proxied requests": "服务商设置不响应经代理的请求", - "Provider Settings is disabled while sharing is enabled": "启用共享时,服务商设置不可用", + "Provider Settings is disabled while sharing is enabled": "启用分享时,服务商设置不可用", "Provider Settings answers only the machine running the server": "服务商设置只响应运行服务器的本机", "Provider Settings answers only local hostnames": "服务商设置只响应本地主机名", "Provider Settings requires an exact local Origin": "服务商设置要求完全匹配的本地 Origin", @@ -371,7 +371,7 @@ "{name} is configured outside Provider Settings and can only be changed where it was set": "{name} 是在服务商设置之外配置的,只能在原设置处修改", "The key was not saved: could not restrict the credential file to your account; nothing was saved": "密钥未保存:无法将凭据文件限制为仅你的账户可访问;未保存任何内容", "The key was not saved: the existing configuration could not be read, so nothing was changed": "密钥未保存:无法读取现有配置,因此未做任何更改", - "Could not write the {store} store": "无法写入{store}存储", + "Could not write the {store} store": "无法写入 {store} 存储", "Save failed ({status}).": "保存失败({status})。", "OAuth check failed: {detail}": "OAuth 检查失败:{detail}", "Could not check ChatGPT sign-in. Try again.": "无法检查 ChatGPT 登录状态,请重试。", @@ -450,7 +450,7 @@ "SHOW NEAREST": "最近摄像头", "Stop following the current object before navigating to a camera": "请先停止跟踪当前目标,再前往摄像头", "Move to the nearest loaded camera and show its details": "前往最近已加载的摄像头并显示详情", - "Camera badges": "摄像头徽标", + "Camera badges": "摄像头标记", "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "选中后青色摄像头变为珊瑚色。扇形仅示意已标绘方向,并非实测覆盖范围。附近的摄像头可能不在屏幕内。", "{count} nearby · {onScreen} on screen": { "other": "附近 {count} 个 · 屏幕上 {onScreen} 个" @@ -526,7 +526,7 @@ "SRC {value}": "SRC {value}", "{value} CONTEXT": "{value} 态势", "{spec} · SPECS: CCTV-DATABASE.COM": "{spec} · 规格:CCTV-DATABASE.COM", - "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "覆盖大西洋及北太平洋东部/中部;不含全球气旋。", + "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "仅覆盖大西洋及北太平洋东部和中部,并非全球气旋覆盖。", "Cyclone advisories unavailable": "气旋公告不可用", "Cyclone data unavailable": "气旋数据不可用", "Potential tropical cyclone": "潜在热带气旋", @@ -535,9 +535,9 @@ "Tropical depression": "热带低压", "Subtropical storm": "亚热带风暴", "Subtropical depression": "亚热带低压", - "Track and cone match this advisory": "路径和锥体与本期公告一致", - "Track/cone awaiting advisory {number}": "路径/锥体等待第 {number} 号公告", - "Track/cone unavailable": "路径/锥体不可用", + "Track and cone match this advisory": "路径和预报不确定范围与本期公告一致", + "Track/cone awaiting advisory {number}": "路径/预报不确定范围等待第 {number} 号公告", + "Track/cone unavailable": "路径/预报不确定范围不可用", "Cached advisory · stale source": "缓存公告 · 数据源已过期", "Loading advisories…": "正在加载公告…", "{count} active storms": { @@ -554,9 +554,9 @@ "Official advisory ↗": "官方公告 ↗", "Active NHC and CPHC cyclone advisories": "活跃的 NHC 与 CPHC 气旋公告", "Wind unavailable": "风场数据不可用", - "Advisory center / forecast track": "公告中心 / 预报路径", - "Center-track uncertainty cone": "中心路径不确定锥", - "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "在地图上点选气旋,或在列表中选择以选中并移动相机。点击空白地图区域可清除选择。内容来自 NOAA NHC/CPHC 公告。锥体描述的是预报中心路径的不确定范围,不代表气旋尺寸或全部灾害区域。预报点标注的是数据源的前导小时数,不是按公告发布时刻推算的时间。几何图形贴地显示;显示高度并非天气高度。请以官方公告为准。", + "Advisory center / forecast track": "公告中的气旋中心 / 预报路径", + "Center-track uncertainty cone": "中心路径预报不确定范围", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "在地图上点选气旋,或在列表中选择以选中并移动相机。点击空白地图区域可清除选择。内容来自 NOAA NHC/CPHC 公告。该区域表示气旋中心路径预报的不确定范围,不代表气旋大小或全部灾害影响范围。预报点标注的是数据源的预报时效(小时),不是按公告发布时刻推算的时间。几何图形贴地显示;显示高度并非天气高度。请以官方公告为准。", "DRIVE": "驾车", "Drive": "驾车", "WALK": "步行", @@ -658,15 +658,15 @@ "FLY ···": "飞行 ···", "FLYING": "飞行中", "FLY": "飞行", - "Fly the camera along the route": "沿路线飞行相机", + "Fly the camera along the route": "让相机沿路线飞行", "Place A and B first": "请先放置 A 和 B", "action|CLEAR": "清除", - "Remove the route and both markers": "移除路线和两个标记点", + "Remove the route and both markers": "移除路线和两个标注点", "press Escape twice to leave Draw": "按两次 Escape 退出“绘制”", "{name} is active — turn {name} off, then set {endpoint}": "{name} 正在使用——请先关闭 {name},再设置 {endpoint}", "{name} is active — {leave}, then set {endpoint}": "{name} 正在使用——请先{leave},再设置 {endpoint}", "Only the first {count} turns of this route are shown": "此路线仅显示前 {count} 个转向", - "Turn-by-turn directions": "逐向导航路线", + "Turn-by-turn directions": "分步导航", "Another map tool is using clicks — close it, then SET A again": "另一个地图工具正在占用点击——请先关闭它,再重新设置 A", "Routing…": "正在规划路线…", "No route found": "未找到路线", @@ -706,7 +706,7 @@ "fire confidence|high": "高", "fire confidence|nominal": "中", "fire confidence|low": "低", - "age|<1h": "<1 小时", + "age|<1h": "不到 1 小时", "age|{count}h": "{count} 小时", "age|{count}d": "{count} 天", "Fire · FRP {frp} MW": "火点 · FRP {frp} MW", @@ -759,17 +759,17 @@ "LIFTOFF · {mission}": "点火升空 · {mission}", "ASCENT REPLAY · {mission}": "上升回放 · {mission}", "ASCENT ESTIMATE · {mission}": "上升估算 · {mission}", - "STAGE RE-ENTRY / RECOVERY · {mission}": "级段再入 / 回收 · {mission}", + "STAGE RE-ENTRY / RECOVERY · {mission}": "子级再入 / 回收 · {mission}", "ORBIT REPLAY · {mission}": "轨道回放 · {mission}", "PAUSED · {title}": "已暂停 · {title}", "UNSPECIFIED": "未指明", "+{count} additional payload records": "另有 {count} 条有效载荷记录", "PAYLOAD DATA UNAVAILABLE": "有效载荷数据不可用", - "{value} KM DOWNRANGE": "射程 {value} km", + "{value} KM DOWNRANGE": "航程 {value} km", "POSITION UNAVAILABLE": "位置不可用", "FLIGHT {count}": "第 {count} 次飞行", "REUSED": "复用", - "NO STAGE RE-ENTRY / RECOVERY DATA": "无级段再入 / 回收数据", + "NO STAGE RE-ENTRY / RECOVERY DATA": "无子级再入 / 回收数据", "{count} / 30D": "{count} / 30 天", "NO MISSIONS AVAILABLE IN THE CURRENT 30-DAY WINDOW": "当前 30 天窗口内没有可用任务", "DATE UNAVAILABLE": "日期不可用", @@ -793,8 +793,8 @@ "NAME": "名称", "TYPE": "类型", "DESTINATION": "目的地", - "STAGE / RE-ENTRY / RECOVERY": "级段 / 再入 / 回收", - "STAGE": "级段", + "STAGE / RE-ENTRY / RECOVERY": "子级 / 再入 / 回收", + "STAGE": "子级", "STATUS": "状态", "FINAL POSITION": "最终位置", "REPLAY SPEED": "回放速度", @@ -806,7 +806,7 @@ "SHOW ALL / DESELECT": "显示全部 / 取消选择", "Pause replay": "暂停回放", "Cancel replay": "取消回放", - "EST. DOWNRANGE": "预估射程", + "EST. DOWNRANGE": "预估航程", "PLANNED · ": "计划 · ", "SUPPLIED TRAJECTORY POINTS": "提供的轨迹点", "RECONSTRUCTED ESTIMATE": "重建估算", @@ -828,9 +828,9 @@ "Your decoder feed": "你的解码器数据源", "Your RTL-SDR receiver": "你的 RTL-SDR 接收机", "NO CALLSIGN": "无呼号", - "ALT {altitude} FT · GS {speed} KT · TRK {track}": "高度 {altitude} FT · 地速 {speed} KT · 航迹 {track}", - "V/S {rate}": "升降 {rate}", - "V/S {rate} FPM": "升降 {rate} FPM", + "ALT {altitude} FT · GS {speed} KT · TRK {track}": "高度 {altitude} ft · 地速 {speed} kn · 航迹角 {track}", + "V/S {rate}": "升降率 {rate}", + "V/S {rate} FPM": "升降率 {rate} ft/min", "POSITION {age}": "位置 {age}", "POSITION {seconds} S AGO": "位置 {seconds} 秒前", "{count} MSGS": { @@ -938,21 +938,21 @@ "World": "世界音乐", "overview": "概览", "cloud unknown": "云量未知", - "{percent}% scene cloud": "场景云量 {percent}%", - "{min}–{max}% scene cloud": "场景云量 {min}–{max}%", + "{percent}% scene cloud": "整景云量 {percent}%", + "{min}–{max}% scene cloud": "整景云量 {min}–{max}%", "Comparison in use by another scene": "对比功能正被另一个场景占用", "Esri map unavailable · no swipe": "Esri 地图不可用 · 无法滑动对比", "Swipe needs a globe map": "滑动对比需要球体地图", "Imagery stays on Esri · CLEAR to use Google 3D": "影像保留在 Esri · 清除后改用 Google 3D", "Imagery catalog unavailable": "影像目录不可用", - "Catalog truncated · a newer clear day may exist": "目录已截断 · 可能还有更新的晴天", + "Catalog truncated · a newer clear day may exist": "目录已截断 · 可能还有更近的少云日期", "{label} catalog unavailable · {detail}": "{label} 目录不可用 · {detail}", "Daily overview for today may still be empty until the pass": "卫星过境前,今天的每日概览可能仍为空", "Box and images cleared": "框选及影像已清除", "MORE DETAIL · 30 m": "更多细节 · 30 m", "Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "Sentinel-2 与 Landsat,经 HLS,30 m,每 2–6 天", "DAILY OVERVIEW · 250 m": "每日概览 · 250 m", - "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "VIIRS 每日拼图,250 m,反映大范围变化;25 km 以下几乎没有细节", + "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "VIIRS 每日镶嵌图,250 m,反映大范围变化;25 km 以下几乎没有细节", "Sentinel-2": "Sentinel-2", "Sentinel-2 via HLS": "Sentinel-2(经 HLS)", "Landsat 8/9": "Landsat 8/9", @@ -1023,15 +1023,15 @@ "Panoramax sent too much data": "Panoramax 返回的数据过多", "Panoramax is busy": "Panoramax 繁忙", "Panoramax sent an unreadable answer": "Panoramax 返回的响应无法读取", - "No street-level imagery providers configured": "未配置街景影像提供商", + "No street-level imagery providers configured": "未配置街景影像服务商", "{names}: by upload date": "{names}:按上传日期", "Open the Street Level panel to view imagery": "打开街景面板以查看影像", "Image could not be opened": "图像无法打开", "TeleGeography load failed": "TeleGeography 加载失败", "UNAVAILABLE · {source} · Roads unavailable": "不可用 · {source} · 道路不可用", "Roads: {source}": "道路:{source}", - "TomTom roads unavailable while the traffic service is unreachable": "交通服务不可达期间 TomTom 道路不可用", - "Hybrid unavailable while the traffic service is unreachable": "交通服务不可达期间混合模式不可用", + "TomTom roads unavailable while the traffic service is unreachable": "无法连接交通服务期间 TomTom 道路不可用", + "Hybrid unavailable while the traffic service is unreachable": "无法连接交通服务期间混合模式不可用", "TomTom roads need a TomTom key": "TomTom 道路需要 TomTom 密钥", "Hybrid needs a TomTom key": "混合模式需要 TomTom 密钥", "Local surface still loading": "本地路面仍在加载", @@ -1041,8 +1041,8 @@ "TomTom roads only, each with its live flow": "仅 TomTom 道路,各自带实时路况", "TomTom roads only, each with its live flow (needs a TomTom key)": "仅 TomTom 道路,各自带实时路况(需要 TomTom 密钥)", "OpenStreetMap roads, with TomTom flow matched when available": "OpenStreetMap 道路,可用时匹配 TomTom 路况", - "TomTom roads first; OpenStreetMap fills the rest, simulated": "优先 TomTom 道路;其余由 OpenStreetMap 补足,路况为模拟", - "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "优先 TomTom 道路;其余由 OpenStreetMap 补足,路况为模拟(需要 TomTom 密钥)", + "TomTom roads first; OpenStreetMap fills the rest, simulated": "优先使用 TomTom 道路及实时路况;缺失路段由 OpenStreetMap 补充,并模拟其路况", + "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "优先使用 TomTom 道路及实时路况;缺失路段由 OpenStreetMap 补充,并模拟其路况(需要 TomTom 密钥)", "Hybrid": "混合", "TomTom key unavailable": "TomTom 密钥不可用", "TomTom daily budget reached": "已达 TomTom 每日配额", @@ -1051,7 +1051,7 @@ "SIMULATED — {reason}": "模拟——{reason}", "Syncing flow · Roads: {source}": "正在同步路况 · 道路:{source}", "LIVE · Roads: {source} · Roads without flow hidden": "实时 · 道路:{source} · 已隐藏无路况道路", - "LIVE · Roads: {source} · No flow roads in view": "实时 · 道路:{source} · 视野内无路况道路", + "LIVE · Roads: {source} · No flow roads in view": "实时 · 道路:{source} · 视野内没有带路况数据的道路", "LIVE · Roads: {source} · Flow {percent}%": "实时 · 道路:{source} · 路况 {percent}%", "SIMULATED · Roads: {source} · Flow {percent}%": "模拟 · 道路:{source} · 路况 {percent}%", "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "正在同步路况 · 道路:OpenStreetMap · 路况:TomTom · 未匹配:模拟", @@ -1073,7 +1073,7 @@ "occupancy|not boardable": "无法上车", "Route {route}": "线路 {route}", "Vehicle {vehicle}": "车辆 {vehicle}", - "vehicle motion|Stopped": "停驶", + "vehicle motion|Stopped": "已停车", "No recent fix": "无近期定位", "Waiting for update": "等待更新", "Moving": "行驶中", @@ -1147,7 +1147,7 @@ "frame {index}/{total}": "第 {index}/{total} 帧", "loading": "加载中", "Observation: unavailable": "观测:不可用", - "Contiguous US · gaps ≠ no rain": "美国本土 · 无回波 ≠ 无降雨", + "Contiguous US · gaps ≠ no rain": "美国本土连续区域 · 数据缺失 ≠ 无降雨", "Americas + Pacific · not individual strikes": "美洲与太平洋 · 非单次闪击", "Color: strikes/km²/min ×10³": "颜色:次闪击/km²/分钟 ×10³", "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · 通常延迟 2–3 小时", @@ -1167,7 +1167,7 @@ "strikes/km²/min ×10³": "次闪击/km²/分钟 ×10³", "N. America": "北美", "Global": "全球", - "Hourly global mosaic; usually 2–3 hours delayed": "每小时全球拼图;通常延迟 2–3 小时", + "Hourly global mosaic; usually 2–3 hours delayed": "每小时全球镶嵌图;通常延迟 2–3 小时", "GOES regional clouds; approximately 5-minute updates": "GOES 区域云图;约 5 分钟更新", "Clouds only": "仅云区", "Apply the full cloud brightness key; 100% filter strength": "应用完整的云层亮度映射;滤镜强度 100%", @@ -1185,7 +1185,7 @@ "Map center is outside source coverage": "地图中心在数据源覆盖范围之外", "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "NOAA/NWS 15 分钟闪电密度,来源为 Vaisala NLDN/GLD360。覆盖自 110°E 经太平洋/美洲至 0°,25°S–80°N。不是实时闪击计数、不是全球覆盖,也不构成安全警示。", "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "NOAA MRMS 雷达回波反映降水形态,不代表降雨强度、风暴警报或未来预报。原始数据分辨率约 1 km;显示限制在第 6 级。各帧使用数据源公布的精确观测时间。", - "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "GOES-19/18 第 14 波段长波红外区域图;NESDIS 全球长波拼图。“仅云区”会调暗除明亮冷云顶之外的一切;这是亮度滤镜,不是云掩膜。覆盖范围与新鲜度因区域而异。", + "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "GOES-19/18 第 14 波段长波红外区域图;NESDIS 全球长波镶嵌图。“仅云区”会调暗除明亮冷云顶之外的一切;这是亮度滤镜,不是云掩膜。覆盖范围与新鲜度因区域而异。", "REGION": "区域", "IMAGE": "图像", "FILTER": "滤镜", @@ -1197,7 +1197,7 @@ "Some weather tiles unavailable": "部分天气瓦片不可用", "Malformed weather manifest": "天气清单格式错误", "Weather request timed out": "天气请求超时", - "Temperature field unavailable": "温度字段不可用", + "Temperature field unavailable": "温度场不可用", "Mean sea level pressure field unavailable": "平均海平面气压场不可用", "Wind upstream unavailable": "风场上游数据源不可用", "{source} HTTP {status}": "{source} HTTP {status}", @@ -1212,7 +1212,7 @@ "{model} forecast · {time}": "{model} 预报 · {time}", "Loading forecast": "正在加载预报", "Preparing flow": "正在准备流场", - "Selected field unavailable": "所选字段不可用", + "Selected field unavailable": "所选气象场不可用", "Cached forecast · stale": "缓存预报 · 已过期", "ECMWF IFS surface forecast": "ECMWF IFS 地面预报", "NOAA GFS surface forecast": "NOAA GFS 地面预报", @@ -1224,22 +1224,22 @@ "Speed": "风速", "Pressure": "气压", "Temperature": "气温", - "Wind trails with no field shading": "仅风流线,不叠加字段填色", + "Wind trails with no field shading": "仅显示风流线,不叠加气象场填色", "How hard the surface wind is blowing": "地面风有多大", "Sea-level air pressure: broad highs and lows": "海平面气压:大范围的高压与低压", "Air temperature two meters above the surface": "地面以上两米的气温", "Wind speed units": "风速单位", - "Read wind at map center": "读取地图中心风速", + "Read wind at map center": "读取地图中心气象数据", "Read the forecast at the center of the map without changing selection": "读取地图中心的预报值,不改变当前选择", "{model} forecast · {field} ({unit})": "{model} 预报 · {field}({unit})", "Valid: {time}": "有效时间:{time}", "preparing": "准备中", "Issued: {time}": "发布:{time}", - "Selected field unavailable · wind remains visible": "所选字段不可用 · 风场仍可见", + "Selected field unavailable · wind remains visible": "所选气象场不可用 · 风场仍可见", "{error} · wind remains visible": "{error} · 风场仍可见", - "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "10 m 高度的地表风。约 1° 全球网格。流线沿 10 m 风场绘制,为便于观看抬升至 12 km;显示高度并非天气高度。视图光照仅为可读性服务。动画展示的是单一固定预报内的流场,不推进时间。颜色字段贴附于球体底图或当前的照片级 3D Tiles。", - "MODEL": "模型", - "FIELD": "字段", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "10 m 高度的地表风。约 1° 全球网格。流线沿 10 m 风场绘制,为便于观看抬升至 12 km;显示高度并非天气高度。视图光照仅为可读性服务。动画展示的是单一固定预报内的流场,不推进时间。气象场填色叠加于地球底图或当前的照片级 3D Tiles。", + "MODEL": "模式", + "FIELD": "要素", "UNITS": "单位", "MOTION": "运动", "Forecast": "预报", @@ -1265,7 +1265,7 @@ "{model} · valid {time}": "{model} · 有效时间 {time}", "Wind speed field unavailable": "风速场不可用", "Globe imagery unavailable": "球体影像不可用", - "Globe field image unavailable": "球体字段图像不可用", + "Globe field image unavailable": "地球气象场图像不可用", "Unknown wind model": "未知风场模式", "Unknown weather overlay": "未知天气叠加层", "Wind request timed out": "风场请求超时", @@ -1292,11 +1292,11 @@ "Exit cockpit to fly to a cyclone": "请先退出座舱,再飞往气旋", "Exit cockpit to fly to an aircraft": "请先退出座舱,再飞往飞机", "Exit cockpit to fly to a satellite": "请先退出座舱,再飞往卫星", - "Exit cockpit to frame contacts": "请先退出座舱,再取景目标", + "Exit cockpit to frame contacts": "请先退出座舱,再将目标纳入视野", "Visible map targets": "可见的地图目标", "Focusing {label}": "正在聚焦 {label}", "Source": "来源", - "Camera ownership changed": "相机所有权已变更", + "Camera ownership changed": "相机控制权已变更", "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "已保存的项目无法读取;存储已保留。请导入有效文件以恢复保存。", "Ready": "就绪", "Scene layer turned off": "场景图层已关闭", @@ -1306,7 +1306,7 @@ "Scene not saved — browser storage unavailable": "场景未保存——浏览器存储不可用", "Loaded: {scene} / {shot}": "已加载:{scene} / {shot}", "Cannot update {scene}: shot inventory changed": "无法更新 {scene}:镜头清单已变化", - "Cannot update {scene}: evidence beats changed": "无法更新 {scene}:证据节拍已变化", + "Cannot update {scene}: evidence beats changed": "无法更新 {scene}:证据节点已变化", "Cannot update {scene}: shot bindings are incomplete": "无法更新 {scene}:镜头绑定不完整", "Updated {count} shots: {scene}": { "other": "已更新 {count} 个镜头:{scene}" @@ -1314,8 +1314,8 @@ "Appended {count} shots: {scene}": { "other": "已追加 {count} 个镜头:{scene}" }, - "Cannot capture shot: camera not ready": "无法截取镜头:相机未就绪", - "Captured: {scene} / {shot}": "已截取:{scene} / {shot}", + "Cannot capture shot: camera not ready": "无法保存镜头:相机未就绪", + "Captured: {scene} / {shot}": "已保存:{scene} / {shot}", "Select a shot first": "请先选择一个镜头", "Updated: {scene} / {shot}": "已更新:{scene} / {shot}", "Could not leave scene: {scene}": "无法离开场景:{scene}", @@ -1383,23 +1383,23 @@ "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack}:{status}。文件:{path}。{attribution} · {license}", "Unavailable layers: {layers}": "不可用图层:{layers}", "Uses registered content or linked media. Those external files are not included in a scene bundle. Their original notices still apply.": "使用了已注册内容或链接媒体。这些外部文件不包含在场景资源包中。其原始声明仍然适用。", - "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "已校验 {bytes} 个打包字节。文件仅保留在本次会话的内存中。重新加载应用后请再次导入资源包。", - "Review scene import": "审查场景导入", - "Nothing is loaded or changed until you apply this file.": "在你应用此文件之前,不会载入或更改任何内容。", + "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "已校验打包内容 {bytes} 字节。文件仅保留在本次会话的内存中。重新加载应用后请再次导入资源包。", + "Review scene import": "场景导入预览", + "Nothing is loaded or changed until you apply this file.": "确认导入此文件前,不会载入或更改任何内容。", "Ready to import": "可以导入", "Apply replaces the current project. Export your current project first if you want to keep both.": "应用后将替换当前项目。如需同时保留两者,请先导出当前项目。", - "Apply import": "应用导入", - "Import was not applied. The current project may have changed.": "导入未应用。当前项目可能已发生变化。", + "Apply import": "确认导入", + "Import was not applied. The current project may have changed.": "未执行导入。当前项目可能已发生变化。", "Select a scene and shot first": "请先选择场景和镜头", "Edit scene details": "编辑场景详情", - "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "相机位置使用度与椭球面上的米数。草稿在替换已保存场景之前会先进行校验。", + "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "相机经纬度以度为单位,高度为相对椭球面的高度,以米为单位。草稿通过校验后才会替换已保存的场景。", "Anchors and data packs": "锚点与数据包", "Shot camera, timing, packs and actions": "镜头相机、时序、数据包与动作", "New anchor ID": "新锚点 ID", - "Capture camera as anchor": "将当前相机采集为锚点", + "Capture camera as anchor": "将当前相机位置设为锚点", "Anchor added to draft": "锚点已加入草稿", - "Set move start to current camera": "将运动起点设为当前相机", - "Move added to draft; destination remains the shot camera": "运动已加入草稿;终点仍为镜头相机", + "Set move start to current camera": "将运镜起点设为当前相机位置", + "Move added to draft; destination remains the shot camera": "运镜已加入草稿;终点仍为该镜头的相机位置", "Use ordinary flight": "使用普通飞行", "Invalid shot JSON": "镜头 JSON 无效", "Apply details": "应用详情", @@ -1454,7 +1454,7 @@ "Vignette": "暗角", "Pixelation": "像素化", "Distortion": "畸变", - "Instability": "不稳定", + "Instability": "抖动", "Density": "密度", "Gain": "增益", "Bloom": "泛光", @@ -1475,10 +1475,10 @@ "Copy failed": "复制失败", "Return map to straight-down view": "将地图恢复为垂直俯视", "Tilt map to oblique view": "将地图倾斜至斜视角", - "Reset map to north up. Current heading {heading} degrees": "将地图重置为朝北。当前航向 {heading} 度", + "Reset map to north up. Current heading {heading} degrees": "将地图重置为正北朝上。当前方位 {heading} 度", "Tilted view": "倾斜视角", "Straight-down view": "垂直俯视", - "North up": "朝北", + "North up": "正北朝上", "CCTV calibration saved": "CCTV 校准已保存", "HDG": "HDG", "PITCH": "俯仰", @@ -1496,7 +1496,7 @@ "UPSTREAM": "上游", "SYNTHETIC": "合成", "CONFIGURED": "已配置", - "SEED": "种子", + "SEED": "预置", "UNKNOWN": "未知", "ERROR": "错误", "Live HLS connected": "实时 HLS 已连接", @@ -1573,10 +1573,10 @@ "CLOUD UNKNOWN": "云量未知", "{source} · LOCATION QUERY": "{source} · 位置查询", "REGIONAL NEWS": "地区新闻", - "{label} · {radius} AIR/SEA WINDOW": "{label} · {radius} 空中 / 海上范围", + "{label} · {radius} AIR/SEA WINDOW": "{label} · {radius} 航班 / 船舶范围", "{scope} · INSTALLATIONS {coverage}": "{scope} · 设施 {coverage}", "CONTEXT STANDBY": "态势待机", - "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "启用全局态势以获取邻近提示", + "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "启用全局态势以获取邻近目标", "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "目标丢失 · 最后已知读数 · 不代表安全无虞", "CONTACT LOST · {subject}": "目标丢失 · {subject}", "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "目标已脱离其数据源 · 读数保持最后已知值", @@ -1592,7 +1592,7 @@ }, "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "可用输入均为最新 · 不代表安全无虞", "SQUAWK {code} · {status}": "应答码 {code} · {status}", - "ADS-B PRIORITY · {status}": "ADS-B 优先 · {status}", + "ADS-B PRIORITY · {status}": "ADS-B 优先级 · {status}", "ADS-B EMERGENCY · {status}": "ADS-B 紧急 · {status}", "AIRCRAFT": "飞机", "ACQUIRING SURFACE": "正在获取地面数据", @@ -1614,7 +1614,7 @@ "Anime": "动漫", "Noir": "黑白", "Snow": "雪景", - "Current cockpit vision style: {style}. Activate for next style.": "当前座舱视觉样式:{style}。激活可切换到下一个样式。", + "Current cockpit vision style: {style}. Activate for next style.": "当前座舱视觉样式:{style}。点击可切换到下一个样式。", "Current style: {style} — click for next": "当前样式:{style}——点击切换下一个", "Collapse Contact panel": "收起目标面板", "Expand Contact panel": "展开目标面板", @@ -1624,9 +1624,9 @@ "Expand cockpit briefing panel": "展开座舱简报面板", "Collapse briefing panel": "收起简报面板", "Expand briefing panel": "展开简报面板", - "OBSERVED / MAPPED PINGS": "观测 / 地图标注提示", + "OBSERVED / MAPPED PINGS": "观测 / 地图标注目标", "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "来源可查的事件 · 无合成新闻", - "LATEST LOCATION-MATCHED REPORTING": "最新的位置匹配报道", + "LATEST LOCATION-MATCHED REPORTING": "当前地区最新报道", "{source} · LOCATION QUERY · RECENT": "{source} · 位置查询 · 近期", "LOCAL INFO": "本地信息", "PLACE / CONDITIONS / POSITION": "地点 / 状况 / 位置", @@ -1775,7 +1775,7 @@ "closed": "已关闭", "feed status|live": "实时", "feed status|stale": "过期", - "feed status|unreachable": "无法访问", + "feed status|unreachable": "无法连接", "feed status|invalid": "无效", "waiting for IQ": "等待 IQ 数据", "{count} messages": { @@ -1789,7 +1789,7 @@ "audio signal --": "音频信号 --", "audio {state}": "音频 {state}", "{count} HEARD": { - "other": "已收到 {count} 架" + "other": "已接收 {count} 架飞机的信号" }, "DISCONNECT": "断开连接", "CONNECT": "连接", @@ -1817,8 +1817,8 @@ "Resetting cockpit to full globe view": "正在将座舱重置为完整地球视图", "MAP": "地图", "panel": "面板", - "Expand {name}": "展开{name}", - "Collapse {name}": "收起{name}", + "Expand {name}": "展开 {name}", + "Collapse {name}": "收起 {name}", "Expand Radio": "展开电台", "Collapse Radio": "收起电台", "Expand Radio section": "展开电台区域", @@ -1863,7 +1863,7 @@ "NO STATION SELECTED": "未选择电台", "Directory metadata only": "仅目录元数据", "Loading station directory…": "正在加载电台目录…", - "Choose a globe marker or use next.": "请选择地球上的标记或使用“下一个”。", + "Choose a globe marker or use next.": "请选择地球上的标注或使用“下一个”。", "TAGS · {tags}": "标签 · {tags}", "Play": "播放", "PAUSE": "暂停", @@ -1882,7 +1882,7 @@ " · degraded directory": " · 目录降级", " · stale directory": " · 目录过期", " · outside current filter": " · 不在当前筛选范围内", - "Ready — playback starts only from your action": "就绪——仅在你操作后才开始播放", + "Ready — playback starts only from your action": "就绪——手动操作后开始播放", "Radio off": "电台已关闭", "Connecting directly to broadcaster…": "正在直接连接广播方…", "Buffering broadcaster stream…": "正在缓冲广播流…", @@ -1904,7 +1904,7 @@ "Latest": "最新", "Newest frame per product": "每个产品的最新一帧", "Replay observed history": "回放观测历史", - "Imagery on Esri · Google 3D returns when cleared": "影像来自 Esri · 清除后恢复 Google 3D", + "Imagery on Esri · Google 3D returns when cleared": "影像显示在 Esri 底图上 · 清除后恢复 Google 3D", "Point the camera at the ground to use the view": "将相机对准地面才能使用当前视野", "That point cannot anchor a box": "该点无法作为框选锚点", "Imagery stops at ±{limit}° latitude": "影像仅覆盖到纬度 ±{limit}°", @@ -1913,11 +1913,11 @@ "View is {size} wide · limit {limit}": "视野宽 {size} · 上限 {limit}", "VS BASEMAP": "对比底图", "A / B": "A / B", - "Newest low-cloud day for this box · scene cloud, not box cloud": "此框选最新的低云日 · 云量为场景云量,而非框内云量", + "Newest low-cloud day for this box · scene cloud, not box cloud": "框选区域内最近的少云日期 · 云量指整景影像,并非框选区域", "Newest day covering this box · cloudier than 20%": "覆盖此框选的最新一天 · 云量高于 20%", "Newest day with imagery for this box · partial coverage": "此框选有影像的最新一天 · 部分覆盖", "Newest daily overview for this box": "此框选的最新每日概览", - "newest clear day": "最新晴天", + "newest clear day": "最近少云日期", "newest day (cloudy)": "最新一天(多云)", "newest day (partial coverage)": "最新一天(部分覆盖)", "newest overview": "最新概览", @@ -1939,13 +1939,13 @@ "Searching the last 30 days": "正在搜索最近 30 天", "No days to show for this box": "此框选没有可显示的日期", "Drag the divider · SWAP trades sides": "拖动分割线 · “交换”互换两侧", - "← → preview · A or B pins the focused day": "← → 预览 · A 或 B 钉住聚焦日", - "← → preview the other side · A or B pins it": "← → 预览另一侧 · A 或 B 将其钉住", - "S on another day replaces it · × unpins": "在其他日期按 S 替换 · × 取消钉住", - "← → preview · S shows the focused day": "← → 预览 · S 显示聚焦日", + "← → preview · A or B pins the focused day": "← → 预览 · A 或 B 固定当前日期", + "← → preview the other side · A or B pins it": "← → 预览另一侧 · A 或 B 将其固定", + "S on another day replaces it · × unpins": "在其他日期按 S 替换 · × 取消固定", + "← → preview · S shows the focused day": "← → 预览 · S 显示当前日期", "ZOOM IN": "放大", "Fly in until the view fits the 1,000 km limit": "拉近直到视野满足 1,000 km 限制", - "Imagery days, newest first · arrows move, S or A and B pin": "影像日期(最新在前)· 方向键移动,S、A、B 钉住", + "Imagery days, newest first · arrows move, S or A and B pin": "影像日期(最新在前)· 方向键移动,S、A、B 固定", "On the map": "地图上", "Mode": "模式", "Imagery opacity": "影像不透明度", @@ -1961,22 +1961,22 @@ "PREVIEW": "预览", "Newest day with imagery for this box": "此框选有影像的最新一天", "SHOW": "显示", - "Pin {day} as {slot}": "将 {day} 钉为 {slot}", + "Pin {day} as {slot}": "将 {day} 固定为 {slot}", "Show {day}": "显示 {day}", - "pinned {slot}": "已钉为 {slot}", + "pinned {slot}": "已固定为 {slot}", "shown": "显示中", "preview": "预览", "start here": "从此开始", "No box": "无框选", "Searching": "搜索中", "Every day is empty here": "此处每天都为空", - "Sources off": "数据源未开启", + "Sources off": "数据源已关闭", "VS": "对比", "Not set": "未设置", "Basemap": "底图", - "Source off": "数据源已关", - "Unpin {slot}": "取消钉住 {slot}", - "Unpin the image": "取消钉住图像", + "Source off": "数据源已关闭", + "Unpin {slot}": "取消固定 {slot}", + "Unpin the image": "取消固定图像", "EXPORT {slot}": "导出 {slot}", "EXPORT": "导出", "Download {slot} as a PNG": "将 {slot} 下载为 PNG", @@ -2007,7 +2007,7 @@ "Stopped (Esc)": "已停止(Esc)", "SPARSE": "稀疏", "BALANCED": "均衡", - "No shots yet. Use CAPTURE SHOT to save current look.": "暂无镜头。使用“截取镜头”保存当前画面。", + "No shots yet. Use CAPTURE SHOT to save current look.": "暂无镜头。使用“保存镜头”保存当前视角及设置。", "Double-click to rename": "双击重命名", "Shot name": "镜头名称", "LOAD": "载入", @@ -2021,21 +2021,21 @@ "Cancel": "取消", "EDIT DETAILS": "编辑详情", "SHARE SCENE": "分享场景", - "Shared flight follow expired": "共享的航班跟随已过期", - "Shared military flight follow expired": "共享的军用航班跟随已过期", - "Shared satellite follow expired": "共享的卫星跟随已过期", - "Shared flight could not be restored — feed unavailable": "无法恢复共享的航班——数据源不可用", - "Shared military flight could not be restored — feed unavailable": "无法恢复共享的军用航班——数据源不可用", - "Shared satellite could not be restored — feed unavailable": "无法恢复共享的卫星——数据源不可用", - "Shared flight is unavailable": "共享的航班不可用", - "Shared military flight is unavailable": "共享的军用航班不可用", - "Shared satellite is unavailable": "共享的卫星不可用", + "Shared flight follow expired": "分享的航班跟随已过期", + "Shared military flight follow expired": "分享的军用航班跟随已过期", + "Shared satellite follow expired": "分享的卫星跟随已过期", + "Shared flight could not be restored — feed unavailable": "无法恢复分享的航班——数据源不可用", + "Shared military flight could not be restored — feed unavailable": "无法恢复分享的军用航班——数据源不可用", + "Shared satellite could not be restored — feed unavailable": "无法恢复分享的卫星——数据源不可用", + "Shared flight is unavailable": "分享的航班不可用", + "Shared military flight is unavailable": "分享的军用航班不可用", + "Shared satellite is unavailable": "分享的卫星不可用", "entity": "实体", - "Shared {subject} follow expired": "共享的 {subject} 跟随已过期", - "Shared {subject} could not be restored — feed unavailable": "无法恢复共享的 {subject}——数据源不可用", - "Shared {subject} is unavailable": "共享的 {subject} 不可用", + "Shared {subject} follow expired": "分享的 {subject} 跟随已过期", + "Shared {subject} could not be restored — feed unavailable": "无法恢复分享的 {subject}——数据源不可用", + "Shared {subject} is unavailable": "分享的 {subject} 不可用", "ACQUIRING": "获取中", - "SHARED {subject}": "共享 {subject}", + "SHARED {subject}": "分享 {subject}", "subject": "目标", "LOADING LIVE DATA": "正在加载实时数据", "LOAD COMPLETE": "加载完成", @@ -2093,7 +2093,7 @@ }, "Loading {feeds}": "正在加载 {feeds}", "{count} heard": { - "other": "已收到 {count} 架" + "other": "已接收 {count} 架飞机的信号" }, "USB {rate} msg/s": "USB {rate} msg/s", "{rate} msg/s": "{rate} msg/s", @@ -2161,21 +2161,21 @@ "Detection overlay: off": "探测叠加层:关闭", "DETECT": "探测", "{time} · {minutes} min ago": "{time} · {minutes} 分钟前", - "Active weather": "活跃天气", + "Active weather": "已启用的天气图层", "LATEST · newest per product": "最新 · 每个产品的最新一帧", - "Forecast · valid {valid} · issued {issued}": "预报 · 生效 {valid} · 发布 {issued}", + "Forecast · valid {valid} · issued {issued}": "预报 · 有效时间 {valid} · 发布 {issued}", "{detail} · Does not follow history": "{detail} · 不随观测历史变化", - "Forecast · valid {valid}": "预报 · 生效 {valid}", + "Forecast · valid {valid}": "预报 · 有效时间 {valid}", "voice|OFF": "关", "voice|CONNECTING": "连接中", "voice|LISTENING": "聆听中", "voice|EXECUTING": "执行中", "voice|ERROR": "错误", - "AI AGENT": "AI 代理", + "AI AGENT": "AI 智能体", "Voice model tier — applies next session": "语音模型档位——下次会话生效", "STD": "标准", "Estimated session cost": "预估会话费用", - "Voice control — activate to toggle voice; hold Space to speak": "语音控制——激活可切换语音;按住空格键说话", + "Voice control — activate to toggle voice; hold Space to speak": "语音控制——点击可切换语音;按住空格键说话", "ON/OFF": "开/关", "VOICE STANDBY": "语音待机", "VOICE CONTROL": "语音控制", @@ -2183,16 +2183,16 @@ "Voice assistant": "语音助手", "VOICE": "语音", "Dismiss voice card": "关闭语音卡片", - "YOU": "用户", - "THIS": "目标", + "YOU": "你", + "THIS": "所指", "Plan": "计划", "Referenced items": "引用条目", - "NOTES & SOURCES": "笔记与来源", + "NOTES & SOURCES": "说明与来源", "VOICE SYSTEM ERROR": "语音系统错误", "DISMISS": "关闭", "Check microphone permission and network access, then try again.": "请检查麦克风权限和网络连接,然后重试。", "Stopped by voice": "已通过语音停止", - "WebRTC microphone support unavailable": "不支持 WebRTC 麦克风", + "WebRTC microphone support unavailable": "当前浏览器不支持通过 WebRTC 使用麦克风", "Requesting microphone": "正在请求麦克风", "Release Space to send": "松开空格键发送", "Hold Space to talk": "按住空格键说话", @@ -2201,11 +2201,11 @@ "VOICE UNAVAILABLE": "语音不可用", "VOICE ACTIVE": "语音已启用", "Voice session could not be started.": "无法启动语音会话。", - "MINI": "迷你", + "MINI": "轻量", "Next session: {pendingId} — this session stays on {modelId}": "下次会话:{pendingId}——本次会话仍使用 {modelId}", "Voice model: {pendingId} — click to switch to {target}; applies next session": "语音模型:{pendingId}——点击切换到 {target};下次会话生效", "standard": "标准", - "mini": "迷你", + "mini": "轻量", "COST UNKNOWN": "费用未知", "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "ChatGPT OAuth 会话:已报告 {responses} 个响应、{input} 个输入 token、{output} 个输出 token、{captions} 次字幕转写。", "USD cost and the API spend cap are unavailable for this auth mode.": "此认证模式下无法提供美元费用与 API 消费上限。", @@ -2300,7 +2300,7 @@ "partial": "部分", "fallback": "备用", "unavailable": "不可用", - "Not answered: {layers}": "未回答:{layers}", + "Not answered: {layers}": "未响应:{layers}", "Toggle voice control": "切换语音控制", "Activate to toggle voice": "点击切换语音", "Voice active": "语音已启用", @@ -2310,7 +2310,7 @@ "The flights layer is not enabled": "航班图层未开启", "The military layer is not enabled": "军用航班图层未开启", "The satellites layer is not enabled": "卫星图层未开启", - "The ais-live-vessels layer is not enabled": "ais-live-vessels 图层未开启", + "The ais-live-vessels layer is not enabled": "实时 AIS 船舶图层未开启", "Could not enable the requested layer": "无法开启所请求的图层", "Could not disable the requested layer": "无法关闭所请求的图层", "Radio layer unavailable": "电台图层不可用", @@ -2334,11 +2334,11 @@ "Unknown target layer: {target}": "未知目标图层:{target}", "nominal": "正常", "{label} on": "{label} 已开启", - "Frame aircraft": "取景飞机", - "Frame military aircraft": "取景军用飞机", - "Frame ships": "取景船舶", - "Frame satellites": "取景卫星", - "Frame contacts": "取景目标", + "Frame aircraft": "将飞机纳入视野", + "Frame military aircraft": "将军用飞机纳入视野", + "Frame ships": "将船舶纳入视野", + "Frame satellites": "将卫星纳入视野", + "Frame contacts": "将目标纳入视野", "{count} aircraft in frame": { "other": "画面中 {count} 架飞机" }, @@ -2358,13 +2358,13 @@ "Nearest ships": "最近的船舶", "Nearest satellites": "最近的卫星", "Nearest aircraft": "最近的飞机", - "{first} and {second}": "{first}和{second}", + "{first} and {second}": "{first} 和 {second}", "Layer": "图层", "there": "那里", "Camera range {range}": "相机距离 {range}", "Within {radius} of the view": "距当前视野 {radius} 内", "Labels on": "标签已开启", - "Framing uses the nearest 80 loaded contacts": "取景仅使用已加载的最近 80 个目标", + "Framing uses the nearest 80 loaded contacts": "调整视野时仅包含已加载的最近 80 个目标", "{distance} from {location}": "距 {location} {distance}", "Altitude {altitude}": "高度 {altitude}", "{origin} to {destination}": "{origin} 至 {destination}", @@ -2373,15 +2373,15 @@ "Registration {registration}": "注册号 {registration}", "View state": "视野状态", "Marked {count} places": { - "other": "已标记 {count} 个地点" + "other": "已标注 {count} 个地点" }, - "Nothing marked": "没有标记", + "Nothing marked": "没有标注", "Not found: {places}": "未找到:{places}", - "Tracing outlines": "正在描画边界", - "Frame flights": "取景航班", - "Frame military": "取景军用航班", - "Frame vessels": "取景船舶", - "Frame {target}": "取景 {target}", + "Tracing outlines": "正在绘制轮廓", + "Frame flights": "将航班纳入视野", + "Frame military": "将军用航班纳入视野", + "Frame vessels": "将船舶纳入视野", + "Frame {target}": "将 {target} 纳入视野", "Zoom out to globe": "缩小至地球视图", "Open data layers": "打开数据图层", "Open or close a panel": "打开或关闭面板", @@ -2419,7 +2419,7 @@ "Check view state": "检查视野状态", "Action": "操作", "Finding places": "正在查找地点", - "Tracing outline": "正在描画边界", + "Tracing outline": "正在绘制轮廓", "Looking up place": "正在查询地点", "Flying": "飞行中", "Turning on layer": "正在开启图层", @@ -2430,8 +2430,8 @@ "done": "完成", "failed": "失败", "cancelled": "已取消", - "Outline traced": "边界描画完成", - "Outline unavailable": "边界不可用", + "Outline traced": "轮廓已绘制", + "Outline unavailable": "轮廓不可用", "Source: {label}": "来源:{label}", "WORKING": "处理中", "DONE": "完成", @@ -2449,7 +2449,7 @@ "Cockpit vision style": "座舱视觉样式", "Previous cockpit vision style": "上一个座舱视觉样式", "Previous vision style": "上一个视觉样式", - "Current cockpit vision style: NORMAL. Activate for next style.": "当前座舱视觉样式:常规。激活可切换到下一个样式。", + "Current cockpit vision style: NORMAL. Activate for next style.": "当前座舱视觉样式:常规。点击可切换到下一个样式。", "Current style: NORMAL — click for next": "当前样式:常规——点击切换下一个", "CURRENT": "当前", "Next cockpit vision style": "下一个座舱视觉样式", @@ -2534,7 +2534,7 @@ "Search location by name or coordinates": "按名称或坐标搜索位置", "Search any location...": "搜索任意位置…", "WEATHER": "天气", - "Active weather products": "活跃天气产品", + "Active weather products": "已启用的天气产品", "RECENT IMAGERY": "近期影像", "Imagery days in the box": "框选内的影像日期", "CONTEXT": "态势", @@ -2564,7 +2564,7 @@ "STATION TAG": "电台标签", "Filter stations by station tag": "按电台标签筛选电台", "All": "全部", - "Enable Radio, then choose a globe marker or use next.": "请先启用电台,然后选择地球上的标记或使用“下一个”。", + "Enable Radio, then choose a globe marker or use next.": "请先启用电台,然后选择地球上的标注或使用“下一个”。", "DRAG TO TUNE": "拖动调谐", "Tune available internet radio stations": "调谐可用的网络电台", "ALL · DRAG THE NEEDLE": "全部 · 拖动指针", @@ -2590,7 +2590,7 @@ "RTL-SDR tuner gain for the current mode": "当前模式下的 RTL-SDR 调谐器增益", "AUTO": "自动", "MSG/S": "msg/s", - "HEARD": "已收到", + "HEARD": "已接收信号", "POSITIONED": "已定位", "FM MHZ": "FM MHz", "TUNE": "调谐", @@ -2628,20 +2628,20 @@ "Weighted": "加权", "Fade": "渐隐", "Detection fade distance": "探测渐隐距离", - "World-overlay fade distance outside the keyhole as a percentage of its radius": "锁孔之外的世界叠加层渐隐距离,以其半径的百分比表示", + "World-overlay fade distance outside the keyhole as a percentage of its radius": "视域之外的世界叠加层渐隐距离,以其半径的百分比表示", "Outside": "外部", - "Detection opacity outside the keyhole": "锁孔之外的探测不透明度", + "Detection opacity outside the keyhole": "视域之外的探测不透明度", "World-overlay label and card opacity beyond the fade distance": "超出渐隐距离后世界叠加层标签和卡片的不透明度", "PARAMETERS": "参数", "3D aircraft — flat icons zoomed out, 3D models up close": "3D 飞机——拉远显示平面图标,拉近显示 3D 模型", "Models": "模型", "3D model coverage": "3D 模型覆盖范围", - "Proximity": "邻近", + "Proximity": "近处", "Scope — the circular viewport mask": "视域——圆形视口遮罩", "Scope": "视域", "Feather": "羽化", "Scope edge feather": "视域边缘羽化", - "Scope edge feather as a percentage of the keyhole radius": "视域边缘羽化,以锁孔半径的百分比表示", + "Scope edge feather as a percentage of the keyhole radius": "视域边缘羽化,以视域半径的百分比表示", "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "在地球上绘制——单击顶点,双击或按 Enter 完成,按 Esc 取消", "Shape": "形状", "Shape to draw": "要绘制的形状", @@ -2657,7 +2657,7 @@ "Green": "绿色", "Red": "红色", "Clear": "清除", - "Remove every mark from the board": "清除图板上的所有标记", + "Remove every mark from the board": "清除画板上的所有标注", "Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "在地球上显示自己的 GeoJSON、KML、KMZ 或 GPX 文件(也可直接拖放到地球上)。文件内容仅保留在本设备上;叠加层可能出现在共享给语音的地图截图中。", "Import": "导入", "Choose GeoJSON, KML, KMZ or GPX files": "选择 GeoJSON、KML、KMZ 或 GPX 文件", @@ -2670,16 +2670,16 @@ "Sharpening": "锐化", "Sharpen": "锐化", "Sharpen intensity": "锐化强度", - "EXIT CLEAN VIEW": "退出纯净视图", + "EXIT CLEAN VIEW": "退出纯净界面", "Return UI controls": "恢复界面控件", - "Initializing photorealistic world...": "正在初始化逼真世界…", + "Initializing photorealistic world...": "正在初始化照片级真实世界…", "DATA LAYERS": "数据图层", "ACQUIRING FRAME": "正在获取画面", "NEAREST": "最近", "CCTV camera": "CCTV 摄像头", "CALIBRATION": "校准", "Drag the camera in the world: rings rotate, arrows move, handles set range/FOV": "在世界中拖动摄像头:圆环旋转,箭头平移,控制点设置范围/FOV", - "Camera pose — click a value to type": "摄像头姿态——点击数值可输入", + "Camera pose — click a value to type": "摄像头位姿——点击数值可输入", "Heading (compass °) — click to type": "航向(罗盘 °)——点击输入", "Pitch (° up/down) — click to type": "俯仰(° 上/下)——点击输入", "Horizontal FOV (°) — click to type": "水平 FOV(°)——点击输入", @@ -2700,9 +2700,9 @@ "Close the image and deselect it on the map": "关闭图像并取消其在地图上的选中", "Close the street-level image": "关闭街景图像", "Street-level viewer": "街景查看器", - "Open this image on the provider's site": "在提供商网站上打开此图像", - "Imagery providers": "影像提供商", - "PROVIDERS": "提供商", + "Open this image on the provider's site": "在服务商网站上打开此图像", + "Imagery providers": "影像服务商", + "PROVIDERS": "服务商", "Imagery filters": "影像筛选", "IMAGERY": "影像", "Panorama filter": "全景筛选", @@ -2712,7 +2712,7 @@ "SCENES": "场景", "Scene recipe": "场景方案", "NEW": "新建", - "CAPTURE SHOT": "截取镜头", + "CAPTURE SHOT": "保存镜头", "UPDATE SHOT": "更新镜头", "START": "启动", "EXPORT PRESETS": "导出预设", @@ -2725,26 +2725,26 @@ "The globe already flies keyless. Every key below switches on another real feed — paste one and it's saved into this app's local configuration, then the server restarts itself. Server-side keys stay on this machine; Google Maps and Cesium ion run in the browser and must be provider-restricted. Keys you configured elsewhere are shown but never touched.": "地球无需密钥即可运行。下面的每个密钥都会启用一个新的真实数据源:粘贴后会保存到本应用的本地配置,随后服务器自动重启。服务端密钥只保存在本机;Google Maps 和 Cesium ion 在浏览器中运行,必须设置服务商限制。你在其他位置配置的密钥会显示,但不会被改动。", "SAVE KEYS": "保存密钥", "ESC to close": "按 ESC 关闭", - "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "Google Maps 密钥提供逼真的地球,其余数据源都叠加在其上。", + "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "Google Maps 密钥提供照片级 3D 地球,其余数据源都叠加在其上。", "NO PLACE LEFT BEHIND": "不遗漏任何地方", "ACTIVE STYLE": "当前样式", "Globe actions": "地球操作", "Turn off all selected data layers": "关闭所有已选数据图层", "Copy share link": "复制分享链接", "Toggle straight-down and tilted map views": "在垂直俯视与倾斜视角之间切换", - "Reset map to north up": "将地图重置为朝北", + "Reset map to north up": "将地图重置为正北朝上", "Reset map bearing to north": "重置地图方位为正北", "Reset camera and return to full globe view": "重置相机并返回完整地球视图", "MISSION CONTROL · FIRST LAUNCH": "任务控制 · 首次启动", - "Choose your first view": "选择你的首个视图", + "Choose your first view": "选择初始视图", "LIVE CONTACTS": "实时目标", "Aircraft, vessels and nearby intelligence": "飞机、船舶及周边情报", "Launches, spacecraft and orbital context": "发射、航天器与轨道态势", "EXPLORE MANUALLY": "手动探索", - "Begin with a clean globe": "从干净的地球开始", + "Begin with a clean globe": "从未叠加数据图层的地球开始", "Don't show this again": "不再显示", "ESC to dismiss": "按 ESC 关闭", - "Tip: the GEV MIC button in the dock lets you talk to the map.": "提示:停靠栏中的 GEV 麦克风按钮可让你用语音操控地图。", + "Tip: the GEV MIC button in the dock lets you talk to the map.": "提示:可通过停靠栏中的 GEV 麦克风按钮用语音操控地图。", "hemisphere|N": "N", "hemisphere|S": "S", "hemisphere|E": "E", From fd78bc38845c7fbc6fc8bd82c6eac1e6b0048155 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Wed, 21 Oct 2026 13:36:38 +0400 Subject: [PATCH 24/45] fix(zh-CN): localize readouts and keep short labels intact Preserve Chinese unit casing and spacing in the HUD and cockpit, localize FIRMS cache ages, CCTV health and radio counts, and keep imagery resolution and route modes readable. Add regression coverage for localized output and unchanged English. Co-Authored-By: Codex (GPT-6) --- src/hudLocalityFormat.js | 4 +- src/i18n/locales/es.json | 4 +- src/i18n/locales/ru.json | 4 +- src/i18n/locales/zh-CN.json | 4 +- src/i18n/same-as-english.json | 1 + src/i18n/zh-CN-display.test.mjs | 106 ++++++++++++++++++++++++++++ src/layers/firms/model.js | 1 + src/layers/firms/queries.js | 3 +- src/layers/recentImagery/display.js | 12 +++- src/ui/cctvFrames.js | 3 +- src/ui/cockpitContext.js | 4 +- src/ui/cockpitPresentation.js | 7 +- src/ui/radioPresentation.js | 11 +-- src/ui/styles/cjk.css | 25 +++++++ 14 files changed, 171 insertions(+), 18 deletions(-) create mode 100644 src/i18n/zh-CN-display.test.mjs diff --git a/src/hudLocalityFormat.js b/src/hudLocalityFormat.js index 84278564b..b508f8d59 100644 --- a/src/hudLocalityFormat.js +++ b/src/hudLocalityFormat.js @@ -15,7 +15,9 @@ export function hudQuantity(value, unit, digits = 0) { minimumFractionDigits: digits, maximumFractionDigits: digits, }); - return `${number}${unitLabel(unit).toUpperCase()}`; + const label = unitLabel(unit); + if (getLocale() === 'zh-CN') return label ? `${number} ${label}` : number; + return `${number}${label.toUpperCase()}`; } /** One hemisphere-tagged coordinate, e.g. `21.33N` / `21,33С`. */ diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index cbba42e0e..c26430fe7 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -2941,5 +2941,7 @@ "hemisphere|N": "N", "hemisphere|S": "S", "hemisphere|E": "E", - "hemisphere|W": "O" + "hemisphere|W": "O", + "OK": "OK", + "{category} ({count})": "{category} ({count})" } diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index dcd6ef20b..dadea1a42 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -3008,5 +3008,7 @@ "hemisphere|N": "С", "hemisphere|S": "Ю", "hemisphere|E": "В", - "hemisphere|W": "З" + "hemisphere|W": "З", + "OK": "НОРМА", + "{category} ({count})": "{category} ({count})" } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 8b5240e12..6b815f545 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -2807,5 +2807,7 @@ "Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "Gemini 被打断的输入超出了缓冲区或等待上限。请重新启动语音。", "Gemini Live connection is expiring. Start voice again for a new conversation.": "Gemini Live 连接即将到期。请重新启动语音以开始新对话。", "Gemini voice sessions have a time limit. When a session expires, start voice again for a new conversation.": "Gemini 语音会话有时长限制。会话到期后,请重新启动语音以开始新对话。", - "Show the street-level view full screen (Esc shrinks it)": "全屏显示街景视图(按 Esc 缩小)" + "Show the street-level view full screen (Esc shrinks it)": "全屏显示街景视图(按 Esc 缩小)", + "OK": "正常", + "{category} ({count})": "{category}({count})" } diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index 821b154b9..c331cd070 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -63,6 +63,7 @@ "NVG", "Noir", "Normal", + "OK", "POS: {time}Z", "Plan", "Pop", diff --git a/src/i18n/zh-CN-display.test.mjs b/src/i18n/zh-CN-display.test.mjs new file mode 100644 index 000000000..b9e55058d --- /dev/null +++ b/src/i18n/zh-CN-display.test.mjs @@ -0,0 +1,106 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { setLocale, t } from './index.js'; +import { hudQuantity, LOCALIZED_LOCALITY } from '../hudLocalityFormat.js'; +import { formatCockpitDistance } from '../ui/cockpitPresentation.js'; +import { cctvSourceStatusLabel } from '../ui/cctvFrames.js'; +import { READOUT_WORDS } from '../layers/recentImagery/display.js'; +import { createModel } from '../layers/firms/model.js'; +import { createQueries } from '../layers/firms/queries.js'; +import { renderRadioState } from '../ui/radioPresentation.js'; + +test('Chinese HUD and cockpit units keep their case without spacing coordinates', () => { + try { + setLocale('zh-CN'); + assert.equal(hudQuantity(0, 'km'), '0 km'); + assert.equal(hudQuantity(2069, 'km', 1), '2069.0 km'); + assert.equal(formatCockpitDistance(14000), '14\u00a0km'); + assert.equal(LOCALIZED_LOCALITY.sector({ latDeg: 21.33, lonDeg: -77.5 }), + '扇区 21.33N 77.50W'); + setLocale('en'); + assert.equal(hudQuantity(0, 'km'), '0KM'); + assert.equal(hudQuantity(2069, 'km', 1), '2069.0KM'); + assert.equal(formatCockpitDistance(14000), '14\u00a0KM'); + } finally { + setLocale('en'); + } +}); + +test('FIRMS stale cache age uses localized durations while English stays compact', () => { + const now = Date.now(); + const layerState = { _stale: true }; + const components = { + model: createModel({ services: { anchors: {} } }), + }; + const { methods } = createQueries({ layerState, components, config: {} }); + try { + for (const [hours, zh, en] of [[0.5, '不到 1 小时', '<1h'], [2, '2 小时', '2h'], [72, '3 天', '3d']]) { + layerState._lastUpdate = now - hours * 3600000; + setLocale('zh-CN'); + const expected = t('STALE · cached {age}', { age: zh }); + assert.equal(methods.getStats().loadingLabel, expected); + assert.equal(methods.getStats().error, expected); + setLocale('en'); + assert.equal(methods.getStats().loadingLabel, `STALE · cached ${en}`); + } + } finally { + setLocale('en'); + } +}); + +test('Recent Imagery spaces numeric Chinese ages and retains natural relative dates', () => { + try { + setLocale('zh-CN'); + assert.equal(READOUT_WORDS.daysAgo(9), '9 天前'); + assert.equal(READOUT_WORDS.daysAgo(0), '今天'); + assert.equal(READOUT_WORDS.daysAgo(1), '昨天'); + setLocale('en'); + assert.equal(READOUT_WORDS.daysAgo(9), '9 days ago'); + assert.equal(READOUT_WORDS.daysAgo(0), 'today'); + } finally { + setLocale('en'); + } +}); + +test('CCTV translates the healthy status and preserves unknown provider codes', () => { + try { + for (const [locale, expected] of [['zh-CN', '正常'], ['ru', 'НОРМА'], ['es', 'OK'], ['en', 'OK']]) { + setLocale(locale); + assert.equal(cctvSourceStatusLabel('ok'), expected); + assert.equal(cctvSourceStatusLabel('CUSTOM'), 'CUSTOM'); + } + } finally { + setLocale('en'); + } +}); + +test('radio option text and accessible name use the same localized parentheses', () => { + const originalDocument = globalThis.document; + const element = () => ({ + style: {}, dataset: {}, attributes: {}, + classList: { contains: () => true, toggle() {} }, + setAttribute(name, value) { this.attributes[name] = value; }, + replaceChildren(...children) { this.children = children; }, + }); + globalThis.document = { createElement: element, getElementById: () => null }; + try { + for (const [locale, label, expected] of [['zh-CN', '全部', '全部(750)'], ['en', 'All', 'All (750)']]) { + setLocale(locale); + const host = { + _radioPanel: element(), _radioFilter: element(), + _syncContextRadioLauncherState() {}, + actions: { getLifecycle: () => null, scheduleLayout() {} }, + }; + renderRadioState.call(host, { + enabled: true, categories: [{ id: 'all', label, count: 750, color: '' }], + filter: 'all', filteredCount: 750, stationCount: 750, volume: 1, + }); + const option = host._radioFilter.children[0]; + assert.equal(option.textContent, `● ${expected}`); + assert.equal(option.attributes['aria-label'], expected); + } + } finally { + globalThis.document = originalDocument; + setLocale('en'); + } +}); diff --git a/src/layers/firms/model.js b/src/layers/firms/model.js index 3a1df327b..226c32286 100644 --- a/src/layers/firms/model.js +++ b/src/layers/firms/model.js @@ -591,6 +591,7 @@ export function createModel({ formatLatLon, formatFrp, formatAge, + formatAgeLabel, formatAgoMinutes, confidenceBucket, }; diff --git a/src/layers/firms/queries.js b/src/layers/firms/queries.js index a7d22589e..c4a793f9d 100644 --- a/src/layers/firms/queries.js +++ b/src/layers/firms/queries.js @@ -64,7 +64,8 @@ export function createQueries({ const staleText = layerState._lastUpdate ? t('STALE · cached {age}', { age: - components.model.formatAge(now - layerState._lastUpdate) || '<1h', + components.model.formatAgeLabel(now - layerState._lastUpdate) || + t('<1h', { context: 'age' }), }) : t('STALE'); let loadingLabel = ''; diff --git a/src/layers/recentImagery/display.js b/src/layers/recentImagery/display.js index 5b2b5ce39..5c18d8b3f 100644 --- a/src/layers/recentImagery/display.js +++ b/src/layers/recentImagery/display.js @@ -3,7 +3,12 @@ * day's readout. The model (`model.js`) stays English and i18n-free because AI * tool services import it outside the browser; this module is page-only. */ -import { formatDate, formatRelativeTime, t } from '../../i18n/index.js'; +import { + formatDate, + formatRelativeTime, + getLocale, + t, +} from '../../i18n/index.js'; import { formatQuantity } from '../../ui/unitLabels.js'; import { dayTime } from './model.js'; @@ -26,7 +31,10 @@ export const displayMetres = (value) => formatQuantity(value, 'm'); /** The readout's words in the page's language; the model keeps them English. */ export const READOUT_WORDS = Object.freeze({ date: (day) => displayDay(day, LONG_DAY), - daysAgo: (delta) => formatRelativeTime(delta > 0 ? -delta : 0, 'day'), + daysAgo: (delta) => { + const text = formatRelativeTime(delta > 0 ? -delta : 0, 'day'); + return getLocale() === 'zh-CN' ? text.replace(/(\d)(?=天)/g, '$1 ') : text; + }, // "Sentinel-2" never breaks at its hyphen: a word joiner follows it // (JetBrains Mono has no U+2011 non-breaking hyphen). sensor: (sensor) => diff --git a/src/ui/cctvFrames.js b/src/ui/cctvFrames.js index 7976d46c8..22f4f0dce 100644 --- a/src/ui/cctvFrames.js +++ b/src/ui/cctvFrames.js @@ -19,6 +19,7 @@ const SOURCE_KIND_LABELS = Object.freeze({ }); const SOURCE_STATUS_LABELS = Object.freeze({ + ok: msg('OK'), degraded: msg('DEGRADED'), error: msg('ERROR'), unknown: msg('UNKNOWN'), @@ -51,7 +52,7 @@ export function cctvSourceKindLabel(kind) { : key.toUpperCase(); } -/** "DEGRADED" / "ПЕРЕБОИ"; OK and unknown codes stay as uppercase codes. */ +/** "DEGRADED" / "ПЕРЕБОИ"; unknown codes stay as uppercase codes. */ export function cctvSourceStatusLabel(status) { const key = String(status || 'unknown').toLowerCase(); return SOURCE_STATUS_LABELS[key] diff --git a/src/ui/cockpitContext.js b/src/ui/cockpitContext.js index 57db349ee..852cc32a8 100644 --- a/src/ui/cockpitContext.js +++ b/src/ui/cockpitContext.js @@ -1,6 +1,6 @@ /** Contact readouts and nearby-signal presentation for the Cockpit controller. */ import * as Cesium from 'cesium'; -import { formatNumber, t, tn } from '../i18n/index.js'; +import { formatNumber, getLocale, t, tn } from '../i18n/index.js'; import { unitLabel } from './unitLabels.js'; import { bearingBetweenCoordinates, @@ -15,7 +15,7 @@ const LOCALIZED_CONTEXT_SCOPE = Object.freeze({ window: ({ label, radiusKm }) => t('{label} · {radius} AIR/SEA WINDOW', { label, - radius: `${radiusKm === null ? '—' : formatNumber(radiusKm)}\u00a0${unitLabel('km').toUpperCase()}`, + radius: `${radiusKm === null ? '—' : formatNumber(radiusKm)}\u00a0${getLocale() === 'zh-CN' ? unitLabel('km') : unitLabel('km').toUpperCase()}`, }), installations: ({ scope, coverage }) => t('{scope} · INSTALLATIONS {coverage}', { scope, coverage }), diff --git a/src/ui/cockpitPresentation.js b/src/ui/cockpitPresentation.js index f8930d4e0..8285b74b3 100644 --- a/src/ui/cockpitPresentation.js +++ b/src/ui/cockpitPresentation.js @@ -1,5 +1,5 @@ /** Pure formatting and fixed presentation constants used by Cockpit components. */ -import { formatNumber, t, msg } from '../i18n/index.js'; +import { formatNumber, getLocale, t, msg } from '../i18n/index.js'; import { formatQuantity } from './unitLabels.js'; export const COCKPIT_HEADING_SLEW_DPS = 28; @@ -145,10 +145,11 @@ export function formatCockpitCoordinate(value, positive, negative) { */ export function formatCockpitDistance(distanceM) { const digits = distanceM < 10000 ? 1 : 0; - return formatQuantity(distanceM / 1000, 'km', { + const distance = formatQuantity(distanceM / 1000, 'km', { minimumFractionDigits: digits, maximumFractionDigits: digits, - }).toUpperCase(); + }); + return getLocale() === 'zh-CN' ? distance : distance.toUpperCase(); } export function formatCockpitWindDirection(value) { diff --git a/src/ui/radioPresentation.js b/src/ui/radioPresentation.js index 94431fdec..54ee379e8 100644 --- a/src/ui/radioPresentation.js +++ b/src/ui/radioPresentation.js @@ -114,13 +114,14 @@ export function renderRadioState(state) { ...state.categories.map((category) => { const option = document.createElement('option'); option.value = category.id; - option.textContent = `● ${category.label} (${category.count})`; + const label = t('{category} ({count})', { + category: category.label, + count: category.count, + }); + option.textContent = `● ${label}`; option.dataset.radioColor = category.color; option.style.color = category.color; - option.setAttribute( - 'aria-label', - `${category.label} (${category.count})`, - ); + option.setAttribute('aria-label', label); return option; }), ); diff --git a/src/ui/styles/cjk.css b/src/ui/styles/cjk.css index c44431520..9ecfa0ce3 100644 --- a/src/ui/styles/cjk.css +++ b/src/ui/styles/cjk.css @@ -27,3 +27,28 @@ html:lang(zh) .panel-layer-toggle { html:lang(zh) .pp-mode-btn { white-space: nowrap; } + +/* Keep unit symbols in their catalog case, including the cockpit readouts. */ +html:lang(zh) #intel-hud *, +html:lang(zh) #cockpit-hud * { + text-transform: none; +} + +/* Move short travel modes (步行 / 骑行) to the next line as whole words. */ +html:lang(zh) [data-layer-id='directions'] .data-toggle-meta { + word-break: keep-all; + overflow-wrap: break-word; +} + +/* Leave room for the complete sensor name and resolution on two lines. */ +html:lang(zh) .recent-imagery-readout .ri-strip { + height: 131px; +} +html:lang(zh) .recent-imagery-readout .ri-card { + height: 123px; + grid-template-rows: 42px 13px 22px 11px 18px; +} +html:lang(zh) .recent-imagery-readout .ri-card-sensor { + white-space: normal; + text-overflow: clip; +} From 538f2f1bc01ce95c1577faa8d952b73c648b40c9 Mon Sep 17 00:00:00 2001 From: Mazeyar Moeini Feizabadi Date: Wed, 21 Oct 2026 15:22:00 +0200 Subject: [PATCH 25/45] refactor(ui): share Scene and CCTV action buttons --- docs/CODE-BOUNDARIES.md | 9 + docs/CURRENT-STATE.md | 20 ++ scripts/format-scope.json | 2 + scripts/package-boundaries.json | 4 + scripts/qa-action-buttons.mjs | 335 +++++++++++++++++++++++++++++ scripts/qa-scene-controls.mjs | 3 +- src/keyboardFocusStyles.test.mjs | 2 +- src/ui/actionButton.js | 41 ++++ src/ui/scenePresentation.js | 18 +- src/ui/sceneSharing.js | 6 +- src/ui/styles/action-button.css | 59 +++++ src/ui/styles/cyber.css | 1 + src/ui/styles/scenes.css | 58 ----- src/ui/templates/layer-panels.html | 32 +-- style.css | 1 + 15 files changed, 505 insertions(+), 86 deletions(-) create mode 100644 scripts/qa-action-buttons.mjs create mode 100644 src/ui/actionButton.js create mode 100644 src/ui/styles/action-button.css diff --git a/docs/CODE-BOUNDARIES.md b/docs/CODE-BOUNDARIES.md index eb393a2da..6c2b6ee2a 100644 --- a/docs/CODE-BOUNDARIES.md +++ b/docs/CODE-BOUNDARIES.md @@ -374,6 +374,15 @@ renderer, persistence or services. The facade retains panel visibility, share restore claims and render scheduling. Both controls are destroyed before the facade's asynchronous teardown can yield. +## Ordinary action buttons + +`src/ui/actionButton.js` is a native, listener-free view helper used by Scene +presentation and sharing-toolbar owners. It receives translated text and explicit +presentation/accessibility properties. Feature controllers own action dispatch, +state, persistence and cleanup. Static Scenes/CCTV templates use the same CSS +surface and preserve IDs and layout hooks. The helper imports no application, +renderer, storage or services; it belongs to the consuming package closures. + ## Display controls `ui/display` owns Display button, selector and slider subscriptions. It receives diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index b3930264c..a7c00f287 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1233,6 +1233,26 @@ Feature owners retain bounds, steps, formatted values, input/change timing and listener cleanup. The radio tuning dial, imagery comparison divider and event comparison/progression controls keep their specialized presentation and behavior. +## Ordinary action buttons + +Scene panel actions, shot LOAD/DEL actions, the EDIT DETAILS / SHARE SCENE +bar and one-shot CCTV actions use `ui/actionButton.js` and the shared +`gev-action-button` surface in `ui/styles/action-button.css`. Static templates +apply the same classes as generated buttons. The native builder accepts translated +text, default/danger variants, default/compact sizes and disabled/accessibility +properties; it installs no listeners and owns no application state. Feature +controllers retain callbacks, enable/disable rules, confirmation prompts, +persistence and teardown. The smaller shot actions retain their existing sizing +and hover treatment. Feature CSS still owns panel layout and translated wrapping. + +CCTV enable, coverage, auto-hop, projection and adjustment toggles, editable +calibration-value chips and the scene authoring dialogs retain their specialized +controls. Existing `scene-btn` hooks remain compatible with Street Level and +legacy toggles. The shared CSS, explicit input/action boundary and behavior tests +can carry to a Vue view while Vue replaces native DOM construction. +Browser acceptance: `QA_BASE_URL=http://127.0.0.1:4179 node scripts/qa-action-buttons.mjs`; +`qa-scene-controls.mjs` also covers real Scene authoring/playback with native Space capture. + ## Segmented selectors Segmented selectors use the controlled DOM adapter in `ui/segmentedControl.js` diff --git a/scripts/format-scope.json b/scripts/format-scope.json index a941b1d8f..0832ceeeb 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -281,6 +281,7 @@ "src/ui/scenePresentation.js", "src/ui/sceneControls.test.mjs", "scripts/qa-scene-controls.mjs", + "scripts/qa-action-buttons.mjs", "src/ui.js", "src/standalone/ui.js", "src/ui/applicationShell.js", @@ -305,6 +306,7 @@ "src/ui/styles/layers.css", "src/ui/styles/controls.css", "src/ui/styles/slider.css", + "src/ui/styles/action-button.css", "src/ui/styles/cctv.css", "src/ui/styles/foundation.css", "src/ui/styles/first-run.css", diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 3a9950f39..c15a35eae 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -614,6 +614,7 @@ "src/ui/scenes.js", "src/ui/sceneControls.js", "src/ui/scenePresentation.js", + "src/ui/actionButton.js", "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", @@ -737,6 +738,7 @@ "src/ui/rightPanelRail.js", "src/ui/sceneControls.js", "src/ui/scenePresentation.js", + "src/ui/actionButton.js", "src/ui/scenes.js", "src/ui/shareRestoration.js", "src/ui/shellElements.js", @@ -849,6 +851,7 @@ "src/ui/scenes.js", "src/ui/sceneControls.js", "src/ui/scenePresentation.js", + "src/ui/actionButton.js", "src/contextModePolicy.js", "src/director/clock.js", "src/director/timeline.js", @@ -2214,6 +2217,7 @@ "src/ui/rightPanelRail.js", "src/ui/sceneControls.js", "src/ui/scenePresentation.js", + "src/ui/actionButton.js", "src/ui/scenes.js", "src/ui/shareRestoration.js", "src/ui/shellElements.js", diff --git a/scripts/qa-action-buttons.mjs b/scripts/qa-action-buttons.mjs new file mode 100644 index 000000000..ef11e8ff2 --- /dev/null +++ b/scripts/qa-action-buttons.mjs @@ -0,0 +1,335 @@ +#!/usr/bin/env node +/** + * Scenes/CCTV action-button acceptance against dev or production preview: + * QA_BASE_URL=http://127.0.0.1:4179 node scripts/qa-action-buttons.mjs + * Uses the installed CCTV controller with fixture camera/action ports to prove + * native dispatch/disabled/teardown without providers or world calibration writes. + * Real Scene authoring/playback remains covered by qa-scene-controls.mjs. + */ +import fs from 'node:fs'; +import puppeteer from 'puppeteer'; + +const browser = await puppeteer.launch({ + headless: true, + args: ['--use-gl=angle', '--use-angle=swiftshader'], +}); +const page = await browser.newPage(); +const errors = []; +page.on('pageerror', (error) => errors.push(error.message)); +let failures = 0; +const check = (name, passed, detail) => { + console.log(`[${passed ? 'PASS' : 'FAIL'}] ${name}`); + if (!passed) { + failures++; + console.log(JSON.stringify(detail)); + } +}; +const shots = 'qa-shots/action-buttons'; +fs.mkdirSync(shots, { recursive: true }); + +try { + await page.setViewport({ width: 1440, height: 900 }); + await page.goto( + `${process.env.QA_BASE_URL || 'http://127.0.0.1:4179'}/?welcome=0`, + { waitUntil: 'domcontentloaded' }, + ); + await page.waitForFunction( + () => + window.__godsEyeView?.styleManager?._cctvControls && + document.getElementById('loading-screen')?.classList.contains('hidden'), + { timeout: 60000 }, + ); + const inventory = await page.evaluate(() => { + const ids = [ + 'scene-new-btn', + 'scene-delete-btn', + 'scene-capture-btn', + 'scene-update-shot-btn', + 'scene-start-btn', + 'scene-stop-btn', + 'scene-next-btn', + 'scene-export-btn', + 'scene-import-btn', + 'scene-download-btn', + 'cctv-nearest-btn', + 'cctv-prev-btn', + 'cctv-next-btn', + 'cctv-focus-btn', + 'cctv-calib-save-btn', + 'cctv-calib-reset-btn', + ]; + const ordinary = ids.map((id) => document.getElementById(id)); + const generated = [ + ...document.querySelectorAll( + '.scene-shot-btn, [data-director-authoring] button', + ), + ]; + const toggles = [ + 'cctv-enable-btn', + 'cctv-coverage-btn', + 'cctv-auto-hop-btn', + 'cctv-projection-btn', + 'cctv-adjust-btn', + ].map((id) => document.getElementById(id)); + return { + shared: [...ordinary, ...generated].every( + (node) => + node?.type === 'button' && + node.classList.contains('gev-action-button'), + ), + generated: generated.length, + layout: ordinary.every((node) => { + const style = getComputedStyle(node); + return style.minWidth === '72px' && style.flexGrow === '1'; + }), + togglesSeparate: toggles.every( + (node) => node && !node.classList.contains('gev-action-button'), + ), + compactDanger: !!document.querySelector( + '.scene-shot-danger.gev-action-button--compact.gev-action-button--danger', + ), + }; + }); + check( + 'static and generated actions share the native component', + inventory.shared && inventory.generated >= 4 && inventory.compactDanger, + inventory, + ); + check( + 'persistent CCTV toggles retain their existing controls', + inventory.togglesSeparate, + ); + check('ordinary actions retain their panel sizing', inventory.layout); + + await page.evaluate(() => { + const manager = window.__godsEyeView.styleManager; + const owner = manager._cctvControls; + owner._cctvUnsubscribe?.(); + owner._cctvUnsubscribe = null; + window.__qaButtonCalls = []; + const record = (...args) => window.__qaButtonCalls.push(args); + owner.actions = { + ...owner.actions, + isEnabled: () => true, + toggleEnabled: async () => { + record('enable'); + return true; + }, + runExplicitFocus: (select, focus) => focus(select()), + setParams: (params, options) => record('params', params, options), + showToast: () => {}, + }; + owner.cctv = { + focusNearest: () => { + record('nearest'); + return 'a'; + }, + cycleCamera: (direction) => { + record('cycle', direction); + return 'b'; + }, + focusCamera: (id, seconds) => record('focus', id, seconds), + }; + window.__qaCameraState = { + enabled: true, + activeCameraId: 'a', + cameras: [ + { id: 'a', city: 'Fixture', name: 'A' }, + { id: 'b', city: 'Fixture', name: 'B' }, + ], + activeCamera: { id: 'a', name: 'A', basePose: {} }, + }; + owner._renderCctvState(window.__qaCameraState); + manager.setPanelCollapsed('cctv-panel', false, { + persist: false, + syncShare: false, + }); + }); + await page.focus('#cctv-next-btn'); + await page.keyboard.press('Space'); + await page.waitForFunction(() => window.__qaButtonCalls.length === 3); + check( + 'native Space dispatches Next and its focus once', + await page.evaluate( + () => + JSON.stringify(window.__qaButtonCalls) === + JSON.stringify([['enable'], ['cycle', 1], ['focus', 'b', 1.4]]), + ), + ); + check( + 'native keyboard activation keeps a visible focus ring', + await page.$eval( + '#cctv-next-btn', + (node) => + document.activeElement === node && + getComputedStyle(node).outlineStyle === 'solid', + ), + ); + await page.evaluate(() => { + window.__qaButtonCalls = []; + }); + await page.focus('#cctv-prev-btn'); + await page.keyboard.press('Enter'); + await page.waitForFunction(() => window.__qaButtonCalls.length === 3); + check( + 'native Enter dispatches Previous once', + await page.evaluate( + () => + JSON.stringify(window.__qaButtonCalls) === + JSON.stringify([['enable'], ['cycle', -1], ['focus', 'b', 1.4]]), + ), + ); + + for (const [id, expected] of [ + ['cctv-nearest-btn', [['enable'], ['nearest'], ['focus', 'a', 1.8]]], + [ + 'cctv-focus-btn', + [ + ['enable'], + ['focus', 'a', 1.9], + ['params', { selectedCameraId: 'a' }, { origin: 'user' }], + ], + ], + ]) { + await page.evaluate(() => { + window.__qaButtonCalls = []; + }); + await page.click(`#${id}`); + await page.waitForFunction(() => window.__qaButtonCalls.length === 3); + const calls = await page.evaluate(() => window.__qaButtonCalls); + check( + `${id} retains its existing action and focus timing`, + JSON.stringify(calls) === JSON.stringify(expected), + calls, + ); + } + + await page.evaluate(() => { + window.__qaButtonCalls = []; + }); + await page.click('#cctv-calib-save-btn'); + await page.click('#cctv-calib-reset-btn'); + const calibration = await page.evaluate(() => window.__qaButtonCalls); + check( + 'Save and Reset retain camera identity and user-origin dispatch', + JSON.stringify(calibration) === + JSON.stringify([ + [ + 'params', + { selectedCameraId: 'a', calibration: { cameraId: 'a', save: true } }, + { origin: 'user' }, + ], + [ + 'params', + { + selectedCameraId: 'a', + calibration: { cameraId: 'a', reset: true }, + }, + { origin: 'user' }, + ], + ]), + calibration, + ); + await page.evaluate(() => { + window.__qaButtonCalls = []; + window.__godsEyeView.styleManager._cctvControls._renderCctvState({ + enabled: false, + }); + }); + await page.click('#cctv-next-btn'); + await page.waitForFunction( + () => { + const node = document.getElementById('cctv-next-btn'); + return node.disabled && Number(getComputedStyle(node).opacity) === 0.45; + }, + { timeout: 3000 }, + ); + check( + 'disabled actions stay inert and keep disabled presentation', + await page.$eval( + '#cctv-next-btn', + (node) => + node.disabled && + getComputedStyle(node).opacity === '0.45' && + window.__qaButtonCalls.length === 0, + ), + ); + + for (const width of [1440, 620, 390]) { + await page.setViewport({ width, height: 900 }); + for (const panel of ['scene-panel', 'cctv-panel']) { + await page.evaluate((panel) => { + window.__godsEyeView.styleManager.setPanelCollapsed(panel, false, { + persist: false, + syncShare: false, + }); + }, panel); + const fit = await page.$eval(`#${panel}`, (root) => { + const buttons = [...root.querySelectorAll('.gev-action-button')]; + const rect = root.getBoundingClientRect(); + return { + count: buttons.length, + fits: + buttons.length > 0 && + buttons.every((button) => { + const box = button.getBoundingClientRect(); + return ( + box.width > 0 && + box.left >= rect.left && + box.right <= rect.right + 1 && + box.left >= 0 && + box.right <= innerWidth + 1 && + button.scrollWidth <= button.clientWidth + ); + }), + }; + }); + check(`${panel} actions fit at ${width}px`, fit.fits, fit); + if (width !== 620) + await page.screenshot({ path: `${shots}/${panel}-${width}.png` }); + } + } + await page.evaluate(() => { + const owner = window.__godsEyeView.styleManager._cctvControls; + owner.destroy(); + document.getElementById('cctv-next-btn').disabled = false; + window.__qaButtonCalls = []; + }); + await page.click('#cctv-next-btn'); + check( + 'destroyed controllers revoke action listeners', + await page.evaluate(() => window.__qaButtonCalls.length === 0), + ); + const localized = new URL(page.url()); + localized.searchParams.set('lang', 'ru'); + await page.goto(localized.href, { waitUntil: 'domcontentloaded' }); + await page.waitForFunction( + () => + window.__godsEyeView?.styleManager?._cctvControls && + document.getElementById('loading-screen')?.classList.contains('hidden'), + { timeout: 60000 }, + ); + for (const panel of ['scene-panel', 'cctv-panel']) { + await page.evaluate((panel) => { + window.__godsEyeView.styleManager.setPanelCollapsed(panel, false, { + persist: false, + syncShare: false, + }); + }, panel); + const translated = await page.$eval(`#${panel}`, (root) => { + const buttons = [...root.querySelectorAll('.gev-action-button')]; + return ( + document.documentElement.lang === 'ru' && + buttons.length > 0 && + buttons.every((node) => node.scrollWidth <= node.clientWidth) + ); + }); + check(`Russian ${panel} action labels fit at 390px`, translated); + await page.screenshot({ path: `${shots}/${panel}-ru-390.png` }); + } + check('no uncaught browser errors', errors.length === 0, errors); +} finally { + await browser.close(); +} +console.log(`RESULT: ${failures} failures`); +process.exitCode = failures ? 1 : 0; diff --git a/scripts/qa-scene-controls.mjs b/scripts/qa-scene-controls.mjs index 9dae69cdc..c7068f26c 100644 --- a/scripts/qa-scene-controls.mjs +++ b/scripts/qa-scene-controls.mjs @@ -66,7 +66,8 @@ try { ); }), ); - await page.click('#scene-capture-btn'); + await page.focus('#scene-capture-btn'); + await page.keyboard.press('Space'); await page.waitForFunction( () => document.querySelectorAll('.scene-shot-row').length === 1, ); diff --git a/src/keyboardFocusStyles.test.mjs b/src/keyboardFocusStyles.test.mjs index 5244cffdc..fc59481aa 100644 --- a/src/keyboardFocusStyles.test.mjs +++ b/src/keyboardFocusStyles.test.mjs @@ -69,7 +69,7 @@ test('focusable controls do not animate the global outline', () => { '#top-center-actions button {', '.data-toggle-chip {', '.scene-btn {', - '.scene-shot-btn {', + '.gev-action-button--compact {', ]) { assert.doesNotMatch( ruleBody(selector), diff --git a/src/ui/actionButton.js b/src/ui/actionButton.js new file mode 100644 index 000000000..f1b4b85f9 --- /dev/null +++ b/src/ui/actionButton.js @@ -0,0 +1,41 @@ +/** + * Create an ordinary native action button. Static templates use the same CSS + * classes. Labels are already translated; feature owners retain callbacks, + * disabled-state updates and listener cleanup. Construction binds no listeners. + * @param {object} options + * @param {Document} [options.documentRef] Document that owns the button. + * @param {string} options.label Visible text, never interpreted as markup. + * @param {string} [options.className] Additional feature/layout hooks. + * @param {'default'|'danger'} [options.variant] + * @param {'default'|'compact'} [options.size] + * @param {boolean} [options.disabled] + * @param {string} [options.ariaLabel] Accessible name when visible text needs context. + * @param {string} [options.title] + * @returns {HTMLButtonElement} + */ +export function createActionButton({ + documentRef = globalThis.document, + label, + className = '', + variant = 'default', + size = 'default', + disabled = false, + ariaLabel, + title, +}) { + const button = documentRef.createElement('button'); + button.type = 'button'; + button.className = [ + 'gev-action-button', + variant === 'danger' && 'gev-action-button--danger', + size === 'compact' && 'gev-action-button--compact', + className, + ] + .filter(Boolean) + .join(' '); + button.textContent = label; + button.disabled = disabled; + if (ariaLabel !== undefined) button.setAttribute('aria-label', ariaLabel); + if (title !== undefined) button.title = title; + return button; +} diff --git a/src/ui/scenePresentation.js b/src/ui/scenePresentation.js index 258ee5059..52e99796e 100644 --- a/src/ui/scenePresentation.js +++ b/src/ui/scenePresentation.js @@ -1,5 +1,6 @@ /** Scene panel elements and text-only project presentation. */ import { formatNumber, msg, t } from '../i18n/index.js'; +import { createActionButton } from './actionButton.js'; // Labels for what a shot stores; anything else shows as stored. Style names // match STYLE_STATUS_LABELS in visualPresets.js, which this package cannot @@ -121,13 +122,18 @@ export function renderSceneShots( }); const actions = document.createElement('div'); actions.className = 'scene-shot-actions'; - const loadButton = document.createElement('button'); - loadButton.className = 'scene-shot-btn'; - loadButton.textContent = t('LOAD'); + const loadButton = createActionButton({ + label: t('LOAD'), + className: 'scene-shot-btn', + size: 'compact', + }); listen(loadButton, 'click', () => load(scene.id, shot.id)); - const deleteButton = document.createElement('button'); - deleteButton.className = 'scene-shot-btn scene-shot-danger'; - deleteButton.textContent = t('DEL'); + const deleteButton = createActionButton({ + label: t('DEL'), + className: 'scene-shot-btn scene-shot-danger', + size: 'compact', + variant: 'danger', + }); listen(deleteButton, 'click', () => remove(scene.id, shot.id)); actions.appendChild(loadButton); actions.appendChild(deleteButton); diff --git a/src/ui/sceneSharing.js b/src/ui/sceneSharing.js index 245561b8d..8c9843eba 100644 --- a/src/ui/sceneSharing.js +++ b/src/ui/sceneSharing.js @@ -1,4 +1,5 @@ import { t, tn } from '../i18n/index.js'; +import { createActionButton } from './actionButton.js'; /** Small owned modal for scene authoring and import review; text never becomes markup. */ export function createSceneDialog(title, onClose) { @@ -185,10 +186,7 @@ export function mountSceneSharing( ]; const removers = []; for (const [text, fn] of entries) { - const b = document.createElement('button'); - b.type = 'button'; - b.textContent = text; - b.className = 'scene-btn'; + const b = createActionButton({ label: text, className: 'scene-btn' }); b.addEventListener('click', fn); removers.push(() => b.removeEventListener('click', fn)); bar.append(b); diff --git a/src/ui/styles/action-button.css b/src/ui/styles/action-button.css new file mode 100644 index 000000000..4da40cdb1 --- /dev/null +++ b/src/ui/styles/action-button.css @@ -0,0 +1,59 @@ +/* Ordinary actions share one surface; feature classes own placement and width. + * Legacy scene-btn hooks keep untouched toggles/Street Level controls stable. */ +.gev-action-button, +.scene-btn { + background: rgba(255, 255, 255, 0.05); + border: 1px solid rgba(255, 255, 255, 0.14); + border-radius: 7px; + color: var(--text-secondary); + font-family: var(--font-mono); + font-size: 9px; + letter-spacing: 1.2px; + padding: 6px 9px; + cursor: pointer; + transition: + background-color var(--transition-fast), + border-color var(--transition-fast), + color var(--transition-fast), + opacity var(--transition-fast); + white-space: nowrap; +} + +.gev-action-button:hover:not(:disabled), +.scene-btn:hover:not(:disabled) { + color: var(--accent); + border-color: var(--accent); + background: rgba(0, 212, 255, 0.14); +} + +.gev-action-button:disabled, +.scene-btn:disabled { + opacity: 0.45; + cursor: default; +} + +.gev-action-button--danger:hover:not(:disabled), +.scene-btn-danger:hover:not(:disabled) { + color: #ff7272; + border-color: #ff7272; + background: rgba(255, 88, 88, 0.15); +} + +/* Shot-row actions retain their smaller footprint and quieter hover treatment. */ +.gev-action-button--compact { + border-radius: 6px; + font-size: 8px; + letter-spacing: 0.8px; + padding: 4px 6px; +} + +.gev-action-button--compact:hover:not(:disabled) { + color: var(--text-primary); + border-color: var(--glass-border-hover); + background: rgba(255, 255, 255, 0.05); +} + +.gev-action-button--compact.gev-action-button--danger:hover:not(:disabled) { + color: #ff7e7e; + border-color: #ff7e7e; +} diff --git a/src/ui/styles/cyber.css b/src/ui/styles/cyber.css index fc93abcb6..cad6e69af 100644 --- a/src/ui/styles/cyber.css +++ b/src/ui/styles/cyber.css @@ -171,6 +171,7 @@ .dock-tray-toggle, .dock-popover, .scene-btn, + .gev-action-button:not(.gev-action-button--compact), .context-mode-button, .map-stack-chip, .key-setup-chip, diff --git a/src/ui/styles/scenes.css b/src/ui/styles/scenes.css index 287b8b842..8c8d663cd 100644 --- a/src/ui/styles/scenes.css +++ b/src/ui/styles/scenes.css @@ -184,21 +184,6 @@ html:not([lang='en']) #scene-panel .scene-controls .scene-btn { } .scene-btn { - background: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(255, 255, 255, 0.14); - border-radius: 7px; - color: var(--text-secondary); - font-family: var(--font-mono); - font-size: 9px; - letter-spacing: 1.2px; - padding: 6px 9px; - cursor: pointer; - transition: - background-color var(--transition-fast), - border-color var(--transition-fast), - color var(--transition-fast), - opacity var(--transition-fast); - white-space: nowrap; flex: 1; min-width: 72px; } @@ -295,49 +280,6 @@ html:not([lang='en']) #scene-panel .scene-controls .scene-btn { gap: 6px; } -.scene-shot-btn { - border: 1px solid rgba(255, 255, 255, 0.14); - border-radius: 6px; - background: rgba(255, 255, 255, 0.05); - color: var(--text-secondary); - font-family: var(--font-mono); - font-size: 8px; - letter-spacing: 0.8px; - padding: 4px 6px; - cursor: pointer; - transition: - background-color var(--transition-fast), - border-color var(--transition-fast), - color var(--transition-fast); -} - -.scene-shot-btn:hover { - color: var(--text-primary); - border-color: var(--glass-border-hover); -} - -.scene-shot-btn.scene-shot-danger:hover { - color: #ff7e7e; - border-color: #ff7e7e; -} - -.scene-btn:hover:not(:disabled) { - color: var(--accent); - border-color: var(--accent); - background: rgba(0, 212, 255, 0.14); -} - -.scene-btn:disabled { - opacity: 0.45; - cursor: default; -} - -.scene-btn-danger:hover:not(:disabled) { - color: #ff7272; - border-color: #ff7272; - background: rgba(255, 88, 88, 0.15); -} - .scene-progress { margin-top: 8px; width: 100%; diff --git a/src/ui/templates/layer-panels.html b/src/ui/templates/layer-panels.html index 78ecfd777..283891a98 100644 --- a/src/ui/templates/layer-panels.html +++ b/src/ui/templates/layer-panels.html @@ -31,15 +31,15 @@
Enable CCTV to load camera intersections
- +
- + - +
- +
@@ -62,8 +62,8 @@
- - + +
SCENE SUMMARY
@@ -151,23 +151,23 @@
- - + +
- - + +
- - - + + +
- - - + + +
diff --git a/style.css b/style.css index 89d1371ae..13331b13d 100644 --- a/style.css +++ b/style.css @@ -1,5 +1,6 @@ /* Preserve component and responsive rule order in one stylesheet entry. */ @import './src/ui/styles/foundation.css'; +@import './src/ui/styles/action-button.css'; @import './src/ui/styles/slider.css'; @import './src/ui/styles/controls.css'; @import './src/ui/styles/location.css'; From 5a11bd9515824f035388e19597e7ecf60954f37e Mon Sep 17 00:00:00 2001 From: Mazeyar Moeini Feizabadi Date: Wed, 21 Oct 2026 15:22:21 +0200 Subject: [PATCH 26/45] docs: add shared action buttons changelog entry --- changelog.d/1302-shared-action-buttons.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog.d/1302-shared-action-buttons.md diff --git a/changelog.d/1302-shared-action-buttons.md b/changelog.d/1302-shared-action-buttons.md new file mode 100644 index 000000000..3c8318488 --- /dev/null +++ b/changelog.d/1302-shared-action-buttons.md @@ -0,0 +1,3 @@ +- Give ordinary Scene and CCTV actions shared native buttons with consistent + default, destructive and compact styling while preserving their existing + behavior and specialized controls (mazy1998, #1302). From 7932259dc4131bd346ff44d362c2bce1990cc96a Mon Sep 17 00:00:00 2001 From: Mazeyar Moeini Feizabadi Date: Wed, 21 Oct 2026 15:35:49 +0200 Subject: [PATCH 27/45] refactor(ui): share native dropdown and numeric field surfaces --- docs/CODE-BOUNDARIES.md | 10 + docs/CURRENT-STATE.md | 17 + scripts/format-scope.json | 2 + scripts/package-boundaries.json | 3 + scripts/qa-form-fields.mjs | 465 +++++++++++++++++++++++++ src/ui/cctvCalibration.js | 12 +- src/ui/cctvControls.test.mjs | 3 + src/ui/formField.js | 36 ++ src/ui/styles/cctv.css | 37 -- src/ui/styles/controls.css | 10 - src/ui/styles/form-field.css | 51 +++ src/ui/styles/scenes.css | 8 - src/ui/templates/context.html | 6 +- src/ui/templates/display-controls.html | 4 +- src/ui/templates/layer-panels.html | 4 +- style.css | 1 + 16 files changed, 602 insertions(+), 67 deletions(-) create mode 100644 scripts/qa-form-fields.mjs create mode 100644 src/ui/formField.js create mode 100644 src/ui/styles/form-field.css diff --git a/docs/CODE-BOUNDARIES.md b/docs/CODE-BOUNDARIES.md index eb393a2da..b1e8b6a0c 100644 --- a/docs/CODE-BOUNDARIES.md +++ b/docs/CODE-BOUNDARIES.md @@ -729,3 +729,13 @@ sources supply `{records, droppedCount, status, saturated}`; viewport filtering, exact-bound retry and rendering stay in the layer. Legacy cache saturation is decoded in the source. Source and geometry modules remain independent of Cesium, DOM and platform middleware. + +### Native form fields + +`src/ui/formField.js` constructs native numeric inputs without listeners or +application state. Static selects and number inputs use the same `gev-field` +surface, with explicit compact and inline densities. Feature owners retain +option identity/order, bounds, parsing, draft values, input/change timing and +teardown. CCTV effective-pose conversion and tuner/device operations remain +feature responsibilities. A Vue replacement can reuse this contract and CSS; +it replaces DOM construction, rather than adding a second state owner. diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index b3930264c..a67f6b740 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -5938,3 +5938,20 @@ datacenters, dams and the Nepal locator retain that shared credit while displaye Military fragments stitch by source identity. Different mapped parcels merge only when their footprints touch or contain one another, never across a seam tolerance gap. + +### Shared native dropdowns and numeric fields + +- Scene and CCTV selects share the default `gev-field` surface. HUD layout and + draw colour retain compact density. Radio filter, tuner gain and FM frequency + use the same base while retaining their feature-specific skins and layout. +- The CCTV inline number editor uses `createNumberInput` with its existing + precision and inline density. Enter/blur commit, Escape cancellation, frozen + camera base, camera-switch guards and disposal remain with CCTV controls. +- Options, values, native keyboard/typeahead, disabled attributes and browser + validity remain native. Frequency bounds, tuner commit timing and calibration + parsing are unchanged. Specialized tuner graphics and calibration chips + retain their own controls. Provider settings and scene-authoring dialogs are + outside this change. +- `scripts/qa-form-fields.mjs` exercises native selections, number validity, + calibration commit/cancel and stale-camera/disposal guards against an installed + controller with fixture ports, plus default/Cyber and narrow translated layouts. diff --git a/scripts/format-scope.json b/scripts/format-scope.json index a941b1d8f..9b8b5cf45 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -2,6 +2,8 @@ ".prettierrc.json", "package.json", "scripts/format-scope.json", + "src/ui/styles/form-field.css", + "scripts/qa-form-fields.mjs", "scripts/package-boundaries.json", "scripts/format.mjs", "scripts/next-layer-state-token.mjs", diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 3a9950f39..b4fe8f0df 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -539,6 +539,7 @@ "src/ui/cctv.js", "src/ui/cctvBindings.js", "src/ui/cctvCalibration.js", + "src/ui/formField.js", "src/ui/cctvControls.js", "src/ui/cctvFrames.js", "src/ui/cctvVideo.js", @@ -675,6 +676,7 @@ "src/ui/cctv.js", "src/ui/cctvBindings.js", "src/ui/cctvCalibration.js", + "src/ui/formField.js", "src/ui/cctvControls.js", "src/ui/cctvFrames.js", "src/ui/cctvVideo.js", @@ -2151,6 +2153,7 @@ "src/ui/cctv.js", "src/ui/cctvBindings.js", "src/ui/cctvCalibration.js", + "src/ui/formField.js", "src/ui/cctvControls.js", "src/ui/cctvFrames.js", "src/ui/cctvVideo.js", diff --git a/scripts/qa-form-fields.mjs b/scripts/qa-form-fields.mjs new file mode 100644 index 000000000..3bbee3816 --- /dev/null +++ b/scripts/qa-form-fields.mjs @@ -0,0 +1,465 @@ +#!/usr/bin/env node +/** Native form-field regression gate. CCTV ports are fixtures, never live writes. */ +import fs from 'node:fs'; +import puppeteer from 'puppeteer'; + +const browser = await puppeteer.launch({ + headless: true, + args: ['--use-gl=angle', '--use-angle=swiftshader'], +}); +const page = await browser.newPage(); +page.setDefaultNavigationTimeout(60000); +let failures = 0; +const errors = []; +page.on('pageerror', (error) => errors.push(error.message)); +const check = (name, passed, detail) => { + console.log(`[${passed ? 'PASS' : 'FAIL'}] ${name}`); + if (!passed) { + failures++; + console.log(JSON.stringify(detail)); + } +}; +fs.mkdirSync('qa-shots/form-fields', { recursive: true }); +try { + await page.setViewport({ width: 1440, height: 900 }); + await page.goto( + `${process.env.QA_BASE_URL || 'http://127.0.0.1:4183'}/?welcome=0`, + { + waitUntil: 'domcontentloaded', + }, + ); + await page.waitForFunction( + () => + window.__godsEyeView?.styleManager?._cctvControls && + document.getElementById('loading-screen')?.classList.contains('hidden'), + { timeout: 60000 }, + ); + const inventory = await page.evaluate(() => { + const selects = [ + 'scene-select', + 'cctv-camera-select', + 'hud-layout-select', + 'draw-color-select', + 'radio-filter', + 'sdr-gain-select', + ].map((id) => document.getElementById(id)); + return { + ids: selects.map((node) => node.id), + shared: + selects.length === 6 && + selects.every((node) => node.classList.contains('gev-field')), + native: selects.every( + (node) => + node instanceof HTMLSelectElement && !node.hasAttribute('role'), + ), + dark: selects.every( + (node) => getComputedStyle(node).colorScheme === 'dark', + ), + }; + }); + check( + 'all six panel dropdowns retain native select semantics and shared surface', + inventory.shared && inventory.native, + inventory, + ); + check('native option menus keep the dark scheme', inventory.dark); + await page.evaluate(() => { + const manager = window.__godsEyeView.styleManager; + manager.setPanelCollapsed('pp-toggles', false, { + persist: false, + syncShare: false, + }); + manager.setPanelCollapsed('scene-panel', false, { + persist: false, + syncShare: false, + }); + manager.setPanelCollapsed('cctv-panel', false, { + persist: false, + syncShare: false, + }); + window.__qaFormChanges = []; + document + .getElementById('scene-select') + .addEventListener('change', (event) => + window.__qaFormChanges.push(event.target.value), + ); + }); + const ownerSetup = await page.evaluate(() => { + const owner = window.__godsEyeView.styleManager._cctvControls; + owner._cctvUnsubscribe?.(); + owner._cctvUnsubscribe = null; + window.__qaFormCalls = []; + owner.actions = { + ...owner.actions, + isEnabled: () => true, + toggleEnabled: async () => true, + setParams: (...args) => window.__qaFormCalls.push(args), + runExplicitFocus: (select, focus) => focus(select()), + showToast: () => {}, + }; + owner.cctv = { + setParams() {}, + focusCamera: (id) => window.__qaFormCalls.push(['focus', id]), + selectCamera: (id) => id, + }; + owner._cctvState = { + enabled: true, + activeCameraId: 'a', + cameras: [ + { id: 'a', name: 'A' }, + { id: 'b', name: 'B' }, + ], + activeCamera: { + id: 'a', + headingDeg: 30, + pitchDeg: -10, + fovDeg: 45, + rangeM: 120, + mountHeightM: 8, + calibration: {}, + basePose: { + headingDeg: 20, + pitchDeg: -10, + fovDeg: 45, + rangeM: 120, + mountHeightM: 8, + }, + }, + }; + owner._renderCctvState(owner._cctvState); + const input = document.getElementById('sdr-frequency-input'); + return { + min: input.min, + max: input.max, + step: input.step, + type: input.type, + shared: input.classList.contains('gev-field'), + }; + }); + check( + 'FM frequency retains native bounds, precision and shared surface', + ownerSetup.min === '87.5' && + ownerSetup.max === '108' && + ownerSetup.step === '0.1' && + ownerSetup.type === 'number' && + ownerSetup.shared, + ownerSetup, + ); + const validity = await page.$eval('#sdr-frequency-input', (input) => { + const original = input.value; + input.value = '87.4'; + const below = input.validity.rangeUnderflow; + input.value = '108.1'; + const above = input.validity.rangeOverflow; + input.value = '98.55'; + const step = input.validity.stepMismatch; + input.value = ''; + const empty = input.validity.valid; + input.value = original; + return below && above && step && empty; + }); + check( + 'native numeric validity preserves underflow, overflow, steps and empty drafts', + validity, + ); + await page.select('#cctv-camera-select', 'b'); + await page.waitForFunction(() => window.__qaFormCalls.length === 2); + const cameraSelection = await page.evaluate(() => window.__qaFormCalls); + check( + 'camera dropdown retains selection, focus and user-origin dispatch', + cameraSelection[0][0] === 'focus' && + cameraSelection[0][1] === 'b' && + cameraSelection[1][0].selectedCameraId === 'b' && + cameraSelection[1][1].origin === 'user', + cameraSelection, + ); + await page.evaluate(() => { + window.__qaFormCalls = []; + document.getElementById('cctv-camera-select').disabled = true; + }); + await page.focus('#scene-select'); + await page.focus('#cctv-camera-select'); + check( + 'disabled native selects cannot receive keyboard focus', + await page.evaluate( + () => document.activeElement.id !== 'cctv-camera-select', + ), + ); + await page.evaluate(() => { + document.getElementById('cctv-camera-select').disabled = false; + }); + const begin = async (field) => { + await page.evaluate((field) => { + const owner = window.__godsEyeView.styleManager._cctvControls; + owner._beginCctvCalValueEdit( + document.querySelector(`[data-cal-field="${field}"]`), + ); + }, field); + }; + for (const [field, step, value] of [ + ['heading', '0.1', '30.0'], + ['pitch', '0.1', '-10.0'], + ['fov', '1', '45'], + ['range', '1', '120'], + ['height', '1', '8'], + ['north', '0.1', '0.0'], + ['east', '0.1', '0.0'], + ]) { + await begin(field); + const result = await page.$eval('.cctv-cal-input', (input) => ({ + step: input.step, + value: input.value, + native: input.type === 'number', + shared: input.classList.contains('gev-field'), + label: input.getAttribute('aria-label'), + focus: document.activeElement === input, + })); + check( + `${field} editor retains precision, initial value and focus`, + result.step === step && + result.value === value && + result.native && + result.shared && + !!result.label && + result.focus, + result, + ); + await page.keyboard.press('Escape'); + } + check( + 'Escape cancels each field without a calibration write', + await page.evaluate(() => window.__qaFormCalls.length === 0), + ); + await begin('heading'); + await page.keyboard.press('Backspace'); + await page.type('.cctv-cal-input', '100'); + await page.evaluate(() => { + window.__godsEyeView.styleManager._cctvControls._cctvState.activeCamera.basePose.headingDeg = 60; + }); + await page.keyboard.press('Enter'); + const commit = await page.evaluate(() => window.__qaFormCalls); + check( + 'Enter commits once against the frozen camera base', + commit.length === 1 && + commit[0][0].calibration.patch.headingDeg === 80 && + commit[0][0].calibration.cameraId === 'a' && + commit[0][1].origin === 'user', + commit, + ); + await begin('north'); + await page.keyboard.press('Backspace'); + await page.type('.cctv-cal-input', '12.5'); + await page.$eval('.cctv-cal-input', (input) => input.blur()); + const blur = await page.evaluate(() => window.__qaFormCalls); + check( + 'blur commits a decimal offset exactly once', + blur.length === 2 && blur[1][0].calibration.patch.offsetNorthM === 12.5, + blur, + ); + await begin('east'); + await page.keyboard.press('Backspace'); + await page.keyboard.press('Enter'); + check( + 'an empty numeric draft does not write calibration', + await page.evaluate(() => window.__qaFormCalls.length === 2), + ); + await begin('heading'); + await page.type('.cctv-cal-input', '90'); + await page.evaluate(() => { + window.__godsEyeView.styleManager._cctvControls._cctvState.activeCameraId = + 'b'; + }); + await page.keyboard.press('Enter'); + check( + 'a stale camera editor cannot commit to the next camera', + await page.evaluate(() => window.__qaFormCalls.length === 2), + ); + + await page.evaluate(() => { + for (const panel of ['pp-toggles', 'scene-panel', 'cctv-panel']) + window.__godsEyeView.styleManager.setPanelCollapsed(panel, false, { + persist: false, + syncShare: false, + }); + }); + if ( + await page.$eval( + '#draw-toggle', + (node) => node.getAttribute('aria-pressed') !== 'true', + ) + ) + await page.click('#draw-toggle'); + for (const lang of ['en']) { + await page.evaluate((lang) => { + document.documentElement.lang = lang; + }, lang); + for (const width of [1440, 620, 390]) { + await page.setViewport({ width, height: 900 }); + const layout = await page.evaluate(() => { + const ids = [ + 'scene-select', + 'cctv-camera-select', + 'hud-layout-select', + 'draw-color-select', + ]; + return ids.map((id) => { + const node = document.getElementById(id), + rect = node.getBoundingClientRect(), + panel = node.closest('.panel-collapsible')?.getBoundingClientRect(); + return { + id, + width: rect.width, + fits: rect.width > 0 && rect.width <= (panel?.width || innerWidth), + radius: getComputedStyle(node).borderRadius, + }; + }); + }); + check( + `${lang} fields fit their panels at ${width}px`, + layout.every((item) => item.fits), + layout, + ); + if (width === 390) + await page.screenshot({ + path: `qa-shots/form-fields/${lang}-${width}.png`, + }); + } + } + await page.evaluate(() => { + document.documentElement.lang = 'en'; + document.documentElement.dataset.uiTheme = 'cyber'; + }); + const cyber = await page.$eval( + '#scene-select', + (node) => getComputedStyle(node).backgroundColor, + ); + check( + 'Cyber keeps its native field theme', + cyber === 'rgba(26, 35, 39, 0.96)', + cyber, + ); + await begin('heading'); + await page.evaluate(() => { + const owner = window.__godsEyeView.styleManager._cctvControls; + window.__qaDetachedInput = document.querySelector('.cctv-cal-input'); + owner.destroy(); + window.__qaDetachedInput.dispatchEvent(new Event('blur')); + }); + check( + 'disposal removes the editor and prevents late commits', + await page.evaluate( + () => + !document.querySelector('.cctv-cal-input') && + window.__qaFormCalls.length === 2, + ), + ); + // Scene selection can restore application settings. Exercise it after the + // fixture-owned CCTV phase so those asynchronous effects cannot replace ports. + page.once('dialog', (dialog) => dialog.accept('Baseline selection fixture')); + await page.click('#scene-new-btn'); + await page.waitForFunction(() => + [...document.querySelectorAll('#scene-select option')].some( + (option) => option.textContent === 'Baseline selection fixture', + ), + ); + page.once('dialog', (dialog) => dialog.accept('QA selection fixture')); + await page.click('#scene-new-btn'); + await page.waitForFunction( + () => document.querySelectorAll('#scene-select option').length > 1, + ); + const targetSceneId = await page.$eval( + '#scene-select', + (node) => + [...node.options].find( + (option) => option.textContent === 'QA selection fixture', + ).value, + ); + const baselineSceneId = await page.$eval( + '#scene-select', + (node) => + [...node.options].find( + (option) => option.textContent === 'Baseline selection fixture', + ).value, + ); + await page.select('#scene-select', baselineSceneId); + await page.waitForFunction( + (id) => window.__godsEyeView.sceneDirector._getSelectedScene().id !== id, + {}, + targetSceneId, + ); + await page.evaluate(() => { + window.__qaFormChanges = []; + }); + await page.focus('#scene-select'); + // Typeahead is native even when headless Chrome does not drive OS popups. + await page.keyboard.press('q'); + const sceneSelection = await page.evaluate(() => ({ + id: document.getElementById('scene-select').value, + selected: window.__godsEyeView.sceneDirector._getSelectedScene().id, + changes: window.__qaFormChanges, + focus: document.activeElement.id, + outline: getComputedStyle(document.activeElement).outlineStyle, + })); + check( + 'native typeahead reaches the Scene owner and keeps focus', + sceneSelection.id === targetSceneId && + sceneSelection.selected === targetSceneId && + sceneSelection.changes.at(-1) === targetSceneId && + sceneSelection.focus === 'scene-select', + sceneSelection, + ); + check('keyboard focus remains visible', sceneSelection.outline === 'solid'); + const localized = new URL(page.url()); + localized.searchParams.set('lang', 'ru'); + await page.goto(localized.href, { waitUntil: 'domcontentloaded' }); + await page.waitForFunction( + () => + window.__godsEyeView?.styleManager?._cctvControls && + document.getElementById('loading-screen')?.classList.contains('hidden'), + { timeout: 60000 }, + ); + await page.evaluate(() => { + for (const panel of ['pp-toggles', 'scene-panel', 'cctv-panel']) + window.__godsEyeView.styleManager.setPanelCollapsed(panel, false, { + persist: false, + syncShare: false, + }); + }); + await page.evaluate(() => { + for (const panel of ['pp-toggles', 'scene-panel', 'cctv-panel']) + window.__godsEyeView.styleManager.setPanelCollapsed(panel, false, { + persist: false, + syncShare: false, + }); + }); + if ( + await page.$eval( + '#draw-toggle', + (node) => node.getAttribute('aria-pressed') !== 'true', + ) + ) + await page.click('#draw-toggle'); + const translated = await page.evaluate(() => { + const nodes = [ + 'scene-select', + 'cctv-camera-select', + 'hud-layout-select', + 'draw-color-select', + ].map((id) => document.getElementById(id)); + return ( + document.documentElement.lang === 'ru' && + nodes.every( + (node) => + node.clientWidth > 0 && + node.getBoundingClientRect().width <= + node.closest('.panel-collapsible').getBoundingClientRect().width, + ) + ); + }); + check('real Russian labels and fields fit at 390px', translated); + await page.screenshot({ path: 'qa-shots/form-fields/ru-390.png' }); + check('no uncaught browser errors', errors.length === 0, errors); +} finally { + await browser.close(); +} +process.exitCode = failures ? 1 : 0; diff --git a/src/ui/cctvCalibration.js b/src/ui/cctvCalibration.js index 8144edd8a..9e51540c5 100644 --- a/src/ui/cctvCalibration.js +++ b/src/ui/cctvCalibration.js @@ -1,4 +1,5 @@ import { formatNumber, t, msg } from '../i18n/index.js'; +import { createNumberInput } from './formField.js'; /** Shortest-wrap signed degrees, for heading offsets typed as absolute values. */ const signedNormalizeDeg = (deg) => ((((deg + 180) % 360) + 360) % 360) - 180; @@ -117,11 +118,12 @@ export function _beginCctvCalValueEdit(chip) { const basePose = { ...activeCamera.basePose }; const editListeners = new AbortController(); const startValue = field.get(activeCamera); - const input = document.createElement('input'); - input.type = 'number'; - input.step = field.decimals > 0 ? '0.1' : '1'; - input.value = Number(startValue).toFixed(field.decimals); - input.className = 'cctv-cal-input'; + const input = createNumberInput({ + className: 'gev-field--inline cctv-cal-input', + step: field.decimals > 0 ? '0.1' : '1', + value: Number(startValue).toFixed(field.decimals), + ariaLabel: t(field.label), + }); chip.textContent = `${t(field.label)} `; chip.appendChild(input); input.focus(); diff --git a/src/ui/cctvControls.test.mjs b/src/ui/cctvControls.test.mjs index 5ab5a3280..6a47ff91f 100644 --- a/src/ui/cctvControls.test.mjs +++ b/src/ui/cctvControls.test.mjs @@ -105,6 +105,9 @@ function calibrationFixture(t) { Object.assign(input, { focus() {}, select() {}, + setAttribute(name, value) { + this[name] = value; + }, remove() { this.parent.input = null; }, diff --git a/src/ui/formField.js b/src/ui/formField.js new file mode 100644 index 000000000..8b2127b4d --- /dev/null +++ b/src/ui/formField.js @@ -0,0 +1,36 @@ +/** + * Build a native numeric field without listeners, parsing or commit policy. + * Owners retain drafts, validation, input/change timing and disposal. Static + * selects and number inputs share the gev-field surface in their templates; + * options remain owned by each feature (no replacement popup or keyboard code). + * @param {object} options + * @param {Document} [options.documentRef] + * @param {string} [options.className] Additional density/layout hooks. + * @param {number|string} [options.min] + * @param {number|string} [options.max] + * @param {number|string} [options.step] + * @param {number|string} [options.value] + * @param {boolean} [options.disabled] + * @param {string} [options.ariaLabel] Already translated accessible name. + * @returns {HTMLInputElement} + */ +export function createNumberInput({ + documentRef = globalThis.document, + className = '', + min, + max, + step, + value, + disabled = false, + ariaLabel, +} = {}) { + const input = documentRef.createElement('input'); + input.type = 'number'; + input.className = `gev-field${className ? ` ${className}` : ''}`; + for (const [key, setting] of Object.entries({ min, max, step, value })) { + if (setting !== undefined) input[key] = setting; + } + input.disabled = disabled; + if (ariaLabel !== undefined) input.setAttribute('aria-label', ariaLabel); + return input; +} diff --git a/src/ui/styles/cctv.css b/src/ui/styles/cctv.css index d6f895681..67f18212b 100644 --- a/src/ui/styles/cctv.css +++ b/src/ui/styles/cctv.css @@ -129,26 +129,6 @@ html:not([lang='en']) .cctv-controls .scene-btn { background: rgba(0, 212, 255, 0.08); } -.cctv-cal-input { - width: 58px; - font-family: var(--font-mono); - font-size: 9px; - letter-spacing: 0.7px; - color: var(--text-primary); - background: rgba(0, 212, 255, 0.1); - border: 1px solid rgba(0, 212, 255, 0.5); - border-radius: 4px; - padding: 1px 3px; - outline: none; - -moz-appearance: textfield; -} - -.cctv-cal-input::-webkit-outer-spin-button, -.cctv-cal-input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; -} - .cctv-calibration-actions { margin-top: 8px; } @@ -162,26 +142,9 @@ html:not([lang='en']) .cctv-controls .scene-btn { #cctv-camera-select { flex: 1; min-width: 0; - background: rgba(255, 255, 255, 0.06); - border: 1px solid rgba(255, 255, 255, 0.14); - border-radius: 7px; - color: var(--text-primary); - padding: 6px 8px; - font-family: var(--font-sans); - font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - outline: none; -} - -#cctv-camera-select:focus-visible { - outline: 2px solid var(--text-primary); - outline-offset: -3px; -} - -#cctv-camera-select:disabled { - opacity: 0.45; } #cctv-enable-btn.active, diff --git a/src/ui/styles/controls.css b/src/ui/styles/controls.css index 7fdb51276..f11378bb9 100644 --- a/src/ui/styles/controls.css +++ b/src/ui/styles/controls.css @@ -727,16 +727,6 @@ html:not([lang='en']) .pp-slider-row > .pp-slider-mini-label { .pp-select { flex: 1; min-width: 0; - height: 24px; - background: rgba(255, 255, 255, 0.06); - border: 1px solid rgba(255, 255, 255, 0.14); - border-radius: 6px; - color: var(--text-primary); - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.6px; - padding: 2px 6px; - outline: none; } /* DISPLAY ▸ Draw: shape segment, label field, colour, and the one-line hint */ diff --git a/src/ui/styles/form-field.css b/src/ui/styles/form-field.css new file mode 100644 index 000000000..e0eec99b1 --- /dev/null +++ b/src/ui/styles/form-field.css @@ -0,0 +1,51 @@ +/* Native selects and numeric inputs. Features own options, constraints and + commit timing; density variants do not introduce custom keyboard behavior. */ +.gev-field { + min-width: 0; + background: rgba(255, 255, 255, 0.06); + border: 1px solid rgba(255, 255, 255, 0.14); + border-radius: 7px; + color: var(--text-primary); + padding: 6px 8px; + font-family: var(--font-sans); + font-size: 12px; + outline: none; +} + +.gev-field:focus-visible { + outline: 2px solid var(--text-primary); + outline-offset: -3px; +} + +.gev-field:disabled { + opacity: 0.45; +} + +.gev-field--compact { + height: 24px; + border-radius: 6px; + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.6px; + padding: 2px 6px; +} + +/* Effective-pose editors must fit inside CCTV value chips. Retain their + existing spinner-free surface; calibration conversion stays with the owner. */ +.gev-field--inline { + width: 58px; + font-family: var(--font-mono); + font-size: 9px; + letter-spacing: 0.7px; + background: rgba(0, 212, 255, 0.1); + border-color: rgba(0, 212, 255, 0.5); + border-radius: 4px; + padding: 1px 3px; + -moz-appearance: textfield; +} + +.gev-field--inline::-webkit-outer-spin-button, +.gev-field--inline::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} diff --git a/src/ui/styles/scenes.css b/src/ui/styles/scenes.css index 287b8b842..eef6f9ac3 100644 --- a/src/ui/styles/scenes.css +++ b/src/ui/styles/scenes.css @@ -153,14 +153,6 @@ #scene-select { flex: 1; min-width: 0; - background: rgba(255, 255, 255, 0.06); - border: 1px solid rgba(255, 255, 255, 0.14); - border-radius: 7px; - color: var(--text-primary); - padding: 6px 8px; - font-family: var(--font-sans); - font-size: 12px; - outline: none; } /* A translated scene name needs the width: the select takes its own row, diff --git a/src/ui/templates/context.html b/src/ui/templates/context.html index 290726417..9e88d20f4 100644 --- a/src/ui/templates/context.html +++ b/src/ui/templates/context.html @@ -121,7 +121,7 @@
-
@@ -180,7 +180,7 @@
- @@ -221,7 +221,7 @@
- +
diff --git a/src/ui/templates/display-controls.html b/src/ui/templates/display-controls.html index bcd54f572..f31453b6c 100644 --- a/src/ui/templates/display-controls.html +++ b/src/ui/templates/display-controls.html @@ -13,7 +13,7 @@
Layout - @@ -136,7 +136,7 @@
- diff --git a/src/ui/templates/layer-panels.html b/src/ui/templates/layer-panels.html index 78ecfd777..711bd98c6 100644 --- a/src/ui/templates/layer-panels.html +++ b/src/ui/templates/layer-panels.html @@ -35,7 +35,7 @@
- +
@@ -150,7 +150,7 @@
- +
diff --git a/style.css b/style.css index 89d1371ae..b8b2db315 100644 --- a/style.css +++ b/style.css @@ -1,5 +1,6 @@ /* Preserve component and responsive rule order in one stylesheet entry. */ @import './src/ui/styles/foundation.css'; +@import './src/ui/styles/form-field.css'; @import './src/ui/styles/slider.css'; @import './src/ui/styles/controls.css'; @import './src/ui/styles/location.css'; From b6623f65cde10d0d321a22029f62e144b88ae583 Mon Sep 17 00:00:00 2001 From: Mazeyar Moeini Feizabadi Date: Wed, 21 Oct 2026 17:11:56 +0200 Subject: [PATCH 28/45] docs: add shared native fields changelog entry --- changelog.d/1305-shared-native-form-fields.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog.d/1305-shared-native-form-fields.md diff --git a/changelog.d/1305-shared-native-form-fields.md b/changelog.d/1305-shared-native-form-fields.md new file mode 100644 index 000000000..129d81bcf --- /dev/null +++ b/changelog.d/1305-shared-native-form-fields.md @@ -0,0 +1,3 @@ +- Share native dropdown and numeric-field styling across Scene, CCTV, Display + and Radio controls, with a shared CCTV number-input builder that preserves + existing precision, validation and commit behavior (mazy1998, #1305). From f70bc0cabbc48ad75cb8f49539c8002d7cfb1d02 Mon Sep 17 00:00:00 2001 From: Mazeyar Moeini Feizabadi Date: Wed, 21 Oct 2026 18:10:09 +0200 Subject: [PATCH 29/45] refactor(ui): share read-only status badges --- docs/CODE-BOUNDARIES.md | 11 ++ docs/CURRENT-STATE.md | 21 +++ scripts/format-scope.json | 6 +- scripts/package-boundaries.json | 12 +- scripts/qa-status-badges.mjs | 276 +++++++++++++++++++++++++++++ src/ui/cctvBadges.test.mjs | 112 ++++++++++++ src/ui/cctvFrames.js | 11 +- src/ui/cctvPresentation.js | 13 +- src/ui/railCards.js | 18 +- src/ui/statusBadge.js | 39 ++++ src/ui/statusBadge.test.mjs | 78 ++++++++ src/ui/styles/cctv.css | 53 ++---- src/ui/styles/status-badge.css | 43 +++++ src/ui/styles/weather.css | 4 - src/ui/templates/layer-panels.html | 4 +- style.css | 1 + 16 files changed, 640 insertions(+), 62 deletions(-) create mode 100644 scripts/qa-status-badges.mjs create mode 100644 src/ui/cctvBadges.test.mjs create mode 100644 src/ui/statusBadge.js create mode 100644 src/ui/statusBadge.test.mjs create mode 100644 src/ui/styles/status-badge.css diff --git a/docs/CODE-BOUNDARIES.md b/docs/CODE-BOUNDARIES.md index 6b1c88ea8..8ca26d9f2 100644 --- a/docs/CODE-BOUNDARIES.md +++ b/docs/CODE-BOUNDARIES.md @@ -748,3 +748,14 @@ option identity/order, bounds, parsing, draft values, input/change timing and teardown. CCTV effective-pose conversion and tuner/device operations remain feature responsibilities. A Vue replacement can reuse this contract and CSS; it replaces DOM construction, rather than adding a second state owner. + +### Read-only status badges + +`src/ui/statusBadge.js` constructs/updates ordinary badges without listeners, +status inference or live-region policy. It consumes translated text and controlled +visibility; appearance variants share CSS rather than mapping machine states to +universal severity. CCTV owns frame/source and calibration rules and their data +attributes, while Weather owns coverage labels. The keyed rail-card owner keeps +node identity, header focus, disclosure and teardown. The shared adapter never +creates another state store or announces all card updates. A Vue view can replace +this adapter and retain these presentation inputs and styles. diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index c75aa1d3a..7f0dd1476 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1233,6 +1233,27 @@ Feature owners retain bounds, steps, formatted values, input/change timing and listener cleanup. The radio tuning dial, imagery comparison divider and event comparison/progression controls keep their specialized presentation and behavior. +## Ordinary status badges + +CCTV source/frame labels, calibration provenance and Weather coverage labels use +`ui/statusBadge.js` and the `gev-status-badge` CSS surface. The listener-free +adapter accepts already-translated `label` and `hidden` values; pill, box and plain +appearances describe shape/density only. Static CCTV markup uses the same classes +as generated rail-card badges. Repeated identical updates do not rewrite text or +replace nodes. Empty coverage remains hidden. + +Feature owners retain the status rules, machine-state attributes, translations +and announcement policy. CCTV frame acquisition (`idle/loading/error/ready`) +remains separate from provider status: retained pixels do not imply a healthy +feed. Calibration still distinguishes manually saved, catalog-curated and raw +prior poses; unsaved edits override the label until save/reset. Coverage labels +remain geographic scope, not health claims. Existing colors and the source +badge's polite live region are preserved; coverage and calibration do not gain +live regions. Interactive layer toggles, progress indicators and world overlays +retain their specialized ownership. Vue can reuse the view contract and CSS while +replacing DOM construction. Browser acceptance: +`QA_BASE_URL=http://127.0.0.1:4189 node scripts/qa-status-badges.mjs`. + ## Ordinary action buttons Scene panel actions, shot LOAD/DEL actions, the EDIT DETAILS / SHARE SCENE diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 34219f856..135954a84 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1073,5 +1073,9 @@ "src/data/gbfsProxyRateLimit.test.mjs", "src/terrainHeightsBounds.test.mjs", "server/providers/overpass/requestAdmission.test.mjs", - "src/tooling/trackArrivalObservation.test.mjs" + "src/tooling/trackArrivalObservation.test.mjs", + "src/ui/styles/status-badge.css", + "src/ui/statusBadge.test.mjs", + "src/ui/cctvBadges.test.mjs", + "scripts/qa-status-badges.mjs" ] diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 39ccf99b5..acdeff01e 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -500,7 +500,8 @@ "src/i18n/locales/ru.json", "src/ui/unitLabels.js", "src/ui/keyGuidance.js", - "src/ui/statusText.js" + "src/ui/statusText.js", + "src/ui/statusBadge.js" ], "external": [] }, @@ -550,7 +551,8 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", - "src/ui/unitLabels.js" + "src/ui/unitLabels.js", + "src/ui/statusBadge.js" ], "external": [] }, @@ -777,7 +779,8 @@ "src/ui/unitLabels.js", "src/ui/keyGuidance.js", "src/ui/layerNames.js", - "src/ui/statusText.js" + "src/ui/statusText.js", + "src/ui/statusBadge.js" ], "external": ["cesium"] }, @@ -2515,7 +2518,8 @@ "src/voice/providerCapabilities.js", "src/voice/geminiSession.js", "src/voice/geminiAudio.js", - "src/voice/geminiCaptureWorklet.js" + "src/voice/geminiCaptureWorklet.js", + "src/ui/statusBadge.js" ], "external": [ "hls.js", diff --git a/scripts/qa-status-badges.mjs b/scripts/qa-status-badges.mjs new file mode 100644 index 000000000..961fdba7f --- /dev/null +++ b/scripts/qa-status-badges.mjs @@ -0,0 +1,276 @@ +#!/usr/bin/env node +/** Badge acceptance on dev/preview. Camera state is a disposable controller fixture. */ +import fs from 'node:fs'; +import puppeteer from 'puppeteer'; + +const browser = await puppeteer.launch({ + headless: true, + args: ['--use-gl=angle', '--use-angle=swiftshader'], +}); +const page = await browser.newPage(); +page.setDefaultNavigationTimeout(60000); +const errors = []; +page.on('pageerror', (error) => errors.push(error.message)); +let checks = 0; +let failures = 0; +const check = (name, passed, detail) => { + checks++; + console.log(`[${passed ? 'PASS' : 'FAIL'}] ${name}`); + if (!passed) { + failures++; + console.log(JSON.stringify(detail)); + } +}; +const out = 'qa-shots/status-badges'; +fs.mkdirSync(out, { recursive: true }); +try { + for (const lang of ['en', 'ru']) { + await page.setViewport({ width: 1440, height: 900 }); + await page.goto( + `${process.env.QA_BASE_URL || 'http://127.0.0.1:4189'}/?welcome=0&lang=${lang}`, + { waitUntil: 'domcontentloaded' }, + ); + await page.waitForFunction( + () => + window.__godsEyeView?.styleManager?._cctvControls && + document.getElementById('loading-screen')?.classList.contains('hidden'), + { timeout: 60000 }, + ); + await page.evaluate(async () => { + const { dataManager, styleManager: manager } = window.__godsEyeView; + await dataManager.setEnabled('wind', true); + manager.setPanelCollapsed('weather-panel', false, { + persist: false, + syncShare: false, + }); + manager.setPanelCollapsed('cctv-panel', false, { + persist: false, + syncShare: false, + }); + const owner = manager._cctvControls; + owner._cctvUnsubscribe?.(); + owner._cctvUnsubscribe = null; + owner.actions = { ...owner.actions, isEnabled: () => true }; + owner._renderCctvState({ + enabled: true, + activeCameraId: 'badge-fixture', + cameras: [{ id: 'badge-fixture', city: 'QA', name: 'Badge fixture' }], + activeCamera: { + id: 'badge-fixture', + city: 'QA', + headingDeg: 30, + pitchDeg: -10, + fovDeg: 45, + rangeM: 120, + mountHeightM: 8, + sourceKind: 'snapshot', + sourceStatus: 'degraded', + calBadge: 'curated', + calDirty: false, + }, + }); + window.__qaBadgeText = + document.getElementById('cctv-source-badge').textContent; + }); + await page.waitForSelector('.weather-coverage.gev-status-badge'); + const inventory = await page.evaluate(() => { + const source = document.getElementById('cctv-source-badge'); + const quality = document.getElementById('cctv-quality-chip'); + const coverage = [...document.querySelectorAll('.weather-coverage')]; + return { + shared: [source, quality, ...coverage].every((node) => + node.classList.contains('gev-status-badge'), + ), + live: + source.getAttribute('role') === 'status' && + source.getAttribute('aria-live') === 'polite', + silent: [quality, ...coverage].every( + (node) => + !node.hasAttribute('aria-live') && + !node.hasAttribute('role') && + !node.hasAttribute('tabindex'), + ), + coverage: + coverage.length > 0 && + coverage.every( + (node) => + node.textContent && + !node.hidden && + node.classList.contains('gev-status-badge--plain'), + ), + source: source.textContent, + }; + }); + check( + `${lang}: CCTV and populated Weather badges share the view`, + inventory.shared && inventory.coverage, + inventory, + ); + check( + `${lang}: existing announcement and read-only semantics remain intact`, + inventory.live && inventory.silent, + inventory, + ); + check( + `${lang}: source wording uses the active locale`, + lang === 'en' + ? inventory.source === 'SNAPSHOT · DEGRADED' + : inventory.source !== 'SNAPSHOT · DEGRADED', + inventory, + ); + + for (const state of ['loading', 'error', 'retained', 'ready', 'idle']) { + const result = await page.evaluate((state) => { + const owner = window.__godsEyeView.styleManager._cctvControls; + owner._cctvFrame.dataset.loading = state === 'loading' ? 'true' : ''; + owner._cctvFrame.dataset.error = ['error', 'retained'].includes(state) + ? 'true' + : ''; + owner._cctvFrameWrap.classList.toggle( + 'has-frame', + state === 'retained', + ); + owner._syncCctvSourceBadge( + owner._cctvState.activeCamera, + state !== 'idle', + ); + const badge = document.getElementById('cctv-source-badge'); + return { + state: badge.dataset.frameState, + text: badge.textContent, + color: getComputedStyle(badge).color, + }; + }, state); + const expected = { + loading: ['loading', 'rgb(255, 229, 155)'], + error: ['error', 'rgb(255, 176, 176)'], + retained: ['ready', 'rgb(157, 239, 255)'], + ready: ['ready', 'rgb(157, 239, 255)'], + idle: ['idle', 'rgb(157, 239, 255)'], + }[state]; + check( + `${lang}: ${state} keeps its frame state and palette`, + result.state === expected[0] && + result.color === expected[1] && + (!['ready', 'retained'].includes(state) || + result.text === inventory.source), + result, + ); + } + for (const [calBadge, dirty, color] of [ + ['raw-prior', false, 'rgb(143, 231, 255)'], + ['curated', false, 'rgb(255, 230, 162)'], + ['calibrated', false, 'rgb(173, 255, 191)'], + ['curated', true, 'rgb(255, 208, 138)'], + ]) { + const result = await page.evaluate( + ({ calBadge, dirty }) => { + const owner = window.__godsEyeView.styleManager._cctvControls; + document.getElementById('cctv-next-btn').focus(); + owner._renderCctvState({ + ...owner._cctvState, + activeCamera: { + ...owner._cctvState.activeCamera, + calBadge, + calDirty: dirty, + }, + }); + const badge = document.getElementById('cctv-quality-chip'); + return { + state: badge.dataset.calBadge, + color: getComputedStyle(badge).color, + focus: document.activeElement.id, + }; + }, + { calBadge, dirty }, + ); + check( + `${lang}: ${dirty ? 'edited' : calBadge} keeps provenance color and control focus`, + result.state === (dirty ? 'edited' : calBadge) && + result.color === color && + result.focus === 'cctv-next-btn', + result, + ); + } + for (const theme of ['tactical', 'cyber']) { + await page.evaluate( + (theme) => window.__godsEyeView.styleManager._setHudVariant(theme), + theme, + ); + for (const width of [1440, 620, 390]) { + await page.setViewport({ width, height: 900 }); + for (const panelId of ['cctv-panel', 'weather-panel']) { + await page.evaluate(async (panelId) => { + const manager = window.__godsEyeView.styleManager; + for (const other of ['cctv-panel', 'weather-panel']) { + if (other !== panelId) + manager.setPanelCollapsed(other, true, { + persist: false, + syncShare: false, + }); + } + manager.setPanelCollapsed(panelId, false, { + persist: false, + syncShare: false, + }); + await new Promise((resolve) => + requestAnimationFrame(() => requestAnimationFrame(resolve)), + ); + }, panelId); + const layout = await page.evaluate((panelId) => { + const selector = + panelId === 'cctv-panel' + ? '#cctv-source-badge, #cctv-quality-chip' + : '.weather-coverage'; + return [...document.querySelectorAll(selector)].map((node) => { + const rect = node.getBoundingClientRect(); + const panel = node.closest(`#${panelId}`).getBoundingClientRect(); + return { + id: node.id || 'weather-coverage', + text: node.textContent, + width: rect.width, + height: rect.height, + scroll: node.scrollWidth, + client: node.clientWidth, + left: rect.left, + right: rect.right, + panelLeft: panel.left, + panelRight: panel.right, + fits: + rect.width > 0 && + rect.height > 0 && + rect.left >= panel.left - 1 && + rect.right <= panel.right + 1 && + node.scrollWidth <= node.clientWidth + 1, + }; + }); + }, panelId); + check( + `${lang}/${theme}: ${panelId} badges fit at ${width}px`, + layout.length >= (panelId === 'cctv-panel' ? 2 : 1) && + layout.every((node) => node.fits), + layout, + ); + if (width === 390) + await page.screenshot({ + path: `${out}/${lang}-${theme}-${panelId}-${width}.png`, + }); + } + } + } + const disposed = await page.evaluate(() => { + const owner = window.__godsEyeView.styleManager._cctvControls; + const badge = document.getElementById('cctv-quality-chip'); + const text = badge.textContent; + owner.destroy(); + owner._renderCctvState(null); + return badge.textContent === text; + }); + check(`${lang}: disposal prevents late state painting`, disposed); + } + check('no uncaught browser errors', errors.length === 0, errors); +} finally { + await browser.close(); +} +console.log(`${checks} checks; ${failures} failures`); +process.exitCode = failures ? 1 : 0; diff --git a/src/ui/cctvBadges.test.mjs b/src/ui/cctvBadges.test.mjs new file mode 100644 index 000000000..1703d5d54 --- /dev/null +++ b/src/ui/cctvBadges.test.mjs @@ -0,0 +1,112 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { CctvControls } from './cctvControls.js'; +import { railFixture } from './railTestFixture.mjs'; +import { setLocale, t } from '../i18n/index.js'; + +function fixture(t) { + const { document } = railFixture(); + const controls = new CctvControls({ + elements: { + _cctvQualityChip: document.createElement('span'), + _cctvSourceBadge: document.createElement('div'), + }, + cctv: {}, + actions: { isEnabled: () => true, setPanelCollapsed() {} }, + }); + t.after(() => controls.destroy()); + return { controls, document }; +} + +test('source and frame states retain their distinct meanings, including retained pixels', (testContext) => { + const { controls, document } = fixture(testContext); + const camera = { sourceKind: 'snapshot', sourceStatus: 'degraded' }; + controls._cctvFrame = document.createElement('img'); + controls._cctvFrameWrap = document.createElement('div'); + controls._cctvFrame.removeAttribute = () => {}; + for (const node of [controls._cctvFrame, controls._cctvFrameWrap]) { + node.classList.remove = (...names) => + names.forEach((name) => node.classList.toggle(name, false)); + } + const expect = (label, state, active = camera, enabled = true) => { + controls._syncCctvSourceBadge(active, enabled); + assert.equal(controls._cctvSourceBadge.textContent, label); + assert.equal(controls._cctvSourceBadge.dataset.frameState, state); + }; + expect('SOURCE · UNKNOWN', 'idle', camera, false); + expect('SOURCE · UNKNOWN', 'idle', null); + controls._cctvFrame.dataset.loading = 'true'; + expect('FRAME · LOADING', 'loading'); + controls._cctvFrame.dataset.loading = ''; + controls._cctvFrame.dataset.error = 'true'; + expect('FRAME · UNAVAILABLE', 'error'); + // A refresh failure keeps the settled pixels and the provider's source status. + controls._cctvFrameWrap.classList.toggle('has-frame', true); + expect('SNAPSHOT · DEGRADED', 'ready'); + controls._cctvFrame.dataset.loading = 'true'; + expect('SNAPSHOT · DEGRADED', 'ready'); + controls._cctvFrame.dataset.loading = ''; + controls._cctvFrame.dataset.error = ''; + for (const status of ['ok', 'error', 'unknown', 'vendor-specific']) { + expect(`SNAPSHOT · ${status.toUpperCase()}`, 'ready', { + ...camera, + sourceStatus: status, + }); + } + expect('LIVE · OK', 'ready', { feedType: 'live', sourceStatus: 'ok' }); +}); + +test('calibration labels follow supplied provenance and dirty/save/reset transitions without writes to the camera', (testContext) => { + const { controls } = fixture(testContext); + const cases = [ + ['raw-prior', false, 'CAL · RAW PRIOR'], + ['curated', false, 'CAL · CURATED'], + ['curated', true, 'CAL · EDITED (UNSAVED)'], + ['calibrated', false, 'CAL · CALIBRATED'], + ['calibrated', true, 'CAL · EDITED (UNSAVED)'], + ['raw-prior', false, 'CAL · RAW PRIOR'], + [null, false, 'CAL · --'], + ]; + for (const [calBadge, calDirty, label] of cases) { + const activeCamera = Object.freeze({ id: 'a', calBadge, calDirty }); + controls._renderCctvState({ + enabled: true, + activeCameraId: 'a', + activeCamera, + }); + assert.equal(controls._cctvQualityChip.textContent, label); + assert.equal( + controls._cctvQualityChip.dataset.calBadge, + calDirty ? 'edited' : calBadge || '', + ); + } + controls._renderCctvState(null); + assert.equal(controls._cctvQualityChip.textContent, 'CAL · --'); + assert.equal(controls._cctvQualityChip.dataset.calBadge, ''); +}); + +test('localization changes badge copy while preserving machine state ids', (testContext) => { + const { controls } = fixture(testContext); + testContext.after(() => setLocale('en')); + setLocale('ru'); + controls._syncCctvSourceBadge( + { sourceKind: 'snapshot', sourceStatus: 'degraded' }, + true, + ); + assert.equal( + controls._cctvSourceBadge.textContent, + `${t('SNAPSHOT')} · ${t('DEGRADED')}`, + ); + assert.notEqual(controls._cctvSourceBadge.textContent, 'SNAPSHOT · DEGRADED'); + assert.equal(controls._cctvSourceBadge.dataset.frameState, 'ready'); + controls._renderCctvState({ + enabled: true, + activeCameraId: 'a', + activeCamera: { id: 'a', calBadge: 'curated', calDirty: true }, + }); + assert.equal( + controls._cctvQualityChip.textContent, + t('CAL · EDITED (UNSAVED)'), + ); + assert.equal(controls._cctvQualityChip.dataset.calBadge, 'edited'); +}); diff --git a/src/ui/cctvFrames.js b/src/ui/cctvFrames.js index 7976d46c8..ee324e0ad 100644 --- a/src/ui/cctvFrames.js +++ b/src/ui/cctvFrames.js @@ -1,3 +1,4 @@ +import { updateStatusBadge } from './statusBadge.js'; import { msg, t } from '../i18n/index.js'; /** @@ -164,19 +165,21 @@ export function _settleCctvFrame(token, src, ok) { export function _syncCctvSourceBadge(activeCamera, enabled) { if (!this._cctvSourceBadge) return; if (!enabled || !activeCamera) { - this._cctvSourceBadge.textContent = t('SOURCE · UNKNOWN'); + updateStatusBadge(this._cctvSourceBadge, { label: t('SOURCE · UNKNOWN') }); this._cctvSourceBadge.dataset.frameState = 'idle'; return; } const hasDisplayedFrame = this._cctvFrameWrap?.classList.contains('has-frame'); if (this._cctvFrame?.dataset.loading === 'true' && !hasDisplayedFrame) { - this._cctvSourceBadge.textContent = t('FRAME · LOADING'); + updateStatusBadge(this._cctvSourceBadge, { label: t('FRAME · LOADING') }); this._cctvSourceBadge.dataset.frameState = 'loading'; return; } if (this._cctvFrame?.dataset.error === 'true' && !hasDisplayedFrame) { - this._cctvSourceBadge.textContent = t('FRAME · UNAVAILABLE'); + updateStatusBadge(this._cctvSourceBadge, { + label: t('FRAME · UNAVAILABLE'), + }); this._cctvSourceBadge.dataset.frameState = 'error'; return; } @@ -184,6 +187,6 @@ export function _syncCctvSourceBadge(activeCamera, enabled) { activeCamera.sourceKind || activeCamera.feedType || 'unknown', ); const status = cctvSourceStatusLabel(activeCamera.sourceStatus || 'unknown'); - this._cctvSourceBadge.textContent = `${kind} · ${status}`; + updateStatusBadge(this._cctvSourceBadge, { label: `${kind} · ${status}` }); this._cctvSourceBadge.dataset.frameState = 'ready'; } diff --git a/src/ui/cctvPresentation.js b/src/ui/cctvPresentation.js index 3e738e109..070c47f64 100644 --- a/src/ui/cctvPresentation.js +++ b/src/ui/cctvPresentation.js @@ -1,3 +1,4 @@ +import { updateStatusBadge } from './statusBadge.js'; import { t, tn } from '../i18n/index.js'; import { cctvSourceLabelText, cctvSourceMessageText } from './cctvFrames.js'; @@ -137,11 +138,13 @@ export function _renderCctvState(state) { // promotes to CALIBRATED, RESET CAL clears. const badge = activeCamera?.calBadge || null; const dirty = !!activeCamera?.calDirty; - this._cctvQualityChip.textContent = dirty - ? t('CAL · EDITED (UNSAVED)') - : t('CAL · {badge}', { - badge: this._calBadgeLabel(badge), - }); + updateStatusBadge(this._cctvQualityChip, { + label: dirty + ? t('CAL · EDITED (UNSAVED)') + : t('CAL · {badge}', { + badge: this._calBadgeLabel(badge), + }), + }); this._cctvQualityChip.dataset.calBadge = dirty ? 'edited' : badge || ''; } diff --git a/src/ui/railCards.js b/src/ui/railCards.js index 17f04436f..7317693be 100644 --- a/src/ui/railCards.js +++ b/src/ui/railCards.js @@ -1,4 +1,5 @@ import { createRailCardBlocks } from './railCardBlocks.js'; +import { createStatusBadge, updateStatusBadge } from './statusBadge.js'; const set = (node, key, value) => { if (node[key] !== value) node[key] = value; @@ -53,11 +54,12 @@ export function createRailCards({ 'rail-card-title rail-card-nowrap', heading, ); - const badge = make( - 'span', - `rail-card-badge${badgeClassName ? ` ${badgeClassName}` : ''}`, - labels, - ); + const badge = createStatusBadge({ + documentRef: document, + appearance: 'plain', + className: `rail-card-badge${badgeClassName ? ` ${badgeClassName}` : ''}`, + }); + labels.appendChild(badge); const disclosure = make('span', 'rail-card-disclosure', header); disclosure.setAttribute('aria-hidden', 'true'); const compact = make('span', 'rail-card-compact', header); @@ -90,8 +92,10 @@ export function createRailCards({ row.title.setAttribute('title', card.title); set(row.icon, 'textContent', card.icon || ''); set(row.icon, 'hidden', !card.icon); - set(row.badge, 'textContent', card.badge || ''); - set(row.badge, 'hidden', !card.badge); + updateStatusBadge(row.badge, { + label: card.badge || '', + hidden: !card.badge, + }); const open = card.open !== false; set(row.element.dataset, 'open', String(open)); row.element.classList.toggle('is-open', open); diff --git a/src/ui/statusBadge.js b/src/ui/statusBadge.js new file mode 100644 index 000000000..ec7f3019a --- /dev/null +++ b/src/ui/statusBadge.js @@ -0,0 +1,39 @@ +/** + * Ordinary read-only badge view. Labels are already translated. Feature owners + * retain status derivation, machine-state attributes and announcement policy. + * No listeners, timers, state inference or automatic live regions are installed. + * Vue can replace this DOM adapter while retaining the label/hidden contract + * and the gev-status-badge CSS surface. + * @param {object} options + * @param {Document} [options.documentRef] + * @param {string} [options.label] + * @param {'pill'|'box'|'plain'} [options.appearance] + * @param {string} [options.className] Feature/layout hooks. + * @param {boolean} [options.hidden] + * @returns {HTMLSpanElement} + */ +export function createStatusBadge({ + documentRef = globalThis.document, + label = '', + appearance = 'pill', + className = '', + hidden = false, +} = {}) { + const badge = documentRef.createElement('span'); + badge.className = [ + 'gev-status-badge', + appearance === 'box' && 'gev-status-badge--box', + appearance === 'plain' && 'gev-status-badge--plain', + className, + ] + .filter(Boolean) + .join(' '); + updateStatusBadge(badge, { label, hidden }); + return badge; +} + +/** Paint controlled text/visibility without replacing nodes or redundant writes. */ +export function updateStatusBadge(badge, { label, hidden = false }) { + if (badge.textContent !== label) badge.textContent = label; + if (badge.hidden !== hidden) badge.hidden = hidden; +} diff --git a/src/ui/statusBadge.test.mjs b/src/ui/statusBadge.test.mjs new file mode 100644 index 000000000..2e576af69 --- /dev/null +++ b/src/ui/statusBadge.test.mjs @@ -0,0 +1,78 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { createStatusBadge, updateStatusBadge } from './statusBadge.js'; +import { createRailCards } from './railCards.js'; +import { railFixture } from './railTestFixture.mjs'; + +test('badges paint literal translated text without installing announcement or interaction semantics', () => { + const { document } = railFixture(); + for (const appearance of ['pill', 'box', 'plain']) { + const badge = createStatusBadge({ + documentRef: document, + appearance, + className: 'feature-hook', + label: ' · НЕИЗВЕСТНО', + }); + assert.equal(badge.tagName, 'SPAN'); + assert.equal( + badge.textContent, + ' · НЕИЗВЕСТНО', + ); + assert.equal(badge.children.length, 0); + assert.equal(badge.classList.contains('gev-status-badge'), true); + assert.equal(badge.classList.contains('feature-hook'), true); + assert.equal(badge.getAttribute('role'), null); + assert.equal(badge.getAttribute('aria-live'), null); + assert.equal(badge.getAttribute('tabindex'), null); + assert.equal( + badge.classList.contains(`gev-status-badge--${appearance}`), + appearance !== 'pill', + ); + } +}); + +test('painting preserves feature state, live regions and focus with zero identical writes', () => { + let writes = 0; + const { document } = railFixture(() => writes++); + const badge = createStatusBadge({ documentRef: document, hidden: true }); + badge.setAttribute('role', 'status'); + badge.setAttribute('aria-live', 'polite'); + badge.dataset.frameState = 'ready'; + const focusOwner = document.createElement('button'); + focusOwner.focus(); + updateStatusBadge(badge, { label: 'SNAPSHOT · DEGRADED' }); + assert.equal(badge.hidden, false); + writes = 0; + updateStatusBadge(badge, { label: 'SNAPSHOT · DEGRADED' }); + assert.equal(writes, 0); + assert.equal(badge.getAttribute('role'), 'status'); + assert.equal(badge.getAttribute('aria-live'), 'polite'); + assert.equal(badge.dataset.frameState, 'ready'); + assert.equal(document.activeElement, focusOwner); +}); + +test('coverage badges keep keyed identity, hide empty coverage and never claim feed health', () => { + const f = railFixture(); + const view = createRailCards({ ...f, badgeClassName: 'weather-coverage' }); + const card = { id: 'radar', title: 'Rain radar', badge: 'CONUS', blocks: [] }; + view.update([card]); + const badge = f.find((node) => node.classList.contains('gev-status-badge')); + const header = f.container.children[0].children[0]; + header.focus(); + assert.equal(badge.classList.contains('gev-status-badge--plain'), true); + assert.equal(badge.classList.contains('weather-coverage'), true); + view.update([{ ...card, badge: '' }]); + assert.equal(badge.hidden, true); + view.update([{ ...card, badge: 'Global · 1° grid' }]); + assert.equal(badge.hidden, false); + assert.equal(badge.textContent, 'Global · 1° grid'); + assert.equal( + f.find((node) => node.classList.contains('gev-status-badge')), + badge, + ); + assert.deepEqual({ ...badge.dataset }, {}); + assert.equal(f.document.activeElement, header); + view.destroy(); + view.update([card]); + assert.equal(f.container.children.length, 0); +}); diff --git a/src/ui/styles/cctv.css b/src/ui/styles/cctv.css index 67f18212b..12c369a9e 100644 --- a/src/ui/styles/cctv.css +++ b/src/ui/styles/cctv.css @@ -157,41 +157,32 @@ html:not([lang='en']) .cctv-controls .scene-btn { } #cctv-quality-chip { - display: inline-flex; - align-items: center; - justify-content: center; min-width: 90px; - padding: 6px 8px; - border: 1px solid rgba(0, 212, 255, 0.2); - border-radius: 8px; - font-family: var(--font-mono); - font-size: 9px; - letter-spacing: 1px; - color: #8fe7ff; - background: rgba(0, 212, 255, 0.08); - text-transform: uppercase; + --status-badge-border: rgba(0, 212, 255, 0.2); + --status-badge-color: #8fe7ff; + --status-badge-background: rgba(0, 212, 255, 0.08); } /* CAL badge states (cctv-v2 §3b, amended by LOCKED §9.2 — panel-only, no in-world tint). Three visually distinct states: calibrated / curated / raw-prior. */ #cctv-quality-chip[data-cal-badge='calibrated'] { - color: #adffbf; - border-color: rgba(141, 255, 135, 0.42); - background: rgba(141, 255, 135, 0.12); + --status-badge-color: #adffbf; + --status-badge-border: rgba(141, 255, 135, 0.42); + --status-badge-background: rgba(141, 255, 135, 0.12); } #cctv-quality-chip[data-cal-badge='curated'] { - color: #ffe6a2; - border-color: rgba(255, 217, 122, 0.35); - background: rgba(255, 217, 122, 0.1); + --status-badge-color: #ffe6a2; + --status-badge-border: rgba(255, 217, 122, 0.35); + --status-badge-background: rgba(255, 217, 122, 0.1); } /* Unsaved live edits (save-gated persistence, viewshed design §3e). */ #cctv-quality-chip[data-cal-badge='edited'] { - color: #ffd08a; - border-color: rgba(255, 176, 82, 0.5); - background: rgba(255, 176, 82, 0.14); + --status-badge-color: #ffd08a; + --status-badge-border: rgba(255, 176, 82, 0.5); + --status-badge-background: rgba(255, 176, 82, 0.14); } .cctv-frame-wrap { @@ -309,26 +300,18 @@ html:not([lang='en']) .cctv-controls .scene-btn { #cctv-source-badge { align-self: flex-start; - border: 1px solid rgba(0, 212, 255, 0.32); - border-radius: 999px; - background: rgba(0, 212, 255, 0.09); - color: #9defff; - font-family: var(--font-mono); - font-size: 8px; - letter-spacing: 1.3px; - padding: 4px 8px; } #cctv-source-badge[data-frame-state='loading'] { - color: #ffe59b; - border-color: rgba(255, 205, 92, 0.45); - background: rgba(255, 205, 92, 0.1); + --status-badge-color: #ffe59b; + --status-badge-border: rgba(255, 205, 92, 0.45); + --status-badge-background: rgba(255, 205, 92, 0.1); } #cctv-source-badge[data-frame-state='error'] { - color: #ffb0b0; - border-color: rgba(255, 102, 102, 0.5); - background: rgba(255, 72, 72, 0.11); + --status-badge-color: #ffb0b0; + --status-badge-border: rgba(255, 102, 102, 0.5); + --status-badge-background: rgba(255, 72, 72, 0.11); } .cctv-summary-label { diff --git a/src/ui/styles/status-badge.css b/src/ui/styles/status-badge.css new file mode 100644 index 000000000..87459b013 --- /dev/null +++ b/src/ui/styles/status-badge.css @@ -0,0 +1,43 @@ +/* Read-only badges. Feature CSS supplies meaning through explicit colors; + appearance variants change density/shape without interpreting status codes. */ +.gev-status-badge { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 0; + max-width: 100%; + box-sizing: border-box; + padding: 4px 8px; + border: 1px solid var(--status-badge-border, rgba(0, 212, 255, 0.32)); + border-radius: 999px; + background: var(--status-badge-background, rgba(0, 212, 255, 0.09)); + color: var(--status-badge-color, #9defff); + font-family: var(--font-mono); + font-size: 8px; + letter-spacing: 1.3px; + overflow-wrap: anywhere; +} + +.gev-status-badge--box { + padding: 6px 8px; + border-radius: 8px; + font-size: 9px; + letter-spacing: 1px; + text-transform: uppercase; +} + +.gev-status-badge--plain { + padding: 0; + border: 0; + border-radius: 0; + background: none; + color: var(--status-badge-color, var(--text-dim)); + font-size: 9px; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +/* Explicitly beat the component display rule, including in older browsers. */ +.gev-status-badge[hidden] { + display: none; +} diff --git a/src/ui/styles/weather.css b/src/ui/styles/weather.css index a47fa87b1..f7cd999d3 100644 --- a/src/ui/styles/weather.css +++ b/src/ui/styles/weather.css @@ -133,7 +133,6 @@ margin-left: auto; text-align: right; } -.rail-card-badge, .rail-card-line, .rail-timeline-readout { font-family: var(--font-mono); @@ -304,9 +303,6 @@ html:not([lang='en']) .rail-card-zero::after { outline: 1px solid var(--accent); outline-offset: 3px; } -.rail-card-badge { - text-transform: uppercase; -} .rail-card-compact { grid-column: 1 / -1; min-width: 0; diff --git a/src/ui/templates/layer-panels.html b/src/ui/templates/layer-panels.html index a6dae6650..9d8d15a97 100644 --- a/src/ui/templates/layer-panels.html +++ b/src/ui/templates/layer-panels.html @@ -27,7 +27,7 @@ CCTV feed frame
-
SOURCE · UNKNOWN
+
SOURCE · UNKNOWN
Enable CCTV to load camera intersections
@@ -45,7 +45,7 @@
- CAL · -- + CAL · --
diff --git a/style.css b/style.css index e59db8df3..7f041cabe 100644 --- a/style.css +++ b/style.css @@ -2,6 +2,7 @@ @import './src/ui/styles/foundation.css'; @import './src/ui/styles/action-button.css'; @import './src/ui/styles/form-field.css'; +@import './src/ui/styles/status-badge.css'; @import './src/ui/styles/slider.css'; @import './src/ui/styles/controls.css'; @import './src/ui/styles/location.css'; From 83471ea6d78db8fb2cbf4f653b4f74a8df052aaa Mon Sep 17 00:00:00 2001 From: Mazeyar Moeini Feizabadi Date: Wed, 21 Oct 2026 18:10:46 +0200 Subject: [PATCH 30/45] docs: add release note for shared status badges --- changelog.d/1306-shared-status-badges.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog.d/1306-shared-status-badges.md diff --git a/changelog.d/1306-shared-status-badges.md b/changelog.d/1306-shared-status-badges.md new file mode 100644 index 000000000..007a028d1 --- /dev/null +++ b/changelog.d/1306-shared-status-badges.md @@ -0,0 +1,4 @@ +- Share read-only status badge presentation across CCTV source/frame labels, + calibration provenance and Weather coverage, preserving status meanings, + palettes, translations and announcements while preparing the view contract + for a future Vue migration (mazy1998, #1306). From 82c722e6afa4605c2bb1d70f1a3c490b3f6b7ae8 Mon Sep 17 00:00:00 2001 From: Said Turksever Date: Wed, 21 Oct 2026 17:40:49 +0100 Subject: [PATCH 31/45] chore(format): keep format-scope in step with main Co-Authored-By: Claude Opus 5.5 --- scripts/format-scope.json | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/format-scope.json b/scripts/format-scope.json index fb291362d..fd710642d 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1078,6 +1078,5 @@ "src/ui/statusBadge.test.mjs", "src/ui/cctvBadges.test.mjs", "scripts/qa-status-badges.mjs", - "src/data/routeSegment.test.mjs", "src/dockerTrustedPeers.test.mjs" ] From 7103c291946bfdb53c5abfc0071cd2e55e240cab Mon Sep 17 00:00:00 2001 From: Mazeyar Moeini Feizabadi Date: Wed, 21 Oct 2026 18:41:17 +0200 Subject: [PATCH 32/45] refactor(ui): clarify shared field CSS ownership --- docs/CODE-BOUNDARIES.md | 8 ++++++++ docs/CURRENT-STATE.md | 11 +++++++++++ src/ui/styles/cctv.css | 4 ++++ src/ui/styles/cyber.css | 11 ++++++++++- src/ui/styles/form-field.css | 21 ++++++++++----------- src/ui/styles/radio.css | 16 ++++++++++------ 6 files changed, 53 insertions(+), 18 deletions(-) diff --git a/docs/CODE-BOUNDARIES.md b/docs/CODE-BOUNDARIES.md index 8ca26d9f2..a23ba3e0f 100644 --- a/docs/CODE-BOUNDARIES.md +++ b/docs/CODE-BOUNDARIES.md @@ -749,6 +749,14 @@ teardown. CCTV effective-pose conversion and tuner/device operations remain feature responsibilities. A Vue replacement can reuse this contract and CSS; it replaces DOM construction, rather than adding a second state owner. +The shared stylesheet owns field surfaces and disabled opacity; feature and theme +palettes use `--gev-field-background`, `--gev-field-border-color`, +`--gev-field-color` and `--gev-field-disabled-opacity`. Radio retains its own +compact density and arrow space. CCTV owns calibration editor width in +`cctv.css`; the shared inline density does not impose a feature-specific width. +Cyber supplies a shared-field palette explicitly and keeps its legacy native +field rules separate, so Radio's palette remains an intentional exception. + ### Read-only status badges `src/ui/statusBadge.js` constructs/updates ordinary badges without listeners, diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 7f0dd1476..922c285b6 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1233,6 +1233,17 @@ Feature owners retain bounds, steps, formatted values, input/change timing and listener cleanup. The radio tuning dial, imagery comparison divider and event comparison/progression controls keep their specialized presentation and behavior. +## Shared control CSS ownership + +Shared styles own ordinary control surfaces and interaction states; feature CSS +owns surrounding layout and context-specific sizing. CCTV's calibration editor +width lives in `ui/styles/cctv.css`, while the shared inline field variant owns +only density and spinner treatment. Radio supplies its field palette and disabled +opacity through the `--gev-field-*` variables, retaining compact typography and +arrow space locally. Cyber supplies shared-field palette variables explicitly; +its legacy native-field palette rules exclude `.gev-field`. These ownership +boundaries preserve the current Tactical/Cyber appearance and native behavior. + ## Ordinary status badges CCTV source/frame labels, calibration provenance and Weather coverage labels use diff --git a/src/ui/styles/cctv.css b/src/ui/styles/cctv.css index 12c369a9e..1e8dced21 100644 --- a/src/ui/styles/cctv.css +++ b/src/ui/styles/cctv.css @@ -109,6 +109,10 @@ html:not([lang='en']) .cctv-controls .scene-btn { gap: 5px; } +.cctv-cal-input { + width: 58px; +} + .cctv-cal-value { font-family: var(--font-mono); font-size: 9px; diff --git a/src/ui/styles/cyber.css b/src/ui/styles/cyber.css index cad6e69af..e25bbae2d 100644 --- a/src/ui/styles/cyber.css +++ b/src/ui/styles/cyber.css @@ -544,12 +544,21 @@ text-shadow: none; } -:root[data-ui-theme='cyber'] :where(.pp-select, select, input, textarea) { +:root[data-ui-theme='cyber'] + :where(.pp-select, select, input, textarea):where(:not(.gev-field)) { border-color: rgba(206, 222, 226, 0.24); background-color: rgba(26, 35, 39, 0.96); color: var(--text-primary); } +/* Shared fields consume theme palettes through their own surface rule. + Feature palettes (Radio) retain precedence without restyling native fields. */ +:root[data-ui-theme='cyber'] .gev-field { + --gev-field-border-color: rgba(206, 222, 226, 0.24); + --gev-field-background: rgba(26, 35, 39, 0.96); + --gev-field-color: var(--text-primary); +} + :root[data-ui-theme='cyber'] :where( .panel-title, diff --git a/src/ui/styles/form-field.css b/src/ui/styles/form-field.css index e0eec99b1..1d7f2b34f 100644 --- a/src/ui/styles/form-field.css +++ b/src/ui/styles/form-field.css @@ -1,11 +1,11 @@ -/* Native selects and numeric inputs. Features own options, constraints and - commit timing; density variants do not introduce custom keyboard behavior. */ +/* Native selects and numeric inputs. This file owns the field surface/states; + features and themes supply palette variables and retain their own layout. */ .gev-field { min-width: 0; - background: rgba(255, 255, 255, 0.06); - border: 1px solid rgba(255, 255, 255, 0.14); + background: var(--gev-field-background, rgba(255, 255, 255, 0.06)); + border: 1px solid var(--gev-field-border-color, rgba(255, 255, 255, 0.14)); border-radius: 7px; - color: var(--text-primary); + color: var(--gev-field-color, var(--text-primary)); padding: 6px 8px; font-family: var(--font-sans); font-size: 12px; @@ -18,7 +18,7 @@ } .gev-field:disabled { - opacity: 0.45; + opacity: var(--gev-field-disabled-opacity, 0.45); } .gev-field--compact { @@ -30,15 +30,14 @@ padding: 2px 6px; } -/* Effective-pose editors must fit inside CCTV value chips. Retain their - existing spinner-free surface; calibration conversion stays with the owner. */ +/* Compact inline editors share density and hide native number spinners. + Their containing feature sets width to fit the surrounding readout. */ .gev-field--inline { - width: 58px; font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.7px; - background: rgba(0, 212, 255, 0.1); - border-color: rgba(0, 212, 255, 0.5); + --gev-field-background: rgba(0, 212, 255, 0.1); + --gev-field-border-color: rgba(0, 212, 255, 0.5); border-radius: 4px; padding: 1px 3px; -moz-appearance: textfield; diff --git a/src/ui/styles/radio.css b/src/ui/styles/radio.css index 568a60a9e..483321992 100644 --- a/src/ui/styles/radio.css +++ b/src/ui/styles/radio.css @@ -49,13 +49,15 @@ min-height: 36px; } #radio-filter { - min-width: 0; + /* Radio owns its compact density and arrow space; shared fields paint the + palette and disabled state, including this intentional theme exception. */ padding: 7px 24px 7px 8px; - border: 1px solid rgba(65, 220, 231, 0.28); border-radius: 5px; - color: #c5faff; - background: rgba(5, 24, 31, 0.88); font: 9px/1.2 var(--font-mono); + --gev-field-border-color: rgba(65, 220, 231, 0.28); + --gev-field-color: #c5faff; + --gev-field-background: rgba(5, 24, 31, 0.88); + --gev-field-disabled-opacity: 0.42; } .radio-station-card { display: grid; @@ -273,11 +275,13 @@ html:not([lang='en']) .radio-transport button { color: #fff; outline: none; } -.radio-transport button:disabled, -#radio-filter:disabled { +.radio-transport button:disabled { opacity: 0.42; cursor: not-allowed; } +#radio-filter:disabled { + cursor: not-allowed; +} #radio-play-btn.active { color: #fff; border-color: rgba(101, 247, 255, 0.8); From 4116082cb9aff4dddf8b427fd4b043d3796ba162 Mon Sep 17 00:00:00 2001 From: Mazeyar Moeini Feizabadi Date: Wed, 21 Oct 2026 18:41:39 +0200 Subject: [PATCH 33/45] docs: add release note for field CSS ownership --- changelog.d/1309-shared-field-css-ownership.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog.d/1309-shared-field-css-ownership.md diff --git a/changelog.d/1309-shared-field-css-ownership.md b/changelog.d/1309-shared-field-css-ownership.md new file mode 100644 index 000000000..1b8817bac --- /dev/null +++ b/changelog.d/1309-shared-field-css-ownership.md @@ -0,0 +1,3 @@ +- Clarify shared field CSS ownership: CCTV owns calibration editor sizing, + while Radio and Cyber supply explicit field palettes without changing the + current appearance or native control behavior (mazy1998, #1309). From 72e14699688d9cf6955bf74f9367483cea641be1 Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Wed, 21 Oct 2026 15:07:00 -0700 Subject: [PATCH 34/45] Apply consistent API response headers Every /api response, including errors, partial responses, Host refusals and unknown routes, now carries a sandboxing Content-Security-Policy and X-Content-Type-Options: nosniff on the dev and preview servers. Vite's server and preview headers only reach the documents and assets it serves itself, so a small plugin sets them ahead of the Host check. A route's own policy is sent as an additional policy rather than replacing it. --- build/vite.js | 54 +++++++++++- src/tooling/viteBuild.test.mjs | 149 +++++++++++++++++++++++++++++++-- 2 files changed, 197 insertions(+), 6 deletions(-) diff --git a/build/vite.js b/build/vite.js index 4f2703e88..b560e7921 100644 --- a/build/vite.js +++ b/build/vite.js @@ -47,6 +47,56 @@ export const BROWSER_HEADERS = Object.freeze({ 'X-Content-Type-Options': 'nosniff', }); +/** + * Content-Security-Policy for every `/api` response. API routes return data, + * never a document, so a response opened directly in a tab gets no origin and + * can load nothing. + */ +export const API_CSP = "default-src 'none'; sandbox"; + +/** Response headers every `/api` response carries. */ +export const API_HEADERS = Object.freeze({ + 'Content-Security-Policy': API_CSP, + 'X-Content-Type-Options': 'nosniff', +}); + +/** Whether a request path is an API route (`/api` or `/api/...`). */ +function isApiPath(url) { + const path = String(url || '/').split(/[?#]/, 1)[0]; + return path === '/api' || path.startsWith('/api/'); +} + +/** + * Vite plugin that sets API_HEADERS on every API response before any other + * middleware runs, so success, error, partial, refused and unknown-route + * answers all carry them. Vite's `server.headers` and `preview.headers` only + * reach the documents and assets Vite serves itself. A route may still add + * headers; a route's own Content-Security-Policy is sent as an additional + * policy, which can only restrict further, never replace this one. + */ +export function apiResponseHeadersPlugin() { + const install = (server) => { + server.middlewares.use((req, res, next) => { + if (!isApiPath(req.url)) return next(); + for (const [name, value] of Object.entries(API_HEADERS)) + res.setHeader(name, value); + const setHeader = res.setHeader.bind(res); + res.setHeader = (name, value) => + String(name).toLowerCase() === 'content-security-policy' && + String(value) !== API_CSP + ? setHeader(name, `${API_CSP}, ${value}`) + : setHeader(name, value); + next(); + }); + }; + return { + name: 'api-response-headers', + enforce: 'pre', + configureServer: install, + configurePreviewServer: install, + }; +} + /** Build browser assets with explicit inputs; never load environment or providers. */ export function createBrowserViteConfig({ plugins = [], @@ -61,7 +111,9 @@ export function createBrowserViteConfig({ } = {}) { return { plugins: [ - // First, so no provider route answers a Host the server does not allow. + // First, so every API response, including a Host refusal, carries them. + apiResponseHeadersPlugin(), + // Next, so no provider route answers a Host the server does not allow. hostCheckPlugin(), cesium(), applicationHtmlPlugin(), diff --git a/src/tooling/viteBuild.test.mjs b/src/tooling/viteBuild.test.mjs index e1eb1aecd..655b819d0 100644 --- a/src/tooling/viteBuild.test.mjs +++ b/src/tooling/viteBuild.test.mjs @@ -1,9 +1,11 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; +import { createServer, request } from 'node:http'; import { BROWSER_CSP, createBrowserViteConfig } from '../../build/vite.js'; import standaloneConfig, * as compatibility from '../../vite.config.js'; import * as providers from '../../server/providers/local.js'; +import { apiNotFoundPlugin } from '../../server/standalone/api-not-found.js'; test('explicit build inputs preserve browser-only defines, plugin order and loopback protections', () => { const plugin = { name: 'fixture-provider' }; @@ -12,10 +14,13 @@ test('explicit build inputs preserve browser-only defines, plugin order and loop googleApiKey: 'browser-fixture', cesiumToken: 'ion-fixture', }); - // The Host check runs before every other plugin's middleware. - assert.equal(config.plugins[0].name, 'host-check'); + // API response headers, then the Host check, run before every other + // plugin's middleware. + assert.equal(config.plugins[0].name, 'api-response-headers'); assert.equal(config.plugins[0].enforce, 'pre'); - assert.equal(config.plugins[3], plugin); + assert.equal(config.plugins[1].name, 'host-check'); + assert.equal(config.plugins[1].enforce, 'pre'); + assert.equal(config.plugins[4], plugin); assert.equal(config.server.host, 'localhost'); assert.equal(config.server.port, 4173); assert.deepEqual(config.server.allowedHosts, ['localhost', '127.0.0.1']); @@ -75,7 +80,7 @@ test('build helper does not discover environment values or construct local provi undefined, ); assert.deepEqual( - config.plugins.slice(3).map((plugin) => plugin.name), + config.plugins.slice(4).map((plugin) => plugin.name), ['embed-framing', 'panel-build'], ); } finally { @@ -89,7 +94,7 @@ test('root config retains existing named exports and standalone provider order', assert.equal(compatibility[name], value, name); const config = standaloneConfig({ mode: 'test' }); const standaloneProviders = config.plugins - .slice(3, -5) + .slice(4, -5) .map((plugin) => plugin.name); assert.equal( standaloneProviders.filter((name) => name === 'gemini-live-proxy').length, @@ -257,3 +262,137 @@ test('the CSP admits the event media embeds and the Maps JavaScript API, and no // X posts load in X's own frames. assert.ok(frames.includes('https://platform.twitter.com')); }); + +/** + * Serve plugins' middleware over real HTTP the way Vite's connect stack mounts + * it: in plugin order, a route prefix stripped from `req.url`. A request no + * middleware answers gets the app document stand-in. + */ +async function servePlugins(t, plugins, hook, config) { + const stack = []; + const server = { + config, + middlewares: { + use(route, handler) { + if (typeof route === 'function') + stack.push({ route: '', handler: route }); + else stack.push({ route, handler }); + }, + }, + }; + for (const plugin of plugins) plugin[hook]?.(server); + const http = createServer((req, res) => { + const original = req.url; + const path = original.split('?')[0]; + let index = 0; + const next = () => { + const layer = stack[index++]; + if (!layer) { + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end('app'); + return; + } + if ( + layer.route && + path !== layer.route && + !path.startsWith(`${layer.route}/`) + ) + return next(); + req.url = original.slice(layer.route.length) || '/'; + layer.handler(req, res, next); + }; + next(); + }); + await new Promise((resolve) => http.listen(0, '127.0.0.1', resolve)); + t.after(() => new Promise((resolve) => http.close(resolve))); + const { port } = http.address(); + return (path, host = `localhost:${port}`) => + new Promise((resolve, reject) => { + const req = request( + { host: '127.0.0.1', port, path, headers: { host } }, + (res) => { + res.resume(); + res.on('end', () => + resolve({ status: res.statusCode, headers: res.headers }), + ); + }, + ); + req.on('error', reject); + req.end(); + }); +} + +test('every API response carries the API policy and nosniff in dev and preview', async (t) => { + const policy = "default-src 'none'; sandbox"; + const install = (server) => { + server.middlewares.use('/api/fixture', (req, res) => { + const route = req.url.split('?')[0]; + if (route === '/ok') { + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end('{}'); + } else if (route === '/error') { + res.statusCode = 500; + res.setHeader('Content-Type', 'application/json'); + res.end('{"error":"fixture"}'); + } else if (route === '/partial') { + res.writeHead(206, { 'Content-Range': 'bytes 0-0/2' }); + res.end('x'); + } else if (route === '/own-policy') { + res.setHeader('Content-Security-Policy', "frame-ancestors 'none'"); + res.end('{}'); + } else { + res.writeHead(200, { 'Content-Security-Policy': 'default-src *' }); + res.end('{}'); + } + }); + }; + const fixture = { + name: 'fixture-provider', + configureServer: install, + configurePreviewServer: install, + }; + const built = createBrowserViteConfig({ plugins: [fixture] }); + const plugins = [ + ...built.plugins.filter( + (plugin) => + plugin === fixture || + ['api-response-headers', 'host-check'].includes(plugin.name), + ), + apiNotFoundPlugin(), + ]; + const config = { + server: { + allowedHosts: built.server.allowedHosts, + host: built.server.host, + }, + preview: { allowedHosts: built.server.allowedHosts }, + }; + for (const hook of ['configureServer', 'configurePreviewServer']) { + const get = await servePlugins(t, plugins, hook, config); + for (const [path, status, csp = policy, host] of [ + ['/api/fixture/ok', 200], + ['/api/fixture/error', 500], + ['/api/fixture/partial', 206], + ['/api/nope', 404], + ['/api', 404], + ['/api/fixture/ok?x=1', 200], + ['/api/fixture/ok', 403, policy, 'elsewhere.example'], + // A route's own policy is added to the API policy, never replaces it. + ['/api/fixture/own-policy', 200, `${policy}, frame-ancestors 'none'`], + ['/api/fixture/own-policy-head', 200, `${policy}, default-src *`], + ]) { + const res = await get(path, host); + const label = `${hook} ${path} ${host || ''}`; + assert.equal(res.status, status, label); + assert.equal(res.headers['content-security-policy'], csp, label); + assert.equal(res.headers['x-content-type-options'], 'nosniff', label); + } + // The app document and other paths are left to the server's own headers. + for (const path of ['/', '/apiary', '/src/api/x.js']) + assert.equal( + (await get(path)).headers['content-security-policy'], + undefined, + `${hook} ${path}`, + ); + } +}); From 0ad75095a777f471200226955585b6f5aa08cce3 Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Wed, 21 Oct 2026 15:07:20 -0700 Subject: [PATCH 35/45] Validate provider response formats CCTV frames and the Street View fallback accept only JPEG, PNG, GIF, WebP and AVIF, parsed from the media type essence and sent under the canonical type; any other type is cancelled and falls through to the next fallback as a failed upstream does. Live media must match its feed kind (video/mp4, video/webm, or multipart/x-mixed-replace with a boundary) before the camera is reported healthy or any byte is relayed, and its redirects now stay on the registered origin like frames. Every /api/cctv route uses the same-site gate. The GBFS proxy relays only bodies that parse as JSON, re-serialized under a fixed application/json type. --- scripts/package-boundaries.json | 2 + server/providers/cctv.js | 66 ++++++--- server/providers/cctv/media.js | 94 ++++++++++++- server/providers/gbfs.js | 17 ++- src/data/cctvMediaFeedType.test.mjs | 210 +++++++++++++++++++++++++++- src/data/cctvProxy.test.mjs | 54 +++++++ src/data/gbfsProxy.test.mjs | 58 ++++++++ 7 files changed, 468 insertions(+), 33 deletions(-) diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 65f79b332..9dc4bd27d 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -194,6 +194,8 @@ "exports": ["./server/providers/cctv"], "modules": [ "server/providers/cctv.js", + "server/providers/common/same-site.js", + "src/localRequestGate.mjs", "server/providers/cctv/cap.js", "server/providers/cctv/groundHeights.js", "server/providers/cctv/catalog.js", diff --git a/server/providers/cctv.js b/server/providers/cctv.js index e549753e8..1f1262709 100644 --- a/server/providers/cctv.js +++ b/server/providers/cctv.js @@ -6,6 +6,8 @@ import { } from './cctv/normalize.js'; import { buildSyntheticCctvSvg, + cctvLiveMediaType, + cctvRasterImageType, proxyMediaResponse, fetchCctvImageFromUpstream, fetchTxdotSnapshot, @@ -17,6 +19,7 @@ import { CCTV_MAX_SOURCES_CEILING, } from './cctv/constants.js'; import { sanitizeCctvRangeHeader } from './cctv/range.js'; +import { admitSameSite } from './common/same-site.js'; import { createHlsPuller } from './cctv/stream.js'; import { googleServerApiKey } from './places/google-key.js'; export { CCTV_FRAME_FETCH_TIMEOUT_MS, fetchCctvImageFromUpstream }; @@ -116,8 +119,15 @@ export function cctvProxy({ sourceRoot = process.cwd() } = {}) { headers: { 'User-Agent': 'gods-eye-view-cctv-proxy/1.0' }, signal: AbortSignal.timeout(CCTV_FRAME_FETCH_TIMEOUT_MS), }); - const svType = svResp.headers.get('content-type') || ''; - if (!svResp.ok || !svType.startsWith('image/')) return null; + const svType = cctvRasterImageType(svResp.headers.get('content-type')); + if (!svResp.ok || !svType) { + try { + await svResp.body?.cancel(); + } catch { + /* no-op */ + } + return null; + } return { ok: true, @@ -135,11 +145,13 @@ export function cctvProxy({ sourceRoot = process.cwd() } = {}) { }); server.middlewares.use('/api/cctv', async (req, res) => { try { + const url = new URL(req.url || '/', 'http://localhost'); + // Refuse cross-site requests before any catalog or upstream work. + if (admitSameSite(req, res)) return; const sources = await getCctvSources(); const sourceById = new Map( sources.map((source) => [source.id, source]), ); - const url = new URL(req.url || '/', 'http://localhost'); if (url.pathname === '/sources') { const body = { @@ -217,8 +229,8 @@ export function cctvProxy({ sourceRoot = process.cwd() } = {}) { const mediaUrl = source?.url || ''; const feedType = normalizeFeedType(source?.feedType || 'image'); // Live feeds only. A still camera is served by /frame, whose fetch - // keeps redirects on the registered origin, accepts only image/* and - // caps the body; relaying it here would bypass all three. + // keeps redirects on the registered origin, accepts only raster + // images and caps the body; relaying it here would bypass all three. if (!isVideoFeedType(feedType) && feedType !== 'mjpeg') { res.writeHead(404, { 'Content-Type': 'application/json', @@ -382,7 +394,6 @@ export function cctvProxy({ sourceRoot = process.cwd() } = {}) { } return; } - const contentType = upstream.headers.get('content-type') || ''; if (!upstream.ok) { try { await upstream.body?.cancel(); @@ -407,31 +418,42 @@ export function cctvProxy({ sourceRoot = process.cwd() } = {}) { return; } - if ( - isVideoFeedType(feedType) && - !( - contentType.startsWith('video/') || - contentType.includes('mpegurl') - ) - ) { + // The relayed type is the feed kind's own, checked before the + // camera counts as healthy and before any byte is relayed. + const contentType = cctvLiveMediaType( + feedType, + upstream.headers.get('content-type'), + ); + if (!contentType) { + try { + await upstream.body?.cancel(); + } catch { + /* already closed */ + } setHealth(cameraId, { status: 'degraded', sourceKind: 'upstream', label: source?.provider || 'Configured source', - message: `Unexpected media type ${contentType || 'unknown'}`, + message: 'Unexpected media type', }); - } else { - setHealth(cameraId, { - status: 'ok', - sourceKind: isVideoFeedType(feedType) ? 'live' : 'snapshot', - label: source?.provider || 'Configured source', - message: isVideoFeedType(feedType) - ? 'Live stream connected' - : 'Snapshot feed connected', + res.writeHead(502, { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-store', }); + res.end(JSON.stringify({ error: 'Media proxy failed' })); + return; } + setHealth(cameraId, { + status: 'ok', + sourceKind: isVideoFeedType(feedType) ? 'live' : 'snapshot', + label: source?.provider || 'Configured source', + message: isVideoFeedType(feedType) + ? 'Live stream connected' + : 'Snapshot feed connected', + }); await proxyMediaResponse(res, upstream, { + contentType, sourceHeader: isVideoFeedType(feedType) ? 'live-media' : 'upstream-image', diff --git a/server/providers/cctv/media.js b/server/providers/cctv/media.js index 549e6cf06..fdb2a2176 100644 --- a/server/providers/cctv/media.js +++ b/server/providers/cctv/media.js @@ -93,6 +93,73 @@ export function toReadable(body) { return null; } +/** + * Split a Content-Type value into its lower-case essence and parameters. + * + * @param {string|null|undefined} value + * @returns {{essence:string,params:Map}|null} Null when the + * value is missing or is not a `type/subtype` media type. + */ +export function parseMediaType(value) { + const [head, ...rest] = String(value ?? '').split(';'); + const essence = head.trim().toLowerCase(); + if (!/^[a-z0-9!#$&^_.+-]+\/[a-z0-9!#$&^_.+-]+$/.test(essence)) return null; + const params = new Map(); + for (const part of rest) { + const eq = part.indexOf('='); + if (eq <= 0) continue; + const name = part.slice(0, eq).trim().toLowerCase(); + let paramValue = part.slice(eq + 1).trim(); + if (/^".*"$/.test(paramValue)) paramValue = paramValue.slice(1, -1); + if (name && !params.has(name)) params.set(name, paramValue); + } + return { essence, params }; +} + +/** Still-image types a camera frame may be served as. */ +const CCTV_RASTER_IMAGE_TYPES = new Set([ + 'image/jpeg', + 'image/png', + 'image/gif', + 'image/webp', + 'image/avif', +]); + +/** + * The canonical type of a raster camera frame, or null for any other type. + * + * @param {string|null|undefined} contentType + * @returns {string|null} + */ +export function cctvRasterImageType(contentType) { + const essence = parseMediaType(contentType)?.essence; + return CCTV_RASTER_IMAGE_TYPES.has(essence) ? essence : null; +} + +/** + * The type to relay a live feed as, or null when the upstream type does not + * match the feed kind. MJPEG keeps its part boundary, without which the body + * cannot be split into frames. + * + * @param {string} feedType - Normalized feed type (mp4, webm or mjpeg). + * @param {string|null|undefined} contentType + * @returns {string|null} + */ +export function cctvLiveMediaType(feedType, contentType) { + const parsed = parseMediaType(contentType); + if (!parsed) return null; + if (feedType === 'mp4' || feedType === 'webm') + return parsed.essence === `video/${feedType}` ? parsed.essence : null; + if (feedType !== 'mjpeg' || parsed.essence !== 'multipart/x-mixed-replace') + return null; + const boundary = parsed.params.get('boundary') || ''; + if (!/^[0-9A-Za-z'()+_,./:=? -]{0,69}[0-9A-Za-z'()+_,./:=?-]$/.test(boundary)) + return null; + return /^[0-9A-Za-z'+_.-]+$/.test(boundary) + ? `multipart/x-mixed-replace; boundary=${boundary}` + : `multipart/x-mixed-replace; boundary="${boundary}"`; +} + /** * Pipe an upstream fetch Response (image or video) to the client HTTP response. * @@ -104,6 +171,8 @@ export function toReadable(body) { * @param {Response} upstream - fetch() Response object. * @param {object} [opts] * @param {string} [opts.sourceHeader='upstream'] - Value for X-CCTV-Source header. + * @param {string} [opts.contentType] - Validated type to send instead of the + * upstream's own. * @param {number} [opts.idleTimeoutMs=CCTV_MEDIA_IDLE_TIMEOUT_MS] - Silence * allowed between upstream chunks before the stream is released. Injectable * only to keep the deadline unit-testable. @@ -114,10 +183,10 @@ export async function proxyMediaResponse( { sourceHeader = 'upstream', idleTimeoutMs = CCTV_MEDIA_IDLE_TIMEOUT_MS, + contentType = upstream.headers.get('content-type') || + 'application/octet-stream', } = {}, ) { - const contentType = - upstream.headers.get('content-type') || 'application/octet-stream'; const cacheControl = upstream.headers.get('cache-control') || 'no-store'; const contentLength = upstream.headers.get('content-length'); const contentRange = upstream.headers.get('content-range'); @@ -340,7 +409,14 @@ export async function fetchCctvMediaUpstream( if (downstream?.aborted) controller.abort(); else downstream?.addEventListener?.('abort', onDownstreamAbort); try { - return await fetchImpl(url, { headers, signal: controller.signal }); + // Redirects stay on the registered origin, as for frames. + const upstream = await fetchWithinHost( + url, + { headers, signal: controller.signal }, + fetchImpl, + ); + if (!upstream) throw new Error('Media redirect refused'); + return upstream; } finally { clearTimeout(timeoutId); downstream?.removeEventListener?.('abort', onDownstreamAbort); @@ -543,9 +619,15 @@ export async function fetchCctvImageFromUpstream( fetchImpl, ); if (!upstream) return null; - const contentType = upstream.headers.get('content-type') || ''; - if (!upstream.ok || !contentType.startsWith('image/')) { - controller.abort(); + const contentType = cctvRasterImageType( + upstream.headers.get('content-type'), + ); + if (!upstream.ok || !contentType) { + try { + await upstream.body?.cancel(); + } catch { + /* no-op */ + } return null; } const body = await readCappedResponseBytes(upstream, maxBytes); diff --git a/server/providers/gbfs.js b/server/providers/gbfs.js index c6e3ba4ec..7594bc1bf 100644 --- a/server/providers/gbfs.js +++ b/server/providers/gbfs.js @@ -236,13 +236,26 @@ export function gbfsProxy({ ratePerMinute = GBFS_RATE_PER_MIN } = {}) { } const upstream = await fetchGbfsUpstream(upstreamUrl.toString()); + // Only JSON is relayed, re-serialized under a fixed type: neither the + // upstream's text nor its declared type reaches the browser. + let payload; + try { + payload = JSON.parse(upstream.body); + } catch { + res.writeHead(502, { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-store', + }); + res.end(JSON.stringify({ error: 'GBFS upstream returned non-JSON' })); + return; + } res.writeHead(upstream.status, { - 'Content-Type': upstream.contentType, + 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': gbfsCacheControl(upstreamUrl.pathname), 'X-GBFS-Upstream': upstreamUrl.hostname, 'X-GBFS-Cache': 'MISS', }); - res.end(upstream.body); + res.end(JSON.stringify(payload)); } catch (error) { if (error?.name === 'AbortError') { res.writeHead(504, { diff --git a/src/data/cctvMediaFeedType.test.mjs b/src/data/cctvMediaFeedType.test.mjs index 5791e433b..532f1ae45 100644 --- a/src/data/cctvMediaFeedType.test.mjs +++ b/src/data/cctvMediaFeedType.test.mjs @@ -33,6 +33,14 @@ const VIDEO = { feedType: 'video', url: 'https://cams.upstream.invalid/live.mp4', }; +const WEBM = { + id: 'webm-fixture', + name: 'WebM fixture', + lat: 30.27, + lon: -97.74, + feedType: 'webm', + url: 'https://cams.upstream.invalid/live.webm', +}; const MJPEG = { id: 'mjpeg-fixture', name: 'MJPEG fixture', @@ -69,7 +77,10 @@ function recordingResponse() { body: '', writeHead(status, headers) { res.statusCode = status; - res.headers = headers || {}; + res.headers = { ...res.headers, ...headers }; + }, + setHeader(name, value) { + res.headers[name] = value; }, write(chunk) { chunks.push(Buffer.from(chunk)); @@ -105,6 +116,7 @@ function mount(t, respond) { STILL, STILL_ALIAS, VIDEO, + WEBM, MJPEG, ]); process.env.CCTV_SOURCES_FILE = 'absent-source-file.json'; @@ -143,9 +155,9 @@ function mount(t, respond) { }); assert.ok(handler, 'the CCTV provider must mount a middleware'); - const call = async (path) => { + const call = async (path, headers = {}) => { const { res, done } = recordingResponse(); - await handler({ url: path, headers: {}, method: 'GET', on() {} }, res); + await handler({ url: path, headers, method: 'GET', on() {} }, res); await done; return res; }; @@ -268,3 +280,195 @@ test('/frame does not follow a still camera off its origin', async (t) => { [STILL.url], ); }); + +/** An upstream Response whose body records whether it was cancelled. */ +function trackedUpstream({ status = 200, headers = {}, body = 'payload' }) { + const state = { cancelled: false }; + const response = new Response( + new ReadableStream( + { + pull(controller) { + controller.enqueue(new TextEncoder().encode(body)); + controller.close(); + }, + cancel() { + state.cancelled = true; + }, + }, + { highWaterMark: 0 }, + ), + { status, headers }, + ); + return { response, state }; +} + +test('/media refuses an upstream type that does not match the feed kind', async (t) => { + let current; + const app = mount(t, () => current.response); + for (const [camera, contentType, body] of [ + [VIDEO, 'text/html', '

x

'], + [VIDEO, 'image/svg+xml', ''], + [VIDEO, 'application/vnd.apple.mpegurl', '#EXTM3U'], + [VIDEO, 'video/webm', 'video'], + [VIDEO, undefined, 'video'], + [WEBM, 'video/mp4', 'video'], + [MJPEG, 'multipart/x-mixed-replace', '--frame'], + [MJPEG, 'multipart/x-mixed-replace; boundary=', '--frame'], + [MJPEG, 'image/jpeg', 'jpeg'], + [MJPEG, 'text/html; boundary=frame', '

x

'], + ]) { + current = trackedUpstream({ + headers: contentType === undefined ? {} : { 'content-type': contentType }, + body, + }); + const label = `${camera.id}: ${contentType}`; + const res = await app.call(`/media/${camera.id}`); + assert.equal(res.statusCode, 502, label); + assert.equal(res.headers['Content-Type'], 'application/json', label); + assert.deepEqual(JSON.parse(res.body), { error: 'Media proxy failed' }); + assert.equal(current.state.cancelled, true, `${label}: upstream cancelled`); + const health = await app.health(camera.id); + assert.equal(health.status, 'degraded', label); + assert.equal(health.message, 'Unexpected media type', label); + } +}); + +test('/media relays each feed kind under its canonical type, including a partial response', async (t) => { + let current; + const app = mount(t, () => current); + for (const [camera, upstream, expected] of [ + [ + VIDEO, + { 'content-type': 'Video/MP4; codecs="avc1.42E01E"' }, + 'video/mp4', + ], + [ + VIDEO, + { + 'content-type': 'video/mp4', + 'content-range': 'bytes 0-4/100', + 'content-length': '5', + 'accept-ranges': 'bytes', + }, + 'video/mp4', + ], + [WEBM, { 'content-type': 'video/webm' }, 'video/webm'], + [ + MJPEG, + { 'content-type': 'multipart/x-mixed-replace;boundary="frame"' }, + 'multipart/x-mixed-replace; boundary=frame', + ], + [ + MJPEG, + { 'content-type': 'multipart/x-mixed-replace; boundary="a b"' }, + 'multipart/x-mixed-replace; boundary="a b"', + ], + ]) { + const status = upstream['content-range'] ? 206 : 200; + current = upstreamResponse({ status, headers: upstream, body: 'bytes' }); + const res = await app.call(`/media/${camera.id}`); + assert.equal(res.statusCode, status, camera.id); + assert.equal(res.headers['Content-Type'], expected); + assert.equal(res.body, 'bytes'); + if (status === 206) + assert.equal(res.headers['Content-Range'], 'bytes 0-4/100'); + assert.equal((await app.health(camera.id)).status, 'ok'); + } +}); + +test('/media does not follow a live camera off its origin', async (t) => { + const app = mount(t, ({ url }) => + url === VIDEO.url + ? upstreamResponse({ + status: 302, + headers: { location: 'https://elsewhere.invalid/live.mp4' }, + body: '', + }) + : upstreamResponse({ + headers: { 'content-type': 'video/mp4' }, + body: 'elsewhere', + }), + ); + const res = await app.call(`/media/${VIDEO.id}`); + assert.equal(res.statusCode, 502); + assert.doesNotMatch(res.body, /elsewhere/); + assert.deepEqual(app.requests, [{ url: VIDEO.url, redirect: 'manual' }]); +}); + +test('every CCTV route refuses cross-site requests and admits the app itself', async (t) => { + const app = mount(t, ({ url }) => + upstreamResponse({ + headers: { + 'content-type': url === VIDEO.url ? 'video/mp4' : 'image/jpeg', + }, + body: 'bytes', + }), + ); + const host = 'localhost:5173'; + const paths = [ + '/sources', + '/health', + `/stream/${STILL.id}`, + `/frame/${STILL.id}`, + `/media/${VIDEO.id}`, + ]; + for (const headers of [ + { host, 'sec-fetch-site': 'cross-site' }, + { host, 'sec-fetch-site': 'same-site' }, + { host, origin: 'https://elsewhere.example' }, + { host, origin: 'null' }, + ]) + for (const path of paths) { + const res = await app.call(path, headers); + assert.equal(res.statusCode, 403, `${path} ${JSON.stringify(headers)}`); + } + assert.deepEqual(app.requests, [], 'a refused request reached an upstream'); + for (const headers of [ + { host, 'sec-fetch-site': 'same-origin' }, + { host, origin: `http://${host}` }, + {}, + ]) { + const frame = await app.call(`/frame/${STILL.id}`, headers); + assert.equal(frame.statusCode, 200); + assert.equal(frame.headers['X-CCTV-Source'], 'upstream-image'); + const media = await app.call(`/media/${VIDEO.id}`, headers); + assert.equal(media.statusCode, 200); + assert.equal(media.headers['Content-Type'], 'video/mp4'); + } +}); + +test('/frame falls back past a non-raster upstream and Street View frame', async (t) => { + let streetViewType; + const app = mount(t, ({ url }) => + url.startsWith('https://maps.googleapis.com/') + ? trackedUpstream({ + headers: + streetViewType === undefined + ? {} + : { 'content-type': streetViewType }, + body: 'street-view', + }).response + : upstreamResponse({ + headers: { 'content-type': 'image/svg+xml' }, + body: '', + }), + ); + process.env.GOOGLE_MAPS_SERVER_API_KEY = 'fixture-key'; + for (const type of [ + 'image/svg+xml', + 'text/html', + 'application/xml', + undefined, + ]) { + streetViewType = type; + const res = await app.call(`/frame/${STILL.id}`); + assert.equal(res.statusCode, 200); + assert.equal(res.headers['X-CCTV-Source'], 'synthetic', String(type)); + assert.doesNotMatch(res.body, /street-view/); + } + streetViewType = 'image/JPEG; charset=x'; + const res = await app.call(`/frame/${STILL.id}`); + assert.equal(res.headers['X-CCTV-Source'], 'streetview'); + assert.equal(res.headers['Content-Type'], 'image/jpeg'); + assert.equal(res.body, 'street-view'); +}); diff --git a/src/data/cctvProxy.test.mjs b/src/data/cctvProxy.test.mjs index 54a5d09db..f197c9a97 100644 --- a/src/data/cctvProxy.test.mjs +++ b/src/data/cctvProxy.test.mjs @@ -259,3 +259,57 @@ test('rejected snapshot responses abort the upstream download', async () => { assert.equal(signal.aborted, true); } }); + +test('CCTV upstream frame fetch accepts only raster image types and sends their canonical type', async () => { + const frame = (contentType, body = 'frame') => { + const state = { cancelled: false }; + const headers = contentType === null ? {} : { 'Content-Type': contentType }; + const response = new Response(new ReadableStream({ + pull(controller) { + controller.enqueue(new TextEncoder().encode(body)); + controller.close(); + }, + cancel() { + state.cancelled = true; + }, + }, { highWaterMark: 0 }), { status: 200, headers }); + return { response, state }; + }; + for (const [contentType, canonical] of [ + ['image/jpeg', 'image/jpeg'], + ['image/JPEG; charset=x', 'image/jpeg'], + [' Image/PNG ', 'image/png'], + ['image/gif', 'image/gif'], + ['image/webp;q=1', 'image/webp'], + ['image/avif', 'image/avif'], + ]) { + const { response } = frame(contentType); + const result = await fetchCctvImageFromUpstream('https://example.com/frame.jpg', { + fetchImpl: async () => response, + }); + assert.equal(result?.contentType, canonical, contentType); + assert.equal(result.body.toString(), 'frame'); + } + for (const [contentType, body] of [ + ['image/svg+xml', ''], + ['Image/SVG+XML; charset=utf-8', ''], + ['text/html', '

x

'], + ['text/html; charset=utf-8', '

x

'], + ['application/xml', ''], + ['text/xml', ''], + [null, 'frame'], + ['', 'frame'], + ['image', 'frame'], + ['image/', 'frame'], + ['image/jpeg/x', 'frame'], + ['image/jpeg, text/html', 'frame'], + ['application/octet-stream', 'frame'], + ]) { + const { response, state } = frame(contentType, body); + const result = await fetchCctvImageFromUpstream('https://example.com/frame.jpg', { + fetchImpl: async () => response, + }); + assert.equal(result, null, String(contentType)); + assert.equal(state.cancelled, true, `${contentType}: body cancelled`); + } +}); diff --git a/src/data/gbfsProxy.test.mjs b/src/data/gbfsProxy.test.mjs index c95256137..d8c8e5fc3 100644 --- a/src/data/gbfsProxy.test.mjs +++ b/src/data/gbfsProxy.test.mjs @@ -304,3 +304,61 @@ test('GBFS rejects redirects and caps bodies through both server hooks', async ( globalThis.fetch = originalFetch; } }); + +test('GBFS relays only JSON, re-serialized under a fixed type, through both server hooks', async () => { + const { gbfsProxy } = await import('../../server/providers/gbfs.js'); + const originalFetch = globalThis.fetch; + try { + for (const hook of ['configureServer', 'configurePreviewServer']) { + let handler; + gbfsProxy()[hook]({ + middlewares: { + use(_path, callback) { + handler = callback; + }, + }, + }); + const request = async (response) => { + globalThis.fetch = async () => response; + const res = {}; + await handler( + { method: 'GET', url: '/' + encodeURIComponent(STATION_URL) }, + { + writeHead(code, headers) { + Object.assign(res, { status: code, headers }); + }, + end(value) { + res.body = value; + }, + }, + ); + return res; + }; + for (const [contentType, body] of [ + ['text/html', '

x

'], + ['application/json', '

x

'], + ['image/svg+xml', ''], + ['application/json', ''], + ]) { + const res = await request( + new Response(body, { headers: { 'Content-Type': contentType } }), + ); + assert.equal(res.status, 502, `${hook}: ${contentType} ${body}`); + assert.equal(res.headers['Content-Type'], 'application/json'); + assert.equal(typeof JSON.parse(res.body).error, 'string'); + assert.doesNotMatch(res.body, /doctype|svg/); + } + const res = await request( + new Response(' { "data" : { "stations" : [] } } ', { + headers: { 'Content-Type': 'text/html; charset=iso-8859-1' }, + }), + ); + assert.equal(res.status, 200); + assert.equal(res.headers['Content-Type'], 'application/json; charset=utf-8'); + assert.equal(res.headers['Cache-Control'], 'no-store'); + assert.equal(res.body, STATION_BODY); + } + } finally { + globalThis.fetch = originalFetch; + } +}); From 3e80afe7139f34a121c4d9f2ab1582f6bb59a8fe Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Wed, 21 Oct 2026 15:07:40 -0700 Subject: [PATCH 36/45] Pin camera sources by parsed URL Camera catalog image URLs were pinned by string prefix, so a URL that only began with the agency's directory before dot segments or an encoded separator were resolved still counted as inside it. The pin now parses the URL and requires the same scheme, the exact host, no credentials, the default port and a normalized path inside the pinned directory. Redirects on a pinned host must stay inside the same directory. Document the response format checks and API response headers alongside the existing server hardening notes. --- SECURITY.md | 2 + .../0000-provider-response-hardening.md | 1 + docs/CURRENT-STATE.md | 16 +++ scripts/format-scope.json | 1 + server/providers/cctv/media.js | 45 +++++++- server/providers/cctv/normalize.js | 33 ++++++ server/providers/cctv/sources.js | 68 ++++++----- src/data/cctvSourcePins.test.mjs | 106 ++++++++++++++++++ 8 files changed, 241 insertions(+), 31 deletions(-) create mode 100644 changelog.d/0000-provider-response-hardening.md create mode 100644 src/data/cctvSourcePins.test.mjs diff --git a/SECURITY.md b/SECURITY.md index 30203ed94..9d4feb6d8 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -69,6 +69,8 @@ The data proxies under `server/providers/` are written so the browser cannot tur - **No verbatim client headers upstream.** The CCTV media route is the one route that relays a request header (`Range`, for video seeking). It is parsed and canonicalized before it is forwarded: one `bytes=` range only, with every accepted form — explicit span, open-ended and suffix — bounded to the same 64 MiB ceiling the relay applies to a declared response body. Multi-range, malformed, inverted and non-`bytes` values are dropped and the request proceeds without a `Range`, as RFC 7233 §3.1 prescribes. Bounding the request bounds what is asked for: a response that declares no length — live streamed media, or a chunked body from an upstream that ignores the `Range` — has no ceiling. An upstream request the browser has stopped waiting for is cancelled rather than left running, whether the viewer leaves before the headers arrive or during the body. - **Transit fetches registered feeds only.** `/api/transit/vehicles/` resolves the id against `src/data/transitFeeds.js`; the browser never supplies a URL, and a feed that is registered but disabled does not resolve at all. Redirects are followed manually and each hop is validated against the feed's own https origin before it is requested, so an off-origin or downgraded hop is refused rather than contacted. Bodies are capped at 8 MB, the protobuf is decoded server-side under entity-count and string-length ceilings, a differential feed is refused, and snapshots live 15 s in memory with no disk cache. A per-feed admission limiter and a failure cooldown ladder bound what this process can ask of any operator. - **Local receiver feeds are operator-configured and local-only.** `/api/local-receivers/aircraft` reads only the `aircraft.json` URLs in the server's `LOCAL_RECEIVER_FEEDS`; the browser never supplies an address. Each host must pass the shared tap address rule (`src/data/tapAddress.js`: loopback, RFC1918, `localhost`, `*.local`; no link-local, IPv6 or other names), the scheme must be http(s), the path must end in `aircraft.json`, and credentials, queries and fragments are refused. Invalid entries are logged at startup and never fetched. Reads use a 2 s timeout, refuse redirects, cap bodies at 2 MB and share one read per second; responses name each feed by band only and never carry upstream error text. +- **Validated response formats.** Proxied bodies are relayed only in the format the route serves. CCTV frames and the Street View fallback accept JPEG, PNG, GIF, WebP and AVIF only, sent under their canonical type; any other type falls through to the next fallback. Live CCTV media must match its feed kind (`video/mp4`, `video/webm`, or `multipart/x-mixed-replace` with a boundary) before it is relayed or the camera counts as healthy, and its redirects stay on the registered origin. GBFS bodies must parse as JSON and are re-serialized as `application/json; charset=utf-8`. Camera catalog URLs are pinned by parsed URL — scheme, exact host, no credentials, default port, and a normalized path inside the agency's image directory — and a redirect on a pinned host must stay inside the same directory. Every `/api/cctv` route uses the cross-site gate below. +- **Consistent API response headers.** Every `/api` response, including errors, partial content, Host refusals and unknown routes, carries `Content-Security-Policy: default-src 'none'; sandbox` and `X-Content-Type-Options: nosniff` (`apiResponseHeadersPlugin` in `build/vite.js`, installed ahead of the Host check). A route that sets its own policy adds it as a further policy; it never replaces this one. - **Response-size caps and timeouts** on proxied responses. - **Sanitized errors** — internal error details are not echoed back to clients. - **Coalesced OAuth refresh** and cached successful responses only (OpenSky). diff --git a/changelog.d/0000-provider-response-hardening.md b/changelog.d/0000-provider-response-hardening.md new file mode 100644 index 000000000..bddf3bb41 --- /dev/null +++ b/changelog.d/0000-provider-response-hardening.md @@ -0,0 +1 @@ +- Validate provider response formats, strengthen camera source checks, and apply consistent API response protections (samehkhamis). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 7df2e0863..efedf3508 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -30,6 +30,15 @@ time. This clears obsolete contacts and settles startup without manufacturing position timestamps. Stale, incomplete and malformed empty results retain the existing recovery behavior. +Every `/api` response on the dev and preview servers carries +`Content-Security-Policy: default-src 'none'; sandbox` and +`X-Content-Type-Options: nosniff`. `apiResponseHeadersPlugin` sets them ahead of +the Host check, so errors, partial responses, Host refusals and unknown routes +are covered too; a route's own policy is sent as an additional policy, never in +place of it. The app document's policy is unchanged. The GBFS proxy relays only +bodies that parse as JSON, re-serialized as `application/json; charset=utf-8`; +anything else answers 502. + Catalog source contracts and their consuming layers are declared in `src/app/sourceComposition.js`. Omitted or null acquisition sources preserve layer registration and serialization, report unavailable, and are refused by the existing @@ -812,6 +821,13 @@ standalone entry supplies application-owned scene, ground and activation service Each layer owns its state and visibility listener; destruction cancels source reads and pending initialization. Malformed health responses retain prior health. Existing catalog fallback, camera poses, frame pacing and coverage controls remain. +CCTV frames and the Street View fallback accept only JPEG, PNG, GIF, WebP and +AVIF, sent under the canonical type; any other type falls through to the next +fallback. Live media must match its feed kind (`video/mp4`, `video/webm`, or +`multipart/x-mixed-replace` with a boundary) before health reports it connected, +and follows redirects only on the camera's origin. Catalog image URLs, and +redirects on those hosts, are pinned by parsed URL to the agency's image +directory. Every `/api/cctv` route uses the same-site gate. Traffic owns its rendered-surface observer only while enabled, removes it on disable/destroy, and caches surface identity without allocating on unchanged frames. diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 05842f6a5..bfab00fde 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -121,6 +121,7 @@ "server/providers/cctv/normalize.js", "src/data/cctvMissingNumbers.test.mjs", "server/providers/cctv/sources.js", + "src/data/cctvSourcePins.test.mjs", "server/providers/radio.js", "server/providers/radio/catalog.js", "server/providers/radio/constants.js", diff --git a/server/providers/cctv/media.js b/server/providers/cctv/media.js index fdb2a2176..1323bc841 100644 --- a/server/providers/cctv/media.js +++ b/server/providers/cctv/media.js @@ -1,13 +1,21 @@ import { Readable } from 'node:stream'; -import { hashSeed, escapeXml } from './normalize.js'; +import { hashSeed, escapeXml, pinnedCameraUrl } from './normalize.js'; import { + CALGARY_IMAGE_ORIGIN, CCTV_FRAME_FETCH_TIMEOUT_MS, CCTV_FRAME_MAX_BODY_BYTES, CCTV_MEDIA_FETCH_TIMEOUT_MS, CCTV_MEDIA_IDLE_TIMEOUT_MS, CCTV_MEDIA_MAX_BODY_BYTES, + HK_IMAGE_ORIGIN, + KING_COUNTY_IMAGE_ORIGIN, NSW_IMAGE_ORIGIN, NSW_IMAGE_USER_AGENT, + TALLINN_IMAGE_ORIGIN, + TARKTEE_IMAGE_ORIGIN, + TFL_IMAGE_ORIGIN, + WARENDORF_IMAGE_ORIGINS, + WSDOT_IMAGE_ORIGIN, } from './constants.js'; /** * Generate a synthetic SVG billboard image for a CCTV camera placeholder. @@ -504,9 +512,40 @@ export async function fetchTxdotSnapshot( /** Redirect hops the frame path will follow, and only within the same host. */ const MAX_SAME_HOST_REDIRECTS = 2; +/** + * Directories camera catalogs are pinned to, by host. A redirect on one of + * these hosts must stay inside the pinned directory too, so a same-origin + * redirect cannot leave it (another bucket on a shared storage host). + */ +const CCTV_PINNED_PREFIXES_BY_HOST = new Map(); +for (const prefix of [ + TFL_IMAGE_ORIGIN, + TALLINN_IMAGE_ORIGIN, + TARKTEE_IMAGE_ORIGIN, + ...WARENDORF_IMAGE_ORIGINS, + NSW_IMAGE_ORIGIN, + CALGARY_IMAGE_ORIGIN, + HK_IMAGE_ORIGIN, + KING_COUNTY_IMAGE_ORIGIN, + WSDOT_IMAGE_ORIGIN, +]) { + const host = new URL(prefix).hostname; + CCTV_PINNED_PREFIXES_BY_HOST.set(host, [ + ...(CCTV_PINNED_PREFIXES_BY_HOST.get(host) || []), + prefix, + ]); +} + +/** Whether a redirect target stays inside its host's pinned directory. */ +function withinPinnedPrefix(url) { + const prefixes = CCTV_PINNED_PREFIXES_BY_HOST.get(url.hostname); + return !prefixes || prefixes.some((p) => pinnedCameraUrl(url.href, p)); +} + /** * Fetch a registered frame URL following redirects ONLY within the original - * origin (scheme, host and port; at most MAX_SAME_HOST_REDIRECTS hops). + * origin (scheme, host and port; at most MAX_SAME_HOST_REDIRECTS hops) and, + * on a pinned camera host, within its pinned directory. * Default redirect-following would let an upstream steer a host-pinned * request, and its host-specific headers, to any origin, another port, or a * plaintext downgrade. @@ -547,7 +586,7 @@ export async function fetchWithinHost(url, init, fetchImpl = fetch) { } catch { return null; } - if (next.origin !== origin) return null; + if (next.origin !== origin || !withinPinnedPrefix(next)) return null; current = next; } return null; diff --git a/server/providers/cctv/normalize.js b/server/providers/cctv/normalize.js index 0f84fc3e1..dd1a84516 100644 --- a/server/providers/cctv/normalize.js +++ b/server/providers/cctv/normalize.js @@ -659,3 +659,36 @@ export function isLikelyTorontoCoordinate(lat, lon) { lon <= -79.1 ); } + +/** + * A camera URL under a pinned directory, by parsed URL rather than string + * prefix: the same scheme and exact host as `prefix`, no credentials, the + * default port, and a normalized path inside the prefix's directory. Dot + * segments (including encoded ones) are resolved before the path is compared, + * and an encoded slash or backslash is refused. + * + * @param {string} raw - Camera URL from a catalog or redirect. + * @param {string} prefix - Pinned origin and directory, ending in `/`. + * @returns {string|null} The normalized URL, or null when it is not pinned. + */ +export function pinnedCameraUrl(raw, prefix) { + let url; + let pin; + try { + url = new URL(String(raw ?? '').trim()); + pin = new URL(prefix); + } catch { + return null; + } + if ( + url.protocol !== pin.protocol || + url.hostname !== pin.hostname || + url.username || + url.password || + url.port || + !url.pathname.startsWith(pin.pathname) || + /%2f|%5c|\\/i.test(url.pathname) + ) + return null; + return url.href; +} diff --git a/server/providers/cctv/sources.js b/server/providers/cctv/sources.js index fbd9cb99d..114a91979 100644 --- a/server/providers/cctv/sources.js +++ b/server/providers/cctv/sources.js @@ -149,6 +149,7 @@ import { cameraDisplayCode, rowArrayToObject, prioritizeSources, + pinnedCameraUrl, } from './normalize.js'; import { directionToHeading } from '../../../src/data/directionText.js'; import { @@ -310,9 +311,12 @@ export async function loadCaltransSourcesFromOpenData() { const lon = toFiniteNumber(loc.longitude); if (!Number.isFinite(lat) || !Number.isFinite(lon)) continue; - const imageUrl = String(cctv.imageData?.static?.currentImageURL || ''); // Official-host pin (see JSDoc). Also drops records with no still image. - if (!imageUrl.startsWith('https://cwwp2.dot.ca.gov/')) continue; + const imageUrl = pinnedCameraUrl( + cctv.imageData?.static?.currentImageURL, + 'https://cwwp2.dot.ca.gov/', + ); + if (!imageUrl) continue; const locationName = String(loc.locationName || '').trim(); // Leading token of locationName is the stable camera code ("TV102 -- I-580 : …"). @@ -417,8 +421,8 @@ export async function loadTflSourcesFromOpenData() { const lat = toFiniteNumber(place?.lat); const lon = toFiniteNumber(place?.lon); if (!Number.isFinite(lat) || !Number.isFinite(lon)) continue; - const imageUrl = String(props.imageUrl || ''); - if (!imageUrl.startsWith(TFL_IMAGE_ORIGIN)) continue; // official-bucket pin + const imageUrl = pinnedCameraUrl(props.imageUrl, TFL_IMAGE_ORIGIN); + if (!imageUrl) continue; // official-bucket pin // "JamCams_00002.00865" → "tfl-00002.00865" (provider-stable id). const rawId = String(place?.id || '').replace(/^JamCams_/, ''); @@ -1127,13 +1131,15 @@ export function loadTallinnSourcesFromCatalog({ // Rough Estonia/Tallinn metro sanity (allows nearby suburbs already in the pack). if (lat < 59.2 || lat > 59.7 || lon < 24.3 || lon > 25.4) continue; - const imageUrl = + const imageUrl = pinnedCameraUrl( typeof item.url === 'string' - ? item.url.trim() + ? item.url : typeof item.snapshotUrl === 'string' - ? item.snapshotUrl.trim() - : ''; - if (!imageUrl.startsWith(TALLINN_IMAGE_ORIGIN)) continue; + ? item.snapshotUrl + : '', + TALLINN_IMAGE_ORIGIN, + ); + if (!imageUrl) continue; const extractedHeading = toFiniteNumber(item.headingDeg, NaN); const hasHeading = Number.isFinite(extractedHeading); @@ -1235,8 +1241,8 @@ export function parseTarkteeDatexImages(xml) { body, ); if (!refMatch || !urlMatch) continue; - const url = urlMatch[1].trim(); - if (!url.startsWith(TARKTEE_IMAGE_ORIGIN)) continue; + const url = pinnedCameraUrl(urlMatch[1], TARKTEE_IMAGE_ORIGIN); + if (!url) continue; out.set(refMatch[1], url); } return out; @@ -1422,14 +1428,16 @@ export function loadWarendorfSourcesFromCatalog({ for (const item of rows) { if (!item || typeof item !== 'object') continue; const id = typeof item.id === 'string' ? item.id.trim() : ''; - const url = + const raw = typeof item.url === 'string' - ? item.url.trim() + ? item.url : typeof item.snapshotUrl === 'string' - ? item.snapshotUrl.trim() + ? item.snapshotUrl : ''; - if (!id || !WARENDORF_IMAGE_ORIGINS.some((o) => url.startsWith(o))) - continue; + const url = WARENDORF_IMAGE_ORIGINS.map((o) => + pinnedCameraUrl(raw, o), + ).find(Boolean); + if (!id || !url) continue; const lat = typeof item.lat === 'number' ? item.lat : NaN; const lon = typeof item.lon === 'number' ? item.lon : NaN; if (!isPlausibleLatLon(lat, lon)) continue; @@ -1483,8 +1491,8 @@ export function nswCameraToSource(feature) { const lat = typeof coords?.[1] === 'number' ? coords[1] : NaN; if (!isLikelyNswCoordinate(lat, lon)) return null; const props = feature?.properties || {}; - const url = String(props.href || '').trim(); - if (!url.startsWith(NSW_IMAGE_ORIGIN)) return null; + const url = pinnedCameraUrl(props.href, NSW_IMAGE_ORIGIN); + if (!url) return null; // "N-E" -> "NE" for the compass lookup. const direction = String(props.direction || '') .trim() @@ -1578,8 +1586,7 @@ export function normalizeCalgaryImageUrl(raw) { } if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null; parsed.protocol = 'https:'; - const upgraded = parsed.toString(); - return upgraded.startsWith(CALGARY_IMAGE_ORIGIN) ? upgraded : null; + return pinnedCameraUrl(parsed.toString(), CALGARY_IMAGE_ORIGIN); } /** @@ -2085,8 +2092,7 @@ export function normalizeHkImageUrl(raw) { } if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null; parsed.protocol = 'https:'; - const upgraded = parsed.toString(); - return upgraded.startsWith(HK_IMAGE_ORIGIN) ? upgraded : null; + return pinnedCameraUrl(parsed.toString(), HK_IMAGE_ORIGIN); } /** @@ -2423,10 +2429,16 @@ export async function loadKingCountySourcesFromOpenData() { // county image origin, so they are skipped. if (owner === 'WSDOT') continue; // The handler is served over HTTPS; the feed still writes http://. - const imageUrl = String(attrs.ImageURL || '') - .trim() - .replace(/^http:\/\/info\.kingcounty\.gov\//, KING_COUNTY_IMAGE_ORIGIN); - if (!imageUrl.startsWith(KING_COUNTY_IMAGE_ORIGIN)) continue; + const imageUrl = pinnedCameraUrl( + String(attrs.ImageURL || '') + .trim() + .replace( + /^http:\/\/info\.kingcounty\.gov\//, + KING_COUNTY_IMAGE_ORIGIN, + ), + KING_COUNTY_IMAGE_ORIGIN, + ); + if (!imageUrl) continue; const [lon, lat] = Array.isArray(row?.geometry?.coordinates) ? row.geometry.coordinates : []; @@ -2586,8 +2598,8 @@ export async function loadWsdotSourcesFromOpenData() { const attrs = row?.attributes; const rawId = attrs?.CameraID; if (!Number.isSafeInteger(rawId) || rawId <= 0) continue; - const imageUrl = String(attrs.ImageURL || '').trim(); - if (!imageUrl.startsWith(WSDOT_IMAGE_ORIGIN)) continue; + const imageUrl = pinnedCameraUrl(attrs.ImageURL, WSDOT_IMAGE_ORIGIN); + if (!imageUrl) continue; const x = row?.geometry?.x; const y = row?.geometry?.y; if (!Number.isFinite(x) || !Number.isFinite(y)) continue; diff --git a/src/data/cctvSourcePins.test.mjs b/src/data/cctvSourcePins.test.mjs new file mode 100644 index 000000000..3ab2536d7 --- /dev/null +++ b/src/data/cctvSourcePins.test.mjs @@ -0,0 +1,106 @@ +// Camera catalogs are pinned to their agency's image directory. The pin is a +// parsed-URL check, not a string prefix, so a path that only starts with the +// directory before dot segments, an encoded separator, credentials or another +// port are resolved never counts as inside it, and a redirect on a pinned host +// cannot leave the directory either. +// +// Run with: npm test (node --test) +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { loadTflSourcesFromOpenData } from '../../server/providers/cctv/sources.js'; +import { fetchWithinHost } from '../../server/providers/cctv/media.js'; + +const BUCKET = 'https://s3-eu-west-1.amazonaws.com/jamcams.tfl.gov.uk/'; + +/** One available JamCam whose frame is at `imageUrl`. */ +const jamCam = (n, imageUrl) => ({ + id: `JamCams_00001.0000${n}`, + commonName: `JamCam ${n}`, + lat: 51.5072, + lon: -0.1276, + additionalProperties: [ + { key: 'available', value: 'true' }, + { key: 'imageUrl', value: imageUrl }, + ], +}); + +test('TfL JamCams keep only frames inside the official bucket, by parsed URL', async (t) => { + t.mock.method(console, 'log', () => {}); + t.mock.method(console, 'warn', () => {}); + const accepted = [ + [`${BUCKET}00001.00001.jpg`, `${BUCKET}00001.00001.jpg`], + [`${BUCKET}00001.00002.jpg?t=1`, `${BUCKET}00001.00002.jpg?t=1`], + [ + 'https://s3-eu-west-1.amazonaws.com:443/jamcams.tfl.gov.uk/00001.00003.jpg', + `${BUCKET}00001.00003.jpg`, + ], + ]; + const rejected = [ + `${BUCKET}../other/x.jpg`, + `${BUCKET}%2e%2e/other/x.jpg`, + `${BUCKET}%2E%2E/other/x.jpg`, + `${BUCKET}.%2e/other/x.jpg`, + `${BUCKET}..%2fother/x.jpg`, + `${BUCKET}..%5Cother/x.jpg`, + `${BUCKET}..\\other\\x.jpg`, + 'https://s3-eu-west-1.amazonaws.com/jamcams.tfl.gov.uk.other/x.jpg', + 'https://s3-eu-west-1.amazonaws.com/jamcams.tfl.gov.uk-other/x.jpg', + 'https://s3-eu-west-1.amazonaws.com/other/jamcams.tfl.gov.uk/x.jpg', + 'https://user:pass@s3-eu-west-1.amazonaws.com/jamcams.tfl.gov.uk/x.jpg', + 'https://s3-eu-west-1.amazonaws.com:8443/jamcams.tfl.gov.uk/x.jpg', + 'http://s3-eu-west-1.amazonaws.com/jamcams.tfl.gov.uk/x.jpg', + 'https://s3-eu-west-1.amazonaws.com.other.example/jamcams.tfl.gov.uk/x.jpg', + 'not a url', + ]; + t.mock.method(globalThis, 'fetch', async () => + Response.json( + [...accepted.map(([url]) => url), ...rejected].map((url, i) => + jamCam(i + 1, url), + ), + ), + ); + const cameras = await loadTflSourcesFromOpenData(); + assert.deepEqual( + cameras.map((camera) => camera.url), + accepted.map(([, normalized]) => normalized), + ); +}); + +test('a redirect on a pinned camera host stays inside the pinned directory', async () => { + const redirectTo = (location) => async (url) => + url === `${BUCKET}00001.00001.jpg` + ? new Response(null, { status: 302, headers: { location } }) + : new Response('frame', { headers: { 'content-type': 'image/jpeg' } }); + for (const location of [ + '/jamcams.tfl.gov.uk.other/x.jpg', + '/other/x.jpg', + '/jamcams.tfl.gov.uk/../other/x.jpg', + '/jamcams.tfl.gov.uk/%2e%2e/other/x.jpg', + '/jamcams.tfl.gov.uk/..%2fother/x.jpg', + ]) + assert.equal( + await fetchWithinHost( + `${BUCKET}00001.00001.jpg`, + {}, + redirectTo(location), + ), + null, + location, + ); + const followed = await fetchWithinHost( + `${BUCKET}00001.00001.jpg`, + {}, + redirectTo('/jamcams.tfl.gov.uk/00001.00002.jpg'), + ); + assert.equal(await followed.text(), 'frame'); + // A host with no pinned directory keeps the same-origin rule alone. + const unpinned = await fetchWithinHost( + 'https://cams.example/a/frame.jpg', + {}, + async (url) => + url === 'https://cams.example/a/frame.jpg' + ? new Response(null, { status: 302, headers: { location: '/b/x.jpg' } }) + : new Response('frame'), + ); + assert.equal(await unpinned.text(), 'frame'); +}); From d80162bea253ccc0f83d1150d4af321aa454c899 Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Wed, 21 Oct 2026 15:33:13 -0700 Subject: [PATCH 37/45] Match API paths the way the router does The router mounts /api without regard to letter case, accepts a '.' as well as '/' after the prefix, and routes absolute-form request targets, so the API response headers were missing on those spellings. Match the same way, on both the raw and the parsed path. The test now runs real dev and preview servers. --- build/vite.js | 19 +++- docs/CURRENT-STATE.md | 11 +- src/tooling/viteBuild.test.mjs | 189 ++++++++++++++++----------------- 3 files changed, 113 insertions(+), 106 deletions(-) diff --git a/build/vite.js b/build/vite.js index b560e7921..5498a8010 100644 --- a/build/vite.js +++ b/build/vite.js @@ -60,10 +60,23 @@ export const API_HEADERS = Object.freeze({ 'X-Content-Type-Options': 'nosniff', }); -/** Whether a request path is an API route (`/api` or `/api/...`). */ +/** + * Whether a request reaches an `/api` mount, by the router's own rule: the + * prefix compared without case and followed by the end, `/` or `.`. Both the + * raw path and the parsed one (which also covers an absolute-form target) are + * checked, so no spelling the router mounts can miss the headers. + */ function isApiPath(url) { - const path = String(url || '/').split(/[?#]/, 1)[0]; - return path === '/api' || path.startsWith('/api/'); + const raw = String(url || '/'); + let parsed = ''; + try { + parsed = new URL(raw, 'http://localhost').pathname; + } catch { + /* the raw path still decides */ + } + return [raw.split(/[?#]/, 1)[0], parsed].some((path) => + /^\/api(?:$|[/.])/i.test(path), + ); } /** diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index efedf3508..fd1569338 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -33,11 +33,12 @@ existing recovery behavior. Every `/api` response on the dev and preview servers carries `Content-Security-Policy: default-src 'none'; sandbox` and `X-Content-Type-Options: nosniff`. `apiResponseHeadersPlugin` sets them ahead of -the Host check, so errors, partial responses, Host refusals and unknown routes -are covered too; a route's own policy is sent as an additional policy, never in -place of it. The app document's policy is unchanged. The GBFS proxy relays only -bodies that parse as JSON, re-serialized as `application/json; charset=utf-8`; -anything else answers 502. +the Host check and matches `/api` the way the router mounts it (any letter case, a +`/` or `.` boundary, absolute-form targets), so errors, partial responses, Host +refusals and unknown routes are covered too; a route's own policy is sent as an +additional policy, never in place of it. The app document's policy is unchanged. +The GBFS proxy relays only bodies that parse as JSON, re-serialized as +`application/json; charset=utf-8`; anything else answers 502. Catalog source contracts and their consuming layers are declared in `src/app/sourceComposition.js`. Omitted or null acquisition sources preserve layer diff --git a/src/tooling/viteBuild.test.mjs b/src/tooling/viteBuild.test.mjs index 655b819d0..dcb2910a6 100644 --- a/src/tooling/viteBuild.test.mjs +++ b/src/tooling/viteBuild.test.mjs @@ -1,11 +1,15 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; -import { createServer, request } from 'node:http'; +import { rm, writeFile } from 'node:fs/promises'; +import { request } from 'node:http'; +import path from 'node:path'; +import { build, createServer, preview } from 'vite'; import { BROWSER_CSP, createBrowserViteConfig } from '../../build/vite.js'; import standaloneConfig, * as compatibility from '../../vite.config.js'; import * as providers from '../../server/providers/local.js'; import { apiNotFoundPlugin } from '../../server/standalone/api-not-found.js'; +import { makeFixtureRoot } from './fixtureRoot.mjs'; test('explicit build inputs preserve browser-only defines, plugin order and loopback protections', () => { const plugin = { name: 'fixture-provider' }; @@ -263,70 +267,39 @@ test('the CSP admits the event media embeds and the Maps JavaScript API, and no assert.ok(frames.includes('https://platform.twitter.com')); }); -/** - * Serve plugins' middleware over real HTTP the way Vite's connect stack mounts - * it: in plugin order, a route prefix stripped from `req.url`. A request no - * middleware answers gets the app document stand-in. - */ -async function servePlugins(t, plugins, hook, config) { - const stack = []; - const server = { - config, - middlewares: { - use(route, handler) { - if (typeof route === 'function') - stack.push({ route: '', handler: route }); - else stack.push({ route, handler }); +/** A raw GET, so the Host header and an absolute-form target are sent as given. */ +function rawGet(port, target, headers = {}) { + return new Promise((resolve, reject) => { + const req = request( + { + host: '127.0.0.1', + port, + path: target, + headers: { host: `localhost:${port}`, ...headers }, }, - }, - }; - for (const plugin of plugins) plugin[hook]?.(server); - const http = createServer((req, res) => { - const original = req.url; - const path = original.split('?')[0]; - let index = 0; - const next = () => { - const layer = stack[index++]; - if (!layer) { - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end('app'); - return; - } - if ( - layer.route && - path !== layer.route && - !path.startsWith(`${layer.route}/`) - ) - return next(); - req.url = original.slice(layer.route.length) || '/'; - layer.handler(req, res, next); - }; - next(); + (res) => { + res.resume(); + res.on('end', () => + resolve({ status: res.statusCode, headers: res.headers }), + ); + }, + ); + req.on('error', reject); + req.end(); }); - await new Promise((resolve) => http.listen(0, '127.0.0.1', resolve)); - t.after(() => new Promise((resolve) => http.close(resolve))); - const { port } = http.address(); - return (path, host = `localhost:${port}`) => - new Promise((resolve, reject) => { - const req = request( - { host: '127.0.0.1', port, path, headers: { host } }, - (res) => { - res.resume(); - res.on('end', () => - resolve({ status: res.statusCode, headers: res.headers }), - ); - }, - ); - req.on('error', reject); - req.end(); - }); } -test('every API response carries the API policy and nosniff in dev and preview', async (t) => { +test('every API response carries the API policy and nosniff on real dev and preview servers', async (t) => { const policy = "default-src 'none'; sandbox"; + const root = await makeFixtureRoot('gev-api-headers-'); + t.after(() => rm(root, { recursive: true, force: true })); + await writeFile( + path.join(root, 'index.html'), + 'Fixture

x

', + ); const install = (server) => { server.middlewares.use('/api/fixture', (req, res) => { - const route = req.url.split('?')[0]; + const route = new URL(req.url, 'http://localhost').pathname; if (route === '/ok') { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end('{}'); @@ -352,47 +325,67 @@ test('every API response carries the API policy and nosniff in dev and preview', configurePreviewServer: install, }; const built = createBrowserViteConfig({ plugins: [fixture] }); - const plugins = [ - ...built.plugins.filter( - (plugin) => - plugin === fixture || - ['api-response-headers', 'host-check'].includes(plugin.name), - ), - apiNotFoundPlugin(), - ]; - const config = { - server: { - allowedHosts: built.server.allowedHosts, - host: built.server.host, - }, - preview: { allowedHosts: built.server.allowedHosts }, + const base = { + root, + configFile: false, + envFile: false, + publicDir: false, + logLevel: 'silent', }; - for (const hook of ['configureServer', 'configurePreviewServer']) { - const get = await servePlugins(t, plugins, hook, config); - for (const [path, status, csp = policy, host] of [ - ['/api/fixture/ok', 200], - ['/api/fixture/error', 500], - ['/api/fixture/partial', 206], - ['/api/nope', 404], - ['/api', 404], - ['/api/fixture/ok?x=1', 200], - ['/api/fixture/ok', 403, policy, 'elsewhere.example'], - // A route's own policy is added to the API policy, never replaces it. - ['/api/fixture/own-policy', 200, `${policy}, frame-ancestors 'none'`], - ['/api/fixture/own-policy-head', 200, `${policy}, default-src *`], - ]) { - const res = await get(path, host); - const label = `${hook} ${path} ${host || ''}`; - assert.equal(res.status, status, label); - assert.equal(res.headers['content-security-policy'], csp, label); - assert.equal(res.headers['x-content-type-options'], 'nosniff', label); + await build(base); + for (const isPreview of [false, true]) { + const server = await (isPreview ? preview : createServer)({ + ...base, + plugins: [ + ...built.plugins.filter( + (plugin) => + plugin === fixture || + ['api-response-headers', 'host-check'].includes(plugin.name), + ), + apiNotFoundPlugin(), + ], + server: { host: '127.0.0.1', port: 0, hmr: false }, + preview: { host: '127.0.0.1', port: 0 }, + }); + if (!isPreview) await server.listen(); + const { port } = server.httpServer.address(); + const mode = isPreview ? 'preview' : 'dev'; + try { + for (const [target, status, csp = policy, headers] of [ + ['/api/fixture/ok', 200], + ['/api/fixture/error', 500], + ['/api/fixture/partial', 206], + ['/api/nope', 404], + ['/api', 404], + ['/api/fixture/ok?x=1', 200], + // Spellings the router mounts as the same routes. + ['/API/fixture/ok', 200], + ['/Api/fixture/error', 500], + ['/aPi/nope', 404], + ['/API', 404], + ['/api.x', 404], + [`http://localhost:${port}/api/fixture/ok`, 200], + [`http://localhost:${port}/API/nope`, 404], + ['/api/fixture/ok', 403, policy, { host: 'elsewhere.example' }], + // A route's own policy is added to the API policy, never replaces it. + ['/api/fixture/own-policy', 200, `${policy}, frame-ancestors 'none'`], + ['/api/fixture/own-policy-head', 200, `${policy}, default-src *`], + ]) { + const res = await rawGet(port, target, headers); + const label = `${mode} ${target} ${JSON.stringify(headers || {})}`; + assert.equal(res.status, status, label); + assert.equal(res.headers['content-security-policy'], csp, label); + assert.equal(res.headers['x-content-type-options'], 'nosniff', label); + } + // The app document and other paths keep the server's own headers. + for (const target of ['/', '/apiary', '/src/api/x.js']) + assert.notEqual( + (await rawGet(port, target)).headers['content-security-policy'], + policy, + `${mode} ${target}`, + ); + } finally { + await server.close(); } - // The app document and other paths are left to the server's own headers. - for (const path of ['/', '/apiary', '/src/api/x.js']) - assert.equal( - (await get(path)).headers['content-security-policy'], - undefined, - `${hook} ${path}`, - ); } }); From b1ed77c26ce59090996cba42d6307e686fd34158 Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Wed, 21 Oct 2026 15:33:14 -0700 Subject: [PATCH 38/45] Keep camera routes reachable behind a reverse proxy The CCTV routes now use the keyless cross-site checks, which refuse cross-site browser requests but accept forwarding headers, so cameras work behind the documented reverse proxy. The Street View fallback is the one step that spends a key; a request with forwarding headers skips it and gets the placeholder frame, as when no key is configured. --- SECURITY.md | 4 +- docs/CURRENT-STATE.md | 4 +- server/providers/cctv.js | 28 ++++++++----- src/data/cctvMediaFeedType.test.mjs | 63 ++++++++++++++++++++++++++--- 4 files changed, 81 insertions(+), 18 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 9d4feb6d8..708bb1583 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -69,13 +69,13 @@ The data proxies under `server/providers/` are written so the browser cannot tur - **No verbatim client headers upstream.** The CCTV media route is the one route that relays a request header (`Range`, for video seeking). It is parsed and canonicalized before it is forwarded: one `bytes=` range only, with every accepted form — explicit span, open-ended and suffix — bounded to the same 64 MiB ceiling the relay applies to a declared response body. Multi-range, malformed, inverted and non-`bytes` values are dropped and the request proceeds without a `Range`, as RFC 7233 §3.1 prescribes. Bounding the request bounds what is asked for: a response that declares no length — live streamed media, or a chunked body from an upstream that ignores the `Range` — has no ceiling. An upstream request the browser has stopped waiting for is cancelled rather than left running, whether the viewer leaves before the headers arrive or during the body. - **Transit fetches registered feeds only.** `/api/transit/vehicles/` resolves the id against `src/data/transitFeeds.js`; the browser never supplies a URL, and a feed that is registered but disabled does not resolve at all. Redirects are followed manually and each hop is validated against the feed's own https origin before it is requested, so an off-origin or downgraded hop is refused rather than contacted. Bodies are capped at 8 MB, the protobuf is decoded server-side under entity-count and string-length ceilings, a differential feed is refused, and snapshots live 15 s in memory with no disk cache. A per-feed admission limiter and a failure cooldown ladder bound what this process can ask of any operator. - **Local receiver feeds are operator-configured and local-only.** `/api/local-receivers/aircraft` reads only the `aircraft.json` URLs in the server's `LOCAL_RECEIVER_FEEDS`; the browser never supplies an address. Each host must pass the shared tap address rule (`src/data/tapAddress.js`: loopback, RFC1918, `localhost`, `*.local`; no link-local, IPv6 or other names), the scheme must be http(s), the path must end in `aircraft.json`, and credentials, queries and fragments are refused. Invalid entries are logged at startup and never fetched. Reads use a 2 s timeout, refuse redirects, cap bodies at 2 MB and share one read per second; responses name each feed by band only and never carry upstream error text. -- **Validated response formats.** Proxied bodies are relayed only in the format the route serves. CCTV frames and the Street View fallback accept JPEG, PNG, GIF, WebP and AVIF only, sent under their canonical type; any other type falls through to the next fallback. Live CCTV media must match its feed kind (`video/mp4`, `video/webm`, or `multipart/x-mixed-replace` with a boundary) before it is relayed or the camera counts as healthy, and its redirects stay on the registered origin. GBFS bodies must parse as JSON and are re-serialized as `application/json; charset=utf-8`. Camera catalog URLs are pinned by parsed URL — scheme, exact host, no credentials, default port, and a normalized path inside the agency's image directory — and a redirect on a pinned host must stay inside the same directory. Every `/api/cctv` route uses the cross-site gate below. +- **Validated response formats.** Proxied bodies are relayed only in the format the route serves. CCTV frames and the Street View fallback accept JPEG, PNG, GIF, WebP and AVIF only, sent under their canonical type; any other type falls through to the next fallback. Live CCTV media must match its feed kind (`video/mp4`, `video/webm`, or `multipart/x-mixed-replace` with a boundary) before it is relayed or the camera counts as healthy, and its redirects stay on the registered origin. GBFS bodies must parse as JSON and are re-serialized as `application/json; charset=utf-8`. Camera catalog URLs are pinned by parsed URL — scheme, exact host, no credentials, default port, and a normalized path inside the agency's image directory — and a redirect on a pinned host must stay inside the same directory. Every `/api/cctv` route uses the keyless cross-site checks described below, so cameras stay reachable behind a reverse proxy; a request carrying forwarding headers never reaches the key-bearing Street View fallback and gets the placeholder frame instead, as when no key is configured. - **Consistent API response headers.** Every `/api` response, including errors, partial content, Host refusals and unknown routes, carries `Content-Security-Policy: default-src 'none'; sandbox` and `X-Content-Type-Options: nosniff` (`apiResponseHeadersPlugin` in `build/vite.js`, installed ahead of the Host check). A route that sets its own policy adds it as a further policy; it never replaces this one. - **Response-size caps and timeouts** on proxied responses. - **Sanitized errors** — internal error details are not echoed back to clients. - **Coalesced OAuth refresh** and cached successful responses only (OpenSky). - **Redacted debug logging.** The voice debug log (`.gev-logs/`, gitignored) strips API keys, bearer tokens, client secrets, and image data URLs before writing. -- **Cross-site gate on cost/log endpoints.** The cost-bearing (`/api/realtime/token`, `/api/openai/hud-summary`, `/api/google/nearby-places`, `/api/google/text-search`), quota-bearing (`/api/mapillary/*`, with a per-IP limit on tiles, and `/api/tomtom/*`, backed by its persistent daily tile budget) and log (`/api/realtime/debug-log`) endpoints refuse cross-site browser requests: a foreign or opaque `Origin`, a `Sec-Fetch-Site` other than `same-origin`/`none` (this is what blocks an ``/navigation that carries no `Origin`), or any reverse-proxy/CDN forwarding header returns `403`. Non-browser loopback tools (the repo QA harnesses POST the token endpoint with no `Origin`) and the explicit `HOST=0.0.0.0` LAN opt-in keep working — the gate deliberately does not require a loopback remote address; that stricter requirement belongs only to the credential panel (`admitKeySetupRequest`). The Host check (`allowedHosts`, applied by `hostCheckPlugin` ahead of every route, since Vite's own check runs only after plugin middleware) rejects a rebinding `Host` before any handler runs, in every mode, and the gate is defense in depth behind it: the LAN opt-in keeps that check and accepts only IP addresses, `localhost` and names listed in `GEV_ALLOWED_HOSTS`. **Limit:** a name you list there is trusted like the app's own address, so list only names you control. The keyless terrain route (`/api/terrain/heights`) uses the same cross-site checks, minus the forwarding-header refusal: it guards only the per-client quota and point cache, not a key or a bill, and the map needs it to render behind a reverse proxy. +- **Cross-site gate on cost/log endpoints.** The cost-bearing (`/api/realtime/token`, `/api/openai/hud-summary`, `/api/google/nearby-places`, `/api/google/text-search`), quota-bearing (`/api/mapillary/*`, with a per-IP limit on tiles, and `/api/tomtom/*`, backed by its persistent daily tile budget) and log (`/api/realtime/debug-log`) endpoints refuse cross-site browser requests: a foreign or opaque `Origin`, a `Sec-Fetch-Site` other than `same-origin`/`none` (this is what blocks an ``/navigation that carries no `Origin`), or any reverse-proxy/CDN forwarding header returns `403`. Non-browser loopback tools (the repo QA harnesses POST the token endpoint with no `Origin`) and the explicit `HOST=0.0.0.0` LAN opt-in keep working — the gate deliberately does not require a loopback remote address; that stricter requirement belongs only to the credential panel (`admitKeySetupRequest`). The Host check (`allowedHosts`, applied by `hostCheckPlugin` ahead of every route, since Vite's own check runs only after plugin middleware) rejects a rebinding `Host` before any handler runs, in every mode, and the gate is defense in depth behind it: the LAN opt-in keeps that check and accepts only IP addresses, `localhost` and names listed in `GEV_ALLOWED_HOSTS`. **Limit:** a name you list there is trusted like the app's own address, so list only names you control. The keyless terrain route (`/api/terrain/heights`) uses the same cross-site checks, minus the forwarding-header refusal: it guards only the per-client quota and point cache, not a key or a bill, and the map needs it to render behind a reverse proxy. The CCTV routes (`/api/cctv/*`) use the same keyless checks; their one key-bearing step, the Street View fallback, is skipped for any request with forwarding headers. - **Full Content-Security-Policy.** The dev and preview servers send a real CSP (`script-src 'self' 'unsafe-eval' blob:` plus the YouTube, Facebook and X scripts the Nepal event's embedded media loads and the Maps JavaScript API that Street View runs on, with a matching `frame-src` for their players and posts: no inline script and no other script origin; `blob:` covers the object URLs Cesium's bundled workers bootstrap through in the built app), alongside the existing `X-Frame-Options: DENY` and `frame-ancestors 'none'`. `'unsafe-eval'` stays because Knockout, bundled inside Cesium's widgets package, resolves the global object with `eval` at load time and the globe does not initialize without it; styles permit `'unsafe-inline'` and Google Fonts because Vite's dev client injects `

F*RAHu;&FylDRD@l49QwSV~sO^Aw%pT;so! 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 MST=Lk{>M7~f8_JF1poj5 literal 15028 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 T_ySA3J5#y%kyk2W0O0=tCamzp diff --git a/src/data/local_data/sky/milkyway_pz.webp b/src/data/local_data/sky/milkyway_pz.webp index 50f0793a6f7715f024afa92ca1f8f8425fdf9c4c..06624bf210e18a7407e8d6ce494d8d72eccdaeff 100644 GIT binary patch literal 8264 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 bebG*&x!_y;aM9SMagP!sHG#r*b^zdi%26K@ literal 12354 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 { + assert.equal(smoothstep(0.1, 0.2, 0), 0); + assert.equal(smoothstep(0.1, 0.2, 0.1), 0); + close(smoothstep(0.1, 0.2, 0.15), 0.5, 1e-9); + assert.equal(smoothstep(0.1, 0.2, 0.2), 1); + assert.equal(smoothstep(0.1, 0.2, 9), 1); +}); From d94cc35c81a62722f13485befb61946428ca2f34 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 20 Oct 2026 13:37:43 +0400 Subject: [PATCH 14/45] fix(sky): keep the Milky Way out of model lighting, test the sky wiring Scene reads skyBox._cubeMap as the environment map that lights models, in the TEME, flipY layout of Cesium's own sky box; the ICRF Milky Way would light them rotated. Rename the field so models keep Cesium's default. Test the anime fade on a real StarrySky and that the viewer gets the sky as an option (skyBox: false would drop the Sun and Moon). Correct three comments on the star limit and the Milky Way levels. Co-Authored-By: Claude Opus 5.5 --- scripts/build-milky-way.mjs | 6 +++++- src/app/application.test.mjs | 11 +++++++++++ src/app/viewer.js | 20 ++++++++++++++------ src/sky/starrySky.js | 11 +++++++---- src/sky/starrySky.test.mjs | 8 ++++++++ src/sky/stars.js | 2 +- src/ui/visualEffects.test.mjs | 13 ++++++++----- 7 files changed, 54 insertions(+), 17 deletions(-) diff --git a/scripts/build-milky-way.mjs b/scripts/build-milky-way.mjs index e0703f882..55c7f8225 100644 --- a/scripts/build-milky-way.mjs +++ b/scripts/build-milky-way.mjs @@ -31,7 +31,9 @@ * celestial pole — rotating each direction into galactic coordinates * with the IAU J2000 matrix. * 6. Map the median sky to black, easing in with a soft knee, and the - * brightest 0.01 % to white (on luminance, keeping each pixel's hue), + * brightest 0.01 % to about 97 % white, the knee's offset there (both + * levels taken before the faint-glow blend; on luminance, keeping each + * pixel's hue), * encode with gamma 1/2.2 and ±0.5 LSB dither against banding; WebP. * * Usage: @@ -373,6 +375,8 @@ async function main() { for (const plane of planes) blurPlane(plane, width, height, sigmaPx); for (const plane of wide) blurPlane(plane, width, height, (FAINT_BLUR_DEG / 180) * height); + // Levels from the fine blur, so the blend weight and the output share + // them; the blend moves the median only in the faint sky it smooths. const black = luminancePercentile(planes, BLACK_PERCENTILE); const white = luminancePercentile(planes, WHITE_PERCENTILE); blendByBrightness(planes, wide, (luminance) => diff --git a/src/app/application.test.mjs b/src/app/application.test.mjs index d3ef8c7cc..dcc937c75 100644 --- a/src/app/application.test.mjs +++ b/src/app/application.test.mjs @@ -219,6 +219,17 @@ test('the separate viewer export imports without constructing a browser viewer', assert.throws(() => createApplicationViewer({}), /containers are required/); }); +test('the viewer gets the starry sky as an option, which keeps the Sun and Moon', async () => { + const { applicationViewerOptions } = await import('./viewer.js'); + const { StarrySky } = await import('../sky/starrySky.js'); + const creditContainer = {}; + const options = applicationViewerOptions(creditContainer); + // CesiumWidget skips scene.sun and scene.moon when skyBox is false. + assert.ok(options.skyBox instanceof StarrySky); + assert.equal(options.creditContainer, creditContainer); + options.skyBox.destroy(); +}); + function pinchFixture({ zoomEventTypes } = {}) { const handlers = new Set(); const relayed = []; diff --git a/src/app/viewer.js b/src/app/viewer.js index a09836775..633616fef 100644 --- a/src/app/viewer.js +++ b/src/app/viewer.js @@ -103,11 +103,9 @@ export function installTrackpadPinchZoom( }; } -/** Create the standard globe viewer in caller-owned, visible containers. */ -export function createApplicationViewer({ container, creditContainer }) { - if (!container || !creditContainer) - throw new TypeError('Viewer and credit containers are required'); - const viewer = new Cesium.Viewer(container, { +/** Cesium.Viewer options of the standard globe viewer. */ +export function applicationViewerOptions(creditContainer) { + return { timeline: false, animation: false, baseLayerPicker: false, @@ -127,7 +125,17 @@ export function createApplicationViewer({ container, creditContainer }) { creditContainer, msaaSamples: 4, contextOptions: { webgl: { preserveDrawingBuffer: true } }, - }); + }; +} + +/** Create the standard globe viewer in caller-owned, visible containers. */ +export function createApplicationViewer({ container, creditContainer }) { + if (!container || !creditContainer) + throw new TypeError('Viewer and credit containers are required'); + const viewer = new Cesium.Viewer( + container, + applicationViewerOptions(creditContainer), + ); try { viewer.targetFrameRate = 60; // Before any tile builds a draw command: Cesium's per-vertex model diff --git a/src/sky/starrySky.js b/src/sky/starrySky.js index d77892d6a..d538d430d 100644 --- a/src/sky/starrySky.js +++ b/src/sky/starrySky.js @@ -180,7 +180,10 @@ export class StarrySky { this._loading = false; this._starData = undefined; this._faceImages = undefined; - this._cubeMap = undefined; + // Not `_cubeMap`: Scene reads `skyBox._cubeMap` as the environment map + // that lights models, in the TEME, flipY layout of its own sky box. This + // ICRF map would light them rotated, so models keep Cesium's default. + this._milkyWayCubeMap = undefined; this._milkyWayCommand = undefined; this._milkyWayAttributes = undefined; this._starCommand = undefined; @@ -191,7 +194,7 @@ export class StarrySky { }; this._milkyWayUniforms = { ...uniforms, - u_milkyWay: () => this._cubeMap, + u_milkyWay: () => this._milkyWayCubeMap, u_intensity: () => this.milkyWayIntensity * this.milkyWayVisibility, }; this._starUniforms = { @@ -301,7 +304,7 @@ export class StarrySky { cubeMap.sampler = new Cesium.Sampler({ minificationFilter: Cesium.TextureMinificationFilter.LINEAR_MIPMAP_LINEAR, }); - this._cubeMap = cubeMap; + this._milkyWayCubeMap = cubeMap; this._faceImages = undefined; const geometry = Cesium.BoxGeometry.createGeometry( Cesium.BoxGeometry.fromDimensions({ @@ -440,7 +443,7 @@ export class StarrySky { command.vertexArray?.destroy(); command.shaderProgram?.destroy(); } - this._cubeMap = this._cubeMap?.destroy(); + this._milkyWayCubeMap = this._milkyWayCubeMap?.destroy(); this._milkyWayCommand = undefined; this._starCommand = undefined; this._commands.length = 0; diff --git a/src/sky/starrySky.test.mjs b/src/sky/starrySky.test.mjs index 1d9d2f8a0..d6488fd1d 100644 --- a/src/sky/starrySky.test.mjs +++ b/src/sky/starrySky.test.mjs @@ -127,3 +127,11 @@ test('the Milky Way glow scales with its visibility, for styles that hide it', ( assert.equal(sky._milkyWayUniforms.u_intensity(), 0); sky.destroy(); }); + +test('the Milky Way stays out of the environment map that lights models', () => { + // Scene#render hands `skyBox._cubeMap` to image-based lighting, which + // expects Cesium's own TEME, flipY layout; this ICRF map would be rotated. + const sky = new StarrySky({ requestRender: () => {} }); + assert.equal('_cubeMap' in sky, false); + sky.destroy(); +}); diff --git a/src/sky/stars.js b/src/sky/stars.js index b7ef7aa41..203e1b2e5 100644 --- a/src/sky/stars.js +++ b/src/sky/stars.js @@ -13,7 +13,7 @@ * @module sky/stars */ -/** Faintest catalogue magnitude; also the reference for brightness. */ +/** Faintest magnitude drawn distinctly (fainter catalogue stars look like it); the brightness reference. */ export const STAR_LIMIT_MAGNITUDE = 6.5; /** Gaussian σ of the faintest star, CSS pixels. */ export const STAR_MIN_SIGMA_PX = 0.55; diff --git a/src/ui/visualEffects.test.mjs b/src/ui/visualEffects.test.mjs index 21f744985..3d86e3a48 100644 --- a/src/ui/visualEffects.test.mjs +++ b/src/ui/visualEffects.test.mjs @@ -1,6 +1,7 @@ import assert from 'node:assert/strict'; import test from 'node:test'; import { VisualEffects } from './visualEffects.js'; +import { MILKY_WAY_INTENSITY, StarrySky } from '../sky/starrySky.js'; import { GLOBAL_POST_DEFAULTS, STYLE_PRESET_DEFAULTS, @@ -160,17 +161,19 @@ test('direct Cockpit intensity writes are reconciled before rendering', () => { test('the anime stage fades the Milky Way out with its own intensity', () => { const f = fixture(); - const sky = { milkyWayVisibility: 1 }; + const sky = new StarrySky({ requestRender: () => {} }); + const glow = () => sky._milkyWayUniforms.u_intensity(); f.effects.viewer.scene.skyBox = sky; f.effects.initStyles(); f.effects.setStageIntensity(f.effects.stages.thermal, 1); - assert.equal(sky.milkyWayVisibility, 1, 'other styles keep the glow'); + assert.equal(glow(), MILKY_WAY_INTENSITY, 'other styles keep the glow'); f.effects.setStageIntensity(f.effects.stages.anime, 0.25); - assert.equal(sky.milkyWayVisibility, 0.75); + assert.equal(glow(), MILKY_WAY_INTENSITY * 0.75); f.effects.setStageIntensity(f.effects.stages.anime, 1); - assert.equal(sky.milkyWayVisibility, 0); + assert.equal(glow(), 0); f.effects.setStageIntensity(f.effects.stages.anime, 0); - assert.equal(sky.milkyWayVisibility, 1); + assert.equal(glow(), MILKY_WAY_INTENSITY); + sky.destroy(); // A sky box without the knob (Cesium's own) is left alone. const plain = {}; f.effects.viewer.scene.skyBox = plain; From b00c7c12c8bc73ff3d12e5067f463d079f21462f Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 20 Oct 2026 13:45:36 +0400 Subject: [PATCH 15/45] refactor(sky): cut what the sky does not need - qa-anime-sky keeps only the Milky Way case; the satellites and keyless cases checked an anime shader this branch no longer changes. - Drop qa-sky-sun-moon.mjs: the viewer-options unit test covers it. - VisualEffects sets the sky's visibility directly: the viewer always carries a StarrySky and never outlives the effects. - Drop the unused star intensity knob, the malformed-row tolerance for our own pack, the test-only Transforms parameter and a private-name test. - DATA_SOURCES points to sky/README.md instead of repeating it. Co-Authored-By: Claude Opus 5.5 --- DATA_SOURCES.md | 13 +- scripts/format-scope.json | 1 - scripts/qa-anime-sky.mjs | 369 ++++++++-------------------------- scripts/qa-sky-sun-moon.mjs | 96 --------- src/sky/starrySky.js | 44 +--- src/sky/starrySky.test.mjs | 40 ++-- src/sky/stars.js | 33 +-- src/sky/stars.test.mjs | 8 +- src/ui/visualEffects.js | 15 +- src/ui/visualEffects.test.mjs | 27 +-- 10 files changed, 131 insertions(+), 515 deletions(-) delete mode 100644 scripts/qa-sky-sun-moon.mjs diff --git a/DATA_SOURCES.md b/DATA_SOURCES.md index a46dd1106..c65bafd9e 100644 --- a/DATA_SOURCES.md +++ b/DATA_SOURCES.md @@ -276,17 +276,8 @@ wiring (see below). ### Sky background (`sky/`) -The space behind the globe is drawn from two bundled sources (details, hashes -and build commands in [`sky/README.md`](src/data/local_data/sky/README.md)): - -- **Stars:** the Yale Bright Star Catalogue, 5th Revised Edition (Hoffleit & - Warren 1991, CDS catalogue V/50) — public domain; credited as a courtesy. -- **Milky Way glow:** ESO image eso0932a, "The Milky Way panorama" — **CC BY - 4.0, credit "ESO/S. Brunier"**. Modified: stars removed, blurred, reprojected - to ICRF cube faces and tone-mapped, as the folder README states. - -NASA SVS "Deep Star Maps 2020" was not used for the glow: its Milky Way layer -derives from Gaia DR2, which ESA licenses CC BY-NC 3.0 IGO. +Sources, licences, the changes CC BY asks to state, hashes and build commands +are in [`sky/README.md`](src/data/local_data/sky/README.md). ### DataSF Analysis Neighborhoods (`neighborhoods/`) diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 203fa7ed5..6d93c9e41 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1077,6 +1077,5 @@ "src/sky/starrySky.test.mjs", "src/tooling/skyAssets.test.mjs", "src/tooling/skyAssets.paintOut.test.mjs", - "scripts/qa-sky-sun-moon.mjs", "scripts/qa-anime-sky.mjs" ] diff --git a/scripts/qa-anime-sky.mjs b/scripts/qa-anime-sky.mjs index ae7ee69dc..b3ac1cf2d 100644 --- a/scripts/qa-anime-sky.mjs +++ b/scripts/qa-anime-sky.mjs @@ -1,81 +1,26 @@ #!/usr/bin/env node /** - * qa-anime-sky — the anime style must cel-shade the Earth, and leave the sky - * without bands. + * qa-anime-sky — the anime style must leave the sky without bands. * - * Earlier the anime shader exempted the far plane, judged from the - * post-process depth, from its luminance bands. That depth cannot tell the - * sky from far geometry, so the Earth lost its bands. The shader now matches - * main, and src/ui/visualEffects.js fades the Milky Way out with the style. - * Each case runs headless against a Vite dev server: + * Anime's luminance bands turn the faint Milky Way into blotches, so + * src/ui/visualEffects.js fades the glow out with the style. Headless against + * a Vite dev server, the real anime style looks away from the Earth at the + * Galactic Centre: at most 0.5 % of the sky (the stars) may reach the first + * band. * - * satellites whole globe from 20 000 km with the satellites layer on - * (near clamps to 0.1 m): no Earth pixel may skip the bands. - * keyless keyless stack, Denver 1700 m looking west: no terrain pixel - * above the ellipsoid horizon may skip the bands. - * milkyway the real anime style, looking away from the Earth at the - * Galactic Centre: at most 0.5 % of the sky (the stars) may - * reach the first band. - * - * The first two cases compile the checkout's anime shader with a debug - * output (R = pixel skipped the bands, G = raw depth 1.0) as an extra stage. - * - * Usage: node scripts/qa-anime-sky.mjs [--url http://localhost:4333/] [--case satellites|keyless|milkyway|all] - * Exit: 0 all pass, 1 a case failed, 2 a scenario was not reached or the case is unknown. + * Usage: node scripts/qa-anime-sky.mjs [--url http://localhost:4333/] + * Exit: 0 pass, 1 fail, 2 the anime style was not reached. */ import puppeteer from 'puppeteer'; -import { readFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -const opt = (name, fallback) => { - const i = process.argv.indexOf(`--${name}`); - return i > 0 && process.argv[i + 1] ? process.argv[i + 1] : fallback; -}; -const URL_ = opt('url', 'http://localhost:4333/'); -const ALL_CASES = ['satellites', 'keyless', 'milkyway']; -const requested = opt('case', 'all'); -const CASES = requested === 'all' ? ALL_CASES : [requested]; -if (!CASES.every((c) => ALL_CASES.includes(c))) { - console.error( - `unknown case ${requested}; expected ${ALL_CASES.join('|')}|all`, - ); - process.exit(2); -} +const i = process.argv.indexOf('--url'); +const URL_ = + i > 0 && process.argv[i + 1] ? process.argv[i + 1] : 'http://localhost:4333/'; -let fs = readFileSync( - fileURLToPath(new URL('../src/styles/anime.js', import.meta.url)), - 'utf8', -); -fs = fs - .slice(fs.indexOf('/* glsl */ `') + 12, fs.lastIndexOf('`')) - .replace('uniform float intensity;', 'const float intensity = 1.0;') - .replace('uniform float saturation;', 'const float saturation = 1.0;') - .replace('uniform float edgeThick;', 'const float edgeThick = 0.5;'); -if (!/uniform\s+sampler2D\s+depthTexture/.test(fs)) - fs = fs.replace( - 'uniform sampler2D colorTexture;', - 'uniform sampler2D colorTexture;\n uniform sampler2D depthTexture;', - ); -if (!/float bands\b/.test(fs)) - throw new Error( - 'anime.js has no `bands` variable: adapt the debug line of this script', - ); -fs = fs - .replace( - /out_FragColor = [^;]+;\s*}\s*$/, - `out_FragColor = mode < 0.5 ? texture(colorTexture, uv) - : vec4(bands > 255.0 ? 1.0 : 0.0, texture(depthTexture, uv).r >= 1.0 ? 1.0 : 0.0, 0.0, 1.0); - }`, - ) - .replace('void main()', 'uniform float mode;\n void main()'); - -const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); const browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox', '--ignore-gpu-blocklist'], }); -let failed = false, - unreached = false; try { const page = await browser.newPage(); page.on('pageerror', (e) => console.log('PAGEERR', String(e).slice(0, 300))); @@ -87,8 +32,8 @@ try { await page.waitForFunction(() => window.__godsEyeView?.viewer?.scene, { timeout: 120000, }); - await sleep(12000); - await page.evaluate(async (fs) => { + await new Promise((r) => setTimeout(r, 12000)); + const r = await page.evaluate(async () => { const entry = performance .getEntriesByType('resource') .map((e) => e.name) @@ -97,224 +42,80 @@ try { throw new Error( 'run against the Vite dev server (needs .vite/deps/cesium.js)', ); - const C = (window.__C = await import(entry)); - window.__dbg = window.__godsEyeView.viewer.scene.postProcessStages.add( - new C.PostProcessStage({ fragmentShader: fs, uniforms: { mode: 1 } }), + const C = await import(entry), + g = window.__godsEyeView, + v = g.viewer, + s = v.scene; + g.styleManager.setStyle('anime', { userInitiated: true }); + const t = v.clock.currentTime; + await C.Transforms.preloadIcrfFixed( + new C.TimeInterval({ + start: C.JulianDate.addDays(t, -1, new C.JulianDate()), + stop: C.JulianDate.addDays(t, 1, new C.JulianDate()), + }), ); - }, fs); - const setView = (v) => - page.evaluate((v) => { - const C = window.__C, - s = window.__godsEyeView.viewer.scene; - s.camera.cancelFlight(); - s.camera.setView({ - destination: C.Cartesian3.fromDegrees(v.lon, v.lat, v.h), - orientation: { - heading: C.Math.toRadians(v.heading ?? 0), - pitch: C.Math.toRadians(v.pitch), - roll: 0, - }, - }); - s.requestRender(); - }, v); - // returns per-pixel {exempt, raw1, ground?} counts - const measure = (truth) => - page.evaluate((truth) => { - const s = window.__godsEyeView.viewer.scene; - const read = () => { - s.requestRender(); - s.render(); - const gl = s.context._gl, - w = gl.drawingBufferWidth, - h = gl.drawingBufferHeight, - px = new Uint8Array(w * h * 4); - gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, px); - return px; - }; - window.__dbg.uniforms.mode = 1; - const px = read(); - let g; - if (truth) { - const keep = [s.skyAtmosphere, s.skyBox, s.sun, s.moon].map( - (o) => o && o.show, - ); - [s.skyAtmosphere, s.skyBox, s.sun, s.moon].forEach( - (o) => o && (o.show = false), - ); - window.__dbg.uniforms.mode = 0; - g = read(); - [s.skyAtmosphere, s.skyBox, s.sun, s.moon].forEach( - (o, i) => o && (o.show = keep[i]), - ); - window.__dbg.uniforms.mode = 1; - } - const r = { - total: px.length / 4, - near: s._view.frustumCommandsList[0]?.near ?? null, - frusta: s._view.frustumCommandsList.length, - geom: 0, - geomExempt: 0, - raw1: 0, - raw1Exempt: 0, - ground: 0, - groundRaw1: 0, - groundExempt: 0, - clearGlobeDepth: s._environmentState.clearGlobeDepth, - }; - for (let i = 0; i < px.length; i += 4) { - const ex = px[i] > 127, - raw1 = px[i + 1] > 127; - if (raw1) { - r.raw1++; - if (ex) r.raw1Exempt++; - } else { - r.geom++; - if (ex) r.geomExempt++; - } - if (g && g[i] + g[i + 1] + g[i + 2] > 6) { - r.ground++; - if (raw1) r.groundRaw1++; - if (ex) r.groundExempt++; - } - } - return r; - }, truth); - const verdict = (name, ok, reached, msg, r) => { - const tag = !reached ? 'UNREACHED' : ok ? 'PASS' : 'FAIL'; - if (!reached) unreached = true; - else if (!ok) failed = true; - console.log(`${tag} ${name}: ${msg}\n ${JSON.stringify(r)}`); - }; - - for (const c of CASES) { - if (c === 'satellites') { - await page.evaluate(() => - window.__godsEyeView.dataManager.setEnabled('satellites', true, { - origin: 'user', - }), - ); - await sleep(20000); - await setView({ lon: 10, lat: 20, h: 2.0e7, pitch: -90 }); - await sleep(5000); - const r = await measure(false); - verdict( - 'satellites', - r.geomExempt <= 0.01 * r.geom, - r.frusta > 0 && r.near !== null && r.near < 1 && r.geom > 50000, - `${r.geomExempt} of ${r.geom} Earth pixels exempt from cel-shading (near ${r.near} m)`, - r, - ); - await page.evaluate(() => - window.__godsEyeView.dataManager.setEnabled('satellites', false, { - origin: 'user', - }), - ); - await sleep(5000); - } else if (c === 'keyless') { - await setView({ - lon: -104.99, - lat: 39.74, - h: 1700, - heading: 270, - pitch: 0, - }); - await sleep(25000); - const r = await measure(true); - verdict( - 'keyless', - r.groundExempt <= 0.01 * r.ground, - r.clearGlobeDepth && r.groundRaw1 > 1000, - `${r.groundExempt} of ${r.ground} terrain pixels exempt (${r.groundRaw1} terrain pixels have raw depth 1.0)`, - r, - ); - } else if (c === 'milkyway') { - const r = await page.evaluate(async () => { - const C = window.__C, - g = window.__godsEyeView, - v = g.viewer, - s = v.scene; - window.__dbg.enabled = false; - g.styleManager.setStyle('anime', { userInitiated: true }); - const t = v.clock.currentTime; - await C.Transforms.preloadIcrfFixed( - new C.TimeInterval({ - start: C.JulianDate.addDays(t, -1, new C.JulianDate()), - stop: C.JulianDate.addDays(t, 1, new C.JulianDate()), - }), - ); - const m = C.Transforms.computeIcrfToFixedMatrix(t); - const ra = C.Math.toRadians(266.4), - dec = C.Math.toRadians(-29); - const look = C.Matrix3.multiplyByVector( - m, - new C.Cartesian3( - Math.cos(dec) * Math.cos(ra), - Math.cos(dec) * Math.sin(ra), - Math.sin(dec), - ), - new C.Cartesian3(), - ); - const north = C.Matrix3.multiplyByVector( - m, - C.Cartesian3.UNIT_Z, - new C.Cartesian3(), - ); - const right = C.Cartesian3.normalize( - C.Cartesian3.cross(look, north, new C.Cartesian3()), - new C.Cartesian3(), - ); - s.camera.cancelFlight(); - s.camera.setView({ - destination: C.Cartesian3.multiplyByScalar( - look, - 3e7, - new C.Cartesian3(), - ), - orientation: { - direction: look, - up: C.Cartesian3.cross(right, look, new C.Cartesian3()), - }, - }); - await new Promise((res) => setTimeout(res, 2500)); - s.requestRender(); - s.render(); - const gl = s.context._gl, - w = gl.drawingBufferWidth, - h = gl.drawingBufferHeight, - px = new Uint8Array(w * h * 4); - gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, px); - let banded = 0; - for (let i = 0; i < px.length; i += 4) - if (0.299 * px[i] + 0.587 * px[i + 1] + 0.114 * px[i + 2] >= 51) - banded++; - const out = { - total: px.length / 4, - banded, - visibility: s.skyBox.milkyWayVisibility, - animeOn: (() => { - const stages = s.postProcessStages; - for (let i = 0; i < stages.length; i++) { - const stage = stages.get(i); - if (stage.name === 'godsEyeView_anime') - return stage.enabled && stage.uniforms.intensity > 0.99; - } - return false; - })(), - }; - g.styleManager.setStyle('normal', { userInitiated: true }); - window.__dbg.enabled = true; - return out; - }); - verdict( - 'milkyway', - r.banded <= 0.005 * r.total, - r.total > 0 && r.animeOn, - `${r.banded} of ${r.total} sky pixels at or above the first cel band (luma >= 0.2)`, - r, - ); + const m = C.Transforms.computeIcrfToFixedMatrix(t); + const ra = C.Math.toRadians(266.4), + dec = C.Math.toRadians(-29); + const look = C.Matrix3.multiplyByVector( + m, + new C.Cartesian3( + Math.cos(dec) * Math.cos(ra), + Math.cos(dec) * Math.sin(ra), + Math.sin(dec), + ), + new C.Cartesian3(), + ); + const north = C.Matrix3.multiplyByVector( + m, + C.Cartesian3.UNIT_Z, + new C.Cartesian3(), + ); + const right = C.Cartesian3.normalize( + C.Cartesian3.cross(look, north, new C.Cartesian3()), + new C.Cartesian3(), + ); + s.camera.cancelFlight(); + s.camera.setView({ + destination: C.Cartesian3.multiplyByScalar(look, 3e7, new C.Cartesian3()), + orientation: { + direction: look, + up: C.Cartesian3.cross(right, look, new C.Cartesian3()), + }, + }); + await new Promise((res) => setTimeout(res, 2500)); + s.requestRender(); + s.render(); + const gl = s.context._gl, + w = gl.drawingBufferWidth, + h = gl.drawingBufferHeight, + px = new Uint8Array(w * h * 4); + gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, px); + let banded = 0; + for (let i = 0; i < px.length; i += 4) + if (0.299 * px[i] + 0.587 * px[i + 1] + 0.114 * px[i + 2] >= 51) banded++; + let animeOn = false; + for (let i = 0; i < s.postProcessStages.length; i++) { + const stage = s.postProcessStages.get(i); + if (stage.name === 'godsEyeView_anime') + animeOn = stage.enabled && stage.uniforms.intensity > 0.99; } - } + return { + total: px.length / 4, + banded, + visibility: s.skyBox.milkyWayVisibility, + animeOn, + }; + }); + const tag = !r.animeOn + ? 'UNREACHED' + : r.banded <= 0.005 * r.total + ? 'PASS' + : 'FAIL'; + console.log( + `${tag}: ${r.banded} of ${r.total} sky pixels at or above the first cel band (luma >= 0.2)\n ${JSON.stringify(r)}`, + ); + process.exitCode = tag === 'PASS' ? 0 : tag === 'FAIL' ? 1 : 2; } finally { await browser.close(); } -process.exitCode = failed ? 1 : unreached ? 2 : 0; diff --git a/scripts/qa-sky-sun-moon.mjs b/scripts/qa-sky-sun-moon.mjs deleted file mode 100644 index 12ec7e780..000000000 --- a/scripts/qa-sky-sun-moon.mjs +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env node -/** - * qa-sky-sun-moon — the custom sky must keep Cesium's Sun and Moon. - * - * CesiumWidget creates `scene.sun` and `scene.moon` only when the `skyBox` - * option is not `false`, so replacing the sky box the wrong way silently - * removes the Sun disc and its bloom. Points the camera at the Sun from - * 22 000 km and fails unless both bodies exist; saves a screenshot. - * - * Usage: node scripts/qa-sky-sun-moon.mjs [--url http://localhost:4317] [--out qa-shots/sky-sun.png] - */ -import puppeteer from 'puppeteer'; -import { mkdirSync } from 'node:fs'; -import path from 'node:path'; - -const argv = process.argv; -const option = (name, fallback) => - argv.includes(name) ? argv[argv.indexOf(name) + 1] : fallback; -const url = option('--url', 'http://localhost:4317'); -const out = option('--out', 'qa-shots/sky-sun.png'); -mkdirSync(path.dirname(out), { recursive: true }); - -const browser = await puppeteer.launch({ - headless: 'new', - args: ['--no-sandbox', '--ignore-gpu-blocklist'], -}); -try { - const page = await browser.newPage(); - await page.setViewport({ width: 1280, height: 800 }); - await page.evaluateOnNewDocument(() => - localStorage.setItem('gev:first-run-mission:v1', 'suppressed'), - ); - await page.goto(url, { waitUntil: 'domcontentloaded' }); - await page.waitForFunction(() => window.__godsEyeView?.viewer?.scene, { - timeout: 90_000, - }); - await new Promise((r) => setTimeout(r, 10_000)); - const info = await page.evaluate(async () => { - // The page's own Cesium instance, as Vite served it. - const entry = performance - .getEntriesByType('resource') - .map((e) => e.name) - .find((n) => /\.vite\/deps\/cesium\.js/.test(n)); - const C = await import(entry); - const { viewer } = window.__godsEyeView; - const scene = viewer.scene; - scene.camera.cancelFlight(); - const time = viewer.clock.currentTime; - const sun = C.Cartesian3.normalize( - C.Matrix3.multiplyByVector( - C.Transforms.computeTemeToPseudoFixedMatrix(time), - C.Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame( - time, - ), - new C.Cartesian3(), - ), - new C.Cartesian3(), - ); - // Off to the side of the Earth, looking straight at the Sun. - const side = C.Cartesian3.normalize( - C.Cartesian3.cross(sun, C.Cartesian3.UNIT_Z, new C.Cartesian3()), - new C.Cartesian3(), - ); - const destination = C.Cartesian3.add( - C.Cartesian3.multiplyByScalar(side, 2.2e7, new C.Cartesian3()), - C.Cartesian3.multiplyByScalar(sun, -0.6e7, new C.Cartesian3()), - new C.Cartesian3(), - ); - const up = C.Cartesian3.normalize( - C.Cartesian3.cross( - C.Cartesian3.cross(sun, C.Cartesian3.UNIT_Z, new C.Cartesian3()), - sun, - new C.Cartesian3(), - ), - new C.Cartesian3(), - ); - scene.camera.setView({ destination, orientation: { direction: sun, up } }); - scene.requestRender(); - return { - sun: Boolean(scene.sun), - moon: Boolean(scene.moon), - skyBox: scene.skyBox?.constructor?.name, - }; - }); - await new Promise((r) => setTimeout(r, 4_000)); - await page.evaluate(() => window.__godsEyeView.viewer.scene.requestRender()); - await new Promise((r) => setTimeout(r, 1_500)); - await page.screenshot({ path: out }); - console.log(JSON.stringify({ url, ...info, screenshot: out })); - if (!info.sun || !info.moon) { - console.error('FAIL: scene.sun and scene.moon must both exist'); - process.exitCode = 1; - } -} finally { - await browser.close(); -} diff --git a/src/sky/starrySky.js b/src/sky/starrySky.js index d538d430d..b31109fde 100644 --- a/src/sky/starrySky.js +++ b/src/sky/starrySky.js @@ -4,30 +4,16 @@ import { governorRequestRender } from '../renderGovernor.js'; import { buildStarVertices, STAR_VERTEX_FLOATS } from './stars.js'; /** - * Space background: catalogue stars drawn as point sprites over a soft Milky - * Way cube map, replacing Cesium's default Tycho-2 sky box (six 1024² JPEGs - * stretched 3–6× on screen, which read as compression blocks around the - * globe). - * - * Narrow, version-tested engine adapter. It takes the `Scene#skyBox` slot: - * Cesium calls `update(frameState, useHdr)` once per frame and executes the - * returned command first in the environment pass, before the atmosphere, sun, - * moon and every globe or tile command — so the sky stays behind everything - * without depth testing. Only `execute()` and `derivedCommands` of that - * command are read. An engine upgrade must revalidate this adapter. - * - * Both layers share one ICRF→Earth-fixed rotation (IAU 2006 precession, - * nutation and Earth rotation at the scene clock), so stars and the Milky - * Way agree with each other and with the real sky over the globe. Until - * Cesium's ICRF tables load, the TEME approximation the default sky box uses - * fills in; the arrival renders one frame through the idle governor. + * Space background in the `Scene#skyBox` slot: catalogue stars as point + * sprites over a soft Milky Way cube map, both turned by one ICRF→fixed + * rotation at the scene clock (TEME until Cesium's tables load). Scene runs + * the command from `update()` first in the environment pass, so the sky + * stays behind everything without depth. Revalidate on engine upgrades. */ export const STARRY_SKY_CESIUM_VERSION = '1.138.0'; /** Opacity of the Milky Way glow over black; the stars carry the sky. */ export const MILKY_WAY_INTENSITY = 0.4; -/** Overall star brightness multiplier. */ -export const STAR_INTENSITY = 1; /** Clock change, in seconds, below which the sky rotation is reused. */ export const SKY_ROTATION_EPSILON_SECONDS = 1; @@ -118,14 +104,13 @@ void main() `; const STAR_FS = ` -uniform float u_intensity; in vec4 v_color; in float v_sigma; in float v_radius; void main() { vec2 offset = (gl_PointCoord - 0.5) * (2.0 * v_radius); - float alpha = v_color.a * u_intensity * + float alpha = v_color.a * exp(-0.5 * dot(offset, offset) / (v_sigma * v_sigma)); if (alpha < 1.0 / 512.0) discard; out_FragColor = vec4(czm_gammaCorrect(v_color.rgb) * alpha, alpha); @@ -133,15 +118,12 @@ void main() `; /** Pick the ICRF→fixed rotation for `time`, or TEME while tables load. */ -export function computeSkyRotation( - time, - result, - transforms = Cesium.Transforms, -) { - const icrf = transforms.computeIcrfToFixedMatrix(time, result); +export function computeSkyRotation(time, result) { + const { Transforms } = Cesium; + const icrf = Transforms.computeIcrfToFixedMatrix(time, result); if (icrf) return { matrix: icrf, precise: true }; return { - matrix: transforms.computeTemeToPseudoFixedMatrix(time, result), + matrix: Transforms.computeTemeToPseudoFixedMatrix(time, result), precise: false, }; } @@ -169,7 +151,6 @@ export class StarrySky { this.milkyWayIntensity = MILKY_WAY_INTENSITY; /** 0..1 multiplier a style sets to hide the glow (see visualEffects.js). */ this.milkyWayVisibility = 1; - this.starIntensity = STAR_INTENSITY; this._requestRender = requestRender; this._rotation = Cesium.Matrix3.clone(Cesium.Matrix3.IDENTITY); this._rotationTime = undefined; @@ -197,10 +178,7 @@ export class StarrySky { u_milkyWay: () => this._milkyWayCubeMap, u_intensity: () => this.milkyWayIntensity * this.milkyWayVisibility, }; - this._starUniforms = { - ...uniforms, - u_intensity: () => this.starIntensity, - }; + this._starUniforms = uniforms; const commands = []; this._commands = commands; // The environment pass reads `derivedCommands` (log depth, HDR, picking) diff --git a/src/sky/starrySky.test.mjs b/src/sky/starrySky.test.mjs index d6488fd1d..c6e318519 100644 --- a/src/sky/starrySky.test.mjs +++ b/src/sky/starrySky.test.mjs @@ -25,19 +25,25 @@ test('the ICRF rotation is preferred and TEME fills in while tables load', () => const time = Cesium.JulianDate.fromIso8601('2026-10-19T00:00:00Z'); const icrf = Cesium.Matrix3.fromRotationZ(0.3); const teme = Cesium.Matrix3.fromRotationZ(0.2); - const precise = computeSkyRotation(time, new Cesium.Matrix3(), { - computeIcrfToFixedMatrix: (_, result) => Cesium.Matrix3.clone(icrf, result), - computeTemeToPseudoFixedMatrix: () => assert.fail('TEME not needed'), - }); - assert.equal(precise.precise, true); - assert.ok(Cesium.Matrix3.equals(precise.matrix, icrf)); - const approximate = computeSkyRotation(time, new Cesium.Matrix3(), { - computeIcrfToFixedMatrix: () => undefined, - computeTemeToPseudoFixedMatrix: (_, result) => - Cesium.Matrix3.clone(teme, result), - }); - assert.equal(approximate.precise, false); - assert.ok(Cesium.Matrix3.equals(approximate.matrix, teme)); + const { Transforms } = Cesium; + const original = { ...Transforms }; + try { + Transforms.computeIcrfToFixedMatrix = (_, result) => + Cesium.Matrix3.clone(icrf, result); + Transforms.computeTemeToPseudoFixedMatrix = () => + assert.fail('TEME not needed'); + const precise = computeSkyRotation(time, new Cesium.Matrix3()); + assert.equal(precise.precise, true); + assert.ok(Cesium.Matrix3.equals(precise.matrix, icrf)); + Transforms.computeIcrfToFixedMatrix = () => undefined; + Transforms.computeTemeToPseudoFixedMatrix = (_, result) => + Cesium.Matrix3.clone(teme, result); + const approximate = computeSkyRotation(time, new Cesium.Matrix3()); + assert.equal(approximate.precise, false); + assert.ok(Cesium.Matrix3.equals(approximate.matrix, teme)); + } finally { + Object.assign(Transforms, original); + } }); test('the TEME fallback keeps the celestial pole on the Earth axis', () => { @@ -127,11 +133,3 @@ test('the Milky Way glow scales with its visibility, for styles that hide it', ( assert.equal(sky._milkyWayUniforms.u_intensity(), 0); sky.destroy(); }); - -test('the Milky Way stays out of the environment map that lights models', () => { - // Scene#render hands `skyBox._cubeMap` to image-based lighting, which - // expects Cesium's own TEME, flipY layout; this ICRF map would be rotated. - const sky = new StarrySky({ requestRender: () => {} }); - assert.equal('_cubeMap' in sky, false); - sky.destroy(); -}); diff --git a/src/sky/stars.js b/src/sky/stars.js index 203e1b2e5..117823eb7 100644 --- a/src/sky/stars.js +++ b/src/sky/stars.js @@ -109,38 +109,17 @@ export function bvToRgb(bv) { return rgb.map((channel) => channel / peak); } -/** - * Decode a catalogue pack into interleaved vertex data, `STAR_VERTEX_FLOATS` - * per star. Malformed rows are skipped, never thrown on: a damaged pack must - * not take the globe down with it. - */ -export function buildStarVertices(pack) { - const stars = Array.isArray(pack?.stars) ? pack.stars : []; - const count = Math.floor(stars.length / 4); +/** Decode a catalogue pack into interleaved vertex data, `STAR_VERTEX_FLOATS` per star. */ +export function buildStarVertices({ stars }) { + const count = stars.length / 4; const vertices = new Float32Array(count * STAR_VERTEX_FLOATS); - let written = 0; for (let i = 0; i < count; i++) { const [raDeg, decDeg, vmag, bv] = stars.slice(i * 4, i * 4 + 4); - if ( - !Number.isFinite(raDeg) || - !Number.isFinite(decDeg) || - !Number.isFinite(vmag) - ) - continue; - const [x, y, z] = raDecToUnitVector(raDeg, decDeg); const { sigmaPx, alpha } = starAppearance(vmag); - const [r, g, b] = bvToRgb(bv); vertices.set( - [x, y, z, sigmaPx, r, g, b, alpha], - written * STAR_VERTEX_FLOATS, + [...raDecToUnitVector(raDeg, decDeg), sigmaPx, ...bvToRgb(bv), alpha], + i * STAR_VERTEX_FLOATS, ); - written += 1; } - return { - count: written, - vertices: - written === count - ? vertices - : vertices.slice(0, written * STAR_VERTEX_FLOATS), - }; + return { count, vertices }; } diff --git a/src/sky/stars.test.mjs b/src/sky/stars.test.mjs index 6dba55971..2a48c341b 100644 --- a/src/sky/stars.test.mjs +++ b/src/sky/stars.test.mjs @@ -82,9 +82,9 @@ test('B−V colours run from blue-white to orange with the peak channel at 1', ( assert.deepEqual(bvToRgb(9), bvToRgb(2)); }); -test('vertex data is interleaved per star and skips malformed rows', () => { +test('vertex data is interleaved per star', () => { const { count, vertices } = buildStarVertices({ - stars: [0, 0, 1, 0.5, 'bad', 10, 2, 0, 90, 45, 3, null, 10, 20], + stars: [0, 0, 1, 0.5, 90, 45, 3, null], }); assert.equal(count, 2); assert.equal(vertices.length, 2 * STAR_VERTEX_FLOATS); @@ -93,10 +93,6 @@ test('vertex data is interleaved per star and skips malformed rows', () => { close(vertices[STAR_VERTEX_FLOATS + 2], Math.SQRT1_2, 1e-6); close(vertices[3], starAppearance(1).sigmaPx, 1e-6); close(vertices[7], starAppearance(1).alpha, 1e-6); - assert.deepEqual(buildStarVertices(null), { - count: 0, - vertices: new Float32Array(0), - }); }); test('the committed catalogue holds the Yale Bright Star Catalogue', () => { diff --git a/src/ui/visualEffects.js b/src/ui/visualEffects.js index b4a3cec0b..f99ef3345 100644 --- a/src/ui/visualEffects.js +++ b/src/ui/visualEffects.js @@ -116,11 +116,8 @@ export class VisualEffects { // a post-process cannot tell the sky from far geometry reliably (near // plane clamps, keyless terrain above the ellipsoid horizon): fade the // glow out with the style instead. Bright stars survive as banded points. - if (stage === this.stages.anime) { - const sky = this.viewer.scene?.skyBox; - if (sky && 'milkyWayVisibility' in sky) - sky.milkyWayVisibility = 1 - value; - } + if (stage === this.stages.anime) + this.viewer.scene.skyBox.milkyWayVisibility = 1 - value; if (stage.enabled && stage.uniforms.time !== undefined) this.startAnimationLoop(); this.requestRender('style-stage'); @@ -228,7 +225,7 @@ export class VisualEffects { this.transitions.clear(); } - /** Remove owned stages and restore the borrowed bloom stage and sky after callers release them. */ + /** Remove owned stages and restore the borrowed bloom stage after callers release it. */ destroy() { if (this.destroyed) return; this.stop(); @@ -240,11 +237,5 @@ export class VisualEffects { Object.assign(this.bloomStage.uniforms, this.previousBloom.uniforms); this.bloomStage.enabled = this.previousBloom.enabled; } - // Anime may have faded the Milky Way out; a surviving viewer gets it back. - const sky = this.viewer.scene.skyBox; - if (sky && 'milkyWayVisibility' in sky) { - sky.milkyWayVisibility = 1; - this.requestRender('style-stage'); - } } } diff --git a/src/ui/visualEffects.test.mjs b/src/ui/visualEffects.test.mjs index 3d86e3a48..e2abbc35c 100644 --- a/src/ui/visualEffects.test.mjs +++ b/src/ui/visualEffects.test.mjs @@ -37,7 +37,9 @@ function fixture() { }, }; const effects = new VisualEffects({ - viewer: { scene: { postProcessStages: pipeline } }, + viewer: { + scene: { postProcessStages: pipeline, skyBox: { milkyWayVisibility: 1 } }, + }, requestRender: (reason) => requests.push(reason), holdRender: (reason) => holds.add(reason), releaseRender: (reason) => holds.delete(reason), @@ -174,32 +176,9 @@ test('the anime stage fades the Milky Way out with its own intensity', () => { f.effects.setStageIntensity(f.effects.stages.anime, 0); assert.equal(glow(), MILKY_WAY_INTENSITY); sky.destroy(); - // A sky box without the knob (Cesium's own) is left alone. - const plain = {}; - f.effects.viewer.scene.skyBox = plain; - f.effects.setStageIntensity(f.effects.stages.anime, 1); - assert.deepEqual(plain, {}); f.effects.destroy(); }); -test('destroying the effects gives a surviving viewer its Milky Way back', () => { - const f = fixture(); - const sky = { milkyWayVisibility: 1 }; - f.effects.viewer.scene.skyBox = sky; - f.effects.initStyles(); - f.effects.startTransition('anime', 0, 1); - f.tick(250); - f.effects.stop(); - const frozen = sky.milkyWayVisibility; - assert.ok( - frozen > 0 && frozen < 1, - 'stop keeps the stages, and the fade, as they are', - ); - f.effects.destroy(); - assert.equal(sky.milkyWayVisibility, 1); - assert.equal(f.requests.at(-1), 'style-stage'); -}); - test('bloom retains its dead zone, normalized intensity and independent toggle', () => { const f = fixture(); f.effects.initPostProcess(); From 8c33c6f34953d6e2f73b8927ef762e94ce8d914e Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 20 Oct 2026 13:56:44 +0400 Subject: [PATCH 16/45] docs(sky): shorten the sky comments and README, fix three stale ones The far-plane comment said z = w (the code puts z just under w), the Milky Way constant is a brightness, not an opacity, and the CDS acknowledgement lives in the Data attribution popover, not DATA_SOURCES.md. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1243-starfield-sky.md | 8 ++-- scripts/build-bright-stars.mjs | 2 +- scripts/build-milky-way.mjs | 44 ++++++++------------- src/app/viewer.js | 5 +-- src/data/local_data/sky/README.md | 63 +++++++++++-------------------- src/sky/starrySky.js | 6 +-- src/sky/stars.js | 10 ++--- src/tooling/skyAssets.test.mjs | 2 +- src/ui/visualEffects.js | 6 +-- 9 files changed, 54 insertions(+), 92 deletions(-) diff --git a/changelog.d/1243-starfield-sky.md b/changelog.d/1243-starfield-sky.md index d3ecbaf95..04d0cfbf8 100644 --- a/changelog.d/1243-starfield-sky.md +++ b/changelog.d/1243-starfield-sky.md @@ -1,5 +1,5 @@ - Replace the blocky JPEG sky around the globe with the 9,096 stars of the - Yale Bright Star Catalogue, drawn as sharp points at their catalogue - positions for the scene clock, over a soft Milky Way built from ESO/S. - Brunier's panorama (CC BY 4.0). The Sun and Moon stay, the anime style fades - the Milky Way out, and the new assets weigh 296 kB (gekh, #1243). + Yale Bright Star Catalogue, drawn as sharp points where they are at the + scene time, over a soft Milky Way from ESO/S. Brunier (CC BY 4.0). The Sun + and Moon stay; the anime style hides the Milky Way. Assets: 296 kB (gekh, + #1243). diff --git a/scripts/build-bright-stars.mjs b/scripts/build-bright-stars.mjs index 45a6aaab3..95568935b 100644 --- a/scripts/build-bright-stars.mjs +++ b/scripts/build-bright-stars.mjs @@ -8,7 +8,7 @@ * Format: fixed-width ASCII, 197 bytes per record, byte layout in * https://cdsarc.cds.unistra.fr/ftp/V/50/ReadMe * License: public domain (Yale University Observatory / NASA ADC); CDS asks - * for an acknowledgement, which DATA_SOURCES.md carries. + * for an acknowledgement, which the Data attribution popover carries. * * Transform (deterministic): * 1. J2000 RA/Dec (bytes 76-90), V magnitude (103-107) and B−V (110-114). diff --git a/scripts/build-milky-way.mjs b/scripts/build-milky-way.mjs index 55c7f8225..a6af99dec 100644 --- a/scripts/build-milky-way.mjs +++ b/scripts/build-milky-way.mjs @@ -14,27 +14,16 @@ * Centre, galactic longitude increasing to the left. * * Transform (deterministic): - * 1. Resample to WORK_WIDTH×WORK_WIDTH/2 and convert sRGB to linear light. - * 2. Remove stars with a morphological opening (minimum, then maximum, over - * a (2·OPEN_RADIUS+1)² window): anything smaller than the window — every - * star — drops to the surrounding sky; the renderer draws catalogue stars - * itself, sharp and in the right place. - * 3. Paint out the planets the 2008–2010 exposures caught (PLANETS): they - * sit where today's sky has nothing and are far brighter than any star. - * 4. Blur with a three-pass box approximation of a Gaussian, σ = BLUR_DEG on - * the sky: rows wrap in longitude and widen by 1/cos(latitude) so the - * blur stays round towards the poles. Faint glow blends to a second, - * FAINT_BLUR_DEG blur, so it carries no clumps of unresolved stars. - * 5. Resample into six FACE_SIZE² cube faces in the standard WebGL face - * orientation (the renderer uploads them without flipY), with the ICRF - * axes as the cube axes — +X to the March equinox, +Z to the north - * celestial pole — rotating each direction into galactic coordinates - * with the IAU J2000 matrix. - * 6. Map the median sky to black, easing in with a soft knee, and the - * brightest 0.01 % to about 97 % white, the knee's offset there (both - * levels taken before the faint-glow blend; on luminance, keeping each - * pixel's hue), - * encode with gamma 1/2.2 and ±0.5 LSB dither against banding; WebP. + * 1. Resample to WORK_WIDTH×WORK_WIDTH/2, sRGB to linear light. + * 2. Remove stars with a morphological opening: the renderer draws + * catalogue stars itself, sharp and in the right place. + * 3. Paint out the planets the 2008–2010 exposures caught (PLANETS). + * 4. Blur, round on the sphere: σ = BLUR_DEG, widening to FAINT_BLUR_DEG + * in the faint glow so unresolved stars leave no clumps. + * 5. Resample into six WebGL cube faces (uploaded without flipY) with the + * ICRF axes: +X to the March equinox, +Z to the north celestial pole. + * 6. Median sky to black with a soft knee, brightest 0.01 % to ~97 % + * white, on luminance to keep the hue; gamma 1/2.2, dither, WebP. * * Usage: * node scripts/build-milky-way.mjs @@ -46,19 +35,16 @@ import { fileURLToPath } from 'node:url'; export const FACE_SIZE = 1024; export const BLUR_DEG = 0.4; -// Faint glow takes a much wider blur: there the panorama is grain of -// unresolved stars, which a 0.4° blur leaves as clumps. Bright parts keep the -// fine blur and their dust lanes; FAINT_RANGE (fraction of black-to-white) -// is where the two blend. +// Faint glow is grain of unresolved stars and needs the wide blur; bright +// parts keep the fine one and their dust lanes. FAINT_RANGE (fraction of +// black-to-white) is where the two blend. export const FAINT_BLUR_DEG = 2; const FAINT_RANGE = [0.005, 0.08]; const WORK_WIDTH = 4096; const OPEN_RADIUS = 3; const WEBP_QUALITY = 96; -// The median sky is the black level: away from the galactic plane the -// panorama carries a mottled glow of unresolved stars and dust that reads as -// grey blotches around the globe. A hard cut there draws edges of its own, so -// the level eases in over SOFT_KNEE (a fraction of the black-to-white range). +// The median sky is black: above it the glow away from the plane reads as +// grey blotches. SOFT_KNEE eases the cut in so it draws no edges. const BLACK_PERCENTILE = 0.5; const SOFT_KNEE = 0.03; const WHITE_PERCENTILE = 0.9999; diff --git a/src/app/viewer.js b/src/app/viewer.js index 633616fef..cedfbb020 100644 --- a/src/app/viewer.js +++ b/src/app/viewer.js @@ -118,9 +118,8 @@ export function applicationViewerOptions(creditContainer) { selectionIndicator: false, infoBox: false, baseLayer: false, - // Instead of the default Tycho-2 cube map, whose JPEG blocks show around - // the whole globe. Passed here, not assigned later: `skyBox: false` would - // also stop CesiumWidget from creating the Sun and the Moon. + // Replaces the blocky Tycho-2 default. An option, not `skyBox: false`, + // which would also stop CesiumWidget from creating the Sun and Moon. skyBox: new StarrySky(), creditContainer, msaaSamples: 4, diff --git a/src/data/local_data/sky/README.md b/src/data/local_data/sky/README.md index e20b1fb77..9bf106d31 100644 --- a/src/data/local_data/sky/README.md +++ b/src/data/local_data/sky/README.md @@ -1,9 +1,7 @@ # Sky background -The space behind the globe (`src/sky/starrySky.js`): catalogue stars drawn as -sharp point sprites over a soft Milky Way cube map. It replaces Cesium's -default Tycho-2 sky box, whose six 1024² JPEGs stretch 3–6× around the -whole-globe view and show compression blocks. +Catalogue stars over a soft Milky Way, drawn by `src/sky/starrySky.js` in +place of Cesium's blocky Tycho-2 sky box. | File | Content | Size | | ---- | ------- | ---- | @@ -12,57 +10,42 @@ whole-globe view and show compression blocks. ## Stars — Yale Bright Star Catalogue -**Source:** Yale Bright Star Catalogue, 5th Revised Edition (Hoffleit & -Warren 1991), CDS VizieR catalogue +**Source:** 5th Revised Edition (Hoffleit & Warren 1991), CDS catalogue [V/50](https://cdsarc.cds.unistra.fr/viz-bin/cat/V/50), file `https://cdsarc.cds.unistra.fr/ftp/V/50/catalog.gz` (sha256 `3dc44b1e90be8fbe5bcc7656032560f51275f985c7e3f783c9028e1838ec7bed`, fetched 2026-10-19). -**License:** public domain (Yale University Observatory / NASA Astronomical -Data Center). CDS asks for an acknowledgement; the in-app "Data attribution" -popover carries it. +**License:** public domain. CDS asks for an acknowledgement; the "Data +attribution" popover carries it. -**Build:** `node scripts/build-bright-stars.mjs [catalog.gz]` — every record -with a J2000 position (14 novae and non-stellar entries dropped), RA/Dec -rounded to 0.001°, magnitudes to 0.01. The renderer maps magnitude to sprite -width and opacity and B−V to a desaturated black-body colour -(`src/sky/stars.js`). +**Build:** `node scripts/build-bright-stars.mjs [catalog.gz]`. Drops the 14 +records without a J2000 position; rounds RA/Dec to 0.001° and magnitudes to +0.01. ## Milky Way — ESO/S. Brunier -**Source:** "The Milky Way panorama", ESO image -[eso0932a](https://www.eso.org/public/images/eso0932a/), full-size original +**Source:** ESO image [eso0932a](https://www.eso.org/public/images/eso0932a/), `https://cdn.eso.org/images/original/eso0932a.tif` (6000×3000 sRGB TIFF, sha256 `10f209ab83e1fd89e7fa1ed70277ffc6ed19c43549f04ec637c6806d98aff035`, fetched -2026-10-19). Plate carrée in galactic coordinates, centred on the Galactic -Centre. +2026-10-19). -**License:** [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) -(). **Credit: ESO/S. Brunier.** +**License:** [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). +**Credit: ESO/S. Brunier.** -**Changes made** (CC BY 4.0 asks for them to be stated): resampled to -4096×2048, stars removed with a 7×7 morphological opening, two planets -(Jupiter, by position) painted over with the median of the surrounding sky, -blurred (σ = 0.4°, blending to σ = 2° in the faint glow so unresolved -stars leave no clumps), reprojected from galactic coordinates to ICRF cube faces, -black level set at the median sky with a soft knee (the faint glow away -from the galactic plane fades to black), gamma-encoded and saved as -WebP. Build: -`node scripts/build-milky-way.mjs `. +**Changes made** (CC BY 4.0 asks for them): resampled to 4096×2048; stars +removed; two images of Jupiter painted over; blurred (0.4°, 2° in the faint +glow); reprojected to ICRF cube faces; black level at the median sky; saved as +WebP. Build: `node scripts/build-milky-way.mjs `. -The panorama is a photographic mosaic, not an astrometric map: bright stars -sit up to ~2° from their catalogue positions. That is invisible in a glow -blurred this much, and every sharp star on screen comes from the catalogue. +The panorama's stars sit up to ~2° off; that is invisible in the blurred glow, +and every sharp star comes from the catalogue. -The NASA SVS "Deep Star Maps 2020" Milky Way layer was considered and not -used: it is derived from Gaia DR2, which ESA distributes under CC BY-NC 3.0 -IGO with prior authorization required for commercial use. +NASA SVS "Deep Star Maps 2020" was not used: it derives from Gaia DR2, which +ESA licenses CC BY-NC 3.0 IGO. ## Frame -Both layers are in ICRF/J2000. The cube faces use the standard WebGL face -layout with +X towards the March equinox and +Z towards the north celestial -pole, uploaded without `flipY`. At runtime one rotation — -`Transforms.computeIcrfToFixedMatrix` at the scene clock — turns both into -Earth-fixed coordinates. +Both layers are in ICRF/J2000. The cube faces use the WebGL face layout, +X +to the March equinox and +Z to the north celestial pole, uploaded without +`flipY`. diff --git a/src/sky/starrySky.js b/src/sky/starrySky.js index b31109fde..8cd7f5d58 100644 --- a/src/sky/starrySky.js +++ b/src/sky/starrySky.js @@ -12,7 +12,7 @@ import { buildStarVertices, STAR_VERTEX_FLOATS } from './stars.js'; */ export const STARRY_SKY_CESIUM_VERSION = '1.138.0'; -/** Opacity of the Milky Way glow over black; the stars carry the sky. */ +/** Brightness of the Milky Way glow; the stars carry the sky. */ export const MILKY_WAY_INTENSITY = 0.4; /** Clock change, in seconds, below which the sky rotation is reused. */ export const SKY_ROTATION_EPSILON_SECONDS = 1; @@ -48,8 +48,8 @@ const MILKY_WAY_FACE_URLS = Object.freeze({ ), }); -// Directions, not points: w = 0 drops the camera translation, and z = w puts -// every fragment on the far plane, inside the clip volume at any frustum. +// Directions, not points: w = 0 drops the camera translation, and z just +// under w keeps every fragment at the far plane, inside any frustum. const SKY_DIRECTION_GLSL = ` uniform mat3 u_icrfToFixed; vec4 skyClipPosition(vec3 icrfDirection) diff --git a/src/sky/stars.js b/src/sky/stars.js index 117823eb7..9fd5aa698 100644 --- a/src/sky/stars.js +++ b/src/sky/stars.js @@ -3,17 +3,13 @@ * * Pure functions, no Cesium. The pack is `local_data/sky/bright_stars.json` * (Yale Bright Star Catalogue, built by scripts/build-bright-stars.mjs): a - * flat `[raDeg, decDeg, vmag, bv, …]` array in ICRF/J2000. - * - * Every star is drawn as a point sprite holding a small Gaussian. Its width - * is set in CSS pixels and scaled by the device pixel ratio in the shader, so - * a star covers the same screen area at any DPR and stays a crisp dot rather - * than a texel stretched across several pixels. + * flat `[raDeg, decDeg, vmag, bv, …]` array in ICRF/J2000. Each star is a + * small Gaussian sprite, sized in CSS pixels so it stays a crisp dot at any DPR. * * @module sky/stars */ -/** Faintest magnitude drawn distinctly (fainter catalogue stars look like it); the brightness reference. */ +/** Brightness reference; fainter catalogue stars are drawn like it. */ export const STAR_LIMIT_MAGNITUDE = 6.5; /** Gaussian σ of the faintest star, CSS pixels. */ export const STAR_MIN_SIGMA_PX = 0.55; diff --git a/src/tooling/skyAssets.test.mjs b/src/tooling/skyAssets.test.mjs index 75e0ad063..07f7596a5 100644 --- a/src/tooling/skyAssets.test.mjs +++ b/src/tooling/skyAssets.test.mjs @@ -93,7 +93,7 @@ test('plate carrée is centred on longitude 0, growing to the left, north up', ( }); test('the galactic rotation puts the Galactic Centre and pole where the IAU does', () => { - // Sgr A*-adjacent origin l = b = 0 at RA 266.405°, Dec −28.936° (J2000). + // Galactic origin l = b = 0 at RA 266.405°, Dec −28.936° (J2000). const centre = icrfToGalactic(raDecToUnitVector(266.40499, -28.93617)); close(centre[0], 1, 1e-6); // North galactic pole at RA 192.85948°, Dec +27.12825°. diff --git a/src/ui/visualEffects.js b/src/ui/visualEffects.js index f99ef3345..24cff6189 100644 --- a/src/ui/visualEffects.js +++ b/src/ui/visualEffects.js @@ -112,10 +112,8 @@ export class VisualEffects { if (this.stopped || !stage) return; stage.uniforms.intensity = value; stage.enabled = value > 0.001; - // Anime's four luminance bands turn the faint Milky Way into blotches, and - // a post-process cannot tell the sky from far geometry reliably (near - // plane clamps, keyless terrain above the ellipsoid horizon): fade the - // glow out with the style instead. Bright stars survive as banded points. + // Anime's bands turn the faint Milky Way into blotches, and depth cannot + // tell the sky from far geometry, so the glow fades with the style. if (stage === this.stages.anime) this.viewer.scene.skyBox.milkyWayVisibility = 1 - value; if (stage.enabled && stage.uniforms.time !== undefined) From 3eb585fe49ab340cdd7e068a4afefcc474a84a3d Mon Sep 17 00:00:00 2001 From: Enzo Abyie Date: Wed, 21 Oct 2026 12:52:34 +0400 Subject: [PATCH 17/45] i18n(zh-CN): Simplified Chinese strings from #914 The Simplified Chinese locale by abiyeenzo (#914), converted from its namespaced JS catalogs to the English-keyed zh-CN.json: 891 entries whose English still matches the current UI. --- src/i18n/locales/zh-CN.json | 907 ++++++++++++++++++++++++++++++++++++ 1 file changed, 907 insertions(+) create mode 100644 src/i18n/locales/zh-CN.json diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json new file mode 100644 index 000000000..cbedad420 --- /dev/null +++ b/src/i18n/locales/zh-CN.json @@ -0,0 +1,907 @@ +{ + "Flying to Austin, TX...": "正在飞往德克萨斯州奥斯汀…", + "Restoring shared view...": "正在恢复共享视图…", + "Configuring viewer...": "正在配置视图…", + "Loading Google 3D Tiles...": "正在加载 Google 3D Tiles…", + "Loading the keyless globe...": "正在加载免密钥地球…", + "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tiles 不可用({detail})。正在加载免密钥地球…", + "Initializing systems...": "正在初始化系统…", + "Close data attribution": "关闭数据来源说明", + "UNAVAILABLE": "不可用", + "SOURCE": "来源", + "Overpass rate-limited": "Overpass 已限流", + "Overpass timed out": "Overpass 超时", + "Overpass could not complete the query": "Overpass 无法完成查询", + "Overpass temporarily unavailable": "Overpass 暂时不可用", + "Retrying mapped sites…": "正在重试地图站点…", + "Fetching mapped sites…": "正在获取地图站点…", + "{reason} — retrying in {seconds}s": "{reason}——{seconds} 秒后重试", + "{reason} — retry pending": "{reason}——等待重试", + "Zoom in to search mapped installations": "请放大地图以搜索地图标注的设施", + "Showing cached mapped sites": "正在显示缓存的地图站点", + "Mapped sites not loaded": "地图站点未加载", + "Mapped sites loaded": "已加载地图站点", + "Mapped installation": "地图标注设施", + "military flight": "军用航班", + "feed unavailable": "数据源不可用", + "feed stale": "数据源过期", + "observed or mapped nearby context": "附近有观测或地图标注的上下文", + "no observed or mapped objects in current feeds": "当前数据源中没有观测或地图标注的对象", + "STATION": "电台", + "Crewed stations and their visiting vehicles": "载人空间站及其访问飞行器", + "NAV": "导航", + "GNSS navigation — GPS, GLONASS, Galileo": "GNSS 导航:GPS、GLONASS、Galileo", + "GEO": "GEO", + "Geostationary belt — comms and weather, fixed over the equator": "地球静止轨道带:通信和气象,固定在赤道上空", + "VISUAL": "可见", + "Brightest naked-eye objects — CelesTrak visual group": "最亮的肉眼可见天体:CelesTrak visual 组", + "COMMS": "通信", + "Broadband constellation shell — shown only in DENSE mode": "宽带星座:仅在“密集”模式下显示", + "FISHING": "渔船", + "TOWING": "拖带", + "DREDGER": "挖泥船", + "DIVE OPS": "潜水作业", + "MILITARY": "军用", + "SAILING": "帆船", + "PLEASURE": "游艇", + "PILOT": "引航", + "SAR": "搜救", + "TUG": "拖轮", + "PORT TENDER": "港口供应船", + "ANTI-POLLUTION": "防污染", + "LAW ENFORCE": "执法", + "MEDICAL": "医疗", + "HIGH-SPEED": "高速", + "PASSENGER": "客船", + "CARGO": "货船", + "TANKER": "油轮", + "OTHER": "其他", + "ENVIRONMENTAL": "环境", + "EARTH WATCH": "地球监测", + "ACTIVE EVENTS": "活跃事件", + "Starting live contacts…": "正在启动实时目标…", + "Opening space missions…": "正在打开太空任务…", + "Scanning active events…": "正在扫描活跃事件…", + "Live earthquakes and active fires, from USGS and NASA": "来自 USGS 和 NASA 的实时地震与活跃火点", + "It feels like a forbidden cockpit—then you realize the sources are public and the data is real.": "它像一座禁地座舱——然后你会发现,数据来源都是公开的,数据都是真实的。", + "Working…": "处理中…", + "Could not open that mission{detail}. Retry or explore manually.": "无法打开该任务{detail}。请重试或手动探索。", + "This browser is blocking storage, so that could not be saved.": "此浏览器阻止了存储,因此无法保存。", + "NORMAL": "常规", + "CRT": "CRT", + "NVG": "NVG", + "FLIR": "FLIR", + "ANIME": "动漫", + "NOIR": "黑色电影", + "SNOW": "雪景", + "LOADING": "加载中", + "DEGRADED": "降级", + "STALE": "过期", + "PARTIAL": "部分", + "FALLBACK": "备用", + "{state} {layers}": "{state} {layers}", + "SUMMARY": "摘要", + "Awaiting telemetry...": "等待遥测数据…", + "REC": "REC", + "AIS: --": "AIS: --", + "POWER UP · {count} KEYS WAITING": { + "other": "启动 · {count} 个密钥待配置" + }, + "POWERED UP": "已启动", + "Save failed ({status}).": "保存失败({status})。", + "REMOVE": "移除", + "Remove {title} from this app's saved keys": "从本应用已保存的密钥中移除 {title}", + "your app configuration": "你的应用配置", + "your local .env": "你的本地 .env", + "Saving…": "正在保存…", + "Save failed: {detail}": "保存失败:{detail}", + "Paste at least one key first.": "请先至少粘贴一个密钥。", + "Saved to {store}. Restarting — this page reloads itself.": "已保存到{store}。正在重启——本页面将自动重新加载。", + "Remove this key from your saved configuration?": "要从已保存的配置中移除此密钥吗?", + "Removed from {store}. Restarting — this page reloads itself.": "已从{store}中移除。正在重启——本页面将自动重新加载。", + "Places context + Street View fallback; optional separate key": "地点上下文 + 街景备用;可选的独立密钥", + "Live ships, worldwide": "全球实时船舶", + "Live active-fire detections": "实时活跃火点探测", + "Real live traffic (keyless runs a simulation)": "真实实时路况(无密钥时为模拟)", + "Bing imagery map stacks + world terrain": "Bing 影像地图组合 + 全球地形", + "More flight-polling credits (anonymous works without)": "更多航班轮询额度(匿名也可使用)", + "CONTEXT READY": "上下文就绪", + "GLOBAL CONTEXT OFF": "全局上下文已关闭", + "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "选择一个航班、船舶或地图标注设施", + "ENABLE TO LOAD OBSERVED / MAPPED PROXIMITY": "启用以加载观测 / 地图标注的邻近信息", + "Unavailable": "不可用", + "Focus {label}": "聚焦 {label}", + "Global Context navigation": "全局上下文导航", + "Previous — prior visited contact in the 250 km window": "上一个:250 km 范围内先前访问过的目标", + "PREVIOUS": "上一个", + "FOCUS": "聚焦", + "Next — nearest unvisited contact in the 250 km window": "下一个:250 km 范围内最近的未访问目标", + "NEXT": "下一个", + "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "开源的地图标注/观测上下文。缺失的广播、未加载的地图区域或未标注的站点不能作为不存在的证据。", + "HDG {value}°": "HDG {value}°", + "BRG {value}°": "BRG {value}°", + "BRG —": "BRG —", + "CRS {value}°": "CRS {value}°", + "CURRENT VIEWPORT ONLY": "仅限当前视口", + "WITHIN {km} KM": "{km} KM 以内", + "Flights": "航班", + "Military flights": "军用航班", + "AIS vessels": "AIS 船舶", + "Mapped installations": "地图标注设施", + "syncing {count} city feeds...": "正在同步 {count} 个城市数据源…", + "scanning nearby systems...": "正在扫描附近系统…", + "Station {id}": "站点 {id}", + "Station": "电台", + "🚲 {bikes} avail · {docks} docks · {capacity} cap": "🚲 可用 {bikes} · 车桩 {docks} · 容量 {capacity}", + "⚠️ Not installed": "⚠️ 未安装", + "⚠️ Not renting": "⚠️ 暂停租车", + "⚠️ Not returning": "⚠️ 暂停还车", + "HDG {value}° (ESTIMATED)": "HDG {value}°(估算)", + "{count} CAMERAS STANDING BY · NO CAMERA SELECTED · CLICK A CAMERA TO ACTIVATE": "{count} 个摄像头待命 · 未选择摄像头 · 点击摄像头以激活", + "No cameras available in catalog.": "目录中没有可用摄像头。", + "{city} CCTV": "{city} CCTV", + "FOV {value}°": "FOV {value}°", + "COVERAGE {value}km²": "覆盖 {value}km²", + "OVERLAP {count} cams": "重叠 {count} 个摄像头", + "ISOLATED VIEW": "孤立视角", + "PROJ MONITOR": "投影 监视器", + "PROJ OFF": "投影 关", + "VIEWSHED": "可视域", + "CAL {value}": "CAL {value}", + "SRC {value}": "SRC {value}", + "{value} CONTEXT": "{value} 上下文", + "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", + "Focus fire detection {title}, {details}": "聚焦火点探测 {title},{details}", + "{value} conf": "置信度 {value}", + "{value} ago": "{value} 前", + "sensor n/a": "传感器 n/a", + "FIRE · {frp} MW": "火点 · {frp} MW", + "NIGHT": "夜间", + "▲ {frp} MW": "▲ {frp} MW", + "FIRE": "火点", + "FIRES": "火点", + "max {value} MW": "最大 {value} MW", + "new {value}": "新增 {value}", + "just now": "刚刚", + "<1m ago": "不到 1 分钟前", + "{count}m ago": "{count} 分钟前", + "{count}h ago": "{count} 小时前", + "STALE · cached {age}": "过期 · 缓存于 {age}", + "refreshing...": "刷新中…", + "loading...": "加载中…", + "KEY REQUIRED": "需要密钥", + "LIVE · updated {age}": "实时 · 更新于 {age}", + "loading mapped installation context": "正在加载地图标注设施上下文", + "MAPPED INSTALLATION": "地图标注设施", + "Unknown": "未知", + "LAUNCH SITE · {site}": "发射场 · {site}", + "LAUNCH SITE": "发射场", + "T−{time} · {mission}": "T−{time} · {mission}", + "LAUNCH STANDBY": "发射待命", + "LIFTOFF · {mission}": "点火升空 · {mission}", + "ASCENT REPLAY · {mission}": "上升回放 · {mission}", + "ASCENT ESTIMATE · {mission}": "上升估算 · {mission}", + "STAGE RE-ENTRY / RECOVERY · {mission}": "级段再入 / 回收 · {mission}", + "ORBIT REPLAY · {mission}": "轨道回放 · {mission}", + "PAUSED · {title}": "已暂停 · {title}", + "UNSPECIFIED": "未指明", + "+{count} additional payload records": "另有 {count} 条有效载荷记录", + "PAYLOAD DATA UNAVAILABLE": "有效载荷数据不可用", + "{value} KM DOWNRANGE": "下射程 {value} KM", + "POSITION UNAVAILABLE": "位置不可用", + "FLIGHT {count}": "第 {count} 次飞行", + "REUSED": "复用", + "NO STAGE RE-ENTRY / RECOVERY DATA": "无级段再入 / 回收数据", + "{count} / 30D": "{count} / 30 天", + "NO MISSIONS AVAILABLE IN THE CURRENT 30-DAY WINDOW": "当前 30 天窗口内没有可用任务", + "DATE UNAVAILABLE": "日期不可用", + "UNSPECIFIED OPERATOR": "运营方未指明", + "Select {mission}": "选择 {mission}", + "{value} KM": "{value} KM", + "{value} KM/S": "{value} KM/S", + "Selected Space Mission": "已选太空任务", + "SELECTED SPACE MISSION": "已选太空任务", + "Show all missions": "显示所有任务", + "Deselect mission": "取消选择任务", + "MISSION": "任务", + "STATUS · ": "状态 · ", + "LAUNCH SITE · ": "发射场 · ", + "LAUNCH TIME · ": "发射时间 · ", + "ORBIT · ": "轨道 · ", + "ASCENT PATH · ": "上升轨迹 · ", + "CURRENT DISTANCE FROM EARTH · ": "当前距地球距离 · ", + "SATELLITE SPEED · ": "卫星速度 · ", + "PAYLOAD": "有效载荷", + "NAME": "名称", + "TYPE": "类型", + "DESTINATION": "目的地", + "STAGE / RE-ENTRY / RECOVERY": "级段 / 再入 / 回收", + "STAGE": "级段", + "STATUS": "状态", + "FINAL POSITION": "最终位置", + "REPLAY SPEED": "回放速度", + "Replay speed multiplier": "回放速度倍率", + "REPLAY ASCENT": "回放上升过程", + "Previous mission": "上一个任务", + "PREV": "上一个", + "Next mission": "下一个任务", + "SHOW ALL / DESELECT": "显示全部 / 取消选择", + "Pause replay": "暂停回放", + "Cancel replay": "取消回放", + "EST. DOWNRANGE": "预估下射程", + "PLANNED · ": "计划 · ", + "SUPPLIED TRAJECTORY POINTS": "提供的轨迹点", + "RECONSTRUCTED ESTIMATE": "重建估算", + "Replay the estimated ascent with a following camera": "以跟随相机回放估算的上升过程", + "Resume replay": "继续回放", + "T minus {seconds}": "T−{seconds}", + "Preparing launch site": "正在准备发射场", + "Liftoff": "点火升空", + "Ascent replay": "上升回放", + "Orbit replay": "轨道回放", + ", paused": ",已暂停", + "listening": "聆听中", + "Alt unknown": "高度未知", + "Type unknown": "类型未知", + "Reg unknown": "注册号未知", + "Operator unknown": "运营方未知", + "News": "新闻", + "Talk": "谈话", + "Weather / Emergency": "天气 / 应急", + "Public Safety": "公共安全", + "Aviation / Marine": "航空 / 海事", + "Traffic / Transit": "交通 / 公交", + "Music": "音乐", + "Other": "其他", + "Alternative": "另类", + "Ambient": "氛围", + "Blues": "蓝调", + "Classical": "古典", + "Country": "乡村", + "Dance": "舞曲", + "Electronic": "电子", + "Folk": "民谣", + "Funk": "放克", + "Hip-Hop": "嘻哈", + "House": "House", + "Indie": "独立音乐", + "Jazz": "爵士", + "Latin": "拉丁", + "Metal": "金属乐", + "Oldies": "怀旧金曲", + "Pop": "流行", + "Punk": "朋克", + "R&B": "R&B", + "Reggae": "雷鬼", + "Rock": "摇滚", + "Soul": "灵魂乐", + "Techno": "Techno", + "Trance": "Trance", + "World": "世界音乐", + "cloud unknown": "云量未知", + "Add the full Starlink broadband shell (thousands of extra points)": "添加完整的 Starlink 宽带星座(数千个额外点位)", + "Loading the Starlink shell…": "正在加载 Starlink 星座…", + "Starlink {detail} — click to retry": "Starlink {detail}——点击重试", + "load failed": "加载失败", + "Showing the full Starlink shell — click for the core catalog only": "正在显示完整的 Starlink 星座——点击仅显示核心目录", + "DENSE ···": "密集 ···", + "DENSE ✕": "密集 ✕", + "DENSE": "密集", + "Selected": "所选", + "Syncing flow · Roads: {source}": "正在同步流量 · 道路:{source}", + "LIVE · Roads: {source} · Roads without flow hidden": "实时 · 道路:{source} · 已隐藏无流量道路", + "LIVE · Roads: {source} · No flow roads in view": "实时 · 道路:{source} · 视野内无流量道路", + "LIVE · Roads: {source} · Flow {percent}%": "实时 · 道路:{source} · 流量 {percent}%", + "SIMULATED · Roads: {source} · Flow {percent}%": "模拟 · 道路:{source} · 流量 {percent}%", + "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "正在同步流量 · 道路:OpenStreetMap · 流量:TomTom · 未匹配:模拟", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov · Unmatched: simulated": "实时 · 道路:OpenStreetMap · 流量:TomTom · 覆盖 {percent}% · 未匹配:模拟", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov": "实时 · 道路:OpenStreetMap · 流量:TomTom · 覆盖 {percent}%", + "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "模拟 · 道路:OpenStreetMap · 流量:TomTom(无匹配)", + "SIMULATED — traffic service unreachable": "模拟——交通服务无法连接", + "SIMULATED — add TomTom key for live": "模拟——添加 TomTom 密钥以获取实时数据", + "AIS: {name}": "AIS: {name}", + "{type} SPD: {speed} HDG: {heading}": "{type} SPD: {speed} HDG: {heading}", + "VESSEL": "船舶", + "POS: LIVE": "位置:实时", + "POS: {time}Z": "位置:{time}Z", + "awaiting first AIS position…": "等待首个 AIS 位置…", + "awaiting usable AIS positions…": "等待可用的 AIS 位置…", + "awaiting first AIS message…": "等待首条 AIS 消息…", + "{minutes}m ago": "{minutes} 分钟前", + "{state} · {time} · {lag}": "{state} · {time} · {lag}", + "{state}: {time}": "{state}:{time}", + "loading": "加载中", + "Wind": "风", + "Resume": "继续", + "Pause": "暂停", + "Error: {message}": "错误:{message}", + "Needs {envVars} — add it in Provider Settings": "需要 {envVars},请在服务商设置中添加", + "{label} is unavailable": "{label} 不可用", + "This map stack": "此地图组合", + "{label} unavailable: {hint}": "{label} 不可用:{hint}", + "Visible map targets": "可见的地图目标", + "Source": "来源", + "Ready": "就绪", + "Loaded: {scene} / {shot}": "已加载:{scene} / {shot}", + "Cannot capture shot: camera not ready": "无法截取镜头:相机未就绪", + "Captured: {scene} / {shot}": "已截取:{scene} / {shot}", + "Select a shot first": "请先选择一个镜头", + "Updated: {scene} / {shot}": "已更新:{scene} / {shot}", + "Camera unavailable — exit cockpit first": "相机不可用——请先退出座舱", + "No shots to run": "没有可运行的镜头", + "Project exported": "项目已导出", + "Could not exit {mode} — scene layers may be refused": "无法退出 {mode}——场景图层可能被拒绝", + "Running {index}/{total}: {scene} / {shot}": "正在运行 {index}/{total}:{scene} / {shot}", + "Scene run complete": "场景运行完成", + "Global Flights Radar": "全球航班雷达", + "Orbital Watch": "轨道监视", + "Thermal Threat Board": "热源威胁看板", + "City Overload": "城市过载", + "Omniscience Pullback": "全知拉远", + "Shot {n}": "镜头 {n}", + "Density": "密度", + "Bloom": "泛光", + "VISUAL PRESETS": "视觉预设", + "LOCATION": "位置", + "CONTACTS — nearest planes · vessels · sites": "目标:最近的飞机 · 船舶 · 站点", + "SPACE MISSIONS — launches & orbital assets": "太空任务:发射与在轨资产", + "LIVE SIGNALS": "实时信号", + "CCTV layer unavailable": "CCTV 图层不可用", + "Link copied!": "链接已复制!", + "Copy failed": "复制失败", + "CCTV calibration saved": "CCTV 校准已保存", + "CCTV calibration reset": "CCTV 校准已重置", + "ADJUST ON": "调整开", + "ADJUST": "调整", + "UNKNOWN": "未知", + "ERROR": "错误", + "SOURCE · UNKNOWN": "来源 · 未知", + "FRAME · LOADING": "画面 · 加载中", + "FRAME · UNAVAILABLE": "画面 · 不可用", + "CALIBRATED": "已校准", + "CURATED": "已整理", + "RAW PRIOR": "原始默认", + "CCTV ON": "CCTV 开", + "CCTV OFF": "CCTV 关", + "VIEWSHED ON": "可视域开", + "COVERAGE ON": "覆盖范围开", + "COVERAGE OFF": "覆盖范围关", + "AUTO HOP ON": "自动跳转开", + "AUTO HOP OFF": "自动跳转关", + "PROJECTION ON": "投影开", + "PROJECTION OFF": "投影关", + "CAL · EDITED (UNSAVED)": "CAL · 已编辑(未保存)", + "CAL · {badge}": "CAL · {badge}", + "MONITOR": "监视器", + "OFF": "关", + "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · 范围 {range}m · {projection}{calBadge} · {provider}{status}", + "{count} cameras loaded · click a camera to activate": { + "other": "已加载 {count} 个摄像头 · 点击摄像头以激活" + }, + "{count} cameras loaded · enable CCTV to activate": { + "other": "已加载 {count} 个摄像头 · 启用 CCTV 以激活" + }, + "Enable CCTV to load camera intersections": "启用 CCTV 以加载摄像头路口", + "Enable CCTV to start camera-linked intelligence summaries.": "启用 CCTV 以开始生成与摄像头关联的情报摘要。", + "No summary available.": "暂无摘要。", + "loading frames": "正在加载画面", + "camera grid ready": "摄像头网格就绪", + "Clearing selected data layers": "正在清除已选数据图层", + "Clear selected data layers": "清除已选数据图层", + "CONDITIONS UNKNOWN": "天气状况未知", + "CLEAR": "晴", + "PARTLY CLOUDY": "多云", + "OVERCAST": "阴", + "FOG": "雾", + "DRIZZLE": "毛毛雨", + "RAIN": "雨", + "RAIN SHOWERS": "阵雨", + "SNOW SHOWERS": "阵雪", + "THUNDERSTORM": "雷暴", + "MIXED CONDITIONS": "混合天气", + "CYCLE ON": "轮换开", + "CYCLE OFF": "轮换关", + "Stop automatic page cycling. Previous, Next, and the SIG/NEWS/LOCAL tabs stay available.": "停止自动翻页。上一页、下一页以及 SIG/NEWS/LOCAL 标签仍可使用。", + "Cycle briefing pages automatically every 9 seconds (Signals → News → Local). Pauses while you hover or focus the panel. Live signal data refreshes continuously either way.": "每 9 秒自动轮换简报页面(信号 → 新闻 → 本地)。悬停或聚焦面板时暂停。无论是否轮换,实时信号数据都会持续刷新。", + "ACQUIRING REGIONAL NEWS": "正在获取地区新闻", + "REGIONAL NEWS UNAVAILABLE": "地区新闻不可用", + "RESOLVING REGION": "正在解析区域", + "REGION UNAVAILABLE": "区域不可用", + "NO RECENT LOCATION MATCHES": "暂无近期位置匹配结果", + "{domain} · {age}": "{domain} · {age}", + "CLOUD {pct}%": "云量 {pct}%", + "CLOUD UNKNOWN": "云量未知", + "{source} · LOCATION QUERY": "{source} · 位置查询", + "REGIONAL NEWS": "地区新闻", + "CONTEXT STANDBY": "上下文待机", + "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "启用全局上下文以获取邻近 PING", + "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "目标丢失 · 最后已知读数 · 不代表安全无虞", + "CONTACT LOST · {subject}": "目标丢失 · {subject}", + "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "目标已脱离其数据源 · 读数保持最后已知值", + "{cohort} · {contact}": "{cohort} · {contact}", + "NO AVAILABLE EXAMPLE": "无可用示例", + "{cohort}, Unavailable": "{cohort},不可用", + "AHEAD": "正前方", + "{side} {angle}": "{side} {angle}", + "L": "左", + "R": "右", + "{count} INPUTS UNKNOWN · NOT AN ALL-CLEAR": { + "other": "{count} 项输入未知 · 不代表安全无虞" + }, + "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "可用输入均为最新 · 不代表安全无虞", + "AIRCRAFT": "飞机", + "ACQUIRING SURFACE": "正在获取地面数据", + "SURFACE FALLBACK": "地面数据备用", + "STALE FEED": "数据源过期", + "LIVE TRACK": "实时航迹", + "COMMERCIAL": "商用", + "{aircraftClass} · {emergency} · {feedState}": "{aircraftClass} · {emergency} · {feedState}", + "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · 航向对准", + "ARROW · ESTIMATED DIRECTION": "箭头 · 预估方向", + "ROUTE DATA UNAVAILABLE": "航线数据不可用", + "DEST {bearing}": "目的地 {bearing}", + "Disable cockpit weather effects": "停用座舱天气效果", + "Enable cockpit weather effects": "启用座舱天气效果", + "ON": "开", + "Normal": "常规", + "Night vision": "夜视", + "Thermal": "热成像", + "Anime": "动漫", + "Noir": "黑色电影", + "Snow": "雪景", + "Current cockpit vision style: {style}. Activate for next style.": "当前座舱视觉样式:{style}。激活可切换到下一个样式。", + "Current style: {style} — click for next": "当前样式:{style}——点击切换下一个", + "Collapse Contact panel": "收起目标面板", + "Expand Contact panel": "展开目标面板", + "Collapse contact panel": "收起目标面板", + "Expand contact panel": "展开目标面板", + "Collapse cockpit briefing panel": "收起座舱简报面板", + "Expand cockpit briefing panel": "展开座舱简报面板", + "Collapse briefing panel": "收起简报面板", + "Expand briefing panel": "展开简报面板", + "OBSERVED / MAPPED PINGS": "观测 / 地图标注 PING", + "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "来源可查的事件 · 无合成新闻", + "LATEST LOCATION-MATCHED REPORTING": "最新的位置匹配报道", + "LOCAL INFO": "本地信息", + "PLACE / CONDITIONS / POSITION": "地点 / 状况 / 位置", + "TIME UNKNOWN": "时间未知", + "{count}M AGO": "{count} 分钟前", + "{count}H AGO": "{count} 小时前", + "{count}D AGO": "{count} 天前", + "DIR UNKNOWN": "风向未知", + "Select flight {title}": "选择航班 {title}", + "{aircraftClass} · CURRENT": "{aircraftClass} · 当前", + "MILITARY FLIGHT": "军用航班", + "COMMERCIAL FLIGHT": "商用航班", + "{aircraftClass} · {distance}": "{aircraftClass} · {distance}", + "DISTANCE UNKNOWN": "距离未知", + "{count} INPUTS UNKNOWN": { + "other": "{count} 项输入未知" + }, + "SOURCE STATUS UNAVAILABLE": "数据源状态不可用", + "Restore real aircraft": "恢复真实飞机", + "Reclassify as TR-3B": "重新归类为 TR-3B", + "TRACK ACQUIRED": "已锁定航迹", + "{label} · COURSE {heading}°": "{label} · 航向 {heading}°", + "Context could not restore every layer; try again": "上下文未能恢复所有图层,请重试", + "No selected data layers": "没有已选数据图层", + "{count} data layers could not be cleared": { + "other": "{count} 个数据图层无法清除" + }, + "Cleared {count} data layers": { + "other": "已清除 {count} 个数据图层" + }, + "Selected data layers could not be cleared": "无法清除已选数据图层", + "Contacts could not complete the requested transition; try again": "目标未能完成所请求的切换,请重试", + "Space Missions could not complete the requested transition; try again": "太空任务未能完成所请求的切换,请重试", + "Nearby installations refreshed": "附近设施已刷新", + "Nearby installations could not be refreshed; try again": "无法刷新附近设施,请重试", + "Space Missions cancellation could not restore the previous layer state": "取消太空任务后无法恢复先前的图层状态", + "That layer is unavailable in the current Context mode": "该图层在当前上下文模式下不可用", + "{layerId} could not {action} cleanly": "{layerId} 未能正常{action}", + "start": "启动", + "stop": "停止", + "{mode} could not start because another layer did not stop cleanly": "{mode}无法启动,因为另一个图层未能正常停止", + "Space Missions": "太空任务", + "Context": "上下文", + "Live Flights": "实时航班", + "Military Flights": "军用航班", + "Earthquakes (24h)": "地震(24 小时)", + "Satellites": "卫星", + "Space Missions (30d)": "太空任务(30 天)", + "Street Traffic": "街道交通", + "CCTV": "CCTV", + "Radio": "电台", + "Bikeshare": "共享单车", + "Live AIS Vessels": "实时 AIS 船舶", + "Mapped Installations": "地图标注设施", + "Global Context": "全局上下文", + "Datacenters": "数据中心", + "Dams": "水坝", + "Submarine Cables": "海底电缆", + "FIRMS Active Fires": "FIRMS 活跃火点", + "Transit": "交通", + "ENABLING": "启用中", + "DISABLING": "停用中", + "Weather": "天气", + "{state} · {source}": "{state} · {source}", + "UNCERTAIN · {source} · lifecycle state requires reconciliation": "不确定 · {source} · 生命周期状态需要核对", + "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · {seconds} 秒后重试", + "{state} · {source} · {detail}": "{state} · {source} · {detail}", + "never": "从未", + "{source} · {loadingLabel}": "{source} · {loadingLabel}", + "{accepted} of {raw} records accepted": "已接受 {accepted} / {raw} 条记录", + "incomplete snapshot": "快照不完整", + "{state} · {source} · {detail} · {ago}": "{state} · {source} · {detail} · {ago}", + "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · {seconds} 秒后重试", + "{state} · {source} · {ago}": "{state} · {source} · {ago}", + "{source} · {ago}": "{source} · {ago}", + "UNCERTAIN": "不确定", + "{name}: {state}": "{name}:{state}", + "{count}s ago": "{count} 秒前", + "CONNECTING": "连接中", + "📍 Location: --": "📍 位置:--", + "Landmark: --": "地标:--", + "Searched location": "已搜索的位置", + "ORBIT": "环绕", + "Location not found": "未找到位置", + "Search failed": "搜索失败", + "Fly to a POI first": "请先飞往一个 POI", + "Reset to full globe view": "重置为完整地球视图", + "Reset cockpit to full globe view": "将座舱重置为完整地球视图", + "Resetting to full globe view": "正在重置为完整地球视图", + "Resetting cockpit to full globe view": "正在将座舱重置为完整地球视图", + "MAP": "地图", + "panel": "面板", + "Expand {name}": "展开{name}", + "Collapse {name}": "收起{name}", + "Expand Radio": "展开电台", + "Collapse Radio": "收起电台", + "Expand Radio section": "展开电台区域", + "Collapse Radio section": "收起电台区域", + "Panel layout updated — positions reset to new defaults": "面板布局已更新——位置已重置为新的默认值", + "Collapse Cockpit display options": "收起座舱显示选项", + "Expand Cockpit display options": "展开座舱显示选项", + "Collapse Cockpit Radio controls": "收起座舱电台控件", + "Expand Cockpit Radio controls": "展开座舱电台控件", + "NO STATIONS": "无电台", + "NO STATION AVAILABLE": "没有可用电台", + "{name}, station {index} of {total}": "{name},第 {index} 个电台,共 {total} 个", + "No station available": "没有可用电台", + "OFF AIR": "停播", + "STATION UNAVAILABLE": "电台不可用", + "Radio could not {action} cleanly": "电台未能正常{action}", + "Close compact Radio controls": "关闭精简电台控件", + "Open compact Radio controls": "打开精简电台控件", + "SYNC": "同步", + "RECONCILE": "核对", + "DISABLE": "停用", + "ENABLE": "启用", + "Reconcile Radio — lifecycle uncertain": "核对电台——生命周期状态不确定", + "Disable Radio": "停用电台", + "Enable Radio": "启用电台", + "DIRECTORY BAND": "目录频段", + "{category} BAND": "{category}频段", + "NO STATION SELECTED": "未选择电台", + "Directory metadata only": "仅目录元数据", + "Loading station directory…": "正在加载电台目录…", + "Choose a globe marker or use next.": "请选择地球上的标记或使用“下一个”。", + "TAGS · {tags}": "标签 · {tags}", + "Play": "播放", + "PAUSE": "暂停", + "RESUME": "继续", + "PLAY": "播放", + "selected": "所选", + "nearest": "最近", + "{action} {target} radio station": "{action}{target}电台", + "RADIO STATE UNCERTAIN": "电台状态不确定", + "SYNCING DIRECTORY": "正在同步目录", + "RADIO READY": "电台就绪", + "SYNCING": "同步中", + "READY": "就绪", + "station": "电台", + " · stale/degraded directory": " · 目录过期/降级", + " · degraded directory": " · 目录降级", + " · stale directory": " · 目录过期", + " · outside current filter": " · 不在当前筛选范围内", + "Ready — playback starts only from your action": "就绪——仅在你操作后才开始播放", + "Radio off": "电台已关闭", + "Connecting directly to broadcaster…": "正在直接连接广播方…", + "Buffering broadcaster stream…": "正在缓冲广播流…", + "Playing {station}": "正在播放 {station}", + "Paused {station}": "已暂停 {station}", + "Broadcaster stream unavailable": "广播流不可用", + " · muted during voice interaction": " · 语音交互期间已静音", + " · restoring volume after voice": " · 语音结束后正在恢复音量", + " · static indicates no broadcaster audio": " · 杂音表示广播方没有音频", + " · tuning static until broadcaster starts": " · 广播方启动前为调谐杂音", + "Station unavailable after directory refresh — choose another channel": "目录刷新后电台不可用——请选择其他频道", + "Radio is enabling…": "电台正在启用…", + "Radio is disabling…": "电台正在停用…", + "Radio lifecycle is uncertain — use Enable or Disable to reconcile": "电台生命周期状态不确定——请使用“启用”或“停用”进行核对", + "Loading": "加载中", + "unknown": "未知", + "Scene action failed": "场景操作失败", + "Delete shot \"{shot}\"?": "删除镜头“{shot}”?", + "SPARSE": "稀疏", + "BALANCED": "均衡", + "DEL": "删除", + "entity": "实体", + "Shared {subject} follow expired": "共享的 {subject} 跟随已过期", + "Shared {subject} could not be restored — feed unavailable": "无法恢复共享的 {subject}——数据源不可用", + "Shared {subject} is unavailable": "共享的 {subject} 不可用", + "ACQUIRING": "获取中", + "SHARED {subject}": "共享 {subject}", + "LOADING LIVE DATA": "正在加载实时数据", + "LOAD COMPLETE": "加载完成", + "LOAD CANCELLED": "加载已取消", + "LOAD FAILED": "加载失败", + "LIVE DATA OFF": "实时数据已关闭", + "MAPPED SITES LOADED": "已加载地图站点", + "RETRYING MAPPED SITES": "正在重试地图站点", + "FETCHING MAPPED SITES": "正在获取地图站点", + "OVERPASS TEMPORARILY UNAVAILABLE": "Overpass 暂时不可用", + "OVERPASS RATE-LIMITED": "Overpass 已限流", + "OVERPASS TIMED OUT": "Overpass 超时", + "OVERPASS COULD NOT COMPLETE THE QUERY": "Overpass 无法完成查询", + "TURNING OFF LIVE DATA": "正在关闭实时数据", + "REFRESHING LIVE DATA": "正在刷新实时数据", + "syncing road network": "正在同步路网", + "retry pending": "等待重试", + "retrying in {seconds}s": "{seconds} 秒后重试", + "Celestial ring — reveal the full globe": "天球环——显示完整地球", + "Celestial ring — available in Normal style": "天球环——仅在常规样式下可用", + "Detection overlay: {mode}": "探测叠加层:{mode}", + "Detection overlay: off": "探测叠加层:关闭", + "DETECT": "探测", + "AI AGENT": "AI 代理", + "Voice model tier — applies next session": "语音模型档位——下次会话生效", + "Estimated session cost": "预估会话费用", + "Voice control — activate to toggle voice; hold Space to speak": "语音控制——激活可切换语音;按住空格键说话", + "VOICE STANDBY": "语音待机", + "VOICE CONTROL": "语音控制", + "Hold Space to speak · tap Space to activate focused controls": "按住空格键说话 · 轻按空格键激活当前聚焦的控件", + "VOICE SYSTEM ERROR": "语音系统错误", + "DISMISS": "关闭", + "Check microphone permission and network access, then try again.": "请检查麦克风权限和网络连接,然后重试。", + "WebRTC microphone support unavailable": "不支持 WebRTC 麦克风", + "Requesting microphone": "正在请求麦克风", + "Release Space to send": "松开空格键发送", + "Hold Space to talk": "按住空格键说话", + "Ask or command": "提问或下达指令", + "Voice off": "语音已关闭", + "VOICE UNAVAILABLE": "语音不可用", + "VOICE ACTIVE": "语音已启用", + "Voice session could not be started.": "无法启动语音会话。", + "Next session: {pendingId} — this session stays on {modelId}": "下次会话:{pendingId}——本次会话仍使用 {modelId}", + "Voice model: {pendingId} — click to switch to {target}; applies next session": "语音模型:{pendingId}——点击切换到 {target};下次会话生效", + "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "{modelId} 的预估会话费用——{responses} 次响应。达到 {warn} 时警告,达到 {cap} 时结束会话。", + "{tier} applies next session": "{tier} 将在下次会话生效", + "Session ended — cost cap {cost}": "会话已结束——已达费用上限 {cost}", + "Radio did not start": "电台未能启动", + "Running command": "正在执行指令", + "{items} {scope}": "{items} {scope}", + "degraded": "降级", + "stale": "过期", + "partial": "部分", + "fallback": "备用", + "unavailable": "不可用", + "Voice active": "语音已启用", + "Aircraft cockpit view": "飞机座舱视图", + "LEVEL": "等级", + "Estimated destination direction": "预估目的地方向", + "DEST ---°": "目的地 ---°", + "OPTICAL PLANE · 01": "光学平面 · 01", + "VISOR LOCK · ACTIVE": "面罩锁定 · 激活", + "GROUND SPEED · KTS": "地速 · KTS", + "ALTITUDE · FT": "高度 · FT", + "FIRST PERSON": "第一人称", + "LIVE TRACK · COURSE ALIGNED": "实时航迹 · 航向对准", + "Cockpit vision style": "座舱视觉样式", + "Previous cockpit vision style": "上一个座舱视觉样式", + "Previous vision style": "上一个视觉样式", + "Current cockpit vision style: NORMAL. Activate for next style.": "当前座舱视觉样式:常规。激活可切换到下一个样式。", + "Current style: NORMAL — click for next": "当前样式:常规——点击切换下一个", + "CURRENT": "当前", + "Next cockpit vision style": "下一个座舱视觉样式", + "Next vision style": "下一个视觉样式", + "Current aircraft heading": "飞机当前航向", + "GROUND SPEED": "地速", + "ALTITUDE": "高度", + "Contact cockpit summary": "目标座舱摘要", + "CONTACT": "目标", + "CONTACTS · 250 KM": "目标 · 250 KM", + "Contact navigation": "目标导航", + "CONTEXT ONLY": "仅供参考", + "Nearby cohort counts": "附近各类目标数量", + "NEAREST OBSERVED / MAPPED": "最近的观测 / 地图标注目标", + "AVAILABLE INPUTS ONLY · NOT AN ALL-CLEAR": "仅限可用输入 · 不代表安全无虞", + "Cockpit briefing carousel": "座舱简报轮播", + "Estimated flight plan": "预估飞行计划", + "ESTIMATED FLIGHT PLAN": "预估飞行计划", + "FROM": "出发", + "TO": "到达", + "Cockpit briefing controls": "座舱简报控件", + "Previous briefing page": "上一页简报", + "Next briefing page": "下一页简报", + "Live signals": "实时信号", + "Latest regional news": "最新地区新闻", + "Location-based information": "基于位置的信息", + "TEMP": "气温", + "WIND": "风", + "SKY": "天空", + "PRECIP": "降水", + "Show Live Signals": "显示实时信号", + "NEWS": "新闻", + "Show Regional News": "显示地区新闻", + "Show Local Info": "显示本地信息", + "Cockpit display and Radio controls": "座舱显示与电台控件", + "DISPLAY": "显示", + "Cockpit display options": "座舱显示选项", + "RADIO": "电台", + "Cockpit compact Radio controls": "座舱精简电台控件", + "Previous filtered radio station": "上一个已筛选电台", + "Play selected radio station": "播放所选电台", + "Next filtered radio station": "下一个已筛选电台", + "VOLUME": "音量", + "Cockpit Radio volume": "座舱电台音量", + "View switcher": "视图切换", + "Exit cockpit and return to full globe view": "退出座舱并返回完整地球视图", + "RESET": "重置", + "Exit cockpit view": "退出座舱视图", + "EXIT COCKPIT": "退出座舱", + "Navigation, voice, and visual preset controls": "导航、语音和视觉预设控件", + "Expand Visual Presets": "展开视觉预设", + "Pin visual presets": "固定视觉预设", + "Keep visual presets open": "保持视觉预设展开", + "Show the globe without a visual filter.": "显示不带视觉滤镜的地球。", + "Emulate a green phosphor CRT with scanlines and screen curvature.": "模拟带扫描线和屏幕弧度的绿色荧光 CRT。", + "Simulate night-vision goggles with green intensification and a tube vignette.": "模拟夜视仪,带绿色增强和镜筒暗角。", + "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "模拟 FLIR 风格的热成像对比。调高 Ironbow 可显示色彩。", + "Apply bright cel-shaded color and illustrated outlines.": "应用明亮的赛璐珞色彩和插画轮廓线。", + "Apply high-contrast monochrome film-noir grading.": "应用高对比度的黑白黑色电影调色。", + "Add a cold, snowy whiteout treatment to the scene.": "为场景添加寒冷的雪天白茫茫效果。", + "MAP SOURCE": "地图源", + "Map source": "地图源", + "Style": "样式", + "Expand LOCATION": "展开位置", + "Collapse panel": "收起面板", + "Pin location tray": "固定位置托盘", + "Keep location tray open": "保持位置托盘展开", + "Search any location": "搜索任意位置", + "Search location by name or coordinates": "按名称或坐标搜索位置", + "Search any location...": "搜索任意位置…", + "WEATHER": "天气", + "CONTEXT": "上下文", + "Compact Radio controls": "精简电台控件", + "Open detailed Radio controls": "打开详细电台控件", + "Previous station": "上一个电台", + "Next station": "下一个电台", + "Compact Radio volume": "精简电台音量", + "Expand panel": "展开面板", + "Context mode": "上下文模式", + "CONTACTS": "目标", + "Cycles the nearest contacts of whatever type you select — planes, vessels, installations. Satellites track independently.": "循环切换你所选类型中最近的目标,包括飞机、船舶、设施。卫星独立跟踪。", + "SPACE MISSIONS": "太空任务", + "SELECT CONTEXT": "选择上下文", + "Contact Context actions": "目标上下文操作", + "COCKPIT": "座舱", + "SEARCH NEARBY SITES": "搜索附近站点", + "Reclassify tracked contact as TR-3B": "将跟踪目标重新归类为 TR-3B", + "CONTACTS CONTEXT OFF": "目标上下文已关闭", + "SELECT CONTACTS TO LOAD OBSERVED / MAPPED PROXIMITY": "选择目标以加载观测 / 地图标注的邻近信息", + "Available Space Missions": "可用太空任务", + "AVAILABLE MISSIONS": "可用任务", + "SELECT A MISSION TO INSPECT": "选择一项任务以查看", + "LOADING 30-DAY MISSION INDEX": "正在加载 30 天任务索引", + "TAB PREVIEWS · ENTER / SPACE SELECTS": "TAB 预览 · ENTER / 空格键选择", + "Internet radio and local SDR": "网络电台与本地 SDR", + "STATION TAG": "电台标签", + "Filter stations by station tag": "按电台标签筛选电台", + "All": "全部", + "Enable Radio, then choose a globe marker or use next.": "请先启用电台,然后选择地球上的标记或使用“下一个”。", + "DRAG TO TUNE": "拖动调谐", + "ALL · DRAG THE NEEDLE": "全部 · 拖动指针", + "SNAPS TO AVAILABLE STATIONS": "自动吸附到可用电台", + "Radio playback": "电台播放", + "Previous filtered station": "上一个已筛选电台", + "Play selected station": "播放所选电台", + "Next filtered station": "下一个已筛选电台", + "STOP": "停止", + "Stop radio playback": "停止电台播放", + "Radio volume": "电台音量", + "STATION SITE": "电台网站", + "Audio connects directly to the broadcaster after you press play. Your IP is visible to that broadcaster.": "点击播放后,音频将直接连接到广播方。广播方可以看到你的 IP。", + "Intelligence HUD (H)": "情报 HUD(H)", + "Layout": "布局", + "HUD layout": "HUD 布局", + "Tactical": "战术", + "Operator": "操作员", + "Minimal": "精简", + "Detection Overlay (D)": "探测叠加层(D)", + "Detection overlay": "探测叠加层", + "Detection label density": "探测标签密度", + "Allocation": "分配", + "Detection label allocation": "探测标签分配方式", + "Elastic": "弹性", + "Weighted": "加权", + "Fade": "渐隐", + "Detection fade distance": "探测渐隐距离", + "World-overlay fade distance outside the keyhole as a percentage of its radius": "锁孔之外的世界叠加层渐隐距离,以其半径的百分比表示", + "Outside": "外部", + "Detection opacity outside the keyhole": "锁孔之外的探测不透明度", + "World-overlay label and card opacity beyond the fade distance": "超出渐隐距离后世界叠加层标签和卡片的不透明度", + "PARAMETERS": "参数", + "3D aircraft — flat icons zoomed out, 3D models up close": "3D 飞机——拉远显示平面图标,拉近显示 3D 模型", + "Models": "模型", + "3D model coverage": "3D 模型覆盖范围", + "Proximity": "邻近", + "Scope — the circular viewport mask": "视域——圆形视口遮罩", + "Scope": "视域", + "Feather": "羽化", + "Scope edge feather": "视域边缘羽化", + "Scope edge feather as a percentage of the keyhole radius": "视域边缘羽化,以锁孔半径的百分比表示", + "Clear": "晴", + "Import": "导入", + "Celestial": "天球", + "Hide UI chrome": "隐藏界面控件", + "Clean UI": "纯净界面", + "Bloom / Glow": "泛光 / 辉光", + "Bloom intensity": "泛光强度", + "Sharpening": "锐化", + "Sharpen": "锐化", + "Sharpen intensity": "锐化强度", + "EXIT CLEAN VIEW": "退出纯净视图", + "Return UI controls": "恢复界面控件", + "Initializing photorealistic world...": "正在初始化逼真世界…", + "DATA LAYERS": "数据图层", + "NEAREST": "最近", + "CCTV camera": "CCTV 摄像头", + "CALIBRATION": "校准", + "Drag the camera in the world: rings rotate, arrows move, handles set range/FOV": "在世界中拖动摄像头:圆环旋转,箭头平移,控制点设置范围/FOV", + "Camera pose — click a value to type": "摄像头姿态——点击数值可输入", + "Heading (compass °) — click to type": "航向(罗盘 °)——点击输入", + "Pitch (° up/down) — click to type": "俯仰(° 上/下)——点击输入", + "Horizontal FOV (°) — click to type": "水平 FOV(°)——点击输入", + "Range / monitor-plane distance (m) — click to type": "范围 / 监视器平面距离(m)——点击输入", + "Mount height above ground (m) — click to type": "安装高度(距地面,m)——点击输入", + "North offset from catalog position (m) — click to type": "相对目录位置的北向偏移(m)——点击输入", + "East offset from catalog position (m) — click to type": "相对目录位置的东向偏移(m)——点击输入", + "SAVE CAL": "保存校准", + "RESET CAL": "重置校准", + "SCENE SUMMARY": "场景摘要", + "ALL": "全部", + "SCENES": "场景", + "Scene recipe": "场景方案", + "NEW": "新建", + "CAPTURE SHOT": "截取镜头", + "UPDATE SHOT": "更新镜头", + "START": "启动", + "EXPORT PRESETS": "导出预设", + "IMPORT": "导入", + "RUN LOG": "运行日志", + "POWER UP": "启动", + "GROUND STATION · PROVIDER SETTINGS": "地面站 · 服务商设置", + "Close key setup": "关闭密钥设置", + "Power up the globe": "启动地球", + "The globe already flies keyless. Every key below switches on another real feed — paste one and it's saved into this app's local configuration, then the server restarts itself. Server-side keys stay on this machine; Google Maps and Cesium ion run in the browser and must be provider-restricted. Keys you configured elsewhere are shown but never touched.": "地球无需密钥即可运行。下面的每个密钥都会启用一个新的真实数据源:粘贴后会保存到本应用的本地配置,随后服务器自动重启。服务端密钥只保存在本机;Google Maps 和 Cesium ion 在浏览器中运行,必须设置服务商限制。你在其他位置配置的密钥会显示,但不会被改动。", + "SAVE KEYS": "保存密钥", + "ESC to close": "按 ESC 关闭", + "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "Google Maps 密钥提供逼真的地球,其余数据源都叠加在其上。", + "NO PLACE LEFT BEHIND": "不遗漏任何地方", + "ACTIVE STYLE": "当前样式", + "Globe actions": "地球操作", + "Turn off all selected data layers": "关闭所有已选数据图层", + "Copy share link": "复制分享链接", + "Reset camera and return to full globe view": "重置相机并返回完整地球视图", + "MISSION CONTROL · FIRST LAUNCH": "任务控制 · 首次启动", + "Choose your first view": "选择你的首个视图", + "LIVE CONTACTS": "实时目标", + "Aircraft, vessels and nearby intelligence": "飞机、船舶及周边情报", + "Launches, spacecraft and orbital context": "发射、航天器与轨道态势", + "EXPLORE MANUALLY": "手动探索", + "Begin with a clean globe": "从干净的地球开始", + "Don't show this again": "不再显示", + "ESC to dismiss": "按 ESC 关闭", + "Tip: the GEV MIC button in the dock lets you talk to the map.": "提示:停靠栏中的 GEV MIC 按钮可让你用语音操控地图。" +} From db16d8ed4cbb35717d9d971b203073bfd9b5a3c0 Mon Sep 17 00:00:00 2001 From: EDIT-Aeterna <73235923+EDIT-Aeterna@users.noreply.github.com> Date: Wed, 21 Oct 2026 12:52:34 +0400 Subject: [PATCH 18/45] i18n(zh-CN): Simplified Chinese strings from #979 The Simplified Chinese localization by EDIT-Aeterna (#979), converted to the English-keyed catalog: 823 more entries for UI text that #914 did not cover. --- src/i18n/locales/zh-CN.json | 861 ++++++++++++++++++++++++++++++++++++ 1 file changed, 861 insertions(+) diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index cbedad420..3a5972058 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -1,4 +1,18 @@ { + "Pick a shape, then click the map.": "先选择形状,再在地图上点击。", + "Enter to place the pin, Esc to cancel.": "按 Enter 放置图钉,按 Esc 取消。", + "Click where the pin goes.": "点击图钉的放置位置。", + "Click {count} more points.": { + "other": "再点击 {count} 个点。" + }, + "Those points are in a line — move one off it to enclose an area.": "这些点都在同一条直线上——请移开其中一个点才能围出面。", + "That line has no length — click somewhere further away.": "这条线没有长度——请在更远处点击。", + "That shape already has {count} points — finish it or press Backspace.": "该形状已有 {count} 个点——请完成绘制或按 Backspace。", + "That point is off the globe — click on the world.": "该点在地球之外——请点击地球上的位置。", + "That shape could not be placed.": "该形状无法放置。", + "Could not place the shape: {error}": "无法放置形状:{error}", + "Board cleared.": "画板已清除。", + "{owner} is using the pointer — close it first.": "{owner} 正在使用指针——请先关闭它。", "Flying to Austin, TX...": "正在飞往德克萨斯州奥斯汀…", "Restoring shared view...": "正在恢复共享视图…", "Configuring viewer...": "正在配置视图…", @@ -7,11 +21,86 @@ "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tiles 不可用({detail})。正在加载免密钥地球…", "Initializing systems...": "正在初始化系统…", "Close data attribution": "关闭数据来源说明", + "Light aircraft": "轻型飞机", + "Glider": "滑翔机", + "Turboprop": "涡桨飞机", + "Airliner": "喷气客机", + "Widebody": "宽体机", + "Four-engine jet": "四发喷气机", + "Helicopter": "直升机", + "Fast jet": "喷气战机", + "Business jet": "公务机", + "Drone": "无人机", "UNAVAILABLE": "不可用", "SOURCE": "来源", + "EVIDENCE": "证据", + "{count} GEOLOCATED SOURCE-MAP PLACEMENTS": { + "other": "{count} 个地理定位来源点位" + }, + "NO PREVIEW": "无预览", + "SOURCE LINK": "来源链接", + "{publisher} / OPEN": "{publisher} / 打开", + "Bhote Koshi flood reconstruction controls": "Bhote Koshi 洪水重构控制", + "EVENT RECONSTRUCTION · 26 AUG 2026": "事件重构 · 2026-08-26", + "BHOTE KOSHI OUTBURST FLOOD": "BHOTE KOSHI 冰湖溃决洪水", + "Close event layer": "关闭事件图层", + "OBSERVED IMAGERY": "实测影像", + "SCHEMATIC CORRIDOR": "示意走廊", + "2021 HISTORICAL REFERENCE / 2026 POST-EVENT": "2021 年历史参考 / 2026 年灾后", + "Historical reference and post-event image split": "历史参考与灾后影像的分割", + "RECONSTRUCTION CLOCK": "重构时钟", + "Schematic downstream progression": "下游演进示意", + "Story beat navigation": "故事节拍导航", + "Previous story beat": "上一个故事节拍", + "CAUSE": "成因", + "CAPTURE TIME UNVERIFIED": "拍摄时间未核实", + "Next story beat": "下一个故事节拍", + "▶ PLAY": "▶ 播放", + "Play the next shot and continue through this scene": "播放下一个镜头并继续整个场景", + "▶ PLAY SCENE": "▶ 播放场景", + "◉ CINEMATIC": "◉ 运镜", + "↺ FULL STORY": "↺ 完整故事", + "↗ OPEN ORIGINAL": "↗ 打开原始来源", + "⌖ LOWER GORGE": "⌖ 下游峡谷", + "FIELD REPORTS · {count}": "现场报道 · {count}", + "↗ OPEN PUBLIC MAP": "↗ 打开公共地图", + "Clouds are preserved from the source imagery.": " 云层按源影像原样保留。", + "Rasuwagadhi witness": "Rasuwagadhi 目击", + "Open original source for {source}; capture time unverified": "打开 {source} 的原始来源;拍摄时间未核实", + "Historical reference and post-event image divider": "历史参考与灾后影像的分割线", + "A historical reference {before} percent, B post-event {after} percent": "历史参考 {before}%,灾后 {after}%", + "■ RELEASE CAMERA": "■ 释放相机", + "Seek Nepal scene clock": "定位尼泊尔场景时钟", + "NEPAL SCENE CLOCK": "尼泊尔场景时钟", + "… PLAYING SHOT": "… 镜头播放中", + "▶ PLAY SHOT": "▶ 播放镜头", + "Ⅱ PAUSE": "Ⅱ 暂停", + "↺ REPLAY CINEMATIC": "↺ 重播运镜", + "↺ REPLAY": "↺ 重播", + "… PLAYING SCENE": "… 场景播放中", + "Continue {scene} from next shot": "从下一镜头继续播放 {scene}", + "current scene": "当前场景", + "Replay the full reconstruction": "重播完整重构", + "SCENE SHOT": "场景镜头", + "TIME UNVERIFIED": "拍摄时间未核实", + "{count} SOURCES": { + "other": "{count} 个来源" + }, + "OUTSIDE IMAGERY SWIPE": "影像范围外滑动", + "{scene} / AUTHORED SHOT": "{scene} / 排定镜头", + "NEPAL FLOOD INCIDENT": "尼泊尔洪水事件", + "Play {shot}": "播放 {shot}", + "current scene shot": "当前场景镜头", + "Play reconstruction": "播放重构", + "Load previous scene shot": "载入上一个场景镜头", + "Load next scene shot": "载入下一个场景镜头", + "Rasuwa · 26 Aug 2026": "Rasuwa · 2026-08-26", + "Event reconstruction": "事件重构", "Overpass rate-limited": "Overpass 已限流", "Overpass timed out": "Overpass 超时", "Overpass could not complete the query": "Overpass 无法完成查询", + "Map tiles temporarily unavailable": "地图瓦片暂时不可用", + "Mapped names temporarily unavailable": "地点名称暂时不可用", "Overpass temporarily unavailable": "Overpass 暂时不可用", "Retrying mapped sites…": "正在重试地图站点…", "Fetching mapped sites…": "正在获取地图站点…", @@ -27,6 +116,9 @@ "feed stale": "数据源过期", "observed or mapped nearby context": "附近有观测或地图标注的上下文", "no observed or mapped objects in current feeds": "当前数据源中没有观测或地图标注的对象", + "Draw": "绘制", + "Directions": "路线导航", + "Recent imagery": "近期影像", "STATION": "电台", "Crewed stations and their visiting vehicles": "载人空间站及其访问飞行器", "NAV": "导航", @@ -56,6 +148,10 @@ "CARGO": "货船", "TANKER": "油轮", "OTHER": "其他", + "Included in bundle": "已包含在资源包中", + "Missing bundle file — reimport its bundle": "缺少资源包文件——请重新导入其资源包", + "Source configured; file checked when loaded": "数据源已配置;文件在加载时校验", + "Source unavailable": "数据源不可用", "ENVIRONMENTAL": "环境", "EARTH WATCH": "地球监测", "ACTIVE EVENTS": "活跃事件", @@ -74,6 +170,16 @@ "ANIME": "动漫", "NOIR": "黑色电影", "SNOW": "雪景", + "ARCTIC": "北极", + "ANTARCTIC": "南极洲", + "NORTH AMERICA": "北美洲", + "SOUTH AMERICA": "南美洲", + "EUROPE": "欧洲", + "AFRICA": "非洲", + "ASIA": "亚洲", + "OCEANIA": "大洋洲", + "NORTHERN OCEANIC GRID": "北方海洋网格", + "SOUTHERN OCEANIC GRID": "南方海洋网格", "LOADING": "加载中", "DEGRADED": "降级", "STALE": "过期", @@ -84,27 +190,77 @@ "Awaiting telemetry...": "等待遥测数据…", "REC": "REC", "AIS: --": "AIS: --", + "SECTOR {lat} {lon}": "扇区 {lat} {lon}", "POWER UP · {count} KEYS WAITING": { "other": "启动 · {count} 个密钥待配置" }, "POWERED UP": "已启动", + "Invalid JSON": "无效的 JSON", "Save failed ({status}).": "保存失败({status})。", + "OAuth check failed: {detail}": "OAuth 检查失败:{detail}", + "Could not check ChatGPT sign-in. Try again.": "无法检查 ChatGPT 登录状态,请重试。", + "VOICE AUTH · CHATGPT OAUTH": "语音认证 · CHATGPT OAUTH", + "VOICE AUTH · API KEY": "语音认证 · API 密钥", + "USE API KEY": "使用 API 密钥", + "USE CHATGPT OAUTH": "使用 CHATGPT OAUTH", + "Use OPENAI_API_KEY for the next cloud voice session": "下次云语音会话使用 OPENAI_API_KEY", + "Use the signed-in local ChatGPT/Codex OAuth session for the next cloud voice session": "下次云语音会话使用本机已登录的 ChatGPT/Codex OAuth 会话", + "Metered — a billing-enabled account": "按量计费——需要启用结算的账号", + "Free key — register, paste, done": "免费密钥——注册、粘贴,即可使用", + "browser-side": "浏览器端", + "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "此密钥按设计在浏览器中运行——请在服务商处设置限制(见 SECURITY.md)", + "configured externally": "由外部配置", + "Supplied by your environment, Keychain, or launcher — change it where it was set": "由你的环境、钥匙串或启动器提供——请在原设置处修改", + "MANAGE ↗": "管理 ↗", + "GET KEY ↗": "获取密钥 ↗", + "{envVar} saved — paste to replace": "{envVar} 已保存——粘贴可替换", + "paste {envVar}": "粘贴 {envVar}", "REMOVE": "移除", "Remove {title} from this app's saved keys": "从本应用已保存的密钥中移除 {title}", + "Project keys: {status}": "项目密钥:{status}", "your app configuration": "你的应用配置", "your local .env": "你的本地 .env", "Saving…": "正在保存…", "Save failed: {detail}": "保存失败:{detail}", "Paste at least one key first.": "请先至少粘贴一个密钥。", "Saved to {store}. Restarting — this page reloads itself.": "已保存到{store}。正在重启——本页面将自动重新加载。", + "Cloud voice will use OPENAI_API_KEY on the next session.": "云语音将在下次会话使用 OPENAI_API_KEY。", + "Checking local ChatGPT OAuth sign-in…": "正在检查本机 ChatGPT OAuth 登录…", + "Could not check ChatGPT sign-in.": "无法检查 ChatGPT 登录状态。", + "ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "已为云语音选择 ChatGPT OAuth。你的 API 密钥仍会保留并可用。", + "ChatGPT sign-in expired. Opening sign-in again…": "ChatGPT 登录已过期。正在重新打开登录…", + "Opening ChatGPT sign-in in your browser…": "正在在你的浏览器中打开 ChatGPT 登录…", + "Could not start ChatGPT sign-in on this machine.": "无法在此机器上启动 ChatGPT 登录。", + "Finish ChatGPT sign-in in the browser. Waiting for it to complete…": "请在浏览器中完成 ChatGPT 登录,正在等待其完成…", + "ChatGPT sign-in timed out. Click {button} to try again.": "ChatGPT 登录超时。点击“{button}”重试。", + "ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "ChatGPT 登录完成。下次云语音会话将使用 OAuth。", "Remove this key from your saved configuration?": "要从已保存的配置中移除此密钥吗?", "Removed from {store}. Restarting — this page reloads itself.": "已从{store}中移除。正在重启——本页面将自动重新加载。", "Places context + Street View fallback; optional separate key": "地点上下文 + 街景备用;可选的独立密钥", + "Voice control — API key or ChatGPT OAuth": "语音控制——API 密钥或 ChatGPT OAuth", "Live ships, worldwide": "全球实时船舶", "Live active-fire detections": "实时活跃火点探测", "Real live traffic (keyless runs a simulation)": "真实实时路况(无密钥时为模拟)", "Bing imagery map stacks + world terrain": "Bing 影像地图组合 + 全球地形", "More flight-polling credits (anonymous works without)": "更多航班轮询额度(匿名也可使用)", + "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "街景影像与街景图层中的覆盖范围。免费:在 Mapillary 开发者控制台注册一个应用,并粘贴其 Client Token", + "Low": "低", + "High": "高", + "SHOW NEAREST": "最近摄像头", + "Stop following the current object before navigating to a camera": "请先停止跟踪当前目标,再前往摄像头", + "Move to the nearest loaded camera and show its details": "前往最近已加载的摄像头并显示详情", + "Camera badges": "摄像头徽标", + "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "选中后青色摄像头变为珊瑚色。扇形仅示意已标绘方向,并非实测覆盖范围。附近的摄像头可能不在屏幕内。", + "retrying mapped ALPR cameras": "正在重试加载 ALPR 摄像头", + "loading mapped ALPR cameras": "正在加载 ALPR 摄像头", + "No ALPR data for this area — US and Canada only": "此区域没有 ALPR 数据 —— 仅覆盖美国和加拿大", + "Zoom in to load mapped cameras": "放大以加载标绘摄像头", + "Showing cached locations": "正在显示缓存位置", + "Coverage limited — zoom in": "覆盖受限 —— 请放大", + "No ALPR data for this area": "此区域没有 ALPR 数据", + "None on screen — nearby cameras are outside the view": "屏幕上没有摄像头 —— 附近的摄像头在视野之外", + "ALPR camera": "ALPR 摄像头", + "At least {count}": "至少 {count}", "CONTEXT READY": "上下文就绪", "GLOBAL CONTEXT OFF": "全局上下文已关闭", "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "选择一个航班、船舶或地图标注设施", @@ -117,6 +273,7 @@ "FOCUS": "聚焦", "Next — nearest unvisited contact in the 250 km window": "下一个:250 km 范围内最近的未访问目标", "NEXT": "下一个", + "Named areas ({n})": "指定区域({n})", "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "开源的地图标注/观测上下文。缺失的广播、未加载的地图区域或未标注的站点不能作为不存在的证据。", "HDG {value}°": "HDG {value}°", "BRG {value}°": "BRG {value}°", @@ -150,8 +307,83 @@ "CAL {value}": "CAL {value}", "SRC {value}": "SRC {value}", "{value} CONTEXT": "{value} 上下文", + "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "覆盖大西洋及北太平洋东部/中部;不含全球气旋。", + "Cyclone advisories unavailable": "气旋公告不可用", + "Potential tropical cyclone": "潜在热带气旋", + "Hurricane": "飓风", + "Tropical storm": "热带风暴", + "Tropical depression": "热带低压", + "Subtropical storm": "亚热带风暴", + "Subtropical depression": "亚热带低压", + "Track and cone match this advisory": "路径与锥体与本份公告一致", + "Track/cone awaiting advisory {number}": "路径/锥体等待第 {number} 号公告", + "Track/cone unavailable": "路径/锥体不可用", + "Cached advisory · stale source": "缓存公告 · 数据源已过期", + "Loading advisories…": "正在加载公告…", + "{count} active storms": { + "other": "{count} 个活跃气旋" + }, + "Position as of {time}": "位置(截至 {time})", + "Maximum sustained wind: {wind} · Pressure: {pressure}": "最大持续风速:{wind} · 气压:{pressure}", + "{name} · {classification} · Advisory {number} · issued {time}": "{name} · {classification} · 第 {number} 号公告 · 发布于 {time}", + "No active NHC/CPHC systems": "当前没有活跃的 NHC/CPHC 气旋", + "Advisories unavailable": "公告不可用", + "Cyclones · NHC / CPHC": "气旋 · NHC / CPHC", + "Atlantic · E/C Pacific": "大西洋 · 东/中太平洋", + "Official advisory ↗": "官方公告 ↗", + "Active NHC and CPHC cyclone advisories": "活跃的 NHC 与 CPHC 气旋公告", + "Wind unavailable": "风场数据不可用", + "Advisory center / forecast track": "公告中心 / 预报路径", + "Center-track uncertainty cone": "中心路径不确定锥", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "在地图上点选气旋,或在列表中选择以选中并移动相机。点击空白地图区域可清除选择。内容来自 NOAA NHC/CPHC 公报。锥体描述的是预报中心路径的不确定范围,不代表气旋尺寸或全部灾害区域。预报点标注的是数据源的前导小时数,不是按公告发布时刻推算的时间。几何图形贴地显示;显示高度并非天气高度。请以官方公告为准。", + "DRIVE": "驾车", + "Drive": "驾车", + "WALK": "步行", + "Walk": "步行", + "BIKE": "骑行", + "Bike": "骑行", + "{error} — try again in a moment": "{error} — 请稍后重试", + "Routing is rate limited — try again in a moment": "路线请求过于频繁 — 请稍后重试", + "Routing unavailable (HTTP {status})": "路线服务不可用(HTTP {status})", + "Routing unavailable": "路线规划不可用", + "Head out on {road}": "沿{road}出发", + "Head out": "出发", + "Arrive at your destination": "到达目的地", + "{mode} — reroute for {modeLower}": "{mode} — 按{modeLower}重新规划路线", + "CLICK MAP": "点击地图", + "SET A": "设置 A", + "Click a spot on the globe to place A (click again to cancel)": "点击地球上的位置放置 A(再次点击取消)", + "Then click the globe to place the start": "然后点击地球放置起点", + "SET B": "设置 B", + "Click a spot on the globe to place B (click again to cancel)": "点击地球上的位置放置 B(再次点击取消)", + "Then click the globe to place the destination": "然后点击地球放置终点", + "Swap A and B": "交换 A 和 B", + "FLY ···": "飞行 ···", + "FLYING": "飞行中", + "FLY": "飞行", + "Fly the camera along the route": "沿路线飞行相机", + "Place A and B first": "请先放置 A 和 B", + "Remove the route and both markers": "移除路线和两个标记点", + "press Escape twice to leave Draw": "按两次 Escape 退出绘图", + "{name} is active — {leave}, then set {endpoint}": "{name} 正在使用 — {leave},然后设置 {endpoint}", + "Only the first {count} turns of this route are shown": "此路线仅显示前 {count} 个转向", + "Turn-by-turn directions": "逐向导航路线", + "Another map tool is using clicks — close it, then SET A again": "另一个地图工具正在占用点击 — 关闭它,然后重新设置 A", + "Routing…": "正在规划路线…", + "No route found": "未找到路线", "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", + "Click the globe to place {endpoint}": "点击地球放置 {endpoint}", + "SET B, then click the globe": "设置 B,然后点击地球", + "SET A, then click the globe": "设置 A,然后点击地球", + "Step {step} of {total}": "第 {step} 步,共 {total} 步", + "Then: {instruction}": "接下来:{instruction}", + "No route found between A and B": "在 A 和 B 之间未找到路线", + "Routing failed: {error}": "路线规划失败:{error}", + "Routing timed out": "路线规划超时", + "Routing unavailable — no response from the routing service": "路线服务无响应 — 路线规划不可用", + "Earthquake source unavailable": "地震数据源不可用", "Focus fire detection {title}, {details}": "聚焦火点探测 {title},{details}", + "live feed unavailable": "实时数据不可用", "{value} conf": "置信度 {value}", "{value} ago": "{value} 前", "sensor n/a": "传感器 n/a", @@ -166,12 +398,15 @@ "<1m ago": "不到 1 分钟前", "{count}m ago": "{count} 分钟前", "{count}h ago": "{count} 小时前", + "Fire · FRP {frp} MW": "火点 · FRP {frp} MW", "STALE · cached {age}": "过期 · 缓存于 {age}", "refreshing...": "刷新中…", "loading...": "加载中…", "KEY REQUIRED": "需要密钥", "LIVE · updated {age}": "实时 · 更新于 {age}", "loading mapped installation context": "正在加载地图标注设施上下文", + "Too many mapped sites in view to list them all": "视野内标绘地点过多,无法全部列出", + "Installation context unavailable": "设施背景信息不可用", "MAPPED INSTALLATION": "地图标注设施", "Unknown": "未知", "LAUNCH SITE · {site}": "发射场 · {site}", @@ -240,11 +475,50 @@ "Ascent replay": "上升回放", "Orbit replay": "轨道回放", ", paused": ",已暂停", + "Heard by your receiver": "由你的接收机接收", + "browser SDR": "浏览器 SDR", + "decoder feed": "解码器数据源", + "Your RTL-SDR receiver and decoder feed": "你的 RTL-SDR 接收机和解码器数据源", + "Your decoder feed": "你的解码器数据源", + "Your RTL-SDR receiver": "你的 RTL-SDR 接收机", + "NO CALLSIGN": "无呼号", + "Decoder feeds": "解码器数据源", + "WebUSB + decoder feeds": "WebUSB + 解码器数据源", + "opening receiver": "正在打开接收机", + "checking decoder feeds": "正在检查解码器数据源", + "WebUSB needs desktop Chrome or Edge": "WebUSB 需要桌面版 Chrome 或 Edge", + "connect a receiver in Radio": "在电台面板连接接收机", + "receiver is in FM mode": "接收机处于 FM 模式", "listening": "聆听中", + "USB error": "USB 错误", "Alt unknown": "高度未知", "Type unknown": "类型未知", "Reg unknown": "注册号未知", "Operator unknown": "运营方未知", + "{acres} ac": { + "other": "{acres} 英亩" + }, + "{percent}% contained": "已控制 {percent}%", + "containment unknown": "控制比例未知", + "{cause} cause": "起火原因:{cause}", + "{personnel} personnel": { + "other": "{personnel} 名人员" + }, + "{county} County": "{county} 县", + "{cost} to date": "迄今损失 {cost}", + "discovered {age} ago": "发现于 {age}前", + "updated {age} ago": "更新于 {age}前", + "part of {complex}": "属于 {complex} 复合火场", + "InciWeb ↗ · click card to open": "InciWeb ↗ · 点击卡片打开", + "FIRE · {name}": "火场 · {name}", + "Unnamed incident": "未命名火情", + "Open {title} on InciWeb": "在 InciWeb 上打开 {title}", + "Perimeter source unavailable": "周界数据源不可用", + "Not contained or unknown": "未控制或未知", + "Under 50% contained": "控制低于 50%", + "50–99% contained": "控制 50–99%", + "Fully contained": "已全部控制", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "颜色表示报告的控制比例。周界简化至约 100 米。", "News": "新闻", "Talk": "谈话", "Weather / Emergency": "天气 / 应急", @@ -253,6 +527,10 @@ "Traffic / Transit": "交通 / 公交", "Music": "音乐", "Other": "其他", + "Directory refresh degraded; showing the previous station catalog.": "目录刷新降级;正在显示上一次的电台目录。", + "Radio directory coverage is degraded.": "电台目录覆盖已降级。", + "Directory refresh failed; showing the previous station catalog.": "目录刷新失败;正在显示上一次的电台目录。", + "Radio directory is temporarily unavailable.": "电台目录暂时不可用。", "Alternative": "另类", "Ambient": "氛围", "Blues": "蓝调", @@ -287,7 +565,22 @@ "DENSE ···": "密集 ···", "DENSE ✕": "密集 ✕", "DENSE": "密集", + "DOCKED · {name}": "对接 · {name}", + "KEY REJECTED": "密钥被拒绝", + "loading coverage...": "正在加载覆盖范围...", "Selected": "所选", + "UNAVAILABLE · {source} · Roads unavailable": "不可用 · {source} · 道路不可用", + "Roads: {source}": "道路:{source}", + "TomTom roads unavailable while the traffic service is unreachable": "交通服务不可达期间 TomTom 道路不可用", + "Hybrid unavailable while the traffic service is unreachable": "交通服务不可达期间混合模式不可用", + "TomTom roads need a TomTom key": "TomTom 道路需要 TomTom 密钥", + "Hybrid needs a TomTom key": "混合模式需要 TomTom 密钥", + "Local surface still loading": "本地路面仍在加载", + "Partial coverage": "部分覆盖", + "Detailed roads unavailable": "详细道路不可用", + "Reduced detail coverage": "详细覆盖范围受限", + "OpenStreetMap roads, with TomTom flow matched when available": "OpenStreetMap 道路,可用时匹配 TomTom 路况", + "SIMULATED — {reason}": "模拟 — {reason}", "Syncing flow · Roads: {source}": "正在同步流量 · 道路:{source}", "LIVE · Roads: {source} · Roads without flow hidden": "实时 · 道路:{source} · 已隐藏无流量道路", "LIVE · Roads: {source} · No flow roads in view": "实时 · 道路:{source} · 视野内无流量道路", @@ -299,6 +592,7 @@ "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "模拟 · 道路:OpenStreetMap · 流量:TomTom(无匹配)", "SIMULATED — traffic service unreachable": "模拟——交通服务无法连接", "SIMULATED — add TomTom key for live": "模拟——添加 TomTom 密钥以获取实时数据", + "Route {route}": "航线{route}", "AIS: {name}": "AIS: {name}", "{type} SPD: {speed} HDG: {heading}": "{type} SPD: {speed} HDG: {heading}", "VESSEL": "船舶", @@ -307,39 +601,222 @@ "awaiting first AIS position…": "等待首个 AIS 位置…", "awaiting usable AIS positions…": "等待可用的 AIS 位置…", "awaiting first AIS message…": "等待首条 AIS 消息…", + "AISSTREAM_API_KEY not set": "未设置 AISSTREAM_API_KEY", + "live feed unsupported": "不支持实时数据源", + "connecting to feed…": "正在连接数据源…", + "feed disconnected": "数据源已断开", + "feed down": "数据源中断", + "feed idle": "数据源空闲", + "API key rejected — check AISSTREAM_API_KEY": "API 密钥被拒绝 — 请检查 AISSTREAM_API_KEY", + "feed silent {seconds}s — no AIS data": "数据源已静默 {seconds} 秒 — 无 AIS 数据", + "feed silent — no AIS data": "数据源已静默 — 无 AIS 数据", + "Hidden by this map source · choose a globe map": "已被当前地图源隐藏 · 请选择球体地图", + "Frame unavailable; previous observation retained": "帧不可用;保留上一帧观测", + "Weather imagery unavailable": "天气影像不可用", + "Weather source unavailable; previous observation retained": "天气数据源不可用;保留上一帧观测", + "Weather unavailable": "天气数据不可用", + "{hours}h {minutes}m ago": "{hours} 小时 {minutes} 分前", "{minutes}m ago": "{minutes} 分钟前", "{state} · {time} · {lag}": "{state} · {time} · {lag}", + "Observed": "观测", + "History": "历史", + "Observation unavailable": "观测不可用", + "Waiting for observation": "等待观测数据", + "RADAR REFLECTIVITY · dBZ": "雷达反射率 · dBZ", + "LIGHTNING DENSITY · 15 min accumulation": "闪电密度 · 15 分钟累计", + "GLOBAL INFRARED · hourly": "全球红外 · 每小时", + "GOES INFRARED · ~5 min": "GOES 红外 · 约 5 分钟", "{state}: {time}": "{state}:{time}", + "Latest observation": "最新观测", "loading": "加载中", + "Observation: unavailable": "观测:不可用", + "Contiguous US · gaps ≠ no rain": "美国本土 · 无回波 ≠ 无降雨", + "Americas + Pacific · not individual strikes": "美洲与太平洋 · 非单次闪击", + "Color: strikes/km²/min ×10³": "颜色:次闪/km²/分钟 ×10³", + "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · 通常延迟 2–3 小时", + "North America · infrared imagery": "北美洲 · 红外影像", + "Reduced motion · history playback unavailable": "减弱动效 · 历史回放不可用", + "Reduced motion · manual history available": "减弱动效 · 可手动浏览历史", + "Rain radar · US": "降雨雷达 · 美国", + "Lightning density · 15 min": "闪电密度 · 15 分钟", + "Satellite clouds": "卫星云图", + "Americas + Pacific": "美洲与太平洋", + "Global · 60°S–60°N": "全球 · 60°S–60°N", + "North America": "北美洲", + "Source observations delayed": "数据源观测延迟", + "Stale source": "数据源已过期", + "Loading next frame…": "正在加载下一帧…", + "Map center outside coverage": "地图中心在覆盖范围之外", + "N. America": "北美", + "Global": "全球", + "Hourly global mosaic; usually 2–3 hours delayed": "每小时全球拼图;通常延迟 2–3 小时", + "GOES regional clouds; approximately 5-minute updates": "GOES 区域云图;约 5 分钟更新", + "Clouds only": "仅云区", + "Full": "完整", + "Soft": "柔和", + "Vivid": "鲜明", + "Image opacity; does not alter the observed values": "图像不透明度;不改变观测值", + "View US radar": "查看美国雷达", + "View Americas & Pacific": "查看美洲与太平洋", + "View coverage": "查看覆盖范围", + "{value} strikes/km²/min ×10³ (15-minute density)": "{value} 次闪/km²/分钟 ×10³(15 分钟密度)", + "{value} dBZ radar reflectivity": "{value} dBZ 雷达反射率", + "STALE · cached source metadata": "已过期 · 数据源元数据为缓存", + "Map center is outside source coverage": "地图中心在数据源覆盖范围之外", + "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "NOAA/NWS 15 分钟闪电密度,来源为 Vaisala NLDN/GLD360。覆盖自 110°E 经太平洋/美洲至 0°,25°S–80°N。不是实时闪击计数、不是全球覆盖,也不构成安全警示。", + "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "NOAA MRMS 雷达回波反映降水形态,不代表降雨强度、风暴警报或未来预报。原始数据约 1 公里分辨率;显示限制在第 6 级。各帧使用数据源公布的精确观测时间。", + "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "GOES-19/18 第 14 波段长波红外区域图;NESDIS 全球长波拼图。“仅云区”会调暗除明亮冷云顶之外的一切;这是亮度滤镜,不是云掩膜。覆盖范围与新鲜度因区域而异。", + "REGION": "区域", + "IMAGE": "图像", + "OPACITY": "不透明度", + "Weather tiles unavailable · previous frame retained": "天气瓦片不可用 · 保留上一帧", + "Some weather tiles unavailable": "部分天气瓦片不可用", + "Temperature field unavailable": "温度字段不可用", "Wind": "风", + "Wind source unavailable": "风场数据源不可用", + "Forecast · does not follow history": "预报 · 不随观测历史变化", + "Wind motion": "风场运动", + "Wind speed": "风速", + "Sea-level pressure": "海平面气压", + "Air temperature · 2 m": "2 米气温", + "Global · 1° grid": "全球 · 1° 网格", + "{model} forecast · {time}": "{model} 预报 · {time}", + "Loading forecast": "正在加载预报", + "Preparing flow": "正在准备流场", + "Selected field unavailable": "所选字段不可用", + "Cached forecast · stale": "缓存预报 · 已过期", + "ECMWF IFS surface forecast": "ECMWF IFS 地面预报", + "NOAA GFS surface forecast": "NOAA GFS 地面预报", + "Reduced motion": "减弱动效", "Resume": "继续", "Pause": "暂停", + "Pause visual flow; forecast time does not advance with animation": "暂停流动动画;预报时次不会随动画推进", + "None": "无", + "Speed": "风速", + "Pressure": "气压", + "Temperature": "气温", + "Wind trails with no field shading": "仅风流线,不叠加字段填色", + "How hard the surface wind is blowing": "地面风有多大", + "Sea-level air pressure: broad highs and lows": "海平面气压:大范围的高压与低压", + "Air temperature two meters above the surface": "地面以上两米的气温", + "Wind speed units": "风速单位", + "Read wind at map center": "读取地图中心风速", + "Read the forecast at the center of the map without changing selection": "读取地图中心的预报值,不改变当前选择", + "{model} forecast · {field} ({unit})": "{model} 预报 · {field}({unit})", + "Valid: {time}": "生效:{time}", + "Issued: {time}": "发布:{time}", + "Selected field unavailable · wind remains visible": "所选字段不可用 · 风场仍可见", + "{error} · wind remains visible": "{error} · 风场仍可见", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "10 米高度的地表风。约 1° 全球网格。流线沿 10 米风场绘制,为便于观看抬升至 12 公里;显示高度并非天气高度。视图光照仅为可读性服务。动画展示的是单一固定预报内的流场,不推进时间。颜色字段贴附于球体底图或当前的照片级 3D Tiles。", + "MODEL": "模型", + "FIELD": "字段", + "UNITS": "单位", + "MOTION": "运动", + "Forecast": "预报", + "No surface reading": "暂无地表读数", + "Aim the map center at Earth": "请将地图中心对准地球", + "A location reading needs a loaded forecast and the Earth at the center of the view.": "位置读数需要已加载的预报,且地图中心对准地球。", + "Interpolated model forecast on an approximately 1° grid. Broad weather patterns, not a street-level measurement.": "按约 1° 网格插值的模式预报。反映大范围天气形势,不是街道级实测。", + " from {direction}": "从{direction}出发", + "WIND AT {coordinates}": "{coordinates} 的风", + "{model} · valid {time}": "{model} · 生效 {time}", + "Globe imagery unavailable": "球体影像不可用", + "Globe field image unavailable": "球体字段图像不可用", "Error: {message}": "错误:{message}", "Needs {envVars} — add it in Provider Settings": "需要 {envVars},请在服务商设置中添加", "{label} is unavailable": "{label} 不可用", "This map stack": "此地图组合", "{label} unavailable: {hint}": "{label} 不可用:{hint}", + "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Google 3D 瓦片不可用 — 请检查密钥的 API 限制、配额或网络", "Visible map targets": "可见的地图目标", "Source": "来源", + "Camera ownership changed": "相机所有权已变更", + "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "已保存的项目无法读取;存储已保留。请导入有效文件以恢复保存。", "Ready": "就绪", + "Scene layer turned off": "场景图层已关闭", + "Stopped": "已停止", + "Scene not saved — existing saved project could not be read. Export edits or import a valid file.": "场景未保存——已保存的项目无法读取。请先导出修改或导入有效文件。", + "Scene not saved — {reason}": "场景未保存——{reason}", + "Scene not saved — browser storage unavailable": "场景未保存——浏览器存储不可用", "Loaded: {scene} / {shot}": "已加载:{scene} / {shot}", + "Cannot update {scene}: shot inventory changed": "无法更新 {scene}:镜头清单已变化", + "Cannot update {scene}: evidence beats changed": "无法更新 {scene}:证据节拍已变化", + "Cannot update {scene}: shot bindings are incomplete": "无法更新 {scene}:镜头绑定不完整", + "Updated {count} shots: {scene}": { + "other": "已更新 {count} 个镜头:{scene}" + }, + "Appended {count} shots: {scene}": { + "other": "已追加 {count} 个镜头:{scene}" + }, "Cannot capture shot: camera not ready": "无法截取镜头:相机未就绪", "Captured: {scene} / {shot}": "已截取:{scene} / {shot}", "Select a shot first": "请先选择一个镜头", "Updated: {scene} / {shot}": "已更新:{scene} / {shot}", + "Could not leave scene: {scene}": "无法离开场景:{scene}", + "Seeked: {scene} / {shot}": "已定位:{scene} / {shot}", + "Seeking scene clock": "正在定位场景时钟", "Camera unavailable — exit cockpit first": "相机不可用——请先退出座舱", "No shots to run": "没有可运行的镜头", + "Scene transition limit reached — load a shot to reset": "已达到场景切换上限——请载入一个镜头以重置", + "Export failed: {error}": "导出失败:{error}", "Project exported": "项目已导出", + "Importing project": "正在导入项目", + "Imported {file}": "已导入 {file}", + "Import failed: {error}": "导入失败:{error}", + "Import failed (could not read JSON file)": "导入失败(无法读取 JSON 文件)", + "Layers refused: {layers}": "被拒绝的图层:{layers}", "Could not exit {mode} — scene layers may be refused": "无法退出 {mode}——场景图层可能被拒绝", + "Camera move interrupted": "相机移动被中断", + "Scene media timed out": "场景媒体播放超时", + "Action complete": "动作已完成", + "Action unavailable or cancelled": "动作不可用或已取消", + "Scene actions": "场景动作", + "Select a feature or use Tab and Enter to choose an action.": "选择一个要素,或使用 Tab 和 Enter 选择动作。", + "Selected feature: {feature}. Choose an action.": "已选要素:{feature}。请选择动作。", "Running {index}/{total}: {scene} / {shot}": "正在运行 {index}/{total}:{scene} / {shot}", "Scene run complete": "场景运行完成", + "Bhote Koshi Evidence Sequence": "Bhote Koshi 证据序列", + "Nepal Flood Incident": "尼泊尔洪水事件", "Global Flights Radar": "全球航班雷达", "Orbital Watch": "轨道监视", "Thermal Threat Board": "热源威胁看板", "City Overload": "城市过载", "Omniscience Pullback": "全知拉远", + "Scene {n}": "场景 {n}", "Shot {n}": "镜头 {n}", + "Could not complete this action. Check the file, references and selected assets.": "无法完成此操作。请检查文件、引用和所选资源。", + "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack}:{status}。文件:{path}。{attribution} · {license}", + "Unavailable layers: {layers}": "不可用图层:{layers}", + "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "已校验 {bytes} 个打包字节。文件仅保留在本次会话的内存中。重新加载应用后请再次导入资源包。", + "Review scene import": "审查场景导入", + "Nothing is loaded or changed until you apply this file.": "在你应用此文件之前,不会载入或更改任何内容。", + "Ready to import": "可以导入", + "Apply replaces the current project. Export your current project first if you want to keep both.": "应用后将替换当前项目。如需同时保留两者,请先导出当前项目。", + "Apply import": "应用导入", + "Import was not applied. The current project may have changed.": "导入未应用。当前项目可能已发生变化。", + "Select a scene and shot first": "请先选择场景和镜头", + "Edit scene details": "编辑场景详情", + "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "相机位置使用度与椭球面上的米数。草稿在替换已保存场景之前会先进行校验。", + "Anchors and data packs": "锚点与数据包", + "Shot camera, timing, packs and actions": "镜头相机、时序、数据包与动作", + "New anchor ID": "新锚点 ID", + "Capture camera as anchor": "将当前相机采集为锚点", + "Anchor added to draft": "锚点已加入草稿", + "Set move start to current camera": "将运动起点设为当前相机", + "Move added to draft; destination remains the shot camera": "运动已加入草稿;终点仍为镜头相机", + "Use ordinary flight": "使用普通飞行", + "Invalid shot JSON": "镜头 JSON 无效", + "Apply details": "应用详情", + "Select a scene first": "请先选择一个场景", + "Share selected scene": "分享所选场景", + "Scene JSON preserves authored settings and attribution. It does not include asset files. Bundles include only pack files you choose here or previously imported bundle files.": "场景 JSON 保留创作设置与署名信息。它不包含资源文件。资源包仅包含你在此选择的包文件或先前导入的资源包文件。", + "Download scene JSON": "下载场景 JSON", + "Choose data-pack files": "选择数据包文件", + "Or choose a data-pack folder": "或选择数据包文件夹", + "Download asset bundle": "下载资源包", + "Asset bundle downloaded": "资源包已下载", "Density": "密度", + "Gain": "增益", "Bloom": "泛光", "VISUAL PRESETS": "视觉预设", "LOCATION": "位置", @@ -349,12 +826,18 @@ "CCTV layer unavailable": "CCTV 图层不可用", "Link copied!": "链接已复制!", "Copy failed": "复制失败", + "Tilt map to oblique view": "将地图倾斜至斜视角", "CCTV calibration saved": "CCTV 校准已保存", + "RANGE": "范围", + "{value}m": "{value}分钟", "CCTV calibration reset": "CCTV 校准已重置", "ADJUST ON": "调整开", "ADJUST": "调整", + "LIVE": "实时", "UNKNOWN": "未知", "ERROR": "错误", + "Configured source": "已配置数据源", + "Configured Source": "已配置数据源", "SOURCE · UNKNOWN": "来源 · 未知", "FRAME · LOADING": "画面 · 加载中", "FRAME · UNAVAILABLE": "画面 · 不可用", @@ -504,6 +987,11 @@ "{mode} could not start because another layer did not stop cleanly": "{mode}无法启动,因为另一个图层未能正常停止", "Space Missions": "太空任务", "Context": "上下文", + "Rendered globe frames per second · toggle with `": "每秒渲染的地球帧数 · 按 ` 键切换", + "Show {name}": "显示 {name}", + "Fly to {name}": "飞往{name}", + "Press on the ground, not the sky": "请按在地面,而不是天空", + "Drag to size the box": "拖动以调整框选大小", "Live Flights": "实时航班", "Military Flights": "军用航班", "Earthquakes (24h)": "地震(24 小时)", @@ -520,10 +1008,32 @@ "Dams": "水坝", "Submarine Cables": "海底电缆", "FIRMS Active Fires": "FIRMS 活跃火点", + "Local ADS-B": "本地 ADS-B", "Transit": "交通", + "Recent Imagery": "近期影像", + "Fire Perimeters": "火场周界", + "Rain radar": "降雨雷达", + "Lightning density": "闪电密度", + "Cyclone advisories": "气旋公告", + "ALPR Cameras": "ALPR 摄像头", + "Live Vessels": "实时船舶", + "Bike Share": "公共自行车", + "Cameras": "相机", + "Street Level": "街景", + "Mapped ALPR Cameras": "ALPR 摄像头", + "Data Centers": "数据中心", + "Active Fires": "活跃火点", + "Military aircraft": "军用飞机", + "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · 预报", + "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · 观测", "ENABLING": "启用中", "DISABLING": "停用中", + "Movement": "移动", + "Infrastructure": "基础设施", + "Events": "事件", "Weather": "天气", + "Utilities": "工具", + "Other layers": "其他图层", "{state} · {source}": "{state} · {source}", "UNCERTAIN · {source} · lifecycle state requires reconciliation": "不确定 · {source} · 生命周期状态需要核对", "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · {seconds} 秒后重试", @@ -537,15 +1047,39 @@ "{state} · {source} · {ago}": "{state} · {source} · {ago}", "{source} · {ago}": "{source} · {ago}", "UNCERTAIN": "不确定", + "Data source unavailable": "数据源不可用", "{name}: {state}": "{name}:{state}", "{count}s ago": "{count} 秒前", "CONNECTING": "连接中", + "TUNING": "调谐中", + "STREAMING": "正在流式接收", + "waiting for IQ": "等待 IQ 数据", + "{count} messages": { + "other": "{count} 条消息" + }, + "DSP {count} blocks": { + "other": "DSP {count} 个模块" + }, + "DSP waiting": "DSP 等待中", + "audio signal --": "音频信号 --", + "audio {state}": "音频 {state}", + "{count} HEARD": { + "other": "已收到 {count} 架" + }, + "DISCONNECT": "断开连接", + "CONNECT": "连接", + "LOCATING…": "定位中…", + "LOCATED": "已定位", + "LOCATE": "定位", + " · read while Local ADS-B is on": " · 仅在本地 ADS-B 开启时读取", + "Interface language": "界面语言", "📍 Location: --": "📍 位置:--", "Landmark: --": "地标:--", "Searched location": "已搜索的位置", "ORBIT": "环绕", "Location not found": "未找到位置", "Search failed": "搜索失败", + "Detailed outline unavailable": "无法获取详细轮廓", "Fly to a POI first": "请先飞往一个 POI", "Reset to full globe view": "重置为完整地球视图", "Reset cockpit to full globe view": "将座舱重置为完整地球视图", @@ -560,17 +1094,30 @@ "Expand Radio section": "展开电台区域", "Collapse Radio section": "收起电台区域", "Panel layout updated — positions reset to new defaults": "面板布局已更新——位置已重置为新的默认值", + "Austin": "奥斯汀", + "San Francisco": "旧金山", + "New York": "纽约", + "Tokyo": "东京", + "London": "伦敦", + "Paris": "巴黎", + "Dubai": "迪拜", + "Washington DC": "华盛顿特区", + "Tallinn": "塔林", "Collapse Cockpit display options": "收起座舱显示选项", "Expand Cockpit display options": "展开座舱显示选项", "Collapse Cockpit Radio controls": "收起座舱电台控件", "Expand Cockpit Radio controls": "展开座舱电台控件", + "CH {index} / {total}": "频道 {index} / {total}", "NO STATIONS": "无电台", "NO STATION AVAILABLE": "没有可用电台", "{name}, station {index} of {total}": "{name},第 {index} 个电台,共 {total} 个", "No station available": "没有可用电台", "OFF AIR": "停播", "STATION UNAVAILABLE": "电台不可用", + "Station unavailable after directory refresh": "目录刷新后该电台不可用", "Radio could not {action} cleanly": "电台未能正常{action}", + "Go to expanded Radio section": "前往展开的电台分区", + "Expand Radio section in Context": "在态势面板中展开电台分区", "Close compact Radio controls": "关闭精简电台控件", "Open compact Radio controls": "打开精简电台控件", "SYNC": "同步", @@ -619,19 +1166,119 @@ "Radio is enabling…": "电台正在启用…", "Radio is disabling…": "电台正在停用…", "Radio lifecycle is uncertain — use Enable or Disable to reconcile": "电台生命周期状态不确定——请使用“启用”或“停用”进行核对", + "Clear reading": "清除读数", + "Earlier observation": "早前观测", + "Observed history": "观测历史", + "Later observation": "稍后观测", + "Latest": "最新", + "Newest frame per product": "每个产品的最新一帧", + "Replay observed history": "回放观测历史", + "Imagery on Esri · Google 3D returns when cleared": "影像来自 Esri · 清除后恢复 Google 3D", + "{owner} is using the pointer — close it first": "{owner} 正在使用指针——请先将其关闭", + "VS BASEMAP": "对比底图", + "A / B": "A / B", + "Newest low-cloud day for this box · scene cloud, not box cloud": "此框选最新的低云日 · 云量为场景云量,而非框内云量", + "Newest day covering this box · cloudier than 20%": "覆盖此框选的最新一天 · 云量高于 20%", + "Newest day with imagery for this box · partial coverage": "此框选有影像的最新一天 · 部分覆盖", + "Newest daily overview for this box": "此框选的最新每日概览", + "newest clear day": "最新晴天", + "newest day (cloudy)": "最新一天(多云)", + "newest day (partial coverage)": "最新一天(部分覆盖)", + "newest overview": "最新概览", + "No imagery": "无影像", "Loading": "加载中", "unknown": "未知", + "no imagery": "无影像", + "{percent}% cloud": "{percent}% 云量", + "{min}–{max}% cloud": "{min}–{max}% 云量", + "NO BOX": "无框选", + "SEARCHING": "搜索中", + "{count} DAYS": { + "other": "{count} 天" + }, + "Zoom in or draw a smaller box": "放大或绘制更小的框选", + "Select a box or use the view": "框选区域,或使用当前视野", + "Searching the last 30 days": "正在搜索最近 30 天", + "No days to show for this box": "此框选没有可显示的日期", + "Drag the divider · SWAP trades sides": "拖动分割线 · “交换”互换两侧", + "← → preview · A or B pins the focused day": "← → 预览 · A 或 B 钉住聚焦日", + "← → preview the other side · A or B pins it": "← → 预览另一侧 · A 或 B 将其钉住", + "S on another day replaces it · × unpins": "在其他日期按 S 替换 · × 取消钉住", + "← → preview · S shows the focused day": "← → 预览 · S 显示聚焦日", + "ZOOM IN": "放大", + "Fly in until the view fits the 1,000 km limit": "拉近直到视野满足 1,000 km 限制", + "Imagery days, newest first · arrows move, S or A and B pin": "影像日期(最新在前)· 方向键移动,S、A、B 钉住", + "On the map": "地图上", + "Mode": "模式", + "Imagery opacity": "影像不透明度", + "SWAP": "交换", + "Trade the two sides of the divider": "互换分割线两侧", + "SELECT BOX": "框选区域", + "Drag a box on the map (Esc cancels)": "在地图上拖出框选(Esc 取消)", + "USE VIEW": "使用当前视野", + "Use the current view as the box": "以当前视野作为框选", + "Forget the box and its images": "清除框选及其影像", + "START HERE": "从此开始", + "Checking": "检查中", + "PREVIEW": "预览", + "Newest day with imagery for this box": "此框选有影像的最新一天", + "SHOW": "显示", + "Pin {day} as {slot}": "将 {day} 钉为 {slot}", + "Show {day}": "显示 {day}", + "preview": "预览", + "start here": "从此开始", + "No box": "无框选", + "Searching": "搜索中", + "Every day is empty here": "此处每天都为空", + "Sources off": "数据源未开启", + "Not set": "未设置", + "Basemap": "底图", + "Unpin {slot}": "取消钉住 {slot}", + "Unpin the image": "取消钉住图像", + "EXPORT {slot}": "导出 {slot}", + "EXPORT": "导出", + "Download {slot} as a PNG": "将 {slot} 下载为 PNG", + "Box {width} × {height} km": "框选 {width} × {height} km", + "Acquired {time}": "获取于 {time}", + "Coverage {coverage}": "覆盖 {coverage}", + "START HERE · {reason}": "从此开始 · {reason}", + "Daily overview shows little detail in a box this small": "框选这么小时,每日概览几乎看不出细节", + "Imagery: NASA GIBS and Worldview · HLS (Sentinel-2, Landsat 8/9) and VIIRS": "影像:NASA GIBS 与 Worldview · HLS(Sentinel-2、Landsat 8/9)与 VIIRS", + "Details": "详情", + "Times, coverage, sources": "时间、覆盖与数据源", + "HIDE EMPTY DAYS": "隐藏空白日", + "SHOW EMPTY DAYS · {count}": "显示空白日 · {count}", + "Days the probe found empty in this box": "探测发现此框选内为空的日期", + "image": "图像", + "BASEMAP": "底图", + "The basemap": "底图", + "basemap": "底图", + "Recent imagery against the basemap divider": "近期影像与底图对比分割线", + "Recent imagery A and B divider": "近期影像 A / B 分割线", + "{before} {left} percent, {after} {right} percent": "{before} {left}%,{after} {right}%", + "Export failed · {error}": "导出失败 · {error}", "Scene action failed": "场景操作失败", + "New scene name": "新场景名称", + "Delete scene \"{scene}\" and all shots?": "删除场景“{scene}”及其全部镜头?", "Delete shot \"{shot}\"?": "删除镜头“{shot}”?", + "Stopped (Esc)": "已停止(Esc)", "SPARSE": "稀疏", "BALANCED": "均衡", + "No shots yet. Use CAPTURE SHOT to save current look.": "暂无镜头。使用“采集镜头”保存当前画面。", + "Double-click to rename": "双击重命名", + "Shot name": "镜头名称", + "LOAD": "载入", "DEL": "删除", + "Cancel": "取消", + "EDIT DETAILS": "编辑详情", + "SHARE SCENE": "分享场景", "entity": "实体", "Shared {subject} follow expired": "共享的 {subject} 跟随已过期", "Shared {subject} could not be restored — feed unavailable": "无法恢复共享的 {subject}——数据源不可用", "Shared {subject} is unavailable": "共享的 {subject} 不可用", "ACQUIRING": "获取中", "SHARED {subject}": "共享 {subject}", + "subject": "目标", "LOADING LIVE DATA": "正在加载实时数据", "LOAD COMPLETE": "加载完成", "LOAD CANCELLED": "加载已取消", @@ -640,27 +1287,86 @@ "MAPPED SITES LOADED": "已加载地图站点", "RETRYING MAPPED SITES": "正在重试地图站点", "FETCHING MAPPED SITES": "正在获取地图站点", + "RETRYING ALPR CAMERAS": "正在重试 ALPR 摄像头", + "FETCHING ALPR CAMERAS": "正在获取 ALPR 摄像头", "OVERPASS TEMPORARILY UNAVAILABLE": "Overpass 暂时不可用", "OVERPASS RATE-LIMITED": "Overpass 已限流", "OVERPASS TIMED OUT": "Overpass 超时", "OVERPASS COULD NOT COMPLETE THE QUERY": "Overpass 无法完成查询", + "MAP TILES TEMPORARILY UNAVAILABLE": "地图瓦片暂时不可用", + "MAPPED NAMES TEMPORARILY UNAVAILABLE": "地点名称暂时不可用", "TURNING OFF LIVE DATA": "正在关闭实时数据", "REFRESHING LIVE DATA": "正在刷新实时数据", "syncing road network": "正在同步路网", "retry pending": "等待重试", "retrying in {seconds}s": "{seconds} 秒后重试", + "ALPR cameras": "ALPR 摄像头", + "Loading {feeds}": "正在加载 {feeds}", + "{count} heard": { + "other": "已收到 {count} 架" + }, + "{rate} msg/s": "{rate} msg/s", + "Street Level could not start": "街景未能启动", + "Street Level toggle failed": "街景切换失败", + "Street-level image": "街景图像", + "SHRINK": "缩小", + "EXPAND": "展开", + "Shrink": "缩小", + "Expand": "展开", + "ANY DATE": "任意日期", + "LAST 10 YEARS": "最近 10 年", + "LAST 5 YEARS": "最近 5 年", + "LAST 3 YEARS": "最近 3 年", + "LAST 2 YEARS": "最近 2 年", + "LAST YEAR": "最近一年", + "LAST 6 MONTHS": "最近 6 个月", + "LAST 3 MONTHS": "最近 3 个月", + "LAST MONTH": "最近一个月", + "LAST {count} DAYS": { + "other": "最近 {count} 天" + }, + "{window} · SINCE {date}": "{window} · 自 {date}", + "Turn Street Level off": "关闭街景", + "Turn Street Level on": "开启街景", + "{name} imagery on": "{name} 影像已开启", + "{name} imagery off": "{name} 影像已关闭", + "Image by {creator}": "图像作者:{creator}", + "Camera follows view: move the globe camera wherever the street-level view looks": "相机跟随视野:街景看向哪里,地球相机就移到哪里", + "Camera follow needs the Google 3D map: choose Google 3D under MAP SOURCE": "相机跟随需要 Google 3D 地图:请在地图源(MAP SOURCE)中选择 Google 3D", + "Switch a provider on to draw its coverage.": "开启一个提供商以绘制其覆盖范围。", + "Loading this sequence…": "正在加载此序列…", + "{n} images in this sequence · Esc clears": { + "other": "此序列共 {n} 张图像 · Esc 清除" + }, + "{n} sequences in view · click a line for its photos": { + "other": "视野内共 {n} 条序列 · 点击线段查看其照片" + }, "Celestial ring — reveal the full globe": "天球环——显示完整地球", "Celestial ring — available in Normal style": "天球环——仅在常规样式下可用", "Detection overlay: {mode}": "探测叠加层:{mode}", "Detection overlay: off": "探测叠加层:关闭", "DETECT": "探测", + "{time} · {minutes} min ago": "{time} · {minutes} 分钟前", + "Active weather": "活跃天气", + "LATEST · newest per product": "最新 · 每个产品的最新一帧", + "Forecast · valid {valid} · issued {issued}": "预报 · 生效 {valid} · 发布 {issued}", + "Forecast · valid {valid}": "预报 · 生效 {valid}", "AI AGENT": "AI 代理", "Voice model tier — applies next session": "语音模型档位——下次会话生效", "Estimated session cost": "预估会话费用", "Voice control — activate to toggle voice; hold Space to speak": "语音控制——激活可切换语音;按住空格键说话", + "ON/OFF": "开/关", "VOICE STANDBY": "语音待机", "VOICE CONTROL": "语音控制", "Hold Space to speak · tap Space to activate focused controls": "按住空格键说话 · 轻按空格键激活当前聚焦的控件", + "Voice assistant": "语音助手", + "VOICE": "语音", + "Dismiss voice card": "关闭语音卡片", + "YOU": "用户", + "THIS": "此目标", + "Plan": "计划", + "Referenced items": "引用条目", + "NOTES & SOURCES": "笔记与来源", "VOICE SYSTEM ERROR": "语音系统错误", "DISMISS": "关闭", "Check microphone permission and network access, then try again.": "请检查麦克风权限和网络连接,然后重试。", @@ -675,18 +1381,89 @@ "Voice session could not be started.": "无法启动语音会话。", "Next session: {pendingId} — this session stays on {modelId}": "下次会话:{pendingId}——本次会话仍使用 {modelId}", "Voice model: {pendingId} — click to switch to {target}; applies next session": "语音模型:{pendingId}——点击切换到 {target};下次会话生效", + "COST UNKNOWN": "费用未知", + "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "ChatGPT OAuth 会话:已报告 {responses} 个响应、{input} 个输入 token、{output} 个输出 token、{captions} 次字幕转写。", + "USD cost and the API spend cap are unavailable for this auth mode.": "此认证模式下无法提供美元费用与 API 消费上限。", + "Usage is incomplete because a response was still in flight when the session ended.": "用量不完整,因为会话结束时仍有响应在处理中。", "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "{modelId} 的预估会话费用——{responses} 次响应。达到 {warn} 时警告,达到 {cap} 时结束会话。", + "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "估算不完整 — 会话结束时仍有响应在处理中,因此其用量从未上报。", "{tier} applies next session": "{tier} 将在下次会话生效", "Session ended — cost cap {cost}": "会话已结束——已达费用上限 {cost}", "Radio did not start": "电台未能启动", "Running command": "正在执行指令", + "{n} fires": { + "other": "{n} 处火点" + }, + "anywhere in the loaded data": "已加载数据中的任意位置", + "in view": "视野内", + "over {region}": "{region} 范围内", + "At least {items}": "至少 {items}", "{items} {scope}": "{items} {scope}", + "{label} off": "{label} 已关闭", + "counted the first {returned} loaded records": "已统计最先加载的 {returned} 条记录", + "counted {returned} of {total} loaded records": "已统计已加载 {total} 条记录中的 {returned} 条", + "Fly below {km} km to a covered region": "请飞行至 {km} 公里以下的覆盖区域", + "No feed here yet · {n} regions available": { + "other": "此区域暂无线路 · 有 {n} 个覆盖区域" + }, "degraded": "降级", "stale": "过期", "partial": "部分", "fallback": "备用", "unavailable": "不可用", + "Not answered: {layers}": "未回答:{layers}", + "Toggle voice control": "切换语音控制", + "Activate to toggle voice": "点击切换语音", "Voice active": "语音已启用", + "Voice could not be started.": "无法启动语音。", + "{value} feet": "{value} 英尺", + "nominal": "正常", + "{label} on": "{label} 已开启", + "Layer": "图层", + "there": "那里", + "Camera range {range}": "相机距离{range}", + "Within {radius} of the view": "距当前视野{radius}内", + "Labels on": "标签已开启", + "Framing uses the nearest 80 loaded contacts": "取景仅使用已加载的最近 80 个目标", + "{distance} from {location}": "{distance} 自 {location}", + "Altitude {altitude}": "高度{altitude}", + "{origin} to {destination}": "{origin} 至 {destination}", + "from {origin}": "从{origin}出发", + "to {destination}": "前往{destination}", + "Registration {registration}": "注册号{registration}", + "View state": "视野状态", + "Marked {count} places": { + "other": "已标记 {count} 个地点" + }, + "Nothing marked": "没有标记", + "Not found: {places}": "未找到:{places}", + "Tracing outlines": "正在描画边界", + "Frame {target}": "取景{target}", + "Mark the map": "在地图上标注", + "Fly to {place}": "飞往{place}", + "Nearest aircraft to {place}": "距离{place}最近的飞机", + "Zoom in": "放大", + "Read the view": "读取视野", + "Check view state": "检查视野状态", + "Action": "操作", + "Finding places": "正在查找地点", + "Tracing outline": "正在描画边界", + "Looking up place": "正在查询地点", + "Flying": "飞行中", + "Turning on layer": "正在开启图层", + "Loading aircraft": "正在加载飞机", + "Picking nearest": "正在选取最近目标", + "Working": "处理中", + "in progress": "进行中", + "done": "完成", + "failed": "失败", + "cancelled": "已取消", + "Outline traced": "边界描画完成", + "Outline unavailable": "边界不可用", + "Source: {label}": "来源:{label}", + "WORKING": "处理中", + "DONE": "完成", + "HERE": "此处", "Aircraft cockpit view": "飞机座舱视图", "LEVEL": "等级", "Estimated destination direction": "预估目的地方向", @@ -731,9 +1508,13 @@ "WIND": "风", "SKY": "天空", "PRECIP": "降水", + "Weather data by Open-Meteo.com": "天气数据由 Open-Meteo.com 提供", + "Cockpit briefing pages": "驾驶舱简报页面", + "SIG": "信号", "Show Live Signals": "显示实时信号", "NEWS": "新闻", "Show Regional News": "显示地区新闻", + "LOCAL": "本地", "Show Local Info": "显示本地信息", "Cockpit display and Radio controls": "座舱显示与电台控件", "DISPLAY": "显示", @@ -745,6 +1526,8 @@ "Next filtered radio station": "下一个已筛选电台", "VOLUME": "音量", "Cockpit Radio volume": "座舱电台音量", + "ESC EXIT": "ESC 退出", + "C TOGGLE": "C 切换", "View switcher": "视图切换", "Exit cockpit and return to full globe view": "退出座舱并返回完整地球视图", "RESET": "重置", @@ -772,6 +1555,9 @@ "Search location by name or coordinates": "按名称或坐标搜索位置", "Search any location...": "搜索任意位置…", "WEATHER": "天气", + "Active weather products": "活跃天气产品", + "RECENT IMAGERY": "近期影像", + "Imagery days in the box": "影像盒内的天数", "CONTEXT": "上下文", "Compact Radio controls": "精简电台控件", "Open detailed Radio controls": "打开详细电台控件", @@ -801,6 +1587,7 @@ "All": "全部", "Enable Radio, then choose a globe marker or use next.": "请先启用电台,然后选择地球上的标记或使用“下一个”。", "DRAG TO TUNE": "拖动调谐", + "Tune available internet radio stations": "调谐可用的网络电台", "ALL · DRAG THE NEEDLE": "全部 · 拖动指针", "SNAPS TO AVAILABLE STATIONS": "自动吸附到可用电台", "Radio playback": "电台播放", @@ -811,13 +1598,48 @@ "Stop radio playback": "停止电台播放", "Radio volume": "电台音量", "STATION SITE": "电台网站", + "DIRECTORY: RADIO BROWSER": "目录:RADIO BROWSER", "Audio connects directly to the broadcaster after you press play. Your IP is visible to that broadcaster.": "点击播放后,音频将直接连接到广播方。广播方可以看到你的 IP。", + "Local RTL-SDR receiver": "本地 RTL-SDR 接收机", + "LOCAL RTL-SDR": "本地 RTL-SDR", + "Chrome/Edge · WebUSB · one local tuner shared by FM and the Local ADS-B layer.": "Chrome/Edge · WebUSB · 一个本地调谐器由 FM 与本地 ADS-B 图层共享。", + "Use your location for faster ADS-B position decoding": "使用你的位置以更快解码 ADS-B 位置", + "CHANGE DEVICE": "更换设备", + "Choose a different RTL-SDR or receiver channel": "选择其他 RTL-SDR 或接收通道", + "RTL-SDR receiver mode": "RTL-SDR 接收模式", + "GAIN": "增益", + "RTL-SDR tuner gain for the current mode": "当前模式下的 RTL-SDR 调谐器增益", + "AUTO": "自动", + "MSG/S": "消息/秒", + "HEARD": "已收到", + "POSITIONED": "已定位", + "FM MHZ": "FM MHz", + "TUNE": "调谐", + "Seek broadcast FM stations": "搜索广播 FM 电台", + "◀ SEEK": "◀ 搜台", + "SEEK ▶": "搜台 ▶", + "SDR VOL": "SDR 音量", + "Local SDR volume": "本地 SDR 音量", "Intelligence HUD (H)": "情报 HUD(H)", "Layout": "布局", "HUD layout": "HUD 布局", "Tactical": "战术", "Operator": "操作员", "Minimal": "精简", + "Cyber": "赛博", + "Sonar": "声呐", + "Cyber sonar contact scanner": "赛博声呐接触扫描器", + "Rings": "圈数", + "Sonar ring count": "声呐圈数", + "Range": "范围", + "Sonar ring range": "声呐圈范围", + "Power": "强度", + "Sonar intensity": "声呐强度", + "Opacity": "不透明度", + "Cyber contact and label opacity": "赛博接触与标注不透明度", + "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "声呐扫描期间地图点、图标、模型、括标与标注的最低不透明度", + "Sector": "扇区", + "Sonar sector width": "声呐扇区宽度", "Detection Overlay (D)": "探测叠加层(D)", "Detection overlay": "探测叠加层", "Detection label density": "探测标签密度", @@ -841,7 +1663,22 @@ "Feather": "羽化", "Scope edge feather": "视域边缘羽化", "Scope edge feather as a percentage of the keyhole radius": "视域边缘羽化,以锁孔半径的百分比表示", + "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "在世界上绘制 — 单击顶点,双击或按 Enter 完成,按 Esc 取消", + "Shape": "形状", + "Shape to draw": "要绘制的形状", + "Area": "面", + "Line": "线", + "Pin": "标记", + "Label (optional)": "标签(可选)", + "Label for the drawn shape": "绘制形状的标签", + "Colour of the drawn shape": "绘制形状的颜色", + "Primary": "主色", + "Amber": "琥珀", + "Cyan": "青色", + "Green": "绿色", + "Red": "红色", "Clear": "晴", + "Remove every mark from the board": "清除图板上的所有标记", "Import": "导入", "Celestial": "天球", "Hide UI chrome": "隐藏界面控件", @@ -870,7 +1707,28 @@ "SAVE CAL": "保存校准", "RESET CAL": "重置校准", "SCENE SUMMARY": "场景摘要", + "STREET LEVEL": "街景", + "Expand the street-level view (Esc shrinks it)": "放大街景视图(Esc 缩小)", + "Image fit": "图像适配", + "FIT": "适应", + "Fit: show the whole photo, with dark bars where its shape differs from the frame": "适应:显示整张照片,比例与画框不同处留黑边", + "FILL": "填充", + "Fill: fill the frame edge to edge, cropping the photo": "填充:图像铺满画框并裁剪照片", + "Camera follows view": "相机跟随视野", + "FOLLOW": "跟随", + "Close the image and deselect it on the map": "关闭图像并取消其在地图上的选中", + "Close the street-level image": "关闭街景图像", + "Street-level viewer": "街景查看器", + "Open this image on the provider's site": "在提供商网站上打开此图像", + "Imagery providers": "影像提供商", + "PROVIDERS": "提供商", + "Imagery filters": "影像筛选", + "IMAGERY": "影像", + "Panorama filter": "全景筛选", "ALL": "全部", + "FLAT": "平面", + "SINCE": "时间范围", + "Coverage colours": "覆盖图例", "SCENES": "场景", "Scene recipe": "场景方案", "NEW": "新建", @@ -893,6 +1751,9 @@ "Globe actions": "地球操作", "Turn off all selected data layers": "关闭所有已选数据图层", "Copy share link": "复制分享链接", + "Toggle straight-down and tilted map views": "在垂直俯视与倾斜视角之间切换", + "Reset map to north up": "将地图重置为朝北", + "Reset map bearing to north": "重置地图方位为正北", "Reset camera and return to full globe view": "重置相机并返回完整地球视图", "MISSION CONTROL · FIRST LAUNCH": "任务控制 · 首次启动", "Choose your first view": "选择你的首个视图", From c4cc499d581650a5d3a95c7f08cb9b54db575e49 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Wed, 21 Oct 2026 12:52:34 +0400 Subject: [PATCH 19/45] i18n(zh-CN): complete and ship Simplified Chinese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate the remaining 910 strings and review the whole catalog (meaning, terms, punctuation, label length) against the screens. - Register zh-CN: any zh tag maps to it except Traditional ones (Hant, TW, HK, MO), which keep English until a Traditional catalog ships. - Hemisphere letters get their own context so the HUD sector line reads 21.33N, not a compass word; the Bhote Koshi imagery dates follow year-first languages (2021年10月16日). - cjk.css: tight tracking for Chinese text and a 9px floor on the dock voice labels and layer buttons; Latin HUD readouts keep their look. - docs/translations/zh-CN.md: style, plurals and glossary. Co-Authored-By: Claude Opus 5.5 --- docs/CURRENT-STATE.md | 6 +- docs/TRANSLATORS.md | 4 +- docs/translations/zh-CN.md | 59 ++ scripts/package-boundaries.json | 89 ++- src/data/bhoteKoshiEvent.js | 10 +- src/hudLocalityFormat.js | 13 +- src/i18n/i18n.test.mjs | 6 + src/i18n/index.js | 3 +- src/i18n/locale.js | 13 +- src/i18n/locales/es.json | 8 +- src/i18n/locales/ru.json | 8 +- src/i18n/locales/zh-CN.json | 1306 +++++++++++++++++++++++++++---- src/i18n/same-as-english.json | 58 ++ src/ui/localePicker.test.mjs | 8 +- src/ui/styles/cjk.css | 29 + style.css | 1 + 16 files changed, 1422 insertions(+), 199 deletions(-) create mode 100644 docs/translations/zh-CN.md create mode 100644 src/ui/styles/cjk.css diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 045d6e26b..68dcb858b 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -3369,7 +3369,7 @@ test:track` 43 tracking invariants · headless QA harnesses under ### Interface localization (October 2026) -Shipped locales: **en** (source and fallback), **es** and **ru**. The code lives in +Shipped locales: **en** (source and fallback), **es**, **ru** and **zh-CN**. The code lives in `src/i18n/`. How to mark UI text: [`docs/I18N.md`](./I18N.md); translator workflow: [`docs/TRANSLATORS.md`](./TRANSLATORS.md). @@ -3380,7 +3380,9 @@ Shipped locales: **en** (source and fallback), **es** and **ru**. The code lives value). English has no catalog; every other locale is `src/i18n/locales/.json`, and a missing entry falls back to English. - **Locale choice.** `?lang=` → stored choice (`gev:locale:v1`) → - `navigator.languages` → English. `?lang=` is not stored, and share links drop + `navigator.languages` → English. Any `zh` tag maps to `zh-CN` except + Traditional ones (`Hant`, `TW`, `HK`, `MO`), which fall through until a + Traditional catalog ships. `?lang=` is not stored, and share links drop it, so a recipient keeps their own language. The globe picker in the bottom-right corner (`src/ui/localePicker.js`) stores the choice, drops `?lang=` (keeps it only when storage is blocked) and reloads. It asks first diff --git a/docs/TRANSLATORS.md b/docs/TRANSLATORS.md index 2131ab7a3..538f8c50e 100644 --- a/docs/TRANSLATORS.md +++ b/docs/TRANSLATORS.md @@ -1,6 +1,6 @@ # Translating God's Eye View -Shipped languages: **English** (source and fallback), **Spanish** (`es`) and **Russian** (`ru`). +Shipped languages: **English** (source and fallback), **Spanish** (`es`), **Russian** (`ru`) and **Simplified Chinese** (`zh-CN`). ## How it works @@ -63,4 +63,4 @@ These are contracts, not copy: layer ids and registry keys, status enums and oth ## Language notes -Each language keeps its glossary, plural forms, units and style in its own file, `docs/translations/.md`: [Spanish](./translations/es.md), [Russian](./translations/ru.md). Read it before translating, and add a term there when you settle on one. +Each language keeps its glossary, plural forms, units and style in its own file, `docs/translations/.md`: [Spanish](./translations/es.md), [Russian](./translations/ru.md), [Simplified Chinese](./translations/zh-CN.md). Read it before translating, and add a term there when you settle on one. diff --git a/docs/translations/zh-CN.md b/docs/translations/zh-CN.md new file mode 100644 index 000000000..9b779e0b7 --- /dev/null +++ b/docs/translations/zh-CN.md @@ -0,0 +1,59 @@ +# Simplified Chinese (`zh-CN`) + +Catalog: `src/i18n/locales/zh-CN.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md). + +The catalog started from the Chinese locale by abiyeenzo (#914) and the +Simplified Chinese localization by EDIT-Aeterna (#979); the rest was translated +for the current English and reviewed against both. + +## Style + +- Mainland usage and Simplified characters. Address the user neutrally, without 您/你 where a plain imperative works: 「点击地图」, 「重试」. +- Chinese has no case: an UPPERCASE English HUD label becomes the same short Chinese label. Keep labels as short as the English: 「实时」, 「过期」, 「关」. +- Full-width punctuation in Chinese text: ,。:;?!()“”. A dash is 「——」 without spaces; keep `·` as the HUD separator and `…` for ellipsis. +- One space between Chinese and Latin letters or digits: 「AIS 船舶」, 「24 小时」, 「{count} 个」. No space next to full-width punctuation. +- Units: km, m, km/h, m/s, kn, ft, MW, °, % stay as written; time words are 小时, 分钟, 秒 after a number (「5 分钟前」). +- Product names, provider names and codes stay as they are: Google, Cesium, CelesTrak, NOAA, FIRMS, AIS, ADS-B, GNSS, CCTV, HUD, CRT, NVG, FLIR, WHOT/BHOT, Ironbow, CONUS. + +## Plurals + +`Intl.PluralRules('zh-CN')` has one category, `other`: a `tn()` entry has only that form. Use a measure word next to the number where Chinese needs one: 「{count} 个密钥」, 「{count} 架飞机」, 「{count} 艘船」. + +## Glossary + +| English | 中文 | +| ------------------------------------- | --------------------------- | +| layer / data layer | 图层 / 数据图层 | +| feed | 数据源 | +| source / data source | 来源 / 数据源 | +| LIVE (status) / live data | 实时 / 实时数据 | +| SIMULATED | 模拟 | +| stale / degraded / unavailable | 过期 / 降级 / 不可用 | +| retry | 重试 | +| key (API key) / POWER UP | 密钥(API 密钥)/ 增强 | +| Provider Settings | 服务商设置 | +| globe / map / map source / basemap | 地球 / 地图 / 地图源 / 底图 | +| aircraft / flight / military flights | 飞机 / 航班 / 军用航班 | +| vessel, ship | 船舶 | +| satellite | 卫星 | +| launch (rocket) / space mission | 发射 / 太空任务 | +| contact (tracked object) | 目标 | +| installation, site | 设施 | +| camera / CCTV camera | 摄像头 / CCTV 摄像头 | +| earthquake / active fire | 地震 / 活跃火点 | +| scene / shot | 场景 / 镜头 | +| briefing / panel / dock | 简报 / 面板 / 停靠栏 | +| preset / visual preset | 预设 / 视觉预设 | +| Display / HUD layout | 显示 / HUD 布局 | +| Tactical / Operator / Minimal / Cyber | 战术 / 操作员 / 精简 / 赛博 | +| Scope (circular viewport mask) | 视域 | +| Clean UI | 纯净界面 | +| cockpit | 座舱 | +| heading / altitude / ground speed | 航向 / 高度 / 地速 | +| Street Level / Street View (Google) | 街景 / 街景(Google) | +| Recent Imagery | 近期影像 | +| Global Context / Context (panel) | 全局态势 / 态势 | +| radio (station) | 电台 | +| transit / bikeshare | 公共交通 / 共享单车 | +| Previous / Next | 上一个 / 下一个 | +| compass points (N, NNE, …) | 北, 北东北, … | diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 264f58440..bbbc39574 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -426,7 +426,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": [] }, @@ -451,7 +452,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -467,7 +469,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": [] }, @@ -495,6 +498,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js", "src/ui/keyGuidance.js", "src/ui/statusText.js" @@ -513,7 +517,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": [] }, @@ -528,7 +533,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": [] }, @@ -546,6 +552,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js" ], "external": [] @@ -570,6 +577,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/layerNames.js" ], "external": [] @@ -603,6 +611,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js" ], "external": ["cesium"] @@ -617,6 +626,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js" ], "external": [] @@ -765,6 +775,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js", "src/ui/keyGuidance.js", "src/ui/layerNames.js", @@ -882,6 +893,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js" ], "external": ["cesium"] @@ -947,6 +959,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js" ], "external": ["cesium"] @@ -992,7 +1005,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -1052,7 +1066,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -1081,6 +1096,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js", "src/layers/recentImagery/display.js" ], @@ -1109,7 +1125,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -1140,6 +1157,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js" ], "external": ["cesium", "satellite.js"] @@ -1171,7 +1189,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -1213,6 +1232,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/layers/installations/classLabel.js" ], "external": ["cesium", "@mapbox/vector-tile", "pbf"] @@ -1247,6 +1267,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js" ], "external": ["cesium"] @@ -1295,7 +1316,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium", "pbf", "@mapbox/vector-tile"] }, @@ -1323,7 +1345,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -1370,7 +1393,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["hls.js", "cesium"] }, @@ -1435,7 +1459,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium", "pbf", "@mapbox/vector-tile", "mapillary-js"] }, @@ -1462,7 +1487,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium", "@mapbox/vector-tile", "pbf"] }, @@ -1501,7 +1527,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -1522,7 +1549,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -1577,7 +1605,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -1633,6 +1662,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/statusText.js" ], "external": [] @@ -2486,6 +2516,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js", "src/layers/recentImagery/display.js", "src/ui/keyGuidance.js", @@ -3059,6 +3090,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js", "src/layers/recentImagery/display.js", "src/layers/installations/classLabel.js", @@ -3164,6 +3196,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/i18n/index.js" ], "external": ["cesium"] @@ -3184,7 +3217,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": [] }, @@ -3216,7 +3250,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -3240,7 +3275,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": [] }, @@ -3331,6 +3367,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/unitLabels.js" ], "external": ["cesium"] @@ -3385,6 +3422,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/statusText.js" ], "external": [] @@ -3636,7 +3674,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium", "egm96-universal", "pbf"] }, @@ -3678,7 +3717,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium", "pbf"] }, @@ -3730,7 +3770,8 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", - "src/i18n/locales/ru.json" + "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json" ], "external": ["cesium"] }, @@ -3746,6 +3787,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/statusText.js", "src/ui/layerNames.js" ], @@ -3938,6 +3980,7 @@ "src/i18n/locale.js", "src/i18n/locales/es.json", "src/i18n/locales/ru.json", + "src/i18n/locales/zh-CN.json", "src/ui/statusText.js", "src/ui/layerNames.js" ], diff --git a/src/data/bhoteKoshiEvent.js b/src/data/bhoteKoshiEvent.js index 2baaf7031..434aff6d0 100644 --- a/src/data/bhoteKoshiEvent.js +++ b/src/data/bhoteKoshiEvent.js @@ -412,14 +412,18 @@ const IMAGERY_LABEL_NAMES = Object.freeze([ [/^(\d{4}) POST-EVENT$/, msg('{year} POST-EVENT')], ]); -/** Day, short month and year in the active language: 16 OCT 2021, 16 ОКТ. 2021. */ +/** Day, short month and year in the active language: 16 OCT 2021, 16 ОКТ. 2021, 2021年10月16日. */ function imageryDateText(observedAt) { const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(String(observedAt || '')); if (!match) return ''; const date = new Date(Date.UTC(+match[1], +match[2] - 1, +match[3])); if (Number.isNaN(date.getTime())) return ''; const part = (options) => formatDate(date, { timeZone: 'UTC', ...options }); - return `${part({ day: 'numeric' })} ${part({ month: 'short' })} ${part({ year: 'numeric' })}`.toUpperCase(); + const year = part({ year: 'numeric' }); + // Year-first languages (2021年10月16日) keep their own order and units. + const whole = part({ day: 'numeric', month: 'short', year: 'numeric' }); + if (whole.startsWith(year)) return whole; + return `${part({ day: 'numeric' })} ${part({ month: 'short' })} ${year}`.toUpperCase(); } /** @@ -1029,7 +1033,7 @@ function createPanel(event, handlers) { ${escapeMarkup(t('GEOLOCATIONS · {credit}', { credit: 'GEO GEORGE SHADRACH' }))} -

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