@airframes/acars-decoder 1.9.4 → 1.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../lib/utils/coordinate_utils.ts","../../lib/DateTimeUtils.ts","../../lib/utils/route_utils.ts","../../lib/utils/result_formatter.ts","../../lib/DecoderPlugin.ts","../../lib/plugins/Lib_ACARS.ts","../../lib/plugins/CBand.ts","../../lib/utils/flight_plan_utils.ts","../../lib/utils/arinc_702_helper.ts","../../lib/plugins/ARINC_702.ts","../../lib/utils/acars_free_text.ts","../../lib/plugins/Label_5Z_Slash.ts","../../lib/plugins/Label_10_LDR.ts","../../lib/plugins/Label_10_POS.ts","../../lib/plugins/Label_10_Slash.ts","../../lib/plugins/Label_12_N_Space.ts","../../lib/plugins/Label_12_POS.ts","../../lib/plugins/Label_13Through18_Slash.ts","../../lib/plugins/Label_15.ts","../../lib/plugins/Label_15_FST.ts","../../lib/plugins/Label_16_AUTPOS.ts","../../lib/plugins/Label_16_Honeywell.ts","../../lib/plugins/Label_16_N_Space.ts","../../lib/plugins/Label_16_POSA1.ts","../../lib/plugins/Label_16_TOD.ts","../../lib/plugins/Label_1M_Slash.ts","../../lib/plugins/Label_1L_3-line.ts","../../lib/plugins/Label_1L_070.ts","../../lib/plugins/Label_1L_660.ts","../../lib/plugins/Label_1L_Slash.ts","../../lib/plugins/Label_20_POS.ts","../../lib/plugins/Label_21_POS.ts","../../lib/plugins/Label_22_OFF.ts","../../lib/plugins/Label_22_POS.ts","../../lib/plugins/Label_2P_FM3.ts","../../lib/plugins/Label_2P_FM4.ts","../../lib/plugins/Label_2P_FM5.ts","../../lib/plugins/Label_24_Slash.ts","../../lib/plugins/Label_30_Slash_EA.ts","../../lib/plugins/Label_44_ETA.ts","../../lib/plugins/Label_44_Base.ts","../../lib/plugins/Label_44_IN.ts","../../lib/plugins/Label_44_OFF.ts","../../lib/plugins/Label_44_ON.ts","../../lib/plugins/Label_44_POS.ts","../../lib/plugins/Label_44_Slash.ts","../../lib/plugins/Label_4A.ts","../../lib/plugins/Label_4A_01.ts","../../lib/plugins/Label_4A_DIS.ts","../../lib/plugins/Label_4A_DOOR.ts","../../lib/plugins/Label_4A_Slash_01.ts","../../lib/plugins/Label_4N.ts","../../lib/plugins/Label_4T_AGFSR.ts","../../lib/plugins/Label_58.ts","../../lib/plugins/Label_4T_ETA.ts","../../lib/plugins/Label_80.ts","../../lib/plugins/Label_83.ts","../../lib/plugins/Label_8E.ts","../../lib/plugins/Label_B6.ts","../../lib/plugins/Label_ColonComma.ts","../../lib/plugins/Label_H1_76401.ts","../../lib/plugins/Label_H1_ATIS.ts","../../lib/plugins/Label_H1_EZF.ts","../../lib/plugins/Label_H1_FLR.ts","../../lib/plugins/Label_H1_M_POS.ts","../../lib/utils/compression.ts","../../lib/plugins/Label_H1_OHMA.ts","../../lib/utils/icao_fpl_utils.ts","../../lib/plugins/Label_H1_OFP.ts","../../lib/plugins/Label_H1_Paren.ts","../../lib/plugins/Label_H1_StarPOS.ts","../../lib/plugins/Label_H1_WRN.ts","../../lib/plugins/Label_H2_02E.ts","../../lib/plugins/Label_HX.ts","../../lib/utils/ascii85.ts","../../lib/utils/miam.ts","../../lib/plugins/Label_MA.ts","../../lib/plugins/Label_SQ.ts","../../lib/plugins/Label_QR.ts","../../lib/plugins/Label_QP.ts","../../lib/plugins/Label_QS.ts","../../lib/plugins/Label_QQ.ts","../../lib/MessageDecoder.ts","../../lib/bin/acars-decoder-test.ts"],"sourcesContent":["export class CoordinateUtils {\n /**\n * Decode a string of coordinates into an object with latitude and longitude in millidegrees\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinates(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.charAt(0);\n let middleChar = stringCoords.charAt(6);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar === ' ') {\n middleChar = stringCoords.charAt(7);\n longitudeChars = stringCoords.substring(8, 14);\n }\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (Number(stringCoords.substring(1, 6)) / 1000) *\n CoordinateUtils.getDirection(firstChar),\n longitude:\n (Number(longitudeChars) / 1000) *\n CoordinateUtils.getDirection(middleChar),\n };\n }\n\n return undefined;\n }\n\n /**\n * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinatesDecimalMinutes(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.charAt(0);\n let middleChar = stringCoords.charAt(6);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar === ' ') {\n middleChar = stringCoords.charAt(7);\n longitudeChars = stringCoords.substring(8, 14);\n }\n\n if (\n (firstChar !== 'N' && firstChar !== 'S') ||\n (middleChar !== 'W' && middleChar !== 'E')\n ) {\n return undefined;\n }\n\n const latRaw = Number(stringCoords.substring(1, 6));\n const lonRaw = Number(longitudeChars);\n const latDeg = Math.trunc(latRaw / 1000);\n const latMin = (latRaw % 1000) / 10;\n const lonDeg = Math.trunc(lonRaw / 1000);\n const lonMin = (lonRaw % 1000) / 10;\n\n return {\n latitude:\n (latDeg + latMin / 60) * CoordinateUtils.getDirection(firstChar),\n longitude:\n (lonDeg + lonMin / 60) * CoordinateUtils.getDirection(middleChar),\n };\n }\n public static coordinateString(coords: {\n latitude: number;\n longitude: number;\n }): string {\n const latDir = coords.latitude > 0 ? 'N' : 'S';\n const lonDir = coords.longitude > 0 ? 'E' : 'W';\n return `${Math.abs(coords.latitude).toFixed(3)} ${latDir}, ${Math.abs(coords.longitude).toFixed(3)} ${lonDir}`;\n }\n\n public static getDirection(coord: string): number {\n if (coord.startsWith('N') || coord.startsWith('E')) {\n return 1;\n } else if (coord.startsWith('S') || coord.startsWith('W')) {\n return -1;\n }\n return NaN;\n }\n\n public static dmsToDecimalDegrees(\n degrees: number,\n minutes: number,\n seconds: number,\n ): number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}\n","export class DateTimeUtils {\n // Expects a four digit UTC time string (HHMM)\n public static UTCToString(UTCString: string) {\n let utcDate = new Date();\n utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);\n return utcDate.toTimeString();\n }\n\n // Expects a six digit date string and a four digit UTC time string\n // (DDMMYY) (HHMM)\n public static UTCDateTimeToString(dateString: string, timeString: string) {\n const day = +dateString.substr(0, 2);\n // ACARS month is 1-12; JS Date months are 0-11, so subtract one.\n const month = +dateString.substr(2, 2) - 1;\n const year =\n dateString.length === 6\n ? 2000 + +dateString.substr(4, 2)\n : new Date().getUTCFullYear();\n const hours = +timeString.substr(0, 2);\n const minutes = +timeString.substr(2, 2);\n const seconds = timeString.length === 6 ? +timeString.substr(4, 2) : 0;\n // Build the date in one call so an incremental setUTC* on a Date that\n // was initialised to \"now\" can't roll the month forward when the\n // current real-world day is later than the last day of the target.\n const utcDate = new Date(\n Date.UTC(year, month, day, hours, minutes, seconds),\n );\n return utcDate.toUTCString();\n }\n\n /**\n *\n * @param time HHMMSS or HHMM\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number {\n if (time.length === 4) {\n time += '00';\n }\n const h = Number(time.substring(0, 2));\n const m = Number(time.substring(2, 4));\n const s = Number(time.substring(4, 6));\n const tod = h * 3600 + m * 60 + s;\n return tod;\n }\n\n public static convertDayTimeToTod(time: string): number {\n const d = Number(time.substring(0, 2));\n const h = Number(time.substring(2, 4));\n const m = Number(time.substring(4, 6));\n const s = Number(time.substring(6, 8));\n const tod = d * 86400 + h * 3600 + m * 60 + s;\n return tod;\n }\n\n /**\n *\n * @param time HHMMSS\n * @param date DDMMYY or DDMMYYYY\n * @returns seconds since epoch\n */\n public static convertDateTimeToEpoch(time: string, date: string): number {\n //YYYY-MM-DDTHH:mm:ss.sssZ\n if (date.length === 6) {\n date = date.substring(0, 4) + `20${date.substring(4, 6)}`;\n }\n const timestamp = `${date.substring(4, 8)}-${date.substring(2, 4)}-${date.substring(0, 2)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;\n const millis = Date.parse(timestamp);\n return millis / 1000;\n }\n\n /**\n * Converts a timestamp to a string\n *\n * ISO-8601 format for 'epoch'\n * HH:MM:SS for 'tod'\n * @param time\n * @param format\n * @returns\n */\n public static timestampToString(time: number): string {\n if (isNaN(time)) {\n return '';\n }\n const date = new Date(time * 1000);\n\n if (time < 86400) {\n // only time, no date\n return date.toISOString().slice(11, 19);\n }\n if (time < 32 * 86400) {\n // unknown month, day of month is time / 86400\n const day = String(Math.floor(time / 86400)).padStart(2, '0');\n return `YYYY-MM-${day}T${date.toISOString().slice(11, 19)}`;\n }\n //strip off millis\n return date.toISOString().slice(0, -5) + 'Z';\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { Route } from '../types/route';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from './coordinate_utils';\n\nexport class RouteUtils {\n public static formatFlightState(state: string): string {\n switch (state) {\n case 'TO':\n return 'Takeoff';\n case 'IC':\n return 'Initial Climb';\n case 'CL':\n return 'Climb';\n case 'ER':\n return 'En Route';\n case 'DC':\n return 'Descent';\n case 'AP':\n return 'Approach';\n default:\n return `Unknown ${state}`;\n }\n }\n\n public static routeToString(route: Route): string {\n let str = '';\n if (route.name) {\n str += route.name;\n }\n if (route.runway) {\n str += `(${route.runway})`;\n }\n if (str.length !== 0 && route.waypoints && route.waypoints.length === 1) {\n str += ' starting at ';\n } else if (str.length !== 0 && route.waypoints) {\n str += ': ';\n }\n\n if (route.waypoints) {\n str += RouteUtils.waypointsToString(route.waypoints);\n }\n\n return str;\n }\n\n public static waypointToString(waypoint: Waypoint): string {\n let s = waypoint.name;\n if (waypoint.latitude && waypoint.longitude) {\n s += `(${CoordinateUtils.coordinateString({ latitude: waypoint.latitude, longitude: waypoint.longitude })})`;\n }\n if (waypoint.offset) {\n s += `[${waypoint.offset.bearing}° ${waypoint.offset.distance}nm]`;\n }\n if (waypoint.time) {\n s += `@${DateTimeUtils.timestampToString(waypoint.time)}`;\n }\n return s;\n }\n\n public static getWaypoint(leg: string): Waypoint {\n const regex = leg.match(/^([A-Z]+)(\\d{3})-(\\d{4})$/); // {name}{bearing}-{distance}\n if (regex?.length == 4) {\n return {\n name: regex[1],\n offset: {\n bearing: parseInt(regex[2]),\n distance: parseInt(regex[3]) / 10,\n },\n };\n }\n\n const waypoint = leg.split(',');\n if (waypoint.length == 2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n waypoint[1],\n );\n if (position) {\n return {\n name: waypoint[0],\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n if (leg.length == 13 || leg.length == 14) {\n //looks like coordinates\n const position =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if (position) {\n return {\n name: name,\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n return { name: leg };\n }\n\n private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints\n .map((x) => RouteUtils.waypointToString(x))\n .join(' > ')\n .replaceAll('> >', '>>');\n if (str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { RouteUtils } from './route_utils';\nimport { Route } from '../types/route';\nimport { Wind } from '../types/wind';\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n static route(decodeResult: DecodeResult, route: Route) {\n decodeResult.raw.route = route;\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(route),\n });\n }\n\n static state_change(decodeResult: DecodeResult, from: string, to: string) {\n decodeResult.raw.state_change = {\n from: from,\n to: to,\n };\n from = RouteUtils.formatFlightState(from);\n to = RouteUtils.formatFlightState(to);\n decodeResult.formatted.items.push({\n type: 'state_change',\n code: 'STATE_CHANGE',\n label: 'State Change',\n value: `${from} -> ${to}`,\n });\n }\n\n static door_event(decodeResult: DecodeResult, name: string, state: string) {\n decodeResult.raw.door_event = {\n door: name,\n state: state,\n };\n\n decodeResult.formatted.items.push({\n type: 'door_event',\n code: 'DOOR',\n label: 'Door Event',\n value: `${name} ${state}`,\n });\n }\n\n static position(\n decodeResult: DecodeResult,\n value: { latitude: number; longitude: number } | undefined,\n ) {\n if (!value || isNaN(value.latitude) || isNaN(value.longitude)) {\n return;\n }\n decodeResult.raw.position = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(value),\n });\n }\n\n static altitude(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.altitude = value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n }\n\n static flightNumber(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.flight_number = value;\n decodeResult.formatted.items.push({\n type: 'flight_number',\n code: 'FLIGHT',\n label: 'Flight Number',\n value: decodeResult.raw.flight_number,\n });\n }\n\n static callsign(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.callsign = value;\n decodeResult.formatted.items.push({\n type: 'callsign',\n code: 'CALLSIGN',\n label: 'Callsign',\n value: decodeResult.raw.callsign,\n });\n }\n\n static departureAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n } else {\n decodeResult.raw.departure_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n }\n }\n\n static departureRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'DEPRWY',\n label: 'Departure Runway',\n value: decodeResult.raw.departure_runway,\n });\n }\n\n static arrivalAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n } else {\n decodeResult.raw.arrival_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n }\n }\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n }\n\n static eta(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.eta_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static arrivalRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ARWY',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n }\n\n static alternateRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ALT_ARWY',\n label: 'Alternate Runway',\n value: decodeResult.raw.alternate_runway,\n });\n }\n\n static currentFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_on_board = value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: 'Fuel On Board',\n value: decodeResult.raw.fuel_on_board.toString(),\n });\n }\n\n static burnedFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_burned = value;\n decodeResult.formatted.items.push({\n type: 'fuel_burned',\n code: 'FB',\n label: 'Fuel Burned',\n value: decodeResult.raw.fuel_burned.toString(),\n });\n }\n\n static remainingFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n code: 'FUEL_REM',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n }\n\n static outFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.out_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_OUT',\n label: 'Out of Gate Fuel',\n value: decodeResult.raw.out_fuel.toString() + ' lbs',\n });\n }\n\n static offFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.off_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_OFF',\n label: 'Takeoff Fuel',\n value: decodeResult.raw.off_fuel.toString() + ' lbs',\n });\n }\n\n static onFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.on_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_ON',\n label: 'Landing Fuel',\n value: decodeResult.raw.on_fuel.toString() + ' lbs',\n });\n }\n\n static inFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.in_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_IN',\n label: 'In Gate Fuel',\n value: decodeResult.raw.in_fuel.toString() + ' lbs',\n });\n }\n\n static startFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.start_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_START',\n label: 'Start Fuel',\n value: decodeResult.raw.start_fuel.toString() + ' lbs',\n });\n }\n\n static checksumAlgorithm(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.checksum_algorithm = value;\n // decodeResult.formatted.items.push({\n // type: 'message_checksum_algorithm',\n // code: 'CHECKSUM_ALGO',\n // label: 'Checksum Algorithm',\n // value: decodeResult.raw.checksum_algorithm,\n // });\n }\n\n static checksum(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.checksum = value;\n decodeResult.formatted.items.push({\n type: 'message_checksum',\n code: 'CHECKSUM',\n label: 'Message Checksum',\n value:\n '0x' + (decodeResult.raw.checksum >>> 0).toString(16).padStart(4, '0'),\n });\n }\n\n static groundspeed(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.groundspeed = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_groundspeed',\n code: 'GSPD',\n label: 'Aircraft Groundspeed',\n value: `${decodeResult.raw.groundspeed} knots`,\n });\n }\n\n static airspeed(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.airspeed = value;\n decodeResult.formatted.items.push({\n type: 'airspeed',\n code: 'ASPD',\n label: 'True Airspeed',\n value: `${decodeResult.raw.airspeed} knots`,\n });\n }\n\n static mach(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.mach = value;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MACH',\n label: 'Mach Number',\n value: `${decodeResult.raw.mach} mach`,\n });\n }\n\n static temperature(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.outside_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'outside_air_temperature',\n code: 'OATEMP',\n label: 'Outside Air Temperature (C)',\n value: `${decodeResult.raw.outside_air_temperature} degrees`,\n });\n }\n\n static totalAirTemp(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.total_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'temperature',\n code: 'TATEMP',\n label: 'Total Air Temperature (C)',\n value: `${decodeResult.raw.total_air_temperature} degrees`,\n });\n }\n\n static heading(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.heading = value;\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: 'Heading',\n value: `${decodeResult.raw.heading}`,\n });\n }\n\n static tail(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.tail = value;\n decodeResult.formatted.items.push({\n type: 'tail',\n code: 'TAIL',\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n }\n\n static out(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.out_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static off(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.off_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.on_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ON',\n label: 'Landing Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.in_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'IN',\n label: 'In Gate Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static engineStart(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.engine_start_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ENG_START',\n label: 'Engine Start Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n static engineStop(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.engine_stop_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ENG_STOP',\n label: 'Engine Stop Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static day(decodeResult: DecodeResult, day: number) {\n if (isNaN(day)) {\n return;\n }\n decodeResult.raw.day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'MSG_DAY',\n label: 'Day of Month',\n value: `${day}`,\n });\n }\n\n static month(decodeResult: DecodeResult, month: number) {\n if (isNaN(month)) {\n return;\n }\n decodeResult.raw.month = month;\n decodeResult.formatted.items.push({\n type: 'month',\n code: 'MSG_MON',\n label: 'Month of Year',\n value: `${month}`,\n });\n }\n\n static departureDay(decodeResult: DecodeResult, day: number) {\n if (isNaN(day)) {\n return;\n }\n decodeResult.raw.departure_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'DEP_DAY',\n label: 'Departure Day',\n value: `${day}`,\n });\n }\n\n static arrivalDay(decodeResult: DecodeResult, day: number) {\n if (isNaN(day)) {\n return;\n }\n decodeResult.raw.arrival_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'ARR_DAY',\n label: 'Arrival Day',\n value: `${day}`,\n });\n }\n\n static text(decodeResult: DecodeResult, text: string) {\n decodeResult.raw.text = text;\n decodeResult.formatted.items.push({\n type: 'text',\n code: 'TEXT',\n label: 'Text Message',\n value: text,\n });\n }\n\n static mac(decodeResult: DecodeResult, mac: number) {\n decodeResult.raw.mac = mac;\n decodeResult.formatted.items.push({\n type: 'mac',\n code: 'MAC',\n label: 'Mean Aerodynamic Chord',\n value: `${mac} %`,\n });\n }\n\n static trim(decodeResult: DecodeResult, trim: number) {\n decodeResult.raw.trim = trim;\n decodeResult.formatted.items.push({\n type: 'trim',\n code: 'TRIM',\n label: 'Trim',\n value: `${trim} units`,\n });\n }\n\n static windData(decodeResult: DecodeResult, windData: Wind[]) {\n decodeResult.raw.wind_data = windData;\n for (const wind of windData) {\n let text = `${RouteUtils.waypointToString(wind.waypoint)} at FL${wind.flightLevel}: ${wind.windDirection}° at ${wind.windSpeed}kt`;\n if (wind.temperature) {\n text += `, ${wind.temperature.degreesC}°C at FL${wind.temperature.flightLevel}`;\n }\n decodeResult.formatted.items.push({\n type: 'wind_data',\n code: 'WIND',\n label: 'Wind Data',\n value: text,\n });\n }\n }\n\n static cg(\n decodeResult: DecodeResult,\n value: number,\n type: 'center' | 'lower' | 'upper' = 'center',\n ) {\n switch (type) {\n case 'center':\n decodeResult.raw.center_of_gravity = value;\n decodeResult.formatted.items.push({\n type: 'center_of_gravity',\n code: 'CG',\n label: 'Center of Gravity',\n value: `${decodeResult.raw.center_of_gravity} %`,\n });\n break;\n case 'lower':\n decodeResult.raw.cg_lower_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_lower_limit',\n code: 'CG_LOWER',\n label: 'Center of Gravity Lower Limit',\n value: `${decodeResult.raw.cg_lower_limit} %`,\n });\n break;\n case 'upper':\n decodeResult.raw.cg_upper_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_upper_limit',\n code: 'CG_UPPER',\n label: 'Center of Gravity Upper Limit',\n value: `${decodeResult.raw.cg_upper_limit} %`,\n });\n break;\n }\n }\n\n static version(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.version = value;\n decodeResult.formatted.items.push({\n type: 'version',\n code: 'VERSION',\n label: 'Message Version',\n value: `v${decodeResult.raw.version.toFixed(1)}`,\n });\n }\n\n static label(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.label = value;\n decodeResult.formatted.items.push({\n type: 'label',\n code: 'LABEL',\n label: 'Message Label',\n value: `${decodeResult.raw.label}`,\n });\n }\n\n static sublabel(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.sublabel = value;\n decodeResult.formatted.items.push({\n type: 'sublabel',\n code: 'SUBLABEL',\n label: 'Message Sublabel',\n value: `${decodeResult.raw.sublabel}`,\n });\n }\n\n static requestedAltitudes(decodeResult: DecodeResult, values: number[]) {\n decodeResult.raw.requested_alts = values;\n decodeResult.formatted.items.push({\n type: 'requested_altitudes',\n code: 'REQ_ALTS',\n label: 'Requested Altitudes',\n value: `${decodeResult.raw.requested_alts.join(', ')}`,\n });\n }\n\n static desiredAltitude(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.desired_alt = value;\n decodeResult.formatted.items.push({\n type: 'desired_altitude',\n code: 'DES_ALT',\n label: 'Desired Altitude',\n value: `${decodeResult.raw.desired_alt}`,\n });\n }\n\n static startPoint(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.start_point = value;\n decodeResult.formatted.items.push({\n type: 'start_point',\n code: 'START',\n label: 'Start Point',\n value: `${decodeResult.raw.start_point}`,\n });\n }\n\n static routeNumber(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.route_number = value;\n decodeResult.formatted.items.push({\n type: 'route_number',\n code: 'RTE_NUM',\n label: 'Route Number',\n value: `${decodeResult.raw.route_number}`,\n });\n }\n\n static flightPlan(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.flight_plan = value;\n decodeResult.formatted.items.push({\n type: 'flight_plan',\n code: 'FPN',\n label: 'Flight Plan',\n value: `${decodeResult.raw.flight_plan}`,\n });\n }\n\n static groundAddress(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.ground_address = value;\n decodeResult.formatted.items.push({\n type: 'ground_address',\n code: 'GND_ADDR',\n label: 'Ground Address',\n value: `${decodeResult.raw.ground_address}`,\n });\n }\n\n static timestamp(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.message_timestamp = value;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'TIMESTAMP',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(value),\n });\n }\n\n static sequenceNumber(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.sequence_number = value;\n decodeResult.formatted.items.push({\n type: 'sequence',\n code: 'SEQ',\n label: 'Sequence Number',\n value: decodeResult.raw.sequence_number.toString(),\n });\n }\n\n static sequenceResponse(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.sequence_response = value;\n decodeResult.formatted.items.push({\n type: 'sequence',\n code: 'SEQ_RESP',\n label: 'Sequence Response',\n value: decodeResult.raw.sequence_response.toString(),\n });\n }\n\n static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') {\n if (!decodeResult.remaining.text) decodeResult.remaining.text = value;\n else decodeResult.remaining.text += sep + value;\n }\n\n static unknownArr(\n decodeResult: DecodeResult,\n value: string[],\n sep: string = ',',\n ) {\n this.unknown(decodeResult, value.join(sep), sep);\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n Qualifiers,\n} from './DecoderPluginInterface';\nimport { ResultFormatter } from './utils/result_formatter';\nimport { MessageDecoder } from './MessageDecoder';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: MessageDecoder;\n\n name: string = 'unknown';\n\n defaultResult(): DecodeResult {\n return {\n decoded: false,\n decoder: {\n name: 'unknown',\n type: 'pattern-match',\n decodeLevel: 'none',\n },\n formatted: {\n description: 'Unknown',\n items: [],\n },\n raw: {},\n remaining: {},\n };\n }\n\n /**\n * Creates a DecodeResult pre-populated with the plugin name, description, and message.\n * Replaces the common boilerplate at the start of every decode() method.\n */\n protected initResult(message: Message, description: string): DecodeResult {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.formatted.description = description;\n result.message = message;\n return result;\n }\n\n /**\n * Sets the decoded flag and decodeLevel on a result.\n * If decoded is true and no explicit level is given, infers 'full' or 'partial'\n * based on whether remaining.text is set.\n */\n protected setDecodeLevel(\n result: DecodeResult,\n decoded: boolean,\n level?: 'full' | 'partial',\n ): void {\n result.decoded = decoded;\n if (decoded) {\n result.decoder.decodeLevel =\n level ?? (result.remaining.text ? 'partial' : 'full');\n } else {\n result.decoder.decodeLevel = 'none';\n }\n }\n\n /**\n * Logs a debug message prefixed with the plugin name, only if options.debug is true.\n */\n protected debug(options: Options, ...args: unknown[]): void {\n if (options.debug) {\n console.log(`[${this.name}]`, ...args);\n }\n }\n\n /**\n * Marks a result as a failed decode with 'none' level, sets the remaining text\n * as unknown, and logs a debug message. Returns the result for convenient early return.\n */\n protected failUnknown(\n result: DecodeResult,\n text: string,\n options: Options = {},\n ): DecodeResult {\n this.debug(options, `Unknown message: ${text}`);\n ResultFormatter.unknown(result, text);\n result.decoded = false;\n result.decoder.decodeLevel = 'none';\n return result;\n }\n\n options: object;\n\n constructor(decoder: MessageDecoder, options: Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id(): string {\n console.log(\n 'DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!',\n );\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements(): boolean {\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers(): Qualifiers {\n const labels: Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n/**\n * Decoder plugin for handling messages processed by libacars\n *\n * Specifically L-band or C-band messages\n * using clients like `jaero` and `iridium-toolkit`\n */\nexport class LibAcars extends DecoderPlugin {\n name = 'libacars';\n qualifiers() {\n return {\n labels: ['*'],\n preambles: ['- #'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const text = message.text;\n\n const prefix = message.text.slice(0, 5); // TODO extract meaning. ignoring for now\n\n const decoded = this.decoder.decode(\n {\n label: message.label,\n sublabel: message.sublabel,\n text: text.replaceAll(prefix, ''), // Remove the prefix before decoding\n },\n options,\n );\n\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (decoded.decoded) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.decoder.name = this.name + '-' + decoded.decoder.name;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.description = decoded.formatted.description;\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// C-Band puts a 10 char header in front of some message types:\n// chars 0-3: message number ([A-Z]\\d{2}[A-Z])\n// chars 4-5: airline code ([A-Z0-9]{2})\n// chars 6-9: flight number ([0-9]{4})\n// Hoisted to module scope so the pattern is allocated once instead of on\n// every wildcard decode invocation.\nconst CBAND_HEADER =\n /^(?<msgno>[A-Z]\\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/;\n\nexport class CBand extends DecoderPlugin {\n name = 'c-band';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const text = message.text;\n // Cheap length check before running the regex — a C-Band header is\n // exactly 10 chars and is followed by the wrapped payload.\n if (text.length < 10) {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.message = message;\n return result;\n }\n\n const cband = CBAND_HEADER.exec(text);\n if (!cband?.groups) {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.message = message;\n return result;\n }\n\n const decoded = this.decoder.decode(\n {\n label: message.label,\n sublabel: message.sublabel,\n text: text.substring(10),\n },\n options,\n );\n\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (decoded.decoded) {\n ResultFormatter.flightNumber(\n decodeResult,\n cband.groups.airline + Number(cband.groups.number),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.decoder.name = this.name + '-' + decoded.decoder.name;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.description = decoded.formatted.description;\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n }\n return decodeResult;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\nexport class FlightPlanUtils {\n /**\n * Processes flight plan data\n *\n * Expected format is [header, fpei, val1, ... fpeiN, valN]\n *\n * @see https://atlaske-content.garmin.com/filestorage//email/outbound/attachments/GTN_Flight_Plan_and_User_Waypoint_transfer_Time1712844670119.pdf\n * @param decodeResult - results\n * @param data - original message split by ':'\n * @returns whether all fields were processed or not\n */\n public static processFlightPlan(\n decodeResult: DecodeResult,\n data: string[],\n ): boolean {\n let allKnownFields = FlightPlanUtils.parseHeader(decodeResult, data[0]);\n for (let i = 1; i < data.length; i += 2) {\n const fpei = data[i];\n const value = data[i + 1];\n // TODO: discuss how store commented out bits as both raw and formatted\n switch (fpei) {\n case 'A': // Arrival Procedure (?)\n FlightPlanUtils.addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n FlightPlanUtils.addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n FlightPlanUtils.addProcedure(decodeResult, value, 'departure');\n break;\n case 'DA':\n addDepartureAirport(decodeResult, value);\n break;\n case 'F': // First Waypoint\n addRoute(decodeResult, value);\n break;\n case 'FP':\n ResultFormatter.flightPlan(decodeResult, value.trim());\n break;\n case 'R':\n addRunway(decodeResult, value);\n break;\n // case 'WS': // something about routes, has altitude, so current parsing won't work\n // break;\n default:\n if (allKnownFields) {\n decodeResult.remaining.text = '';\n allKnownFields = false;\n }\n decodeResult.remaining.text += `:${fpei}:${value}`;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return allKnownFields;\n }\n public static parseHeader(\n decodeResult: DecodeResult,\n header: string,\n ): boolean {\n let allKnownFields = true;\n if (header.startsWith('RF')) {\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Filed',\n });\n decodeResult.raw.route_status = 'RF';\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RP')) {\n decodeResult.raw.route_status = 'RP';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Planned',\n });\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RI')) {\n decodeResult.raw.route_status = 'RI';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Inactive',\n });\n } else if (header.startsWith('RM')) {\n decodeResult.raw.route_status = 'RM';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Mapped',\n });\n } else if (header.startsWith('RS')) {\n decodeResult.raw.route_status = 'RS';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Saved',\n });\n } else {\n decodeResult.remaining.text += header;\n allKnownFields = false;\n }\n return allKnownFields;\n }\n\n public static addProcedure(\n decodeResult: DecodeResult,\n value: string,\n type: string,\n ) {\n if (decodeResult.raw.procedures === undefined) {\n decodeResult.raw.procedures = [];\n }\n const data = value.split('.');\n let waypoints;\n if (data.length > 1) {\n waypoints = data.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n const route = { name: data[0], waypoints: waypoints };\n decodeResult.raw.procedures.push({ type: type, route: route });\n const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);\n decodeResult.formatted.items.push({\n type: 'procedure',\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\n });\n }\n}\n\nfunction addArrivalAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.arrivalAirport(decodeResult, value);\n}\n\nfunction addDepartureAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.departureAirport(decodeResult, value);\n}\n\nfunction addRunway(decodeResult: DecodeResult, value: string) {\n // xxx(yyy) where xxx is the departure runway and yyy is the arrival runway\n if (value.length === 8) {\n ResultFormatter.arrivalRunway(decodeResult, value.substring(4, 7));\n }\n\n ResultFormatter.departureRunway(decodeResult, value.substring(0, 3));\n}\n\nfunction addRoute(decodeResult: DecodeResult, value: string) {\n const route = value.split('.');\n ResultFormatter.route(decodeResult, {\n waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)),\n });\n}\n\nfunction addCompanyRoute(decodeResult: DecodeResult, value: string) {\n const segments = value.split('.');\n const parens_idx = segments[0].indexOf('(');\n let name;\n let runway;\n if (parens_idx === -1) {\n name = segments[0];\n } else {\n name = segments[0].slice(0, parens_idx);\n const close_paren_idx = segments[0].indexOf(')');\n // When ')' is missing, indexOf returns -1, which slice() would\n // interpret as \"count from the end\", silently dropping the final\n // character. Fall back to the end of the segment to preserve data.\n runway = segments[0].slice(\n parens_idx + 1,\n close_paren_idx === -1 ? undefined : close_paren_idx,\n );\n }\n let waypoints;\n if (segments.length > 1) {\n waypoints = segments.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n decodeResult.raw.company_route = {\n name: name,\n runway: runway,\n waypoints: waypoints,\n };\n decodeResult.formatted.items.push({\n type: 'company_route',\n code: 'CR',\n label: 'Company Route',\n value: RouteUtils.routeToString(decodeResult.raw.company_route),\n });\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { FlightPlanUtils } from './flight_plan_utils';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\n// One byte per ASCII char — replaces the Buffer.from(data, 'ascii') idiom so\n// the CRC helpers run in browser / Deno / Bun / edge runtimes without Node\n// polyfills. Matches the broader Web APIs migration in c78b720.\nfunction asciiStringToBytes(data: string): Uint8Array {\n const bytes = new Uint8Array(data.length);\n for (let i = 0; i < data.length; i++) bytes[i] = data.charCodeAt(i) & 0xff;\n return bytes;\n}\n\n/**\n * Helper class for decoding ARINC 702 messages\n * contains core logic for decoding different types of ARINC 702 messages,\n * as well as utility functions for processing common fields\n *\n * Core format:\n * IMI/IEIdata/IEIdata/...checksum\n */\nexport class Arinc702Helper {\n /**\n * Decodes an ARINC 702 message\n *\n * Steps:\n * 1. Check against known checksum algorithms to determine if message is valid\n * 2. Parse the Imbedded Message Identifier (IMI) to determine the type of message\n * 3. Iterate through the Information Elements (IEI) and decode known fields, while storing unknown fields for further analysis\n *\n * @param decodeResult - object to store decoded results in\n * @param message - message to decode\n * @returns boolean indicating if the message was successfully decoded\n */\n public static decodeH1Message(decodeResult: DecodeResult, message: string) {\n decodeResult.remaining.text = '';\n const checksum = parseInt(message.slice(-4), 16);\n const data = message.slice(0, message.length - 4);\n let checksumAlgorithmUsed = '';\n if (crc16IbmSdlcRev(data) === checksum) {\n // ACARS/VDL2/HFDL/Iridium\n checksumAlgorithmUsed = 'IBM-SDLC reversed';\n } else if (crc16Genibus(data) === checksum) {\n // inmarsat\n checksumAlgorithmUsed = 'GENIBUS';\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n const fields = data.split('/');\n const canDecode = parseMessageType(decodeResult, fields[0]);\n if (!canDecode) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n for (let i = 1; i < fields.length; ++i) {\n const iei = fields[i].substring(0, 2);\n const data = fields[i].substring(2);\n switch (iei) {\n case 'AF':\n processAirField(decodeResult, data.split(','));\n break;\n case 'AK':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processAK(decodeResult, data.split(','));\n break;\n case 'CG':\n processCenterOfGravity(decodeResult, data.split(','));\n break;\n case 'DC':\n processDateCode(decodeResult, data.split(','));\n break;\n case 'DI':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processDI(decodeResult, data.split(','));\n break;\n case 'DT': //processDestination?\n processDT(decodeResult, data.split(','));\n break;\n case 'DQ':\n ResultFormatter.desiredAltitude(\n decodeResult,\n parseInt(data, 10) * 100,\n );\n // processDQ(decodeResult, data.split(','));\n break;\n case 'ET':\n processETA(data, decodeResult, fields, i);\n break;\n case 'FB':\n ResultFormatter.currentFuel(decodeResult, parseInt(data, 10));\n break;\n case 'FN':\n decodeResult.raw.flight_number = data;\n break;\n case 'FX':\n ResultFormatter.text(decodeResult, data);\n break;\n case 'GA':\n ResultFormatter.groundAddress(decodeResult, data);\n break;\n case 'ID':\n processIdentification(decodeResult, data.split(','));\n break;\n case 'LR':\n processLandingReport(decodeResult, data.split(','));\n break;\n case 'MR':\n processMessageReference(decodeResult, data.split(','));\n break;\n case 'PR':\n processPerformanceData(decodeResult, data.split(','));\n break;\n //case 'PR':\n // TODO: decode /PR fields\n // ResultFormatter.unknown(decodeResult, fields[i], '/');\n // break;\n case 'PS': // Position\n Arinc702Helper.processPS(decodeResult, data.split(','));\n break;\n case 'RF':\n case 'RI':\n case 'RM':\n case 'RP':\n case 'RS':\n // TODO - use key/data instead of whole message\n FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n break;\n case 'RN':\n ResultFormatter.routeNumber(decodeResult, data);\n break;\n case 'RW':\n processRunway(decodeResult, data.split(':'));\n break;\n case 'SM':\n processSummary(decodeResult, data.split(','));\n break;\n case 'SN':\n decodeResult.raw.serial_number = data;\n break;\n case 'SP':\n ResultFormatter.startPoint(decodeResult, data);\n break;\n case 'TD':\n processTimeOfDeparture(decodeResult, data.split(','));\n break;\n case 'TR':\n processTR(decodeResult, data.split(','));\n break;\n case 'TS':\n Arinc702Helper.processTimeStamp(decodeResult, data.split(','));\n break;\n case 'VR':\n ResultFormatter.version(decodeResult, parseInt(data, 10) / 10);\n break;\n case 'WD':\n processWindData(decodeResult, data);\n break;\n case 'WQ':\n processWeatherQuery(decodeResult, data.split(':'));\n break;\n default:\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n }\n\n ResultFormatter.checksumAlgorithm(decodeResult, checksumAlgorithmUsed);\n ResultFormatter.checksum(decodeResult, checksum);\n\n return true;\n }\n\n public static processPS(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length === 9) {\n // variant 7\n processRoute(decodeResult, data[3], data[1], data[5], data[4], undefined);\n ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);\n ResultFormatter.temperature(decodeResult, data[6]);\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n }\n if (data.length === 14) {\n // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n }\n\n public static processPosition(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length >= 10) {\n // variant 1, short\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n }\n if (data.length >= 14) {\n // variant 2,long\n ResultFormatter.unknownArr(decodeResult, data.slice(10));\n }\n }\n\n public static processTimeStamp(decodeResult: DecodeResult, data: string[]) {\n if (data.length > 2) {\n const positionData = data.slice(1);\n positionData[0] = positionData[0].substring(6); // strip time from position field\n this.processPosition(decodeResult, positionData);\n }\n let time = DateTimeUtils.convertDateTimeToEpoch(\n data[0],\n data[1].substring(0, 6),\n );\n\n if (Number.isNaN(time)) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[1].substring(2, 4) +\n data[1].substring(0, 2) +\n data[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);\n }\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processETA(\n data: string,\n decodeResult: DecodeResult,\n fields: string[],\n i: number,\n) {\n if (data.length === 5) {\n // 1 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(1)),\n );\n } else if (data.length === 6) {\n // 2 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(2)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n}\n\nfunction processAirField(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n ResultFormatter.departureAirport(decodeResult, data[0]);\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), 'AF/');\n }\n}\nfunction processTimeOfDeparture(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n decodeResult.raw.planned_departure_time = data[0]; //DDHHMM - TODO: make int\n decodeResult.formatted.items.push({\n type: 'ptd',\n code: 'ptd',\n label: 'Planned Departure Time',\n value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`,\n });\n\n decodeResult.raw.estimated_departure_time = data[1]; //HHMM - TODO: make int\n decodeResult.formatted.items.push({\n type: 'etd',\n code: 'etd',\n label: 'Estimated Departure Time',\n value: `${data[1].substring(0, 2)}:${data[1].substring(2)}`,\n });\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), '/TD');\n }\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0]);\n if (data.length > 1) {\n ResultFormatter.flightNumber(decodeResult, data[1]);\n }\n if (data.length > 2) {\n //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 9) {\n ResultFormatter.unknown(decodeResult, data[0]);\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[2]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[3], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4]),\n );\n ResultFormatter.unknown(decodeResult, data[5]);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(data[6]),\n );\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n return;\n }\n if (data.length === 4 || data.length === 5) {\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[1]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[2], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[3]),\n );\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n return;\n }\n ResultFormatter.unknownArr(decodeResult, data, ',');\n}\n\nfunction processLandingReport(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 19) {\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.arrivalRunway(decodeResult, data[5]);\n ResultFormatter.unknown(decodeResult, data.slice(6, 19).join(','));\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\n// trajectory? track?\n// ?,?,?,?,?,off-HHMMSS,?,?,?,?,?,dep,arr,dep_rw,?,?,flight_number,?,?,?,?\nfunction processTR(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 21) {\n ResultFormatter.unknownArr(decodeResult, data, ',');\n return;\n }\n ResultFormatter.unknownArr(decodeResult, data.slice(0, 5), ',');\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 11), ',');\n ResultFormatter.departureAirport(decodeResult, data[11]);\n ResultFormatter.arrivalAirport(decodeResult, data[12]);\n ResultFormatter.departureRunway(decodeResult, data[13]);\n ResultFormatter.unknownArr(decodeResult, data.slice(14, 16), ',');\n ResultFormatter.flightNumber(decodeResult, data[16]);\n ResultFormatter.unknownArr(decodeResult, data.slice(17), ',');\n}\n\nfunction processCenterOfGravity(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10);\n }\n } else if (data.length === 3) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center');\n }\n if (data[1] !== undefined && data[1] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower');\n }\n if (data[2] !== undefined && data[2] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper');\n }\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction parseMessageType(\n decodeResult: DecodeResult,\n messagePart: string,\n): boolean {\n const messageParts = messagePart.split(',');\n const messageType = messageParts[0];\n if (messageType.startsWith('POS')) {\n Arinc702Helper.processPosition(\n decodeResult,\n messagePart.substring(3).split(','),\n );\n return processIMI(decodeResult, 'POS');\n } else if (messageType.length === 6) {\n const part1 = processIMI(decodeResult, messageType.substring(0, 3));\n const description = decodeResult.formatted.description;\n const part2 = processIMI(decodeResult, messageType.substring(3, 6));\n decodeResult.formatted.description =\n description + ' for ' + decodeResult.formatted.description;\n if (messageParts.length > 1) {\n // TODO handle REJPWI/REJPOS\n ResultFormatter.unknown(\n decodeResult,\n messageParts.slice(1).join(','),\n '/',\n );\n }\n return part1 && part2;\n }\n\n if (messageParts.length > 1) {\n // TODO handle\n ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(','), '/');\n }\n\n return processIMI(decodeResult, messageType);\n}\n\n/**\n * Processes the Imbedded Message Identifier (IMI)\n * which indicates the type of message and is used to determine what the message type is\n * @param decodeResult\n * @param type\n * @returns\n */\nfunction processIMI(decodeResult: DecodeResult, type: string): boolean {\n if (type === 'FPN') {\n decodeResult.formatted.description = 'Flight Plan';\n } else if (type === 'FTX') {\n decodeResult.formatted.description = 'Free Text';\n } else if (type === 'INI') {\n decodeResult.formatted.description = 'Initial Report';\n } else if (type === 'INR') {\n decodeResult.formatted.description = 'In-Range Report';\n } else if (type === 'LDI') {\n decodeResult.formatted.description = 'Load Distribution Information';\n } else if (type === 'PER') {\n decodeResult.formatted.description = 'Performance Report';\n } else if (type === 'PRF') {\n decodeResult.formatted.description = 'Profile Report';\n } else if (type === 'POS') {\n decodeResult.formatted.description = 'Position Report';\n } else if (type === 'PRG') {\n decodeResult.formatted.description = 'Progress Report';\n } else if (type === 'PWI') {\n decodeResult.formatted.description = 'Pilot Weather Information';\n } else if (type === 'WXR') {\n decodeResult.formatted.description = 'Weather Report';\n } else if (type === 'REJ') {\n decodeResult.formatted.description = 'Reject';\n } else if (type === 'REQ') {\n decodeResult.formatted.description = 'Request';\n } else if (type === 'RES') {\n decodeResult.formatted.description = 'Response';\n } else if (type === 'SUM') {\n decodeResult.formatted.description = 'Summary Report';\n } else {\n decodeResult.formatted.description = 'Unknown H1 Message';\n return false;\n }\n return true;\n}\n\nfunction processPerformanceData(decodeResult: DecodeResult, data: string[]) {\n // /PR fields contain performance data\n // Known field positions (12-field short variant and 18-field long variant):\n // [0]: ground speed (knots * 10 or similar)\n // [1]: indicated airspeed or mach-related\n // [2]: altitude in hundreds of feet\n // [3]: fuel-related value\n // [4]: unknown (often empty)\n // [5]: fuel flow or consumption\n // [6]: fuel-related\n // [7]: wind data (DDDSSSS format) or empty\n // [8]: temperature (M=minus, P=plus)\n // [9]: heading or unknown\n\n if (data.length < 3) {\n ResultFormatter.unknownArr(decodeResult, data, ',');\n return;\n }\n\n // Field 2: altitude in hundreds\n if (data[2] !== undefined && data[2] !== '') {\n const alt = Number(data[2]) * 100;\n if (!isNaN(alt) && alt > 0) {\n ResultFormatter.altitude(decodeResult, alt);\n }\n }\n\n // Field 8: temperature (if present)\n if (data.length > 8 && data[8] !== undefined && data[8] !== '') {\n ResultFormatter.temperature(decodeResult, data[8]);\n }\n\n // Collect remaining undecoded fields\n const remaining: string[] = [];\n for (let i = 0; i < data.length; i++) {\n if (\n i === 2 &&\n data[i] !== '' &&\n !isNaN(Number(data[i])) &&\n Number(data[i]) * 100 > 0\n ) {\n continue; // altitude - already decoded\n }\n if (\n i === 8 &&\n data[i] !== '' &&\n (data[i].startsWith('M') ||\n data[i].startsWith('P') ||\n !isNaN(Number(data[i])))\n ) {\n continue; // temperature - already decoded\n }\n remaining.push(data[i]);\n }\n if (remaining.length > 0 && remaining.some((r) => r !== '')) {\n ResultFormatter.unknown(decodeResult, remaining.join(','), '/PR');\n }\n}\n\nfunction processDateCode(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n // noop?\n } else if (data.length === 2) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[0].substring(2, 4) +\n data[0].substring(0, 2) +\n data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processWeatherQuery(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(':'), 'WQ/');\n return;\n }\n\n const alts = data[0].split('.');\n const route = data[1].split('.');\n\n ResultFormatter.requestedAltitudes(\n decodeResult,\n alts.map((a) => parseInt(a, 10) * 100),\n );\n\n const waypoints = route.map((wp) => {\n return { name: wp };\n });\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processRoute(\n decodeResult: DecodeResult,\n last: string,\n time: string,\n next: string,\n eta: string,\n then?: string,\n date?: string,\n) {\n const lastTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(time, date)\n : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(eta, date)\n : DateTimeUtils.convertHHMMSSToTod(eta);\n\n const lastWaypoint = RouteUtils.getWaypoint(last);\n lastWaypoint.time = lastTime;\n\n const nextWaypoint = RouteUtils.getWaypoint(next);\n nextWaypoint.time = nextTime;\n\n const thenWaypoint = RouteUtils.getWaypoint(then || '?');\n\n const waypoints: Waypoint[] = [lastWaypoint, nextWaypoint, thenWaypoint];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processWindData(decodeResult: DecodeResult, message: string) {\n const wind = [] as Wind[];\n\n const flightLevel = Number(message.slice(0, 3));\n const fields = message.slice(4).split('.'); // strip off altitude and comma\n fields.forEach((field) => {\n if (field.length < 4) {\n // probably need a more robust check to determine to skip\n return;\n }\n const data = field.split(',');\n const waypoint = { name: data[0] };\n const windData = data[1];\n const windDirection = parseInt(windData.slice(0, 3), 10);\n const windSpeed = parseInt(windData.slice(3), 10);\n\n if (data.length === 3) {\n const tempData = data[2];\n const tempFlightLevel = Number(tempData.slice(0, 3));\n const tempString = tempData.slice(3);\n const tempDegrees =\n Number(tempString.substring(1)) *\n (tempString.charAt(0) === 'M' ? -1 : 1);\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: tempFlightLevel,\n degreesC: tempDegrees,\n },\n });\n } else {\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n });\n }\n });\n\n ResultFormatter.windData(decodeResult, wind);\n}\n\nfunction processRunway(decodeResult: DecodeResult, data: string[]) {\n //FIXME - figure out names\n const parts = data[0].split('.');\n const more = parts[0].split(',');\n\n ResultFormatter.departureRunway(decodeResult, more[0]);\n ResultFormatter.unknownArr(decodeResult, more.slice(1), ',');\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), '.');\n ResultFormatter.departureAirport(decodeResult, data[1].split(',')[0]);\n ResultFormatter.unknownArr(decodeResult, data[1].split(',').slice(1), ',');\n //ResultFormatter.unknownArr(decodeResult, data.slice(2), ':');\n}\nfunction processSummary(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 11) {\n return ResultFormatter.unknown(decodeResult, data.join(','), 'SM/');\n }\n\n ResultFormatter.engineStart(\n decodeResult,\n DateTimeUtils.convertDayTimeToTod(data[0]),\n );\n ResultFormatter.startFuel(decodeResult, 100 * parseInt(data[1], 10));\n ResultFormatter.engineStop(\n decodeResult,\n DateTimeUtils.convertDayTimeToTod(data[2]),\n );\n ResultFormatter.out(decodeResult, DateTimeUtils.convertDayTimeToTod(data[3]));\n ResultFormatter.outFuel(decodeResult, 100 * parseInt(data[4], 10));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertDayTimeToTod(data[5]));\n ResultFormatter.offFuel(decodeResult, 100 * parseInt(data[6], 10));\n ResultFormatter.on(decodeResult, DateTimeUtils.convertDayTimeToTod(data[7]));\n ResultFormatter.onFuel(decodeResult, 100 * parseInt(data[8], 10));\n ResultFormatter.in(decodeResult, DateTimeUtils.convertDayTimeToTod(data[9]));\n ResultFormatter.inFuel(decodeResult, 100 * parseInt(data[10], 10));\n}\n\n// CRC-16/IBM-SDLC but nibbles are reversed\nfunction crc16IbmSdlcRev(data: string): number {\n let crc = 0xffff;\n const bytes = asciiStringToBytes(data);\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x0001) !== 0) {\n crc = (crc >>> 1) ^ 0x8408;\n } else {\n crc = crc >>> 1;\n }\n }\n }\n crc = (crc ^ 0xffff) & 0xffff;\n\n const nibble1 = (crc >> 12) & 0xf;\n const nibble2 = (crc >> 8) & 0xf;\n const nibble3 = (crc >> 4) & 0xf;\n const nibble4 = crc & 0xf;\n\n return (nibble4 << 12) | (nibble3 << 8) | (nibble2 << 4) | nibble1;\n}\n\n/**\n * Calculates the CRC-16/GENIBUS checksum for a given Uint8Array.\n * @param data The input data as a byte array.\n * @returns The 16-bit checksum as a number.\n */\nfunction crc16Genibus(data: string): number {\n let crc = 0xffff;\n const polynomial = 0x1021;\n\n const bytes = asciiStringToBytes(data);\n\n for (const byte of bytes) {\n crc ^= byte << 8;\n\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x8000) !== 0) {\n crc = ((crc << 1) ^ polynomial) & 0xffff;\n } else {\n crc = (crc << 1) & 0xffff;\n }\n }\n }\n\n return (crc ^ 0xffff) & 0xffff;\n}\nfunction processMessageReference(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(','), '/MR');\n return;\n }\n\n ResultFormatter.sequenceNumber(decodeResult, parseInt(data[0], 10));\n if (data[1] !== '') {\n ResultFormatter.sequenceResponse(decodeResult, parseInt(data[1], 10));\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Arinc702Helper } from '../utils/arinc_702_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Hoisted to module scope so the wildcard decode() doesn't recompile the\n// pattern for every incoming message.\nconst NEWLINE_REGEX = /[\\n\\r]/g;\n\n// TODO: come up with a better name as this decodes multiple labels\nexport class Arinc702 extends DecoderPlugin {\n name = 'arinc-702';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(NEWLINE_REGEX, '');\n\n // try to decode the entire message\n let decoded = false;\n decoded = Arinc702Helper.decodeH1Message(decodeResult, msg);\n if (decoded) {\n return this.processDecodeResult(decodeResult, decoded, options, message);\n }\n\n // try to handle messages like `/HDQDLUA.POS<rest of message>`\n if (msg.startsWith('/')) {\n const headerData = msg.split('.');\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n headerData.slice(1).join('.'),\n );\n\n if (decoded) {\n decodeResult.remaining.text =\n headerData[0] + '.' + decodeResult.remaining.text;\n return this.processDecodeResult(\n decodeResult,\n decoded,\n options,\n message,\n );\n }\n }\n\n // try to handle messages like `F37AMCLL93#M1BPOS<rest of message>`\n const hashParts = msg.split('#');\n if (hashParts.length == 2) {\n // need a better way to figure this out\n const offset = isNaN(parseInt(hashParts[1][1])) ? 3 : 4;\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n msg.slice(hashParts[0].length + offset),\n );\n if (decoded && hashParts[0].length > 0) {\n // ResultFormatter.unknown(decodeResult, hashParts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, hashParts[0].substring(4));\n //ResultFormatter.unknown(decodeResult, hashParts[1].length == 5 ? hashParts[1].substring(0, 2) : hashParts[1].substring(0, 3), '#');\n // hack of the highest degree as we've parsed the rest of the message already but we want the remaining text to be in order\n decodeResult.remaining.text =\n hashParts[0].substring(0, 4) +\n '#' +\n hashParts[1].substring(0, offset - 1) +\n '/' +\n decodeResult.remaining.text;\n }\n if (decoded) {\n return this.processDecodeResult(\n decodeResult,\n decoded,\n options,\n message,\n );\n }\n }\n\n // try to handle messages like `M74AMC4086FTX<rest of message>`\n const slashParts = msg.split('/');\n if (slashParts[0].length > 3) {\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n msg.slice(slashParts[0].length - 3),\n );\n // flight number is already decoded in other fields\n decodeResult.remaining.text =\n slashParts[0].slice(0, 3) + '/' + decodeResult.remaining.text;\n }\n\n return this.processDecodeResult(decodeResult, decoded, options, message);\n }\n\n private processDecodeResult(\n decodeResult: DecodeResult,\n decoded: boolean,\n options: Options,\n message: Message,\n ) {\n decodeResult.decoded = decoded;\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","export function formatAcarsFreeText(text?: string | null): string {\n if (!text) return '';\n return text.trim().replace(/\\s+/g, ' ');\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { formatAcarsFreeText } from '../utils/acars_free_text';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z_Slash extends DecoderPlugin {\n name = 'label-5z-slash';\n\n descriptions: Record<string, string> = {\n B1: 'Request Weight and Balance',\n B3: 'Request Departure Clearance',\n CD: 'Weight and Balance',\n CG: 'Request Pre-departure clearance, PDC',\n CM: 'Crew Scheduling',\n C3: 'Off Message',\n C4: 'Flight Dispatch',\n C5: 'Maintenance Message',\n C6: 'Customer Service',\n 10: 'PIREP',\n C11: 'International PIREP',\n DS: 'Late Message',\n D3: 'Holding Pattern Message',\n D6: 'From-To + Date',\n D7: 'From-To + Alternate + Time',\n EO: 'In Range',\n ET: 'Expected Time',\n PW: 'Position Weather',\n RL: 'Request Release',\n R3: 'Request HOWGOZIT Message',\n R4: 'Request the Latest POSBD',\n TC: 'From-To Fuel',\n WB: 'From-To',\n W1: 'Request Weather for City',\n };\n\n qualifiers() {\n return {\n labels: ['5Z'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const lines = message.text.split('\\r\\n');\n if (lines[0] === '/TXT') {\n // not UA, but starts with `/`\n ResultFormatter.text(\n decodeResult,\n formatAcarsFreeText(lines.slice(1).join('\\r\\n')),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n const data = lines[0].split('/');\n const header = data[1].split(' '); //data[0] is blank\n const type = header[0];\n const typeDescription = this.descriptions[type];\n\n if (typeDescription) {\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: 'airline',\n code: 'AIRLINE',\n label: 'Airline',\n value: 'United Airlines',\n });\n decodeResult.raw.message_type = type;\n decodeResult.formatted.items.push({\n type: 'message_type',\n code: 'MSG_TYPE',\n label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3' && data[1] === 'B3 TO DATA REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));\n ResultFormatter.unknownArr(decodeResult, data.slice(3), '/');\n } else if (type === 'B3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n decodeResult.raw.day = Number(header[2]);\n ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));\n if (header.length > 4) {\n ResultFormatter.unknownArr(decodeResult, header.slice(4), '/');\n }\n } else if (type === 'C3' && data[1] === 'C3 GATE REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.unknownArr(decodeResult, info.slice(5), ' ');\n } else if (type === 'C3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n } else if (type === 'ET') {\n const airports = data[2].split(' ');\n // aiports[0] is blank\n ResultFormatter.departureAirport(decodeResult, airports[1]);\n ResultFormatter.arrivalAirport(decodeResult, airports[2]);\n decodeResult.raw.day = Number(airports[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(airports[4]),\n );\n\n const estimates = data[3].split(' ');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(estimates[1]),\n );\n ResultFormatter.unknown(decodeResult, estimates[2]);\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${message.text}`);\n }\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_LDR extends DecoderPlugin {\n name = 'label-10-ldr';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['LDR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[5];\n const lon = parts[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim()),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim()),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.departureAirport(decodeResult, parts[9]);\n ResultFormatter.arrivalAirport(decodeResult, parts[10]);\n ResultFormatter.alternateAirport(decodeResult, parts[11]);\n ResultFormatter.arrivalRunway(decodeResult, parts[12].split('/')[0]); // TODO: find out if anything comes after `/` sometimes\n const altRwy = [parts[13].split('/')[0], parts[14].split('/')[0]]\n .filter((r) => r != '')\n .join(',');\n if (altRwy != '') {\n ResultFormatter.alternateRunway(decodeResult, altRwy); // TODO: find out if anything comes after `/` sometimes\n }\n ResultFormatter.unknownArr(decodeResult, [\n ...parts.slice(0, 5),\n ...parts.slice(15),\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_POS extends DecoderPlugin {\n name = 'label-10-pos';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const parts = message.text.split(',');\n if (parts.length !== 12) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n //const time = parts[0].substring(3); //DDHHMM\n const lat = parts[1].trim();\n const lon = parts[2].trim();\n const position = {\n latitude:\n ((lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())) / 100,\n longitude:\n ((lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim())) / 100,\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.unknownArr(decodeResult, [\n parts[0],\n ...parts.slice(3, 7),\n ...parts.slice(8),\n ]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_Slash extends DecoderPlugin {\n name = 'label-10-slash';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[1];\n const lon = parts[2];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.heading(decodeResult, Number(parts[5]));\n ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[8]),\n );\n const waypoints: Waypoint[] = [\n {\n name: parts[11],\n },\n {\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]),\n },\n {\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]),\n },\n ];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n\n if (parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n ResultFormatter.unknownArr(\n decodeResult,\n [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],\n '/',\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 12 N : results');\n console.log(results);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n });\n\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n results.groups.unkwn3,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_12_POS extends DecoderPlugin {\n name = 'label-12-pos';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const data = message.text.substring(3).split(',');\n if (!message.text.startsWith('POS') || data.length !== 12) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const lat = data[0].substring(0, 8);\n const lon = data[0].substring(8);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lat.substring(1, 4)),\n Number(lat.substring(4, 6)),\n Number(lat.substring(6, 8)),\n ),\n longitude:\n CoordinateUtils.getDirection(lon[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lon.substring(1, 4)),\n Number(lon.substring(4, 6)),\n Number(lon.substring(6, 8)),\n ),\n });\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));\n ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));\n ResultFormatter.currentFuel(\n decodeResult,\n Number(data[7].substring(3).trim()),\n ); // strip FOB\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()),\n ); // strip ETA\n ResultFormatter.departureAirport(decodeResult, data[9]);\n ResultFormatter.arrivalAirport(decodeResult, data[10]);\n ResultFormatter.unknown(decodeResult, data[11]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_13Through18_Slash extends DecoderPlugin {\n name = 'label-13-18-slash';\n\n qualifiers() {\n return {\n labels: ['13', '14', '15', '16', '17', '18'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n const parts = lines[0].split('/');\n const labelNumber = Number(parts[1].substring(0, 2));\n decodeResult.formatted.description = getMsgType(labelNumber);\n\n // labels 13-17 have 4 parts, label 18 has 7 parts\n if (\n (labelNumber !== 18 && parts.length !== 4) ||\n (labelNumber === 18 && parts.length !== 7)\n ) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // parts[0] === ''\n const data = parts[2].split(' ');\n ResultFormatter.departureAirport(decodeResult, data[1]);\n ResultFormatter.arrivalAirport(decodeResult, data[2]);\n decodeResult.raw.day = Number(data[3]);\n const time = DateTimeUtils.convertHHMMSSToTod(data[4]);\n if (labelNumber === 13) {\n ResultFormatter.out(decodeResult, time);\n } else if (labelNumber === 14) {\n ResultFormatter.off(decodeResult, time);\n } else if (labelNumber === 15) {\n ResultFormatter.on(decodeResult, time);\n } else if (labelNumber === 16) {\n ResultFormatter.in(decodeResult, time);\n }\n\n if (parts.length === 7) {\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), '/');\n }\n\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].startsWith('/LOC')) {\n const location = lines[i].substring(5).split(','); // strip off '/LOC'\n let position;\n if (location[0].startsWith('+') || location[0].startsWith('-')) {\n position = {\n latitude: Number(location[0]),\n longitude: Number(location[1]),\n };\n } else {\n position = {\n latitude:\n CoordinateUtils.getDirection(location[0][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[0].substring(1, 3)),\n Number(location[0].substring(3, 5)),\n Number(location[0].substring(5, 7)),\n ),\n longitude:\n CoordinateUtils.getDirection(location[1][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[1].substring(1, 4)),\n Number(location[1].substring(4, 6)),\n Number(location[1].substring(6, 8)),\n ),\n };\n }\n ResultFormatter.position(decodeResult, position);\n } else {\n ResultFormatter.unknown(decodeResult, lines[i], '\\r\\n');\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n return decodeResult;\n }\n}\n\nfunction getMsgType(labelNumber: number): string {\n if (labelNumber === 13) {\n return 'Out of Gate Report';\n }\n if (labelNumber === 14) {\n return 'Takeoff Report';\n }\n if (labelNumber === 15) {\n return 'On Ground Report';\n }\n if (labelNumber === 16) {\n return 'In Gate Report';\n }\n if (labelNumber === 17) {\n return 'Post Report';\n }\n if (labelNumber === 18) {\n return 'Post Times Report';\n }\n\n return 'Unknown';\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-15';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n if (message.text.startsWith('(2') && message.text.endsWith('(Z')) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(0, 13),\n ),\n );\n if (between.length === 25) {\n // short variant\n ResultFormatter.unknown(decodeResult, between.substring(13, 19));\n const alt = between.substring(19, 22);\n if (alt != '---') {\n ResultFormatter.altitude(decodeResult, 100 * Number(alt));\n }\n ResultFormatter.temperature(\n decodeResult,\n between.substring(22).replaceAll(' ', '0'),\n );\n } else if (between.substring(13, 16) === 'OFF') {\n // off variant\n const ddmmyy = between.substring(16, 22);\n const hhmm = between.substring(22, 26);\n if (ddmmyy != '------') {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(hhmm + '00', ddmmyy),\n );\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmm),\n );\n }\n ResultFormatter.unknown(decodeResult, between.substring(26));\n } else {\n ResultFormatter.unknown(decodeResult, between.substring(26));\n }\n } else {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const parts = message.text.split(' ');\n // FST01KMCOEGKKN505552W00118021\n const header = parts[0];\n\n const stringCoords = header.substring(13);\n // Don't use decodeStringCoordinates here, because of different pos format\n\n const firstChar = stringCoords.substring(0, 1);\n const middleChar = stringCoords.substring(7, 8);\n decodeResult.raw.position = {};\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n const lat =\n (Number(stringCoords.substring(1, 7)) / 10000) *\n (firstChar === 'S' ? -1 : 1);\n const lon =\n (Number(stringCoords.substring(8, 15)) / 10000) *\n (middleChar === 'W' ? -1 : 1);\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n ResultFormatter.altitude(\n decodeResult,\n Number(stringCoords.substring(15)) * 100,\n );\n } else {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), ' ');\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_AUTPOS extends DecoderPlugin {\n name = 'label-16-autpos';\n qualifiers() {\n return {\n labels: ['16'],\n preambles: [''],\n };\n }\n\n decode(message: Message): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n // Regex to match the AUTPOS message\n const regex =\n /^(\\d{6})\\/AUTPOS\\/LLD (N|S)(\\d{2})(\\d{2})(\\d{2}) (E|W)(\\d{3})(\\d{2})(\\d{2})\\s*\\r?\\n\\/ALT (\\d+)\\/SAT ([*\\-\\d]{4})\\r?\\n\\/WND ([*\\d]{3})([\\*\\d]{3})\\/TAT ([*\\-\\d]{4})\\/TAS ([*\\d]{3,4})\\/CRZ ([*\\d]{3,4})\\r?\\n\\/FOB (\\d{6})\\r?\\n\\/DAT (\\d{6})\\/TIM (\\d{6})/;\n const match = regex.exec(message.text);\n if (!match) {\n decodeResult.decoded = false;\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.formatted.description = 'Position Report';\n\n // Extract fields\n const [\n ,\n flight,\n latHem,\n latDeg,\n latMin,\n latSec,\n lonHem,\n lonDeg,\n lonMin,\n lonSec,\n altitude,\n sat,\n windDir,\n windSpd,\n tat,\n tas,\n crz,\n fob,\n dat,\n tim,\n ] = match;\n\n ResultFormatter.day(decodeResult, parseInt(flight.slice(0, 2), 10));\n ResultFormatter.flightNumber(decodeResult, flight.slice(2));\n let latitude = CoordinateUtils.dmsToDecimalDegrees(\n parseInt(latDeg, 10),\n parseInt(latMin, 10),\n parseInt(latSec, 10),\n );\n if (latHem === 'S') latitude = -latitude;\n let longitude = CoordinateUtils.dmsToDecimalDegrees(\n parseInt(lonDeg, 10),\n parseInt(lonMin, 10),\n parseInt(lonSec, 10),\n );\n if (lonHem === 'W') longitude = -longitude;\n ResultFormatter.position(decodeResult, {\n latitude,\n longitude,\n });\n const alt = parseInt(altitude, 10);\n ResultFormatter.altitude(decodeResult, alt);\n\n // Parse wind\n if (!windSpd.includes('*') && !windDir.includes('*')) {\n ResultFormatter.windData(decodeResult, [\n {\n waypoint: {\n name: 'POSITION',\n },\n flightLevel: Math.round(alt / 100),\n windDirection: parseInt(windDir, 10),\n windSpeed: parseInt(windSpd, 10),\n },\n ]);\n }\n\n if (!tat.includes('*')) {\n ResultFormatter.totalAirTemp(decodeResult, tat);\n }\n if (!tas.includes('*')) {\n ResultFormatter.airspeed(decodeResult, parseInt(tas, 10));\n }\n if (!sat.includes('*')) {\n ResultFormatter.temperature(decodeResult, sat);\n }\n if (!crz.includes('*')) {\n ResultFormatter.mach(decodeResult, parseInt(crz, 10) / 1000);\n }\n\n if (!fob.includes('*')) {\n ResultFormatter.currentFuel(decodeResult, parseInt(fob, 10));\n }\n\n if (!dat.includes('*') && !tim.includes('*')) {\n const yy = dat.slice(0, 2);\n const mm = dat.slice(2, 4);\n const dd = dat.slice(4, 6);\n const ddmmyy = `${dd}${mm}${yy}`;\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(tim, ddmmyy),\n );\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Honeywell Label 16 Position Report\nexport class Label_16_Honeywell extends DecoderPlugin {\n name = 'label-16-honeywell';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (\n message.text.startsWith('(2') &&\n message.text.endsWith('(Z') &&\n message.text.length >= 29\n ) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.unknown(decodeResult, between.substring(0, 4), ''); // Session ID\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(4, 17),\n ),\n );\n if (between.charAt(17) === '-') {\n // Waypoint mode\n const waypoint1 = between.substring(18, 23).trim();\n const waypoint2 = between.substring(23, 28).trim();\n if (waypoint2) {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }, { name: waypoint2 }],\n });\n } else {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }],\n });\n }\n } else {\n // Route mode\n ResultFormatter.departureAirport(\n decodeResult,\n between.substring(17, 21),\n );\n ResultFormatter.arrivalAirport(decodeResult, between.substring(21, 25));\n //ignore the rest (should just be '-')\n }\n /*\n const phases: { [key: string]: string } = {\n '/O': 'En Route',\n '/A': 'Arrival',\n '/D': 'Departure',\n '/P': 'Preflight',\n '/C': 'Climb',\n };\n */\n ResultFormatter.unknown(\n decodeResult,\n between.substring(between.length - 2),\n '',\n );\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 Honeywell message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: N 44.203,W 86.546,31965,6, 290\n let variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*)$/;\n\n // Style: N 28.177/W 96.055\n let variant2Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n\n ResultFormatter.position(decodeResult, pos);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n\n results = message.text.match(variant2Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n\n ResultFormatter.position(decodeResult, pos);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_POSA1 extends DecoderPlugin {\n name = 'label-16-posa1';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['POSA1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const fields = message.text.split(',');\n if (fields.length !== 11 || !fields[0].startsWith('POSA1')) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(5)),\n ); // strip 'POSA1'\n const waypoint = fields[1].trim();\n const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);\n const nextWaypoint = fields[4].trim();\n const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(6), ',');\n ResultFormatter.route(decodeResult, {\n waypoints: [\n { name: waypoint, time: time },\n { name: nextWaypoint, time: nextTime },\n ],\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_TOD extends DecoderPlugin {\n name = 'label-16-tod';\n\n qualifiers() {\n return {\n labels: ['16'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n const time = DateTimeUtils.convertHHMMSSToTod(fields[0]);\n if (fields.length !== 5 || Number.isNaN(time)) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.timestamp(decodeResult, time);\n if (fields[1] !== '') {\n ResultFormatter.altitude(decodeResult, Number(fields[1]));\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n const temp = fields[4].split('/');\n const posFields = temp[0].split(' ');\n if (posFields.length === 4) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(posFields[0]) * Number(posFields[1]),\n longitude:\n CoordinateUtils.getDirection(posFields[2]) * Number(posFields[3]),\n });\n } else if (posFields.length === 2) {\n ResultFormatter.position(decodeResult, {\n latitude:\n (CoordinateUtils.getDirection(posFields[0][0]) *\n Number(posFields[0].slice(1))) /\n 100,\n longitude:\n (CoordinateUtils.getDirection(posFields[1][0]) *\n Number(posFields[1].slice(1))) /\n 100,\n });\n } else {\n // Redacted\n //ResultFormatter.unknown(decodeResult, fields[4]);\n }\n\n if (temp.length > 1) {\n ResultFormatter.flightNumber(decodeResult, temp[1]);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() {\n return {\n labels: ['1M'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 1M ETA: results');\n console.log(results);\n }\n\n decodeResult.raw.flight_number = results[0];\n // results[1]: ETA01 (???)\n // results[2]: 230822 - UTC date of eta\n ResultFormatter.departureAirport(decodeResult, results[3]);\n ResultFormatter.arrivalAirport(decodeResult, results[4]);\n ResultFormatter.alternateAirport(decodeResult, results[5]);\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n ResultFormatter.arrivalRunway(\n decodeResult,\n results[8].replace(results[4], ''),\n ); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n const yymmdd = results[2];\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(\n results[7] + '00',\n yymmdd.substring(4, 6) +\n yymmdd.substring(2, 4) +\n yymmdd.substring(0, 2),\n ),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_3Line extends DecoderPlugin {\n name = 'label-1l-3-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n if (lines.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n const parts = message.text.replaceAll('\\r\\n', '/').split('/');\n const data = new Map<string, string>();\n data.set('', parts[0]);\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const dep = data.get('DEP');\n if (dep) {\n ResultFormatter.departureAirport(decodeResult, dep);\n data.delete('DEP');\n }\n const des = data.get('DES');\n if (des) {\n ResultFormatter.arrivalAirport(decodeResult, des);\n data.delete('DES');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fn = data.get('FN');\n if (fn) {\n ResultFormatter.flightNumber(decodeResult, fn);\n data.delete('FN');\n }\n const day = data.get('DAY');\n const utc = data.get('UTC');\n if (day && utc) {\n decodeResult.raw.message_timestamp =\n Date.parse(day + ' GMT+0000') / 1000 +\n DateTimeUtils.convertHHMMSSToTod(utc);\n data.delete('DAY');\n data.delete('UTC');\n }\n\n const lat = data.get('LAT');\n const lon = data.get('LON');\n if (lat && lon) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n data.delete('LAT');\n data.delete('LON');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n if (key === '') {\n remaining += value;\n } else {\n remaining += `/${key} ${value}`;\n }\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_070 extends DecoderPlugin {\n name = 'label-1l-070';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000070'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000070')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, parts[0]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(parts[4][0]) *\n Number(parts[4].substring(1)),\n longitude:\n CoordinateUtils.getDirection(parts[5][0]) *\n Number(parts[5].substring(1)),\n });\n\n decodeResult.remaining.text = parts[6];\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_660 extends DecoderPlugin {\n name = 'label-1l-660';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000660'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000660')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 5) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n parts[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n const hhmmss = parts[1].substring(0, 6);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmmss),\n );\n const fl = parts[1].substring(6, 9);\n ResultFormatter.altitude(decodeResult, Number(fl) * 100);\n const next = parts[1].substring(9);\n ResultFormatter.route(decodeResult, { waypoints: [{ name: next.trim() }] });\n\n decodeResult.remaining.text = parts.slice(2).join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_Slash extends DecoderPlugin {\n name = 'label-1l-1-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['+', '-'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const data = new Map<string, string>();\n data.set('LAT', parts[0].replaceAll(' ', ''));\n data.set('LON', parts[1].replaceAll(' ', ''));\n for (let i = 2; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const position = {\n latitude: Number(data.get('LAT')),\n longitude: Number(data.get('LON')),\n };\n data.delete('LAT');\n data.delete('LON');\n\n ResultFormatter.position(decodeResult, position);\n const utc = data.get('UTC');\n if (utc) {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(utc),\n );\n data.delete('UTC');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fob = data.get('FOB');\n if (fob) {\n ResultFormatter.currentFuel(decodeResult, Number(fob));\n data.delete('FOB');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n remaining += `/${key} ${value}`;\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() {\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 11) {\n this.debug(options, 'Variation 1 detected');\n const rawCoords = fields[0];\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(rawCoords),\n );\n\n this.setDecodeLevel(decodeResult, true, 'full');\n } else if (fields.length == 5) {\n this.debug(options, 'Variation 2 detected');\n const position = CoordinateUtils.decodeStringCoordinates(fields[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n this.setDecodeLevel(decodeResult, true, 'full');\n } else {\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() {\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 9) {\n // POSN 37.550W 76.436, 98,110800,23961,25820, 65,-23,114212,KRDU\n processPosition(decodeResult, fields[0].trim());\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[7]),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[8]);\n\n ResultFormatter.unknownArr(decodeResult, [\n fields[1],\n fields[4],\n fields[5],\n ]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown!\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string) {\n // N 39.841W 75.790\n if (\n value.length !== 16 &&\n value[0] !== 'N' &&\n value[0] !== 'S' &&\n value[8] !== 'W' &&\n value[8] !== 'E'\n ) {\n return;\n }\n const latDir = value[0] === 'N' ? 1 : -1;\n const lonDir = value[8] === 'E' ? 1 : -1;\n const position = {\n latitude: latDir * Number(value.substring(1, 7)),\n longitude: lonDir * Number(value.substring(9, 15)),\n };\n\n ResultFormatter.position(decodeResult, position);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_OFF extends DecoderPlugin {\n name = 'label-22-off';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['OFF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Takeoff Report');\n\n if (message.text.startsWith('OFF01')) {\n // variant 1\n const fields = message.text.substring(5).split('/');\n\n if (fields.length != 2) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n ResultFormatter.departureDay(\n decodeResult,\n Number(fields[1].substring(0, 2)),\n ); // departure day\n ResultFormatter.arrivalDay(\n decodeResult,\n Number(fields[1].substring(2, 4)),\n ); // arrival day\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(8, 12),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(22));\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else if (message.text.startsWith('OFF02\\r\\n')) {\n // varaint 3\n const fields = message.text.substring(7).split(',');\n if (fields.length != 4) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else if (message.text.startsWith('OFF02')) {\n // varaint 2\n const fields = message.text.substring(5).split('/');\n if (fields.length != 2) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n fields[1].substring(0, 14),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(20, 24),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)),\n );\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n this.debug(options, 'Unknown variation.');\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_POS extends DecoderPlugin {\n name = 'label-22-pos';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['N', 'S'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const fields = message.text.split(',');\n\n if (fields.length !== 11) {\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${fields.join(',')}`,\n );\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n const latStr = fields[0].substring(1, 8);\n const lonStr = fields[0].substring(9);\n const lat = Number(latStr) / 10000;\n const lon = Number(lonStr) / 10000;\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,\n longitude: CoordinateUtils.getDirection(fields[0][8]) * lon,\n });\n\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM3 extends DecoderPlugin {\n name = 'label-2p-fm3';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 7) {\n const header = parts[0].split('FM3 ');\n if (header.length < 2) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n\n if (header[1].length === 4) {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n } else {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[1]),\n );\n const lat = parts[2].replaceAll(' ', '');\n const lon = parts[3].replaceAll(' ', '');\n if (lat[0] === 'N' || lat[0] === 'S') {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n } else {\n ResultFormatter.position(decodeResult, {\n latitude: Number(lat),\n longitude: Number(lon),\n });\n }\n ResultFormatter.altitude(decodeResult, Number(parts[4]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[5]);\n ResultFormatter.unknown(decodeResult, parts[6]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM4 extends DecoderPlugin {\n name = 'label-2p-fm4';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 10) {\n const header = parts[0].split('FM4');\n if (header.length < 2) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n ResultFormatter.heading(decodeResult, Number(parts[7]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM5 extends DecoderPlugin {\n name = 'label-2p-fm5';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 12) {\n const header = parts[0].split('FM5 ');\n if (header.length < 2) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[7]);\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n ResultFormatter.flightNumber(decodeResult, parts[10].trim());\n ResultFormatter.unknown(decodeResult, parts[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_24_Slash extends DecoderPlugin {\n name = 'label-24-slash';\n\n qualifiers() {\n return {\n labels: ['24'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n\n if (fields.length == 10 && fields[0] == '' && fields[9] == '') {\n // begin and ends with `/`\n const ddmmyy =\n fields[1].substring(2, 4) +\n fields[1].substring(4, 6) +\n fields[1].substring(0, 2); // YYDDMM\n const hhmmss = fields[2] + '00';\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n hhmmss,\n ddmmyy,\n );\n ResultFormatter.flightNumber(decodeResult, fields[3]);\n ResultFormatter.altitude(decodeResult, Number(fields[4]));\n const lat = fields[5];\n const lon = fields[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[8]),\n );\n ResultFormatter.unknown(decodeResult, fields[7]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() {\n return {\n labels: ['30'],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /EA1830/DSKSFO/SK24\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 30 EA: results');\n console.log(results);\n }\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)),\n );\n\n if (results[1].substring(0, 2) === 'DS') {\n ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));\n ResultFormatter.unknown(decodeResult, '/'.concat(results[2]));\n } else {\n ResultFormatter.unknown(\n decodeResult,\n '/'.concat(results[1], '/', results[2]),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA Report — has a different field layout from the other Label 44 events\n// (altitude between coords and airports), so it uses DecoderPlugin directly\n// rather than Label_44_Base.\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const result = this.initResult(message, 'ETA Report');\n\n const data = message.text.split(',');\n if (data.length < 9) {\n return this.failUnknown(result, message.text, options);\n }\n\n this.debug(options, 'ETA Report: fields', data);\n\n ResultFormatter.position(\n result,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.altitude(result, 100 * Number(data[2]));\n ResultFormatter.departureAirport(result, data[3]);\n ResultFormatter.arrivalAirport(result, data[4]);\n ResultFormatter.month(result, Number(data[5].substring(0, 2)));\n ResultFormatter.day(result, Number(data[5].substring(2, 4)));\n ResultFormatter.timestamp(\n result,\n DateTimeUtils.convertHHMMSSToTod(data[6]),\n );\n ResultFormatter.eta(result, DateTimeUtils.convertHHMMSSToTod(data[7]));\n\n const fuel = Number(data[8]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(result, fuel);\n }\n\n if (data.length > 9) {\n ResultFormatter.unknownArr(result, data.slice(9));\n }\n\n this.setDecodeLevel(result, true, 'full');\n return result;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n/**\n * Base class for Label 44 event-style decoders (ON, OFF, IN).\n *\n * These all share the same CSV structure:\n * preamble, coordinates, [field(s)...], departure, arrival, date, time(s), fuel\n *\n * Subclasses provide the description, qualifiers, minimum field count,\n * and a hook to decode their specific fields from the CSV data.\n */\nexport abstract class Label_44_Base extends DecoderPlugin {\n /** Human-readable description of this report type (e.g. \"On Runway Report\"). */\n abstract get description(): string;\n\n /** Minimum number of CSV fields required for a valid message. */\n abstract get minFields(): number;\n\n /**\n * Decode the fields that are specific to this report type.\n * The common fields (position, airports, date) are already handled.\n * @param result - The in-progress decode result to populate\n * @param data - The full CSV-split message fields\n * @param options - Decoder options\n */\n abstract decodeEventFields(\n result: DecodeResult,\n data: string[],\n options: Options,\n ): void;\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const result = this.initResult(message, this.description);\n\n const data = message.text.split(',');\n if (data.length < this.minFields) {\n return this.failUnknown(result, message.text, options);\n }\n\n this.debug(options, `${this.description}: fields`, data);\n\n // Common fields shared by all Label 44 event decoders\n ResultFormatter.position(\n result,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(result, data[2]);\n ResultFormatter.arrivalAirport(result, data[3]);\n ResultFormatter.month(result, Number(data[4].substring(0, 2)));\n ResultFormatter.day(result, Number(data[4].substring(2, 4)));\n\n // Subclass-specific fields\n this.decodeEventFields(result, data, options);\n\n this.setDecodeLevel(result, true, 'full');\n return result;\n }\n\n /**\n * Helper to parse a fuel value from a CSV field.\n * Returns undefined if the value is not a valid number.\n */\n protected parseFuel(result: DecodeResult, value: string): void {\n const fuel = Number(value);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(result, fuel);\n }\n }\n\n /**\n * Helper to add any remaining fields as unknown.\n */\n protected addRemainingFields(\n result: DecodeResult,\n data: string[],\n startIndex: number,\n ): void {\n if (data.length > startIndex) {\n ResultFormatter.unknownArr(result, data.slice(startIndex));\n }\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// In Gate Report\nexport class Label_44_IN extends Label_44_Base {\n name = 'label-44-in';\n get description() {\n return 'In Gate Report';\n }\n get minFields() {\n return 7;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.in(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n this.parseFuel(result, data[6]);\n this.addRemainingFields(result, data, 7);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// Off Runway Report\nexport class Label_44_OFF extends Label_44_Base {\n name = 'label-44-off';\n get description() {\n return 'Off Runway Report';\n }\n get minFields() {\n return 8;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00OFF01', '00OFF02', '00OFF03', 'OFF01', 'OFF02', 'OFF03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.off(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n ResultFormatter.eta(result, DateTimeUtils.convertHHMMSSToTod(data[6]));\n this.parseFuel(result, data[7]);\n this.addRemainingFields(result, data, 8);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// On Runway Report\nexport class Label_44_ON extends Label_44_Base {\n name = 'label-44-on';\n get description() {\n return 'On Runway Report';\n }\n get minFields() {\n return 7;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ON01', '00ON02', '00ON03', 'ON01', 'ON02', 'ON03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.on(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n this.parseFuel(result, data[6]);\n this.addRemainingFields(result, data, 7);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00POS01', '00POS02', '00POS03', 'POS01', 'POS02', 'POS03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n // Style: POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1\n // Match: POS02,coords,flight_level_or_ground,departure_icao,arrival_icao,current_date,current_time,eta_time,fuel_in_tons\n const regex =\n /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n this.debug(options, 'Position Report: groups', results.groups);\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n results.groups.unsplit_coords,\n ),\n );\n const flight_level =\n results.groups.flight_level_or_ground == 'GRD' ||\n results.groups.flight_level_or_ground == '***'\n ? 0\n : Number(results.groups.flight_level_or_ground);\n\n ResultFormatter.month(\n decodeResult,\n Number(results.groups.current_date.substring(0, 2)),\n );\n ResultFormatter.day(\n decodeResult,\n Number(results.groups.current_date.substring(2, 4)),\n );\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + '00'),\n );\n\n // TODO: ETA month and Day\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + '00'),\n );\n\n if (\n results.groups.fuel_in_tons != '***' &&\n results.groups.fuel_in_tons != '****'\n ) {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n ResultFormatter.departureAirport(\n decodeResult,\n results.groups.departure_icao,\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n\n this.setDecodeLevel(decodeResult, true, 'full');\n return decodeResult;\n }\n\n return this.failUnknown(decodeResult, message.text, options);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { FlightPlanUtils } from '../utils/flight_plan_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Flight Briefing Report\nexport class Label_44_Slash extends DecoderPlugin {\n name = 'label-44-slash';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: [' /FB'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Briefing';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n if (fields.length !== 4) {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(0, 2), '/'); // 0 is a space\n // 1 is the briefing id\n // 2 is arrival airport, but repeated later\n const data = fields[3].split(',');\n if (data.length >= 6) {\n if (options.debug) {\n console.log('Label 44 Slash: groups');\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n (data[0].charAt(0) === 'S' ? -1 : 1) *\n parseFloat(data[0].slice(1).trim()),\n longitude:\n (data[1].charAt(0) === 'W' ? -1 : 1) *\n parseFloat(data[1].slice(1).trim()),\n });\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.unknown(decodeResult, data[3]); // Status - need more info to decode\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n if (data.length === 18) {\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 8), ','); // 6 is repeated arrival airport\n ResultFormatter.remainingFuel(decodeResult, parseFloat(data[8]));\n ResultFormatter.unknownArr(decodeResult, data.slice(9, 11), ',');\n ResultFormatter.arrivalRunway(decodeResult, data[11]);\n FlightPlanUtils.addProcedure(decodeResult, data[12], 'arrival');\n ResultFormatter.unknownArr(decodeResult, data.slice(13, 18), ',');\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Waypoint } from '../types/waypoint';\n\nexport class Label_4A extends DecoderPlugin {\n name = 'label-4a';\n\n qualifiers() {\n return {\n labels: ['4A'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n if (fields.length === 11) {\n // variant 1\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.tail(decodeResult, fields[2].replace('.', ''));\n if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);\n ResultFormatter.departureAirport(decodeResult, fields[4]);\n ResultFormatter.arrivalAirport(decodeResult, fields[5]);\n // ResultFormatter.altitude(decodeResult, Number(alt) * 100);\n ResultFormatter.unknownArr(decodeResult, fields.slice(8));\n } else if (fields.length === 6) {\n const f0 = fields[0];\n if (f0.length > 0 && (f0[0] === 'N' || f0[0] === 'S')) {\n // variant 2\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)),\n );\n let wp1: Waypoint = {\n name: fields[0].substring(13).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),\n };\n ResultFormatter.altitude(\n decodeResult,\n Number(fields[1].substring(6, 9)) * 100,\n );\n let wp2: Waypoint = {\n name: fields[1].substring(9).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[2]),\n };\n ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });\n ResultFormatter.temperature(decodeResult, fields[3]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(4));\n } else {\n // variant 3\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1]),\n );\n ResultFormatter.unknown(decodeResult, fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(\n (fields[4] + fields[5]).replace(/[ \\.]/g, ''),\n ),\n );\n }\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_01 extends DecoderPlugin {\n name = 'label-4a-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n let rgx = message.text.match(\n /^01([A-Z]{2})([A-Z]{2})\\s*(\\w+)\\/(\\d{6})([A-Z]{4})([A-Z]{4})\\r\\n([+-]\\s*\\d+)(\\d{3}\\.\\d)([+-]\\s*\\d+\\.\\d)/,\n );\n if (rgx) {\n ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);\n ResultFormatter.callsign(decodeResult, rgx[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(rgx[4] + '00'),\n );\n ResultFormatter.departureAirport(decodeResult, rgx[5]);\n ResultFormatter.arrivalAirport(decodeResult, rgx[6]);\n ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, '')));\n ResultFormatter.unknown(decodeResult, rgx[8]);\n ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ''));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DIS extends DecoderPlugin {\n name = 'label-4a-dis';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DIS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n const fields = message.text.split(',');\n if (fields.length < 3 || !fields[1] || fields[1].length < 3 || !fields[2]) {\n decodeResult.decoded = false;\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + '00'),\n );\n ResultFormatter.callsign(decodeResult, fields[2]);\n ResultFormatter.text(decodeResult, fields.slice(3).join(''));\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DOOR extends DecoderPlugin {\n name = 'label-4a-door';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DOOR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(' ');\n if (fields.length === 3) {\n ResultFormatter.door_event(\n decodeResult,\n fields[0].split('/')[1],\n fields[1],\n );\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2] + '00'),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_Slash_01 extends DecoderPlugin {\n name = 'label-4a-slash-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['/01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n if (message.text.length === 5 && message.text.substring(0, 4) === '/01-') {\n ResultFormatter.unknown(decodeResult, message.text.substring(4));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4N extends DecoderPlugin {\n name = 'label-4n';\n\n qualifiers() {\n return {\n labels: ['4N'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n const fields = text.split(',');\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(30, 45).replace(/^(.)0/, '$1'),\n ),\n );\n ResultFormatter.altitude(\n decodeResult,\n Number(text.substring(48, 51)) * 100,\n );\n ResultFormatter.unknownArr(\n decodeResult,\n [text.substring(2, 4), text.substring(19, 29)],\n ' ',\n );\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === 'B') {\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[4]),\n longitude: Number(fields[5]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[6]));\n }\n ResultFormatter.departureAirport(decodeResult, fields[8]);\n ResultFormatter.arrivalAirport(decodeResult, fields[9]);\n ResultFormatter.alternateAirport(decodeResult, fields[10]);\n ResultFormatter.arrivalRunway(decodeResult, fields[11].split('/')[0]);\n if (fields[12].length > 1) {\n ResultFormatter.alternateRunway(decodeResult, fields[12].split('/')[0]);\n }\n ResultFormatter.checksum(decodeResult, parseInt(fields[32], 16));\n ResultFormatter.unknownArr(\n decodeResult,\n [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(\n (f) => f != '',\n ),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_AGFSR extends DecoderPlugin {\n name = 'label-4t-agfsr';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['AGFSR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(5).split('/');\n\n if (!message.text.startsWith('AGFSR') || data.length !== 20) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n ResultFormatter.arrivalDay(decodeResult, Number(data[2]));\n ResultFormatter.departureAirport(\n decodeResult,\n data[3].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), 'IATA');\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)),\n ); // HHMMZ\n ResultFormatter.unknown(decodeResult, data[5], '/');\n const lat = data[6].substring(0, 7);\n const lon = data[6].substring(7, 15);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) +\n Number(lat.substring(2, 6)) / 60,\n longitude:\n CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) +\n Number(lon.substring(3, 7)) / 60,\n });\n ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));\n // 8 - phase of flight?\n // 11 - temperature?\n ResultFormatter.unknownArr(decodeResult, data.slice(8), '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_58 extends DecoderPlugin {\n name = 'label-58';\n\n qualifiers() {\n return {\n labels: ['58'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.split('/');\n if (data.length === 8) {\n ResultFormatter.flightNumber(decodeResult, data[0]);\n ResultFormatter.day(decodeResult, Number(data[1]));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n const lat = data[3];\n const lon = data[4];\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n ResultFormatter.altitude(decodeResult, Number(data[5]));\n ResultFormatter.unknown(decodeResult, data[6], '/');\n ResultFormatter.unknown(decodeResult, data[7], '/');\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 58 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_ETA extends DecoderPlugin {\n name = 'label-4t-eta';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['ETA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split('/');\n\n if (!message.text.startsWith('ETA') || data.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n const etaData = data[2].split(' ');\n ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));\n ResultFormatter.arrivalAirport(decodeResult, etaData[1], 'IATA');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)),\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nconst POS_REGEX = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\nconst WS_REGEX = /\\s+/;\nconst NEWLINE_REGEX = /\\r?\\n/;\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n qualifiers() {\n return {\n labels: ['80'],\n preambles: [],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(\n message,\n 'Airline Defined Position Report',\n );\n\n const lines = message.text.split(NEWLINE_REGEX);\n if (lines.length === 1 && lines[0].includes(',')) {\n this.parseCsvFormat(lines[0], decodeResult);\n } else {\n const header = lines[0].trim();\n const headerParts = header.split(',');\n for (let i = 0; i < headerParts.length - 1; i++) {\n const moreFields = headerParts[i].split('/');\n for (const more of moreFields) {\n this.parseTags(more.trim(), decodeResult);\n }\n }\n\n this.parseHeader(\n headerParts[headerParts.length - 1].trim(),\n decodeResult,\n );\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const parts = line.split('/');\n for (const part of parts) {\n this.parseTags(part.trim(), decodeResult);\n }\n }\n }\n\n if (decodeResult.formatted.items.length > 0) {\n this.setDecodeLevel(decodeResult, true);\n }\n\n return decodeResult;\n }\n\n private parseHeader(header: string, results: DecodeResult) {\n //3N01 POSRPT 0581/27 KIAD/MSLP .N962AV/04H 11:02\n const fields = header.split('/');\n if (fields.length < 3) {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n const msgInfo = fields[0].split(WS_REGEX);\n if (msgInfo.length === 3) {\n ResultFormatter.unknownArr(results, msgInfo.slice(0, 2), ' ');\n ResultFormatter.flightNumber(results, msgInfo[2]);\n } else {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n\n const otherInfo1 = fields[1].split(WS_REGEX);\n if (otherInfo1.length === 2) {\n ResultFormatter.day(results, parseInt(otherInfo1[0], 10));\n ResultFormatter.departureAirport(results, otherInfo1[1]);\n } else {\n ResultFormatter.unknownArr(results, otherInfo1, ' ');\n }\n\n const otherInfo2 = fields[2].split(WS_REGEX);\n if (otherInfo2.length === 2) {\n ResultFormatter.arrivalAirport(results, otherInfo2[0]);\n ResultFormatter.tail(results, otherInfo2[1].replace('.', ''));\n } else {\n ResultFormatter.unknownArr(results, otherInfo2, ' ');\n }\n\n if (fields.length > 3) {\n ResultFormatter.unknownArr(results, fields.slice(3), '/');\n }\n }\n\n private parseTags(part: string, results: DecodeResult) {\n const kvPair = part.split(WS_REGEX);\n if (kvPair.length < 2) {\n ResultFormatter.unknown(results, part, '/');\n return;\n }\n const tag = kvPair[0];\n const val = kvPair.slice(1).join(' ');\n\n switch (tag) {\n case 'POS': {\n // don't use decodeStringCoordinates because of different position format\n const posResult = POS_REGEX.exec(val);\n const lat =\n Number(posResult?.groups?.lat) *\n (posResult?.groups?.latd === 'S' ? -1 : 1);\n const lon =\n Number(posResult?.groups?.lng) *\n (posResult?.groups?.lngd === 'W' ? -1 : 1);\n const position = {\n latitude: Number.isInteger(lat) ? lat / 1000 : lat / 100,\n longitude: Number.isInteger(lon) ? lon / 1000 : lon / 100,\n };\n ResultFormatter.position(results, position);\n break;\n }\n case 'ALT':\n ResultFormatter.altitude(results, parseInt(val.replace('+', ''), 10));\n break;\n case 'FL': // Handle \"FL 360\"\n ResultFormatter.altitude(results, parseInt(val, 10) * 100);\n break;\n case 'MCH':\n ResultFormatter.mach(results, parseInt(val, 10) / 1000);\n break;\n case 'SPD':\n ResultFormatter.groundspeed(results, parseInt(val, 10));\n break;\n case 'TAS':\n ResultFormatter.airspeed(results, parseInt(val, 10));\n break;\n case 'SAT':\n ResultFormatter.temperature(results, val);\n break;\n case 'FB':\n // ignoring, assuming FOB and avoiding duplicates.\n break;\n case 'FOB':\n // Strip non-numeric like 'N' in 'N009414'\n ResultFormatter.currentFuel(\n results,\n parseInt(val.replace(/\\D/g, ''), 10),\n );\n break;\n case 'UTC':\n ResultFormatter.timestamp(\n results,\n DateTimeUtils.convertHHMMSSToTod(val),\n );\n break;\n case 'ETA': {\n const hhmm = val.split('.')[0].replace(':', '');\n ResultFormatter.eta(results, DateTimeUtils.convertHHMMSSToTod(hhmm));\n break;\n }\n case 'HDG':\n ResultFormatter.heading(results, parseInt(val, 10));\n break;\n case 'NWYP':\n results.raw.next_waypoint = val;\n break;\n case 'SWN':\n // wind speed, do nothing for\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'DWN':\n // wind direction, do nothing for now\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'AD':\n // do nothing, as it shows in the header\n break;\n default:\n ResultFormatter.unknown(results, part, '/');\n }\n }\n private parseCsvFormat(text: string, results: DecodeResult) {\n const csvParts = text.split(',');\n if (csvParts.length !== 9) {\n return;\n }\n const header = csvParts[0].trim().split(WS_REGEX);\n ResultFormatter.unknown(results, header[0], ' ');\n ResultFormatter.unknown(results, header[1], ' ');\n ResultFormatter.position(\n results,\n CoordinateUtils.decodeStringCoordinates(header[2]),\n );\n ResultFormatter.unknown(results, csvParts[1]);\n ResultFormatter.timestamp(\n results,\n DateTimeUtils.convertHHMMSSToTod(csvParts[2]),\n );\n ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ',');\n ResultFormatter.temperature(\n results,\n (\n (csvParts[6].charAt(0) === 'M' ? -1 : 1) *\n parseInt(csvParts[6].slice(1), 10)\n ).toString(),\n );\n ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));\n ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nconst WS_REGEX = /\\s+/;\nconst ALL_WS_REGEX = /\\s/g;\nconst ALL_DOTS_REGEX = /\\./g;\n\nexport class Label_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() {\n return {\n labels: ['83'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n if (text.startsWith('4DH3 ETAT2')) {\n // variant 2\n const fields = text.split(WS_REGEX);\n if (fields[2].length > 5) {\n decodeResult.raw.day = fields[2].substring(5);\n }\n ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));\n const subfields = fields[3].split('/');\n ResultFormatter.departureAirport(decodeResult, subfields[0]);\n ResultFormatter.arrivalAirport(decodeResult, subfields[1]);\n ResultFormatter.tail(decodeResult, fields[4].replace(ALL_DOTS_REGEX, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[6] + '00'),\n );\n } else if (text.startsWith('001PR')) {\n // variant 3\n decodeResult.raw.day = text.substring(5, 7);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(13, 28).replace(ALL_DOTS_REGEX, ''),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n ResultFormatter.unknown(decodeResult, text.substring(33));\n } else {\n const fields = text.replace(ALL_WS_REGEX, '').split(',');\n if (fields.length === 9) {\n // variant 1\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n decodeResult.raw.day = fields[2].substring(0, 2);\n decodeResult.raw.time = fields[2].substring(2);\n // text was already whitespace-stripped above so the per-field\n // .replace(/\\s/g, '') is redundant.\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[3]),\n longitude: Number(fields[4]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[5]));\n ResultFormatter.groundspeed(decodeResult, Number(fields[6]));\n ResultFormatter.heading(decodeResult, Number(fields[7]));\n ResultFormatter.unknown(decodeResult, fields[8]);\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() {\n return {\n labels: ['8E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: EGSS,1618\n // Match: arrival_icao,arrival_eta\n const regex = /^(?<arrival_icao>\\w{4}),(?<arrival_eta>\\d{4})$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 8E ETA: groups');\n console.log(results.groups);\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta),\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// CPDLC\nexport class Label_B6_Forwardslash extends DecoderPlugin {\n name = 'label-b6-forwardslash';\n\n qualifiers() {\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'CPDLC Message');\n\n // Full ATN/PM-CPDLC parsing isn't implemented yet, but the body\n // (everything after the leading \"/\") is at least preserved in the\n // decoded output so consumers don't lose it.\n const body = message.text.substring(1);\n if (body.length > 0) {\n ResultFormatter.text(decodeResult, body);\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n this.setDecodeLevel(decodeResult, false);\n }\n\n this.debug(options, 'CPDLC body:', body);\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_ColonComma extends DecoderPlugin {\n name = 'label-colon-comma';\n\n qualifiers() {\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description =\n 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n code: 'FREQ',\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_76401 extends DecoderPlugin {\n name = 'label-h1-76401';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['76401\\r\\n'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const lines = message.text.split('\\r\\n');\n\n if (lines.length < 3) {\n return decodeResult;\n }\n\n ResultFormatter.unknown(decodeResult, lines[0], '\\r\\n');\n\n ResultFormatter.unknown(decodeResult, lines[1].substring(0, 5), '\\r\\n');\n ResultFormatter.departureAirport(decodeResult, lines[1].substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, lines[1].substring(9, 13));\n ResultFormatter.unknown(decodeResult, lines[1].substring(13), ''); // should have nothing left on line 1\n\n const waypoints: Waypoint[] = [];\n for (const line of lines.slice(2)) {\n const position = CoordinateUtils.decodeStringCoordinates(\n line.substring(0, 13),\n );\n if (position) {\n waypoints.push({\n name: CoordinateUtils.coordinateString(position),\n latitude: position.latitude,\n longitude: position.longitude,\n time: DateTimeUtils.convertHHMMSSToTod(line.substring(13, 19)),\n });\n } else {\n ResultFormatter.unknown(decodeResult, line.substring(0, 19), '');\n }\n ResultFormatter.unknown(decodeResult, line.substring(19), '\\r\\n');\n }\n\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n // add position from the last waypoint for fun mapping\n if (waypoints.length > 0) {\n const lastWaypoint = waypoints[waypoints.length - 1];\n // should be true, making typescript happy\n if (\n lastWaypoint.latitude !== undefined &&\n lastWaypoint.longitude !== undefined\n ) {\n ResultFormatter.position(decodeResult, {\n latitude: lastWaypoint.latitude,\n longitude: lastWaypoint.longitude,\n });\n }\n\n // should be true, making typescript happy\n if (lastWaypoint.time !== undefined) {\n ResultFormatter.timestamp(decodeResult, lastWaypoint.time);\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_H1_ATIS extends DecoderPlugin {\n name = 'label-h1-atis';\n\n qualifiers() {\n return {\n labels: ['H1', '5Z'],\n preambles: ['L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ATIS Subscription';\n decodeResult.message = message;\n\n // Pattern: L[2-digit seq]A[flight]/[facility].TI2/[code][airport][checksum]\n const regex =\n /^L(\\d{2})A([A-Z0-9]+)\\/([A-Z]{4})\\.TI2\\/(\\d{3})([A-Z]{4})([A-F0-9]+)$/;\n const match = message.text.match(regex);\n\n if (!match) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 ATIS message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const seq = match[1];\n const flight = match[2];\n const facility = match[3];\n const code = match[4];\n const airport = match[5];\n const checksum = match[6];\n\n ResultFormatter.flightNumber(decodeResult, flight);\n ResultFormatter.arrivalAirport(decodeResult, facility);\n ResultFormatter.sequenceNumber(decodeResult, parseInt(seq, 10));\n\n decodeResult.raw.atis_code = code;\n decodeResult.formatted.items.push({\n type: 'atis',\n code: 'ATIS_CODE',\n label: 'ATIS Code',\n value: code,\n });\n\n // The airport in the TI2 section\n if (airport !== facility) {\n decodeResult.raw.atis_airport = airport;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ATIS_ARPT',\n label: 'ATIS Airport',\n value: airport,\n });\n }\n\n // Checksum\n ResultFormatter.checksum(decodeResult, parseInt(checksum, 16));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_EZF extends DecoderPlugin {\n name = 'label-h1-ezf';\n\n qualifiers() {\n return {\n labels: ['H1', '1M'],\n preambles: ['EZF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Load Sheet';\n decodeResult.message = message;\n\n const lines = message.text\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length < 2 || lines[0] !== 'EZF') {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 EZF message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const loadsheet: Record<string, string> = {};\n const unknowns: string[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('-')) {\n const kvMatch = line.match(/^-([^/]+)\\/(.+)$/);\n if (kvMatch) {\n loadsheet[kvMatch[1]] = kvMatch[2];\n } else {\n unknowns.push(line);\n }\n } else if (i === 1) {\n // Second line is the flight identifier, e.g. NO0246/10/EI-NEO\n const idParts = line.split('/');\n if (idParts.length >= 1) {\n ResultFormatter.flightNumber(decodeResult, idParts[0]);\n }\n if (idParts.length >= 3) {\n ResultFormatter.tail(decodeResult, idParts[2]);\n }\n // Remaining parts of identifier line\n if (idParts.length >= 2) {\n // idParts[1] is day or other info - store but don't format\n }\n } else if (i === 2) {\n // Third line typically contains config info, e.g. /C28Y331/3/9\n unknowns.push(line);\n } else {\n unknowns.push(line);\n }\n }\n\n // Extract known fields from loadsheet\n if (loadsheet['SCT']) {\n const route = loadsheet['SCT'].split('-');\n if (route.length === 2) {\n ResultFormatter.departureAirport(decodeResult, route[0], 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, route[1], 'IATA');\n }\n }\n\n // Store all loadsheet data in raw\n decodeResult.raw.loadsheet = loadsheet;\n\n // Format key loadsheet items\n const formatFields: [string, string, string][] = [\n ['STD', 'Scheduled Time of Departure', 'std'],\n ['FLT STATUS', 'Flight Status', 'flight_status'],\n ['UOM', 'Unit of Measure', 'uom'],\n ['ZFW', 'Zero Fuel Weight', 'zfw'],\n ['PAX', 'Passengers', 'pax'],\n ['TOW', 'Takeoff Weight', 'tow'],\n ['DOW', 'Dry Operating Weight', 'dow'],\n ['FWT', 'Fuel Weight', 'fuel_weight'],\n ];\n\n for (const [key, label, code] of formatFields) {\n if (loadsheet[key]) {\n decodeResult.formatted.items.push({\n type: 'loadsheet',\n code: code.toUpperCase(),\n label: label,\n value: loadsheet[key],\n });\n }\n }\n\n if (unknowns.length > 0) {\n ResultFormatter.unknownArr(decodeResult, unknowns, '\\n');\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Fault Log Report');\n\n const parts = message.text.split('/FR');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n for (let i = 1; i < fields.length; i++) {\n const field = fields[i];\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.fault_message = msg;\n decodeResult.formatted.items.push({\n type: 'fault',\n code: 'FR',\n label: 'Fault Report',\n value: decodeResult.raw.fault_message,\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_H1_M_POS extends DecoderPlugin {\n name = 'label-h1-m-pos';\n\n qualifiers() {\n return {\n labels: ['H1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(\n message,\n 'M-Series Periodic Position Report',\n );\n\n // Match M[2-digit seq]A[airline 2-char][flight 4-digit][origin],[dest],[DDHHMM],[lat],[lon],[alt],[hdg],...\n const headerRegex = /^M(\\d{2})A([A-Z]{2})(\\d{4})/;\n const headerMatch = message.text.match(headerRegex);\n\n if (!headerMatch) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const airline = headerMatch[2];\n const flightNum = headerMatch[3];\n const afterHeader = message.text.substring(headerMatch[0].length);\n const fields = afterHeader.split(',');\n\n // We expect at least: origin, dest, DDHHMM, lat, lon, alt, hdg\n if (fields.length < 7) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.flightNumber(decodeResult, `${airline}${flightNum}`);\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n\n // DDHHMM timestamp\n const timestamp = fields[2].trim();\n if (timestamp.length === 6) {\n const day = Number(timestamp.substring(0, 2));\n const tod = DateTimeUtils.convertHHMMSSToTod(\n timestamp.substring(2) + '00',\n );\n ResultFormatter.day(decodeResult, day);\n ResultFormatter.timestamp(decodeResult, tod);\n }\n\n // Latitude and longitude (trim spaces, e.g. \"- 4.9985\")\n const lat = parseFloat(fields[3].replace(/\\s/g, ''));\n const lon = parseFloat(fields[4].replace(/\\s/g, ''));\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n\n // Altitude\n const alt = Number(fields[5]);\n ResultFormatter.altitude(decodeResult, alt);\n\n // Heading\n const hdg = Number(fields[6]);\n ResultFormatter.heading(decodeResult, hdg);\n\n // Remaining fields as unknown\n if (fields.length > 7) {\n ResultFormatter.unknownArr(decodeResult, fields.slice(7));\n }\n\n this.setDecodeLevel(\n decodeResult,\n true,\n fields.length > 7 ? 'partial' : 'full',\n );\n\n return decodeResult;\n }\n}\n","import * as pako from 'pako';\n\n/**\n * Inflate compressed data with support for partial/truncated streams.\n * Uses Z_SYNC_FLUSH to extract as much data as possible, even from\n * incomplete deflate streams. Captures output via onData callback.\n *\n * @param data - The compressed input bytes\n * @param raw - If true, use raw deflate (no zlib header); if false, expect zlib header\n * @returns The decompressed bytes, or undefined if no output was produced\n */\nexport function inflateData(\n data: Uint8Array,\n raw: boolean,\n): Uint8Array | undefined {\n const chunks: Uint8Array[] = [];\n const inflator = new pako.Inflate({ windowBits: raw ? -15 : 15 });\n inflator.onData = (chunk: Uint8Array) => {\n chunks.push(chunk);\n };\n inflator.push(data, 2); // Z_SYNC_FLUSH\n\n if (chunks.length === 0) return undefined;\n if (chunks.length === 1) return chunks[0];\n\n const totalLen = chunks.reduce((sum, c) => sum + c.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n/**\n * Decode a base64 or base64url string to Uint8Array.\n * Handles missing padding and converts base64url chars (- and _) to\n * standard base64 chars (+ and /), matching Buffer.from(str, 'base64') behavior.\n *\n * @param base64 - The base64 or base64url encoded string\n * @returns The decoded bytes\n */\nexport function base64ToUint8Array(base64: string): Uint8Array {\n const cleaned = base64\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n .replace(/[^A-Za-z0-9+/]/g, '');\n const padded = cleaned + '='.repeat((4 - (cleaned.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { base64ToUint8Array, inflateData } from '../utils/compression';\n\nconst textDecoder = new TextDecoder();\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['OHMA', '/RTNBOCR.OHMA', '#T1B/RTNBOCR.OHMA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n\n const data = message.text.split('OHMA')[1]; // throw out '/RTNOCR.' - even though it means something\n try {\n const compressedBuffer = base64ToUint8Array(data);\n const result = inflateData(compressedBuffer, false);\n if (!result || result.length === 0) {\n throw new Error('Decompression produced no output');\n }\n const jsonText = textDecoder.decode(result);\n\n let formattedMsg;\n let jsonMessage;\n try {\n jsonMessage = JSON.parse(jsonText).message;\n } catch {\n jsonMessage = jsonText;\n }\n\n try {\n const ohmaMsg = JSON.parse(jsonMessage);\n formattedMsg = JSON.stringify(ohmaMsg, null, 2);\n } catch {\n formattedMsg = jsonMessage;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.raw.ohma = jsonText;\n decodeResult.formatted.items.push({\n type: 'ohma',\n code: 'OHMA',\n label: 'OHMA Downlink',\n value: formattedMsg,\n });\n } catch (e) {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 OHMA message: ${message.text}`, e);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","/**\n * ICAO Doc 4444 Flight Plan (FPL) parser utility.\n *\n * Parses the standard ICAO FPL format:\n * (FPL-callsign-flightRulesType\n * -aircraftType/wake-equipment/surveillance\n * -departureHHMM\n * -speedLevel route\n * -destinationHHMM alternate1 alternate2\n * -otherInfo)\n */\n\nimport { Route } from '../types/route';\n\nexport interface IcaoFlightPlan {\n callsign: string;\n flightRules: string;\n flightType: string;\n aircraftType: string;\n wakeTurbulence: string;\n equipment: string;\n surveillance: string;\n departure: string;\n departureTime: string;\n cruiseSpeed: string;\n cruiseLevel: string;\n route: Route;\n destination: string;\n eet: string;\n alternates: string[];\n otherInfo: Record<string, string>;\n}\n\nexport function parseIcaoFpl(text: string): IcaoFlightPlan | null {\n // Find the (FPL-...) block\n const fplStart = text.indexOf('(FPL-');\n if (fplStart === -1) {\n return null;\n }\n\n // Find matching closing paren\n const fplEnd = text.indexOf(')', fplStart);\n if (fplEnd === -1) {\n return null;\n }\n\n // Extract inner content after \"(FPL-\"\n const inner = text.substring(fplStart + 5, fplEnd);\n\n // Normalize: collapse all whitespace (newlines, multiple spaces) to single space\n const normalized = inner.replace(/\\s+/g, ' ').trim();\n\n // Split on \" -\" or leading \"-\" to get the field sections.\n // The format is: callsign-rulesType-acft/wake-equip/surv-deptHHMM-speedLevel route-destHHMM alts-other\n // After removing \"(FPL-\", the first field is callsign-rulesType.\n // Subsequent fields are separated by \"-\" that appears after a space or at start of a section line.\n // However, the \"-\" delimiter is tricky: it separates major sections but also appears\n // within equipment strings (e.g. SDE3FGHIJ1...) — those are NOT delimiters.\n //\n // The ICAO FPL has exactly 6 major sections after the callsign section, delimited by \"-\".\n // We need to split carefully. The format after \"(FPL-\" is:\n // section1-section2-section3-section4-section5-section6\n // where section1 = \"callsign-rulesType\" (contains one internal \"-\")\n //\n // Strategy: split on \"-\" and reconstruct based on known patterns.\n\n const parts = normalized.split('-');\n\n // We need at least 7 parts (callsign, rulesType, acftType/wake, equip/surv, dept, speed+route, dest+alts, other...)\n // But the equipment section may contain hyphens too, so we parse positionally.\n\n if (parts.length < 7) {\n return null;\n }\n\n // Section 1: callsign\n const callsign = parts[0].trim();\n if (!callsign) {\n return null;\n }\n\n // Section 2: flight rules + flight type (e.g., \"IS\")\n const rulesType = parts[1].trim();\n if (rulesType.length < 2) {\n return null;\n }\n const flightRules = rulesType[0];\n const flightType = rulesType[1];\n\n // Now we need to find the remaining sections. The challenge is that equipment strings\n // can be long but don't contain \"-\". The aircraft/wake section is \"TYPE/WAKE\".\n // The equipment/surveillance section is \"EQUIP/SURV\".\n // These are separated by \"-\".\n\n // Section 3: aircraft type / wake turbulence category (e.g., \"B77W/H\")\n const acftWake = parts[2].trim();\n const acftSlash = acftWake.indexOf('/');\n if (acftSlash === -1) {\n return null;\n }\n const aircraftType = acftWake.substring(0, acftSlash);\n const wakeTurbulence = acftWake.substring(acftSlash + 1);\n\n // Section 4: equipment / surveillance (e.g., \"SDE3FGHIJ1J2J3J4J5M1P2RWXYZ/LB1D1\")\n const equipSurv = parts[3].trim();\n const equipSlash = equipSurv.indexOf('/');\n if (equipSlash === -1) {\n return null;\n }\n const equipment = equipSurv.substring(0, equipSlash);\n const surveillance = equipSurv.substring(equipSlash + 1);\n\n // Section 5: departure aerodrome + time (e.g., \"VESPA2354\" or \"KSFO0100\")\n const deptField = parts[4].trim();\n // Time is always last 4 digits\n const departureTime = deptField.substring(deptField.length - 4);\n const departure = deptField.substring(0, deptField.length - 4);\n\n // Section 6: cruise speed/level + route (e.g., \"N0482F350 DCT ENI DCT OAK DCT BURGL IRNMN2\")\n const speedRouteField = parts[5].trim();\n // Speed is first token like N0482 or M084, level follows like F350 or S1190\n const speedMatch = speedRouteField.match(\n /^([NKM]\\d{3,4})([FAVMS]\\d{3,4})\\s*(.*)/,\n );\n if (!speedMatch) {\n return null;\n }\n const cruiseSpeed = speedMatch[1];\n const cruiseLevel = speedMatch[2];\n const route = {\n waypoints: speedMatch[3].split(' ').map((s) => ({\n name: s,\n })),\n };\n\n // Section 7: destination + EET + alternates (e.g., \"KLAX0117 KSFO\")\n const destField = parts[6].trim();\n const destParts = destField.split(/\\s+/);\n const destTime = destParts[0];\n // Destination ICAO is first 4 chars, EET is last 4 digits\n const destination = destTime.substring(0, destTime.length - 4);\n const eet = destTime.substring(destTime.length - 4);\n const alternates = destParts.slice(1).filter((s) => s.length > 0);\n\n // Section 8+: other information (remaining parts joined, then parsed as key/value)\n const otherRaw = parts.slice(7).join('-').trim();\n const otherInfo: Record<string, string> = {};\n\n if (otherRaw.length > 0) {\n // Other info is a series of KEY/VALUE pairs separated by spaces\n // e.g., \"PBN/A1B1C1D1L1O2S2T1 NAV/ABAS RNP2 DAT/1FANSE SUR/RSP180 DOF/260310 REG/B2036\"\n // Parse by finding KEY/ patterns\n const otherTokens = otherRaw.split(/\\s+/);\n let currentKey = '';\n let currentValue = '';\n\n for (const token of otherTokens) {\n const kvMatch = token.match(/^([A-Z]{2,})\\/(.*)/);\n if (kvMatch) {\n // Save previous key/value if exists\n if (currentKey) {\n otherInfo[currentKey] = currentValue.trim();\n }\n currentKey = kvMatch[1];\n currentValue = kvMatch[2];\n } else if (currentKey) {\n // Continuation of previous value\n currentValue += ' ' + token;\n }\n }\n // Save last key/value\n if (currentKey) {\n otherInfo[currentKey] = currentValue.trim();\n }\n }\n\n return {\n callsign,\n flightRules,\n flightType,\n aircraftType,\n wakeTurbulence,\n equipment,\n surveillance,\n departure,\n departureTime,\n cruiseSpeed,\n cruiseLevel,\n route,\n destination,\n eet,\n alternates,\n otherInfo,\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { parseIcaoFpl } from '../utils/icao_fpl_utils';\n\nexport class Label_H1_OFP extends DecoderPlugin {\n name = 'label-h1-ofp';\n\n qualifiers() {\n return {\n labels: ['H1', '1M'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Operational Flight Plan';\n\n if (!message.text.includes('(FPL-')) {\n if (options.debug) {\n console.log(`Decoder: No FPL block found in message`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const fpl = parseIcaoFpl(message.text);\n if (!fpl) {\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // Populate decoded results\n ResultFormatter.callsign(decodeResult, fpl.callsign);\n\n decodeResult.formatted.items.push({\n type: 'aircraft_type',\n code: 'ACFT',\n label: 'Aircraft Type',\n value: fpl.aircraftType,\n });\n\n if (fpl.departure) {\n ResultFormatter.departureAirport(decodeResult, fpl.departure);\n }\n\n if (fpl.destination) {\n ResultFormatter.arrivalAirport(decodeResult, fpl.destination);\n }\n\n if (fpl.alternates.length > 0) {\n ResultFormatter.alternateAirport(decodeResult, fpl.alternates[0]);\n }\n\n if (fpl.route) {\n ResultFormatter.route(decodeResult, fpl.route);\n }\n\n if (fpl.otherInfo.REG) {\n ResultFormatter.tail(decodeResult, fpl.otherInfo.REG);\n }\n\n const rulesMap: Record<string, string> = {\n I: 'IFR',\n V: 'VFR',\n Y: 'IFR/VFR',\n Z: 'VFR/IFR',\n };\n const rulesDesc = rulesMap[fpl.flightRules] || fpl.flightRules;\n decodeResult.formatted.items.push({\n type: 'flight_rules',\n code: 'RULES',\n label: 'Flight Rules',\n value: rulesDesc,\n });\n\n decodeResult.formatted.items.push({\n type: 'cruise',\n code: 'CRUISE',\n label: 'Cruise Speed/Level',\n value: `${fpl.cruiseSpeed} ${fpl.cruiseLevel}`,\n });\n\n // Store raw FPL data\n decodeResult.raw.icao_fpl = fpl;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_Paren extends DecoderPlugin {\n name = 'label-h1-paren';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['('],\n };\n }\n\n decode(message: Message): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (!message.text || !message.text.startsWith('(')) {\n decodeResult.decoded = false;\n return decodeResult;\n }\n\n const regex =\n /^\\(POS-(?<flight>\\w+)\\s+(?<lat>-?\\d{4,5}[NS])(?<lon>\\d{5}[EW])\\/(?<timestamp>\\d{6})\\s+F(?<alt>\\d{3})\\r?\\nRMK\\/FUEL\\s+(?<fuel>\\d{2,3}\\.\\d)\\s+M(?<mach>\\d\\.\\d{2})\\)/;\n\n const match = message.text.match(regex);\n if (match && match.groups) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.formatted.description = 'Position Report';\n\n ResultFormatter.flightNumber(decodeResult, match.groups.flight);\n ResultFormatter.position(decodeResult, {\n latitude: parseLat(match.groups.lat),\n longitude: parseLon(match.groups.lon),\n });\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(match.groups.timestamp),\n );\n ResultFormatter.altitude(\n decodeResult,\n parseInt(match.groups.alt, 10) * 100,\n );\n ResultFormatter.currentFuel(decodeResult, parseFloat(match.groups.fuel));\n ResultFormatter.mach(decodeResult, parseFloat(match.groups.mach));\n ResultFormatter.unknown(decodeResult, 'RMK');\n }\n return decodeResult;\n }\n}\n\nfunction parseLat(latStr: string): number {\n const match = latStr.match(/(-?)(\\d{2})(\\d{2})([NS])/);\n if (!match) return NaN;\n let deg = parseInt(match[2]);\n let min = parseInt(match[3]);\n let sign = match[4] === 'S' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n\nfunction parseLon(lonStr: string): number {\n const match = lonStr.match(/(\\d{3})(\\d{2})([EW])/);\n if (!match) return NaN;\n let deg = parseInt(match[1]);\n let min = parseInt(match[2]);\n let sign = match[3] === 'W' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_StarPOS extends DecoderPlugin {\n name = 'label-h1-star-pos';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['*POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const msg = message.text;\n // assuming fixed length until other variants found\n if (msg.length !== 43 || !msg.startsWith('*POS')) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${msg}`);\n }\n ResultFormatter.unknown(decodeResult, msg);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));\n ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)),\n );\n ResultFormatter.position(decodeResult, {\n // Deg Min, no sec\n latitude:\n CoordinateUtils.getDirection(msg.substring(12, 13)) *\n (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),\n longitude:\n CoordinateUtils.getDirection(msg.substring(17, 18)) *\n (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23)) / 60),\n });\n ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));\n ResultFormatter.unknown(decodeResult, msg.substring(28));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Warning Message');\n\n const parts = message.text.split('/WN');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n ResultFormatter.unknownArr(decodeResult, fields.slice(1), '/');\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.warning_message = msg;\n decodeResult.formatted.items.push({\n type: 'warning',\n code: 'WRN',\n label: 'Warning Message',\n value: decodeResult.raw.warning_message,\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H2_02E extends DecoderPlugin {\n name = 'label-h2-02e';\n\n qualifiers() {\n return {\n labels: ['H2'],\n preambles: ['02E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Weather Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n\n if (parts[parts.length - 1] !== 'Q') {\n // not a valid message\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const windData: Wind[] = [];\n decodeResult.remaining.text = '';\n\n const header = parts[0];\n if (header.length === 45) {\n // header.substring(0,3) is '02E'\n ResultFormatter.day(decodeResult, parseInt(header.substring(3, 5), 10));\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n const firstWind = this.parseWeatherReport(header.substring(13));\n if (firstWind) {\n windData.push(firstWind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + header.substring(13);\n }\n }\n\n for (let i = 1; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part[0] !== 'Q') {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n continue;\n }\n const wind = this.parseWeatherReport(part.substring(1));\n if (wind) {\n windData.push(wind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n }\n }\n\n ResultFormatter.windData(decodeResult, windData);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text.length === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n\n private parseWeatherReport(text: string): Wind | null {\n const posString = text.substring(0, 13);\n const pos =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(posString);\n if (text.length !== 32 || !pos) {\n return null;\n }\n const tod = DateTimeUtils.convertHHMMSSToTod(text.substring(13, 17));\n const flightLevel = parseInt(text.substring(17, 20), 10);\n // const altitude = parseInt(text.substring(17,21), 10) * 10; // use FL instead\n const tempSign = text[21] === 'M' ? -1 : 1;\n const tempDegreesRaw = parseInt(text.substring(22, 25), 10);\n const tempDegrees = tempSign * (tempDegreesRaw / 10);\n const windDirection = parseInt(text.substring(25, 28), 10);\n const windSpeed = parseInt(text.substring(28, 31), 10);\n // G?\n if (text[31] !== 'G') {\n return null;\n }\n return {\n waypoint: {\n name: posString,\n latitude: pos.latitude,\n longitude: pos.longitude,\n time: tod,\n },\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: flightLevel,\n degreesC: tempDegrees,\n },\n };\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() {\n return {\n labels: ['HX'],\n preambles: ['RA FMT LOCATION', 'RA FMT 43'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Undelivered Uplink Report';\n\n const parts = message.text.split(' ');\n\n decodeResult.decoded = true;\n if (parts[2] === 'LOCATION') {\n let latdir = parts[3].substring(0, 1);\n let latdeg = Number(parts[3].substring(1, 3));\n let latmin = Number(parts[3].substring(3, 7));\n let londir = parts[4].substring(0, 1);\n let londeg = Number(parts[4].substring(1, 4));\n let lonmin = Number(parts[4].substring(4, 8));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknownArr(decodeResult, parts.slice(5), ' ');\n ResultFormatter.position(decodeResult, pos);\n } else if (parts[2] === '43') {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), ' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","/**\n * Pure JavaScript ASCII85 (Adobe variant) decoder.\n * Replaces the `base85` npm package to eliminate Node.js Buffer dependency.\n * Works in browsers, Node.js 18+, Deno, Bun, and edge runtimes.\n */\nexport function ascii85Decode(input: string): Uint8Array | null {\n let str = input;\n if (str.startsWith('<~')) str = str.slice(2);\n if (str.endsWith('~>')) str = str.slice(0, -2);\n str = str.replace(/\\s/g, '');\n if (str.length === 0) return new Uint8Array(0);\n\n const output: number[] = [];\n let i = 0;\n\n while (i < str.length) {\n if (str[i] === 'z') {\n output.push(0, 0, 0, 0);\n i++;\n continue;\n }\n\n const remaining = str.length - i;\n const chunkLen = Math.min(5, remaining);\n if (chunkLen === 1) break; // trailing single char from truncated input; ignore it\n\n let padded = str.slice(i, i + chunkLen);\n while (padded.length < 5) padded += 'u';\n\n let value = 0;\n for (let j = 0; j < 5; j++) {\n const digit = padded.charCodeAt(j) - 33;\n if (digit < 0 || digit > 84) return null;\n value = value * 85 + digit;\n }\n\n // Applies to padded short tails too: a group whose value exceeds uint32 is invalid input.\n if (value > 0xffffffff) return null;\n\n const v = value;\n const numBytes = chunkLen === 5 ? 4 : chunkLen - 1;\n if (numBytes >= 1) output.push((v >>> 24) & 0xff);\n if (numBytes >= 2) output.push((v >>> 16) & 0xff);\n if (numBytes >= 3) output.push((v >>> 8) & 0xff);\n if (numBytes >= 4) output.push(v & 0xff);\n\n i += chunkLen;\n }\n\n return new Uint8Array(output);\n}\n","import { ascii85Decode } from './ascii85';\nimport { inflateData } from './compression';\n\nconst textDecoder = new TextDecoder();\nconst textEncoder = new TextEncoder();\n\nenum MIAMVersion {\n V1 = 1,\n V2 = 2,\n}\n\nenum MIAMFid {\n SingleTransfer = 'T',\n FileTransferRequest = 'F',\n FileTransferAccept = 'K',\n FileSegment = 'S',\n FileTransferAbort = 'A',\n XOFFIndication = 'Y',\n XONIndication = 'X',\n}\n\nenum MIAMCorePdu {\n Data = 0,\n Ack = 1,\n Aloha = 2,\n AlohaReply = 3,\n}\n\nenum MIAMCoreApp {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nexport enum MIAMCoreV1Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nexport enum MIAMCoreV2Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nconst MIAMCoreV1CRCLength = 4;\nconst MIAMCoreV2CRCLength = 2;\n\ninterface PduACARSData {\n tail?: string;\n label: string;\n sublabel?: string;\n mfi?: string;\n text?: string;\n}\n\ninterface PduNonACARSData {\n appId?: string;\n text?: string;\n}\n\ninterface Pdu {\n version: MIAMVersion;\n crc: number;\n crcOk: boolean;\n complete: boolean;\n compression: number;\n encoding: number;\n msgNum: number;\n ackOptions: number;\n acars?: PduACARSData;\n non_acars?: PduNonACARSData;\n}\nconst isMIAMVersion = (x: number): x is MIAMVersion =>\n Object.values(MIAMVersion).includes(x as MIAMVersion);\nconst isMIAMFid = (x: string): x is MIAMFid =>\n Object.values(MIAMFid).includes(x as MIAMFid);\nconst isMIAMCoreApp = (x: number): x is MIAMCoreApp =>\n Object.values(MIAMCoreApp).includes(x as MIAMCoreApp);\nconst isMIAMCorePdu = (x: number): x is MIAMCorePdu =>\n Object.values(MIAMCorePdu).includes(x as MIAMCorePdu);\n\ninterface PduDecodingSuccess {\n decoded: true;\n message: {\n data: Pdu;\n };\n}\n\ninterface PduDecodingFailure {\n decoded: false;\n error: string;\n}\n\ntype PduDecodingResult = PduDecodingSuccess | PduDecodingFailure;\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: Record<\n MIAMVersion,\n Record<MIAMCoreApp, number>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n [MIAMVersion.V2]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n };\n\n static FidHandlerTable: Record<MIAMFid, (txt: string) => PduDecodingResult> =\n {\n [MIAMFid.SingleTransfer]: (txt: string) => {\n if (txt.length < 3) {\n return {\n decoded: false,\n error: 'Raw MIAM message too short (' + txt.length + ' < 3) ',\n };\n }\n\n let bpad = txt[0];\n\n if ('0123-.'.indexOf(bpad) === -1) {\n return {\n decoded: false,\n error: \"Invalid body padding value: '\" + bpad + \"'\",\n };\n }\n\n if ('0123'.indexOf(txt[1]) === -1) {\n return {\n decoded: false,\n error: \"Invalid header padding value: '\" + txt[1] + \"'\",\n };\n }\n\n const hpad = parseInt(txt[1]);\n\n const delimIdx = txt.indexOf('|');\n if (delimIdx === -1) {\n return {\n decoded: false,\n error: 'Raw MIAM message missing header-body delimiter',\n };\n }\n\n const rawHdr = txt.substring(2, delimIdx);\n if (rawHdr.length === 0) {\n return {\n decoded: false,\n error: 'Empty MIAM message header',\n };\n }\n\n let hdr = ascii85Decode('<~' + rawHdr + '~>');\n if (!hdr || hdr.length < hpad) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message header',\n };\n }\n\n let body: Uint8Array | undefined = undefined;\n\n const rawBody = txt.substring(delimIdx + 1);\n if (rawBody.length > 0) {\n if ('0123'.indexOf(bpad) >= 0) {\n const bpadValue = parseInt(bpad);\n\n const decoded = ascii85Decode('<~' + rawBody + '~>');\n if (decoded === null) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message body',\n };\n }\n body = decoded;\n if (body.length >= bpadValue) {\n body = body.subarray(0, body.length - bpadValue);\n }\n } else if (bpad === '-') {\n body = textEncoder.encode(rawBody);\n }\n }\n\n hdr = hdr.subarray(0, hdr.length - hpad);\n\n const version = hdr[0] & 0xf;\n const pduType = (hdr[0] >> 4) & 0xf;\n\n if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {\n const versionPduHandler =\n this.VersionPduHandlerTable[version][pduType];\n return versionPduHandler(hdr, body);\n } else {\n return {\n decoded: false,\n error:\n 'Invalid version and PDU type combination: v=' +\n version +\n ', pdu=' +\n pduType,\n };\n }\n },\n [MIAMFid.FileTransferRequest]: () => {\n return {\n decoded: false,\n error: 'File Transfer Request not implemented',\n };\n },\n [MIAMFid.FileTransferAccept]: () => {\n return {\n decoded: false,\n error: 'File Transfer Accept not implemented',\n };\n },\n [MIAMFid.FileSegment]: () => {\n return { decoded: false, error: 'File Segment not implemented' };\n },\n [MIAMFid.FileTransferAbort]: () => {\n return { decoded: false, error: 'File Transfer Abort not implemented' };\n },\n [MIAMFid.XOFFIndication]: () => {\n return { decoded: false, error: 'XOFF Indication not implemented' };\n },\n [MIAMFid.XONIndication]: () => {\n return { decoded: false, error: 'XON Indication not implemented' };\n },\n };\n\n private static arincCrc16(buf: Uint8Array, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,\n 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,\n 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,\n 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,\n 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,\n 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,\n 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,\n 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,\n 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,\n 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,\n 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,\n 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,\n 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[(((crc >>> 8) ^ buf[i]) >>> 0) & 0xff]) >>>\n 0;\n }\n\n return crc & 0xffff;\n }\n\n private static arinc665Crc32(buf: Uint8Array, seed?: number) {\n const crctable = [\n 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,\n 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,\n 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,\n 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,\n 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,\n 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,\n 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,\n 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,\n 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,\n 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,\n 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,\n 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,\n 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,\n 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,\n 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,\n 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,\n 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,\n 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,\n 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,\n 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,\n 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,\n 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,\n 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,\n 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,\n 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,\n 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,\n 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,\n 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,\n 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,\n 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,\n 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,\n 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,\n 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,\n 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,\n 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,\n 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,\n 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,\n 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,\n 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,\n 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,\n 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,\n 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,\n 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,\n ];\n\n let crc = seed || 0;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^ crctable[((crc >>> 24) ^ buf[i]) >>> 0]) >>> 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string): PduDecodingResult {\n const fidType = txt[0];\n\n if (isMIAMFid(fidType)) {\n const handler = this.FidHandlerTable[fidType];\n return handler(txt.substring(1));\n } else {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n }\n\n private static corePduDataHandler(\n version: MIAMVersion,\n minHdrSize: number,\n crcLen: number,\n hdr: Uint8Array,\n body?: Uint8Array,\n ): PduDecodingResult {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error:\n 'v' +\n version +\n ' header size too short; expected >= ' +\n minHdrSize +\n ', got ' +\n hdr.length,\n };\n }\n\n let pduSize: number | undefined = undefined;\n let pduCompression: number = 0;\n let pduEncoding: number = 0;\n let pduAppType: number = 0;\n let pduAppId: string = '';\n let pduCrc: number = 0;\n let pduData: Uint8Array | null = null;\n let pduCrcIsOk: boolean = false;\n let pduIsComplete: boolean = true;\n\n let pduErrors: string[] = [];\n\n let tail: string | undefined = undefined;\n let msgNum: number = 0;\n let ackOptions: number = 0;\n\n if (version === MIAMVersion.V1) {\n pduSize = (hdr[1] << 16) | (hdr[2] << 8) | hdr[3];\n\n const msgSize = hdr.length + (body === undefined ? 0 : body.length);\n if (pduSize > msgSize) {\n pduIsComplete = false;\n pduErrors.push(\n 'v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize,\n );\n }\n hdr = hdr.subarray(4);\n\n tail = textDecoder.decode(hdr.subarray(0, 7));\n hdr = hdr.subarray(7);\n } else if (version === MIAMVersion.V2) {\n hdr = hdr.subarray(1);\n }\n\n msgNum = (hdr[0] >> 1) & 0x7f;\n ackOptions = hdr[0] & 1;\n hdr = hdr.subarray(1);\n\n pduCompression = ((hdr[0] << 2) | ((hdr[1] >> 6) & 0x3)) & 0x7;\n pduEncoding = (hdr[1] >> 4) & 0x3;\n pduAppType = hdr[1] & 0xf;\n hdr = hdr.subarray(2);\n\n let appIdLen;\n if (isMIAMCoreApp(pduAppType)) {\n appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];\n } else {\n if (\n version === MIAMVersion.V2 &&\n (pduAppType & 0x8) !== 0 &&\n pduAppType !== 0xd\n ) {\n appIdLen = (pduAppType & 0x7) + 1;\n } else {\n return {\n decoded: false,\n error: 'Invalid v' + version + ' appType: ' + pduAppType,\n };\n }\n }\n\n const pduIsACARS =\n [\n MIAMCoreApp.ACARS2Char,\n MIAMCoreApp.ACARS4Char,\n MIAMCoreApp.ACARS6Char,\n ].indexOf(pduAppType) >= 0;\n\n if (hdr.length < appIdLen + crcLen) {\n return {\n decoded: false,\n error: 'Header too short for v' + version + ' appType: ' + pduAppType,\n };\n }\n\n pduAppId = textDecoder.decode(hdr.subarray(0, appIdLen));\n hdr = hdr.subarray(appIdLen);\n\n if (crcLen === 4) {\n pduCrc = (hdr[0] << 24) | (hdr[1] << 16) | (hdr[2] << 8) | hdr[3]; // crc\n } else if (crcLen === 2) {\n pduCrc = (hdr[0] << 8) | hdr[1]; // crc\n }\n hdr = hdr.subarray(crcLen);\n\n if (body !== undefined && body.length > 0) {\n if (\n [MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(\n pduCompression,\n ) >= 0\n ) {\n try {\n const inflated = inflateData(body, true);\n if (inflated === undefined) {\n pduErrors.push('Inflation produced no output for body');\n } else {\n pduData = inflated;\n }\n } catch (e) {\n pduErrors.push('Inflation failed for body: ' + e);\n }\n } else if (\n [MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(\n pduCompression,\n ) >= 0\n ) {\n pduData = body;\n } else {\n pduErrors.push(\n 'Unsupported v' + version + ' compression type: ' + pduCompression,\n );\n }\n\n if (pduData !== null) {\n const crcAlgoHandlerByVersion: Record<\n MIAMVersion,\n (buf: Uint8Array, seed?: number) => number\n > = {\n [MIAMVersion.V1]: (buf: Uint8Array, seed?: number) => {\n return ~this.arinc665Crc32(buf, seed);\n },\n [MIAMVersion.V2]: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n error: 'No CRC handler for v' + version,\n };\n }\n\n const crcCheck = crcAlgoHandler(pduData, 0xffffffff);\n if (crcCheck === pduCrc) {\n pduCrcIsOk = true;\n } else {\n pduErrors.push(\n 'Body failed CRC check: provided=' +\n pduCrc +\n ', generated=' +\n crcCheck,\n );\n }\n }\n } else {\n // No PDU body means we can't verify CRC checksum; however, the message should still be valid...\n pduCrcIsOk = true;\n }\n\n let pdu: Pdu = {\n version,\n crc: pduCrc,\n crcOk: pduCrcIsOk,\n complete: pduIsComplete,\n compression: pduCompression,\n encoding: pduEncoding,\n msgNum,\n ackOptions,\n };\n\n if (pduIsACARS) {\n const label = pduAppId.substring(0, 2);\n const sublabel = appIdLen >= 4 ? pduAppId.substring(2, 4) : undefined;\n const mfi = appIdLen >= 6 ? pduAppId.substring(4, 6) : undefined;\n\n pdu.acars = {\n ...(tail ? { tail } : {}),\n label,\n ...(sublabel ? { sublabel } : {}),\n ...(mfi ? { mfi } : {}),\n ...(pduData ? { text: textDecoder.decode(pduData) } : {}),\n };\n } else {\n pdu.non_acars = {\n appId: pduAppId,\n ...(pduData ? { text: textDecoder.decode(pduData) } : {}),\n };\n }\n\n return {\n decoded: true,\n message: {\n data: pdu,\n },\n };\n }\n\n static VersionPduHandlerTable: Record<\n MIAMVersion,\n Record<\n MIAMCorePdu,\n (hdr: Uint8Array, body?: Uint8Array) => PduDecodingResult\n >\n > = {\n [MIAMVersion.V1]: {\n [MIAMCorePdu.Data]: (hdr: Uint8Array, body?: Uint8Array) => {\n return this.corePduDataHandler(\n MIAMVersion.V1,\n 20,\n MIAMCoreV1CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v1 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v1 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v1 AlohaReply PDU not implemented' };\n },\n },\n [MIAMVersion.V2]: {\n [MIAMCorePdu.Data]: (hdr: Uint8Array, body?: Uint8Array) => {\n return this.corePduDataHandler(\n MIAMVersion.V2,\n 7,\n MIAMCoreV2CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v2 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v2 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v2 Aloha reply PDU not implemented' };\n },\n },\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_MA extends DecoderPlugin {\n name = 'label-ma';\n qualifiers() {\n return {\n labels: ['MA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const miamResult = MIAMCoreUtils.parse(message.text);\n if (\n miamResult.decoded &&\n miamResult.message.data &&\n miamResult.message.data.acars\n ) {\n decodeResult.decoded = true;\n ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);\n if (miamResult.message.data.acars.sublabel) {\n ResultFormatter.sublabel(\n decodeResult,\n miamResult.message.data.acars.sublabel,\n );\n }\n if (miamResult.message.data.acars.tail) {\n ResultFormatter.tail(\n decodeResult,\n miamResult.message.data.acars.tail.replace('.', ''),\n );\n }\n\n const messageText = miamResult.message.data.acars.text;\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (\n miamResult.message.data.crcOk &&\n miamResult.message.data.complete &&\n messageText\n ) {\n decodeResult.decoder.decodeLevel = 'full';\n const decoded = this.decoder.decode(\n {\n label: miamResult.message.data.acars.label,\n sublabel: miamResult.message.data.acars.sublabel,\n text: messageText,\n },\n options,\n );\n\n if (decoded.decoded) {\n // decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n } else {\n ResultFormatter.text(decodeResult, messageText);\n decodeResult.remaining = { text: messageText };\n }\n } else if (messageText) {\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.remaining = { text: messageText };\n } else {\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_SQ extends DecoderPlugin {\n name = 'label-sq';\n\n qualifiers() {\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Ground Station Squitter');\n\n decodeResult.raw.preamble = message.text.substring(0, 4);\n decodeResult.raw.version = Number(message.text.substring(1, 2));\n decodeResult.raw.network = message.text.substring(3, 4);\n\n if (decodeResult.raw.version === 2) {\n const regex =\n /0(\\d)X(?<org>\\w)(?<iata>\\w\\w\\w)(?<icao>\\w\\w\\w\\w)(?<station>\\d)(?<lat>\\d+)(?<latd>[NS])(?<lng>\\d+)(?<lngd>[EW])V(?<vfreq>\\d+)\\/.*/;\n const result = message.text.match(regex);\n\n if (result?.groups && result.length >= 8) {\n decodeResult.raw.groundStation = {\n number: result.groups.station,\n iataCode: result.groups.iata,\n icaoCode: result.groups.icao,\n coordinates: {\n latitude:\n (Number(result.groups.lat) / 100) *\n (result.groups.latd === 'S' ? -1 : 1),\n longitude:\n (Number(result.groups.lng) / 100) *\n (result.groups.lngd === 'W' ? -1 : 1),\n },\n };\n decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1000.0;\n }\n }\n\n var formattedNetwork = 'Unknown';\n if (decodeResult.raw.network == 'A') {\n formattedNetwork = 'ARINC';\n } else if (decodeResult.raw.network == 'S') {\n formattedNetwork = 'SITA';\n }\n decodeResult.formatted.items = [\n {\n type: 'network',\n code: 'NETT',\n label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n code: 'VER',\n label: 'Version',\n value: String(decodeResult.raw.version),\n },\n ];\n\n if (decodeResult.raw.groundStation) {\n if (\n decodeResult.raw.groundStation.icaoCode &&\n decodeResult.raw.groundStation.number\n ) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\n code: 'GNDSTN',\n label: 'Ground Station',\n value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,\n });\n }\n if (decodeResult.raw.groundStation.iataCode) {\n decodeResult.formatted.items.push({\n type: 'iataCode',\n code: 'IATA',\n label: 'IATA',\n value: decodeResult.raw.groundStation.iataCode,\n });\n }\n if (decodeResult.raw.groundStation.icaoCode) {\n decodeResult.formatted.items.push({\n type: 'icaoCode',\n code: 'ICAO',\n label: 'ICAO',\n value: decodeResult.raw.groundStation.icaoCode,\n });\n }\n if (decodeResult.raw.groundStation.coordinates.latitude) {\n decodeResult.formatted.items.push({\n type: 'coordinates',\n code: 'COORD',\n label: 'Ground Station Location',\n value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,\n });\n }\n if (decodeResult.raw.groundStation.airport) {\n decodeResult.formatted.items.push({\n type: 'airport',\n code: 'APT',\n label: 'Airport',\n value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,\n });\n }\n }\n\n if (decodeResult.raw.vdlFrequency) {\n decodeResult.formatted.items.push({\n type: 'vdlFrequency',\n code: 'VDLFRQ',\n label: 'VDL Frequency',\n value: `${decodeResult.raw.vdlFrequency} MHz`,\n });\n }\n this.setDecodeLevel(decodeResult, true, 'full');\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() {\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ON Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.on(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() {\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OUT Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.out(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() {\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'IN Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.in(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() {\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'OFF Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n if (message.text.substring(12, 19) === '\\r\\n001FE') {\n decodeResult.raw.day = message.text.substring(19, 21);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)),\n );\n let latdir = message.text.substring(27, 28);\n let latdeg = Number(message.text.substring(28, 30));\n let latmin = Number(message.text.substring(30, 34));\n let londir = message.text.substring(34, 35);\n let londeg = Number(message.text.substring(35, 38));\n let lonmin = Number(message.text.substring(38, 42));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));\n ResultFormatter.position(decodeResult, pos);\n\n const gsField = message.text.substring(45, 48);\n if (decodeResult.remaining.text !== '---' && gsField !== '---') {\n ResultFormatter.groundspeed(decodeResult, Number(gsField));\n } else {\n ResultFormatter.unknown(decodeResult, gsField);\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + '00'),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n }\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n} from './DecoderPluginInterface';\n\nimport * as Plugins from './plugins/official';\n\n/**\n * Ordered list of plugin constructors. Order matters — plugins are tried\n * sequentially until one returns decoded: true.\n */\nconst pluginClasses = [\n Plugins.CBand, // first, for now, so it can wrap other plugins\n Plugins.LibAcars,\n Plugins.Arinc702,\n Plugins.Label_ColonComma,\n Plugins.Label_5Z_Slash,\n Plugins.Label_10_LDR,\n Plugins.Label_10_POS,\n Plugins.Label_10_Slash,\n Plugins.Label_12_N_Space,\n Plugins.Label_12_POS,\n Plugins.Label_13Through18_Slash,\n Plugins.Label_15,\n Plugins.Label_15_FST,\n Plugins.Label_16_AUTPOS,\n Plugins.Label_16_Honeywell,\n Plugins.Label_16_N_Space,\n Plugins.Label_16_POSA1,\n Plugins.Label_16_TOD,\n Plugins.Label_1L_3Line,\n Plugins.Label_1L_070,\n Plugins.Label_1L_660,\n Plugins.Label_1L_Slash,\n Plugins.Label_20_POS,\n Plugins.Label_21_POS,\n Plugins.Label_22_OFF,\n Plugins.Label_22_POS,\n Plugins.Label_24_Slash,\n Plugins.Label_2P_FM3,\n Plugins.Label_2P_FM4,\n Plugins.Label_2P_FM5,\n Plugins.Label_30_Slash_EA,\n Plugins.Label_44_ETA,\n Plugins.Label_44_IN,\n Plugins.Label_44_OFF,\n Plugins.Label_44_ON,\n Plugins.Label_44_POS,\n Plugins.Label_44_Slash,\n Plugins.Label_4A,\n Plugins.Label_4A_01,\n Plugins.Label_4A_DIS,\n Plugins.Label_4A_DOOR,\n Plugins.Label_4A_Slash_01,\n Plugins.Label_4N,\n Plugins.Label_4T_AGFSR,\n Plugins.Label_4T_ETA,\n Plugins.Label_B6_Forwardslash,\n Plugins.Label_H1_76401,\n Plugins.Label_H1_ATIS,\n Plugins.Label_H1_EZF,\n Plugins.Label_H1_FLR,\n Plugins.Label_H1_M_POS,\n Plugins.Label_H1_OHMA,\n Plugins.Label_H1_OFP,\n Plugins.Label_H1_Paren,\n Plugins.Label_H1_WRN,\n Plugins.Label_H1_StarPOS,\n Plugins.Label_H2_02E,\n Plugins.Label_HX,\n Plugins.Label_58,\n Plugins.Label_80,\n Plugins.Label_83,\n Plugins.Label_8E,\n Plugins.Label_1M_Slash,\n Plugins.Label_MA,\n Plugins.Label_SQ,\n Plugins.Label_QP,\n Plugins.Label_QQ,\n Plugins.Label_QR,\n Plugins.Label_QS,\n];\n\n/**\n * Per-plugin metadata captured at registration time so that decode() can\n * avoid re-invoking plugin.qualifiers() (and re-allocating its arrays) on\n * every message.\n */\ninterface PluginEntry {\n plugin: DecoderPluginInterface;\n preambles: string[] | undefined;\n}\n\nexport class MessageDecoder {\n name: string;\n plugins: Array<DecoderPluginInterface>;\n debug: boolean;\n\n /** Maps a label string to the candidate entries (wildcard + label-specific) in registration order. */\n private candidatesByLabel: Map<string, PluginEntry[]> = new Map();\n /** Wildcard entries (plugins that register the '*' label). */\n private wildcardEntries: PluginEntry[] = [];\n /** Membership set for wildcard entries to dedupe when a plugin also registers a specific label. */\n private wildcardSet: Set<DecoderPluginInterface> = new Set();\n\n constructor() {\n this.name = 'acars-decoder-typescript';\n this.plugins = [];\n this.debug = false;\n\n for (const PluginClass of pluginClasses) {\n this.registerPlugin(new PluginClass(this));\n }\n }\n\n registerPlugin(plugin: DecoderPluginInterface): boolean {\n this.plugins.push(plugin);\n\n const qualifiers = plugin.qualifiers();\n const entry: PluginEntry = {\n plugin,\n preambles:\n qualifiers.preambles && qualifiers.preambles.length > 0\n ? qualifiers.preambles\n : undefined,\n };\n\n for (const label of qualifiers.labels) {\n if (label === '*') {\n if (!this.wildcardSet.has(plugin)) {\n this.wildcardEntries.push(entry);\n this.wildcardSet.add(plugin);\n // Insert the new wildcard at the end of the wildcard section\n // in every existing label bucket so that wildcard plugins are\n // still tried before label-specific ones while preserving\n // registration order among wildcard plugins (matching how new\n // buckets are seeded via wildcardEntries.slice() below).\n const wildcardInsertIndex = this.wildcardEntries.length - 1;\n for (const bucket of this.candidatesByLabel.values()) {\n // Skip buckets that already hold this plugin: a plugin whose\n // qualifiers list a specific label before '*' has already been\n // pushed into that bucket by the specific-label branch below.\n if (bucket.some((e) => e.plugin === plugin)) {\n continue;\n }\n bucket.splice(wildcardInsertIndex, 0, entry);\n }\n }\n } else {\n let bucket = this.candidatesByLabel.get(label);\n if (!bucket) {\n // Seed new bucket with all wildcard entries (in registration order)\n // so they remain ahead of label-specific plugins.\n bucket = this.wildcardEntries.slice();\n this.candidatesByLabel.set(label, bucket);\n }\n // Skip if this plugin is a wildcard plugin already in the bucket.\n if (!this.wildcardSet.has(plugin)) {\n bucket.push(entry);\n }\n }\n }\n\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const text = message.text;\n const candidates =\n this.candidatesByLabel.get(message.label) ?? this.wildcardEntries;\n\n if (options.debug) {\n console.log('Usable plugins');\n console.log(\n candidates\n .filter((e) => this.matchesPreambles(text, e.preambles))\n .map((e) => e.plugin),\n );\n }\n\n let result: DecodeResult = {\n decoded: false,\n error: 'No known decoder plugin for this message',\n decoder: {\n name: 'none',\n type: 'none',\n decodeLevel: 'none',\n },\n message: message,\n remaining: {\n text: text,\n },\n raw: {},\n formatted: {\n description: 'Not Decoded',\n items: [],\n },\n };\n\n for (let i = 0; i < candidates.length; i++) {\n const entry = candidates[i];\n if (!this.matchesPreambles(text, entry.preambles)) {\n continue;\n }\n const pluginResult = entry.plugin.decode(message, options);\n if (pluginResult.decoded) {\n result = pluginResult;\n break;\n }\n }\n\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n\n private matchesPreambles(\n text: string,\n preambles: string[] | undefined,\n ): boolean {\n if (!preambles) {\n return true;\n }\n for (let i = 0; i < preambles.length; i++) {\n if (text.startsWith(preambles[i])) {\n return true;\n }\n }\n return false;\n }\n}\n","#!/usr/bin/env node\n\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { MessageDecoder } from '../MessageDecoder';\n\nfunction debugMessage(message: Message, decoding: DecodeResult) {\n console.log('ORIGINAL MESSAGE');\n console.log('Label:', message.label);\n console.log('Text:', message.text);\n console.log();\n console.log('Decoded Message:');\n console.log(decoding.formatted.description);\n if (decoding.formatted.items && decoding.formatted.items.length > 0) {\n decoding.formatted.items.forEach((item) => {\n console.log(`${item.label} - ${item.value}`);\n });\n }\n console.log();\n}\n\nfunction decode(label: string, text: string) {\n const message = {\n label: label,\n text: text,\n };\n const decoder = new MessageDecoder();\n const decoding = decoder.decode(message);\n debugMessage(message, decoding);\n}\n\n// Label 12 with N space\ndecode('12', 'N 42.150,W121.187,39000,161859, 109,.C-GWSO,1742');\ndecode('12', 'N 28.371,W 80.458,38000,170546, 100,.C-GVWJ,1736');\n\n// Label 16 with N space\ndecode('16', 'N 44.203,W 86.546,31965,6, 290');\ndecode('16', 'N 44.988,W121.644,35940,6, 170');\ndecode('16', 'N 28.177/W 96.055');\ndecode('16', 'N 44.640/W119.729');\n\n// Label 30 with slash EA\ndecode('30', '/EA1830/DSKSFO/SK24');\ndecode('30', '/EA1611/DSMMSD/SK24');\ndecode('30', '/EA1719/DSKSFO/SK23');\n\n// Label 5Z\ndecode('5Z', '/R3 SNAORD 2205-14 SNA');\n\n// Label 80 + 3N01 POSRPT\ndecode(\n '80',\n '3N01 POSRPT 0570/13 MSLP/KJFK .N603AV/04F 00:59\\n\\\n/NWYP ORF /HDG 074/MCH 779\\n\\\n/POS N3630.7W07701.8/FL 350/TAS 453/SAT -054\\n\\\n/SWND 079/DWND 216/FOB N006857/ETA 01:40.3',\n);\n\n// Label H1 + M1BPOS\ndecode(\n 'H1',\n '#M1BPOSN32492W117178,N33492W118335,195835,350,N32463W117143,195907,N32359W117014,M51,25872,249/TS195835,1214195C27',\n);\n\n// Label H1 with POS\ndecode(\n 'H1',\n 'POSN43312W123174,EASON,215754,370,EBINY,220601,ELENN,M48,02216,185/TS215754,0921227A40',\n);\ndecode(\n 'H1',\n 'POSN45209W122550,PEGTY,220309,134,MINNE,220424,HISKU,M6,060013,269,366,355K,292K,730A5B',\n);\ndecode(\n 'H1',\n 'POSN43030W122406,IBALL,220516,380,AARON,220816,MOXEE,M47,0047,86/TS220516,092122BF64',\n);\ndecode(\n 'H1',\n 'POSN33225W079428,SCOOB,232933,340,ENEME,235712,FETAL,M42,003051,15857F6',\n);\n\n// Label 8E\ndecode('8E', 'EGSS,1618');\n\n// Label 1M with slash\ndecode(\n '1M',\n `/BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0\n1940/EGLL27L/10 `,\n);\ndecode(\n '1M',\n `/AY1416/ETA02/230822/EDDF/EFHK/EETN/2JK0\n1956/EFHK04L/50 \n / / / / / /`,\n);\n\n// some Positions messages\ndecode('15', '(2N38111W 82211266 76400-64(Z');\ndecode('15', '(2N46315E 40252 40300-45(Z');\ndecode('15', 'FST01KMCOEGKKN505552W00118021');\ndecode('20', 'POSN38160W077075,,211733,360,OTT,212041,,N42,19689,40,544');\ndecode('44', '00ETA02,N38338W121179,KMHR,KPDX,0806,2355,005.1');\ndecode('44', 'IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1');\ndecode('44', 'OFF02,N38334W121176,KMHR,KPDX,0807,0014,0123,004.9');\ndecode('44', 'ON02,N38333W121178,KRNO,KMHR,0806,2350,005.2');\ndecode('44', 'POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1');\ndecode('44', 'POS02,N51112 E000516,390,EGCC,LYBE,0608,1851,2053,00091');\ndecode('H1', 'POSN50378W002590,ELRIP,091226');\n"],"mappings":"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MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1B;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aACK,OAAO,MAAO,IACf,UAAY,QAAQ,IAAK,IAAI,CAAC,OAAO,IAAK,GAAI,OAChD;AAAA,IACJ;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAiB,MAAe;AAC3D,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAA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","names":["data","NEWLINE_REGEX","WS_REGEX","textDecoder","MIAMVersion","MIAMFid","MIAMCorePdu","MIAMCoreApp","textDecoder"]}
1
+ {"version":3,"sources":["../../lib/utils/coordinate_utils.ts","../../lib/DateTimeUtils.ts","../../lib/utils/route_utils.ts","../../lib/utils/result_formatter.ts","../../lib/DecoderPlugin.ts","../../lib/plugins/Lib_ACARS.ts","../../lib/plugins/CBand.ts","../../lib/utils/flight_plan_utils.ts","../../lib/utils/arinc_702_helper.ts","../../lib/plugins/ARINC_702.ts","../../lib/utils/acars_free_text.ts","../../lib/plugins/Label_5Z_Slash.ts","../../lib/utils/swa_request.ts","../../lib/plugins/Label_10_LDR.ts","../../lib/plugins/Label_10_LRW.ts","../../lib/plugins/Label_10_POS.ts","../../lib/plugins/Label_10_Slash.ts","../../lib/utils/runway_utils.ts","../../lib/plugins/Label_11_LDR.ts","../../lib/plugins/Label_11_LRW.ts","../../lib/plugins/Label_12_N_Space.ts","../../lib/plugins/Label_12_POS.ts","../../lib/plugins/Label_13Through18_Slash.ts","../../lib/plugins/Label_15.ts","../../lib/plugins/Label_15_FST.ts","../../lib/plugins/Label_16_AUTPOS.ts","../../lib/plugins/Label_16_Honeywell.ts","../../lib/plugins/Label_16_N_Space.ts","../../lib/plugins/Label_16_POSA1.ts","../../lib/plugins/Label_16_TOD.ts","../../lib/plugins/Label_1M_Slash.ts","../../lib/plugins/Label_1L_3-line.ts","../../lib/plugins/Label_1L_070.ts","../../lib/plugins/Label_1L_660.ts","../../lib/plugins/Label_1L_Slash.ts","../../lib/plugins/Label_20_POS.ts","../../lib/plugins/Label_21_POS.ts","../../lib/plugins/Label_22_OFF.ts","../../lib/plugins/Label_22_POS.ts","../../lib/plugins/Label_2P_FM3.ts","../../lib/plugins/Label_2P_FM4.ts","../../lib/plugins/Label_2P_FM5.ts","../../lib/plugins/Label_24_Slash.ts","../../lib/plugins/Label_30_Slash_EA.ts","../../lib/utils/swa_compressed.ts","../../lib/utils/swa_fields.ts","../../lib/plugins/Label_37_SWA.ts","../../lib/plugins/Label_40_SWA.ts","../../lib/plugins/Label_44_ETA.ts","../../lib/plugins/Label_44_Base.ts","../../lib/plugins/Label_44_IN.ts","../../lib/plugins/Label_44_OFF.ts","../../lib/plugins/Label_44_ON.ts","../../lib/plugins/Label_44_POS.ts","../../lib/plugins/Label_44_Slash.ts","../../lib/plugins/Label_4A.ts","../../lib/plugins/Label_4A_01.ts","../../lib/plugins/Label_4A_DIS.ts","../../lib/plugins/Label_4A_DOOR.ts","../../lib/plugins/Label_4A_Slash_01.ts","../../lib/plugins/Label_4N.ts","../../lib/plugins/Label_4T_AGFSR.ts","../../lib/plugins/Label_58.ts","../../lib/plugins/Label_4T_ETA.ts","../../lib/plugins/Label_80.ts","../../lib/plugins/Label_83.ts","../../lib/plugins/Label_8E.ts","../../lib/plugins/Label_B6.ts","../../lib/plugins/Label_ColonComma.ts","../../lib/plugins/Label_H1_76401.ts","../../lib/plugins/Label_H1_ATIS.ts","../../lib/plugins/Label_H1_EZF.ts","../../lib/plugins/Label_H1_FLR.ts","../../lib/plugins/Label_H1_M_POS.ts","../../lib/utils/compression.ts","../../lib/plugins/Label_H1_OHMA.ts","../../lib/utils/icao_fpl_utils.ts","../../lib/plugins/Label_H1_OFP.ts","../../lib/plugins/Label_H1_Paren.ts","../../lib/plugins/Label_H1_StarPOS.ts","../../lib/plugins/Label_H1_SWA_Track.ts","../../lib/plugins/Label_H1_WRN.ts","../../lib/plugins/Label_H2_02E.ts","../../lib/plugins/Label_HX.ts","../../lib/utils/ascii85.ts","../../lib/utils/miam.ts","../../lib/plugins/Label_MA.ts","../../lib/plugins/Label_SQ.ts","../../lib/plugins/Label_QR.ts","../../lib/plugins/Label_QP.ts","../../lib/plugins/Label_QS.ts","../../lib/plugins/Label_QQ.ts","../../lib/MessageDecoder.ts","../../lib/bin/acars-decoder-test.ts"],"sourcesContent":["export class CoordinateUtils {\n /**\n * Decode a string of coordinates into an object with latitude and longitude in millidegrees\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinates(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.charAt(0);\n let middleChar = stringCoords.charAt(6);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar === ' ') {\n middleChar = stringCoords.charAt(7);\n longitudeChars = stringCoords.substring(8, 14);\n }\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (Number(stringCoords.substring(1, 6)) / 1000) *\n CoordinateUtils.getDirection(firstChar),\n longitude:\n (Number(longitudeChars) / 1000) *\n CoordinateUtils.getDirection(middleChar),\n };\n }\n\n return undefined;\n }\n\n /**\n * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinatesDecimalMinutes(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.charAt(0);\n let middleChar = stringCoords.charAt(6);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar === ' ') {\n middleChar = stringCoords.charAt(7);\n longitudeChars = stringCoords.substring(8, 14);\n }\n\n if (\n (firstChar !== 'N' && firstChar !== 'S') ||\n (middleChar !== 'W' && middleChar !== 'E')\n ) {\n return undefined;\n }\n\n const latRaw = Number(stringCoords.substring(1, 6));\n const lonRaw = Number(longitudeChars);\n const latDeg = Math.trunc(latRaw / 1000);\n const latMin = (latRaw % 1000) / 10;\n const lonDeg = Math.trunc(lonRaw / 1000);\n const lonMin = (lonRaw % 1000) / 10;\n\n return {\n latitude:\n (latDeg + latMin / 60) * CoordinateUtils.getDirection(firstChar),\n longitude:\n (lonDeg + lonMin / 60) * CoordinateUtils.getDirection(middleChar),\n };\n }\n public static coordinateString(coords: {\n latitude: number;\n longitude: number;\n }): string {\n const latDir = coords.latitude >= 0 ? 'N' : 'S';\n const lonDir = coords.longitude >= 0 ? 'E' : 'W';\n return `${Math.abs(coords.latitude).toFixed(3)} ${latDir}, ${Math.abs(coords.longitude).toFixed(3)} ${lonDir}`;\n }\n\n public static getDirection(coord: string): number {\n if (coord.startsWith('N') || coord.startsWith('E')) {\n return 1;\n } else if (coord.startsWith('S') || coord.startsWith('W')) {\n return -1;\n }\n return NaN;\n }\n\n public static dmsToDecimalDegrees(\n degrees: number,\n minutes: number,\n seconds: number,\n ): number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}\n","export class DateTimeUtils {\n // Expects a four digit UTC time string (HHMM)\n public static UTCToString(UTCString: string) {\n let utcDate = new Date();\n utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);\n return utcDate.toTimeString();\n }\n\n // Expects a six digit date string and a four digit UTC time string\n // (DDMMYY) (HHMM)\n public static UTCDateTimeToString(dateString: string, timeString: string) {\n const day = +dateString.substr(0, 2);\n // ACARS month is 1-12; JS Date months are 0-11, so subtract one.\n const month = +dateString.substr(2, 2) - 1;\n const year =\n dateString.length === 6\n ? 2000 + +dateString.substr(4, 2)\n : new Date().getUTCFullYear();\n const hours = +timeString.substr(0, 2);\n const minutes = +timeString.substr(2, 2);\n const seconds = timeString.length === 6 ? +timeString.substr(4, 2) : 0;\n // Build the date in one call so an incremental setUTC* on a Date that\n // was initialised to \"now\" can't roll the month forward when the\n // current real-world day is later than the last day of the target.\n const utcDate = new Date(\n Date.UTC(year, month, day, hours, minutes, seconds),\n );\n return utcDate.toUTCString();\n }\n\n /**\n *\n * @param time HHMMSS or HHMM\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number {\n if (time.length === 4) {\n time += '00';\n }\n const h = Number(time.substring(0, 2));\n const m = Number(time.substring(2, 4));\n const s = Number(time.substring(4, 6));\n const tod = h * 3600 + m * 60 + s;\n return tod;\n }\n\n public static convertDayTimeToTod(time: string): number {\n const d = Number(time.substring(0, 2));\n const h = Number(time.substring(2, 4));\n const m = Number(time.substring(4, 6));\n const s = Number(time.substring(6, 8));\n const tod = d * 86400 + h * 3600 + m * 60 + s;\n return tod;\n }\n\n /**\n *\n * @param time HHMMSS\n * @param date DDMMYY or DDMMYYYY\n * @returns seconds since epoch\n */\n public static convertDateTimeToEpoch(time: string, date: string): number {\n //YYYY-MM-DDTHH:mm:ss.sssZ\n if (date.length === 6) {\n date = date.substring(0, 4) + `20${date.substring(4, 6)}`;\n }\n const timestamp = `${date.substring(4, 8)}-${date.substring(2, 4)}-${date.substring(0, 2)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;\n const millis = Date.parse(timestamp);\n return millis / 1000;\n }\n\n /**\n * Converts a timestamp to a string\n *\n * ISO-8601 format for 'epoch'\n * HH:MM:SS for 'tod'\n * @param time\n * @param format\n * @returns\n */\n public static timestampToString(time: number): string {\n if (isNaN(time)) {\n return '';\n }\n const date = new Date(time * 1000);\n\n if (time < 86400) {\n // only time, no date\n return date.toISOString().slice(11, 19);\n }\n if (time < 32 * 86400) {\n // unknown month, day of month is time / 86400\n const day = String(Math.floor(time / 86400)).padStart(2, '0');\n return `YYYY-MM-${day}T${date.toISOString().slice(11, 19)}`;\n }\n //strip off millis\n return date.toISOString().slice(0, -5) + 'Z';\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { Route } from '../types/route';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from './coordinate_utils';\n\nexport class RouteUtils {\n public static formatFlightState(state: string): string {\n switch (state) {\n case 'TO':\n return 'Takeoff';\n case 'IC':\n return 'Initial Climb';\n case 'CL':\n return 'Climb';\n case 'ER':\n return 'En Route';\n case 'DC':\n return 'Descent';\n case 'AP':\n return 'Approach';\n default:\n return `Unknown ${state}`;\n }\n }\n\n public static routeToString(route: Route): string {\n let str = '';\n if (route.name) {\n str += route.name;\n }\n if (route.runway) {\n str += `(${route.runway})`;\n }\n if (str.length !== 0 && route.waypoints && route.waypoints.length === 1) {\n str += ' starting at ';\n } else if (str.length !== 0 && route.waypoints) {\n str += ': ';\n }\n\n if (route.waypoints) {\n str += RouteUtils.waypointsToString(route.waypoints);\n }\n\n return str;\n }\n\n public static waypointToString(waypoint: Waypoint): string {\n let s = waypoint.name;\n if (waypoint.latitude && waypoint.longitude) {\n s += `(${CoordinateUtils.coordinateString({ latitude: waypoint.latitude, longitude: waypoint.longitude })})`;\n }\n if (waypoint.offset) {\n s += `[${waypoint.offset.bearing}° ${waypoint.offset.distance}nm]`;\n }\n if (waypoint.time) {\n s += `@${DateTimeUtils.timestampToString(waypoint.time)}`;\n }\n return s;\n }\n\n public static getWaypoint(leg: string): Waypoint {\n const regex = leg.match(/^([A-Z]+)(\\d{3})-(\\d{4})$/); // {name}{bearing}-{distance}\n if (regex?.length == 4) {\n return {\n name: regex[1],\n offset: {\n bearing: parseInt(regex[2]),\n distance: parseInt(regex[3]) / 10,\n },\n };\n }\n\n const waypoint = leg.split(',');\n if (waypoint.length == 2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n waypoint[1],\n );\n if (position) {\n return {\n name: waypoint[0],\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n if (leg.length == 13 || leg.length == 14) {\n //looks like coordinates\n const position =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if (position) {\n return {\n name: name,\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n return { name: leg };\n }\n\n private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints\n .map((x) => RouteUtils.waypointToString(x))\n .join(' > ')\n .replaceAll('> >', '>>');\n if (str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { RouteUtils } from './route_utils';\nimport { Route } from '../types/route';\nimport { RunwayLandingData } from '../types/runway_landing_data';\nimport { TrackPoint } from '../types/track_point';\nimport { Wind } from '../types/wind';\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n static route(decodeResult: DecodeResult, route: Route) {\n decodeResult.raw.route = route;\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(route),\n });\n }\n\n static state_change(decodeResult: DecodeResult, from: string, to: string) {\n decodeResult.raw.state_change = {\n from: from,\n to: to,\n };\n from = RouteUtils.formatFlightState(from);\n to = RouteUtils.formatFlightState(to);\n decodeResult.formatted.items.push({\n type: 'state_change',\n code: 'STATE_CHANGE',\n label: 'State Change',\n value: `${from} -> ${to}`,\n });\n }\n\n static door_event(decodeResult: DecodeResult, name: string, state: string) {\n decodeResult.raw.door_event = {\n door: name,\n state: state,\n };\n\n decodeResult.formatted.items.push({\n type: 'door_event',\n code: 'DOOR',\n label: 'Door Event',\n value: `${name} ${state}`,\n });\n }\n\n static position(\n decodeResult: DecodeResult,\n value: { latitude: number; longitude: number } | undefined,\n ) {\n if (!value || isNaN(value.latitude) || isNaN(value.longitude)) {\n return;\n }\n decodeResult.raw.position = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(value),\n });\n }\n\n static altitude(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.altitude = value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n }\n\n static flightNumber(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.flight_number = value;\n decodeResult.formatted.items.push({\n type: 'flight_number',\n code: 'FLIGHT',\n label: 'Flight Number',\n value: decodeResult.raw.flight_number,\n });\n }\n\n static callsign(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.callsign = value;\n decodeResult.formatted.items.push({\n type: 'callsign',\n code: 'CALLSIGN',\n label: 'Callsign',\n value: decodeResult.raw.callsign,\n });\n }\n\n static departureAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n } else {\n decodeResult.raw.departure_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n }\n }\n\n static departureRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'DEPRWY',\n label: 'Departure Runway',\n value: decodeResult.raw.departure_runway,\n });\n }\n\n static arrivalAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n } else {\n decodeResult.raw.arrival_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n }\n }\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n }\n\n /** The airport landing data is for: the destination, or the airport of a divert. */\n static landingAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.landing_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'LAND',\n label: 'Landing Airport',\n value: decodeResult.raw.landing_icao,\n });\n }\n\n static eta(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.eta_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static arrivalRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ARWY',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n }\n\n static alternateRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ALT_ARWY',\n label: 'Alternate Runway',\n value: decodeResult.raw.alternate_runway,\n });\n }\n\n static currentFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_on_board = value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: 'Fuel On Board',\n value: decodeResult.raw.fuel_on_board.toString(),\n });\n }\n\n static burnedFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_burned = value;\n decodeResult.formatted.items.push({\n type: 'fuel_burned',\n code: 'FB',\n label: 'Fuel Burned',\n value: decodeResult.raw.fuel_burned.toString(),\n });\n }\n\n static remainingFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n code: 'FUEL_REM',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n }\n\n static outFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.out_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_OUT',\n label: 'Out of Gate Fuel',\n value: decodeResult.raw.out_fuel.toString() + ' lbs',\n });\n }\n\n static offFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.off_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_OFF',\n label: 'Takeoff Fuel',\n value: decodeResult.raw.off_fuel.toString() + ' lbs',\n });\n }\n\n static onFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.on_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_ON',\n label: 'Landing Fuel',\n value: decodeResult.raw.on_fuel.toString() + ' lbs',\n });\n }\n\n static inFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.in_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_IN',\n label: 'In Gate Fuel',\n value: decodeResult.raw.in_fuel.toString() + ' lbs',\n });\n }\n\n static startFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.start_fuel = value;\n decodeResult.formatted.items.push({\n type: 'lbs',\n code: 'FUEL_START',\n label: 'Start Fuel',\n value: decodeResult.raw.start_fuel.toString() + ' lbs',\n });\n }\n\n static checksumAlgorithm(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.checksum_algorithm = value;\n // decodeResult.formatted.items.push({\n // type: 'message_checksum_algorithm',\n // code: 'CHECKSUM_ALGO',\n // label: 'Checksum Algorithm',\n // value: decodeResult.raw.checksum_algorithm,\n // });\n }\n\n static checksum(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.checksum = value;\n decodeResult.formatted.items.push({\n type: 'message_checksum',\n code: 'CHECKSUM',\n label: 'Message Checksum',\n value:\n '0x' + (decodeResult.raw.checksum >>> 0).toString(16).padStart(4, '0'),\n });\n }\n\n static groundspeed(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.groundspeed = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_groundspeed',\n code: 'GSPD',\n label: 'Aircraft Groundspeed',\n value: `${decodeResult.raw.groundspeed} knots`,\n });\n }\n\n static airspeed(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.airspeed = value;\n decodeResult.formatted.items.push({\n type: 'airspeed',\n code: 'ASPD',\n label: 'True Airspeed',\n value: `${decodeResult.raw.airspeed} knots`,\n });\n }\n\n static mach(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.mach = value;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MACH',\n label: 'Mach Number',\n value: `${decodeResult.raw.mach} mach`,\n });\n }\n\n static temperature(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.outside_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'outside_air_temperature',\n code: 'OATEMP',\n label: 'Outside Air Temperature (C)',\n value: `${decodeResult.raw.outside_air_temperature} degrees`,\n });\n }\n\n static totalAirTemp(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.total_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'temperature',\n code: 'TATEMP',\n label: 'Total Air Temperature (C)',\n value: `${decodeResult.raw.total_air_temperature} degrees`,\n });\n }\n\n static heading(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.heading = value;\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: 'Heading',\n value: `${decodeResult.raw.heading}`,\n });\n }\n\n static indicatedAirspeed(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.indicated_airspeed = value;\n decodeResult.formatted.items.push({\n type: 'indicated_airspeed',\n code: 'IAS',\n label: 'Indicated Airspeed',\n value: `${decodeResult.raw.indicated_airspeed} knots`,\n });\n }\n\n static track(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.track = value;\n decodeResult.formatted.items.push({\n type: 'track',\n code: 'TRK',\n label: 'Track',\n value: `${decodeResult.raw.track} degrees`,\n });\n }\n\n /** Wind at the aircraft; either half may be missing. */\n static wind(decodeResult: DecodeResult, direction?: number, speed?: number) {\n const hasDirection = direction !== undefined && !isNaN(direction);\n const hasSpeed = speed !== undefined && !isNaN(speed);\n if (hasDirection) decodeResult.raw.wind_direction = direction;\n if (hasSpeed) decodeResult.raw.wind_speed = speed;\n if (!hasDirection && !hasSpeed) {\n return;\n }\n decodeResult.formatted.items.push({\n type: 'wind',\n code: 'WIND',\n label: !hasSpeed\n ? 'Wind Direction'\n : !hasDirection\n ? 'Wind Speed'\n : 'Wind',\n value: [\n hasDirection ? `${direction} degrees` : '',\n hasSpeed ? `${speed} knots` : '',\n ]\n .filter((s) => s !== '')\n .join(' at '),\n });\n }\n\n static variableWind(decodeResult: DecodeResult, speed: number) {\n if (isNaN(speed)) {\n return;\n }\n decodeResult.raw.wind_speed = speed;\n decodeResult.raw.wind_variable = true;\n decodeResult.formatted.items.push({\n type: 'wind',\n code: 'WIND',\n label: 'Wind',\n value: `variable at ${speed} knots`,\n });\n }\n\n /**\n * One point of a recorded track. The track is the route as flown, so each point is added to\n * the route's waypoints; the item shows what the aircraft measured there as well.\n */\n static trackPoint(decodeResult: DecodeResult, point: TrackPoint) {\n decodeResult.raw.route = {\n ...decodeResult.raw.route,\n waypoints: [...(decodeResult.raw.route?.waypoints ?? []), point],\n };\n decodeResult.formatted.items.push({\n type: 'track_point',\n code: 'TRKPT',\n label: 'Track Point',\n value:\n `${CoordinateUtils.coordinateString(point)} on day ${point.day} at ` +\n `${DateTimeUtils.timestampToString(point.time)}, ` +\n `${point.altitude} feet, ${point.temperature} C, ` +\n `wind ${point.windDirection} degrees at ${point.windSpeed} knots, ${point.phase}` +\n (point.waterVapor === undefined\n ? ''\n : `, water vapor ${point.waterVapor} ppmv`),\n });\n }\n\n static runwayLandingData(\n decodeResult: DecodeResult,\n data: RunwayLandingData,\n ) {\n decodeResult.raw.landing_runways = [\n ...(decodeResult.raw.landing_runways ?? []),\n data,\n ];\n const parts: string[] = [];\n if (data.length !== undefined) parts.push(`${data.length} feet`);\n if (data.flaps !== undefined) parts.push(`flaps ${data.flaps}`);\n if (data.headwind !== undefined) {\n parts.push(\n data.headwind < 0\n ? `tailwind ${-data.headwind} knots`\n : `headwind ${data.headwind} knots`,\n );\n }\n if (data.crosswind !== undefined) {\n const side = { L: ' left', R: ' right' }[data.crosswindSide ?? 'L'];\n parts.push(\n `crosswind ${data.crosswind} knots${data.crosswindSide ? side : ''}`,\n );\n }\n if (data.vref !== undefined) parts.push(`VREF ${data.vref} knots`);\n if (data.vtarget !== undefined) {\n const add =\n data.additive === undefined\n ? ''\n : ` (${data.additive < 0 ? '' : '+'}${data.additive})`;\n parts.push(`VTGT ${data.vtarget} knots${add}`);\n }\n if (data.maxLandingWeight !== undefined) {\n parts.push(`MRLW ${data.maxLandingWeight}`);\n }\n if (data.landingWeight !== undefined) {\n parts.push(`LDW ${data.landingWeight} pounds`);\n }\n const margins = Object.entries(data.stoppingMargins).map(\n ([setting, feet]) => `${setting} ${feet} feet`,\n );\n if (margins.length > 0) {\n parts.push(`stopping margin ${margins.join(', ')}`);\n }\n parts.push(...(data.notes ?? []));\n const variant = data.variant === undefined ? '' : ` (${data.variant})`;\n decodeResult.formatted.items.push({\n type: 'runway_landing_data',\n code: 'RWYLDG',\n label: 'Runway Landing Data',\n value: `${data.runway}${variant}: ${parts.join(', ')}`,\n });\n }\n\n static grossWeight(decodeResult: DecodeResult, pounds: number) {\n if (isNaN(pounds)) {\n return;\n }\n decodeResult.raw.gross_weight = pounds;\n decodeResult.formatted.items.push({\n type: 'gross_weight',\n code: 'GWT',\n label: 'Gross Weight',\n value: `${decodeResult.raw.gross_weight} pounds`,\n });\n }\n\n static arrivalGate(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_gate = value;\n decodeResult.formatted.items.push({\n type: 'gate',\n code: 'AGATE',\n label: 'Arrival Gate',\n value: decodeResult.raw.arrival_gate,\n });\n }\n\n static tail(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.tail = value;\n decodeResult.formatted.items.push({\n type: 'tail',\n code: 'TAIL',\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n }\n\n static out(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.out_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static off(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.off_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.on_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ON',\n label: 'Landing Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.in_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'IN',\n label: 'In Gate Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static engineStart(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.engine_start_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ENG_START',\n label: 'Engine Start Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n static engineStop(decodeResult: DecodeResult, time: number) {\n if (isNaN(time)) {\n return;\n }\n decodeResult.raw.engine_stop_time = time;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'ENG_STOP',\n label: 'Engine Stop Time',\n value: DateTimeUtils.timestampToString(time),\n });\n }\n\n static day(decodeResult: DecodeResult, day: number) {\n if (isNaN(day)) {\n return;\n }\n decodeResult.raw.day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'MSG_DAY',\n label: 'Day of Month',\n value: `${day}`,\n });\n }\n\n static month(decodeResult: DecodeResult, month: number) {\n if (isNaN(month)) {\n return;\n }\n decodeResult.raw.month = month;\n decodeResult.formatted.items.push({\n type: 'month',\n code: 'MSG_MON',\n label: 'Month of Year',\n value: `${month}`,\n });\n }\n\n static departureDay(decodeResult: DecodeResult, day: number) {\n if (isNaN(day)) {\n return;\n }\n decodeResult.raw.departure_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'DEP_DAY',\n label: 'Departure Day',\n value: `${day}`,\n });\n }\n\n static arrivalDay(decodeResult: DecodeResult, day: number) {\n if (isNaN(day)) {\n return;\n }\n decodeResult.raw.arrival_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'ARR_DAY',\n label: 'Arrival Day',\n value: `${day}`,\n });\n }\n\n static text(decodeResult: DecodeResult, text: string) {\n decodeResult.raw.text = text;\n decodeResult.formatted.items.push({\n type: 'text',\n code: 'TEXT',\n label: 'Text Message',\n value: text,\n });\n }\n\n static mac(decodeResult: DecodeResult, mac: number) {\n decodeResult.raw.mac = mac;\n decodeResult.formatted.items.push({\n type: 'mac',\n code: 'MAC',\n label: 'Mean Aerodynamic Chord',\n value: `${mac} %`,\n });\n }\n\n static trim(decodeResult: DecodeResult, trim: number) {\n decodeResult.raw.trim = trim;\n decodeResult.formatted.items.push({\n type: 'trim',\n code: 'TRIM',\n label: 'Trim',\n value: `${trim} units`,\n });\n }\n\n static windData(decodeResult: DecodeResult, windData: Wind[]) {\n decodeResult.raw.wind_data = windData;\n for (const wind of windData) {\n let text = `${RouteUtils.waypointToString(wind.waypoint)} at FL${wind.flightLevel}: ${wind.windDirection}° at ${wind.windSpeed}kt`;\n if (wind.temperature) {\n text += `, ${wind.temperature.degreesC}°C at FL${wind.temperature.flightLevel}`;\n }\n decodeResult.formatted.items.push({\n type: 'wind_data',\n code: 'WIND',\n label: 'Wind Data',\n value: text,\n });\n }\n }\n\n static cg(\n decodeResult: DecodeResult,\n value: number,\n type: 'center' | 'lower' | 'upper' = 'center',\n ) {\n switch (type) {\n case 'center':\n decodeResult.raw.center_of_gravity = value;\n decodeResult.formatted.items.push({\n type: 'center_of_gravity',\n code: 'CG',\n label: 'Center of Gravity',\n value: `${decodeResult.raw.center_of_gravity} %`,\n });\n break;\n case 'lower':\n decodeResult.raw.cg_lower_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_lower_limit',\n code: 'CG_LOWER',\n label: 'Center of Gravity Lower Limit',\n value: `${decodeResult.raw.cg_lower_limit} %`,\n });\n break;\n case 'upper':\n decodeResult.raw.cg_upper_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_upper_limit',\n code: 'CG_UPPER',\n label: 'Center of Gravity Upper Limit',\n value: `${decodeResult.raw.cg_upper_limit} %`,\n });\n break;\n }\n }\n\n static version(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.version = value;\n decodeResult.formatted.items.push({\n type: 'version',\n code: 'VERSION',\n label: 'Message Version',\n value: `v${decodeResult.raw.version.toFixed(1)}`,\n });\n }\n\n static label(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.label = value;\n decodeResult.formatted.items.push({\n type: 'label',\n code: 'LABEL',\n label: 'Message Label',\n value: `${decodeResult.raw.label}`,\n });\n }\n\n static sublabel(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.sublabel = value;\n decodeResult.formatted.items.push({\n type: 'sublabel',\n code: 'SUBLABEL',\n label: 'Message Sublabel',\n value: `${decodeResult.raw.sublabel}`,\n });\n }\n\n static requestedAltitudes(decodeResult: DecodeResult, values: number[]) {\n decodeResult.raw.requested_alts = values;\n decodeResult.formatted.items.push({\n type: 'requested_altitudes',\n code: 'REQ_ALTS',\n label: 'Requested Altitudes',\n value: `${decodeResult.raw.requested_alts.join(', ')}`,\n });\n }\n\n static desiredAltitude(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.desired_alt = value;\n decodeResult.formatted.items.push({\n type: 'desired_altitude',\n code: 'DES_ALT',\n label: 'Desired Altitude',\n value: `${decodeResult.raw.desired_alt}`,\n });\n }\n\n static startPoint(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.start_point = value;\n decodeResult.formatted.items.push({\n type: 'start_point',\n code: 'START',\n label: 'Start Point',\n value: `${decodeResult.raw.start_point}`,\n });\n }\n\n static routeNumber(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.route_number = value;\n decodeResult.formatted.items.push({\n type: 'route_number',\n code: 'RTE_NUM',\n label: 'Route Number',\n value: `${decodeResult.raw.route_number}`,\n });\n }\n\n static flightPlan(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.flight_plan = value;\n decodeResult.formatted.items.push({\n type: 'flight_plan',\n code: 'FPN',\n label: 'Flight Plan',\n value: `${decodeResult.raw.flight_plan}`,\n });\n }\n\n static groundAddress(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.ground_address = value;\n decodeResult.formatted.items.push({\n type: 'ground_address',\n code: 'GND_ADDR',\n label: 'Ground Address',\n value: `${decodeResult.raw.ground_address}`,\n });\n }\n\n static timestamp(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.message_timestamp = value;\n decodeResult.formatted.items.push({\n type: 'time',\n code: 'TIMESTAMP',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(value),\n });\n }\n\n static sequenceNumber(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.sequence_number = value;\n decodeResult.formatted.items.push({\n type: 'sequence',\n code: 'SEQ',\n label: 'Sequence Number',\n value: decodeResult.raw.sequence_number.toString(),\n });\n }\n\n static sequenceResponse(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.sequence_response = value;\n decodeResult.formatted.items.push({\n type: 'sequence',\n code: 'SEQ_RESP',\n label: 'Sequence Response',\n value: decodeResult.raw.sequence_response.toString(),\n });\n }\n\n /**\n * A field with no specific helper: `key` is its name in `raw` and its item type. `rawValue`\n * is stored in `raw` when it differs from the text shown (a number, for example).\n */\n static raw(\n decodeResult: DecodeResult,\n key: string,\n code: string,\n label: string,\n value: string,\n rawValue: unknown = value,\n ) {\n decodeResult.raw[key] = rawValue;\n decodeResult.formatted.items.push({ type: key, code, label, value });\n }\n\n static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') {\n if (!decodeResult.remaining.text) decodeResult.remaining.text = value;\n else decodeResult.remaining.text += sep + value;\n }\n\n static unknownArr(\n decodeResult: DecodeResult,\n value: string[],\n sep: string = ',',\n ) {\n this.unknown(decodeResult, value.join(sep), sep);\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n Qualifiers,\n} from './DecoderPluginInterface';\nimport { ResultFormatter } from './utils/result_formatter';\nimport { MessageDecoder } from './MessageDecoder';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: MessageDecoder;\n\n name: string = 'unknown';\n\n defaultResult(): DecodeResult {\n return {\n decoded: false,\n decoder: {\n name: 'unknown',\n type: 'pattern-match',\n decodeLevel: 'none',\n },\n formatted: {\n description: 'Unknown',\n items: [],\n },\n raw: {},\n remaining: {},\n };\n }\n\n /**\n * Creates a DecodeResult pre-populated with the plugin name, description, and message.\n * Replaces the common boilerplate at the start of every decode() method.\n */\n protected initResult(message: Message, description: string): DecodeResult {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.formatted.description = description;\n result.message = message;\n return result;\n }\n\n /**\n * Sets the decoded flag and decodeLevel on a result.\n * If decoded is true and no explicit level is given, infers 'full' or 'partial'\n * based on whether remaining.text is set.\n */\n protected setDecodeLevel(\n result: DecodeResult,\n decoded: boolean,\n level?: 'full' | 'partial',\n ): void {\n result.decoded = decoded;\n if (decoded) {\n result.decoder.decodeLevel =\n level ?? (result.remaining.text ? 'partial' : 'full');\n } else {\n result.decoder.decodeLevel = 'none';\n }\n }\n\n /**\n * Logs a debug message prefixed with the plugin name, only if options.debug is true.\n */\n protected debug(options: Options, ...args: unknown[]): void {\n if (options.debug) {\n console.log(`[${this.name}]`, ...args);\n }\n }\n\n /**\n * Marks a result as a failed decode with 'none' level, sets the remaining text\n * as unknown, and logs a debug message. Returns the result for convenient early return.\n */\n protected failUnknown(\n result: DecodeResult,\n text: string,\n options: Options = {},\n ): DecodeResult {\n this.debug(options, `Unknown message: ${text}`);\n ResultFormatter.unknown(result, text);\n result.decoded = false;\n result.decoder.decodeLevel = 'none';\n return result;\n }\n\n options: object;\n\n constructor(decoder: MessageDecoder, options: Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id(): string {\n console.log(\n 'DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!',\n );\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements(): boolean {\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers(): Qualifiers {\n const labels: Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n/**\n * Decoder plugin for handling messages processed by libacars\n *\n * Specifically L-band or C-band messages\n * using clients like `jaero` and `iridium-toolkit`\n */\nexport class LibAcars extends DecoderPlugin {\n name = 'libacars';\n qualifiers() {\n return {\n labels: ['*'],\n preambles: ['- #'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const text = message.text;\n\n const prefix = message.text.slice(0, 5); // TODO extract meaning. ignoring for now\n\n const decoded = this.decoder.decode(\n {\n label: message.label,\n sublabel: message.sublabel,\n text: text.replaceAll(prefix, ''), // Remove the prefix before decoding\n },\n options,\n );\n\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (decoded.decoded) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.decoder.name = this.name + '-' + decoded.decoder.name;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.description = decoded.formatted.description;\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// C-Band puts a 10 char header in front of some message types:\n// chars 0-3: message number ([A-Z]\\d{2}[A-Z])\n// chars 4-5: airline code ([A-Z0-9]{2})\n// chars 6-9: flight number ([0-9]{4})\n// Hoisted to module scope so the pattern is allocated once instead of on\n// every wildcard decode invocation.\nconst CBAND_HEADER =\n /^(?<msgno>[A-Z]\\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/;\n\nexport class CBand extends DecoderPlugin {\n name = 'c-band';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const text = message.text;\n // Cheap length check before running the regex — a C-Band header is\n // exactly 10 chars and is followed by the wrapped payload.\n if (text.length < 10) {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.message = message;\n return result;\n }\n\n const cband = CBAND_HEADER.exec(text);\n if (!cband?.groups) {\n const result = this.defaultResult();\n result.decoder.name = this.name;\n result.message = message;\n return result;\n }\n\n const decoded = this.decoder.decode(\n {\n label: message.label,\n sublabel: message.sublabel,\n text: text.substring(10),\n },\n options,\n );\n\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (decoded.decoded) {\n ResultFormatter.flightNumber(\n decodeResult,\n cband.groups.airline + Number(cband.groups.number),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.decoder.name = this.name + '-' + decoded.decoder.name;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.description = decoded.formatted.description;\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n }\n return decodeResult;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\nexport class FlightPlanUtils {\n /**\n * Processes flight plan data\n *\n * Expected format is [header, fpei, val1, ... fpeiN, valN]\n *\n * @see https://atlaske-content.garmin.com/filestorage//email/outbound/attachments/GTN_Flight_Plan_and_User_Waypoint_transfer_Time1712844670119.pdf\n * @param decodeResult - results\n * @param data - original message split by ':'\n * @returns whether all fields were processed or not\n */\n public static processFlightPlan(\n decodeResult: DecodeResult,\n data: string[],\n ): boolean {\n let allKnownFields = FlightPlanUtils.parseHeader(decodeResult, data[0]);\n for (let i = 1; i < data.length; i += 2) {\n const fpei = data[i];\n const value = data[i + 1];\n // TODO: discuss how store commented out bits as both raw and formatted\n switch (fpei) {\n case 'A': // Arrival Procedure (?)\n FlightPlanUtils.addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n FlightPlanUtils.addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n FlightPlanUtils.addProcedure(decodeResult, value, 'departure');\n break;\n case 'DA':\n addDepartureAirport(decodeResult, value);\n break;\n case 'F': // First Waypoint\n addRoute(decodeResult, value);\n break;\n case 'FP':\n ResultFormatter.flightPlan(decodeResult, value.trim());\n break;\n case 'R':\n addRunway(decodeResult, value);\n break;\n // case 'WS': // something about routes, has altitude, so current parsing won't work\n // break;\n default:\n if (allKnownFields) {\n decodeResult.remaining.text = '';\n allKnownFields = false;\n }\n decodeResult.remaining.text += `:${fpei}:${value}`;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return allKnownFields;\n }\n public static parseHeader(\n decodeResult: DecodeResult,\n header: string,\n ): boolean {\n let allKnownFields = true;\n if (header.startsWith('RF')) {\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Filed',\n });\n decodeResult.raw.route_status = 'RF';\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RP')) {\n decodeResult.raw.route_status = 'RP';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Planned',\n });\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RI')) {\n decodeResult.raw.route_status = 'RI';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Inactive',\n });\n } else if (header.startsWith('RM')) {\n decodeResult.raw.route_status = 'RM';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Mapped',\n });\n } else if (header.startsWith('RS')) {\n decodeResult.raw.route_status = 'RS';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Saved',\n });\n } else {\n decodeResult.remaining.text += header;\n allKnownFields = false;\n }\n return allKnownFields;\n }\n\n public static addProcedure(\n decodeResult: DecodeResult,\n value: string,\n type: string,\n ) {\n if (decodeResult.raw.procedures === undefined) {\n decodeResult.raw.procedures = [];\n }\n const data = value.split('.');\n let waypoints;\n if (data.length > 1) {\n waypoints = data.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n const route = { name: data[0], waypoints: waypoints };\n decodeResult.raw.procedures.push({ type: type, route: route });\n const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);\n decodeResult.formatted.items.push({\n type: 'procedure',\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\n });\n }\n}\n\nfunction addArrivalAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.arrivalAirport(decodeResult, value);\n}\n\nfunction addDepartureAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.departureAirport(decodeResult, value);\n}\n\nfunction addRunway(decodeResult: DecodeResult, value: string) {\n // xxx(yyy) where xxx is the departure runway and yyy is the arrival runway\n if (value.length === 8) {\n ResultFormatter.arrivalRunway(decodeResult, value.substring(4, 7));\n }\n\n ResultFormatter.departureRunway(decodeResult, value.substring(0, 3));\n}\n\nfunction addRoute(decodeResult: DecodeResult, value: string) {\n const route = value.split('.');\n ResultFormatter.route(decodeResult, {\n waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)),\n });\n}\n\nfunction addCompanyRoute(decodeResult: DecodeResult, value: string) {\n const segments = value.split('.');\n const parens_idx = segments[0].indexOf('(');\n let name;\n let runway;\n if (parens_idx === -1) {\n name = segments[0];\n } else {\n name = segments[0].slice(0, parens_idx);\n const close_paren_idx = segments[0].indexOf(')');\n // When ')' is missing, indexOf returns -1, which slice() would\n // interpret as \"count from the end\", silently dropping the final\n // character. Fall back to the end of the segment to preserve data.\n runway = segments[0].slice(\n parens_idx + 1,\n close_paren_idx === -1 ? undefined : close_paren_idx,\n );\n }\n let waypoints;\n if (segments.length > 1) {\n waypoints = segments.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n decodeResult.raw.company_route = {\n name: name,\n runway: runway,\n waypoints: waypoints,\n };\n decodeResult.formatted.items.push({\n type: 'company_route',\n code: 'CR',\n label: 'Company Route',\n value: RouteUtils.routeToString(decodeResult.raw.company_route),\n });\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { FlightPlanUtils } from './flight_plan_utils';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\n// One byte per ASCII char — replaces the Buffer.from(data, 'ascii') idiom so\n// the CRC helpers run in browser / Deno / Bun / edge runtimes without Node\n// polyfills. Matches the broader Web APIs migration in c78b720.\nfunction asciiStringToBytes(data: string): Uint8Array {\n const bytes = new Uint8Array(data.length);\n for (let i = 0; i < data.length; i++) bytes[i] = data.charCodeAt(i) & 0xff;\n return bytes;\n}\n\n/**\n * Helper class for decoding ARINC 702 messages\n * contains core logic for decoding different types of ARINC 702 messages,\n * as well as utility functions for processing common fields\n *\n * Core format:\n * IMI/IEIdata/IEIdata/...checksum\n */\nexport class Arinc702Helper {\n /**\n * Decodes an ARINC 702 message\n *\n * Steps:\n * 1. Check against known checksum algorithms to determine if message is valid\n * 2. Parse the Imbedded Message Identifier (IMI) to determine the type of message\n * 3. Iterate through the Information Elements (IEI) and decode known fields, while storing unknown fields for further analysis\n *\n * @param decodeResult - object to store decoded results in\n * @param message - message to decode\n * @returns boolean indicating if the message was successfully decoded\n */\n public static decodeH1Message(decodeResult: DecodeResult, message: string) {\n decodeResult.remaining.text = '';\n const checksum = parseInt(message.slice(-4), 16);\n const data = message.slice(0, message.length - 4);\n let checksumAlgorithmUsed = '';\n if (crc16IbmSdlcRev(data) === checksum) {\n // ACARS/VDL2/HFDL/Iridium\n checksumAlgorithmUsed = 'IBM-SDLC reversed';\n } else if (crc16Genibus(data) === checksum) {\n // inmarsat\n checksumAlgorithmUsed = 'GENIBUS';\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n const fields = data.split('/');\n const canDecode = parseMessageType(decodeResult, fields[0]);\n if (!canDecode) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n for (let i = 1; i < fields.length; ++i) {\n const iei = fields[i].substring(0, 2);\n const data = fields[i].substring(2);\n switch (iei) {\n case 'AF':\n processAirField(decodeResult, data.split(','));\n break;\n case 'AK':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processAK(decodeResult, data.split(','));\n break;\n case 'CG':\n processCenterOfGravity(decodeResult, data.split(','));\n break;\n case 'DC':\n processDateCode(decodeResult, data.split(','));\n break;\n case 'DI':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processDI(decodeResult, data.split(','));\n break;\n case 'DT': //processDestination?\n processDT(decodeResult, data.split(','));\n break;\n case 'DQ':\n ResultFormatter.desiredAltitude(\n decodeResult,\n parseInt(data, 10) * 100,\n );\n // processDQ(decodeResult, data.split(','));\n break;\n case 'ET':\n processETA(data, decodeResult, fields, i);\n break;\n case 'FB':\n ResultFormatter.currentFuel(decodeResult, parseInt(data, 10));\n break;\n case 'FN':\n decodeResult.raw.flight_number = data;\n break;\n case 'FX':\n ResultFormatter.text(decodeResult, data);\n break;\n case 'GA':\n ResultFormatter.groundAddress(decodeResult, data);\n break;\n case 'ID':\n processIdentification(decodeResult, data.split(','));\n break;\n case 'LR':\n processLandingReport(decodeResult, data.split(','));\n break;\n case 'MR':\n processMessageReference(decodeResult, data.split(','));\n break;\n case 'PR':\n processPerformanceData(decodeResult, data.split(','));\n break;\n //case 'PR':\n // TODO: decode /PR fields\n // ResultFormatter.unknown(decodeResult, fields[i], '/');\n // break;\n case 'PS': // Position\n Arinc702Helper.processPS(decodeResult, data.split(','));\n break;\n case 'RF':\n case 'RI':\n case 'RM':\n case 'RP':\n case 'RS':\n // TODO - use key/data instead of whole message\n FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n break;\n case 'RN':\n ResultFormatter.routeNumber(decodeResult, data);\n break;\n case 'RW':\n processRunway(decodeResult, data.split(':'));\n break;\n case 'SM':\n processSummary(decodeResult, data.split(','));\n break;\n case 'SN':\n decodeResult.raw.serial_number = data;\n break;\n case 'SP':\n ResultFormatter.startPoint(decodeResult, data);\n break;\n case 'TD':\n processTimeOfDeparture(decodeResult, data.split(','));\n break;\n case 'TR':\n processTR(decodeResult, data.split(','));\n break;\n case 'TS':\n Arinc702Helper.processTimeStamp(decodeResult, data.split(','));\n break;\n case 'VR':\n ResultFormatter.version(decodeResult, parseInt(data, 10) / 10);\n break;\n case 'WD':\n processWindData(decodeResult, data);\n break;\n case 'WQ':\n processWeatherQuery(decodeResult, data.split(':'));\n break;\n default:\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n }\n\n ResultFormatter.checksumAlgorithm(decodeResult, checksumAlgorithmUsed);\n ResultFormatter.checksum(decodeResult, checksum);\n\n return true;\n }\n\n public static processPS(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length === 9) {\n // variant 7\n processRoute(decodeResult, data[3], data[1], data[5], data[4], undefined);\n ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);\n ResultFormatter.temperature(decodeResult, data[6]);\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n }\n if (data.length === 14) {\n // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n }\n\n public static processPosition(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length >= 10) {\n // variant 1, short\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n }\n if (data.length >= 14) {\n // variant 2,long\n ResultFormatter.unknownArr(decodeResult, data.slice(10));\n }\n }\n\n public static processTimeStamp(decodeResult: DecodeResult, data: string[]) {\n if (data.length > 2) {\n const positionData = data.slice(1);\n positionData[0] = positionData[0].substring(6); // strip time from position field\n this.processPosition(decodeResult, positionData);\n }\n let time = DateTimeUtils.convertDateTimeToEpoch(\n data[0],\n data[1].substring(0, 6),\n );\n\n if (Number.isNaN(time)) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[1].substring(2, 4) +\n data[1].substring(0, 2) +\n data[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);\n }\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processETA(\n data: string,\n decodeResult: DecodeResult,\n fields: string[],\n i: number,\n) {\n if (data.length === 5) {\n // 1 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(1)),\n );\n } else if (data.length === 6) {\n // 2 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(2)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n}\n\nfunction processAirField(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n ResultFormatter.departureAirport(decodeResult, data[0]);\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), 'AF/');\n }\n}\nfunction processTimeOfDeparture(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n decodeResult.raw.planned_departure_time = data[0]; //DDHHMM - TODO: make int\n decodeResult.formatted.items.push({\n type: 'ptd',\n code: 'ptd',\n label: 'Planned Departure Time',\n value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`,\n });\n\n decodeResult.raw.estimated_departure_time = data[1]; //HHMM - TODO: make int\n decodeResult.formatted.items.push({\n type: 'etd',\n code: 'etd',\n label: 'Estimated Departure Time',\n value: `${data[1].substring(0, 2)}:${data[1].substring(2)}`,\n });\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), '/TD');\n }\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0]);\n if (data.length > 1) {\n ResultFormatter.flightNumber(decodeResult, data[1]);\n }\n if (data.length > 2) {\n //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 9) {\n ResultFormatter.unknown(decodeResult, data[0]);\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[2]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[3], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4]),\n );\n ResultFormatter.unknown(decodeResult, data[5]);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(data[6]),\n );\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n return;\n }\n if (data.length === 4 || data.length === 5) {\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[1]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[2], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[3]),\n );\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n return;\n }\n ResultFormatter.unknownArr(decodeResult, data, ',');\n}\n\nfunction processLandingReport(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 19) {\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.arrivalRunway(decodeResult, data[5]);\n ResultFormatter.unknown(decodeResult, data.slice(6, 19).join(','));\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\n// trajectory? track?\n// ?,?,?,?,?,off-HHMMSS,?,?,?,?,?,dep,arr,dep_rw,?,?,flight_number,?,?,?,?\nfunction processTR(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 21) {\n ResultFormatter.unknownArr(decodeResult, data, ',');\n return;\n }\n ResultFormatter.unknownArr(decodeResult, data.slice(0, 5), ',');\n ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 11), ',');\n ResultFormatter.departureAirport(decodeResult, data[11]);\n ResultFormatter.arrivalAirport(decodeResult, data[12]);\n ResultFormatter.departureRunway(decodeResult, data[13]);\n ResultFormatter.unknownArr(decodeResult, data.slice(14, 16), ',');\n ResultFormatter.flightNumber(decodeResult, data[16]);\n ResultFormatter.unknownArr(decodeResult, data.slice(17), ',');\n}\n\nfunction processCenterOfGravity(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10);\n }\n } else if (data.length === 3) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center');\n }\n if (data[1] !== undefined && data[1] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower');\n }\n if (data[2] !== undefined && data[2] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper');\n }\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction parseMessageType(\n decodeResult: DecodeResult,\n messagePart: string,\n): boolean {\n const messageParts = messagePart.split(',');\n const messageType = messageParts[0];\n if (messageType.startsWith('POS')) {\n Arinc702Helper.processPosition(\n decodeResult,\n messagePart.substring(3).split(','),\n );\n return processIMI(decodeResult, 'POS');\n } else if (messageType.length === 6) {\n const part1 = processIMI(decodeResult, messageType.substring(0, 3));\n const description = decodeResult.formatted.description;\n const part2 = processIMI(decodeResult, messageType.substring(3, 6));\n decodeResult.formatted.description =\n description + ' for ' + decodeResult.formatted.description;\n if (messageParts.length > 1) {\n // TODO handle REJPWI/REJPOS\n ResultFormatter.unknown(\n decodeResult,\n messageParts.slice(1).join(','),\n '/',\n );\n }\n return part1 && part2;\n }\n\n if (messageParts.length > 1) {\n // TODO handle\n ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(','), '/');\n }\n\n return processIMI(decodeResult, messageType);\n}\n\n/**\n * Processes the Imbedded Message Identifier (IMI)\n * which indicates the type of message and is used to determine what the message type is\n * @param decodeResult\n * @param type\n * @returns\n */\nfunction processIMI(decodeResult: DecodeResult, type: string): boolean {\n if (type === 'FPN') {\n decodeResult.formatted.description = 'Flight Plan';\n } else if (type === 'FTX') {\n decodeResult.formatted.description = 'Free Text';\n } else if (type === 'INI') {\n decodeResult.formatted.description = 'Initial Report';\n } else if (type === 'INR') {\n decodeResult.formatted.description = 'In-Range Report';\n } else if (type === 'LDI') {\n decodeResult.formatted.description = 'Load Distribution Information';\n } else if (type === 'PER') {\n decodeResult.formatted.description = 'Performance Report';\n } else if (type === 'PRF') {\n decodeResult.formatted.description = 'Profile Report';\n } else if (type === 'POS') {\n decodeResult.formatted.description = 'Position Report';\n } else if (type === 'PRG') {\n decodeResult.formatted.description = 'Progress Report';\n } else if (type === 'PWI') {\n decodeResult.formatted.description = 'Pilot Weather Information';\n } else if (type === 'WXR') {\n decodeResult.formatted.description = 'Weather Report';\n } else if (type === 'REJ') {\n decodeResult.formatted.description = 'Reject';\n } else if (type === 'REQ') {\n decodeResult.formatted.description = 'Request';\n } else if (type === 'RES') {\n decodeResult.formatted.description = 'Response';\n } else if (type === 'SUM') {\n decodeResult.formatted.description = 'Summary Report';\n } else {\n decodeResult.formatted.description = 'Unknown H1 Message';\n return false;\n }\n return true;\n}\n\nfunction processPerformanceData(decodeResult: DecodeResult, data: string[]) {\n // /PR fields contain performance data\n // Known field positions (12-field short variant and 18-field long variant):\n // [0]: ground speed (knots * 10 or similar)\n // [1]: indicated airspeed or mach-related\n // [2]: altitude in hundreds of feet\n // [3]: fuel-related value\n // [4]: unknown (often empty)\n // [5]: fuel flow or consumption\n // [6]: fuel-related\n // [7]: wind data (DDDSSSS format) or empty\n // [8]: temperature (M=minus, P=plus)\n // [9]: heading or unknown\n\n if (data.length < 3) {\n ResultFormatter.unknownArr(decodeResult, data, ',');\n return;\n }\n\n // Field 2: altitude in hundreds\n if (data[2] !== undefined && data[2] !== '') {\n const alt = Number(data[2]) * 100;\n if (!isNaN(alt) && alt > 0) {\n ResultFormatter.altitude(decodeResult, alt);\n }\n }\n\n // Field 8: temperature (if present)\n if (data.length > 8 && data[8] !== undefined && data[8] !== '') {\n ResultFormatter.temperature(decodeResult, data[8]);\n }\n\n // Collect remaining undecoded fields\n const remaining: string[] = [];\n for (let i = 0; i < data.length; i++) {\n if (\n i === 2 &&\n data[i] !== '' &&\n !isNaN(Number(data[i])) &&\n Number(data[i]) * 100 > 0\n ) {\n continue; // altitude - already decoded\n }\n if (\n i === 8 &&\n data[i] !== '' &&\n (data[i].startsWith('M') ||\n data[i].startsWith('P') ||\n !isNaN(Number(data[i])))\n ) {\n continue; // temperature - already decoded\n }\n remaining.push(data[i]);\n }\n if (remaining.length > 0 && remaining.some((r) => r !== '')) {\n ResultFormatter.unknown(decodeResult, remaining.join(','), '/PR');\n }\n}\n\nfunction processDateCode(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n // noop?\n } else if (data.length === 2) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[0].substring(2, 4) +\n data[0].substring(0, 2) +\n data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processWeatherQuery(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(':'), 'WQ/');\n return;\n }\n\n const alts = data[0].split('.');\n const route = data[1].split('.');\n\n ResultFormatter.requestedAltitudes(\n decodeResult,\n alts.map((a) => parseInt(a, 10) * 100),\n );\n\n const waypoints = route.map((wp) => {\n return { name: wp };\n });\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processRoute(\n decodeResult: DecodeResult,\n last: string,\n time: string,\n next: string,\n eta: string,\n then?: string,\n date?: string,\n) {\n const lastTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(time, date)\n : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(eta, date)\n : DateTimeUtils.convertHHMMSSToTod(eta);\n\n const lastWaypoint = RouteUtils.getWaypoint(last);\n lastWaypoint.time = lastTime;\n\n const nextWaypoint = RouteUtils.getWaypoint(next);\n nextWaypoint.time = nextTime;\n\n const thenWaypoint = RouteUtils.getWaypoint(then || '?');\n\n const waypoints: Waypoint[] = [lastWaypoint, nextWaypoint, thenWaypoint];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processWindData(decodeResult: DecodeResult, message: string) {\n const wind = [] as Wind[];\n\n const flightLevel = Number(message.slice(0, 3));\n const fields = message.slice(4).split('.'); // strip off altitude and comma\n fields.forEach((field) => {\n if (field.length < 4) {\n // probably need a more robust check to determine to skip\n return;\n }\n const data = field.split(',');\n const waypoint = { name: data[0] };\n const windData = data[1];\n const windDirection = parseInt(windData.slice(0, 3), 10);\n const windSpeed = parseInt(windData.slice(3), 10);\n\n if (data.length === 3) {\n const tempData = data[2];\n const tempFlightLevel = Number(tempData.slice(0, 3));\n const tempString = tempData.slice(3);\n const tempDegrees =\n Number(tempString.substring(1)) *\n (tempString.charAt(0) === 'M' ? -1 : 1);\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: tempFlightLevel,\n degreesC: tempDegrees,\n },\n });\n } else {\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n });\n }\n });\n\n ResultFormatter.windData(decodeResult, wind);\n}\n\nfunction processRunway(decodeResult: DecodeResult, data: string[]) {\n //FIXME - figure out names\n const parts = data[0].split('.');\n const more = parts[0].split(',');\n\n ResultFormatter.departureRunway(decodeResult, more[0]);\n ResultFormatter.unknownArr(decodeResult, more.slice(1), ',');\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), '.');\n ResultFormatter.departureAirport(decodeResult, data[1].split(',')[0]);\n ResultFormatter.unknownArr(decodeResult, data[1].split(',').slice(1), ',');\n //ResultFormatter.unknownArr(decodeResult, data.slice(2), ':');\n}\nfunction processSummary(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 11) {\n return ResultFormatter.unknown(decodeResult, data.join(','), 'SM/');\n }\n\n ResultFormatter.engineStart(\n decodeResult,\n DateTimeUtils.convertDayTimeToTod(data[0]),\n );\n ResultFormatter.startFuel(decodeResult, 100 * parseInt(data[1], 10));\n ResultFormatter.engineStop(\n decodeResult,\n DateTimeUtils.convertDayTimeToTod(data[2]),\n );\n ResultFormatter.out(decodeResult, DateTimeUtils.convertDayTimeToTod(data[3]));\n ResultFormatter.outFuel(decodeResult, 100 * parseInt(data[4], 10));\n ResultFormatter.off(decodeResult, DateTimeUtils.convertDayTimeToTod(data[5]));\n ResultFormatter.offFuel(decodeResult, 100 * parseInt(data[6], 10));\n ResultFormatter.on(decodeResult, DateTimeUtils.convertDayTimeToTod(data[7]));\n ResultFormatter.onFuel(decodeResult, 100 * parseInt(data[8], 10));\n ResultFormatter.in(decodeResult, DateTimeUtils.convertDayTimeToTod(data[9]));\n ResultFormatter.inFuel(decodeResult, 100 * parseInt(data[10], 10));\n}\n\n// CRC-16/IBM-SDLC but nibbles are reversed\nfunction crc16IbmSdlcRev(data: string): number {\n let crc = 0xffff;\n const bytes = asciiStringToBytes(data);\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x0001) !== 0) {\n crc = (crc >>> 1) ^ 0x8408;\n } else {\n crc = crc >>> 1;\n }\n }\n }\n crc = (crc ^ 0xffff) & 0xffff;\n\n const nibble1 = (crc >> 12) & 0xf;\n const nibble2 = (crc >> 8) & 0xf;\n const nibble3 = (crc >> 4) & 0xf;\n const nibble4 = crc & 0xf;\n\n return (nibble4 << 12) | (nibble3 << 8) | (nibble2 << 4) | nibble1;\n}\n\n/**\n * Calculates the CRC-16/GENIBUS checksum for a given Uint8Array.\n * @param data The input data as a byte array.\n * @returns The 16-bit checksum as a number.\n */\nfunction crc16Genibus(data: string): number {\n let crc = 0xffff;\n const polynomial = 0x1021;\n\n const bytes = asciiStringToBytes(data);\n\n for (const byte of bytes) {\n crc ^= byte << 8;\n\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x8000) !== 0) {\n crc = ((crc << 1) ^ polynomial) & 0xffff;\n } else {\n crc = (crc << 1) & 0xffff;\n }\n }\n }\n\n return (crc ^ 0xffff) & 0xffff;\n}\nfunction processMessageReference(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(','), '/MR');\n return;\n }\n\n ResultFormatter.sequenceNumber(decodeResult, parseInt(data[0], 10));\n if (data[1] !== '') {\n ResultFormatter.sequenceResponse(decodeResult, parseInt(data[1], 10));\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Arinc702Helper } from '../utils/arinc_702_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Hoisted to module scope so the wildcard decode() doesn't recompile the\n// pattern for every incoming message.\nconst NEWLINE_REGEX = /[\\n\\r]/g;\n\n// TODO: come up with a better name as this decodes multiple labels\nexport class Arinc702 extends DecoderPlugin {\n name = 'arinc-702';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(NEWLINE_REGEX, '');\n\n // try to decode the entire message\n let decoded = false;\n decoded = Arinc702Helper.decodeH1Message(decodeResult, msg);\n if (decoded) {\n return this.processDecodeResult(decodeResult, decoded, options, message);\n }\n\n // try to handle messages like `/HDQDLUA.POS<rest of message>`\n if (msg.startsWith('/')) {\n const headerData = msg.split('.');\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n headerData.slice(1).join('.'),\n );\n\n if (decoded) {\n decodeResult.remaining.text =\n headerData[0] + '.' + decodeResult.remaining.text;\n return this.processDecodeResult(\n decodeResult,\n decoded,\n options,\n message,\n );\n }\n }\n\n // try to handle messages like `F37AMCLL93#M1BPOS<rest of message>`\n const hashParts = msg.split('#');\n if (hashParts.length == 2) {\n // need a better way to figure this out\n const offset = isNaN(parseInt(hashParts[1][1])) ? 3 : 4;\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n msg.slice(hashParts[0].length + offset),\n );\n if (decoded && hashParts[0].length > 0) {\n // ResultFormatter.unknown(decodeResult, hashParts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, hashParts[0].substring(4));\n //ResultFormatter.unknown(decodeResult, hashParts[1].length == 5 ? hashParts[1].substring(0, 2) : hashParts[1].substring(0, 3), '#');\n // hack of the highest degree as we've parsed the rest of the message already but we want the remaining text to be in order\n decodeResult.remaining.text =\n hashParts[0].substring(0, 4) +\n '#' +\n hashParts[1].substring(0, offset - 1) +\n '/' +\n decodeResult.remaining.text;\n }\n if (decoded) {\n return this.processDecodeResult(\n decodeResult,\n decoded,\n options,\n message,\n );\n }\n }\n\n // try to handle messages like `M74AMC4086FTX<rest of message>`\n const slashParts = msg.split('/');\n if (slashParts[0].length > 3) {\n decoded = Arinc702Helper.decodeH1Message(\n decodeResult,\n msg.slice(slashParts[0].length - 3),\n );\n // flight number is already decoded in other fields\n decodeResult.remaining.text =\n slashParts[0].slice(0, 3) + '/' + decodeResult.remaining.text;\n }\n\n return this.processDecodeResult(decodeResult, decoded, options, message);\n }\n\n private processDecodeResult(\n decodeResult: DecodeResult,\n decoded: boolean,\n options: Options,\n message: Message,\n ) {\n decodeResult.decoded = decoded;\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","export function formatAcarsFreeText(text?: string | null): string {\n if (!text) return '';\n return text.trim().replace(/\\s+/g, ' ');\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { formatAcarsFreeText } from '../utils/acars_free_text';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z_Slash extends DecoderPlugin {\n name = 'label-5z-slash';\n\n descriptions: Record<string, string> = {\n B1: 'Request Weight and Balance',\n B3: 'Request Departure Clearance',\n CD: 'Weight and Balance',\n CG: 'Request Pre-departure clearance, PDC',\n CM: 'Crew Scheduling',\n C3: 'Off Message',\n C4: 'Flight Dispatch',\n C5: 'Maintenance Message',\n C6: 'Customer Service',\n 10: 'PIREP',\n C11: 'International PIREP',\n DS: 'Late Message',\n D3: 'Holding Pattern Message',\n D6: 'From-To + Date',\n D7: 'From-To + Alternate + Time',\n EO: 'In Range',\n ET: 'Expected Time',\n PW: 'Position Weather',\n RL: 'Request Release',\n R3: 'Request HOWGOZIT Message',\n R4: 'Request the Latest POSBD',\n TC: 'From-To Fuel',\n WB: 'From-To',\n W1: 'Request Weather for City',\n };\n\n qualifiers() {\n return {\n labels: ['5Z'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const lines = message.text.split('\\r\\n');\n if (lines[0] === '/TXT') {\n // not UA, but starts with `/`\n ResultFormatter.text(\n decodeResult,\n formatAcarsFreeText(lines.slice(1).join('\\r\\n')),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n const data = lines[0].split('/');\n const header = data[1].split(' '); //data[0] is blank\n const type = header[0];\n const typeDescription = this.descriptions[type];\n\n if (typeDescription) {\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: 'airline',\n code: 'AIRLINE',\n label: 'Airline',\n value: 'United Airlines',\n });\n decodeResult.raw.message_type = type;\n decodeResult.formatted.items.push({\n type: 'message_type',\n code: 'MSG_TYPE',\n label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3' && data[1] === 'B3 TO DATA REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));\n ResultFormatter.unknownArr(decodeResult, data.slice(3), '/');\n } else if (type === 'B3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n decodeResult.raw.day = Number(header[2]);\n ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));\n if (header.length > 4) {\n ResultFormatter.unknownArr(decodeResult, header.slice(4), '/');\n }\n } else if (type === 'C3' && data[1] === 'C3 GATE REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.unknownArr(decodeResult, info.slice(5), ' ');\n } else if (type === 'C3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n } else if (type === 'ET') {\n const airports = data[2].split(' ');\n // aiports[0] is blank\n ResultFormatter.departureAirport(decodeResult, airports[1]);\n ResultFormatter.arrivalAirport(decodeResult, airports[2]);\n decodeResult.raw.day = Number(airports[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(airports[4]),\n );\n\n const estimates = data[3].split(' ');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(estimates[1]),\n );\n ResultFormatter.unknown(decodeResult, estimates[2]);\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${message.text}`);\n }\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { ResultFormatter } from './result_formatter';\n\n// The airline's number in the performance vendor's system. Other airlines send their own in\n// the same place (JetBlue 28, Republic 71, SkyWest P, Frontier 6, seen in ACARS Hub), so\n// only Southwest's is named here.\nconst AIRLINES: Record<string, string> = { '189': 'Southwest' };\n\n/**\n * Writes the start shared by Southwest's label 10 performance requests (LDR01, LRW01):\n * airline ID, request layout (C on older software, D since) and software version.\n */\nexport function swaRequestHeader(\n decodeResult: DecodeResult,\n airlineId: string,\n layout: string,\n software: string,\n) {\n const airline = AIRLINES[airlineId];\n ResultFormatter.raw(\n decodeResult,\n 'airline_id',\n 'AIRLINE',\n 'Airline ID',\n airline ? `${airlineId} (${airline})` : airlineId,\n airlineId,\n );\n ResultFormatter.raw(\n decodeResult,\n 'request_layout',\n 'LAYOUT',\n 'Request Layout',\n layout,\n );\n ResultFormatter.raw(\n decodeResult,\n 'software_version',\n 'SWVER',\n 'Software Version',\n software,\n );\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { swaRequestHeader } from '../utils/swa_request';\n\n/** Weights and fuel are sent in thousands of pounds. */\nfunction pounds(value: string): number | undefined {\n if (value.trim() === '') return undefined;\n const thousands = Number(value);\n return Number.isFinite(thousands) ? Math.round(thousands * 1000) : undefined;\n}\n\n/** `22/` is runway 22; anything after the slash is part of the runway's name, as on the card. */\nfunction runway(value: string): string {\n const [rwy, suffix = ''] = value.trim().split('/');\n return suffix.trim() === '' ? rwy.trim() : `${rwy.trim()}/${suffix.trim()}`;\n}\n\n// Fields below were matched against the landing card answering each request (113 pairs,\n// latest request before each card) unless noted.\n\n// runway condition code, sent as 6 less the code: 113 of 113 pairs. The names are the FAA\n// runway condition codes: 0 is NIL braking action, a real code, not unknown. Codes 2 to 6\n// are seen; 0 and 1 are not.\nconst RUNWAY_CONDITION: Record<number, string> = {\n 6: 'dry',\n 5: 'good',\n 4: 'good to medium',\n 3: 'medium',\n 2: 'medium to poor',\n 1: 'poor',\n 0: 'nil',\n};\n\n// 0 and 1 in 53 of 54 pairs; 2 in 6 of 6 cards that say FLAPS 15\nconst FLAPS: Record<string, number> = { '0': 30, '1': 40, '2': 15 };\n\n/**\n * Southwest Airlines landing data request (LDR01), answered by the label 11 landing data card.\n */\nexport class Label_10_LDR extends DecoderPlugin {\n name = 'label-10-ldr';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['LDR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Landing Data Request';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length < 31) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n swaRequestHeader(decodeResult, parts[1], parts[2], parts[3]);\n const lat = parts[5];\n const lon = parts[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim()),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim()),\n };\n ResultFormatter.position(decodeResult, position);\n if (parts[7].trim() !== '') {\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n }\n const fuel = pounds(parts[8]);\n if (fuel !== undefined) ResultFormatter.currentFuel(decodeResult, fuel);\n ResultFormatter.departureAirport(decodeResult, parts[9]);\n ResultFormatter.arrivalAirport(decodeResult, parts[10]);\n // the airport the card is for: the destination, or the airport of a divert\n ResultFormatter.landingAirport(decodeResult, parts[11]);\n ResultFormatter.arrivalRunway(decodeResult, runway(parts[12]));\n const altRwy = [runway(parts[13]), runway(parts[14])]\n .filter((r) => r != '')\n .join(',');\n if (altRwy != '') {\n ResultFormatter.alternateRunway(decodeResult, altRwy);\n }\n\n // always 0\n const unknown = [parts[4]];\n const condition = parts[15].trim();\n if (/^[1-6]$/.test(condition)) {\n const code = 6 - Number(condition);\n ResultFormatter.raw(\n decodeResult,\n 'runway_condition_code',\n 'RCC',\n 'Runway Condition Code',\n `${code} (${RUNWAY_CONDITION[code]})`,\n code,\n );\n } else if (condition !== '0') {\n unknown.push(parts[15]);\n }\n const flaps = FLAPS[parts[16].trim()];\n if (flaps !== undefined) {\n ResultFormatter.raw(\n decodeResult,\n 'landing_flaps',\n 'FLAPS',\n 'Landing Flaps',\n `${flaps}`,\n flaps,\n );\n } else {\n unknown.push(parts[16]);\n }\n\n // airport weather, when the crew enters it: wind, gust, temperature, dew point, altimeter;\n // each is at most four digits (2,737 requests), so anything else is kept as remaining\n const [windDir, windSpeed, gust, temp, dew, altimeter] = parts\n .slice(17, 23)\n .map((field) => {\n const value = field.trim();\n if (/^-?\\d{1,4}$/.test(value)) return Number(value);\n if (value !== '') unknown.push(field);\n return undefined;\n });\n if (windDir !== undefined || windSpeed !== undefined) {\n ResultFormatter.wind(decodeResult, windDir, windSpeed);\n }\n if (gust !== undefined) {\n ResultFormatter.raw(\n decodeResult,\n 'wind_gust',\n 'GUST',\n 'Wind Gust',\n `${gust} knots`,\n gust,\n );\n }\n ResultFormatter.temperature(\n decodeResult,\n temp === undefined ? '' : `${temp}`,\n );\n if (dew !== undefined) {\n ResultFormatter.raw(\n decodeResult,\n 'dew_point',\n 'DEWPT',\n 'Dew Point (C)',\n `${dew} degrees`,\n dew,\n );\n }\n if (altimeter !== undefined) {\n const inHg = altimeter / 100;\n ResultFormatter.raw(\n decodeResult,\n 'altimeter',\n 'ALTIM',\n 'Altimeter',\n `${inHg.toFixed(2)} inHg`,\n inHg,\n );\n }\n\n // 1 = engine anti-ice, 113 of 113 pairs (the card says ENGINE ANTI-ICE ON); 2 is in only\n // three requests, so it is shown as sent\n const antiIce = parts[23].trim();\n if (/^[1-9]$/.test(antiIce)) {\n ResultFormatter.raw(\n decodeResult,\n 'anti_ice',\n 'ANTIICE',\n 'Anti-Ice',\n antiIce === '1' ? 'engine' : antiIce,\n Number(antiIce),\n );\n } else if (antiIce !== '0') {\n unknown.push(parts[23]);\n }\n // en route icing: two requests that differ from another only here, and only their cards\n // say ENROUTE ICING CONDITIONS (none of 59 cards for a 0 do); 20 requests\n const flags: [string, string, string, string][] = [\n [parts[24], 'enroute_icing', 'ICING', 'En Route Icing'],\n // the card says HGS AIII: 113 of 113 pairs, 32 requests\n [parts[25], 'hgs_approach', 'HGS', 'HGS Approach'],\n ];\n for (const [value, key, code, label] of flags) {\n if (value.trim() === '1') {\n ResultFormatter.raw(decodeResult, key, code, label, 'yes', true);\n } else if (value.trim() !== '0') {\n unknown.push(value);\n }\n }\n // a non-normal configuration chosen from a list on the aircraft; 7 requests in 2737, too\n // few to name the codes, so the code is shown as sent\n const nonNormal = parts[26].trim();\n if (/^\\d+$/.test(nonNormal) && Number(nonNormal) !== 0) {\n ResultFormatter.raw(\n decodeResult,\n 'non_normal_configuration',\n 'NNC',\n 'Non-Normal Configuration',\n `${Number(nonNormal)}`,\n Number(nonNormal),\n );\n } else if (!/^0+$/.test(nonNormal)) {\n unknown.push(parts[26]);\n }\n if (parts[27].trim() !== '') unknown.push(parts[27]);\n\n // zero fuel weight + landing fuel = landing weight\n const weights: [string, string, string, string][] = [\n ['zero_fuel_weight', 'ZFW', 'Zero Fuel Weight', parts[28]],\n ['landing_fuel', 'LFUEL', 'Landing Fuel', parts[29]],\n ['landing_weight', 'LDW', 'Landing Weight', parts[30]],\n ];\n for (const [key, code, label, value] of weights) {\n const amount = pounds(value);\n if (amount === undefined) continue;\n ResultFormatter.raw(\n decodeResult,\n key,\n code,\n label,\n `${amount} pounds`,\n amount,\n );\n }\n\n // the missed approach climb gradient (feet per nautical mile) and the altitude it is\n // needed to, as the approach chart gives them: 33 requests, matched to the FAA charts for\n // KBUR runway 8 and KRNO runway 17R; ----. is none\n const gradient = (parts[31] ?? '').trim();\n if (/^\\d+$/.test(gradient)) {\n ResultFormatter.raw(\n decodeResult,\n 'missed_approach_gradient',\n 'MAGRAD',\n 'Missed Approach Climb Gradient',\n `${Number(gradient)} feet per nautical mile`,\n Number(gradient),\n );\n } else if (gradient !== '' && gradient !== '----.') {\n unknown.push(parts[31]);\n }\n const missedAltitude = (parts[32] ?? '').trim();\n if (/^\\d+$/.test(missedAltitude)) {\n ResultFormatter.raw(\n decodeResult,\n 'missed_approach_altitude',\n 'MAALT',\n 'Missed Approach Altitude',\n `${Number(missedAltitude)} feet`,\n Number(missedAltitude),\n );\n } else if (missedAltitude !== '') {\n unknown.push(parts[32]);\n }\n unknown.push(...parts.slice(33).filter((field) => field.trim() !== ''));\n\n ResultFormatter.unknownArr(decodeResult, unknown);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { swaRequestHeader } from '../utils/swa_request';\n\n/**\n * Southwest Airlines landing runways request (LRW01), answered by the label 11 LRW01 list of\n * runways at the destination.\n */\nexport class Label_10_LRW extends DecoderPlugin {\n name = 'label-10-lrw';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['LRW01,'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Landing Runways Request');\n\n // type, airline ID, layout, software, always 0, not yet understood, origin, destination\n const parts = message.text.split(',');\n if (parts.length < 8 || parts[7].trim() === '') {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n swaRequestHeader(decodeResult, parts[1], parts[2], parts[3]);\n ResultFormatter.departureAirport(decodeResult, parts[6]);\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.unknownArr(decodeResult, [\n parts[4],\n parts[5],\n ...parts.slice(8).filter((field) => field.trim() !== ''),\n ]);\n\n this.setDecodeLevel(decodeResult, true);\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_POS extends DecoderPlugin {\n name = 'label-10-pos';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const parts = message.text.split(',');\n if (parts.length !== 12) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n //const time = parts[0].substring(3); //DDHHMM\n const lat = parts[1].trim();\n const lon = parts[2].trim();\n const position = {\n latitude:\n ((lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())) / 100,\n longitude:\n ((lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim())) / 100,\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.unknownArr(decodeResult, [\n parts[0],\n ...parts.slice(3, 7),\n ...parts.slice(8),\n ]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_Slash extends DecoderPlugin {\n name = 'label-10-slash';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[1];\n const lon = parts[2];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.heading(decodeResult, Number(parts[5]));\n ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[8]),\n );\n const waypoints: Waypoint[] = [\n {\n name: parts[11],\n },\n {\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]),\n },\n {\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]),\n },\n ];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n\n if (parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n ResultFormatter.unknownArr(\n decodeResult,\n [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],\n '/',\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","const SIDES: Record<string, string> = {\n N: 'north',\n NE: 'northeast',\n E: 'east',\n SE: 'southeast',\n S: 'south',\n SW: 'southwest',\n W: 'west',\n NW: 'northwest',\n};\n\nexport class RunwayUtils {\n /**\n * Describe the condition that names a runway variant in Southwest landing data, e.g.\n * `11/AIB -E1804F`: the runway, the variant's code and its condition.\n *\n * -E1804F is 1804 feet taken off the east end, -SWCBL the arresting cable at the southwest\n * end. Checked on the LRW01 runway lists of six airports, where every variant's length is\n * the runway's less the feet given, or less 1500 feet for a cable. LAHSO is sent as written.\n *\n * @param name - the runway as sent, with its variant\n * @returns a description of the condition, or undefined when the name has none\n */\n public static variantDescription(name: string): string | undefined {\n const text = name.trim();\n const cut = text.match(/-(NE|NW|SE|SW|N|E|S|W)(\\d+)F$/);\n if (cut) {\n return `${Number(cut[2])} feet off the ${SIDES[cut[1]]} end`;\n }\n const cable = text.match(/-(NE|NW|SE|SW|N|E|S|W)CBL$/);\n if (cable) {\n return `arresting cable at the ${SIDES[cable[1]]} end`;\n }\n if (/(^|\\s)LAHSO$/.test(text)) {\n return 'land and hold short';\n }\n return undefined;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { AlternativeRunway } from '../types/alternative_runway';\nimport { RunwayLandingData } from '../types/runway_landing_data';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RunwayUtils } from '../utils/runway_utils';\n\n/** HHMM as seconds of the day, or undefined when out of range. */\nfunction tod(hours: string, minutes: string): number | undefined {\n const h = Number(hours);\n const m = Number(minutes);\n return h <= 23 && m <= 59 ? h * 3600 + m * 60 : undefined;\n}\n\n/** Weights are sent in thousands of pounds. */\nfunction pounds(value: string): number {\n return Math.round(Number(value) * 1000);\n}\n\n/** The description of a runway's variant, e.g. 11/AIB -E1804F, when it has one. */\nfunction variant(runway: string): { variant?: string } {\n const description = RunwayUtils.variantDescription(runway);\n return description === undefined ? {} : { variant: description };\n}\n\n// The header is two columns of labels over values; runways the card covers sit at the right.\nconst HEADER = [\n /^LDR01,(\\w{4}) LANDING DATA,FLT(?:\\s+METAR-(\\d{2})(\\d{2})Z)?\\s*$/,\n /^(\\d{1,4})\\s+WIND\\s+LDW\\s*$/,\n /^TIME\\s+(\\d{3}|VRB)\\/(\\d{2,3})G(\\d{2,3}|--)\\s+(\\d+\\.\\d)\\s*$/,\n /^(\\d{2})(\\d{2})Z\\s+OAT\\/DEW\\s*(\\S*)\\s*$/,\n /^\\s+(-?\\d{2,3})\\/(-?\\d{2,3})\\s*(\\S*)\\s*$/,\n /^\\s+QNH\\s*(\\S*)\\s*$/,\n // QNH in inches of mercury, or hectopascals outside the US\n /^\\s+(\\d{2}\\.\\d{2}|\\d{4})\\s*(\\S*)\\s*$/,\n];\n\n// One block per runway: runway and length (feet), flaps, wind components, speeds and the\n// AB2 stopping margin, MRLW and the AB3 margin, LDW and the ABM margin. `-` fills what the\n// card could not work out.\n// an unavailable runway is sent with length 0\nconst RUNWAY = /^(\\d{1,2}[LRC]?(?:\\/\\S+)?(?: -\\S+)?)\\s+(\\d{1,5})\\s*$/;\n// a runway heading, whole or cut off by the end of the message\nconst RUNWAY_START = /^\\d{1,2}[LRC]?(?:\\/\\S+)?(?: -\\S+)?(?:\\s{2,}\\d*)?\\s*$/;\n// Under the remarks of a card for a runway it cannot use: one runway per line, a variant\n// with its name first (11-E1804F 11/AIB)\nconst ALTERNATIVES = '--- ALTERNATIVE RWYS ---';\nconst ALTERNATIVE = /^(?:(.+?)\\s{2,})?(\\d{1,2}[LRC]?(?:\\/\\S+)?)\\s*$/;\nconst BLOCK = [\n /^FLAPS (\\d{2}|--)\\s*$/,\n /^VREF\\/VTGT\\s+(?:(\\d{2})([HT])\\/(\\d{2})([LR])|---\\/---)\\s*$/,\n /^\\s*(?:(\\d{3})\\/(\\d{3}) ([+-]\\d+)|---\\/---)\\s+(AB\\d)\\s+(\\d+|----)\\s*$/,\n /^MRLW (\\d+\\.\\d\\/\\S|-+\\/-)\\s+(AB\\d)\\s+(\\d+|----)\\s*$/,\n /^\\s*LDW (\\d+\\.\\d)\\s+(ABM)\\s+(\\d+|----)\\s*$/,\n];\n\n/**\n * Southwest Airlines landing data card, the uplink that answers the label 10 LDR01 request.\n */\nexport class Label_11_LDR extends DecoderPlugin {\n name = 'label-11-ldr';\n\n qualifiers() {\n return {\n labels: ['11'],\n preambles: ['LDR01,'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Landing Data');\n\n const nl = message.text.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = message.text.split(/\\r?\\n/);\n const first = lines[0].match(HEADER[0]);\n if (!first) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const unknown: string[] = [];\n ResultFormatter.landingAirport(decodeResult, first[1]);\n const metar = first[2] === undefined ? undefined : tod(first[2], first[3]);\n if (first[2] !== undefined && metar === undefined) {\n unknown.push(`METAR-${first[2]}${first[3]}Z`);\n }\n if (metar !== undefined) {\n ResultFormatter.raw(\n decodeResult,\n 'metar_time',\n 'METAR',\n 'METAR Time',\n DateTimeUtils.timestampToString(metar),\n metar,\n );\n }\n\n const runways: string[] = [];\n let i = 1;\n for (; i < HEADER.length && i < lines.length; i++) {\n const m = lines[i].match(HEADER[i]);\n if (!m) break;\n if (i === 1) {\n ResultFormatter.flightNumber(decodeResult, m[1]);\n } else if (i === 2) {\n if (m[1] === 'VRB') {\n ResultFormatter.variableWind(decodeResult, Number(m[2]));\n } else {\n ResultFormatter.wind(decodeResult, Number(m[1]), Number(m[2]));\n }\n if (m[3] !== '--') {\n ResultFormatter.raw(\n decodeResult,\n 'wind_gust',\n 'GUST',\n 'Wind Gust',\n `${Number(m[3])} knots`,\n Number(m[3]),\n );\n }\n ResultFormatter.raw(\n decodeResult,\n 'landing_weight',\n 'LDW',\n 'Landing Weight',\n `${pounds(m[4])} pounds`,\n pounds(m[4]),\n );\n } else if (i === 3) {\n const time = tod(m[1], m[2]);\n if (time === undefined) {\n unknown.push(`${m[1]}${m[2]}Z`);\n } else {\n ResultFormatter.timestamp(decodeResult, time);\n }\n runways.push(m[3]);\n } else if (i === 4) {\n ResultFormatter.temperature(decodeResult, `${Number(m[1])}`);\n ResultFormatter.raw(\n decodeResult,\n 'dew_point',\n 'DEWPT',\n 'Dew Point (C)',\n `${Number(m[2])} degrees`,\n Number(m[2]),\n );\n runways.push(m[3]);\n } else if (i === 5) {\n runways.push(m[1]);\n } else {\n ResultFormatter.raw(\n decodeResult,\n 'altimeter',\n 'ALTIM',\n 'Altimeter',\n `${m[1]} ${m[1].includes('.') ? 'inHg' : 'hPa'}`,\n Number(m[1]),\n );\n runways.push(m[2]);\n }\n }\n const listed = runways.filter((r) => r !== '');\n if (listed.length > 0) {\n ResultFormatter.raw(\n decodeResult,\n 'runways',\n 'RWYS',\n 'Runways',\n listed.join(', '),\n listed,\n );\n }\n\n const rest = lines.slice(i);\n let at = 0;\n const alternatives: AlternativeRunway[] = [];\n if (rest[0]?.trim() === 'REMARKS') {\n const remarks: string[] = [];\n for (at = 1; at < rest.length && !RUNWAY_START.test(rest[at]); at++) {\n if (rest[at].trim() === ALTERNATIVES) {\n at = this.alternatives(rest, at + 1, alternatives, unknown);\n break;\n }\n if (rest[at].trim() !== '') remarks.push(rest[at].trim());\n }\n if (remarks.length > 0) {\n ResultFormatter.raw(\n decodeResult,\n 'remarks',\n 'RMK',\n 'Remarks',\n remarks.join(' '),\n );\n }\n }\n if (alternatives.length > 0) {\n ResultFormatter.raw(\n decodeResult,\n 'alternative_runways',\n 'ALTRWY',\n 'Alternative Runways',\n alternatives\n .map((a) => (a.variant ? `${a.runway} (${a.variant})` : a.runway))\n .join(', '),\n alternatives,\n );\n }\n\n const blocks: RunwayLandingData[] = [];\n while (at < rest.length) {\n const block = this.runwayBlock(rest.slice(at, at + 1 + BLOCK.length));\n if (block) {\n blocks.push(block);\n at += 1 + BLOCK.length;\n continue;\n }\n const line = rest[at];\n const head = line.match(RUNWAY);\n const next = rest.slice(at + 1).find((l) => l.trim() !== '');\n if (\n head &&\n next !== undefined &&\n !next.startsWith('FLAPS') &&\n // a FLAPS line cut off by the end of the block\n !'FLAPS'.startsWith(next.trim()) &&\n !RUNWAY_START.test(next)\n ) {\n // a runway sent with notes instead of figures, e.g. MQTW 148.0 EXCEEDED\n blocks.push({\n runway: head[1],\n ...variant(head[1]),\n length: Number(head[2]),\n stoppingMargins: {},\n });\n at++;\n continue;\n }\n const last = blocks[blocks.length - 1];\n if (line.trim() !== '') {\n if (last && !RUNWAY_START.test(line)) {\n // a note under a runway, e.g. 20KT TAILGUST >10 LIMIT\n last.notes = [...(last.notes ?? []), line.trim()];\n } else {\n // a runway block cut off by the end of the message\n unknown.push(...rest.slice(at).filter((l) => l.trim() !== ''));\n break;\n }\n }\n at++;\n }\n for (const block of blocks) {\n ResultFormatter.runwayLandingData(decodeResult, block);\n }\n if (unknown.length > 0) {\n ResultFormatter.unknown(decodeResult, unknown.join(nl), nl);\n }\n\n // a card cut off inside its header leaves nothing unknown, but it is not whole\n this.setDecodeLevel(\n decodeResult,\n true,\n i < HEADER.length ? 'partial' : undefined,\n );\n return decodeResult;\n }\n\n /** The six lines of one runway, or undefined if they are not a whole block. */\n private runwayBlock(lines: string[]): RunwayLandingData | undefined {\n const head = lines[0]?.match(RUNWAY);\n if (!head || lines.length < 1 + BLOCK.length) return undefined;\n const m = BLOCK.map((re, n) => lines[n + 1].match(re));\n if (m.some((x) => !x)) return undefined;\n const [flaps, wind, speeds, mrlw, ldw] = m as RegExpMatchArray[];\n\n const data: RunwayLandingData = {\n runway: head[1],\n ...variant(head[1]),\n length: Number(head[2]),\n stoppingMargins: {},\n };\n if (flaps[1] !== '--') data.flaps = Number(flaps[1]);\n if (wind[1] !== undefined) {\n data.headwind = Number(wind[1]) * (wind[2] === 'T' ? -1 : 1);\n data.crosswind = Number(wind[3]);\n data.crosswindSide = wind[4] as 'L' | 'R';\n }\n if (speeds[1] !== undefined) {\n data.vref = Number(speeds[1]);\n data.vtarget = Number(speeds[2]);\n data.additive = Number(speeds[3]);\n }\n if (!mrlw[1].startsWith('-')) data.maxLandingWeight = mrlw[1];\n data.landingWeight = pounds(ldw[1]);\n for (const [setting, feet] of [\n [speeds[4], speeds[5]],\n [mrlw[2], mrlw[3]],\n [ldw[2], ldw[3]],\n ]) {\n if (feet !== '----') data.stoppingMargins[setting] = Number(feet);\n }\n return data;\n }\n\n /**\n * The runways listed after ALTERNATIVE RWYS, which run to the end of the card. Returns the\n * index of the line after them.\n */\n private alternatives(\n lines: string[],\n from: number,\n out: AlternativeRunway[],\n unknown: string[],\n ): number {\n for (let n = from; n < lines.length; n++) {\n const line = lines[n];\n if (line.trim() === '') continue;\n const m = line.match(ALTERNATIVE);\n // a last line with no newline after it may be cut off by the end of the block\n if (!m || n === lines.length - 1) {\n unknown.push(line.trim());\n continue;\n }\n const name = m[1]?.trim();\n out.push({\n runway: m[2],\n ...(name === undefined ? {} : { name }),\n ...variant(name ?? m[2]),\n });\n }\n return lines.length;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RunwayUtils } from '../utils/runway_utils';\n\n// One runway per line: the runway, a variant's code and condition when it is one, and the\n// length available (feet), e.g. `11 /AIB -E1804F 8300` or `09 /12 LAHSO 9749`.\nconst RUNWAY =\n /^(\\d{1,2}[LRC]?)\\s?(?:\\/(\\S+))?\\s+(?:(-\\S+|LAHSO)\\s+)?(\\d{3,5})\\s*$/;\n\n/**\n * Southwest Airlines landing runways (LRW01): every runway at an airport, with its variants,\n * that landing data can be requested for. Answers the label 10 LRW01 request.\n */\nexport class Label_11_LRW extends DecoderPlugin {\n name = 'label-11-lrw';\n\n qualifiers() {\n return {\n labels: ['11'],\n preambles: ['LRW01,'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Landing Runways');\n\n const nl = message.text.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const first = message.text.match(/^LRW01,(\\w{4}) LANDING RUNWAYS,/);\n if (!first) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n ResultFormatter.landingAirport(decodeResult, first[1]);\n\n const lines = message.text.slice(first[0].length).split(/\\r?\\n/);\n for (const line of lines) {\n if (line.trim() === '') continue;\n const m = line.match(RUNWAY);\n if (!m) {\n // a runway cut off by the end of the block\n ResultFormatter.unknown(decodeResult, line.trim(), nl);\n continue;\n }\n const runway = [m[2] ? `${m[1]}/${m[2]}` : m[1], m[3]]\n .filter((part) => part !== undefined)\n .join(' ');\n const description = RunwayUtils.variantDescription(runway);\n ResultFormatter.runwayLandingData(decodeResult, {\n runway,\n ...(description === undefined ? {} : { variant: description }),\n length: Number(m[4]),\n stoppingMargins: {},\n });\n }\n\n this.setDecodeLevel(decodeResult, true);\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 12 N : results');\n console.log(results);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n });\n\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n results.groups.unkwn3,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_12_POS extends DecoderPlugin {\n name = 'label-12-pos';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const data = message.text.substring(3).split(',');\n if (!message.text.startsWith('POS') || data.length !== 12) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const lat = data[0].substring(0, 8);\n const lon = data[0].substring(8);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lat.substring(1, 4)),\n Number(lat.substring(4, 6)),\n Number(lat.substring(6, 8)),\n ),\n longitude:\n CoordinateUtils.getDirection(lon[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lon.substring(1, 4)),\n Number(lon.substring(4, 6)),\n Number(lon.substring(6, 8)),\n ),\n });\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));\n ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));\n ResultFormatter.currentFuel(\n decodeResult,\n Number(data[7].substring(3).trim()),\n ); // strip FOB\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()),\n ); // strip ETA\n ResultFormatter.departureAirport(decodeResult, data[9]);\n ResultFormatter.arrivalAirport(decodeResult, data[10]);\n ResultFormatter.unknown(decodeResult, data[11]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_13Through18_Slash extends DecoderPlugin {\n name = 'label-13-18-slash';\n\n qualifiers() {\n return {\n labels: ['13', '14', '15', '16', '17', '18'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n const parts = lines[0].split('/');\n const labelNumber = Number(parts[1].substring(0, 2));\n decodeResult.formatted.description = getMsgType(labelNumber);\n\n // labels 13-17 have 4 parts, label 18 has 7 parts\n if (\n (labelNumber !== 18 && parts.length !== 4) ||\n (labelNumber === 18 && parts.length !== 7)\n ) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // parts[0] === ''\n const data = parts[2].split(' ');\n ResultFormatter.departureAirport(decodeResult, data[1]);\n ResultFormatter.arrivalAirport(decodeResult, data[2]);\n decodeResult.raw.day = Number(data[3]);\n const time = DateTimeUtils.convertHHMMSSToTod(data[4]);\n if (labelNumber === 13) {\n ResultFormatter.out(decodeResult, time);\n } else if (labelNumber === 14) {\n ResultFormatter.off(decodeResult, time);\n } else if (labelNumber === 15) {\n ResultFormatter.on(decodeResult, time);\n } else if (labelNumber === 16) {\n ResultFormatter.in(decodeResult, time);\n }\n\n if (parts.length === 7) {\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), '/');\n }\n\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].startsWith('/LOC')) {\n const location = lines[i].substring(5).split(','); // strip off '/LOC'\n let position;\n if (location[0].startsWith('+') || location[0].startsWith('-')) {\n position = {\n latitude: Number(location[0]),\n longitude: Number(location[1]),\n };\n } else {\n position = {\n latitude:\n CoordinateUtils.getDirection(location[0][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[0].substring(1, 3)),\n Number(location[0].substring(3, 5)),\n Number(location[0].substring(5, 7)),\n ),\n longitude:\n CoordinateUtils.getDirection(location[1][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[1].substring(1, 4)),\n Number(location[1].substring(4, 6)),\n Number(location[1].substring(6, 8)),\n ),\n };\n }\n ResultFormatter.position(decodeResult, position);\n } else {\n ResultFormatter.unknown(decodeResult, lines[i], '\\r\\n');\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n return decodeResult;\n }\n}\n\nfunction getMsgType(labelNumber: number): string {\n if (labelNumber === 13) {\n return 'Out of Gate Report';\n }\n if (labelNumber === 14) {\n return 'Takeoff Report';\n }\n if (labelNumber === 15) {\n return 'On Ground Report';\n }\n if (labelNumber === 16) {\n return 'In Gate Report';\n }\n if (labelNumber === 17) {\n return 'Post Report';\n }\n if (labelNumber === 18) {\n return 'Post Times Report';\n }\n\n return 'Unknown';\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-15';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n if (message.text.startsWith('(2') && message.text.endsWith('(Z')) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(0, 13),\n ),\n );\n if (between.length === 25) {\n // short variant\n ResultFormatter.unknown(decodeResult, between.substring(13, 19));\n const alt = between.substring(19, 22);\n if (alt != '---') {\n ResultFormatter.altitude(decodeResult, 100 * Number(alt));\n }\n ResultFormatter.temperature(\n decodeResult,\n between.substring(22).replaceAll(' ', '0'),\n );\n } else if (between.substring(13, 16) === 'OFF') {\n // off variant\n const ddmmyy = between.substring(16, 22);\n const hhmm = between.substring(22, 26);\n if (ddmmyy != '------') {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(hhmm + '00', ddmmyy),\n );\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmm),\n );\n }\n ResultFormatter.unknown(decodeResult, between.substring(26));\n } else {\n ResultFormatter.unknown(decodeResult, between.substring(26));\n }\n } else {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const parts = message.text.split(' ');\n // FST01KMCOEGKKN505552W00118021\n const header = parts[0];\n\n const stringCoords = header.substring(13);\n // Don't use decodeStringCoordinates here, because of different pos format\n\n const firstChar = stringCoords.substring(0, 1);\n const middleChar = stringCoords.substring(7, 8);\n decodeResult.raw.position = {};\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n const lat =\n (Number(stringCoords.substring(1, 7)) / 10000) *\n (firstChar === 'S' ? -1 : 1);\n const lon =\n (Number(stringCoords.substring(8, 15)) / 10000) *\n (middleChar === 'W' ? -1 : 1);\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n ResultFormatter.altitude(\n decodeResult,\n Number(stringCoords.substring(15)) * 100,\n );\n } else {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), ' ');\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_AUTPOS extends DecoderPlugin {\n name = 'label-16-autpos';\n qualifiers() {\n return {\n labels: ['16'],\n preambles: [''],\n };\n }\n\n decode(message: Message): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n // Regex to match the AUTPOS message\n const regex =\n /^(\\d{6})\\/AUTPOS\\/LLD (N|S)(\\d{2})(\\d{2})(\\d{2}) (E|W)(\\d{3})(\\d{2})(\\d{2})\\s*\\r?\\n\\/ALT (\\d+)\\/SAT ([*\\-\\d]{4})\\r?\\n\\/WND ([*\\d]{3})([\\*\\d]{3})\\/TAT ([*\\-\\d]{4})\\/TAS ([*\\d]{3,4})\\/CRZ ([*\\d]{3,4})\\r?\\n\\/FOB (\\d{6})\\r?\\n\\/DAT (\\d{6})\\/TIM (\\d{6})/;\n const match = regex.exec(message.text);\n if (!match) {\n decodeResult.decoded = false;\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.formatted.description = 'Position Report';\n\n // Extract fields\n const [\n ,\n flight,\n latHem,\n latDeg,\n latMin,\n latSec,\n lonHem,\n lonDeg,\n lonMin,\n lonSec,\n altitude,\n sat,\n windDir,\n windSpd,\n tat,\n tas,\n crz,\n fob,\n dat,\n tim,\n ] = match;\n\n ResultFormatter.day(decodeResult, parseInt(flight.slice(0, 2), 10));\n ResultFormatter.flightNumber(decodeResult, flight.slice(2));\n let latitude = CoordinateUtils.dmsToDecimalDegrees(\n parseInt(latDeg, 10),\n parseInt(latMin, 10),\n parseInt(latSec, 10),\n );\n if (latHem === 'S') latitude = -latitude;\n let longitude = CoordinateUtils.dmsToDecimalDegrees(\n parseInt(lonDeg, 10),\n parseInt(lonMin, 10),\n parseInt(lonSec, 10),\n );\n if (lonHem === 'W') longitude = -longitude;\n ResultFormatter.position(decodeResult, {\n latitude,\n longitude,\n });\n const alt = parseInt(altitude, 10);\n ResultFormatter.altitude(decodeResult, alt);\n\n // Parse wind\n if (!windSpd.includes('*') && !windDir.includes('*')) {\n ResultFormatter.windData(decodeResult, [\n {\n waypoint: {\n name: 'POSITION',\n },\n flightLevel: Math.round(alt / 100),\n windDirection: parseInt(windDir, 10),\n windSpeed: parseInt(windSpd, 10),\n },\n ]);\n }\n\n if (!tat.includes('*')) {\n ResultFormatter.totalAirTemp(decodeResult, tat);\n }\n if (!tas.includes('*')) {\n ResultFormatter.airspeed(decodeResult, parseInt(tas, 10));\n }\n if (!sat.includes('*')) {\n ResultFormatter.temperature(decodeResult, sat);\n }\n if (!crz.includes('*')) {\n ResultFormatter.mach(decodeResult, parseInt(crz, 10) / 1000);\n }\n\n if (!fob.includes('*')) {\n ResultFormatter.currentFuel(decodeResult, parseInt(fob, 10));\n }\n\n if (!dat.includes('*') && !tim.includes('*')) {\n const yy = dat.slice(0, 2);\n const mm = dat.slice(2, 4);\n const dd = dat.slice(4, 6);\n const ddmmyy = `${dd}${mm}${yy}`;\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(tim, ddmmyy),\n );\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Honeywell Label 16 Position Report\nexport class Label_16_Honeywell extends DecoderPlugin {\n name = 'label-16-honeywell';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (\n message.text.startsWith('(2') &&\n message.text.endsWith('(Z') &&\n message.text.length >= 29\n ) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.unknown(decodeResult, between.substring(0, 4), ''); // Session ID\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(4, 17),\n ),\n );\n if (between.charAt(17) === '-') {\n // Waypoint mode\n const waypoint1 = between.substring(18, 23).trim();\n const waypoint2 = between.substring(23, 28).trim();\n if (waypoint2) {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }, { name: waypoint2 }],\n });\n } else {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }],\n });\n }\n } else {\n // Route mode\n ResultFormatter.departureAirport(\n decodeResult,\n between.substring(17, 21),\n );\n ResultFormatter.arrivalAirport(decodeResult, between.substring(21, 25));\n //ignore the rest (should just be '-')\n }\n /*\n const phases: { [key: string]: string } = {\n '/O': 'En Route',\n '/A': 'Arrival',\n '/D': 'Departure',\n '/P': 'Preflight',\n '/C': 'Climb',\n };\n */\n ResultFormatter.unknown(\n decodeResult,\n between.substring(between.length - 2),\n '',\n );\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 Honeywell message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: N 44.203,W 86.546,31965,6, 290\n let variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*)$/;\n\n // Style: N 28.177/W 96.055\n let variant2Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n\n ResultFormatter.position(decodeResult, pos);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n\n results = message.text.match(variant2Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n\n ResultFormatter.position(decodeResult, pos);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_POSA1 extends DecoderPlugin {\n name = 'label-16-posa1';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['POSA1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const fields = message.text.split(',');\n if (fields.length !== 11 || !fields[0].startsWith('POSA1')) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(5)),\n ); // strip 'POSA1'\n const waypoint = fields[1].trim();\n const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);\n const nextWaypoint = fields[4].trim();\n const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(6), ',');\n ResultFormatter.route(decodeResult, {\n waypoints: [\n { name: waypoint, time: time },\n { name: nextWaypoint, time: nextTime },\n ],\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_TOD extends DecoderPlugin {\n name = 'label-16-tod';\n\n qualifiers() {\n return {\n labels: ['16'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n const time = DateTimeUtils.convertHHMMSSToTod(fields[0]);\n if (fields.length !== 5 || Number.isNaN(time)) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.timestamp(decodeResult, time);\n if (fields[1] !== '') {\n ResultFormatter.altitude(decodeResult, Number(fields[1]));\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n const temp = fields[4].split('/');\n const posFields = temp[0].split(' ');\n if (posFields.length === 4) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(posFields[0]) * Number(posFields[1]),\n longitude:\n CoordinateUtils.getDirection(posFields[2]) * Number(posFields[3]),\n });\n } else if (posFields.length === 2) {\n ResultFormatter.position(decodeResult, {\n latitude:\n (CoordinateUtils.getDirection(posFields[0][0]) *\n Number(posFields[0].slice(1))) /\n 100,\n longitude:\n (CoordinateUtils.getDirection(posFields[1][0]) *\n Number(posFields[1].slice(1))) /\n 100,\n });\n } else {\n // Redacted\n //ResultFormatter.unknown(decodeResult, fields[4]);\n }\n\n if (temp.length > 1) {\n ResultFormatter.flightNumber(decodeResult, temp[1]);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() {\n return {\n labels: ['1M'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 1M ETA: results');\n console.log(results);\n }\n\n decodeResult.raw.flight_number = results[0];\n // results[1]: ETA01 (???)\n // results[2]: 230822 - UTC date of eta\n ResultFormatter.departureAirport(decodeResult, results[3]);\n ResultFormatter.arrivalAirport(decodeResult, results[4]);\n ResultFormatter.alternateAirport(decodeResult, results[5]);\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n ResultFormatter.arrivalRunway(\n decodeResult,\n results[8].replace(results[4], ''),\n ); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n const yymmdd = results[2];\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(\n results[7] + '00',\n yymmdd.substring(4, 6) +\n yymmdd.substring(2, 4) +\n yymmdd.substring(0, 2),\n ),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_3Line extends DecoderPlugin {\n name = 'label-1l-3-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n if (lines.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n const parts = message.text.replaceAll('\\r\\n', '/').split('/');\n const data = new Map<string, string>();\n data.set('', parts[0]);\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const dep = data.get('DEP');\n if (dep) {\n ResultFormatter.departureAirport(decodeResult, dep);\n data.delete('DEP');\n }\n const des = data.get('DES');\n if (des) {\n ResultFormatter.arrivalAirport(decodeResult, des);\n data.delete('DES');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fn = data.get('FN');\n if (fn) {\n ResultFormatter.flightNumber(decodeResult, fn);\n data.delete('FN');\n }\n const day = data.get('DAY');\n const utc = data.get('UTC');\n if (day && utc) {\n decodeResult.raw.message_timestamp =\n Date.parse(day + ' GMT+0000') / 1000 +\n DateTimeUtils.convertHHMMSSToTod(utc);\n data.delete('DAY');\n data.delete('UTC');\n }\n\n const lat = data.get('LAT');\n const lon = data.get('LON');\n if (lat && lon) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n data.delete('LAT');\n data.delete('LON');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n if (key === '') {\n remaining += value;\n } else {\n remaining += `/${key} ${value}`;\n }\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_070 extends DecoderPlugin {\n name = 'label-1l-070';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000070'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000070')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, parts[0]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(parts[4][0]) *\n Number(parts[4].substring(1)),\n longitude:\n CoordinateUtils.getDirection(parts[5][0]) *\n Number(parts[5].substring(1)),\n });\n\n decodeResult.remaining.text = parts[6];\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_660 extends DecoderPlugin {\n name = 'label-1l-660';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000660'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000660')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 5) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n parts[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n const hhmmss = parts[1].substring(0, 6);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmmss),\n );\n const fl = parts[1].substring(6, 9);\n ResultFormatter.altitude(decodeResult, Number(fl) * 100);\n const next = parts[1].substring(9);\n ResultFormatter.route(decodeResult, { waypoints: [{ name: next.trim() }] });\n\n decodeResult.remaining.text = parts.slice(2).join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_Slash extends DecoderPlugin {\n name = 'label-1l-1-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['+', '-'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const data = new Map<string, string>();\n data.set('LAT', parts[0].replaceAll(' ', ''));\n data.set('LON', parts[1].replaceAll(' ', ''));\n for (let i = 2; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const position = {\n latitude: Number(data.get('LAT')),\n longitude: Number(data.get('LON')),\n };\n data.delete('LAT');\n data.delete('LON');\n\n ResultFormatter.position(decodeResult, position);\n const utc = data.get('UTC');\n if (utc) {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(utc),\n );\n data.delete('UTC');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fob = data.get('FOB');\n if (fob) {\n ResultFormatter.currentFuel(decodeResult, Number(fob));\n data.delete('FOB');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n remaining += `/${key} ${value}`;\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() {\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 11) {\n this.debug(options, 'Variation 1 detected');\n const rawCoords = fields[0];\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(rawCoords),\n );\n\n this.setDecodeLevel(decodeResult, true, 'full');\n } else if (fields.length == 5) {\n this.debug(options, 'Variation 2 detected');\n const position = CoordinateUtils.decodeStringCoordinates(fields[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n this.setDecodeLevel(decodeResult, true, 'full');\n } else {\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() {\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 9) {\n // POSN 37.550W 76.436, 98,110800,23961,25820, 65,-23,114212,KRDU\n processPosition(decodeResult, fields[0].trim());\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[7]),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[8]);\n\n ResultFormatter.unknownArr(decodeResult, [\n fields[1],\n fields[4],\n fields[5],\n ]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown!\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string) {\n // N 39.841W 75.790\n if (\n value.length !== 16 &&\n value[0] !== 'N' &&\n value[0] !== 'S' &&\n value[8] !== 'W' &&\n value[8] !== 'E'\n ) {\n return;\n }\n const latDir = value[0] === 'N' ? 1 : -1;\n const lonDir = value[8] === 'E' ? 1 : -1;\n const position = {\n latitude: latDir * Number(value.substring(1, 7)),\n longitude: lonDir * Number(value.substring(9, 15)),\n };\n\n ResultFormatter.position(decodeResult, position);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_OFF extends DecoderPlugin {\n name = 'label-22-off';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['OFF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Takeoff Report');\n\n if (message.text.startsWith('OFF01')) {\n // variant 1\n const fields = message.text.substring(5).split('/');\n\n if (fields.length != 2) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n ResultFormatter.departureDay(\n decodeResult,\n Number(fields[1].substring(0, 2)),\n ); // departure day\n ResultFormatter.arrivalDay(\n decodeResult,\n Number(fields[1].substring(2, 4)),\n ); // arrival day\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(8, 12),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(22));\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else if (message.text.startsWith('OFF02\\r\\n')) {\n // varaint 3\n const fields = message.text.substring(7).split(',');\n if (fields.length != 4) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else if (message.text.startsWith('OFF02')) {\n // varaint 2\n const fields = message.text.substring(5).split('/');\n if (fields.length != 2) {\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n fields[1].substring(0, 14),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(20, 24),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)),\n );\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n this.debug(options, 'Unknown variation.');\n this.setDecodeLevel(decodeResult, false);\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_POS extends DecoderPlugin {\n name = 'label-22-pos';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['N', 'S'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const fields = message.text.split(',');\n\n if (fields.length !== 11) {\n this.debug(\n options,\n `Unknown variation. Field count: ${fields.length}, content: ${fields.join(',')}`,\n );\n this.setDecodeLevel(decodeResult, false);\n return decodeResult;\n }\n\n const latStr = fields[0].substring(1, 8);\n const lonStr = fields[0].substring(9);\n const lat = Number(latStr) / 10000;\n const lon = Number(lonStr) / 10000;\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,\n longitude: CoordinateUtils.getDirection(fields[0][8]) * lon,\n });\n\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);\n\n this.setDecodeLevel(decodeResult, true, 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM3 extends DecoderPlugin {\n name = 'label-2p-fm3';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 7) {\n const header = parts[0].split('FM3 ');\n if (header.length < 2) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n\n if (header[1].length === 4) {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n } else {\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[1]),\n );\n const lat = parts[2].replaceAll(' ', '');\n const lon = parts[3].replaceAll(' ', '');\n if (lat[0] === 'N' || lat[0] === 'S') {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n } else {\n ResultFormatter.position(decodeResult, {\n latitude: Number(lat),\n longitude: Number(lon),\n });\n }\n ResultFormatter.altitude(decodeResult, Number(parts[4]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[5]);\n ResultFormatter.unknown(decodeResult, parts[6]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM4 extends DecoderPlugin {\n name = 'label-2p-fm4';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 10) {\n const header = parts[0].split('FM4');\n if (header.length < 2) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n ResultFormatter.heading(decodeResult, Number(parts[7]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM5 extends DecoderPlugin {\n name = 'label-2p-fm5';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 12) {\n const header = parts[0].split('FM5 ');\n if (header.length < 2) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[7]);\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n ResultFormatter.flightNumber(decodeResult, parts[10].trim());\n ResultFormatter.unknown(decodeResult, parts[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_24_Slash extends DecoderPlugin {\n name = 'label-24-slash';\n\n qualifiers() {\n return {\n labels: ['24'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n\n if (fields.length == 10 && fields[0] == '' && fields[9] == '') {\n // begin and ends with `/`\n const ddmmyy =\n fields[1].substring(2, 4) +\n fields[1].substring(4, 6) +\n fields[1].substring(0, 2); // YYDDMM\n const hhmmss = fields[2] + '00';\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n hhmmss,\n ddmmyy,\n );\n ResultFormatter.flightNumber(decodeResult, fields[3]);\n ResultFormatter.altitude(decodeResult, Number(fields[4]));\n const lat = fields[5];\n const lon = fields[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[8]),\n );\n ResultFormatter.unknown(decodeResult, fields[7]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() {\n return {\n labels: ['30'],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /EA1830/DSKSFO/SK24\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 30 EA: results');\n console.log(results);\n }\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)),\n );\n\n if (results[1].substring(0, 2) === 'DS') {\n ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));\n ResultFormatter.unknown(decodeResult, '/'.concat(results[2]));\n } else {\n ResultFormatter.unknown(\n decodeResult,\n '/'.concat(results[1], '/', results[2]),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","/**\n * Southwest Airlines (SWA) compressed ACARS bodies, labels 37 (downlink) and 40 (uplink).\n *\n * Each body is written in one of nine substitution tables, picked by a two-digit code 01-09:\n * label 37: <code><5-char type, in that table>\\n<body in that table>\n * label 40: <TYPE>,<code><body in that table> (the type name is in clear)\n *\n * All 18 tables are permutations of one 44-character set. Each label 40 table is the label 37\n * table with the same code read backwards. A few characters outside the set pass through as\n * themselves; anything else is printed as UNREAD.\n */\n\n/** The raw characters, in the order the table strings below are written. */\nexport const SWA_ALPHABET = ' (),-./0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\n/** Printed for a raw character no table or passthrough covers (usually a reception error). */\nexport const SWA_UNREAD = '¤';\n\n/** Table code -> decoded character for each SWA_ALPHABET position. */\nexport const SWA_LABEL_37_TABLES: Record<string, string> = {\n '01': 'VIK86MRN5-0PZS4UYXACEHLOTW BGD.123Q(7J9:F)/,',\n '02': 'HG.KZL97QY15WRVTN4JA06(D ,:3MPBICU/8EOFSX)2-',\n '03': '4GXE/QU5FT)20P8RSJ-169AWHLB.,37MNVCYODIKZ (:',\n '04': '1BEHMPSUY,048DG269JLOQTWZ (-/37:ACFIKNRVX).5',\n '05': '3579BDFHJLNPRTVXZ(,.02468:ACEGIKMOQSUWY )-/1',\n '06': 'AGFEDCBRQPONMLKJIH:9876543210/.-,)( ZYXWVUTS',\n '07': ':.02468ACEGIKMOQSUWY )-/13579BDFHJLNPRTVXZ(,',\n '08': '1MDS/JQ.OWZ79LNR532-6(: ,APEFTVIKYB08H)U4CXG',\n '09': '6LQMSR UZYVX(7:3-5KPTACB)021,894NODGJEFIHW./',\n};\n\nexport const SWA_LABEL_40_TABLES: Record<string, string> = {\n '01': 'IRXZ2MY3NOP71-S,UVAJBLCWKD(T)E.0F4Q/6G8 H:95',\n '02': 'GEXHZ)QC3YJ:4D0R/IBMOFSU( NA,.K9TL16V8P75W2-',\n '03': 'XY3KAJ-5B4L 0CM7DZEIQT,1(GU:VHNOS6.892/PF)RW',\n '04': 'HIX2JYK3 8L4Z9M5:NO(P6)Q7,RASB-TC.DU/E0VFW1G',\n '05': 'V:WAXBYCZD E(F)G,HI-J.K/L0M1N2O3P4Q5R6S7T8U9',\n '06': 'RQPONMLKJIHGFEDCBA /.-,)(:9876543210ZYXWVUTS',\n '07': 'CYDZE(F)G,H-I.J/K 0L1M2N3O4P5Q6R7S8T9U:VAWBX',\n '08': 'FDUGB0-R A:W9C4S5EHQX)JKZTN.O6(71I/8,LVM2YP3',\n '09': '/5GK9YZHJI8N: 6LM7DFEQTURWVSA(,OPB).-C03X421',\n};\n\n// Raw characters outside the tables that are literal. Label 37 raw '>' reads as '+'.\nconst PASS_37: Record<string, string> = { '*': '*', '>': '+' };\nconst PASS_40: Record<string, string> = {\n '*': '*',\n '?': '?',\n \"'\": \"'\",\n '#': '#',\n _: '_',\n};\n\n/** A decoded body: the type name and the text, with line breaks as '|'. */\nexport interface SwaDecoded {\n type: string;\n text: string;\n}\n\nfunction lookup(table: string, c: string): string | undefined {\n const i = SWA_ALPHABET.indexOf(c);\n return i < 0 ? undefined : table[i];\n}\n\nfunction plain(table: string, body: string, pass: Record<string, string>) {\n let out = '';\n for (const c of body) {\n if (c === '\\n') out += '|';\n else out += lookup(table, c) ?? pass[c] ?? SWA_UNREAD;\n }\n return out;\n}\n\n/** Decode a label 37 body, or return undefined if it is not in the SWA layout. */\nexport function decodeSwaLabel37(body: string): SwaDecoded | undefined {\n const b = body.replace(/\\r/g, '');\n const table = SWA_LABEL_37_TABLES[b.substring(0, 2)];\n if (!table) return undefined;\n let nl = b.indexOf('\\n');\n // TAR02 ends its header with the field separator instead of a line break.\n if (nl !== 7 && b.length > 7 && lookup(table, b[7]) === ',') nl = 7;\n // The header line is the code and the type, 7 characters (a few carry one more). Longer first\n // lines are other airlines' text, such as a DDHHMM stamp that starts with 01-09.\n if (nl < 0 || nl > 8) return undefined;\n let type = '';\n for (const c of b.substring(2, Math.min(nl, 7))) {\n type += lookup(table, c) ?? SWA_UNREAD;\n }\n return { type, text: plain(table, b.substring(nl + 1), PASS_37) };\n}\n\n/** Decode a label 40 body, or return undefined if it is not in the SWA layout. */\nexport function decodeSwaLabel40(body: string): SwaDecoded | undefined {\n const b = body.replace(/\\r/g, '');\n if (b.startsWith('POS01,')) {\n // Not compressed: `POS01,Y,05` turns position reporting on, every 05 minutes.\n return { type: 'POS01', text: b.trim() };\n }\n const code = b[5] === ',' ? b.substring(6, 8) : '';\n if (code === '00') {\n // Table code 00 is plain text (seen on GEN01 PDC acknowledgements).\n return {\n type: b.substring(0, 5),\n text: b.substring(8).replace(/\\n/g, '|'),\n };\n }\n const table = SWA_LABEL_40_TABLES[code];\n if (!table) return undefined;\n return {\n type: b.substring(0, 5),\n text: plain(table, b.substring(8), PASS_40),\n };\n}\n\n/**\n * Type names seen from Southwest aircraft in a year of airframes traffic. Another airline's label\n * 37 text can decode to a name of the same shape (TRF04, YYY41), so only these are decoded.\n */\nconst SWA_TYPES: Record<'37' | '40', Set<string>> = {\n '37': new Set([\n 'ADV01',\n 'CLB02',\n 'DIV02',\n 'DVC01',\n 'ETA03',\n 'FCM01',\n 'FCR03',\n 'FFD01',\n 'FHD04',\n 'FLI01',\n 'FTD02',\n 'GAM02',\n 'GSR02',\n 'HGD03',\n 'HLD01',\n 'INN03',\n 'INR04',\n 'MXR03',\n 'OFF02',\n 'OFP01',\n 'ONN02',\n 'OUT03',\n 'PFR03',\n 'PFR04',\n 'PJS01',\n 'PNS01',\n 'POS01',\n 'POS02',\n 'PRM01',\n 'RRR01',\n 'RTG03',\n 'RTG04',\n 'RTG05',\n 'TAR02',\n 'TDM01',\n 'TOD03',\n 'TRB02',\n 'TXI02',\n 'VXR02',\n ]),\n '40': new Set([\n 'ASR01',\n 'DVP01',\n 'FTX01',\n 'GAR03',\n 'GEN01',\n 'PIC01',\n 'POS01',\n 'WFC01',\n ]),\n};\n\n/** True for a type name Southwest sends on that label (POS01, FTX01). */\nexport function isSwaType(type: string, label: '37' | '40'): boolean {\n return SWA_TYPES[label].has(type);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { ResultFormatter } from './result_formatter';\n\n/**\n * Field layouts and field writers shared by the Southwest label 37 and 40 plugins.\n *\n * A decoded body is split on ',' and on line breaks. A type's fields are only read when every\n * field matches its layout; otherwise the plugin returns the decoded text alone. The \"no value\"\n * forms (empty, ----.---, **.*, ****) are the aircraft's own placeholders.\n */\nconst APT = '(?:[A-Z]{4}| {4}|)';\nconst LAT = '(?:[NS] ?\\\\d{1,2}\\\\.\\\\d{3}|-{4}\\\\.-{3}|)';\nconst LON = '(?:[EW] ?\\\\d{1,3}\\\\.\\\\d{3}|-{4}\\\\.-{3}|)';\nconst T4 = '(?:\\\\d{4}|\\\\*{4}|-{4})';\nconst FOB = '(?: ?\\\\d{1,2}\\\\.\\\\d|\\\\*\\\\*\\\\.\\\\*)';\nconst INT = '(?: *-? *\\\\d+| *|-+|\\\\*+)';\nconst MACH = '\\\\.\\\\d{3}';\nconst HMS = '\\\\d{6}';\nconst OC = '[OC]';\nconst POS = [\n APT,\n APT,\n LAT,\n LON,\n INT,\n INT,\n INT,\n MACH,\n FOB,\n T4,\n INT,\n INT,\n INT,\n INT,\n];\nconst ASR = ' *-?\\\\d+(?:\\\\.[\\\\d-])?|XX\\\\.X';\n\n/** Each type's layouts, one pattern per field, by type. A type may have more than one layout. */\nexport const SWA_LAYOUTS: Record<string, string[][]> = {\n ASR01: [[ASR, ASR, ASR, ASR, ASR, ASR, ASR, ASR, '', '']],\n CLB02: [[APT, APT, LAT, '', LON, FOB, T4]],\n ETA03: [[APT, APT, T4, FOB, LAT, LON]],\n FCM01: [['L[\\\\d-]', 'R[\\\\d-]', 'A[\\\\d-]', 'B[\\\\d-]', '\\\\d+', T4]],\n FHD04: [\n [\n ...POS,\n '(?:OUT|OFF|ON|IN|RET IN)',\n 'X',\n INT,\n ' *\\\\d*',\n HMS,\n '(?:\\\\d{6}|-{6})',\n '\\\\d{5}',\n ],\n ],\n FLI01: [[APT, APT, T4, FOB, LAT, LON]],\n GAM02: [[APT, APT, T4, LAT, LON]],\n GAR03: [\n [\n '[A-Z0-9]{1,4} *',\n '[YN]',\n '[YN]',\n '[YN]',\n '[YN]',\n '[YN]',\n '(?:1[23]\\\\d\\\\.\\\\d{1,3}|999\\\\.999)',\n '',\n '',\n ],\n ],\n HGD03: [[...POS, INT]],\n INN03: [[APT, APT, T4, T4, FOB, OC, OC, OC, OC]],\n INR04: [[APT, APT, T4, T4, FOB, LAT, LON]],\n OUT03: [[APT, APT, T4, FOB, FOB, T4]],\n POS01: [\n [...POS, INT],\n [...POS, INT, HMS],\n ],\n POS02: [[...POS, INT, HMS]],\n RTG04: [[APT, APT, T4, T4, T4, FOB, OC, OC, OC, OC]],\n RTG05: [[APT, APT, T4, T4, T4, FOB, OC, OC, OC, OC]],\n TDM01: [[APT, APT, LAT, LON, '(?:L1|L2|CR|SV)', OC, T4, HMS]],\n TXI02: [[APT, APT, T4, FOB]],\n VXR02: [['[A-Z]{3}']],\n};\n\n/** Types whose first fields have a layout and whose free text follows. */\nexport const SWA_PREFIX_LAYOUTS: Record<string, string[]> = {\n MXR03: [APT, '(?:\\\\d{4}|)', '[0-3]'],\n};\n\nexport function swaFields(text: string): string[] {\n return text.replace(/\\|/g, ',').split(',');\n}\n\n/** True when the fields match one of the layouts exactly. */\nexport function swaMatchesLayout(fields: string[], layouts: string[][]) {\n return layouts.some(\n (layout) =>\n layout.length === fields.length &&\n layout.every((rx, i) => new RegExp(`^(?:${rx})$`).test(fields[i])),\n );\n}\n\n/**\n * Writes fields into a DecodeResult and remembers which ones it used, so the rest can go to\n * `remaining`.\n */\nexport class SwaFieldWriter {\n private used = new Set<number>();\n\n constructor(\n private decodeResult: DecodeResult,\n private fields: string[],\n ) {}\n\n private take(i: number): string {\n this.used.add(i);\n return this.fields[i] ?? '';\n }\n\n /** A field with no specific ResultFormatter helper; `key` is its name in `raw`. */\n item(i: number, key: string, code: string, label: string, value: string) {\n this.used.add(i);\n ResultFormatter.raw(this.decodeResult, key, code, label, value);\n }\n\n /** Marks a field as read without writing it (it was written together with another). */\n use(i: number): string {\n return this.take(i);\n }\n\n departure(i: number) {\n const v = this.take(i);\n if (/^[A-Z]{4}$/.test(v))\n ResultFormatter.departureAirport(this.decodeResult, v);\n }\n\n arrival(i: number) {\n const v = this.take(i);\n if (/^[A-Z]{4}$/.test(v))\n ResultFormatter.arrivalAirport(this.decodeResult, v);\n }\n\n /**\n * Writes the position when both coordinates are present and in range. Otherwise the\n * placeholders are consumed and any coordinate that was sent stays for `remaining`.\n */\n position(latIndex: number, lonIndex: number) {\n const lat = this.fields[latIndex] ?? '';\n const lon = this.fields[lonIndex] ?? '';\n // Decimal degrees after the hemisphere letter (N 38.523, W100.807). CoordinateUtils' parsers\n // read the packed N38523W100807 form, so only its sign helper applies.\n const latitude = /^[NS] ?\\d/.test(lat)\n ? CoordinateUtils.getDirection(lat) * Number(lat.substring(1).trim())\n : NaN;\n const longitude = /^[EW] ?\\d/.test(lon)\n ? CoordinateUtils.getDirection(lon) * Number(lon.substring(1).trim())\n : NaN;\n if (Math.abs(latitude) <= 90 && Math.abs(longitude) <= 180) {\n this.used.add(latIndex);\n this.used.add(lonIndex);\n ResultFormatter.position(this.decodeResult, { latitude, longitude });\n return;\n }\n if (!/^[NS] ?\\d/.test(lat)) this.used.add(latIndex);\n if (!/^[EW] ?\\d/.test(lon)) this.used.add(lonIndex);\n }\n\n /** A whole number, or undefined for a placeholder. */\n int(i: number): number | undefined {\n const v = this.take(i).replace(/ /g, '');\n return /^-?\\d+$/.test(v) ? Number(v) : undefined;\n }\n\n altitude(i: number) {\n const v = this.int(i);\n if (v !== undefined) ResultFormatter.altitude(this.decodeResult, v);\n }\n\n /** Fuel on board, sent in thousands of pounds; written in pounds. */\n fuel(i: number) {\n const v = this.take(i).trim();\n if (/^\\d+\\.\\d$/.test(v)) {\n ResultFormatter.currentFuel(\n this.decodeResult,\n Math.round(Number(v) * 1000),\n );\n }\n }\n\n /**\n * HHMM or HHMMSS as seconds of the day. A placeholder is consumed; a time out of range is\n * left for `remaining`.\n */\n tod(i: number): number | undefined {\n const v = this.fields[i] ?? '';\n if (/^(?:[01]\\d|2[0-3])[0-5]\\d(?:[0-5]\\d)?$/.test(v)) {\n this.used.add(i);\n return DateTimeUtils.convertHHMMSSToTod(v);\n }\n if (!/^\\d+$/.test(v)) this.used.add(i);\n return undefined;\n }\n\n /** Writes a time through a ResultFormatter helper such as `out`, `in` or `timestamp`. */\n time(i: number, write: (decodeResult: DecodeResult, time: number) => void) {\n const t = this.tod(i);\n if (t !== undefined) write(this.decodeResult, t);\n }\n\n /** A time with no ResultFormatter helper, written as HH:MM:SS. */\n timeItem(i: number, key: string, code: string, label: string) {\n const t = this.tod(i);\n if (t !== undefined) {\n this.item(i, key, code, label, DateTimeUtils.timestampToString(t));\n }\n }\n\n eta(i: number) {\n this.time(i, (r, t) => ResultFormatter.eta(r, t));\n }\n\n /** Fields not written above, non-empty, to `remaining`. */\n finish() {\n const rest = this.fields.filter(\n (v, i) => !this.used.has(i) && v.trim() !== '',\n );\n if (rest.length > 0) ResultFormatter.unknownArr(this.decodeResult, rest);\n return rest.length;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport {\n decodeSwaLabel37,\n isSwaType,\n SWA_UNREAD,\n} from '../utils/swa_compressed';\nimport {\n SWA_LAYOUTS,\n SWA_PREFIX_LAYOUTS,\n SwaFieldWriter,\n swaFields,\n swaMatchesLayout,\n} from '../utils/swa_fields';\n\n// By type. The two digits are the type's version and are kept: versions differ in layout\n// (POS01 15 or 16 fields, POS02 16).\nconst DESCRIPTIONS: Record<string, string> = {\n ADV01: 'Ride Conditions Report',\n CLB02: 'Climb Report',\n DVC01: 'Divert Plan (Crew Copy)',\n ETA03: 'ETA Report',\n FCM01: 'Engine and Fuel State',\n FCR03: 'Runway Condition Report',\n FHD04: 'Frequency Handoff Report',\n FLI01: 'Flight Initialization',\n FTD02: 'Free Text to Dispatch',\n GAM02: 'Gate Assignment Request',\n HGD03: 'HowGozit Report',\n HLD01: 'Holding Report',\n INN03: 'In Report',\n INR04: 'In Range Report',\n MXR03: 'Maintenance Report',\n OFF02: 'Off Report',\n ONN02: 'On Report',\n OUT03: 'Out Report',\n PFR03: 'Post Flight Report',\n POS01: 'Position Report',\n POS02: 'Position Report',\n RRR01: 'Reroute Report',\n RTG04: 'Return to Gate Report',\n RTG05: 'Return to Gate Report',\n TDM01: 'Door Report',\n TRB02: 'Turbulence Report',\n TXI02: 'Taxi Report',\n VXR02: 'Voice Call Request',\n};\n\nconst DOORS: Record<string, string> = {\n L1: 'L1 (forward entry)',\n L2: 'L2 (aft entry)',\n CR: 'Cargo',\n SV: 'Service',\n};\n\nconst MXR_CODES: Record<string, string> = {\n '0': 'Nothing to report',\n '1': 'Status option',\n '2': 'Category and text',\n '3': 'Free text',\n};\n\n/**\n * Southwest Airlines label 37 downlinks: a two-digit table code, the type name in that table on\n * the first line, then the body in the same table. See utils/swa_compressed.ts.\n */\nexport class Label_37_SWA extends DecoderPlugin {\n name = 'label-37-swa';\n\n qualifiers() {\n return {\n labels: ['37'],\n preambles: ['01', '02', '03', '04', '05', '06', '07', '08', '09'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const d = decodeSwaLabel37(message.text);\n if (!d || !isSwaType(d.type, '37')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 37 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.formatted.description = 'Unknown';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.formatted.description =\n DESCRIPTIONS[d.type] ?? 'Southwest Message';\n decodeResult.raw.preamble = d.type;\n\n const text = d.text;\n const fields = swaFields(text);\n const layouts = SWA_LAYOUTS[d.type];\n const prefix = SWA_PREFIX_LAYOUTS[d.type];\n const clean = !text.includes(SWA_UNREAD);\n if (clean && layouts && swaMatchesLayout(fields, layouts)) {\n const rest = this.writeFields(decodeResult, d.type, fields);\n decodeResult.decoder.decodeLevel = rest === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n if (\n clean &&\n prefix &&\n swaMatchesLayout(fields.slice(0, prefix.length), [prefix])\n ) {\n const rest = this.writeMaintenance(decodeResult, text, fields);\n decodeResult.decoder.decodeLevel = rest === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n\n if (clean && !layouts && !prefix) {\n // Free text and the report types whose fields are not read: the text in full.\n const lines = text.split('|');\n const route = lines[0].match(/^([A-Z]{4}),([A-Z]{4})$/);\n if (route && d.type === 'FTD02') {\n ResultFormatter.departureAirport(decodeResult, route[1]);\n ResultFormatter.arrivalAirport(decodeResult, route[2]);\n lines.shift();\n }\n ResultFormatter.text(decodeResult, lines.join('\\n'));\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n // An unread character or a field that breaks the type's layout: show the text only.\n ResultFormatter.text(decodeResult, text.split('|').join('\\n'));\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n /** Writes a laid-out type's fields; returns how many went to `remaining`. */\n private writeFields(\n decodeResult: DecodeResult,\n type: string,\n fields: string[],\n ): number {\n const w = new SwaFieldWriter(decodeResult, fields);\n switch (type) {\n case 'POS01':\n case 'POS02':\n case 'HGD03':\n case 'FHD04': {\n // from, to, lat, lon, alt, IAS, TAS, Mach, FOB, ETA, track, wind dir, wind kt, SAT, gross wt\n w.departure(0);\n w.arrival(1);\n w.position(2, 3);\n w.altitude(4);\n const ias = w.int(5);\n if (ias !== undefined)\n ResultFormatter.indicatedAirspeed(decodeResult, ias);\n const tas = w.int(6);\n if (tas !== undefined) ResultFormatter.airspeed(decodeResult, tas);\n ResultFormatter.mach(decodeResult, Number(w.use(7)));\n w.fuel(8);\n w.eta(9);\n const track = w.int(10);\n if (track !== undefined) ResultFormatter.track(decodeResult, track);\n ResultFormatter.wind(decodeResult, w.int(11), w.int(12));\n const sat = w.int(13);\n if (sat !== undefined)\n ResultFormatter.temperature(decodeResult, `${sat}`);\n // FHD04 has the first 14 fields, then event, X, gross wt, digit, snapshot HHMMSS,\n // frequency in use, 00000.\n const gwIndex = type === 'FHD04' ? 16 : 14;\n const gw = w.int(gwIndex);\n if (gw !== undefined) ResultFormatter.grossWeight(decodeResult, gw);\n // The 16-field POS01 and POS02 end with the send time, HHMMSS.\n if (type !== 'FHD04' && fields.length === 16) {\n w.time(15, (r, t) => ResultFormatter.timestamp(r, t));\n }\n if (type === 'FHD04') {\n w.item(14, 'event', 'EVT', 'Event', fields[14]);\n w.use(15);\n const freq = w.use(19);\n if (/^1\\d{5}$/.test(freq)) {\n w.item(\n 19,\n 'frequency',\n 'FREQ',\n 'ACARS Frequency',\n `${freq.substring(0, 3)}.${freq.substring(3)} MHz`,\n );\n }\n }\n break;\n }\n case 'GAM02':\n w.departure(0);\n w.arrival(1);\n w.eta(2);\n w.position(3, 4);\n break;\n case 'CLB02':\n w.departure(0);\n w.arrival(1);\n w.position(2, 4);\n w.fuel(5);\n w.eta(6);\n break;\n case 'ETA03':\n w.departure(0);\n w.arrival(1);\n w.eta(2);\n w.fuel(3);\n w.position(4, 5);\n break;\n case 'INR04':\n // ETA (11-19 min after the report time in every one of 34,851), then the report time.\n w.departure(0);\n w.arrival(1);\n w.eta(2);\n w.time(3, (r, t) => ResultFormatter.timestamp(r, t));\n w.fuel(4);\n w.position(5, 6);\n break;\n case 'FLI01':\n w.departure(0);\n w.arrival(1);\n w.time(2, (r, t) => ResultFormatter.timestamp(r, t));\n w.fuel(3);\n w.position(4, 5);\n break;\n case 'OUT03':\n // Out time, FOB, a second fuel figure (not established), front door (L1) closed.\n w.departure(0);\n w.arrival(1);\n w.time(2, (r, t) => ResultFormatter.out(r, t));\n w.fuel(3);\n w.timeItem(5, 'front_door_closed_time', 'L1CLS', 'Front Door Closed');\n break;\n case 'TXI02':\n w.departure(0);\n w.arrival(1);\n w.timeItem(2, 'taxi_start_time', 'TAXI', 'Taxi Start Time');\n w.fuel(3);\n break;\n case 'INN03':\n w.departure(0);\n w.arrival(1);\n // In time, then front door (L1) opened; the four door flags are not established.\n w.time(2, (r, t) => ResultFormatter.in(r, t));\n w.timeItem(3, 'front_door_open_time', 'L1OPN', 'Front Door Opened');\n w.fuel(4);\n break;\n case 'RTG04':\n case 'RTG05':\n // Out, in, report time; the four door flags are not established.\n w.departure(0);\n w.arrival(1);\n w.time(2, (r, t) => ResultFormatter.out(r, t));\n w.time(3, (r, t) => ResultFormatter.in(r, t));\n w.time(4, (r, t) => ResultFormatter.timestamp(r, t));\n w.fuel(5);\n break;\n case 'TDM01': {\n w.departure(0);\n w.arrival(1);\n w.position(2, 3);\n ResultFormatter.door_event(\n decodeResult,\n DOORS[w.use(4)],\n w.use(5) === 'O' ? 'open' : 'closed',\n );\n // Date (MMDD) and time (HHMMSS) of the door event.\n const md = fields[6];\n if (/^(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])$/.test(md)) {\n w.use(6);\n ResultFormatter.month(decodeResult, Number(md.substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(md.substring(2)));\n } else if (!/^\\d+$/.test(md)) {\n w.use(6);\n }\n w.time(7, (r, t) => ResultFormatter.timestamp(r, t));\n break;\n }\n case 'FCM01': {\n // L, R (engines), A (APU), each 1 running / 0 off; fuel in hundreds of pounds\n const names: Record<string, string> = {\n L: 'Left Engine',\n R: 'Right Engine',\n A: 'APU',\n };\n for (let i = 0; i < 3; i++) {\n const v = fields[i];\n if (v[1] === '0' || v[1] === '1') {\n w.item(\n i,\n `${names[v[0]].toLowerCase().replace(' ', '_')}`,\n v[0],\n names[v[0]],\n v[1] === '1' ? 'running' : 'off',\n );\n }\n }\n ResultFormatter.currentFuel(decodeResult, Number(w.use(4)) * 100);\n w.time(5, (r, t) => ResultFormatter.timestamp(r, t));\n break;\n }\n case 'VXR02':\n w.item(0, 'station_iata', 'STN', 'Station', fields[0]);\n break;\n }\n return w.finish();\n }\n\n /** MXR03: destination, ETA, code, then the category and text; returns how many header\n * fields went to `remaining`. */\n private writeMaintenance(\n decodeResult: DecodeResult,\n text: string,\n fields: string[],\n ): number {\n const w = new SwaFieldWriter(decodeResult, fields.slice(0, 3));\n w.arrival(0);\n w.eta(1);\n w.item(\n 2,\n 'maintenance_code',\n 'MXCODE',\n 'Report Code',\n `${fields[2]} (${MXR_CODES[fields[2]]})`,\n );\n // Skip the three header fields (the separators may be ',' or a line break).\n const header = text.match(/^[^,|]*[,|][^,|]*[,|][^,|]*[,|]?/);\n const body = text.substring(header ? header[0].length : 0);\n if (body.trim() !== '') {\n ResultFormatter.text(decodeResult, body.split('|').join('\\n'));\n }\n return w.finish();\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport {\n decodeSwaLabel40,\n isSwaType,\n SWA_UNREAD,\n} from '../utils/swa_compressed';\nimport {\n SWA_LAYOUTS,\n SwaFieldWriter,\n swaFields,\n swaMatchesLayout,\n} from '../utils/swa_fields';\n\n// By type; the two digits are the type's version.\nconst DESCRIPTIONS: Record<string, string> = {\n ASR01: 'Approach Stability Report',\n DVP01: 'Divert Plan',\n FTX01: 'Dispatch Free Text',\n GAR03: 'Gate Assignment Response',\n GEN01: 'Company Message',\n PIC01: 'Part 117 Duty Extension Request',\n POS01: 'Position Report Request',\n WFC01: 'Field Condition Report',\n};\n\n// ASR01 fields, in order.\nconst ASR01: [string, string, string][] = [\n [\n 'reverser_distance',\n 'REVDIST',\n 'Threshold to Thrust Reverser Deployment (feet)',\n ],\n ['max_ias', 'MAXIAS', 'Highest IAS, 1000 feet to Touchdown (knots)'],\n ['min_ias', 'MINIAS', 'Lowest IAS, to Touchdown (knots)'],\n ['touchdown_distance', 'TDDIST', 'Threshold to Touchdown (feet)'],\n ['glideslope_above', 'GSHIGH', 'Largest Deviation Above Glideslope (dots)'],\n ['glideslope_below', 'GSLOW', 'Largest Deviation Below Glideslope (dots)'],\n ['max_pitch', 'MAXPITCH', 'Highest Pitch, Flare and Landing (degrees)'],\n ['tailstrike_pitch', 'TSPITCH', 'Tail Strike Pitch Limit (degrees)'],\n];\n\n/**\n * Southwest Airlines label 40 uplinks: `TYPE,` in clear, a two-digit table code, then the body in\n * that table. See utils/swa_compressed.ts.\n */\nexport class Label_40_SWA extends DecoderPlugin {\n name = 'label-40-swa';\n\n qualifiers() {\n return {\n labels: ['40'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const d = decodeSwaLabel40(message.text);\n if (!d || !isSwaType(d.type, '40')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 40 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.formatted.description = 'Unknown';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.formatted.description =\n DESCRIPTIONS[d.type] ?? 'Southwest Message';\n decodeResult.raw.preamble = d.type;\n\n if (d.type === 'POS01') {\n const m = d.text.match(/^POS01,Y,(\\d{2})$/);\n if (m) {\n ResultFormatter.raw(\n decodeResult,\n 'report_interval',\n 'RPTINT',\n 'Position Report Interval',\n `${Number(m[1])} minutes`,\n Number(m[1]),\n );\n decodeResult.decoder.decodeLevel = 'full';\n } else {\n ResultFormatter.unknown(decodeResult, d.text);\n decodeResult.decoder.decodeLevel = 'partial';\n }\n return decodeResult;\n }\n\n const text = d.text;\n const fields = swaFields(text);\n const layouts = SWA_LAYOUTS[d.type];\n const clean = !text.includes(SWA_UNREAD);\n if (clean && layouts && swaMatchesLayout(fields, layouts)) {\n const w = new SwaFieldWriter(decodeResult, fields);\n if (d.type === 'ASR01') {\n ASR01.forEach(([key, code, label], i) => {\n const v = fields[i].trim();\n // XX.X: no glideslope flown\n if (v !== 'XX.X') w.item(i, key, code, label, v);\n else w.use(i);\n });\n } else if (d.type === 'GAR03') {\n // gate, five Y/N flags (meaning not established), ramp frequency\n // GAR03 answers the in-flight GAM02 gate request, so this is the arrival gate.\n ResultFormatter.arrivalGate(decodeResult, w.use(0).trim());\n if (fields[6] !== '999.999') {\n w.item(\n 6,\n 'ramp_frequency',\n 'RAMPFREQ',\n 'Ramp Frequency',\n `${fields[6]} MHz`,\n );\n } else {\n w.use(6);\n }\n }\n const rest = w.finish();\n decodeResult.decoder.decodeLevel = rest === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n\n ResultFormatter.text(decodeResult, text.split('|').join('\\n'));\n decodeResult.decoder.decodeLevel = clean && !layouts ? 'full' : 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA Report — has a different field layout from the other Label 44 events\n// (altitude between coords and airports), so it uses DecoderPlugin directly\n// rather than Label_44_Base.\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const result = this.initResult(message, 'ETA Report');\n\n const data = message.text.split(',');\n if (data.length < 9) {\n return this.failUnknown(result, message.text, options);\n }\n\n this.debug(options, 'ETA Report: fields', data);\n\n ResultFormatter.position(\n result,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.altitude(result, 100 * Number(data[2]));\n ResultFormatter.departureAirport(result, data[3]);\n ResultFormatter.arrivalAirport(result, data[4]);\n ResultFormatter.month(result, Number(data[5].substring(0, 2)));\n ResultFormatter.day(result, Number(data[5].substring(2, 4)));\n ResultFormatter.timestamp(\n result,\n DateTimeUtils.convertHHMMSSToTod(data[6]),\n );\n ResultFormatter.eta(result, DateTimeUtils.convertHHMMSSToTod(data[7]));\n\n const fuel = Number(data[8]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(result, fuel);\n }\n\n if (data.length > 9) {\n ResultFormatter.unknownArr(result, data.slice(9));\n }\n\n this.setDecodeLevel(result, true, 'full');\n return result;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n/**\n * Base class for Label 44 event-style decoders (ON, OFF, IN).\n *\n * These all share the same CSV structure:\n * preamble, coordinates, [field(s)...], departure, arrival, date, time(s), fuel\n *\n * Subclasses provide the description, qualifiers, minimum field count,\n * and a hook to decode their specific fields from the CSV data.\n */\nexport abstract class Label_44_Base extends DecoderPlugin {\n /** Human-readable description of this report type (e.g. \"On Runway Report\"). */\n abstract get description(): string;\n\n /** Minimum number of CSV fields required for a valid message. */\n abstract get minFields(): number;\n\n /**\n * Decode the fields that are specific to this report type.\n * The common fields (position, airports, date) are already handled.\n * @param result - The in-progress decode result to populate\n * @param data - The full CSV-split message fields\n * @param options - Decoder options\n */\n abstract decodeEventFields(\n result: DecodeResult,\n data: string[],\n options: Options,\n ): void;\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const result = this.initResult(message, this.description);\n\n const data = message.text.split(',');\n if (data.length < this.minFields) {\n return this.failUnknown(result, message.text, options);\n }\n\n this.debug(options, `${this.description}: fields`, data);\n\n // Common fields shared by all Label 44 event decoders\n ResultFormatter.position(\n result,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(result, data[2]);\n ResultFormatter.arrivalAirport(result, data[3]);\n ResultFormatter.month(result, Number(data[4].substring(0, 2)));\n ResultFormatter.day(result, Number(data[4].substring(2, 4)));\n\n // Subclass-specific fields\n this.decodeEventFields(result, data, options);\n\n this.setDecodeLevel(result, true, 'full');\n return result;\n }\n\n /**\n * Helper to parse a fuel value from a CSV field.\n * Returns undefined if the value is not a valid number.\n */\n protected parseFuel(result: DecodeResult, value: string): void {\n const fuel = Number(value);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(result, fuel);\n }\n }\n\n /**\n * Helper to add any remaining fields as unknown.\n */\n protected addRemainingFields(\n result: DecodeResult,\n data: string[],\n startIndex: number,\n ): void {\n if (data.length > startIndex) {\n ResultFormatter.unknownArr(result, data.slice(startIndex));\n }\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// In Gate Report\nexport class Label_44_IN extends Label_44_Base {\n name = 'label-44-in';\n get description() {\n return 'In Gate Report';\n }\n get minFields() {\n return 7;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.in(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n this.parseFuel(result, data[6]);\n this.addRemainingFields(result, data, 7);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// Off Runway Report\nexport class Label_44_OFF extends Label_44_Base {\n name = 'label-44-off';\n get description() {\n return 'Off Runway Report';\n }\n get minFields() {\n return 8;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00OFF01', '00OFF02', '00OFF03', 'OFF01', 'OFF02', 'OFF03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.off(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n ResultFormatter.eta(result, DateTimeUtils.convertHHMMSSToTod(data[6]));\n this.parseFuel(result, data[7]);\n this.addRemainingFields(result, data, 8);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Label_44_Base } from './Label_44_Base';\n\n// On Runway Report\nexport class Label_44_ON extends Label_44_Base {\n name = 'label-44-on';\n get description() {\n return 'On Runway Report';\n }\n get minFields() {\n return 7;\n }\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ON01', '00ON02', '00ON03', 'ON01', 'ON02', 'ON03'],\n };\n }\n\n decodeEventFields(\n result: DecodeResult,\n data: string[],\n _options: Options,\n ): void {\n ResultFormatter.on(result, DateTimeUtils.convertHHMMSSToTod(data[5]));\n this.parseFuel(result, data[6]);\n this.addRemainingFields(result, data, 7);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00POS01', '00POS02', '00POS03', 'POS01', 'POS02', 'POS03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n // Style: POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1\n // Match: POS02,coords,flight_level_or_ground,departure_icao,arrival_icao,current_date,current_time,eta_time,fuel_in_tons\n const regex =\n /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n this.debug(options, 'Position Report: groups', results.groups);\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n results.groups.unsplit_coords,\n ),\n );\n const flight_level =\n results.groups.flight_level_or_ground == 'GRD' ||\n results.groups.flight_level_or_ground == '***'\n ? 0\n : Number(results.groups.flight_level_or_ground);\n\n ResultFormatter.month(\n decodeResult,\n Number(results.groups.current_date.substring(0, 2)),\n );\n ResultFormatter.day(\n decodeResult,\n Number(results.groups.current_date.substring(2, 4)),\n );\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + '00'),\n );\n\n // TODO: ETA month and Day\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + '00'),\n );\n\n if (\n results.groups.fuel_in_tons != '***' &&\n results.groups.fuel_in_tons != '****'\n ) {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n ResultFormatter.departureAirport(\n decodeResult,\n results.groups.departure_icao,\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n\n this.setDecodeLevel(decodeResult, true, 'full');\n return decodeResult;\n }\n\n return this.failUnknown(decodeResult, message.text, options);\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { FlightPlanUtils } from '../utils/flight_plan_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Flight Briefing Report\nexport class Label_44_Slash extends DecoderPlugin {\n name = 'label-44-slash';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: [' /FB'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Briefing';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n if (fields.length !== 4) {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(0, 2), '/'); // 0 is a space\n // 1 is the briefing id\n // 2 is arrival airport, but repeated later\n const data = fields[3].split(',');\n if (data.length >= 6) {\n if (options.debug) {\n console.log('Label 44 Slash: groups');\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n (data[0].charAt(0) === 'S' ? -1 : 1) *\n parseFloat(data[0].slice(1).trim()),\n longitude:\n (data[1].charAt(0) === 'W' ? -1 : 1) *\n parseFloat(data[1].slice(1).trim()),\n });\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.unknown(decodeResult, data[3]); // Status - need more info to decode\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n if (data.length === 18) {\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 8), ','); // 6 is repeated arrival airport\n ResultFormatter.remainingFuel(decodeResult, parseFloat(data[8]));\n ResultFormatter.unknownArr(decodeResult, data.slice(9, 11), ',');\n ResultFormatter.arrivalRunway(decodeResult, data[11]);\n FlightPlanUtils.addProcedure(decodeResult, data[12], 'arrival');\n ResultFormatter.unknownArr(decodeResult, data.slice(13, 18), ',');\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Waypoint } from '../types/waypoint';\n\nexport class Label_4A extends DecoderPlugin {\n name = 'label-4a';\n\n qualifiers() {\n return {\n labels: ['4A'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n if (fields.length === 11) {\n // variant 1\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.tail(decodeResult, fields[2].replace('.', ''));\n if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);\n ResultFormatter.departureAirport(decodeResult, fields[4]);\n ResultFormatter.arrivalAirport(decodeResult, fields[5]);\n // ResultFormatter.altitude(decodeResult, Number(alt) * 100);\n ResultFormatter.unknownArr(decodeResult, fields.slice(8));\n } else if (fields.length === 6) {\n const f0 = fields[0];\n if (f0.length > 0 && (f0[0] === 'N' || f0[0] === 'S')) {\n // variant 2\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)),\n );\n let wp1: Waypoint = {\n name: fields[0].substring(13).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),\n };\n ResultFormatter.altitude(\n decodeResult,\n Number(fields[1].substring(6, 9)) * 100,\n );\n let wp2: Waypoint = {\n name: fields[1].substring(9).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[2]),\n };\n ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });\n ResultFormatter.temperature(decodeResult, fields[3]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(4));\n } else {\n // variant 3\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1]),\n );\n ResultFormatter.unknown(decodeResult, fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(\n (fields[4] + fields[5]).replace(/[ \\.]/g, ''),\n ),\n );\n }\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_01 extends DecoderPlugin {\n name = 'label-4a-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n let rgx = message.text.match(\n /^01([A-Z]{2})([A-Z]{2})\\s*(\\w+)\\/(\\d{6})([A-Z]{4})([A-Z]{4})\\r\\n([+-]\\s*\\d+)(\\d{3}\\.\\d)([+-]\\s*\\d+\\.\\d)/,\n );\n if (rgx) {\n ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);\n ResultFormatter.callsign(decodeResult, rgx[3]);\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(rgx[4] + '00'),\n );\n ResultFormatter.departureAirport(decodeResult, rgx[5]);\n ResultFormatter.arrivalAirport(decodeResult, rgx[6]);\n ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, '')));\n ResultFormatter.unknown(decodeResult, rgx[8]);\n ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ''));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DIS extends DecoderPlugin {\n name = 'label-4a-dis';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DIS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n const fields = message.text.split(',');\n if (fields.length < 3 || !fields[1] || fields[1].length < 3 || !fields[2]) {\n decodeResult.decoded = false;\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + '00'),\n );\n ResultFormatter.callsign(decodeResult, fields[2]);\n ResultFormatter.text(decodeResult, fields.slice(3).join(''));\n\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DOOR extends DecoderPlugin {\n name = 'label-4a-door';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DOOR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Latest New Format');\n\n decodeResult.decoded = true;\n const fields = message.text.split(' ');\n if (fields.length === 3) {\n ResultFormatter.door_event(\n decodeResult,\n fields[0].split('/')[1],\n fields[1],\n );\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2] + '00'),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n this.setDecodeLevel(decodeResult, decodeResult.decoded);\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_Slash_01 extends DecoderPlugin {\n name = 'label-4a-slash-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['/01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n if (message.text.length === 5 && message.text.substring(0, 4) === '/01-') {\n ResultFormatter.unknown(decodeResult, message.text.substring(4));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4N extends DecoderPlugin {\n name = 'label-4n';\n\n qualifiers() {\n return {\n labels: ['4N'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n const fields = text.split(',');\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(30, 45).replace(/^(.)0/, '$1'),\n ),\n );\n ResultFormatter.altitude(\n decodeResult,\n Number(text.substring(48, 51)) * 100,\n );\n ResultFormatter.unknownArr(\n decodeResult,\n [text.substring(2, 4), text.substring(19, 29)],\n ' ',\n );\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === 'B') {\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[4]),\n longitude: Number(fields[5]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[6]));\n }\n ResultFormatter.departureAirport(decodeResult, fields[8]);\n ResultFormatter.arrivalAirport(decodeResult, fields[9]);\n ResultFormatter.alternateAirport(decodeResult, fields[10]);\n ResultFormatter.arrivalRunway(decodeResult, fields[11].split('/')[0]);\n if (fields[12].length > 1) {\n ResultFormatter.alternateRunway(decodeResult, fields[12].split('/')[0]);\n }\n ResultFormatter.checksum(decodeResult, parseInt(fields[32], 16));\n ResultFormatter.unknownArr(\n decodeResult,\n [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(\n (f) => f != '',\n ),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_AGFSR extends DecoderPlugin {\n name = 'label-4t-agfsr';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['AGFSR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(5).split('/');\n\n if (!message.text.startsWith('AGFSR') || data.length !== 20) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n ResultFormatter.arrivalDay(decodeResult, Number(data[2]));\n ResultFormatter.departureAirport(\n decodeResult,\n data[3].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), 'IATA');\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)),\n ); // HHMMZ\n ResultFormatter.unknown(decodeResult, data[5], '/');\n const lat = data[6].substring(0, 7);\n const lon = data[6].substring(7, 15);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) +\n Number(lat.substring(2, 6)) / 60,\n longitude:\n CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) +\n Number(lon.substring(3, 7)) / 60,\n });\n ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));\n // 8 - phase of flight?\n // 11 - temperature?\n ResultFormatter.unknownArr(decodeResult, data.slice(8), '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_58 extends DecoderPlugin {\n name = 'label-58';\n\n qualifiers() {\n return {\n labels: ['58'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.split('/');\n if (data.length === 8) {\n ResultFormatter.flightNumber(decodeResult, data[0]);\n ResultFormatter.day(decodeResult, Number(data[1]));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n const lat = data[3];\n const lon = data[4];\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n ResultFormatter.altitude(decodeResult, Number(data[5]));\n ResultFormatter.unknown(decodeResult, data[6], '/');\n ResultFormatter.unknown(decodeResult, data[7], '/');\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 58 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_ETA extends DecoderPlugin {\n name = 'label-4t-eta';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['ETA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split('/');\n\n if (!message.text.startsWith('ETA') || data.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n const etaData = data[2].split(' ');\n ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));\n ResultFormatter.arrivalAirport(decodeResult, etaData[1], 'IATA');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)),\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nconst POS_REGEX = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\nconst WS_REGEX = /\\s+/;\nconst NEWLINE_REGEX = /\\r?\\n/;\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n qualifiers() {\n return {\n labels: ['80'],\n preambles: [],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(\n message,\n 'Airline Defined Position Report',\n );\n\n const lines = message.text.split(NEWLINE_REGEX);\n if (lines.length === 1 && lines[0].includes(',')) {\n this.parseCsvFormat(lines[0], decodeResult);\n } else {\n const header = lines[0].trim();\n const headerParts = header.split(',');\n for (let i = 0; i < headerParts.length - 1; i++) {\n const moreFields = headerParts[i].split('/');\n for (const more of moreFields) {\n this.parseTags(more.trim(), decodeResult);\n }\n }\n\n this.parseHeader(\n headerParts[headerParts.length - 1].trim(),\n decodeResult,\n );\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const parts = line.split('/');\n for (const part of parts) {\n this.parseTags(part.trim(), decodeResult);\n }\n }\n }\n\n if (decodeResult.formatted.items.length > 0) {\n this.setDecodeLevel(decodeResult, true);\n }\n\n return decodeResult;\n }\n\n private parseHeader(header: string, results: DecodeResult) {\n //3N01 POSRPT 0581/27 KIAD/MSLP .N962AV/04H 11:02\n const fields = header.split('/');\n if (fields.length < 3) {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n const msgInfo = fields[0].split(WS_REGEX);\n if (msgInfo.length === 3) {\n ResultFormatter.unknownArr(results, msgInfo.slice(0, 2), ' ');\n ResultFormatter.flightNumber(results, msgInfo[2]);\n } else {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n\n const otherInfo1 = fields[1].split(WS_REGEX);\n if (otherInfo1.length === 2) {\n ResultFormatter.day(results, parseInt(otherInfo1[0], 10));\n ResultFormatter.departureAirport(results, otherInfo1[1]);\n } else {\n ResultFormatter.unknownArr(results, otherInfo1, ' ');\n }\n\n const otherInfo2 = fields[2].split(WS_REGEX);\n if (otherInfo2.length === 2) {\n ResultFormatter.arrivalAirport(results, otherInfo2[0]);\n ResultFormatter.tail(results, otherInfo2[1].replace('.', ''));\n } else {\n ResultFormatter.unknownArr(results, otherInfo2, ' ');\n }\n\n if (fields.length > 3) {\n ResultFormatter.unknownArr(results, fields.slice(3), '/');\n }\n }\n\n private parseTags(part: string, results: DecodeResult) {\n const kvPair = part.split(WS_REGEX);\n if (kvPair.length < 2) {\n ResultFormatter.unknown(results, part, '/');\n return;\n }\n const tag = kvPair[0];\n const val = kvPair.slice(1).join(' ');\n\n switch (tag) {\n case 'POS': {\n // don't use decodeStringCoordinates because of different position format\n const posResult = POS_REGEX.exec(val);\n const lat =\n Number(posResult?.groups?.lat) *\n (posResult?.groups?.latd === 'S' ? -1 : 1);\n const lon =\n Number(posResult?.groups?.lng) *\n (posResult?.groups?.lngd === 'W' ? -1 : 1);\n const position = {\n latitude: Number.isInteger(lat) ? lat / 1000 : lat / 100,\n longitude: Number.isInteger(lon) ? lon / 1000 : lon / 100,\n };\n ResultFormatter.position(results, position);\n break;\n }\n case 'ALT':\n ResultFormatter.altitude(results, parseInt(val.replace('+', ''), 10));\n break;\n case 'FL': // Handle \"FL 360\"\n ResultFormatter.altitude(results, parseInt(val, 10) * 100);\n break;\n case 'MCH':\n ResultFormatter.mach(results, parseInt(val, 10) / 1000);\n break;\n case 'SPD':\n ResultFormatter.groundspeed(results, parseInt(val, 10));\n break;\n case 'TAS':\n ResultFormatter.airspeed(results, parseInt(val, 10));\n break;\n case 'SAT':\n ResultFormatter.temperature(results, val);\n break;\n case 'FB':\n // ignoring, assuming FOB and avoiding duplicates.\n break;\n case 'FOB':\n // Strip non-numeric like 'N' in 'N009414'\n ResultFormatter.currentFuel(\n results,\n parseInt(val.replace(/\\D/g, ''), 10),\n );\n break;\n case 'UTC':\n ResultFormatter.timestamp(\n results,\n DateTimeUtils.convertHHMMSSToTod(val),\n );\n break;\n case 'ETA': {\n const hhmm = val.split('.')[0].replace(':', '');\n ResultFormatter.eta(results, DateTimeUtils.convertHHMMSSToTod(hhmm));\n break;\n }\n case 'HDG':\n ResultFormatter.heading(results, parseInt(val, 10));\n break;\n case 'NWYP':\n results.raw.next_waypoint = val;\n break;\n case 'SWN':\n // wind speed, do nothing for\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'DWN':\n // wind direction, do nothing for now\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'AD':\n // do nothing, as it shows in the header\n break;\n default:\n ResultFormatter.unknown(results, part, '/');\n }\n }\n private parseCsvFormat(text: string, results: DecodeResult) {\n const csvParts = text.split(',');\n if (csvParts.length !== 9) {\n return;\n }\n const header = csvParts[0].trim().split(WS_REGEX);\n ResultFormatter.unknown(results, header[0], ' ');\n ResultFormatter.unknown(results, header[1], ' ');\n ResultFormatter.position(\n results,\n CoordinateUtils.decodeStringCoordinates(header[2]),\n );\n ResultFormatter.unknown(results, csvParts[1]);\n ResultFormatter.timestamp(\n results,\n DateTimeUtils.convertHHMMSSToTod(csvParts[2]),\n );\n ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ',');\n ResultFormatter.temperature(\n results,\n (\n (csvParts[6].charAt(0) === 'M' ? -1 : 1) *\n parseInt(csvParts[6].slice(1), 10)\n ).toString(),\n );\n ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));\n ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nconst WS_REGEX = /\\s+/;\nconst ALL_WS_REGEX = /\\s/g;\nconst ALL_DOTS_REGEX = /\\./g;\n\nexport class Label_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() {\n return {\n labels: ['83'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n if (text.startsWith('4DH3 ETAT2')) {\n // variant 2\n const fields = text.split(WS_REGEX);\n if (fields[2].length > 5) {\n decodeResult.raw.day = fields[2].substring(5);\n }\n ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));\n const subfields = fields[3].split('/');\n ResultFormatter.departureAirport(decodeResult, subfields[0]);\n ResultFormatter.arrivalAirport(decodeResult, subfields[1]);\n ResultFormatter.tail(decodeResult, fields[4].replace(ALL_DOTS_REGEX, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[6] + '00'),\n );\n } else if (text.startsWith('001PR')) {\n // variant 3\n decodeResult.raw.day = text.substring(5, 7);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(13, 28).replace(ALL_DOTS_REGEX, ''),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n ResultFormatter.unknown(decodeResult, text.substring(33));\n } else {\n const fields = text.replace(ALL_WS_REGEX, '').split(',');\n if (fields.length === 9) {\n // variant 1\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n decodeResult.raw.day = fields[2].substring(0, 2);\n decodeResult.raw.time = fields[2].substring(2);\n // text was already whitespace-stripped above so the per-field\n // .replace(/\\s/g, '') is redundant.\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[3]),\n longitude: Number(fields[4]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[5]));\n ResultFormatter.groundspeed(decodeResult, Number(fields[6]));\n ResultFormatter.heading(decodeResult, Number(fields[7]));\n ResultFormatter.unknown(decodeResult, fields[8]);\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() {\n return {\n labels: ['8E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: EGSS,1618\n // Match: arrival_icao,arrival_eta\n const regex = /^(?<arrival_icao>\\w{4}),(?<arrival_eta>\\d{4})$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 8E ETA: groups');\n console.log(results.groups);\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta),\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// CPDLC\nexport class Label_B6_Forwardslash extends DecoderPlugin {\n name = 'label-b6-forwardslash';\n\n qualifiers() {\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'CPDLC Message');\n\n // Full ATN/PM-CPDLC parsing isn't implemented yet, but the body\n // (everything after the leading \"/\") is at least preserved in the\n // decoded output so consumers don't lose it.\n const body = message.text.substring(1);\n if (body.length > 0) {\n ResultFormatter.text(decodeResult, body);\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n this.setDecodeLevel(decodeResult, false);\n }\n\n this.debug(options, 'CPDLC body:', body);\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_ColonComma extends DecoderPlugin {\n name = 'label-colon-comma';\n\n qualifiers() {\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description =\n 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n code: 'FREQ',\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_76401 extends DecoderPlugin {\n name = 'label-h1-76401';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['76401\\r\\n'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Position Report');\n\n const lines = message.text.split('\\r\\n');\n\n if (lines.length < 3) {\n return decodeResult;\n }\n\n ResultFormatter.unknown(decodeResult, lines[0], '\\r\\n');\n\n ResultFormatter.unknown(decodeResult, lines[1].substring(0, 5), '\\r\\n');\n ResultFormatter.departureAirport(decodeResult, lines[1].substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, lines[1].substring(9, 13));\n ResultFormatter.unknown(decodeResult, lines[1].substring(13), ''); // should have nothing left on line 1\n\n const waypoints: Waypoint[] = [];\n for (const line of lines.slice(2)) {\n const position = CoordinateUtils.decodeStringCoordinates(\n line.substring(0, 13),\n );\n if (position) {\n waypoints.push({\n name: line.substring(0, 13),\n latitude: position.latitude,\n longitude: position.longitude,\n time: DateTimeUtils.convertHHMMSSToTod(line.substring(13, 19)),\n });\n } else {\n ResultFormatter.unknown(decodeResult, line.substring(0, 19), '');\n }\n ResultFormatter.unknown(decodeResult, line.substring(19), '\\r\\n');\n }\n\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n // add position from the last waypoint for fun mapping\n if (waypoints.length > 0) {\n const lastWaypoint = waypoints[waypoints.length - 1];\n // should be true, making typescript happy\n if (\n lastWaypoint.latitude !== undefined &&\n lastWaypoint.longitude !== undefined\n ) {\n ResultFormatter.position(decodeResult, {\n latitude: lastWaypoint.latitude,\n longitude: lastWaypoint.longitude,\n });\n }\n\n // should be true, making typescript happy\n if (lastWaypoint.time !== undefined) {\n ResultFormatter.timestamp(decodeResult, lastWaypoint.time);\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_H1_ATIS extends DecoderPlugin {\n name = 'label-h1-atis';\n\n qualifiers() {\n return {\n labels: ['H1', '5Z'],\n preambles: ['L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ATIS Subscription';\n decodeResult.message = message;\n\n // Pattern: L[2-digit seq]A[flight]/[facility].TI2/[code][airport][checksum]\n const regex =\n /^L(\\d{2})A([A-Z0-9]+)\\/([A-Z]{4})\\.TI2\\/(\\d{3})([A-Z]{4})([A-F0-9]+)$/;\n const match = message.text.match(regex);\n\n if (!match) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 ATIS message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const seq = match[1];\n const flight = match[2];\n const facility = match[3];\n const code = match[4];\n const airport = match[5];\n const checksum = match[6];\n\n ResultFormatter.flightNumber(decodeResult, flight);\n ResultFormatter.arrivalAirport(decodeResult, facility);\n ResultFormatter.sequenceNumber(decodeResult, parseInt(seq, 10));\n\n decodeResult.raw.atis_code = code;\n decodeResult.formatted.items.push({\n type: 'atis',\n code: 'ATIS_CODE',\n label: 'ATIS Code',\n value: code,\n });\n\n // The airport in the TI2 section\n if (airport !== facility) {\n decodeResult.raw.atis_airport = airport;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ATIS_ARPT',\n label: 'ATIS Airport',\n value: airport,\n });\n }\n\n // Checksum\n ResultFormatter.checksum(decodeResult, parseInt(checksum, 16));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_EZF extends DecoderPlugin {\n name = 'label-h1-ezf';\n\n qualifiers() {\n return {\n labels: ['H1', '1M'],\n preambles: ['EZF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Load Sheet';\n decodeResult.message = message;\n\n const lines = message.text\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length < 2 || lines[0] !== 'EZF') {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 EZF message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const loadsheet: Record<string, string> = {};\n const unknowns: string[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('-')) {\n const kvMatch = line.match(/^-([^/]+)\\/(.+)$/);\n if (kvMatch) {\n loadsheet[kvMatch[1]] = kvMatch[2];\n } else {\n unknowns.push(line);\n }\n } else if (i === 1) {\n // Second line is the flight identifier, e.g. NO0246/10/EI-NEO\n const idParts = line.split('/');\n if (idParts.length >= 1) {\n ResultFormatter.flightNumber(decodeResult, idParts[0]);\n }\n if (idParts.length >= 3) {\n ResultFormatter.tail(decodeResult, idParts[2]);\n }\n // Remaining parts of identifier line\n if (idParts.length >= 2) {\n // idParts[1] is day or other info - store but don't format\n }\n } else if (i === 2) {\n // Third line typically contains config info, e.g. /C28Y331/3/9\n unknowns.push(line);\n } else {\n unknowns.push(line);\n }\n }\n\n // Extract known fields from loadsheet\n if (loadsheet['SCT']) {\n const route = loadsheet['SCT'].split('-');\n if (route.length === 2) {\n ResultFormatter.departureAirport(decodeResult, route[0], 'IATA');\n ResultFormatter.arrivalAirport(decodeResult, route[1], 'IATA');\n }\n }\n\n // Store all loadsheet data in raw\n decodeResult.raw.loadsheet = loadsheet;\n\n // Format key loadsheet items\n const formatFields: [string, string, string][] = [\n ['STD', 'Scheduled Time of Departure', 'std'],\n ['FLT STATUS', 'Flight Status', 'flight_status'],\n ['UOM', 'Unit of Measure', 'uom'],\n ['ZFW', 'Zero Fuel Weight', 'zfw'],\n ['PAX', 'Passengers', 'pax'],\n ['TOW', 'Takeoff Weight', 'tow'],\n ['DOW', 'Dry Operating Weight', 'dow'],\n ['FWT', 'Fuel Weight', 'fuel_weight'],\n ];\n\n for (const [key, label, code] of formatFields) {\n if (loadsheet[key]) {\n decodeResult.formatted.items.push({\n type: 'loadsheet',\n code: code.toUpperCase(),\n label: label,\n value: loadsheet[key],\n });\n }\n }\n\n if (unknowns.length > 0) {\n ResultFormatter.unknownArr(decodeResult, unknowns, '\\n');\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Fault Log Report');\n\n const parts = message.text.split('/FR');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n for (let i = 1; i < fields.length; i++) {\n const field = fields[i];\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.fault_message = msg;\n decodeResult.formatted.items.push({\n type: 'fault',\n code: 'FR',\n label: 'Fault Report',\n value: decodeResult.raw.fault_message,\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_H1_M_POS extends DecoderPlugin {\n name = 'label-h1-m-pos';\n\n qualifiers() {\n return {\n labels: ['H1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(\n message,\n 'M-Series Periodic Position Report',\n );\n\n // Match M[2-digit seq]A[airline 2-char][flight 4-digit][origin],[dest],[DDHHMM],[lat],[lon],[alt],[hdg],...\n const headerRegex = /^M(\\d{2})A([A-Z]{2})(\\d{4})/;\n const headerMatch = message.text.match(headerRegex);\n\n if (!headerMatch) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const airline = headerMatch[2];\n const flightNum = headerMatch[3];\n const afterHeader = message.text.substring(headerMatch[0].length);\n const fields = afterHeader.split(',');\n\n // We expect at least: origin, dest, DDHHMM, lat, lon, alt, hdg\n if (fields.length < 7) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n ResultFormatter.flightNumber(decodeResult, `${airline}${flightNum}`);\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n\n // DDHHMM timestamp\n const timestamp = fields[2].trim();\n if (timestamp.length === 6) {\n const day = Number(timestamp.substring(0, 2));\n const tod = DateTimeUtils.convertHHMMSSToTod(\n timestamp.substring(2) + '00',\n );\n ResultFormatter.day(decodeResult, day);\n ResultFormatter.timestamp(decodeResult, tod);\n }\n\n // Latitude and longitude (trim spaces, e.g. \"- 4.9985\")\n const lat = parseFloat(fields[3].replace(/\\s/g, ''));\n const lon = parseFloat(fields[4].replace(/\\s/g, ''));\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n\n // Altitude\n const alt = Number(fields[5]);\n ResultFormatter.altitude(decodeResult, alt);\n\n // Heading\n const hdg = Number(fields[6]);\n ResultFormatter.heading(decodeResult, hdg);\n\n // Remaining fields as unknown\n if (fields.length > 7) {\n ResultFormatter.unknownArr(decodeResult, fields.slice(7));\n }\n\n this.setDecodeLevel(\n decodeResult,\n true,\n fields.length > 7 ? 'partial' : 'full',\n );\n\n return decodeResult;\n }\n}\n","import * as pako from 'pako';\n\n/**\n * Inflate compressed data with support for partial/truncated streams.\n * Uses Z_SYNC_FLUSH to extract as much data as possible, even from\n * incomplete deflate streams. Captures output via onData callback.\n *\n * @param data - The compressed input bytes\n * @param raw - If true, use raw deflate (no zlib header); if false, expect zlib header\n * @returns The decompressed bytes, or undefined if no output was produced\n */\nexport function inflateData(\n data: Uint8Array,\n raw: boolean,\n): Uint8Array | undefined {\n const chunks: Uint8Array[] = [];\n const inflator = new pako.Inflate({ windowBits: raw ? -15 : 15 });\n inflator.onData = (chunk: Uint8Array) => {\n chunks.push(chunk);\n };\n inflator.push(data, 2); // Z_SYNC_FLUSH\n\n if (chunks.length === 0) return undefined;\n if (chunks.length === 1) return chunks[0];\n\n const totalLen = chunks.reduce((sum, c) => sum + c.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n/**\n * Decode a base64 or base64url string to Uint8Array.\n * Handles missing padding and converts base64url chars (- and _) to\n * standard base64 chars (+ and /), matching Buffer.from(str, 'base64') behavior.\n *\n * @param base64 - The base64 or base64url encoded string\n * @returns The decoded bytes\n */\nexport function base64ToUint8Array(base64: string): Uint8Array {\n const cleaned = base64\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n .replace(/[^A-Za-z0-9+/]/g, '');\n const padded = cleaned + '='.repeat((4 - (cleaned.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { base64ToUint8Array, inflateData } from '../utils/compression';\n\nconst textDecoder = new TextDecoder();\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['OHMA', '/RTNBOCR.OHMA', '#T1B/RTNBOCR.OHMA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n\n const data = message.text.split('OHMA')[1]; // throw out '/RTNOCR.' - even though it means something\n try {\n const compressedBuffer = base64ToUint8Array(data);\n const result = inflateData(compressedBuffer, false);\n if (!result || result.length === 0) {\n throw new Error('Decompression produced no output');\n }\n const jsonText = textDecoder.decode(result);\n\n let formattedMsg;\n let jsonMessage;\n try {\n jsonMessage = JSON.parse(jsonText).message;\n } catch {\n jsonMessage = jsonText;\n }\n\n try {\n const ohmaMsg = JSON.parse(jsonMessage);\n formattedMsg = JSON.stringify(ohmaMsg, null, 2);\n } catch {\n formattedMsg = jsonMessage;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.raw.ohma = jsonText;\n decodeResult.formatted.items.push({\n type: 'ohma',\n code: 'OHMA',\n label: 'OHMA Downlink',\n value: formattedMsg,\n });\n } catch (e) {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 OHMA message: ${message.text}`, e);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","/**\n * ICAO Doc 4444 Flight Plan (FPL) parser utility.\n *\n * Parses the standard ICAO FPL format:\n * (FPL-callsign-flightRulesType\n * -aircraftType/wake-equipment/surveillance\n * -departureHHMM\n * -speedLevel route\n * -destinationHHMM alternate1 alternate2\n * -otherInfo)\n */\n\nimport { Route } from '../types/route';\n\nexport interface IcaoFlightPlan {\n callsign: string;\n flightRules: string;\n flightType: string;\n aircraftType: string;\n wakeTurbulence: string;\n equipment: string;\n surveillance: string;\n departure: string;\n departureTime: string;\n cruiseSpeed: string;\n cruiseLevel: string;\n route: Route;\n destination: string;\n eet: string;\n alternates: string[];\n otherInfo: Record<string, string>;\n}\n\nexport function parseIcaoFpl(text: string): IcaoFlightPlan | null {\n // Find the (FPL-...) block\n const fplStart = text.indexOf('(FPL-');\n if (fplStart === -1) {\n return null;\n }\n\n // Find matching closing paren\n const fplEnd = text.indexOf(')', fplStart);\n if (fplEnd === -1) {\n return null;\n }\n\n // Extract inner content after \"(FPL-\"\n const inner = text.substring(fplStart + 5, fplEnd);\n\n // Normalize: collapse all whitespace (newlines, multiple spaces) to single space\n const normalized = inner.replace(/\\s+/g, ' ').trim();\n\n // Split on \" -\" or leading \"-\" to get the field sections.\n // The format is: callsign-rulesType-acft/wake-equip/surv-deptHHMM-speedLevel route-destHHMM alts-other\n // After removing \"(FPL-\", the first field is callsign-rulesType.\n // Subsequent fields are separated by \"-\" that appears after a space or at start of a section line.\n // However, the \"-\" delimiter is tricky: it separates major sections but also appears\n // within equipment strings (e.g. SDE3FGHIJ1...) — those are NOT delimiters.\n //\n // The ICAO FPL has exactly 6 major sections after the callsign section, delimited by \"-\".\n // We need to split carefully. The format after \"(FPL-\" is:\n // section1-section2-section3-section4-section5-section6\n // where section1 = \"callsign-rulesType\" (contains one internal \"-\")\n //\n // Strategy: split on \"-\" and reconstruct based on known patterns.\n\n const parts = normalized.split('-');\n\n // We need at least 7 parts (callsign, rulesType, acftType/wake, equip/surv, dept, speed+route, dest+alts, other...)\n // But the equipment section may contain hyphens too, so we parse positionally.\n\n if (parts.length < 7) {\n return null;\n }\n\n // Section 1: callsign\n const callsign = parts[0].trim();\n if (!callsign) {\n return null;\n }\n\n // Section 2: flight rules + flight type (e.g., \"IS\")\n const rulesType = parts[1].trim();\n if (rulesType.length < 2) {\n return null;\n }\n const flightRules = rulesType[0];\n const flightType = rulesType[1];\n\n // Now we need to find the remaining sections. The challenge is that equipment strings\n // can be long but don't contain \"-\". The aircraft/wake section is \"TYPE/WAKE\".\n // The equipment/surveillance section is \"EQUIP/SURV\".\n // These are separated by \"-\".\n\n // Section 3: aircraft type / wake turbulence category (e.g., \"B77W/H\")\n const acftWake = parts[2].trim();\n const acftSlash = acftWake.indexOf('/');\n if (acftSlash === -1) {\n return null;\n }\n const aircraftType = acftWake.substring(0, acftSlash);\n const wakeTurbulence = acftWake.substring(acftSlash + 1);\n\n // Section 4: equipment / surveillance (e.g., \"SDE3FGHIJ1J2J3J4J5M1P2RWXYZ/LB1D1\")\n const equipSurv = parts[3].trim();\n const equipSlash = equipSurv.indexOf('/');\n if (equipSlash === -1) {\n return null;\n }\n const equipment = equipSurv.substring(0, equipSlash);\n const surveillance = equipSurv.substring(equipSlash + 1);\n\n // Section 5: departure aerodrome + time (e.g., \"VESPA2354\" or \"KSFO0100\")\n const deptField = parts[4].trim();\n // Time is always last 4 digits\n const departureTime = deptField.substring(deptField.length - 4);\n const departure = deptField.substring(0, deptField.length - 4);\n\n // Section 6: cruise speed/level + route (e.g., \"N0482F350 DCT ENI DCT OAK DCT BURGL IRNMN2\")\n const speedRouteField = parts[5].trim();\n // Speed is first token like N0482 or M084, level follows like F350 or S1190\n const speedMatch = speedRouteField.match(\n /^([NKM]\\d{3,4})([FAVMS]\\d{3,4})\\s*(.*)/,\n );\n if (!speedMatch) {\n return null;\n }\n const cruiseSpeed = speedMatch[1];\n const cruiseLevel = speedMatch[2];\n const route = {\n waypoints: speedMatch[3].split(' ').map((s) => ({\n name: s,\n })),\n };\n\n // Section 7: destination + EET + alternates (e.g., \"KLAX0117 KSFO\")\n const destField = parts[6].trim();\n const destParts = destField.split(/\\s+/);\n const destTime = destParts[0];\n // Destination ICAO is first 4 chars, EET is last 4 digits\n const destination = destTime.substring(0, destTime.length - 4);\n const eet = destTime.substring(destTime.length - 4);\n const alternates = destParts.slice(1).filter((s) => s.length > 0);\n\n // Section 8+: other information (remaining parts joined, then parsed as key/value)\n const otherRaw = parts.slice(7).join('-').trim();\n const otherInfo: Record<string, string> = {};\n\n if (otherRaw.length > 0) {\n // Other info is a series of KEY/VALUE pairs separated by spaces\n // e.g., \"PBN/A1B1C1D1L1O2S2T1 NAV/ABAS RNP2 DAT/1FANSE SUR/RSP180 DOF/260310 REG/B2036\"\n // Parse by finding KEY/ patterns\n const otherTokens = otherRaw.split(/\\s+/);\n let currentKey = '';\n let currentValue = '';\n\n for (const token of otherTokens) {\n const kvMatch = token.match(/^([A-Z]{2,})\\/(.*)/);\n if (kvMatch) {\n // Save previous key/value if exists\n if (currentKey) {\n otherInfo[currentKey] = currentValue.trim();\n }\n currentKey = kvMatch[1];\n currentValue = kvMatch[2];\n } else if (currentKey) {\n // Continuation of previous value\n currentValue += ' ' + token;\n }\n }\n // Save last key/value\n if (currentKey) {\n otherInfo[currentKey] = currentValue.trim();\n }\n }\n\n return {\n callsign,\n flightRules,\n flightType,\n aircraftType,\n wakeTurbulence,\n equipment,\n surveillance,\n departure,\n departureTime,\n cruiseSpeed,\n cruiseLevel,\n route,\n destination,\n eet,\n alternates,\n otherInfo,\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { parseIcaoFpl } from '../utils/icao_fpl_utils';\n\nexport class Label_H1_OFP extends DecoderPlugin {\n name = 'label-h1-ofp';\n\n qualifiers() {\n return {\n labels: ['H1', '1M'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Operational Flight Plan';\n\n if (!message.text.includes('(FPL-')) {\n if (options.debug) {\n console.log(`Decoder: No FPL block found in message`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const fpl = parseIcaoFpl(message.text);\n if (!fpl) {\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // Populate decoded results\n ResultFormatter.callsign(decodeResult, fpl.callsign);\n\n decodeResult.formatted.items.push({\n type: 'aircraft_type',\n code: 'ACFT',\n label: 'Aircraft Type',\n value: fpl.aircraftType,\n });\n\n if (fpl.departure) {\n ResultFormatter.departureAirport(decodeResult, fpl.departure);\n }\n\n if (fpl.destination) {\n ResultFormatter.arrivalAirport(decodeResult, fpl.destination);\n }\n\n if (fpl.alternates.length > 0) {\n ResultFormatter.alternateAirport(decodeResult, fpl.alternates[0]);\n }\n\n if (fpl.route) {\n ResultFormatter.route(decodeResult, fpl.route);\n }\n\n if (fpl.otherInfo.REG) {\n ResultFormatter.tail(decodeResult, fpl.otherInfo.REG);\n }\n\n const rulesMap: Record<string, string> = {\n I: 'IFR',\n V: 'VFR',\n Y: 'IFR/VFR',\n Z: 'VFR/IFR',\n };\n const rulesDesc = rulesMap[fpl.flightRules] || fpl.flightRules;\n decodeResult.formatted.items.push({\n type: 'flight_rules',\n code: 'RULES',\n label: 'Flight Rules',\n value: rulesDesc,\n });\n\n decodeResult.formatted.items.push({\n type: 'cruise',\n code: 'CRUISE',\n label: 'Cruise Speed/Level',\n value: `${fpl.cruiseSpeed} ${fpl.cruiseLevel}`,\n });\n\n // Store raw FPL data\n decodeResult.raw.icao_fpl = fpl;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_Paren extends DecoderPlugin {\n name = 'label-h1-paren';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['('],\n };\n }\n\n decode(message: Message): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (!message.text || !message.text.startsWith('(')) {\n decodeResult.decoded = false;\n return decodeResult;\n }\n\n const regex =\n /^\\(POS-(?<flight>\\w+)\\s+(?<lat>-?\\d{4,5}[NS])(?<lon>\\d{5}[EW])\\/(?<timestamp>\\d{6})\\s+F(?<alt>\\d{3})\\r?\\nRMK\\/FUEL\\s+(?<fuel>\\d{2,3}\\.\\d)\\s+M(?<mach>\\d\\.\\d{2})\\)/;\n\n const match = message.text.match(regex);\n if (match && match.groups) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.formatted.description = 'Position Report';\n\n ResultFormatter.flightNumber(decodeResult, match.groups.flight);\n ResultFormatter.position(decodeResult, {\n latitude: parseLat(match.groups.lat),\n longitude: parseLon(match.groups.lon),\n });\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(match.groups.timestamp),\n );\n ResultFormatter.altitude(\n decodeResult,\n parseInt(match.groups.alt, 10) * 100,\n );\n ResultFormatter.currentFuel(decodeResult, parseFloat(match.groups.fuel));\n ResultFormatter.mach(decodeResult, parseFloat(match.groups.mach));\n ResultFormatter.unknown(decodeResult, 'RMK');\n }\n return decodeResult;\n }\n}\n\nfunction parseLat(latStr: string): number {\n const match = latStr.match(/(-?)(\\d{2})(\\d{2})([NS])/);\n if (!match) return NaN;\n let deg = parseInt(match[2]);\n let min = parseInt(match[3]);\n let sign = match[4] === 'S' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n\nfunction parseLon(lonStr: string): number {\n const match = lonStr.match(/(\\d{3})(\\d{2})([EW])/);\n if (!match) return NaN;\n let deg = parseInt(match[1]);\n let min = parseInt(match[2]);\n let sign = match[3] === 'W' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_StarPOS extends DecoderPlugin {\n name = 'label-h1-star-pos';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['*POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const msg = message.text;\n // assuming fixed length until other variants found\n if (msg.length !== 43 || !msg.startsWith('*POS')) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${msg}`);\n }\n ResultFormatter.unknown(decodeResult, msg);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));\n ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));\n ResultFormatter.timestamp(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)),\n );\n ResultFormatter.position(decodeResult, {\n // Deg Min, no sec\n latitude:\n CoordinateUtils.getDirection(msg.substring(12, 13)) *\n (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),\n longitude:\n CoordinateUtils.getDirection(msg.substring(17, 18)) *\n (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23)) / 60),\n });\n ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));\n ResultFormatter.unknown(decodeResult, msg.substring(28));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { TrackPoint } from '../types/track_point';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Flight phase codes. The MAX (86501) sends ER where the 737-700 and -800 send CR, and never CR.\nconst PHASES: Record<string, string> = {\n TO: 'Takeoff',\n IC: 'Initial Climb',\n CL: 'Climb',\n CR: 'Cruise',\n ER: 'En Route',\n DC: 'Descent',\n AP: 'Approach',\n RO: 'Rollout',\n};\n\n// lat ddmm.m, lon dddmm.m, DDHHMM, altitude (feet), outside air temperature (C),\n// wind direction, wind speed (knots), phase, water vapor (ppmv, 00000 for no reading), and 1\n// when the aircraft has a humidity sensor. Water vapor is only ever sent with a 1 (142,434\n// points with 0, none with a reading), and gives relative humidity of 105% or less in 96.6%\n// of 84,461 points.\nconst POINT =\n /^([NS]\\d{4})\\.(\\d),([EW]\\d{5})\\.(\\d),(\\d{2})(\\d{2})(\\d{2}),\\s?(-?\\d+),\\s?(-?\\d+\\.\\d),(\\d{3}),(\\d{3}),([A-Z]{2}),(\\d{5}),([01]),$/;\n\n/**\n * Southwest Airlines H1 track report: report 76502 (737-700/800) or 86501 (737 MAX), sent in\n * clear. A header, the number of points, one line per point, then `:`.\n */\nexport class Label_H1_SWA_Track extends DecoderPlugin {\n name = 'label-h1-swa-track';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['++76502,', '++86501,', '#DFB++76502,', '#DFB++86501,'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Track Report');\n\n const nl = message.text.includes('\\r\\n') ? '\\r\\n' : '\\n';\n // '#DFB' starts the message and, where blocks were joined, each later block\n const lines = message.text.replace(/#DFB/g, '').split(/\\r?\\n/);\n // report, ship number or tail, aircraft type, YYMMDD, flight, origin, destination, leg\n // counter, software version\n const header = lines[0].replace(/^\\+\\+/, '').split(',');\n if (header.length !== 9 || !/^\\d{6}$/.test(header[3])) {\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n const unknown: string[] = [];\n if (/^N\\w+$/.test(header[1])) {\n ResultFormatter.tail(decodeResult, header[1]);\n } else if (/^\\d{1,4}$/.test(header[1])) {\n // the fleet number: N204WN sends 204 (16,889 of 16,889 reports from N###WN tails)\n ResultFormatter.raw(\n decodeResult,\n 'ship_number',\n 'SHIP',\n 'Ship Number',\n header[1],\n );\n } else if (header[1] !== 'XXX') {\n // XXX is sent by aircraft without a ship number\n unknown.push(header[1]);\n }\n ResultFormatter.raw(\n decodeResult,\n 'aircraft_type',\n 'ACTYPE',\n 'Aircraft Type',\n header[2],\n );\n const d = header[3];\n ResultFormatter.raw(\n decodeResult,\n 'report_date',\n 'DATE',\n 'Report Date',\n `20${d.slice(0, 2)}-${d.slice(2, 4)}-${d.slice(4, 6)}`,\n );\n ResultFormatter.flightNumber(decodeResult, header[4]);\n ResultFormatter.departureAirport(decodeResult, header[5]);\n ResultFormatter.arrivalAirport(decodeResult, header[6]);\n // one more each leg, the same in every report of a leg (8,634 of 8,634 legs); it starts\n // again when the ACMS software is reloaded, so it is not the aircraft's lifetime cycles\n if (/^\\d{1,15}$/.test(header[7])) {\n ResultFormatter.raw(\n decodeResult,\n 'leg_counter',\n 'LEGS',\n 'Leg Counter',\n `${Number(header[7])}`,\n Number(header[7]),\n );\n } else {\n unknown.push(header[7]);\n }\n ResultFormatter.raw(\n decodeResult,\n 'software_version',\n 'SWVER',\n 'Software Version',\n header[8],\n );\n if (unknown.length > 0) ResultFormatter.unknownArr(decodeResult, unknown);\n\n // lines[1] is the number of points; the MAX sends it with a comma after it\n const count = lines[1]?.match(/^(\\d+),?$/)?.[1];\n if (lines[1] !== undefined && count === undefined) {\n ResultFormatter.unknown(decodeResult, lines[1], nl);\n }\n for (const line of lines.slice(2)) {\n if (line === '' || line === ':') continue;\n const m = line.match(POINT);\n // day 01-31, hour 00-23, minute 00-59, wind direction up to 360, and minutes of latitude\n // and longitude under 60\n if (\n !m ||\n !(Number(m[5]) >= 1 && Number(m[5]) <= 31) ||\n Number(m[6]) > 23 ||\n Number(m[7]) > 59 ||\n Number(m[10]) > 360 ||\n Number(m[1].slice(3)) > 59 ||\n Number(m[3].slice(4)) > 59\n ) {\n ResultFormatter.unknown(decodeResult, line, nl);\n continue;\n }\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n `${m[1]}${m[2]}${m[3]}${m[4]}`,\n );\n if (\n !position ||\n Math.abs(position.latitude) > 90 ||\n Math.abs(position.longitude) > 180\n ) {\n ResultFormatter.unknown(decodeResult, line, nl);\n continue;\n }\n ResultFormatter.trackPoint(decodeResult, {\n name: `${m[1]}.${m[2]}${m[3]}.${m[4]}`,\n ...position,\n day: Number(m[5]),\n time: Number(m[6]) * 3600 + Number(m[7]) * 60,\n altitude: Number(m[8]),\n // -00.0 is sent; keep it as 0\n temperature: Number(m[9]) || 0,\n windDirection: Number(m[10]),\n windSpeed: Number(m[11]),\n phase: PHASES[m[12]] ?? m[12],\n humiditySensor: m[14] === '1',\n ...(m[14] === '1' && Number(m[13]) > 0\n ? { waterVapor: Number(m[13]) }\n : {}),\n });\n }\n\n const points = (decodeResult.raw.route?.waypoints ?? []) as TrackPoint[];\n const last = points[points.length - 1];\n if (last) {\n ResultFormatter.position(decodeResult, {\n latitude: last.latitude,\n longitude: last.longitude,\n });\n ResultFormatter.altitude(decodeResult, last.altitude);\n ResultFormatter.timestamp(decodeResult, last.time);\n }\n\n // fewer or more points than the report says it has: not all of it was decoded\n const counted = count !== undefined && Number(count) === points.length;\n this.setDecodeLevel(decodeResult, true, counted ? undefined : 'partial');\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Warning Message');\n\n const parts = message.text.split('/WN');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n ResultFormatter.unknownArr(decodeResult, fields.slice(1), '/');\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.warning_message = msg;\n decodeResult.formatted.items.push({\n type: 'warning',\n code: 'WRN',\n label: 'Warning Message',\n value: decodeResult.raw.warning_message,\n });\n this.setDecodeLevel(decodeResult, true, 'partial');\n } else {\n // Unknown\n return this.failUnknown(decodeResult, message.text, options);\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H2_02E extends DecoderPlugin {\n name = 'label-h2-02e';\n\n qualifiers() {\n return {\n labels: ['H2'],\n preambles: ['02E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Weather Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n\n if (parts[parts.length - 1] !== 'Q') {\n // not a valid message\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const windData: Wind[] = [];\n decodeResult.remaining.text = '';\n\n const header = parts[0];\n if (header.length === 45) {\n // header.substring(0,3) is '02E'\n ResultFormatter.day(decodeResult, parseInt(header.substring(3, 5), 10));\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n const firstWind = this.parseWeatherReport(header.substring(13));\n if (firstWind) {\n windData.push(firstWind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + header.substring(13);\n }\n }\n\n for (let i = 1; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part[0] !== 'Q') {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n continue;\n }\n const wind = this.parseWeatherReport(part.substring(1));\n if (wind) {\n windData.push(wind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n }\n }\n\n ResultFormatter.windData(decodeResult, windData);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text.length === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n\n private parseWeatherReport(text: string): Wind | null {\n const posString = text.substring(0, 13);\n const pos =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(posString);\n if (text.length !== 32 || !pos) {\n return null;\n }\n const tod = DateTimeUtils.convertHHMMSSToTod(text.substring(13, 17));\n const flightLevel = parseInt(text.substring(17, 20), 10);\n // const altitude = parseInt(text.substring(17,21), 10) * 10; // use FL instead\n const tempSign = text[21] === 'M' ? -1 : 1;\n const tempDegreesRaw = parseInt(text.substring(22, 25), 10);\n const tempDegrees = tempSign * (tempDegreesRaw / 10);\n const windDirection = parseInt(text.substring(25, 28), 10);\n const windSpeed = parseInt(text.substring(28, 31), 10);\n // G?\n if (text[31] !== 'G') {\n return null;\n }\n return {\n waypoint: {\n name: posString,\n latitude: pos.latitude,\n longitude: pos.longitude,\n time: tod,\n },\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: flightLevel,\n degreesC: tempDegrees,\n },\n };\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() {\n return {\n labels: ['HX'],\n preambles: ['RA FMT LOCATION', 'RA FMT 43'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Undelivered Uplink Report';\n\n const parts = message.text.split(' ');\n\n decodeResult.decoded = true;\n if (parts[2] === 'LOCATION') {\n let latdir = parts[3].substring(0, 1);\n let latdeg = Number(parts[3].substring(1, 3));\n let latmin = Number(parts[3].substring(3, 7));\n let londir = parts[4].substring(0, 1);\n let londeg = Number(parts[4].substring(1, 4));\n let lonmin = Number(parts[4].substring(4, 8));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknownArr(decodeResult, parts.slice(5), ' ');\n ResultFormatter.position(decodeResult, pos);\n } else if (parts[2] === '43') {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), ' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","/**\n * Pure JavaScript ASCII85 (Adobe variant) decoder.\n * Replaces the `base85` npm package to eliminate Node.js Buffer dependency.\n * Works in browsers, Node.js 18+, Deno, Bun, and edge runtimes.\n */\nexport function ascii85Decode(input: string): Uint8Array | null {\n let str = input;\n if (str.startsWith('<~')) str = str.slice(2);\n if (str.endsWith('~>')) str = str.slice(0, -2);\n str = str.replace(/\\s/g, '');\n if (str.length === 0) return new Uint8Array(0);\n\n const output: number[] = [];\n let i = 0;\n\n while (i < str.length) {\n if (str[i] === 'z') {\n output.push(0, 0, 0, 0);\n i++;\n continue;\n }\n\n const remaining = str.length - i;\n const chunkLen = Math.min(5, remaining);\n if (chunkLen === 1) break; // trailing single char from truncated input; ignore it\n\n let padded = str.slice(i, i + chunkLen);\n while (padded.length < 5) padded += 'u';\n\n let value = 0;\n for (let j = 0; j < 5; j++) {\n const digit = padded.charCodeAt(j) - 33;\n if (digit < 0 || digit > 84) return null;\n value = value * 85 + digit;\n }\n\n // Applies to padded short tails too: a group whose value exceeds uint32 is invalid input.\n if (value > 0xffffffff) return null;\n\n const v = value;\n const numBytes = chunkLen === 5 ? 4 : chunkLen - 1;\n if (numBytes >= 1) output.push((v >>> 24) & 0xff);\n if (numBytes >= 2) output.push((v >>> 16) & 0xff);\n if (numBytes >= 3) output.push((v >>> 8) & 0xff);\n if (numBytes >= 4) output.push(v & 0xff);\n\n i += chunkLen;\n }\n\n return new Uint8Array(output);\n}\n","import { ascii85Decode } from './ascii85';\nimport { inflateData } from './compression';\n\nconst textDecoder = new TextDecoder();\nconst textEncoder = new TextEncoder();\n\nenum MIAMVersion {\n V1 = 1,\n V2 = 2,\n}\n\nenum MIAMFid {\n SingleTransfer = 'T',\n FileTransferRequest = 'F',\n FileTransferAccept = 'K',\n FileSegment = 'S',\n FileTransferAbort = 'A',\n XOFFIndication = 'Y',\n XONIndication = 'X',\n}\n\nenum MIAMCorePdu {\n Data = 0,\n Ack = 1,\n Aloha = 2,\n AlohaReply = 3,\n}\n\nenum MIAMCoreApp {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nexport enum MIAMCoreV1Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nexport enum MIAMCoreV2Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nconst MIAMCoreV1CRCLength = 4;\nconst MIAMCoreV2CRCLength = 2;\n\ninterface PduACARSData {\n tail?: string;\n label: string;\n sublabel?: string;\n mfi?: string;\n text?: string;\n}\n\ninterface PduNonACARSData {\n appId?: string;\n text?: string;\n}\n\ninterface Pdu {\n version: MIAMVersion;\n crc: number;\n crcOk: boolean;\n complete: boolean;\n compression: number;\n encoding: number;\n msgNum: number;\n ackOptions: number;\n acars?: PduACARSData;\n non_acars?: PduNonACARSData;\n}\nconst isMIAMVersion = (x: number): x is MIAMVersion =>\n Object.values(MIAMVersion).includes(x as MIAMVersion);\nconst isMIAMFid = (x: string): x is MIAMFid =>\n Object.values(MIAMFid).includes(x as MIAMFid);\nconst isMIAMCoreApp = (x: number): x is MIAMCoreApp =>\n Object.values(MIAMCoreApp).includes(x as MIAMCoreApp);\nconst isMIAMCorePdu = (x: number): x is MIAMCorePdu =>\n Object.values(MIAMCorePdu).includes(x as MIAMCorePdu);\n\ninterface PduDecodingSuccess {\n decoded: true;\n message: {\n data: Pdu;\n };\n}\n\ninterface PduDecodingFailure {\n decoded: false;\n error: string;\n}\n\ntype PduDecodingResult = PduDecodingSuccess | PduDecodingFailure;\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: Record<\n MIAMVersion,\n Record<MIAMCoreApp, number>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n [MIAMVersion.V2]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n };\n\n static FidHandlerTable: Record<MIAMFid, (txt: string) => PduDecodingResult> =\n {\n [MIAMFid.SingleTransfer]: (txt: string) => {\n if (txt.length < 3) {\n return {\n decoded: false,\n error: 'Raw MIAM message too short (' + txt.length + ' < 3) ',\n };\n }\n\n let bpad = txt[0];\n\n if ('0123-.'.indexOf(bpad) === -1) {\n return {\n decoded: false,\n error: \"Invalid body padding value: '\" + bpad + \"'\",\n };\n }\n\n if ('0123'.indexOf(txt[1]) === -1) {\n return {\n decoded: false,\n error: \"Invalid header padding value: '\" + txt[1] + \"'\",\n };\n }\n\n const hpad = parseInt(txt[1]);\n\n const delimIdx = txt.indexOf('|');\n if (delimIdx === -1) {\n return {\n decoded: false,\n error: 'Raw MIAM message missing header-body delimiter',\n };\n }\n\n const rawHdr = txt.substring(2, delimIdx);\n if (rawHdr.length === 0) {\n return {\n decoded: false,\n error: 'Empty MIAM message header',\n };\n }\n\n let hdr = ascii85Decode('<~' + rawHdr + '~>');\n if (!hdr || hdr.length < hpad) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message header',\n };\n }\n\n let body: Uint8Array | undefined = undefined;\n\n const rawBody = txt.substring(delimIdx + 1);\n if (rawBody.length > 0) {\n if ('0123'.indexOf(bpad) >= 0) {\n const bpadValue = parseInt(bpad);\n\n const decoded = ascii85Decode('<~' + rawBody + '~>');\n if (decoded === null) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message body',\n };\n }\n body = decoded;\n if (body.length >= bpadValue) {\n body = body.subarray(0, body.length - bpadValue);\n }\n } else if (bpad === '-') {\n body = textEncoder.encode(rawBody);\n }\n }\n\n hdr = hdr.subarray(0, hdr.length - hpad);\n\n const version = hdr[0] & 0xf;\n const pduType = (hdr[0] >> 4) & 0xf;\n\n if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {\n const versionPduHandler =\n this.VersionPduHandlerTable[version][pduType];\n return versionPduHandler(hdr, body);\n } else {\n return {\n decoded: false,\n error:\n 'Invalid version and PDU type combination: v=' +\n version +\n ', pdu=' +\n pduType,\n };\n }\n },\n [MIAMFid.FileTransferRequest]: () => {\n return {\n decoded: false,\n error: 'File Transfer Request not implemented',\n };\n },\n [MIAMFid.FileTransferAccept]: () => {\n return {\n decoded: false,\n error: 'File Transfer Accept not implemented',\n };\n },\n [MIAMFid.FileSegment]: () => {\n return { decoded: false, error: 'File Segment not implemented' };\n },\n [MIAMFid.FileTransferAbort]: () => {\n return { decoded: false, error: 'File Transfer Abort not implemented' };\n },\n [MIAMFid.XOFFIndication]: () => {\n return { decoded: false, error: 'XOFF Indication not implemented' };\n },\n [MIAMFid.XONIndication]: () => {\n return { decoded: false, error: 'XON Indication not implemented' };\n },\n };\n\n private static arincCrc16(buf: Uint8Array, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,\n 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,\n 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,\n 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,\n 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,\n 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,\n 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,\n 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,\n 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,\n 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,\n 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,\n 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,\n 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[(((crc >>> 8) ^ buf[i]) >>> 0) & 0xff]) >>>\n 0;\n }\n\n return crc & 0xffff;\n }\n\n private static arinc665Crc32(buf: Uint8Array, seed?: number) {\n const crctable = [\n 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,\n 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,\n 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,\n 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,\n 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,\n 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,\n 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,\n 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,\n 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,\n 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,\n 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,\n 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,\n 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,\n 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,\n 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,\n 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,\n 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,\n 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,\n 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,\n 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,\n 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,\n 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,\n 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,\n 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,\n 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,\n 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,\n 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,\n 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,\n 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,\n 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,\n 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,\n 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,\n 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,\n 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,\n 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,\n 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,\n 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,\n 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,\n 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,\n 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,\n 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,\n 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,\n 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,\n ];\n\n let crc = seed || 0;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^ crctable[((crc >>> 24) ^ buf[i]) >>> 0]) >>> 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string): PduDecodingResult {\n const fidType = txt[0];\n\n if (isMIAMFid(fidType)) {\n const handler = this.FidHandlerTable[fidType];\n return handler(txt.substring(1));\n } else {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n }\n\n private static corePduDataHandler(\n version: MIAMVersion,\n minHdrSize: number,\n crcLen: number,\n hdr: Uint8Array,\n body?: Uint8Array,\n ): PduDecodingResult {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error:\n 'v' +\n version +\n ' header size too short; expected >= ' +\n minHdrSize +\n ', got ' +\n hdr.length,\n };\n }\n\n let pduSize: number | undefined = undefined;\n let pduCompression: number = 0;\n let pduEncoding: number = 0;\n let pduAppType: number = 0;\n let pduAppId: string = '';\n let pduCrc: number = 0;\n let pduData: Uint8Array | null = null;\n let pduCrcIsOk: boolean = false;\n let pduIsComplete: boolean = true;\n\n let pduErrors: string[] = [];\n\n let tail: string | undefined = undefined;\n let msgNum: number = 0;\n let ackOptions: number = 0;\n\n if (version === MIAMVersion.V1) {\n pduSize = (hdr[1] << 16) | (hdr[2] << 8) | hdr[3];\n\n const msgSize = hdr.length + (body === undefined ? 0 : body.length);\n if (pduSize > msgSize) {\n pduIsComplete = false;\n pduErrors.push(\n 'v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize,\n );\n }\n hdr = hdr.subarray(4);\n\n tail = textDecoder.decode(hdr.subarray(0, 7));\n hdr = hdr.subarray(7);\n } else if (version === MIAMVersion.V2) {\n hdr = hdr.subarray(1);\n }\n\n msgNum = (hdr[0] >> 1) & 0x7f;\n ackOptions = hdr[0] & 1;\n hdr = hdr.subarray(1);\n\n pduCompression = ((hdr[0] << 2) | ((hdr[1] >> 6) & 0x3)) & 0x7;\n pduEncoding = (hdr[1] >> 4) & 0x3;\n pduAppType = hdr[1] & 0xf;\n hdr = hdr.subarray(2);\n\n let appIdLen;\n if (isMIAMCoreApp(pduAppType)) {\n appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];\n } else {\n if (\n version === MIAMVersion.V2 &&\n (pduAppType & 0x8) !== 0 &&\n pduAppType !== 0xd\n ) {\n appIdLen = (pduAppType & 0x7) + 1;\n } else {\n return {\n decoded: false,\n error: 'Invalid v' + version + ' appType: ' + pduAppType,\n };\n }\n }\n\n const pduIsACARS =\n [\n MIAMCoreApp.ACARS2Char,\n MIAMCoreApp.ACARS4Char,\n MIAMCoreApp.ACARS6Char,\n ].indexOf(pduAppType) >= 0;\n\n if (hdr.length < appIdLen + crcLen) {\n return {\n decoded: false,\n error: 'Header too short for v' + version + ' appType: ' + pduAppType,\n };\n }\n\n pduAppId = textDecoder.decode(hdr.subarray(0, appIdLen));\n hdr = hdr.subarray(appIdLen);\n\n if (crcLen === 4) {\n pduCrc = (hdr[0] << 24) | (hdr[1] << 16) | (hdr[2] << 8) | hdr[3]; // crc\n } else if (crcLen === 2) {\n pduCrc = (hdr[0] << 8) | hdr[1]; // crc\n }\n hdr = hdr.subarray(crcLen);\n\n if (body !== undefined && body.length > 0) {\n if (\n [MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(\n pduCompression,\n ) >= 0\n ) {\n try {\n const inflated = inflateData(body, true);\n if (inflated === undefined) {\n pduErrors.push('Inflation produced no output for body');\n } else {\n pduData = inflated;\n }\n } catch (e) {\n pduErrors.push('Inflation failed for body: ' + e);\n }\n } else if (\n [MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(\n pduCompression,\n ) >= 0\n ) {\n pduData = body;\n } else {\n pduErrors.push(\n 'Unsupported v' + version + ' compression type: ' + pduCompression,\n );\n }\n\n if (pduData !== null) {\n const crcAlgoHandlerByVersion: Record<\n MIAMVersion,\n (buf: Uint8Array, seed?: number) => number\n > = {\n [MIAMVersion.V1]: (buf: Uint8Array, seed?: number) => {\n return ~this.arinc665Crc32(buf, seed);\n },\n [MIAMVersion.V2]: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n error: 'No CRC handler for v' + version,\n };\n }\n\n const crcCheck = crcAlgoHandler(pduData, 0xffffffff);\n if (crcCheck === pduCrc) {\n pduCrcIsOk = true;\n } else {\n pduErrors.push(\n 'Body failed CRC check: provided=' +\n pduCrc +\n ', generated=' +\n crcCheck,\n );\n }\n }\n } else {\n // No PDU body means we can't verify CRC checksum; however, the message should still be valid...\n pduCrcIsOk = true;\n }\n\n let pdu: Pdu = {\n version,\n crc: pduCrc,\n crcOk: pduCrcIsOk,\n complete: pduIsComplete,\n compression: pduCompression,\n encoding: pduEncoding,\n msgNum,\n ackOptions,\n };\n\n if (pduIsACARS) {\n const label = pduAppId.substring(0, 2);\n const sublabel = appIdLen >= 4 ? pduAppId.substring(2, 4) : undefined;\n const mfi = appIdLen >= 6 ? pduAppId.substring(4, 6) : undefined;\n\n pdu.acars = {\n ...(tail ? { tail } : {}),\n label,\n ...(sublabel ? { sublabel } : {}),\n ...(mfi ? { mfi } : {}),\n ...(pduData ? { text: textDecoder.decode(pduData) } : {}),\n };\n } else {\n pdu.non_acars = {\n appId: pduAppId,\n ...(pduData ? { text: textDecoder.decode(pduData) } : {}),\n };\n }\n\n return {\n decoded: true,\n message: {\n data: pdu,\n },\n };\n }\n\n static VersionPduHandlerTable: Record<\n MIAMVersion,\n Record<\n MIAMCorePdu,\n (hdr: Uint8Array, body?: Uint8Array) => PduDecodingResult\n >\n > = {\n [MIAMVersion.V1]: {\n [MIAMCorePdu.Data]: (hdr: Uint8Array, body?: Uint8Array) => {\n return this.corePduDataHandler(\n MIAMVersion.V1,\n 20,\n MIAMCoreV1CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v1 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v1 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v1 AlohaReply PDU not implemented' };\n },\n },\n [MIAMVersion.V2]: {\n [MIAMCorePdu.Data]: (hdr: Uint8Array, body?: Uint8Array) => {\n return this.corePduDataHandler(\n MIAMVersion.V2,\n 7,\n MIAMCoreV2CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v2 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v2 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v2 Aloha reply PDU not implemented' };\n },\n },\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_MA extends DecoderPlugin {\n name = 'label-ma';\n qualifiers() {\n return {\n labels: ['MA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const miamResult = MIAMCoreUtils.parse(message.text);\n if (\n miamResult.decoded &&\n miamResult.message.data &&\n miamResult.message.data.acars\n ) {\n decodeResult.decoded = true;\n ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);\n if (miamResult.message.data.acars.sublabel) {\n ResultFormatter.sublabel(\n decodeResult,\n miamResult.message.data.acars.sublabel,\n );\n }\n if (miamResult.message.data.acars.tail) {\n ResultFormatter.tail(\n decodeResult,\n miamResult.message.data.acars.tail.replace('.', ''),\n );\n }\n\n const messageText = miamResult.message.data.acars.text;\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (\n miamResult.message.data.crcOk &&\n miamResult.message.data.complete &&\n messageText\n ) {\n decodeResult.decoder.decodeLevel = 'full';\n const decoded = this.decoder.decode(\n {\n label: miamResult.message.data.acars.label,\n sublabel: miamResult.message.data.acars.sublabel,\n text: messageText,\n },\n options,\n );\n\n if (decoded.decoded) {\n // decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n } else {\n ResultFormatter.text(decodeResult, messageText);\n decodeResult.remaining = { text: messageText };\n }\n } else if (messageText) {\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.remaining = { text: messageText };\n } else {\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_SQ extends DecoderPlugin {\n name = 'label-sq';\n\n qualifiers() {\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.initResult(message, 'Ground Station Squitter');\n\n decodeResult.raw.preamble = message.text.substring(0, 4);\n decodeResult.raw.version = Number(message.text.substring(1, 2));\n decodeResult.raw.network = message.text.substring(3, 4);\n\n if (decodeResult.raw.version === 2) {\n const regex =\n /0(\\d)X(?<org>\\w)(?<iata>\\w\\w\\w)(?<icao>\\w\\w\\w\\w)(?<station>\\d)(?<lat>\\d+)(?<latd>[NS])(?<lng>\\d+)(?<lngd>[EW])V(?<vfreq>\\d+)\\/.*/;\n const result = message.text.match(regex);\n\n if (result?.groups && result.length >= 8) {\n decodeResult.raw.groundStation = {\n number: result.groups.station,\n iataCode: result.groups.iata,\n icaoCode: result.groups.icao,\n coordinates: {\n latitude:\n (Number(result.groups.lat) / 100) *\n (result.groups.latd === 'S' ? -1 : 1),\n longitude:\n (Number(result.groups.lng) / 100) *\n (result.groups.lngd === 'W' ? -1 : 1),\n },\n };\n decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1000.0;\n }\n }\n\n var formattedNetwork = 'Unknown';\n if (decodeResult.raw.network == 'A') {\n formattedNetwork = 'ARINC';\n } else if (decodeResult.raw.network == 'S') {\n formattedNetwork = 'SITA';\n }\n decodeResult.formatted.items = [\n {\n type: 'network',\n code: 'NETT',\n label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n code: 'VER',\n label: 'Version',\n value: String(decodeResult.raw.version),\n },\n ];\n\n if (decodeResult.raw.groundStation) {\n if (\n decodeResult.raw.groundStation.icaoCode &&\n decodeResult.raw.groundStation.number\n ) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\n code: 'GNDSTN',\n label: 'Ground Station',\n value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,\n });\n }\n if (decodeResult.raw.groundStation.iataCode) {\n decodeResult.formatted.items.push({\n type: 'iataCode',\n code: 'IATA',\n label: 'IATA',\n value: decodeResult.raw.groundStation.iataCode,\n });\n }\n if (decodeResult.raw.groundStation.icaoCode) {\n decodeResult.formatted.items.push({\n type: 'icaoCode',\n code: 'ICAO',\n label: 'ICAO',\n value: decodeResult.raw.groundStation.icaoCode,\n });\n }\n if (decodeResult.raw.groundStation.coordinates.latitude) {\n decodeResult.formatted.items.push({\n type: 'coordinates',\n code: 'COORD',\n label: 'Ground Station Location',\n value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,\n });\n }\n if (decodeResult.raw.groundStation.airport) {\n decodeResult.formatted.items.push({\n type: 'airport',\n code: 'APT',\n label: 'Airport',\n value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,\n });\n }\n }\n\n if (decodeResult.raw.vdlFrequency) {\n decodeResult.formatted.items.push({\n type: 'vdlFrequency',\n code: 'VDLFRQ',\n label: 'VDL Frequency',\n value: `${decodeResult.raw.vdlFrequency} MHz`,\n });\n }\n this.setDecodeLevel(decodeResult, true, 'full');\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() {\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ON Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.on(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() {\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OUT Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.out(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() {\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'IN Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.in(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() {\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'OFF Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n if (message.text.substring(12, 19) === '\\r\\n001FE') {\n decodeResult.raw.day = message.text.substring(19, 21);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)),\n );\n let latdir = message.text.substring(27, 28);\n let latdeg = Number(message.text.substring(28, 30));\n let latmin = Number(message.text.substring(30, 34));\n let londir = message.text.substring(34, 35);\n let londeg = Number(message.text.substring(35, 38));\n let lonmin = Number(message.text.substring(38, 42));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));\n ResultFormatter.position(decodeResult, pos);\n\n const gsField = message.text.substring(45, 48);\n if (decodeResult.remaining.text !== '---' && gsField !== '---') {\n ResultFormatter.groundspeed(decodeResult, Number(gsField));\n } else {\n ResultFormatter.unknown(decodeResult, gsField);\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + '00'),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n }\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n} from './DecoderPluginInterface';\n\nimport * as Plugins from './plugins/official';\n\n/**\n * Ordered list of plugin constructors. Order matters — plugins are tried\n * sequentially until one returns decoded: true.\n */\nconst pluginClasses = [\n Plugins.CBand, // first, for now, so it can wrap other plugins\n Plugins.LibAcars,\n Plugins.Arinc702,\n Plugins.Label_ColonComma,\n Plugins.Label_5Z_Slash,\n Plugins.Label_10_LDR,\n Plugins.Label_10_LRW,\n Plugins.Label_10_POS,\n Plugins.Label_10_Slash,\n Plugins.Label_11_LDR,\n Plugins.Label_11_LRW,\n Plugins.Label_12_N_Space,\n Plugins.Label_12_POS,\n Plugins.Label_13Through18_Slash,\n Plugins.Label_15,\n Plugins.Label_15_FST,\n Plugins.Label_16_AUTPOS,\n Plugins.Label_16_Honeywell,\n Plugins.Label_16_N_Space,\n Plugins.Label_16_POSA1,\n Plugins.Label_16_TOD,\n Plugins.Label_1L_3Line,\n Plugins.Label_1L_070,\n Plugins.Label_1L_660,\n Plugins.Label_1L_Slash,\n Plugins.Label_20_POS,\n Plugins.Label_21_POS,\n Plugins.Label_22_OFF,\n Plugins.Label_22_POS,\n Plugins.Label_24_Slash,\n Plugins.Label_2P_FM3,\n Plugins.Label_2P_FM4,\n Plugins.Label_2P_FM5,\n Plugins.Label_30_Slash_EA,\n Plugins.Label_37_SWA,\n Plugins.Label_40_SWA,\n Plugins.Label_44_ETA,\n Plugins.Label_44_IN,\n Plugins.Label_44_OFF,\n Plugins.Label_44_ON,\n Plugins.Label_44_POS,\n Plugins.Label_44_Slash,\n Plugins.Label_4A,\n Plugins.Label_4A_01,\n Plugins.Label_4A_DIS,\n Plugins.Label_4A_DOOR,\n Plugins.Label_4A_Slash_01,\n Plugins.Label_4N,\n Plugins.Label_4T_AGFSR,\n Plugins.Label_4T_ETA,\n Plugins.Label_B6_Forwardslash,\n Plugins.Label_H1_76401,\n Plugins.Label_H1_ATIS,\n Plugins.Label_H1_EZF,\n Plugins.Label_H1_FLR,\n Plugins.Label_H1_M_POS,\n Plugins.Label_H1_OHMA,\n Plugins.Label_H1_OFP,\n Plugins.Label_H1_Paren,\n Plugins.Label_H1_WRN,\n Plugins.Label_H1_StarPOS,\n Plugins.Label_H1_SWA_Track,\n Plugins.Label_H2_02E,\n Plugins.Label_HX,\n Plugins.Label_58,\n Plugins.Label_80,\n Plugins.Label_83,\n Plugins.Label_8E,\n Plugins.Label_1M_Slash,\n Plugins.Label_MA,\n Plugins.Label_SQ,\n Plugins.Label_QP,\n Plugins.Label_QQ,\n Plugins.Label_QR,\n Plugins.Label_QS,\n];\n\n/**\n * Per-plugin metadata captured at registration time so that decode() can\n * avoid re-invoking plugin.qualifiers() (and re-allocating its arrays) on\n * every message.\n */\ninterface PluginEntry {\n plugin: DecoderPluginInterface;\n preambles: string[] | undefined;\n}\n\nexport class MessageDecoder {\n name: string;\n plugins: Array<DecoderPluginInterface>;\n debug: boolean;\n\n /** Maps a label string to the candidate entries (wildcard + label-specific) in registration order. */\n private candidatesByLabel: Map<string, PluginEntry[]> = new Map();\n /** Wildcard entries (plugins that register the '*' label). */\n private wildcardEntries: PluginEntry[] = [];\n /** Membership set for wildcard entries to dedupe when a plugin also registers a specific label. */\n private wildcardSet: Set<DecoderPluginInterface> = new Set();\n\n constructor() {\n this.name = 'acars-decoder-typescript';\n this.plugins = [];\n this.debug = false;\n\n for (const PluginClass of pluginClasses) {\n this.registerPlugin(new PluginClass(this));\n }\n }\n\n registerPlugin(plugin: DecoderPluginInterface): boolean {\n this.plugins.push(plugin);\n\n const qualifiers = plugin.qualifiers();\n const entry: PluginEntry = {\n plugin,\n preambles:\n qualifiers.preambles && qualifiers.preambles.length > 0\n ? qualifiers.preambles\n : undefined,\n };\n\n for (const label of qualifiers.labels) {\n if (label === '*') {\n if (!this.wildcardSet.has(plugin)) {\n this.wildcardEntries.push(entry);\n this.wildcardSet.add(plugin);\n // Insert the new wildcard at the end of the wildcard section\n // in every existing label bucket so that wildcard plugins are\n // still tried before label-specific ones while preserving\n // registration order among wildcard plugins (matching how new\n // buckets are seeded via wildcardEntries.slice() below).\n const wildcardInsertIndex = this.wildcardEntries.length - 1;\n for (const bucket of this.candidatesByLabel.values()) {\n // Skip buckets that already hold this plugin: a plugin whose\n // qualifiers list a specific label before '*' has already been\n // pushed into that bucket by the specific-label branch below.\n if (bucket.some((e) => e.plugin === plugin)) {\n continue;\n }\n bucket.splice(wildcardInsertIndex, 0, entry);\n }\n }\n } else {\n let bucket = this.candidatesByLabel.get(label);\n if (!bucket) {\n // Seed new bucket with all wildcard entries (in registration order)\n // so they remain ahead of label-specific plugins.\n bucket = this.wildcardEntries.slice();\n this.candidatesByLabel.set(label, bucket);\n }\n // Skip if this plugin is a wildcard plugin already in the bucket.\n if (!this.wildcardSet.has(plugin)) {\n bucket.push(entry);\n }\n }\n }\n\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const text = message.text;\n const candidates =\n this.candidatesByLabel.get(message.label) ?? this.wildcardEntries;\n\n if (options.debug) {\n console.log('Usable plugins');\n console.log(\n candidates\n .filter((e) => this.matchesPreambles(text, e.preambles))\n .map((e) => e.plugin),\n );\n }\n\n let result: DecodeResult = {\n decoded: false,\n error: 'No known decoder plugin for this message',\n decoder: {\n name: 'none',\n type: 'none',\n decodeLevel: 'none',\n },\n message: message,\n remaining: {\n text: text,\n },\n raw: {},\n formatted: {\n description: 'Not Decoded',\n items: [],\n },\n };\n\n for (let i = 0; i < candidates.length; i++) {\n const entry = candidates[i];\n if (!this.matchesPreambles(text, entry.preambles)) {\n continue;\n }\n const pluginResult = entry.plugin.decode(message, options);\n if (pluginResult.decoded) {\n result = pluginResult;\n break;\n }\n }\n\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n\n private matchesPreambles(\n text: string,\n preambles: string[] | undefined,\n ): boolean {\n if (!preambles) {\n return true;\n }\n for (let i = 0; i < preambles.length; i++) {\n if (text.startsWith(preambles[i])) {\n return true;\n }\n }\n return false;\n }\n}\n","#!/usr/bin/env node\n\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { MessageDecoder } from '../MessageDecoder';\n\nfunction debugMessage(message: Message, decoding: DecodeResult) {\n console.log('ORIGINAL MESSAGE');\n console.log('Label:', message.label);\n console.log('Text:', message.text);\n console.log();\n console.log('Decoded Message:');\n console.log(decoding.formatted.description);\n if (decoding.formatted.items && decoding.formatted.items.length > 0) {\n decoding.formatted.items.forEach((item) => {\n console.log(`${item.label} - ${item.value}`);\n });\n }\n console.log();\n}\n\nfunction decode(label: string, text: string) {\n const message = {\n label: label,\n text: text,\n };\n const decoder = new MessageDecoder();\n const decoding = decoder.decode(message);\n debugMessage(message, decoding);\n}\n\n// Label 12 with N space\ndecode('12', 'N 42.150,W121.187,39000,161859, 109,.C-GWSO,1742');\ndecode('12', 'N 28.371,W 80.458,38000,170546, 100,.C-GVWJ,1736');\n\n// Label 16 with N space\ndecode('16', 'N 44.203,W 86.546,31965,6, 290');\ndecode('16', 'N 44.988,W121.644,35940,6, 170');\ndecode('16', 'N 28.177/W 96.055');\ndecode('16', 'N 44.640/W119.729');\n\n// Label 30 with slash EA\ndecode('30', '/EA1830/DSKSFO/SK24');\ndecode('30', '/EA1611/DSMMSD/SK24');\ndecode('30', '/EA1719/DSKSFO/SK23');\n\n// Label 5Z\ndecode('5Z', '/R3 SNAORD 2205-14 SNA');\n\n// Label 80 + 3N01 POSRPT\ndecode(\n '80',\n '3N01 POSRPT 0570/13 MSLP/KJFK .N603AV/04F 00:59\\n\\\n/NWYP ORF /HDG 074/MCH 779\\n\\\n/POS N3630.7W07701.8/FL 350/TAS 453/SAT -054\\n\\\n/SWND 079/DWND 216/FOB N006857/ETA 01:40.3',\n);\n\n// Label H1 + M1BPOS\ndecode(\n 'H1',\n '#M1BPOSN32492W117178,N33492W118335,195835,350,N32463W117143,195907,N32359W117014,M51,25872,249/TS195835,1214195C27',\n);\n\n// Label H1 with POS\ndecode(\n 'H1',\n 'POSN43312W123174,EASON,215754,370,EBINY,220601,ELENN,M48,02216,185/TS215754,0921227A40',\n);\ndecode(\n 'H1',\n 'POSN45209W122550,PEGTY,220309,134,MINNE,220424,HISKU,M6,060013,269,366,355K,292K,730A5B',\n);\ndecode(\n 'H1',\n 'POSN43030W122406,IBALL,220516,380,AARON,220816,MOXEE,M47,0047,86/TS220516,092122BF64',\n);\ndecode(\n 'H1',\n 'POSN33225W079428,SCOOB,232933,340,ENEME,235712,FETAL,M42,003051,15857F6',\n);\n\n// Label 8E\ndecode('8E', 'EGSS,1618');\n\n// Label 1M with slash\ndecode(\n '1M',\n `/BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0\n1940/EGLL27L/10 `,\n);\ndecode(\n '1M',\n `/AY1416/ETA02/230822/EDDF/EFHK/EETN/2JK0\n1956/EFHK04L/50 \n / / / / / /`,\n);\n\n// some Positions messages\ndecode('15', '(2N38111W 82211266 76400-64(Z');\ndecode('15', '(2N46315E 40252 40300-45(Z');\ndecode('15', 'FST01KMCOEGKKN505552W00118021');\ndecode('20', 'POSN38160W077075,,211733,360,OTT,212041,,N42,19689,40,544');\ndecode('44', '00ETA02,N38338W121179,KMHR,KPDX,0806,2355,005.1');\ndecode('44', 'IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1');\ndecode('44', 'OFF02,N38334W121176,KMHR,KPDX,0807,0014,0123,004.9');\ndecode('44', 'ON02,N38333W121178,KRNO,KMHR,0806,2350,005.2');\ndecode('44', 'POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1');\ndecode('44', 'POS02,N51112 E000516,390,EGCC,LYBE,0608,1851,2053,00091');\ndecode('H1', 'POSN50378W002590,ELRIP,091226');\n"],"mappings":"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A,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1B;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aACK,OAAO,MAAO,IACf,UAAY,QAAQ,IAAK,IAAI,CAAC,OAAO,IAAK,GAAI,OAChD;AAAA,IACJ;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAiB,MAAe;AAC3D,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;A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","names":["tod","variant","pounds","runway","data","pounds","runway","RUNWAY","runway","DESCRIPTIONS","NEWLINE_REGEX","WS_REGEX","tod","tod","textDecoder","MIAMVersion","MIAMFid","MIAMCorePdu","MIAMCoreApp","textDecoder"]}