@mailwoman/resolver-wof-sqlite 10.0.0 → 10.2.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.
- package/README.md +9 -8
- package/lib/address/point/interpolation.ts +45 -39
- package/lib/address/point/schema.ts +17 -40
- package/lib/address/point.ts +316 -0
- package/lib/{address/index.ts → address.ts} +1 -1
- package/lib/ancestry/backfill.ts +20 -86
- package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
- package/lib/build/candidate.ts +122 -174
- package/lib/build/population-corrections.ts +64 -0
- package/lib/build/slim.ts +44 -114
- package/lib/candidate/alias-bags.ts +16 -17
- package/lib/candidate/ancestors/schema.ts +77 -61
- package/lib/candidate/ancestors/sidecar.ts +15 -22
- package/lib/candidate/country-display-names.ts +6 -20
- package/lib/candidate/extract-fold.ts +10 -55
- package/lib/candidate/fts.ts +5 -23
- package/lib/candidate/importance.ts +65 -68
- package/lib/candidate/lookup.ts +124 -415
- package/lib/candidate/name-roles.ts +15 -33
- package/lib/candidate/own-name.ts +35 -32
- package/lib/candidate/place-attrs.ts +20 -13
- package/lib/candidate/schema.ts +29 -65
- package/lib/candidate/scoring.ts +54 -93
- package/lib/capital-schema.ts +21 -17
- package/lib/capitals.ts +29 -27
- package/lib/coincident-roles.ts +85 -55
- package/lib/convention/schema.ts +15 -16
- package/lib/convention.ts +144 -0
- package/lib/coverage-manifest-schema.ts +40 -45
- package/lib/currency-backfill.ts +34 -79
- package/lib/env.ts +1 -1
- package/lib/exact-match.ts +32 -21
- package/lib/extracts.ts +97 -74
- package/lib/fst/autocomplete.ts +54 -37
- package/lib/fst/builder.ts +37 -41
- package/lib/fst/deserialize-web.ts +16 -17
- package/lib/fst/format.ts +41 -23
- package/lib/fst/freshness.ts +43 -120
- package/lib/fst/matcher.ts +7 -5
- package/lib/fst/serialize.ts +54 -74
- package/lib/fst/types.ts +78 -75
- package/lib/{fst/index.ts → fst.ts} +1 -0
- package/lib/fts/query.ts +5 -36
- package/lib/fts.ts +280 -0
- package/lib/geonames/aliases.ts +73 -144
- package/lib/geonames/postal.ts +162 -71
- package/lib/index.ts +9 -8
- package/lib/interpolation.ts +48 -100
- package/lib/lookup.ts +155 -270
- package/lib/name-score.ts +9 -7
- package/lib/nsul/lookup.ts +37 -54
- package/lib/nsul/schema.ts +16 -43
- package/lib/paths.ts +159 -0
- package/lib/place-importance-schema.ts +62 -169
- package/lib/poi/lookup.ts +104 -121
- package/lib/poi/schema.ts +42 -26
- package/lib/polygon-schema.ts +10 -6
- package/lib/postal/city/alias/lookup.ts +22 -40
- package/lib/postal/city/alias/schema.ts +14 -10
- package/lib/postal/city/candidate-schema.ts +26 -20
- package/lib/postcode-point-lookup.ts +8 -27
- package/lib/primary-preference.ts +46 -126
- package/lib/proximity-rerank.ts +44 -33
- package/lib/ranking-weights.ts +105 -78
- package/lib/region-keys.ts +70 -42
- package/lib/reverse.ts +149 -86
- package/lib/schema.ts +73 -50
- package/lib/search-fetch.ts +90 -68
- package/lib/sqlite/convention-source.ts +15 -23
- package/lib/sqlite/utils.ts +19 -22
- package/lib/street/centroid/schema.ts +37 -42
- package/lib/street/{centroid/index.ts → centroid.ts} +16 -25
- package/lib/street/morphology/fst/builder.ts +60 -42
- package/lib/street/morphology/fst/loader.ts +40 -32
- package/lib/street/name-lookup.ts +45 -41
- package/lib/street/normalize.ts +88 -219
- package/lib/street/segment-schema.ts +116 -43
- package/lib/{street/index.ts → street.ts} +1 -1
- package/lib/types.ts +109 -150
- package/lib/unified-schema.ts +29 -29
- package/lib/uprn/existence.ts +30 -19
- package/lib/uprn/lookup.ts +29 -68
- package/lib/uprn/schema.ts +18 -40
- package/lib/weights-overlay-linker.ts +236 -252
- package/out/address/point/interpolation.d.ts +20 -23
- package/out/address/point/interpolation.d.ts.map +1 -1
- package/out/address/point/interpolation.js +42 -39
- package/out/address/point/interpolation.js.map +1 -1
- package/out/address/point/schema.d.ts +12 -35
- package/out/address/point/schema.d.ts.map +1 -1
- package/out/address/point/schema.js +3 -19
- package/out/address/point/schema.js.map +1 -1
- package/out/address/point.d.ts +57 -0
- package/out/address/point.d.ts.map +1 -0
- package/out/address/point.js +206 -0
- package/out/address/point.js.map +1 -0
- package/out/{address/index.js → address.d.ts} +2 -2
- package/out/address.d.ts.map +1 -0
- package/out/{address/index.d.ts → address.js} +2 -2
- package/out/address.js.map +1 -0
- package/out/ancestry/backfill.d.ts +11 -64
- package/out/ancestry/backfill.d.ts.map +1 -1
- package/out/ancestry/backfill.js +14 -74
- package/out/ancestry/backfill.js.map +1 -1
- package/out/ancestry.d.ts +49 -0
- package/out/ancestry.d.ts.map +1 -0
- package/out/ancestry.js +59 -0
- package/out/ancestry.js.map +1 -0
- package/out/build/candidate.d.ts +82 -112
- package/out/build/candidate.d.ts.map +1 -1
- package/out/build/candidate.js +17 -100
- package/out/build/candidate.js.map +1 -1
- package/out/build/population-corrections.d.ts +52 -0
- package/out/build/population-corrections.d.ts.map +1 -0
- package/out/build/population-corrections.js +40 -0
- package/out/build/population-corrections.js.map +1 -0
- package/out/build/slim.d.ts +8 -44
- package/out/build/slim.d.ts.map +1 -1
- package/out/build/slim.js +33 -94
- package/out/build/slim.js.map +1 -1
- package/out/candidate/alias-bags.d.ts +6 -6
- package/out/candidate/alias-bags.d.ts.map +1 -1
- package/out/candidate/alias-bags.js +16 -17
- package/out/candidate/alias-bags.js.map +1 -1
- package/out/candidate/ancestors/schema.d.ts +73 -57
- package/out/candidate/ancestors/schema.d.ts.map +1 -1
- package/out/candidate/ancestors/schema.js +56 -48
- package/out/candidate/ancestors/schema.js.map +1 -1
- package/out/candidate/ancestors/sidecar.d.ts +3 -8
- package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
- package/out/candidate/ancestors/sidecar.js +15 -22
- package/out/candidate/ancestors/sidecar.js.map +1 -1
- package/out/candidate/country-display-names.d.ts +5 -15
- package/out/candidate/country-display-names.d.ts.map +1 -1
- package/out/candidate/country-display-names.js +6 -20
- package/out/candidate/country-display-names.js.map +1 -1
- package/out/candidate/extract-fold.d.ts +7 -15
- package/out/candidate/extract-fold.d.ts.map +1 -1
- package/out/candidate/extract-fold.js +5 -47
- package/out/candidate/extract-fold.js.map +1 -1
- package/out/candidate/fts.d.ts +5 -23
- package/out/candidate/fts.d.ts.map +1 -1
- package/out/candidate/fts.js +5 -23
- package/out/candidate/fts.js.map +1 -1
- package/out/candidate/importance.d.ts +60 -65
- package/out/candidate/importance.d.ts.map +1 -1
- package/out/candidate/importance.js +56 -63
- package/out/candidate/importance.js.map +1 -1
- package/out/candidate/lookup.d.ts +18 -55
- package/out/candidate/lookup.d.ts.map +1 -1
- package/out/candidate/lookup.js +82 -385
- package/out/candidate/lookup.js.map +1 -1
- package/out/candidate/name-roles.d.ts +9 -21
- package/out/candidate/name-roles.d.ts.map +1 -1
- package/out/candidate/name-roles.js +15 -33
- package/out/candidate/name-roles.js.map +1 -1
- package/out/candidate/own-name.d.ts +23 -25
- package/out/candidate/own-name.d.ts.map +1 -1
- package/out/candidate/own-name.js +35 -32
- package/out/candidate/own-name.js.map +1 -1
- package/out/candidate/place-attrs.d.ts +20 -13
- package/out/candidate/place-attrs.d.ts.map +1 -1
- package/out/candidate/place-attrs.js +4 -5
- package/out/candidate/place-attrs.js.map +1 -1
- package/out/candidate/schema.d.ts +27 -62
- package/out/candidate/schema.d.ts.map +1 -1
- package/out/candidate/schema.js +10 -22
- package/out/candidate/schema.js.map +1 -1
- package/out/candidate/scoring.d.ts +7 -8
- package/out/candidate/scoring.d.ts.map +1 -1
- package/out/candidate/scoring.js +52 -89
- package/out/candidate/scoring.js.map +1 -1
- package/out/capital-schema.d.ts +21 -17
- package/out/capital-schema.d.ts.map +1 -1
- package/out/capital-schema.js +17 -15
- package/out/capital-schema.js.map +1 -1
- package/out/capitals.d.ts +27 -25
- package/out/capitals.d.ts.map +1 -1
- package/out/capitals.js +23 -21
- package/out/capitals.js.map +1 -1
- package/out/coincident-roles.d.ts +60 -43
- package/out/coincident-roles.d.ts.map +1 -1
- package/out/coincident-roles.js +72 -50
- package/out/coincident-roles.js.map +1 -1
- package/out/convention/schema.d.ts +14 -14
- package/out/convention/schema.d.ts.map +1 -1
- package/out/convention/schema.js +6 -4
- package/out/convention/schema.js.map +1 -1
- package/out/convention.d.ts +97 -0
- package/out/convention.d.ts.map +1 -0
- package/out/convention.js +81 -0
- package/out/convention.js.map +1 -0
- package/out/coverage-manifest-schema.d.ts +34 -39
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +25 -34
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/currency-backfill.d.ts +16 -38
- package/out/currency-backfill.d.ts.map +1 -1
- package/out/currency-backfill.js +19 -46
- package/out/currency-backfill.js.map +1 -1
- package/out/env.d.ts +1 -1
- package/out/env.js +1 -1
- package/out/exact-match.d.ts +19 -10
- package/out/exact-match.d.ts.map +1 -1
- package/out/exact-match.js +32 -21
- package/out/exact-match.js.map +1 -1
- package/out/extracts.d.ts +66 -55
- package/out/extracts.d.ts.map +1 -1
- package/out/extracts.js +63 -55
- package/out/extracts.js.map +1 -1
- package/out/fst/autocomplete.d.ts +29 -21
- package/out/fst/autocomplete.d.ts.map +1 -1
- package/out/fst/autocomplete.js +39 -28
- package/out/fst/autocomplete.js.map +1 -1
- package/out/fst/builder.d.ts.map +1 -1
- package/out/fst/builder.js +37 -41
- package/out/fst/builder.js.map +1 -1
- package/out/fst/deserialize-web.d.ts +4 -4
- package/out/fst/deserialize-web.d.ts.map +1 -1
- package/out/fst/deserialize-web.js +15 -16
- package/out/fst/deserialize-web.js.map +1 -1
- package/out/fst/format.d.ts +41 -23
- package/out/fst/format.d.ts.map +1 -1
- package/out/fst/format.js +41 -23
- package/out/fst/format.js.map +1 -1
- package/out/fst/freshness.d.ts +19 -81
- package/out/fst/freshness.d.ts.map +1 -1
- package/out/fst/freshness.js +31 -94
- package/out/fst/freshness.js.map +1 -1
- package/out/fst/matcher.d.ts +5 -4
- package/out/fst/matcher.d.ts.map +1 -1
- package/out/fst/matcher.js +2 -2
- package/out/fst/matcher.js.map +1 -1
- package/out/fst/serialize.d.ts +28 -28
- package/out/fst/serialize.d.ts.map +1 -1
- package/out/fst/serialize.js +53 -71
- package/out/fst/serialize.js.map +1 -1
- package/out/fst/types.d.ts +78 -74
- package/out/fst/types.d.ts.map +1 -1
- package/out/fst/types.js +1 -4
- package/out/fst/types.js.map +1 -1
- package/out/{fst/index.js → fst.d.ts} +2 -1
- package/out/fst.d.ts.map +1 -0
- package/out/{fst/index.d.ts → fst.js} +2 -1
- package/out/fst.js.map +1 -0
- package/out/fts/query.d.ts +2 -27
- package/out/fts/query.d.ts.map +1 -1
- package/out/fts/query.js +5 -36
- package/out/fts/query.js.map +1 -1
- package/out/fts.d.ts +126 -0
- package/out/fts.d.ts.map +1 -0
- package/out/fts.js +188 -0
- package/out/fts.js.map +1 -0
- package/out/geonames/aliases.d.ts +26 -62
- package/out/geonames/aliases.d.ts.map +1 -1
- package/out/geonames/aliases.js +45 -117
- package/out/geonames/aliases.js.map +1 -1
- package/out/geonames/postal.d.ts +84 -44
- package/out/geonames/postal.d.ts.map +1 -1
- package/out/geonames/postal.js +115 -73
- package/out/geonames/postal.js.map +1 -1
- package/out/{geonames/index.js → geonames.d.ts} +1 -1
- package/out/geonames.d.ts.map +1 -0
- package/out/{geonames/index.d.ts → geonames.js} +1 -1
- package/out/geonames.js.map +1 -0
- package/out/index.d.ts +9 -8
- package/out/index.d.ts.map +1 -1
- package/out/index.js +6 -5
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +18 -55
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +27 -69
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +23 -51
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +136 -234
- package/out/lookup.js.map +1 -1
- package/out/name-score.d.ts +2 -2
- package/out/name-score.d.ts.map +1 -1
- package/out/name-score.js +9 -7
- package/out/name-score.js.map +1 -1
- package/out/nsul/lookup.d.ts +33 -34
- package/out/nsul/lookup.d.ts.map +1 -1
- package/out/nsul/lookup.js +26 -40
- package/out/nsul/lookup.js.map +1 -1
- package/out/nsul/schema.d.ts +16 -43
- package/out/nsul/schema.d.ts.map +1 -1
- package/out/nsul/schema.js +9 -35
- package/out/nsul/schema.js.map +1 -1
- package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
- package/out/nsul.d.ts.map +1 -0
- package/out/{nsul/index.js → nsul.js} +1 -1
- package/out/nsul.js.map +1 -0
- package/out/paths.d.ts +124 -0
- package/out/paths.d.ts.map +1 -0
- package/out/paths.js +104 -0
- package/out/paths.js.map +1 -0
- package/out/place-importance-schema.d.ts +51 -143
- package/out/place-importance-schema.d.ts.map +1 -1
- package/out/place-importance-schema.js +28 -143
- package/out/place-importance-schema.js.map +1 -1
- package/out/poi/lookup.d.ts +40 -47
- package/out/poi/lookup.d.ts.map +1 -1
- package/out/poi/lookup.js +69 -96
- package/out/poi/lookup.js.map +1 -1
- package/out/poi/schema.d.ts +41 -25
- package/out/poi/schema.d.ts.map +1 -1
- package/out/poi/schema.js +25 -17
- package/out/poi/schema.js.map +1 -1
- package/out/{poi/index.js → poi.d.ts} +1 -1
- package/out/poi.d.ts.map +1 -0
- package/out/{poi/index.d.ts → poi.js} +1 -1
- package/out/poi.js.map +1 -0
- package/out/polygon-schema.d.ts +10 -6
- package/out/polygon-schema.d.ts.map +1 -1
- package/out/polygon-schema.js +2 -2
- package/out/polygon-schema.js.map +1 -1
- package/out/postal/city/alias/lookup.d.ts +20 -23
- package/out/postal/city/alias/lookup.d.ts.map +1 -1
- package/out/postal/city/alias/lookup.js +17 -30
- package/out/postal/city/alias/lookup.js.map +1 -1
- package/out/postal/city/alias/schema.d.ts +14 -10
- package/out/postal/city/alias/schema.d.ts.map +1 -1
- package/out/postal/city/alias/schema.js +10 -8
- package/out/postal/city/alias/schema.js.map +1 -1
- package/out/postal/city/candidate-schema.d.ts +25 -19
- package/out/postal/city/candidate-schema.d.ts.map +1 -1
- package/out/postal/city/candidate-schema.js +21 -17
- package/out/postal/city/candidate-schema.js.map +1 -1
- package/out/{postal/index.d.ts → postal.d.ts} +1 -1
- package/out/postal.d.ts.map +1 -0
- package/out/{postal/index.js → postal.js} +1 -1
- package/out/postal.js.map +1 -0
- package/out/postcode-point-lookup.d.ts +6 -24
- package/out/postcode-point-lookup.d.ts.map +1 -1
- package/out/postcode-point-lookup.js +5 -17
- package/out/postcode-point-lookup.js.map +1 -1
- package/out/primary-preference.d.ts +38 -92
- package/out/primary-preference.d.ts.map +1 -1
- package/out/primary-preference.js +15 -99
- package/out/primary-preference.js.map +1 -1
- package/out/proximity-rerank.d.ts +41 -30
- package/out/proximity-rerank.d.ts.map +1 -1
- package/out/proximity-rerank.js +38 -29
- package/out/proximity-rerank.js.map +1 -1
- package/out/ranking-weights.d.ts +98 -64
- package/out/ranking-weights.d.ts.map +1 -1
- package/out/ranking-weights.js +26 -25
- package/out/ranking-weights.js.map +1 -1
- package/out/region-keys.d.ts +50 -31
- package/out/region-keys.d.ts.map +1 -1
- package/out/region-keys.js +68 -40
- package/out/region-keys.js.map +1 -1
- package/out/reverse.d.ts +78 -50
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +98 -61
- package/out/reverse.js.map +1 -1
- package/out/schema.d.ts +72 -49
- package/out/schema.d.ts.map +1 -1
- package/out/schema.js +4 -5
- package/out/schema.js.map +1 -1
- package/out/search-fetch.d.ts +16 -12
- package/out/search-fetch.d.ts.map +1 -1
- package/out/search-fetch.js +83 -63
- package/out/search-fetch.js.map +1 -1
- package/out/sqlite/convention-source.d.ts +12 -16
- package/out/sqlite/convention-source.d.ts.map +1 -1
- package/out/sqlite/convention-source.js +13 -22
- package/out/sqlite/convention-source.js.map +1 -1
- package/out/sqlite/utils.d.ts +19 -19
- package/out/sqlite/utils.d.ts.map +1 -1
- package/out/sqlite/utils.js +14 -15
- package/out/sqlite/utils.js.map +1 -1
- package/out/street/centroid/schema.d.ts +37 -42
- package/out/street/centroid/schema.d.ts.map +1 -1
- package/out/street/centroid/schema.js +9 -21
- package/out/street/centroid/schema.js.map +1 -1
- package/out/street/centroid.d.ts +30 -0
- package/out/street/centroid.d.ts.map +1 -0
- package/out/street/{centroid/index.js → centroid.js} +13 -24
- package/out/street/centroid.js.map +1 -0
- package/out/street/morphology/fst/builder.d.ts +20 -10
- package/out/street/morphology/fst/builder.d.ts.map +1 -1
- package/out/street/morphology/fst/builder.js +44 -34
- package/out/street/morphology/fst/builder.js.map +1 -1
- package/out/street/morphology/fst/loader.d.ts +33 -26
- package/out/street/morphology/fst/loader.d.ts.map +1 -1
- package/out/street/morphology/fst/loader.js +23 -22
- package/out/street/morphology/fst/loader.js.map +1 -1
- package/out/street/name-lookup.d.ts +24 -18
- package/out/street/name-lookup.d.ts.map +1 -1
- package/out/street/name-lookup.js +34 -35
- package/out/street/name-lookup.js.map +1 -1
- package/out/street/normalize.d.ts +35 -136
- package/out/street/normalize.d.ts.map +1 -1
- package/out/street/normalize.js +77 -194
- package/out/street/normalize.js.map +1 -1
- package/out/street/segment-schema.d.ts +79 -39
- package/out/street/segment-schema.d.ts.map +1 -1
- package/out/street/segment-schema.js +71 -21
- package/out/street/segment-schema.js.map +1 -1
- package/out/{street/index.js → street.d.ts} +2 -2
- package/out/street.d.ts.map +1 -0
- package/out/{street/index.d.ts → street.js} +2 -2
- package/out/street.js.map +1 -0
- package/out/types.d.ts +84 -149
- package/out/types.d.ts.map +1 -1
- package/out/types.js +0 -6
- package/out/types.js.map +1 -1
- package/out/unified-schema.d.ts +8 -12
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +29 -29
- package/out/unified-schema.js.map +1 -1
- package/out/uprn/existence.d.ts +28 -17
- package/out/uprn/existence.d.ts.map +1 -1
- package/out/uprn/existence.js +26 -16
- package/out/uprn/existence.js.map +1 -1
- package/out/uprn/lookup.d.ts +14 -44
- package/out/uprn/lookup.d.ts.map +1 -1
- package/out/uprn/lookup.js +21 -57
- package/out/uprn/lookup.js.map +1 -1
- package/out/uprn/schema.d.ts +18 -40
- package/out/uprn/schema.d.ts.map +1 -1
- package/out/uprn/schema.js +10 -32
- package/out/uprn/schema.js.map +1 -1
- package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
- package/out/uprn.d.ts.map +1 -0
- package/out/{uprn/index.js → uprn.js} +1 -1
- package/out/uprn.js.map +1 -0
- package/out/weights-overlay-linker.d.ts +138 -144
- package/out/weights-overlay-linker.d.ts.map +1 -1
- package/out/weights-overlay-linker.js +105 -159
- package/out/weights-overlay-linker.js.map +1 -1
- package/package.json +91 -596
- package/lib/address/point/index.ts +0 -328
- package/lib/convention/index.ts +0 -154
- package/lib/fts/index.ts +0 -361
- package/out/address/index.d.ts.map +0 -1
- package/out/address/index.js.map +0 -1
- package/out/address/point/index.d.ts +0 -53
- package/out/address/point/index.d.ts.map +0 -1
- package/out/address/point/index.js +0 -222
- package/out/address/point/index.js.map +0 -1
- package/out/ancestry/index.d.ts +0 -45
- package/out/ancestry/index.d.ts.map +0 -1
- package/out/ancestry/index.js +0 -55
- package/out/ancestry/index.js.map +0 -1
- package/out/convention/index.d.ts +0 -106
- package/out/convention/index.d.ts.map +0 -1
- package/out/convention/index.js +0 -93
- package/out/convention/index.js.map +0 -1
- package/out/fst/index.d.ts.map +0 -1
- package/out/fst/index.js.map +0 -1
- package/out/fts/index.d.ts +0 -184
- package/out/fts/index.d.ts.map +0 -1
- package/out/fts/index.js +0 -277
- package/out/fts/index.js.map +0 -1
- package/out/geonames/index.d.ts.map +0 -1
- package/out/geonames/index.js.map +0 -1
- package/out/nsul/index.d.ts.map +0 -1
- package/out/nsul/index.js.map +0 -1
- package/out/poi/index.d.ts.map +0 -1
- package/out/poi/index.js.map +0 -1
- package/out/postal/index.d.ts.map +0 -1
- package/out/postal/index.js.map +0 -1
- package/out/street/centroid/index.d.ts +0 -40
- package/out/street/centroid/index.d.ts.map +0 -1
- package/out/street/centroid/index.js.map +0 -1
- package/out/street/index.d.ts.map +0 -1
- package/out/street/index.js.map +0 -1
- package/out/uprn/index.d.ts.map +0 -1
- package/out/uprn/index.js.map +0 -1
- /package/lib/{geonames/index.ts → geonames.ts} +0 -0
- /package/lib/{nsul/index.ts → nsul.ts} +0 -0
- /package/lib/{poi/index.ts → poi.ts} +0 -0
- /package/lib/{postal/index.ts → postal.ts} +0 -0
- /package/lib/{uprn/index.ts → uprn.ts} +0 -0
|
@@ -2,26 +2,16 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* Typed schema for the byte-range CANDIDATE gazetteer (`candidate.db`) — the single source of truth
|
|
7
|
-
* for the columns shared by the BUILDER ({@link buildCandidateTable}) and the READERS (the Node
|
|
8
|
-
* {@link WOFCandidateTableLookup} + the browser `@mailwoman/resolver-wof-wasm/httpvfs/resolver`). Before this module each
|
|
9
|
-
* side hand-wrote the column list; a rename in one place broke the other at runtime. Now the
|
|
10
|
-
* contract is a Kysely `Database` interface (`new DatabaseClient<CandidateDatabase>(...)` for
|
|
11
|
-
* typed inserts) plus the table DDL as strings — so a column change is a compile error on every
|
|
12
|
-
* consumer.
|
|
13
|
-
*
|
|
14
|
-
* `cand_stage` is the transient staging table the builder bulk-loads; `candidate` is the clustered
|
|
15
|
-
* `WITHOUT ROWID` B-tree it's materialized into (same columns). The reader queries `candidate`.
|
|
16
5
|
*/
|
|
17
6
|
import { type Kysely } from "kysely";
|
|
18
7
|
import type { CandidateAncestorsDatabase } from "#candidate/ancestors/schema";
|
|
19
8
|
import type { CapitalTable } from "#capital-schema";
|
|
20
9
|
import type { NameKey } from "#street/normalize";
|
|
21
10
|
/**
|
|
22
|
-
* One candidate row.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
11
|
+
* One candidate row.
|
|
12
|
+
*
|
|
13
|
+
* `name_key`, four small integer keys, `neg_rank`, and `spr_id` form the clustered primary key.
|
|
14
|
+
* The remaining fields are denormalized so a resolve needs one probe.
|
|
25
15
|
*/
|
|
26
16
|
export interface CandidateTable {
|
|
27
17
|
/**
|
|
@@ -33,7 +23,7 @@ export interface CandidateTable {
|
|
|
33
23
|
*/
|
|
34
24
|
country_id: number;
|
|
35
25
|
/**
|
|
36
|
-
* The place's region-tier ancestor id, or 0
|
|
26
|
+
* The place's region-tier ancestor id, or 0.
|
|
37
27
|
*/
|
|
38
28
|
region_id: number;
|
|
39
29
|
/**
|
|
@@ -41,7 +31,10 @@ export interface CandidateTable {
|
|
|
41
31
|
*/
|
|
42
32
|
placetype_id: number;
|
|
43
33
|
/**
|
|
44
|
-
* `-log10(population + 1)
|
|
34
|
+
* `-log10(population + 1)`.
|
|
35
|
+
*
|
|
36
|
+
* The sort uses ascending order to put the highest population first.
|
|
37
|
+
* Postcodes use `0`.
|
|
45
38
|
*/
|
|
46
39
|
neg_rank: number;
|
|
47
40
|
/**
|
|
@@ -61,42 +54,14 @@ export interface CandidateTable {
|
|
|
61
54
|
*/
|
|
62
55
|
is_primary: number | null;
|
|
63
56
|
/**
|
|
64
|
-
* Blended place importance in [0, 1]
|
|
65
|
-
*
|
|
66
|
-
* Constant across every row of one place — primary, alias and abbrev alike — because it is a property of the PLACE,
|
|
67
|
-
* not of the name that reached it, which is what lets a bare `Moscow` inherit Москва's score through the alias row.
|
|
68
|
-
*
|
|
69
|
-
* **THIS IS THE PRE-SPLIT CONFLATION, AND THE NAME SAYS SO.** It is `place_importance.importance` copied verbatim
|
|
70
|
-
* from the score source — the bounded blend `place-importance-schema.ts`'s `blendImportance` writes (the
|
|
71
|
-
* concordance's encyclopedia-derived channel clamped around a population-derived base); that module calls the column
|
|
72
|
-
* DEPRECATED. It is NOT the split `encyclopedic` channel, and the two must not be conflated in a future build:
|
|
73
|
-
* writing the split value here instead was measured on 2026-08-10 and makes the ranking key INERT on three of the
|
|
74
|
-
* four rows it exists to fix. The reason is coverage, not principle — the encyclopedia-concordance join in
|
|
75
|
-
* `admin-global-priority-importance.db` reaches 133,888 of 702,709 scored places and only eleven countries
|
|
76
|
-
* (US/FR/GB/DE/IT/ES/NL/JP/CN/KR/TW). CA, AU and RU have ZERO concordance rows, so Whitby CA, Windsor CA and Epping
|
|
77
|
-
* AU carry the population fallback and nothing else. Under the strict split those three become unmeasured, the
|
|
78
|
-
* consumer's positive-evidence-only rule leaves them exactly where population put them (first), and the famous GB
|
|
79
|
-
* bearer can never overtake them. The conflated column is the only one on which every bearer of a name is scored on a
|
|
80
|
-
* single comparable scale, which is the precondition for comparing them at all.
|
|
81
|
-
*
|
|
82
|
-
* So a consumer reads this as "fame, with population standing in where fame was never measured" — the legacy blended
|
|
83
|
-
* semantics — and NOT as "this place has an encyclopedia entry of this importance". When the score source grows a
|
|
84
|
-
* real `encyclopedic` column for every country, add a SECOND column rather than redefining this one.
|
|
57
|
+
* Blended place importance in [0, 1], NULL when unmeasured (never zero) and copied
|
|
58
|
+
* verbatim from the pre-split score source rather than the split `encyclopedic` channel.
|
|
85
59
|
*/
|
|
86
60
|
importance: number | null;
|
|
87
61
|
/**
|
|
88
|
-
* The
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* (or English) — the #936 signal, measured at a 13× key-collision rate vs preferred names.
|
|
92
|
-
* - `'gloss'` — anomaly-based: the row belongs to a place whose key count crosses the gloss threshold with a non-admin
|
|
93
|
-
* placetype and NO measured prominence (population absent AND importance unmeasured) — the translation-gloss
|
|
94
|
-
* fingerprint (#1730's sweep; `Poisson` → a US fish-name place). Provenance CANNOT separate a gloss from an exonym
|
|
95
|
-
* (WOF imported both as `x_preferred`), which is why this detector is an anomaly test and stamps only the certain
|
|
96
|
-
* core.
|
|
97
|
-
*
|
|
98
|
-
* NULL = no role detected. The column is WRITE-ONLY in this build generation: no ranking consumer reads it — a rank
|
|
99
|
-
* penalty is its own future, D-rule-conditional step with the `gloss_key` board as regression check.
|
|
62
|
+
* The name's detected role on this row (`'abbr'`, `'gloss'` or `'variant'`),
|
|
63
|
+
* or NULL when no role was detected.
|
|
64
|
+
* The column is write-only in this build generation.
|
|
100
65
|
*/
|
|
101
66
|
name_role: string | null;
|
|
102
67
|
}
|
|
@@ -115,13 +80,12 @@ export interface PlacetypeCodeTable {
|
|
|
115
80
|
placetype: string;
|
|
116
81
|
}
|
|
117
82
|
/**
|
|
118
|
-
* The candidate database schema
|
|
119
|
-
*
|
|
120
|
-
* builder's one typed client covers every table in the artifact.
|
|
83
|
+
* The candidate database schema, extending the ancestors sidecar so one typed
|
|
84
|
+
* client covers every table in the artifact.
|
|
121
85
|
*/
|
|
122
86
|
export interface CandidateDatabase extends CandidateAncestorsDatabase {
|
|
123
87
|
/**
|
|
124
|
-
* The clustered `
|
|
88
|
+
* The clustered `without rowid` lookup table the reader probes.
|
|
125
89
|
*/
|
|
126
90
|
candidate: CandidateTable;
|
|
127
91
|
/**
|
|
@@ -131,25 +95,26 @@ export interface CandidateDatabase extends CandidateAncestorsDatabase {
|
|
|
131
95
|
country_codes: CountryCodeTable;
|
|
132
96
|
placetype_codes: PlacetypeCodeTable;
|
|
133
97
|
/**
|
|
134
|
-
* The capital-status reference
|
|
98
|
+
* The capital-status reference stored in the artifact.
|
|
99
|
+
* See capital-schema.ts.
|
|
135
100
|
*/
|
|
136
101
|
capital: CapitalTable;
|
|
137
102
|
}
|
|
138
103
|
/**
|
|
139
|
-
* The `candidate`/`cand_stage` columns in clustered-key order
|
|
140
|
-
*
|
|
141
|
-
* {@link CandidateTable}.
|
|
104
|
+
* The `candidate`/`cand_stage` columns in clustered-key order, from which the
|
|
105
|
+
* materialization derives its column list.
|
|
106
|
+
* Keep in sync with {@link CandidateTable}.
|
|
142
107
|
*/
|
|
143
108
|
export declare const CANDIDATE_COLUMNS: readonly ["name_key", "country_id", "region_id", "placetype_id", "neg_rank", "spr_id", "name", "latitude", "longitude", "min_lat", "min_lon", "max_lat", "max_lon", "population", "is_primary", "importance", "name_role"];
|
|
144
109
|
/**
|
|
145
|
-
* Create the code dictionaries
|
|
146
|
-
*
|
|
147
|
-
* {@link DatabaseClient} (or any `Kysely`) over the candidate DB.
|
|
110
|
+
* Create the code dictionaries and the transient staging table; `cand_stage` mirrors
|
|
111
|
+
* {@link CandidateTable} with every column nullable because the loader fills them positionally.
|
|
148
112
|
*/
|
|
149
113
|
export declare function createCandidateStagingTables(db: Kysely<CandidateDatabase>): Promise<void>;
|
|
150
114
|
/**
|
|
151
|
-
* Create the clustered `
|
|
152
|
-
*
|
|
115
|
+
* Create the clustered `without rowid` lookup table.
|
|
116
|
+
*
|
|
117
|
+
* Its first six columns form the primary key, ranked by population through `neg_rank`.
|
|
153
118
|
*/
|
|
154
119
|
export declare function createCandidateTable(db: Kysely<CandidateDatabase>): Promise<void>;
|
|
155
120
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../lib/candidate/schema.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../lib/candidate/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC9B;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,0BAA0B;IACpE;;OAEG;IACH,SAAS,EAAE,cAAc,CAAA;IACzB;;OAEG;IACH,UAAU,EAAE,cAAc,CAAA;IAC1B,aAAa,EAAE,gBAAgB,CAAA;IAC/B,eAAe,EAAE,kBAAkB,CAAA;IACnC;;;OAGG;IACH,OAAO,EAAE,YAAY,CAAA;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,YAC7B,UAAU,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,UAAU,EACV,QAAQ,EACR,MAAM,EACN,UAAU,EACV,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EAEZ,YAAY,EACZ,WAAW,CACF,CAAA;AAEV;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC/F;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BvF"}
|
package/out/candidate/schema.js
CHANGED
|
@@ -2,23 +2,12 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* Typed schema for the byte-range CANDIDATE gazetteer (`candidate.db`) — the single source of truth
|
|
7
|
-
* for the columns shared by the BUILDER ({@link buildCandidateTable}) and the READERS (the Node
|
|
8
|
-
* {@link WOFCandidateTableLookup} + the browser `@mailwoman/resolver-wof-wasm/httpvfs/resolver`). Before this module each
|
|
9
|
-
* side hand-wrote the column list; a rename in one place broke the other at runtime. Now the
|
|
10
|
-
* contract is a Kysely `Database` interface (`new DatabaseClient<CandidateDatabase>(...)` for
|
|
11
|
-
* typed inserts) plus the table DDL as strings — so a column change is a compile error on every
|
|
12
|
-
* consumer.
|
|
13
|
-
*
|
|
14
|
-
* `cand_stage` is the transient staging table the builder bulk-loads; `candidate` is the clustered
|
|
15
|
-
* `WITHOUT ROWID` B-tree it's materialized into (same columns). The reader queries `candidate`.
|
|
16
5
|
*/
|
|
17
6
|
import { sql } from "kysely";
|
|
18
7
|
/**
|
|
19
|
-
* The `candidate`/`cand_stage` columns in clustered-key order
|
|
20
|
-
*
|
|
21
|
-
* {@link CandidateTable}.
|
|
8
|
+
* The `candidate`/`cand_stage` columns in clustered-key order, from which the
|
|
9
|
+
* materialization derives its column list.
|
|
10
|
+
* Keep in sync with {@link CandidateTable}.
|
|
22
11
|
*/
|
|
23
12
|
export const CANDIDATE_COLUMNS = [
|
|
24
13
|
"name_key",
|
|
@@ -36,15 +25,13 @@ export const CANDIDATE_COLUMNS = [
|
|
|
36
25
|
"max_lon",
|
|
37
26
|
"population",
|
|
38
27
|
"is_primary",
|
|
39
|
-
// Appended, never inserted mid-list: the
|
|
40
|
-
// positional `INSERT INTO cand_stage VALUES (…)` in the builder binds by position.
|
|
28
|
+
// Appended, never inserted mid-list: the positional `insert into cand_stage values (…)` binds by position.
|
|
41
29
|
"importance",
|
|
42
30
|
"name_role",
|
|
43
31
|
];
|
|
44
32
|
/**
|
|
45
|
-
* Create the code dictionaries
|
|
46
|
-
*
|
|
47
|
-
* {@link DatabaseClient} (or any `Kysely`) over the candidate DB.
|
|
33
|
+
* Create the code dictionaries and the transient staging table; `cand_stage` mirrors
|
|
34
|
+
* {@link CandidateTable} with every column nullable because the loader fills them positionally.
|
|
48
35
|
*/
|
|
49
36
|
export async function createCandidateStagingTables(db) {
|
|
50
37
|
await db.schema
|
|
@@ -79,8 +66,9 @@ export async function createCandidateStagingTables(db) {
|
|
|
79
66
|
.execute();
|
|
80
67
|
}
|
|
81
68
|
/**
|
|
82
|
-
* Create the clustered `
|
|
83
|
-
*
|
|
69
|
+
* Create the clustered `without rowid` lookup table.
|
|
70
|
+
*
|
|
71
|
+
* Its first six columns form the primary key, ranked by population through `neg_rank`.
|
|
84
72
|
*/
|
|
85
73
|
export async function createCandidateTable(db) {
|
|
86
74
|
await db.schema
|
|
@@ -110,7 +98,7 @@ export async function createCandidateTable(db) {
|
|
|
110
98
|
"neg_rank",
|
|
111
99
|
"spr_id",
|
|
112
100
|
])
|
|
113
|
-
// `
|
|
101
|
+
// `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
|
|
114
102
|
.modifyEnd(sql `without rowid`)
|
|
115
103
|
.execute();
|
|
116
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../lib/candidate/schema.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../lib/candidate/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;AAuGzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAChC,UAAU;IACV,YAAY;IACZ,WAAW;IACX,cAAc;IACd,UAAU;IACV,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;IACX,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,2GAA2G;IAC3G,YAAY;IACZ,WAAW;CACF,CAAA;AAEV;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,EAA6B;IAC/E,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,eAAe,CAAC;SAC5B,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;SACjD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC5C,OAAO,EAAE,CAAA;IAEX,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,iBAAiB,CAAC;SAC9B,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;SACjD,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjD,OAAO,EAAE,CAAA;IAEX,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,YAAY,CAAC;SACzB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;SAC7B,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC;SAClC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC;SACjC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC;SACpC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;SAC7B,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC;SAC9B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;SACzB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;SAC7B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;SAC9B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC;SAClC,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC;SAClC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;SAC/B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;SAC9B,OAAO,EAAE,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,EAA6B;IACvE,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,WAAW,CAAC;SACxB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACtD,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACxD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAClD,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;SACzB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;SAC7B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;SAC9B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;SAC5B,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC;SAClC,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC;SAClC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;SAC/B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;SAC9B,uBAAuB,CAAC,cAAc,EAAE;QACxC,UAAU;QACV,YAAY;QACZ,WAAW;QACX,cAAc;QACd,UAAU;QACV,QAAQ;KACR,CAAC;QACF,0FAA0F;SACzF,SAAS,CAAC,GAAG,CAAA,eAAe,CAAC;SAC7B,OAAO,EAAE,CAAA;AACZ,CAAC"}
|
|
@@ -2,18 +2,17 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* How a raw `place_search` row becomes a scored `PlaceCandidate`, and how the resulting pool is
|
|
7
|
-
* ordered — the weighted-sum score and the exact-match tiering that ranks over it.
|
|
8
5
|
*/
|
|
9
6
|
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
10
7
|
import { type RankingWeights } from "#ranking-weights";
|
|
11
8
|
import type { RawSearchRow } from "#search-fetch";
|
|
12
9
|
import type { FindPlaceQuery, PlaceCandidate, WOFPlacetype } from "#types";
|
|
13
10
|
/**
|
|
14
|
-
* Score one raw FTS row into a `PlaceCandidate`: the weighted sum over the negated
|
|
15
|
-
*
|
|
16
|
-
*
|
|
11
|
+
* Score one raw FTS row into a `PlaceCandidate`: the weighted sum over the negated
|
|
12
|
+
* BM25 baseline plus placetype, country and parent boosts.
|
|
13
|
+
*
|
|
14
|
+
* It also applies the length penalty, proximity and population terms,
|
|
15
|
+
* then returns the fields consumers read.
|
|
17
16
|
*/
|
|
18
17
|
export declare function candidateFromSearchRow(row: RawSearchRow, context: {
|
|
19
18
|
query: FindPlaceQuery;
|
|
@@ -22,8 +21,8 @@ export declare function candidateFromSearchRow(row: RawSearchRow, context: {
|
|
|
22
21
|
weights: RankingWeights;
|
|
23
22
|
}): PlaceCandidate;
|
|
24
23
|
/**
|
|
25
|
-
* Order `candidates`
|
|
26
|
-
*
|
|
24
|
+
* Order `candidates` in place with the exact-match tier first when the extract can answer name probes.
|
|
25
|
+
* Stamp every candidate's `exactMatch` flag.
|
|
27
26
|
*/
|
|
28
27
|
export declare function rankCandidates<DB>(candidates: PlaceCandidate[], options: {
|
|
29
28
|
db: DatabaseClient<DB>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../lib/candidate/scoring.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../lib/candidate/scoring.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAI9D,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAE1E;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE;IACR,KAAK,EAAE,cAAc,CAAA;IACrB,UAAU,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;CACvB,GACC,cAAc,CA2GhB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAChC,UAAU,EAAE,cAAc,EAAE,EAC5B,OAAO,EAAE;IACR,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,cAAc,CAAA;CACvB,GACC,IAAI,CAqEN"}
|
package/out/candidate/scoring.js
CHANGED
|
@@ -2,24 +2,22 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* How a raw `place_search` row becomes a scored `PlaceCandidate`, and how the resulting pool is
|
|
7
|
-
* ordered — the weighted-sum score and the exact-match tiering that ranks over it.
|
|
8
5
|
*/
|
|
9
6
|
import { compareReferential, referentialFromPopulation } from "@mailwoman/core/resolver";
|
|
10
7
|
import { haversineKm } from "@mailwoman/spatial";
|
|
11
8
|
import { exactMatchIDs, officialNameIDs } from "#exact-match";
|
|
12
|
-
import { foldQueryText } from "#fts
|
|
9
|
+
import { foldQueryText } from "#fts";
|
|
13
10
|
import { populationBoostTerm } from "#ranking-weights";
|
|
14
11
|
/**
|
|
15
|
-
* Score one raw FTS row into a `PlaceCandidate`: the weighted sum over the negated
|
|
16
|
-
*
|
|
17
|
-
*
|
|
12
|
+
* Score one raw FTS row into a `PlaceCandidate`: the weighted sum over the negated
|
|
13
|
+
* BM25 baseline plus placetype, country and parent boosts.
|
|
14
|
+
*
|
|
15
|
+
* It also applies the length penalty, proximity and population terms,
|
|
16
|
+
* then returns the fields consumers read.
|
|
18
17
|
*/
|
|
19
18
|
export function candidateFromSearchRow(row, context) {
|
|
20
19
|
const { query, placetypes, queryLen, weights } = context;
|
|
21
|
-
// SQLite's bm25()
|
|
22
|
-
// start from a higher-is-better baseline.
|
|
20
|
+
// SQLite's bm25() is lower-is-better, so negate it to get a higher-is-better baseline.
|
|
23
21
|
let score = -row.rank;
|
|
24
22
|
if (placetypes && placetypes.length && placetypes.includes(row.placetype)) {
|
|
25
23
|
score += weights.placetypeMatchBoost;
|
|
@@ -35,13 +33,10 @@ export function candidateFromSearchRow(row, context) {
|
|
|
35
33
|
}
|
|
36
34
|
const extraLen = Math.max(0, row.name.length - queryLen - 3);
|
|
37
35
|
score -= (weights.lengthPenaltyWeight * extraLen) / 10;
|
|
38
|
-
// Proximity boost
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// The best decayed-distance term over `near` + every `bias` point (each point's term is
|
|
43
|
-
// scaled by its weight; the MAX wins — a candidate near ANY hint is "nearby"). Carried
|
|
44
|
-
// into the exact-tier prominence sort below when hints are present.
|
|
36
|
+
// Proximity boost applies only when the query includes `near` and the candidate has real coordinates.
|
|
37
|
+
// The decay is tunable via proximityBoost + proximityScaleKm.
|
|
38
|
+
let distanceKm = null;
|
|
39
|
+
// The best decayed-distance term over `near` and every `bias` point wins, each scaled by its weight.
|
|
45
40
|
let proximityTerm = 0;
|
|
46
41
|
if (row.lat !== null && row.lon !== null && !(row.lat === 0 && row.lon === 0)) {
|
|
47
42
|
const hints = [];
|
|
@@ -64,14 +59,19 @@ export function candidateFromSearchRow(row, context) {
|
|
|
64
59
|
}
|
|
65
60
|
score += scoreTerm;
|
|
66
61
|
}
|
|
67
|
-
// Population boost
|
|
68
|
-
// people. Missing population → no contribution. Never penalizes.
|
|
62
|
+
// Population boost caps at `populationBoost` magnitude at `10^populationScaleLog10` people and never penalizes.
|
|
69
63
|
const popTerm = populationBoostTerm(row.population, weights);
|
|
70
64
|
score += popTerm;
|
|
71
|
-
// Combined prominence for the exact-tier sort
|
|
72
|
-
//
|
|
73
|
-
// cross-country postcode tie without a hard filter.
|
|
65
|
+
// Combined prominence for the exact-tier sort: population and nearness in the same
|
|
66
|
+
// additive units, so hints can win a cross-country postcode tie without a hard filter.
|
|
74
67
|
const prominence = popTerm + proximityTerm;
|
|
68
|
+
const population = row.population !== null && row.population > 0 ? row.population : null;
|
|
69
|
+
// The referential key derives from this row's population and no other field,
|
|
70
|
+
// so it cannot drift from the ordering.
|
|
71
|
+
// Consumers read the encyclopedic value.
|
|
72
|
+
// No ranking site reads it.
|
|
73
|
+
// The bbox gives parity with the wasm lookup.
|
|
74
|
+
// Without it the region→bbox constraint is dead and disambiguation falls to population ranking.
|
|
75
75
|
const candidate = {
|
|
76
76
|
id: row.id,
|
|
77
77
|
prominence,
|
|
@@ -80,77 +80,49 @@ export function candidateFromSearchRow(row, context) {
|
|
|
80
80
|
country: row.country ?? "",
|
|
81
81
|
lat: row.lat ?? 0,
|
|
82
82
|
lon: row.lon ?? 0,
|
|
83
|
-
parent_id: row.parent_id ??
|
|
83
|
+
parent_id: row.parent_id ?? null,
|
|
84
84
|
score,
|
|
85
|
+
distanceKm,
|
|
86
|
+
exactMatch: null,
|
|
87
|
+
population,
|
|
88
|
+
referential: population === null ? null : referentialFromPopulation(population),
|
|
89
|
+
encyclopedic: row.encyclopedic ?? null,
|
|
90
|
+
importance: null,
|
|
91
|
+
bbox: row.min_latitude != null && row.max_latitude != null && row.min_longitude != null && row.max_longitude != null
|
|
92
|
+
? {
|
|
93
|
+
minLat: row.min_latitude,
|
|
94
|
+
maxLat: row.max_latitude,
|
|
95
|
+
minLon: row.min_longitude,
|
|
96
|
+
maxLon: row.max_longitude,
|
|
97
|
+
}
|
|
98
|
+
: null,
|
|
99
|
+
mismatch: null,
|
|
100
|
+
containedByQualifier: null,
|
|
101
|
+
regionScopeMiss: null,
|
|
102
|
+
variantAliasExempted: null,
|
|
85
103
|
};
|
|
86
|
-
if (distanceKm !== undefined) {
|
|
87
|
-
candidate.distanceKm = distanceKm;
|
|
88
|
-
}
|
|
89
|
-
if (row.population !== null && row.population > 0) {
|
|
90
|
-
candidate.population = row.population;
|
|
91
|
-
// The named ranking key (ROAD_TO_V9 §2). DERIVED, not stored — a pure function of the
|
|
92
|
-
// population already on this row, so it cannot drift from what the ordering uses.
|
|
93
|
-
candidate.referential = referentialFromPopulation(row.population);
|
|
94
|
-
}
|
|
95
|
-
// Carried for consumers (annotations / API surfaces). No ranking site reads it.
|
|
96
|
-
if (row.encyclopedic !== null) {
|
|
97
|
-
candidate.encyclopedic = row.encyclopedic;
|
|
98
|
-
}
|
|
99
|
-
// Candidate bbox — parity with the WASM lookup (resolver-wof-wasm/lookup.ts), whose
|
|
100
|
-
// consumers (the demo cascade's region constraint) read it. Without this the Node
|
|
101
|
-
// backend's region→bbox constraint is dead and disambiguation falls to population
|
|
102
|
-
// ranking (the Springfield-IL→MO failure the #524 smoke eval caught).
|
|
103
|
-
if (row.min_latitude != null && row.max_latitude != null && row.min_longitude != null && row.max_longitude != null) {
|
|
104
|
-
candidate.bbox = {
|
|
105
|
-
minLat: row.min_latitude,
|
|
106
|
-
maxLat: row.max_latitude,
|
|
107
|
-
minLon: row.min_longitude,
|
|
108
|
-
maxLon: row.max_longitude,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
104
|
return candidate;
|
|
112
105
|
}
|
|
113
106
|
/**
|
|
114
|
-
* Order `candidates`
|
|
115
|
-
*
|
|
107
|
+
* Order `candidates` in place with the exact-match tier first when the extract can answer name probes.
|
|
108
|
+
* Stamp every candidate's `exactMatch` flag.
|
|
116
109
|
*/
|
|
117
110
|
export function rankCandidates(candidates, options) {
|
|
118
111
|
const { db, schemaName, query, weights } = options;
|
|
119
|
-
// Exact-match tiering
|
|
120
|
-
//
|
|
121
|
-
// WITHIN a tier. See the RankingWeights.exactMatchTiering docstring for why this aligns the
|
|
122
|
-
// population prior rather than overriding it. One cheap indexed lookup over the candidate ids.
|
|
123
|
-
// Runs even for a SINGLE candidate so `exactMatch` is stamped consistently (parity with the
|
|
124
|
-
// WASM lookup) — a sole alias hit ("New York City" → New York) must still carry the flag the
|
|
125
|
-
// demo cascade / #369 re-rank read.
|
|
112
|
+
// Exact-match tiering ranks a case-folded full match above a partial one.
|
|
113
|
+
// It also runs for a single candidate so `exactMatch` is stamped consistently.
|
|
126
114
|
if (weights.exactMatchTiering && candidates.length) {
|
|
127
115
|
const exactIDs = exactMatchIDs(db, schemaName, candidates.map((c) => c.id), query.text);
|
|
128
|
-
// Stamp the tier onto every candidate
|
|
129
|
-
//
|
|
130
|
-
// crossing the exact/partial boundary ("ME" → Maine, not the more-populous Missouri).
|
|
116
|
+
// Stamp the tier onto every candidate so a downstream re-rank's country pin
|
|
117
|
+
// cannot cross the exact/partial boundary.
|
|
131
118
|
for (const c of candidates) {
|
|
132
119
|
c.exactMatch = exactIDs.has(c.id);
|
|
133
120
|
}
|
|
134
121
|
if (exactIDs.size) {
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
// residue inside `score` is length-noise (see the fetch-site comment), so letting it
|
|
138
|
-
// order the tier is what sent unscoped "Paris" to an Ohio township. The partial tier
|
|
139
|
-
// keeps score order — text relevance still means something there. This makes the
|
|
140
|
-
// exactMatchTiering docstring literal: match quality primary, prominence within.
|
|
141
|
-
//
|
|
142
|
-
// #912 sub-tier: a NAME-exact candidate (spr.name equals the query) outranks an
|
|
143
|
-
// ALIAS-exact one ('Paris' the place beats 'Paris Township' held via alias 'Paris').
|
|
144
|
-
// The place's own name is a stronger identity claim than an alias — aliases exist to
|
|
145
|
-
// widen recall, not to tie primaries. ME→Maine is untouched: 'ME' name-exact-matches
|
|
146
|
-
// nothing, so the alias sub-tier still decides there. Population orders within each
|
|
147
|
-
// sub-tier as before.
|
|
122
|
+
// Within the exact tier, population is the primary key and the score only breaks
|
|
123
|
+
// ties. a name-exact candidate outranks an alias-exact one.
|
|
148
124
|
const needle = foldQueryText(query.text);
|
|
149
|
-
//
|
|
150
|
-
// country, `names.official = 1`) counts as the place's own name for the sub-tier — "Åbo" is
|
|
151
|
-
// Turku's name, not merely its alias. Floor-conditioned on the holder's population (see the
|
|
152
|
-
// RankingWeights docstring for the measured 100k boundary). officialIDs ⊆ exactIDs by
|
|
153
|
-
// construction (official rows are names rows), so only the sub-tier KIND changes.
|
|
125
|
+
// An official name counts as the place's own name for the sub-tier, floor-conditioned on the holder's population.
|
|
154
126
|
const officialIDs = weights.officialNameExact
|
|
155
127
|
? officialNameIDs(db, schemaName, candidates
|
|
156
128
|
.filter((c) => exactIDs.has(c.id) && (c.population ?? 0) >= weights.officialNameExactFloor)
|
|
@@ -163,18 +135,9 @@ export function rankCandidates(candidates, options) {
|
|
|
163
135
|
return 2;
|
|
164
136
|
return officialIDs?.has(c.id) ? 2 : 1;
|
|
165
137
|
};
|
|
166
|
-
// With proximity hints
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
// ordering decides.
|
|
170
|
-
//
|
|
171
|
-
// ROAD_TO_V9 §2: this is the site that "orders namesakes", so it is the site that has to
|
|
172
|
-
// say what it orders by. `compareReferential` is referential DESC with raw population as
|
|
173
|
-
// the tiebreak, which is provably the SAME ORDER as the `(b.population ?? 0) - (a.population ?? 0)`
|
|
174
|
-
// it replaces — referential is strictly increasing in population below saturation and
|
|
175
|
-
// constant above it, and the tiebreak restores the order in the saturated tail. Measured
|
|
176
|
-
// zero-delta, not assumed: see `place-importance-schema.test.ts` and `resolver-referential-ranking.test.ts`.
|
|
177
|
-
// Encyclopedic importance is not, and must not become, an input here.
|
|
138
|
+
// With proximity hints, prominence replaces raw population as the within-tier key.
|
|
139
|
+
// Without them, referential ordering decides.
|
|
140
|
+
// Encyclopedic importance does not affect this order.
|
|
178
141
|
const hasHints = !!query.near || (query.bias?.length ?? 0) > 0;
|
|
179
142
|
candidates.sort((a, b) => {
|
|
180
143
|
const ax = kind(a);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../lib/candidate/scoring.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../lib/candidate/scoring.ts"],"names":[],"mappings":"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"}
|
package/out/capital-schema.d.ts
CHANGED
|
@@ -3,27 +3,28 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* The `capital` table
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* per-probe query and no index beyond the rowid.
|
|
6
|
+
* The `capital` table: the capital-status reference included inside `candidate.db`, so an npm
|
|
7
|
+
* consumer who pulled the artifact can run `capital_tier` without the repo's
|
|
8
|
+
* `data/gazetteer/capitals-v1.json`, which published packages do not ship. One row per reference
|
|
9
|
+
* entry. The loader reads the whole table once into a `CapitalIndex` at session construction, so
|
|
10
|
+
* there is no per-probe query and no index beyond the rowid.
|
|
12
11
|
*
|
|
13
|
-
* `keys` holds the entry's folded name set as a JSON array
|
|
14
|
-
*
|
|
12
|
+
* `keys` holds the entry's folded name set as a JSON array, the name-membership conjunct that keeps
|
|
13
|
+
* the coordinate radius from promoting a capital's same-name neighbors (`capitals.ts`).
|
|
15
14
|
*/
|
|
16
15
|
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
17
16
|
import type { Kysely } from "kysely";
|
|
18
17
|
import type { CapitalPoint } from "#capitals";
|
|
19
18
|
/**
|
|
20
|
-
* The table name the builder writes and the reader probes
|
|
21
|
-
* tables (`candidate`, `country_codes`).
|
|
19
|
+
* The table name the builder writes and the reader probes, one word and singular,
|
|
20
|
+
* matching the artifact's other reference tables (`candidate`, `country_codes`).
|
|
22
21
|
*/
|
|
23
22
|
export declare const CAPITAL_TABLE = "capital";
|
|
24
23
|
/**
|
|
25
|
-
* One reference entry as the artifact stores it.
|
|
26
|
-
*
|
|
24
|
+
* One reference entry as the artifact stores it.
|
|
25
|
+
*
|
|
26
|
+
* `level` is the reference vocabulary (`national` | `admin1`) kept as text.
|
|
27
|
+
* and the reader validates on load rather than trusting bytes.
|
|
27
28
|
*/
|
|
28
29
|
export interface CapitalTable {
|
|
29
30
|
country: string;
|
|
@@ -36,16 +37,19 @@ export interface CapitalTable {
|
|
|
36
37
|
keys: string;
|
|
37
38
|
}
|
|
38
39
|
/**
|
|
39
|
-
* Create the table on a build in progress.
|
|
40
|
-
*
|
|
40
|
+
* Create the table on a build in progress.
|
|
41
|
+
*
|
|
42
|
+
* Async because Kysely's schema-builder is.
|
|
43
|
+
* Called from the candidate build's DDL phase alongside the other typed builders.
|
|
41
44
|
*/
|
|
42
45
|
export declare function createCapitalTable<DB extends {
|
|
43
46
|
capital: CapitalTable;
|
|
44
47
|
}>(db: Kysely<DB>): Promise<void>;
|
|
45
48
|
/**
|
|
46
|
-
* Read the whole reference out of an artifact, or `null` when the artifact predates the table
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
+
* Read the whole reference out of an artifact, or `null` when the artifact predates the table.
|
|
50
|
+
*
|
|
51
|
+
* The caller then falls back to its next source rather than treating an old artifact as "no
|
|
52
|
+
* capitals" (the meaning-of-zero rule: a missing table is unmeasured, an empty one is a finding).
|
|
49
53
|
*/
|
|
50
54
|
export declare function readCapitalPoints<DB>(db: DatabaseClient<DB>): CapitalPoint[] | null;
|
|
51
55
|
//# sourceMappingURL=capital-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capital-schema.d.ts","sourceRoot":"","sources":["../lib/capital-schema.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"capital-schema.d.ts","sourceRoot":"","sources":["../lib/capital-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7C;;;GAGG;AACH,eAAO,MAAM,aAAa,YAAY,CAAA;AAEtC;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,SAAS;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5G;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,IAAI,CAwBnF"}
|