this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

ts v2

alice b0d48760 3026b6dc

+428 -379
+55 -240
scripts/generateAirportTzList.ts
··· 10 10 // Remove node-fetch import, use global fetch 11 11 import { parse } from 'csv-parse'; // Import csv-parse 12 12 import { findDstTransitions, DstTransitions } from './tzCommon'; 13 - 14 - // --- MEMOIZATION CACHES --- 15 - const findTzCache = new Map<string, string[]>(); 16 - const findDstTransitionsCache = new Map<string, DstTransitions | null>(); 17 - 18 - // Helper for memoizing findTz (geo-tz) 19 - function memoizedFindTz(latitude: number, longitude: number): string[] { 20 - const key = `${latitude}_${longitude}`; 21 - if (findTzCache.has(key)) { 22 - // console.log(`Cache hit for findTz: ${key}`); 23 - return findTzCache.get(key)!; 24 - } 25 - // console.log(`Cache miss for findTz: ${key}`); 26 - try { 27 - const result = findTz(latitude, longitude); 28 - findTzCache.set(key, result); 29 - return result; 30 - } catch (e) { 31 - // Cache errors/empty results too 32 - // console.warn(`geo-tz error for ${latitude},${longitude}: ${e}`); 33 - findTzCache.set(key, []); // Cache empty array on error 34 - return []; 35 - } 36 - } 37 - 38 - // Helper for memoizing findDstTransitions 39 - function memoizedFindDstTransitions(tz: string, year: number): DstTransitions | null { 40 - if (!tz) return null; // Handle null/empty tz string input 41 - const key = `${tz}_${year}`; 42 - if (findDstTransitionsCache.has(key)) { 43 - // console.log(`Cache hit for findDstTransitions: ${key}`); 44 - return findDstTransitionsCache.get(key)!; 45 - } 46 - // console.log(`Cache miss for findDstTransitions: ${key}`); 47 - try { 48 - const result = findDstTransitions(tz, year); 49 - findDstTransitionsCache.set(key, result); 50 - return result; 51 - } catch (e) { 52 - // Cache null on error 53 - // console.warn(`findDstTransitions error for ${tz}, ${year}: ${e}`); 54 - findDstTransitionsCache.set(key, null); 55 - return null; 56 - } 57 - } 13 + import { 14 + findTzCache, 15 + memoizedFindTz, 16 + findDstTransitionsCache, 17 + memoizedFindDstTransitions, 18 + parseTopHtml, 19 + downloadRoutesCsv, 20 + rankAirportsByRoutes, 21 + downloadOurAirportsCsv, 22 + getBucketKey, 23 + AirportInfo, 24 + OurAirportInfo, 25 + TzBucketData, 26 + RouteRecord, 27 + } from './generateAirportTzListHelpers'; 58 28 59 - // Define interfaces for data structures 29 + // Local-only type used before helper split 60 30 interface AirportDataEntry { 61 - iata?: string; 62 - name?: string; 63 - city?: string; 64 - country?: string; 65 - latitude?: number | string; // Types might be inconsistent 66 - longitude?: number | string; 67 - tz?: string; 68 - type?: string; 69 - source?: string; 70 - } 71 - 72 - interface OurAirportInfo { 73 - iata: string; 74 - type: string; 75 - scheduled_service: string; 31 + iata?: string; 32 + name?: string; 33 + city?: string; 34 + country?: string; 35 + latitude?: number | string; 36 + longitude?: number | string; 37 + tz?: string; 38 + type?: string; 39 + source?: string; 76 40 } 77 41 78 - interface AirportInfo { 79 - iata: string; 80 - name: string; 81 - city: string; 82 - country: string; 83 - latitude: number; 84 - longitude: number; 85 - tz: string; 86 - correctedTz: string; 87 - type?: string; 88 - source?: string; 89 - scheduled_service?: string; 90 - route_hits: number; 91 - } 92 - 42 + // Define interfaces for data structures 93 43 interface TzBucketKey { 94 44 stdOffsetSeconds: number; 95 45 dstOffsetSeconds: number; ··· 97 47 dstEndTimestamp: number; 98 48 } 99 49 100 - interface TzBucketData { 101 - std: number; 102 - dst: number; 103 - start: number; 104 - end: number; 105 - tzNames: Set<string>; 106 - codes: string[]; 107 - offset?: number; 108 - count?: number; 109 - } 110 - 111 50 // Helper function to create bucket keys 112 - function getBucketKey(details: DstTransitions): string { 113 - return `${details[0]}_${details[1]}_${details[2]}_${details[3]}`; 114 - } 51 + // function getBucketKey(details: DstTransitions): string { 52 + // return `${details[0]}_${details[1]}_${details[2]}_${details[3]}`; 53 + // } 115 54 116 55 // Placeholder functions matching Python script structure 117 56 118 - async function parseTopHtml(htmlPath: string): Promise<Array<[string, string]>> { 119 - console.log(`Parsing HTML file: ${htmlPath}`); 120 - const htmlContent = await fs.readFile(htmlPath, 'utf-8'); 121 - const $ = cheerio.load(htmlContent); 122 - const results: Array<[string, string]> = []; 123 - $('tr').each((_, tr) => { 124 - const tds = $(tr).find('td'); 125 - if (tds.length < 3) return; 126 - const iata = $(tds[2]).text().trim().toUpperCase(); 127 - if (!iata || iata.length !== 3) return; // Basic validation 128 - // Improve name extraction - handle potential h2 tags etc. 129 - let name = $(tds[1]).find('h2').first().text().trim(); 130 - if (!name) { 131 - name = $(tds[1]).text().trim(); 132 - } 133 - // Clean up common suffixes (like in Python) 134 - if (name.endsWith(' International Airport')) { 135 - name = name.substring(0, name.length - ' International Airport'.length); 136 - } else if (name.endsWith(' Airport')) { 137 - name = name.substring(0, name.length - ' Airport'.length); 138 - } 139 - results.push([iata, name.trim()]); 140 - }); 141 - console.log(`Found ${results.length} airports in HTML.`); 142 - return results; 143 - } 144 - 145 - // Define type for a route record 146 - type RouteRecord = [string, string]; // [source_iata, destination_iata] 147 - 148 - async function downloadRoutesCsv(): Promise<RouteRecord[]> { 149 - console.log('Downloading and parsing routes data...'); 150 - const url = "https://raw.githubusercontent.com/jpatokal/openflights/master/data/routes.dat"; 151 - try { 152 - const response = await fetch(url); 153 - if (!response.ok) { 154 - throw new Error(`Failed to fetch ${url}: ${response.statusText}`); 155 - } 156 - const text = await response.text(); 157 - console.log('Routes data downloaded, parsing...'); 158 - 159 - const records: RouteRecord[] = []; 160 - const parser = parse({ 161 - delimiter: ',', 162 - columns: false, // Data has no header row 163 - skip_empty_lines: true, 164 - trim: true, 165 - }); 166 - 167 - parser.on('readable', function(){ 168 - let record; 169 - while ((record = parser.read()) !== null) { 170 - // Indices based on routes.dat format: 2=Source IATA, 4=Dest IATA 171 - const srcIata = record[2]; 172 - const dstIata = record[4]; 173 - // Basic validation for 3-letter IATA codes 174 - if (srcIata && srcIata.length === 3 && /^[A-Z]+$/.test(srcIata) && 175 - dstIata && dstIata.length === 3 && /^[A-Z]+$/.test(dstIata)) { 176 - records.push([srcIata, dstIata]); 177 - } 178 - } 179 - }); 180 - 181 - parser.on('error', function(err){ 182 - console.error('CSV Parsing Error:', err.message); 183 - }); 184 - 185 - return new Promise((resolve, reject) => { 186 - parser.on('end', function(){ 187 - console.log(`Finished parsing routes. Found ${records.length} valid routes.`); 188 - resolve(records); 189 - }); 190 - parser.write(text); 191 - parser.end(); 192 - }); 193 - 194 - } catch (error) { 195 - console.error('Error downloading or parsing routes data:', error); 196 - throw error; // Re-throw error to be handled by caller 197 - } 198 - } 199 - 200 - async function rankAirportsByRoutes(routes: RouteRecord[]): Promise<Map<string, number>> { 201 - console.log('Ranking airports by routes...'); 202 - const counts = new Map<string, number>(); 203 - 204 - for (const [srcIata, dstIata] of routes) { 205 - counts.set(srcIata, (counts.get(srcIata) || 0) + 1); 206 - counts.set(dstIata, (counts.get(dstIata) || 0) + 1); 207 - } 208 - 209 - console.log(`Airport ranking complete. Found ${counts.size} unique airports in routes.`); 210 - return counts; // Return map of IATA -> count 211 - } 212 - 213 - async function downloadOurAirportsCsv(): Promise<Map<string, OurAirportInfo>> { 214 - console.log('Downloading and parsing OurAirports data...'); 215 - const url = "https://davidmegginson.github.io/ourairports-data/airports.csv"; 216 - const ourAirportsMap = new Map<string, OurAirportInfo>(); 217 - try { 218 - const response = await fetch(url); 219 - if (!response.ok) { 220 - throw new Error(`Failed to fetch ${url}: ${response.statusText}`); 221 - } 222 - const text = await response.text(); 223 - console.log('OurAirports data downloaded, parsing...'); 224 - 225 - const parser = parse({ 226 - delimiter: ',', 227 - columns: true, // Use header row 228 - skip_empty_lines: true, 229 - trim: true, 230 - }); 231 - 232 - parser.on('readable', function() { 233 - let record; 234 - while ((record = parser.read()) !== null) { 235 - // Extract relevant columns: iata_code, type, scheduled_service 236 - const iata = record.iata_code; 237 - const type = record.type; 238 - const scheduled = record.scheduled_service; 239 - if (iata && iata.length === 3 && /^[A-Z0-9]+$/.test(iata)) { 240 - ourAirportsMap.set(iata.toUpperCase(), { 241 - iata: iata.toUpperCase(), 242 - type: type || '', // Handle potential missing values 243 - scheduled_service: scheduled || '' 244 - }); 245 - } 246 - } 247 - }); 248 - 249 - parser.on('error', function(err) { 250 - console.error('OurAirports CSV Parsing Error:', err.message); 251 - }); 252 - 253 - return new Promise((resolve, reject) => { 254 - parser.on('end', function() { 255 - console.log(`Finished parsing OurAirports. Found ${ourAirportsMap.size} airports with IATA.`); 256 - resolve(ourAirportsMap); 257 - }); 258 - parser.write(text); 259 - parser.end(); 260 - }); 261 - 262 - } catch (error) { 263 - console.error('Error downloading or parsing OurAirports data:', error); 264 - console.warn('Proceeding without OurAirports classification data.'); 265 - return ourAirportsMap; // Return empty map on error 266 - } 267 - } 57 + // async function parseTopHtml(htmlPath: string): Promise<Array<[string, string]>> { 58 + // console.log(`Parsing HTML file: ${htmlPath}`); 59 + // const htmlContent = await fs.readFile(htmlPath, 'utf-8'); 60 + // const $ = cheerio.load(htmlContent); 61 + // const results: Array<[string, string]> = []; 62 + // $('tr').each((_, tr) => { 63 + // const tds = $(tr).find('td'); 64 + // if (tds.length < 3) return; 65 + // const iata = $(tds[2]).text().trim().toUpperCase(); 66 + // if (!iata || iata.length !== 3) return; // Basic validation 67 + // // Improve name extraction - handle potential h2 tags etc. 68 + // let name = $(tds[1]).find('h2').first().text().trim(); 69 + // if (!name) { 70 + // name = $(tds[1]).text().trim(); 71 + // } 72 + // // Clean up common suffixes (like in Python) 73 + // if (name.endsWith(' International Airport')) { 74 + // name = name.substring(0, name.length - ' International Airport'.length); 75 + // } else if (name.endsWith(' Airport')) { 76 + // name = name.substring(0, name.length - ' Airport'.length); 77 + // } 78 + // results.push([iata, name.trim()]); 79 + // }); 80 + // console.log(`Found ${results.length} airports in HTML.`); 81 + // return results; 82 + // } 268 83 269 84 async function generateCCode( 270 85 airportsList: Array<[string, string]>,
+216
scripts/generateAirportTzListHelpers.ts
··· 1 + import * as fs from 'fs/promises'; 2 + import * as cheerio from 'cheerio'; 3 + import { find as findTz } from 'geo-tz'; 4 + import { parse } from 'csv-parse'; 5 + import { findDstTransitions, DstTransitions } from './tzCommon'; 6 + 7 + // --------------------------------------------------------------------------- 8 + // Memoization Caches 9 + // --------------------------------------------------------------------------- 10 + export const findTzCache = new Map<string, string[]>(); 11 + export const findDstTransitionsCache = new Map<string, DstTransitions | null>(); 12 + 13 + // --------------------------------------------------------------------------- 14 + // Helper Functions 15 + // --------------------------------------------------------------------------- 16 + /** Memoize geo-tz lookups */ 17 + export function memoizedFindTz(latitude: number, longitude: number): string[] { 18 + const key = `${latitude}_${longitude}`; 19 + if (findTzCache.has(key)) return findTzCache.get(key)!; 20 + try { 21 + const result = findTz(latitude, longitude); 22 + findTzCache.set(key, result); 23 + return result; 24 + } catch { 25 + findTzCache.set(key, []); 26 + return []; 27 + } 28 + } 29 + 30 + /** Memoize DST transition lookups */ 31 + export function memoizedFindDstTransitions(tz: string, year: number): DstTransitions | null { 32 + if (!tz) return null; 33 + const key = `${tz}_${year}`; 34 + if (findDstTransitionsCache.has(key)) return findDstTransitionsCache.get(key)!; 35 + try { 36 + const result = findDstTransitions(tz, year); 37 + findDstTransitionsCache.set(key, result); 38 + return result; 39 + } catch { 40 + findDstTransitionsCache.set(key, null); 41 + return null; 42 + } 43 + } 44 + 45 + // --------------------------------------------------------------------------- 46 + // Type Definitions 47 + // --------------------------------------------------------------------------- 48 + /** Relevant classification data from OurAirports */ 49 + export interface OurAirportInfo { 50 + iata: string; 51 + type: string; 52 + scheduled_service: string; 53 + } 54 + 55 + /** Internal airport record with metadata */ 56 + export interface AirportInfo { 57 + iata: string; 58 + name: string; 59 + city: string; 60 + country: string; 61 + latitude: number; 62 + longitude: number; 63 + tz: string; 64 + correctedTz: string; 65 + type?: string; 66 + source?: string; 67 + scheduled_service?: string; 68 + route_hits: number; 69 + } 70 + 71 + /** Single route record [src, dst] */ 72 + export type RouteRecord = [string, string]; 73 + 74 + /** Data for one timezone bucket */ 75 + export interface TzBucketData { 76 + std: number; 77 + dst: number; 78 + start: number; 79 + end: number; 80 + tzNames: Set<string>; 81 + codes: string[]; 82 + offset?: number; 83 + count?: number; 84 + } 85 + 86 + // --------------------------------------------------------------------------- 87 + // Helper: Bucket Key 88 + // --------------------------------------------------------------------------- 89 + /** Construct a unique key from DST transition details */ 90 + export function getBucketKey(details: DstTransitions): string { 91 + return `${details[0]}_${details[1]}_${details[2]}_${details[3]}`; 92 + } 93 + 94 + // --------------------------------------------------------------------------- 95 + // HTML Parsing 96 + // --------------------------------------------------------------------------- 97 + /** Parse the top1000 HTML table for (IATA, Name) pairs */ 98 + export async function parseTopHtml(htmlPath: string): Promise<Array<[string, string]>> { 99 + console.log(`Parsing HTML file: ${htmlPath}`); 100 + const htmlContent = await fs.readFile(htmlPath, 'utf-8'); 101 + const $ = cheerio.load(htmlContent); 102 + const results: Array<[string, string]> = []; 103 + $('tr').each((_, tr) => { 104 + const tds = $(tr).find('td'); 105 + if (tds.length < 3) return; 106 + const iata = $(tds[2]).text().trim().toUpperCase(); 107 + if (!iata || iata.length !== 3) return; 108 + let name = $(tds[1]).find('h2').first().text().trim(); 109 + if (!name) { 110 + name = $(tds[1]).text().trim(); 111 + } 112 + if (name.endsWith(' International Airport')) { 113 + name = name.slice(0, -' International Airport'.length); 114 + } else if (name.endsWith(' Airport')) { 115 + name = name.slice(0, -' Airport'.length); 116 + } 117 + results.push([iata, name.trim()]); 118 + }); 119 + console.log(`Found ${results.length} airports in HTML.`); 120 + return results; 121 + } 122 + 123 + // --------------------------------------------------------------------------- 124 + // Routes Data 125 + // --------------------------------------------------------------------------- 126 + /** Download and parse OpenFlights routes.dat */ 127 + export async function downloadRoutesCsv(): Promise<RouteRecord[]> { 128 + console.log('Downloading and parsing routes data...'); 129 + const url = 'https://raw.githubusercontent.com/jpatokal/openflights/master/data/routes.dat'; 130 + try { 131 + const response = await fetch(url); 132 + if (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.statusText}`); 133 + const text = await response.text(); 134 + console.log('Routes data downloaded, parsing...'); 135 + const records: RouteRecord[] = []; 136 + const parser = parse({ delimiter: ',', columns: false, skip_empty_lines: true, trim: true }); 137 + parser.on('readable', () => { 138 + let record; 139 + while ((record = parser.read()) !== null) { 140 + const srcIata = record[2]; 141 + const dstIata = record[4]; 142 + if ( 143 + srcIata?.length === 3 && /^[A-Z]+$/.test(srcIata) && 144 + dstIata?.length === 3 && /^[A-Z]+$/.test(dstIata) 145 + ) { 146 + records.push([srcIata, dstIata]); 147 + } 148 + } 149 + }); 150 + parser.on('error', err => console.error('CSV Parsing Error:', err.message)); 151 + return new Promise(resolve => { 152 + parser.on('end', () => { 153 + console.log(`Finished parsing routes. Found ${records.length} valid routes.`); 154 + resolve(records); 155 + }); 156 + parser.write(text); 157 + parser.end(); 158 + }); 159 + } catch (error) { 160 + console.error('Error downloading or parsing routes data:', error); 161 + throw error; 162 + } 163 + } 164 + 165 + /** Rank airports by total route hits */ 166 + export async function rankAirportsByRoutes(routes: RouteRecord[]): Promise<Map<string, number>> { 167 + console.log('Ranking airports by routes...'); 168 + const counts = new Map<string, number>(); 169 + for (const [src, dst] of routes) { 170 + counts.set(src, (counts.get(src) || 0) + 1); 171 + counts.set(dst, (counts.get(dst) || 0) + 1); 172 + } 173 + console.log(`Airport ranking complete. Found ${counts.size} unique airports in routes.`); 174 + return counts; 175 + } 176 + 177 + // --------------------------------------------------------------------------- 178 + // OurAirports Data 179 + // --------------------------------------------------------------------------- 180 + /** Download and parse OurAirports CSV */ 181 + export async function downloadOurAirportsCsv(): Promise<Map<string, OurAirportInfo>> { 182 + console.log('Downloading and parsing OurAirports data...'); 183 + const url = 'https://davidmegginson.github.io/ourairports-data/airports.csv'; 184 + const ourAirportsMap = new Map<string, OurAirportInfo>(); 185 + try { 186 + const response = await fetch(url); 187 + if (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.statusText}`); 188 + const text = await response.text(); 189 + console.log('OurAirports data downloaded, parsing...'); 190 + const parser = parse({ delimiter: ',', columns: true, skip_empty_lines: true, trim: true }); 191 + parser.on('readable', () => { 192 + let record; 193 + while ((record = parser.read()) !== null) { 194 + const iata = record.iata_code; 195 + const type = record.type; 196 + const scheduled = record.scheduled_service; 197 + if (iata?.length === 3 && /^[A-Z0-9]+$/.test(iata)) { 198 + ourAirportsMap.set(iata.toUpperCase(), { iata: iata.toUpperCase(), type: type || '', scheduled_service: scheduled || '' }); 199 + } 200 + } 201 + }); 202 + parser.on('error', err => console.error('OurAirports CSV Parsing Error:', err.message)); 203 + return new Promise(resolve => { 204 + parser.on('end', () => { 205 + console.log(`Finished parsing OurAirports. Found ${ourAirportsMap.size} airports with IATA.`); 206 + resolve(ourAirportsMap); 207 + }); 208 + parser.write(text); 209 + parser.end(); 210 + }); 211 + } catch (error) { 212 + console.error('Error downloading or parsing OurAirports data:', error); 213 + console.warn('Proceeding without OurAirports classification data.'); 214 + return ourAirportsMap; 215 + } 216 + }
+157 -139
src/c/airport_tz_list.c
··· 1 - // Auto-generated by generate_airport_tz_list.py 1 + // Auto-generated by generateAirportTzList.ts 2 + // Generated on: 2025-04-24T18:57:23.970Z 2 3 // Year-specific DST data for 2025 3 4 4 5 #include <stdint.h> 5 6 7 + // Total airport codes: 245 6 8 static const char airport_code_pool[] = 7 - "PPG" "HNL" "KOA" "LIH" "ITO" "MKK" "JHM" "LNY" 8 - "AKB" "NHV" "GMR" "ANC" "LAX" "SFO" "LAS" "SEA" 9 - "YVR" "SAN" "PDX" "OAK" "SJC" "SMF" "PHX" "DEN" 10 - "SLC" "YYC" "YEG" "ABQ" "ELP" "MEX" "ORD" "DFW" 11 - "IAH" "MSP" "MDW" "DAL" "STL" "BNA" "AUS" "IPC" 12 - "CUN" "HAV" "ATL" "JFK" "YYZ" "CLT" "MCO" "MIA" 13 - "EWR" "BOS" "DTW" "FLL" "MUN" "CGB" "MAO" "SXM" 14 - "CGR" "PVH" "BVB" "YHZ" "SCL" "YYT" "GRU" "CGH" 15 - "BSB" "GIG" "AEP" "EZE" "CNF" "VCP" "SDU" "POA" 16 - "FEN" "FSP" "GOH" "SID" "PDL" "TER" "DKR" "LHR" 17 - "LGW" "DUB" "MAN" "LIS" "STN" "LTN" "EDI" "LPA" 18 - "BHX" "CMN" "ALG" "CDG" "AMS" "FRA" "MAD" "BCN" 19 - "MUC" "FCO" "ZRH" "CPH" "PMI" "JNB" "CPT" "TLV" 20 - "BEY" "BZY" "ATH" "HEL" "OTP" "KBP" "HER" "SOF" 21 - "CAI" "IST" "SVO" "DOH" "JED" "SAW" "DME" "AYT" 22 - "RUH" "VKO" "LED" "THR" "MHD" "IKA" "SYZ" "AWZ" 23 - "KIH" "IFN" "TBZ" "BND" "PGU" "DXB" "AUH" "SHJ" 24 - "MRU" "TBS" "KUF" "RUN" "DWC" "ASF" "BUS" "KBL" 25 - "SVX" "UFA" "TJM" "SGC" "CEK" "PEE" "NUX" "REN" 26 - "NJC" "SLY" "DEL" "BOM" "BLR" "CCU" "MAA" "HYD" 27 - "COK" "PNQ" "AMD" "GOI" "KTM" "OMS" "RGN" "MDL" 28 - "CGK" "BKK" "DMK" "SGN" "HAN" "SUB" "HKT" "KNO" 29 - "DAD" "CNX" "PEK" "HKG" "PVG" "CAN" "SIN" "KUL" 30 - "CTU" "SZX" "TPE" "KMG" "EUC" "HND" "ICN" "NRT" 31 - "CJU" "KIX" "GMP" "FUK" "CTS" "OKA" "PUS" "DRW" 32 - "ASP" "AYQ" "ADL" "PLO" "MGB" "OLP" "BNE" "OOL" 33 - "CNS" "VVO" "KHV" "TSV" "SYD" "MEL" "CBR" "HBA" 34 - "LDH" "VLI" "NLK" "NAN" "PKC" "AKL" "CHC" "WLG" 35 - "ZQN" "NSN" "DUD" "NPE" "PMR" "CHT" "APW" "CXI" 9 + "PPG" "IUE" "FTI" "HNL" "KOA" "LIH" "ITO" "MKK" 10 + "JHM" "LNY" "ADK" "NHV" "AUQ" "UAP" "GMR" "ANC" 11 + "LAX" "SFO" "LAS" "SEA" "YVR" "SAN" "PDX" "OAK" 12 + "SJC" "SMF" "PHX" "DEN" "SLC" "YYC" "YEG" "ABQ" 13 + "ELP" "MEX" "ORD" "DFW" "IAH" "MSP" "MDW" "DAL" 14 + "STL" "BNA" "AUS" "IPC" "CUN" "HAV" "ATL" "JFK" 15 + "YYZ" "CLT" "MCO" "MIA" "EWR" "BOS" "DTW" "FLL" 16 + "MUN" "CGB" "MAO" "SXM" "CGR" "PVH" "BVB" "YHZ" 17 + "SCL" "YYT" "YDF" "YAY" "YWM" "GRU" "CGH" "BSB" 18 + "GIG" "AEP" "EZE" "CNF" "VCP" "SDU" "POA" "FSP" 19 + "FEN" "GOH" "SID" "PDL" "TER" "DKR" "LHR" "LGW" 20 + "DUB" "MAN" "LIS" "STN" "LTN" "EDI" "LPA" "BHX" 21 + "CMN" "CDG" "AMS" "FRA" "MAD" "BCN" "MUC" "FCO" 22 + "ZRH" "CPH" "PMI" "JNB" "CPT" "TLV" "BEY" "KIV" 23 + "ATH" "HEL" "OTP" "KBP" "HER" "SOF" "GZA" "CAI" 24 + "IST" "SVO" "JED" "SAW" "DME" "AYT" "RUH" "VKO" 25 + "LED" "ESB" "THR" "MHD" "IKA" "SYZ" "AWZ" "KIH" 26 + "IFN" "TBZ" "BND" "PGU" "DXB" "AUH" "SHJ" "MRU" 27 + "TBS" "KUF" "RUN" "DWC" "ASF" "BUS" "KBL" "HEA" 28 + "FBD" "SVX" "UFA" "TJM" "SGC" "CEK" "PEE" "NUX" 29 + "REN" "NJC" "SLY" "DEL" "BOM" "BLR" "CCU" "MAA" 30 + "COK" "PNQ" "AMD" "GOI" "JAI" "KTM" "BWA" "BIR" 31 + "TMI" "OMS" "RGN" "MDL" "CGK" "BKK" "DMK" "SGN" 32 + "HAN" "SUB" "HKT" "KNO" "DAD" "CNX" "PEK" "HKG" 33 + "PVG" "CAN" "SIN" "KUL" "CTU" "SZX" "TPE" "KMG" 34 + "HND" "ICN" "NRT" "CJU" "KIX" "GMP" "FUK" "CTS" 35 + "OKA" "PUS" "DRW" "ASP" "AYQ" "ADL" "PLO" "MGB" 36 + "OLP" "BNE" "OOL" "CNS" "VVO" "KHV" "TSV" "SYD" 37 + "MEL" "CBR" "HBA" "LDH" "UUS" "NLK" "NAN" "PKC" 38 + "AKL" "CHC" "WLG" "ZQN" "NSN" "DUD" "NPE" "PMR" 39 + "CHT" "APW" "TBU" "EUA" "CXI" 36 40 ; 37 41 42 + // Total airport names: 245 38 43 static const char* airport_name_pool[] = { 39 44 "Pago Pago", 40 - "Daniel K Inouye", 41 - "Ellison Onizuka Kona International At Keahole", 45 + "Niue", 46 + "Fitiuta", 47 + "Honolulu", 48 + "Kona International At Keahole", 42 49 "Lihue", 43 50 "Hilo", 44 51 "Molokai", 45 52 "Kapalua", 46 53 "Lanai", 47 - "Atka", 54 + "Adak", 48 55 "Nuku Hiva", 56 + "Hiva Oa-Atuona", 57 + "Ua Pou", 49 58 "Totegegie", 50 59 "Ted Stevens Anchorage", 51 60 "Los Angeles", 52 61 "San Francisco", 53 - "Harry Reid", 54 - "Seattle-Tacoma", 62 + "McCarran", 63 + "Seattle Tacoma", 55 64 "Vancouver", 56 65 "San Diego", 57 66 "Portland", 58 - "Metro Oakland", 59 - "Norman Y Mineta San Jose", 67 + "Metropolitan Oakland", 68 + "Norman Y. Mineta San Jose", 60 69 "Sacramento", 61 70 "Phoenix Sky Harbor", 62 71 "Denver", ··· 67 76 "El Paso", 68 77 "Licenciado Benito Juarez", 69 78 "Chicago O'Hare", 70 - "Dallas-Fort Worth", 71 - "George Bush Intcntl/Houston", 79 + "Dallas Fort Worth", 80 + "George Bush Intercontinental Houston", 72 81 "Minneapolis-St Paul International/Wold-Chamberlain", 73 82 "Chicago Midway", 74 83 "Dallas Love Field", 75 - "St Louis Lambert", 84 + "Lambert St Louis", 76 85 "Nashville", 77 - "Austin-Bergstrom", 86 + "Austin Bergstrom", 78 87 "Mataveri", 79 - "Cancun", 80 - "Jose Marti", 81 - "Hartsfield - Jackson Atlanta", 88 + "Cancún", 89 + "José Martí", 90 + "Hartsfield Jackson Atlanta", 82 91 "John F Kennedy", 83 - "Toronto Pearson", 84 - "Charlotte/Douglas", 92 + "Lester B. Pearson", 93 + "Charlotte Douglas", 85 94 "Orlando", 86 95 "Miami", 87 96 "Newark Liberty", 88 97 "General Edward Lawrence Logan", 89 - "Detroit Metro Wayne County", 90 - "Fort Lauderdale/Hollywood", 91 - "Maturin", 98 + "Detroit Metropolitan Wayne County", 99 + "Fort Lauderdale Hollywood", 100 + "Maturín", 92 101 "Marechal Rondon", 93 102 "Eduardo Gomes", 94 103 "Princess Juliana", 95 104 "Campo Grande", 96 105 "Governador Jorge Teixeira de Oliveira", 97 106 "Atlas Brasil Cantanhede", 98 - "Halifax Robert L. Stanfield", 99 - "Comodoro Arturo Merino Benitez", 107 + "Halifax / Stanfield", 108 + "Comodoro Arturo Merino Benítez", 100 109 "St. John's", 101 - "Guarulhos - Governador Andre Franco Montoro", 110 + "Deer Lake", 111 + "St. Anthony", 112 + "Williams Harbour", 113 + "Guarulhos - Governador André Franco Montoro", 102 114 "Congonhas", 103 115 "Presidente Juscelino Kubistschek", 104 - "Galeao - Antonio Carlos Jobim", 116 + "Rio Galeão – Tom Jobim", 105 117 "Jorge Newbery Airpark", 106 118 "Ministro Pistarini", 107 119 "Tancredo Neves", 108 120 "Viracopos", 109 121 "Santos Dumont", 110 122 "Salgado Filho", 111 - "Fernando de Noronha", 112 123 "St Pierre", 124 + "Fernando de Noronha", 113 125 "Godthaab / Nuuk", 114 - "Amilcar Cabral", 126 + "Amílcar Cabral", 115 127 "João Paulo II", 116 128 "Lajes Field", 117 - "Leopold Sedar Senghor", 129 + "Léopold Sédar Senghor", 118 130 "London Heathrow", 119 131 "London Gatwick", 120 132 "Dublin", ··· 126 138 "Gran Canaria", 127 139 "Birmingham", 128 140 "Mohammed V", 129 - "Houari Boumediene", 130 141 "Charles de Gaulle", 131 142 "Amsterdam Airport Schiphol", 132 143 "Frankfurt am Main", 133 - "Madrid Barajas", 144 + "Adolfo Suárez Madrid–Barajas", 134 145 "Barcelona", 135 146 "Munich", 136 - "Leonardo Da Vinci (Fiumicino)", 137 - "Zurich", 147 + "Leonardo da Vinci–Fiumicino", 148 + "Zürich", 138 149 "Copenhagen Kastrup", 139 150 "Palma De Mallorca", 140 - "O. R. Tambo", 151 + "OR Tambo", 141 152 "Cape Town", 142 153 "Ben Gurion", 143 154 "Beirut Rafic Hariri", 144 - "Balti", 155 + "Chişinău", 145 156 "Eleftherios Venizelos", 146 157 "Helsinki Vantaa", 147 - "Henri Coanda", 158 + "Henri Coandă", 148 159 "Boryspil", 149 160 "Heraklion International Nikos Kazantzakis", 150 161 "Sofia", 162 + "Yasser Arafat", 151 163 "Cairo", 152 - "Istanbul", 164 + "Atatürk", 153 165 "Sheremetyevo", 154 - "Hamad", 155 166 "King Abdulaziz", 156 - "Sabiha Gokcen", 167 + "Sabiha Gökçen", 157 168 "Domodedovo", 158 169 "Antalya", 159 170 "King Khaled", 160 171 "Vnukovo", 161 172 "Pulkovo", 173 + "Esenboğa", 162 174 "Mehrabad", 163 175 "Mashhad", 164 176 "Imam Khomeini", ··· 180 192 "Astrakhan", 181 193 "Batumi", 182 194 "Kabul", 195 + "Herat", 196 + "Fayzabad", 183 197 "Koltsovo", 184 198 "Ufa", 185 199 "Roshchino", ··· 192 206 "Salekhard", 193 207 "Indira Gandhi", 194 208 "Chhatrapati Shivaji", 195 - "Bengaluru", 209 + "Kempegowda", 196 210 "Netaji Subhash Chandra Bose", 197 211 "Chennai", 198 - "Rajiv Gandhi International Airport Shamshabad", 199 212 "Cochin", 200 213 "Pune", 201 214 "Sardar Vallabhbhai Patel", 202 215 "Dabolim", 216 + "Jaipur", 203 217 "Tribhuvan", 218 + "Gautam Buddha", 219 + "Biratnagar", 220 + "Tumling Tar", 204 221 "Omsk Central", 205 222 "Yangon", 206 223 "Mandalay", ··· 211 228 "Noi Bai", 212 229 "Juanda", 213 230 "Phuket", 214 - "Polonia", 231 + "Kualanamu", 215 232 "Da Nang", 216 233 "Chiang Mai", 217 234 "Beijing Capital", ··· 223 240 "Chengdu Shuangliu", 224 241 "Shenzhen Bao'an", 225 242 "Taiwan Taoyuan", 226 - "Kunming Wujiaba", 227 - "Eucla", 228 - "Tokyo", 243 + "Kunming Changshui", 244 + "Tokyo Haneda", 229 245 "Incheon", 230 246 "Narita", 231 247 "Jeju", ··· 253 269 "Canberra", 254 270 "Hobart", 255 271 "Lord Howe Island", 256 - "Port Vila Bauerfield", 272 + "Yuzhno-Sakhalinsk", 257 273 "Norfolk Island", 258 274 "Nadi", 259 275 "Yelizovo", ··· 263 279 "Queenstown", 264 280 "Nelson", 265 281 "Dunedin", 266 - "Napier", 282 + "Hawke's Bay", 267 283 "Palmerston North", 268 284 "Chatham Islands-Tuuta", 269 285 "Faleolo", 286 + "Fua'amotu", 287 + "Kaufana", 270 288 "Cassidy", 271 289 }; 272 290 ··· 275 293 float dst_offset_hours; 276 294 int64_t dst_start_utc; 277 295 int64_t dst_end_utc; 278 - int name_offset; 279 - int name_count; 296 + int name_offset; // Index into airport_code_pool & airport_name_pool 297 + int name_count; // Number of unique airports for this tz variant 280 298 } TzInfo; 281 299 300 + // Total timezone variants: 60 282 301 static const TzInfo airport_tz_list[] = { 283 - { -11.00f, -11.00f, 0LL, 0LL, 0, 1 }, 284 - { -10.00f, -10.00f, 0LL, 0LL, 1, 7 }, 285 - { -10.00f, -9.00f, 1741489200LL, 1762048800LL, 8, 1 }, 286 - { -9.50f, -9.50f, 0LL, 0LL, 9, 1 }, 287 - { -9.00f, -9.00f, 0LL, 0LL, 10, 1 }, 288 - { -9.00f, -8.00f, 1741489200LL, 1762048800LL, 11, 1 }, 289 - { -8.00f, -7.00f, 1741489200LL, 1762048800LL, 12, 10 }, 290 - { -7.00f, -7.00f, 0LL, 0LL, 22, 1 }, 291 - { -7.00f, -6.00f, 1741489200LL, 1762048800LL, 23, 6 }, 292 - { -6.00f, -6.00f, 0LL, 0LL, 29, 1 }, 293 - { -6.00f, -5.00f, 1741489200LL, 1762048800LL, 30, 9 }, 294 - { -6.00f, -5.00f, 1757199600LL, 1743890400LL, 39, 1 }, 295 - { -5.00f, -5.00f, 0LL, 0LL, 40, 1 }, 296 - { -5.00f, -4.00f, 1741482000LL, 1762045200LL, 41, 1 }, 297 - { -5.00f, -4.00f, 1741489200LL, 1762048800LL, 42, 10 }, 298 - { -4.00f, -4.00f, 0LL, 0LL, 52, 7 }, 299 - { -4.00f, -3.00f, 1741489200LL, 1762048800LL, 59, 1 }, 300 - { -4.00f, -3.00f, 1757206800LL, 1743897600LL, 60, 1 }, 301 - { -3.50f, -2.50f, 1741489200LL, 1762048800LL, 61, 1 }, 302 - { -3.00f, -3.00f, 0LL, 0LL, 62, 11 }, 303 - { -3.00f, -2.00f, 1741489200LL, 1762048800LL, 73, 1 }, 304 - { -2.00f, -2.00f, 0LL, 0LL, 74, 0 }, 305 - { -2.00f, -1.00f, 1743292800LL, 1761436800LL, 74, 1 }, 306 - { -1.00f, -1.00f, 0LL, 0LL, 75, 1 }, 307 - { -1.00f, 0.00f, 1743296400LL, 1761440400LL, 76, 2 }, 308 - { 0.00f, 0.00f, 0LL, 0LL, 78, 1 }, 309 - { 0.00f, 1.00f, 1743300000LL, 1761444000LL, 79, 10 }, 310 - { 0.00f, 1.00f, 1743908400LL, 1740279600LL, 89, 1 }, 311 - { 1.00f, 1.00f, 0LL, 0LL, 90, 1 }, 312 - { 1.00f, 2.00f, 1743303600LL, 1761447600LL, 91, 10 }, 313 - { 2.00f, 2.00f, 0LL, 0LL, 101, 2 }, 314 - { 2.00f, 3.00f, 1743130800LL, 1761444000LL, 103, 1 }, 315 - { 2.00f, 3.00f, 1743296400LL, 1761436800LL, 104, 1 }, 316 - { 2.00f, 3.00f, 1743303600LL, 1761447600LL, 105, 1 }, 317 - { 2.00f, 3.00f, 1743307200LL, 1761451200LL, 106, 6 }, 318 - { 2.00f, 3.00f, 1745542800LL, 1761868800LL, 112, 1 }, 319 - { 3.00f, 3.00f, 0LL, 0LL, 113, 10 }, 320 - { 3.50f, 3.50f, 0LL, 0LL, 123, 10 }, 321 - { 4.00f, 4.00f, 0LL, 0LL, 133, 10 }, 322 - { 4.50f, 4.50f, 0LL, 0LL, 143, 1 }, 323 - { 5.00f, 5.00f, 0LL, 0LL, 144, 10 }, 324 - { 5.50f, 5.50f, 0LL, 0LL, 154, 10 }, 325 - { 5.75f, 5.75f, 0LL, 0LL, 164, 1 }, 326 - { 6.00f, 6.00f, 0LL, 0LL, 165, 1 }, 327 - { 6.50f, 6.50f, 0LL, 0LL, 166, 2 }, 328 - { 7.00f, 7.00f, 0LL, 0LL, 168, 10 }, 329 - { 8.00f, 8.00f, 0LL, 0LL, 178, 10 }, 330 - { 8.75f, 8.75f, 0LL, 0LL, 188, 1 }, 331 - { 9.00f, 9.00f, 0LL, 0LL, 189, 10 }, 332 - { 9.50f, 9.50f, 0LL, 0LL, 199, 3 }, 333 - { 9.50f, 10.50f, 1759633200LL, 1743908400LL, 202, 4 }, 334 - { 10.00f, 10.00f, 0LL, 0LL, 206, 6 }, 335 - { 10.00f, 11.00f, 1759633200LL, 1743908400LL, 212, 4 }, 336 - { 10.50f, 11.00f, 1759633200LL, 1743904800LL, 216, 1 }, 337 - { 11.00f, 11.00f, 0LL, 0LL, 217, 1 }, 338 - { 11.00f, 12.00f, 1759633200LL, 1743908400LL, 218, 1 }, 339 - { 12.00f, 12.00f, 0LL, 0LL, 219, 2 }, 340 - { 12.00f, 13.00f, 1759028400LL, 1743908400LL, 221, 8 }, 341 - { 12.75f, 13.75f, 1759032000LL, 1743912000LL, 229, 1 }, 342 - { 13.00f, 13.00f, 0LL, 0LL, 230, 1 }, 343 - { 14.00f, 14.00f, 0LL, 0LL, 231, 1 }, 302 + { -11.00f, -11.00f, 0LL, 0LL, 0, 3 }, // Pacific/Pago_Pago, Pacific/Midway, Pacific/Niue... 303 + { -10.00f, -10.00f, 0LL, 0LL, 3, 7 }, // Pacific/Rarotonga, Pacific/Honolulu, Pacific/Tahiti... 304 + { -10.00f, -9.00f, 1741521600LL, 1762081200LL, 10, 1 }, // America/Adak... 305 + { -9.50f, -9.50f, 0LL, 0LL, 11, 3 }, // Pacific/Marquesas... 306 + { -9.00f, -9.00f, 0LL, 0LL, 14, 1 }, // Pacific/Gambier... 307 + { -9.00f, -8.00f, 1741518000LL, 1762077600LL, 15, 1 }, // America/Anchorage... 308 + { -8.00f, -7.00f, 1741514400LL, 1762074000LL, 16, 10 }, // America/Vancouver, America/Tijuana, America/Los_Angeles... 309 + { -7.00f, -7.00f, 0LL, 0LL, 26, 1 }, // America/Dawson_Creek, America/Mazatlan, America/Hermosillo... 310 + { -7.00f, -6.00f, 1741510800LL, 1762070400LL, 27, 6 }, // America/Edmonton, America/Denver, America/Inuvik... 311 + { -6.00f, -6.00f, 0LL, 0LL, 33, 1 }, // America/Regina, America/Guatemala, America/Tegucigalpa... 312 + { -6.00f, -5.00f, 1741507200LL, 1762066800LL, 34, 9 }, // America/Winnipeg, America/Chicago... 313 + { -6.00f, -5.00f, 1757217600LL, 1743908400LL, 43, 1 }, // Pacific/Easter... 314 + { -5.00f, -5.00f, 0LL, 0LL, 44, 1 }, // America/Coral_Harbour, America/Jamaica, America/Cancun... 315 + { -5.00f, -4.00f, 1741496400LL, 1762059600LL, 45, 1 }, // America/Havana... 316 + { -5.00f, -4.00f, 1741503600LL, 1762063200LL, 46, 10 }, // America/Toronto, America/Grand_Turk, America/Port-au-Prince... 317 + { -4.00f, -4.00f, 0LL, 0LL, 56, 7 }, // America/Santo_Domingo, America/Campo_Grande, America/Boa_Vista... 318 + { -4.00f, -3.00f, 1741500000LL, 1762059600LL, 63, 1 }, // America/Thule, America/Halifax, Atlantic/Bermuda... 319 + { -4.00f, -3.00f, 1757217600LL, 1743908400LL, 64, 1 }, // America/Santiago... 320 + { -3.50f, -2.50f, 1741496400LL, 1762056000LL, 65, 4 }, // America/St_Johns... 321 + { -3.00f, -3.00f, 0LL, 0LL, 69, 10 }, // Atlantic/Stanley, America/Cordoba, America/Buenos_Aires... 322 + { -3.00f, -2.00f, 1741496400LL, 1762056000LL, 79, 1 }, // America/Miquelon... 323 + { -2.00f, -2.00f, 0LL, 0LL, 80, 1 }, // America/Noronha... 324 + { -2.00f, -1.00f, 1743296400LL, 1761440400LL, 81, 1 }, // America/Godthab, America/Scoresbysund... 325 + { -1.00f, -1.00f, 0LL, 0LL, 82, 1 }, // Atlantic/Cape_Verde... 326 + { -1.00f, 0.00f, 1743296400LL, 1761440400LL, 83, 2 }, // Atlantic/Azores... 327 + { 0.00f, 0.00f, 0LL, 0LL, 85, 1 }, // Atlantic/Reykjavik, Africa/Ouagadougou, Africa/Accra... 328 + { 0.00f, 1.00f, 1743296400LL, 1761440400LL, 86, 10 }, // Europe/London, Europe/Guernsey, Europe/Jersey... 329 + { 1.00f, 1.00f, 0LL, 0LL, 96, 1 }, // Africa/Algiers, Africa/Porto-Novo, Africa/Lagos... 330 + { 1.00f, 2.00f, 1743296400LL, 1761440400LL, 97, 10 }, // Europe/Brussels, Europe/Berlin, Europe/Amsterdam... 331 + { 2.00f, 2.00f, 0LL, 0LL, 107, 2 }, // Africa/Johannesburg, Africa/Gaborone, Africa/Mbabane... 332 + { 2.00f, 3.00f, 1743120000LL, 1761433200LL, 109, 1 }, // Asia/Jerusalem... 333 + { 2.00f, 3.00f, 1743285600LL, 1761426000LL, 110, 1 }, // Asia/Beirut... 334 + { 2.00f, 3.00f, 1743292800LL, 1761436800LL, 111, 1 }, // Europe/Chisinau... 335 + { 2.00f, 3.00f, 1743296400LL, 1761440400LL, 112, 6 }, // Europe/Tallinn, Europe/Helsinki, Europe/Mariehamn... 336 + { 2.00f, 3.00f, 1744416000LL, 1761346800LL, 118, 1 }, // Asia/Gaza... 337 + { 2.00f, 3.00f, 1745532000LL, 1761858000LL, 119, 1 }, // Africa/Cairo... 338 + { 3.00f, 3.00f, 0LL, 0LL, 120, 10 }, // Indian/Comoro, Indian/Mayotte, Indian/Antananarivo... 339 + { 3.50f, 3.50f, 0LL, 0LL, 130, 10 }, // Asia/Tehran... 340 + { 4.00f, 4.00f, 0LL, 0LL, 140, 10 }, // Indian/Mauritius, Indian/Reunion, Indian/Mahe... 341 + { 4.50f, 4.50f, 0LL, 0LL, 150, 3 }, // Asia/Kabul... 342 + { 5.00f, 5.00f, 0LL, 0LL, 153, 10 }, // Asia/Karachi, Asia/Qyzylorda, Asia/Oral... 343 + { 5.50f, 5.50f, 0LL, 0LL, 163, 10 }, // Asia/Calcutta, Asia/Colombo, Asia/Kolkata... 344 + { 5.75f, 5.75f, 0LL, 0LL, 173, 4 }, // Asia/Katmandu... 345 + { 6.00f, 6.00f, 0LL, 0LL, 177, 1 }, // Asia/Bishkek, Asia/Omsk, Asia/Dhaka... 346 + { 6.50f, 6.50f, 0LL, 0LL, 178, 2 }, // Asia/Rangoon, Indian/Cocos... 347 + { 7.00f, 7.00f, 0LL, 0LL, 180, 10 }, // Asia/Krasnoyarsk, Asia/Phnom_Penh, Asia/Vientiane... 348 + { 8.00f, 8.00f, 0LL, 0LL, 190, 10 }, // Asia/Taipei, Asia/Manila, Asia/Irkutsk... 349 + { 9.00f, 9.00f, 0LL, 0LL, 200, 10 }, // Pacific/Palau, Asia/Tokyo, Asia/Seoul... 350 + { 9.50f, 9.50f, 0LL, 0LL, 210, 3 }, // Australia/Darwin... 351 + { 9.50f, 10.50f, 1759593600LL, 1743872400LL, 213, 4 }, // Australia/Adelaide... 352 + { 10.00f, 10.00f, 0LL, 0LL, 217, 6 }, // Pacific/Port_Moresby, Pacific/Saipan, Pacific/Guam... 353 + { 10.00f, 11.00f, 1759593600LL, 1743868800LL, 223, 4 }, // Australia/Hobart, Australia/Sydney, Australia/Melbourne... 354 + { 10.50f, 11.00f, 1759593600LL, 1743865200LL, 227, 1 }, // Australia/Lord_Howe... 355 + { 11.00f, 11.00f, 0LL, 0LL, 228, 1 }, // Pacific/Efate, Pacific/Noumea, Pacific/Ponape... 356 + { 11.00f, 12.00f, 1759590000LL, 1743865200LL, 229, 1 }, // Pacific/Norfolk... 357 + { 12.00f, 12.00f, 0LL, 0LL, 230, 2 }, // Pacific/Fiji, Pacific/Tarawa, Pacific/Wallis... 358 + { 12.00f, 13.00f, 1758981600LL, 1743861600LL, 232, 8 }, // Pacific/Auckland... 359 + { 12.75f, 13.75f, 1758981600LL, 1743861600LL, 240, 1 }, // Pacific/Chatham... 360 + { 13.00f, 13.00f, 0LL, 0LL, 241, 3 }, // Pacific/Tongatapu, Pacific/Apia, Pacific/Enderbury... 361 + { 14.00f, 14.00f, 0LL, 0LL, 244, 1 }, // Pacific/Kiritimati... 344 362 }; 345 363 346 364 #define AIRPORT_TZ_LIST_COUNT (sizeof(airport_tz_list)/sizeof(airport_tz_list[0])) 347 - #define AIRPORT_CODE_POOL_COUNT (sizeof(airport_code_pool)/3) 348 - #define AIRPORT_NAME_POOL_COUNT (sizeof(airport_name_pool)/sizeof(airport_name_pool[0])) 365 + #define AIRPORT_CODE_POOL_COUNT 245 366 + #define AIRPORT_NAME_POOL_COUNT 245