vehicles 0.4.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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +321 -0
  4. data/README.md +88 -15
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +10 -0
  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/es-provinces.yml +116 -0
  14. data/data/plates/_decode/fr-departements.yml +191 -0
  15. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  16. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  17. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  18. data/data/plates/_decode/hr-cities.yml +315 -0
  19. data/data/plates/_decode/ie-counties.yml +227 -0
  20. data/data/plates/_decode/in-state-codes.yml +169 -0
  21. data/data/plates/_decode/is-districts-1938.yml +116 -0
  22. data/data/plates/_decode/it-provinces.yml +348 -0
  23. data/data/plates/_decode/jp-office-marks.yml +960 -0
  24. data/data/plates/_decode/jp-use-marks.yml +205 -0
  25. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  26. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  27. data/data/plates/_decode/lu-series-order.yml +638 -0
  28. data/data/plates/_decode/mx-entity-series.yml +380 -0
  29. data/data/plates/_decode/my-index-marks.yml +271 -0
  30. data/data/plates/_decode/no-counties-1913.yml +148 -0
  31. data/data/plates/_decode/no-districts.yml +901 -0
  32. data/data/plates/_decode/pl-powiats.yml +567 -0
  33. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  34. data/data/plates/_decode/ro-counties.yml +213 -0
  35. data/data/plates/_decode/se-diplomatic.yml +220 -0
  36. data/data/plates/_decode/si-regions.yml +123 -0
  37. data/data/plates/_decode/sk-districts.yml +314 -0
  38. data/data/plates/_decode/th-registration-elements.yml +208 -0
  39. data/data/plates/_decode/ua-regions.yml +393 -0
  40. data/data/plates/_decode/za-licence-marks.yml +215 -0
  41. data/data/plates/_meta/classes.yml +26 -0
  42. data/data/plates/_meta/separators.yml +102 -0
  43. data/data/plates/ad.yml +961 -0
  44. data/data/plates/ar.yml +762 -0
  45. data/data/plates/at.yml +1424 -0
  46. data/data/plates/au-act.yml +472 -0
  47. data/data/plates/au-nsw.yml +282 -0
  48. data/data/plates/au-nt.yml +431 -0
  49. data/data/plates/au-qld.yml +272 -0
  50. data/data/plates/au-sa.yml +248 -0
  51. data/data/plates/au-tas.yml +302 -0
  52. data/data/plates/au-vic.yml +215 -0
  53. data/data/plates/au-wa.yml +309 -0
  54. data/data/plates/be.yml +1840 -0
  55. data/data/plates/br.yml +1152 -0
  56. data/data/plates/ca-ab.yml +430 -0
  57. data/data/plates/ca-bc.yml +697 -0
  58. data/data/plates/ca-mb.yml +499 -0
  59. data/data/plates/ca-nb.yml +537 -0
  60. data/data/plates/ca-nl.yml +743 -0
  61. data/data/plates/ca-ns.yml +808 -0
  62. data/data/plates/ca-nt.yml +610 -0
  63. data/data/plates/ca-nu.yml +280 -0
  64. data/data/plates/ca-on.yml +881 -0
  65. data/data/plates/ca-pe.yml +592 -0
  66. data/data/plates/ca-qc.yml +1036 -0
  67. data/data/plates/ca-sk.yml +256 -0
  68. data/data/plates/ca-yt.yml +656 -0
  69. data/data/plates/ch.yml +1273 -0
  70. data/data/plates/cn.yml +1431 -0
  71. data/data/plates/cy.yml +688 -0
  72. data/data/plates/cz.yml +1179 -0
  73. data/data/plates/de.yml +1107 -0
  74. data/data/plates/dk.yml +1647 -0
  75. data/data/plates/ee.yml +1275 -0
  76. data/data/plates/es.yml +888 -0
  77. data/data/plates/fi.yml +1271 -0
  78. data/data/plates/fr.yml +1265 -0
  79. data/data/plates/gb.yml +1188 -0
  80. data/data/plates/gr.yml +721 -0
  81. data/data/plates/hr.yml +860 -0
  82. data/data/plates/hu.yml +959 -0
  83. data/data/plates/ie.yml +775 -0
  84. data/data/plates/in.yml +1172 -0
  85. data/data/plates/is.yml +667 -0
  86. data/data/plates/it.yml +1317 -0
  87. data/data/plates/jp.yml +3650 -0
  88. data/data/plates/kr.yml +1375 -0
  89. data/data/plates/li.yml +1010 -0
  90. data/data/plates/lt.yml +879 -0
  91. data/data/plates/lu.yml +842 -0
  92. data/data/plates/lv.yml +924 -0
  93. data/data/plates/mc.yml +1024 -0
  94. data/data/plates/mt.yml +854 -0
  95. data/data/plates/mx.yml +1372 -0
  96. data/data/plates/my.yml +685 -0
  97. data/data/plates/nl.yml +1016 -0
  98. data/data/plates/no.yml +1018 -0
  99. data/data/plates/nz.yml +1699 -0
  100. data/data/plates/pl.yml +1296 -0
  101. data/data/plates/pt.yml +847 -0
  102. data/data/plates/ro.yml +785 -0
  103. data/data/plates/se.yml +1091 -0
  104. data/data/plates/si.yml +1105 -0
  105. data/data/plates/sk.yml +1439 -0
  106. data/data/plates/sm.yml +1119 -0
  107. data/data/plates/th.yml +1150 -0
  108. data/data/plates/ua.yml +1672 -0
  109. data/data/plates/us-ak.yml +763 -0
  110. data/data/plates/us-al.yml +457 -0
  111. data/data/plates/us-ar.yml +427 -0
  112. data/data/plates/us-as.yml +454 -0
  113. data/data/plates/us-az.yml +430 -0
  114. data/data/plates/us-ca.yml +892 -0
  115. data/data/plates/us-co.yml +452 -0
  116. data/data/plates/us-ct.yml +427 -0
  117. data/data/plates/us-dc.yml +614 -0
  118. data/data/plates/us-de.yml +551 -0
  119. data/data/plates/us-fl.yml +741 -0
  120. data/data/plates/us-ga.yml +644 -0
  121. data/data/plates/us-gu.yml +658 -0
  122. data/data/plates/us-hi.yml +585 -0
  123. data/data/plates/us-ia.yml +438 -0
  124. data/data/plates/us-id.yml +531 -0
  125. data/data/plates/us-il.yml +516 -0
  126. data/data/plates/us-in.yml +324 -0
  127. data/data/plates/us-ks.yml +351 -0
  128. data/data/plates/us-ky.yml +770 -0
  129. data/data/plates/us-la.yml +568 -0
  130. data/data/plates/us-ma.yml +379 -0
  131. data/data/plates/us-md.yml +536 -0
  132. data/data/plates/us-me.yml +445 -0
  133. data/data/plates/us-mi.yml +408 -0
  134. data/data/plates/us-mn.yml +411 -0
  135. data/data/plates/us-mo.yml +356 -0
  136. data/data/plates/us-mp.yml +402 -0
  137. data/data/plates/us-ms.yml +432 -0
  138. data/data/plates/us-mt.yml +619 -0
  139. data/data/plates/us-nc.yml +602 -0
  140. data/data/plates/us-nd.yml +419 -0
  141. data/data/plates/us-ne.yml +483 -0
  142. data/data/plates/us-nh.yml +394 -0
  143. data/data/plates/us-nj.yml +547 -0
  144. data/data/plates/us-nm.yml +574 -0
  145. data/data/plates/us-nv.yml +655 -0
  146. data/data/plates/us-ny.yml +592 -0
  147. data/data/plates/us-oh.yml +404 -0
  148. data/data/plates/us-ok.yml +513 -0
  149. data/data/plates/us-or.yml +392 -0
  150. data/data/plates/us-pa.yml +506 -0
  151. data/data/plates/us-pr.yml +507 -0
  152. data/data/plates/us-ri.yml +445 -0
  153. data/data/plates/us-sc.yml +605 -0
  154. data/data/plates/us-sd.yml +428 -0
  155. data/data/plates/us-tn.yml +471 -0
  156. data/data/plates/us-tx.yml +535 -0
  157. data/data/plates/us-ut.yml +384 -0
  158. data/data/plates/us-va.yml +567 -0
  159. data/data/plates/us-vi.yml +489 -0
  160. data/data/plates/us-vt.yml +458 -0
  161. data/data/plates/us-wa.yml +484 -0
  162. data/data/plates/us-wi.yml +509 -0
  163. data/data/plates/us-wv.yml +446 -0
  164. data/data/plates/us-wy.yml +523 -0
  165. data/data/plates/va.yml +604 -0
  166. data/data/plates/za.yml +1141 -0
  167. data/data/vehicles.json +160653 -105090
  168. data/lib/vehicles/configuration.rb +18 -2
  169. data/lib/vehicles/dataset.rb +73 -18
  170. data/lib/vehicles/fuzzy.rb +115 -0
  171. data/lib/vehicles/http.rb +48 -0
  172. data/lib/vehicles/make.rb +36 -6
  173. data/lib/vehicles/mcp_server.rb +5 -5
  174. data/lib/vehicles/model.rb +42 -6
  175. data/lib/vehicles/plates/jurisdiction.rb +32 -0
  176. data/lib/vehicles/plates/series.rb +291 -0
  177. data/lib/vehicles/plates/template_fill.rb +188 -0
  178. data/lib/vehicles/plates/templates.rb +162 -0
  179. data/lib/vehicles/plates.rb +122 -0
  180. data/lib/vehicles/providers/hosted_provider.rb +49 -58
  181. data/lib/vehicles/providers/local_provider.rb +4 -3
  182. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  183. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  184. data/lib/vehicles/version.rb +1 -1
  185. data/lib/vehicles.rb +53 -16
  186. data/rakelib/data_refresh.rake +109 -0
  187. data/rakelib/plates_refresh.rake +29 -0
  188. data/sig/vehicles.rbs +18 -0
  189. metadata +174 -2
