vehicles 0.6.1 → 0.8.0

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.
Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +274 -0
  4. data/README.md +55 -10
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +5 -4
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/fr-departements.yml +191 -0
  14. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  15. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  16. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  17. data/data/plates/_decode/hr-cities.yml +315 -0
  18. data/data/plates/_decode/ie-counties.yml +227 -0
  19. data/data/plates/_decode/in-state-codes.yml +169 -0
  20. data/data/plates/_decode/is-districts-1938.yml +116 -0
  21. data/data/plates/_decode/it-provinces.yml +348 -0
  22. data/data/plates/_decode/jp-office-marks.yml +960 -0
  23. data/data/plates/_decode/jp-use-marks.yml +205 -0
  24. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  25. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  26. data/data/plates/_decode/lu-series-order.yml +638 -0
  27. data/data/plates/_decode/mx-entity-series.yml +380 -0
  28. data/data/plates/_decode/my-index-marks.yml +271 -0
  29. data/data/plates/_decode/no-counties-1913.yml +148 -0
  30. data/data/plates/_decode/no-districts.yml +901 -0
  31. data/data/plates/_decode/pl-powiats.yml +567 -0
  32. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  33. data/data/plates/_decode/ro-counties.yml +213 -0
  34. data/data/plates/_decode/se-diplomatic.yml +220 -0
  35. data/data/plates/_decode/si-regions.yml +123 -0
  36. data/data/plates/_decode/sk-districts.yml +314 -0
  37. data/data/plates/_decode/th-registration-elements.yml +208 -0
  38. data/data/plates/_decode/ua-regions.yml +393 -0
  39. data/data/plates/_decode/za-licence-marks.yml +215 -0
  40. data/data/plates/_meta/classes.yml +1 -0
  41. data/data/plates/_meta/separators.yml +102 -0
  42. data/data/plates/ad.yml +961 -0
  43. data/data/plates/ar.yml +762 -0
  44. data/data/plates/at.yml +1424 -0
  45. data/data/plates/au-act.yml +472 -0
  46. data/data/plates/au-nsw.yml +282 -0
  47. data/data/plates/au-nt.yml +431 -0
  48. data/data/plates/au-qld.yml +272 -0
  49. data/data/plates/au-sa.yml +248 -0
  50. data/data/plates/au-tas.yml +302 -0
  51. data/data/plates/au-vic.yml +215 -0
  52. data/data/plates/au-wa.yml +309 -0
  53. data/data/plates/be.yml +1840 -0
  54. data/data/plates/br.yml +1152 -0
  55. data/data/plates/ca-ab.yml +430 -0
  56. data/data/plates/ca-bc.yml +697 -0
  57. data/data/plates/ca-mb.yml +499 -0
  58. data/data/plates/ca-nb.yml +537 -0
  59. data/data/plates/ca-nl.yml +743 -0
  60. data/data/plates/ca-ns.yml +808 -0
  61. data/data/plates/ca-nt.yml +610 -0
  62. data/data/plates/ca-nu.yml +280 -0
  63. data/data/plates/ca-on.yml +881 -0
  64. data/data/plates/ca-pe.yml +592 -0
  65. data/data/plates/ca-qc.yml +1036 -0
  66. data/data/plates/ca-sk.yml +256 -0
  67. data/data/plates/ca-yt.yml +656 -0
  68. data/data/plates/ch.yml +1273 -0
  69. data/data/plates/cn.yml +1431 -0
  70. data/data/plates/cy.yml +688 -0
  71. data/data/plates/cz.yml +1179 -0
  72. data/data/plates/de.yml +553 -118
  73. data/data/plates/dk.yml +1647 -0
  74. data/data/plates/ee.yml +1275 -0
  75. data/data/plates/es.yml +228 -32
  76. data/data/plates/fi.yml +1271 -0
  77. data/data/plates/fr.yml +1265 -0
  78. data/data/plates/gb.yml +1188 -0
  79. data/data/plates/gr.yml +721 -0
  80. data/data/plates/hr.yml +860 -0
  81. data/data/plates/hu.yml +959 -0
  82. data/data/plates/ie.yml +775 -0
  83. data/data/plates/in.yml +1172 -0
  84. data/data/plates/is.yml +667 -0
  85. data/data/plates/it.yml +1317 -0
  86. data/data/plates/jp.yml +3650 -0
  87. data/data/plates/kr.yml +1375 -0
  88. data/data/plates/li.yml +1010 -0
  89. data/data/plates/lt.yml +879 -0
  90. data/data/plates/lu.yml +842 -0
  91. data/data/plates/lv.yml +924 -0
  92. data/data/plates/mc.yml +1024 -0
  93. data/data/plates/mt.yml +854 -0
  94. data/data/plates/mx.yml +1372 -0
  95. data/data/plates/my.yml +685 -0
  96. data/data/plates/nl.yml +44 -0
  97. data/data/plates/no.yml +1018 -0
  98. data/data/plates/nz.yml +1699 -0
  99. data/data/plates/pl.yml +1296 -0
  100. data/data/plates/pt.yml +847 -0
  101. data/data/plates/ro.yml +785 -0
  102. data/data/plates/se.yml +1091 -0
  103. data/data/plates/si.yml +1105 -0
  104. data/data/plates/sk.yml +1439 -0
  105. data/data/plates/sm.yml +1119 -0
  106. data/data/plates/th.yml +1150 -0
  107. data/data/plates/ua.yml +1672 -0
  108. data/data/plates/us-ak.yml +763 -0
  109. data/data/plates/us-al.yml +457 -0
  110. data/data/plates/us-ar.yml +427 -0
  111. data/data/plates/us-as.yml +454 -0
  112. data/data/plates/us-az.yml +430 -0
  113. data/data/plates/us-ca.yml +892 -0
  114. data/data/plates/us-co.yml +452 -0
  115. data/data/plates/us-ct.yml +427 -0
  116. data/data/plates/us-dc.yml +614 -0
  117. data/data/plates/us-de.yml +551 -0
  118. data/data/plates/us-fl.yml +319 -96
  119. data/data/plates/us-ga.yml +644 -0
  120. data/data/plates/us-gu.yml +658 -0
  121. data/data/plates/us-hi.yml +585 -0
  122. data/data/plates/us-ia.yml +438 -0
  123. data/data/plates/us-id.yml +531 -0
  124. data/data/plates/us-il.yml +516 -0
  125. data/data/plates/us-in.yml +324 -0
  126. data/data/plates/us-ks.yml +351 -0
  127. data/data/plates/us-ky.yml +770 -0
  128. data/data/plates/us-la.yml +568 -0
  129. data/data/plates/us-ma.yml +379 -0
  130. data/data/plates/us-md.yml +536 -0
  131. data/data/plates/us-me.yml +445 -0
  132. data/data/plates/us-mi.yml +408 -0
  133. data/data/plates/us-mn.yml +411 -0
  134. data/data/plates/us-mo.yml +356 -0
  135. data/data/plates/us-mp.yml +402 -0
  136. data/data/plates/us-ms.yml +432 -0
  137. data/data/plates/us-mt.yml +619 -0
  138. data/data/plates/us-nc.yml +602 -0
  139. data/data/plates/us-nd.yml +419 -0
  140. data/data/plates/us-ne.yml +483 -0
  141. data/data/plates/us-nh.yml +394 -0
  142. data/data/plates/us-nj.yml +547 -0
  143. data/data/plates/us-nm.yml +574 -0
  144. data/data/plates/us-nv.yml +655 -0
  145. data/data/plates/us-ny.yml +592 -0
  146. data/data/plates/us-oh.yml +404 -0
  147. data/data/plates/us-ok.yml +513 -0
  148. data/data/plates/us-or.yml +392 -0
  149. data/data/plates/us-pa.yml +506 -0
  150. data/data/plates/us-pr.yml +507 -0
  151. data/data/plates/us-ri.yml +445 -0
  152. data/data/plates/us-sc.yml +605 -0
  153. data/data/plates/us-sd.yml +428 -0
  154. data/data/plates/us-tn.yml +471 -0
  155. data/data/plates/us-tx.yml +535 -0
  156. data/data/plates/us-ut.yml +384 -0
  157. data/data/plates/us-va.yml +567 -0
  158. data/data/plates/us-vi.yml +489 -0
  159. data/data/plates/us-vt.yml +458 -0
  160. data/data/plates/us-wa.yml +484 -0
  161. data/data/plates/us-wi.yml +509 -0
  162. data/data/plates/us-wv.yml +446 -0
  163. data/data/plates/us-wy.yml +523 -0
  164. data/data/plates/va.yml +604 -0
  165. data/data/plates/za.yml +1141 -0
  166. data/data/vehicles.json +160653 -105090
  167. data/lib/vehicles/configuration.rb +17 -3
  168. data/lib/vehicles/dataset.rb +73 -18
  169. data/lib/vehicles/fuzzy.rb +115 -0
  170. data/lib/vehicles/http.rb +48 -0
  171. data/lib/vehicles/make.rb +36 -6
  172. data/lib/vehicles/mcp_server.rb +5 -5
  173. data/lib/vehicles/model.rb +21 -2
  174. data/lib/vehicles/plates/series.rb +172 -18
  175. data/lib/vehicles/plates/template_fill.rb +188 -0
  176. data/lib/vehicles/plates/templates.rb +162 -0
  177. data/lib/vehicles/plates.rb +12 -0
  178. data/lib/vehicles/providers/hosted_provider.rb +28 -55
  179. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  180. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  181. data/lib/vehicles/version.rb +1 -1
  182. data/lib/vehicles.rb +32 -16
  183. data/rakelib/data_refresh.rake +109 -0
  184. data/rakelib/plates_refresh.rake +29 -0
  185. data/sig/vehicles.rbs +18 -0
  186. metadata +164 -2
