@ham2k/lib-operation-data 1.1.3 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -200,8 +200,28 @@ function frequencyForBand(band, mode) {
200
200
  // src/data/bandPlans.json
201
201
  var bandPlans_default = {
202
202
  bands: {
203
+ "2190m": {
204
+ mhz: [135.7, 137.8],
205
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "ua:C", "ua:B", "us:N", "us:T"],
206
+ segments: [
207
+ { name: "JP 4th Class: DATA only", mhz: [135.7, 137.8], levels: ["jp:4"], superModes: ["DATA"] }
208
+ ]
209
+ },
210
+ "630m": {
211
+ mhz: [472, 479],
212
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "de:N", "de:E", "dk:D", "gb:F", "gb:I", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N", "us:N", "us:T"],
213
+ segments: [
214
+ { name: "JP 4th Class: DATA only", mhz: [472, 479], levels: ["jp:4"], superModes: ["DATA"] }
215
+ ]
216
+ },
217
+ "560m": {
218
+ mhz: [501, 504],
219
+ exceptLevels: ["be:C", "be:B"],
220
+ segments: []
221
+ },
203
222
  "160m": {
204
223
  mhz: [1800, 2e3],
224
+ exceptLevels: ["at:3", "au:F", "au:S", "be:C", "bg:2", "ca:B", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "hr:P", "hu:KEZDO", "id:SIAGA", "kr:4", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
205
225
  segments: [
206
226
  { name: "Out of band Reg1", mhz: [1800, 1810], mode: false, regions: [1] },
207
227
  { name: "CW Reg1", mhz: [1810, 1838], mode: "CW", regions: [1] },
@@ -209,11 +229,18 @@ var bandPlans_default = {
209
229
  { name: "CW", mhz: [1800, 1843], mode: "CW" },
210
230
  { name: "FT8", mhz: [1840, 1843], mode: "FT8", priority: 100 },
211
231
  { name: "Phone", mhz: [1843, 2e3], mode: "SSB", submode: "LSB" },
212
- { name: "Australia", mhz: [1800, 1875], mode: null, countries: ["au"] }
232
+ { name: "Australia", mhz: [1800, 1875], mode: null, countries: ["au"] },
233
+ { name: "BR: Class A only", mhz: [1850, 2e3], exceptLevels: ["br:C", "br:B"] },
234
+ { name: "CZ: Class A only", mhz: [1810, 1830], exceptLevels: ["cz:N"] },
235
+ { name: "HU: CEPT (full) only", mhz: [1850, 2e3], exceptLevels: ["hu:NOVICE"] },
236
+ { name: "JP 4th Class: DATA only", mhz: [1907.5, 1912.5], levels: ["jp:4"], superModes: ["DATA"] },
237
+ { name: "UA Entry level (student): DATA only", mhz: [1840, 1842], levels: ["ua:C"], superModes: ["DATA"] },
238
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [1842, 1850], exceptLevels: ["ua:C"] }
213
239
  ]
214
240
  },
215
241
  "80m": {
216
- mhz: [3500, 3800],
242
+ mhz: [3500, 4e3],
243
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cn:A", "de:N", "dk:D", "kr:4", "my:C", "nl:N", "ru:4", "se:insteg"],
217
244
  segments: [
218
245
  { name: "CW Reg1", mhz: [3500, 3570], mode: "CW", regions: [1] },
219
246
  { name: "CW", mhz: [3500, 3600], mode: "CW" },
@@ -222,11 +249,27 @@ var bandPlans_default = {
222
249
  { name: "Data", mhz: [3570, 3600], mode: "RTTY" },
223
250
  { name: "FT8", mhz: [3573, 3576], mode: "FT8", priority: 100 },
224
251
  { name: "Phone", mhz: [3600, 4e3], mode: "SSB", submode: "LSB" },
225
- { name: "Australia", mhz: [3500, 3800], mode: null, countries: ["au"] }
252
+ { name: "Australia", mhz: [3500, 3800], mode: null, countries: ["au"] },
253
+ { name: "AU: Advanced only", mhz: [3776, 3800], exceptLevels: ["au:F", "au:S"] },
254
+ { name: "BR: Class A only", mhz: [3800, 4e3], exceptLevels: ["br:C", "br:B"] },
255
+ { name: "CZ: Class A only", mhz: [3500, 3550], exceptLevels: ["cz:N"] },
256
+ { name: "CZ: Class A only", mhz: [3700, 3800], exceptLevels: ["cz:N"] },
257
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [3650, 3700], exceptLevels: ["ua:C"] },
258
+ { name: "UA: Higher qualification (HAREC) only", mhz: [3700, 3730], exceptLevels: ["ua:C", "ua:B"] },
259
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [3730, 3740], exceptLevels: ["ua:C"] },
260
+ { name: "UA Novice: DATA only", mhz: [3730, 3740], levels: ["ua:B"], superModes: ["DATA"] },
261
+ { name: "UA: Higher qualification (HAREC) only", mhz: [3740, 3800], exceptLevels: ["ua:C", "ua:B"] },
262
+ { name: "US: Amateur Extra only", mhz: [3500, 3525], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
263
+ { name: "US Novice, Technician: CW only", mhz: [3525, 3600], levels: ["us:N", "us:T"], superModes: ["CW"] },
264
+ { name: "US: Amateur Extra only", mhz: [3600, 3700], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
265
+ { name: "US: Advanced, Amateur Extra only", mhz: [3700, 3800], exceptLevels: ["us:N", "us:T", "us:G"] },
266
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [3800, 3900], exceptLevels: ["us:N", "us:T"] },
267
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [3900, 4e3], regions: [2], exceptLevels: ["us:N", "us:T"] }
226
268
  ]
227
269
  },
228
270
  "60m": {
229
- mhz: [5330.5, 3406.5],
271
+ mhz: [5250, 5450],
272
+ exceptLevels: ["at:3", "at:4", "be:C", "be:B", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "de:E", "dk:D", "gb:F", "gb:I", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N", "us:N", "us:T"],
230
273
  segments: [
231
274
  { name: "60m Channel 1", mhz: [5330.5, 5333.5] },
232
275
  { name: "60m Channel 2", mhz: [5346.5, 5349.5] },
@@ -237,6 +280,7 @@ var bandPlans_default = {
237
280
  },
238
281
  "40m": {
239
282
  mhz: [7e3, 7300],
283
+ exceptLevels: ["at:3", "at:4", "bg:2", "ca:B", "ch:HB3", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "kr:4", "my:C", "ru:4"],
240
284
  segments: [
241
285
  { name: "CW", mhz: [7e3, 7060], mode: "CW" },
242
286
  { name: "CW Reg1", mhz: [7e3, 7040], mode: "CW", regions: [1] },
@@ -247,11 +291,22 @@ var bandPlans_default = {
247
291
  { name: "Data", mhz: [7080, 7125], mode: "RTTY", countries: ["us"] },
248
292
  { name: "Phone", mhz: [7125, 7300], mode: "SSB", submode: "LSB", countries: ["us"] },
249
293
  { name: "Australia", mhz: [7e3, 7300], mode: null, countries: ["au"] },
250
- { name: "Out of band Reg1", mhz: [7200, 7300], mode: false, regions: [1] }
294
+ { name: "Out of band Reg1", mhz: [7200, 7300], mode: false, regions: [1] },
295
+ { name: "BR: Class B, Class A only", mhz: [7047, 7300], exceptLevels: ["br:C"] },
296
+ { name: "HU: CEPT Novice, CEPT (full) only", mhz: [7100, 7175], exceptLevels: ["hu:KEZDO"] },
297
+ { name: "UA Entry level (student): CW only", mhz: [7040, 7050], levels: ["ua:C"], superModes: ["CW"] },
298
+ { name: "UA Entry level (student): CW/PHONE only", mhz: [7050, 7080], levels: ["ua:C"], superModes: ["CW", "PHONE"] },
299
+ { name: "UA: Higher qualification (HAREC) only", mhz: [7100, 7200], exceptLevels: ["ua:C", "ua:B"] },
300
+ { name: "US: Amateur Extra only", mhz: [7e3, 7025], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
301
+ { name: "US Novice, Technician: CW only", mhz: [7025, 7125], levels: ["us:N", "us:T"], superModes: ["CW"] },
302
+ { name: "US: Advanced, Amateur Extra only", mhz: [7125, 7175], exceptLevels: ["us:N", "us:T", "us:G"] },
303
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [7175, 7200], exceptLevels: ["us:N", "us:T"] },
304
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [7200, 7300], regions: [2], exceptLevels: ["us:N", "us:T"] }
251
305
  ]
252
306
  },
253
307
  "30m": {
254
308
  mhz: [10100, 10150],
309
+ exceptLevels: ["ar:N", "ar:G", "at:3", "at:4", "au:F", "au:S", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "jp:4", "jp:3", "kr:4", "kr:3P", "kr:3T", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
255
310
  segments: [
256
311
  { name: "CW", mhz: [10100, 10150], mode: "CW" },
257
312
  { name: "CW Reg1", mhz: [10100, 10130], mode: "CW", regions: [1] },
@@ -259,25 +314,45 @@ var bandPlans_default = {
259
314
  { name: "FT8", mhz: [10136, 10139], mode: "FT8", priority: 100 },
260
315
  { name: "FT4", mhz: [10140, 10143], mode: "FT4", priority: 100 },
261
316
  { name: "Australia & New Zealand", mhz: [10100, 10150], mode: null, countries: ["au", "nz"] },
262
- { name: "Africa south of the Equator", mhz: [10100, 10150], mode: null, countries: ["ao", "bi", "bw", "cd", "cg", "ga", "ke", "km", "ls", "mg", "mu", "mw", "mz", "na", "rw", "sc", "so", "st", "sz", "tz", "ug", "za", "zm", "zw"] }
317
+ { name: "Africa south of the Equator", mhz: [10100, 10150], mode: null, countries: ["ao", "bi", "bw", "cd", "cg", "ga", "ke", "km", "ls", "mg", "mu", "mw", "mz", "na", "rw", "sc", "so", "st", "sz", "tz", "ug", "za", "zm", "zw"] },
318
+ { name: "UA Entry level (student): CW only", mhz: [10136, 10150], levels: ["ua:C"], superModes: ["CW"] }
263
319
  ]
264
320
  },
265
321
  "20m": {
266
322
  mhz: [14e3, 14350],
323
+ exceptLevels: ["at:3", "at:4", "au:F", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "id:SIAGA", "jp:4", "jp:3", "kr:4", "kr:3P", "kr:3T", "my:C", "rs:C", "ru:4", "si:N", "ua:C", "us:N", "us:T"],
267
324
  segments: [
268
325
  { name: "CW", mhz: [14e3, 14150], mode: "CW" },
269
326
  { name: "CW Reg1", mhz: [14e3, 14070], mode: "CW", regions: [1] },
270
327
  { name: "CW Reg2", mhz: [14e3, 14101], mode: "CW", regions: [2] },
328
+ { name: "CW US", mhz: [14e3, 14150], mode: "CW", countries: ["us"] },
271
329
  { name: "Data", mhz: [14070, 14095], mode: "RTTY" },
330
+ { name: "Data US", mhz: [14070, 14095], mode: "RTTY", countries: ["us"] },
272
331
  { name: "FT8", mhz: [14074, 14077], mode: "FT8", priority: 100 },
273
332
  { name: "FT4", mhz: [14080, 14083], mode: "FT4", priority: 100 },
274
333
  { name: "Phone", mhz: [14112, 14350], mode: "SSB", submode: "USB", regions: [1, 2] },
275
334
  { name: "Phone", mhz: [14150, 14350], mode: "SSB", submode: "USB", countries: ["us"] },
276
- { name: "Australia", mhz: [14e3, 14350], mode: null, countries: ["au"] }
335
+ { name: "Australia", mhz: [14e3, 14350], mode: null, countries: ["au"] },
336
+ { name: "AR: General, Superior, Special only", mhz: [14e3, 14070], exceptLevels: ["ar:N"] },
337
+ { name: "AR Novice: CW/DATA only", mhz: [14070, 14099], levels: ["ar:N"], superModes: ["CW", "DATA"] },
338
+ { name: "AR: General, Superior, Special only", mhz: [14099, 14350], exceptLevels: ["ar:N"] },
339
+ { name: "HR: Class A only", mhz: [14e3, 14040], exceptLevels: ["hr:P"] },
340
+ { name: "HR: Class A only", mhz: [14150, 14280], exceptLevels: ["hr:P"] },
341
+ { name: "HU: CEPT Novice, CEPT (full) only", mhz: [14300, 14350], exceptLevels: ["hu:KEZDO"] },
342
+ { name: "ID Advanced: CW only", mhz: [14e3, 14070], levels: ["id:PENGGALANG"], superModes: ["CW"] },
343
+ { name: "ID Advanced: DATA only", mhz: [14070, 14110], levels: ["id:PENGGALANG"], superModes: ["DATA"] },
344
+ { name: "ID: Extra Class only", mhz: [14150, 14350], exceptLevels: ["id:PENGGALANG"] },
345
+ { name: "UA Novice: CW/DATA only", mhz: [14100, 14112], levels: ["ua:B"], superModes: ["CW", "DATA"] },
346
+ { name: "UA Novice: CW only", mhz: [14112, 14250], levels: ["ua:B"], superModes: ["CW"] },
347
+ { name: "UA: Higher qualification (HAREC) only", mhz: [14250, 14350], exceptLevels: ["ua:B"] },
348
+ { name: "US: Amateur Extra only", mhz: [14e3, 14025], exceptLevels: ["us:G", "us:A"] },
349
+ { name: "US: Amateur Extra only", mhz: [14150, 14175], exceptLevels: ["us:G", "us:A"] },
350
+ { name: "US: Advanced, Amateur Extra only", mhz: [14175, 14225], exceptLevels: ["us:G"] }
277
351
  ]
278
352
  },
279
353
  "17m": {
280
354
  mhz: [18068, 18168],
355
+ exceptLevels: ["ar:N", "at:3", "at:4", "au:F", "au:S", "be:C", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "jp:4", "kr:4", "kr:3P", "kr:3T", "my:C", "nl:N", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
281
356
  segments: [
282
357
  { name: "CW", mhz: [18068, 18110], mode: "CW" },
283
358
  { name: "CW Reg1", mhz: [18068, 18095], mode: "CW", regions: [1] },
@@ -287,25 +362,49 @@ var bandPlans_default = {
287
362
  { name: "Beacons only", mhz: [18109, 18111], priority: 100 },
288
363
  { name: "Phone", mhz: [18111, 18168], mode: "SSB", submode: "USB" },
289
364
  { name: "Phone US", mhz: [18110, 18168], mode: "SSB", submode: "USB", countries: ["us"] },
290
- { name: "Australia", mhz: [18068, 18168], mode: null, countries: ["au"] }
365
+ { name: "Australia", mhz: [18068, 18168], mode: null, countries: ["au"] },
366
+ { name: "UA Entry level (student): CW only", mhz: [18100, 18168], levels: ["ua:C"], superModes: ["CW"] }
291
367
  ]
292
368
  },
293
369
  "15m": {
294
370
  mhz: [21e3, 21450],
371
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "kr:4", "my:C", "nl:N", "rs:C", "ru:4"],
295
372
  segments: [
296
373
  { name: "CW", mhz: [21e3, 21150], mode: "CW" },
297
374
  { name: "CW Reg1", mhz: [21e3, 21070], mode: "CW", regions: [1] },
375
+ { name: "CW US", mhz: [21e3, 21200], mode: "CW", countries: ["us"] },
298
376
  { name: "Data", mhz: [21070, 21095], mode: "RTTY" },
377
+ { name: "Data US", mhz: [21070, 21095], mode: "RTTY", countries: ["us"] },
299
378
  { name: "FT8", mhz: [21074, 21077], mode: "FT8", priority: 100 },
300
379
  { name: "FT4", mhz: [21140, 21143], mode: "FT4", priority: 100 },
301
380
  { name: "Beacons only", mhz: [21149, 21151], priority: 100 },
302
381
  { name: "Phone", mhz: [21151, 21450], mode: "SSB", submode: "USB" },
303
- { name: "Phone US", mhz: [21150, 21450], mode: "SSB", submode: "USB", countries: ["us"] },
304
- { name: "Australia", mhz: [21e3, 21450], mode: null, countries: ["au"] }
382
+ { name: "Phone US", mhz: [21200, 21450], mode: "SSB", submode: "USB", countries: ["us"] },
383
+ { name: "Australia", mhz: [21e3, 21450], mode: null, countries: ["au"] },
384
+ { name: "AR: General, Superior, Special only", mhz: [21e3, 21070], exceptLevels: ["ar:N"] },
385
+ { name: "AR Novice: CW/DATA only", mhz: [21070, 21125], levels: ["ar:N"], superModes: ["CW", "DATA"] },
386
+ { name: "AR Novice: CW only", mhz: [21125, 21149], levels: ["ar:N"], superModes: ["CW"] },
387
+ { name: "AR: General, Superior, Special only", mhz: [21149, 21200], exceptLevels: ["ar:N"] },
388
+ { name: "AR: Superior, Special only", mhz: [21310, 21450], exceptLevels: ["ar:N", "ar:G"] },
389
+ { name: "BR: Class B, Class A only", mhz: [21150, 21300], exceptLevels: ["br:C"] },
390
+ { name: "BR: Class A only", mhz: [21300, 21450], exceptLevels: ["br:C", "br:B"] },
391
+ { name: "CZ: Class A only", mhz: [21e3, 21050], exceptLevels: ["cz:N"] },
392
+ { name: "CZ: Class A only", mhz: [21200, 21450], exceptLevels: ["cz:N"] },
393
+ { name: "ID General: CW only", mhz: [21e3, 21070], levels: ["id:SIAGA"], superModes: ["CW"] },
394
+ { name: "ID General: CW/DATA only", mhz: [21070, 21125], levels: ["id:SIAGA"], superModes: ["CW", "DATA"] },
395
+ { name: "ID General: CW only", mhz: [21125, 21200], levels: ["id:SIAGA"], superModes: ["CW"] },
396
+ { name: "ID: Advanced, Extra Class only", mhz: [21200, 21450], exceptLevels: ["id:SIAGA"] },
397
+ { name: "UA Entry level (student), Novice: CW only", mhz: [21250, 21450], levels: ["ua:C", "ua:B"], superModes: ["CW"] },
398
+ { name: "US: Amateur Extra only", mhz: [21e3, 21025], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
399
+ { name: "US Novice, Technician: CW only", mhz: [21025, 21200], levels: ["us:N", "us:T"], superModes: ["CW"] },
400
+ { name: "US: Amateur Extra only", mhz: [21200, 21225], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
401
+ { name: "US: Advanced, Amateur Extra only", mhz: [21225, 21275], exceptLevels: ["us:N", "us:T", "us:G"] },
402
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [21275, 21450], exceptLevels: ["us:N", "us:T"] }
305
403
  ]
306
404
  },
307
405
  "12m": {
308
- mhz: [24890, 24990],
406
+ mhz: [24740, 24990],
407
+ exceptLevels: ["ar:N", "at:3", "at:4", "au:F", "au:S", "be:C", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "id:SIAGA", "id:PENGGALANG", "kr:4", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
309
408
  segments: [
310
409
  { name: "CW", mhz: [24890, 24930], mode: "CW" },
311
410
  { name: "CW Reg1", mhz: [24890, 24915], mode: "CW", regions: [1] },
@@ -315,11 +414,13 @@ var bandPlans_default = {
315
414
  { name: "Phone", mhz: [24930, 24990], mode: "SSB", submode: "USB" },
316
415
  { name: "Beacons only", mhz: [24929, 24931], priority: 100 },
317
416
  { name: "Phone US", mhz: [24930, 24990], mode: "SSB", submode: "USB", countries: ["us"] },
318
- { name: "Australia", mhz: [24890, 24990], mode: null, countries: ["au"] }
417
+ { name: "Australia", mhz: [24890, 24990], mode: null, countries: ["au"] },
418
+ { name: "UA Entry level (student): CW only", mhz: [24915, 24990], levels: ["ua:C"], superModes: ["CW"] }
319
419
  ]
320
420
  },
321
421
  "10m": {
322
422
  mhz: [28e3, 29700],
423
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cn:A", "kr:4", "my:C", "rs:C", "ru:4"],
323
424
  segments: [
324
425
  { name: "CW", mhz: [28e3, 28190], mode: "CW" },
325
426
  { name: "CW Reg1", mhz: [28e3, 28070], mode: "CW", regions: [1] },
@@ -334,11 +435,23 @@ var bandPlans_default = {
334
435
  { name: "Repeater Uplinks", mhz: [29520, 29590] },
335
436
  { name: "FM", mhz: [29520, 29700], mode: "FM" },
336
437
  { name: "Repeater Downlinks", mhz: [29620, 29700] },
337
- { name: "Australia", mhz: [28e3, 29700], mode: null, countries: ["au"] }
438
+ { name: "Australia", mhz: [28e3, 29700], mode: null, countries: ["au"] },
439
+ { name: "CZ: Class A only", mhz: [28e3, 28050], exceptLevels: ["cz:N"] },
440
+ { name: "CZ: Class A only", mhz: [28400, 29700], exceptLevels: ["cz:N"] },
441
+ { name: "UA Entry level (student), Novice: CW/PHONE only", mhz: [28675, 28685], levels: ["ua:C", "ua:B"], superModes: ["CW", "PHONE"] },
442
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [29300, 29520], exceptLevels: ["ua:C"] },
443
+ { name: "US Novice, Technician: CW/PHONE only", mhz: [28300, 28500], levels: ["us:N", "us:T"], superModes: ["CW", "PHONE"] },
444
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [28500, 29700], exceptLevels: ["us:N", "us:T"] }
338
445
  ]
339
446
  },
447
+ "8m": {
448
+ mhz: [40660, 40700],
449
+ exceptLevels: ["be:C", "be:B", "si:N"],
450
+ segments: []
451
+ },
340
452
  "6m": {
341
453
  mhz: [5e4, 54e3],
454
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "bg:2", "ch:HB3", "cl:ASP", "cz:N", "de:N", "de:E", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "nl:N", "rs:C", "rs:B", "ua:C", "ua:B", "us:N"],
342
455
  segments: [
343
456
  { name: "Beacon project Reg1", mhz: [5e4, 50010], mode: null, regions: [1] },
344
457
  { name: "Beacon project Reg2", mhz: [50010, 50020], mode: null, regions: [2] },
@@ -354,11 +467,13 @@ var bandPlans_default = {
354
467
  { name: "FT8", mhz: [50313, 50316], mode: "FT8", priority: 100 },
355
468
  { name: "FT4", mhz: [50318, 50321], mode: "FT4", priority: 100 },
356
469
  { name: "FT8", mhz: [50323, 50326], mode: "FT8", priority: 100 },
357
- { name: "Australia", mhz: [5e4, 54e3], mode: null, countries: ["au"] }
470
+ { name: "Australia", mhz: [5e4, 54e3], mode: null, countries: ["au"] },
471
+ { name: "AR Novice: CW only", mhz: [51e3, 51100], levels: ["ar:N"], superModes: ["CW"] }
358
472
  ]
359
473
  },
360
474
  "4m": {
361
- mhz: [7e4, 70500],
475
+ mhz: [69887.5, 70512.5],
476
+ exceptLevels: ["be:C", "be:B", "bg:2", "ch:HB3", "hr:P", "hu:KEZDO", "hu:NOVICE", "nl:N", "no:begrenset", "rs:C", "rs:B"],
362
477
  segments: [
363
478
  { name: "Beacons only Reg1", mhz: [70090, 70100], mode: "CW", regions: [1] },
364
479
  { name: "CW Reg1", mhz: [7e4, 70090], mode: "CW", regions: [1] },
@@ -371,6 +486,7 @@ var bandPlans_default = {
371
486
  },
372
487
  "2m": {
373
488
  mhz: [144e3, 148e3],
489
+ exceptLevels: ["us:N"],
374
490
  segments: [
375
491
  { name: "CW", mhz: [144e3, 144100], mode: "CW" },
376
492
  { name: "Satellite downlink Reg1", mhz: [144e3, 144025], mode: null, regions: [1] },
@@ -385,19 +501,26 @@ var bandPlans_default = {
385
501
  { name: "Reg1", mhz: [144500, 144794], mode: null, regions: [1] },
386
502
  { name: "FM Satellite Reg1", mhz: [145194, 145206], mode: "FM", regions: [1] },
387
503
  { name: "FM Reg1", mhz: [145206, 145563], mode: "FM", regions: [1] },
388
- { name: "Out of band Reg1", mhz: [146e3, 148e3], mode: false, regions: [1] }
504
+ { name: "Out of band Reg1", mhz: [146e3, 148e3], mode: false, regions: [1] },
505
+ { name: "HU: CEPT (full) only", mhz: [144400, 144500], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
506
+ { name: "HU: CEPT (full) only", mhz: [145562.5, 145794], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
507
+ { name: "UA: Higher qualification (HAREC) only", mhz: [144e3, 144035], exceptLevels: ["ua:C", "ua:B"] }
389
508
  ]
390
509
  },
391
510
  "1.25m": {
392
- mhz: [222e3, 225e3],
511
+ mhz: [219e3, 225e3],
512
+ exceptLevels: ["cl:ASP"],
393
513
  segments: [
394
514
  { name: "CW", mhz: [222e3, 222070], mode: "CW" },
395
515
  { name: "Phone", mhz: [222070, 222150], mode: "SSB", submode: "USB" },
396
- { name: "FM", mhz: [222200, 225e3], mode: "FM" }
516
+ { name: "FM", mhz: [222200, 225e3], mode: "FM" },
517
+ { name: "AR Novice: DATA only", mhz: [220500, 221e3], levels: ["ar:N"], superModes: ["DATA"] },
518
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [219e3, 22e4], regions: [2], exceptLevels: ["us:N"] }
397
519
  ]
398
520
  },
399
521
  "70cm": {
400
522
  mhz: [42e4, 45e4],
523
+ exceptLevels: ["cl:ASP", "se:insteg", "us:N"],
401
524
  segments: [
402
525
  { name: "Out of band Reg1", mhz: [42e4, 43e4], mode: false, regions: [1] },
403
526
  { name: "CW", mhz: [432e3, 432100], mode: "CW" },
@@ -406,14 +529,90 @@ var bandPlans_default = {
406
529
  { name: "Phone", mhz: [432100, 432400], mode: "SSB", submode: "USB", regions: [1] },
407
530
  { name: "FM", mhz: [42e4, 45e4], mode: "FM" },
408
531
  { name: "FM Reg1", mhz: [433400, 433575], mode: "FM", regions: [1] },
409
- { name: "Out of band Reg1", mhz: [44e4, 45e4], mode: false, regions: [1] }
532
+ { name: "Out of band Reg1", mhz: [44e4, 45e4], mode: false, regions: [1] },
533
+ { name: "HU: CEPT (full) only", mhz: [431975, 432e3], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
534
+ { name: "HU: CEPT (full) only", mhz: [432400, 432500], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
535
+ { name: "HU: CEPT (full) only", mhz: [438e3, 44e4], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
536
+ { name: "UA: Higher qualification (HAREC) only", mhz: [432e3, 432025], exceptLevels: ["ua:C", "ua:B"] }
410
537
  ]
411
538
  },
412
539
  "33cm": {
413
540
  mhz: [902e3, 928e3],
414
541
  segments: [
415
- { name: "FM", mhz: [927e3, 928e3], mode: "FM" }
542
+ { name: "FM", mhz: [927e3, 928e3], mode: "FM" },
543
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [902e3, 928e3], regions: [2], exceptLevels: ["us:N"] }
544
+ ]
545
+ },
546
+ "23cm": {
547
+ mhz: [124e4, 1325e3],
548
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "bg:2", "ch:HB3", "cl:ASP", "de:N", "gb:F", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N"],
549
+ segments: [
550
+ { name: "HU: CEPT (full) only", mhz: [124e4, 1290994], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
551
+ { name: "HU Beginner (Kezd\u0151), CEPT Novice: PHONE only", mhz: [1290994, 1291494], levels: ["hu:KEZDO", "hu:NOVICE"], superModes: ["PHONE"] },
552
+ { name: "HU: CEPT (full) only", mhz: [1291494, 1297494], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
553
+ { name: "HU Beginner (Kezd\u0151), CEPT Novice: PHONE only", mhz: [1297494, 1298e3], levels: ["hu:KEZDO", "hu:NOVICE"], superModes: ["PHONE"] },
554
+ { name: "HU: CEPT (full) only", mhz: [1298e3, 13e5], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
555
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [124e4, 127e4], exceptLevels: ["us:N"] },
556
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [1295e3, 13e5], exceptLevels: ["us:N"] }
557
+ ]
558
+ },
559
+ "13cm": {
560
+ mhz: [23e5, 245e4],
561
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "ch:HB3", "cl:ASP", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "se:insteg", "si:N", "us:N"],
562
+ segments: [
563
+ { name: "AU: Advanced only", mhz: [23e5, 2302e3], exceptLevels: ["au:S"] },
564
+ { name: "GB: Intermediate, Full only", mhz: [231e4, 235e4], exceptLevels: ["gb:F"] },
565
+ { name: "GB: Intermediate, Full only", mhz: [239e4, 24e5], exceptLevels: ["gb:F"] }
566
+ ]
567
+ },
568
+ "9cm": {
569
+ mhz: [33e5, 36e5],
570
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "gb:F", "hr:P", "my:C", "my:B", "nl:N", "no:begrenset", "si:N"],
571
+ segments: []
572
+ },
573
+ "6cm": {
574
+ mhz: [565e4, 5925e3],
575
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "ch:HB3", "cl:ASP", "cn:A", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "my:C", "my:B", "nl:N", "no:begrenset", "se:insteg", "si:N", "us:N"],
576
+ segments: [
577
+ { name: "GB: Intermediate, Full only", mhz: [583e4, 585e4], exceptLevels: ["gb:F"] },
578
+ { name: "UA: Entry level (student), Higher qualification (HAREC) only", mhz: [566e4, 567e4], exceptLevels: ["ua:B"] },
579
+ { name: "UA: Higher qualification (HAREC) only", mhz: [583e4, 585e4], exceptLevels: ["ua:C", "ua:B"] }
416
580
  ]
581
+ },
582
+ "3cm": {
583
+ mhz: [1e7, 105e5],
584
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "pl:1", "se:insteg", "si:N", "us:N"],
585
+ segments: []
586
+ },
587
+ "1.25cm": {
588
+ mhz: [24e6, 2425e4],
589
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "no:begrenset", "se:insteg", "si:N", "us:N"],
590
+ segments: []
591
+ },
592
+ "6mm": {
593
+ mhz: [47e6, 485e5],
594
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
595
+ segments: []
596
+ },
597
+ "4mm": {
598
+ mhz: [755e5, 815e5],
599
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
600
+ segments: []
601
+ },
602
+ "2.5mm": {
603
+ mhz: [11998e4, 123e6],
604
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "nl:N", "si:N", "us:N"],
605
+ segments: []
606
+ },
607
+ "2mm": {
608
+ mhz: [134e6, 149e6],
609
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "nl:N", "si:N", "us:N"],
610
+ segments: []
611
+ },
612
+ "1mm": {
613
+ mhz: [241e6, 25e7],
614
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
615
+ segments: []
417
616
  }
418
617
  }
419
618
  };
@@ -580,9 +779,12 @@ function superModeForMode(mode) {
580
779
  }
581
780
  }
582
781
  var bandPlansData = bandPlans_default;
782
+ function isLicenseSegment(segment) {
783
+ return Boolean(segment.exceptLevels || segment.levels);
784
+ }
583
785
  var AllSegments = Object.keys(bandPlansData.bands).reduce((segments, band) => {
584
786
  return segments.concat(
585
- bandPlansData.bands[band].segments.map((segment) => {
787
+ bandPlansData.bands[band].segments.filter((segment) => !isLicenseSegment(segment)).map((segment) => {
586
788
  const mhz = Array.isArray(segment.mhz) && segment.mhz.length >= 2 ? [segment.mhz[0], segment.mhz[1]] : [0, 0];
587
789
  return {
588
790
  name: segment.name,
@@ -625,6 +827,540 @@ function modeForFrequency(frequency, options = {}) {
625
827
  return sortedSegments[0]?.mode;
626
828
  }
627
829
 
830
+ // src/data/licenseLevels.json
831
+ var licenseLevels_default = {
832
+ jurisdictions: [
833
+ {
834
+ key: "ar",
835
+ name: "Argentina",
836
+ regulator: "ENACOM",
837
+ rules: "Resoluci\xF3n ENACOM 3635-E/2017 (Reglamento General de Radioaficionados, Anexo A band plan) as amended by Res. ENACOM 1186/2024",
838
+ term: "License Category",
839
+ termLocal: "categor\xEDa",
840
+ entities: ["LU"],
841
+ levels: [
842
+ { code: "N", name: "Novice", nameLocal: "Novicio", tier: "intermediate", aliases: ["Inicial"], maxPowerW: 200 },
843
+ { code: "G", name: "General", tier: "intermediate", aliases: ["Intermedia"], maxPowerW: 1e3 },
844
+ { code: "S", name: "Superior", tier: "full", maxPowerW: 1500 },
845
+ { code: "E", name: "Special", nameLocal: "Especial", tier: "full", maxPowerW: 1500 }
846
+ ]
847
+ },
848
+ {
849
+ key: "at",
850
+ name: "Austria",
851
+ regulator: "Fernmeldeb\xFCros (Fernmeldebeh\xF6rde, Bundesministerium f\xFCr Finanzen)",
852
+ term: "License Class",
853
+ termLocal: "Bewilligungsklasse",
854
+ entities: ["OE"],
855
+ levels: [
856
+ { code: "3", name: "Class 3", nameLocal: "Bewilligungsklasse 3", tier: "basic", maxPowerW: 100 },
857
+ { code: "4", name: "Class 4", nameLocal: "Bewilligungsklasse 4", tier: "intermediate", maxPowerW: 100 },
858
+ { code: "1", name: "Class 1", nameLocal: "Bewilligungsklasse 1", tier: "full", maxPowerW: 1e3 }
859
+ ]
860
+ },
861
+ {
862
+ key: "au",
863
+ name: "Australia",
864
+ regulator: "ACMA",
865
+ term: "Licence Level",
866
+ termLocal: "qualification",
867
+ entities: ["VK", "VK9X", "VK9C", "VK9N", "VK9L", "VK9W", "VK9M", "VK0H", "VK0M"],
868
+ levels: [
869
+ { code: "F", name: "Foundation", nameLocal: "ACMA recognition certificate (Foundation)", tier: "intermediate", maxPowerW: 10 },
870
+ { code: "S", name: "Standard", nameLocal: "ACMA recognition certificate (Standard)", tier: "intermediate", maxPowerW: 100 },
871
+ { code: "A", name: "Advanced", nameLocal: "ACMA recognition certificate (Advanced)", tier: "full", maxPowerW: 400 }
872
+ ],
873
+ callsigns: [
874
+ { pattern: "^VK[0-9][A-Z]{2}$", level: "A", entities: ["VK"] }
875
+ ]
876
+ },
877
+ {
878
+ key: "be",
879
+ name: "Belgium",
880
+ regulator: "BIPT/IBPT",
881
+ term: "Licence Class",
882
+ termLocal: "certificat d'op\xE9rateur de classe A/B/C",
883
+ entities: ["ON"],
884
+ levels: [
885
+ { code: "C", name: "Entry (Basic)", nameLocal: "Certificat d'op\xE9rateur de classe C (ex licence de base)", tier: "intermediate", maxPowerW: 25 },
886
+ { code: "B", name: "Novice", nameLocal: "Certificat d'op\xE9rateur de classe B", tier: "intermediate", maxPowerW: 100 },
887
+ { code: "A", name: "HAREC", nameLocal: "Certificat d'op\xE9rateur de classe A (ex certificat HAREC)", tier: "full", maxPowerW: 1500 }
888
+ ],
889
+ callsigns: [
890
+ { pattern: "^ON3[A-Z]{2,3}$", level: "C" },
891
+ { pattern: "^ON2[A-Z]{2,3}$", level: "B", atLeast: true },
892
+ { pattern: "^ON[14-9][A-Z]{1,3}$", level: "A" }
893
+ ]
894
+ },
895
+ {
896
+ key: "bg",
897
+ name: "Bulgaria",
898
+ regulator: "CRC (\u041A\u043E\u043C\u0438\u0441\u0438\u044F \u0437\u0430 \u0440\u0435\u0433\u0443\u043B\u0438\u0440\u0430\u043D\u0435 \u043D\u0430 \u0441\u044A\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u0442\u0430)",
899
+ term: "License Class",
900
+ termLocal: "\u0440\u0430\u0434\u0438\u043E\u043B\u044E\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u0438 \u043A\u043B\u0430\u0441",
901
+ entities: ["LZ"],
902
+ levels: [
903
+ { code: "2", name: "Class 2", nameLocal: "\u041A\u043B\u0430\u0441 2", tier: "basic", maxPowerW: 5, superModes: ["PHONE", "DATA"] },
904
+ { code: "1", name: "Class 1", nameLocal: "\u041A\u043B\u0430\u0441 1", tier: "full", maxPowerW: 350 }
905
+ ],
906
+ callsigns: [
907
+ { pattern: "^LZ[0-9][A-Z]{2}$", level: "1" }
908
+ ]
909
+ },
910
+ {
911
+ key: "br",
912
+ name: "Brazil",
913
+ regulator: "Anatel",
914
+ rules: "Res. Anatel 777/2025 (RGST) Art. 277 (classes); Ato SOR 926/2024 (bands/power by class); Ato 3448/2026 (operations, exams, callsigns)",
915
+ term: "License Class",
916
+ termLocal: "classe",
917
+ entities: ["PY", "PY0F", "PY0S", "PY0T"],
918
+ levels: [
919
+ { code: "C", name: "Class C", nameLocal: "Classe C", tier: "intermediate", aliases: ["Classe D"], maxPowerW: 100 },
920
+ { code: "B", name: "Class B", nameLocal: "Classe B", tier: "intermediate", maxPowerW: 1e3 },
921
+ { code: "A", name: "Class A", nameLocal: "Classe A", tier: "full", maxPowerW: 1500 }
922
+ ],
923
+ callsigns: [
924
+ { pattern: "^PU[0-9][A-Z]{3}$", level: "C" },
925
+ { pattern: "^PV2[K-Y][A-Z]{2}$", level: "C" }
926
+ ]
927
+ },
928
+ {
929
+ key: "ca",
930
+ name: "Canada",
931
+ regulator: "ISED",
932
+ rules: "RBR-4 Issue 3 (July 2022); RIC-3 Issue 5 (March 2022); Radiocommunication Regulations",
933
+ term: "Qualification",
934
+ termLocal: "qualification",
935
+ entities: ["VE"],
936
+ levels: [
937
+ { code: "B", name: "Basic", nameLocal: "Basic Qualification / comp\xE9tence de base", tier: "basic", maxPowerW: 560 },
938
+ { code: "B/H", name: "Basic with Honours", nameLocal: "Basic Qualification with Honours / comp\xE9tence de base re\xE7ue avec distinction", tier: "full", maxPowerW: 560 },
939
+ { code: "B+5", name: "Basic + Morse (5 wpm)", nameLocal: "Morse Code Qualification / comp\xE9tence en code Morse", tier: "full", maxPowerW: 560 },
940
+ { code: "B+A", name: "Basic + Advanced", nameLocal: "Advanced Qualification / comp\xE9tence sup\xE9rieure", tier: "full", maxPowerW: 2250 }
941
+ ]
942
+ },
943
+ {
944
+ key: "ch",
945
+ name: "Switzerland",
946
+ regulator: "OFCOM/BAKOM",
947
+ term: "Licence Class",
948
+ termLocal: "F\xE4higkeitszeugnis (DE) / certificat de capacit\xE9 (FR); formerly Konzession",
949
+ entities: ["HB"],
950
+ levels: [
951
+ { code: "HB3", name: "Novice", nameLocal: "Einsteigerausweis f\xFCr Funkamateurinnen und Funkamateure (F\xE4higkeitszeugnis Novice)", tier: "intermediate", maxPowerW: 100 },
952
+ { code: "HB9", name: "Full (CEPT)", nameLocal: "F\xE4higkeitszeugnis f\xFCr den Amateurfunk (CEPT)", tier: "full", maxPowerW: 1e3 }
953
+ ],
954
+ callsigns: [
955
+ { pattern: "^HB3[A-Z]{3}$", level: "HB3" },
956
+ { pattern: "^HB9[A-Z]{3}$", level: "HB9" }
957
+ ]
958
+ },
959
+ {
960
+ key: "cl",
961
+ name: "Chile",
962
+ regulator: "SUBTEL",
963
+ rules: "DS 523/2006 (Reglamento del Servicio de Aficionados a las Radiocomunicaciones) as amended by DS 213/2012; Res. Exenta 1228/2008 + 175/2014 (callsigns); DS 127/2006 + DS 192/2023 (band plan)",
964
+ term: "License Category",
965
+ termLocal: "categor\xEDa",
966
+ entities: ["CE", "CE0Y", "CE0X", "CE0Z"],
967
+ levels: [
968
+ { code: "ASP", name: "Aspirant", nameLocal: "Aspirante", tier: "intermediate", maxPowerW: 100 },
969
+ { code: "N", name: "Novice", nameLocal: "Novicio", tier: "intermediate", maxPowerW: 200 },
970
+ { code: "G", name: "General", tier: "full", maxPowerW: 1200 },
971
+ { code: "S", name: "Superior", tier: "full", maxPowerW: 1200 }
972
+ ],
973
+ callsigns: [
974
+ { pattern: "^CD[0-9][A-Z]{3}$", level: "ASP" },
975
+ { pattern: "^CA[0-9][A-Z]{3}$", level: "N" },
976
+ { pattern: "^CE[0-9][A-Z]{1,3}$", level: "G", entities: ["CE"] },
977
+ { pattern: "^XQ[0-9][A-Z]{1,3}$", level: "S" }
978
+ ]
979
+ },
980
+ {
981
+ key: "cn",
982
+ name: "China",
983
+ regulator: "MIIT (\u5DE5\u4E1A\u548C\u4FE1\u606F\u5316\u90E8)",
984
+ term: "Operator Class",
985
+ termLocal: "\u4E1A\u4F59\u65E0\u7EBF\u7535\u53F0\u64CD\u4F5C\u6280\u672F\u80FD\u529B\u7C7B\u522B",
986
+ entities: ["BY"],
987
+ levels: [
988
+ { code: "A", name: "Class A", nameLocal: "A\u7C7B", tier: "basic", maxPowerW: 25 },
989
+ { code: "B", name: "Class B", nameLocal: "B\u7C7B", tier: "full", maxPowerW: 15 },
990
+ { code: "B-pre2024", name: "Class B (obtained before 2024-03-01)", nameLocal: "B\u7C7B (2024\u5E743\u67081\u65E5\u524D\u53D6\u5F97)", tier: "full", legacy: true, maxPowerW: 100 },
991
+ { code: "C", name: "Class C", nameLocal: "C\u7C7B", tier: "full", maxPowerW: 1e3 }
992
+ ]
993
+ },
994
+ {
995
+ key: "cz",
996
+ name: "Czech Republic",
997
+ regulator: "\u010CT\xDA (\u010Cesk\xFD telekomunika\u010Dn\xED \xFA\u0159ad)",
998
+ term: "Operator Class",
999
+ termLocal: "t\u0159\xEDda oper\xE1tora",
1000
+ entities: ["OK"],
1001
+ levels: [
1002
+ { code: "N", name: "Class N (Novice)", nameLocal: "Oper\xE1torsk\xE1 t\u0159\xEDda N", tier: "intermediate", maxPowerW: 10 },
1003
+ { code: "A", name: "Class A", nameLocal: "Oper\xE1torsk\xE1 t\u0159\xEDda A", tier: "full", maxPowerW: 750 }
1004
+ ],
1005
+ callsigns: [
1006
+ { pattern: "^OK9[A-Z]{3}$", level: "N", atLeast: true },
1007
+ { pattern: "^OK[1-7][A-Z]{2,3}$", level: "A" }
1008
+ ]
1009
+ },
1010
+ {
1011
+ key: "de",
1012
+ name: "Germany",
1013
+ regulator: "BNetzA (Bundesnetzagentur)",
1014
+ term: "License Class",
1015
+ termLocal: "Klasse",
1016
+ entities: ["DL"],
1017
+ levels: [
1018
+ { code: "N", name: "Class N", nameLocal: "Klasse N", tier: "basic", maxPowerW: 10 },
1019
+ { code: "E", name: "Class E", nameLocal: "Klasse E", tier: "intermediate", maxPowerW: 100 },
1020
+ { code: "A", name: "Class A", nameLocal: "Klasse A", tier: "full", maxPowerW: 750 }
1021
+ ],
1022
+ callsigns: [
1023
+ { pattern: "^DN9[A-Z]{2,3}$", level: "N", atLeast: true },
1024
+ { pattern: "^(DO[1-9]|DA6)[A-Z]{2,3}$", level: "E", atLeast: true },
1025
+ { pattern: "^(DA[12]|DB[1-9]|DC[0-9]|DD[0-9]|DF[1-9]|DG[0-9]|DH[0-9]|DJ[0-9]|DK[1-9]|DL[1-9]|DM[1-9])[A-Z]{1,3}$", level: "A" }
1026
+ ]
1027
+ },
1028
+ {
1029
+ key: "dk",
1030
+ name: "Denmark",
1031
+ regulator: "Digitaliseringsstyrelsen (formerly SDFI)",
1032
+ rules: "BEK nr 499 af 29/05/2026 (in force 2026-07-01), Bilag 4",
1033
+ term: "Certificate category",
1034
+ termLocal: "certifikat, kategori",
1035
+ entities: ["OZ"],
1036
+ levels: [
1037
+ { code: "D", name: "Category D", nameLocal: "Certifikat kategori D", tier: "basic", maxPowerW: 50 },
1038
+ { code: "B", name: "Category B", nameLocal: "Certifikat kategori B", tier: "full", maxPowerW: 100 },
1039
+ { code: "A", name: "Category A", nameLocal: "Certifikat kategori A", tier: "full", aliases: ["Certifikat kategori C"], maxPowerW: 1e3 }
1040
+ ]
1041
+ },
1042
+ {
1043
+ key: "gb",
1044
+ name: "United Kingdom",
1045
+ regulator: "Ofcom",
1046
+ term: "Licence Class",
1047
+ termLocal: "licence class",
1048
+ entities: ["G", "GM", "GW", "GI"],
1049
+ levels: [
1050
+ { code: "F", name: "Foundation", nameLocal: "Foundation Licence", tier: "intermediate", maxPowerW: 25 },
1051
+ { code: "I", name: "Intermediate", nameLocal: "Intermediate Licence", tier: "intermediate", maxPowerW: 100 },
1052
+ { code: "FULL", name: "Full", nameLocal: "Full Licence", tier: "full", maxPowerW: 1e3 }
1053
+ ],
1054
+ callsigns: [
1055
+ { pattern: "^M[A-Z]?[367][A-Z]{3}$", level: "F" },
1056
+ { pattern: "^M[A-Z]?[89][A-Z]{3}$", level: "I" },
1057
+ { pattern: "^2[A-Z][01][A-Z]{3}$", level: "I" },
1058
+ { pattern: "^G[A-Z]?[0-8][A-Z]{2,3}$", level: "FULL" },
1059
+ { pattern: "^M[A-Z]?[015][A-Z]{2,3}$", level: "FULL" }
1060
+ ]
1061
+ },
1062
+ {
1063
+ key: "hr",
1064
+ name: "Croatia",
1065
+ regulator: "HAKOM (Hrvatska regulatorna agencija za mre\u017Ene djelatnosti)",
1066
+ term: "Operator Class",
1067
+ termLocal: "radioamaterski razred",
1068
+ entities: ["9A"],
1069
+ levels: [
1070
+ { code: "P", name: "Class P (Beginner)", nameLocal: "po\u010Detni\u010Dki P razred", tier: "intermediate", maxPowerW: 100 },
1071
+ { code: "A", name: "Class A", nameLocal: "A razred", tier: "full", maxPowerW: 1500 }
1072
+ ]
1073
+ },
1074
+ {
1075
+ key: "hu",
1076
+ name: "Hungary",
1077
+ regulator: "NMHH (Nemzeti M\xE9dia- \xE9s H\xEDrk\xF6zl\xE9si Hat\xF3s\xE1g)",
1078
+ term: "License Grade",
1079
+ termLocal: "enged\xE9ly fokozata",
1080
+ entities: ["HA"],
1081
+ levels: [
1082
+ { code: "KEZDO", name: "Beginner (Kezd\u0151)", nameLocal: "Kezd\u0151 fokozat\xFA enged\xE9ly", tier: "intermediate", maxPowerW: 100 },
1083
+ { code: "NOVICE", name: "CEPT Novice", nameLocal: "CEPT Novice fokozat\xFA enged\xE9ly", tier: "intermediate", maxPowerW: 200 },
1084
+ { code: "CEPT", name: "CEPT (full)", nameLocal: "CEPT fokozat\xFA enged\xE9ly", tier: "full", maxPowerW: 1500 }
1085
+ ]
1086
+ },
1087
+ {
1088
+ key: "id",
1089
+ name: "Indonesia",
1090
+ regulator: "Komdigi (formerly Kominfo), Ditjen SDPPI",
1091
+ term: "Licence Level",
1092
+ termLocal: "Tingkat IAR",
1093
+ entities: ["YB"],
1094
+ levels: [
1095
+ { code: "SIAGA", name: "General", nameLocal: "Tingkat Siaga", tier: "intermediate", maxPowerW: 100 },
1096
+ { code: "PENGGALANG", name: "Advanced", nameLocal: "Tingkat Penggalang", tier: "intermediate", maxPowerW: 500 },
1097
+ { code: "PENEGAK", name: "Extra Class", nameLocal: "Tingkat Penegak", tier: "full", maxPowerW: 1e3 }
1098
+ ],
1099
+ callsigns: [
1100
+ { pattern: "^Y[DG][0-9][A-Z]{1,3}$", level: "SIAGA" },
1101
+ { pattern: "^Y[CF][0-9][A-Z]{1,3}$", level: "PENGGALANG" },
1102
+ { pattern: "^Y[BE][0-9][A-Z]{1,3}$", level: "PENEGAK" }
1103
+ ]
1104
+ },
1105
+ {
1106
+ key: "jp",
1107
+ name: "Japan",
1108
+ regulator: "MIC (\u7DCF\u52D9\u7701)",
1109
+ term: "Operator Class",
1110
+ termLocal: "\u8CC7\u683C / \u7D1A",
1111
+ entities: ["JA", "JD/o", "JD/m"],
1112
+ levels: [
1113
+ { code: "4", name: "4th Class", nameLocal: "\u7B2C\u56DB\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "intermediate", maxPowerW: 20, superModes: ["PHONE", "DATA"] },
1114
+ { code: "3", name: "3rd Class", nameLocal: "\u7B2C\u4E09\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "intermediate", maxPowerW: 50 },
1115
+ { code: "2", name: "2nd Class", nameLocal: "\u7B2C\u4E8C\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "full", maxPowerW: 200 },
1116
+ { code: "1", name: "1st Class", nameLocal: "\u7B2C\u4E00\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "full", maxPowerW: 1e3 }
1117
+ ]
1118
+ },
1119
+ {
1120
+ key: "kr",
1121
+ name: "Republic of Korea",
1122
+ regulator: "MSIT (\uACFC\uD559\uAE30\uC220\uC815\uBCF4\uD1B5\uC2E0\uBD80) / \uC911\uC559\uC804\uD30C\uAD00\uB9AC\uC18C; exams KCA",
1123
+ term: "Operator Class",
1124
+ termLocal: "\uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC \uC790\uACA9 \uB4F1\uAE09",
1125
+ entities: ["HL"],
1126
+ levels: [
1127
+ { code: "4", name: "4th Class", nameLocal: "\uC81C4\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "basic", maxPowerW: 10, superModes: ["PHONE", "DATA"] },
1128
+ { code: "3P", name: "3rd Class (Telephony)", nameLocal: "\uC81C3\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC(\uC804\uD654\uAE09)", tier: "intermediate", maxPowerW: 100, superModes: ["PHONE", "DATA"] },
1129
+ { code: "3T", name: "3rd Class (Telegraphy)", nameLocal: "\uC81C3\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC(\uC804\uC2E0\uAE09)", tier: "intermediate", maxPowerW: 100 },
1130
+ { code: "2", name: "2nd Class", nameLocal: "\uC81C2\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "full", maxPowerW: 200 },
1131
+ { code: "1", name: "1st Class", nameLocal: "\uC81C1\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "full", maxPowerW: 1e3 }
1132
+ ]
1133
+ },
1134
+ {
1135
+ key: "my",
1136
+ name: "Malaysia",
1137
+ regulator: "MCMC",
1138
+ term: "Licence Class",
1139
+ termLocal: "Kelas",
1140
+ entities: ["9M2", "9M6"],
1141
+ levels: [
1142
+ { code: "C", name: "Class C", nameLocal: "Kelas C", tier: "basic", maxPowerW: 25, superModes: ["PHONE", "DATA"] },
1143
+ { code: "B", name: "Class B", nameLocal: "Kelas B", tier: "intermediate", maxPowerW: 50 },
1144
+ { code: "A", name: "Class A", nameLocal: "Kelas A", tier: "full", maxPowerW: 1e3 }
1145
+ ],
1146
+ callsigns: [
1147
+ { pattern: "^9W3[A-Z]{2,3}$", level: "C" },
1148
+ { pattern: "^9W[268][A-Z]{2,3}$", level: "B" },
1149
+ { pattern: "^9M[268][A-Z]{2,3}$", level: "A" }
1150
+ ]
1151
+ },
1152
+ {
1153
+ key: "nl",
1154
+ name: "Netherlands",
1155
+ regulator: "RDI (Rijksinspectie Digitale Infrastructuur)",
1156
+ term: "Licence Class",
1157
+ termLocal: "categorie registratie",
1158
+ entities: ["PA"],
1159
+ levels: [
1160
+ { code: "N", name: "Novice", nameLocal: "N-registratie (beperkte toegang)", tier: "intermediate", maxPowerW: 100 },
1161
+ { code: "F", name: "Full", nameLocal: "F-registratie (volledige toegang)", tier: "full", maxPowerW: 400 }
1162
+ ],
1163
+ callsigns: [
1164
+ { pattern: "^PD[0-9][A-Z]{2,3}$", level: "N" }
1165
+ ]
1166
+ },
1167
+ {
1168
+ key: "no",
1169
+ name: "Norway",
1170
+ regulator: "Nasjonal kommunikasjonsmyndighet (Nkom)",
1171
+ rules: "Forskrift om radioamat\xF8rvirksomhet FOR-2026-03-23-465 (in force 2026-03-23)",
1172
+ term: "Licence class",
1173
+ termLocal: "lisensklasse",
1174
+ entities: ["LA", "JW", "JX", "3Y/b", "3Y/p"],
1175
+ levels: [
1176
+ { code: "begrenset", name: "Limited licence", nameLocal: "Begrenset lisens", tier: "intermediate", maxPowerW: 10 },
1177
+ { code: "A", name: "Full licence", nameLocal: "Full lisens (HAREC klasse A)", tier: "full", maxPowerW: 1e3 }
1178
+ ],
1179
+ callsigns: [
1180
+ { pattern: "^L[AB][0-9][A-Z]{1,3}$", level: "A", entities: ["LA"] }
1181
+ ]
1182
+ },
1183
+ {
1184
+ key: "pl",
1185
+ name: "Poland",
1186
+ regulator: "UKE (Urz\u0105d Komunikacji Elektronicznej)",
1187
+ term: "License Category",
1188
+ termLocal: "kategoria pozwolenia",
1189
+ entities: ["SP"],
1190
+ levels: [
1191
+ { code: "3", name: "Category 3", nameLocal: "pozwolenie kategorii 3", tier: "full", maxPowerW: 100 },
1192
+ { code: "1", name: "Category 1", nameLocal: "pozwolenie kategorii 1", tier: "full", maxPowerW: 500 }
1193
+ ]
1194
+ },
1195
+ {
1196
+ key: "ro",
1197
+ name: "Romania",
1198
+ regulator: "ANCOM",
1199
+ term: "License Class",
1200
+ termLocal: "clasa",
1201
+ entities: ["YO"],
1202
+ levels: [
1203
+ { code: "IV", name: "Class IV", nameLocal: "Clasa a IV-a", tier: "full", maxPowerW: 50 },
1204
+ { code: "III", name: "Class III", nameLocal: "Clasa a III-a", tier: "full", maxPowerW: 100 },
1205
+ { code: "II", name: "Class II", nameLocal: "Clasa a II-a", tier: "full", maxPowerW: 200 },
1206
+ { code: "I", name: "Class I", nameLocal: "Clasa I", tier: "full", maxPowerW: 400 }
1207
+ ]
1208
+ },
1209
+ {
1210
+ key: "rs",
1211
+ name: "Serbia",
1212
+ regulator: "RATEL",
1213
+ term: "License Class",
1214
+ termLocal: "\u043A\u043B\u0430\u0441\u0430 \u0440\u0430\u0434\u0438\u043E-\u0430\u043C\u0430\u0442\u0435\u0440\u0430",
1215
+ entities: ["YU"],
1216
+ levels: [
1217
+ { code: "C", name: "Class C (basic)", nameLocal: "\u041A\u043B\u0430\u0441\u0430 C", tier: "intermediate", maxPowerW: 100 },
1218
+ { code: "B", name: "Class B (advanced)", nameLocal: "\u041A\u043B\u0430\u0441\u0430 B", tier: "intermediate", maxPowerW: 100 },
1219
+ { code: "A", name: "Class A", nameLocal: "\u041A\u043B\u0430\u0441\u0430 A", tier: "full", maxPowerW: 1500 }
1220
+ ]
1221
+ },
1222
+ {
1223
+ key: "ru",
1224
+ name: "Russia",
1225
+ regulator: "\u0413\u041A\u0420\u0427 / \u041C\u0438\u043D\u0446\u0438\u0444\u0440\u044B \u0420\u043E\u0441\u0441\u0438\u0438 (allocation), \u0420\u043E\u0441\u043A\u043E\u043C\u043D\u0430\u0434\u0437\u043E\u0440 + \u0424\u0413\u0423\u041F \u0413\u0420\u0427\u0426 (registration, callsigns), \u0421\u0420\u0420 (qualification exams)",
1226
+ rules: "\u0420\u0435\u0448\u0435\u043D\u0438\u0435 \u0413\u041A\u0420\u0427 10-07-01 \u0440\u0435\u0434. 18-45-02 (2018-04-16, valid to 2028-04-01); \u041F\u0440\u0438\u043A\u0430\u0437 \u041C\u0438\u043D\u043A\u043E\u043C\u0441\u0432\u044F\u0437\u0438 \u2116184 (2012); \u041F\u0440\u0438\u043A\u0430\u0437 \u21164 (2012) \u0440\u0435\u0434. 2019",
1227
+ term: "Category",
1228
+ termLocal: "\u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F",
1229
+ entities: ["UA", "UA2", "UA9"],
1230
+ levels: [
1231
+ { code: "4", name: "Category 4", nameLocal: "4 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "basic", maxPowerW: 5 },
1232
+ { code: "3", name: "Category 3", nameLocal: "3 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F \u043D\u043E\u0432\u0438\u0447\u043A\u0430)", tier: "full", maxPowerW: 10 },
1233
+ { code: "2", name: "Category 2", nameLocal: "2 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043E\u0441\u043D\u043E\u0432\u043D\u0430\u044F/\u0431\u0430\u0437\u043E\u0432\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "full", maxPowerW: 1e3 },
1234
+ { code: "1", name: "Category 1", nameLocal: "1 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u0432\u044B\u0441\u0448\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "full", maxPowerW: 1e3 }
1235
+ ],
1236
+ callsigns: [
1237
+ { pattern: "^R[0-9][A-Z]{4}$", level: "4" },
1238
+ { pattern: "^U[BCD][0-9][A-Z]{3}$", level: "3", atLeast: true },
1239
+ { pattern: "^(R[A-Z]?|U[A-I])[0-9][A-Z]{1,2}$", level: "1" },
1240
+ { pattern: "^(R[ACDGJ-NOQT-Z]|UA)[0-9][A-Z]{3}$", level: "2", atLeast: true }
1241
+ ]
1242
+ },
1243
+ {
1244
+ key: "se",
1245
+ name: "Sweden",
1246
+ regulator: "Post- och telestyrelsen (PTS); certificates/callsigns issued by SSA under delegation",
1247
+ rules: "PTSFS 2025:1 (licence exemption; in force 2025-03-17)",
1248
+ term: "Certificate",
1249
+ termLocal: "certifikat",
1250
+ entities: ["SM"],
1251
+ levels: [
1252
+ { code: "insteg", name: "Entry-level certificate", nameLocal: "Instegscertifikat f\xF6r amat\xF6rradio", tier: "intermediate", maxPowerW: 25 },
1253
+ { code: "1", name: "Amateur radio certificate (HAREC)", nameLocal: "Amat\xF6rradiocertifikat", tier: "full", maxPowerW: 200 }
1254
+ ],
1255
+ callsigns: [
1256
+ { pattern: "^SH[0-9][A-Z]{3}$", level: "insteg" },
1257
+ { pattern: "^S[AM][0-9][A-Z]{1,3}$", level: "1" }
1258
+ ]
1259
+ },
1260
+ {
1261
+ key: "si",
1262
+ name: "Slovenia",
1263
+ regulator: "AKOS (Agencija za komunikacijska omre\u017Eja in storitve RS)",
1264
+ term: "Operator Class",
1265
+ termLocal: "razred radioamaterja",
1266
+ entities: ["S5"],
1267
+ levels: [
1268
+ { code: "N", name: "Class N (Novice)", nameLocal: "razred N", tier: "intermediate", maxPowerW: 100 },
1269
+ { code: "A", name: "Class A", nameLocal: "razred A", tier: "full", maxPowerW: 1500 }
1270
+ ],
1271
+ callsigns: [
1272
+ { pattern: "^S52[A-XZ][A-Z]{2}$", level: "N", atLeast: true },
1273
+ { pattern: "^S58[A-X][A-Z]{2}$", level: "N", atLeast: true }
1274
+ ]
1275
+ },
1276
+ {
1277
+ key: "ua",
1278
+ name: "Ukraine",
1279
+ regulator: "\u041D\u041A\u0415\u041A (National Commission for State Regulation of Electronic Communications...), \u0423\u0414\u0426\u0420 (callsigns/permits)",
1280
+ rules: "\u0420\u0435\u0433\u043B\u0430\u043C\u0435\u043D\u0442 \u0430\u043C\u0430\u0442\u043E\u0440\u0441\u044C\u043A\u043E\u0433\u043E \u0440\u0430\u0434\u0456\u043E\u0437\u0432'\u044F\u0437\u043A\u0443 \u0423\u043A\u0440\u0430\u0457\u043D\u0438, \u041F\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0430 \u041D\u041A\u0415\u041A 10.05.2023 \u2116173 (\u041C\u042E 29.06.2023 \u21161106/40162), Annex 2 Table 12",
1281
+ term: "Qualification",
1282
+ termLocal: "\u043A\u0432\u0430\u043B\u0456\u0444\u0456\u043A\u0430\u0446\u0456\u044F \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440\u0430",
1283
+ entities: ["UR"],
1284
+ levels: [
1285
+ { code: "C", name: "Entry level (student)", nameLocal: "C \u2014 \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440-\u0443\u0447\u0435\u043D\u044C", tier: "intermediate", maxPowerW: 40 },
1286
+ { code: "B", name: "Novice", nameLocal: "B \u2014 \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440-\u043F\u043E\u0447\u0430\u0442\u043A\u0456\u0432\u0435\u0446\u044C", tier: "intermediate", aliases: ["3 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F"], maxPowerW: 100 },
1287
+ { code: "A", name: "Higher qualification (HAREC)", nameLocal: "A \u2014 \u0432\u0438\u0449\u0430 \u043A\u0432\u0430\u043B\u0456\u0444\u0456\u043A\u0430\u0446\u0456\u044F \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440\u0430", tier: "full", aliases: ["1 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F", "2 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F"], maxPowerW: 200 }
1288
+ ],
1289
+ callsigns: [
1290
+ { pattern: "^U[R-Z][0-9][A-Z]{2}$", level: "A" }
1291
+ ]
1292
+ },
1293
+ {
1294
+ key: "us",
1295
+ name: "United States",
1296
+ regulator: "FCC",
1297
+ rules: "47 CFR Part 97 (eCFR, current to 2026-10-09)",
1298
+ term: "License Class",
1299
+ termLocal: "operator license class",
1300
+ entities: ["K", "KL", "KH6", "KP4", "KP2", "KP1", "KP5", "KG4", "KH0", "KH1", "KH2", "KH3", "KH4", "KH5", "KH7K", "KH8", "KH8/s", "KH9"],
1301
+ levels: [
1302
+ { code: "N", name: "Novice", tier: "basic", legacy: true, maxPowerW: 200 },
1303
+ { code: "T", name: "Technician", tier: "basic", maxPowerW: 1500 },
1304
+ { code: "G", name: "General", tier: "intermediate", maxPowerW: 1500 },
1305
+ { code: "A", name: "Advanced", tier: "intermediate", legacy: true, maxPowerW: 1500 },
1306
+ { code: "E", name: "Amateur Extra", tier: "full", maxPowerW: 1500 }
1307
+ ],
1308
+ callsigns: [
1309
+ { pattern: "^[KNW][0-9][A-Z]{2}$", level: "E", entities: ["K"] },
1310
+ { pattern: "^[AKNW][A-Z][0-9][A-Z]$", level: "E", entities: ["K"] },
1311
+ { pattern: "^A[A-K][0-9][A-Z]{2}$", level: "E", entities: ["K"] },
1312
+ { pattern: "^[KNW][A-Z][0-9][A-Z]{2}$", level: "A", atLeast: true, entities: ["K"] },
1313
+ { pattern: "^[KNW][0-9][A-Z]{3}$", level: "T", atLeast: true, entities: ["K"] },
1314
+ { pattern: "^[KNW]P[0-9][A-Z]$", level: "E", entities: ["KP4", "KP2", "KP1", "KP5"] },
1315
+ { pattern: "^KP[0-9][A-Z]{2}$", level: "A", atLeast: true, entities: ["KP4", "KP2", "KP1", "KP5"] },
1316
+ { pattern: "^[NW]P[0-9][A-Z]{2}$", level: "T", atLeast: true, entities: ["KP4", "KP2", "KP1", "KP5"] }
1317
+ ]
1318
+ }
1319
+ ]
1320
+ };
1321
+
1322
+ // src/lib/licenseLevels.ts
1323
+ var LICENSE_LEVELS = licenseLevels_default;
1324
+ var bandPlansData2 = bandPlans_default;
1325
+ function licenseJurisdictionForEntity(entityPrefix) {
1326
+ return LICENSE_LEVELS.jurisdictions.find((jurisdiction) => jurisdiction.entities.includes(entityPrefix));
1327
+ }
1328
+ function licenseLevelKey(jurisdiction, level) {
1329
+ return `${jurisdiction.key}:${level.code}`;
1330
+ }
1331
+ function resolveLicenseLevel(key) {
1332
+ const colon = key.indexOf(":");
1333
+ if (colon <= 0) return void 0;
1334
+ const jurisdiction = LICENSE_LEVELS.jurisdictions.find((j) => j.key === key.slice(0, colon));
1335
+ const level = jurisdiction?.levels.find((l) => l.code === key.slice(colon + 1));
1336
+ return jurisdiction && level ? { jurisdiction, level } : void 0;
1337
+ }
1338
+ function licenseLevelForCallsign(call, entityPrefix) {
1339
+ const jurisdiction = licenseJurisdictionForEntity(entityPrefix);
1340
+ if (!jurisdiction) return void 0;
1341
+ const bare = call.toUpperCase().split("/").reduce((best, part) => part.length > best.length ? part : best, "");
1342
+ const rule = jurisdiction.callsigns?.find((r) => (!r.entities || r.entities.includes(entityPrefix)) && new RegExp(r.pattern).test(bare));
1343
+ const level = rule && jurisdiction.levels.find((l) => l.code === rule.level);
1344
+ return rule && level ? { jurisdiction, level, atLeast: Boolean(rule.atLeast) } : void 0;
1345
+ }
1346
+ function isOutsideLicensePrivileges(khz, options) {
1347
+ const { level: key, entityPrefix, ituRegion, mode } = options;
1348
+ const resolved = resolveLicenseLevel(key);
1349
+ if (!resolved || !resolved.jurisdiction.entities.includes(entityPrefix)) return void 0;
1350
+ const band = Object.values(bandPlansData2.bands).find((b) => b.mhz[0] <= khz && khz <= b.mhz[1]);
1351
+ if (!band) return void 0;
1352
+ if (band.exceptLevels?.includes(key)) return true;
1353
+ let allowed = resolved.level.superModes ?? SUPER_MODES;
1354
+ for (const segment of band.segments) {
1355
+ if (!(segment.mhz[0] < khz && khz < segment.mhz[1])) continue;
1356
+ if (segment.entities && !segment.entities.includes(entityPrefix)) continue;
1357
+ if (segment.regions && !(ituRegion && segment.regions.includes(ituRegion))) continue;
1358
+ if (segment.exceptLevels?.includes(key)) return true;
1359
+ if (segment.levels?.includes(key)) allowed = allowed.filter((m) => segment.superModes?.includes(m));
1360
+ }
1361
+ return mode ? !allowed.includes(superModeForMode(mode)) : false;
1362
+ }
1363
+
628
1364
  exports.ADIF_MODES = ADIF_MODES;
629
1365
  exports.ADIF_MODES_AND_SUBMODES = ADIF_MODES_AND_SUBMODES;
630
1366
  exports.ADIF_MODE_FOR_SUBMODE = ADIF_MODE_FOR_SUBMODE;
@@ -635,6 +1371,7 @@ exports.CONTEST_BANDS = CONTEST_BANDS;
635
1371
  exports.EHF_BANDS = EHF_BANDS;
636
1372
  exports.EXTENDED_BANDS = EXTENDED_BANDS;
637
1373
  exports.HF_BANDS = HF_BANDS;
1374
+ exports.LICENSE_LEVELS = LICENSE_LEVELS;
638
1375
  exports.MAIN_MODES = MAIN_MODES;
639
1376
  exports.PHONE_MODES = PHONE_MODES;
640
1377
  exports.POPULAR_BANDS = POPULAR_BANDS;
@@ -647,7 +1384,12 @@ exports.adifModeAndSubmodeForMode = adifModeAndSubmodeForMode;
647
1384
  exports.bandForExactFrequencyInMHz = bandForExactFrequencyInMHz;
648
1385
  exports.bandForFrequency = bandForFrequency;
649
1386
  exports.frequencyForBand = frequencyForBand;
1387
+ exports.isOutsideLicensePrivileges = isOutsideLicensePrivileges;
1388
+ exports.licenseJurisdictionForEntity = licenseJurisdictionForEntity;
1389
+ exports.licenseLevelForCallsign = licenseLevelForCallsign;
1390
+ exports.licenseLevelKey = licenseLevelKey;
650
1391
  exports.modeForFrequency = modeForFrequency;
1392
+ exports.resolveLicenseLevel = resolveLicenseLevel;
651
1393
  exports.superModeForMode = superModeForMode;
652
1394
  //# sourceMappingURL=index.cjs.map
653
1395
  //# sourceMappingURL=index.cjs.map