@@ -0,0 +1,96 @@
1
+ # plates/_decode/pt-trailer-services.yml — the Portuguese TRAILER registration
2
+ # prefixes: the issuing regional service, one or two letters.
3
+ #
4
+ # This is the one place geography survives on a Portuguese plate. Car, motorcycle
5
+ # and moped numbers carry none at all — the national car series is purely
6
+ # sequential — but a Portuguese trailer number is, verbatim from the statute,
7
+ # "uma ou duas letras identificadoras do serviço regional que procedeu à
8
+ # matrícula, seguidas de um número de ordem" (Regulamento de Matrícula, art. 4.º
9
+ # n.º 1). The letters are the district office that issued it, not the trailer's
10
+ # home district and not the towing vehicle's.
11
+ #
12
+ # THE TABLE IS A STATUTORY ANNEX, and it was AMENDED ONCE, which is why this
13
+ # file carries two vintages instead of one:
14
+ #
15
+ # * Decreto-Lei n.º 54/2005, de 3 de março — ANEXO I as originally enacted.
16
+ # 22 rows. Viseu is "VS".
17
+ # * Decreto-Lei n.º 106/2006, de 8 de junho, art. 1.º n.º 3 — replaces
18
+ # Anexo I wholesale. Same 22 districts, same 21 codes, and Viseu is "VI".
19
+ #
20
+ # The Viseu change is recorded, not averaged, and not treated as a misprint:
21
+ # both readings were taken from the Diário da República page images (the 2005
22
+ # facsimile at p. 1896 and the 2006 facsimile at p. 4054), so both are what the
23
+ # gazette printed. From the 2006 instrument's entry into force the operative
24
+ # code is VI; VS is on the road on every trailer plated between 2005 and 2006
25
+ # and on every earlier one issued under the same code. A parse API must accept
26
+ # BOTH — which is exactly the "decode tables rot" hazard PRD-PLATES §9 names,
27
+ # caught here inside a single fourteen-month window.
28
+ #
29
+ # WHAT THIS TABLE IS NOT: it is not a district-code table for cars. There has
30
+ # never been one in the modern Portuguese system. And it is not the EXPORT
31
+ # prefix set — export numbers take a single trailing letter from a different,
32
+ # four-member list (L / P / A / M), which is carried inline on pt-export in
33
+ # plates/pt.yml rather than here, because it is a different statutory list in a
34
+ # different article with different members.
35
+ #
36
+ # Referenced by: pt-trailer (plates/pt.yml) via region_encoding.
37
+ jurisdiction: pt
38
+ topic: trailer-services
39
+ authority:
40
+ name: "Regulamento do Número e Chapa de Matrícula (anexo ao Decreto-Lei n.º 54/2005, de 3 de março), Anexo I — na redação do Decreto-Lei n.º 106/2006, de 8 de junho"
41
+ url: "https://dre.pt/application/conteudo/346124"
42
+ sources:
43
+ - "https://files.diariodarepublica.pt/1s/2006/06/111a00/40524060.pdf # Decreto-Lei n.º 106/2006 (DR I-A n.º 111, 08-06-2006), art. 1.º n.º 3 + ANEXO I, p. 4054: the CURRENT 22-row table, with Viseu = VI. Locator: https://dre.pt/application/conteudo/346124 — accessed 2026-08-02"
44
+ - "https://files.diariodarepublica.pt/1s/2005/03/044a00/18921897.pdf # Decreto-Lei n.º 54/2005 (DR I-A n.º 44, 03-03-2005), ANEXO I 'Tabela de dígitos identificadores dos serviços emissores de matrículas de reboques (referente ao n.º 2 do artigo 4.º)', p. 1896: the SUPERSEDED table, with Viseu = VS. Locator: https://dre.pt/application/conteudo/589934 — accessed 2026-08-02"
45
+ period: { start: 2006 }
46
+ period_evidence: instrument-in-force
47
+ period_note: >-
48
+ 2006 is the vintage of the list read here (Decreto-Lei n.º 106/2006, published
49
+ 08-06-2006; no entry-into-force clause of its own, so the general 5-day
50
+ vacatio of Lei n.º 74/98 applies and the operative date is 13-06-2006 —
51
+ DERIVED from the default rule, not stated by the instrument, and flagged as
52
+ such). The CODES themselves are far older than either instrument: the
53
+ composition "letter(s) + serial" is drawn in the pre-1992 plate model
54
+ (DL 54/2005 Anexo II, Modelo V, "L-10978"), so trailers were numbered this way
55
+ for decades before any text reachable in this pass. The instrument that first
56
+ enacted the list was not located — recorded gap, and the reason this file's
57
+ period is an instrument vintage rather than a series start.
58
+ maximal_munch: true
59
+ maximal_munch_note: >-
60
+ Single-letter codes collide with the prefixes of two-letter ones and the
61
+ digits that follow give no separator help, so a parser MUST take the longest
62
+ matching code before the serial: A (Ponta Delgada) inside AV (Aveiro) and AN
63
+ (Angra do Heroísmo); C (Coimbra) inside CB (Castelo Branco); L (Lisboa) inside
64
+ LE (Leiria); P (Porto) inside PT (Portalegre). E (Évora), H (Horta) and M
65
+ (Funchal) are unambiguous.
66
+
67
+ codes:
68
+ # Mainland districts (distritos), in the order the annex prints them.
69
+ - { code: AV, name: "Aveiro" }
70
+ - { code: BE, name: "Beja" }
71
+ - { code: BR, name: "Braga" }
72
+ - { code: BN, name: "Bragança" }
73
+ - { code: CB, name: "Castelo Branco" }
74
+ - { code: C, name: "Coimbra" }
75
+ - { code: E, name: "Évora" }
76
+ - { code: FA, name: "Faro" }
77
+ - { code: GD, name: "Guarda" }
78
+ - { code: LE, name: "Leiria" }
79
+ - { code: L, name: "Lisboa" }
80
+ - { code: PT, name: "Portalegre" }
81
+ - { code: P, name: "Porto" }
82
+ - { code: SA, name: "Santarém" }
83
+ - { code: SE, name: "Setúbal" }
84
+ - { code: VC, name: "Viana do Castelo" }
85
+ - { code: VR, name: "Vila Real" }
86
+ - { code: VI, name: "Viseu", superseded_code: VS, superseded_note: "VS in the 2005 Anexo I; VI since the 2006 replacement. Both were printed by the Diário da República; both are on the road." }
87
+ # Autonomous regions — the annex lists the Azores by ISLAND-GROUP district
88
+ # (three of them) and Madeira by its single district, under the same heading.
89
+ - { code: AN, name: "Angra do Heroísmo", kind: autonomous-region, region: "Açores" }
90
+ - { code: H, name: "Horta", kind: autonomous-region, region: "Açores" }
91
+ - { code: A, name: "Ponta Delgada", kind: autonomous-region, region: "Açores" }
92
+ - { code: M, name: "Funchal", kind: autonomous-region, region: "Madeira" }
93
+
94
+ # Sanity note for the verifier: 22 rows, and the set is complete against
95
+ # Portugal's administrative map — 18 mainland distritos + the 3 Azorean
96
+ # distritos + Funchal. No code is duplicated; no district is missing.
@@ -0,0 +1,213 @@
1
+ # plates/_decode/ro-counties.yml — Romania's registration-mark territorial codes.
2
+ #
3
+ # PROVENANCE, STATED FIRST AND WITHOUT DECORATION. Unlike
4
+ # plates/_decode/it-provinces.yml and plates/_decode/at-districts.yml, whose rows
5
+ # are enacted law read off Normattiva and RIS, THE 41 COUNTY ROWS BELOW ARE
6
+ # `secondary-wikipedia`. The statutory annex exists and is named in `authority`;
7
+ # it was NOT reachable in this pass, and every URL tried and every failure mode
8
+ # is recorded in `primary_attempts` below so the next pass starts from a map.
9
+ # Every row carries `evidence_tier: secondary-wikipedia` inline. No row in this
10
+ # file claims `instrument-in-force`, and a reviewer who fingerprints this table
11
+ # against Wikipedia SHOULD find a match — that is the declared provenance, not a
12
+ # defect.
13
+ #
14
+ # THREE STRUCTURAL FACTS THIS FILE EXISTS TO CARRY
15
+ #
16
+ # 1. BUCHAREST IS NOT A COUNTY ROW, AND THAT IS WHY IT IS NOT IN THE COUNTY
17
+ # TABLE. Romania's territorial code is a ONE-letter code for the capital and a
18
+ # TWO-letter code for each of the 41 counties, and the two take DIFFERENT
19
+ # SERIAL FORMATS: a county plate carries two digits between the code and the
20
+ # three letters, Bucharest carries three. That is a real format fork inside
21
+ # one jurisdiction, it is modelled as separate SERIES in plates/ro.yml, and
22
+ # this file keeps `municipality` structurally apart from `counties` so a
23
+ # decoder cannot silently treat "B" as though it were a 42nd county row. The
24
+ # ordering and the split below are this dataset's, chosen to make the fork
25
+ # visible; they are not any source's arrangement.
26
+ #
27
+ # 2. THERE IS NO MAXIMAL-MUNCH PROBLEM, AND THAT IS WORTH SAYING OUT LOUD.
28
+ # Spain's pre-2000 province codes are one, two or three letters and a decoder
29
+ # must try longest-first (see plates/_decode/es-provinces.yml). Romania looks
30
+ # like it should have the same trouble — "B" is Bucharest while "BC", "BH",
31
+ # "BN", "BR", "BT", "BV" and "BZ" are all counties — but it does not, because
32
+ # the DIGIT BLOCK ALWAYS FOLLOWS THE CODE. In "B12ABC" the character after B
33
+ # is a digit, so the code is one letter; in "BC12ABC" it is a letter, so the
34
+ # code is two. The rule is mechanical and total, and it survives separator
35
+ # stripping (PRD-PLATES §2.6), which is exactly when a decoder needs it most.
36
+ #
37
+ # 3. THESE ARE NOT THE PRE-1992 CODES. The communist-era system used a different
38
+ # territorial letter set built on the administrative regions of the day — the
39
+ # much-repeated example is that the Craiova area ran under "OL" for Oltenia —
40
+ # and it also placed the letters in the MIDDLE of the mark rather than at the
41
+ # front. This table decodes the 1992-and-later mark only. Applying it to a
42
+ # pre-1992 Romanian plate will produce confident nonsense; ro-communist-1966
43
+ # in plates/ro.yml carries no reference to this file for that reason.
44
+ jurisdiction: ro
45
+ topic: counties
46
+ authority:
47
+ name: "Regulamentul de aplicare a Ordonanţei de urgenţă a Guvernului nr. 195/2002 privind circulaţia pe drumurile publice, aprobat prin H.G. nr. 1.391 din 4 octombrie 2006 — the instrument whose annex carries the official list of indicative"
48
+ url: "https://legislatie.just.ro/Public/DetaliiDocument/79058"
49
+ note: >-
50
+ Named as the CARRIER of the official list, not as the source of the rows
51
+ below. Art. 23 of the Regulament composes the mark from "indicativul
52
+ judeţului sau al municipiului Bucureşti" plus an order number plus three
53
+ letters, and the indicative themselves are set out in the instrument's annex.
54
+ That annex was not retrieved — see `primary_attempts`.
55
+
56
+ evidence:
57
+ tier: secondary-wikipedia
58
+ source: "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Romania # the 41 county code-to-name pairs and the Bucharest code, re-expressed in this schema's own shape and ordering. Accessed 2026-08-02"
59
+ what_is_secondary: "every code, every county name, and the count of 41 + 1"
60
+ what_is_not_secondary: >-
61
+ The COMPOSITION RULE — that the mark begins with the indicative of the county
62
+ or of the municipality of Bucharest — is the Regulament's own words and is
63
+ cited as such in plates/ro.yml. What is secondary here is the CONTENTS of the
64
+ list, not the fact that the law keeps one.
65
+
66
+ primary_attempts:
67
+ - url: "https://legislatie.just.ro/Public/DetaliiDocument/79058"
68
+ result: "socket hang up, four separate attempts across the pass"
69
+ - url: "https://legislatie.just.ro/Public/DetaliiDocumentAfis/79058"
70
+ result: "socket hang up"
71
+ - url: "https://www.dsclex.ro/legislatie/2006/octombrie/hg1391_2006.htm"
72
+ result: "connection reset"
73
+ - url: "https://r.jina.ai/https://legislatie.just.ro/Public/DetaliiDocument/79058"
74
+ result: "HTTP 422 (also tried percent-encoded: HTTP 422)"
75
+ - url: "https://web.archive.org/web/2024/https://legislatie.just.ro/Public/DetaliiDocument/79058"
76
+ result: "fetch tool refuses web.archive.org"
77
+ - url: "https://www.legex.ro/Hotararea-1391-2006-76973.aspx"
78
+ result: "HOST IS REACHABLE — but that document id resolves to Ordinul 2374/2006 (civil aviation), not to HG 1391/2006. legex.ro is a live route for the next pass IF the correct document id is found; the id was not."
79
+ primary_attempts_note: >-
80
+ Search-engine assistance was unavailable for the second half of this pass: the
81
+ WebSearch budget was exhausted, DuckDuckGo's HTML endpoint moved to a CAPTCHA,
82
+ Mojeek returned 403 and SearXNG returned a browser check. The correct legex.ro
83
+ document id is therefore the single cheapest next step for whoever picks this
84
+ up.
85
+
86
+ period: { start: 1992 }
87
+ period_evidence: secondary-wikipedia
88
+ period_note: >-
89
+ The code set below belongs to the system introduced in 1992. Two period
90
+ cautions a decoder must carry. (1) LOWER BOUND: these codes do not decode
91
+ pre-1992 marks at all (header fact 3). (2) STABILITY: Romania's county
92
+ boundaries have not been re-cut since 1968, so unlike the Italian province
93
+ sigle (four withdrawn in 2017) and the German district codes (reinstated in
94
+ waves), this table has no known withdrawn rows and no known period-closed rows.
95
+ That is an ABSENCE OF EVIDENCE of churn rather than sourced evidence of
96
+ stability, and it is recorded as the former.
97
+
98
+ iso_3166_2_correspondence:
99
+ status: UNVERIFIED
100
+ claim_not_made: >-
101
+ The 41 two-letter codes below LOOK like the subdivision codes of ISO
102
+ 3166-2:RO with the "RO-" prefix removed, and if that correspondence held it
103
+ would give this table a second, non-Wikipedia, structured route. THIS FILE
104
+ DOES NOT RELY ON IT AND DOES NOT ASSERT IT. The ISO register was not fetched
105
+ in this pass, so the correspondence is an unchecked hypothesis, and an
106
+ unchecked hypothesis dressed as corroboration would be worse than no
107
+ corroboration at all — two sources that were never actually compared are one
108
+ source with a false witness. Recorded here as the FIRST task for a verifier:
109
+ fetch the ISO 3166-2:RO register, diff it against these rows, and either
110
+ upgrade the tier or record where they diverge.
111
+
112
+ # ---------------------------------------------------------------------------
113
+ # THE CAPITAL — one letter, three digits, its own series in plates/ro.yml.
114
+ # ---------------------------------------------------------------------------
115
+ municipality:
116
+ code: B
117
+ name: "București"
118
+ name_en: Bucharest
119
+ type: "municipiu (the capital, which is not a județ)"
120
+ serial_digits: 3
121
+ serial_digits_history:
122
+ - { digits: 2, note: "the original 1992 form, B 99 LLL — see ro-bucharest-1992 / ro-bucharest-2007" }
123
+ - { digits: 3, note: "adopted when the two-digit space was exhausted — see ro-bucharest-2010" }
124
+ evidence_tier: secondary-wikipedia
125
+ note: >-
126
+ THE FORMAT FORK. Every other territorial code in Romania takes two digits;
127
+ Bucharest takes three. The reason is capacity, not law: art. 23 of the
128
+ Regulament prescribes "numărul de ordine, format din cifre arabe" and fixes
129
+ NO number of digits at all, so the capital was able to lengthen its order
130
+ number without any amendment. That is why plates/ro.yml carries a
131
+ `regex_statutory` wider than its `regex` for the standard series — the
132
+ statute is genuinely wider than what is issued, and Bucharest is the proof.
133
+
134
+ # ---------------------------------------------------------------------------
135
+ # THE 41 COUNTIES — ordered by CODE, this dataset's ordering. Two letters each,
136
+ # two digits in the serial, without exception.
137
+ # ---------------------------------------------------------------------------
138
+ counties_note: "every row: { code, name (Romanian, with diacritics), evidence_tier }. serial_digits is 2 for all 41 and is stated once here rather than repeated per row."
139
+ counties_serial_digits: 2
140
+ counties:
141
+ - { code: AB, name: "Alba", evidence_tier: secondary-wikipedia }
142
+ - { code: AG, name: "Argeș", evidence_tier: secondary-wikipedia }
143
+ - { code: AR, name: "Arad", evidence_tier: secondary-wikipedia }
144
+ - { code: BC, name: "Bacău", evidence_tier: secondary-wikipedia }
145
+ - { code: BH, name: "Bihor", evidence_tier: secondary-wikipedia }
146
+ - { code: BN, name: "Bistrița-Năsăud", evidence_tier: secondary-wikipedia }
147
+ - { code: BR, name: "Brăila", evidence_tier: secondary-wikipedia }
148
+ - { code: BT, name: "Botoșani", evidence_tier: secondary-wikipedia }
149
+ - { code: BV, name: "Brașov", evidence_tier: secondary-wikipedia }
150
+ - { code: BZ, name: "Buzău", evidence_tier: secondary-wikipedia }
151
+ - { code: CJ, name: "Cluj", evidence_tier: secondary-wikipedia }
152
+ - { code: CL, name: "Călărași", evidence_tier: secondary-wikipedia }
153
+ - { code: CS, name: "Caraș-Severin", evidence_tier: secondary-wikipedia }
154
+ - { code: CT, name: "Constanța", evidence_tier: secondary-wikipedia }
155
+ - { code: CV, name: "Covasna", evidence_tier: secondary-wikipedia }
156
+ - { code: DB, name: "Dâmbovița", evidence_tier: secondary-wikipedia }
157
+ - { code: DJ, name: "Dolj", evidence_tier: secondary-wikipedia }
158
+ - { code: GJ, name: "Gorj", evidence_tier: secondary-wikipedia }
159
+ - { code: GL, name: "Galați", evidence_tier: secondary-wikipedia }
160
+ - { code: GR, name: "Giurgiu", evidence_tier: secondary-wikipedia }
161
+ - { code: HD, name: "Hunedoara", evidence_tier: secondary-wikipedia }
162
+ - { code: HR, name: "Harghita", evidence_tier: secondary-wikipedia }
163
+ - { code: IF, name: "Ilfov", evidence_tier: secondary-wikipedia }
164
+ - { code: IL, name: "Ialomița", evidence_tier: secondary-wikipedia }
165
+ - { code: IS, name: "Iași", evidence_tier: secondary-wikipedia }
166
+ - { code: MH, name: "Mehedinți", evidence_tier: secondary-wikipedia }
167
+ - { code: MM, name: "Maramureș", evidence_tier: secondary-wikipedia }
168
+ - { code: MS, name: "Mureș", evidence_tier: secondary-wikipedia }
169
+ - { code: NT, name: "Neamț", evidence_tier: secondary-wikipedia }
170
+ - { code: OT, name: "Olt", evidence_tier: secondary-wikipedia }
171
+ - { code: PH, name: "Prahova", evidence_tier: secondary-wikipedia }
172
+ - { code: SB, name: "Sibiu", evidence_tier: secondary-wikipedia }
173
+ - { code: SJ, name: "Sălaj", evidence_tier: secondary-wikipedia }
174
+ - { code: SM, name: "Satu Mare", evidence_tier: secondary-wikipedia }
175
+ - { code: SV, name: "Suceava", evidence_tier: secondary-wikipedia }
176
+ - { code: TL, name: "Tulcea", evidence_tier: secondary-wikipedia }
177
+ - { code: TM, name: "Timiș", evidence_tier: secondary-wikipedia }
178
+ - { code: TR, name: "Teleorman", evidence_tier: secondary-wikipedia }
179
+ - { code: VL, name: "Vâlcea", evidence_tier: secondary-wikipedia }
180
+ - { code: VN, name: "Vrancea", evidence_tier: secondary-wikipedia }
181
+ - { code: VS, name: "Vaslui", evidence_tier: secondary-wikipedia }
182
+
183
+ # ---------------------------------------------------------------------------
184
+ # Decoder cautions.
185
+ # ---------------------------------------------------------------------------
186
+ decoder_cautions:
187
+ - id: place-of-registration-not-residence
188
+ text: >-
189
+ The Romanian indicative denotes where the vehicle is REGISTERED. It is
190
+ therefore semantically unlike the Italian right-hand sticker (the holder's
191
+ province of RESIDENCE, and legally not part of the plate at all) and unlike
192
+ the French SIV département band (owner-CHOSEN, decoding to nothing). A
193
+ Romanian indicative is real geography. It is still not a claim about where
194
+ the vehicle IS, only about where it was put on the register.
195
+ - id: ilfov-is-not-bucharest
196
+ text: >-
197
+ IF (Ilfov) is the county that SURROUNDS Bucharest and is a separate
198
+ indicative with the ordinary two-digit format. A decoder that folds IF into
199
+ B, or renders IF as "Bucharest area", is wrong on both the code and the
200
+ format.
201
+ - id: no-code-is-a-word
202
+ text: >-
203
+ Unlike Italy, whose Rome sigla is the literal word "Roma" and forces a
204
+ special case into every parser, every Romanian code here is exactly one or
205
+ two letters. There is no four-letter exception and no mixed-case row.
206
+ - id: three-letter-group-is-not-a-code
207
+ text: >-
208
+ The THREE letters at the end of a Romanian mark are a serial group, not a
209
+ territorial code, even when they spell a plausible abbreviation. Certain
210
+ combinations are reported to be reserved for institutions (POL, DEP, SNT,
211
+ SRI, GUV); those are reservations inside the serial space and are recorded
212
+ in plates/ro.yml, not here, because they decode to an INSTITUTION and not
213
+ to a place.
@@ -0,0 +1,220 @@
1
+ # plates/_decode/se-diplomatic.yml — Swedish beskickningsskylt country codes.
2
+ #
3
+ # WHY THIS IS A _decode FILE AND NOT AN INLINE TABLE (PRD-PLATES §2.4): 128
4
+ # rows is past the "small" threshold that put FZV Anlage 2 inline in de.yml,
5
+ # and it is a CLOSED, PRIMARY list — Transportstyrelsen publishes the whole
6
+ # thing, so it qualifies on the other limb of the rule ("a reference … if the
7
+ # full table is primary-sourced and closed").
8
+ #
9
+ # THE SOURCE MOVED, AND THAT MATTERS FOR PROVENANCE. Until 2 June 2025 this
10
+ # table WAS a regulation annex: TSFS 2015:63 Bilaga 1 ("Landskod enligt
11
+ # 12 kap. 3 § 1") and Bilaga 2 ("Kategorikod enligt 12 kap. 3 § 3"). TSFS
12
+ # 2025:33 repealed both annexes and rewrote 12 kap. 3 § so that the codes are
13
+ # no longer enumerated in the föreskrift at all — they now live only on
14
+ # Transportstyrelsen's website. Both are cited below: the website for the
15
+ # CURRENT list, the repealed annex for the fact that this used to be enacted
16
+ # text and for the pre-2025 kategorikod set (which had no "J").
17
+ #
18
+ # DECODE DISCIPLINE: the assigning authority is NOT Transportstyrelsen. 11 kap.
19
+ # 2 § förordningen (2019:383): "Sammansättningen av tecken på skyltar för
20
+ # beskickningsfordon bestäms av Regeringskansliet (Utrikesdepartementet) med
21
+ # hänsyn till det berörda landet och den ställning som den som äger eller
22
+ # använder fordonet har." Missions open and close; a code withdrawn from this
23
+ # list does not become undecodable for plates already issued, so rows are
24
+ # closed by period and never deleted — the same rule de.yml records for German
25
+ # district codes.
26
+ #
27
+ # ALPHABET OBSERVATION (a fact about the table, not a rule): across all 128
28
+ # codes the letters I, O and Q never appear, while V does (EV = IDEA). That is
29
+ # the opposite of the ordinary registration-number alphabet, which excludes
30
+ # I, Q, V, Å, Ä and Ö. No primary states a letter rule for landskoder; the
31
+ # observation is recorded so a parse API does not infer one.
32
+ jurisdiction: se
33
+ topic: diplomatic
34
+ authority:
35
+ name: Regeringskansliet (Utrikesdepartementet) — codes; Transportstyrelsen — publication
36
+ url: "https://www.transportstyrelsen.se/sv/vagtrafik/fordon/aga-kopa-eller-salja-fordon/registreringsskyltar/skylt-for-beskickningsfordon-diplomatfordon/"
37
+ sources:
38
+ - "https://www.transportstyrelsen.se/sv/vagtrafik/fordon/aga-kopa-eller-salja-fordon/registreringsskyltar/skylt-for-beskickningsfordon-diplomatfordon/ # the current 128-row landskod table and the kategorikod table (A-H, 'I eller J'); accessed 2026-08-02"
39
+ - "https://www.transportstyrelsen.se/TSFS/TSFS%202015_63.pdf # TSFS 2015:63 as enacted, Bilaga 1 'Landskod enligt 12 kap. 3 § 1' and Bilaga 2 'Kategorikod enligt 12 kap. 3 § 3' (kategorikod A-I, no J) — the version in force 2016-01-01; accessed 2026-08-02"
40
+ - "https://www.transportstyrelsen.se/TSFS/TSFS%202025_33.pdf # TSFS 2025:33: 'dels att 3 kap. 17 §, 6 kap. 14 §, 12 kap. 4 § samt bilaga 1 och 2 ska upphöra att gälla' — in force 2 June 2025, which is when the table left the regulation; accessed 2026-08-02"
41
+ - "https://data.riksdagen.se/dokument/sfs-2019-383.html # 11 kap. 2 §: the character composition is set by Regeringskansliet (Utrikesdepartementet); accessed 2026-08-02"
42
+ period: { start: 2025 }
43
+ period_evidence: instrument-in-force
44
+ period_note: >-
45
+ 2025 is the date of the SOURCE now read (the Transportstyrelsen web table,
46
+ which replaced TSFS 2015:63 Bilaga 1 on 2 June 2025), not the date any code
47
+ was first assigned. The beskickningsskylt regime itself is far older —
48
+ förordningen (1988:964) om skyltar för beskickningsfordon took effect on
49
+ 1 October 1988 — and the per-mission code assignments are Utrikesdepartementet
50
+ decisions that are not individually dated in any published source. Treat every
51
+ row as "in force when read"; do not infer an assignment year from it.
52
+
53
+ # ---------------------------------------------------------------------------
54
+ # LANDSKOD — two letters, the mission. 128 rows, verbatim from the authority's
55
+ # table, keyed by code (the table is printed mission-first; keying by code is
56
+ # the decode direction a parse API needs).
57
+ # ---------------------------------------------------------------------------
58
+ landskod:
59
+ AA: "Sydafrikas ambassad"
60
+ AB: "Albaniens ambassad"
61
+ AC: "Algeriets ambassad"
62
+ AD: "Tysklands ambassad"
63
+ AE: "Armeniens ambassad"
64
+ AF: "Amerikas förenta staters ambassad"
65
+ AG: "Angolas ambassad"
66
+ AH: "Saudiarabiens ambassad"
67
+ AJ: "Argentinas ambassad"
68
+ AK: "Australiens ambassad"
69
+ AL: "Österrikes ambassad"
70
+ AM: "Bangladesh ambassad"
71
+ AN: "Belgiens ambassad"
72
+ AP: "Bolivias ambassad"
73
+ AR: "Botswanas ambassad"
74
+ AS: "Brasiliens ambassad"
75
+ AT: "Bulgariens ambassad"
76
+ AU: "Canadas ambassad"
77
+ AW: "Chiles ambassad"
78
+ AX: "Folkrepubliken Kinas ambassad"
79
+ AY: "Colombias ambassad"
80
+ AZ: "Republiken Koreas ambassad"
81
+ BA: "Demokratiska folkrepubliken Koreasambassad"
82
+ BB: "Afghanistans ambassad"
83
+ BC: "Cubas ambassad"
84
+ BD: "Danmarks ambassad"
85
+ BE: "Dominikanska republikens ambassad"
86
+ BF: "Egyptens ambassad"
87
+ BG: "Ecuadors ambassad"
88
+ BH: "Spaniens ambassad"
89
+ BJ: "Etiopiens ambassad"
90
+ BK: "Finlands ambassad"
91
+ BL: "Frankrikes ambassad"
92
+ BM: "Storbritanniens ambassad"
93
+ BN: "Greklands ambassad"
94
+ BP: "Guatemalas ambassad"
95
+ BR: "Kazakstans ambassad"
96
+ BS: "Ungerns ambassad"
97
+ BT: "Indiens ambassad"
98
+ BU: "Indonesiens ambassad"
99
+ BW: "Iraks ambassad"
100
+ BX: "Irans ambassad"
101
+ BY: "Irlands ambassad"
102
+ BZ: "Islands ambassad"
103
+ CA: "Israels ambassad"
104
+ CB: "Italiens ambassad"
105
+ CC: "Japans ambassad"
106
+ CD: "Kenyas ambassad"
107
+ CE: "Laos ambassad"
108
+ CF: "Libanons ambassad"
109
+ CG: "Libyens folkkontor"
110
+ CH: "Malaysias ambassad"
111
+ CJ: "Marockos ambassad"
112
+ CK: "Mexikos ambassad"
113
+ CL: "Moçambiques ambassad"
114
+ CM: "Nicaraguas ambassad"
115
+ CN: "Nigerias ambassad"
116
+ CP: "Norges ambassad"
117
+ CR: "Qatars ambassad"
118
+ CS: "Pakistans ambassad"
119
+ CT: "Panamas ambassad"
120
+ CU: "Nederländernas ambassad"
121
+ CW: "Perus ambassad"
122
+ CX: "Filippinernas ambassad"
123
+ CY: "Polens ambassad"
124
+ CZ: "Portugals ambassad"
125
+ DA: "Rumäniens ambassad"
126
+ DB: "Senegals ambassad"
127
+ DD: "Sri Lankas ambassad"
128
+ DE: "Schweiz ambassad"
129
+ DF: "Tanzanias ambassad"
130
+ DG: "Tjeckiens ambassad"
131
+ DH: "Thailands ambassad"
132
+ DJ: "Tunisiens ambassad"
133
+ DK: "Turkiets ambassad"
134
+ DL: "Rysslands ambassad"
135
+ DM: "Uruguays ambassad"
136
+ DN: "Venezuelas ambassad"
137
+ DP: "Vietnams ambassad"
138
+ DR: "Serbiens ambassad"
139
+ DS: "Zambias ambassad"
140
+ DT: "Zimbabwes ambassad"
141
+ DU: "FN:s flyktingkommissariat"
142
+ DW: "Världssjöfartsuniversitet"
143
+ DX: "Nordiska rådets presidiesekretariat"
144
+ DY: "Namibias ambassad"
145
+ DZ: "Sudans ambassad"
146
+ EA: "Europeiska rymdorganisationen (ESA)"
147
+ EB: "Europeiska Unionen (EU)"
148
+ EC: "Burundis ambassad"
149
+ ED: "Estlands ambassad"
150
+ EE: "Lettlands ambassad"
151
+ EF: "Litauens ambassad"
152
+ EG: "Kroatiens ambassad"
153
+ EH: "Sloveniens ambassad"
154
+ EJ: "Slovakiens ambassad"
155
+ EK: "Bosnien-Hercegovinas ambassad"
156
+ EL: "Eritreas ambassad"
157
+ EM: "Ukrainas ambassad"
158
+ EN: "Cyperns ambassad"
159
+ EP: "Makedoniens ambassad"
160
+ ER: "Kuwaits ambassad"
161
+ ES: "Honduras ambassad"
162
+ ET: "Rwandas ambassad"
163
+ EV: "International Institute for Democracy and Electoral Assistance (IDEA)"
164
+ EX: "Kap Verdes ambassad"
165
+ EY: "Östersjöstaternas råds sekretariat (CBSS)"
166
+ FA: "Vitrysslands ambassad"
167
+ FB: "Demokratiska Republiken Kongos ambassad"
168
+ FC: "El Salvadors ambassad"
169
+ FD: "Syriens ambassad"
170
+ FE: "GIWA (Global International WatersAssessment)"
171
+ FF: "Apostoliska nuntiaturen"
172
+ FG: "European Commission/RepresentationIn Sweden"
173
+ FH: "GWPO (Global Water PartnershipOrganisation)"
174
+ FJ: "Förenade Arabemiratens ambassad"
175
+ FK: "Moldaviens ambassad"
176
+ FL: "Georgiens ambassad"
177
+ FM: "Azerbajdzjans ambassad"
178
+ FN: "Nya Zeelands ambassad"
179
+ FP: "Mongoliets ambassad"
180
+ FS: "Republiken Kongos ambassad"
181
+ FT: "Kosovos ambassad"
182
+ FU: "Paraguays ambassad"
183
+ FW: "Palestinas ambassad"
184
+ FX: "Europeiska investeringsbanken"
185
+ FY: "Sekretariatet för Nordliga dimensionens partnerskap för hälsa och socialt välbefinnande (NDPHS)"
186
+ FZ: "Uzbekistans ambassad"
187
+
188
+ # ---------------------------------------------------------------------------
189
+ # KATEGORIKOD — one letter, the holder's standing. Note the I/J pair: the
190
+ # repealed TSFS 2015:63 Bilaga 2 listed only "I tjänsteman vid internationell
191
+ # organisation"; the current web table reads "I eller J", so J is an addition
192
+ # made after the annex was written. Recorded as two rows with the same meaning
193
+ # rather than as the string "I eller J", so the table is machine-usable.
194
+ # ---------------------------------------------------------------------------
195
+ kategorikod:
196
+ A: "beskickningschef"
197
+ B: "ambassad"
198
+ C: "diplomat"
199
+ D: "administrativ/teknisk tjänsteman"
200
+ E: "karriärkonsulat"
201
+ F: "karriärkonsul"
202
+ G: "konsulattjänsteman"
203
+ H: "internationell organisation"
204
+ I: "tjänsteman vid internationell organisation"
205
+ J: "tjänsteman vid internationell organisation"
206
+ kategorikod_note: >-
207
+ TSFS 2015:63 Bilaga 2 as enacted (in force 2016-01-01) ended at I. The
208
+ current Transportstyrelsen table prints "I eller J" against the single
209
+ meaning "tjänsteman vid internationell organisation". No instrument dating
210
+ J's addition was found — recorded gap.
211
+
212
+ # The middle group is a THREE-DIGIT löpnummer allocated inside each landskod
213
+ # (TSFS 2015:63 12 kap. 3 § 2: "ett löpnummer (tre siffror) inom respektive
214
+ # landskod"). It is a per-mission sequence with no published meaning, so there
215
+ # is nothing to decode below the landskod + kategorikod pair.
216
+ lopnummer:
217
+ digits: 3
218
+ scope: "per landskod"
219
+ decodes_to: null
220
+ source: "https://www.transportstyrelsen.se/TSFS/TSFS%202015_63k.pdf # 12 kap. 3 §, consolidated; accessed 2026-08-02"
@@ -0,0 +1,123 @@
1
+ # plates/_decode/si-regions.yml — Slovenian registracijska območja, and the
2
+ # thing that actually makes a Slovenian plate decodable: THE MUNICIPAL ARMS.
3
+ #
4
+ # TWO LEVELS, and the second one is the interesting one.
5
+ #
6
+ # LEVEL 1 — the two-letter code. Only ELEVEN exist, and both halves of the fact
7
+ # are primary: 29. člen (1) of the Pravilnik o registraciji motornih in
8
+ # priklopnih vozil (Uradni list RS, št. 48/11) names the eleven registration
9
+ # areas and, for each, the upravne enote it covers; 29. člen (2) delegates the
10
+ # LETTERS to Priloga IV ("Oznake registracijskih območij, ki se uporabljajo na
11
+ # registrskih in preskusnih tablicah, so navedene v seznamu oznak
12
+ # registracijskih območij v Prilogi IV tega pravilnika"), which is a one-page
13
+ # table printed with the regulation. Both are reproduced below, in the
14
+ # regulation's own numbering — which is the same in the article and the annex.
15
+ #
16
+ # LEVEL 2 — the coat of arms, which is NOT decoration. 28. člen (1), verbatim:
17
+ # "Za oznako registracijskega območja je grb občine, kjer je sedež upravne
18
+ # enote v tem registracijskem območju." The shield between the code and the
19
+ # serial is the arms of the MUNICIPALITY THAT HOSTS THE SEAT OF THE UPRAVNA
20
+ # ENOTA — not of the registration area. So thirteen visually different plates
21
+ # all read "LJ", and the shield is the only thing that tells Kočevje from
22
+ # Domžale from Ljubljana. A Slovenian plate therefore carries strictly more
23
+ # geography than its letters do, and a text-only parse throws it away.
24
+ # 28. člen (3) adds that the arms must be adapted graphically to the plate.
25
+ #
26
+ # WHAT THE ARMS BIND TO, and when. The 2011 pravilnik states the rule
27
+ # positionally and leaves the binding to the registration rules; its 2004
28
+ # predecessor said it outright, and the sense has not changed —
29
+ # Uradni list RS, št. 29/04, 22. člen (1), verbatim: "se uporabi grb mesta, v
30
+ # katerem je sedež organa, ki vodi vozilo v evidenci in v kateri ima lastnik
31
+ # vozila, OB IZDAJI REGISTRSKIH TABLIC, svoje stalno prebivališče oziroma
32
+ # začasno prebivališče". The arms are fixed AT ISSUE, to the then-owner's
33
+ # residence. Same caution as the Croatian city code: decode to
34
+ # residence-at-issue, never to "where this car is now".
35
+ #
36
+ # NOT A COMPLETE ARMS CATALOGUE. This file names the upravne enote whose seat
37
+ # municipality supplies each shield; it does NOT carry the 58 blazons, their
38
+ # artwork or their licensing. Municipal arms are protected independently of
39
+ # copyright and PRD-PLATES §3 puts them in the placeholder slot
40
+ # (`design.emblem.rendered: placeholder` in plates/si.yml). Recorded gap:
41
+ # a per-upravna-enota arms ledger.
42
+ jurisdiction: si
43
+ topic: regions
44
+ authority:
45
+ name: "Pravilnik o registraciji motornih in priklopnih vozil, 29. člen in Priloga IV — Ministrstvo za infrastrukturo / upravne enote"
46
+ url: "https://www.uradni-list.si/glasilo-uradni-list-rs/vsebina/2011-01-2292"
47
+ sources:
48
+ - "https://www.uradni-list.si/glasilo-uradni-list-rs/vsebina/2011-01-2292 # Uradni list RS, št. 48/2011 z dne 24. 6. 2011 — 29. člen (1) the eleven areas with their upravne enote, (2) the delegation to Priloga IV; 28. člen (1) the grb občine rule; 58. člen 'Ta pravilnik začne veljati 4. julija 2011.' Accessed 2026-08-02"
49
+ - "https://www.uradni-list.si/files/RS_-2011-048-02292-OB~P004-0000.PDF # PRILOGA IV, 'REGISTRACIJSKA OBMOČJA — Seznam oznak registracijskih območij', the eleven code letters, read from the gazette PDF. Accessed 2026-08-02"
50
+ - "https://www.uradni-list.si/glasilo-uradni-list-rs/vsebina/2004-01-1253/pravilnik-o-registrskih-tablicah-motornih-in-priklopnih-vozil # Uradni list RS, št. 29/2004 z dne 26. 3. 2004, 22. člen (1) — the arms bind to the owner's residence AT PLATE ISSUE. Accessed 2026-08-02"
51
+ period: { start: 2011 }
52
+ period_evidence: enacted-commencement
53
+ period_note: >-
54
+ 2011 is the commencement of the instrument these rows are printed in
55
+ (58. člen: "Ta pravilnik začne veljati 4. julija 2011."), not the age of the
56
+ codes. The ELEVEN-AREA system is much older — the 2006 predecessor
57
+ (Uradni list RS, št. 83/06, 3. člen) lists the same eleven areas with the
58
+ same upravne enote — and the two-letter codes themselves go back to the first
59
+ independent-Slovenia instrument (Uradni list RS, št. 5/92, 14. člen, whose
60
+ own seznam was not fetched in this pass). Per-code start dates are therefore
61
+ a RECORDED GAP, and 1992-era codes withdrawn since would not appear here.
62
+ maximal_munch: false
63
+ maximal_munch_note: >-
64
+ Not needed. Slovenian area codes are all exactly two letters (Priloga IV has
65
+ no one-letter entry), and 30. člen separates the area code from the serial by
66
+ a shield rather than by ambiguity. The prefix is the first two characters,
67
+ full stop — unlike Austria, where the split is genuinely ambiguous.
68
+ collisions:
69
+ - "KR (Kranj) vs KK (Krško) vs KP (Koper) — three K- codes, no overlap, listed only because they are the set most often mistyped for one another."
70
+ - "MV is NOT an area code. It is the fixed prefix of the starodobno (historic) plate, 40. člen: 'nato sledi oznaka za starodobna vozila »MV«'. A parse API must not look it up here."
71
+ - "PR is NOT an area code either. It is the red 'preskušnja' field on a test plate, 41. člen (2), and it sits AFTER the area code rather than replacing it."
72
+ - "CMD / CD / CC / M are activity codes on foreign-mission plates (39. člen (2)) and REPLACE the area code entirely; those plates carry no arms at all (28. člen (2))."
73
+
74
+ # ---------------------------------------------------------------------------
75
+ # The eleven areas. `upravne_enote` is the list from 29. člen (1) verbatim;
76
+ # each one's SEAT MUNICIPALITY supplies one distinct coat of arms under
77
+ # 28. člen (1), which is why this list is the arms key and not just trivia.
78
+ # ---------------------------------------------------------------------------
79
+ codes:
80
+ - code: CE
81
+ region: "Celje"
82
+ priloga_iv_no: 1
83
+ upravne_enote: ["Celje", "Laško", "Mozirje", "Slovenske Konjice", "Šentjur pri Celju", "Šmarje pri Jelšah", "Velenje", "Žalec"]
84
+ - code: KP
85
+ region: "Koper"
86
+ priloga_iv_no: 2
87
+ upravne_enote: ["Izola", "Koper", "Piran", "Sežana", "Ilirska Bistrica"]
88
+ - code: KR
89
+ region: "Kranj"
90
+ priloga_iv_no: 3
91
+ upravne_enote: ["Jesenice", "Kranj", "Radovljica", "Škofja Loka", "Tržič"]
92
+ - code: KK
93
+ region: "Krško"
94
+ priloga_iv_no: 4
95
+ upravne_enote: ["Brežice", "Krško", "Sevnica"]
96
+ - code: LJ
97
+ region: "Ljubljana"
98
+ priloga_iv_no: 5
99
+ upravne_enote: ["Domžale", "Grosuplje", "Hrastnik", "Kamnik", "Kočevje", "Litija", "Ljubljana", "Logatec", "Ribnica", "Trbovlje", "Vrhnika", "Zagorje ob Savi", "Cerknica"]
100
+ - code: MB
101
+ region: "Maribor"
102
+ priloga_iv_no: 6
103
+ upravne_enote: ["Lenart", "Maribor", "Ormož", "Pesnica", "Ptuj", "Ruše", "Slovenska Bistrica"]
104
+ - code: MS
105
+ region: "Murska Sobota"
106
+ priloga_iv_no: 7
107
+ upravne_enote: ["Gornja Radgona", "Lendava", "Ljutomer", "Murska Sobota"]
108
+ - code: GO
109
+ region: "Nova Gorica"
110
+ priloga_iv_no: 8
111
+ upravne_enote: ["Ajdovščina", "Idrija", "Nova Gorica", "Tolmin"]
112
+ - code: NM
113
+ region: "Novo mesto"
114
+ priloga_iv_no: 9
115
+ upravne_enote: ["Črnomelj", "Metlika", "Novo mesto", "Trebnje"]
116
+ - code: PO
117
+ region: "Postojna"
118
+ priloga_iv_no: 10
119
+ upravne_enote: ["Postojna"]
120
+ - code: SG
121
+ region: "Slovenj Gradec"
122
+ priloga_iv_no: 11
123
+ upravne_enote: ["Dravograd", "Radlje ob Dravi", "Ravne na Koroškem", "Slovenj Gradec"]