@@ -0,0 +1,315 @@
1
+ # plates/_decode/hr-cities.yml — Croatian registracijska područja (registration areas).
2
+ #
3
+ # THE SOURCE FINDING, and it is the Anlage-5d case rather than the German one:
4
+ # THE CODE LIST IS IN THE REGULATION. Članak 52. stavak 2. of the Pravilnik o
5
+ # registraciji i označavanju vozila (NN 130/2017), verbatim: "Popis oznaka
6
+ # registracijskih područja nalazi se u Prilogu 1. koji je tiskan uz ovaj
7
+ # Pravilnik i njegov je sastavni dio." Prilog 1 is a closed, primary, 34-row
8
+ # table printed inside the pravilnik, listing for each two-letter code the
9
+ # gradovi (towns) and općine (municipalities) it covers. Every row below is
10
+ # extracted MECHANICALLY from that annex as published on
11
+ # narodne-novine.nn.hr — not transcribed by hand and not taken from any
12
+ # secondary compilation.
13
+ #
14
+ # THIRTY-FOUR CODES, not the "36+" that circulates on the enthusiast web. The
15
+ # annex numbers them 1-34 and the `annex_no` field preserves that numbering.
16
+ #
17
+ # ---------------------------------------------------------------------------
18
+ # THE CAVEAT THAT MAKES THIS TABLE HONEST — READ IT BEFORE DECODING ANYTHING.
19
+ # It lives HERE, in the table, and not only in prose in plates/hr.yml, because
20
+ # a consumer who loads this file and never reads the dossier is exactly the
21
+ # consumer who will get it wrong.
22
+ # ---------------------------------------------------------------------------
23
+ decodes_to: >-
24
+ The registration area whose stanica za tehnički pregled vozila issued THIS
25
+ MARK, which is the area of the then-owner's prebivalište / boravište /
26
+ sjedište AT THE MOMENT OF ISSUE (čl. 5 st. 1 NN 130/2017). It is NOT a claim
27
+ about where the vehicle is now, nor about where its CURRENT owner lives.
28
+ does_not_decode_to: >-
29
+ The current owner's residence; the place of manufacture; the place of the
30
+ technical inspection (čl. 5 st. 2 expressly permits an inspection station
31
+ OUTSIDE the area to issue a mark bearing the owner's own area code).
32
+ caveat_2016:
33
+ date: "2016-07-04"
34
+ instrument: "Pravilnik o izmjenama i dopunama Pravilnika o registraciji i označavanju vozila, NN 45/2016, čl. 5 and čl. 10"
35
+ what_changed: >-
36
+ Until 3 July 2016 the SELLER of a vehicle had to deregister it and hand the
37
+ plates back, and the plates could pass to the buyer only "ako su
38
+ kupoprodajnim ugovorom ili pisanom izjavom ... ustupljene kupcu I AKO SE PRI
39
+ PROMJENI VLASNIŠTVA NE MIJENJA REGISTRACIJSKO PODRUČJE" (NN 151/2008
40
+ čl. 40 st. 3) — the same-area condition was written into the rule, so a
41
+ surviving mark was strong evidence about the CURRENT owner's area.
42
+ NN 45/2016 čl. 5 replaced that article outright: "U slučaju prodaje ili
43
+ drugog načina promjene vlasništva na vozilu, novi vlasnik vozila dužan je u
44
+ roku od 15 dana od stjecanja vozila registrirati vozilo na svoje ime ili ga
45
+ odjaviti" — the duty moved to the BUYER and the surrender of the plates
46
+ dropped out of the sale case entirely. The rule is carried forward verbatim
47
+ as čl. 48 st. 1 of NN 130/2017.
48
+ effect_on_this_table: >-
49
+ For any mark that has changed hands on or after 2016-07-04, the code is
50
+ evidence about the area of the owner AT FIRST ISSUE and about nobody since.
51
+ A parse API must NOT report the code as the current holder's area. The link
52
+ is not severed — čl. 25 st. 1 NN 130/2017 still issues NEW marks "za vozilo
53
+ koje se registrira u drugom registracijskom području" — but it is no longer
54
+ refreshed on every change of owner, and čl. 47 st. 7 additionally lets a
55
+ surrendered plate be taken over by "druga osoba na temelju ovjerene izjave
56
+ vlasnika registarskih pločica o ustupanju", i.e. by a different person.
57
+ confidence_rule: >-
58
+ current-area: unsound after 2016-07-04. area-at-issue: sound.
59
+ Consumers that cannot date a mark must degrade to area-at-issue.
60
+ # ---------------------------------------------------------------------------
61
+ jurisdiction: hr
62
+ topic: cities
63
+ authority:
64
+ name: "Pravilnik o registraciji i označavanju vozila, Prilog 1 (POPIS OZNAKA REGISTRACIJSKIH PODRUČJA) — Ministarstvo unutarnjih poslova"
65
+ url: "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html"
66
+ sources:
67
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2017_12_130_2993.html # NN 130/2017 (27.12.2017.), Pravilnik o registraciji i označavanju vozila — čl. 52 st. 2 (the delegation) and Prilog 1 'POPIS OZNAKA REGISTRACIJSKIH PODRUČJA', all 34 rows with their gradovi and općine. Accessed 2026-08-02"
68
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2008_12_151_4118.html # NN 151/2008 (23.12.2008.) — the PREVIOUS base pravilnik, čl. 52 st. 2 and its own 34-row POPIS, diffed against the 2017 annex to produce `changed_2008_2017` below. Accessed 2026-08-02"
69
+ - "https://narodne-novine.nn.hr/clanci/sluzbeni/2016_05_45_1165.html # NN 45/2016 (13.5.2016.) — čl. 5 (the ownership-transfer rule that produced caveat_2016) and čl. 10 (stupa na snagu 4. srpnja 2016.). Accessed 2026-08-02"
70
+ period: { start: 2018 }
71
+ period_evidence: enacted-commencement
72
+ period_note: >-
73
+ 2018, not 2017: NN 130/2017 was published on 27 December 2017 but its own
74
+ čl. 59 says "stupa na snagu 1. siječnja 2018. godine" (with a handful of
75
+ provisions deferred to 20 May 2018). The gazette date is not the period.
76
+ The CODES themselves are far older — most of them are unchanged since the
77
+ 1993 system — but per-code start dates are a recorded gap: the popis attached
78
+ to the Pravilnik o registraciji vozila na motorni pogon i priključnih vozila
79
+ (NN 12/93, 22/93, 19/96, 149/02) was not reachable in this pass, and the 1993
80
+ pravilnik's own čl. 34 expressly kept the OLD popis alive for a transitional
81
+ period, so the 1990s code set is not asserted here.
82
+
83
+ # ---------------------------------------------------------------------------
84
+ # THE DIACRITIC PROBLEM — a PRD-PLATES §2.6 finding, recorded, not folded away.
85
+ # ---------------------------------------------------------------------------
86
+ diacritics:
87
+ affected_codes: ["ČK", "KŽ", "PŽ", "ŠI", "VŽ", "ŽU"]
88
+ finding: >-
89
+ Six of the 34 codes are printed on the plate with a caron. Č, Š and Ž are
90
+ NOT in the dataset's serial alphabet (plates/_meta/separators.yml declares
91
+ it as A-Z 0-9), so no `format.pattern` or `format.regex` in plates/hr.yml
92
+ can spell them: the area-code position is written `[A-Z]{2}` there and is
93
+ therefore NARROWER than the issuing grammar for these six areas. Per
94
+ PRD-PLATES §2.7 that is still `matching: strict` — narrower is strict — but
95
+ a consumer matching a photographed Croatian plate MUST either ASCII-fold the
96
+ input or widen the class itself. Extending the serial alphabet is a schema
97
+ amendment (§2.6), not a data entry, and is NOT attempted here.
98
+ authority_acknowledges_it: >-
99
+ Čl. 22 st. 7 NN 130/2017 refuses a by-choice mark "ako drugom vozilu već
100
+ nije dodijeljen registarski broj zbog kojeg može doći do DUPLIRANJA PRILIKOM
101
+ TRANSLITERACIJE registarskih brojeva" — the regulation itself contemplates
102
+ transliteration collisions. `code_ascii` below is our fold (Č->C, Š->S,
103
+ Ž->Z); within the current 34 it is collision-free, which we checked.
104
+ ascii_fold_collision_warning: >-
105
+ ŠI folds to SI, and SI was itself a Croatian area code in the earlier system
106
+ (Sisak, before SK). The fold is unambiguous against the CURRENT table and
107
+ ambiguous against the historical one. Since the historical table is a
108
+ recorded gap above, a consumer decoding an old plate must treat SI as
109
+ unresolved rather than as Šibenik.
110
+
111
+ # ---------------------------------------------------------------------------
112
+ # What moved between the 2008 annex and the 2017 annex, from diffing the two
113
+ # primaries. Recorded because decode tables rot (PRD-PLATES §9) and because it
114
+ # shows the annex is maintained at the MUNICIPALITY level, not the code level.
115
+ # ---------------------------------------------------------------------------
116
+ changed_2008_2017:
117
+ codes_added: []
118
+ codes_removed: []
119
+ method: "set-diff of the two annex texts, computed rather than read; the first hand-written version of this block asserted three changes that the diff does not support and one that a line-break artefact in the 2008 HTML had invented, and was replaced"
120
+ code_set: "IDENTICAL in both annexes — all 34, same letters, same annex numbering. Nothing was added and nothing was withdrawn between 2008 and 2018."
121
+ coverage_gained:
122
+ KA: ["općina Kamanje"]
123
+ PU: ["grad Vodnjan (promoted from općina)", "općina Guntana", "općina Tar-Vabriga"]
124
+ ŠI: ["općina Tribunj", "općina Murter renamed Murter-Kornati"]
125
+ VU: ["općina Štitar"]
126
+ ZD: ["općina Kolan", "općina Vrsi"]
127
+ RI: ["općina Lopar"]
128
+ coverage_lost:
129
+ ŽU: ["općina Gunja", "općina Vrbanja"]
130
+ promotions:
131
+ KT: "Popovača promoted to grad; Jasenovac demoted from grad to općina"
132
+ PŽ: "Kutjevo promoted from općina to grad"
133
+ VK: "Otok promoted from općina to grad"
134
+ ZG: "Sveta Nedelja (općina) becomes the grad Sveta Nedjelja — a spelling change as well as a promotion"
135
+ annex_defects_reproduced:
136
+ - "KT lists Popovača TWICE in the 2017 annex — once as a grad and once as an općina. Reproduced as printed; not silently deduplicated."
137
+ - "VŽ prints the općina as 'Martijabec' in the 2017 annex where the 2008 annex printed 'Donji Martijanec'. Read as a typo in the instrument, reproduced as a finding rather than corrected (the at-districts 'BH- Tamsweg' precedent)."
138
+ - "Casing drifts between the two annexes ('Dubrovačko Primorje'/'Dubrovačko primorje', 'Vinodolska Općina'/'Vinodolska općina', 'Zlatar-Bistrica'/'Zlatar Bistrica'). The 2017 spelling is the one carried below."
139
+ gap: "per-row (per-code and per-municipality) validity periods. The annex is republished whole and carries no dates of its own."
140
+
141
+ # ---------------------------------------------------------------------------
142
+ # PRILOG 1 — the 34 codes, in the annex's own order and numbering.
143
+ # `towns` = gradovi, `municipalities` = općine, verbatim from the annex.
144
+ # ---------------------------------------------------------------------------
145
+ codes:
146
+ - code: "BJ"
147
+ code_ascii: "BJ"
148
+ annex_no: 1
149
+ towns: ["Bjelovar", "Čazma", "Garešnica"]
150
+ municipalities: ["Berek", "Hercegovac", "Ivanska", "Kapela", "Nova Rača", "Rovišće", "Severin", "Šandrovac", "Štefanje", "Velika Pisanica", "Velika Trnovitica", "Veliko Trojstvo", "Zrinski Topolovac"]
151
+ - code: "BM"
152
+ code_ascii: "BM"
153
+ annex_no: 2
154
+ towns: ["Beli Manastir"]
155
+ municipalities: ["Bilje", "Čeminac", "Darda", "Draž", "Jagodnjak", "Kneževi Vinogradi", "Petlovac", "Popovac"]
156
+ - code: "ČK"
157
+ code_ascii: "CK"
158
+ annex_no: 3
159
+ towns: ["Čakovec", "Mursko Središće", "Prelog"]
160
+ municipalities: ["Belica", "Dekanovec", "Domašinec", "Donja Dubrava", "Donji Kraljevec", "Donji Vidovec", "Goričan", "Gornji Mihaljevec", "Kotoriba", "Mala Subotica", "Nedelišće", "Orehovica", "Podturen", "Pribislavec", "Selnica", "Strahoninec", "Sveta Marija", "Sveti Juraj na Bregu", "Sveti Martin na Muri", "Šenkovec", "Štrigova", "Vratišinec"]
161
+ - code: "DA"
162
+ code_ascii: "DA"
163
+ annex_no: 4
164
+ towns: ["Daruvar", "Grubišno Polje", "Lipik", "Pakrac"]
165
+ municipalities: ["Dežanovac", "Đulovac", "Končanica", "Sirač", "Veliki Grđevac"]
166
+ - code: "DE"
167
+ code_ascii: "DE"
168
+ annex_no: 5
169
+ towns: ["Čabar", "Delnice"]
170
+ municipalities: ["Brod Moravice", "Fužine", "Lokve", "Mrkopalj", "Ravna Gora", "Skrad"]
171
+ - code: "DJ"
172
+ code_ascii: "DJ"
173
+ annex_no: 6
174
+ towns: ["Đakovo"]
175
+ municipalities: ["Drenje", "Gorjani", "Levanjska Varoš", "Punitovci", "Satnica Đakovačka", "Semeljci", "Strizivojna", "Trnava", "Viškovci"]
176
+ - code: "DU"
177
+ code_ascii: "DU"
178
+ annex_no: 7
179
+ towns: ["Dubrovnik", "Korčula", "Metković", "Opuzen", "Ploče"]
180
+ municipalities: ["Blato", "Dubrovačko primorje", "Janjina", "Konavle", "Kula Norinska", "Lastovo", "Lumbarda", "Mljet", "Orebić", "Pojezerje", "Slivno", "Smokvica", "Ston", "Trpanj", "Vela Luka", "Zažablje", "Župa dubrovačka"]
181
+ - code: "GS"
182
+ code_ascii: "GS"
183
+ annex_no: 8
184
+ towns: ["Gospić", "Novalja", "Otočac", "Senj"]
185
+ municipalities: ["Brinje", "Donji Lapac", "Karlobag", "Lovinac", "Perušić", "Plitvička Jezera", "Udbina", "Vrhovine"]
186
+ - code: "IM"
187
+ code_ascii: "IM"
188
+ annex_no: 9
189
+ towns: ["Imotski"]
190
+ municipalities: ["Cista Provo", "Lokvičići", "Lovreć", "Podbablje", "Proložac", "Runovići", "Zagvozd", "Zmijavci"]
191
+ - code: "KA"
192
+ code_ascii: "KA"
193
+ annex_no: 10
194
+ towns: ["Duga Resa", "Karlovac", "Ozalj", "Slunj"]
195
+ municipalities: ["Barilovići", "Bosiljevo", "Cetingrad", "Draganić", "Generalski Stol", "Kamanje", "Krnjak", "Lasinja", "Netretić", "Rakovica", "Ribnik", "Vojnić", "Žakanje"]
196
+ - code: "KC"
197
+ code_ascii: "KC"
198
+ annex_no: 11
199
+ towns: ["Đurđevac", "Koprivnica"]
200
+ municipalities: ["Drnje", "Đelekovec", "Ferdinandovac", "Gola", "Hlebine", "Kalinovac", "Kloštar Podravski", "Koprivnički Bregi", "Koprivnički Ivanec", "Legrad", "Molve", "Novigrad Podravski", "Novo Virje", "Peteranec", "Podravske Sesvete", "Rasinja", "Sokolovac", "Virje"]
201
+ - code: "KR"
202
+ code_ascii: "KR"
203
+ annex_no: 12
204
+ towns: ["Donja Stubica", "Klanjec", "Krapina", "Oroslavje", "Pregrada", "Zabok", "Zlatar"]
205
+ municipalities: ["Bedekovčina", "Budinščina", "Desinić", "Đurmanec", "Gornja Stubica", "Hrašćina", "Hum na Sutli", "Jesenje", "Konjščina", "Kraljevec na Sutli", "Krapinske Toplice", "Kumrovec", "Lobor", "Mače", "Marija Bistrica", "Mihovljan", "Novi Golubovec", "Petrovsko", "Radoboj", "Stubičke Toplice", "Sveti Križ Začretje", "Tuhelj", "Veliko Trgovišće", "Zagorska Sela", "Zlatar Bistrica"]
206
+ - code: "KT"
207
+ code_ascii: "KT"
208
+ annex_no: 13
209
+ towns: ["Kutina", "Novska", "Popovača"]
210
+ municipalities: ["Jasenovac", "Lipovljani", "Popovača", "Velika Ludina"]
211
+ - code: "KŽ"
212
+ code_ascii: "KZ"
213
+ annex_no: 14
214
+ towns: ["Križevci"]
215
+ municipalities: ["Gornja Rijeka", "Kalnik", "Sveti Ivan Žabno", "Sveti Petar Orehovec"]
216
+ - code: "MA"
217
+ code_ascii: "MA"
218
+ annex_no: 15
219
+ towns: ["Makarska", "Vrgorac"]
220
+ municipalities: ["Baška Voda", "Brela", "Gradac", "Podgora", "Tučepi"]
221
+ - code: "NA"
222
+ code_ascii: "NA"
223
+ annex_no: 16
224
+ towns: ["Donji Miholjac", "Našice"]
225
+ municipalities: ["Donja Motičina", "Đurđenovac", "Feričanci", "Koška", "Magadenovac", "Marijanci", "Podgorač", "Podravska Moslavina", "Viljevo"]
226
+ - code: "NG"
227
+ code_ascii: "NG"
228
+ annex_no: 17
229
+ towns: ["Nova Gradiška"]
230
+ municipalities: ["Cernik", "Davor", "Dragalić", "Gornji Bogićevci", "Nova Kapela", "Okučani", "Rešetari", "Stara Gradiška", "Staro Petrovo Selo", "Vrbje"]
231
+ - code: "OG"
232
+ code_ascii: "OG"
233
+ annex_no: 18
234
+ towns: ["Ogulin"]
235
+ municipalities: ["Josipdol", "Plaški", "Saborsko", "Tounj"]
236
+ - code: "OS"
237
+ code_ascii: "OS"
238
+ annex_no: 19
239
+ towns: ["Belišće", "Osijek", "Valpovo"]
240
+ municipalities: ["Antunovac", "Bizovac", "Čepin", "Erdut", "Ernestinovo", "Petrijevci", "Šodolovci", "Vladislavci", "Vuka"]
241
+ - code: "PU"
242
+ code_ascii: "PU"
243
+ annex_no: 20
244
+ towns: ["Buje", "Buzet", "Labin", "Novigrad", "Pazin", "Poreč", "Pula", "Rovinj", "Umag", "Vodnjan"]
245
+ municipalities: ["Bale", "Barban", "Brtonigla", "Cerovlje", "Fažana", "Guntana", "Gračišće", "Grožnjan", "Kanfanar", "Karojba", "Kaštelir-Labinci", "Kršan", "Lanišće", "Ližnjan", "Lupoglav", "Marčana", "Medulin", "Motovun", "Oprtalj", "Pićan", "Raša", "Sveta Nedelja", "Sveti Lovreč", "Sveti Petar u Šumi", "Svetvinčenat", "Tar-Vabriga", "Tinjan", "Višnjan", "Vižinada", "Vrsar", "Žminj"]
246
+ - code: "PŽ"
247
+ code_ascii: "PZ"
248
+ annex_no: 21
249
+ towns: ["Kutjevo", "Pleternica", "Požega"]
250
+ municipalities: ["Brestovac", "Čaglin", "Jakšić", "Kaptol", "Velika"]
251
+ - code: "RI"
252
+ code_ascii: "RI"
253
+ annex_no: 22
254
+ towns: ["Bakar", "Cres", "Crikvenica", "Kastav", "Kraljevica", "Krk", "Mali Lošinj", "Novi Vinodolski", "Opatija", "Rab", "Rijeka", "Vrbovsko"]
255
+ municipalities: ["Baška", "Čavle", "Dobrinj", "Jelenje", "Klana", "Kostrena", "Lopar", "Lovran", "Malinska-Dubašnica", "Matulji", "Mošćenička Draga", "Omišalj", "Punat", "Vinodolska općina", "Viškovo", "Vrbnik"]
256
+ - code: "SB"
257
+ code_ascii: "SB"
258
+ annex_no: 23
259
+ towns: ["Slavonski Brod"]
260
+ municipalities: ["Bebrina", "Brodski Stupnik", "Bukovlje", "Donji Andrijevci", "Garčin", "Gornja Vrba", "Gundinci", "Klakar", "Oprivsavci", "Oriovac", "Podcrkavlje", "Sibinj", "Sikirevci", "Slavonski Šamac", "Velika Kopanica", "Vrpolje"]
261
+ - code: "SK"
262
+ code_ascii: "SK"
263
+ annex_no: 24
264
+ towns: ["Glina", "Hrvatska Kostajnica", "Petrinja", "Sisak"]
265
+ municipalities: ["Donji Kukuruzari", "Dvor", "Gvozd", "Hrvatska Dubica", "Lekenik", "Majur", "Martinska Ves", "Sunja", "Topusko"]
266
+ - code: "SL"
267
+ code_ascii: "SL"
268
+ annex_no: 25
269
+ towns: ["Orahovica", "Slatina"]
270
+ municipalities: ["Crnac", "Čačinci", "Čađavica", "Mikleuš", "Nova Bukovica", "Sopje", "Voćin", "Zdenci"]
271
+ - code: "ST"
272
+ code_ascii: "ST"
273
+ annex_no: 26
274
+ towns: ["Hvar", "Kaštela", "Komiža", "Omiš", "Sinj", "Solin", "Split", "Stari Grad", "Supetar", "Trilj", "Trogir", "Vis", "Vrlika"]
275
+ municipalities: ["Bol", "Dicmo", "Dugi Rat", "Dugopolje", "Hrvace", "Jelsa", "Klis", "Lećevica", "Marina", "Milna", "Muć", "Nerežišća", "Okrug", "Otok", "Podstrana", "Postira", "Prgomet", "Primorski Dolac", "Pučišća", "Seget", "Selca", "Sućuraj", "Sutivan", "Šestanovac", "Šolta", "Zadvarje"]
276
+ - code: "ŠI"
277
+ code_ascii: "SI"
278
+ annex_no: 27
279
+ towns: ["Drniš", "Knin", "Skradin", "Šibenik", "Vodice"]
280
+ municipalities: ["Bilice", "Biskupija", "Civljane", "Ervenik", "Kijevo", "Kistanje", "Murter-Kornati", "Pirovac", "Primošten", "Promina", "Rogoznica", "Ružić", "Tisno", "Tribunj", "Unešić"]
281
+ - code: "VK"
282
+ code_ascii: "VK"
283
+ annex_no: 28
284
+ towns: ["Otok", "Vinkovci"]
285
+ municipalities: ["Andrijaševci", "Ivankovo", "Jarmina", "Markušica", "Nijemci", "Nuštar", "Privlaka", "Stari Jankovci", "Stari Mikanovci", "Tordinci", "Vođinci"]
286
+ - code: "VT"
287
+ code_ascii: "VT"
288
+ annex_no: 29
289
+ towns: ["Virovitica"]
290
+ municipalities: ["Gradina", "Lukač", "Pitomača", "Suhopolje", "Špišić Bukovica"]
291
+ - code: "VU"
292
+ code_ascii: "VU"
293
+ annex_no: 30
294
+ towns: ["Ilok", "Vukovar"]
295
+ municipalities: ["Bogdanovci", "Borovo", "Lovas", "Negoslavci", "Štitar", "Tompojevci", "Tovarnik", "Trpinja"]
296
+ - code: "VŽ"
297
+ code_ascii: "VZ"
298
+ annex_no: 31
299
+ towns: ["Ivanec", "Lepoglava", "Ludbreg", "Novi Marof", "Varaždin", "Varaždinske Toplice"]
300
+ municipalities: ["Bednja", "Beretinec", "Breznica", "Breznički Hum", "Cestica", "Donja Voća", "Gornji Kneginec", "Jalžabet", "Klenovnik", "Ljubešćica", "Mali Bukovec", "Martijabec", "Maruševec", "Petrijanec", "Sračinec", "Sveti Đurđ", "Sveti Ilija", "Trnovec Bartolovečki", "Veliki Bukovec", "Vidovec", "Vinica", "Visoko"]
301
+ - code: "ZD"
302
+ code_ascii: "ZD"
303
+ annex_no: 32
304
+ towns: ["Benkovac", "Biograd na Moru", "Nin", "Obrovac", "Pag", "Zadar"]
305
+ municipalities: ["Bibinje", "Galovac", "Gračac", "Jasenice", "Kali", "Kolan", "Kukljica", "Lišane Ostrovičke", "Novigrad", "Pakoštane", "Pašman", "Polača", "Poličnik", "Posedarje", "Povljana", "Preko", "Privlaka", "Ražanac", "Sali", "Stankovci", "Starigrad", "Sukošan", "Sveti Filip i Jakov", "Škabrnje", "Tkon", "Vir", "Vrsi", "Zemunik Donji"]
306
+ - code: "ZG"
307
+ code_ascii: "ZG"
308
+ annex_no: 33
309
+ towns: ["Zagreb", "Dugo Selo", "Ivanić-Grad", "Jastrebarsko", "Samobor", "Sveta Nedjelja", "Sveti Ivan Zelina", "Velika Gorica", "Vrbovec", "Zaprešić"]
310
+ municipalities: ["Bedenica", "Bistra", "Brckovljani", "Brdovec", "Dubrava", "Dubravica", "Farkaševac", "Gradec", "Jakovlje", "Klinča Sela", "Kloštar Ivanić", "Krašić", "Kravarsko", "Križ", "Luka", "Marija Gorica", "Orle", "Pisarovina", "Pokupsko", "Preseka", "Pušća", "Rakovec", "Rugvica", "Stupnik", "Žumberak"]
311
+ - code: "ŽU"
312
+ code_ascii: "ZU"
313
+ annex_no: 34
314
+ towns: ["Županja"]
315
+ municipalities: ["Babina Greda", "Bošnjaci", "Cerna", "Drenovci", "Gradište"]
@@ -0,0 +1,227 @@
1
+ # plates/_decode/ie-counties.yml — Irish index marks (the county/city identifier
2
+ # in the middle group of an Irish registration).
3
+ #
4
+ # THE SOURCE FINDING, and it is the Austrian result rather than the German one:
5
+ # THE IRISH INDEX-MARK LIST IS IN THE INSTRUMENTS, TWICE OVER, AND NOTHING BELOW
6
+ # COMES FROM A SECONDARY SOURCE. Two independent statutory tables enumerate it:
7
+ #
8
+ # * THE REGISTRATION TABLE — S.I. No. 445 of 1986 inserted "Part II" into the
9
+ # Schedule to the Road Vehicles (Index Marks) Regulations, 1958, allotting
10
+ # the new two-letter/one-letter marks to each licensing authority, and its
11
+ # new article 3 dates them to the day: "the index marks in Part I of the
12
+ # Schedule ... shall not be assigned to vehicles first registered on or
13
+ # after the 1st day of January, 1987 and the index marks in Part II ...
14
+ # shall be assigned to vehicles first registered on or after the 1st day of
15
+ # January, 1987." That table was then re-enacted, with the IRISH-LANGUAGE
16
+ # PLACENAME beside each mark, as the Table to paragraph 4 of the First
17
+ # Schedule to the Vehicle Registration and Taxation Regulations, 1992
18
+ # (S.I. No. 318 of 1992), and again in the First Schedule as substituted by
19
+ # S.I. No. 432 of 1999.
20
+ # * THE TRADE-LICENCE TABLE — Article 6(3)(a) of S.I. No. 409 of 1992 as
21
+ # substituted by S.I. No. 328 of 2013 and again by S.I. No. 243 of 2014.
22
+ # This is the ONLY instrument located in this pass that carries the
23
+ # POST-MERGER identifiers T (Tipperary), L (Limerick City and County) and
24
+ # W (Waterford City and County).
25
+ #
26
+ # THE DISCREPANCY IS REAL AND IS RECORDED, NOT AVERAGED (PRD-PLATES §5.3): the
27
+ # VRT First Schedule table still reads TN / TS / LK / L / WD / W and has never
28
+ # been amended to add T or to merge LK into L and WD into W, while the
29
+ # trade-licence table WAS amended for exactly that reason — S.I. 328/2013's own
30
+ # explanatory note: "These Regulations provide for a single identifier for trade
31
+ # licences issued in Limerick, Tipperary and Waterford." Every row below
32
+ # therefore carries `instruments:` naming which table it comes from, and the
33
+ # post-2014 rows carry `registration_plate_authority: trade-licence-table-only`
34
+ # so a consumer can see precisely how far the evidence reaches.
35
+ #
36
+ # Referenced by: plates/ie.yml (ie-standard-1987, ie-standard-1991,
37
+ # ie-standard-2013, ie-trade-1993) via region_encoding.
38
+ #
39
+ # PERIOD DISCIPLINE (PRD-PLATES §2.4): these are the marks assignable to
40
+ # vehicles FIRST REGISTERED on or after 1 January 1987. The pre-1987 marks are a
41
+ # different, disjoint set and are handled in `historic_pre_1987` below — they are
42
+ # NOT in `codes:` and a pre-1987 plate must never be decoded through it. Marks
43
+ # are not withdrawn from plates already issued: a 1988 TS plate stays a TS plate
44
+ # forever, which is why TN/TS/LK/WD remain decodable long after 2014.
45
+ jurisdiction: ie
46
+ topic: counties
47
+ authority:
48
+ name: "Road Vehicles (Index Marks) Regulations, 1958, Schedule Part II (inserted by S.I. No. 445 of 1986); Vehicle Registration and Taxation Regulations, 1992, First Schedule paragraph 4"
49
+ url: "https://www.irishstatutebook.ie/eli/1992/si/318/made/en/print"
50
+ sources:
51
+ - "https://www.irishstatutebook.ie/eli/1986/si/445/made/en/print # S.I. No. 445 of 1986, Road Vehicles (Index Marks) (Amendment) (No. 2) Regulations, 1986 — inserts Schedule Part II (the new marks, per licensing authority) and the new art. 3 dating them to first registrations on or after 01-01-1987; sealed 20-12-1986. Accessed 2026-08-02"
52
+ - "https://www.irishstatutebook.ie/eli/1992/si/318/made/en/print # S.I. No. 318 of 1992, First Schedule para. 4 TABLE 'INDEX MARKS AND CORRESPONDING PLACENAMES' — the same 29 marks with the Irish placename each plate must exhibit. Accessed 2026-08-02"
53
+ - "https://www.irishstatutebook.ie/eli/1999/si/432/made/en/print # S.I. No. 432 of 1999 — substitutes the whole First Schedule; the para. 4 table is re-enacted unchanged except the Offaly placename spelling (Úibh Fhailí -> Uibh Fhailí). Accessed 2026-08-02"
54
+ - "https://www.irishstatutebook.ie/eli/2013/si/328/made/en/print # S.I. No. 328 of 2013 — substitutes Art. 6(3)(a) of S.I. 409/1992 with a table giving T to BOTH Tipperary ridings, L to both Limerick authorities and W to both Waterford authorities; 'shall apply to trade licences issued for 2014 and subsequent years'. Accessed 2026-08-02"
55
+ - "https://www.irishstatutebook.ie/eli/2014/si/243/made/en/print # S.I. No. 243 of 2014 — substitutes that table again for the merged authority names (Limerick City and County, Tipperary, Waterford City and County); 'shall apply to trade licences issued on or after 01 June 2014'. Accessed 2026-08-02"
56
+ - "https://www.irishstatutebook.ie/eli/1958/si/14/made/en/print # S.I. No. 14 of 1958, Road Vehicles (Index Marks) Regulations, 1958 — the PRE-1987 Schedule (later Part I), quoted in historic_pre_1987 below. In operation 01-02-1958. Accessed 2026-08-02"
57
+ period: { start: 1987 }
58
+ period_evidence: instrument-in-force
59
+ period_note: >-
60
+ 1987 is not the date of the instrument (sealed 20 December 1986) but the date
61
+ the marks became assignable, stated in the instrument's own new article 3:
62
+ marks in Part II "shall be assigned to vehicles first registered on or after
63
+ the 1st day of January, 1987". Rows added later carry their own `since:`.
64
+
65
+ # A parse API needs this, and unlike Austria the Irish answer is clean.
66
+ maximal_munch: true
67
+ maximal_munch_note: >-
68
+ Take the LONGEST matching code — L vs LK vs LD vs LH vs LM vs LS, C vs CE vs
69
+ CN vs CW, T vs TN vs TS, W vs WD vs WH vs WW vs WX, D vs DL, K-prefixed KE/KK/
70
+ KY, M-prefixed MH/MN/MO. The split is nevertheless UNAMBIGUOUS even on
71
+ separator-stripped input, because the index mark is a pure letter run bounded
72
+ by digits on both sides: "121D12345" splits at the letter run "D" and nowhere
73
+ else. Irish marks are self-delimiting; the maximal-munch rule matters only for
74
+ the mark itself, never for finding its boundaries.
75
+
76
+ # The placename is not decoration: First Schedule para. 4 requires the plate to
77
+ # "exhibit the placename set out in the Table ... opposite the mention in the
78
+ # Table of the index mark on the plate". The spelling below is the CURRENT
79
+ # instrument's spelling; `placename_variants` records where instruments differ,
80
+ # because they do and a render layer has to pick one.
81
+ codes:
82
+ - { code: C, placename: "Corcaigh", county: "Cork", licensing_authority: "Cork County Council and the Lord Mayor, Aldermen and Burgesses of Cork", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
83
+ - { code: CE, placename: "An Clár", county: "Clare", licensing_authority: "Clare County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
84
+ - { code: CN, placename: "An Cabhán", county: "Cavan", licensing_authority: "Cavan County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
85
+ - { code: CW, placename: "Ceatharlach", county: "Carlow", licensing_authority: "Carlow County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
86
+ - { code: D, placename: "Baile Átha Cliath", county: "Dublin", licensing_authority: "Dublin County Council and the Right Honourable the Lord Mayor, Aldermen and Burgesses of Dublin", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014], placename_variants: ["Baile Atha Cliath (S.I. 328/2013 and S.I. 243/2014 print it without the fada on Atha)"] }
87
+ - { code: DL, placename: "Dún na nGall", county: "Donegal", licensing_authority: "Donegal County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
88
+ - { code: G, placename: "Gaillimh", county: "Galway", licensing_authority: "Galway County Council and the Mayor, Aldermen and Burgesses of Galway", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
89
+ - { code: KE, placename: "Cill Dara", county: "Kildare", licensing_authority: "Kildare County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
90
+ - { code: KK, placename: "Cill Chainnigh", county: "Kilkenny", licensing_authority: "Kilkenny County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
91
+ - { code: KY, placename: "Ciarraí", county: "Kerry", licensing_authority: "Kerry County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
92
+ - { code: L, placename: "Luimneach", county: "Limerick", licensing_authority: "The Mayor, Aldermen and Burgesses of Limerick (1986); Limerick City and County (from S.I. 243/2014)", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014], note: "L was the LIMERICK CITY mark from 1987 (LK was the county). S.I. 328/2013 gave L to both Limerick authorities for trade licences and S.I. 243/2014 renamed the holder 'Limerick City and County'. The VRT First Schedule table still carries L and LK as separate rows." }
93
+ - { code: LD, placename: "An Longfort", county: "Longford", licensing_authority: "Longford County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
94
+ - { code: LH, placename: "Lú", county: "Louth", licensing_authority: "Louth County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014], placename_variants: ["Lughbhaidh appears in some non-statutory usage; every instrument read in this pass prints Lú"] }
95
+ - { code: LK, placename: "Luimneach", county: "Limerick", licensing_authority: "Limerick County Council", instruments: [si-445-1986, si-318-1992, si-432-1999], superseded_by: L, superseded_note: "absent from the trade-licence table as substituted by S.I. 328/2013; still in the un-amended VRT First Schedule table. Plates issued under LK stay valid and decodable." }
96
+ - { code: LM, placename: "Liatroim", county: "Leitrim", licensing_authority: "Leitrim County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
97
+ - { code: LS, placename: "Laois", county: "Laois", licensing_authority: "Laoighis County Council (so spelled in S.I. 445/1986)", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
98
+ - { code: MH, placename: "An Mhí", county: "Meath", licensing_authority: "Meath County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
99
+ - { code: MN, placename: "Muineachán", county: "Monaghan", licensing_authority: "Monaghan County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
100
+ - { code: MO, placename: "Maigh Eo", county: "Mayo", licensing_authority: "Mayo County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
101
+ - { code: OY, placename: "Uíbh Fhailí", county: "Offaly", licensing_authority: "Offaly County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014], placename_variants: ["Úibh Fhailí (S.I. 318/1992)", "Uibh Fhailí (S.I. 432/1999)", "UÍBH FHAILÍ (S.I. 287/1990)", "Uíbh Fhailí (S.I. 328/2013, S.I. 243/2014)"] }
102
+ - { code: RN, placename: "Ros Comáin", county: "Roscommon", licensing_authority: "Roscommon County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
103
+ - { code: SO, placename: "Sligeach", county: "Sligo", licensing_authority: "Sligo County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
104
+ - { code: T, placename: "Tiobraid Árann", county: "Tipperary", licensing_authority: "Tipperary North / Tipperary South (S.I. 328/2013); Tipperary (S.I. 243/2014)", since: 2014, instruments: [si-328-2013, si-243-2014], registration_plate_authority: trade-licence-table-only, note: "THE ONLY MARK IN THIS TABLE WITH NO VRT INSTRUMENT. T is prescribed for TRADE LICENCE plates by S.I. 328/2013 (for licences issued for 2014 onwards) and S.I. 243/2014. No amendment adding T to the Table to paragraph 4 of the First Schedule to S.I. 318/1992 — the table that governs ordinary REGISTRATION plates — was located in a title-level sweep of the Irish Statute Book's annual S.I. indexes for 1990 to 2025 (by title, not full text; see plates/ie.yml, ie-standard-2013.notes for the grading). Its use on registration plates is therefore NOT established from an instrument here; see plates/ie.yml, ie-standard-2013.notes." }
105
+ - { code: TN, placename: "Tiobraid Árann", county: "Tipperary North Riding", licensing_authority: "Tipperary North Riding County Council", instruments: [si-445-1986, si-318-1992, si-432-1999], superseded_by: T, superseded_note: "absent from the trade-licence table as substituted by S.I. 328/2013; still in the un-amended VRT First Schedule table." }
106
+ - { code: TS, placename: "Tiobraid Árann", county: "Tipperary South Riding", licensing_authority: "Tipperary South Riding County Council", instruments: [si-445-1986, si-318-1992, si-432-1999], superseded_by: T, superseded_note: "as TN" }
107
+ - { code: W, placename: "Port Láirge", county: "Waterford", licensing_authority: "The Mayor, Aldermen and Burgesses of Waterford (1986); Waterford City and County (from S.I. 243/2014)", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014], note: "W was the WATERFORD CITY mark from 1987 (WD was the county), on the same pattern as L/LK." }
108
+ - { code: WD, placename: "Port Láirge", county: "Waterford", licensing_authority: "Waterford County Council", instruments: [si-445-1986, si-318-1992, si-432-1999], superseded_by: W, superseded_note: "as LK" }
109
+ - { code: WH, placename: "An Iarmhí", county: "Westmeath", licensing_authority: "Westmeath County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
110
+ - { code: WW, placename: "Cill Mhantáin", county: "Wicklow", licensing_authority: "Wicklow County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
111
+ - { code: WX, placename: "Loch Garman", county: "Wexford", licensing_authority: "Wexford County Council", instruments: [si-445-1986, si-318-1992, si-432-1999, si-328-2013, si-243-2014] }
112
+
113
+ instrument_key:
114
+ si-445-1986: "S.I. No. 445 of 1986 — Road Vehicles (Index Marks) (Amendment) (No. 2) Regulations, 1986, Schedule Part II. Marks assignable to vehicles first registered on or after 01-01-1987."
115
+ si-318-1992: "S.I. No. 318 of 1992 — Vehicle Registration and Taxation Regulations, 1992, First Schedule para. 4 Table. Reg. 9 in operation 01-01-1993 (Reg. 3)."
116
+ si-432-1999: "S.I. No. 432 of 1999 — Vehicle Registration and Taxation (Amendment) Regulations, 1999, substituting the First Schedule; sealed 22-12-1999."
117
+ si-328-2013: "S.I. No. 328 of 2013 — trade-licence table, applying to trade licences issued for 2014 and subsequent years."
118
+ si-243-2014: "S.I. No. 243 of 2014 — trade-licence table, applying to trade licences issued on or after 01-06-2014."
119
+
120
+ not_in_this_table:
121
+ - "ZV — the vintage-vehicle mark (S.I. 318/1992 Reg. 9(1)(d), re-enacted as Reg. 9(1A)(e) by S.I. 542/2012). It is an index mark in the statute's own words but it encodes AGE, not geography, and carries no placename."
122
+ - "ZZ — the temporary registration mark for non-residents. Not geographic; no instrument prescribing it was located (see plates/ie.yml, ie-temporary-zz)."
123
+ - "Galway city, Dún Laoghaire, and the post-2014 city/county councils generally: Ireland allots ONE mark per licensing authority AREA, and city/county pairs share a mark (C, D, G) or held adjacent marks (L/LK, W/WD). There is no separate city code beyond that pair."
124
+
125
+ # ---------------------------------------------------------------------------
126
+ # THE PRE-1987 SYSTEM. A different, disjoint set of marks, and deliberately NOT
127
+ # authored row-by-row — what is authored is the base table plus the expansion
128
+ # RULE, which is stronger than a partial list.
129
+ # ---------------------------------------------------------------------------
130
+ historic_pre_1987:
131
+ period: { start: 1958, end: 1987 }
132
+ period_evidence: instrument-in-force
133
+ period_note: >-
134
+ 1958 dates the CONSOLIDATED LIST read below (S.I. No. 14 of 1958, in
135
+ operation 1 February 1958), not the system: the marks themselves descend
136
+ from registrations under the Motor Car Act, 1903 and the Roads Act, 1920,
137
+ and the 1958 regulations' own explanatory note says they "replace a number
138
+ of orders (now revoked)". Those pre-1958 orders were not fetched — recorded
139
+ gap. The end is exact: S.I. 445/1986's new art. 3 stops these marks being
140
+ assigned to vehicles first registered on or after 1 January 1987.
141
+ base_table_source: "https://www.irishstatutebook.ie/eli/1958/si/14/made/en/print # S.I. No. 14 of 1958, Schedule (later renamed Part I by S.I. 445/1986). Accessed 2026-08-02"
142
+ stems:
143
+ - { marks: [IC], authority: "Carlow County Council" }
144
+ - { marks: [ID], authority: "Cavan County Council" }
145
+ - { marks: [IE], authority: "Clare County Council" }
146
+ - { marks: [IF, ZB, ZK, ZT], authority: "Cork County Council" }
147
+ - { marks: [IH, ZP], authority: "Donegal County Council" }
148
+ - { marks: [IK, RI, YI, Z, ZA, ZC, ZE, ZI, ZD, ZH, ZJ, ZL, ZO, ZU], authority: "Dublin County Council and The Right Honourable the Lord Mayor, Aldermen and Burgesses of Dublin" }
149
+ - { marks: [IM, ZM], authority: "Galway County Council" }
150
+ - { marks: [IN, ZX], authority: "Kerry County Council" }
151
+ - { marks: [IO, ZW], authority: "Kildare County Council" }
152
+ - { marks: [IP], authority: "Kilkenny County Council" }
153
+ - { marks: [CI], authority: "Laoighis County Council" }
154
+ - { marks: [IT], authority: "Leitrim County Council" }
155
+ - { marks: [IU], authority: "Limerick County Council" }
156
+ - { marks: [IX], authority: "Longford County Council" }
157
+ - { marks: [IY, ZY], authority: "Louth County Council" }
158
+ - { marks: [IZ], authority: "Mayo County Council" }
159
+ - { marks: [AI, ZN], authority: "Meath County Council" }
160
+ - { marks: [BI], authority: "Monaghan County Council" }
161
+ - { marks: [IR], authority: "Offaly County Council" }
162
+ - { marks: [DI], authority: "Roscommon County Council" }
163
+ - { marks: [EI], authority: "Sligo County Council" }
164
+ - { marks: [FI], authority: "Tipperary, North Riding County Council" }
165
+ - { marks: [HI], authority: "Tipperary, South Riding County Council" }
166
+ - { marks: [KI], authority: "Waterford County Council" }
167
+ - { marks: [LI], authority: "Westmeath County Council" }
168
+ - { marks: [MI, ZR], authority: "Wexford County Council" }
169
+ - { marks: [NI], authority: "Wicklow County Council" }
170
+ - { marks: [PI, ZF], authority: "The Lord Mayor, Aldermen and Burgesses of Cork" }
171
+ - { marks: [TI], authority: "The Mayor, Aldermen and Burgesses of Limerick" }
172
+ - { marks: [WI], authority: "The Mayor, Aldermen and Burgesses of Waterford" }
173
+ stems_added_later:
174
+ - { marks: [SI, ZG, ZS, ZV], authority: "Dublin County Council and the Lord Mayor, Aldermen and Burgesses of Dublin", instrument: "S.I. No. 6 of 1986, sealed 19-01-1986", note: "ZV here is the pre-1987 DUBLIN ordinary mark. The post-1992 ZV vintage series re-uses the same two letters for a different purpose entirely — a collision a parse API must carry. Note also the ORDER: S.I. 231/1981 allotted the three-letter expansions ASI..ZSI, AZG..YZG, AZS..YZS and AZV..YZV five years BEFORE S.I. 6/1986 allotted the two-letter stems SI, ZG, ZS and ZV themselves. The expansion rule below is a decode rule, not a chronology." }
175
+ - { marks: [ZZP], authority: "Donegal County Council", instrument: "S.I. No. 28 of 1982, sealed 23-02-1982", note: "the one four-character outlier: a leading Z on the ZP stem, i.e. the expansion rule applied to a two-letter stem that itself begins with Z." }
176
+ three_letter_expansion_rule: >-
177
+ THE THREE-LETTER MARKS ARE STEM + ONE LEADING LETTER, AND THAT IS HOW TO
178
+ DECODE THEM. Every three-letter mark in the fourteen amending instruments
179
+ listed below is formed by prefixing a single letter to a two-letter stem
180
+ already allotted to the same authority: AIC..ZIC to Carlow's IC, AZA..YZA
181
+ and AZC..YZC and AZE..YZE and AZH..YZH and AZI..YZI and AZJ..YZJ and
182
+ AZL..YZL and AZO..YZO and AZU..YZU and AZG/AZS/AZV series to Dublin's ZA/ZC/
183
+ ZE/ZH/ZI/ZJ/ZL/ZO/ZU/ZG/ZS/ZV, KPI..ZPI and AZF..LZF to Cork City's PI/ZF,
184
+ ATI..ZTI to Limerick City's TI, AWI..JWI to Waterford City's WI, and so on
185
+ for every county. So: STRIP THE LEADING LETTER, LOOK UP THE REMAINING TWO
186
+ (or, for a two-letter mark, look it up directly).
187
+ EPISTEMIC LABEL, stated because it matters: this rule is an INDUCTION over
188
+ the fourteen instruments read in this pass, every one of which conforms
189
+ without exception. NO INSTRUMENT STATES IT. It is not law, it is a reliable
190
+ regularity, and a parse API must treat a non-conforming mark as unresolved
191
+ rather than forcing it.
192
+ exhaustive_list_status: not-authored
193
+ exhaustive_list_note: >-
194
+ The complete pre-1987 mark list is the 1958 Schedule as amended fourteen
195
+ times, and merging those fourteen insertions row-by-row is gate-L4 work
196
+ (PRD-PLATES §7). It is deliberately NOT half-done here: a partial list read
197
+ as complete would make a parse API declare real plates invalid, which is
198
+ worse than declaring them unresolved. The amending instruments, all read and
199
+ all conforming to the expansion rule above, are pinned so the merge can be
200
+ done later without re-discovery.
201
+ amending_instruments:
202
+ - "https://www.irishstatutebook.ie/eli/1959/si/8/made/en/print # S.I. 8/1959 — Clare"
203
+ - "https://www.irishstatutebook.ie/eli/1959/si/107/made/en/print # S.I. 107/1959 — Dublin, Westmeath"
204
+ - "https://www.irishstatutebook.ie/eli/1959/si/136/made/en/print # S.I. 136/1959 — Limerick City, Galway, Sligo"
205
+ - "https://www.irishstatutebook.ie/eli/1960/si/46/made/en/print # S.I. 46/1960 — Laoighis, Offaly, Monaghan"
206
+ - "https://www.irishstatutebook.ie/eli/1960/si/244/made/en/print # S.I. 244/1960 — Dublin, Waterford, Wexford"
207
+ - "https://www.irishstatutebook.ie/eli/1961/si/283/made/en/print # S.I. 283/1961 — ten authorities"
208
+ - "https://www.irishstatutebook.ie/eli/1963/si/69/made/en/print # S.I. 69/1963 — Dublin"
209
+ - "https://www.irishstatutebook.ie/eli/1964/si/8/made/en/print # S.I. 8/1964 — Dublin, Cork City, Carlow, Louth"
210
+ - "https://www.irishstatutebook.ie/eli/1965/si/30/made/en/print # S.I. 30/1965 — eight authorities"
211
+ - "https://www.irishstatutebook.ie/eli/1967/si/128/made/en/print # S.I. 128/1967 — Dublin, Tipperary North Riding"
212
+ - "https://www.irishstatutebook.ie/eli/1968/si/121/made/en/print # S.I. 121/1968 — Dublin, Cork City, Limerick City, Kerry, Westmeath"
213
+ - "https://www.irishstatutebook.ie/eli/1970/si/101/made/en/print # S.I. 101/1970 — the largest single amendment, thirteen or more authorities"
214
+ - "https://www.irishstatutebook.ie/eli/1981/si/231/made/en/print # S.I. 231/1981 — Dublin, Limerick, Mayo, Tipperary South Riding"
215
+ - "https://www.irishstatutebook.ie/eli/1982/si/28/made/en/print # S.I. 28/1982 — Donegal (ZZP)"
216
+ - "https://www.irishstatutebook.ie/eli/1986/si/6/made/en/print # S.I. 6/1986 — Dublin (SI, ZG, ZS, ZV)"
217
+ skipped_letters_folklore: >-
218
+ FOLKLORE FLAG, recorded not repeated: the widely circulated claim that the
219
+ letters G, S and V were "skipped, as these were intended for Scotland" is
220
+ NOT stated in any instrument read in this pass. What the instruments show is
221
+ narrower and different: the 1958 Schedule contains no TWO-letter mark
222
+ beginning with G, S or V — but it is full of THREE-letter marks that do
223
+ (GYI, SYI, VYI, all Dublin), and S.I. No. 6 of 1986 later allotted the
224
+ two-letter mark SI to Dublin outright. So no permanent reservation is
225
+ observable in the primary record. The claim is recorded here as unverified
226
+ and is not asserted by this file; establishing or refuting it needs the
227
+ pre-1958 orders the 1958 regulations revoked, which were not fetched.