From 78c358d5e8852c651ae95c369510b022aeb2b7b4 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 23 Jun 2026 10:27:39 +0000 Subject: [PATCH 01/15] tweak script to use provided input. track output in md file --- scripts/list_properties_by_postcode.py | 47 + scripts/processed_postcodes_796.md | 8 + scripts/properties_by_postcode_796.txt | 4052 ++++++++++++++++++++++++ scripts/trigger_modelling_e2e_sqs.py | 148 +- 4 files changed, 4196 insertions(+), 59 deletions(-) create mode 100644 scripts/list_properties_by_postcode.py create mode 100644 scripts/processed_postcodes_796.md create mode 100644 scripts/properties_by_postcode_796.txt diff --git a/scripts/list_properties_by_postcode.py b/scripts/list_properties_by_postcode.py new file mode 100644 index 00000000..cea357ea --- /dev/null +++ b/scripts/list_properties_by_postcode.py @@ -0,0 +1,47 @@ +"""Print a dict of postcode → property IDs for a portfolio, sorted by group size. + +Edit PORTFOLIO_ID below, then hit Run. +""" + +from __future__ import annotations + +# --------------------------------------------------------------------------- +# CONFIG +# --------------------------------------------------------------------------- +PORTFOLIO_ID: int = 796 +# --------------------------------------------------------------------------- + +import sys +from collections import defaultdict +from pathlib import Path + +_REPO_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(_REPO_ROOT)) + +from sqlalchemy import text # noqa: E402 + +from scripts.e2e_common import ENV_PATH, build_engine, load_env # noqa: E402 + +load_env(ENV_PATH) +engine = build_engine() + +with engine.connect() as conn: + rows = conn.execute( + text("SELECT id, postcode FROM property WHERE portfolio_id = :pid ORDER BY postcode, id"), + {"pid": PORTFOLIO_ID}, + ).fetchall() + +by_postcode: dict[str, list[int]] = defaultdict(list) +for pid, postcode in rows: + by_postcode[postcode or "UNKNOWN"].append(int(pid)) + +sorted_dict = dict(sorted(by_postcode.items(), key=lambda kv: len(kv[1]))) + +output_path = _REPO_ROOT / "scripts" / f"properties_by_postcode_{PORTFOLIO_ID}.txt" + +lines = [f"{postcode!r}: {ids}" for postcode, ids in sorted_dict.items()] +lines.append( + f"\nTotal postcodes: {len(sorted_dict)}, total properties: {sum(len(v) for v in sorted_dict.values())}" +) +output_path.write_text("\n".join(lines), encoding="utf-8") +print(f"Saved to {output_path}") diff --git a/scripts/processed_postcodes_796.md b/scripts/processed_postcodes_796.md new file mode 100644 index 00000000..ca563834 --- /dev/null +++ b/scripts/processed_postcodes_796.md @@ -0,0 +1,8 @@ +# Processed Properties — Portfolio 796 + +| Postcode | Property IDs | Processed | +|----------|--------------|-----------| +| BN10 8EQ | 739489 | 2026-06-23 | +| BN11 2LT | 740998 | 2026-06-23 | +| BN11 2NH | 733234 | 2026-06-23 | +| BN11 4EP | 730259 | 2026-06-23 | diff --git a/scripts/properties_by_postcode_796.txt b/scripts/properties_by_postcode_796.txt new file mode 100644 index 00000000..69db013a --- /dev/null +++ b/scripts/properties_by_postcode_796.txt @@ -0,0 +1,4052 @@ +'BN10 8EQ': [739489] +'BN11 2LT': [740998] +'BN11 2NH': [733234] +'BN11 4EP': [730259] +'BN11 4HB': [733255] +'BN13 2NN': [739497] +'BN13 2QP': [739481] +'BN14 7EH': [725823] +'BN15 0DU': [739485] +'BN15 0LT': [731504] +'BN15 0NF': [739509] +'BN15 9HT': [739500] +'BN15 9JB': [723564] +'BN15 9LH': [715324] +'BN15 9PA': [715063] +'BN1 5LA': [725286] +'BN16 3HL': [719864] +'BN17 6RE': [717496] +'BN17 7NS': [715550] +'BN1 7BX': [723873] +'BN1 7EH': [726123] +'BN1 7ER': [739508] +'BN18 0RT': [719161] +'BN1 8DH': [727964] +'BN1 8LG': [719523] +'BN1 9BW': [733567] +'BN1 9BZ': [733592] +'BN2 0AE': [715891] +'BN2 0FB': [715445] +'BN2 3PE': [733597] +'BN2 4BE': [728215] +'BN2 4JS': [731660] +'BN2 4LL': [715371] +'BN2 4PL': [716049] +'BN2 4RT': [710129] +'BN2 4RW': [725006] +'BN2 4TJ': [726521] +'BN2 4TQ': [726467] +'BN2 6TL': [727827] +'BN2 8LS': [725067] +'BN2 9ZN': [721815] +'BN3 1DL': [741420] +'BN3 5AE': [729390] +'BN3 5AG': [726500] +'BN3 7FN': [717435] +'BN41 1DQ': [722904] +'BN41 1SA': [731765] +'BN41 2TP': [723881] +'BN42 4HS': [728370] +'BN43 5LA': [724702] +'BN43 5ZE': [741057] +'BN43 6NN': [728476] +'BN43 6WE': [741142] +'BN44 3JG': [720812] +'BN44 3JH': [719419] +'BN44 3JT': [712902] +'BN7 2QF': [733723] +'BR1 2ND': [741004] +'BR1 2SN': [718709] +'BR1 3LR': [728414] +'BR1 3PE': [712401] +'BR1 3QH': [733236] +'BR1 3QJ': [726048] +'BR1 3QW': [711383] +'BR1 3RG': [715615] +'BR1 3RW': [728883] +'BR1 3ST': [712335] +'BR1 4DE': [723589] +'BR1 4JZ': [730244] +'BR1 4NW': [726966] +'BR1 4PU': [717828] +'BR1 4PY': [711228] +'BR1 4QF': [710339] +'BR1 4QQ': [729946] +'BR1 4QW': [710693] +'BR1 4RE': [722824] +'BR1 4SA': [733315] +'BR1 4SG': [711136] +'BR1 4SH': [730586] +'BR1 5BB': [731579] +'BR1 5EG': [726592] +'BR1 5EN': [723121] +'BR1 5EP': [714805] +'BR1 5ER': [715406] +'BR1 5EZ': [719897] +'BR1 5HD': [724945] +'BR1 5JE': [720560] +'BR1 5JL': [719502] +'BR1 5JU': [716362] +'BR1 5JZ': [730800] +'BR1 5LG': [730157] +'BR1 5LJ': [715519] +'BR1 5LQ': [716706] +'BR1 5LR': [710094] +'BR1 5LZ': [726131] +'BR1 5NA': [727953] +'BR1 5NF': [731049] +'BR1 5NL': [720224] +'BR1 5NT': [716319] +'BR1 5PD': [730414] +'BR1 5PQ': [733200] +'BR2 0BB': [718138] +'BR2 0BX': [718110] +'BR2 0EU': [715408] +'BR2 0QW': [728596] +'BR2 7PP': [715575] +'BR2 8BZ': [725415] +'BR2 8DJ': [728039] +'BR2 8EB': [711443] +'BR2 8ET': [729387] +'BR2 8EX': [723816] +'BR2 8JA': [722216] +'BR2 8JH': [713040] +'BR2 8JN': [717726] +'BR2 8NT': [729652] +'BR2 9NG': [726023] +'BR2 9PS': [715135] +'BR2 9QT': [715885] +'BR3 1JN': [721167] +'BR3 3RU': [714690] +'BR3 3TJ': [712415] +'BR3 4AN': [728165] +'BR3 4AZ': [711119] +'BR3 4BE': [711841] +'BR3 4DS': [712123] +'BR3 4EJ': [720836] +'BR3 4NR': [725832] +'BR3 4RL': [710671] +'BR3 4SE': [738255] +'BR3 4TA': [710177] +'BR3 4TN': [710228] +'BR3 4TR': [720142] +'BR5 1RE': [710895] +'BR5 1RF': [729786] +'BR5 1RJ': [718689] +'BR5 1RZ': [726505] +'BR5 2AA': [727145] +'BR5 2AE': [709928] +'BR5 2AP': [716876] +'BR5 2EH': [726623] +'BR5 2EU': [712853] +'BR5 2EX': [731463] +'BR5 2EY': [731431] +'BR5 2HJ': [733098] +'BR5 2HR': [726670] +'BR5 2JE': [723202] +'BR5 2JF': [719958] +'BR5 2JJ': [731114] +'BR5 2JZ': [720639] +'BR5 2LE': [730308] +'BR5 2LP': [721961] +'BR5 2LU': [729884] +'BR5 2NQ': [717286] +'BR5 2NX': [715084] +'BR5 2NY': [722047] +'BR5 2PE': [732184] +'BR5 2PW': [710451] +'BR5 2QA': [725512] +'BR5 2QE': [730407] +'BR5 2QG': [733292] +'BR5 2QN': [711674] +'BR5 2QZ': [727060] +'BR5 2RL': [721863] +'BR5 2RU': [729041] +'BR5 2RY': [732492] +'BR5 2SA': [723988] +'BR5 2SH': [721671] +'BR5 2SL': [718060] +'BR5 2SU': [711654] +'BR5 2TD': [710482] +'BR5 2TQ': [710089] +'BR5 3AH': [710295] +'BR5 3AZ': [713449] +'BR5 3BA': [729382] +'BR5 3BZ': [711663] +'BR5 3DE': [732559] +'BR5 3DS': [711129] +'BR5 3DW': [710412] +'BR5 3DX': [715320] +'BR5 3DY': [733321] +'BR5 3EE': [709934] +'BR5 3JH': [710809] +'BR5 3JW': [729134] +'BR5 3NS': [727170] +'BR5 3SA': [724109] +'BR5 3SN': [711050] +'BR5 3TG': [721649] +'BR5 4EB': [725155] +'BR5 4HH': [720474] +'BR5 4JS': [727495] +'BR5 4JU': [719874] +'BR5 4LB': [739510] +'BR5 4LH': [733176] +'BR5 4LJ': [711356] +'BR5 4NF': [731152] +'BR5 4NZ': [721077] +'BR6 0JE': [710302] +'BR6 0RH': [726351] +'BR6 0RJ': [723648] +'BR6 0RQ': [710822] +'BR6 0TP': [711744] +'BR6 0TS': [711143] +'BR6 0TX': [710635] +'BR6 0WD': [721241] +'BR6 6AX': [718304] +'BR6 6BJ': [724422] +'BR6 6BS': [718580] +'BR6 8PB': [710409] +'BR6 9DL': [719863] +'BR6 9JA': [718120] +'BR6 9JB': [720844] +'BR6 9SG': [726653] +'BR6 9SR': [710846] +'BR6 9TF': [710338] +'BR7 5BT': [712503] +'BR7 6DE': [723383] +'BR7 6EP': [723237] +'BR7 6EQ': [724792] +'BR7 6HX': [724367] +'CR0 0AA': [724523] +'CR0 0AD': [725853] +'CR0 0AS': [726517] +'CR0 0AW': [715316] +'CR0 0AZ': [728162] +'CR0 0BL': [721230] +'CR0 0BW': [715881] +'CR0 0BY': [717853] +'CR0 0DA': [718722] +'CR0 0DD': [714585] +'CR0 0DQ': [729756] +'CR0 0DS': [713994] +'CR0 0DT': [715894] +'CR0 0DZ': [723142] +'CR0 0EF': [713948] +'CR0 0EH': [723474] +'CR0 0ES': [730876] +'CR0 0EU': [732153] +'CR0 0EW': [726326] +'CR0 0EY': [724801] +'CR0 0HQ': [730322] +'CR0 0HU': [721421] +'CR0 0HW': [711307] +'CR0 0HY': [722228] +'CR0 0LA': [731278] +'CR0 0NY': [726437] +'CR0 0PB': [714581] +'CR0 0PR': [721131] +'CR0 0QB': [723144] +'CR0 0QF': [731381] +'CR0 0QJ': [718502] +'CR0 0QL': [732396] +'CR0 0QQ': [716597] +'CR0 0QS': [720517] +'CR0 0QT': [733111] +'CR0 0QW': [714327] +'CR0 0RA': [719647] +'CR0 0RN': [720625] +'CR0 0RS': [718934] +'CR0 0RW': [721697] +'CR0 0RX': [713495] +'CR0 0TL': [730121] +'CR0 0TP': [731491] +'CR0 0TW': [731163] +'CR0 0TX': [714546] +'CR0 0TY': [729685] +'CR0 1AB': [732024] +'CR0 1AQ': [721902] +'CR0 1DS': [721784] +'CR0 1SR': [722437] +'CR0 2BJ': [730056] +'CR0 2DJ': [720236] +'CR0 2ER': [717359] +'CR0 2ES': [723654] +'CR0 2HG': [716082] +'CR0 2HH': [738299] +'CR0 2JL': [721399] +'CR0 2JW': [723744] +'CR0 2JZ': [720331] +'CR0 2PJ': [726605] +'CR0 2QJ': [716441] +'CR0 2QW': [729924] +'CR0 2QY': [715687] +'CR0 2SH': [733067] +'CR0 2TQ': [726606] +'CR0 2UA': [738274] +'CR0 2UT': [738254] +'CR0 2XT': [716861] +'CR0 3AL': [731011] +'CR0 3BD': [719199] +'CR0 3BS': [715695] +'CR0 3EQ': [722062] +'CR0 3EW': [721163] +'CR0 3EZ': [724915] +'CR0 3JQ': [715114] +'CR0 3JT': [720515] +'CR0 3JY': [730147] +'CR0 3LS': [725014] +'CR0 3NW': [728751] +'CR0 3NY': [728695] +'CR0 3PR': [731911] +'CR0 3PS': [726631] +'CR0 3PY': [738258] +'CR0 3RB': [720335] +'CR0 3RT': [721755] +'CR0 3SA': [732644] +'CR0 3SJ': [723733] +'CR0 4DH': [730665] +'CR0 4DT': [713117] +'CR0 4DY': [725914] +'CR0 4DZ': [713887] +'CR0 4EH': [727451] +'CR0 4EU': [722979] +'CR0 4EW': [727120] +'CR0 4HS': [720368] +'CR0 4JU': [729363] +'CR0 4LT': [738250] +'CR0 4RJ': [728721] +'CR0 6DX': [715734] +'CR0 6EJ': [732248] +'CR0 6JD': [729154] +'CR0 6NB': [738284] +'CR0 6NF': [718139] +'CR0 6QW': [716594] +'CR0 6RS': [721749] +'CR0 6TG': [717952] +'CR0 6UJ': [732575] +'CR0 7AD': [738293] +'CR0 7AS': [726140] +'CR0 7AZ': [732306] +'CR0 7BA': [724495] +'CR0 7TD': [728250] +'CR0 7TJ': [715647] +'CR0 7TR': [718516] +'CR0 7TY': [721165] +'CR0 7YG': [720433] +'CR0 8JB': [718092] +'CR0 8JP': [729859] +'CR0 8NE': [720616] +'CR0 8NQ': [716486] +'CR0 9DP': [729913] +'CR0 9EA': [731941] +'CR0 9EB': [727157] +'CR0 9ED': [723381] +'CR0 9EE': [714672] +'CR0 9EG': [718058] +'CR0 9EJ': [724306] +'CR0 9EU': [717421] +'CR0 9EX': [731794] +'CR0 9HB': [732127] +'CR0 9HF': [717303] +'CR0 9HG': [720222] +'CR0 9HQ': [716382] +'CR0 9JA': [718491] +'CR0 9JF': [716326] +'CR0 9LF': [726148] +'CR0 9LH': [714034] +'CR0 9LX': [709992] +'CR0 9LY': [716385] +'CR2 0BL': [738290] +'CR2 0NH': [738269] +'CR2 0PU': [738263] +'CR2 6BN': [738277] +'CR2 6EH': [717294] +'CR2 6HP': [727527] +'CR2 7HB': [738264] +'CR2 8HY': [719855] +'CR2 8LN': [719496] +'CR5 1BT': [726275] +'CR5 2EE': [729467] +'CR5 3BY': [720835] +'CR5 3FW': [709820] +'CR5 3FY': [711632] +'CR7 6AJ': [733146] +'CR7 6BH': [719519] +'CR7 6BW': [728345] +'CR7 7BB': [722127] +'CR7 7DA': [738257] +'CR7 7DX': [727121] +'CR7 7JR': [714091] +'CR7 7QB': [728608] +'CR7 8AB': [719904] +'CR7 8AX': [727316] +'CR7 8BT': [723291] +'CR7 8HW': [715358] +'CR7 8HY': [717066] +'CR7 8JU': [733286] +'CR7 8LQ': [722081] +'CR7 8PZ': [718523] +'CR7 8QL': [723557] +'CR7 8QW': [726716] +'CR7 8SB': [726044] +'CR8 2PB': [728789] +'CR8 5NA': [723613] +'CT1 1ES': [739502] +'CT1 1LX': [724041] +'CT2 0LG': [739491] +'CT2 0PD': [717169] +'CT21 6LQ': [732413] +'CT21 6QT': [728787] +'CT2 8AX': [723357] +'CT2 8LU': [730142] +'CT2 8PR': [719682] +'CT3 4GF': [711747] +'CT4 7QE': [714563] +'CT5 1ST': [713123] +'CT5 3JL': [713035] +'CT6 7BB': [732385] +'CT6 7EG': [733396] +'CT6 7EW': [739506] +'CT6 7SP': [726862] +'CT6 7TA': [723321] +'CT6 8LN': [715581] +'CT6 8SJ': [739483] +'DA11 8PJ': [720954] +'DA12 2LB': [711098] +'DA12 4HS': [727813] +'DA12 5JN': [727906] +'DA12 5JY': [719295] +'DA12 5JZ': [716562] +'DA12 5RS': [710861] +'DA12 5UH': [732402] +'DA1 2LB': [715248] +'DA1 2QR': [719899] +'DA14 5LF': [710092] +'DA1 4BB': [726825] +'DA1 4JR': [710298] +'DA1 4LX': [709989] +'DA1 4NL': [711065] +'DA1 4PB': [739487] +'DA15 8PB': [715372] +'DA16 1BN': [711672] +'DA16 1QZ': [729529] +'DA16 1RD': [710053] +'DA16 2BT': [715327] +'DA16 2DA': [732412] +'DA16 2NQ': [724329] +'DA16 3AP': [710596] +'DA16 3HX': [710128] +'DA16 3JX': [739501] +'DA16 3NF': [710294] +'DA17 5DR': [715567] +'DA17 5HA': [739195] +'DA17 6JS': [731366] +'DA2 6HE': [722115] +'DA5 1PT': [723818] +'DA7 4NA': [709883] +'DA7 4PR': [722949] +'DA7 4UR': [739495] +'DA7 5JR': [726559] +'DA7 6SB': [725452] +'DA7 6SN': [710182] +'DA7 6ST': [716518] +'DA7 6SW': [710327] +'DA8 1BX': [739505] +'DA8 1DZ': [739490] +'DA8 1JQ': [710676] +'DA8 1LQ': [739492] +'DA8 2EB': [724639] +'DA8 2HA': [732536] +'DA8 2JH': [731305] +'DA8 2NB': [721155] +'DA8 3RB': [726347] +'E14 7NZ': [709840] +'E1 4EA': [727432] +'E1 4ES': [726443] +'E1 8DJ': [723360] +'E2 6NX': [713019] +'E2 6PY': [722283] +'E2 6QQ': [721127] +'GU27 3QU': [722654] +'GU28 0BW': [721384] +'GU28 0NY': [713295] +'GU28 9JP': [713258] +'GU29 0DT': [718657] +'GU29 0PB': [712889] +'GU29 9QR': [713643] +'GU29 9TD': [711743] +'GU29 9TQ': [728521] +'GU31 5LR': [713045] +'GU31 5NB': [727680] +'HA9 8TD': [739503] +'ME10 2SU': [739484] +'ME10 2TQ': [725706] +'ME10 3FE': [728218] +'ME10 4FZ': [713374] +'ME10 4NA': [727608] +'ME10 4RB': [717566] +'ME12 4NH': [716504] +'ME14 2PR': [726321] +'ME16 0ZG': [711717] +'ME19 6RX': [724769] +'ME20 6NG': [726627] +'ME2 3AE': [723742] +'ME2 3JR': [741065] +'ME3 0EH': [716584] +'ME3 7QL': [717225] +'ME3 9LF': [719972] +'ME4 3SA': [739499] +'ME4 6HE': [728614] +'ME4 6LU': [716877] +'ME5 0HD': [716848] +'ME5 0HJ': [719490] +'ME5 0HL': [722279] +'ME5 0JB': [739494] +'ME5 7BJ': [710509] +'ME7 1EH': [723968] +'ME7 4RN': [732162] +'ME8 6XT': [716537] +'ME8 8DH': [732600] +'ME8 9RX': [726080] +'ME9 9TU': [739488] +'MK2 2LR': [739504] +'N1 8PB': [724206] +'NN5 6EP': [725883] +'NN5 6PJ': [720395] +'NN5 7RN': [716136] +'PE1 2BE': [724610] +'PE1 3BG': [713210] +'PE1 3JW': [724236] +'PE1 3JY': [729252] +'PE1 3SL': [732775] +'PE1 3SW': [727116] +'PE1 3UL': [720720] +'PE1 3XB': [729169] +'PE1 4JH': [709785] +'PE1 4JX': [726514] +'PE1 4PT': [721060] +'PE1 4PY': [720244] +'PE1 4QE': [722711] +'PE1 4QQ': [718815] +'PE19 2UU': [730394] +'PE19 7GQ': [722008] +'PE19 8PB': [711256] +'PE27 3EJ': [723840] +'PE27 3HP': [725925] +'PE27 3YG': [716374] +'PE27 6TX': [721868] +'PE28 5RN': [724542] +'PE2 8HR': [734171] +'PE2 8JG': [709862] +'PE2 8PE': [714240] +'PE2 8PG': [727192] +'PE2 8PN': [725020] +'PE2 8TL': [721694] +'PE29 1PW': [722398] +'PE29 1XD': [721012] +'PE29 2JU': [716950] +'PE29 2LS': [719632] +'PE29 2LU': [718291] +'PE29 7HQ': [729510] +'PE2 9HD': [726316] +'PE2 9PD': [737994] +'PE3 6DG': [729223] +'PE3 9EL': [719769] +'PE4 5AL': [711536] +'PE4 5AW': [729206] +'PE4 5AY': [729752] +'PE4 5AZ': [726874] +'PE4 5BA': [732941] +'PE4 5BB': [722769] +'PE4 5BD': [709935] +'PE4 5DF': [733442] +'PE4 6BY': [727319] +'PE4 6JY': [725922] +'PE4 7BE': [732237] +'PE4 7BG': [717997] +'PE4 7BQ': [729669] +'PE4 7DX': [729978] +'PE4 7TB': [714942] +'PE4 7TZ': [730026] +'PE4 7XR': [727751] +'PE4 7XS': [717934] +'PE4 7ZS': [730837] +'PO10 8AN': [710806] +'PO10 8FB': [727424] +'PO10 8LG': [718739] +'PO10 8LR': [732210] +'PO10 8RJ': [727826] +'PO10 8TG': [717168] +'PO14 1BU': [730048] +'PO14 1BX': [719355] +'PO14 1DB': [714491] +'PO14 1DD': [713561] +'PO14 1DQ': [718284] +'PO14 1HY': [725760] +'PO14 1JP': [730549] +'PO14 1JZ': [716492] +'PO14 1LG': [727350] +'PO14 1LU': [712844] +'PO14 1LY': [730515] +'PO14 3RS': [723852] +'PO14 4DN': [719457] +'PO14 4DR': [712984] +'PO14 4JQ': [724434] +'PO14 4JR': [722684] +'PO14 4NL': [728012] +'PO14 4PY': [718474] +'PO14 4PZ': [714470] +'PO14 4QE': [722372] +'PO14 4QZ': [722501] +'PO14 4RW': [715022] +'PO14 4SE': [723280] +'PO14 4SG': [719773] +'PO15 6BP': [730925] +'PO15 6EN': [731826] +'PO15 6HS': [719138] +'PO15 6JB': [725359] +'PO15 6LR': [725646] +'PO15 6PT': [731816] +'PO15 6PU': [725951] +'PO15 6PX': [717672] +'PO15 6QJ': [727514] +'PO15 6QQ': [714707] +'PO15 6QU': [724210] +'PO15 6SQ': [731457] +'PO15 6ST': [722146] +'PO1 5AU': [717660] +'PO1 5HU': [726885] +'PO1 5JA': [731071] +'PO1 5JP': [715401] +'PO1 5LY': [718222] +'PO16 0NJ': [712961] +'PO16 0PR': [714685] +'PO16 0TH': [714393] +'PO16 7SW': [713437] +'PO16 7TJ': [719259] +'PO16 7UE': [722166] +'PO16 8BA': [718838] +'PO16 8EJ': [719813] +'PO16 8EQ': [727202] +'PO16 8HQ': [719154] +'PO16 8PN': [715256] +'PO16 8PW': [732089] +'PO16 9EL': [738036] +'PO16 9HU': [728498] +'PO16 OLL': [719071] +'PO18 0AU': [729331] +'PO18 0DN': [731756] +'PO18 0GT': [711364] +'PO18 0PD': [715116] +'PO18 8BJ': [712801] +'PO18 8FS': [717084] +'PO18 8JS': [724904] +'PO18 8LD': [722982] +'PO18 9BL': [712980] +'PO18 9DS': [712918] +'PO19 1DF': [718529] +'PO19 3AW': [715431] +'PO19 3BX': [730788] +'PO19 3FX': [710187] +'PO19 3JF': [719645] +'PO19 3JG': [723734] +'PO19 5TZ': [732525] +'PO19 6SD': [729404] +'PO19 6TH': [729418] +'PO19 6XA': [713245] +'PO19 7BZ': [711472] +'PO19 7EP': [738355] +'PO19 7HZ': [732421] +'PO19 7JA': [730261] +'PO19 7LJ': [726398] +'PO19 7PJ': [724170] +'PO19 7PZ': [725315] +'PO19 7TB': [730622] +'PO19 8AP': [722092] +'PO19 8AQ': [716517] +'PO19 8BD': [714312] +'PO19 8BJ': [712964] +'PO19 8BQ': [727436] +'PO19 8DR': [731711] +'PO19 8EA': [734239] +'PO20 0NB': [722044] +'PO20 0PF': [713520] +'PO20 2EB': [710626] +'PO20 2EY': [730662] +'PO20 2FA': [724388] +'PO20 2FF': [712864] +'PO20 2FG': [722206] +'PO20 2GX': [709929] +'PO20 2JG': [717512] +'PO20 2JR': [711211] +'PO20 2LS': [711179] +'PO20 2LX': [710773] +'PO20 6FG': [721404] +'PO20 8DR': [714476] +'PO20 8EH': [718797] +'PO20 8LA': [731788] +'PO20 8NH': [719831] +'PO20 8PX': [739512] +'PO20 9EA': [725177] +'PO21 2DG': [713856] +'PO21 2ES': [720901] +'PO22 8BG': [721446] +'PO2 7BS': [726731] +'PO2 7LD': [719473] +'PO2 7PH': [720918] +'PO2 7PY': [726125] +'PO2 7PZ': [725028] +'PO2 8DL': [715847] +'PO2 8LD': [727218] +'PO5 2AB': [718629] +'RH10 5NJ': [716211] +'RH10 5NQ': [728096] +'RH10 8BZ': [739496] +'RH11 0UG': [714329] +'RH11 0UL': [725579] +'RH11 7PS': [711350] +'RH11 8BG': [716600] +'RH11 8NR': [731433] +'RH11 8UR': [729313] +'RH11 8UZ': [716694] +'RH11 8XD': [719039] +'RH11 9JX': [718949] +'RH11 9LE': [713064] +'RH11 9TB': [713286] +'RH11 9TJ': [710150] +'RH1 1HL': [727867] +'RH12 5GJ': [724185] +'RH12 5GL': [713888] +'RH1 3BY': [730491] +'RH14 0NE': [725626] +'RH14 0RJ': [725213] +'RH15 8DP': [741012] +'RH15 8UD': [741028] +'RH1 5LZ': [723086] +'RH16 3TX': [741029] +'RH19 1FE': [732763] +'RH19 3UL': [728159] +'RH19 3XZ': [720303] +'RH19 4AJ': [723738] +'RH19 4QR': [713406] +'RH20 1AB': [733562] +'RH20 1PD': [725381] +'RH20 1PJ': [712882] +'RH20 3QP': [710389] +'RH2 8DE': [715694] +'RH6 8AP': [733009] +'RH6 8BN': [727943] +'SE10 0EH': [728900] +'SE10 0HW': [723950] +'SE10 0RS': [727392] +'SE10 9PQ': [724054] +'SE11 4TQ': [715450] +'SE12 0BW': [741340] +'SE12 0NE': [731086] +'SE12 0PS': [729918] +'SE12 0TB': [711263] +'SE12 8PA': [714677] +'SE12 8PU': [733368] +'SE12 8QB': [721928] +'SE12 9AF': [712774] +'SE12 9BH': [717280] +'SE12 9DN': [725070] +'SE12 9DP': [713793] +'SE12 9QT': [731393] +'SE12 9RA': [726649] +'SE12 9SB': [717699] +'SE12 9SE': [721428] +'SE13 3DL': [731002] +'SE13 5AE': [741301] +'SE13 5AQ': [716521] +'SE13 5HN': [729803] +'SE13 5HW': [725945] +'SE13 5NA': [714743] +'SE13 5NQ': [731177] +'SE13 5PZ': [730909] +'SE13 5RZ': [712934] +'SE13 5TA': [716894] +'SE13 6DR': [715834] +'SE13 6HH': [721440] +'SE13 6HR': [721392] +'SE13 6RQ': [732478] +'SE13 6SB': [720887] +'SE13 6SE': [719305] +'SE13 7AN': [718123] +'SE13 7UL': [731261] +'SE13 7UU': [713424] +'SE14 5EL': [727815] +'SE14 5EQ': [732405] +'SE14 5FT': [711751] +'SE14 5LS': [716447] +'SE14 5NL': [710082] +'SE14 5QH': [712817] +'SE14 5QS': [731546] +'SE14 5QX': [730009] +'SE14 5RF': [731266] +'SE14 5TJ': [716368] +'SE14 5TQ': [732377] +'SE14 5TW': [713573] +'SE15 1QB': [720350] +'SE15 2BL': [722615] +'SE15 2DY': [725868] +'SE15 2EA': [728059] +'SE15 2NJ': [710902] +'SE15 2NU': [721443] +'SE15 2NX': [721524] +'SE15 3BZ': [730177] +'SE15 3ED': [724720] +'SE15 3LY': [727866] +'SE15 3UD': [716956] +'SE15 3XD': [733160] +'SE15 4AB': [717719] +'SE15 4AL': [730340] +'SE15 4AW': [717710] +'SE15 4BT': [731435] +'SE15 4BU': [717860] +'SE15 4EL': [723592] +'SE15 4LF': [723033] +'SE15 4QY': [714015] +'SE15 5AG': [716248] +'SE15 5AN': [723913] +'SE15 5HP': [738317] +'SE15 5NR': [728835] +'SE15 5ST': [724648] +'SE15 5TQ': [729570] +'SE15 6QU': [713459] +'SE15 6QZ': [713272] +'SE15 6RW': [715979] +'SE1 5DP': [738363] +'SE16 3FL': [734228] +'SE16 4AR': [727132] +'SE16 4BB': [733675] +'SE16 4DW': [720938] +'SE16 4LE': [731699] +'SE16 4RJ': [739480] +'SE17 1LS': [741367] +'SE18 1AA': [716305] +'SE18 1AD': [714734] +'SE18 1AE': [732378] +'SE18 1AF': [731181] +'SE18 1AR': [730117] +'SE18 1AY': [732555] +'SE18 1DE': [731803] +'SE18 1DW': [726196] +'SE18 1EF': [716867] +'SE18 1EP': [729511] +'SE18 1JZ': [722459] +'SE18 1NT': [728269] +'SE18 1PX': [731231] +'SE18 1RQ': [728802] +'SE18 1RS': [724860] +'SE18 1TB': [728912] +'SE18 2DE': [713962] +'SE18 2EW': [714762] +'SE18 2JS': [732399] +'SE18 2JU': [724826] +'SE18 2NY': [714462] +'SE18 2PX': [713525] +'SE18 2QH': [723251] +'SE18 2QN': [715642] +'SE18 2QW': [727518] +'SE18 2TE': [713165] +'SE18 2TR': [731243] +'SE18 3AS': [725053] +'SE18 3DR': [718577] +'SE18 3EP': [718180] +'SE18 3ER': [724608] +'SE18 3LL': [723221] +'SE18 3LW': [730279] +'SE18 3PA': [728597] +'SE18 3PF': [724341] +'SE18 3PS': [721088] +'SE18 3PU': [715333] +'SE18 3QF': [730171] +'SE18 3QG': [724317] +'SE18 3SJ': [716391] +'SE18 3SR': [713008] +'SE18 3ST': [733463] +'SE18 3SU': [714741] +'SE18 4DP': [727564] +'SE18 4ET': [727477] +'SE18 5AL': [729789] +'SE18 5ED': [729366] +'SE18 5EY': [728672] +'SE18 5NG': [720608] +'SE18 5PU': [716464] +'SE18 5QQ': [713261] +'SE18 5SG': [710574] +'SE18 5ST': [730395] +'SE18 6SD': [729378] +'SE18 6UB': [723174] +'SE18 7AG': [715905] +'SE18 7BE': [727950] +'SE18 7DE': [732142] +'SE18 7ES': [731030] +'SE18 7EX': [718419] +'SE18 7EY': [717563] +'SE18 7HT': [718264] +'SE18 7JA': [725716] +'SE18 7LD': [716373] +'SE18 7LN': [715351] +'SE18 7LQ': [727310] +'SE18 7QD': [730977] +'SE18 7RL': [729410] +'SE18 7RX': [729593] +'SE18 7SU': [729796] +'SE19 2UU': [738253] +'SE19 2XE': [738276] +'SE19 3AT': [727211] +'SE19 3PN': [728090] +'SE19 3PR': [724305] +'SE19 3PW': [714236] +'SE20 7BG': [724377] +'SE20 7LJ': [728603] +'SE20 8HQ': [718864] +'SE20 8JU': [710442] +'SE20 8PL': [710847] +'SE20 8SH': [711081] +'SE20 8SJ': [739498] +'SE20 8SN': [729605] +'SE2 0JU': [720348] +'SE2 0LR': [731046] +'SE2 0NF': [727581] +'SE2 0NH': [718238] +'SE2 0QX': [731543] +'SE2 0RD': [720911] +'SE22 0DE': [715376] +'SE22 0DP': [723410] +'SE22 0ER': [715424] +'SE22 0HR': [732224] +'SE22 0JU': [719504] +'SE22 0RP': [719822] +'SE22 8PP': [741062] +'SE22 8PW': [730597] +'SE22 8QB': [723435] +'SE22 8QY': [733444] +'SE22 8RW': [726984] +'SE22 9EP': [718116] +'SE22 9HG': [730169] +'SE22 9HL': [724934] +'SE22 9JJ': [722239] +'SE22 9LF': [725545] +'SE22 9LG': [725967] +'SE22 9NA': [733057] +'SE22 9PB': [726535] +'SE22 9PL': [716322] +'SE23 1BW': [719444] +'SE23 1DJ': [714118] +'SE23 1DU': [729491] +'SE23 1JN': [732221] +'SE23 1JS': [741370] +'SE23 1NL': [718154] +'SE23 1RY': [733561] +'SE23 2AH': [730427] +'SE23 3NJ': [741326] +'SE25 4HN': [732712] +'SE25 4JD': [738271] +'SE25 4JU': [725592] +'SE25 4LP': [728636] +'SE25 4LX': [726604] +'SE25 4NL': [714924] +'SE25 4RN': [721708] +'SE25 4SL': [712685] +'SE25 4UZ': [732163] +'SE25 4XQ': [733120] +'SE25 5BG': [713983] +'SE25 5DP': [730423] +'SE25 5EU': [718080] +'SE25 5HS': [722957] +'SE25 5NG': [711404] +'SE25 5PG': [724337] +'SE25 5PY': [730836] +'SE25 5QE': [730600] +'SE25 5QT': [723546] +'SE25 6JE': [718575] +'SE25 6JQ': [732912] +'SE25 6JX': [738281] +'SE25 6JY': [716489] +'SE25 6LH': [738295] +'SE25 6NT': [720315] +'SE25 6QY': [724822] +'SE25 6TH': [738272] +'SE25 6UP': [711770] +'SE25 6US': [718503] +'SE25 6UX': [719527] +'SE25 6XQ': [720530] +'SE26 4HN': [720245] +'SE26 4LE': [719783] +'SE26 6JR': [717173] +'SE28 0DG': [733205] +'SE28 0EW': [726818] +'SE28 8AU': [726861] +'SE28 8DA': [715572] +'SE28 8DE': [717184] +'SE28 8HY': [722608] +'SE28 8HZ': [728229] +'SE28 8QQ': [739120] +'SE2 9AU': [731135] +'SE2 9AZ': [728338] +'SE2 9BA': [726104] +'SE2 9BE': [732487] +'SE2 9BH': [713842] +'SE2 9DH': [715803] +'SE2 9DN': [719507] +'SE2 9ED': [726540] +'SE2 9EN': [715820] +'SE2 9JP': [733142] +'SE2 9JW': [714804] +'SE2 9LB': [715243] +'SE2 9LP': [718119] +'SE2 9LR': [728081] +'SE2 9LS': [712832] +'SE2 9PB': [722948] +'SE2 9PJ': [730237] +'SE2 9PL': [713818] +'SE2 9XR': [713219] +'SE2 9XS': [730763] +'SE3 0JB': [717939] +'SE3 7DP': [716393] +'SE3 7DT': [716304] +'SE3 7LX': [713876] +'SE3 8AY': [718158] +'SE3 8DL': [721437] +'SE3 8ET': [733047] +'SE3 8LH': [715080] +'SE3 8LL': [724951] +'SE3 8QZ': [725016] +'SE3 8TS': [725354] +'SE3 9PP': [718521] +'SE4 1AL': [714638] +'SE4 1ER': [726411] +'SE4 1EU': [729269] +'SE4 1JS': [729740] +'SE4 1PB': [732617] +'SE4 1QL': [728958] +'SE4 1RZ': [725895] +'SE4 1SS': [715848] +'SE4 1SY': [715929] +'SE4 1TS': [731481] +'SE4 1YF': [741294] +'SE4 2AX': [728839] +'SE4 2DD': [719311] +'SE4 2DQ': [720285] +'SE4 2DS': [716303] +'SE4 2JJ': [728062] +'SE4 2JT': [728072] +'SE4 2NH': [720252] +'SE4 2PP': [714129] +'SE4 2PS': [714794] +'SE4 2SE': [717790] +'SE4 2SP': [728563] +'SE5 7RZ': [723779] +'SE5 7TD': [727053] +'SE5 8DH': [729854] +'SE5 8NE': [729904] +'SE5 8NJ': [727084] +'SE5 8NN': [730178] +'SE5 9NG': [711249] +'SE6 1AQ': [723193] +'SE6 1PF': [715819] +'SE6 1PZ': [724189] +'SE6 1QA': [729065] +'SE6 1SP': [712798] +'SE6 1SX': [728296] +'SE6 1TE': [722280] +'SE6 1XD': [714748] +'SE6 2BQ': [718494] +'SE6 2HS': [710844] +'SE6 3BH': [733366] +'SE6 3EL': [733279] +'SE6 3ER': [715158] +'SE6 3HT': [715627] +'SE6 3JL': [728569] +'SE6 3LL': [718088] +'SE6 3LP': [720113] +'SE6 3LS': [731073] +'SE6 3TB': [726455] +'SE6 3TF': [718130] +'SE6 3TJ': [721499] +'SE6 4JJ': [724002] +'SE6 4TS': [728777] +'SE6 4TZ': [724331] +'SE7 7AL': [723899] +'SE7 7BS': [729309] +'SE7 7BW': [731211] +'SE7 7BZ': [727328] +'SE7 7JD': [728676] +'SE7 7LB': [727180] +'SE7 7LL': [714799] +'SE7 7LW': [716791] +'SE7 7NP': [721259] +'SE7 7NR': [717211] +'SE7 7PB': [718458] +'SE7 7PP': [721402] +'SE7 7PT': [725137] +'SE7 7QW': [718010] +'SE7 7QZ': [732967] +'SE7 7RB': [722246] +'SE7 8AB': [716317] +'SE7 8AL': [717469] +'SE7 8EN': [725875] +'SE7 8EU': [711284] +'SE7 8HG': [720079] +'SE7 8RQ': [732292] +'SE7 8SS': [715963] +'SE7 8SX': [717268] +'SE7 8TN': [732202] +'SE8 3ED': [727939] +'SE8 4AU': [714543] +'SE8 4BT': [720233] +'SE8 4DN': [709841] +'SE8 4DY': [730353] +'SE8 4JF': [714823] +'SE8 4JN': [726092] +'SE8 5DB': [718105] +'SE8 5DD': [713850] +'SE8 5NH': [724750] +'SE9 1JX': [718741] +'SE9 1PD': [722987] +'SE9 1XA': [718122] +'SE9 2DN': [721878] +'SE9 2LF': [717567] +'SE9 2TE': [732831] +'SE9 3DJ': [725009] +'SE9 3HE': [726724] +'SE9 3JH': [733339] +'SE9 3JJ': [710921] +'SE9 3QH': [713839] +'SE9 3TH': [723675] +'SE9 4AB': [710577] +'SE9 4AG': [710066] +'SE9 4AS': [711645] +'SE9 4AU': [711468] +'SE9 4BH': [711114] +'SE9 4BQ': [721269] +'SE9 4BU': [719643] +'SE9 4BZ': [732289] +'SE9 4DA': [717842] +'SE9 4DX': [710233] +'SE9 4HE': [727743] +'SE9 4HF': [741293] +'SE9 4HL': [724308] +'SE9 4HN': [710914] +'SE9 4HP': [720235] +'SE9 4JX': [710703] +'SE9 4LB': [720231] +'SE9 4LD': [717086] +'SE9 4LN': [719796] +'SE9 4LP': [723897] +'SE9 4LZ': [711056] +'SE9 4NB': [711566] +'SE9 4NQ': [726187] +'SE9 4NZ': [723016] +'SE9 4SX': [721436] +'SE9 4TE': [726227] +'SE9 5HZ': [739511] +'SE9 5RF': [721520] +'SE9 6AW': [720406] +'SE9 6BP': [713463] +'SE9 6BW': [713132] +'SE9 6DH': [728292] +'SE9 6JH': [719671] +'SE9 6LB': [732853] +'SE9 6LX': [719064] +'SE9 6QD': [719341] +'SE9 6QH': [728447] +'SE9 6RA': [732742] +'SO14 0AT': [721512] +'SO14 0AU': [731251] +'SO14 0AX': [721546] +'SO14 0BQ': [729003] +'SO14 0BT': [728010] +'SO14 0BU': [724850] +'SO14 0BY': [726066] +'SO14 0DB': [728082] +'SO14 0DW': [715876] +'SO14 0EA': [719514] +'SO14 0EQ': [716868] +'SO14 0FB': [726477] +'SO14 0NA': [725697] +'SO14 0ND': [740997] +'SO14 0NH': [721221] +'SO14 0NS': [717546] +'SO14 0NW': [733501] +'SO14 0PU': [721938] +'SO14 6BB': [714054] +'SO15 1JR': [716346] +'SO15 2HQ': [717327] +'SO15 3DN': [714768] +'SO15 3FE': [733398] +'SO15 5DQ': [720253] +'SO15 8PT': [732303] +'SO15 8RP': [738256] +'SO16 5EY': [724830] +'SO16 8HD': [725659] +'SO16 8HE': [720133] +'SO16 8HH': [727289] +'SO16 9DA': [720933] +'SO17 2GY': [736209] +'SO17 2HW': [726965] +'SO17 2JB': [731448] +'SO17 2JH': [717433] +'SO18 1NZ': [721704] +'SO18 2FH': [718493] +'SO18 2HF': [723667] +'SO18 5DY': [722756] +'SO18 5FW': [725461] +'SO19 1DD': [726829] +'SO19 1DJ': [728293] +'SO19 1EG': [728650] +'SO19 2FX': [732508] +'SO19 2HH': [716324] +'SO19 2HT': [712699] +'SO19 5LG': [721170] +'SO19 5LH': [721500] +'SO19 6DS': [724913] +'SO19 6FN': [728513] +'SO19 6FQ': [713409] +'SO19 6HQ': [728622] +'SO19 6LN': [714670] +'SO19 6NZ': [732071] +'SO19 7LP': [731311] +'SO19 9BZ': [721004] +'SO19 9DH': [717630] +'SO19 9DW': [725099] +'SO19 9QT': [731398] +'SO21 1PN': [738353] +'SO31 6QU': [731682] +'SO31 6SX': [720467] +'SO31 6TJ': [732984] +'SO31 6XB': [715267] +'SO31 7GD': [724166] +'SO31 9JR': [721566] +'SO32 2PX': [712901] +'SO50 4BW': [738938] +'SO53 2LF': [723759] +'SW16 4BB': [717693] +'SW16 4BH': [713870] +'SW16 4TJ': [717928] +'SW16 4TR': [721166] +'SW17 7PL': [726300] +'SW20 0JD': [726591] +'SW2 1AH': [735806] +'SW4 6QF': [722560] +'SW4 6QX': [724741] +'SW9 0BX': [732327] +'SW9 0DE': [725600] +'SW9 0RE': [733797] +'SW9 0TS': [733563] +'SW9 7JG': [741033] +'SW9 9ER': [735064] +'SW9 9JZ': [718931] +'TN16 2PB': [719668] +'TN16 3DY': [711346] +'TN16 3ED': [712562] +'TN16 3LH': [721732] +'TN16 3NH': [710331] +'TN16 3PL': [709916] +'TN16 3RR': [709984] +'TN16 3TP': [723906] +'TN16 3UE': [711532] +'TN23 3NS': [739507] +'TN23 5TE': [733357] +'TN23 5UH': [718721] +'TN2 3HR': [731657] +'TN24 9LU': [715879] +'TN2 5PL': [715711] +'TN2 5PT': [716278] +'TN2 5PU': [728825] +'TN2 5QG': [723959] +'TN29 0PT': [722961] +'TN3 9TJ': [722644] +'TN4 0AA': [713177] +'BN11 1JH': [711816, 734991] +'BN11 4SS': [727220, 727229] +'BN14 0XA': [718861, 727987] +'BN1 4ZJ': [733730, 734995] +'BN18 0TW': [719247, 720005] +'BN2 1TQ': [725231, 729059] +'BN2 4PQ': [716247, 730875] +'BN2 5PS': [718543, 719528] +'BN2 6NH': [724240, 728586] +'BN2 6WD': [716811, 733151] +'BN3 1RN': [734868, 736916] +'BN3 3RA': [733609, 734867] +'BN3 3TR': [735066, 735829] +'BN43 5QQ': [711810, 712103] +'BN43 6YN': [739486, 739493] +'BR1 3NU': [738280, 738306] +'BR1 3QF': [731274, 737772] +'BR1 4QX': [710510, 720220] +'BR1 4QY': [710694, 723417] +'BR1 4QZ': [710396, 719553] +'BR1 4SQ': [710102, 720380] +'BR1 5EL': [720232, 720243] +'BR1 5JW': [715869, 717701] +'BR1 5LF': [716338, 733470] +'BR1 5PF': [731001, 733123] +'BR2 8DN': [714046, 730420] +'BR2 9RX': [715457, 733665] +'BR3 4PY': [728949, 728961] +'BR3 4RU': [726533, 726537] +'BR3 4SF': [718505, 718506] +'BR5 2HS': [710648, 711077] +'BR5 2JY': [710192, 711252] +'BR5 2NH': [710076, 710178] +'BR5 2PF': [711290, 728320] +'BR5 2PG': [721097, 721644] +'BR5 2RN': [730752, 732887] +'BR5 2RP': [711465, 719624] +'BR5 2SG': [711095, 711413] +'BR5 2TE': [721744, 732281] +'BR5 2TF': [724943, 726845] +'BR5 3AP': [721009, 725400] +'BR5 3BH': [716984, 729099] +'BR5 3BJ': [711096, 711113] +'BR5 3BS': [711676, 717392] +'BR5 3EB': [715106, 720091] +'BR5 4BA': [721092, 722739] +'BR5 4PD': [723837, 724674] +'BR6 9UH': [709901, 712028] +'BR7 6HU': [731419, 733226] +'BR7 6PY': [713004, 718878] +'CR0 0BN': [722932, 723478] +'CR0 0HZ': [728497, 732216] +'CR0 0NH': [717026, 721542] +'CR0 0PQ': [719111, 729448] +'CR0 0QG': [716299, 716344] +'CR0 0RE': [715339, 715404] +'CR0 0RF': [720831, 720838] +'CR0 0RG': [719666, 726260] +'CR0 0RH': [716069, 725321] +'CR0 0RL': [717509, 722603] +'CR0 0RR': [714929, 729051] +'CR0 0RT': [719405, 723604] +'CR0 0RU': [717270, 719531] +'CR0 0SG': [724898, 726348] +'CR0 0TN': [732342, 732537] +'CR0 2HN': [738265, 738267] +'CR0 2PF': [738252, 738312] +'CR0 2QA': [717155, 731454] +'CR0 2XR': [718483, 721146] +'CR0 3JR': [722989, 730649] +'CR0 3NA': [713902, 717700] +'CR0 3PL': [710974, 727214] +'CR0 3RR': [731337, 731573] +'CR0 4DU': [714954, 729933] +'CR0 4EB': [720637, 728760] +'CR0 4EE': [722056, 732732] +'CR0 4EQ': [718463, 723375] +'CR0 4LF': [720246, 738279] +'CR0 6AE': [710123, 715814] +'CR0 6AH': [718124, 718125] +'CR0 6DW': [729984, 730090] +'CR0 6JQ': [721844, 725018] +'CR0 7AU': [726489, 728381] +'CR0 7YA': [717614, 730873] +'CR0 7YB': [721924, 730165] +'CR0 8LA': [720674, 730297] +'CR0 8NL': [721217, 730955] +'CR0 9DB': [721471, 726381] +'CR0 9DD': [732229, 733193] +'CR0 9DE': [719458, 723372] +'CR0 9DG': [728854, 732235] +'CR0 9DQ': [728745, 730003] +'CR0 9DS': [716372, 716838] +'CR0 9DT': [724197, 727382] +'CR0 9DW': [714665, 733280] +'CR0 9EQ': [725041, 728906] +'CR0 9EW': [726868, 728762] +'CR0 9HJ': [721703, 721967] +'CR2 6BG': [738261, 738282] +'CR2 7AD': [738278, 738305] +'CR2 7DL': [733791, 735819] +'CR2 7ED': [738270, 738303] +'CR2 8AE': [716093, 725360] +'CR2 8HU': [726192, 732080] +'CR7 7EQ': [738275, 738304] +'CR7 8AL': [728008, 728474] +'CR7 8AS': [721754, 726396] +'CR7 8AT': [714215, 729049] +'CR7 8HN': [717414, 721248] +'CR7 8RB': [725121, 725127] +'CT1 1LU': [711271, 728363] +'CT1 3SG': [741375, 741378] +'CT18 7SB': [713371, 714891] +'CT18 7TL': [722929, 723476] +'CT20 3QJ': [723068, 723614] +'CT6 7EQ': [715789, 715825] +'CT6 7SZ': [713889, 739482] +'DA11 7DJ': [710495, 710550] +'DA11 8GD': [710774, 710995] +'DA12 2JB': [717785, 719190] +'DA12 2LX': [724649, 725031] +'DA14 5LB': [717254, 719902] +'DA15 7DZ': [733642, 734899] +'DA16 2BP': [715361, 731464] +'DA9 9HW': [717068, 727462] +'E1 2LG': [713014, 722576] +'E1 2NP': [723586, 726150] +'E1 2PA': [730051, 730401] +'E14 6DX': [721275, 721803] +'E1W 3QQ': [722809, 732058] +'E2 0BF': [720309, 720928] +'E2 6GD': [738297, 738314] +'E2 6GF': [719245, 721069] +'E3 2JR': [715467, 715479] +'GU27 3HR': [722442, 727355] +'GU28 0JQ': [712968, 718844] +'GU28 0PL': [722355, 725185] +'GU28 0RD': [719134, 725652] +'GU28 9DB': [712816, 718673] +'GU28 9JF': [713120, 718988] +'GU29 0BD': [712908, 725287] +'GU29 0HP': [729261, 730736] +'GU29 0QF': [712871, 718732] +'GU29 9HZ': [723468, 723944] +'GU29 9QS': [718968, 729319] +'GU30 7JR': [714220, 732706] +'GU30 7JT': [712866, 718723] +'GU31 5HT': [718985, 722692] +'GU31 5JT': [713072, 722643] +'HA1 4GL': [739218, 739318] +'ME10 3DU': [712684, 712690] +'ME10 4GJ': [709829, 710780] +'ME14 1JG': [741484, 741520] +'ME15 6RG': [709793, 710399] +'ME15 8JQ': [716854, 716871] +'ME17 1GR': [710041, 710160] +'ME2 1BE': [717316, 717329] +'ME2 2HG': [726372, 726376] +'ME3 0EF': [711742, 728475] +'ME4 5LT': [713267, 718587] +'ME5 7JR': [723713, 724154] +'ME7 5XN': [723412, 723413] +'ME9 8TQ': [726936, 728710] +'MK10 9SY': [713141, 719006] +'N1 7FP': [718250, 719233] +'N1 8NT': [723841, 724066] +'N7 8BH': [710420, 731776] +'NW10 8SF': [714270, 722473] +'PE1 2BL': [730295, 731260] +'PE1 2LB': [732496, 733310] +'PE1 4JB': [721235, 731120] +'PE19 7GR': [730052, 731335] +'PE27 3FL': [720817, 726519] +'PE27 3FN': [715829, 731088] +'PE27 3HG': [714494, 716727] +'PE28 4ET': [716561, 717455] +'PE4 5BY': [728510, 729588] +'PE4 5DA': [713611, 731908] +'PE4 6HZ': [725052, 726487] +'PE4 6JR': [732194, 732349] +'PE4 6JU': [721281, 728449] +'PE4 6JZ': [732243, 733154] +'PE4 6NB': [720490, 720786] +'PE4 6NR': [715910, 716311] +'PE4 7BB': [730409, 733169] +'PE4 7DG': [724173, 726566] +'PE4 7EH': [709918, 713891] +'PE4 7EQ': [730118, 730962] +'PE4 7XX': [714224, 714941] +'PO10 8LE': [731522, 732266] +'PO10 8LX': [716630, 720734] +'PO10 8RD': [719149, 738349] +'PO14 1DH': [726100, 727825] +'PO14 1LR': [720917, 722370] +'PO14 2HH': [714282, 723258] +'PO14 3HG': [718542, 719487] +'PO14 4AW': [719079, 722788] +'PO14 4QP': [719753, 721861] +'PO15 6HF': [718904, 724244] +'PO15 6NJ': [717541, 722661] +'PO15 6NQ': [713648, 732937] +'PO15 6QD': [714480, 721383] +'PO15 6QF': [731291, 732473] +'PO15 6QP': [729872, 730059] +'PO15 6SP': [728379, 729575] +'PO1 5QG': [722901, 723447] +'PO16 0SZ': [714666, 723671] +'PO16 7TL': [713743, 729456] +'PO16 8AX': [719094, 722798] +'PO16 8PL': [714273, 736322] +'PO18 0EW': [733631, 734891] +'PO18 0TH': [718387, 721609] +'PO18 8BL': [715382, 715413] +'PO18 8BW': [730638, 732792] +'PO18 8JT': [714212, 732696] +'PO18 8LA': [719227, 720615] +'PO18 8LE': [730533, 731694] +'PO18 8QQ': [730740, 731895] +'PO18 8QU': [722347, 725174] +'PO18 9JW': [713077, 718940] +'PO19 3AQ': [730161, 731520] +'PO19 3LH': [732408, 732512] +'PO19 5UA': [716381, 717664] +'PO19 6TP': [736477, 736600] +'PO19 7BT': [709816, 710440] +'PO19 7GT': [730440, 730450] +'PO19 7HT': [726181, 726506] +'PO19 7HU': [720794, 721917] +'PO19 7HY': [715253, 715465] +'PO19 7LT': [728154, 728274] +'PO19 7YL': [728314, 728747] +'PO19 8FU': [709823, 710450] +'PO19 8JG': [715831, 715849] +'PO19 8JH': [729858, 729954] +'PO19 8SX': [729408, 732027] +'PO20 0NA': [737691, 737723] +'PO20 0NY': [714547, 729469] +'PO20 1JX': [725377, 727457] +'PO20 1PW': [727381, 729127] +'PO20 2DH': [712977, 722540] +'PO20 2EZ': [718725, 722418] +'PO20 2HG': [717909, 724623] +'PO20 2JN': [711510, 711620] +'PO20 2JS': [710742, 710967] +'PO20 7HA': [731124, 731370] +'PO21 2TX': [711574, 731616] +'PO9 5DF': [730516, 732678] +'RH10 6GG': [710175, 710224] +'RH10 6GJ': [711028, 711239] +'RH11 0TS': [725708, 727794] +'RH11 0TW': [732621, 732627] +'RH11 7SE': [715841, 715868] +'RH12 5YG': [729590, 730075] +'RH14 0SX': [715176, 716693] +'RH20 1DG': [713215, 725588] +'RH6 9HX': [710090, 714910] +'SE10 0DA': [722285, 725136] +'SE10 0DF': [721225, 726698] +'SE10 0EA': [741368, 741384] +'SE10 0EG': [725886, 729816] +'SE10 0JL': [728056, 728064] +'SE10 0NW': [714896, 716919] +'SE10 8JZ': [726991, 728729] +'SE10 9AE': [715531, 716479] +'SE10 9AH': [728697, 728909] +'SE11 4SJ': [719912, 719922] +'SE12 8QJ': [728948, 728960] +'SE12 8RS': [723900, 723901] +'SE12 8RU': [723161, 723163] +'SE12 9RY': [724873, 726171] +'SE13 5HS': [718176, 718182] +'SE13 5RT': [723471, 723681] +'SE13 6DE': [726531, 726536] +'SE13 6DQ': [721173, 721176] +'SE13 6HN': [729900, 731353] +'SE13 6HW': [716795, 716798] +'SE13 6HX': [715397, 715398] +'SE13 6QZ': [710569, 712711] +'SE13 6TB': [717318, 717325] +'SE13 6UA': [710512, 710513] +'SE13 6UB': [718549, 718560] +'SE13 7JE': [721810, 721980] +'SE13 7JH': [716270, 716417] +'SE13 7TJ': [729641, 729847] +'SE13 7TL': [729545, 729603] +'SE13 7TP': [714648, 714695] +'SE13 7TS': [717741, 717750] +'SE13 7UA': [732482, 732484] +'SE14 5LX': [718526, 718527] +'SE14 5NH': [709923, 713878] +'SE14 5NX': [710083, 715469] +'SE14 5QD': [722995, 729548] +'SE14 5QE': [724621, 727131] +'SE14 5QL': [725188, 727213] +'SE14 5QR': [724764, 726562] +'SE14 5QZ': [721848, 725428] +'SE14 5SG': [714595, 715884] +'SE14 5TR': [719221, 726532] +'SE14 6NU': [717747, 717759] +'SE14 6NZ': [713339, 714119] +'SE14 6RS': [713942, 714007] +'SE14 6RU': [713835, 713837] +'SE15 1PT': [720210, 720239] +'SE15 1QD': [716050, 719270] +'SE15 2HD': [732325, 732326] +'SE15 3BS': [714753, 714755] +'SE15 3EF': [720968, 721180] +'SE15 3UQ': [726957, 726961] +'SE15 4AR': [731094, 731099] +'SE15 4DD': [727201, 727204] +'SE15 4DZ': [731408, 733297] +'SE15 4EA': [731469, 731471] +'SE15 4ED': [719929, 723433] +'SE15 4EF': [722281, 722293] +'SE15 4EN': [731299, 731530] +'SE15 4HS': [731603, 741377] +'SE15 4HY': [721445, 721455] +'SE15 4JB': [728837, 728841] +'SE15 4JD': [730174, 730182] +'SE15 4LE': [717136, 732168] +'SE15 4PU': [731098, 741369] +'SE15 4PY': [716390, 716394] +'SE15 5TF': [721713, 721721] +'SE15 6UR': [714456, 730814] +'SE16 7PH': [712851, 718707] +'SE16 7PN': [712792, 718654] +'SE18 1HJ': [717322, 717331] +'SE18 1HL': [732444, 732479] +'SE18 1ND': [732603, 732606] +'SE18 1QB': [724093, 729794] +'SE18 2QX': [723379, 727183] +'SE18 2UL': [718090, 718094] +'SE18 3AA': [719916, 719927] +'SE18 3AP': [727600, 730807] +'SE18 3HB': [711421, 729987] +'SE18 3NY': [718551, 734331] +'SE18 3QD': [719540, 719541] +'SE18 3SY': [713780, 714754] +'SE18 3TN': [710865, 723690] +'SE18 7BJ': [717450, 726428] +'SE18 7LP': [721781, 724784] +'SE18 7NH': [722962, 723507] +'SE18 7QG': [726374, 726377] +'SE18 7QX': [720382, 720571] +'SE18 7RW': [723359, 726339] +'SE19 1HA': [714115, 714125] +'SE19 2AJ': [717323, 717332] +'SE19 2LQ': [724722, 724729] +'SE20 7NA': [714490, 732018] +'SE20 7XQ': [738262, 738301] +'SE20 8EF': [717728, 717730] +'SE20 8HE': [721985, 721993] +'SE20 8HS': [710097, 714286] +'SE20 8JF': [715995, 722925] +'SE20 8ND': [724116, 724125] +'SE20 8NU': [714633, 714654] +'SE20 8RQ': [714702, 714704] +'SE20 8SW': [713454, 731746] +'SE21 8HB': [724118, 724127] +'SE22 0AX': [710889, 724119] +'SE22 0DG': [718146, 718148] +'SE22 0DN': [721160, 721161] +'SE22 0ES': [718534, 718535] +'SE22 0HP': [728401, 728407] +'SE22 0JS': [735041, 741328] +'SE22 0LN': [731608, 731617] +'SE22 0QJ': [715811, 715816] +'SE22 0QU': [714075, 714594] +'SE22 0QY': [715925, 715931] +'SE22 8EA': [718164, 741321] +'SE22 8PS': [728836, 728840] +'SE22 8PY': [722266, 722269] +'SE22 9AB': [727930, 727934] +'SE22 9AQ': [718169, 718177] +'SE22 9HB': [728180, 728181] +'SE22 9JH': [721433, 721434] +'SE22 9LH': [720248, 741327] +'SE22 9LQ': [714830, 714846] +'SE23 1DZ': [718552, 718564] +'SE23 2AE': [724339, 724344] +'SE23 2HR': [726047, 726050] +'SE23 2PW': [724728, 724740] +'SE23 2QR': [710007, 714454] +'SE23 3XP': [728955, 728964] +'SE25 4EJ': [726687, 726696] +'SE25 4TD': [738286, 738308] +'SE25 5DW': [724343, 724350] +'SE25 5RE': [728865, 729631] +'SE25 6HY': [716300, 716345] +'SE26 4PD': [714842, 733493] +'SE26 5HT': [719489, 719491] +'SE26 5HU': [733266, 733269] +'SE26 6JD': [741361, 741362] +'SE28 0DP': [716325, 739126] +'SE28 0DQ': [709875, 732811] +'SE28 0EN': [710531, 718056] +'SE28 0PA': [738602, 738617] +'SE28 8AX': [728207, 732186] +'SE28 8AY': [726840, 732280] +'SE28 8DD': [722839, 727729] +'SE28 8LH': [713352, 731642] +'SE2 9BJ': [713250, 722815] +'SE2 9DZ': [732276, 732323] +'SE2 9EL': [714758, 732177] +'SE2 9EU': [723698, 724138] +'SE2 9JY': [724761, 725712] +'SE2 9LN': [724459, 733291] +'SE2 9QX': [730028, 730969] +'SE2 9QY': [710253, 726095] +'SE2 9QZ': [713851, 713990] +'SE2 9XL': [718519, 718537] +'SE3 0TP': [716232, 720792] +'SE3 7DU': [731090, 733261] +'SE3 7EF': [717686, 717687] +'SE3 7LU': [730176, 730181] +'SE3 8AP': [710958, 722407] +'SE4 1BU': [731167, 731478] +'SE4 1DE': [722359, 726049] +'SE4 1DH': [717720, 718093] +'SE4 1DX': [733290, 733353] +'SE4 1TY': [715913, 716366] +'SE4 1XZ': [732526, 733404] +'SE4 1YN': [710006, 714839] +'SE4 2AJ': [720247, 720255] +'SE4 2BS': [727206, 727223] +'SE4 2DG': [733130, 733132] +'SE4 2DR': [720840, 720841] +'SE4 2ED': [724727, 724739] +'SE4 2EJ': [721989, 721994] +'SE4 2JH': [731787, 732620] +'SE4 2ND': [726830, 726834] +'SE4 2PX': [720589, 731655] +'SE4 2PY': [722340, 726223] +'SE5 0RR': [719886, 719887] +'SE5 8LY': [728506, 728511] +'SE5 8NQ': [731017, 731019] +'SE5 8NY': [720564, 720578] +'SE5 8QF': [721710, 721719] +'SE6 1DQ': [720568, 720575] +'SE6 1RE': [717703, 717705] +'SE6 2AB': [729138, 729139] +'SE6 2AT': [709999, 716840] +'SE6 2BU': [721716, 721723] +'SE6 2DH': [733425, 733443] +'SE6 2EX': [719438, 720162] +'SE6 2EY': [715718, 719820] +'SE6 2HN': [715571, 717440] +'SE6 2LN': [714111, 714122] +'SE6 4NF': [728723, 728725] +'SE6 4NN': [728054, 728061] +'SE7 7LG': [718085, 718515] +'SE7 7NT': [728928, 731348] +'SE7 7PF': [728055, 728063] +'SE7 7PG': [723442, 723922] +'SE7 7PJ': [710901, 724349] +'SE7 7PY': [718614, 718823] +'SE7 7QR': [724703, 725086] +'SE7 8BH': [732562, 732564] +'SE7 8EP': [711152, 711153] +'SE8 4DZ': [714949, 715545] +'SE8 4EB': [713919, 713921] +'SE8 5PT': [716008, 716965] +'SE9 1LB': [716720, 727651] +'SE9 1LD': [716484, 718243] +'SE9 3QW': [711544, 731171] +'SE9 4AN': [711670, 716962] +'SE9 4AP': [732121, 733276] +'SE9 4BN': [710247, 722401] +'SE9 4JF': [721825, 724228] +'SE9 4JY': [720076, 729226] +'SE9 4LA': [720543, 720558] +'SE9 4LR': [721706, 721972] +'SE9 4LU': [710079, 717658] +'SE9 4LX': [714039, 731581] +'SE9 4NA': [710819, 726166] +'SE9 4ND': [711375, 732081] +'SE9 6RF': [710906, 724787] +'SE9 6TS': [715830, 717276] +'SM7 2QZ': [722664, 727559] +'SO14 0AQ': [738291, 738310] +'SO14 0BN': [734822, 734825] +'SO14 0DG': [736687, 736688] +'SO14 0DL': [715338, 715775] +'SO14 0DN': [715298, 715342] +'SO14 0DQ': [731048, 731201] +'SO14 0DT': [734223, 734224] +'SO14 0DX': [716873, 719905] +'SO14 0EL': [718510, 722149] +'SO14 0ER': [713789, 730991] +'SO14 0NT': [710555, 721875] +'SO14 0PH': [725994, 726325] +'SO14 3GN': [731235, 731294] +'SO15 3EU': [712693, 724527] +'SO15 3JT': [722240, 722245] +'SO17 2HU': [714158, 715499] +'SO18 5DU': [730027, 730216] +'SO18 5GT': [724786, 725732] +'SO19 0QZ': [710143, 715586] +'SO19 2PH': [713163, 718584] +'SO19 6EL': [719293, 724804] +'SO19 7LR': [722275, 722289] +'SO19 8AX': [716796, 716819] +'SO19 9BR': [712749, 712750] +'SO19 9BU': [722299, 722302] +'SO19 9FP': [733264, 738294] +'SO19 9GE': [728541, 728756] +'SO21 3AJ': [725266, 727354] +'SO31 8DU': [718966, 725486] +'SO31 8HX': [713060, 718923] +'SW19 8SX': [736428, 737315] +'SW9 0EF': [727853, 728247] +'SW9 0SW': [733763, 735030] +'SW9 6AT': [718107, 718108] +'SW9 9EB': [713992, 733206] +'TN2 3DD': [726029, 729688] +'TN24 8UW': [729764, 729863] +'TN4 9LG': [728966, 728969] +'BN1 4LA': [716190, 716680, 717149] +'BN1 6RA': [711768, 734847, 735633] +'BN17 7SD': [710358, 710502, 710561] +'BN17 7SH': [709787, 710733, 711171] +'BN18 0BP': [712993, 722556, 727467] +'BN18 0NH': [719084, 719485, 725601] +'BN1 8QR': [741094, 741096, 741097] +'BN2 1EF': [728489, 728613, 728708] +'BN2 5HT': [714556, 722856, 733078] +'BN3 3FA': [712536, 733569, 734831] +'BN44 3TD': [722953, 726256, 726580] +'BN6 9GF': [710986, 711347, 711607] +'BN6 9YH': [711200, 711491, 711708] +'BN6 9ZD': [709791, 710736, 711174] +'BR1 2DD': [729696, 729700, 729704] +'BR1 3PU': [719914, 719925, 719935] +'BR1 3QE': [711449, 728938, 731356] +'BR1 5NS': [721699, 721702, 723125] +'BR2 6EH': [722595, 725418, 727500] +'BR2 9PL': [728495, 728930, 729684] +'BR2 9PP': [732369, 732474, 732557] +'BR2 9RR': [730098, 730269, 730946] +'BR3 1QS': [733181, 733186, 733188] +'BR5 2JR': [709904, 710932, 715244] +'BR5 2RS': [721847, 723565, 726135] +'BR5 2SJ': [711021, 711045, 721933] +'BR5 2TG': [714192, 715518, 720600] +'BR5 3DT': [717138, 722678, 727573] +'BR5 3TQ': [715693, 716214, 732973] +'BR5 4AQ': [728822, 729592, 729797] +'BR6 7EB': [714447, 718003, 719406] +'BR7 5AY': [714434, 715164, 732936] +'CR0 0AN': [715776, 716379, 732346] +'CR0 0DR': [719722, 726293, 730696] +'CR0 0QR': [710641, 720117, 721057] +'CR0 0QZ': [738344, 738345, 738346] +'CR0 2XY': [714833, 714848, 719463] +'CR0 3ED': [716943, 719220, 719979] +'CR0 3JW': [726648, 728266, 730250] +'CR0 7AY': [721027, 721582, 723304] +'CR0 7QR': [716804, 716807, 716808] +'CR0 7YF': [714940, 715540, 731719] +'CR0 9EF': [715889, 731576, 733358] +'CR0 9EP': [710887, 713634, 724661] +'CR0 9ER': [731221, 733119, 733248] +'CR2 6JE': [729897, 729905, 738288] +'CR2 8HS': [718029, 721049, 724486] +'CR7 7RL': [710829, 721987, 723182] +'CT19 6PN': [715059, 721306, 721562] +'CT2 8NS': [713313, 719158, 722875] +'CT2 8QF': [713155, 719022, 722730] +'CT2 8QG': [713033, 718901, 722600] +'CT6 7SD': [714612, 731341, 732209] +'DA11 0SA': [741037, 741038, 741039] +'DA11 8FY': [710771, 711210, 711499] +'DA11 8FZ': [710456, 710782, 711004] +'DA1 1QD': [712037, 720502, 720796] +'DA12 2JH': [731440, 731496, 732133] +'DA12 2JX': [722451, 727364, 730587] +'DA1 5GB': [721492, 721746, 722029] +'DA1 5GE': [738388, 738698, 738768] +'DA1 5HH': [711265, 711279, 711292] +'DA16 3ND': [726086, 729530, 731126] +'DA17 5BG': [710033, 711604, 713586] +'E1 1LR': [713076, 718939, 722648] +'E1 4BS': [720547, 720551, 720555] +'E1 5FF': [726237, 726561, 726850] +'E2 0QB': [721413, 721944, 723105] +'GU27 3PE': [728366, 729664, 729869] +'GU28 0HS': [725245, 733846, 738096] +'GU28 9DH': [714193, 714908, 716932] +'GU29 9EN': [735723, 736833, 737234] +'GU31 5BF': [709808, 710432, 710757] +'GU31 5JS': [714391, 715123, 732889] +'GU31 5NG': [713021, 722585, 725411] +'ME10 3EQ': [710563, 710616, 710646] +'ME10 3FR': [710811, 710852, 710884] +'ME10 4FS': [709891, 711214, 711501] +'ME10 4GS': [712822, 722379, 727292] +'ME10 4LY': [713318, 722879, 727769] +'ME15 9DG': [724724, 724732, 726488] +'ME3 7NX': [712992, 718870, 722555] +'ME5 0EZ': [718728, 722939, 723486] +'ME5 0HB': [718055, 719455, 720178] +'ME5 8FW': [710753, 712960, 718835] +'ME7 4LE': [722960, 723505, 723966] +'MK10 9RP': [714773, 715791, 715827] +'MK10 9ST': [713010, 722570, 727480] +'NN3 2BG': [730543, 731702, 732701] +'NW10 8EU': [724035, 724846, 725787] +'NW10 8NZ': [727549, 730762, 732903] +'PE1 2BJ': [709917, 713796, 731079] +'PE1 2ED': [711034, 726065, 726394] +'PE27 3HR': [710489, 727811, 732128] +'PE28 4WJ': [713160, 719025, 722736] +'PE4 5AU': [727540, 729283, 730753] +'PE4 6NQ': [731089, 731234, 733178] +'PE4 7BJ': [732467, 732517, 733360] +'PE4 7DR': [716591, 720700, 724630] +'PE4 7EL': [717670, 718115, 718128] +'PE4 7EN': [713494, 718800, 723525] +'PE6 7EU': [710318, 710388, 719839] +'PE7 3WF': [726061, 726712, 727796] +'PO10 8PS': [713756, 727734, 733069] +'PO14 1BZ': [719476, 720531, 721419] +'PO14 1JY': [722416, 725246, 729072] +'PO14 1LP': [713404, 730530, 732690] +'PO15 7LU': [728552, 728764, 729531] +'PO18 0SF': [727730, 738417, 738435] +'PO18 8DG': [713465, 714985, 731758] +'PO18 8FR': [709796, 710423, 710744] +'PO18 8TJ': [716087, 725350, 727428] +'PO18 8TQ': [713273, 719126, 725643] +'PO19 3FE': [710031, 710152, 710206] +'PO19 3HL': [734522, 737943, 738176] +'PO19 3LQ': [731276, 731388, 732150] +'PO19 6SR': [734353, 734908, 737204] +'PO19 6XL': [730987, 731271, 731384] +'PO19 6XP': [728360, 729557, 729765] +'PO19 6XR': [710238, 716801, 717296] +'PO19 7LX': [715948, 717783, 719598] +'PO19 7XL': [731466, 731590, 732217] +'PO19 8AL': [731505, 732143, 732199] +'PO19 8BX': [722043, 723227, 723730] +'PO20 0NU': [716629, 717105, 718359] +'PO20 0NX': [721033, 721588, 726626] +'PO20 0SG': [713901, 713964, 714033] +'PO20 7NL': [718748, 725265, 727353] +'PO20 8PA': [717097, 717951, 719351] +'PO21 2EH': [733573, 734835, 736244] +'RH14 0EL': [709786, 712085, 712207] +'RH14 0PQ': [719052, 725567, 727649] +'RH14 0SP': [715665, 730771, 731931] +'RH16 1DZ': [738296, 738328, 738329] +'RH19 2TA': [713263, 719123, 722829] +'RH20 1FP': [712971, 718848, 722532] +'RH6 8LP': [710728, 714216, 732700] +'SE10 9EY': [710400, 741323, 741324] +'SE12 0EF': [725101, 725102, 725103] +'SE12 8NR': [731529, 731533, 732139] +'SE12 8NU': [713873, 732481, 732485] +'SE12 9TH': [719563, 719571, 720254] +'SE13 5RN': [717328, 717333, 717336] +'SE13 6TH': [721429, 721430, 721962] +'SE13 7DH': [713474, 714990, 725299] +'SE14 5LB': [713958, 713981, 715449] +'SE14 5LE': [726538, 728950, 728957] +'SE14 5NP': [715453, 732611, 732619] +'SE14 5NS': [721181, 721183, 728185] +'SE14 5PP': [727237, 727295, 730465] +'SE14 5QQ': [715977, 721209, 728526] +'SE14 5TU': [716428, 731096, 731100] +'SE14 6NR': [720851, 720868, 723923] +'SE14 6NT': [713854, 714641, 730267] +'SE14 6SL': [721983, 721995, 724918] +'SE15 2JD': [723679, 723688, 723693] +'SE15 3HZ': [717729, 717731, 717732] +'SE15 3PX': [714130, 716265, 729452] +'SE15 3UB': [714218, 731602, 731613] +'SE15 4NR': [726154, 726475, 726783] +'SE15 4PT': [715853, 715899, 715901] +'SE15 5GB': [713041, 722609, 727509] +'SE15 5UQ': [728107, 730175, 730183] +'SE15 6NH': [732165, 732167, 741051] +'SE16 4DZ': [733894, 737904, 738145] +'SE18 2QL': [714645, 714701, 714703] +'SE18 3EZ': [720862, 732616, 732625] +'SE18 3PG': [721172, 721179, 721185] +'SE18 3PP': [713874, 713875, 713877] +'SE18 3QJ': [712524, 726650, 729878] +'SE18 4EW': [716875, 717679, 718157] +'SE18 6UF': [714147, 715918, 715932] +'SE18 7JP': [721157, 721159, 721164] +'SE18 7NB': [729879, 730066, 730251] +'SE19 1BS': [731593, 731596, 731598] +'SE19 2HJ': [731599, 733480, 733490] +'SE19 3AY': [725193, 727205, 727222] +'SE20 7LX': [725112, 727200, 727203] +'SE20 7SW': [713307, 718588, 718594] +'SE20 7TT': [714815, 714817, 714818] +'SE20 8DD': [710370, 718171, 718187] +'SE20 8HD': [718566, 718572, 718573] +'SE20 8NF': [712061, 733570, 735621] +'SE2 0HY': [713425, 714944, 716966] +'SE22 8QA': [728507, 728512, 733599] +'SE22 9HD': [711296, 724124, 728635] +'SE23 2JG': [718585, 718599, 725130] +'SE23 2ST': [714128, 715030, 715451] +'SE23 3LX': [741381, 741382, 741383] +'SE25 5BQ': [716316, 716327, 716329] +'SE25 5EE': [713283, 719133, 722851] +'SE25 5PQ': [714116, 714126, 730441] +'SE25 5PZ': [717645, 727747, 732092] +'SE25 5QA': [723909, 723916, 723920] +'SE25 6NS': [731556, 738283, 738348] +'SE25 6RQ': [730170, 730331, 732271] +'SE26 4PJ': [728952, 728962, 728968] +'SE26 6NR': [717317, 717740, 717753] +'SE2 9BX': [719906, 720211, 720223] +'SE2 9LX': [713926, 714058, 714637] +'SE3 0UG': [722428, 725258, 727341] +'SE3 7DX': [710074, 715365, 715394] +'SE3 8PZ': [729988, 729989, 729990] +'SE3 9RA': [721169, 721177, 721184] +'SE4 1NY': [720864, 720871, 720877] +'SE4 1QE': [730426, 733265, 733268] +'SE4 1UA': [717312, 717681, 717682] +'SE4 1UG': [724117, 724126, 732612] +'SE4 1XY': [716797, 716818, 716820] +'SE4 2EQ': [728400, 728403, 728630] +'SE4 2NF': [732427, 732604, 732608] +'SE4 2NX': [721943, 721990, 741386] +'SE4 2PB': [714120, 724532, 732614] +'SE5 8LG': [741336, 741338, 741544] +'SE6 1XR': [715294, 715305, 715798] +'SE6 2UF': [714048, 714050, 714052] +'SE6 4UL': [714822, 714838, 714852] +'SE7 7AB': [732607, 732610, 733184] +'SE7 7JE': [719265, 719266, 727227] +'SE7 7NX': [715914, 715915, 715916] +'SE8 3GD': [714098, 714584, 714718] +'SE8 4DX': [728629, 728633, 729509] +'SE8 4EJ': [709921, 713848, 732242] +'SE8 5AJ': [716909, 725699, 730448] +'SE8 5BA': [713725, 714517, 733036] +'SE8 5LY': [726015, 726342, 726663] +'SE9 1JU': [725702, 726704, 726968] +'SE9 1LE': [722390, 730535, 732693] +'SE9 1SW': [726953, 727080, 727198] +'SE9 4RZ': [719920, 719933, 719939] +'SE9 6NH': [716017, 729086, 732723] +'SE9 6NW': [713277, 722845, 727736] +'SE9 6TR': [714775, 714811, 715329] +'SE9 6TT': [717301, 717669, 717697] +'SO14 0AZ': [734089, 734095, 738233] +'SO14 0BX': [710267, 715146, 717982] +'SO14 0DH': [726725, 726989, 727810] +'SO14 0DP': [733469, 733971, 733972] +'SO14 0DS': [717683, 734321, 734322] +'SO14 0EJ': [723320, 724660, 728011] +'SO14 0EW': [711247, 718313, 719700] +'SO14 0LN': [729732, 736548, 736549] +'SO14 6HH': [728203, 728429, 728505] +'SO16 5FS': [727933, 727936, 727937] +'SO16 9LW': [714653, 714655, 714656] +'SO17 2FT': [737454, 737455, 738287] +'SO19 9LS': [713442, 714961, 715458] +'SO31 8HY': [713302, 719147, 722866] +'SO32 2NW': [732056, 733917, 738165] +'SW4 6FA': [739196, 739198, 739200] +'SW8 1AB': [714090, 714606, 714664] +'SW9 0PB': [716726, 730853, 733008] +'SW9 9DE': [717078, 729755, 731102] +'SW9 9JP': [716047, 717874, 719268] +'SW9 9JR': [714263, 720886, 722465] +'TN1 2EB': [716392, 716395, 716397] +'TN2 5TB': [721452, 721456, 721460] +'TN4 9NA': [728724, 728727, 728730] +'BN11 4HP': [721927, 723370, 723428, 723436] +'BN1 4AB': [725722, 725911, 726074, 726245] +'BN18 0BR': [719014, 725530, 729354, 731979] +'BN3 5EX': [713084, 725469, 727551, 729299] +'BN41 1HT': [733736, 735003, 735783, 736404] +'BN43 6NS': [741068, 741108, 741131, 741156] +'BR3 5LD': [722274, 722288, 727207, 727224] +'BR5 2FF': [710851, 710883, 710905, 710927] +'BR5 4AR': [710620, 720849, 721156, 721162] +'BR5 4RA': [717596, 725568, 729393, 732996] +'CR0 0QN': [717690, 717711, 718538, 719882] +'CR0 0RQ': [713290, 714557, 715272, 718486] +'CR0 1HG': [733792, 735057, 735820, 736435] +'CR0 2XN': [710823, 723178, 723183, 723187] +'CR0 4DS': [717611, 725594, 732036, 733024] +'CR0 4RG': [736631, 736632, 736633, 736664] +'CR0 8LP': [729038, 732441, 732530, 733101] +'CR0 8LR': [713029, 717947, 729243, 731875] +'CR0 9DU': [726416, 726587, 729737, 731438] +'CR0 9ES': [713821, 713905, 714720, 715322] +'CR2 7AY': [716949, 717832, 719229, 719986] +'CR7 7DJ': [714226, 715542, 730559, 732714] +'CT1 1ZJ': [722936, 723483, 723954, 724386] +'DA11 7BB': [728136, 728368, 728600, 728800] +'DA11 8FF': [715102, 716139, 727510, 730729] +'DA12 1HS': [713782, 713814, 713858, 733460] +'DA1 2RD': [738361, 738463, 738554, 738613] +'DA1 5HS': [710087, 710132, 710186, 710242] +'DA2 6AZ': [718868, 732252, 733209, 733429] +'DA7 6HX': [712837, 718691, 722392, 725218] +'DA8 2PF': [718740, 722430, 725259, 729093] +'DA9 9HN': [729754, 732504, 733242, 733317] +'DA9 9UU': [715747, 716269, 716763, 717227] +'E1 0AY': [726667, 726941, 727179, 728031] +'E1 2NH': [726622, 728468, 728590, 730399] +'E1 4ET': [717661, 717675, 717688, 717708] +'E1 5JE': [714539, 722834, 729462, 730907] +'E1W 1NA': [722750, 727635, 730831, 732986] +'E1W 1NH': [712939, 718801, 722492, 725322] +'E1W 1NT': [712996, 718873, 722559, 725390] +'E2 0AZ': [715074, 715621, 718876, 732840] +'E2 6DQ': [718729, 725250, 729077, 731723] +'E2 6LN': [725899, 726062, 726234, 726392] +'E2 6LP': [724604, 726270, 726878, 728226] +'E2 9RE': [719007, 725525, 729349, 731975] +'GU27 3QX': [725950, 726110, 726283, 726441] +'GU27 3TG': [733612, 734871, 735655, 736275] +'GU27 3TJ': [733590, 734852, 735638, 736258] +'GU27 3TL': [733811, 735083, 735842, 736447] +'GU27 3TQ': [733618, 734877, 735661, 736281] +'GU28 0HX': [722282, 722294, 725524, 731973] +'GU29 0DB': [712935, 722487, 725318, 729148] +'GU29 9BS': [735720, 736830, 737228, 737592] +'GU29 9FP': [741393, 741423, 741447, 741468] +'GU29 9QY': [719017, 729357, 731982, 732966] +'GU31 5QN': [713274, 722841, 727731, 732082] +'HA0 4UJ': [738430, 738443, 738449, 738476] +'HA1 4GU': [739110, 739186, 739189, 739203] +'ME10 3FN': [710252, 710344, 710488, 710545] +'ME10 3PD': [709885, 710039, 710157, 710268] +'ME10 4ES': [717857, 719252, 721251, 721778] +'ME10 4FN': [712858, 718714, 722409, 725236] +'ME10 4FY': [713159, 719024, 722735, 725542] +'ME13 8FE': [731494, 732131, 732247, 732345] +'ME1 3AT': [710496, 718370, 719755, 720102] +'ME14 2XJ': [712784, 718646, 722341, 725168] +'ME15 8JE': [710328, 716837, 717293, 717306] +'ME15 8WX': [710447, 710770, 710993, 711209] +'ME16 8FP': [712789, 718652, 722346, 725173] +'ME2 3QD': [709827, 711001, 719023, 722733] +'ME3 7BN': [713007, 718881, 722567, 725399] +'ME5 0EP': [728714, 728931, 729686, 729891] +'ME5 7NR': [726684, 726690, 726694, 726697] +'ME5 8FH': [713085, 718946, 722656, 725470] +'MK10 9RR': [727072, 728164, 728392, 736946] +'MK10 9RX': [715498, 719186, 719948, 720583] +'MK10 9SG': [712793, 722350, 727267, 730495] +'N7 9EY': [715145, 715666, 716179, 717133] +'NN3 2HH': [711638, 711677, 711678, 711680] +'PE1 2BN': [714800, 718141, 718508, 718518] +'PE1 2EU': [716790, 716812, 716832, 716851] +'PE1 5YJ': [714412, 727560, 730768, 732911] +'PE28 4WL': [713221, 719081, 722790, 725595] +'PE4 5BZ': [711534, 714697, 731084, 731288] +'PE4 6BN': [727343, 728543, 729092, 730571] +'PE4 6NH': [718473, 721137, 722840, 726193] +'PO10 8FF': [722325, 725150, 733624, 734883] +'PO10 8FR': [712745, 712746, 712747, 712748] +'PO10 8JR': [725999, 736568, 736626, 736682] +'PO15 5EB': [713828, 713913, 713973, 714042] +'PO15 6LA': [713480, 714997, 716058, 731777] +'PO15 6QN': [721565, 721830, 723286, 723549] +'PO15 6SH': [713866, 713939, 714746, 715430] +'PO18 8JY': [726979, 727801, 728084, 729720] +'PO19 3AD': [716718, 719807, 723346, 725068] +'PO19 3AN': [728024, 728487, 728921, 730256] +'PO19 3ED': [716803, 716844, 717256, 717271] +'PO19 3FF': [709833, 710461, 710789, 711012] +'PO19 3LF': [712978, 722541, 727449, 729202] +'PO19 3LW': [720124, 720758, 724044, 724466] +'PO19 6SJ': [738001, 738023, 738043, 738051] +'PO19 6SL': [733949, 733960, 738237, 738246] +'PO19 6UX': [712803, 722356, 727273, 731670] +'PO19 7AZ': [719004, 722714, 725521, 727604] +'PO19 7JH': [719768, 721055, 724261, 735511] +'PO19 8BA': [714965, 716030, 718749, 731740] +'PO19 8BS': [723513, 724409, 728559, 730125] +'PO19 8BY': [734775, 735169, 735290, 735399] +'PO19 8FT': [709832, 710458, 710786, 711006] +'PO20 0AE': [711366, 711514, 711625, 711719] +'PO20 0TD': [713208, 722780, 725583, 727672] +'PO20 1BD': [713254, 722818, 725629, 727713] +'PO20 2AG': [734688, 734691, 734693, 734695] +'PO20 2DJ': [712862, 718718, 725241, 727326] +'PO20 2JU': [709817, 710441, 710764, 710987] +'PO20 2NL': [710034, 710153, 710553, 710609] +'PO20 7RD': [715205, 715710, 732010, 732998] +'PO5 3QU': [728111, 728341, 728570, 728778] +'RH12 5GG': [728758, 728834, 729524, 729727] +'RH12 5YW': [720781, 721905, 722181, 724880] +'RH20 3LS': [710043, 710162, 710271, 710355] +'RH2 8AX': [741063, 741104, 741127, 741152] +'SE10 0AA': [709811, 722588, 725414, 729238] +'SE10 0AQ': [718224, 719616, 722026, 723680] +'SE10 0EF': [726970, 727789, 728073, 728736] +'SE10 9AQ': [713514, 717039, 717464, 718309] +'SE10 9PJ': [728892, 730046, 730392, 730425] +'SE12 8NP': [719915, 719926, 741360, 741532] +'SE12 9PZ': [709799, 722498, 725330, 727408] +'SE13 5LW': [741402, 741435, 741456, 741478] +'SE13 6QF': [714093, 714731, 714733, 714763] +'SE13 6RD': [726373, 726375, 733485, 733496] +'SE13 7AW': [710181, 715435, 715436, 716371] +'SE13 7LH': [721517, 726574, 727960, 729726] +'SE14 5NQ': [726539, 726682, 726691, 726693] +'SE14 5SA': [724345, 724351, 724353, 724354] +'SE14 6DB': [716685, 718992, 719784, 732944] +'SE14 6NY': [731016, 731021, 732328, 732329] +'SE14 6RT': [715886, 716367, 741302, 741303] +'SE14 6TW': [716429, 718597, 730464, 731605] +'SE15 5NN': [731595, 731597, 732223, 732227] +'SE15 6RP': [712973, 718851, 722534, 725365] +'SE16 4BE': [735755, 736375, 736862, 737262] +'SE18 1QD': [718586, 718593, 718600, 718604] +'SE18 3EW': [714850, 725114, 725116, 729901] +'SE19 1NZ': [714560, 715763, 732099, 733083] +'SE19 2UH': [715464, 715477, 715482, 715485] +'SE20 7HG': [718166, 718183, 719564, 719577] +'SE20 7JH': [710237, 716843, 716852, 716878] +'SE23 2QS': [741296, 741529, 741534, 741536] +'SE25 6QT': [733582, 734844, 738268, 738289] +'SE26 5HZ': [714008, 714009, 733298, 733299] +'SE26 5PW': [731239, 731241, 731242, 733260] +'SE26 5QQ': [720861, 720869, 730447, 730454] +'SE2 9QL': [715690, 718407, 721896, 729353] +'SE4 1NT': [719292, 730335, 730341, 730343] +'SE4 1YD': [729810, 731168, 731172, 731175] +'SE4 1YR': [731297, 731301, 731528, 731532] +'SE4 2NL': [728939, 728941, 730094, 730097] +'SE5 8NZ': [717335, 741299, 741376, 741537] +'SE6 2EU': [714025, 716406, 716874, 717295] +'SE6 2NZ': [710183, 716389, 716396, 716409] +'SE6 4XB': [710900, 724334, 724520, 724521] +'SE8 3EE': [719086, 725602, 729420, 732040] +'SE8 5AX': [728035, 728163, 728283, 728391] +'SE9 1LG': [722613, 727149, 727515, 730732] +'SE9 1PB': [717742, 720984, 721174, 728879] +'SE9 1SP': [727197, 727917, 727924, 728051] +'SE9 6RB': [714975, 717866, 719261, 729110] +'SE9 6RE': [720340, 720953, 721526, 722061] +'SE9 6RQ': [714442, 715679, 721072, 721621] +'SE9 6UG': [721432, 721707, 721973, 722256] +'SO14 0DR': [714023, 733453, 738240, 738241] +'SO14 0EF': [716656, 731924, 735209, 735210] +'SO14 0EH': [720256, 738260, 738316, 738321] +'SO14 0LR': [741389, 741419, 741443, 741530] +'SO14 3GB': [716011, 716502, 716970, 717404] +'SO15 3BN': [724725, 724733, 724736, 724738] +'SO15 3DR': [721231, 721763, 722933, 723479] +'SO15 3FR': [733585, 734846, 735632, 736253] +'SO17 2GH': [724494, 724528, 724890, 724920] +'SO32 3AS': [710745, 710969, 711182, 711330] +'SW2 5AP': [741406, 741440, 741462, 741482] +'SW2 5RH': [731489, 732126, 732241, 732341] +'SW2 5UG': [720209, 720221, 720227, 720234] +'SW4 6TH': [719129, 725648, 729471, 732086] +'SW9 0AR': [733785, 733808, 735047, 735080] +'SW9 0RH': [735059, 735061, 735821, 735823] +'SW9 6AR': [718504, 733773, 735035, 735810] +'SW9 6AS': [719136, 725655, 727746, 730917] +'SW9 9DQ': [722575, 723794, 728057, 728065] +'SW9 9DY': [715489, 716505, 732661, 733484] +'TN2 3JN': [732540, 733110, 733207, 733283] +'BN1 3RB': [733367, 733369, 733411, 733414, 733415] +'BN17 5BA': [712933, 718795, 722485, 725316, 727395] +'BN18 0RW': [713319, 719162, 722880, 725679, 727770] +'BN18 0RZ': [714573, 715286, 727771, 730937, 733095] +'BN2 8GH': [710138, 710698, 710808, 710832, 710849] +'BN41 1PL': [727004, 727828, 728108, 728336, 728565] +'BR1 3PZ': [714828, 714844, 714855, 725128, 738273] +'BR1 5JG': [718145, 718147, 718149, 718150, 718151] +'BR3 5JD': [710888, 723689, 724129, 724132, 724134] +'BR6 6FL': [712952, 718824, 722510, 725341, 727420] +'BR7 6FB': [711627, 711721, 711763, 712059, 712184] +'CR0 9ET': [715419, 715843, 715908, 716384, 716834] +'CR2 7EN': [738259, 738300, 738315, 738320, 738325] +'CT1 1AF': [711010, 713214, 719075, 722785, 727678] +'CT20 1JZ': [711515, 713211, 722782, 727676, 733018] +'CT20 1NQ': [713276, 722844, 727735, 730911, 733070] +'CT4 5BN': [720476, 721089, 721635, 721899, 723611] +'CT5 1SN': [710135, 727311, 729052, 730544, 731703] +'CT5 1SQ': [711789, 712082, 712205, 712304, 712399] +'DA12 1NJ': [741264, 741267, 741270, 741273, 741276] +'DA12 4DD': [722554, 725387, 727466, 729214, 730681] +'DA1 5GD': [722434, 725263, 727345, 729096, 730574] +'DA1 5GN': [709839, 710729, 712849, 718705, 719110] +'DA1 5NT': [711321, 725225, 727312, 730545, 731704] +'DA9 9FG': [714498, 716731, 727670, 730860, 733015] +'DA9 9SY': [711686, 712800, 713376, 714898, 725182] +'E1 0JW': [715225, 716245, 717204, 718046, 719446] +'E1 8BS': [726276, 726433, 726596, 726748, 726883] +'E1W 1NY': [713070, 722641, 725453, 727539, 729282] +'E2 0BQ': [713002, 713559, 727473, 730690, 732843] +'E2 6NG': [716277, 717642, 719861, 720196, 725654] +'GU27 3AJ': [722675, 725485, 727571, 733699, 734963] +'GU28 0ED': [713198, 715714, 717192, 725574, 732019] +'GU28 0QX': [727709, 729449, 730896, 732064, 733052] +'GU29 9EQ': [714324, 716106, 716588, 717481, 717920] +'GU29 9ER': [714339, 715078, 727475, 730693, 731855] +'GU29 9ES': [735771, 736392, 737283, 737633, 737919] +'ME10 4FQ': [709798, 710425, 710746, 710971, 711183] +'ME10 4NX': [714495, 722774, 727666, 730856, 733013] +'ME12 2GF': [714353, 722589, 727496, 730712, 732858] +'ME14 1JH': [741398, 741429, 741452, 741493, 741509] +'ME17 1GU': [710726, 711164, 711466, 711581, 711692] +'ME20 7HS': [716538, 719669, 720346, 722067, 723246] +'ME2 1BG': [713153, 717749, 719020, 722728, 725536] +'ME2 2GL': [712921, 722471, 727387, 730611, 732765] +'ME2 4BJ': [713262, 719122, 722828, 725637, 727720] +'NN3 2BW': [710801, 711026, 711237, 711822, 712113] +'NW10 8GD': [713189, 722764, 727652, 730846, 732999] +'NW10 8LR': [712852, 718708, 722405, 725232, 727318] +'NW10 8RF': [726876, 727115, 727972, 728222, 728444] +'NW10 8SH': [712923, 716283, 727388, 730613, 732767] +'PE1 2BD': [715020, 726431, 727212, 729165, 730442] +'PE1 2EG': [714010, 714011, 714012, 732449, 732480] +'PE1 5NG': [710232, 716402, 716793, 716816, 716835] +'PE4 7BA': [718402, 721076, 721363, 721624, 722164] +'PE4 7EJ': [710229, 715857, 716823, 716831, 716850] +'PE6 7WH': [713161, 719026, 722737, 725543, 727623] +'PO10 8FJ': [710765, 710989, 711204, 711805, 712097] +'PO10 8HQ': [713252, 719113, 722816, 725627, 727711] +'PO10 8TY': [712860, 718716, 722412, 725240, 727324] +'PO14 1NL': [713054, 718919, 722621, 725438, 727522] +'PO1 5QU': [712990, 722552, 727464, 730679, 732834] +'PO16 7GN': [712983, 718862, 722547, 725378, 727458] +'PO18 0BY': [714532, 719118, 722820, 730900, 733056] +'PO18 0EH': [717418, 720009, 721253, 722952, 723239] +'PO18 0SN': [722716, 725523, 727606, 738362, 738464] +'PO18 8LB': [718378, 719766, 720446, 720749, 721053] +'PO18 8RS': [713058, 714376, 718922, 722626, 730742] +'PO18 8SN': [712834, 713407, 715533, 715991, 718688] +'PO19 3AL': [714696, 714749, 715300, 715344, 732263] +'PO19 3AT': [715664, 716665, 718384, 724657, 726913] +'PO19 3LN': [713519, 719698, 720685, 720990, 721294] +'PO19 3LY': [713028, 714357, 716617, 718896, 725419] +'PO19 3NT': [715127, 716164, 718941, 725464, 729292] +'PO19 6SS': [735598, 735925, 736013, 736229, 736507] +'PO19 6TE': [714510, 715226, 716249, 716740, 717207] +'PO19 6UU': [714901, 715965, 717804, 720281, 720909] +'PO19 6XB': [713243, 719843, 721931, 722811, 725619] +'PO19 7QH': [715156, 718979, 722686, 725495, 731949] +'PO19 8BT': [730968, 731256, 731374, 733108, 733204] +'PO19 8TF': [741399, 741430, 741453, 741474, 741494] +'PO20 0FL': [710259, 710751, 710975, 711188, 711336] +'PO20 0RE': [713138, 719002, 722712, 725519, 727602] +'PO20 0SH': [713785, 732546, 733213, 733289, 733352] +'PO20 1AB': [713110, 718974, 722683, 725490, 727576] +'PO20 1PL': [712967, 718843, 722526, 727440, 729190] +'PO20 1QG': [713154, 719021, 722729, 725537, 727618] +'PO20 2JB': [720921, 721211, 721493, 721748, 722919] +'PO20 7JT': [713600, 722623, 727524, 729264, 730738] +'PO20 8PE': [714345, 720712, 721839, 727485, 732848] +'PO2 8LW': [716859, 716880, 717258, 717273, 717289] +'PO3 5XG': [713011, 722572, 727482, 730699, 732847] +'PO7 5AW': [716473, 717383, 718231, 719623, 720294] +'RH12 5YF': [726513, 726814, 728032, 728493, 728619] +'RH1 2AX': [711587, 713452, 718755, 725273, 729106] +'RH14 0DH': [714242, 718743, 722433, 725262, 729095] +'RH14 0JT': [713662, 716692, 717572, 730806, 732956] +'RH14 0QT': [712861, 718717, 722413, 736303, 736799] +'RH15 8NP': [741078, 741121, 741146, 741178, 741206] +'RH16 4GL': [732403, 732507, 732586, 733163, 733246] +'RH20 1NP': [712883, 718742, 722432, 725261, 729348] +'RH20 1PS': [713244, 719105, 722812, 725620, 729441] +'RH20 4JX': [713216, 719076, 722786, 725589, 727679] +'RH2 9EX': [722066, 723245, 723747, 724194, 724590] +'SE10 0AD': [717864, 720645, 721260, 721785, 723502] +'SE10 0AH': [711411, 728832, 729715, 729985, 732333] +'SE10 0AL': [712814, 718670, 722367, 725195, 727284] +'SE10 9FN': [713102, 714420, 722673, 727570, 732920] +'SE10 9FS': [723503, 724191, 724399, 735987, 736041] +'SE10 9PH': [717799, 721480, 725180, 729012, 731664] +'SE11 4TU': [710672, 741329, 741335, 741337, 741339] +'SE14 5BZ': [712947, 718814, 722503, 725336, 727412] +'SE14 5LA': [726833, 728732, 728776, 730337, 730339] +'SE14 5TP': [723904, 723910, 724563, 729991, 730093] +'SE15 4AN': [716514, 717754, 718550, 718563, 719654] +'SE15 6LZ': [712989, 722551, 727463, 730678, 732833] +'SE15 6QY': [714290, 715587, 718806, 725326, 729159] +'SE18 2QG': [741401, 741434, 741455, 741477, 741496] +'SE18 4HF': [710035, 713592, 714367, 715640, 732870] +'SE18 7PZ': [710235, 716358, 716863, 717677, 717707] +'SE18 7SX': [733777, 735040, 735813, 736429, 736907] +'SE19 3SW': [711391, 729604, 729607, 729609, 729611] +'SE20 8DS': [741371, 741372, 741373, 741374, 741387] +'SE20 8SS': [712965, 718841, 722524, 725358, 727437] +'SE23 1JZ': [728632, 728634, 729805, 729807, 741297] +'SE23 1QY': [711060, 711061, 711062, 711063, 726052] +'SE23 2UD': [716419, 716423, 727215, 727221, 727230] +'SE25 4TJ': [722203, 723092, 723368, 723637, 723868] +'SE26 4AQ': [719881, 719888, 719894, 719900, 719907] +'SE26 4PF': [716895, 717575, 717746, 718583, 720770] +'SE26 5JF': [718578, 718590, 724569, 726683, 726689] +'SE28 0BF': [710933, 724144, 724540, 725881, 726220] +'SE28 8DF': [713305, 716287, 722868, 726828, 733087] +'SE3 7TG': [711679, 732624, 732629, 732630, 732631] +'SE4 1YB': [719206, 724921, 724923, 724925, 724926] +'SE4 2DT': [716828, 717261, 717262, 733334, 733336] +'SE4 2NJ': [718558, 718569, 728940, 728942, 728944] +'SE5 7RR': [714214, 714928, 715535, 715994, 716488] +'SE6 2ET': [716792, 716814, 717264, 717671, 718104] +'SE6 4HU': [741404, 741437, 741459, 741480, 741498] +'SE8 4JL': [716621, 721579, 722121, 727505, 741433] +'SE8 5BD': [728282, 728929, 729683, 729889, 730076] +'SE8 5LZ': [718758, 722450, 725276, 727363, 729109] +'SE9 4JD': [711145, 711176, 711588, 724974, 728551] +'SE9 6NN': [718073, 719474, 720194, 720820, 727898] +'SE9 6SR': [718121, 719488, 719526, 719554, 719878] +'SE9 6UE': [723898, 724112, 724326, 724332, 724513] +'SO14 0AP': [713872, 714072, 714074, 738251, 738298] +'SO14 0ES': [729870, 730405, 731220, 731453, 732589] +'SO14 0PA': [741170, 741171, 741172, 741173, 741174] +'SO15 0HT': [741060, 741102, 741125, 741150, 741182] +'SO15 1JN': [710961, 713431, 718733, 729081, 731728] +'SO15 5AX': [713539, 715054, 716102, 717060, 717918] +'SO16 6TA': [715978, 716467, 716937, 717380, 717815] +'SO17 2HP': [712697, 738266, 738302, 738322, 738326] +'SO17 3SE': [728719, 728720, 728722, 728830, 728831] +'SO18 4UF': [712891, 718750, 722443, 725267, 727356] +'SO19 5LW': [713130, 718996, 722704, 725509, 727593] +'SO23 7GN': [709784, 710413, 710727, 710955, 711166] +'SO31 7ER': [725878, 726219, 726371, 726379, 726530] +'SO31 7FL': [720842, 720845, 720846, 720847, 720848] +'SW4 6RT': [713065, 718926, 727530, 729271, 731898] +'TN11 0BF': [710472, 713271, 715258, 717230, 722838] +'TN4 0BE': [720008, 724584, 724969, 725918, 726253] +'TN4 9US': [717891, 719283, 720032, 720668, 721277] +'BN17 7SJ': [711807, 712099, 712221, 712319, 712417, 712500] +'BN18 0BZ': [714302, 718826, 725344, 729176, 730646, 732802] +'BN2 5LL': [713197, 719060, 722770, 725573, 727661, 729400] +'BN2 5RS': [733722, 734988, 735768, 736389, 736875, 737280] +'BN2 9NE': [717348, 717781, 718201, 719189, 719596, 719951] +'BN2 9WP': [710984, 713053, 718918, 722620, 727521, 729262] +'BN3 1WB': [718764, 722461, 725283, 727372, 729116, 730595] +'BN41 1AR': [735356, 735412, 735460, 735504, 735547, 735591] +'BN41 1GQ': [711520, 713746, 714535, 715251, 732072, 733058] +'BR2 0LN': [719560, 719576, 719580, 719582, 722276, 722290] +'BR2 0NU': [710473, 713275, 722842, 725644, 727732, 729468] +'BR3 4PL': [710009, 714820, 714836, 714857, 714859, 714860] +'BR5 2FB': [711769, 712065, 712127, 712154, 712189, 712288] +'BR5 3QE': [740999, 741015, 741025, 741030, 741034, 741040] +'BR5 3SL': [712910, 714984, 717002, 720018, 720652, 729120] +'CR0 0SL': [712909, 718769, 722463, 725289, 727375, 729119] +'CR0 8JL': [729824, 729898, 729902, 729906, 731188, 731545] +'CT5 1SH': [714987, 716051, 717006, 717877, 719271, 720021] +'DA11 8FD': [738371, 738387, 738461, 738611, 738697, 738741] +'DA12 2JA': [710622, 712772, 720271, 722330, 727255, 730481] +'DA1 2EP': [720863, 720870, 720876, 720879, 720881, 720883] +'DA1 2FE': [711190, 713521, 729182, 730654, 731820, 732809] +'DA14 6NU': [713115, 718983, 722690, 725498, 727582, 729327] +'DA1 5EF': [709915, 709922, 712679, 712680, 712681, 738229] +'DA1 5JX': [713605, 714380, 729270, 730745, 731897, 732879] +'DA1 5WR': [710401, 710717, 710945, 711154, 711313, 711455] +'DA17 5LL': [719599, 720270, 720900, 721468, 722010, 723198] +'DA8 2PT': [710597, 710619, 720552, 720559, 720839, 720843] +'E1 1BF': [714382, 719515, 722632, 727531, 730746, 732880] +'E1 2LA': [719795, 720472, 721084, 721631, 722174, 723333] +'E1 2LP': [724433, 725758, 733759, 735024, 735802, 736421] +'E1 2ND': [716936, 731110, 731247, 731361, 732233, 732439] +'E14 7PD': [709792, 710419, 710738, 710965, 713757, 732084] +'E1 5BF': [716624, 717511, 718354, 719737, 720415, 721025] +'E1 5LD': [722583, 725409, 727492, 729234, 730708, 731865] +'E1W 1NS': [713316, 719160, 722877, 725678, 729494, 730935] +'E1W 2PT': [713259, 714536, 722825, 727718, 730903, 733059] +'E2 0BW': [713247, 713735, 716261, 717219, 727705, 730893] +'E2 6GT': [714726, 714772, 714809, 715326, 715360, 715392] +'E2 6LH': [713269, 714541, 722836, 727726, 729464, 733065] +'E2 9BA': [713144, 715461, 716205, 717163, 719011, 720141] +'GU27 3SX': [716768, 717234, 717639, 718072, 734200, 734406] +'GU27 3TA': [713097, 718959, 722668, 725479, 727563, 729310] +'GU27 3TB': [713090, 718951, 722660, 725472, 727557, 729303] +'GU28 0BT': [716570, 717037, 719300, 719691, 720045, 731813] +'GU28 0EY': [715757, 716279, 717237, 717644, 718480, 720822] +'GU28 9AB': [733681, 734943, 736350, 736842, 737242, 737883] +'GU28 9JA': [716691, 717571, 718401, 719790, 722163, 723327] +'GU29 9AH': [725293, 727380, 729124, 733713, 734979, 735761] +'GU29 9ET': [712805, 714186, 714903, 718661, 729019, 731672] +'GU29 9SF': [713745, 714534, 722822, 723380, 727716, 732070] +'GU29 9TE': [713131, 725510, 727594, 729338, 730801, 737636] +'HA1 4GX': [739112, 739118, 739161, 739188, 739193, 739211] +'ME10 3FD': [711085, 711101, 711120, 711146, 711253, 711269] +'ME10 4FU': [710405, 710949, 712811, 722364, 727280, 730509] +'ME10 4FW': [709813, 710437, 710762, 710981, 711201, 711344] +'ME10 4FX': [709780, 710406, 710723, 710950, 711161, 711317] +'ME10 4GB': [709834, 710462, 710790, 711013, 711227, 711368] +'ME10 4GE': [712955, 718830, 722514, 725346, 727425, 729178] +'ME10 4GF': [709794, 710421, 710743, 710968, 711181, 711329] +'ME10 4NQ': [709846, 710117, 710222, 710800, 711236, 711523] +'ME10 4QQ': [711821, 712112, 712235, 712333, 712430, 712516] +'ME10 4RN': [711740, 711748, 732499, 732580, 733153, 733311] +'ME12 2GA': [722100, 723277, 723781, 724225, 724624, 724998] +'ME12 2GE': [738369, 738385, 738402, 738422, 738440, 738739] +'ME13 8FG': [713736, 715240, 719107, 725623, 729444, 732062] +'ME1 3WR': [711823, 712114, 712236, 712334, 712431, 712517] +'ME14 5DG': [741308, 741310, 741312, 741319, 741320, 741322] +'ME15 8JF': [733747, 735013, 735793, 736413, 736897, 737303] +'ME15 8JG': [712322, 733710, 734975, 735758, 736865, 737266] +'ME15 8WN': [709880, 710032, 710436, 710980, 711342, 711603] +'ME15 8WU': [710418, 710737, 710964, 711175, 711327, 738359] +'ME16 8AU': [741066, 741106, 741129, 741154, 741186, 741212] +'ME16 8LL': [711787, 712081, 712204, 712303, 712396, 712483] +'ME16 9FE': [711766, 712062, 712187, 712286, 712381, 712464] +'ME19 4TH': [709779, 709940, 710721, 711159, 711459, 711685] +'ME20 7GU': [709948, 710096, 710739, 711177, 711474, 711697] +'ME2 2BN': [709776, 710718, 710946, 711155, 718634, 728992] +'ME3 9EJ': [715201, 715707, 719805, 720154, 720485, 720783] +'ME9 8WN': [711880, 711934, 711975, 712407, 712556, 712656] +'MK10 9SQ': [715940, 716900, 717774, 723924, 724355, 724742] +'MK10 9SX': [733671, 734932, 735721, 736339, 736831, 737229] +'N1 7DG': [713673, 714460, 730818, 731985, 732971, 737270] +'N7 8AX': [713802, 713883, 714017, 714083, 714599, 733375] +'N7 8JB': [713069, 714388, 725451, 729279, 731907, 732886] +'NN3 6RQ': [719980, 720298, 720610, 720925, 726236, 726560] +'NW10 2TS': [712005, 712021, 734773, 735101, 735166, 735225] +'NW10 8LF': [712754, 718613, 722311, 730463, 731628, 738605] +'NW6 7YL': [738913, 738953, 738994, 739017, 739046, 739070] +'NW6 7YN': [738791, 738912, 738993, 739016, 739045, 739069] +'PE28 4WT': [710411, 711320, 712819, 722374, 725200, 727288] +'PE2 8LR': [710670, 721431, 721435, 721439, 721696, 721701] +'PO10 8AS': [712449, 712458, 737099, 737366, 737408, 737446] +'PO10 8HW': [713583, 714360, 715099, 725425, 730723, 731880] +'PO15 6JQ': [713297, 719144, 722862, 725665, 727757, 729484] +'PO1 5BN': [713428, 714947, 718730, 725251, 729078, 731724] +'PO1 5BW': [728091, 728322, 728544, 728759, 729525, 729728] +'PO18 0EP': [713140, 719005, 722715, 725522, 727605, 729347] +'PO18 0FL': [733648, 734909, 735694, 736314, 736806, 737206] +'PO18 8QR': [717183, 719046, 725560, 729385, 732003, 732991] +'PO18 8QS': [713585, 714362, 716135, 725427, 729249, 731882] +'PO19 3AA': [721909, 723623, 726805, 727058, 727885, 729581] +'PO19 3AP': [714613, 731230, 731345, 731584, 732417, 732596] +'PO19 3DB': [731286, 731521, 732157, 732265, 732366, 732469] +'PO19 3FG': [709821, 710445, 710769, 710991, 711208, 711351] +'PO19 3JQ': [715010, 718799, 727400, 729151, 730627, 731795] +'PO19 3LD': [717367, 717802, 718215, 720279, 725184, 731666] +'PO19 3LE': [713907, 713968, 714037, 733324, 733394, 733468] +'PO19 3NQ': [727373, 730596, 734012, 734260, 734473, 738103] +'PO19 6UL': [712352, 736073, 736145, 736214, 736490, 736609] +'PO19 6XD': [725621, 727704, 729442, 733733, 734998, 735780] +'PO19 6XJ': [717713, 717723, 718131, 718156, 718497, 718522] +'PO20 0BF': [710390, 710506, 711022, 711233, 711371, 711518] +'PO20 0SF': [734133, 736808, 738864, 738890, 738897, 738991] +'PO20 0SQ': [717436, 717878, 718285, 721533, 730604, 731766] +'PO20 1AS': [714319, 715198, 717056, 717477, 718323, 719426] +'PO20 1AU': [713104, 722676, 727572, 730776, 731940, 732921] +'PO20 2AU': [738793, 738914, 738954, 738996, 739018, 739047] +'PO20 2HU': [713862, 713998, 715321, 715356, 715390, 715418] +'PO20 2JQ': [709974, 710050, 710168, 711223, 711363, 711512] +'PO20 7ET': [713927, 732297, 732450, 732498, 733152, 733202] +'PO20 7EZ': [713421, 727325, 729068, 730556, 731717, 732709] +'PO20 7FA': [710647, 710689, 710709, 710821, 711016, 711230] +'PO20 8PB': [716686, 717565, 717998, 725507, 730798, 732948] +'PO21 5BN': [713171, 730827, 731994, 732980, 735763, 736871] +'RH12 5YH': [710046, 714461, 716703, 722727, 729361, 731986] +'RH14 0AW': [713096, 718958, 722667, 725478, 727562, 729308] +'RH14 0TT': [718893, 722591, 727498, 730714, 731871, 732860] +'RH16 4LD': [713659, 715174, 721362, 721889, 723056, 731969] +'RH19 3RT': [727942, 728071, 728189, 728303, 728413, 728520] +'SE10 9EN': [713759, 715264, 716770, 718479, 722848, 727740] +'SE10 9LB': [712472, 733607, 733828, 734111, 735069, 736439] +'SE13 5RL': [728179, 728182, 728183, 728184, 728406, 728408] +'SE1 3GH': [735486, 735530, 735574, 737132, 737333, 737357] +'SE14 5BT': [710072, 714673, 714721, 714769, 714807, 715323] +'SE14 5FH': [709828, 710455, 710779, 711002, 711220, 711360] +'SE14 5LU': [715334, 715347, 717277, 717283, 717704, 717706] +'SE14 5NT': [721285, 721459, 726053, 726142, 726215, 728067] +'SE14 5NW': [741045, 741046, 741047, 741048, 741049, 741050] +'SE14 6EN': [717792, 719195, 719957, 720590, 721201, 721735] +'SE14 6PA': [713405, 714921, 715990, 718687, 725215, 730532] +'SE14 6QL': [729538, 730971, 731375, 731497, 732134, 732347] +'SE1 4JU': [741059, 741101, 741124, 741149, 741181, 741209] +'SE15 2BG': [714619, 714621, 714623, 714625, 714627, 714629] +'SE15 2HY': [711572, 711651, 732225, 732605, 732609, 733185] +'SE15 3DA': [717743, 717757, 729698, 729701, 731354, 731355] +'SE15 5JB': [713619, 715130, 718944, 725467, 729296, 731922] +'SE15 5NY': [711047, 711079, 725872, 725874, 726212, 726216] +'SE1 5BN': [741163, 741287, 741288, 741289, 741290, 741291] +'SE16 3SS': [711825, 712238, 733775, 735037, 735038, 736425] +'SE16 7PP': [712842, 718695, 722396, 725222, 727309, 729048] +'SE17 2LN': [741061, 741103, 741126, 741151, 741183, 741210] +'SE18 2PF': [711377, 713292, 719141, 722859, 725661, 727754] +'SE18 3QH': [714049, 714051, 714682, 714683, 715425, 732428] +'SE18 3SQ': [741407, 741441, 741463, 741483, 741500, 741512] +'SE18 4LP': [712338, 737321, 741079, 741118, 741184, 741460] +'SE18 5HT': [712116, 733782, 737317, 741458, 741479, 741497] +'SE19 2JB': [710185, 716412, 716420, 716425, 719566, 719572] +'SE20 7HB': [711343, 713037, 718905, 722605, 725429, 727506] +'SE20 7UQ': [710714, 722264, 722270, 722271, 725117, 725119] +'SE20 8AU': [733180, 733183, 733187, 733189, 733190, 733191] +'SE20 8BZ': [733479, 733489, 733497, 733800, 735065, 736437] +'SE20 8HW': [741309, 741311, 741313, 741314, 741315, 741316] +'SE20 8TJ': [710567, 720214, 720215, 720216, 720217, 720218] +'SE23 2UR': [713338, 716427, 716893, 717768, 718726, 732715] +'SE25 6XH': [723687, 724529, 724533, 724534, 733600, 738354] +'SE26 4PB': [714841, 715472, 718165, 718175, 718765, 718766] +'SE26 4QG': [715552, 715927, 718562, 724336, 724346, 724730] +'SE26 5RX': [728332, 728560, 729535, 730290, 730970, 731131] +'SE3 8EQ': [713062, 718924, 722629, 725442, 727529, 729267] +'SE4 1TF': [713836, 713838, 714073, 714076, 714077, 733322] +'SE5 7RY': [715800, 715840, 715867, 715893, 716298, 716321] +'SE5 8QJ': [741353, 741354, 741355, 741356, 741357, 741358] +'SE6 1RQ': [733564, 734826, 735616, 736237, 736742, 737155] +'SE7 7AA': [733813, 735084, 735844, 741169, 741224, 741501] +'SE7 8ET': [711285, 728508, 731097, 731101, 733259, 733263] +'SE8 3LG': [739236, 739237, 739238, 739334, 739335, 739336] +'SE9 1JY': [729507, 731106, 731244, 731477, 732112, 733341] +'SE9 1LP': [714238, 718265, 719652, 720324, 723234, 732728] +'SE9 6ST': [719893, 720213, 720229, 720238, 720548, 721158] +'SO14 0LT': [712533, 733106, 736547, 737501, 737968, 737969] +'SO14 1AX': [733783, 735053, 735828, 736442, 736918, 737329] +'SO15 5EG': [733589, 734851, 735637, 736257, 736759, 737165] +'SO16 9GL': [717394, 717738, 717751, 717763, 717765, 717767] +'SO18 1BX': [733615, 734874, 735658, 736278, 736774, 737178] +'SO31 7LA': [713231, 719093, 722797, 725608, 727693, 729428] +'SO31 8HU': [716131, 717094, 717948, 719347, 720203, 720718] +'SW4 6QT': [712773, 718635, 725156, 728993, 730482, 732650] +'SW8 2PD': [735613, 735615, 736739, 736741, 737518, 737520] +'SW9 0AB': [713046, 725123, 726051, 733762, 733799, 735028] +'SW9 0SN': [714861, 733764, 733769, 735031, 735033, 735808] +'SW9 9HD': [712928, 713485, 714276, 715001, 731784, 732773] +'SW9 9HL': [733806, 735077, 735838, 736444, 736919, 737327] +'TN16 1FD': [711802, 712094, 712216, 712314, 712412, 712495] +'TN37 7FY': [733758, 735023, 735801, 736420, 736902, 737309] +'BN10 8FA': [711437, 711448, 711540, 711547, 711556, 711562, 711571] +'BN17 5BH': [723427, 723432, 723439, 723903, 723912, 724338, 724347] +'BN17 5QS': [710787, 713194, 719057, 727657, 729396, 730850, 732014] +'BN2 1HN': [712708, 720943, 721516, 738292, 738311, 738318, 738323] +'BN6 9YL': [709890, 710211, 710309, 711213, 711354, 711500, 711616] +'CR0 2FG': [733621, 734880, 735665, 736285, 736778, 737182, 737547] +'CT1 3BE': [741076, 741116, 741141, 741166, 741197, 741222, 741239] +'CT20 2RA': [741392, 741422, 741446, 741467, 741488, 741505, 741516] +'CT20 9GP': [741018, 741019, 741020, 741021, 741022, 741023, 741024] +'CT5 1SS': [717483, 718328, 719712, 722545, 727454, 730674, 732827] +'DA12 2JQ': [741266, 741269, 741272, 741275, 741278, 741280, 741282] +'DA8 2PQ': [711415, 729542, 729742, 730127, 730293, 730975, 731134] +'E1 0DS': [712946, 718812, 722502, 725334, 727411, 729166, 730637] +'E1 2NW': [723481, 723727, 724175, 724574, 724771, 724959, 725720] +'E1 5JQ': [713810, 714713, 714764, 714801, 715315, 715355, 715387] +'E1W 1NU': [713227, 719089, 722794, 725606, 727690, 729423, 730879] +'E1W 3ER': [727081, 727195, 727196, 727199, 727908, 727916, 727922] +'E2 6NQ': [714161, 718627, 719594, 720268, 720584, 720897, 731641] +'E2 7AJ': [717959, 719363, 724453, 724840, 726776, 728130, 729266] +'E2 7DB': [729890, 730419, 731087, 731350, 731589, 732215, 732319] +'GU27 3JL': [716028, 716983, 717417, 718270, 719253, 720332, 721252] +'GU28 0LN': [733680, 734942, 735731, 736349, 736841, 737241, 737882] +'GU28 0LW': [733701, 734965, 735749, 736368, 736856, 737257, 737901] +'GU29 0DN': [713456, 714977, 715563, 722453, 730589, 731749, 732744] +'HA1 4WN': [739111, 739117, 739122, 739124, 739187, 739190, 739213] +'ME10 3FA': [709954, 710100, 710200, 710299, 710379, 710522, 710580] +'ME10 4EH': [717522, 718364, 719367, 719748, 720099, 720427, 721037] +'ME13 8FF': [717698, 717717, 718086, 718103, 718117, 718136, 718153] +'ME1 3YL': [709905, 709980, 710057, 710113, 711519, 711633, 711726] +'ME15 6NG': [709825, 710453, 710776, 710998, 711217, 711358, 711506] +'ME4 6BX': [710794, 711019, 711725, 727703, 729440, 730890, 732059] +'MK10 9SR': [712765, 714873, 715946, 719595, 720269, 720898, 722324] +'N7 8BB': [712896, 714250, 715559, 729103, 730584, 731744, 732737] +'N7 9EE': [714960, 719249, 720634, 723498, 723964, 725260, 729094] +'NW10 8GF': [712855, 714219, 715536, 722406, 727320, 730552, 732704] +'NW10 8RQ': [713809, 732581, 733156, 733239, 733312, 733383, 733455] +'PE28 4WH': [711198, 713030, 718897, 722596, 725420, 729244, 730718] +'PE2 8HF': [710882, 720935, 722938, 723485, 724389, 724774, 725723] +'PE4 7EW': [711401, 713893, 713929, 713991, 714640, 728874, 729541] +'PO10 8BQ': [713296, 719143, 725664, 736890, 737297, 737642, 737932] +'PO10 8FP': [709892, 710996, 711215, 711355, 711502, 711617, 711713] +'PO10 8LZ': [713601, 716148, 718921, 721857, 723576, 725441, 731896] +'PO10 8SY': [716025, 716980, 717856, 719250, 720007, 720635, 721249] +'PO15 7NN': [728540, 728657, 728755, 728860, 729724, 729934, 730115] +'PO15 7NZ': [714394, 725457, 727545, 729288, 730756, 731916, 732892] +'PO18 0BS': [721920, 724892, 726183, 726507, 726810, 729411, 732030] +'PO18 8FP': [710202, 710262, 710301, 710493, 710523, 710549, 710581] +'PO18 8HJ': [713612, 716156, 717964, 727537, 729280, 730751, 731909] +'PO18 9LP': [712958, 713522, 714308, 717044, 718312, 719304, 722520] +'PO19 3AS': [737347, 737673, 737704, 737733, 737763, 737789, 737962] +'PO19 3FD': [709902, 709978, 710055, 712511, 712575, 712623, 712671] +'PO19 6FH': [713831, 713914, 713975, 714045, 714106, 733402, 733475] +'PO19 6SZ': [737478, 737509, 737720, 737749, 737780, 737974, 737999] +'PO19 6UT': [721742, 722019, 722912, 723938, 724368, 724754, 725889] +'PO19 6UZ': [716254, 719098, 727698, 729433, 730883, 732048, 733040] +'PO19 6XH': [719501, 719518, 719535, 719547, 719558, 719890, 719910] +'PO19 7NA': [713840, 732435, 733134, 733270, 733301, 733370, 733417] +'PO19 8AZ': [713464, 714983, 716044, 717001, 725288, 729118, 731757] +'PO19 8BP': [714995, 717885, 718781, 719277, 720659, 721796, 729135] +'PO19 8BZ': [716007, 716964, 717844, 721234, 725244, 729071, 731720] +'PO20 0BQ': [709877, 710758, 710977, 711193, 711338, 711486, 711703] +'PO20 0NP': [726184, 727889, 728155, 728816, 736715, 737038, 737085] +'PO20 2DL': [713538, 714321, 717059, 719318, 725372, 727448, 731838] +'PO20 8DS': [727555, 729301, 731926, 733691, 734954, 735741, 736361] +'PO20 8PD': [718396, 721070, 724668, 725049, 725988, 726640, 726920] +'PO22 9FA': [713005, 718879, 722565, 725397, 727474, 729220, 730692] +'PO3 6AA': [719475, 719858, 720195, 720528, 720821, 721142, 721683] +'PO6 1QR': [722009, 723197, 723703, 724143, 724539, 724931, 725880] +'RH11 8RT': [712845, 718699, 722399, 725227, 727313, 729054, 730546] +'RH13 0BG': [711819, 712110, 712232, 712329, 712428, 712513, 712577] +'SE10 9LE': [736079, 736117, 736150, 736183, 736218, 736494, 736613] +'SE14 6DY': [715081, 716120, 717081, 717936, 725401, 729224, 741295] +'SE15 2DW': [710890, 711452, 724123, 730446, 730453, 730457, 741334] +'SE15 2JE': [711573, 731614, 731621, 731623, 733494, 733498, 733500] +'SE15 6EY': [713595, 715108, 716145, 718914, 725434, 729258, 731890] +'SE15 6RA': [713127, 714440, 718993, 722700, 727589, 730796, 732945] +'SE16 3ET': [712859, 722410, 725238, 727322, 729067, 730554, 731715] +'SE16 3SL': [712102, 730248, 730410, 731078, 731225, 731456, 733707] +'SE16 4QJ': [721262, 721528, 721787, 722064, 722959, 723242, 723504] +'SE19 2RQ': [710179, 716328, 716330, 716331, 716332, 716333, 716334] +'SE20 7BW': [715475, 715481, 715920, 715933, 731607, 731615, 731622] +'SE20 7UL': [711660, 711667, 732374, 732375, 732376, 732463, 732483] +'SE27 0NT': [741379, 741400, 741431, 741454, 741475, 741495, 741510] +'SE28 0BU': [726643, 726923, 727162, 728013, 728260, 728477, 728698] +'SE3 7SD': [710010, 714827, 714854, 714858, 728959, 728967, 728970] +'SE4 1PE': [710240, 716885, 716892, 723440, 723905, 723914, 723918] +'SE4 1TE': [728306, 728405, 728409, 728410, 731536, 732563, 732565] +'SE4 2BA': [721712, 722262, 722268, 723426, 723431, 730092, 730096] +'SE4 2LT': [733719, 734984, 735765, 736384, 736873, 737275, 737626] +'SE8 3AF': [712766, 713354, 714875, 718630, 728988, 731644, 732643] +'SE8 3AQ': [720362, 723257, 724205, 725938, 726879, 727119, 728227] +'SE9 1EL': [713931, 713947, 732373, 732561, 733109, 733131, 733282] +'SE9 1LF': [716142, 720088, 720728, 721852, 725777, 726464, 728127] +'SE9 1LH': [721593, 723811, 725032, 726629, 726907, 728002, 728254] +'SE9 1LL': [714088, 714604, 715313, 715352, 715385, 732579, 733452] +'SE9 1SL': [709851, 710286, 720853, 722902, 725149, 728987, 735150] +'SO14 0BW': [714416, 717547, 719770, 720451, 721607, 722147, 723821] +'SO14 0LP': [728437, 728549, 729839, 737014, 737015, 737149, 737151] +'SO19 8SR': [741084, 741088, 741091, 741093, 741095, 741240, 741262] +'SO31 8HS': [712786, 718649, 722343, 725170, 727262, 729004, 730490] +'SW4 6QR': [714907, 718667, 725192, 729025, 730510, 731725, 732673] +'SW9 6BA': [715808, 715812, 733765, 733766, 733767, 733770, 735807] +'TN16 3NQ': [741073, 741112, 741136, 741160, 741192, 741217, 741234] +'TN25 5EH': [712776, 712995, 718637, 718872, 722333, 722558, 725159] +'BN15 9NY': [713552, 715068, 716115, 717072, 718869, 725388, 729215, 731848] +'BN18 0SZ': [713678, 715190, 719030, 725547, 727626, 729368, 730822, 731989] +'BN2 1WH': [713122, 718989, 722696, 725503, 727586, 729332, 730792, 731957] +'BN2 9WQ': [710463, 713234, 722801, 725611, 727696, 729431, 730882, 732045] +'BN3 7RJ': [711752, 711753, 711754, 711755, 711756, 711757, 711758, 711759] +'BN3 8BU': [713811, 713855, 713894, 713932, 713960, 713993, 714026, 714060] +'BN41 2XY': [740249, 740503, 740670, 740788, 740842, 740882, 740920, 740948] +'BN43 6EU': [713137, 713664, 719001, 722709, 725518, 727599, 729345, 731972] +'BN5 9SX': [713238, 719099, 722804, 725614, 727699, 729434, 730884, 732049] +'BN6 9GG': [709805, 709955, 710101, 710201, 710754, 711191, 711482, 711701] +'BN6 9XZ': [711123, 711546, 711554, 711561, 711570, 711648, 711656, 711662] +'BR1 3AD': [711746, 711984, 733335, 733337, 733338, 733409, 733412, 733413] +'BR1 3BF': [722947, 723235, 723495, 723737, 724183, 724395, 724583, 724780] +'BR1 4AA': [711180, 713471, 718774, 722468, 725295, 729126, 731764, 732758] +'BR5 4GX': [713282, 719132, 722850, 725651, 727742, 729473, 730914, 732088] +'CR0 2FF': [738785, 738946, 738995, 739009, 739038, 739061, 739083, 739094] +'CR2 6LA': [710086, 715466, 715478, 715483, 715486, 715487, 715488, 741300] +'CR2 7AL': [730456, 730458, 733809, 735081, 735840, 736446, 736921, 737330] +'CR5 3NU': [710062, 713754, 716274, 717231, 718070, 719472, 720191, 720816] +'CT5 1TG': [709850, 710011, 710131, 710241, 710335, 710479, 711312, 711575] +'CT5 1TJ': [709847, 710474, 710802, 711027, 711238, 711376, 711524, 711639] +'DA1 1UN': [709809, 710435, 710759, 710978, 711339, 711487, 711600, 727468] +'DA1 2BF': [741070, 741109, 741133, 741157, 741189, 741214, 741231, 741247] +'DA14 5BZ': [741390, 741439, 741444, 741465, 741486, 741503, 741514, 741522] +'DA14 6NS': [729272, 733685, 734947, 735735, 736354, 736845, 737602, 737887] +'DA2 6LS': [714298, 715592, 718302, 720369, 720977, 722506, 727415, 732795] +'DA2 6PL': [719317, 719708, 720060, 720387, 720695, 720998, 721303, 721557] +'DA6 8BL': [711156, 711314, 711456, 712775, 718636, 722332, 725158, 731649] +'DA6 8BQ': [741391, 741421, 741445, 741466, 741487, 741504, 741515, 741523] +'DA8 2PW': [710231, 716833, 716866, 717251, 717265, 717279, 717291, 717304] +'DA9 9FJ': [720068, 720704, 721311, 721833, 723006, 723552, 724011, 724439] +'E1 2NR': [713232, 719095, 722799, 725609, 727694, 729429, 730880, 732043] +'E1 5ED': [713253, 714530, 715743, 716758, 722817, 727712, 730898, 733054] +'E1 5EL': [721410, 721935, 723099, 723646, 724094, 724900, 725830, 726516] +'E2 6PU': [715302, 715345, 715375, 715410, 715433, 715780, 715805, 715846] +'E2 7AZ': [713472, 714988, 715459, 716541, 725296, 730605, 731767, 732759] +'GU27 3SR': [733636, 734894, 735681, 736300, 736795, 737194, 737559, 737842] +'GU28 0HT': [733640, 733843, 734125, 734896, 736798, 737562, 737845, 738094] +'GU28 0HU': [713647, 714433, 715673, 717559, 717994, 730790, 731956, 734967] +'GU28 0NR': [715031, 717038, 718829, 719692, 731814, 732805, 734787, 735114] +'GU29 0AA': [712850, 713415, 718706, 722404, 727317, 729060, 730550, 731710] +'GU29 0DW': [712794, 714178, 714893, 729008, 731661, 732659, 736291, 736785] +'GU29 0JX': [713542, 715057, 722544, 727453, 729205, 730673, 731840, 732825] +'GU29 9EJ': [720301, 720612, 721220, 724565, 724763, 725901, 726064, 726238] +'GU33 7QW': [713023, 713575, 715632, 718890, 725413, 729237, 731868, 732857] +'GU6 7FW': [709988, 710119, 710223, 710595, 710634, 710669, 711525, 711730] +'HA0 2NW': [738379, 738390, 738396, 738415, 738662, 738700, 738718, 738743] +'ME10 4FL': [711804, 712096, 712218, 712316, 712414, 712497, 712563, 712612] +'ME10 4GY': [713317, 714572, 715771, 716787, 722878, 727768, 730936, 733094] +'ME1 1FH': [712317, 733698, 734962, 735747, 736854, 737256, 737613, 737900] +'ME12 1HS': [712807, 718663, 722361, 725189, 727277, 729023, 730505, 731675] +'ME15 7JJ': [728325, 728547, 728761, 729527, 729731, 729936, 730119, 730284] +'ME15 7JP': [711298, 711396, 728213, 728435, 728863, 729837, 730019, 730210] +'ME16 9FJ': [709878, 709958, 710029, 711194, 711340, 711488, 711601, 711705] +'ME17 1GT': [709849, 709911, 710064, 710368, 710477, 711046, 711078, 711642] +'ME3 0BJ': [712976, 718855, 722538, 724723, 724731, 725002, 725111, 725369] +'MK10 9SZ': [733634, 734893, 734973, 735680, 736298, 736793, 737193, 737264] +'N7 9JJ': [713895, 714027, 732501, 733158, 733240, 733313, 733384, 733456] +'NN9 6JR': [723606, 723685, 723832, 723907, 724059, 724122, 724272, 724342] +'NW10 8GG': [713417, 714935, 716002, 716957, 718711, 725234, 729062, 731712] +'NW10 8HG': [722974, 723519, 723683, 723977, 726421, 726737, 727000, 727822] +'NW10 8HJ': [713679, 715191, 716218, 717174, 719031, 719417, 729369, 731990] +'NW10 8QB': [713176, 713686, 719042, 722753, 725556, 727637, 729379, 731999] +'PE1 2BG': [710048, 710085, 710166, 710287, 716415, 716422, 717175, 717320] +'PE29 3YW': [733575, 733816, 735625, 736246, 736749, 737525, 737807, 738058] +'PE4 7DU': [715263, 715754, 723110, 723391, 724100, 724710, 725836, 741342] +'PE7 3YB': [713394, 714915, 716472, 721494, 722032, 722378, 724559, 725203] +'PE7 8GZ': [732418, 732518, 732597, 733172, 733254, 733328, 733399, 733472] +'PO10 8NX': [720423, 721034, 722131, 723309, 724253, 726309, 728592, 729959] +'PO10 8TB': [718430, 719812, 720489, 721103, 721651, 722187, 723349, 723857] +'PO15 5TF': [710650, 720188, 720814, 721941, 723104, 724312, 724701, 725085] +'PO15 5TQ': [710660, 711503, 713147, 722172, 722720, 723331, 727612, 732962] +'PO15 6NG': [710642, 719781, 721617, 724051, 724859, 725047, 725801, 726319] +'PO16 7DG': [733740, 735007, 735786, 736407, 736889, 737296, 737641, 737931] +'PO18 0BU': [717607, 720500, 721115, 722197, 722783, 723864, 727176, 730864] +'PO18 0GW': [712903, 718760, 722454, 725278, 736805, 737205, 737569, 737852] +'PO18 0SQ': [726768, 736007, 736053, 736085, 736124, 738966, 739001, 739004] +'PO18 0SW': [718803, 722494, 725324, 727403, 729155, 730630, 731798, 732784] +'PO18 8BH': [713778, 729926, 730109, 732334, 732440, 733274, 733343, 733420] +'PO18 9EP': [713098, 713632, 716668, 718960, 727566, 729314, 731933, 732916] +'PO19 3LL': [721061, 722152, 724265, 726638, 726917, 729666, 731222, 731577] +'PO19 3LP': [717199, 719077, 725590, 727682, 733912, 734062, 737921, 738162] +'PO19 3NG': [724400, 728097, 734715, 735108, 735232, 736181, 736460, 736587] +'PO19 3NS': [713078, 714398, 715656, 716650, 722651, 727546, 730758, 732897] +'PO19 3RN': [712781, 713365, 714171, 714885, 725163, 730486, 731653, 732654] +'PO19 6SB': [715717, 722773, 723355, 723862, 724689, 725074, 727665, 733012] +'PO19 6TA': [733687, 734950, 735737, 736357, 736847, 737246, 737605, 737890] +'PO19 6TU': [733742, 733924, 735009, 736409, 736892, 737299, 737644, 737934] +'PO19 7ES': [714427, 716679, 717147, 718981, 722689, 730785, 731951, 732931] +'PO19 8BL': [715041, 718840, 719309, 721300, 721821, 725357, 729187, 731825] +'PO20 7EY': [713483, 718788, 722477, 725307, 729143, 730618, 731781, 732772] +'PO20 9BP': [713242, 719104, 722808, 736401, 736882, 737290, 737637, 737925] +'PO21 3JX': [741395, 741426, 741449, 741471, 741490, 741507, 741518, 741525] +'PO21 5BP': [718237, 730525, 734001, 734465, 734642, 735677, 736790, 738089] +'PO3 5XF': [713303, 713768, 715276, 716286, 719150, 725669, 729486, 732101] +'PO5 1LP': [714688, 714700, 714738, 714783, 715292, 715340, 715369, 715405] +'RH12 5YE': [711076, 723094, 723640, 723871, 724090, 724698, 725828, 726018] +'RH12 5YN': [709972, 715705, 716225, 716715, 718025, 718423, 727641, 729383] +'RH14 0LZ': [723876, 734517, 735927, 735980, 736202, 736480, 736509, 736543] +'RH14 0TJ': [733628, 733996, 734345, 734887, 735672, 736292, 737836, 738084] +'RH15 0GH': [710913, 724091, 724897, 726815, 727069, 727894, 728158, 728389] +'RH16 1EB': [738313, 738319, 738324, 738327, 738331, 738332, 738333, 738334] +'RH20 1PP': [713512, 714301, 715027, 715595, 716079, 722512, 725343, 730645] +'RH20 3GW': [710371, 710514, 710570, 710621, 710653, 710695, 710831, 710866] +'SE10 9AL': [712867, 713423, 714943, 718724, 719995, 721236, 722417, 729073] +'SE10 9ES': [711737, 727082, 727088, 728402, 728404, 731406, 731409, 733133] +'SE13 5QZ': [717755, 717762, 717766, 724340, 724348, 724352, 731604, 731611] +'SE13 7SY': [716889, 717734, 717756, 731600, 731612, 732622, 733006, 733482] +'SE15 2DR': [716534, 717431, 739736, 739795, 739826, 739854, 739880, 739890] +'SE15 2JQ': [721981, 721991, 723175, 723180, 723185, 723188, 723695, 741332] +'SE15 2TX': [733807, 735078, 735839, 736445, 736920, 737328, 737664, 737954] +'SE15 3XB': [740102, 740107, 740110, 740112, 740114, 740115, 740142, 740143] +'SE15 5QH': [714446, 715683, 716690, 717570, 718400, 719789, 720465, 732955] +'SE16 4AE': [727052, 727166, 727878, 728017, 728145, 728265, 728380, 728481] +'SE16 4AG': [713791, 713824, 713867, 713909, 713940, 713970, 714001, 714038] +'SE17 2QW': [741064, 741105, 741128, 741153, 741185, 741211, 741228, 741245] +'SE18 2PN': [709913, 713853, 713930, 714739, 714785, 732454, 733347, 733426] +'SE18 5AG': [727629, 732978, 733667, 734928, 735715, 736335, 736825, 737224] +'SE18 6EH': [712778, 716910, 717353, 717787, 718205, 718639, 722335, 725161] +'SE18 6FG': [712838, 718692, 722393, 725219, 727305, 729045, 730537, 731697] +'SE23 1SE': [710443, 713074, 722647, 725456, 727544, 729287, 730755, 731915] +'SE25 5AD': [733668, 734929, 735716, 736336, 736826, 737225, 737589, 737871] +'SE25 6ND': [711784, 734885, 735669, 736288, 736781, 737185, 737550, 737832] +'SE26 4AT': [713099, 718961, 722669, 725480, 727567, 729315, 730773, 731934] +'SE26 4NY': [714821, 714837, 720856, 721442, 721453, 722373, 733481, 733491] +'SE26 5RZ': [714271, 715574, 716547, 717441, 720355, 720965, 730614, 732768] +'SE26 6UN': [733617, 734876, 735660, 736280, 737179, 737544, 737827, 738076] +'SE27 0DT': [741002, 741005, 741007, 741009, 741010, 741011, 741013, 741014] +'SE28 0BX': [728910, 729671, 729875, 730062, 730408, 731077, 732409, 732514] +'SE3 8AH': [709807, 718856, 722539, 725370, 727447, 729200, 730671, 731837] +'SE4 1JD': [741292, 741305, 741307, 741317, 741318, 741325, 741331, 741349] +'SE4 1XX': [715378, 715379, 715783, 715784, 715810, 715815, 716351, 716352] +'SE4 2EY': [718442, 721662, 722198, 723361, 724296, 724692, 725077, 726010] +'SE7 7EG': [741077, 741117, 741143, 741167, 741198, 741223, 741241, 741254] +'SE8 4QH': [711280, 711568, 723803, 725027, 728128, 728793, 731144, 731534] +'SE8 5NA': [713266, 719124, 722832, 725639, 727723, 729461, 730906, 732076] +'SE8 5PS': [712771, 713358, 718633, 722329, 725154, 727254, 730480, 732648] +'SE8 5QZ': [741000, 741016, 741026, 741031, 741035, 741041, 741043, 741052] +'SE9 1EW': [718820, 720043, 720677, 721811, 722984, 724807, 726107, 729172] +'SE9 1LA': [711149, 728016, 728264, 728701, 729674, 730249, 730411, 731281] +'SE9 1LN': [726986, 727808, 728542, 728757, 730283, 731122, 732125, 732240] +'SE9 1LR': [713143, 715686, 721080, 721627, 722169, 727609, 730810, 732959] +'SE9 6NJ': [713684, 715701, 718020, 719040, 721375, 722751, 725554, 729376] +'SE9 6NL': [724709, 726356, 726673, 731010, 731164, 731293, 731402, 732370] +'SE9 6UF': [724516, 724519, 724721, 724912, 724914, 725106, 725108, 725864] +'SO14 3GA': [713168, 719032, 722743, 725548, 727628, 729370, 730824, 731991] +'SO14 6SG': [710935, 721529, 722065, 723244, 723746, 724193, 724589, 725927] +'SO14 6SJ': [720857, 720866, 720873, 720878, 720880, 720882, 720884, 720885] +'SO15 2SN': [713039, 718907, 722607, 725430, 727508, 729251, 730727, 731884] +'SO15 3NA': [741388, 741418, 741442, 741464, 741485, 741502, 741513, 741521] +'SO16 9EY': [720328, 720562, 720570, 720577, 720636, 720858, 720867, 720874] +'SO17 2HA': [735611, 735612, 735936, 735937, 736102, 736103, 738248, 738249] +'SO23 7PX': [712677, 738199, 738205, 738215, 738221, 738225, 738232, 738239] +'SO31 7JT': [730808, 731974, 733708, 734972, 735756, 736376, 736863, 737263] +'SO31 8HT': [713300, 714561, 715767, 716780, 722865, 727759, 730927, 733085] +'SO31 8HZ': [713298, 715765, 716284, 716782, 717243, 719148, 722810, 725666] +'SO31 8LD': [709898, 711007, 711365, 715207, 718429, 719054, 719811, 732011] +'SW16 5PX': [739574, 739593, 739622, 739639, 740152, 740173, 740208, 740238] +'SW4 6QQ': [712892, 713445, 714247, 714966, 718751, 725268, 730581, 732734] +'SW4 6RL': [738796, 738917, 738957, 738999, 739021, 739050, 739073, 739091] +'SW4 6RR': [713121, 714435, 715674, 716683, 725502, 729330, 730791, 732938] +'SW9 9EX': [713608, 714386, 722636, 725447, 729276, 730749, 731904, 732884] +'SW9 9HE': [713003, 713560, 714338, 715077, 722564, 725396, 730691, 731854] +'TN23 3GQ': [710149, 717073, 733871, 734150, 734934, 736340, 737232, 737875] +'BN13 3FX': [710700, 710834, 710869, 711771, 712066, 712190, 712289, 712383, 712467] +'BN1 4ZL': [733627, 734886, 735671, 736290, 736784, 737186, 737553, 737835, 738083] +'BN16 1TJ': [712924, 718785, 722474, 725304, 727389, 729140, 730616, 731778, 732770] +'BN17 5BZ': [711042, 724870, 725057, 725995, 726168, 726327, 726490, 726651, 726797] +'BN18 0GH': [712890, 717248, 718084, 718747, 719484, 720208, 722441, 727352, 730580] +'BN2 3BN': [733739, 735006, 735785, 736017, 736095, 736164, 736204, 736231, 736406] +'BN3 2TE': [712541, 733602, 733826, 734861, 735648, 736267, 736768, 737821, 738072] +'BN5 9QE': [713017, 718887, 722579, 725407, 727488, 729232, 730704, 731862, 732851] +'CR0 1XW': [711780, 712074, 712198, 712296, 712390, 712475, 712544, 712594, 712640] +'CR2 6DT': [725122, 725129, 725131, 733712, 734978, 735760, 736380, 736867, 737269] +'CR3 5EG': [741074, 741114, 741138, 741162, 741194, 741219, 741236, 741251, 741263] +'CR5 3FZ': [709830, 709971, 710110, 710215, 710313, 710781, 711221, 711508, 711716] +'DA11 8FL': [721138, 721679, 722220, 723385, 723882, 724313, 724704, 725087, 726022] +'DA12 2JG': [711291, 728668, 728770, 728871, 729536, 736977, 736997, 737024, 737046] +'DA14 6NQ': [711873, 733633, 733839, 734122, 735679, 736791, 737192, 737557, 738090] +'DA2 6GY': [710587, 710645, 710686, 720776, 721094, 721640, 722178, 723070, 723339] +'DA8 1AS': [733910, 734190, 734287, 734396, 734510, 737632, 737918, 738160, 741412] +'DA9 9FL': [711408, 711555, 728890, 729651, 730042, 730232, 730388, 731062, 731212] +'E1 0DT': [717583, 718016, 718413, 719028, 720478, 721091, 721638, 723069, 732975] +'E1 1LT': [714080, 714597, 714659, 714706, 714756, 714795, 715310, 715349, 715412] +'E1 1PS': [713389, 718672, 722369, 725197, 727286, 729030, 730514, 731681, 732677] +'E1 5JD': [714306, 715036, 715599, 717468, 719697, 720049, 722518, 727429, 731818] +'E2 6QU': [713093, 715140, 716175, 716663, 717544, 717978, 718382, 718954, 729305] +'E2 7AL': [712951, 713509, 715594, 718821, 727419, 729173, 730643, 731810, 732799] +'GU27 3HT': [723593, 724663, 724853, 725793, 726156, 726317, 726478, 726785, 726916] +'GU28 0EA': [712897, 734906, 735691, 736312, 736803, 737202, 737567, 737850, 738100] +'GU28 0EJ': [740246, 740500, 740667, 740785, 740839, 740879, 740917, 740945, 740975] +'GU28 0LA': [715755, 716771, 717236, 729474, 730915, 733925, 734071, 734201, 738174] +'GU28 0QZ': [719289, 733657, 734918, 735703, 736325, 736816, 737215, 737579, 737861] +'GU28 0SA': [713638, 715153, 716186, 717143, 718973, 725489, 729322, 731946, 732927] +'GU29 9SE': [733700, 733891, 734047, 734172, 734964, 735748, 736855, 737614, 738141] +'GU29 9TJ': [733729, 733915, 734994, 735775, 736396, 736879, 737287, 737923, 738164] +'GU30 7NW': [713719, 714511, 719087, 725603, 727688, 729421, 730877, 732041, 733031] +'GU31 5LB': [715169, 716197, 717156, 717564, 720131, 722702, 727591, 731963, 732947] +'ME10 4EL': [726975, 727797, 728079, 728310, 728528, 728743, 729515, 729717, 729927] +'ME10 4GA': [710654, 710697, 711794, 712087, 713395, 718679, 725204, 729034, 731685] +'ME10 4GD': [709848, 710476, 710804, 711029, 711241, 711378, 711527, 711640, 711731] +'ME13 7UW': [712768, 718631, 722326, 725151, 727252, 728989, 730477, 731646, 732645] +'ME13 8JX': [710936, 711069, 724599, 724797, 725742, 725934, 726422, 726589, 726738] +'ME14 2EP': [712836, 718690, 722391, 725217, 727304, 729044, 730536, 731696, 732694] +'ME15 6NX': [709869, 710021, 710144, 710255, 710345, 710491, 711332, 711593, 725332] +'ME15 7LZ': [713018, 714347, 715629, 716611, 717500, 722580, 727489, 730705, 732852] +'ME15 7QR': [713151, 719019, 722725, 725534, 727617, 729359, 730817, 731984, 732969] +'ME15 7RW': [709812, 711199, 718900, 722599, 725423, 729246, 730721, 731878, 732865] +'ME15 7SZ': [709888, 711613, 715159, 716189, 717148, 717990, 718982, 725497, 729326] +'ME15 7TP': [711224, 713185, 719050, 722761, 725564, 729391, 730842, 732007, 732993] +'ME15 7TX': [711165, 712843, 718696, 722397, 725223, 729050, 730542, 731701, 732699] +'ME16 8JB': [710407, 710715, 711785, 712079, 712202, 712301, 712394, 712481, 712549] +'ME20 7GW': [711798, 712090, 712212, 712310, 712408, 712491, 712557, 712607, 712657] +'ME20 7HW': [711765, 712185, 712285, 712537, 734839, 736751, 737312, 737809, 738059] +'ME2 2GT': [710785, 713188, 719051, 725566, 727648, 729392, 730844, 732009, 732995] +'ME9 8WP': [717411, 718266, 719655, 721776, 722950, 723496, 723962, 724781, 725730] +'MK10 9RZ': [738335, 738336, 738337, 738338, 738339, 738340, 738341, 738342, 738343] +'MK10 9SA': [733724, 734989, 735769, 736390, 736876, 737281, 737630, 737917, 738158] +'N1 7DF': [732264, 732365, 732468, 732551, 733125, 733220, 733294, 733361, 733437] +'NN3 2BP': [711764, 712060, 712284, 712380, 712463, 712588, 712634, 735619, 737521] +'NW10 8BJ': [718836, 722522, 725353, 729184, 731822, 739113, 739119, 739123, 739125] +'NW10 8ET': [715429, 715778, 715801, 715842, 715895, 716301, 716323, 716347, 716401] +'NW10 8PN': [718574, 718589, 718595, 718601, 718605, 722272, 722286, 722296, 722301] +'PE2 8HA': [728814, 729582, 729787, 729972, 730162, 730326, 731003, 731156, 731285] +'PO10 8PD': [712874, 716014, 720940, 721513, 723232, 724181, 724580, 727333, 730562] +'PO1 1BS': [713100, 718962, 722670, 725481, 727568, 729316, 730774, 731935, 732917] +'PO15 5DP': [713615, 714395, 715125, 716161, 716648, 717118, 725459, 731917, 732893] +'PO15 7FS': [713807, 713892, 713956, 714024, 729840, 730021, 730212, 730372, 733454] +'PO18 8QX': [718477, 730910, 734293, 734521, 734613, 735377, 735426, 735476, 735517] +'PO18 8TL': [712865, 714225, 715541, 718255, 720317, 722415, 727329, 730558, 732713] +'PO19 1QN': [733919, 734516, 734609, 735001, 735782, 736403, 736886, 737928, 738168] +'PO19 3AE': [713186, 717594, 718426, 719808, 722762, 723347, 723854, 727646, 732994] +'PO19 3ND': [734072, 734407, 734523, 735789, 736893, 737300, 737646, 737935, 738177] +'PO19 3PT': [712831, 718686, 722388, 725214, 727303, 729042, 730531, 731693, 732691] +'PO19 6SP': [733647, 734778, 735172, 735401, 735580, 735693, 735907, 735997, 736077] +'PO19 8AG': [713569, 714348, 715088, 715630, 716612, 717088, 722581, 727490, 730706] +'PO19 8DB': [717025, 717452, 717896, 718298, 719288, 719683, 720037, 720365, 720671] +'PO20 2EP': [709837, 710465, 710793, 711017, 711231, 711369, 711517, 711630, 711724] +'PO20 2ER': [712941, 718805, 722496, 725325, 727405, 729158, 730632, 731801, 732786] +'PO20 8QJ': [713052, 713599, 714373, 716628, 720733, 721586, 722129, 723030, 725437] +'RH11 0SL': [709979, 715235, 715739, 716255, 717622, 718057, 718457, 719456, 721406] +'RH12 5YQ': [731159, 731587, 732317, 732472, 732519, 732554, 733126, 733175, 733222] +'RH1 2AT': [711003, 713170, 719034, 722745, 727630, 729372, 730826, 731993, 732979] +'RH14 9SB': [711694, 712872, 713430, 722421, 725252, 727332, 729080, 730560, 731727] +'RH14 9XL': [709910, 709987, 710063, 710118, 710618, 710652, 710667, 710712, 710824] +'RH6 8LR': [712839, 714926, 716485, 717391, 717830, 727307, 729046, 730539, 732697] +'SE10 8TZ': [741075, 741115, 741139, 741164, 741195, 741220, 741237, 741252, 741261] +'SE10 9AG': [712854, 716493, 717838, 718251, 720310, 723222, 724171, 724571, 730551] +'SE12 0HH': [731166, 731170, 731174, 731298, 731300, 731302, 731405, 731410, 731413] +'SE1 3QP': [711833, 712076, 712477, 712546, 712596, 735664, 736284, 736777, 738079] +'SE14 5EH': [723584, 733788, 735051, 735817, 736433, 736911, 737320, 737658, 737949] +'SE14 5FR': [709867, 709949, 710020, 710740, 710966, 711178, 711328, 711475, 711589] +'SE14 5JR': [719889, 719896, 719909, 733586, 734848, 735634, 736254, 736756, 737163] +'SE14 5QY': [718249, 726718, 728533, 733786, 735049, 735815, 736432, 736910, 737319] +'SE15 2NY': [715924, 715930, 724735, 724737, 725118, 733488, 733495, 733499, 741345] +'SE15 3JN': [719917, 719930, 719936, 720566, 720573, 723908, 723915, 723919, 723921] +'SE16 4BA': [733646, 734907, 735692, 736313, 736804, 737203, 737568, 737851, 738101] +'SE16 4QW': [741071, 741110, 741134, 741158, 741190, 741215, 741232, 741248, 741258] +'SE18 6SQ': [713306, 719152, 722869, 725671, 727761, 729488, 730929, 732103, 733088] +'SE19 3SX': [710716, 714826, 714843, 722298, 727210, 727232, 734824, 735025, 735803] +'SE20 7LH': [717745, 720251, 720257, 720565, 720572, 721358, 721616, 723434, 728058] +'SE20 8TL': [713055, 718920, 722622, 725439, 727523, 729263, 730737, 731893, 732875] +'SE22 8PN': [710084, 715474, 716638, 721715, 721722, 722292, 723810, 725113, 725115] +'SE25 6PN': [733595, 734856, 735642, 736261, 736762, 737168, 737534, 737815, 738065] +'SE26 5EL': [711390, 728838, 728842, 730179, 731018, 731020, 731169, 731173, 731176] +'SE4 1PD': [721449, 721458, 721984, 721997, 721998, 726210, 726214, 730444, 730451] +'SE4 1TD': [711107, 711301, 726686, 726695, 727085, 727089, 728726, 732222, 732226] +'SE5 0RW': [710713, 723119, 723127, 723141, 723158, 723169, 723406, 723411, 723414] +'SE8 4BP': [713505, 715021, 718813, 725335, 729167, 729945, 730129, 730296, 731807] +'SE8 5BU': [709838, 711232, 719103, 722807, 725616, 729438, 730886, 732053, 733043] +'SE9 1JS': [714173, 715956, 717358, 717793, 718209, 720903, 721474, 725169, 730489] +'SE9 1JT': [723201, 724545, 724936, 725885, 726224, 727941, 729815, 729994, 731029] +'SO14 0AW': [715024, 729171, 741175, 741176, 741200, 741201, 741202, 741203, 741204] +'SO14 0EY': [730656, 733577, 734838, 735627, 736248, 736750, 737311, 737526, 737808] +'SO14 1LQ': [741072, 741111, 741135, 741159, 741191, 741216, 741233, 741249, 741259] +'SO14 5BD': [710582, 716606, 717080, 717495, 717935, 718341, 719337, 719724, 720074] +'SO17 2NA': [719391, 720119, 720754, 721351, 721876, 723044, 723590, 724040, 724463] +'SO31 6HA': [713294, 719142, 722861, 725663, 727756, 729483, 730924, 732098, 733082] +'SO32 2NG': [709889, 709967, 710448, 710772, 710994, 711212, 711353, 711615, 711712] +'SW4 7RA': [715903, 715912, 716306, 716313, 716355, 716377, 716404, 716799, 716821] +'SW9 9EY': [712987, 713546, 714330, 715064, 718866, 725383, 727461, 729210, 730676] +'SW9 9HH': [713083, 713620, 714404, 715134, 718945, 722655, 727550, 729298, 732904] +'TN23 3FD': [711612, 713640, 715155, 716187, 717145, 717988, 718977, 725493, 729324] +'TN24 8NE': [713337, 719180, 722895, 725694, 727784, 729502, 730945, 732108, 733096] +'TN4 9DF': [723993, 724120, 724128, 724130, 724131, 724133, 724135, 724136, 724137] +'BN13 3FP': [709836, 709977, 710218, 710317, 710387, 710591, 710791, 711229, 711516, 711723] +'BN17 7EE': [713031, 713580, 718898, 722597, 725421, 727501, 729245, 730719, 731876, 732863] +'BN1 9GS': [712225, 733715, 733902, 734981, 736382, 736870, 737273, 737623, 737911, 738152] +'BN2 4ET': [710662, 710687, 721377, 722180, 723073, 723342, 723618, 723849, 724071, 724283] +'BN41 1LU': [710460, 710788, 711011, 713217, 713711, 727681, 729413, 730867, 732032, 733021] +'BR3 1BH': [713528, 714314, 715043, 715602, 716092, 727439, 729189, 730661, 731827, 732814] +'BR7 6AH': [739515, 739536, 739753, 739914, 740007, 740075, 740119, 740149, 740176, 740204] +'CR0 2DR': [738815, 738841, 738858, 738865, 738872, 738930, 738933, 738935, 738939, 738959] +'CT18 7TZ': [710962, 712884, 713441, 718744, 722436, 727346, 729097, 730575, 731737, 732730] +'DA1 5HJ': [709919, 709924, 709926, 709931, 709938, 709991, 709994, 709997, 711749, 711750] +'DA2 7WN': [713800, 713882, 713950, 714016, 714082, 714598, 732571, 733140, 733228, 733306] +'DA8 3SP': [712505, 712568, 733900, 737909, 738150, 741396, 741427, 741450, 741472, 741491] +'E1 0DZ': [712878, 713436, 717408, 718262, 719243, 719650, 720001, 727338, 730567, 731732] +'E1 2BF': [713173, 713683, 719037, 722748, 725552, 727633, 729374, 730830, 731996, 732983] +'E2 0BJ': [713000, 713556, 714335, 715073, 717076, 717932, 718875, 725393, 730687, 732839] +'E2 6LZ': [712998, 716599, 717075, 719719, 720071, 720396, 723008, 729217, 730684, 731851] +'GU21 6DE': [721940, 722218, 723103, 723382, 723649, 723880, 724095, 724310, 724501, 724700] +'GU28 9BL': [713105, 715149, 717137, 718385, 718967, 720121, 720453, 722677, 730777, 732922] +'GU29 9BQ': [716519, 716981, 718268, 719251, 719657, 721250, 722435, 723499, 723965, 724187] +'GU29 9BU': [715250, 716268, 716762, 719468, 719850, 720522, 720811, 721937, 722215, 723101] +'GU31 5JB': [712940, 714288, 715012, 718804, 722495, 727404, 729156, 730631, 731799, 732785] +'GU31 5JP': [717114, 718371, 719373, 719757, 720104, 720436, 721044, 721595, 721865, 722137] +'GU32 1AP': [713225, 713718, 719085, 727687, 732039, 733030, 735774, 736395, 737286, 737635] +'ME10 3FS': [709857, 709942, 710014, 710337, 710372, 710481, 710515, 710542, 710573, 711688] +'ME1 3XQ': [709818, 709963, 710105, 710208, 710306, 710381, 710766, 711206, 711497, 711709] +'ME20 7GE': [710830, 720262, 720581, 720891, 721190, 721462, 722000, 722897, 723444, 723699] +'ME3 7HS': [711495, 713086, 714405, 716657, 716886, 718582, 722657, 725125, 727552, 732905] +'ME5 0SR': [710424, 710970, 712938, 713496, 722491, 727401, 729152, 730628, 731796, 732782] +'ME7 4AW': [713591, 727513, 733683, 734944, 735733, 736351, 737243, 737600, 737884, 738130] +'N1 7AY': [728301, 728518, 728734, 729506, 729709, 729915, 730101, 730273, 730951, 731105] +'N1 7GB': [713285, 713761, 714551, 719135, 725653, 727745, 729476, 730916, 732091, 733074] +'NN3 2BE': [739520, 739542, 739759, 739920, 740013, 740081, 740124, 740155, 740182, 740211] +'NN3 6RL': [709930, 714094, 728682, 728887, 729648, 729853, 730040, 730229, 730387, 731060] +'NW10 8PJ': [722988, 723531, 723772, 723996, 724218, 724423, 724615, 724809, 724990, 725753] +'NW10 8PT': [716160, 717117, 717969, 718937, 719376, 720744, 721344, 723037, 725458, 729289] +'NW10 8RN': [714243, 715555, 716520, 717415, 718269, 720329, 722438, 727347, 730576, 732731] +'PE1 5LX': [710005, 739570, 739619, 739638, 739913, 740074, 740116, 740148, 740172, 740203] +'PE2 9FE': [726997, 727818, 728103, 728330, 737071, 737114, 737339, 737381, 737424, 737459] +'PE3 9YB': [711537, 711551, 728548, 730371, 730963, 731125, 731436, 731490, 731557, 732244] +'PO10 8BG': [709772, 709773, 709774, 710281, 710475, 711450, 711451, 711453, 711454, 724910] +'PO10 8FN': [709795, 710422, 711842, 712208, 712306, 712403, 712487, 712553, 712603, 712651] +'PO10 8HH': [719684, 720974, 721541, 722082, 723259, 723762, 724984, 725940, 726594, 730634] +'PO18 0EQ': [713571, 717090, 717502, 733677, 734035, 734154, 734372, 734491, 735728, 736346] +'PO18 0JH': [714257, 716531, 716998, 717428, 717869, 725281, 727370, 729114, 730592, 732748] +'PO18 8QT': [712847, 713411, 714932, 715999, 717835, 718701, 722402, 734644, 735287, 735397] +'PO19 1AU': [710402, 712769, 713356, 722327, 725152, 727253, 728990, 730478, 731647, 732646] +'PO19 3LG': [712999, 715072, 719333, 719720, 720073, 720398, 721007, 722562, 725391, 730685] +'PO19 3LJ': [713382, 715515, 715967, 716927, 717370, 717806, 719205, 720284, 722021, 722913] +'PO19 6XS': [715237, 716751, 719840, 720179, 720513, 732052, 733731, 734996, 735777, 736399] +'PO19 7LP': [733899, 734053, 734181, 734282, 734390, 734503, 734597, 736868, 737271, 738149] +'PO19 8AY': [725964, 726296, 727140, 727991, 729653, 729855, 730043, 730390, 731064, 732198] +'PO19 8BG': [714406, 715460, 716170, 716659, 717125, 717974, 718948, 722658, 727554, 730765] +'PO19 8GX': [733845, 734007, 734127, 734898, 735686, 736305, 736801, 737564, 737846, 738095] +'PO20 2AP': [713288, 717647, 718482, 719865, 720533, 721145, 721686, 722229, 722854, 723394] +'PO20 2EJ': [710554, 710610, 710639, 710682, 710813, 710853, 710930, 711039, 711072, 711118] +'PO20 2EU': [711817, 711857, 712108, 712231, 712328, 712427, 712512, 712576, 712624, 712672] +'PO20 8PY': [714289, 715585, 716558, 720364, 723760, 724207, 724983, 726271, 729157, 731800] +'PO5 2AU': [712848, 713412, 718702, 722403, 725229, 727315, 729056, 730548, 731707, 732703] +'PO6 4RU': [713695, 715204, 716228, 717187, 719431, 720156, 721387, 727650, 730845, 732997] +'RH10 1AQ': [737057, 737084, 737102, 737126, 737143, 737349, 737369, 737392, 737411, 737434] +'RH11 7HS': [711494, 713080, 713618, 718943, 722653, 725466, 727547, 729295, 731921, 732900] +'RH14 0QB': [713625, 717129, 734165, 734277, 734378, 734797, 735249, 735361, 735418, 735877] +'RH16 4GF': [714222, 716495, 717399, 718253, 719641, 720312, 722411, 727323, 730555, 732708] +'RH20 1JQ': [713479, 714272, 714996, 716057, 716548, 718784, 729137, 730615, 731775, 732769] +'RH6 7DB': [711385, 711539, 728683, 728889, 729650, 729753, 730136, 730231, 731139, 731569] +'SE10 0LG': [733601, 733825, 734860, 735647, 736266, 736767, 737172, 737661, 737820, 738071] +'SE10 9AN': [713823, 713908, 713969, 731076, 731224, 731339, 732206, 732311, 732592, 733251] +'SE10 9PP': [713822, 713906, 713967, 714101, 732407, 732590, 733166, 733249, 733393, 733467] +'SE14 5AF': [733814, 734099, 734832, 735620, 736241, 736745, 737157, 737522, 737805, 738056] +'SE14 5FS': [712688, 712694, 712700, 712704, 712709, 712714, 712721, 712725, 712729, 712733] +'SE14 5JE': [715623, 716604, 717493, 720401, 721010, 722568, 727478, 730695, 732845, 741298] +'SE14 6QE': [715934, 717313, 717324, 720850, 726208, 726213, 728175, 728176, 728177, 728178] +'SE1 4SG': [741067, 741082, 741107, 741130, 741155, 741187, 741213, 741229, 741246, 741256] +'SE15 2AD': [713507, 714297, 715023, 715591, 716075, 716564, 717032, 717457, 717902, 718301] +'SE15 2PX': [712064, 712188, 712466, 712635, 733583, 733819, 736251, 736754, 737530, 737812] +'SE16 3EX': [715437, 715772, 715785, 715796, 715818, 715836, 715855, 715864, 715874, 715888] +'SE16 4AH': [713535, 716582, 717055, 718853, 719707, 720059, 721556, 721826, 722536, 732821] +'SE18 1RJ': [711144, 711251, 711268, 725912, 726246, 726569, 726858, 728430, 728655, 728858] +'SE18 6EQ': [709852, 711682, 712787, 718650, 722344, 725171, 727263, 729005, 730492, 731658] +'SE23 3DR': [710470, 713268, 713751, 714540, 722835, 725641, 727725, 729463, 732078, 733064] +'SE25 6DA': [733664, 733865, 734925, 735712, 736332, 736822, 737221, 737586, 737868, 738118] +'SE3 8AQ': [710494, 713537, 715053, 716101, 717058, 717917, 718857, 725371, 729201, 731836] +'SE4 2NU': [715462, 716414, 716421, 717319, 717330, 725538, 727219, 727619, 728953, 731618] +'SE6 2DX': [709932, 713827, 713912, 714675, 714723, 731081, 731343, 732415, 732595, 733327] +'SE8 5AZ': [738330, 741531, 741533, 741535, 741538, 741539, 741540, 741541, 741542, 741543] +'SE9 3QU': [712911, 713466, 718771, 722464, 725290, 727377, 729122, 730599, 731759, 732754] +'SO14 0JJ': [740245, 740274, 740499, 740666, 740784, 740838, 740878, 740916, 740944, 740974] +'SO21 1FD': [713184, 713693, 719049, 722760, 725563, 727645, 729389, 730841, 732006, 732992] +'SO23 7GL': [709782, 710410, 710725, 710953, 711463, 711580, 711837, 712397, 712484, 712645] +'SO32 2GT': [709814, 709881, 709962, 710036, 710154, 710438, 710763, 710982, 711202, 711345] +'SW4 6TJ': [713169, 713680, 714469, 715192, 719033, 722744, 725549, 729371, 730825, 731992] +'SW8 1AN': [714252, 714972, 715560, 716036, 716529, 716992, 718754, 727360, 729105, 732739] +'SW9 0PP': [727209, 727226, 727231, 735070, 735072, 735074, 735833, 735834, 735835, 736440] +'SW9 9HA': [712797, 713375, 714180, 714894, 718656, 722352, 725178, 727269, 729010, 730497] +'TN37 7GF': [711824, 711898, 712115, 712237, 733932, 736419, 736901, 737308, 737942, 738184] +'BN13 3TE': [709788, 709865, 709946, 710416, 710734, 710963, 711172, 711325, 711471, 711586, 711695] +'BN1 4AY': [711681, 713369, 714888, 718645, 722339, 725167, 727261, 729002, 733626, 737552, 737834] +'BN17 6UA': [713206, 713706, 714499, 715217, 719069, 722778, 725581, 727671, 729406, 730861, 732025] +'BN17 7EN': [713112, 713641, 714424, 718978, 722685, 725494, 727578, 729325, 730782, 731948, 732929] +'BN2 9ND': [713657, 714443, 715172, 715680, 722706, 725514, 727596, 729341, 730803, 731967, 732952] +'BN3 5GA': [733502, 733508, 733511, 733514, 733523, 733529, 733540, 733545, 733550, 733554, 733558] +'BN41 1HS': [733630, 733836, 733998, 734889, 735674, 736294, 736787, 737188, 737555, 737838, 738086] +'CR2 7EB': [733610, 733611, 734869, 734870, 735653, 735654, 736273, 736274, 738285, 738307, 738309] +'CT5 1TN': [709810, 709959, 710121, 710225, 710326, 710395, 710537, 710760, 711195, 711489, 711706] +'DA11 7ND': [713379, 714184, 714900, 715964, 716458, 716925, 727272, 729017, 730501, 731669, 732665] +'DA11 9EH': [727152, 728001, 728253, 728470, 728690, 728899, 729660, 729864, 730050, 730238, 730400] +'E1 0LT': [713378, 714899, 715962, 716924, 717803, 718161, 719203, 719559, 719964, 729016, 731668] +'E2 6QX': [712969, 713530, 715047, 716576, 717048, 718318, 718846, 720691, 722529, 730664, 732816] +'E2 7AG': [713088, 717124, 717539, 719767, 720114, 720447, 721872, 723318, 723587, 729300, 731925] +'E2 9RL': [712780, 713364, 714170, 714884, 715507, 716445, 718642, 719193, 722336, 728999, 732653] +'GU29 9EX': [719422, 733718, 733904, 734055, 734184, 734284, 734392, 734505, 734599, 737625, 738154] +'ME12 2GD': [713103, 716181, 716672, 717548, 717983, 718965, 722674, 725484, 729318, 738425, 738661] +'ME14 2XH': [713022, 713574, 714351, 718889, 722586, 725412, 727494, 729236, 730710, 731867, 732856] +'ME16 8JN': [741083, 741087, 741090, 741113, 741137, 741161, 741193, 741218, 741235, 741250, 741260] +'ME6 5GW': [709882, 711492, 713066, 714384, 718929, 722634, 725444, 727533, 729273, 731901, 732882] +'N1 7DY': [714913, 715523, 715976, 716466, 716935, 717379, 717814, 718227, 719212, 719619, 719971] +'N7 9EU': [711334, 713506, 717031, 717901, 718816, 719296, 720040, 721283, 721809, 723990, 725337] +'NW6 7RB': [738787, 738811, 738836, 738855, 738907, 738948, 738988, 739011, 739040, 739063, 739084] +'PE1 5YU': [713470, 714265, 730603, 731763, 732757, 733652, 734913, 735698, 736318, 736811, 737210] +'PE29 3NL': [710954, 711464, 711690, 712820, 713393, 714198, 718677, 722376, 727290, 729032, 731683] +'PO10 8LY': [713057, 714375, 716631, 717518, 718360, 721035, 721589, 722625, 727526, 728689, 730741] +'PO10 8TW': [712887, 714244, 727349, 730578, 733850, 734131, 734352, 734713, 734904, 736310, 737201] +'PO10 8UP': [714262, 716045, 716539, 717003, 718770, 719267, 720019, 727376, 729121, 730598, 732753] +'PO18 0BZ': [712904, 713458, 714256, 714979, 718762, 722457, 725280, 727368, 729113, 731751, 732746] +'PO18 0DR': [715050, 716097, 717053, 717476, 717916, 718322, 719316, 719706, 720058, 725366, 729197] +'PO18 0EJ': [713705, 715216, 718041, 719440, 719824, 720165, 721112, 722777, 725580, 726338, 730859] +'PO18 0HR': [716258, 716753, 717216, 717627, 718460, 719842, 720803, 725618, 729439, 730889, 732057] +'PO18 8JZ': [712806, 714187, 722358, 727275, 729020, 730503, 732667, 734463, 734639, 734770, 735161] +'PO19 3NN': [713113, 713642, 714425, 715157, 718980, 722687, 725496, 727579, 730783, 731950, 732930] +'PO19 6SU': [733877, 734155, 734727, 734940, 735119, 735242, 735357, 735461, 736347, 737239, 737880] +'PO19 7LQ': [740255, 740283, 740310, 740510, 740677, 740795, 740849, 740889, 740926, 740955, 740984] +'PO19 7NP': [720679, 720981, 721288, 721812, 722089, 722986, 723267, 723530, 723769, 723994, 724215] +'PO19 8BH': [713235, 713727, 714519, 715231, 715736, 717620, 718053, 719097, 722802, 732046, 733038] +'PO19 8DS': [720308, 735339, 735441, 735490, 735579, 735854, 735904, 735947, 735994, 736033, 736075] +'PO19 8EN': [733676, 733876, 734034, 734939, 735727, 736345, 736838, 737238, 737597, 737879, 738126] +'PO20 0LU': [713383, 715968, 716929, 717808, 719208, 723460, 725705, 726386, 727791, 728307, 728739] +'PO20 7EX': [714999, 716060, 718789, 719280, 720028, 720662, 722972, 723517, 723975, 725308, 731782] +'PO22 7UF': [711576, 713359, 714165, 714878, 715949, 716440, 716908, 717350, 717784, 718202, 732649] +'PO3 5XQ': [713565, 715083, 716122, 717083, 717938, 718883, 719339, 720077, 725403, 729227, 731858] +'PO7 6FA': [709894, 709969, 710777, 710999, 711218, 711811, 712104, 712504, 712567, 712617, 712665] +'RH10 1AJ': [738790, 738801, 738814, 738911, 738952, 738992, 739014, 739044, 739067, 739088, 739098] +'RH15 0GG': [712586, 712628, 712631, 733331, 733403, 733476, 737976, 738024, 738052, 738203, 738214] +'RH16 4TU': [711543, 726118, 726448, 726756, 727017, 727843, 728117, 728579, 728785, 730980, 731264] +'RH20 1HX': [715026, 716567, 717034, 717460, 719298, 720678, 720980, 721287, 725340, 730644, 732800] +'SE10 8TX': [740261, 740289, 740316, 740516, 740683, 740801, 740855, 740895, 740932, 740961, 740990] +'SE12 9PY': [713109, 713637, 716185, 716676, 717142, 717552, 718972, 722682, 730780, 731945, 732926] +'SE14 6QD': [728060, 728066, 731238, 731240, 731468, 731470, 731472, 733262, 733267, 733408, 733410] +'SE15 5TD': [716634, 717523, 718365, 719749, 720428, 721038, 721591, 722133, 723311, 723809, 724255] +'SE15 6RT': [710796, 711020, 713248, 714527, 715241, 719108, 727706, 729445, 730894, 733049, 741380] +'SE16 3PB': [741265, 741268, 741271, 741274, 741277, 741279, 741281, 741283, 741284, 741285, 741286] +'SE18 2PE': [709775, 713349, 714155, 718623, 722320, 725147, 727246, 728983, 730473, 731637, 732638] +'SE19 3PL': [711535, 723181, 723186, 723189, 723190, 723191, 723192, 731022, 731023, 731024, 731025] +'SE20 8DL': [710126, 715807, 715852, 715854, 715872, 715873, 715898, 715900, 715902, 741432, 741476] +'SE23 1JB': [721963, 721964, 721965, 721966, 721968, 721969, 721970, 721971, 721975, 721977, 722243] +'SE26 5SB': [713852, 714578, 714639, 714689, 714784, 715293, 730375, 731052, 731559, 732191, 735079] +'SE28 0GX': [726162, 726482, 726791, 727047, 727873, 728806, 729571, 729776, 729968, 730152, 730318] +'SE6 2BB': [712830, 713403, 714208, 718685, 722387, 725212, 727302, 729040, 730529, 731692, 732689] +'SE9 1JZ': [711738, 713776, 713843, 714013, 714079, 714658, 714705, 715309, 715348, 715381, 732278] +'SE9 1LJ': [711040, 715117, 715648, 716151, 720738, 723578, 725445, 727033, 727859, 729274, 731902] +'SE9 6RD': [716039, 716996, 718277, 718761, 719664, 720014, 720342, 720648, 722063, 722455, 727366] +'SE9 6RH': [710449, 719400, 720764, 723054, 724055, 724863, 725513, 725804, 726483, 726792, 729340] +'SO14 6RN': [741080, 741119, 741144, 741168, 741199, 741405, 741438, 741461, 741481, 741499, 741511] +'SO16 6RL': [712424, 733720, 733905, 734056, 734985, 735766, 736385, 737276, 737627, 737913, 738155] +'SO16 8FP': [720723, 721021, 722122, 723021, 723566, 724021, 724638, 724832, 725021, 726303, 727026] +'SO16 9BX': [721099, 721380, 721645, 721906, 722182, 723075, 723343, 723620, 723850, 724074, 724285] +'SO21 3FT': [709804, 709874, 710025, 710148, 710199, 710260, 710429, 710752, 710976, 711189, 711598] +'SW4 6QH': [713486, 714277, 715002, 715578, 716061, 718791, 722478, 725310, 729144, 730620, 731785] +'SW4 6RN': [712802, 713377, 714183, 715512, 715961, 716457, 716922, 718659, 725183, 729014, 730499] +'TN4 9UR': [710519, 714281, 716553, 717447, 718295, 720361, 720972, 722484, 727394, 730623, 732778] +'BN13 3GE': [709886, 710040, 710158, 710269, 710351, 710838, 710873, 710892, 710917, 710938, 711054, 711611] +'BN1 4GT': [713627, 715141, 716176, 717131, 717979, 718955, 719389, 720118, 720753, 725475, 729306, 731929] +'BN17 7GE': [711820, 711860, 711895, 711924, 712111, 712234, 712332, 712429, 712515, 712579, 712625, 712673] +'BN2 5PT': [717716, 717727, 718101, 718113, 718134, 718144, 718160, 718500, 718513, 718525, 718540, 718547] +'BN3 3WA': [712299, 733606, 733616, 733623, 734865, 734875, 734882, 735659, 735667, 735830, 736271, 736279] +'BN43 5QP': [711791, 711840, 711874, 711908, 712084, 712206, 712305, 712400, 712485, 712552, 712600, 712648] +'BR6 7EQ': [739557, 739592, 739616, 739637, 739774, 739935, 740027, 740097, 740140, 740171, 740198, 740227] +'CR0 4YE': [711436, 728873, 729637, 729844, 730031, 730377, 731054, 731204, 731325, 731441, 731561, 732193] +'CR0 7NQ': [733629, 733835, 733997, 734119, 734888, 735673, 736293, 736786, 737187, 737554, 737837, 738085] +'CT1 2AE': [713461, 714259, 714981, 715564, 716042, 716533, 717000, 717430, 717871, 730594, 731753, 732750] +'CT19 5FQ': [741394, 741408, 741411, 741414, 741425, 741448, 741470, 741489, 741506, 741517, 741524, 741527] +'CT20 3QX': [711793, 712086, 712402, 712650, 733854, 734015, 734136, 735699, 736319, 737211, 737573, 737856] +'CT6 7EY': [712220, 713650, 714437, 715165, 727587, 729334, 730794, 731959, 732940, 733705, 734969, 736372] +'DA11 8FT': [709903, 710056, 710171, 710278, 710363, 710466, 710505, 710565, 710617, 711018, 711370, 711631] +'DA12 2JD': [738936, 738940, 738960, 738963, 738965, 738968, 738970, 738972, 738974, 738976, 738978, 738980] +'DA12 2PD': [712942, 713498, 714291, 715013, 718807, 722497, 725327, 727406, 729160, 730633, 731802, 732787] +'DA1 2JD': [738481, 738489, 738499, 738510, 738517, 738525, 738531, 738538, 738546, 738563, 738570, 738576] +'DA1 2LR': [713742, 719117, 719849, 720520, 721134, 721675, 722213, 723378, 723878, 725632, 729455, 732068] +'DA1 5LZ': [713636, 714421, 715150, 715668, 716182, 716673, 717139, 717549, 717984, 730778, 731942, 732923] +'DA1 5NB': [709933, 713918, 713980, 714109, 714618, 714681, 714729, 714778, 714814, 715332, 715364, 715396] +'DA1 5TY': [709790, 709947, 710095, 710193, 710292, 710377, 710518, 710575, 710735, 711173, 711473, 711696] +'DA8 1NS': [710665, 710862, 710878, 721416, 721947, 722223, 723107, 723387, 724098, 724316, 724504, 724707] +'E1 2PD': [712833, 714209, 714922, 716482, 716947, 717389, 717826, 718241, 719633, 720613, 720926, 729043] +'E1 5EF': [713739, 715246, 716264, 717222, 718062, 719114, 719465, 720185, 720808, 725628, 729451, 732066] +'E1 5EJ': [713720, 714513, 715730, 716250, 717208, 717616, 719833, 720508, 721121, 721401, 722793, 725605] +'E2 0BN': [713284, 713760, 715265, 715756, 716772, 717641, 719860, 722852, 727744, 729475, 732090, 733073] +'E2 6GB': [713061, 714377, 715645, 716632, 717519, 718361, 719744, 720424, 722628, 727528, 730743, 732877] +'E2 6PZ': [713555, 714334, 716117, 716602, 717931, 719334, 720399, 720707, 725392, 729218, 730686, 732838] +'E2 7AE': [713212, 715923, 717608, 718443, 720501, 721116, 722199, 725078, 726011, 726956, 730865, 733019] +'E2 9RG': [713006, 713562, 714340, 715079, 718880, 722566, 725398, 727476, 729221, 730694, 731856, 732844] +'GU27 3HS': [719775, 720455, 720756, 721353, 721610, 721880, 732925, 733702, 735750, 736369, 736857, 737902] +'GU28 0EB': [715281, 716290, 719482, 722873, 730931, 733091, 735017, 735326, 735432, 735481, 736417, 737307] +'GU29 9EH': [728361, 728471, 728593, 728901, 729661, 729865, 729960, 730053, 730144, 731217, 732148, 732257] +'GU29 9QL': [733703, 734048, 734173, 734383, 734590, 734966, 735751, 736370, 736858, 737258, 737615, 738142] +'GU31 5DE': [713239, 714523, 715740, 716256, 716749, 717623, 719100, 722805, 727700, 729435, 732050, 733041] +'KT20 5LH': [713450, 714970, 716034, 716989, 717862, 719257, 720012, 720642, 721257, 721782, 722955, 723501] +'ME10 4FP': [709783, 710189, 710289, 710373, 710516, 710925, 711033, 711067, 711093, 711111, 711133, 711244] +'ME10 4GL': [709777, 710403, 710719, 710947, 711157, 711315, 714196, 715525, 716469, 718229, 730518, 732681] +'ME14 5HQ': [709789, 714246, 715556, 716523, 717419, 718271, 719659, 720333, 722440, 727351, 730579, 732733] +'ME15 6FL': [711812, 711852, 711889, 711918, 712105, 712224, 712323, 712420, 712506, 712569, 712618, 712666] +'ME2 2GW': [738391, 738406, 738416, 738446, 738453, 738465, 738473, 738555, 738614, 738719, 738744, 738772] +'ME5 7TR': [709983, 710469, 713264, 713750, 715255, 722830, 725638, 727721, 729459, 730905, 732075, 733061] +'N1 7FT': [712994, 713553, 714333, 715069, 718871, 722557, 725389, 727469, 729216, 730682, 731849, 732836] +'NN2 7TD': [711528, 729922, 730106, 730275, 731108, 731246, 731359, 731480, 732116, 732232, 732331, 732437] +'NW10 8US': [714117, 714127, 714133, 714136, 714139, 714141, 714143, 714145, 718782, 725303, 729136, 731773] +'PE1 5ED': [710008, 713279, 714549, 714835, 722847, 725126, 727738, 728956, 728965, 730913, 731610, 733487] +'PE2 8FB': [711711, 713114, 714426, 716678, 717555, 718391, 719778, 720456, 721062, 722688, 727580, 730784] +'PE2 8JH': [710696, 713366, 716446, 718207, 719602, 721472, 723200, 723705, 724146, 724543, 724933, 725164] +'PO10 8UT': [724195, 724592, 725928, 726262, 726728, 726993, 730023, 731202, 731323, 731437, 731558, 732190] +'PO17 5GT': [712985, 717487, 717923, 718331, 718863, 722549, 725380, 727459, 737231, 737593, 737874, 738121] +'PO18 0BT': [727888, 728153, 728615, 729584, 729790, 729974, 730164, 730327, 731397, 732156, 733124, 733219] +'PO18 0PQ': [713157, 714464, 715187, 716215, 721087, 721369, 721634, 722732, 723065, 723610, 724476, 730819] +'PO18 8AQ': [713139, 714449, 715178, 719003, 722713, 725520, 727603, 729346, 733895, 737619, 737905, 738146] +'PO19 3JE': [712767, 713355, 714163, 714876, 715502, 716439, 717347, 721195, 721466, 722007, 727251, 731645] +'PO19 3NR': [736672, 736726, 736957, 737000, 737049, 737404, 737442, 737477, 737506, 737685, 737747, 737777] +'PO19 6RN': [712888, 713444, 714245, 714963, 717416, 718746, 719658, 735106, 735343, 735447, 735537, 735861] +'PO19 6ST': [733916, 734194, 734400, 734606, 735470, 735559, 735882, 735977, 736135, 736397, 737288, 737924] +'PO19 8BE': [722997, 723538, 724003, 724815, 728575, 729748, 730132, 730301, 731380, 731501, 732352, 732541] +'PO19 8BW': [712922, 719675, 720354, 720964, 721537, 722074, 722472, 723252, 724200, 724595, 730612, 732766] +'PO20 2AR': [733744, 733927, 734073, 734202, 735011, 735790, 736411, 736894, 737301, 737647, 737936, 738178] +'PO20 2GN': [711783, 711835, 711872, 711906, 712078, 712201, 712300, 712393, 712479, 712548, 712598, 712643] +'PO20 2GR': [733725, 733909, 734060, 734189, 734395, 734990, 735770, 736391, 736877, 737282, 737631, 738159] +'PO20 2JL': [709872, 709952, 710024, 710147, 710197, 710258, 710973, 711186, 711335, 711479, 711596, 711699] +'PO20 8BE': [713224, 718047, 718448, 725598, 733028, 733914, 734064, 734193, 734399, 734513, 734605, 734677] +'PO21 5BL': [713439, 714237, 714957, 716021, 716511, 716976, 722429, 727342, 729090, 730570, 731735, 732727] +'PO3 6FA': [710674, 715971, 716462, 716931, 717373, 717810, 718220, 721487, 722024, 722914, 723210, 723461] +'PO9 5DJ': [711829, 733594, 733985, 734104, 734855, 735641, 736260, 736761, 737167, 737533, 737814, 738064] +'RH11 0UP': [713081, 714401, 715131, 717122, 717535, 718375, 719381, 719762, 721600, 730760, 731923, 732901] +'RH11 8RN': [733670, 733674, 734931, 734937, 735719, 735725, 736338, 736343, 736829, 736835, 737227, 737236] +'RH12 5YJ': [710894, 718012, 719413, 720773, 721367, 721897, 723063, 723609, 723839, 724065, 724475, 725056] +'RH16 4FQ': [721139, 721680, 722221, 723386, 723883, 724314, 724705, 725088, 726024, 726353, 726821, 727074] +'RH20 1HY': [722088, 722985, 723768, 724421, 725946, 736560, 736592, 736616, 736673, 736701, 736727, 736933] +'RH20 3HW': [709856, 709941, 710013, 710088, 710133, 710243, 710336, 710480, 710722, 711160, 711460, 711687] +'RH6 8LX': [710315, 713192, 713699, 714486, 715209, 718432, 719056, 725570, 727655, 730848, 732012, 733002] +'SE11 5TW': [713392, 714197, 715526, 715982, 716470, 716939, 717382, 717817, 718676, 719214, 722375, 725201] +'SE1 2RX': [733684, 733879, 734039, 734158, 734945, 735734, 736352, 736844, 737244, 737601, 737885, 738131] +'SE14 5FJ': [712686, 712691, 712696, 712702, 712706, 712712, 712716, 712719, 712723, 712727, 712731, 712735] +'SE14 5FL': [712687, 712692, 712698, 712703, 712707, 712713, 712717, 712720, 712724, 712728, 712732, 712737] +'SE14 5RU': [715609, 716099, 716581, 717054, 738431, 738444, 738450, 738471, 738477, 738487, 738497, 738508] +'SE14 5TL': [713020, 713572, 714350, 715091, 718888, 722584, 725410, 727493, 729235, 730709, 731866, 732855] +'SE14 6TZ': [715490, 740267, 740295, 740322, 740347, 740522, 740806, 740861, 740901, 740938, 740967, 740996] +'SE15 5GA': [717206, 718049, 719447, 719885, 719892, 719898, 720212, 720228, 720237, 720241, 720544, 720553] +'SE15 6QT': [732155, 732364, 733810, 733940, 734085, 734214, 735082, 735841, 736922, 737331, 737955, 738193] +'SE15 6RF': [738364, 738373, 738380, 738392, 738466, 738556, 738615, 738663, 738701, 738720, 738745, 738773] +'SE15 6RH': [709843, 713748, 714537, 715252, 719121, 722827, 725636, 727719, 729457, 730904, 732074, 733060] +'SE15 6RJ': [713304, 713769, 714564, 715277, 719151, 722867, 725670, 727760, 729487, 730928, 732102, 733086] +'SE15 6RL': [713233, 713726, 714518, 715230, 719096, 722800, 725610, 727695, 729430, 730881, 732044, 733037] +'SE15 6RR': [715428, 715777, 715799, 715839, 715866, 715892, 716297, 716320, 716343, 716375, 716400, 716815] +'SE16 4AQ': [711086, 711122, 724626, 724818, 725001, 725759, 725957, 726117, 726447, 726609, 726755, 727016] +'SE16 5EH': [711925, 712675, 733790, 733937, 734300, 734416, 735055, 736434, 736912, 737322, 737659, 737950] +'SE18 1QQ': [733689, 733884, 734042, 734163, 734951, 735739, 736358, 736849, 737248, 737608, 737892, 738136] +'SE19 2JP': [739517, 739538, 739572, 739597, 739755, 739916, 740009, 740077, 740121, 740151, 740178, 740206] +'SE23 2LN': [710184, 710239, 714851, 715468, 715480, 715484, 716418, 716426, 732618, 732626, 732628, 741306] +'SE25 6DH': [738788, 738799, 738812, 738838, 738909, 738950, 738989, 739012, 739042, 739065, 739086, 739096] +'SE26 5RU': [713478, 716056, 717014, 717886, 718783, 719278, 720026, 721797, 722969, 723514, 724410, 731774] +'SE28 0AL': [723111, 723392, 723657, 723888, 724102, 724318, 724506, 724905, 725091, 725837, 726028, 726197] +'SE28 0BN': [722905, 723449, 723931, 724361, 724748, 725698, 726380, 726702, 728515, 729504, 730270, 730948] +'SE9 1LS': [710354, 715180, 716204, 719010, 721894, 723060, 724062, 725807, 726167, 726796, 727877, 728144] +'SE9 1LW': [711309, 720632, 721775, 723494, 725729, 725916, 726081, 726250, 726407, 726573, 731554, 732188] +'SE9 6RL': [720147, 721373, 723615, 726491, 726798, 727054, 727879, 728809, 729780, 730156, 730997, 731394] +'SO14 1NP': [741397, 741409, 741413, 741415, 741428, 741451, 741473, 741492, 741508, 741519, 741526, 741528] +'SO15 2HD': [741055, 741081, 741085, 741089, 741098, 741120, 741145, 741177, 741205, 741225, 741242, 741255] +'SO17 2EZ': [723597, 723684, 724046, 724468, 724857, 725797, 726160, 726480, 726789, 727046, 727870, 728138] +'SO18 5LB': [713278, 713758, 714548, 715261, 719128, 722846, 725647, 727737, 729470, 730912, 732085, 733071] +'SO22 6FD': [713116, 713644, 714429, 715160, 718984, 722691, 725499, 727583, 729328, 730786, 731952, 732933] +'SO23 7PS': [712359, 727839, 727980, 736465, 736501, 736532, 736563, 736620, 736650, 736676, 736704, 736730] +'SO31 1DT': [711053, 711270, 711310, 725022, 726304, 726618, 726901, 727144, 727995, 728464, 728684, 729657] +'SO31 6ES': [709953, 710198, 710750, 711187, 711481, 711700, 711775, 712070, 712194, 712292, 712386, 712470] +'SW4 6QG': [714211, 714925, 717829, 718244, 719226, 719635, 722394, 725220, 727306, 730538, 731698, 732695] +'SW4 6RX': [715121, 715652, 716155, 716643, 717111, 718369, 718933, 719371, 722639, 725450, 727536, 731906] +'SW9 6AP': [718530, 718531, 718532, 718533, 719492, 719493, 719494, 719495, 719509, 719510, 719511, 736423] +'SW9 9AU': [733753, 734296, 734411, 734527, 734616, 734685, 734754, 734817, 735018, 735141, 735799, 736418] +'TN16 3EP': [713763, 714554, 715269, 733076, 733745, 735012, 735791, 736412, 736895, 737302, 737648, 737937] +'TN26 2JG': [711102, 711121, 711305, 711384, 711558, 711564, 712253, 712262, 712269, 712280, 712345, 712354] +'BN1 4GP': [713362, 714168, 714881, 715505, 715951, 716443, 716911, 717354, 727257, 728996, 730485, 731651, 732652] +'BN6 9FD': [721930, 722209, 723097, 723644, 730887, 732054, 733044, 733732, 734997, 735779, 736402, 736883, 737291] +'CR0 6HB': [716337, 716361, 716383, 716802, 716825, 716842, 716857, 717255, 717287, 717297, 717665, 717678, 717692] +'DA11 8FB': [719219, 719978, 720609, 721216, 738368, 738384, 738401, 738421, 738439, 738458, 738609, 738696, 738738] +'DA12 1HJ': [711084, 722046, 722940, 723229, 723488, 723732, 723956, 724179, 724390, 724578, 724775, 724963, 725724] +'DA9 9DF': [711799, 711845, 711881, 711911, 711935, 712091, 712213, 712311, 712409, 712492, 712558, 712608, 712658] +'E1 0EA': [720646, 726085, 726413, 726726, 726990, 727812, 728095, 728326, 728550, 728763, 729528, 729733, 729937] +'E1 2PS': [713133, 713655, 714441, 715171, 715678, 718997, 722705, 725511, 727595, 729339, 730802, 731965, 732950] +'E1W 1NZ': [713038, 713587, 714363, 715638, 716138, 716622, 718906, 722606, 727507, 729250, 730726, 731883, 732867] +'E2 7AY': [713315, 714571, 715285, 716294, 717247, 717655, 718083, 719873, 720207, 725677, 727767, 732107, 733093] +'GU27 3PB': [724037, 726314, 726472, 726634, 726780, 727086, 727863, 727932, 727935, 733603, 734862, 735649, 736268] +'GU28 0EL': [740280, 740307, 740333, 740355, 740374, 740507, 740674, 740792, 740846, 740886, 740924, 740952, 740981] +'GU28 9AN': [713732, 716752, 717626, 718459, 719460, 725617, 727702, 730888, 732055, 733045, 735265, 735317, 735372] +'GU29 9BH': [714284, 715008, 715584, 716067, 716555, 717022, 717894, 722489, 727398, 729149, 730626, 731793, 732780] +'GU29 9EP': [713631, 716667, 717981, 727565, 729312, 733696, 734799, 734960, 735128, 735193, 735254, 735745, 736366] +'HA9 9PA': [738358, 738375, 738383, 738400, 738409, 738457, 738550, 738608, 738658, 738695, 738716, 738737, 738766] +'ME14 2RP': [720134, 720763, 721071, 721620, 722159, 723324, 723828, 724270, 724670, 725051, 725989, 726642, 726922] +'ME2 1PL': [712957, 713518, 714307, 715037, 716088, 718833, 722519, 725351, 727430, 729181, 730653, 731819, 732808] +'ME5 0DL': [726075, 726402, 728319, 728538, 728631, 728754, 728833, 729522, 729602, 730960, 731121, 732239, 732339] +'ME5 7TS': [712808, 713384, 714189, 714905, 715969, 718664, 722362, 725190, 727278, 729024, 730506, 731676, 732669] +'NW10 8HH': [712900, 714253, 715562, 717425, 718275, 720339, 720952, 721525, 722060, 722449, 727362, 732741, 738410] +'PE2 8FG': [712616, 733706, 733893, 734049, 734175, 734385, 734970, 735753, 736373, 736860, 737260, 737616, 738144] +'PE29 3EZ': [711876, 712486, 733653, 733855, 734137, 734357, 734914, 735700, 736320, 736812, 737574, 737857, 738106] +'PO10 8HJ': [713499, 715014, 721279, 723985, 724417, 725328, 725748, 726103, 727006, 729543, 729744, 729944, 730128] +'PO10 8JW': [713092, 713626, 714410, 718380, 718953, 719387, 722663, 725474, 732909, 736851, 737251, 737610, 737894] +'PO18 0BX': [714418, 716670, 718964, 719771, 721877, 722148, 724263, 724659, 725040, 725483, 725983, 731937, 732919] +'PO18 0ET': [713426, 714227, 714945, 716009, 716498, 716967, 717401, 722419, 725247, 727330, 729074, 731721, 732716] +'PO19 3NY': [729519, 729721, 729930, 730280, 730957, 731116, 731249, 731367, 731484, 732119, 732236, 732337, 732443] +'PO19 7LZ': [715101, 716137, 717098, 720085, 720413, 721020, 721326, 722604, 724020, 724245, 725970, 726460, 730725] +'PO20 0AP': [713209, 713708, 714501, 715218, 716237, 719072, 722781, 725584, 727673, 729409, 730863, 732028, 733017] +'PO20 0LT': [720287, 720912, 721168, 721485, 723712, 724552, 725891, 726225, 726547, 734821, 735162, 735208, 735327] +'PO20 0SJ': [712899, 713453, 714973, 715561, 716993, 718756, 722448, 725274, 727361, 729107, 730585, 731745, 732740] +'PO3 5XH': [713201, 713703, 714493, 715214, 715716, 719063, 722772, 725577, 727664, 729403, 730855, 732022, 733011] +'RH10 1AP': [712372, 712376, 736540, 736567, 736598, 736625, 736657, 736681, 736945, 736965, 736989, 737010, 737037] +'RH11 0TU': [724159, 726229, 726553, 726847, 727948, 728642, 729615, 729821, 729999, 730196, 731185, 731541, 732175] +'RH11 7US': [709844, 714538, 715749, 716272, 718068, 718471, 719470, 719853, 722833, 725640, 727724, 732077, 733063] +'RH12 5YP': [711140, 711409, 726498, 726929, 727884, 728270, 728705, 728919, 729580, 729785, 730254, 730325, 731000] +'RH16 4TR': [728199, 728424, 728647, 728852, 729619, 729826, 730005, 730199, 730360, 733145, 733231, 733308, 733376] +'RH19 3LB': [711951, 734117, 734461, 734556, 734637, 734705, 735159, 735670, 736289, 736782, 737551, 737833, 738082] +'SE11 5DD': [712761, 713346, 714153, 714867, 715496, 715941, 716435, 716901, 718620, 722318, 725144, 727244, 728979] +'SE11 5RP': [723265, 723992, 724213, 724420, 724613, 724806, 724988, 726106, 726277, 726434, 727009, 727125, 727832] +'SE15 6RN': [711082, 719620, 720292, 720919, 721491, 722028, 723213, 723716, 724158, 724556, 724946, 725896, 726552] +'SE16 4BN': [725932, 738370, 738412, 738423, 738429, 738460, 738486, 738496, 738506, 738551, 738560, 738740, 738767] +'SE20 7YZ': [710180, 714791, 714792, 714793, 715304, 715306, 715307, 715809, 715813, 715817, 716349, 716353, 716354] +'SE26 5SD': [713808, 713957, 714730, 716296, 716350, 716865, 717250, 717657, 718087, 718118, 718137, 733155, 733382] +'SE9 1EJ': [709996, 713920, 713959, 714092, 714110, 714607, 714732, 714779, 714816, 715441, 715823, 733157, 733407] +'SE9 1LQ': [714381, 716635, 718366, 718927, 719368, 719750, 721039, 721592, 721860, 722631, 723032, 724841, 731899] +'SE9 1SJ': [710334, 714397, 714831, 715655, 717532, 718554, 720442, 722650, 725124, 728951, 731606, 732896, 733486] +'SE9 1SN': [714160, 714819, 715917, 717345, 718548, 720267, 720896, 722005, 723196, 723929, 724359, 728298, 732641] +'SO15 5QW': [713015, 713567, 714346, 715086, 715628, 718885, 722577, 725405, 727486, 729230, 730702, 731860, 732849] +'SO22 4PR': [741001, 741003, 741006, 741008, 741017, 741027, 741032, 741036, 741042, 741044, 741053, 741054, 741092] +'SO32 2EW': [712877, 718737, 722425, 725256, 727336, 729085, 730565, 731731, 732722, 733760, 735026, 735804, 736422] +'SW4 6SU': [713032, 713581, 714358, 715097, 716132, 716618, 718899, 722598, 725422, 727502, 730720, 731877, 732864] +'BN17 7EF': [710741, 712913, 713468, 714264, 716540, 717434, 718283, 718773, 725292, 727379, 729123, 730601, 731761, 732755] +'BN43 6NR': [713783, 713815, 713859, 713898, 713935, 733161, 733210, 733243, 733285, 733318, 733350, 733388, 733430, 733462] +'BN6 9YJ': [711138, 711248, 711264, 711278, 711386, 711402, 711417, 711565, 711644, 711653, 711659, 711666, 711671, 711734] +'CT5 1JZ': [713222, 713716, 714508, 715223, 715726, 716243, 719082, 722791, 725597, 727686, 729417, 730872, 732038, 733026] +'DA11 0JA': [711809, 711851, 711888, 711917, 711940, 711961, 712101, 712223, 712321, 712419, 712502, 712566, 712615, 712664] +'DA11 7BU': [711897, 712336, 713635, 731939, 733750, 733929, 734204, 735014, 735796, 736899, 737304, 737651, 737939, 738181] +'DA11 8DP': [726746, 727008, 727975, 728230, 728450, 728673, 728876, 729639, 729845, 730033, 730221, 730378, 731055, 731205] +'DA14 5HN': [711070, 711442, 719285, 720034, 720669, 726426, 726741, 727002, 727824, 730973, 731132, 731258, 731377, 733281] +'E1 5EE': [717632, 718466, 719847, 720518, 721132, 721673, 722212, 723377, 723877, 724309, 724699, 725083, 726020, 726350] +'E2 6FS': [730972, 731257, 731376, 732135, 732249, 732453, 733754, 733755, 733756, 733757, 735019, 735020, 735021, 735022] +'E2 6GA': [713182, 713691, 715200, 716227, 717185, 718027, 719047, 719428, 722758, 725561, 727643, 729386, 730839, 732004] +'GU27 3PD': [713787, 713820, 713864, 713904, 713966, 714036, 714066, 714100, 714587, 733215, 733355, 733392, 733433, 733466] +'GU27 3QY': [717042, 717466, 718831, 720376, 720683, 720988, 721293, 722096, 722517, 722993, 723534, 723775, 725349, 729180] +'GU28 0EH': [713059, 713602, 715111, 715644, 717106, 719364, 720096, 720735, 721336, 721858, 722627, 734946, 736353, 737886] +'GU29 0AP': [709863, 709945, 710019, 710139, 710191, 710250, 710290, 710342, 710374, 711168, 711324, 711469, 711585, 711693] +'GU29 9HP': [739523, 739545, 739579, 739603, 739626, 739648, 739762, 739923, 740015, 740084, 740127, 740158, 740185, 740214] +'GU31 5LE': [725923, 726255, 726579, 726988, 727809, 727965, 728094, 728212, 728324, 728546, 728660, 728862, 729629, 729730] +'ME1 1GW': [711781, 711832, 711870, 711904, 711930, 711949, 712075, 712199, 712297, 712391, 712476, 712545, 712595, 712641] +'ME14 1HQ': [711526, 713309, 713771, 714567, 715279, 715768, 716289, 719155, 722871, 725673, 727763, 729490, 732105, 733090] +'ME14 2EQ': [717242, 718078, 719480, 720201, 720827, 721425, 721955, 722236, 723117, 723400, 723662, 724107, 724511, 724909] +'ME14 2PW': [711504, 713149, 713669, 714455, 715183, 716208, 716700, 719015, 722722, 725531, 727614, 729355, 731980, 732964] +'ME15 6YJ': [712880, 713438, 714235, 714956, 715551, 716020, 718738, 722427, 725257, 727340, 729089, 730569, 731734, 732726] +'ME15 7FA': [711762, 711826, 711865, 711900, 711926, 711945, 712058, 712183, 712283, 712379, 712462, 712535, 712587, 712633] +'N7 9EH': [713847, 713988, 714577, 714687, 715290, 715337, 715368, 715402, 715797, 715837, 715865, 715890, 716318, 716342] +'NW10 8DF': [713475, 714991, 716053, 717009, 718777, 723511, 723973, 724407, 724794, 725300, 726094, 726417, 729130, 731770] +'NW10 8EZ': [727900, 728394, 728624, 728826, 729595, 729979, 730172, 730332, 738707, 739115, 739116, 739214, 739215, 739216] +'NW10 8NX': [713786, 713863, 713999, 714065, 714586, 714646, 714693, 714745, 714788, 715297, 715341, 715370, 733354, 733432] +'PE2 9BQ': [713260, 716764, 719120, 722826, 725635, 733921, 734068, 734198, 734404, 736888, 737295, 737640, 737930, 738171] +'PO12 1HH': [734094, 734218, 734219, 734222, 734232, 734236, 734309, 734422, 734426, 734434, 734438, 734443, 734540, 734542] +'PO12 1HQ': [733948, 733953, 733970, 737393, 737412, 737470, 737482, 737767, 738000, 738013, 738022, 738042, 738209, 738219] +'PO18 0AY': [712869, 714229, 716500, 716968, 717402, 717846, 718257, 720936, 721237, 723487, 724178, 725249, 727331, 729076] +'PO18 8DR': [715044, 715603, 719312, 720994, 721823, 722527, 722998, 723540, 723782, 724226, 725955, 726608, 728454, 730035] +'PO19 3NJ': [723243, 726259, 726583, 726870, 727112, 727968, 728217, 728439, 728663, 730213, 735294, 735403, 735495, 735582] +'PO19 3NZ': [728855, 729622, 729829, 730010, 730202, 731037, 731191, 731315, 731426, 731548, 732179, 732288, 732386, 732493] +'PO19 6UY': [713801, 713951, 713984, 732573, 733143, 733229, 733307, 733374, 733421, 737981, 738004, 738028, 738195, 738207] +'PO19 7NQ': [729708, 729813, 729911, 729993, 730350, 730947, 731026, 731179, 731304, 731416, 731474, 731537, 732109, 732228] +'PO20 0BW': [725039, 725982, 726155, 726476, 726636, 726914, 727040, 727155, 728009, 728135, 728259, 728598, 728798, 729562] +'PO20 1PJ': [720527, 720819, 721417, 721949, 723389, 723655, 723886, 724505, 726027, 726195, 726520, 728169, 728824, 728933] +'PO8 8EL': [740239, 740268, 740296, 740323, 740348, 740364, 740493, 740660, 740778, 740832, 740872, 740910, 740939, 740968] +'RH11 8RG': [711205, 711348, 713095, 713629, 714414, 715143, 716177, 716666, 718957, 722666, 725477, 730770, 731930, 732914] +'RH12 3XE': [710324, 710393, 710535, 710594, 710633, 710666, 710711, 710843, 711106, 711127, 711151, 711258, 711274, 711287] +'RH14 0BU': [713408, 714930, 715996, 716951, 718697, 721222, 721756, 722926, 725224, 727802, 735223, 736032, 736107, 736174] +'RH14 9RW': [710343, 710375, 715544, 716012, 716503, 716971, 719239, 719648, 719997, 720319, 720626, 720939, 721239, 721510] +'RH15 0GZ': [733654, 733856, 734016, 734138, 734263, 734358, 734915, 735701, 736321, 736813, 737212, 737575, 737858, 738107] +'RH15 9EG': [710330, 717299, 717310, 717667, 717695, 717714, 717725, 718099, 718111, 718132, 718142, 718159, 718498, 718511] +'RH16 1EF': [712277, 712366, 712375, 712436, 736228, 736474, 736504, 736538, 736566, 736596, 736624, 736680, 736712, 736964] +'RH20 1PE': [714959, 716513, 717410, 729091, 733644, 734009, 734902, 735688, 736147, 736215, 736308, 736491, 736554, 738098] +'SE10 8ED': [711862, 712126, 733693, 733952, 733959, 734956, 735143, 735144, 735145, 735146, 735147, 735148, 735149, 735743] +'SE14 5FU': [709995, 709998, 710000, 710002, 710003, 710004, 710065, 710068, 710070, 710073, 710077, 710078, 710080, 710081] +'SE25 4SP': [733801, 733938, 734083, 734212, 734301, 734417, 735068, 735832, 736438, 736914, 737324, 737662, 737952, 738191] +'SE25 6DF': [733673, 733873, 734031, 734152, 734271, 734370, 734936, 735724, 736342, 736834, 737235, 737595, 737877, 738123] +'SE26 4PG': [710539, 714829, 714845, 715090, 715473, 716884, 716891, 718553, 718565, 719565, 719928, 721982, 721992, 731864] +'SE28 0PD': [710911, 721613, 721883, 722154, 723048, 723323, 723598, 723823, 724047, 724267, 724664, 724858, 725044, 725798] +'SE8 5NJ': [711273, 723844, 724279, 724678, 725060, 725998, 726328, 726652, 726925, 727167, 728018, 741364, 741365, 741366] +'SE8 5PR': [713166, 713677, 715189, 715697, 716707, 717585, 719029, 722741, 725546, 727625, 729367, 730821, 731988, 732976] +'SE8 5UT': [739524, 739546, 739580, 739604, 739627, 739649, 739763, 739924, 740016, 740085, 740128, 740159, 740186, 740215] +'SE9 1EN': [711388, 726435, 727083, 727833, 727931, 728110, 728340, 728775, 729746, 729804, 729947, 729986, 730336, 731379] +'SE9 1SH': [716413, 718168, 719378, 720250, 720746, 720860, 721345, 721451, 724121, 725463, 725788, 725870, 727217, 731919] +'SO18 2PE': [712433, 712580, 733751, 733930, 734076, 734205, 734295, 734409, 735015, 735797, 736415, 737305, 737940, 738182] +'SO21 1PR': [712974, 713534, 714318, 715051, 716098, 716580, 718852, 722535, 725367, 727445, 729198, 730669, 731834, 732820] +'SO31 8HW': [713301, 713630, 714415, 715144, 715764, 716178, 719145, 722864, 725667, 727758, 729311, 730772, 731932, 732915] +'SW4 6SX': [713075, 713616, 714396, 715126, 715654, 716162, 717119, 717530, 718938, 720107, 720440, 725460, 729290, 732894] +'SW4 6SZ': [713529, 715045, 715604, 717472, 717911, 718317, 718845, 719313, 720381, 722528, 727441, 730663, 731828, 732815] +'BN1 4GR': [713213, 713710, 714504, 715220, 715723, 716239, 716735, 719074, 722784, 725587, 727677, 729412, 730866, 732031, 733020] +'BN2 9SA': [712378, 725540, 727621, 729362, 733568, 733581, 733593, 734829, 734843, 734854, 735618, 735630, 735640, 736240, 737156] +'BN3 2SB': [711886, 711938, 711979, 733704, 733892, 734174, 734384, 734591, 734968, 735752, 736371, 736859, 737259, 737903, 738143] +'CR0 4WH': [737725, 737740, 737753, 737770, 737782, 737793, 737800, 737966, 737977, 737989, 738002, 738015, 738026, 738037, 738044] +'CR2 0PA': [733576, 733587, 734837, 734849, 735626, 735635, 736247, 736255, 736757, 738783, 738903, 738944, 738984, 739008, 739036] +'CT18 7QP': [728372, 728602, 728803, 729567, 729773, 729965, 731149, 731277, 731389, 732513, 732591, 733167, 733250, 733325, 733395] +'DA1 5LY': [711435, 711447, 711538, 711545, 711553, 711560, 711569, 711647, 711655, 711661, 711668, 711673, 711735, 711741, 711745] +'DA9 9FW': [710303, 713549, 714331, 715065, 716112, 716595, 717069, 717925, 718335, 719328, 719717, 720069, 720394, 731845, 732832] +'E1 2PE': [712898, 713451, 716035, 716528, 716990, 717424, 717863, 719258, 719662, 720338, 720643, 720951, 727358, 729104, 732738] +'E1 2PY': [723128, 723129, 723139, 723155, 723167, 723404, 723408, 723418, 723419, 723665, 723668, 723669, 723672, 723674, 723676] +'E2 6LY': [714448, 716695, 717573, 720466, 721078, 722165, 722710, 725991, 726646, 727601, 728263, 728914, 729672, 730064, 730247] +'E2 7AQ': [714355, 715094, 716128, 717091, 718347, 719344, 719731, 720409, 720716, 721016, 721321, 722592, 729240, 730715, 731872] +'GU28 0EX': [713715, 714507, 716242, 717202, 717613, 720505, 721664, 721923, 723090, 723364, 723635, 725596, 730871, 732037, 733025] +'GU28 0EZ': [716637, 723577, 724842, 725782, 727532, 733880, 734159, 734948, 735415, 735509, 735551, 736355, 737603, 737888, 738132] +'GU29 9PG': [713236, 713729, 714521, 715233, 716253, 716748, 718455, 719453, 719837, 720177, 720511, 735776, 736398, 736880, 737289] +'GU31 5QW': [728167, 735604, 735931, 735983, 736166, 736233, 736482, 740362, 740386, 740408, 740429, 740451, 740472, 740491, 740539] +'ME1 1GX': [711782, 711834, 711871, 711905, 711931, 711950, 711970, 712077, 712200, 712298, 712392, 712478, 712547, 712597, 712642] +'ME16 9DZ': [711774, 711777, 712069, 712071, 712193, 712195, 712291, 712293, 712385, 712387, 712469, 712471, 712540, 712591, 712637] +'ME20 7GP': [709957, 710028, 710204, 711599, 711704, 713548, 715618, 716111, 717067, 717488, 717924, 718334, 719327, 729211, 730677] +'ME2 2GA': [712917, 714267, 716054, 716544, 717010, 717438, 717882, 718778, 719275, 725301, 727384, 729131, 730608, 731771, 732761] +'N1 7DH': [717226, 717636, 718065, 718469, 719469, 719851, 720187, 720523, 720813, 721135, 721412, 721677, 721939, 722217, 723102] +'N7 9EX': [714296, 715590, 716563, 717456, 720367, 720976, 722086, 722504, 723263, 724611, 724987, 725943, 727413, 730639, 732793] +'NW10 8HQ': [728667, 728870, 729843, 730029, 730217, 730376, 731053, 731203, 731324, 731439, 731560, 732192, 732298, 732394, 732500] +'PO10 8BE': [711985, 712171, 712432, 733749, 734075, 734683, 734815, 735206, 735430, 735608, 735795, 735933, 736021, 736099, 736168] +'PO10 8NY': [717560, 718394, 721065, 722155, 724269, 724666, 725046, 726919, 728907, 729667, 730060, 731223, 734545, 734546, 734547] +'PO18 0DF': [713312, 713773, 714569, 715283, 715769, 716292, 716785, 717245, 717654, 718082, 722874, 727765, 729492, 730933, 732106] +'PO18 0EG': [713240, 713730, 715236, 716257, 716750, 717214, 717624, 719101, 722806, 725615, 727701, 729436, 730885, 732051, 733042] +'PO19 1DE': [713790, 718089, 733435, 734539, 734541, 734543, 734620, 734621, 734622, 734624, 734626, 734687, 734690, 734692, 734694] +'PO19 6AN': [713510, 715025, 716078, 718822, 722509, 725339, 729174, 729544, 738817, 738874, 738886, 738898, 739015, 739068, 739099] +'PO19 7BD': [733861, 734921, 735708, 736328, 736819, 737217, 737582, 737864, 738114, 738816, 738842, 738873, 738880, 738885, 738891] +'PO19 8DE': [717475, 718321, 720386, 720997, 721555, 722102, 723279, 723783, 724229, 729196, 731833, 733669, 734487, 735717, 737590] +'PO20 0PA': [713087, 713621, 715136, 715659, 716169, 716658, 717123, 718947, 719384, 724036, 724460, 726471, 727037, 727553, 730764] +'PO20 1AG': [709943, 710017, 710136, 710190, 710248, 710730, 710957, 711167, 711322, 711467, 711582, 711790, 711839, 712083, 712647] +'PO20 2ET': [714188, 716928, 717807, 718662, 719207, 719966, 720286, 720597, 721484, 722022, 722360, 725704, 726971, 729022, 731674] +'PO20 8AY': [713101, 713633, 714417, 715147, 716180, 716669, 717134, 718963, 722671, 725482, 727569, 729317, 730775, 731936, 732918] +'PO20 8AZ': [709806, 710026, 710261, 710300, 710348, 710430, 711483, 711955, 712211, 712308, 712489, 712605, 712654, 734486, 736827] +'PO21 5BQ': [710988, 714389, 716157, 716644, 717112, 717965, 718935, 722640, 727538, 729281, 731910, 733883, 734162, 737607, 738135] +'PO2 7RB': [724462, 724526, 724849, 724919, 725790, 725871, 726153, 726211, 726473, 726534, 726782, 726832, 727039, 727087, 727865] +'PO5 3AQ': [733662, 733863, 734025, 734144, 734364, 734482, 734574, 734923, 735710, 736330, 736821, 737219, 737584, 737866, 738116] +'RH1 2AY': [710283, 713308, 713770, 714565, 715278, 716288, 716783, 719153, 722870, 725672, 727762, 729489, 730930, 732104, 733089] +'RH13 9GF': [726419, 726735, 726998, 727114, 727820, 727971, 728105, 728220, 728331, 728443, 728558, 728666, 728769, 728869, 729635] +'RH14 0NA': [726349, 727071, 737145, 737352, 737396, 737413, 737450, 737472, 737483, 737498, 737711, 737724, 737739, 737752, 737769] +'RH1 6GB': [711458, 712790, 714176, 716452, 717361, 718211, 719605, 720276, 720906, 721478, 722014, 722348, 723205, 727265, 732658] +'SE10 0AB': [726570, 726859, 727958, 728088, 728205, 728318, 728537, 728753, 729521, 729625, 729723, 730014, 730206, 730365, 741343] +'SE14 5FN': [712040, 712042, 712044, 712045, 712046, 712047, 712048, 712049, 712050, 712051, 712052, 712053, 712054, 712055, 712056] +'SE15 6RB': [721438, 721693, 721695, 721698, 721700, 721705, 721957, 735044, 735814, 736430, 736908, 737316, 737656, 737948, 738189] +'SE18 4PT': [712582, 712583, 730032, 730220, 730294, 731442, 731499, 731562, 732137, 737505, 737669, 737698, 737731, 737746, 737760] +'SE20 8TZ': [710951, 711318, 711786, 711836, 711952, 711971, 711990, 712080, 712203, 712302, 712395, 712482, 712550, 712599, 712644] +'SE25 6LB': [739513, 739534, 739568, 739594, 739617, 739640, 739661, 739751, 739911, 740005, 740072, 740117, 740146, 740174, 740201] +'SE8 3AG': [715006, 717020, 717892, 719286, 720035, 720670, 722978, 723523, 723982, 724415, 725745, 726742, 728562, 729539, 729943] +'SO16 8FR': [711392, 711425, 711548, 729707, 729812, 729910, 729992, 730268, 731178, 731303, 731415, 731473, 732172, 733300, 733416] +'SO31 8JA': [710282, 713767, 715275, 716285, 718079, 719146, 719481, 720202, 720828, 721956, 723118, 723663, 725668, 729485, 732100] +'BN11 5DT': [712426, 712574, 733727, 733911, 734061, 734191, 734288, 734397, 734511, 734603, 734992, 735772, 736393, 737284, 737920, 738161] +'BN1 1XF': [733588, 733820, 733984, 734103, 734242, 734334, 734451, 734550, 734850, 735636, 736256, 736758, 737164, 737531, 737813, 738063] +'BN1 4ZH': [733639, 733842, 734006, 734124, 734257, 734348, 734469, 734562, 734895, 735684, 736302, 736797, 737196, 737561, 737844, 738093] +'BN8 5LW': [709899, 709975, 710051, 711009, 711367, 711626, 713205, 715720, 716235, 716730, 717196, 719068, 722776, 727669, 730858, 733014] +'BR3 1HH': [739526, 739548, 739582, 739606, 739629, 739651, 739671, 739690, 739765, 739926, 740018, 740087, 740130, 740161, 740188, 740217] +'BR6 0NN': [733596, 733821, 733986, 734105, 734244, 734336, 734453, 734857, 735643, 736262, 736763, 737169, 737535, 737816, 738066, 738895] +'CR0 2SG': [712239, 712627, 733784, 733936, 734082, 734211, 734299, 734414, 734530, 734619, 735046, 736431, 736909, 737318, 737657, 738190] +'DA11 9FB': [738441, 738448, 738469, 738475, 738485, 738494, 738504, 738513, 738522, 738528, 738535, 738542, 738559, 738566, 738573, 738579] +'E1 0LN': [715513, 716923, 717368, 719610, 720280, 721206, 721482, 721741, 722018, 723458, 723937, 724152, 729015, 730500, 731667, 732664] +'E1 5DA': [713419, 714938, 716005, 716960, 717841, 718715, 719235, 719993, 720622, 721229, 721762, 722931, 723477, 725237, 729066, 731714] +'E2 0BG': [715032, 715598, 716083, 716571, 717463, 718308, 719693, 720985, 721289, 721813, 722093, 722515, 722990, 723270, 725347, 730650] +'E2 6ND': [713200, 714492, 715213, 715715, 716233, 717194, 717603, 718038, 719062, 719819, 725576, 727663, 729402, 730854, 732021, 733010] +'GU29 9PQ': [733694, 733887, 734044, 734167, 734278, 734379, 734497, 734734, 734957, 735190, 735251, 735310, 736363, 737253, 737896, 738138] +'ME12 3UF': [710163, 710272, 710310, 710356, 710384, 710499, 710528, 710560, 710586, 710614, 710629, 710644, 710661, 710706, 710840, 710875] +'ME4 6PG': [711684, 712791, 713372, 714177, 714892, 715958, 716453, 716917, 717362, 718653, 722349, 725175, 727266, 729007, 730494, 731659] +'MK10 9SF': [712209, 733656, 733858, 734019, 734140, 734265, 734360, 734478, 734569, 734917, 736324, 736815, 737214, 737578, 737860, 738110] +'N1 8PT': [733574, 733584, 734177, 734593, 734739, 734836, 734845, 735257, 735366, 735624, 735631, 736245, 736252, 736748, 736755, 737162] +'NW10 8NY': [728797, 729560, 729769, 729962, 730148, 730313, 730989, 731146, 731273, 731386, 731512, 732359, 732461, 732547, 733116, 733214] +'PE3 8EQ': [709956, 710431, 711192, 711484, 711702, 712970, 713532, 715048, 715607, 716095, 716578, 717051, 722531, 725363, 729193, 731831] +'PO12 1HE': [733969, 733976, 737363, 737406, 737429, 737687, 737702, 737719, 737762, 737779, 737986, 737998, 738010, 738021, 738032, 738236] +'PO18 0HT': [714181, 714895, 715511, 716455, 717364, 717798, 719200, 719607, 719962, 720278, 722353, 725179, 727270, 729011, 731663, 732662] +'PO18 8HH': [710795, 711818, 712109, 712886, 716027, 716522, 720330, 720946, 722055, 722439, 723740, 724188, 724970, 725919, 727348, 730577] +'PO19 6PB': [713833, 713917, 713978, 714616, 714679, 714776, 714812, 715330, 726199, 727077, 727902, 728396, 728626, 732522, 733257, 733333] +'PO19 6SY': [735964, 736052, 736123, 736467, 736533, 736594, 736651, 736705, 736937, 736984, 737031, 737078, 737121, 737344, 737388, 737703] +'PO19 7HQ': [712972, 717915, 718320, 718850, 719315, 719705, 720057, 720385, 720694, 720996, 723000, 723543, 729195, 730668, 732819, 733868] +'PO19 8AH': [723014, 724633, 725768, 726128, 726297, 727021, 728243, 728584, 729654, 729759, 729856, 730044, 730391, 731065, 731214, 731331] +'PO20 2DN': [713204, 713704, 714497, 715215, 716729, 717604, 718040, 719067, 719823, 720164, 720496, 720793, 721111, 721394, 721660, 727668] +'RH12 5YD': [710708, 711628, 713723, 714516, 715229, 715735, 716746, 718052, 719092, 719452, 720175, 721403, 721668, 722796, 729427, 733035] +'RH1 2BF': [709797, 710142, 713497, 714287, 715011, 716557, 717024, 717451, 718802, 722493, 725323, 727402, 729153, 730629, 731797, 732783] +'RH15 8NY': [712013, 712229, 733721, 733907, 734058, 734187, 734415, 734508, 734601, 734986, 736387, 736874, 737278, 737629, 737915, 738157] +'RH20 1HZ': [730223, 730298, 730380, 730976, 736958, 736980, 737002, 737028, 737096, 737117, 737341, 737361, 737385, 737405, 737443, 737463] +'RH6 9EY': [710850, 721243, 721771, 722943, 723958, 724182, 724392, 724581, 724777, 724965, 725726, 725913, 726077, 726248, 726404, 726572] +'SE11 5TY': [722033, 723466, 724163, 724374, 724561, 724760, 724950, 726233, 726557, 726976, 727097, 727798, 728196, 728311, 728421, 728529] +'SE1 1AP': [734760, 735085, 735151, 735211, 735274, 735328, 735386, 735433, 735523, 735525, 735569, 735845, 735893, 735938, 736024, 736025] +'SE14 5FX': [712683, 712689, 712695, 712701, 712705, 712710, 712715, 712718, 712722, 712726, 712730, 712734, 712736, 712738, 712739, 712740] +'SE14 6QQ': [710397, 717733, 717761, 718559, 718570, 719911, 719921, 719934, 726688, 726954, 726958, 728294, 728295, 728297, 730091, 730095] +'SE16 3PN': [738789, 738800, 738813, 738839, 738857, 738863, 738871, 738879, 738910, 738951, 738990, 739013, 739043, 739066, 739087, 739097] +'SE1 7JR': [741056, 741058, 741099, 741100, 741122, 741123, 741147, 741148, 741179, 741180, 741207, 741208, 741226, 741227, 741243, 741244] +'SE26 6XQ': [712975, 713536, 714320, 715052, 715610, 716100, 716583, 717057, 718854, 722537, 725368, 727446, 729199, 730670, 731835, 732822] +'SE7 8UH': [733774, 733934, 734079, 734208, 734297, 734412, 734528, 734617, 735036, 735811, 736424, 736904, 737313, 737654, 737945, 738186] +'SE9 6RJ': [711057, 713164, 714467, 715696, 717584, 718414, 719799, 722176, 722740, 723337, 723845, 725061, 727168, 728019, 728482, 728916] +'SO15 3DJ': [713089, 713622, 714407, 715137, 715660, 716171, 716660, 717126, 718950, 722659, 725471, 727556, 729302, 730766, 731927, 732906] +'SO18 5LA': [713223, 713717, 714509, 715224, 715727, 716244, 716738, 717203, 719083, 733027, 741140, 741165, 741196, 741221, 741238, 741253] +'SW8 1BD': [712915, 715568, 716052, 716542, 717007, 717879, 718775, 719272, 720022, 720351, 720654, 720960, 725297, 729128, 730606, 731768] +'SW9 0AD': [718910, 724525, 724531, 724917, 724922, 724924, 725869, 725873, 733768, 733772, 733778, 733779, 733781, 735032, 735042, 735048] +'BN3 5GF': [733503, 733504, 733505, 733524, 733525, 733526, 733530, 733531, 733532, 733535, 733536, 733541, 733542, 733546, 733547, 733551, 733555] +'BR5 2PJ': [712988, 718332, 719325, 719716, 720066, 720393, 720702, 721002, 721310, 721567, 721831, 722110, 723005, 723288, 723550, 723789, 724437] +'CT1 1JZ': [713068, 715119, 715650, 716154, 716641, 717110, 718932, 722638, 725449, 733875, 734033, 734662, 736837, 737237, 737596, 737878, 738125] +'CT5 1SW': [709859, 710016, 710134, 710245, 710340, 711433, 711446, 715733, 716745, 717619, 718453, 719225, 719835, 720510, 721124, 721667, 722205] +'DA1 2GF': [725920, 726084, 726254, 726410, 726577, 738474, 738484, 738493, 738503, 738512, 738521, 738527, 738534, 738541, 738558, 738565, 738572] +'DA1 2NF': [721739, 722016, 722910, 723456, 723710, 723935, 724150, 724548, 724752, 724939, 729612, 729710, 729817, 729916, 735899, 736104, 738710] +'E1 5EZ': [713610, 715120, 715651, 716642, 717526, 717963, 719754, 720432, 721862, 724031, 724650, 724843, 725033, 725783, 725975, 726146, 729278] +'E2 6FR': [712945, 713502, 714294, 715017, 715589, 716072, 716560, 717028, 717453, 718809, 722499, 725331, 727409, 729162, 730635, 731805, 732790] +'GU27 3PA': [730058, 730242, 730314, 730404, 730990, 731074, 731147, 731513, 731575, 732205, 732310, 732511, 732548, 732588, 733117, 733165, 733182] +'GU29 9HR': [740244, 740273, 740301, 740328, 740352, 740369, 740392, 740414, 740435, 740498, 740665, 740783, 740837, 740877, 740915, 740943, 740973] +'GU29 9HS': [740266, 740294, 740321, 740345, 740363, 740387, 740409, 740430, 740452, 740521, 740689, 740805, 740860, 740900, 740937, 740966, 740995] +'GU29 9TH': [713199, 717193, 717602, 718036, 719061, 719436, 720790, 721108, 722771, 725575, 727662, 729401, 732020, 733007, 734059, 734394, 734509] +'GU31 5LQ': [713753, 727728, 729466, 736019, 736097, 736140, 736512, 736572, 736603, 740556, 740571, 740584, 740597, 740610, 740623, 740635, 740647] +'GU6 7FY': [710934, 711048, 711066, 711083, 711092, 711100, 711110, 711132, 711243, 711261, 711276, 711288, 711303, 711381, 711394, 711406, 711423] +'ME10 4JL': [713660, 715175, 716200, 716688, 717159, 717569, 718002, 718398, 719403, 719787, 720463, 721074, 721623, 722161, 723326, 723830, 724271] +'ME15 6NS': [711813, 711853, 711890, 711919, 711941, 711962, 711981, 711999, 712012, 712106, 712226, 712324, 712421, 712507, 712570, 712619, 712667] +'ME7 1TD': [720934, 721508, 722045, 723228, 723731, 724177, 724577, 724962, 738621, 738629, 738639, 738646, 738653, 738666, 738670, 738676, 738682] +'ME9 9SS': [713604, 715113, 719747, 720426, 723310, 723808, 724254, 724647, 725030, 726310, 726628, 726906, 727151, 728000, 728252, 728898, 729659] +'NW10 8HF': [739222, 739231, 739243, 739252, 739261, 739270, 739279, 739288, 739297, 739322, 739391, 739424, 739439, 739448, 739457, 739466, 739475] +'NW10 8UW': [713762, 716280, 717238, 719137, 720823, 723112, 723658, 724103, 724507, 725656, 725838, 726522, 726823, 727075, 729477, 732093, 738599] +'PO10 8TH': [715653, 717116, 717529, 717968, 719375, 719759, 723035, 723581, 724033, 724455, 725785, 726469, 726778, 727035, 728364, 729286, 731914] +'PO10 8UR': [718281, 719670, 720347, 720958, 721530, 722068, 723748, 735450, 735539, 735863, 735955, 736043, 736116, 736182, 736461, 736527, 736588] +'PO19 3NH': [712813, 713387, 714195, 714911, 715521, 715974, 716463, 716933, 717376, 718669, 722366, 725194, 727283, 729028, 730512, 731680, 732675] +'PO19 3NW': [713503, 715018, 716073, 717029, 717899, 718810, 719294, 720039, 720673, 721282, 721808, 722983, 723528, 723989, 724418, 725333, 729163] +'PO19 7AR': [737432, 737449, 737468, 737481, 737495, 737513, 737675, 737690, 737708, 737722, 737736, 737751, 737765, 737781, 737791, 737799, 737975] +'PO19 8FA': [713281, 719131, 722849, 724711, 724903, 725090, 725650, 727185, 727741, 727899, 728040, 735378, 735427, 735477, 735518, 735564, 735605] +'PO20 7DX': [713491, 716065, 717446, 717890, 719681, 720031, 720360, 720971, 721276, 721804, 722080, 722483, 723256, 723980, 724204, 725314, 729147] +'PO3 6DS': [712777, 713361, 714167, 714880, 716442, 717352, 718204, 718638, 719600, 720272, 722334, 725160, 727256, 728995, 730484, 731650, 732651] +'PO5 4BZ': [711815, 711856, 711894, 711922, 711942, 711964, 711982, 712000, 712014, 712107, 712230, 712327, 712425, 712510, 712573, 712622, 712670] +'RH10 6GH': [711803, 711848, 711884, 711914, 711937, 711958, 711977, 711996, 712009, 712095, 712217, 712315, 712413, 712496, 712561, 712611, 738133] +'RH12 5YR': [710169, 710688, 710707, 710876, 710896, 711008, 711513, 711623, 713697, 714484, 716722, 719055, 721652, 723080, 724488, 724686, 727654] +'RH1 2BP': [739516, 739537, 739571, 739596, 739620, 739642, 739663, 739682, 739701, 739754, 739915, 740008, 740076, 740120, 740150, 740177, 740205] +'RH19 2SG': [710214, 713172, 713681, 714471, 715193, 716219, 717176, 717587, 718017, 718416, 719035, 722746, 725550, 727631, 729373, 730828, 732981] +'SE10 9PF': [710827, 710915, 714992, 717011, 720875, 721444, 721454, 723249, 724524, 724530, 725302, 726418, 726734, 727819, 728104, 741330, 741333] +'SE11 5RW': [713508, 716077, 716566, 717033, 717458, 717903, 718819, 719687, 720042, 720371, 720676, 720979, 721286, 722508, 727417, 730642, 732797] +'SE11 5TP': [713775, 713841, 713922, 713982, 714053, 714078, 714574, 714596, 714657, 714684, 714780, 715287, 715308, 715366, 715380, 733418, 733445] +'SE12 9QE': [721532, 722070, 723247, 723750, 724196, 724593, 724977, 725930, 726264, 726586, 726873, 727113, 727970, 728219, 728442, 728665, 728868] +'SE14 6DN': [718037, 718437, 719437, 719818, 720161, 720495, 720791, 721109, 721658, 722193, 723085, 723630, 723861, 724083, 724292, 724688, 724888] +'SE18 1BJ': [712962, 714310, 715601, 717470, 718314, 719701, 720378, 720992, 722098, 723275, 723780, 724622, 724996, 727434, 729549, 730658, 732812] +'SE18 4AB': [711788, 711838, 711907, 711932, 712398, 712480, 712551, 712646, 718648, 722342, 734002, 734892, 735678, 736297, 736783, 737191, 737841] +'SE22 9AE': [713202, 714832, 714847, 715463, 715476, 715922, 715928, 716728, 719065, 722775, 725578, 728954, 728963, 731609, 731619, 732615, 732623] +'SE3 9XN': [713013, 713566, 714344, 715085, 715626, 716124, 716609, 717085, 717498, 717940, 718884, 722574, 725404, 727484, 729229, 730701, 731859] +'SE5 0TU': [709966, 713128, 713653, 715168, 715677, 716196, 718994, 722701, 725506, 727590, 729336, 730797, 731962, 732946, 738414, 738426, 738433] +'SE8 5JG': [728621, 728821, 729591, 729795, 729977, 730168, 730330, 731009, 731162, 731292, 731401, 731526, 732269, 732368, 732556, 733127, 733223] +'SO14 0PR': [714067, 714588, 714647, 714694, 714747, 714789, 715299, 715343, 715373, 715407, 733572, 734834, 735623, 736243, 736747, 737159, 737524] +'SO14 5AD': [712986, 713545, 714328, 715062, 715617, 716110, 718865, 719324, 719715, 720065, 722550, 725382, 727460, 729209, 730675, 731844, 732830] +'SO19 2NX': [710692, 721958, 721959, 721960, 733714, 733901, 734054, 734182, 734298, 734980, 735762, 736381, 736869, 737272, 737622, 737910, 738151] +'SO19 8NB': [718102, 718114, 718135, 718152, 718492, 718501, 718514, 718528, 718541, 719486, 719506, 719522, 719538, 719550, 719875, 719879, 719880] +'SW9 0AH': [733761, 733780, 733787, 733789, 733795, 733812, 735027, 735043, 735045, 735050, 735052, 735060, 735805, 735816, 735824, 735826, 735843] +'SW9 0RR': [733794, 733796, 733798, 733802, 733804, 735054, 735056, 735062, 735063, 735067, 735071, 735075, 735818, 735825, 735827, 735831, 735836] +'SW9 0RX': [715728, 716246, 716739, 717205, 717615, 718048, 718449, 720172, 720506, 721398, 721665, 723365, 724299, 725599, 729419, 730874, 733029] +'SW9 9HG': [712809, 713385, 715516, 715970, 716460, 716930, 717371, 717809, 718218, 718665, 719209, 719613, 719967, 720598, 730507, 731677, 732670] +'BN11 5RW': [733711, 733897, 734052, 734179, 734388, 734502, 734595, 734672, 734741, 734803, 734976, 735759, 736378, 736866, 737267, 737621, 737907, 738148] +'BN18 0BW': [726710, 726974, 728644, 728849, 729617, 730357, 731034, 731186, 731310, 731362, 731423, 731542, 732176, 732283, 732383, 732491, 732572, 733141] +'BN2 3AN': [739531, 739554, 739588, 739612, 739633, 739657, 739677, 739696, 739713, 739730, 739771, 739932, 740024, 740093, 740136, 740167, 740194, 740223] +'CT5 1SY': [711267, 711281, 711294, 711306, 711387, 711403, 711419, 711430, 711444, 711530, 711541, 711552, 711557, 711563, 711643, 711652, 711658, 711665] +'DA11 8EA': [709873, 715033, 716084, 717040, 717905, 719301, 720046, 720680, 721290, 721814, 723271, 723773, 724219, 724616, 724991, 725948, 726280, 726598] +'DA1 5JQ': [715423, 715448, 715795, 715833, 715861, 715883, 715911, 716312, 716339, 716365, 716388, 716408, 716806, 716827, 716847, 716862, 716882, 717260] +'E1 5HF': [712785, 713370, 714174, 714889, 716450, 717794, 718647, 719196, 720591, 720904, 721475, 721736, 723707, 724148, 724364, 724546, 724937, 731656] +'E2 6QP': [713531, 714315, 716094, 716577, 717049, 717473, 717912, 718847, 719703, 720383, 720692, 722530, 725361, 727442, 729191, 730666, 731829, 732817] +'E2 6QR': [712783, 713368, 714172, 714887, 715509, 715955, 716449, 716915, 717357, 717791, 718644, 722338, 725166, 727260, 729001, 730488, 731654, 732656] +'ME15 7SY': [712876, 713434, 714233, 714952, 715548, 716016, 716508, 716974, 717407, 717850, 718736, 722424, 725255, 727335, 729084, 730564, 731730, 732721] +'ME20 7FH': [709826, 709895, 709970, 710047, 710109, 710165, 710213, 710274, 710312, 710359, 710454, 710778, 711000, 711219, 711359, 711507, 711619, 711715] +'ME20 7GQ': [709937, 710001, 710069, 710071, 710075, 714029, 714061, 714579, 714609, 714642, 714668, 714691, 714716, 714740, 714786, 714802, 715295, 715318] +'ME2 2FU': [709824, 709893, 709968, 710045, 710108, 710164, 710212, 710273, 710311, 710357, 710452, 710775, 710997, 711216, 711357, 711505, 711618, 711714] +'NW10 8GY': [739220, 739229, 739241, 739250, 739259, 739268, 739277, 739286, 739295, 739304, 739320, 739389, 739422, 739437, 739446, 739455, 739464, 739473] +'PE2 8FF': [711797, 711879, 712033, 733869, 734149, 734367, 734488, 734577, 734659, 734724, 734930, 735718, 736337, 736828, 737226, 737591, 737872, 738120] +'PE3 6BT': [710060, 710593, 710632, 710691, 713265, 715748, 717637, 718067, 718470, 719852, 720189, 722219, 722831, 723384, 723651, 727722, 729460, 733062] +'PO19 3NP': [720975, 721544, 722085, 723262, 723765, 724211, 724609, 724986, 725942, 726274, 734022, 734267, 735178, 735300, 735706, 736817, 737580, 738112] +'PO19 7QS': [729518, 729621, 730008, 730112, 730201, 730278, 730362, 730956, 731115, 731190, 731314, 731365, 731425, 731483, 731547, 732178, 732287, 732336] +'PO19 8AX': [725767, 726127, 727850, 728583, 729758, 730306, 731382, 735963, 736051, 736122, 736189, 737437, 737465, 737788, 737961, 737987, 737992, 738011] +'PO20 2JF': [723761, 723984, 724208, 724606, 725747, 725939, 726102, 726272, 726429, 726593, 726744, 726880, 727005, 727122, 727829, 728448, 728566, 729743] +'RH11 7UP': [710159, 710210, 710352, 710768, 713111, 713639, 714423, 715154, 715670, 717144, 717553, 718389, 718975, 725491, 727577, 730781, 731947, 732928] +'RH14 0SR': [721606, 723043, 724658, 725038, 725981, 726474, 735192, 735311, 735363, 736623, 736655, 736710, 736733, 736942, 736962, 737101, 737124, 737142] +'SE11 5RN': [712835, 714210, 714923, 715534, 715992, 716483, 717390, 717827, 718242, 719634, 719983, 720302, 720614, 722389, 725216, 730534, 731695, 732692] +'SE14 6EQ': [713256, 713741, 714531, 715247, 715745, 716760, 717223, 717634, 718064, 719116, 722819, 725631, 727714, 729454, 730899, 732067, 733055, 741304] +'SE15 5GD': [710812, 713524, 715039, 716090, 717045, 717907, 719306, 720051, 720688, 721297, 721819, 722523, 723536, 724001, 724428, 724813, 727433, 730657] +'SE18 1RX': [711331, 712936, 713492, 714283, 715007, 715583, 716066, 716554, 717021, 717448, 717893, 718796, 722488, 725319, 727397, 730625, 731792, 732779] +'SE19 3AA': [710398, 717758, 717764, 718170, 718178, 718184, 718555, 719567, 719573, 719578, 719918, 719931, 719937, 719940, 723459, 723686, 723691, 723696] +'SE20 8AX': [710599, 714834, 714849, 714856, 716888, 717748, 717760, 718557, 718568, 719919, 719938, 719941, 721182, 721186, 721187, 721717, 721942, 723177] +'SE5 0BJ': [733659, 733859, 734021, 734141, 734571, 734653, 734719, 734784, 735112, 735350, 735407, 735453, 735497, 735541, 735705, 736326, 737862, 738111] +'SO16 5SD': [709912, 709920, 713805, 713886, 713925, 713946, 713953, 713987, 714020, 714057, 714086, 714576, 714602, 714636, 714662, 733379, 733423, 733450] +'SO19 9DA': [710552, 712186, 713550, 715066, 716113, 717070, 717926, 719329, 720705, 721312, 725385, 727216, 727228, 729212, 730443, 731846, 733580, 734842] +'BR6 0FB': [711767, 711827, 711866, 712002, 712017, 712063, 712143, 712152, 712160, 712166, 712172, 712177, 712240, 712287, 712382, 712465, 712538, 735213, 735276] +'CR0 1FR': [710464, 711015, 711629, 711779, 711831, 711869, 711903, 711929, 711948, 711969, 711988, 712073, 712197, 712295, 712389, 712474, 712543, 712593, 712639] +'CT20 2QH': [712760, 713345, 714152, 714866, 715495, 715939, 716434, 716899, 717341, 717773, 718619, 722317, 725143, 727243, 728978, 730471, 731634, 732533, 732637] +'DA14 6LR': [712743, 738507, 738515, 738523, 738529, 738536, 738544, 738561, 738568, 738622, 738626, 738631, 738636, 738802, 738840, 738926, 739103, 739104, 739109] +'DA2 7WT': [710500, 713150, 713670, 714457, 715184, 716209, 716701, 717166, 717579, 718008, 718408, 719016, 722723, 725532, 727615, 729356, 730815, 731981, 732965] +'DA8 1AP': [711650, 728038, 728168, 728286, 728393, 728496, 728623, 728715, 728823, 728932, 729594, 729687, 729798, 732270, 732320, 732423, 732475, 732521, 732558] +'GU29 9PH': [713728, 714520, 715232, 715737, 716747, 717212, 717621, 718054, 718454, 719836, 720176, 721125, 721929, 722803, 723095, 723641, 725612, 727697, 733039] +'N7 9EG': [724397, 724783, 726083, 726409, 726987, 728092, 728323, 729526, 729729, 730961, 731123, 731252, 731488, 732340, 732448, 732535, 733105, 733201, 733345] +'NW10 8NN': [713183, 714481, 715708, 716717, 717593, 718425, 719806, 720486, 721102, 721648, 722184, 722759, 723345, 723853, 724684, 725066, 727644, 730840, 738771] +'NW10 8RH': [713455, 714974, 716037, 716994, 717865, 718757, 719260, 720013, 725275, 729108, 731747, 735344, 735448, 735953, 736040, 736114, 736179, 736458, 736525] +'NW10 8RU': [714121, 714131, 714134, 714137, 714140, 714142, 714144, 714146, 715274, 722284, 722295, 722300, 722303, 722304, 722305, 722306, 722307, 729482, 732097] +'PE3 9YA': [710194, 710293, 710417, 710576, 711326, 714251, 714971, 716991, 720644, 721258, 721783, 722059, 722447, 722956, 724398, 724785, 725272, 726412, 727359] +'PO16 7NJ': [713460, 714258, 714980, 716041, 716532, 716999, 717429, 717870, 718763, 720344, 720650, 720956, 722460, 725282, 727371, 729115, 730593, 731752, 732749] +'PO19 3LX': [728134, 734166, 734586, 734733, 735126, 735250, 735362, 735554, 735878, 735971, 736059, 736130, 736194, 736471, 736536, 736708, 736940, 737252, 737895] +'PO19 6TS': [721101, 721382, 721647, 733906, 734186, 734286, 734393, 734507, 734675, 734745, 734805, 735198, 735262, 735767, 736386, 737277, 737628, 737914, 738156] +'RH12 3XJ': [710526, 710557, 710584, 710612, 710628, 710684, 710705, 710817, 710839, 710856, 710874, 710910, 710918, 710931, 710939, 711041, 711055, 711073, 711088] +'SE10 9FG': [712959, 713523, 714309, 715038, 715600, 716089, 718834, 719699, 720687, 721296, 722521, 723778, 724427, 725352, 727431, 729183, 730655, 731821, 732810] +'SE14 5AW': [713792, 713825, 713868, 713910, 713941, 713971, 714002, 714040, 714068, 714102, 714589, 714620, 714622, 714624, 714626, 714628, 714630, 714631, 714632] +'SE14 5EY': [710845, 710880, 710903, 710923, 711031, 711064, 711091, 711108, 711130, 711380, 727790, 728074, 728304, 728522, 728737, 729711, 729919, 730103, 730274] +'SE26 4SL': [740257, 740285, 740312, 740337, 740357, 740378, 740400, 740421, 740443, 740464, 740483, 740512, 740679, 740797, 740851, 740891, 740928, 740957, 740986] +'SE4 1JL': [710236, 715835, 715863, 715887, 716295, 716315, 716341, 716370, 716399, 716789, 716810, 716830, 716849, 717249, 717263, 717278, 717290, 717302, 717656] +'SO16 7BP': [740240, 740269, 740297, 740324, 740349, 740365, 740388, 740410, 740432, 740453, 740473, 740494, 740661, 740779, 740833, 740873, 740911, 740940, 740969] +'SW4 6QJ': [712981, 714325, 715060, 715613, 716107, 717063, 717482, 717921, 718327, 718860, 719711, 720062, 720390, 720698, 721307, 721829, 725375, 731841, 732826] +'SW4 6SY': [712920, 713477, 714269, 714994, 715573, 716546, 717884, 718288, 718780, 720025, 720658, 720963, 721536, 721795, 722073, 727386, 729133, 730610, 732764] +'TN4 0BF': [710188, 712826, 713399, 714204, 714919, 716942, 717822, 718236, 718682, 719218, 719628, 719977, 722383, 725208, 727298, 729037, 730524, 731689, 732686] +'BN1 4AE': [712460, 733566, 733817, 733982, 734101, 734243, 734335, 734452, 734551, 734630, 734699, 734763, 734828, 735088, 735617, 736239, 736744, 737527, 737810, 738060] +'BN2 9NR': [710155, 711609, 713094, 713628, 714413, 715142, 715663, 716664, 717132, 717545, 717980, 718383, 718956, 719390, 722665, 725476, 727561, 729307, 730769, 732913] +'BR6 9AX': [709961, 711197, 713026, 713578, 715095, 715635, 716129, 716615, 717092, 717505, 717945, 718348, 718894, 719345, 722593, 725416, 729241, 730716, 731873, 732861] +'CT4 7DW': [709835, 709900, 709976, 710054, 710112, 710170, 710217, 710277, 710316, 710362, 710386, 710504, 710530, 710564, 711722, 712141, 712150, 712158, 712165, 719090] +'DA1 2GA': [710093, 710291, 710376, 710605, 714239, 714958, 716023, 716512, 716978, 717854, 719246, 719653, 720004, 720325, 720944, 721246, 724184, 724396, 726251, 726408] +'DA8 2PG': [709822, 710044, 710501, 713671, 714458, 715691, 716210, 716702, 717167, 717580, 718009, 718409, 719018, 722724, 725533, 727616, 729358, 730816, 731983, 732968] +'E1 0AZ': [715582, 717019, 718296, 719284, 720033, 720973, 721278, 721805, 722486, 723758, 723981, 724605, 724800, 725317, 725937, 726099, 726425, 727396, 730624, 731791] +'E14 7LQ': [709781, 709800, 709858, 709868, 710141, 710254, 710408, 710490, 710547, 710724, 710747, 710952, 711162, 711184, 711319, 711461, 711477, 711578, 711590, 711689] +'E2 7AH': [713435, 714953, 715549, 716018, 716509, 716975, 718261, 719242, 720000, 720322, 720629, 721772, 722050, 722426, 722944, 723491, 727337, 729087, 730566, 732724] +'GU29 9BG': [712914, 713469, 722467, 725294, 729125, 730602, 731762, 732756, 740247, 740275, 740302, 740329, 740501, 740668, 740786, 740840, 740880, 740918, 740946, 740976] +'N1 7FJ': [733605, 733827, 733990, 734110, 734249, 734456, 734553, 734633, 734701, 734765, 734864, 735092, 735651, 736270, 736770, 737174, 737195, 737540, 737823, 738073] +'NN2 7TB': [709990, 709993, 711739, 713798, 713880, 713949, 714014, 714081, 714708, 714757, 714796, 715311, 715350, 732381, 732489, 732569, 733138, 733304, 733372, 733446] +'NW10 8LG': [712930, 713488, 714279, 715004, 715579, 716063, 717888, 718292, 718793, 719678, 720030, 720665, 720969, 721273, 721801, 722077, 723253, 725312, 731789, 732776] +'NW10 8SD': [713167, 714468, 715698, 716708, 717586, 718415, 719800, 720479, 721093, 721639, 722177, 722742, 723338, 723846, 724280, 724679, 725062, 727627, 730823, 732977] +'PE1 5JF': [712894, 713448, 714969, 715558, 716032, 716526, 716988, 717423, 717861, 718273, 718753, 719256, 719661, 720337, 720641, 722445, 725270, 729101, 730583, 731742] +'PE2 8NL': [709855, 712799, 714182, 714897, 715960, 716456, 716920, 717365, 717800, 718213, 718658, 719201, 719608, 722354, 725181, 727271, 729013, 730498, 731665, 732663] +'PE2 9FD': [711861, 711863, 711864, 711899, 712523, 712528, 712534, 712630, 712632, 712676, 712682, 733956, 733966, 734087, 737796, 737971, 738040, 738213, 738223, 738235] +'PO1 1QS': [733666, 733867, 734029, 734148, 734366, 734485, 734576, 734658, 734723, 734789, 734927, 735116, 735182, 735714, 736334, 736824, 737223, 737588, 737870, 738119] +'PO12 1HD': [734028, 734147, 734484, 734657, 735353, 735457, 735913, 735959, 736003, 736047, 736082, 736153, 736186, 736498, 736648, 736674, 736982, 737005, 737029, 737097] +'PO12 1HF': [734088, 734091, 734093, 734097, 734216, 734217, 734226, 734230, 734234, 734307, 734311, 734314, 734317, 734324, 734327, 734424, 734436, 734441, 734534, 734538] +'PO19 6UJ': [731544, 732284, 736031, 736106, 736452, 736579, 736637, 736693, 736925, 736970, 737065, 737335, 737377, 737420, 737456, 737487, 737694, 737756, 737785, 737957] +'PO20 1PQ': [717554, 717987, 718976, 719776, 720125, 721355, 721611, 721882, 723046, 723595, 724045, 724855, 725492, 725795, 726158, 726479, 726787, 727044, 729323, 729565] +'PO6 4EY': [726852, 727100, 727951, 728200, 728425, 728648, 728853, 729365, 729620, 729827, 730006, 730200, 730361, 731482, 732118, 732234, 732335, 732442, 732531, 733103] +'RH12 4ND': [710265, 714402, 715132, 716167, 716653, 717536, 717972, 718376, 719382, 719763, 720111, 720444, 720747, 721050, 721346, 721601, 721870, 722141, 723039, 723315] +'RH12 4NE': [710015, 712827, 713400, 714205, 715987, 716478, 716944, 717386, 717823, 718239, 718683, 719222, 719629, 722384, 725209, 727299, 729039, 730526, 731690, 732687] +'RH16 4TT': [709936, 710067, 710124, 713813, 713897, 713961, 714028, 714608, 714714, 714765, 715388, 715442, 715877, 716308, 716335, 716359, 716380, 716407, 733387, 733459] +'SE11 5SZ': [713042, 713588, 714364, 715103, 716140, 716623, 717953, 718352, 718908, 719353, 719735, 720725, 721023, 721580, 722124, 722610, 725431, 729253, 730730, 732868] +'SE11 5TU': [726763, 726896, 727020, 727139, 727849, 728122, 728242, 728353, 728460, 728509, 728786, 729554, 729757, 729952, 730137, 730305, 730389, 730982, 731063, 731213] +'SE15 6ND': [709864, 710251, 714955, 716019, 717851, 719244, 720003, 721245, 721774, 722946, 723493, 723961, 724394, 724779, 725728, 726079, 726406, 726723, 729088, 731733] +'SE15 6QX': [712905, 722458, 723241, 723745, 724192, 724588, 724973, 725926, 726258, 726582, 726869, 727111, 727369, 727967, 728216, 728438, 728662, 728866, 730591, 732747] +'SE3 9QS': [711429, 713788, 713865, 713938, 714000, 729561, 729770, 729963, 730315, 731148, 731275, 731387, 731514, 732259, 732360, 732462, 733118, 733216, 733356, 733434] +'SW4 6QS': [713381, 714904, 715514, 716459, 716926, 717013, 717369, 717805, 718217, 719204, 719612, 719965, 720283, 720596, 725187, 727276, 729021, 730504, 731673, 732668] +'SW9 9HN': [738795, 738804, 738819, 738846, 738860, 738868, 738876, 738882, 738888, 738893, 738900, 738916, 738922, 738956, 738998, 739020, 739049, 739072, 739090, 739102] +'TN1 2PW': [711636, 713749, 715254, 716271, 717228, 729458, 739792, 739823, 739851, 739877, 739901, 739946, 739961, 739974, 739987, 739999, 740034, 740046, 740054, 740062] +'CR5 3FX': [709965, 710042, 710107, 710161, 710270, 710308, 710353, 710383, 710446, 710498, 710527, 710558, 710585, 710613, 710643, 710685, 710818, 710857, 710992, 711352, 711614] +'CR7 6BD': [711859, 711923, 712015, 728281, 733737, 734067, 734291, 734402, 734518, 734610, 734749, 734809, 735004, 735136, 735784, 736405, 736887, 737293, 737639, 737929, 738169] +'CR7 8NE': [711772, 711773, 711828, 711867, 711901, 711927, 711946, 711967, 711986, 712003, 712018, 712067, 712068, 712191, 712192, 712290, 712384, 712468, 712539, 712590, 712636] +'CT19 5QF': [713457, 714255, 714978, 716040, 716530, 716997, 717427, 717868, 718278, 719263, 719665, 720015, 720343, 720649, 722456, 725279, 727367, 729112, 730590, 731750, 732745] +'DA14 4AG': [740254, 740282, 740309, 740335, 740356, 740376, 740398, 740419, 740441, 740462, 740481, 740509, 740530, 740547, 740563, 740676, 740794, 740848, 740888, 740954, 740983] +'GU27 3JX': [740258, 740286, 740313, 740338, 740358, 740379, 740401, 740422, 740444, 740465, 740484, 740513, 740532, 740549, 740680, 740798, 740852, 740892, 740929, 740958, 740987] +'GU29 9BJ': [714399, 715128, 716165, 716651, 717120, 717533, 717970, 718373, 719379, 720109, 721599, 729293, 732898, 733690, 734953, 735596, 735740, 735876, 735922, 735970, 736360] +'GU31 5LG': [714964, 716029, 716524, 716985, 717858, 719254, 720010, 720334, 720638, 720948, 721254, 721521, 724586, 724971, 725731, 731739, 732613, 733645, 734905, 735690, 736311] +'ME16 9EQ': [709879, 709960, 710030, 710103, 710151, 710205, 710263, 710304, 710761, 710979, 711196, 711341, 711490, 711602, 711707, 711761, 712057, 712182, 712282, 712377, 712461] +'N1 7FS': [712755, 713340, 714862, 715491, 715935, 716430, 716896, 717337, 717769, 718192, 718615, 719181, 719589, 719942, 722312, 725138, 727238, 728974, 730466, 731629, 732632] +'NW10 8NW': [713692, 715202, 717186, 718028, 719048, 719429, 720784, 721385, 721908, 723077, 723622, 724076, 724485, 724882, 725562, 725817, 726176, 726501, 729388, 732005, 738405] +'NW2 4NA': [738372, 738378, 738389, 738395, 738404, 738413, 738424, 738432, 738445, 738452, 738462, 738479, 738553, 738612, 738660, 738699, 738717, 738742, 738770, 738792, 738919] +'PE2 8QX': [739529, 739552, 739586, 739610, 739632, 739655, 739675, 739694, 739711, 739728, 739746, 739769, 739787, 739804, 739930, 740022, 740091, 740134, 740165, 740192, 740221] +'PO18 0EN': [714503, 716734, 717198, 717606, 718441, 719073, 719826, 720168, 720499, 721661, 721919, 722196, 723634, 724086, 724295, 724691, 725586, 727675, 732029, 735924, 736506] +'PO18 8SL': [712932, 713490, 717889, 719680, 720359, 720970, 721540, 722079, 722481, 722977, 723255, 723756, 724203, 724602, 724982, 725936, 726268, 727118, 728224, 730030, 730218] +'PO19 3AG': [712907, 713462, 714261, 714982, 715565, 716043, 716536, 717872, 718280, 718768, 719264, 719667, 720017, 720345, 720957, 721789, 722462, 725285, 727374, 731755, 732752] +'PO19 6SX': [733678, 734036, 734492, 735185, 735413, 735505, 735729, 735917, 736223, 736502, 736564, 736621, 736677, 736731, 736839, 737007, 737053, 737364, 737407, 737598, 738127] +'PO19 7HG': [715266, 716773, 717643, 718075, 721420, 721684, 721950, 722226, 723656, 723887, 724101, 724712, 733743, 733926, 735010, 735270, 735322, 735788, 736410, 737645, 738175] +'PO19 8AA': [713134, 713656, 718000, 719401, 719785, 720135, 720461, 721622, 731966, 732951, 734050, 734176, 734386, 734500, 734592, 734971, 735754, 736374, 736861, 737261, 737617] +'PO20 0PB': [712840, 716948, 718245, 718693, 719984, 720304, 720617, 722036, 722924, 723218, 723472, 723947, 724168, 724379, 724567, 724766, 724954, 725715, 725903, 726068, 730540] +'PO20 8LX': [713228, 714514, 716742, 719834, 720509, 721122, 723367, 724301, 724695, 726016, 726343, 726664, 726939, 727691, 728277, 729682, 730073, 731347, 731461, 731585, 733033] +'PO20 8LY': [713721, 715227, 716251, 717209, 718050, 719091, 719449, 720174, 720800, 723636, 724895, 726189, 726510, 727067, 727892, 728617, 728819, 729424, 729587, 729793, 732042] +'RH19 3EG': [711954, 711973, 711993, 712007, 712023, 712041, 712043, 712405, 733663, 733864, 734026, 734145, 734269, 734788, 734924, 735711, 736331, 737220, 737585, 737867, 738117] +'SE14 6EF': [710305, 714342, 715625, 716607, 718342, 719725, 720402, 721011, 721570, 722112, 722571, 723293, 723792, 724237, 724632, 725011, 725962, 726294, 727481, 730698, 732846] +'SE16 4BJ': [736121, 736156, 736188, 736222, 736466, 736500, 736531, 736593, 736619, 736649, 736703, 736729, 736936, 736983, 737006, 737030, 737052, 737077, 737098, 737120, 737139] +'SE8 5BH': [710434, 712991, 713551, 714332, 715067, 715619, 716114, 716596, 717071, 717489, 717927, 718336, 719330, 719718, 722553, 725386, 727465, 729213, 730680, 731847, 732835] +'SO14 1NW': [733614, 733805, 733939, 734084, 734213, 734873, 735076, 735657, 735837, 736277, 736443, 736773, 736917, 737177, 737326, 737543, 737663, 737677, 737826, 737953, 738192] +'SO14 6RD': [713413, 714113, 714933, 715456, 716000, 716411, 716954, 717315, 717836, 718163, 718703, 719232, 719561, 719989, 722278, 722291, 725230, 727208, 727225, 729057, 731708] +'SO17 2GN': [740250, 740277, 740304, 740346, 740354, 740371, 740394, 740431, 740437, 740458, 740492, 740504, 740526, 740543, 740671, 740789, 740843, 740883, 740921, 740949, 740978] +'SO21 3NH': [711361, 713682, 714472, 715194, 715699, 716220, 716709, 717177, 717588, 718018, 718417, 719036, 719418, 719801, 720148, 722747, 725551, 727632, 730829, 731995, 732982] +'SW4 6RS': [716163, 716649, 717531, 719377, 719760, 720108, 720441, 720745, 721048, 721869, 722649, 723038, 723583, 723815, 724457, 724653, 725462, 729291, 730757, 731918, 732895] +'SW9 9BN': [721974, 721976, 721978, 721979, 722241, 722242, 722244, 722247, 722248, 722249, 722250, 722251, 722252, 722253, 722254, 722255, 722257, 722258, 722259, 722260, 722261] +'CR0 4FF': [733824, 733989, 734109, 734248, 734339, 735091, 735155, 735216, 735279, 735331, 735848, 735896, 735941, 735989, 736027, 736211, 736449, 736487, 736515, 736551, 737819, 738070] +'CR0 4WG': [734814, 735139, 735205, 735272, 735324, 735380, 735429, 735479, 735520, 735566, 735607, 735890, 735932, 735984, 736020, 736068, 736098, 736141, 736167, 736206, 736234, 736483] +'CT1 1ZL': [710264, 710349, 710985, 711203, 711606, 713063, 713603, 714378, 715112, 715646, 716149, 716633, 717520, 718362, 718925, 719365, 719745, 720097, 722630, 729268, 730744, 732878] +'CT6 7SW': [713826, 713911, 713972, 714041, 714103, 714674, 714722, 714770, 715779, 715802, 715844, 731458, 731582, 732314, 732414, 732515, 732594, 733170, 733252, 733326, 733397, 733471] +'DA14 6NN': [733692, 733886, 734043, 734164, 734276, 734377, 734496, 734585, 734667, 734732, 734796, 734955, 735125, 735189, 735248, 735742, 736362, 736850, 737250, 737609, 737893, 738137] +'DA14 6NT': [733709, 733896, 734051, 734178, 734281, 734387, 734501, 734594, 734671, 734740, 734802, 734974, 735130, 735196, 735258, 735757, 736377, 736864, 737265, 737620, 737906, 738147] +'DA14 6NX': [733695, 733888, 734045, 734168, 734279, 734380, 734498, 734587, 734668, 734735, 734798, 734958, 735127, 735191, 735252, 735744, 736364, 736852, 737254, 737611, 737897, 738139] +'DA2 7WY': [710520, 711476, 711591, 712937, 713493, 714285, 715009, 716068, 716556, 717023, 717449, 717895, 718297, 718798, 719287, 720036, 720363, 722490, 725320, 727399, 729150, 732781] +'E1 0DB': [713079, 713617, 714400, 715129, 715657, 716166, 716652, 717121, 717534, 717971, 718374, 718942, 719380, 719761, 720110, 720443, 722652, 725465, 729294, 730759, 731920, 732899] +'GU29 9HT': [740242, 740271, 740299, 740326, 740351, 740367, 740390, 740412, 740434, 740455, 740475, 740496, 740524, 740541, 740558, 740663, 740781, 740835, 740875, 740913, 740941, 740971] +'GU29 9PN': [726019, 726668, 726816, 726942, 727070, 727181, 727895, 728033, 728160, 728279, 728390, 728494, 728620, 728713, 729888, 730260, 736137, 736162, 737144, 737351, 737370, 737395] +'GU29 9PX': [713733, 714525, 715238, 716259, 716754, 717217, 717628, 718461, 719461, 720180, 720804, 721129, 721408, 721670, 721932, 722210, 723098, 723374, 723645, 730891, 732060, 733046] +'ME16 8UP': [739521, 739543, 739577, 739601, 739624, 739646, 739667, 739686, 739704, 739721, 739739, 739760, 739780, 739799, 739814, 739829, 739921, 740082, 740125, 740156, 740183, 740212] +'NW10 8ES': [714553, 715759, 716775, 718484, 719866, 720534, 721147, 721687, 722230, 722855, 723395, 723890, 724320, 724714, 725093, 726358, 726675, 726945, 727187, 727749, 730919, 733075] +'PE28 0HD': [709815, 710037, 713607, 714385, 716152, 716639, 717108, 717524, 717961, 718367, 718930, 719369, 719751, 720100, 720430, 722635, 725446, 727534, 729275, 730748, 731903, 732883] +'PE7 8GS': [710863, 723415, 723416, 723420, 723666, 723670, 723673, 723677, 724111, 724113, 724114, 724327, 724328, 724330, 724333, 724335, 724514, 724515, 724517, 724518, 724522, 724719] +'PO10 8HL': [719738, 721028, 721330, 721583, 721850, 723801, 731886, 733682, 734038, 734157, 734374, 734581, 734664, 735244, 735732, 736843, 737054, 737140, 737365, 737510, 737688, 738129] +'PO10 8PH': [713195, 717600, 718033, 718434, 719058, 720492, 721105, 721655, 721913, 722190, 722767, 723628, 724081, 724491, 724886, 725571, 725820, 726179, 726504, 727658, 729397, 732015] +'PO19 3AR': [733889, 734169, 734381, 734588, 734736, 734959, 735253, 735466, 735972, 736060, 736131, 736195, 736365, 736472, 736654, 736709, 736941, 736986, 737034, 737081, 737255, 737898] +'PO19 3NX': [723724, 724957, 725906, 726242, 727102, 728201, 728426, 728651, 733638, 734005, 734256, 734468, 734645, 735167, 735288, 735398, 735491, 735683, 735905, 736796, 737560, 738092] +'PO19 6RW': [720947, 723238, 723741, 724585, 725921, 726578, 726866, 728093, 728211, 729836, 730018, 730369, 731045, 731432, 732393, 735952, 736039, 736113, 736457, 736524, 736585, 736644] +'PO19 7NH': [713009, 713563, 714341, 715624, 716119, 716605, 717079, 717494, 718340, 718882, 719336, 719723, 720709, 721315, 721836, 722111, 722569, 723010, 723292, 727479, 729222, 730697] +'RH14 0BT': [724568, 724955, 725904, 726240, 726564, 726853, 729828, 730007, 732286, 734003, 735903, 735993, 736792, 737502, 737558, 737681, 737714, 737742, 737773, 737795, 738016, 738038] +'SE11 5TX': [712823, 713396, 714201, 714916, 715984, 716475, 717737, 717819, 718233, 719215, 719625, 719974, 720295, 720605, 721213, 721751, 722380, 725205, 727294, 730521, 731686, 732684] +'SE15 6FB': [711592, 712944, 713501, 714293, 715016, 715588, 716071, 717898, 718300, 719291, 721807, 722084, 722981, 723261, 723527, 723764, 723987, 724803, 724985, 725749, 726273, 732789] +'SE9 2BA': [711044, 711720, 713714, 726013, 726186, 726340, 726509, 726661, 726812, 727685, 728386, 728490, 728616, 728711, 728817, 728924, 729416, 729585, 729680, 729791, 730870, 732035] +'SW4 6RU': [713280, 714550, 715262, 715753, 716769, 717235, 717640, 718074, 718478, 719130, 719859, 720529, 721143, 721418, 722225, 723109, 723390, 725649, 727739, 729472, 732087, 733072] +'SW9 9BW': [710826, 723123, 723132, 723133, 723134, 723135, 723136, 723137, 723145, 723146, 723147, 723148, 723149, 723150, 723151, 723152, 723153, 723154, 723162, 723164, 723165, 723166] +'BN2 9AA': [733650, 733852, 734013, 734134, 734261, 734355, 734474, 734566, 734650, 734716, 734780, 734911, 735109, 735233, 735295, 735346, 735696, 736316, 736809, 737208, 737571, 737854, 738104] +'DA14 6LS': [738706, 738723, 739025, 739027, 739029, 739031, 739033, 739051, 739052, 739053, 739054, 739055, 739056, 739057, 739058, 739075, 739077, 739078, 739080, 739105, 739106, 739107, 739108] +'E1 0EL': [713246, 713734, 714526, 715239, 715741, 716260, 716755, 717218, 717629, 718059, 718462, 719106, 719462, 719844, 720181, 720514, 720805, 722813, 725622, 729443, 730892, 732061, 733048] +'E14 7FU': [709845, 709908, 709985, 710061, 710116, 710173, 710221, 710280, 710321, 710366, 710392, 710471, 710507, 710534, 710799, 711025, 711124, 711235, 711272, 711374, 711522, 711637, 711727] +'E2 6QT': [713119, 713646, 714432, 715163, 716193, 716682, 717558, 717993, 718393, 719396, 719780, 720128, 720458, 721064, 721357, 721615, 721884, 722695, 723600, 724050, 730789, 731955, 732935] +'GU28 0EQ': [729598, 730334, 731296, 731404, 732477, 735568, 735892, 735986, 736070, 736208, 736485, 736605, 736663, 736720, 736948, 736992, 737041, 737088, 737129, 737967, 737990, 738049, 738200] +'GU28 9NW': [713517, 714305, 715035, 716086, 716573, 717043, 717467, 718832, 719696, 720684, 720989, 723273, 723776, 723999, 724425, 724619, 724994, 725755, 725952, 726111, 727427, 730652, 731817] +'GU29 0HQ': [713241, 713731, 714524, 717215, 717625, 719102, 719459, 719841, 721128, 721407, 722208, 723096, 723373, 723643, 723874, 724304, 727182, 728034, 729437, 735513, 735778, 736400, 736881] +'N1 7FH': [733578, 733637, 733818, 733983, 734102, 734241, 734333, 734450, 734549, 734629, 734698, 734762, 734840, 735087, 735628, 735682, 736249, 736301, 736752, 737160, 737528, 737811, 738061] +'N7 8BE': [710571, 712770, 713357, 714164, 714877, 715503, 715947, 717349, 717782, 718632, 719597, 719952, 720585, 720899, 721196, 721467, 721731, 722328, 725153, 728991, 730479, 731648, 732647] +'N7 9EL': [726344, 726511, 726665, 726813, 727068, 728030, 728157, 728278, 728388, 728492, 728618, 728820, 728927, 729589, 729887, 729976, 730074, 730167, 730258, 730417, 731006, 731158, 731233] +'N7 9JU': [713249, 713737, 714528, 715242, 715742, 716262, 716756, 717220, 717631, 718464, 719109, 719464, 719845, 720182, 720516, 720806, 722814, 725624, 727707, 729446, 730895, 732063, 733050] +'NW10 8EX': [713001, 713558, 714337, 715076, 715622, 716118, 716603, 717077, 717492, 717933, 718339, 718877, 719335, 719721, 720400, 720708, 721008, 722563, 725395, 727472, 730689, 731853, 732842] +'NW10 8GW': [739224, 739233, 739245, 739254, 739263, 739272, 739281, 739290, 739299, 739307, 739314, 739324, 739331, 739341, 739348, 739355, 739393, 739426, 739441, 739450, 739459, 739468, 739477] +'NW10 8RP': [712885, 713443, 714962, 716026, 716982, 718745, 725264, 729098, 731738, 738468, 738491, 738502, 738520, 738782, 738797, 738808, 738853, 738902, 738983, 739007, 739035, 739059, 739093] +'PE1 5LW': [710487, 710544, 710606, 712895, 713447, 714249, 714968, 716033, 716527, 716987, 717422, 718274, 718752, 720950, 721256, 721523, 721780, 722058, 722446, 725271, 729102, 731743, 732736] +'PE2 8HL': [710590, 713220, 713713, 714506, 715222, 715725, 716241, 716737, 717201, 717610, 718446, 718556, 718567, 719080, 719829, 721118, 722789, 725593, 727684, 729415, 730869, 732034, 733023] +'PO10 8TN': [716590, 717485, 718330, 719323, 719714, 720063, 727456, 728458, 733870, 734368, 734933, 735304, 735501, 735588, 736004, 736154, 736220, 736499, 736562, 736618, 736675, 737230, 737873] +'PO12 1HG': [734057, 734185, 734285, 734506, 734600, 734674, 734744, 735261, 735315, 735368, 735557, 735975, 736012, 736091, 736161, 736505, 736569, 736627, 736658, 736990, 737011, 737058, 737103] +'PO19 6PA': [713764, 715270, 718076, 720535, 721688, 722231, 723891, 726676, 726946, 728042, 728499, 729479, 729689, 730077, 733746, 734074, 734524, 734812, 735203, 735792, 736896, 737649, 738179] +'PO20 1PH': [728284, 733920, 734197, 734403, 734519, 734611, 734680, 734750, 734810, 735005, 735268, 735320, 735375, 735423, 735562, 735602, 735887, 735982, 736016, 736163, 736511, 737294, 738170] +'RH1 2BJ': [711480, 712953, 713511, 714300, 716568, 717461, 718305, 718825, 719688, 720372, 720982, 721547, 722090, 722511, 723268, 723770, 724216, 724614, 725342, 727421, 729175, 731811, 732801] +'RH6 7DA': [713547, 716593, 718333, 718867, 719326, 720067, 720703, 721003, 721832, 723551, 723790, 724823, 725008, 725384, 726452, 726761, 726895, 727138, 727847, 727990, 728121, 728241, 728352] +'SE13 6DZ': [709831, 709897, 709973, 710049, 710111, 710167, 710216, 710276, 710314, 710360, 710385, 710457, 710503, 710529, 710562, 710588, 710784, 711005, 711222, 711362, 711511, 711622, 711718] +'SE20 8DR': [711389, 726217, 729606, 729608, 729610, 729806, 729808, 729809, 729811, 731407, 731411, 731412, 731414, 731531, 731535, 732166, 732169, 732170, 732171, 732272, 732273, 732274, 732275] +'SE26 5BP': [711792, 711991, 712146, 712602, 733849, 734010, 734130, 734258, 734351, 734471, 734648, 734712, 734777, 734903, 735105, 735171, 735230, 735292, 735689, 736309, 737200, 737566, 738099] +'SO14 5GP': [712181, 712459, 712626, 733565, 733591, 733604, 734827, 734853, 734863, 735639, 735650, 736238, 736259, 736269, 736743, 736760, 736769, 737166, 737173, 737532, 737539, 737804, 737822] +'SW9 9AA': [713082, 715133, 716168, 716654, 717537, 717973, 719383, 719764, 720112, 720748, 721051, 721347, 721602, 721871, 722142, 723316, 723585, 724458, 725468, 727548, 729297, 730761, 732902] +'TN24 8PY': [711605, 713051, 713597, 714372, 715109, 715643, 716146, 716627, 717102, 717517, 717957, 718357, 718916, 719360, 719743, 720094, 720421, 722618, 725435, 727519, 729260, 730735, 732874] +'BN17 7PU': [710816, 720123, 720757, 721354, 721881, 723594, 724043, 724465, 724854, 725794, 726157, 726786, 727043, 727868, 728137, 728369, 728601, 728801, 729564, 729772, 729964, 730149, 730316, 730992] +'BN2 3PZ': [713218, 713712, 714505, 715221, 715724, 716240, 716736, 717200, 717609, 718044, 718445, 719078, 719443, 719828, 720170, 720503, 720797, 722787, 725591, 727683, 729414, 730868, 732033, 733022] +'BN2 5LH': [713178, 713687, 714475, 715196, 715703, 716223, 716712, 717180, 717590, 718022, 718421, 719043, 719423, 719803, 720150, 720482, 720779, 722754, 725557, 727638, 729380, 730833, 732000, 732987] +'BN43 6NQ': [713570, 714349, 715089, 715631, 716613, 717089, 717501, 717942, 718345, 719343, 719728, 720405, 720714, 721015, 721319, 721573, 721841, 722582, 725408, 727491, 729233, 730707, 731863, 732854] +'BR5 2PR': [711597, 712954, 713513, 714303, 715029, 715597, 716081, 716569, 717036, 717462, 718307, 718828, 719690, 720373, 720983, 721549, 722091, 722513, 723269, 725345, 727423, 729177, 730648, 732804] +'CR0 4BW': [713410, 714931, 715997, 716952, 717833, 718698, 719230, 719987, 720619, 721223, 721757, 722927, 723473, 723948, 724380, 724767, 725226, 725717, 726069, 726397, 726717, 726980, 729053, 731705] +'DA12 2EF': [709819, 709884, 709964, 710038, 710106, 710156, 710209, 710266, 710307, 710350, 710382, 710444, 710497, 710525, 710556, 710583, 710611, 710767, 710990, 711207, 711349, 711498, 711610, 711710] +'DA1 5UU': [709778, 709853, 709939, 710012, 710404, 710720, 710948, 711158, 711302, 711308, 711316, 711379, 711393, 711399, 711405, 711410, 711422, 711426, 711432, 711440, 711445, 711457, 711577, 711683] +'GU28 0EG': [730429, 730431, 735522, 735610, 735935, 736023, 736101, 736170, 736236, 736514, 736574, 736630, 736686, 736737, 736967, 737013, 737061, 737106, 737148, 737373, 737416, 737453, 737486, 737516] +'ME12 4NG': [711074, 711649, 711675, 724482, 724877, 725814, 726495, 726802, 731154, 731228, 731283, 731344, 731395, 731459, 731519, 731583, 732154, 732262, 732315, 732363, 732416, 732516, 733171, 733253] +'ME15 6HB': [711657, 711664, 732113, 732174, 732230, 732279, 732379, 732488, 732528, 732567, 733099, 733137, 733194, 733225, 733272, 733303, 738357, 738456, 738549, 738607, 738657, 738694, 738715, 738736] +'ME9 9HB': [709860, 710091, 710246, 712841, 714213, 714927, 715993, 716487, 717393, 717831, 718246, 718694, 719228, 719636, 719985, 720305, 720618, 722395, 725221, 727308, 729047, 730541, 731700, 732698] +'N7 9LB': [720392, 722109, 723287, 724235, 725960, 726292, 726613, 727137, 727989, 728888, 729649, 730041, 730230, 731061, 731210, 731330, 731447, 731568, 732302, 732398, 732503, 732583, 733316, 733461] +'NW10 8RZ': [713541, 715056, 716104, 717062, 718859, 719320, 720697, 721305, 721828, 723002, 724008, 724436, 724820, 725374, 725762, 726120, 726450, 726758, 727845, 728119, 728351, 728580, 729204, 738784] +'PE3 9YD': [710122, 710125, 713806, 713849, 713928, 713955, 713989, 714059, 714712, 714737, 714761, 715291, 715354, 715403, 715787, 715822, 715838, 715906, 716307, 716357, 716378, 716800, 716813, 733238] +'PO19 3AF': [728150, 733908, 734188, 734602, 734746, 734987, 735133, 735263, 735369, 735469, 735558, 735881, 735976, 736063, 736134, 736198, 736388, 736476, 736541, 736599, 736659, 736714, 737279, 737916] +'PO19 3LR': [733837, 733999, 734120, 734558, 734640, 734707, 734771, 734890, 735097, 735163, 735284, 735393, 735440, 735531, 735576, 735675, 735900, 735944, 736295, 736788, 737189, 737556, 737839, 738087] +'PO19 8DF': [713606, 714383, 715115, 716150, 716636, 717107, 718928, 720429, 720737, 722633, 725443, 730747, 731900, 732881, 734729, 734793, 735121, 735508, 735550, 735593, 735871, 735919, 735966, 736055] +'PO20 2HT': [714021, 714087, 714603, 714760, 730364, 731041, 731119, 731194, 731318, 731486, 731551, 732123, 732183, 732293, 732446, 732534, 732577, 733104, 733149, 733199, 733277, 733380, 733424, 733451] +'PO20 8QS': [739530, 739553, 739587, 739611, 739656, 739676, 739695, 739712, 739729, 739747, 739770, 739788, 739805, 739820, 739834, 739847, 739862, 739931, 740023, 740092, 740135, 740166, 740193, 740222] +'RH11 7GT': [711943, 733728, 733913, 734063, 734192, 734398, 734512, 734604, 734676, 734747, 734806, 734993, 735134, 735199, 735264, 735316, 735370, 735773, 736394, 736878, 737285, 737634, 737922, 738163] +'SE11 5BU': [713043, 713589, 714365, 717099, 717510, 718353, 719354, 719736, 720087, 720726, 721024, 721328, 721448, 722611, 723023, 723302, 723569, 724024, 724248, 724640, 725774, 727511, 731885, 732869] +'SE11 5TD': [713900, 713937, 713963, 713997, 714032, 714064, 714097, 714583, 714610, 714644, 714669, 714692, 714717, 714742, 714766, 714787, 714803, 715296, 715319, 733211, 733244, 733287, 733319, 733389] +'SE14 6ED': [713564, 715082, 716121, 717082, 717937, 719338, 720075, 720710, 721316, 721837, 723011, 723554, 724013, 724825, 725402, 725766, 726453, 726762, 727848, 729225, 731857, 741341, 741351, 741359] +'SE16 3ES': [710414, 713420, 713845, 713923, 713985, 714055, 714575, 714634, 714686, 714735, 714781, 714939, 715288, 715335, 715367, 715399, 715426, 715773, 716006, 716961, 717843, 719236, 725239, 731716] +'SE16 3QT': [711989, 733625, 733833, 733995, 734116, 734253, 734343, 734460, 734636, 734704, 734768, 734884, 735095, 735158, 735219, 735282, 735334, 735668, 736287, 736780, 737184, 737549, 737831, 738081] +'SE2 0BB': [711875, 711933, 712145, 712601, 712649, 733641, 733844, 734126, 734349, 734470, 734563, 734646, 734710, 734774, 734897, 735102, 735168, 735227, 735289, 735685, 736304, 736800, 737197, 737563] +'SE28 8LJ': [714200, 715528, 716474, 718232, 718576, 720922, 721709, 721718, 723422, 723902, 724162, 724560, 724949, 725120, 725898, 726232, 726556, 726955, 726959, 727096, 727293, 728420, 730520, 732683] +'SW9 9EU': [713738, 716263, 716757, 717221, 718061, 718465, 719846, 720183, 720807, 721130, 721409, 721672, 721934, 722211, 723376, 723875, 724307, 724500, 724899, 725625, 725829, 727708, 729447, 733051] +'BN17 5FF': [711806, 711849, 711885, 711915, 711959, 711978, 711997, 712010, 712026, 712035, 712098, 712121, 712129, 712134, 712139, 712148, 712156, 712163, 712219, 712318, 712416, 712499, 712564, 712613, 712662] +'DA14 6NR': [733651, 733853, 734014, 734135, 734262, 734356, 734475, 734567, 734651, 734717, 734781, 734912, 735110, 735174, 735234, 735296, 735347, 735404, 735697, 736317, 736810, 737209, 737572, 737855, 738105] +'DA5 1JT': [740264, 740293, 740320, 740344, 740385, 740407, 740428, 740450, 740471, 740490, 740520, 740538, 740555, 740570, 740583, 740596, 740609, 740622, 740687, 740804, 740859, 740899, 740936, 740965, 740994] +'E1 2NL': [713071, 713613, 714390, 715122, 716158, 716645, 717113, 717527, 717966, 719372, 719756, 720103, 720435, 720741, 721043, 721341, 721864, 722136, 722642, 725454, 727541, 729284, 730754, 731912, 732888] +'E1W 3DP': [724916, 725104, 725105, 725107, 725109, 725845, 725854, 725859, 725865, 726038, 726042, 726043, 726045, 726046, 726204, 726205, 726206, 726207, 726366, 726367, 726368, 726369, 726370, 726528, 726529] +'E2 6QS': [712779, 713363, 714169, 714883, 715506, 715953, 716444, 716913, 717355, 717789, 718206, 718641, 719601, 719955, 720273, 720587, 720902, 721199, 721470, 722907, 723451, 725162, 727259, 728998, 731652] +'GU29 9BT': [721041, 721339, 722134, 726466, 726908, 727860, 728003, 728131, 735873, 735921, 735968, 736010, 736056, 736088, 736127, 736159, 736191, 736225, 736469, 739669, 739688, 739706, 739723, 739741, 739782] +'GU29 9TF': [712963, 714311, 716574, 717908, 718315, 718839, 719308, 719702, 720053, 720689, 721299, 721553, 724223, 724430, 724997, 725356, 727435, 729186, 730659, 731824, 732813, 735587, 735914, 735960, 736048] +'GU31 5HL': [727160, 728373, 728604, 728696, 728804, 728908, 729568, 729668, 729774, 729873, 729966, 730061, 730150, 730245, 731075, 731515, 731578, 736943, 736963, 736987, 737009, 737706, 737721, 737735, 737750] +'HA1 4WP': [739223, 739232, 739244, 739253, 739262, 739271, 739280, 739289, 739298, 739306, 739313, 739323, 739330, 739340, 739347, 739354, 739361, 739367, 739392, 739425, 739440, 739449, 739458, 739467, 739476] +'ME14 2EN': [710879, 711275, 724324, 724718, 725097, 725842, 726034, 726202, 726362, 726526, 726679, 726827, 726950, 727079, 727191, 728046, 728173, 728399, 728503, 728717, 728936, 729693, 729894, 730081, 730265] +'NW10 8BF': [717881, 719274, 720024, 720656, 721267, 721794, 722967, 726733, 726996, 727817, 728102, 728329, 728557, 728768, 729534, 729738, 729941, 730124, 730289, 730967, 731130, 731255, 731373, 731495, 732132] +'NW10 8DQ': [713690, 715199, 716226, 717182, 718026, 719045, 719427, 720153, 720782, 721381, 721907, 723076, 723621, 724075, 724484, 724881, 725559, 725816, 726175, 726499, 726804, 727057, 728149, 729384, 732002] +'NW10 8GS': [711032, 711109, 711131, 711242, 711260, 711800, 711846, 711882, 711912, 711936, 711957, 711976, 711995, 712008, 712024, 712034, 712092, 712120, 712214, 712312, 712410, 712493, 712559, 712609, 712659] +'NW10 8NL': [715268, 719477, 720197, 721422, 721951, 723113, 724508, 724906, 725657, 725839, 726198, 726523, 727076, 727901, 728170, 728395, 728625, 728827, 729478, 729799, 729980, 732094, 738407, 738578, 738704] +'PO19 3NL': [725750, 726430, 726745, 727007, 727830, 728109, 728337, 728567, 728773, 733942, 733951, 733962, 733974, 737384, 737427, 737462, 737670, 737699, 737787, 737959, 737984, 738007, 738030, 738218, 738228] +'PO19 3NU': [718710, 725233, 728534, 728749, 729061, 733841, 734123, 734347, 734561, 734709, 735226, 735340, 735442, 735534, 735855, 736034, 736108, 736175, 736519, 736580, 736638, 736694, 736926, 736971, 737843] +'PO19 6TN': [730002, 734466, 735099, 735164, 735222, 735285, 735337, 735395, 735489, 735533, 735578, 735853, 735902, 735946, 736074, 736146, 736553, 736610, 736722, 736952, 736994, 737044, 737092, 737135, 737358] +'PO20 1JR': [716064, 717018, 717445, 718294, 720667, 722482, 723522, 723757, 724603, 724799, 725744, 726098, 726269, 726424, 726740, 727973, 728225, 728334, 728446, 728670, 729942, 730126, 730291, 730621, 731790] +'PO20 1JW': [713118, 713645, 714431, 715162, 716192, 716681, 717151, 717557, 717992, 718987, 719395, 720760, 722694, 723050, 723825, 724049, 725501, 725800, 725987, 726639, 727585, 729329, 730787, 731954, 732934] +'SE11 5DB': [726122, 726760, 727019, 727136, 727988, 728240, 728459, 728582, 728681, 728886, 729553, 729647, 729852, 729951, 730039, 730135, 730228, 730304, 730386, 730981, 731059, 731265, 731446, 731567, 732141] +'SE11 5TB': [729658, 729699, 729861, 729956, 730140, 730235, 730309, 730396, 730984, 731068, 731142, 731269, 731332, 731449, 731508, 731570, 732145, 732200, 732254, 732304, 732355, 732505, 732544, 732584, 733114] +'SE16 4AZ': [733635, 733840, 734004, 734467, 734560, 734643, 734708, 734772, 735100, 735165, 735224, 735286, 735338, 735396, 736299, 736794, 738091, 738837, 738856, 738862, 738908, 738949, 739041, 739064, 739085] +'SE9 1EH': [711397, 711439, 711669, 712950, 714299, 717459, 723266, 723767, 724214, 726278, 727418, 728675, 728878, 729697, 729846, 730222, 730379, 730424, 731095, 731206, 731326, 731594, 732220, 732324, 732798] +'SO15 8AP': [710540, 710828, 714379, 717521, 717744, 717960, 718167, 718363, 719366, 719746, 720098, 720425, 720563, 720736, 720859, 721036, 721337, 721450, 721590, 721714, 721859, 721986, 722132, 722263, 723031] +'SW4 6RZ': [713156, 713674, 714463, 715186, 715692, 716213, 716704, 717581, 718013, 718410, 719414, 720475, 721086, 721368, 721633, 721898, 722731, 723064, 723335, 724869, 725539, 725809, 727620, 731987, 732972] +'SW9 9DL': [712812, 714191, 714906, 715972, 717374, 717811, 718221, 718666, 719968, 720289, 720599, 720914, 721207, 721488, 721743, 722025, 722915, 723462, 724369, 724554, 724755, 725191, 727281, 730728, 732672] +'BN17 6WD': [713701, 714488, 715211, 716231, 716724, 717190, 717601, 718034, 718435, 719434, 719816, 720159, 720493, 720789, 721106, 721390, 721656, 721914, 722191, 723083, 723353, 727659, 729398, 730851, 732016, 733004] +'BR1 4TQ': [739518, 739539, 739573, 739598, 739621, 739643, 739664, 739683, 739702, 739718, 739735, 739756, 739776, 739794, 739810, 739825, 739839, 739853, 739866, 739879, 739917, 740010, 740078, 740122, 740179, 740207] +'BR1 5JN': [709803, 709871, 709951, 710023, 710099, 710146, 710196, 710257, 710297, 710346, 710378, 710427, 710492, 710521, 710548, 710578, 710607, 710625, 710637, 710656, 710678, 710701, 710749, 710810, 711595, 711698] +'BR3 4BB': [713146, 713667, 714452, 715181, 716206, 716698, 717164, 717577, 718006, 718405, 719012, 719410, 719793, 720470, 721082, 721629, 722171, 722719, 723330, 723835, 725528, 727611, 729351, 730812, 731977, 732961] +'BR3 4BH': [713598, 715110, 716147, 717103, 717958, 718917, 719361, 720095, 720732, 721334, 721856, 722619, 723029, 723574, 724030, 724452, 724839, 725436, 725780, 726144, 726465, 726774, 727032, 727520, 727858, 731892] +'CR0 4YF': [710439, 713067, 713609, 714387, 715118, 715649, 716153, 716640, 717109, 717525, 717962, 718368, 719370, 719752, 720101, 720431, 720739, 721040, 721338, 722637, 725448, 727535, 729277, 730750, 731905, 732885] +'CR0 4YG': [711128, 711729, 713287, 714552, 715758, 716774, 717646, 718481, 719862, 720532, 721144, 721685, 722227, 722853, 723393, 723889, 724319, 724713, 725092, 726030, 726357, 726674, 727186, 727748, 728041, 730918] +'E1 0BA': [713158, 713675, 714465, 717170, 718411, 719797, 720144, 721370, 721636, 722734, 723612, 723842, 724067, 724277, 724477, 724676, 724871, 725058, 725541, 725810, 725996, 726169, 727622, 729364, 730820, 732974] +'E1 2PL': [714419, 715148, 715667, 716671, 717135, 719392, 719772, 720120, 720452, 721058, 722150, 722672, 724851, 725042, 725791, 727041, 727156, 728599, 728799, 729563, 729665, 729771, 729871, 730243, 730406, 731938] +'E1 5HH': [714323, 715058, 716105, 716587, 717480, 718326, 719321, 721561, 722106, 723284, 723545, 723787, 724233, 724821, 725005, 725763, 725959, 726121, 726291, 726451, 726759, 726960, 727846, 728120, 728581, 728680] +'E2 9RH': [713665, 715179, 715684, 716203, 716696, 717162, 718403, 719008, 719408, 719791, 720139, 720468, 720768, 721175, 721625, 721892, 721988, 722167, 723833, 724060, 724273, 724472, 725526, 729350, 731976, 732957] +'GU28 9HN': [713047, 714368, 716143, 717513, 718911, 719356, 719739, 720089, 720249, 720259, 720417, 721029, 725433, 729255, 732871, 735507, 735549, 735592, 735870, 735918, 735965, 736008, 736054, 736086, 736125, 736157] +'GU28 9HY': [713747, 718066, 722823, 723650, 724096, 724311, 725084, 725634, 725831, 726819, 727717, 728036, 730902, 732073, 733738, 734823, 735382, 735383, 735384, 735385, 735424, 735474, 735888, 735929, 736718, 736735] +'GU29 9PJ': [713915, 713976, 714005, 714070, 730418, 731007, 731085, 731160, 731289, 731462, 731524, 732160, 732213, 733945, 733950, 738014, 738025, 738035, 738053, 738198, 738204, 738211, 738220, 738231, 738238, 738247] +'HA1 4GQ': [739225, 739234, 739246, 739255, 739264, 739273, 739282, 739291, 739300, 739308, 739315, 739325, 739332, 739342, 739349, 739356, 739362, 739368, 739373, 739394, 739427, 739442, 739451, 739460, 739469, 739478] +'NW10 8LQ': [723521, 723755, 724413, 724600, 724798, 724981, 725743, 725935, 726097, 726423, 726590, 726739, 726877, 727001, 727117, 727823, 728223, 728333, 728445, 728561, 728669, 728771, 728872, 729537, 729636, 729739] +'NW10 8NJ': [712925, 713481, 714274, 714998, 715576, 716059, 716549, 717442, 717887, 718786, 719279, 720027, 720660, 721270, 721798, 722475, 722970, 723515, 723974, 724411, 725305, 725739, 729141, 730617, 731779, 732771] +'PE4 7BW': [710329, 710332, 716858, 716869, 716879, 717252, 717257, 717266, 717272, 717281, 717288, 717292, 717298, 717305, 717309, 717659, 717666, 717673, 717684, 717694, 717702, 717718, 717724, 718091, 718098, 718106] +'PO19 7HB': [712926, 713482, 717015, 718787, 720661, 722476, 722971, 723516, 724596, 724980, 725306, 726266, 727390, 729142, 731780, 734017, 734476, 734782, 735175, 735297, 735405, 735524, 735583, 735909, 737576, 738108] +'PO20 7LT': [713056, 714374, 717104, 718358, 719362, 720422, 721335, 721587, 722130, 722624, 723308, 723575, 723807, 724252, 724646, 725029, 725440, 725781, 726145, 726625, 726775, 727525, 729265, 730739, 731894, 732876] +'RH11 8AJ': [710325, 710367, 710394, 711641, 711732, 713314, 713774, 714570, 715284, 715770, 716293, 716786, 717246, 719159, 719483, 719872, 720206, 720542, 720830, 721154, 721427, 722876, 725676, 727766, 729493, 730934] +'RH19 2SD': [709866, 710546, 714254, 714976, 716038, 716995, 717426, 717867, 718276, 718759, 719262, 719663, 720341, 720647, 720955, 721261, 721527, 721786, 722452, 722958, 725277, 727365, 729111, 730588, 731748, 732743] +'SE11 5SF': [713152, 713672, 714459, 715185, 716212, 718011, 719412, 720143, 720473, 720772, 721085, 721632, 722726, 723062, 723334, 723608, 723838, 724064, 724276, 724474, 724675, 724868, 725535, 725808, 729360, 732970] +'SE11 5TA': [723301, 723568, 724023, 724247, 724447, 724834, 725024, 725773, 725972, 726137, 726209, 726305, 726462, 726619, 726770, 726903, 727028, 727855, 727997, 728125, 728249, 728356, 728465, 728685, 728791, 728894] +'SE16 4DY': [736132, 736160, 736196, 736227, 736473, 736503, 736537, 736679, 736711, 736734, 737035, 737056, 737082, 737368, 737390, 737410, 737431, 737448, 737467, 737480, 737494, 737512, 737618, 737674, 737689, 737707] +'SW4 6QL': [712931, 713489, 714280, 715005, 715580, 716552, 717017, 718293, 718794, 719282, 719679, 720358, 720666, 721274, 721802, 722078, 722480, 722976, 723254, 723979, 724202, 724414, 724601, 725313, 729146, 732777] +'BN17 6FB': [717795, 719197, 719959, 720592, 720905, 721202, 721476, 721737, 722013, 722908, 723203, 723453, 723708, 723934, 724149, 724365, 724547, 724938, 726383, 726705, 726969, 727788, 728070, 728302, 728519, 728735, 729508] +'CR0 4YD': [711414, 711428, 722980, 723524, 723983, 724416, 724802, 725746, 726101, 726427, 726743, 727003, 728106, 728335, 728564, 728772, 729540, 729741, 730292, 730974, 731133, 731259, 731378, 731498, 732136, 732250, 732348] +'CR2 0QG': [711892, 720778, 721096, 721376, 721642, 733717, 733903, 734183, 734283, 734391, 734504, 734598, 734673, 734743, 734804, 734983, 735132, 735197, 735260, 735314, 735764, 736383, 736872, 737274, 737624, 737912, 738153] +'PO10 8TJ': [712868, 713427, 714228, 714946, 716499, 717845, 718256, 718727, 725248, 729075, 731722, 732717, 735443, 735856, 735948, 736035, 736109, 736176, 736453, 736520, 736581, 736639, 736695, 736927, 736972, 737019, 737066] +'PO19 7NT': [736934, 736959, 736981, 737003, 737051, 737075, 737118, 737342, 737362, 737386, 737444, 737464, 737492, 737508, 737672, 737686, 737701, 737718, 737732, 737748, 737761, 737778, 737798, 737960, 737985, 738009, 738020] +'RH16 4JP': [710052, 711226, 713207, 713707, 714500, 715721, 716236, 716732, 717605, 718042, 718439, 719070, 719441, 719825, 720166, 720497, 721113, 721916, 722195, 722779, 723088, 723632, 725582, 729407, 730862, 732026, 733016] +'SE11 5BX': [726138, 726620, 726771, 726904, 727029, 727147, 728357, 728466, 728588, 728686, 728895, 729762, 729957, 730141, 730310, 730397, 730985, 731215, 731333, 731509, 731571, 732146, 732255, 732305, 732356, 732400, 732458] +'SE11 5DA': [713544, 715616, 716109, 716592, 717065, 717486, 720064, 720391, 720701, 721309, 721564, 722108, 722548, 723004, 723285, 723548, 723788, 724010, 724234, 724438, 724631, 725007, 725379, 725764, 729208, 731843, 732829] +'SE18 6UD': [709927, 711395, 711434, 728646, 728746, 728851, 729517, 729719, 729825, 729929, 730004, 730111, 730359, 731112, 731189, 731248, 731313, 731364, 731424, 732285, 732384, 732574, 733102, 733144, 733197, 733230, 733275] +'SO14 3TH': [711036, 721505, 721764, 722040, 723224, 723480, 723726, 723953, 724174, 724384, 724573, 724770, 725908, 726072, 726243, 726400, 726567, 726720, 726856, 726982, 727105, 727805, 727956, 741344, 741346, 741347, 741348] +'SW4 6SA': [713024, 713576, 714352, 715092, 715633, 716126, 716614, 717503, 717943, 718346, 718891, 719729, 720407, 721574, 722116, 722587, 723015, 723295, 723558, 724015, 724442, 724827, 725012, 725965, 726129, 730711, 731869] +'SW9 9AG': [713230, 713722, 715228, 715732, 716744, 717618, 718051, 718452, 719451, 720801, 721123, 722795, 723369, 723639, 723870, 724303, 724498, 724697, 724896, 725607, 725827, 726345, 726512, 726666, 726940, 727893, 729426] +'BN18 0TH': [712906, 714260, 716535, 717432, 718279, 718767, 720016, 720651, 721263, 721788, 723506, 723967, 724401, 724788, 725284, 725733, 726087, 728553, 728765, 729117, 729532, 729632, 729734, 730120, 730285, 730964, 731754, 732751] +'BR6 7AU': [717612, 718045, 718447, 719445, 719830, 720171, 720504, 720798, 721119, 721397, 721663, 721922, 722201, 723363, 723866, 724298, 724694, 725079, 726014, 726341, 726662, 726937, 727891, 728028, 728276, 728491, 728712, 728925] +'CT19 5SX': [733679, 733878, 734037, 734156, 734273, 734373, 734493, 734580, 734663, 734728, 734792, 734941, 735120, 735186, 735243, 735307, 735358, 735414, 735462, 735506, 735548, 735730, 736348, 736840, 737240, 737599, 737881, 738128] +'E1 2NN': [714114, 714124, 714132, 714135, 714138, 714825, 714840, 716496, 718579, 718591, 718596, 718602, 718719, 719562, 719570, 719913, 719924, 720313, 720930, 721506, 721765, 722934, 723173, 723424, 723429, 725242, 729069, 732710] +'E2 9AD': [713180, 713689, 714478, 715704, 716714, 717181, 718024, 719425, 720152, 720483, 720780, 721098, 721379, 722755, 723074, 723619, 724073, 724284, 724682, 724879, 726003, 726174, 726332, 726497, 727640, 730835, 732001, 732989] +'GU28 9NP': [713108, 718971, 722681, 726602, 726685, 726692, 726750, 726831, 727012, 728344, 730130, 730382, 731262, 732351, 732395, 732455, 737107, 737108, 737130, 737131, 737150, 737152, 737355, 737356, 737978, 737979, 737991, 738753] +'GU31 5HJ': [713124, 713649, 714436, 717152, 721066, 721885, 722156, 722697, 723051, 723601, 723826, 724052, 724667, 724861, 725802, 726161, 726320, 729333, 730793, 731958, 732939, 734670, 734738, 734801, 735195, 735256, 735313, 735365] +'ME14 1HF': [710120, 710174, 711259, 711283, 713310, 714566, 715280, 719156, 719871, 720204, 720541, 720829, 722872, 723402, 723664, 723896, 724108, 725674, 726036, 726203, 726364, 726527, 728174, 728291, 729695, 729802, 729896, 729983] +'ME20 7GF': [711427, 724402, 724591, 724789, 724975, 725734, 726088, 726261, 726414, 726584, 726727, 726871, 726992, 728098, 728440, 728554, 729841, 729938, 730022, 730214, 730286, 730373, 730965, 731050, 738683, 738686, 738688, 738702] +'N1 7FF': [711776, 718640, 733823, 733988, 734107, 734246, 734337, 734454, 734552, 734631, 734700, 734764, 734859, 735089, 735153, 735214, 735277, 735330, 735388, 735435, 735483, 735645, 736264, 736765, 737171, 737537, 737818, 738068] +'N7 9EJ': [711014, 713229, 714515, 715731, 716252, 716743, 717210, 717617, 718451, 719450, 721666, 721926, 722204, 723093, 723638, 723869, 724089, 724302, 724497, 724696, 725081, 725826, 726017, 727692, 729425, 733034, 739159, 739160] +'NN5 7LX': [710579, 711337, 739519, 739540, 739575, 739599, 739644, 739665, 739684, 739719, 739737, 739757, 739778, 739797, 739812, 739841, 739856, 739868, 739882, 739893, 739904, 739918, 739938, 740011, 740079, 740153, 740180, 740209] +'NW10 8BW': [712810, 714190, 715517, 716461, 717372, 718219, 719614, 720288, 720913, 721486, 722023, 722363, 723209, 723714, 724155, 724553, 724942, 725892, 726226, 726548, 726843, 727092, 727279, 727946, 728192, 728416, 730508, 732671] +'PO19 8DA': [712829, 713402, 714207, 715989, 716481, 716946, 717388, 717825, 718240, 718684, 719224, 719631, 719982, 720300, 720611, 721219, 721498, 721753, 722035, 722386, 722923, 723470, 723721, 723945, 725211, 727301, 730528, 731691] +'SE16 3SG': [712824, 713397, 714202, 714917, 715529, 715985, 716476, 716940, 717384, 717820, 718234, 718680, 719216, 719626, 719975, 720296, 720606, 720923, 721214, 721495, 721752, 722381, 725206, 727296, 729035, 730522, 731687, 732685] +'SE25 4DW': [710322, 713270, 713752, 714542, 715257, 715750, 716273, 716765, 717229, 718069, 718472, 719125, 719471, 719854, 720190, 720524, 720815, 721136, 721414, 721678, 721945, 722837, 725642, 727727, 729465, 730908, 732079, 733066] +'SE5 9JJ': [714824, 714853, 715919, 715926, 716883, 716890, 717739, 717752, 718561, 718571, 719923, 720561, 720569, 720576, 721171, 721178, 721711, 721720, 721724, 722267, 723423, 723437, 723911, 723917, 731601, 731620, 733483, 733492] +'SW9 0RZ': [713794, 713829, 713869, 713943, 714003, 714043, 714069, 714104, 714590, 714614, 714649, 714676, 714724, 714750, 714771, 714790, 714808, 715301, 715325, 715359, 715374, 715409, 715420, 733329, 733362, 733400, 733438, 733473] +'TN24 0LR': [712875, 713433, 714232, 714951, 715547, 716015, 716507, 716973, 717406, 717849, 718260, 718735, 719241, 719649, 719999, 720321, 720628, 720941, 721242, 721514, 721770, 722423, 725254, 727334, 729083, 730563, 731729, 732720] +'BN17 5FB': [711760, 711814, 711854, 711855, 711891, 711893, 711920, 711921, 711963, 712227, 712228, 712325, 712326, 712422, 712423, 712508, 712509, 712571, 712572, 712620, 712621, 712668, 712669, 712741, 712742, 712744, 733716, 734982, 735614] +'BR1 1AA': [710756, 710937, 711117, 711137, 711148, 711796, 711844, 711878, 711910, 711956, 711974, 711994, 712089, 712265, 712270, 712276, 712309, 712342, 712346, 712350, 712355, 712358, 712362, 712369, 712406, 712490, 712555, 712606, 712655] +'E2 6QY': [713353, 714162, 714874, 715501, 716438, 716907, 717346, 717780, 718200, 718628, 719188, 719950, 721194, 721730, 722006, 722903, 723702, 723930, 724142, 724360, 724538, 724747, 724930, 725879, 726542, 726701, 727250, 731643, 732642] +'GU28 9ES': [715028, 715596, 716080, 717035, 717904, 718306, 718827, 719299, 719689, 720044, 721548, 723771, 723995, 724217, 724808, 724989, 725752, 725947, 726108, 726279, 726436, 726597, 726884, 727126, 727422, 727834, 730647, 731812, 732803] +'N7 9EQ': [710226, 714022, 714089, 714605, 714663, 714711, 714798, 715314, 715353, 715386, 715416, 715440, 715821, 715856, 715875, 715904, 716356, 716405, 716822, 716839, 716855, 716872, 717269, 717284, 717663, 717722, 718096, 718109, 718127] +'NW10 8BE': [740260, 740288, 740315, 740340, 740360, 740381, 740403, 740424, 740446, 740467, 740486, 740515, 740534, 740551, 740566, 740579, 740592, 740605, 740618, 740631, 740643, 740656, 740682, 740800, 740854, 740894, 740931, 740960, 740989] +'NW10 8GL': [738397, 738419, 738434, 738557, 738690, 738691, 738721, 738774, 738786, 738798, 738810, 738835, 738861, 738870, 738878, 738884, 738889, 738896, 738906, 738947, 738987, 739010, 739039, 739062, 739095, 739114, 739121, 739194, 739212] +'NW10 8HZ': [739219, 739228, 739240, 739249, 739258, 739267, 739276, 739285, 739294, 739303, 739311, 739319, 739328, 739338, 739345, 739352, 739359, 739365, 739371, 739376, 739380, 739384, 739388, 739421, 739436, 739445, 739454, 739463, 739472] +'NW10 8LA': [712815, 713388, 714912, 715455, 715471, 715522, 715975, 716465, 716934, 717377, 717813, 718162, 718174, 718225, 718671, 719211, 719617, 719970, 720290, 720602, 720855, 720865, 722368, 725196, 727285, 729029, 730439, 730513, 732676] +'NW10 8LE': [712751, 712752, 712753, 713336, 718610, 718611, 718612, 722308, 722309, 722310, 725132, 725133, 725134, 725135, 727233, 727234, 727235, 727236, 728971, 728972, 728973, 730459, 730460, 730461, 730462, 731624, 731625, 731626, 731627] +'PO19 3LS': [735991, 736029, 736071, 736144, 736213, 736450, 736489, 736518, 736552, 736577, 736607, 736635, 736666, 736691, 736721, 736924, 736950, 736969, 736993, 737018, 737043, 737063, 737090, 737110, 737133, 737334, 737375, 737399, 737418] +'PO19 6RS': [714592, 714651, 714751, 715781, 715793, 715850, 717674, 717685, 732371, 733128, 733364, 733440, 734431, 734439, 734446, 734533, 734537, 734544, 734623, 734625, 734627, 734689, 734696, 734756, 734757, 734758, 734759, 734819, 734820] +'PO9 5EW': [712119, 733661, 733862, 734024, 734143, 734363, 734481, 734573, 734655, 734721, 734786, 734922, 735180, 735238, 735302, 735352, 735409, 735455, 735499, 735543, 735586, 735709, 735866, 736329, 736820, 737218, 737583, 737865, 738115] +'RH11 7UG': [709854, 710623, 710673, 712788, 714175, 714890, 715510, 715957, 716451, 716916, 717360, 717796, 718210, 718651, 719198, 719604, 719960, 720275, 720593, 721203, 721477, 722345, 723204, 723454, 725172, 727264, 729006, 730493, 732657] +'RH14 9RD': [710868, 711049, 711646, 722049, 723231, 724180, 724579, 724964, 726247, 726571, 726860, 727107, 727959, 728206, 728431, 728656, 728859, 729626, 729833, 730015, 730207, 730366, 731042, 731195, 731319, 731428, 731552, 732294, 732389] +'SE1 3GF': [734118, 734254, 734344, 734462, 734557, 734638, 734706, 734769, 735096, 735160, 735220, 735283, 735335, 735392, 735439, 735487, 735575, 735851, 738356, 738367, 738374, 738455, 738548, 738606, 738656, 738693, 738714, 738735, 738765] +'SE15 2AA': [712581, 712948, 718817, 722505, 725338, 727414, 729168, 730640, 731808, 732794, 733776, 734080, 734209, 734413, 734529, 734618, 734686, 734755, 734818, 735039, 735142, 735812, 736426, 736905, 737314, 737946, 738187, 741410, 741416] +'SE15 5QJ': [712337, 715071, 715620, 716116, 716601, 717491, 717930, 718338, 719332, 720072, 720397, 720706, 721006, 721314, 721569, 721835, 723009, 723290, 733771, 733933, 734078, 734207, 735034, 735809, 736903, 737310, 737653, 737944, 738185] +'SE8 3DF': [713044, 713590, 714366, 715104, 715639, 716141, 716625, 718909, 721851, 722126, 722612, 723025, 723305, 723571, 723802, 724026, 724250, 724449, 724642, 724836, 725026, 725432, 725776, 725974, 726141, 727512, 729254, 730731, 731887] +'SO16 8FQ': [712267, 712439, 712442, 719184, 719945, 720890, 721189, 721461, 721725, 721999, 722896, 723443, 723925, 726699, 726835, 726962, 727785, 728514, 728843, 728980, 729503, 736172, 736212, 736488, 736516, 736949, 737016, 737042, 737089] +'SO18 3RP': [709944, 710484, 710602, 710731, 711583, 712856, 713418, 714936, 715537, 716003, 716494, 716958, 717397, 717839, 718252, 718712, 719639, 719991, 720311, 720929, 721227, 721503, 721760, 722038, 725235, 727321, 729063, 730553, 732705] +'SO18 4AR': [711896, 712518, 733748, 733928, 734203, 734294, 734408, 734525, 734614, 734682, 734752, 734813, 735029, 735138, 735204, 735271, 735323, 735379, 735428, 735478, 735519, 735565, 735606, 735794, 736414, 736898, 737650, 737938, 738180] +'SW9 9AY': [712857, 714221, 714937, 715538, 716004, 716959, 717398, 717840, 718713, 719234, 719640, 719992, 720621, 721228, 721504, 721761, 722039, 722408, 722930, 723223, 723725, 723952, 724172, 724383, 724572, 724958, 729064, 731713, 732707] +'SW9 9ET': [713126, 713652, 714439, 715167, 715676, 716195, 717154, 717562, 717996, 718991, 719398, 720130, 720460, 721068, 721360, 721619, 721887, 722158, 722699, 723053, 723602, 723827, 724053, 724862, 725048, 725505, 725803, 731961, 732943] +'SW9 9EZ': [713190, 713696, 714483, 715206, 716229, 716721, 717188, 717597, 718031, 718428, 719053, 719810, 720488, 721388, 721650, 721910, 722186, 722765, 723079, 723348, 723625, 723856, 724078, 724288, 725071, 725819, 727653, 729394, 733000] +'BR1 4AX': [710797, 713251, 713255, 713740, 714529, 715245, 715744, 716266, 716759, 717633, 718063, 718467, 719112, 719115, 719466, 719848, 720186, 720519, 720809, 721133, 721411, 721674, 721936, 725630, 727710, 729450, 729453, 730897, 732065, 733053] +'E1 5BN': [714558, 715761, 716777, 717649, 718487, 720537, 721149, 722233, 722857, 723397, 723893, 724322, 724716, 725095, 726032, 726360, 726948, 727189, 727752, 728044, 728288, 728501, 728716, 728935, 729691, 730079, 730263, 730921, 731092, 733079] +'GU27 3NZ': [713623, 714408, 715138, 715661, 716172, 716661, 717127, 717540, 717975, 718379, 719385, 720115, 720448, 720750, 721054, 721348, 721604, 721873, 723040, 732907, 736738, 736740, 737153, 737154, 737517, 737519, 737802, 737803, 738054, 738055] +'GU29 0NX': [715553, 716022, 717852, 720631, 724966, 725915, 726249, 733643, 733847, 734008, 734128, 734900, 735444, 735492, 735535, 735687, 735857, 735995, 736582, 736640, 736668, 736696, 736802, 736953, 736973, 736995, 737020, 737565, 737847, 738097] +'HA1 1GU': [711808, 711850, 711887, 711916, 711939, 711960, 711980, 711998, 712011, 712027, 712036, 712100, 712122, 712130, 712135, 712140, 712149, 712157, 712164, 712170, 712175, 712180, 712222, 712243, 712320, 712418, 712501, 712565, 712614, 712663] +'PO19 7LS': [740251, 740278, 740305, 740331, 740372, 740395, 740416, 740438, 740459, 740478, 740505, 740527, 740544, 740560, 740574, 740587, 740600, 740613, 740626, 740638, 740651, 740672, 740693, 740704, 740790, 740844, 740884, 740922, 740950, 740979] +'RH16 3QQ': [739532, 739555, 739589, 739613, 739634, 739658, 739678, 739697, 739714, 739731, 739748, 739772, 739789, 739806, 739821, 739835, 739848, 739863, 739875, 739888, 739899, 739909, 739933, 739944, 740025, 740094, 740137, 740168, 740195, 740224] +'SE11 5TT': [713012, 714343, 716123, 716608, 717497, 718343, 719340, 719726, 720078, 720403, 720711, 721013, 721317, 721447, 721571, 721838, 722113, 722573, 723012, 723555, 723793, 724014, 724441, 725963, 726126, 726295, 726454, 727483, 729228, 730700] +'SE18 1BL': [710347, 710608, 713526, 715040, 717046, 718837, 719307, 720052, 721298, 721820, 722996, 723537, 724429, 724814, 725355, 726113, 726444, 726752, 727014, 727840, 728347, 728574, 728781, 729185, 729747, 729949, 730131, 730300, 731137, 731823] +'SE19 2TE': [711300, 711424, 728728, 728731, 728943, 728945, 728946, 728947, 729702, 729703, 729705, 729706, 729899, 729903, 729907, 729908, 729909, 730083, 730084, 730085, 730086, 730087, 730088, 730089, 733803, 735073, 735800, 736441, 736915, 737325] +'SO15 0NS': [713125, 713651, 714438, 715166, 715675, 716194, 716684, 717153, 717561, 717995, 718395, 718990, 719397, 719782, 720129, 720459, 720761, 721067, 721359, 721618, 721886, 722157, 722698, 723052, 725504, 727588, 729335, 730795, 731960, 732942] +'SW9 0SA': [715432, 715790, 715804, 715826, 715845, 715859, 715870, 715880, 715896, 716302, 716309, 716348, 716363, 716376, 716386, 716403, 716794, 716817, 716826, 716836, 716845, 716853, 716860, 716870, 716881, 717253, 717259, 717267, 717274, 717282] +'SW9 9AZ': [725907, 726071, 726399, 726565, 726719, 726855, 727103, 727804, 727954, 728086, 728316, 728427, 728535, 728652, 728750, 729520, 729830, 729931, 730011, 730113, 730203, 730281, 730958, 731038, 731117, 731368, 731427, 731485, 732120, 732180] +'BN3 5GG': [733506, 733507, 733509, 733510, 733512, 733513, 733515, 733516, 733517, 733518, 733519, 733520, 733521, 733522, 733527, 733528, 733533, 733534, 733537, 733538, 733539, 733543, 733544, 733548, 733549, 733552, 733553, 733556, 733557, 733559, 733560] +'BR3 4BA': [713016, 713568, 715087, 716125, 716610, 717087, 717499, 717941, 718344, 718886, 719342, 719727, 720080, 720404, 720713, 721014, 721318, 721572, 721840, 722114, 722578, 723013, 723294, 723556, 723795, 725406, 727487, 729231, 730703, 731861, 732850] +'BR5 2PX': [710433, 710551, 710680, 711485, 712982, 713543, 714326, 715061, 715614, 716108, 716589, 717064, 717484, 717922, 718329, 719322, 719713, 720699, 721001, 721308, 721563, 722107, 722546, 723003, 723547, 724009, 725376, 727455, 729207, 731842, 732828] +'DA1 5JG': [709986, 713291, 713766, 715273, 716282, 716778, 717240, 717650, 718488, 719140, 719479, 719868, 720199, 720538, 720825, 721150, 721690, 721953, 722234, 722858, 723115, 723398, 723660, 723894, 724105, 725660, 727753, 729481, 730922, 732096, 733080] +'DA1 5JU': [710486, 710655, 710864, 719644, 719994, 720316, 720624, 720932, 721233, 721767, 722042, 722937, 723226, 723425, 723430, 723438, 723441, 723484, 723682, 723694, 723697, 723729, 723955, 724176, 724387, 724576, 724773, 724961, 725721, 725910, 726073] +'E1 2NQ': [713048, 713593, 714369, 715105, 715641, 716144, 716626, 717514, 717954, 718912, 719357, 719740, 720090, 720418, 720729, 721030, 721331, 721853, 722614, 723026, 723306, 723804, 724027, 724251, 724450, 724643, 724837, 725778, 729256, 730733, 731888] +'GU27 3QZ': [726440, 726601, 726749, 726888, 727011, 727129, 727837, 727978, 728233, 728343, 728572, 728780, 728881, 729547, 729642, 729848, 729948, 730034, 730224, 730299, 730381, 730978, 731136, 731207, 731327, 731500, 731563, 732138, 732195, 732299, 732350] +'GU29 0NU': [730116, 731197, 731430, 731487, 732124, 732187, 732296, 732391, 732447, 739558, 739559, 739560, 739561, 739562, 739563, 739564, 739565, 739566, 739567, 740199, 740200, 740228, 740229, 740230, 740231, 740232, 740233, 740234, 740235, 740236, 740237] +'ME14 1EZ': [710364, 710532, 710566, 710630, 710649, 710690, 710841, 713257, 713744, 714533, 715249, 715746, 716267, 716761, 717224, 717635, 718468, 719119, 719467, 720521, 720810, 721676, 722214, 722821, 723100, 723647, 723879, 725633, 727715, 730901, 732069] +'N7 8HW': [712828, 713401, 714206, 714920, 715532, 715988, 716480, 716945, 717387, 717824, 719223, 719630, 719981, 720299, 721218, 721497, 722385, 722922, 723217, 723469, 723720, 724165, 724376, 724564, 724762, 724952, 725210, 725713, 727300, 730527, 732688] +'NW10 8EQ': [713034, 714359, 715637, 716619, 717507, 718350, 720411, 721018, 721577, 722119, 722601, 723298, 723798, 724242, 724637, 725969, 726302, 726617, 726900, 727143, 727503, 727994, 728246, 728463, 730722, 739191, 739192, 739197, 739199, 739201, 739202] +'PE2 5HP': [740241, 740270, 740298, 740325, 740350, 740366, 740389, 740411, 740433, 740454, 740474, 740495, 740523, 740540, 740557, 740572, 740585, 740598, 740611, 740624, 740636, 740648, 740662, 740690, 740701, 740712, 740780, 740834, 740874, 740912, 740970] +'PE4 6GG': [721911, 722189, 723081, 723351, 739527, 739550, 739584, 739608, 739631, 739653, 739673, 739692, 739709, 739726, 739744, 739767, 739785, 739802, 739818, 739832, 739845, 739860, 739873, 739886, 739928, 740020, 740089, 740132, 740163, 740190, 740219] +'SE16 4BF': [733874, 734032, 734153, 734272, 734371, 734490, 734579, 734661, 734726, 734791, 734938, 735118, 735184, 735241, 735306, 735355, 735411, 735459, 735503, 735546, 735590, 735726, 735869, 735916, 735962, 736006, 736050, 736084, 736344, 736836, 738124] +'SE6 4NE': [710511, 710568, 714112, 714123, 715454, 715470, 716410, 716424, 717314, 717326, 717334, 718173, 718181, 719569, 719575, 720258, 720854, 720872, 721441, 721457, 721996, 722277, 722297, 723172, 723179, 723184, 723678, 723692, 729026, 730449, 730455] +'SO31 6RL': [739525, 739547, 739581, 739605, 739628, 739650, 739670, 739689, 739707, 739724, 739742, 739764, 739783, 739801, 739816, 739831, 739843, 739859, 739871, 739885, 739896, 739907, 739925, 739941, 739951, 740017, 740086, 740129, 740160, 740187, 740216] +'SW4 6SB': [712997, 713554, 715070, 716598, 717074, 717490, 717929, 718337, 718874, 719331, 720070, 721005, 721313, 721568, 721834, 722561, 723007, 723289, 723553, 723791, 724012, 724440, 724824, 725010, 725765, 725961, 726124, 727470, 730683, 731850, 732837] +'SW4 6TE': [713226, 714512, 715729, 716741, 718450, 719088, 719448, 719832, 720173, 720507, 720799, 721120, 721400, 721925, 722202, 722792, 723091, 723366, 723867, 724088, 724300, 724496, 724894, 725080, 725604, 725825, 726188, 727689, 729422, 730878, 733032] +'BN2 4EU': [710941, 711311, 711420, 711431, 724481, 724681, 724876, 725813, 726002, 726173, 726331, 726494, 726655, 726801, 726928, 727056, 727171, 727882, 728022, 728147, 728268, 728383, 728485, 728611, 728704, 728812, 729578, 729677, 729783, 729882, 730069, 730253] +'DA1 5UN': [709861, 710018, 710137, 710249, 710341, 710415, 710485, 710543, 710603, 710636, 710677, 710807, 710848, 710881, 710904, 710926, 710959, 711035, 711068, 711094, 711112, 711134, 711245, 711262, 711277, 711289, 711304, 711323, 711382, 711400, 711412, 711584] +'E2 9AE': [713386, 714194, 714909, 715520, 715973, 717375, 717812, 718223, 718668, 719210, 719615, 719969, 720601, 720915, 721208, 721489, 722365, 722916, 723211, 723463, 723939, 724156, 724370, 724756, 724944, 726388, 726550, 727282, 729027, 730511, 731679, 732674] +'E2 9RJ': [712762, 713348, 714154, 714869, 715497, 715942, 716436, 716903, 717342, 717735, 717776, 718196, 718622, 719185, 719946, 720263, 720892, 721727, 722001, 722319, 722898, 723194, 723926, 724139, 724356, 724743, 724927, 725146, 727245, 728982, 730472, 731636] +'N1 7BA': [712757, 712758, 713342, 713343, 714149, 714150, 714864, 715493, 715937, 716432, 716897, 717339, 717771, 718194, 718617, 719182, 719591, 722314, 722315, 725140, 725141, 727240, 727241, 728975, 728976, 730468, 730469, 731631, 731632, 732634, 732635, 733136] +'PO19 6UP': [716977, 722052, 723233, 723736, 724582, 729523, 729725, 729935, 734647, 734776, 735103, 735170, 735228, 735291, 735341, 735400, 735445, 735493, 735858, 735949, 736036, 736110, 736306, 736454, 736521, 736641, 736928, 736974, 737021, 737067, 737198, 737848] +'RH11 8AZ': [709876, 710027, 710203, 710638, 710702, 710755, 710836, 710928, 711038, 714316, 715606, 717050, 717913, 720055, 720995, 721824, 722999, 723541, 724005, 724227, 724432, 724625, 724999, 725362, 725956, 726115, 726286, 726446, 727443, 729192, 730667, 731830] +'RH1 2BL': [710732, 712879, 714234, 716510, 717409, 718263, 719651, 720002, 720323, 720630, 720942, 721244, 721515, 721773, 722051, 722945, 723492, 723960, 724393, 724778, 725727, 726078, 726405, 726722, 726985, 727339, 727807, 728089, 728321, 728539, 730568, 732725] +'SE14 5AP': [712795, 713373, 714179, 715046, 715605, 715959, 716454, 716918, 717363, 717797, 718212, 718655, 719606, 719961, 720277, 720594, 720907, 721204, 721479, 721738, 722015, 722351, 722909, 723206, 723455, 723709, 725176, 727268, 729009, 730496, 731662, 732660] +'SE18 4JY': [711733, 716046, 717004, 717873, 721264, 721790, 722963, 723508, 723969, 724403, 724790, 725735, 726089, 727814, 728099, 728327, 731127, 731253, 731371, 731492, 732129, 732245, 732343, 732451, 732538, 737070, 737113, 737338, 737380, 737423, 737489, 737667] +'SO17 2JU': [711438, 726329, 726492, 726799, 726926, 727055, 727169, 727880, 728020, 728146, 728267, 728382, 728483, 728609, 728702, 728810, 728917, 729576, 729675, 729781, 729880, 729970, 730067, 730158, 730323, 730412, 730998, 731080, 731153, 731227, 731282, 731342] +'SW9 9DU': [713136, 713661, 714445, 715682, 716201, 716689, 717160, 718399, 718999, 719404, 719788, 720137, 720464, 720766, 721075, 721890, 722162, 722708, 723057, 723831, 724057, 724470, 724865, 725516, 726164, 726323, 726485, 727598, 729343, 730805, 731970, 732954] +'CR0 4FB': [733848, 734129, 734350, 734564, 734711, 734901, 735104, 735229, 735342, 735446, 735536, 735859, 735950, 736037, 736111, 736177, 736307, 736455, 736522, 736583, 736642, 736697, 736929, 736975, 737022, 737068, 737111, 737199, 737336, 737378, 737421, 737457, 737849] +'HA1 4GE': [739217, 739227, 739239, 739248, 739257, 739266, 739275, 739284, 739293, 739302, 739310, 739317, 739327, 739337, 739344, 739351, 739358, 739364, 739370, 739375, 739379, 739383, 739387, 739396, 739399, 739402, 739405, 739420, 739435, 739444, 739453, 739462, 739471] +'N7 8BA': [713440, 715554, 716024, 716515, 716979, 717412, 717855, 719248, 720006, 720326, 720633, 721247, 721518, 721777, 722053, 722951, 723236, 723497, 723963, 724782, 724967, 726082, 726252, 726575, 726864, 727109, 727962, 728209, 728433, 729835, 730017, 730572, 731736] +'N7 8HY': [710792, 711058, 713237, 714522, 715234, 715738, 717213, 718456, 719454, 719838, 720512, 720802, 721126, 721405, 721669, 722207, 723371, 723642, 723872, 724092, 724499, 725082, 725613, 726190, 726346, 726515, 726669, 726817, 726943, 728161, 728280, 729432, 732047] +'PO19 6UR': [716647, 720439, 721047, 721598, 722140, 722646, 727543, 729768, 732891, 733885, 734376, 734584, 734731, 734952, 735124, 735247, 735465, 735875, 735969, 736058, 736129, 736193, 736359, 736535, 736653, 736707, 736939, 736985, 737033, 737080, 737123, 737249, 737346] +'PO19 7HX': [713709, 714502, 715219, 715722, 716238, 716733, 717197, 718043, 718440, 719932, 720167, 720498, 721114, 721395, 721918, 723358, 723633, 723863, 724085, 724294, 724690, 724891, 725076, 725585, 726009, 726182, 726934, 727064, 727175, 727674, 728152, 728273, 728385] +'PO19 7QJ': [716188, 716677, 717146, 717989, 718390, 719394, 719777, 720126, 720759, 721612, 722153, 723047, 723596, 724266, 724467, 724856, 725796, 725985, 726159, 726788, 727045, 727869, 728371, 729566, 737705, 737734, 737764, 737790, 737963, 738012, 738033, 738047, 738196] +'SE11 5TR': [726713, 728299, 728411, 728516, 728637, 728844, 729505, 729912, 730099, 730191, 730271, 730351, 730949, 731027, 731103, 731180, 731417, 731475, 731538, 732110, 732173, 732277, 732436, 732486, 732527, 732566, 733097, 733135, 733192, 733271, 733302, 733340, 733371] +'SE16 3EW': [710369, 710598, 717307, 717662, 717676, 717689, 717709, 717721, 718095, 718126, 718140, 718495, 718507, 718517, 718536, 718544, 719498, 719513, 719530, 719543, 719901, 719908, 720219, 720225, 720230, 720240, 720242, 720545, 720549, 720554, 720556, 720832, 720834] +'SE18 6SZ': [710604, 710960, 711169, 711470, 712870, 713429, 714230, 714948, 715543, 716010, 716501, 716969, 717403, 717847, 718258, 718731, 719238, 719646, 719996, 720318, 720937, 721238, 721509, 721768, 722048, 722420, 722941, 723230, 723489, 723735, 729079, 731726, 732718] +'SE8 3DD': [710572, 711030, 716921, 717366, 717801, 718214, 719202, 719609, 719963, 720595, 720908, 721205, 721481, 721740, 722017, 722911, 723207, 723457, 723711, 723936, 724151, 724366, 724549, 724753, 724940, 725887, 726057, 726384, 726544, 729917, 729995, 730102, 730193] +'SE8 3GB': [728472, 728595, 728692, 728796, 728903, 729559, 729663, 729767, 729867, 729961, 730055, 730146, 730240, 730312, 730402, 730988, 731070, 731145, 731218, 731272, 731336, 731385, 731451, 731511, 731572, 732149, 732203, 732258, 732308, 732358, 732404, 732460, 732509] +'SW10 0NT': [713321, 713322, 713324, 713326, 713330, 713332, 713334, 713335, 719164, 719165, 719167, 719169, 719171, 719173, 719176, 719178, 719179, 722883, 722886, 722888, 722890, 722892, 722894, 725681, 725683, 725685, 725687, 725689, 725691, 727773, 727775, 727777, 727780] +'SW9 0RY': [726938, 727066, 727178, 728029, 728156, 728387, 728818, 728926, 729586, 729681, 729792, 729886, 729975, 730072, 730166, 730328, 730416, 731005, 731083, 731157, 731232, 731287, 731346, 731399, 731460, 732158, 732211, 732367, 732419, 732470, 732552, 733173, 733221] +'SW9 9DR': [712782, 713367, 714886, 715508, 715954, 716448, 716914, 717356, 718208, 718643, 719194, 719603, 719956, 720274, 720588, 721200, 721473, 721734, 722012, 722337, 723452, 723706, 723933, 724147, 724363, 724544, 724751, 724935, 725165, 725701, 729000, 730487, 732655] +'SW9 9DS': [725884, 726222, 726382, 726543, 726703, 726839, 726967, 727091, 727787, 727792, 727940, 728188, 728300, 728412, 728517, 728638, 728733, 728845, 729814, 729914, 730100, 730192, 730272, 730352, 730950, 731028, 731104, 731182, 731306, 731357, 731418, 731476, 732111] +'SW9 9DX': [726645, 726794, 727049, 727164, 728141, 728262, 728376, 728479, 728606, 728700, 728913, 729572, 729777, 729876, 730063, 730153, 730246, 730319, 730994, 731390, 731455, 731516, 732151, 732207, 732312, 732361, 732410, 732464, 732549, 732593, 733121, 733168, 733217] +'SW9 9HB': [712919, 713476, 714268, 714993, 715570, 716055, 716545, 717012, 717439, 717883, 718287, 718779, 719276, 719674, 720353, 720657, 720962, 721268, 721535, 722072, 722470, 722968, 723250, 723512, 723752, 724199, 724408, 724979, 727385, 729132, 730609, 731772, 732762] +'BN16 1TG': [711493, 713073, 713614, 714392, 715124, 716159, 716646, 717115, 717528, 717967, 718372, 718936, 719374, 719758, 720105, 720437, 720742, 721045, 721342, 721596, 721866, 722138, 722645, 723034, 723313, 723580, 723813, 724032, 724257, 725455, 727542, 729285, 731913, 732890] +'CT5 1SX': [709906, 709981, 710058, 710114, 710219, 710319, 710391, 710467, 710533, 710592, 710631, 710664, 710710, 710842, 710877, 710897, 710920, 710943, 711023, 711059, 711090, 711105, 711125, 711372, 711634, 716216, 717171, 718014, 719415, 720145, 720774, 721371, 721900, 723066] +'E1 0LW': [724550, 725703, 725888, 726058, 726385, 726545, 726706, 726841, 727944, 728075, 728190, 728305, 728523, 728639, 728738, 728846, 729712, 729818, 729920, 729996, 730104, 730194, 730354, 730952, 731031, 731307, 731420, 731539, 732114, 732231, 732330, 732380, 732568, 733195] +'HA9 8PQ': [738365, 738381, 738398, 738418, 738427, 738447, 738454, 738482, 738490, 738500, 738518, 738532, 738539, 738564, 738577, 738581, 738584, 738588, 738592, 738598, 738604, 738616, 738619, 738633, 738722, 738746, 738843, 738920, 738931, 738941, 739003, 739005, 739006, 739100] +'PO15 6TA': [713036, 713584, 714361, 715100, 716134, 716620, 717096, 717508, 717950, 718351, 718903, 719350, 719733, 720084, 720412, 720722, 721019, 721325, 721578, 721846, 722120, 722602, 723020, 723299, 723563, 723799, 724019, 724243, 725426, 727504, 729248, 730724, 731881, 732866] +'RH15 0TD': [710536, 710803, 710825, 710899, 713311, 713772, 714568, 715282, 716291, 716784, 717244, 717653, 718081, 719157, 720205, 721153, 721426, 721692, 722238, 723403, 724110, 724512, 724911, 725100, 725675, 725843, 726365, 726681, 726952, 727194, 727764, 727905, 730932, 733092] +'RH16 4SH': [710657, 710681, 710871, 710916, 711087, 711103, 711266, 719352, 719734, 720086, 720414, 720724, 721022, 721327, 722123, 723022, 723300, 723567, 724022, 724246, 724446, 724833, 725023, 725772, 725971, 726136, 726461, 726769, 726902, 727027, 727146, 727854, 727996, 728248] +'SE8 3GA': [714744, 720106, 720438, 720743, 721046, 721343, 721597, 721867, 722139, 723036, 723314, 723582, 723814, 724034, 724258, 724456, 724652, 724845, 725035, 725786, 725977, 726149, 726312, 726470, 726632, 726779, 726910, 727036, 727154, 727862, 728005, 728133, 728256, 728365] +'SW9 9DD': [725893, 726387, 726549, 726707, 726844, 726972, 727093, 728076, 728193, 728417, 728524, 728640, 728740, 729512, 729613, 729713, 729819, 729921, 729997, 730105, 730195, 730355, 730953, 731032, 731107, 731183, 731245, 731308, 731358, 731421, 731479, 731540, 731678, 732115] +'BN3 5NQ': [712498, 733697, 733890, 734046, 734170, 734280, 734382, 734499, 734589, 734669, 734737, 734800, 734961, 735129, 735194, 735255, 735312, 735364, 735419, 735467, 735512, 735555, 735597, 735746, 735879, 735923, 735973, 736011, 736061, 736090, 736367, 736853, 737612, 737899, 738140] +'BN41 2UZ': [720050, 720377, 720686, 720991, 721295, 721552, 721818, 722097, 722994, 723274, 723535, 723777, 724000, 724222, 724426, 724620, 724812, 724995, 725756, 725953, 726112, 726284, 726442, 726603, 726751, 726889, 727013, 727130, 727838, 727979, 728113, 728234, 728346, 728452, 728573] +'E2 7AA': [714411, 716174, 717130, 717543, 717977, 718381, 719388, 720450, 720752, 721056, 721350, 722145, 723042, 723588, 723820, 724039, 724262, 724656, 724848, 725980, 726152, 726315, 726635, 726781, 726912, 727038, 727864, 728007, 728258, 728367, 728694, 728905, 730767, 731928, 732910] +'ME16 8FU': [710640, 710658, 710683, 710704, 710814, 710837, 710854, 710872, 710885, 710909, 711801, 711847, 711883, 711913, 711944, 711966, 711983, 712001, 712016, 712030, 712038, 712093, 712125, 712131, 712136, 712142, 712151, 712159, 712215, 712313, 712411, 712494, 712560, 712610, 712660] +'ME9 9SH': [713129, 713654, 715170, 716198, 717157, 717999, 718995, 719399, 720132, 720762, 722703, 724669, 725050, 725508, 726641, 726921, 727161, 727592, 727872, 728139, 728374, 728605, 728805, 729337, 729569, 729670, 729775, 729874, 729967, 730151, 730317, 730799, 730993, 731964, 732949] +'N7 9EN': [713830, 713944, 713974, 714004, 714044, 714105, 714591, 714650, 714698, 714725, 731400, 731523, 731586, 732159, 732212, 732267, 732316, 732420, 732471, 732553, 732598, 733174, 733295, 733330, 733363, 733401, 733439, 733474, 739204, 739205, 739206, 739207, 739208, 739209, 739210] +'NW10 8GP': [709801, 709842, 709870, 709907, 709950, 709982, 710022, 710059, 710098, 710115, 710145, 710172, 710195, 710220, 710256, 710279, 710296, 710320, 710365, 710426, 710468, 710748, 710798, 710972, 711024, 711185, 711234, 711333, 711373, 711478, 711521, 711594, 711635, 712652, 712674] +'NW10 8LP': [713755, 714544, 715259, 715751, 716275, 716766, 717232, 717638, 718475, 719127, 719856, 720192, 720525, 721140, 721415, 721681, 721946, 722222, 722843, 723106, 723652, 723884, 724097, 724315, 724502, 724706, 724901, 725089, 725645, 725834, 726025, 726354, 727733, 732083, 733068] +'PE2 5GQ': [739522, 739544, 739578, 739602, 739625, 739647, 739668, 739687, 739705, 739722, 739740, 739761, 739781, 739800, 739815, 739830, 739842, 739858, 739870, 739884, 739895, 739906, 739922, 739940, 739950, 739957, 739965, 739970, 739978, 740014, 740083, 740126, 740157, 740184, 740213] +'SE16 4JA': [740248, 740276, 740303, 740330, 740353, 740370, 740393, 740415, 740436, 740457, 740477, 740502, 740525, 740542, 740559, 740573, 740586, 740599, 740612, 740625, 740637, 740650, 740669, 740692, 740703, 740714, 740723, 740732, 740741, 740787, 740841, 740881, 740919, 740947, 740977] +'SE18 4NA': [711549, 713777, 721745, 722917, 723464, 723940, 724371, 724757, 725707, 726059, 726389, 726708, 726973, 727793, 728077, 728308, 728525, 728741, 729513, 729714, 729923, 730107, 730276, 730954, 731109, 731360, 732117, 732332, 732438, 732529, 733100, 733196, 733273, 733342, 733419] +'SW9 0ST': [712929, 713487, 714278, 715003, 716062, 716551, 717016, 717444, 718290, 718792, 719281, 719677, 720029, 720357, 720664, 720967, 721272, 721539, 721800, 722076, 722479, 722975, 723520, 723754, 723978, 724201, 724412, 724598, 724796, 725311, 725741, 727393, 729145, 731786, 732774] +'SW9 9BA': [714430, 715161, 715672, 716191, 717150, 717556, 717991, 718392, 718986, 719779, 720127, 720457, 721063, 721356, 721614, 722693, 723049, 723599, 723824, 724048, 724268, 724469, 724665, 725045, 725500, 725799, 725986, 726318, 726481, 726790, 726918, 727159, 727584, 727871, 731953] +'CT4 7LE': [710675, 710924, 711691, 712825, 713398, 714203, 714918, 715530, 715986, 716477, 716941, 717385, 717821, 718235, 718681, 719217, 719627, 719976, 720297, 720607, 720924, 721215, 722034, 722382, 722921, 723216, 723467, 723719, 723943, 724164, 724375, 725207, 727297, 729036, 730523, 731688] +'DA11 8EB': [710483, 710601, 710956, 713414, 714934, 716001, 716491, 716955, 717396, 717837, 718248, 718704, 719638, 719990, 720307, 720927, 721226, 721502, 721759, 722037, 722928, 723220, 723475, 723723, 723951, 724382, 724768, 725719, 729058, 731709, 741069, 741086, 741132, 741188, 741230, 741257] +'E1 1BN': [712796, 713797, 713844, 713879, 719497, 719505, 719512, 719521, 719529, 719537, 719542, 719549, 719555, 723120, 723124, 723130, 723138, 725844, 725847, 725849, 725851, 727907, 727909, 727911, 727912, 727915, 727918, 727921, 727925, 727928, 729599, 729600, 729601, 731013, 731014, 731015] +'ME14 2EL': [710288, 710867, 711080, 711142, 711297, 712804, 713380, 714185, 714902, 715966, 718216, 718660, 719611, 720282, 720910, 721483, 722020, 722273, 722287, 722357, 723208, 724153, 724551, 724941, 725186, 725890, 726546, 726842, 727274, 727945, 728191, 728415, 729018, 730502, 731671, 732666] +'N1 7FX': [714428, 715671, 732932, 733571, 733815, 733981, 734100, 734240, 734332, 734449, 734548, 734628, 734697, 734761, 734830, 734833, 735086, 735152, 735212, 735275, 735329, 735387, 735434, 735482, 735526, 735570, 735622, 735846, 735894, 735939, 736242, 736746, 737158, 737523, 737806, 738057] +'NN1 3AE': [740256, 740284, 740311, 740336, 740377, 740399, 740420, 740442, 740463, 740482, 740511, 740531, 740548, 740564, 740577, 740590, 740603, 740616, 740629, 740641, 740654, 740678, 740696, 740707, 740717, 740726, 740735, 740744, 740752, 740760, 740796, 740850, 740890, 740927, 740956, 740985] +'NW10 8SA': [718581, 718592, 718598, 718603, 718606, 718607, 718608, 718609, 738377, 738394, 738436, 738437, 738451, 738478, 738552, 738659, 738731, 738732, 738733, 738769, 738781, 738807, 738844, 738852, 738866, 738869, 738877, 738883, 738894, 738901, 738918, 738943, 738982, 739034, 739081, 739092] +'RH11 7UQ': [710104, 710207, 710891, 710983, 713049, 713594, 714370, 715107, 717100, 717515, 717955, 718355, 718913, 719358, 719741, 720092, 720419, 720730, 721031, 721332, 721584, 721854, 722616, 723027, 723307, 723572, 723805, 724028, 724451, 724644, 724838, 727516, 729257, 730734, 731889, 732872] +'SE16 3EN': [709925, 713803, 713884, 714018, 714084, 714600, 714660, 714709, 715383, 715414, 715438, 715786, 727104, 727955, 728202, 728428, 728653, 728856, 729623, 729831, 730012, 730204, 730363, 731039, 731192, 731316, 731549, 732181, 732290, 732387, 732494, 733147, 733232, 733377, 733448, 741385] +'SE28 8LQ': [713193, 713700, 714487, 715210, 715921, 716416, 716887, 717321, 717599, 718032, 718433, 719433, 719815, 720158, 720567, 720574, 720788, 721654, 722265, 723176, 723352, 723627, 723859, 724080, 724290, 724490, 724726, 724734, 724885, 726178, 727656, 730445, 730452, 730849, 732013, 733003] +'SW9 9AB': [712821, 714199, 715527, 715983, 716471, 717818, 718230, 718678, 719622, 719973, 720604, 721212, 721750, 722031, 722377, 722920, 723215, 723718, 723942, 724161, 724373, 724558, 724759, 724948, 725202, 725710, 725897, 726231, 726391, 726555, 726711, 727291, 729033, 730519, 731684, 732682] +'SW9 9AD': [713350, 714156, 714870, 715943, 716904, 717343, 717777, 718197, 718624, 719947, 720264, 720582, 720893, 721191, 721463, 721728, 722002, 722321, 722899, 723445, 723700, 723927, 724535, 724744, 724928, 725695, 725876, 726054, 726218, 726700, 726836, 726963, 727247, 728984, 730474, 731638] +'TN2 3BB': [710929, 711299, 719348, 720082, 720719, 721323, 721843, 723018, 723561, 723797, 724017, 724241, 724444, 724636, 725017, 725770, 725968, 726133, 726301, 726458, 726616, 726766, 726899, 727024, 727142, 727851, 727993, 728245, 728462, 728893, 729656, 729860, 730047, 730234, 730393, 731067] +'E1 0DU': [712927, 713484, 714275, 715000, 715577, 716550, 717443, 718289, 718790, 719676, 720356, 720663, 720966, 721271, 721538, 721799, 722075, 722973, 723518, 723753, 723976, 724597, 724795, 725309, 725740, 725933, 726096, 726267, 726420, 726736, 726875, 726999, 727391, 727821, 728221, 730619, 731783] +'N1 7DJ': [728027, 728275, 728709, 728923, 729679, 733608, 733829, 733991, 734112, 734250, 734340, 734457, 734554, 734634, 734702, 734766, 734866, 735093, 735156, 735217, 735280, 735332, 735390, 735437, 735484, 735528, 735572, 735652, 735849, 735897, 735942, 736272, 736771, 737175, 737541, 737824, 738074] +'NW10 8EY': [713181, 714479, 715706, 716716, 717592, 718424, 719804, 720484, 721100, 721646, 722183, 722757, 723344, 723851, 724286, 724683, 725065, 726004, 726333, 726656, 726930, 727172, 727642, 728023, 728271, 728486, 728706, 728920, 729678, 729883, 730070, 730255, 730413, 730838, 731082, 731229, 732990] +'PO6 4EZ': [710858, 713162, 713676, 714466, 715188, 716217, 716705, 717172, 717582, 718015, 718412, 719027, 719416, 719798, 720146, 720477, 720775, 721090, 721372, 721637, 721901, 722175, 722738, 723067, 723336, 723843, 724068, 724278, 724478, 724677, 724872, 725059, 725544, 725811, 725997, 726170, 727624] +'SE13 5EA': [712019, 712039, 712259, 712363, 734108, 734247, 734338, 734455, 734632, 735090, 735154, 735215, 735278, 735389, 735436, 735527, 735571, 735646, 735847, 735895, 735940, 735988, 736026, 736143, 736171, 736210, 736265, 736448, 736486, 736550, 736575, 736606, 736665, 736689, 736766, 737538, 738069] +'CR0 4FD': [712585, 726863, 727108, 727961, 728208, 728432, 728658, 728861, 729627, 729834, 730016, 730208, 730367, 731043, 731198, 731321, 733946, 733955, 733965, 733978, 733980, 734086, 734090, 734092, 734096, 734098, 734215, 737774, 737970, 737993, 738017, 738039, 738050, 738201, 738212, 738222, 738234, 738244] +'CT5 1ND': [740263, 740292, 740319, 740343, 740361, 740384, 740406, 740427, 740449, 740470, 740489, 740519, 740537, 740554, 740569, 740582, 740595, 740608, 740621, 740634, 740646, 740659, 740686, 740700, 740711, 740721, 740730, 740739, 740748, 740756, 740764, 740771, 740803, 740858, 740898, 740935, 740964, 740993] +'N7 9ET': [711407, 712881, 713890, 713954, 714241, 716516, 717413, 718267, 719656, 720327, 720945, 721519, 722054, 722431, 723739, 724186, 724968, 725917, 726576, 726865, 727344, 727963, 728210, 728434, 728545, 728659, 729628, 730209, 730368, 730573, 731044, 731199, 731555, 732189, 732392, 732729, 733237, 733381] +'PO18 8AG': [740243, 740272, 740300, 740327, 740368, 740391, 740413, 740456, 740476, 740497, 740649, 740664, 740691, 740702, 740713, 740722, 740731, 740740, 740749, 740757, 740765, 740772, 740782, 740807, 740813, 740816, 740818, 740820, 740822, 740824, 740826, 740828, 740830, 740836, 740876, 740914, 740942, 740972] +'PO19 7LG': [720184, 735002, 735422, 735601, 735886, 735928, 735981, 736015, 736094, 736203, 736230, 736481, 736510, 736544, 736661, 736684, 736717, 739556, 739591, 739615, 739636, 739660, 739680, 739699, 739716, 739733, 739750, 739791, 739808, 739837, 739850, 740096, 740139, 740170, 740197, 740226, 740265, 740688] +'RH10 1AH': [711965, 712124, 712255, 712266, 712273, 712331, 733735, 733918, 734066, 734196, 734290, 734515, 734608, 734679, 734748, 734808, 735000, 735201, 735267, 735319, 735374, 735421, 735473, 735515, 735561, 735600, 735781, 735885, 735926, 735979, 736066, 736093, 736201, 736885, 737292, 737638, 737927, 738167] +'SE11 5SB': [713187, 713694, 714482, 715203, 715709, 716719, 717595, 718030, 718427, 719430, 719809, 720155, 720487, 720785, 721386, 722185, 722763, 723078, 723624, 723855, 724077, 724287, 724487, 724685, 724883, 725069, 725565, 725818, 726005, 726334, 726502, 726657, 726806, 726931, 727059, 727647, 730843, 732008] +'SE13 6QX': [733726, 740290, 740317, 740341, 740382, 740404, 740425, 740447, 740468, 740487, 740517, 740535, 740552, 740567, 740580, 740593, 740606, 740619, 740632, 740644, 740657, 740684, 740698, 740709, 740719, 740728, 740737, 740746, 740754, 740762, 740769, 740776, 740811, 740856, 740896, 740933, 740962, 740991] +'SO19 0TQ': [710600, 710805, 712764, 713351, 714159, 714872, 715500, 715945, 716437, 716906, 717344, 717779, 718199, 718626, 719187, 719593, 719949, 720266, 720895, 721193, 721465, 721729, 722004, 722323, 723195, 723448, 723701, 723928, 724141, 724358, 724537, 724746, 725148, 727249, 728986, 730476, 731640, 732640] +'SO19 0TR': [710559, 713148, 713668, 714453, 715182, 715689, 716207, 716699, 717165, 717578, 718007, 718406, 719013, 719411, 719794, 720471, 720771, 721083, 721366, 721630, 721895, 722173, 722721, 723061, 723332, 723607, 723836, 724063, 724275, 724473, 724673, 724867, 725529, 727613, 729352, 730813, 731978, 732963] +'BN2 4QJ': [740262, 740291, 740318, 740342, 740383, 740405, 740426, 740448, 740469, 740488, 740518, 740536, 740553, 740568, 740581, 740594, 740607, 740620, 740633, 740645, 740658, 740685, 740699, 740710, 740720, 740729, 740738, 740747, 740755, 740763, 740770, 740777, 740802, 740812, 740857, 740897, 740934, 740963, 740992] +'CT4 7LF': [711250, 711441, 711529, 711550, 721496, 724562, 725711, 725900, 726063, 726235, 726393, 726558, 726714, 726849, 726977, 727098, 727799, 728080, 728197, 728312, 728422, 728530, 728645, 728744, 728850, 729516, 729618, 729718, 729823, 729928, 730001, 730110, 730198, 730358, 731035, 731111, 731187, 731312, 731363] +'E2 9BB': [712763, 714157, 714871, 715944, 716905, 717778, 718198, 718625, 719592, 720265, 720852, 720894, 721192, 721464, 722003, 722322, 722900, 723421, 723446, 724140, 724357, 724536, 724745, 724929, 725696, 725877, 726055, 726378, 726541, 726837, 726964, 727248, 727938, 728068, 728186, 728985, 730475, 731639, 732639] +'ME16 0GQ': [710589, 710663, 710860, 710912, 710942, 711089, 711257, 718444, 719442, 719827, 720169, 720795, 721117, 721396, 721921, 722200, 723089, 723362, 723865, 724087, 724297, 724693, 724893, 725824, 726012, 726185, 726508, 726660, 726811, 726935, 727065, 727177, 727890, 739023, 739024, 739026, 739028, 739030, 739032] +'N7 9LD': [714667, 714715, 715317, 715389, 715417, 715443, 715788, 715824, 715858, 715878, 715907, 716336, 716360, 716824, 716841, 716856, 717285, 717308, 717691, 717712, 718097, 718129, 718155, 718496, 718509, 718520, 718545, 719499, 719516, 719532, 719544, 719895, 719903, 720226, 720546, 720550, 720557, 720833, 720837] +'PO18 0DQ': [712943, 713500, 714292, 715015, 716070, 716559, 717027, 717897, 718299, 718808, 719290, 719685, 720038, 720366, 720672, 721280, 721543, 721806, 722083, 723260, 723526, 723763, 723986, 724209, 724607, 725329, 725941, 726881, 727123, 727407, 727974, 728228, 728671, 728875, 729161, 729638, 730219, 731804, 732788] +'PO20 1QL': [740253, 740281, 740308, 740334, 740375, 740397, 740418, 740440, 740461, 740480, 740508, 740529, 740546, 740562, 740576, 740589, 740602, 740615, 740628, 740640, 740653, 740675, 740695, 740706, 740716, 740725, 740734, 740743, 740751, 740759, 740767, 740774, 740793, 740809, 740847, 740887, 740925, 740953, 740982] +'RH1 6GF': [712176, 712250, 712526, 712584, 712629, 712678, 733944, 733954, 733964, 733977, 735371, 735471, 735883, 736064, 736136, 736199, 736478, 737350, 737394, 737471, 737497, 737678, 737710, 737738, 737768, 737965, 737988, 738034, 738048, 738197, 738210, 738230, 738243, 738805, 738821, 738824, 738827, 738830, 738833] +'SE11 5TS': [713360, 714166, 714879, 715452, 715504, 715950, 717351, 717736, 717786, 718203, 719191, 719953, 721197, 721469, 722011, 722331, 723199, 723450, 723704, 723932, 724115, 724145, 724362, 724541, 724749, 724932, 725110, 725157, 725700, 725882, 726056, 726221, 726838, 727090, 727786, 728069, 728187, 728994, 730483] +'SE18 6TX': [723722, 723946, 724167, 724378, 724566, 724765, 724953, 725714, 725902, 726067, 726239, 726395, 726563, 726715, 726851, 726978, 727099, 727800, 727949, 728083, 728198, 728313, 728423, 728531, 733622, 733832, 733994, 734115, 734252, 734342, 734459, 734881, 735666, 736286, 736779, 737183, 737548, 737830, 738080] +'BN3 5UD': [712025, 712258, 712661, 733686, 733881, 734040, 734160, 734274, 734375, 734494, 734582, 734665, 734794, 734949, 735122, 735187, 735245, 735308, 735359, 735416, 735463, 735510, 735552, 735594, 735736, 735872, 735920, 735967, 736009, 736087, 736126, 736158, 736190, 736224, 736356, 736468, 736846, 737245, 737604, 737889] +'N7 8HQ': [711104, 713196, 713702, 714489, 715212, 715713, 716725, 717191, 718035, 718436, 719059, 719435, 719817, 720160, 720494, 721107, 721391, 721657, 722192, 722768, 723084, 723354, 723629, 723860, 724082, 724291, 724492, 724887, 725073, 725572, 725821, 726007, 726336, 726808, 727062, 727660, 729399, 730852, 732017, 733005] +'PE7 3YL': [739528, 739551, 739585, 739609, 739654, 739674, 739693, 739710, 739727, 739745, 739768, 739786, 739803, 739819, 739833, 739846, 739861, 739874, 739887, 739898, 739908, 739929, 739943, 739952, 739959, 739972, 739979, 739985, 739991, 739997, 740003, 740021, 740032, 740038, 740044, 740090, 740133, 740164, 740191, 740220] +'SE1 6JW': [720416, 720727, 721026, 721329, 721581, 721849, 722125, 723024, 723303, 723570, 723800, 724025, 724249, 724448, 724641, 724835, 725025, 725775, 725973, 726139, 726306, 733793, 733935, 734081, 734210, 735058, 735822, 736427, 736436, 736906, 736913, 737323, 737655, 737660, 737947, 737951, 738188, 741403, 741436, 741457] +'SE5 0TN': [738794, 738803, 738818, 738845, 738859, 738867, 738875, 738881, 738887, 738892, 738899, 738915, 738921, 738924, 738925, 738927, 738928, 738929, 738932, 738934, 738937, 738942, 738955, 738961, 738964, 738967, 738969, 738971, 738973, 738975, 738977, 738979, 738981, 738997, 739002, 739019, 739048, 739071, 739089, 739101] +'PE2 8ND': [740259, 740287, 740314, 740339, 740359, 740380, 740402, 740423, 740445, 740466, 740485, 740514, 740533, 740550, 740565, 740578, 740591, 740604, 740617, 740630, 740642, 740655, 740681, 740697, 740708, 740718, 740727, 740736, 740745, 740753, 740761, 740768, 740775, 740799, 740810, 740815, 740853, 740893, 740930, 740959, 740988] +'SE18 2AF': [710244, 711163, 711462, 711579, 712278, 712340, 712343, 712348, 712351, 712356, 712360, 712364, 712367, 712370, 712373, 712434, 712437, 712440, 712443, 712445, 712447, 712450, 712452, 712454, 712456, 712519, 712520, 712521, 712522, 712525, 712527, 712530, 712531, 712532, 713391, 714914, 715981, 718675, 725199, 729031, 732680] +'SW16 5PZ': [739549, 739583, 739607, 739630, 739652, 739672, 739691, 739708, 739725, 739743, 739766, 739784, 739817, 739844, 739872, 739897, 739927, 739942, 739958, 739971, 739984, 739996, 740019, 740031, 740043, 740052, 740060, 740068, 740088, 740099, 740105, 740109, 740111, 740113, 740131, 740141, 740144, 740145, 740162, 740189, 740218] +'CR0 2AZ': [734220, 734225, 734229, 734233, 734237, 734302, 734304, 734306, 734310, 734313, 734316, 734319, 734323, 734326, 734329, 734418, 734420, 734423, 734427, 734429, 734432, 734435, 734440, 734444, 734447, 734531, 738806, 738820, 738822, 738823, 738825, 738826, 738828, 738829, 738831, 738832, 738834, 738847, 738848, 738849, 738850, 738851] +'DA8 1DD': [709909, 710323, 710508, 710651, 710898, 710944, 711099, 711126, 711141, 711150, 711728, 714545, 715260, 715752, 716276, 716767, 717233, 718071, 718476, 719857, 720193, 720526, 720818, 721141, 721682, 721948, 722224, 723108, 723388, 723653, 723885, 724099, 724503, 724708, 724902, 725835, 726026, 726194, 726355, 726672, 726822, 727897] +'HA1 4GH': [739221, 739230, 739242, 739251, 739260, 739269, 739278, 739287, 739296, 739305, 739312, 739321, 739329, 739339, 739346, 739353, 739360, 739366, 739372, 739377, 739381, 739385, 739390, 739397, 739400, 739403, 739406, 739408, 739410, 739412, 739414, 739416, 739418, 739423, 739429, 739431, 739433, 739438, 739447, 739456, 739465, 739474] +'HA1 4WQ': [739226, 739235, 739247, 739256, 739265, 739274, 739283, 739292, 739301, 739309, 739316, 739326, 739333, 739343, 739350, 739357, 739363, 739369, 739374, 739378, 739382, 739386, 739395, 739398, 739401, 739404, 739407, 739409, 739411, 739413, 739415, 739417, 739419, 739428, 739430, 739432, 739434, 739443, 739452, 739461, 739470, 739479] +'PO12 1EY': [733866, 734027, 734146, 734365, 734483, 734575, 734656, 734722, 734926, 735115, 735181, 735239, 735303, 735456, 735500, 735544, 735713, 735867, 736002, 736152, 736185, 736333, 736464, 736497, 736561, 736617, 736702, 736728, 736823, 736935, 736960, 737004, 737076, 737119, 737138, 737222, 737343, 737387, 737428, 737445, 737587, 737869] +'SE15 2AB': [710380, 710524, 710627, 710855, 711496, 711608, 713091, 713624, 714409, 715139, 715662, 716173, 716662, 717128, 717542, 717976, 718952, 719386, 720116, 720449, 720751, 721349, 721605, 721874, 722144, 722662, 723041, 723319, 723819, 724038, 724260, 724461, 724655, 724847, 725037, 725473, 725789, 725979, 726151, 727558, 729304, 732908] +'SW8 1BB': [739514, 739535, 739569, 739595, 739618, 739641, 739662, 739681, 739700, 739717, 739734, 739752, 739775, 739793, 739809, 739824, 739838, 739852, 739865, 739878, 739891, 739902, 739912, 739936, 739947, 739954, 739962, 739967, 739975, 739981, 739988, 739993, 740000, 740006, 740028, 740035, 740040, 740073, 740118, 740147, 740175, 740202] +'E2 7NP': [713816, 713860, 713899, 713936, 713996, 714031, 714063, 714096, 714582, 719500, 719508, 719517, 719525, 719534, 719539, 719546, 719552, 719557, 719877, 723122, 723126, 723131, 723140, 723143, 723157, 723160, 723171, 723405, 725846, 725848, 725850, 725856, 725858, 725861, 725863, 725867, 726040, 727910, 727914, 727920, 727927, 728049, 728053] +'SO17 2JJ': [709896, 711509, 713174, 714473, 715195, 715700, 716221, 716710, 717178, 717589, 718019, 718418, 719038, 719420, 719802, 720149, 720480, 720777, 721095, 721374, 721641, 721903, 722179, 722749, 723071, 723340, 723616, 723847, 724069, 724281, 724479, 724680, 724874, 725063, 725553, 725812, 726000, 726172, 726654, 727634, 729375, 731997, 732985] +'CR8 2NT': [709802, 713504, 714295, 715019, 716074, 717030, 717454, 717900, 718811, 722500, 727410, 729164, 730636, 731806, 732791, 739777, 739796, 739811, 739827, 739840, 739855, 739867, 739881, 739892, 739903, 739937, 739948, 739955, 739963, 739968, 739976, 739982, 739989, 739994, 740001, 740029, 740036, 740041, 740047, 740050, 740055, 740058, 740063, 740066] +'DA8 2PJ': [710835, 710870, 710907, 711037, 711051, 711071, 711116, 711135, 711254, 713516, 718311, 719303, 719695, 720048, 720375, 720682, 720987, 721292, 721551, 721817, 722095, 722992, 723533, 723998, 724221, 724618, 724811, 724993, 726282, 726439, 726600, 726887, 727128, 727836, 728112, 728232, 728342, 728451, 728571, 728677, 728779, 728880, 729546, 732807] +'ME1 3QQ': [710815, 710886, 711286, 711418, 720434, 720740, 721042, 721340, 721594, 722135, 723312, 723579, 723812, 724256, 724454, 724651, 724844, 725034, 725784, 725976, 726147, 726311, 726468, 726630, 726777, 726909, 727034, 727153, 727861, 728004, 728132, 728255, 728362, 728594, 728691, 728795, 728902, 729558, 729662, 729766, 729866, 730054, 730145, 730239] +'N7 8XL': [712846, 714217, 715998, 716490, 716953, 717395, 717834, 718247, 718700, 719231, 719637, 719988, 720306, 720620, 721224, 721501, 721758, 722400, 723219, 723949, 724169, 724381, 724570, 724956, 725228, 725718, 725905, 726070, 726241, 726854, 726981, 727101, 727314, 727803, 727952, 728085, 728315, 728532, 728649, 728748, 729055, 730547, 731706, 732702] +'PO12 1EX': [733632, 733838, 734000, 734121, 734255, 734346, 734464, 734559, 734641, 735098, 735221, 735336, 735394, 735488, 735532, 735577, 735676, 735852, 735901, 735945, 735992, 736030, 736072, 736105, 736173, 736296, 736451, 736578, 736608, 736636, 736667, 736692, 736789, 736951, 737064, 737091, 737134, 737190, 737376, 737400, 737419, 737438, 737840, 738088] +'SE12 9QF': [711246, 717005, 717876, 719269, 720020, 720653, 721265, 721792, 722965, 723509, 723971, 724405, 724791, 725737, 726091, 726415, 726730, 726995, 728101, 728328, 728556, 728767, 729533, 729634, 729736, 729842, 729940, 730025, 730123, 730288, 730966, 731129, 731254, 731372, 731493, 732130, 732246, 732344, 732452, 732539, 733107, 733203, 733278, 733346] +'E2 6QH': [713050, 713596, 714371, 717101, 717516, 717956, 718356, 718915, 719359, 719742, 720093, 720420, 720731, 721032, 721333, 721585, 721855, 722128, 722617, 723028, 723573, 723806, 724029, 724645, 725779, 726143, 726308, 726624, 726773, 727031, 727150, 727517, 727857, 727999, 728129, 728359, 728469, 728591, 728688, 728794, 728897, 729259, 729556, 731891, 732873] +'NW10 8EW': [713582, 715098, 716133, 717095, 717949, 718902, 719349, 720083, 720721, 721324, 721845, 723019, 723562, 724018, 724445, 724831, 725019, 725424, 725771, 726134, 726459, 726767, 727025, 727852, 728124, 728355, 728587, 728790, 729247, 729555, 729761, 729955, 730139, 730307, 730983, 731141, 731268, 731507, 731879, 732144, 732253, 732354, 732457, 732543, 733113] +'DA16 1AB': [710140, 711097, 712916, 713473, 714266, 714989, 715569, 716543, 717008, 717437, 717880, 718286, 718776, 719273, 719673, 720023, 720352, 720655, 720961, 721266, 721534, 721793, 722071, 722469, 722966, 723248, 723510, 723751, 723972, 724198, 724406, 724594, 724793, 724978, 725298, 725738, 725931, 726093, 726265, 726588, 726732, 727383, 729129, 730607, 731769, 732760] +'NW10 8LY': [711778, 711830, 711868, 711902, 711928, 711947, 711968, 711987, 712004, 712020, 712031, 712072, 712117, 712132, 712137, 712144, 712153, 712161, 712167, 712173, 712178, 712196, 712241, 712244, 712247, 712251, 712256, 712260, 712294, 712388, 712473, 712542, 712592, 712638, 721559, 722104, 723282, 723785, 724231, 724628, 726289, 726611, 726893, 727134, 727985, 728238] +'SE26 6PA': [709914, 711531, 711542, 711559, 728456, 728578, 728679, 728784, 728885, 729552, 729645, 729751, 729850, 729950, 730037, 730134, 730226, 730303, 730384, 731057, 731208, 731263, 731328, 731444, 731503, 731565, 732140, 732196, 732251, 732300, 732353, 732397, 732456, 732502, 732542, 732582, 733112, 733159, 733208, 733241, 733284, 733314, 733349, 733386, 733428, 733458] +'SE8 3EJ': [710679, 710908, 711147, 713533, 714317, 715049, 715608, 716096, 716579, 717052, 717474, 717914, 718319, 718849, 719314, 719704, 720056, 720384, 720693, 721302, 721554, 722101, 722533, 723278, 723542, 724006, 724817, 725000, 725364, 725757, 726116, 726287, 726754, 726891, 727015, 727444, 727841, 727982, 728115, 728348, 729194, 731832, 732818, 741350, 741352, 741363] +'SO31 8JB': [710668, 710922, 711240, 711736, 713299, 714562, 715766, 716781, 717652, 718490, 719870, 720540, 721152, 722237, 722863, 723401, 723895, 724325, 725098, 726035, 726363, 726680, 726951, 727193, 728047, 728290, 728504, 728718, 728937, 729694, 729895, 730082, 730266, 730422, 730926, 731093, 731237, 731352, 731467, 731592, 732219, 732322, 732425, 732524, 732602, 733084] +'SW4 6QW': [712966, 713527, 714313, 715042, 716091, 716575, 717047, 717471, 717910, 718316, 718842, 719310, 720054, 720379, 720690, 720993, 721301, 721822, 722099, 722525, 723276, 723539, 724004, 724224, 724431, 724816, 725954, 726114, 726285, 726445, 726607, 726753, 726890, 727438, 727981, 728114, 728235, 728453, 728576, 728782, 728882, 729188, 729550, 729643, 729749, 730660] +'E14 7JF': [713557, 713934, 713995, 714030, 714062, 714095, 714336, 714580, 714643, 715075, 719524, 719533, 719545, 719551, 719556, 719876, 719883, 719884, 723156, 723159, 723168, 723170, 723407, 723409, 725394, 725852, 725855, 725857, 725860, 725862, 725866, 726037, 726039, 726041, 727471, 727913, 727919, 727923, 727926, 727929, 728048, 728050, 728052, 729219, 730688, 731852, 732841] +'N1 7FG': [714882, 715952, 716912, 717788, 719192, 719954, 720586, 721198, 721733, 722906, 727258, 728997, 730438, 733620, 733831, 733834, 733993, 734114, 734251, 734341, 734458, 734555, 734635, 734703, 734767, 734879, 735094, 735157, 735218, 735281, 735333, 735391, 735438, 735485, 735529, 735573, 735663, 735850, 735898, 735943, 735990, 736283, 736776, 737181, 737546, 737829, 738078] +'SE14 5HQ': [713027, 713579, 714356, 715096, 715636, 716130, 716616, 717093, 717506, 717946, 718349, 718895, 719346, 719732, 720081, 720410, 720717, 721017, 721322, 721576, 721842, 722118, 722594, 723017, 723297, 723560, 723796, 724239, 724443, 724635, 724829, 725015, 725417, 725769, 725966, 726132, 726299, 726457, 726615, 726765, 726898, 727023, 727499, 729242, 730717, 731874, 732862] +'SW4 6QN': [712949, 715593, 716076, 716565, 718303, 718818, 719297, 719686, 720041, 720370, 720675, 720978, 721284, 721545, 722087, 722507, 723264, 723529, 723766, 723991, 724212, 724419, 724612, 724805, 725751, 725944, 726105, 726432, 726595, 726747, 726882, 727124, 727416, 727831, 727976, 728231, 728339, 728568, 728674, 728774, 728877, 729170, 729640, 729745, 730641, 731809, 732796] +'BN2 8BT': [711858, 712029, 712233, 712246, 712272, 712281, 712330, 712514, 712578, 733734, 734065, 734195, 734289, 734401, 734514, 734607, 734678, 734807, 734999, 735135, 735200, 735266, 735318, 735373, 735420, 735472, 735514, 735560, 735599, 735884, 735978, 736014, 736065, 736092, 736138, 736200, 736479, 736508, 736542, 736570, 736601, 736628, 736660, 736683, 736716, 736884, 737926, 738166] +'ME2 2GZ': [710275, 710615, 710783, 710820, 710859, 711075, 711139, 711282, 711295, 711533, 711567, 711621, 713179, 713688, 714477, 715197, 716224, 716713, 717591, 718023, 718422, 719044, 719424, 720151, 721378, 721904, 724072, 724483, 724878, 725558, 725815, 726496, 726803, 727639, 727883, 728148, 728813, 729381, 729579, 729784, 729971, 730160, 730324, 730834, 731155, 731284, 731396, 732988] +'N1 7FL': [712756, 712759, 713341, 713344, 713416, 714148, 714151, 714863, 714865, 715492, 715494, 715936, 715938, 716431, 716433, 716898, 717338, 717340, 717770, 717772, 718193, 718195, 718616, 718618, 719183, 719590, 719943, 719944, 720260, 720261, 720579, 720580, 720888, 720889, 721188, 722313, 722316, 725139, 725142, 727239, 727242, 728977, 730467, 730470, 731630, 731633, 732633, 732636] +'NW10 8RS': [713293, 714559, 715762, 716779, 717651, 718172, 718179, 718185, 718186, 718188, 718189, 718190, 718191, 718489, 719869, 720539, 721151, 721691, 722235, 722860, 723399, 724323, 724717, 725096, 725662, 726033, 726361, 726678, 726949, 727190, 727755, 728045, 728289, 728502, 729692, 729893, 730080, 730264, 730428, 730430, 730432, 730433, 730434, 730435, 730436, 730437, 730923, 733081] +'NW10 8RX': [717241, 719568, 719574, 719579, 719581, 719583, 719584, 719585, 719586, 719587, 719588, 720200, 720826, 721424, 721954, 723116, 723661, 724106, 724510, 724908, 725841, 726201, 726525, 726826, 727904, 728172, 728398, 728628, 728829, 729597, 729801, 729982, 730180, 730184, 730185, 730186, 730187, 730188, 730189, 730190, 730338, 730342, 730344, 730345, 730346, 730347, 730348, 730349] +'PO12 1FN': [735860, 735906, 735951, 735996, 736038, 736076, 736112, 736148, 736178, 736216, 736456, 736492, 736523, 736555, 736584, 736611, 736643, 736669, 736698, 736723, 736930, 736954, 736976, 736996, 737023, 737045, 737069, 737093, 737112, 737136, 737337, 737359, 737379, 737401, 737422, 737439, 737458, 737475, 737488, 737503, 737666, 737682, 737695, 737715, 737728, 737743, 737757, 737775] +'SE18 2PD': [710517, 710624, 710699, 710833, 711170, 712873, 713432, 714231, 714950, 715546, 716013, 716506, 716972, 717405, 717848, 718259, 718734, 719240, 719998, 720320, 720627, 721240, 721511, 721769, 722422, 722942, 723490, 723957, 724391, 724776, 725253, 725725, 726076, 726403, 729082, 730561, 731196, 731320, 731429, 731553, 732185, 732295, 732390, 732497, 732578, 732719, 733150, 733235] +'SW4 6TF': [713175, 713685, 714474, 715702, 716222, 716711, 717179, 718021, 718420, 719041, 719421, 720481, 721643, 722752, 723072, 723341, 723617, 723848, 724070, 724282, 724480, 724875, 725064, 725555, 726001, 726330, 726493, 726800, 726927, 727636, 727881, 728021, 728484, 728610, 728703, 728811, 728918, 729377, 729577, 729676, 729782, 729881, 730068, 730159, 730252, 730832, 730999, 731998] +'DA9 9JE': [713106, 715151, 715669, 716183, 716674, 717140, 717550, 717985, 718386, 718969, 719393, 719774, 720122, 720454, 720755, 721059, 721352, 721608, 721879, 722151, 722679, 723045, 723322, 723591, 723822, 724042, 724264, 724464, 724662, 724852, 725043, 725487, 725792, 725984, 726637, 726784, 726915, 727042, 727158, 727574, 729320, 730779, 731943, 733922, 734069, 736545, 736571, 736602, 738172] +'HA9 0RB': [738366, 738382, 738399, 738408, 738420, 738428, 738438, 738467, 738483, 738492, 738501, 738511, 738519, 738526, 738533, 738540, 738547, 738571, 738582, 738585, 738589, 738595, 738600, 738620, 738624, 738628, 738634, 738638, 738642, 738645, 738649, 738652, 738655, 738665, 738667, 738669, 738675, 738678, 738681, 738692, 738734, 738764, 738809, 738854, 738905, 738958, 738962, 738986, 739000] +'SE6 2AW': [713663, 715177, 716202, 717161, 718004, 719000, 719407, 720138, 720767, 721364, 721891, 723058, 723605, 724058, 724471, 724866, 725517, 725806, 726165, 726486, 726795, 727050, 727875, 728142, 728377, 728607, 728808, 729344, 729573, 729778, 729969, 730154, 730320, 730995, 731150, 731279, 731391, 731517, 731971, 732152, 732260, 732362, 732465, 732550, 733122, 733218, 733293, 733359, 733436] +'BN41 2WY': [710428, 711115, 712956, 713515, 714304, 715034, 716085, 716572, 717041, 717465, 717906, 718310, 719302, 719694, 720047, 720374, 720681, 720986, 721291, 721550, 721816, 722094, 722516, 722991, 723272, 723532, 723774, 723997, 724220, 724424, 724617, 724810, 724992, 725348, 725754, 725949, 726109, 726281, 726438, 726599, 726886, 727010, 727127, 727426, 727835, 727977, 729179, 730651, 731815, 732806] +'CT1 1HS': [733649, 733851, 734011, 734132, 734259, 734354, 734472, 734565, 734649, 734714, 734779, 734910, 735107, 735173, 735231, 735293, 735345, 735402, 735449, 735494, 735538, 735581, 735695, 735862, 735908, 735954, 735998, 736042, 736078, 736115, 736149, 736180, 736217, 736315, 736459, 736493, 736526, 736556, 736586, 736612, 736645, 736670, 736699, 736724, 736807, 736931, 737207, 737570, 737853, 738102] +'NW10 8RY': [715612, 716586, 717479, 718325, 719710, 720389, 721000, 721560, 722105, 722543, 723283, 723786, 724232, 724629, 725004, 725958, 726290, 726612, 726894, 727135, 727452, 727986, 728239, 728457, 729646, 729851, 730038, 730227, 730385, 731058, 731209, 731329, 731445, 731566, 732197, 732301, 732426, 732429, 732430, 732431, 732432, 732433, 732434, 732824, 738904, 738945, 738985, 739037, 739060, 739082] +'PE3 7LF': [739541, 739576, 739600, 739623, 739645, 739666, 739685, 739703, 739720, 739738, 739758, 739779, 739798, 739813, 739828, 739857, 739869, 739883, 739894, 739905, 739919, 739939, 739949, 739956, 739964, 739969, 739977, 739983, 739990, 739995, 740002, 740012, 740030, 740037, 740042, 740048, 740051, 740056, 740059, 740064, 740067, 740070, 740080, 740098, 740101, 740104, 740123, 740154, 740181, 740210] +'PE4 6GW': [710361, 710459, 711043, 711225, 711624, 713191, 713698, 714485, 715208, 715712, 716230, 716723, 717189, 717598, 718431, 719432, 719814, 720157, 720491, 720787, 721104, 721389, 721653, 721912, 722188, 722766, 723082, 723350, 723626, 723858, 724079, 724289, 724489, 724687, 724884, 725072, 725569, 726006, 726177, 726335, 726503, 726658, 726807, 726932, 727061, 727173, 727886, 728025, 729395, 730847, 733001] +'HA3 9TF': [738360, 738376, 738386, 738393, 738403, 738411, 738442, 738459, 738470, 738495, 738505, 738514, 738543, 738567, 738574, 738586, 738590, 738593, 738596, 738601, 738610, 738625, 738630, 738635, 738640, 738643, 738647, 738650, 738671, 738673, 738679, 738684, 738689, 738703, 738705, 738708, 738709, 738711, 738712, 738713, 738725, 738729, 738730, 738747, 738749, 738751, 738756, 738758, 738761, 738923, 739074, 739076, 739079] +'PE4 5EA': [713724, 739533, 739590, 739614, 739635, 739659, 739679, 739698, 739715, 739732, 739749, 739773, 739790, 739807, 739822, 739836, 739849, 739864, 739876, 739889, 739900, 739910, 739934, 739945, 739953, 739960, 739966, 739973, 739980, 739986, 739992, 739998, 740004, 740026, 740033, 740039, 740045, 740049, 740053, 740057, 740061, 740065, 740069, 740071, 740095, 740100, 740103, 740106, 740108, 740138, 740169, 740196, 740225] +'SW4 6SS': [712912, 713467, 714986, 715566, 716048, 717875, 718282, 718772, 719672, 720349, 720959, 721531, 721791, 722069, 722466, 722964, 723749, 723970, 724404, 724976, 725291, 725736, 725929, 726090, 726263, 726585, 726729, 726872, 726994, 727378, 727816, 727969, 728100, 728441, 728555, 728664, 728766, 728867, 729633, 729735, 729939, 730024, 730122, 730215, 730287, 730374, 731051, 731128, 731760, 738347, 738350, 738351, 738352] +'E2 6LT': [712863, 713422, 714223, 715539, 716497, 716963, 717400, 718254, 718720, 719237, 719642, 720314, 720623, 720931, 721232, 721507, 721766, 722041, 722414, 722935, 723225, 723482, 723728, 724385, 724575, 724772, 724960, 725243, 725909, 726244, 726401, 726568, 726721, 726857, 726983, 727106, 727327, 727806, 727957, 728087, 728204, 728317, 728536, 728654, 728752, 728857, 729070, 729624, 729722, 729832, 729932, 730557, 731718, 732711] +'N7 8HZ': [713142, 713666, 714450, 715685, 717574, 718005, 719009, 719409, 720140, 720769, 721079, 721365, 721626, 721893, 722168, 722717, 723059, 723328, 724061, 724671, 725054, 725527, 725992, 727051, 727165, 727607, 727876, 728015, 728143, 728378, 728480, 728915, 729574, 729673, 729779, 729877, 730065, 730155, 730321, 730809, 730996, 731151, 731226, 731280, 731340, 731392, 731518, 731580, 732208, 732261, 732313, 732411, 732466, 732958] +'SE26 6PB': [711052, 712979, 713540, 714322, 715055, 715611, 716103, 716585, 717061, 717478, 717919, 718324, 718858, 719319, 719709, 720061, 720388, 720696, 720999, 721304, 721558, 721827, 722103, 722542, 723001, 723281, 723544, 723784, 724007, 724230, 724435, 724627, 724819, 725003, 725373, 725761, 726119, 726288, 726449, 726610, 726757, 726892, 727018, 727133, 727450, 727844, 727984, 728118, 728237, 728350, 729203, 730672, 731839, 732823] +'SW10 0JU': [713320, 713323, 713325, 713327, 713328, 713329, 713331, 713333, 719163, 719166, 719168, 719170, 719172, 719174, 719175, 719177, 722881, 722882, 722884, 722885, 722887, 722889, 722891, 722893, 725680, 725682, 725684, 725686, 725688, 725690, 725692, 725693, 727772, 727774, 727776, 727778, 727779, 727781, 727782, 727783, 729495, 729496, 729497, 729498, 729499, 729500, 729501, 730938, 730939, 730940, 730941, 730942, 730943, 730944] +'SE16 4AS': [711416, 713781, 713812, 713857, 713896, 713933, 727842, 727983, 728116, 728236, 728349, 728455, 728577, 728678, 728783, 728884, 729551, 729644, 729750, 729849, 730036, 730133, 730225, 730302, 730383, 730979, 731056, 731138, 731443, 731502, 731564, 733348, 733385, 733427, 733457, 738724, 738726, 738727, 738728, 738748, 738750, 738752, 738754, 738755, 738757, 738759, 738760, 738762, 738763, 738775, 738776, 738777, 738778, 738779, 738780] +'SW4 6RY': [713025, 713577, 714354, 715093, 715634, 716127, 717504, 717944, 718892, 719730, 720408, 720715, 721320, 721575, 722117, 722590, 723296, 723559, 724016, 724238, 724634, 724828, 725013, 726130, 726298, 726456, 726614, 726764, 726897, 727022, 727141, 727497, 727992, 728123, 728244, 728354, 728461, 728585, 728788, 728891, 729239, 729655, 729760, 729857, 729953, 730045, 730138, 730233, 730713, 731066, 731140, 731267, 731506, 731870, 732859] +'CR0 4GP': [739127, 739128, 739129, 739130, 739131, 739132, 739133, 739134, 739135, 739136, 739137, 739138, 739139, 739140, 739141, 739142, 739143, 739144, 739145, 739146, 739147, 739148, 739149, 739150, 739151, 739152, 739153, 739154, 739155, 739156, 739157, 739158, 739162, 739163, 739164, 739165, 739166, 739167, 739168, 739169, 739170, 739171, 739172, 739173, 739174, 739175, 739176, 739177, 739178, 739179, 739180, 739181, 739182, 739183, 739184, 739185] +'NW10 8EF': [713819, 713903, 713965, 714035, 714099, 714403, 714611, 714671, 714719, 714767, 714806, 715357, 715391, 715444, 715658, 716655, 717538, 718377, 719765, 720445, 721052, 721603, 722143, 723317, 723817, 724259, 724654, 725036, 725978, 726313, 726633, 726911, 728006, 728257, 728473, 728693, 728904, 729868, 730057, 730241, 730403, 731072, 731219, 731338, 731452, 731574, 732204, 732309, 732406, 732510, 732587, 733164, 733247, 733323, 733391, 733465] +'RH17 7GA': [709887, 711255, 713107, 714422, 715152, 716184, 716675, 717141, 717551, 717986, 718388, 718970, 722680, 725488, 727575, 729321, 731944, 732924, 738472, 738480, 738488, 738498, 738509, 738516, 738524, 738530, 738537, 738545, 738562, 738569, 738575, 738580, 738583, 738587, 738591, 738594, 738597, 738603, 738618, 738623, 738627, 738632, 738637, 738641, 738644, 738648, 738651, 738654, 738664, 738668, 738672, 738674, 738677, 738680, 738685, 738687] +'SW4 6TD': [713203, 714496, 715719, 716234, 717195, 718039, 718438, 719066, 719439, 719821, 720163, 721110, 721393, 721659, 721915, 722194, 723087, 723356, 723631, 724084, 724293, 724493, 724889, 725075, 725822, 726008, 726180, 726337, 726659, 726809, 726933, 727063, 727174, 727667, 727887, 728026, 728151, 728272, 728384, 728488, 728612, 728707, 728815, 728922, 729405, 729583, 729788, 729885, 729973, 730071, 730163, 730257, 730415, 730857, 731004, 732023] +'E2 6LU': [713779, 713804, 713846, 713885, 713924, 713952, 713986, 714019, 714056, 714085, 714601, 714635, 714661, 714710, 714736, 714759, 714782, 714797, 715289, 715312, 715336, 715384, 715400, 715415, 715427, 715439, 715774, 730013, 730114, 730205, 730282, 730959, 731040, 731118, 731193, 731250, 731317, 731369, 731550, 732122, 732182, 732238, 732291, 732338, 732388, 732445, 732495, 732532, 732576, 733148, 733198, 733233, 733309, 733344, 733378, 733422, 733449] +'ME20 7GD': [710127, 710130, 710176, 710230, 710284, 710478, 710541, 712263, 712274, 712339, 712529, 713347, 714868, 715862, 716314, 716340, 716369, 716398, 716788, 716809, 716829, 716864, 716902, 717775, 718621, 721726, 725145, 728981, 731635, 733941, 736028, 736517, 736576, 736634, 736690, 736923, 736968, 737017, 737062, 737109, 737332, 737374, 737417, 737665, 737727, 737755, 737784, 737956, 737980, 738003, 738027, 738045, 738194, 738206, 738216, 738226, 738242] +'PO12 4TR': [733658, 733947, 733957, 733961, 733967, 733973, 734020, 734266, 734361, 734479, 734570, 734919, 735177, 735236, 735299, 735349, 735452, 735704, 735911, 735957, 736000, 736045, 736080, 736118, 736495, 736529, 736558, 736590, 736614, 736647, 736956, 736979, 736999, 737026, 737048, 737073, 737383, 737403, 737426, 737441, 737461, 737684, 737697, 737730, 737745, 737759, 737973, 737983, 737996, 738006, 738018, 738029, 738202, 738208, 738217, 738224, 738227] +'BN2 9WR': [710659, 710893, 710919, 710940, 711293, 713135, 713658, 714444, 715173, 715681, 716199, 716687, 717158, 717568, 718001, 718397, 718998, 719402, 719786, 720136, 720462, 720765, 721073, 721361, 721888, 722160, 722707, 723055, 723325, 723603, 723829, 724056, 724864, 725515, 725805, 725990, 726163, 726322, 726484, 726644, 726793, 726924, 727048, 727163, 727597, 727874, 728014, 728140, 728261, 728375, 728478, 728699, 728807, 728911, 729342, 730804, 731968, 732953] +'PO19 7BN': [711795, 711843, 711877, 711909, 711953, 711972, 711992, 712006, 712022, 712032, 712088, 712118, 712128, 712133, 712138, 712147, 712155, 712162, 712168, 712174, 712179, 712210, 712242, 712245, 712248, 712252, 712257, 712261, 712264, 712268, 712275, 712279, 712307, 712341, 712344, 712349, 712353, 712357, 712361, 712365, 712368, 712371, 712374, 712404, 712435, 712438, 712441, 712444, 712446, 712448, 712451, 712453, 712455, 712457, 712488, 712554, 712604, 712653] +'SE8 3DG': [711398, 713784, 713817, 713861, 726307, 726463, 726621, 726772, 726905, 727030, 727148, 727856, 727998, 728126, 728251, 728358, 728467, 728589, 728687, 728792, 728896, 729763, 729862, 729958, 730049, 730143, 730236, 730311, 730398, 730986, 731069, 731143, 731216, 731270, 731334, 731383, 731450, 731510, 732147, 732201, 732256, 732307, 732357, 732401, 732459, 732506, 732545, 732585, 733115, 733162, 733212, 733245, 733288, 733320, 733351, 733390, 733431, 733464] +'SW9 9JH': [712818, 713390, 715524, 715980, 716468, 716938, 717381, 717816, 718228, 718674, 719213, 719621, 720293, 720603, 720920, 721210, 721747, 722030, 722371, 722918, 723214, 723465, 723717, 723941, 724160, 724372, 724557, 724758, 724947, 725198, 725709, 726060, 726230, 726390, 726554, 726709, 726848, 727095, 727287, 727795, 728078, 728195, 728309, 728419, 728527, 728643, 728742, 728848, 729514, 729616, 729716, 729822, 729925, 730000, 730108, 730197, 730277, 730517, 732679] +'E1 2QS': [713795, 713834, 713871, 713945, 713979, 714006, 714047, 714071, 714108, 714593, 714617, 714652, 714680, 714699, 714728, 714752, 714777, 714813, 715303, 715331, 715346, 715363, 715377, 715395, 715411, 715422, 715434, 715447, 715782, 715794, 715806, 715832, 715851, 715860, 715871, 715882, 715897, 731236, 731295, 731351, 731403, 731527, 731591, 732164, 732218, 732321, 732372, 732424, 732476, 732523, 732560, 732601, 733129, 733179, 733224, 733258, 733296, 733365, 733406, 733441, 733478] +'PE4 6ZA': [710227, 710234, 710285, 710333, 710538, 713832, 713916, 713977, 714107, 714615, 714678, 714727, 714774, 714810, 715328, 715362, 715393, 715421, 715446, 715792, 715828, 715909, 716310, 716364, 716387, 716805, 716846, 717275, 717300, 717311, 717668, 717680, 717696, 717715, 718100, 718112, 718133, 718143, 718499, 718512, 718524, 718539, 718546, 719503, 719520, 719536, 719548, 719891, 731349, 731465, 731588, 732214, 732318, 732422, 732520, 732599, 733177, 733256, 733332, 733405, 733477] +'CR0 4FE': [713145, 714451, 715688, 716697, 717576, 718404, 719792, 720469, 721081, 721628, 722170, 722718, 723329, 723834, 724274, 724672, 725055, 725993, 726324, 726647, 727610, 730811, 732960, 733898, 734180, 734389, 734596, 734742, 734977, 735131, 735259, 735367, 735468, 735556, 735880, 735974, 736062, 736133, 736197, 736379, 736475, 736539, 736597, 736656, 736713, 736944, 736988, 737036, 737083, 737125, 737268, 737348, 737391, 737433, 737469, 737496, 737676, 737709, 737737, 737766, 737792, 737908, 737964] +'N1 7FR': [712589, 712893, 713446, 714248, 714967, 715557, 716031, 716525, 716986, 717420, 717859, 718272, 719255, 719660, 720011, 720336, 720640, 720949, 721255, 721522, 721779, 722057, 722444, 722954, 723240, 723500, 723743, 724190, 724587, 724972, 725269, 725924, 726257, 726581, 726867, 727110, 727357, 727966, 728214, 728436, 728661, 728864, 729100, 729630, 729838, 730020, 730211, 730370, 730582, 731047, 731200, 731322, 731434, 731741, 732735, 733579, 734841, 735629, 736250, 736753, 737161, 737529, 738062] +'PO19 8HB': [740252, 740279, 740306, 740332, 740373, 740396, 740417, 740439, 740460, 740479, 740506, 740528, 740545, 740561, 740575, 740588, 740601, 740614, 740627, 740639, 740652, 740673, 740694, 740705, 740715, 740724, 740733, 740742, 740750, 740758, 740766, 740773, 740791, 740808, 740814, 740817, 740819, 740821, 740823, 740825, 740827, 740829, 740831, 740845, 740862, 740863, 740864, 740865, 740866, 740867, 740868, 740869, 740870, 740871, 740885, 740902, 740903, 740904, 740905, 740906, 740907, 740908, 740909, 740923, 740951, 740980] +'SE10 9FF': [733660, 733860, 733943, 733958, 733963, 733968, 733975, 733979, 734023, 734142, 734268, 734362, 734480, 734572, 734654, 734720, 734785, 734920, 735113, 735179, 735237, 735301, 735351, 735408, 735454, 735498, 735542, 735585, 735707, 735865, 735912, 735958, 736001, 736046, 736081, 736119, 736151, 736184, 736219, 736327, 736463, 736496, 736530, 736559, 736591, 736615, 736818, 737001, 737027, 737050, 737074, 737095, 737116, 737216, 737491, 737507, 737581, 737671, 737700, 737717, 737863, 737997, 738008, 738019, 738031, 738041, 738046, 738113, 738245] +'E1 2QR': [713289, 713765, 714555, 715271, 715760, 716281, 716776, 717239, 717648, 718077, 718485, 719139, 719478, 719867, 720198, 720536, 720824, 721148, 721423, 721689, 721952, 722232, 723114, 723396, 723659, 723892, 724104, 724321, 724509, 724715, 724907, 725094, 725658, 725840, 726031, 726200, 726359, 726524, 726677, 726824, 726947, 727078, 727188, 727750, 727903, 728043, 728171, 728287, 728397, 728500, 728627, 728828, 728934, 729480, 729596, 729690, 729800, 729892, 729981, 730078, 730173, 730262, 730333, 730421, 730920, 731012, 731091, 731165, 732095, 733077] +'SE8 4HS': [712169, 712249, 712254, 712271, 712347, 731036, 731113, 733688, 733882, 734041, 734161, 734275, 734495, 734583, 734666, 734730, 734795, 735123, 735188, 735246, 735309, 735360, 735417, 735464, 735553, 735595, 735738, 735874, 736057, 736089, 736128, 736192, 736226, 736470, 736534, 736565, 736595, 736622, 736652, 736678, 736706, 736732, 736848, 736938, 736961, 737008, 737032, 737055, 737079, 737100, 737122, 737141, 737247, 737345, 737367, 737389, 737409, 737430, 737447, 737466, 737479, 737493, 737511, 737606, 737891, 738134, 739022, 741417, 741424, 741469] +'SE14 5FB': [725833, 726021, 726191, 726352, 726518, 726671, 726820, 726944, 727073, 727184, 727896, 728037, 728166, 728285, 733741, 733923, 734070, 734199, 734292, 734405, 734520, 734612, 734681, 734751, 734811, 735008, 735137, 735202, 735269, 735321, 735376, 735425, 735475, 735516, 735563, 735603, 735787, 735889, 735930, 736018, 736067, 736096, 736139, 736165, 736205, 736232, 736408, 736891, 737039, 737059, 737086, 737104, 737127, 737146, 737298, 737353, 737371, 737397, 737414, 737435, 737451, 737473, 737484, 737499, 737514, 737643, 737679, 737692, 737712, 737933, 738173] +'SE10 9FH': [730329, 731008, 731161, 731290, 731525, 732161, 732268, 733672, 733872, 734030, 734151, 734221, 734227, 734231, 734235, 734238, 734270, 734303, 734305, 734308, 734312, 734315, 734318, 734320, 734325, 734328, 734330, 734369, 734419, 734421, 734425, 734428, 734430, 734433, 734437, 734442, 734445, 734448, 734489, 734532, 734535, 734536, 734578, 734660, 734725, 734790, 734935, 735117, 735183, 735240, 735305, 735354, 735410, 735458, 735502, 735545, 735589, 735722, 735868, 735915, 735961, 736005, 736049, 736083, 736120, 736155, 736187, 736221, 736341, 736832, 737233, 737594, 737876, 738122] +'SE14 5AE': [713799, 713881, 717378, 718226, 719618, 720291, 720916, 721490, 722027, 723212, 723715, 724157, 724555, 725894, 726228, 726551, 726846, 727094, 727947, 728194, 728418, 728641, 728847, 729614, 729820, 729998, 730356, 731033, 731184, 731309, 731422, 732282, 732382, 732490, 732570, 733139, 733227, 733305, 733373, 733447, 733598, 733613, 733619, 733822, 733830, 733987, 733992, 734106, 734113, 734245, 734858, 734872, 734878, 735644, 735656, 735662, 736263, 736276, 736282, 736764, 736772, 736775, 737170, 737176, 737180, 737536, 737542, 737545, 737817, 737825, 737828, 738067, 738075, 738077] +'SE10 9FE': [733655, 733857, 734018, 734139, 734264, 734359, 734477, 734568, 734652, 734718, 734783, 734916, 735111, 735176, 735235, 735298, 735348, 735406, 735451, 735496, 735540, 735584, 735702, 735864, 735910, 735956, 735999, 736044, 736323, 736462, 736528, 736557, 736589, 736646, 736671, 736700, 736725, 736814, 736932, 736955, 736978, 736998, 737025, 737047, 737072, 737094, 737115, 737137, 737213, 737340, 737360, 737382, 737402, 737425, 737440, 737460, 737476, 737490, 737504, 737577, 737668, 737683, 737696, 737716, 737729, 737744, 737758, 737776, 737786, 737797, 737859, 737958, 737972, 737982, 737995, 738005, 738109] +'PO12 1GS': [733752, 733931, 734077, 734206, 734410, 734526, 734615, 734684, 734753, 734816, 735016, 735140, 735207, 735273, 735325, 735381, 735431, 735480, 735521, 735567, 735609, 735798, 735891, 735934, 735985, 736022, 736069, 736100, 736142, 736169, 736207, 736235, 736416, 736484, 736513, 736546, 736573, 736604, 736629, 736662, 736685, 736719, 736736, 736900, 736947, 736966, 736991, 737012, 737040, 737060, 737087, 737105, 737128, 737147, 737306, 737354, 737372, 737398, 737415, 737436, 737452, 737474, 737485, 737500, 737515, 737652, 737680, 737693, 737713, 737726, 737741, 737754, 737771, 737783, 737794, 737801, 737941, 738183] + +Total postcodes: 4050, total properties: 31773 \ No newline at end of file diff --git a/scripts/trigger_modelling_e2e_sqs.py b/scripts/trigger_modelling_e2e_sqs.py index 3bcfeaf9..6091e754 100644 --- a/scripts/trigger_modelling_e2e_sqs.py +++ b/scripts/trigger_modelling_e2e_sqs.py @@ -1,24 +1,24 @@ -"""Enqueue one SQS message per property for the modelling_e2e Lambda. +"""Enqueue one SQS message per postcode group for the modelling_e2e Lambda. -Reads all property IDs for the given portfolio from the DB and sends a batch of -SQS messages, one per property. The Lambda then processes each message -independently, enabling concurrent modelling at scale. +Reads postcode → property ID groups from the file produced by +list_properties_by_postcode.py, skips postcodes already logged in the tracking +markdown, then sends one SQS message per postcode batch. -Edit the CONFIG block below, then run via VSCode Run button or Jupyter. -AWS creds come from the ambient ~/.aws profile; DB creds from backend/.env. +Edit the CONFIG block below, then hit Run. +AWS creds come from the ambient ~/.aws profile. """ from __future__ import annotations -# -------------------------------------------------------------------------- +# --------------------------------------------------------------------------- # CONFIG — edit these before running # --------------------------------------------------------------------------- -PORTFOLIO_ID: int = 785 -SCENARIO_ID: int = 1266 -SQS_URL: str = "https://sqs.eu-west-2.amazonaws.com/ACCOUNT_ID/modelling-e2e-STAGE" +PORTFOLIO_ID: int = 796 +SCENARIO_ID: int = 1268 +SQS_QUEUE_NAME: str = "modelling_e2e-queue-dev" -# Set to a positive integer to enqueue only the first N properties (trial run). -LIMIT: int | None = 10 +# Number of postcodes to process this run. +POSTCODES_LIMIT: int = 2 # True → Lambda runs the full pipeline but skips all DB writes (safe for testing). DRY_RUN: bool = True @@ -27,8 +27,10 @@ DRY_RUN: bool = True NO_SOLAR: bool = False # --------------------------------------------------------------------------- +import ast import json import sys +from datetime import date from pathlib import Path from typing import Any, cast from uuid import uuid4 @@ -37,69 +39,97 @@ _REPO_ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(_REPO_ROOT)) import boto3 # noqa: E402 -from sqlalchemy import text # noqa: E402 -from scripts.e2e_common import ENV_PATH, build_engine, load_env # noqa: E402 - -_BATCH_SIZE = 10 +_POSTCODES_FILE = _REPO_ROOT / "scripts" / f"properties_by_postcode_{PORTFOLIO_ID}.txt" +_PROCESSED_MD = _REPO_ROOT / "scripts" / f"processed_postcodes_{PORTFOLIO_ID}.md" -def _property_ids(portfolio_id: int, limit: int | None, engine: object) -> list[int]: - from sqlalchemy.engine import Engine - - assert isinstance(engine, Engine) - query = "SELECT id FROM property WHERE portfolio_id = :pid ORDER BY id" - if limit is not None: - query += f" LIMIT {int(limit)}" - with engine.connect() as conn: - rows = conn.execute(text(query), {"pid": portfolio_id}).fetchall() - return [int(r[0]) for r in rows] +def _load_postcode_map() -> dict[str, list[int]]: + if not _POSTCODES_FILE.exists(): + raise FileNotFoundError( + f"{_POSTCODES_FILE} not found — run list_properties_by_postcode.py first" + ) + result: dict[str, list[int]] = {} + for line in _POSTCODES_FILE.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line or line.startswith("Total"): + continue + postcode_repr, ids_repr = line.split(": ", 1) + result[ast.literal_eval(postcode_repr)] = ast.literal_eval(ids_repr) + return result -def _batches(items: list[int], size: int) -> list[list[int]]: - return [items[i : i + size] for i in range(0, len(items), size)] +def _already_processed() -> set[str]: + if not _PROCESSED_MD.exists(): + return set() + processed: set[str] = set() + for line in _PROCESSED_MD.read_text(encoding="utf-8").splitlines(): + if ( + line.startswith("| ") + and not line.startswith("| Postcode") + and "---" not in line + ): + parts = [p.strip() for p in line.split("|")] + if len(parts) >= 2 and parts[1]: + processed.add(parts[1]) + return processed + + +def _record_processed(postcode: str, ids: list[int]) -> None: + today = date.today().isoformat() + ids_str = ", ".join(str(i) for i in ids) + row = f"| {postcode} | {ids_str} | {today} |\n" + if not _PROCESSED_MD.exists(): + _PROCESSED_MD.write_text( + f"# Processed Properties — Portfolio {PORTFOLIO_ID}\n\n" + "| Postcode | Property IDs | Processed |\n" + "|----------|--------------|-----------|\n" + row, + encoding="utf-8", + ) + else: + with _PROCESSED_MD.open("a", encoding="utf-8") as f: + f.write(row) def main() -> None: - load_env(ENV_PATH) - engine = build_engine() + postcode_map = _load_postcode_map() + done = _already_processed() - ids = _property_ids(PORTFOLIO_ID, LIMIT, engine) - if not ids: - print(f"no properties found for portfolio {PORTFOLIO_ID}") + pending = [(pc, ids) for pc, ids in postcode_map.items() if pc not in done] + to_process = pending[:POSTCODES_LIMIT] + + if not to_process: + print("Nothing left to process.") return + sqs: Any = cast( + Any, boto3.client("sqs", region_name="eu-west-2") + ) # pyright: ignore[reportUnknownMemberType] + sqs_url: str = sqs.get_queue_url(QueueName=SQS_QUEUE_NAME)["QueueUrl"] + print( - f"enqueuing {len(ids)} properties " + f"sending {len(to_process)} messages " f"(portfolio={PORTFOLIO_ID}, scenario={SCENARIO_ID}, " - f"no_solar={NO_SOLAR}, dry_run={DRY_RUN}) → {SQS_URL}" + f"dry_run={DRY_RUN}, no_solar={NO_SOLAR}) → {sqs_url}" ) - sqs: Any = cast( - Any, boto3.client("sqs") - ) # pyright: ignore[reportUnknownMemberType] - sent = 0 - for batch in _batches(ids, _BATCH_SIZE): - entries = [ - { - "Id": str(uuid4()).replace("-", "")[:8] + str(i), - "MessageBody": json.dumps( - { - "property_id": [pid], - "portfolio_id": PORTFOLIO_ID, - "scenario_id": SCENARIO_ID, - "no_solar": NO_SOLAR, - "dry_run": DRY_RUN, - } - ), - } - for i, pid in enumerate(batch) - ] - sqs.send_message_batch(QueueUrl=SQS_URL, Entries=entries) - sent += len(batch) - print(f" sent {sent}/{len(ids)}", end="\r") + for postcode, ids in to_process: + sqs.send_message( + QueueUrl=sqs_url, + MessageBody=json.dumps( + { + "property_ids": ids, + "portfolio_id": PORTFOLIO_ID, + "scenario_id": SCENARIO_ID, + "no_solar": NO_SOLAR, + "dry_run": DRY_RUN, + } + ), + ) + _record_processed(postcode, ids) + print(f" sent {postcode}: {ids}") - print(f"\ndone — {sent} messages enqueued") + print(f"\ndone — {len(to_process)} messages enqueued, tracking → {_PROCESSED_MD}") main() From 901b74ae7cb44fcb644abf79a51c293d8b4f5547 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 23 Jun 2026 12:25:43 +0000 Subject: [PATCH 02/15] udpate --- pytest.ini | 1 + scripts/processed_postcodes_796.md | 82 ++++++++++++++++++++++++++++ scripts/trigger_modelling_e2e_sqs.py | 18 ++++-- 3 files changed, 95 insertions(+), 6 deletions(-) diff --git a/pytest.ini b/pytest.ini index 2bcd6178..cb6af047 100644 --- a/pytest.ini +++ b/pytest.ini @@ -25,5 +25,6 @@ testpaths = etl/epc_clean/tests etl/hubspot/tests etl/spatial/tests + tests/ markers = integration: mark a test as an integration test diff --git a/scripts/processed_postcodes_796.md b/scripts/processed_postcodes_796.md index ca563834..53a05f69 100644 --- a/scripts/processed_postcodes_796.md +++ b/scripts/processed_postcodes_796.md @@ -2,7 +2,89 @@ | Postcode | Property IDs | Processed | |----------|--------------|-----------| + | BN10 8EQ | 739489 | 2026-06-23 | | BN11 2LT | 740998 | 2026-06-23 | +| BN11 4HB | 733255 | 2026-06-23 | +| BN13 2QP | 739481 | 2026-06-23 | +| BN14 7EH | 725823 | 2026-06-23 | +| BN15 0NF | 739509 | 2026-06-23 | +| BN15 9HT | 739500 | 2026-06-23 | +| BN15 9JB | 723564 | 2026-06-23 | +| BN15 9LH | 715324 | 2026-06-23 | +| BN15 9PA | 715063 | 2026-06-23 | +| BN1 5LA | 725286 | 2026-06-23 | +| BN17 6RE | 717496 | 2026-06-23 | +| BN17 7NS | 715550 | 2026-06-23 | +| BN1 7BX | 723873 | 2026-06-23 | +| BN1 7ER | 739508 | 2026-06-23 | +| BN18 0RT | 719161 | 2026-06-23 | +| BN1 8DH | 727964 | 2026-06-23 | +| BN1 8LG | 719523 | 2026-06-23 | +| BN1 9BW | 733567 | 2026-06-23 | +| BN1 9BZ | 733592 | 2026-06-23 | +| BN2 0FB | 715445 | 2026-06-23 | +| BN2 3PE | 733597 | 2026-06-23 | +| BN2 4BE | 728215 | 2026-06-23 | +| BN2 4JS | 731660 | 2026-06-23 | +| BN2 4LL | 715371 | 2026-06-23 | +| BN2 4RT | 710129 | 2026-06-23 | +| BN2 4RW | 725006 | 2026-06-23 | +| BN2 4TJ | 726521 | 2026-06-23 | +| BN2 6TL | 727827 | 2026-06-23 | +| BN2 8LS | 725067 | 2026-06-23 | +| BN3 5AE | 729390 | 2026-06-23 | +| BN3 5AG | 726500 | 2026-06-23 | +| BN41 1DQ | 722904 | 2026-06-23 | +| BN41 1SA | 731765 | 2026-06-23 | +| BN43 5ZE | 741057 | 2026-06-23 | | BN11 2NH | 733234 | 2026-06-23 | | BN11 4EP | 730259 | 2026-06-23 | +| BN13 2NN | 739497 | 2026-06-23 | +| BN15 0DU | 739485 | 2026-06-23 | +| BN15 0LT | 731504 | 2026-06-23 | +| BN16 3HL | 719864 | 2026-06-23 | +| BN1 7EH | 726123 | 2026-06-23 | +| BN2 0AE | 715891 | 2026-06-23 | +| BN2 4PL | 716049 | 2026-06-23 | +| BN2 4TQ | 726467 | 2026-06-23 | +| BN2 9ZN | 721815 | 2026-06-23 | +| BN3 1DL | 741420 | 2026-06-23 | +| BN3 7FN | 717435 | 2026-06-23 | +| BN41 2TP | 723881 | 2026-06-23 | +| BN42 4HS | 728370 | 2026-06-23 | +| BN43 5LA | 724702 | 2026-06-23 | +| BN43 6NN | 728476 | 2026-06-23 | +| BN43 6WE | 741142 | 2026-06-23 | +| BN44 3JG | 720812 | 2026-06-23 | +| BN44 3JH | 719419 | 2026-06-23 | +| BN44 3JT | 712902 | 2026-06-23 | +| BN7 2QF | 733723 | 2026-06-23 | +| BR1 2ND | 741004 | 2026-06-23 | +| BR1 2SN | 718709 | 2026-06-23 | +| BR1 3LR | 728414 | 2026-06-23 | +| BR1 3PE | 712401 | 2026-06-23 | +| BR1 3QH | 733236 | 2026-06-23 | +| BR1 3QJ | 726048 | 2026-06-23 | +| BR1 3QW | 711383 | 2026-06-23 | +| BR1 3RG | 715615 | 2026-06-23 | +| BR1 3RW | 728883 | 2026-06-23 | +| BR1 3ST | 712335 | 2026-06-23 | +| BR1 4DE | 723589 | 2026-06-23 | +| BR1 4JZ | 730244 | 2026-06-23 | +| BR1 4NW | 726966 | 2026-06-23 | +| BR1 4PU | 717828 | 2026-06-23 | +| BR1 4PY | 711228 | 2026-06-23 | +| BR1 4QF | 710339 | 2026-06-23 | +| BR1 4QQ | 729946 | 2026-06-23 | +| BR1 4QW | 710693 | 2026-06-23 | +| BR1 4RE | 722824 | 2026-06-23 | +| BR1 4SA | 733315 | 2026-06-23 | +| BR1 4SG | 711136 | 2026-06-23 | +| BR1 4SH | 730586 | 2026-06-23 | +| BR1 5BB | 731579 | 2026-06-23 | +| BR1 5EG | 726592 | 2026-06-23 | +| BR1 5EN | 723121 | 2026-06-23 | +| BR1 5EP | 714805 | 2026-06-23 | +| BR1 5ER | 715406 | 2026-06-23 | +| BR1 5EZ | 719897 | 2026-06-23 | diff --git a/scripts/trigger_modelling_e2e_sqs.py b/scripts/trigger_modelling_e2e_sqs.py index 6091e754..6aeea292 100644 --- a/scripts/trigger_modelling_e2e_sqs.py +++ b/scripts/trigger_modelling_e2e_sqs.py @@ -10,6 +10,8 @@ AWS creds come from the ambient ~/.aws profile. from __future__ import annotations +from utilities.logger import setup_logger + # --------------------------------------------------------------------------- # CONFIG — edit these before running # --------------------------------------------------------------------------- @@ -18,10 +20,10 @@ SCENARIO_ID: int = 1268 SQS_QUEUE_NAME: str = "modelling_e2e-queue-dev" # Number of postcodes to process this run. -POSTCODES_LIMIT: int = 2 +POSTCODES_LIMIT: int = 50 # True → Lambda runs the full pipeline but skips all DB writes (safe for testing). -DRY_RUN: bool = True +DRY_RUN: bool = False # True → Lambda skips the Google Solar fetch. NO_SOLAR: bool = False @@ -40,6 +42,8 @@ sys.path.insert(0, str(_REPO_ROOT)) import boto3 # noqa: E402 +logger = setup_logger() + _POSTCODES_FILE = _REPO_ROOT / "scripts" / f"properties_by_postcode_{PORTFOLIO_ID}.txt" _PROCESSED_MD = _REPO_ROOT / "scripts" / f"processed_postcodes_{PORTFOLIO_ID}.md" @@ -99,7 +103,7 @@ def main() -> None: to_process = pending[:POSTCODES_LIMIT] if not to_process: - print("Nothing left to process.") + logger.info("Nothing left to process.") return sqs: Any = cast( @@ -107,7 +111,7 @@ def main() -> None: ) # pyright: ignore[reportUnknownMemberType] sqs_url: str = sqs.get_queue_url(QueueName=SQS_QUEUE_NAME)["QueueUrl"] - print( + logger.info( f"sending {len(to_process)} messages " f"(portfolio={PORTFOLIO_ID}, scenario={SCENARIO_ID}, " f"dry_run={DRY_RUN}, no_solar={NO_SOLAR}) → {sqs_url}" @@ -127,9 +131,11 @@ def main() -> None: ), ) _record_processed(postcode, ids) - print(f" sent {postcode}: {ids}") + logger.info(f" sent {postcode}: {ids}") - print(f"\ndone — {len(to_process)} messages enqueued, tracking → {_PROCESSED_MD}") + logger.info( + f"\ndone — {len(to_process)} messages enqueued, tracking → {_PROCESSED_MD}" + ) main() From f20646d77442d663be268e28b9a4be0b50309b38 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 23 Jun 2026 12:25:52 +0000 Subject: [PATCH 03/15] missing files --- scripts/failed_modelling_e2e.md | 17 ++++++ scripts/query_failed_modelling_e2e.py | 84 +++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 scripts/failed_modelling_e2e.md create mode 100644 scripts/query_failed_modelling_e2e.py diff --git a/scripts/failed_modelling_e2e.md b/scripts/failed_modelling_e2e.md new file mode 100644 index 00000000..2d63da42 --- /dev/null +++ b/scripts/failed_modelling_e2e.md @@ -0,0 +1,17 @@ +# Failed modelling_e2e Subtasks + +| Subtask ID | Task ID | Updated At | Property ID | UPRN | Inputs | +|-----------|---------|------------|-------------|------|--------| +| ce6a5844-cf31-495e-9e45-91a83aedb8e7 | a520b8a0-2b7a-4a99-a87d-bfe4bf785de6 | 2026-06-23 11:35:58.448106+00:00 | 719897 | 100021919718 | {"property_ids": [719897], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 31e687bb-9b9d-4fcc-b640-f68f878cf49a | b7dde417-2e5d-42ee-b695-c9d7a9ca81c1 | 2026-06-23 11:35:51.384121+00:00 | 733315 | 100020401711 | {"property_ids": [733315], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| b337172c-9dc5-48a0-9eb8-8021893a0ef1 | 01266210-d44a-4715-bf21-eda88a67a5e7 | 2026-06-23 11:35:41.863424+00:00 | 723589 | 100020407755 | {"property_ids": [723589], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| d2af286a-8964-4040-8429-e289d215c635 | 5f408513-be4d-4ce0-96b0-ceb654563ca2 | 2026-06-23 11:35:39.939416+00:00 | 726592 | 100021918195 | {"property_ids": [726592], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 1d13c3a2-b269-4ca4-a3f7-f19479081444 | cebcff9b-4a46-48f0-a648-f40b030951b2 | 2026-06-23 11:35:18.760333+00:00 | 711228 | 100020416477 | {"property_ids": [711228], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| f920f079-edd0-4e3e-893e-809e57a57292 | e6a75a2f-2165-4c6a-b929-f485db08b5a2 | 2026-06-23 11:35:11.908026+00:00 | 717435 | 22010468 | {"property_ids": [717435], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 36ec4a16-be95-4fda-8279-d7d33ed5a556 | 693c3886-efc6-48c1-b99d-576b5736c7e9 | 2026-06-23 11:35:06.439654+00:00 | 710339 | 10013151061 | {"property_ids": [710339], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 8960e551-10af-48ac-b4ad-821154a79a1c | 17791ee1-1ec6-49ea-a6fc-6f1e8d20914d | 2026-06-23 11:34:58.830828+00:00 | 721815 | 22086690 | {"property_ids": [721815], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 453ca0df-3b0d-427d-abf5-8462194f770b | 4712998d-d130-4472-860f-5b1d2471b3e3 | 2026-06-23 11:34:47.106853+00:00 | 712401 | 100020394694 | {"property_ids": [712401], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 1f5ec8fb-7202-44d6-8794-44515f9b4d82 | e50d8753-fd8b-4735-ac89-225428989ec5 | 2026-06-23 11:34:39.473828+00:00 | 723881 | 22005280 | {"property_ids": [723881], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 6ddff51f-1c29-439c-9335-b5befee64836 | dbac1632-3648-46da-97bc-0ca572bc9c45 | 2026-06-23 11:34:35.708295+00:00 | 715891 | 22082258 | {"property_ids": [715891], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 3255673d-7cba-49f8-ba88-106301dfa029 | 620f5571-d6c5-469a-afe3-8986b53dd041 | 2026-06-23 11:34:32.737237+00:00 | 716049 | 22104161 | {"property_ids": [716049], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | +| 9b1a8289-de92-4935-afd6-b93a89f400e6 | 35abffbe-7574-448a-b8cf-89586bf9057d | 2026-06-23 11:34:31.003170+00:00 | 730259 | 100061905741 | {"property_ids": [730259], "portfolio_id": 796, "scenario_id": 1268, "no_solar": false, "dry_run": false} | diff --git a/scripts/query_failed_modelling_e2e.py b/scripts/query_failed_modelling_e2e.py new file mode 100644 index 00000000..f22c3f8e --- /dev/null +++ b/scripts/query_failed_modelling_e2e.py @@ -0,0 +1,84 @@ +"""Query failed modelling_e2e subtasks and write a markdown report. + +Joins sub_task → tasks, pulls property_ids from the inputs JSON, then looks up +UPRNs from the property table. + +Hit Run — output written to scripts/failed_modelling_e2e.md +""" + +from __future__ import annotations + +import json +import sys +from pathlib import Path + +_REPO_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(_REPO_ROOT)) + +from sqlalchemy import text # noqa: E402 + +from scripts.e2e_common import ENV_PATH, build_engine, load_env # noqa: E402 + +_OUTPUT = _REPO_ROOT / "scripts" / "failed_modelling_e2e.md" + +load_env(ENV_PATH) +engine = build_engine() + +with engine.connect() as conn: + subtask_rows = conn.execute(text(""" + SELECT + st.id AS subtask_id, + st.task_id, + st.inputs, + st.updated_at + FROM sub_task st + JOIN tasks t ON t.id = st.task_id + WHERE t.task_source = 'modelling_e2e' + AND st.status = 'failed' + AND st.updated_at >= '2026-06-23 12:34:26.990+01:00' + ORDER BY st.updated_at DESC + """)).fetchall() + + if not subtask_rows: + print("No failed modelling_e2e subtasks found.") + _OUTPUT.write_text("# Failed modelling_e2e Subtasks\n\nNone found.\n", encoding="utf-8") + exit(0) + + # Collect all property_ids across all rows + all_property_ids: list[int] = [] + parsed: list[tuple[str, str, list[int], str, str]] = [] + for subtask_id, task_id, inputs_raw, updated_at in subtask_rows: + try: + inputs = json.loads(inputs_raw) if isinstance(inputs_raw, str) else (inputs_raw or {}) + property_ids: list[int] = [int(p) for p in (inputs.get("property_ids") or [])] + except Exception: + property_ids = [] + parsed.append((str(subtask_id), str(task_id), property_ids, str(updated_at), inputs_raw or "")) + all_property_ids.extend(property_ids) + + # Look up UPRNs + uprn_map: dict[int, int] = {} + if all_property_ids: + uprn_rows = conn.execute( + text("SELECT id, uprn FROM property WHERE id = ANY(:ids)"), + {"ids": all_property_ids}, + ).fetchall() + uprn_map = {int(r[0]): int(r[1]) for r in uprn_rows} + +lines: list[str] = [ + "# Failed modelling_e2e Subtasks\n", + f"| Subtask ID | Task ID | Updated At | Property ID | UPRN | Inputs |", + f"|-----------|---------|------------|-------------|------|--------|", +] + +for subtask_id, task_id, property_ids, updated_at, inputs_raw in parsed: + inputs_cell = (inputs_raw or "").replace("|", "\\|") + if property_ids: + for pid in property_ids: + uprn = uprn_map.get(pid, "unknown") + lines.append(f"| {subtask_id} | {task_id} | {updated_at} | {pid} | {uprn} | {inputs_cell} |") + else: + lines.append(f"| {subtask_id} | {task_id} | {updated_at} | — | — | {inputs_cell} |") + +_OUTPUT.write_text("\n".join(lines) + "\n", encoding="utf-8") +print(f"Written {len(parsed)} failed subtasks → {_OUTPUT}") From 00af7b5a54b972d868802b59e03746e67ca44722 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 12:42:53 +0000 Subject: [PATCH 04/15] data types --- .../expand-sap-accuracy-corpus/worklist.md | 90 +++++ applications/modelling_e2e/handler.py | 37 +- .../uprn_100061905751/elmhurst_summary.pdf | Bin 0 -> 67142 bytes .../uprn_100061905751/elmhurst_worksheet.pdf | Bin 0 -> 44569 bytes .../uprn_100061905751/epc.json | 335 ++++++++++++++++++ datatypes/epc/domain/mapper.py | 21 +- .../epc/domain/tests/test_from_sap_schema.py | 30 ++ .../lambda/modelling_e2e/variables.tf | 2 +- .../epc_comparable_properties_repository.py | 55 ++- scripts/hyde/elmhurst_download.py | 2 +- .../modelling_e2e/test_handler.py | 93 +++++ ...st_epc_comparable_properties_repository.py | 63 ++++ 12 files changed, 715 insertions(+), 13 deletions(-) create mode 100644 backend/epc_api/json_samples/real_life_examples/SAP-Schema-16.3/uprn_100061905751/elmhurst_summary.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/SAP-Schema-16.3/uprn_100061905751/elmhurst_worksheet.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/SAP-Schema-16.3/uprn_100061905751/epc.json diff --git a/.claude/skills/expand-sap-accuracy-corpus/worklist.md b/.claude/skills/expand-sap-accuracy-corpus/worklist.md index 3825927b..e5c6b8fa 100644 --- a/.claude/skills/expand-sap-accuracy-corpus/worklist.md +++ b/.claude/skills/expand-sap-accuracy-corpus/worklist.md @@ -11,12 +11,102 @@ large, or a new/complex build pattern needed; NEEDS INVESTIGATION. 2020 new-build flat) — full loop proven: eng 77 / elm 78, engine-on-Elmhurst- inputs 79 (calculator faithful within ~1). Use it to sanity-check the pipeline. +# Files saving instructions +I've noticed we arn't saving the epc.json (from epc api), input summary and worksheets from elmhurst. We shuold be doing that so we can reproduce behaviours quicker and verify. This is important as other memebers of team can help improve the verification. Files should be saved on backend/epc_api/json_samples/real_life_examples//uprn_/ + + ## Do next — new schemas (need a mapper) These two were flagged NOT MAPPABLE in the UI (red ✗). Mapper coverage now ADDED (dedicated per-schema methods in `EpcPropertyDataMapper`; corpus gauge green, 0 new pyright errors). Elmhurst build + pin still pending — run the normal loop. +### 🔧🔍 FOR KHALIM — 100061905751 (cert 2628-3046-6233-4584-2970, SAP-16.3) — mapper fix landed, Elmhurst +5 to review +Surfaced as a PRODUCTION crash (NOT in The 100): `modelling_e2e` property 730259 +`predict_epc` → `EpcComparablePropertiesRepository.candidates_for(postcode)` maps +EVERY cohort cert in one list comprehension, and THIS cert raised +`ValueError: RdSapSchema17_1: missing required field 'insulated_door_count'`, +aborting the whole prediction. 🔧 FIXED generically in `_normalize_sap_schema_16_x` +(`mapper.py`): `setdefault("insulated_door_count", 0)` — door refinement, absent → +"no insulated doors recorded" → 0 (conservative RdSAP). +regression test +`test_16_x_missing_insulated_door_count_defaults_to_zero` (test_from_sap_schema.py); +0 new pyright errors; real-cert accuracy + 16.x suites green. +Cert: END-TERRACE HOUSE 2-storey, band A pre-1900, cavity wall AS-BUILT **no +insulation** (U0.70), pitched 100mm loft, suspended uninsulated floor, mains-gas +COMBI (PCDB 16366 Glow-worm Ultracom 2 35cxi), control 2106 CBE, double glazed, +**2 OPEN FIREPLACES** (chimneys), lodged **secondary** open-fire smokeless fuel +(SAP 631 = Elmhurst RKJ), 3.84m² band-B extension, natural vent, 17% LED, TFA 139. +**eng 57 = lodged 57 EXACTLY** / elm worksheet 52 (+5). Built in Elmhurst end-to-end +(boiler 16366, CBE/2106, 2 open chimneys, secondary RKJ open-fire-in-grate, window +20.57m², party wall geometry GF 6.31/1F 5.14 CF). engine-on-Elmhurst-inputs 53 ≈ +worksheet 52 → **calculator faithful**. The +5 decomposes as: ~2 SAP = the documented +16.x reduced-field **party-wall gap** (lodges no party_wall_length → engine models +NONE; Elmhurst forces `Party walls Main 31.02m² × U0.250 = 7.76 W/K`), SCALED UP by +2-storey geometry (party wall area ~31m² vs ~16m² on the single-storey 16.2 pins +100021985993/100090182288 which showed only +2); remainder ~2-3 = reduced-field +build choices (3.84m² extension folded into GF, wall thickness 250 vs lodged 300, +draughtproofing default). build_100061905751.py complete. **NOT yet pinned** — to +review with Khalim (his call per CONTEXT.md): pin engine=lodged 57 like other 16.x, +and/or whether 16.x end-terrace should model a party wall to close the reduced-field +gap. Sample saved under SAP-Schema-16.3/uprn_100061905751 (epc.json + both PDFs). + +### 🔧🔍 modelling_e2e production failure sweep (2026-06-23) — cohort resilience + mapper gaps +Investigated the 45 FAILED `modelling_e2e` subtasks (DevAssessmentModelDB, portfolio +796) — 36 property rows, ~25 unique UPRNs. Root cause for most: `predict_epc` → +`EpcComparablePropertiesRepository.candidates_for(postcode)` mapped EVERY cohort cert +in one comprehension, so ONE unmappable cohort cert aborted the whole prediction. + +**✅ DONE — cohort resilience (skip + report)** so a single bad cert can't sink a +prediction, and the skipped certs surface for follow-up: +- `candidates_for` now skips certs that raise `ValueError` (mapper failures: + missing-field + `UnmappedApiCode`/`UnmappedElmhurstLabel`, both `ValueError`), + recording `SkippedCohortCert(certificate_number, error)` on `repo.skipped` + a + `logger.warning`. Transient API errors (not `ValueError`) still propagate. +- handler surfaces them in the subtask **outputs** (success → `outputs.result. + skipped_unmappable_cohort_certs`; failure → appended to the error message), with + cert numbers, so the gaps can be closed deliberately. +3 tests; 0 new pyright. + Live-verified on BN11 4EP: cohort now builds 35 + records the 1 skip. + +**✅ DONE — 2 safe generic mapper fixes (+regression tests, 0 new pyright):** +- `_normalize_sap_schema_16_x`: `setdefault("insulated_door_count", 0)` (the + original prod crash) AND `setdefault("multiple_glazed_proportion", 100)` (16.3 + cert 0418-3986-7250-2884-7970; ML-only field the SAP calc ignores; modal 100). +- `_with_recorded_performance` co2/consumption/rating: `float(co2)` → crashed on + certs lodging `co2_emissions_current` as a Measurement dict `{'value':3.5, + 'quantity':'tonnes per year'}` (16.x cert 2308-4997-7262-0137-9930, surfaced as + `TypeError: float() argument must be ... not 'dict'`). Now coerced via + `_measurement_value` (handles Measurement/dict/number). Verified maps → 3.5. + +**⚖️ FOR KHALIM — uncovered mapper gaps (mapper is your domain per CONTEXT.md):** +- **`built_form` missing (SAP-16.0)** — cert 8742-6624-9300-2780-4926 (uprn + 10070004512); has `property_type` but no `built_form`. Defaulting it drives + party-wall/exposed-perimeter modelling → a real modelling decision, not a neutral + default. Blocks props 710339, 723589. +- **`window` missing + genuinely sparse (SAP-16.2)** — cert 8257-7539-1649-0633-4992 + (uprn 10070009758); `windows` is a DICT not list, AND it omits `door_count`, + `habitable_room_count`, `glazed_area` — fail-loud is likely correct (data + insufficient). Blocks props 733315, 730259. +- **🔍 RdSAP-21.0.0 systematically lacks the ADR-0028 Optional widenings 21.0.1 got.** + Cert 3135-3223-5500-0919-2206 (uprn 100021919725) omits 13 top-level fields + (`wet_rooms_count`, `open_chimneys_count`, `mechanical_ventilation_index_number`, + `led/cfl_fixed_lighting_bulbs_count`, the `mechanical_vent_duct_*`, + `insulated_door_u_value`, `pressure_test_certificate_number`, + `windows_transmission_details`) + `SapWindow` (`pvc_frame`/`glazing_gap`/ + `frame_factor`/`window_transmission_details`) — ALL required in 21.0.0 but + `Optional[...] = None` in 21.0.1. NOT applied: widening risks pushing `None` into + `from_rdsap_schema_21_0_0` which may assume non-None (needs mapper-coalescing + review). Recommend aligning RdSapSchema21_0_0 to 21.0.1 (incl. the same Optionals + on insulated_door_count etc.) + reviewing the 21.0.0 mapper. Blocks prop 719897. + (The resilience change already stops all of these from crashing prod.) + +Caveat: ~13 other failed props showed no mapper gap on replay — genuinely +not-predictable (empty/insufficient cohort) or already fixed by the +`insulated_door_count` default; cohort replay only checked the first 60 certs/postcode +and skipped rate-limited fetches, so a deeper gap could be missed. + +**Also done:** `deployment/terraform/lambda/modelling_e2e/variables.tf` +`maximum_concurrency` default 2 → 4 (per request). + - [x] 🔧 10096028301 — SAP-Schema-19.1.0 (full-SAP g/f FLAT, band M, combi PCDB 17929, MEV, AP50 3.5) · eng 82 / elm 82 (lodged 85) · PINNED engine 82. 🔧 mapper added: `from_sap_schema_19_1_0`. Built in Elmhurst (boiler 17929 via search, control CBE/2106, water from primary, MEV on, AP50 Blower Door 3.5+cert). Engine EXACTLY matches Elmhurst worksheet (82.11 vs 82); engine-on-Elmhurst-inputs 82.16 ≈ 82 → calculator faithful. −3 vs lodged = measured-U-vs-RdSAP-default + MEV extract-not-recovery (documented). No mapper change beyond coverage. - [x] 🔧 100021943298 — SAP-Schema-16.1 (g/f FLAT, band B, solid-brick internal, combi PCDB 10328) · eng 76 / elm 75 (lodged 72) · PINNED engine 76. 🔧 mapper added: `from_sap_schema_16_1`. Built in Elmhurst (boiler 10328 via search, control CBE/2106, water from primary, wall insulation thickness Unknown); worksheet 75 → engine within ~1 (tightest agreement, reduced-field). Boiler-select + water-heating + control dialogs all driven via automation (two-step row→Select / cascade + coordinate-OK). No mapper change beyond coverage. diff --git a/applications/modelling_e2e/handler.py b/applications/modelling_e2e/handler.py index de7b5542..86b5ad5f 100644 --- a/applications/modelling_e2e/handler.py +++ b/applications/modelling_e2e/handler.py @@ -61,6 +61,7 @@ from applications.modelling_e2e.modelling_e2e_trigger_body import ( ) from repositories.comparable_properties.epc_comparable_properties_repository import ( EpcComparablePropertiesRepository, + SkippedCohortCert, ) from repositories.geospatial.geospatial_s3_repository import ( GeospatialS3Repository, @@ -131,6 +132,20 @@ def _solar_insights_for( return None +def _dedupe_skipped( + skipped: list[SkippedCohortCert], +) -> list[SkippedCohortCert]: + """First occurrence of each skipped cert number (the same cert can appear in + more than one postcode cohort across a batch).""" + seen: set[str] = set() + unique: list[SkippedCohortCert] = [] + for cert in skipped: + if cert.certificate_number not in seen: + seen.add(cert.certificate_number) + unique.append(cert) + return unique + + def _predict_epc( *, property_id: int, @@ -168,7 +183,7 @@ def _predict_epc( @task_handler(task_source="modelling_e2e", source=Source.PROPERTY) -def handler(body: dict[str, Any], context: Any) -> None: +def handler(body: dict[str, Any], context: Any) -> Optional[dict[str, Any]]: trigger = ModellingE2ETriggerBody.model_validate(body) property_ids = trigger.property_ids portfolio_id = trigger.portfolio_id @@ -349,7 +364,25 @@ def handler(body: dict[str, Any], context: Any) -> None: ) errors.append(property_id) + # Cohort certs the mapper could not consume were skipped (not aborted on) + # so prediction could proceed; surface them — with cert numbers — in the + # subtask outputs so the mapper gaps can be closed later. + skipped_certs: list[dict[str, str]] = [ + {"certificate_number": s.certificate_number, "error": s.error} + for s in _dedupe_skipped(comparables_repo.skipped) + ] + if skipped_certs: + logger.info( + f"skipped {len(skipped_certs)} unmappable cohort cert(s): " + f"{[s['certificate_number'] for s in skipped_certs]}" + ) + if errors: - raise RuntimeError(f"failed property_ids: {errors}") + message = f"failed property_ids: {errors}" + if skipped_certs: + message += f"; skipped_unmappable_cohort_certs: {skipped_certs}" + raise RuntimeError(message) + + return {"skipped_unmappable_cohort_certs": skipped_certs} if skipped_certs else None finally: read_session.close() diff --git a/backend/epc_api/json_samples/real_life_examples/SAP-Schema-16.3/uprn_100061905751/elmhurst_summary.pdf b/backend/epc_api/json_samples/real_life_examples/SAP-Schema-16.3/uprn_100061905751/elmhurst_summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..805c6c25357c9b3d73764a9877e59b43f14c34ef GIT binary patch literal 67142 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 Dict[str, Any]: # still fail loud — that is correct, the fabric data is insufficient. d.setdefault("insulated_door_count", 0) + # Some 16.x certs (e.g. 16.3 cert 0418-3986-7250-2884-7970) omit + # `multiple_glazed_proportion` while still lodging `multiple_glazing_type` — + # RdSapSchema17_1 requires it. It is an ML-feature field the SAP-10 calculator + # never reads (only `sap10_ml/transform`), so the value is non-load-bearing for + # the score; default the modal 100 ("fully" the lodged glazing type) to keep the + # cert mappable. Mirrors the `insulated_door_count` default above. + d.setdefault("multiple_glazed_proportion", 100) + # 16.2 lodges glazing in BOTH `multiple_glazing_type` (frequently the "ND" # not-defined sentinel) AND the windows[].description. When the numeric field # is undefined, honour an explicit "Single glazed" description so it is not diff --git a/datatypes/epc/domain/tests/test_from_sap_schema.py b/datatypes/epc/domain/tests/test_from_sap_schema.py index 7b75b84c..85f8566e 100644 --- a/datatypes/epc/domain/tests/test_from_sap_schema.py +++ b/datatypes/epc/domain/tests/test_from_sap_schema.py @@ -538,6 +538,36 @@ class TestFromSapSchema16_2: assert isinstance(epc, EpcPropertyData) assert epc.insulated_door_count == 0 + def test_16_x_missing_multiple_glazed_proportion_still_maps(self) -> None: + # Some 16.x certs (e.g. 16.3 cert 0418-3986-7250-2884-7970) lodge + # `multiple_glazing_type` but omit `multiple_glazed_proportion`, which + # RdSapSchema17_1 requires — previously raised "missing required field + # 'multiple_glazed_proportion'", aborting the prediction cohort. The + # normaliser defaults the modal 100 so the cert maps. (The field is an + # ML-only feature the SAP calculator never reads, and from_rdsap_schema_17_1 + # does not carry it onto EpcPropertyData — the point here is mappability.) + data = load("sap_16_3.json") + del data["multiple_glazed_proportion"] + assert "multiple_glazed_proportion" not in data + + epc = EpcPropertyDataMapper.from_api_response(data) + + assert isinstance(epc, EpcPropertyData) + + def test_recorded_co2_as_measurement_dict_is_coerced_not_crashed(self) -> None: + # Some certs (e.g. 16.x cert 2308-4997-7262-0137-9930) lodge + # `co2_emissions_current` as a Measurement dict {'value': 3.5, 'quantity': + # 'tonnes per year'} rather than a plain number. `_with_recorded_performance` + # previously did `float(co2)` → "float() argument must be ... not 'dict'", + # crashing the whole prediction cohort. It now coerces via _measurement_value. + data = load("sap_16_3.json") + data["co2_emissions_current"] = {"value": 3.5, "quantity": "tonnes per year"} + + epc = EpcPropertyDataMapper.from_api_response(data) + + assert isinstance(epc, EpcPropertyData) + assert epc.co2_emissions_current == 3.5 + def test_16_2_normalizer_does_not_mutate_caller_dict(self) -> None: # Mirror _normalize_shower_outlets' contract: the caller's dict is # untouched (deep copy), so a re-dispatch sees the original shape. diff --git a/deployment/terraform/lambda/modelling_e2e/variables.tf b/deployment/terraform/lambda/modelling_e2e/variables.tf index 417f2780..27063494 100644 --- a/deployment/terraform/lambda/modelling_e2e/variables.tf +++ b/deployment/terraform/lambda/modelling_e2e/variables.tf @@ -26,7 +26,7 @@ variable "reserved_concurrent_executions" { variable "maximum_concurrency" { type = number - default = 2 + default = 4 description = "Maximum concurrent Lambda invocations from the SQS trigger." } diff --git a/repositories/comparable_properties/epc_comparable_properties_repository.py b/repositories/comparable_properties/epc_comparable_properties_repository.py index 3bfd92b9..e0d09e0a 100644 --- a/repositories/comparable_properties/epc_comparable_properties_repository.py +++ b/repositories/comparable_properties/epc_comparable_properties_repository.py @@ -9,6 +9,8 @@ UPRNs share a partition). Register metadata the cert itself doesn't carry from __future__ import annotations +import logging +from dataclasses import dataclass from datetime import date from typing import Optional, Protocol @@ -38,12 +40,30 @@ class CohortGeospatial(Protocol): ) -> dict[int, Coordinates]: ... +logger = logging.getLogger(__name__) + + +@dataclass(frozen=True) +class SkippedCohortCert: + """A postcode-cohort cert the mapper could not consume, so it was excluded + from the cohort rather than sinking the whole prediction. The certificate + number + error are captured so the gap surfaces (subtask outputs + logs) and + can be closed by extending the mapper later (ADR-0031).""" + + certificate_number: str + error: str + + class EpcComparablePropertiesRepository(ComparablePropertiesRepository): def __init__( self, epc_client: CohortEpcClient, geospatial: CohortGeospatial ) -> None: self._epc_client = epc_client self._geospatial = geospatial + # Cohort certs skipped because they are not yet mappable. Accumulates + # across every postcode the instance serves; the caller reads it after + # the run to report the mapper gaps (see modelling_e2e handler). + self.skipped: list[SkippedCohortCert] = [] def candidates_for(self, postcode: str) -> list[ComparableProperty]: results: list[EpcSearchResult] = self._epc_client.search_by_postcode( @@ -53,14 +73,37 @@ class EpcComparablePropertiesRepository(ComparablePropertiesRepository): coordinates: dict[int, Coordinates] = self._geospatial.coordinates_for_uprns( uprns ) - return [self._comparable(result, coordinates) for result in results] + cohort: list[ComparableProperty] = [] + for result in results: + comparable = self._comparable_or_skip(result, coordinates) + if comparable is not None: + cohort.append(comparable) + return cohort - def _comparable( + def _comparable_or_skip( self, result: EpcSearchResult, coordinates: dict[int, Coordinates] - ) -> ComparableProperty: - epc: EpcPropertyData = self._epc_client.get_by_certificate_number( - result.certificate_number - ) + ) -> Optional[ComparableProperty]: + """Map one cohort cert, or record + skip it when the mapper raises a + ``ValueError`` (missing required field / unmapped code — see + ``UnmappedApiCode``). One unmappable cert must NOT abort the whole cohort; + transient API errors are NOT ``ValueError`` and still propagate.""" + try: + epc: EpcPropertyData = self._epc_client.get_by_certificate_number( + result.certificate_number + ) + except ValueError as exc: + self.skipped.append( + SkippedCohortCert( + certificate_number=result.certificate_number, + error=f"{type(exc).__name__}: {exc}", + ) + ) + logger.warning( + "skipping unmappable cohort cert %s: %s", + result.certificate_number, + exc, + ) + return None resolved: Optional[Coordinates] = ( coordinates.get(result.uprn) if result.uprn is not None else None ) diff --git a/scripts/hyde/elmhurst_download.py b/scripts/hyde/elmhurst_download.py index 7688a30f..f148ba28 100644 --- a/scripts/hyde/elmhurst_download.py +++ b/scripts/hyde/elmhurst_download.py @@ -28,7 +28,7 @@ SESSION_DIR = HERE / ".elmhurst-session" SAMPLE_DIR = ( HERE.parent.parent / "backend/epc_api/json_samples/real_life_examples" - / "RdSAP-Schema-17.1/uprn_10010215568" + / "SAP-Schema-16.3/uprn_100061905751" ) ASSESSMENT_GUID = "B44A0DB4-4C08-4241-B818-86F060172105" diff --git a/tests/applications/modelling_e2e/test_handler.py b/tests/applications/modelling_e2e/test_handler.py index 762cea60..e7ac4ced 100644 --- a/tests/applications/modelling_e2e/test_handler.py +++ b/tests/applications/modelling_e2e/test_handler.py @@ -198,6 +198,99 @@ def test_lodged_epc_path_saves_epc_plan_and_marks_modelled() -> None: mock_uow.commit.assert_called_once() +def test_skipped_cohort_certs_are_surfaced_in_the_outputs() -> None: + """Cohort certs the mapper can't consume are skipped (so prediction is not + aborted) and surfaced — with cert numbers — in the subtask outputs, so the + mapper gaps can be reported and closed.""" + from repositories.comparable_properties.epc_comparable_properties_repository import ( + SkippedCohortCert, + ) + + mock_engine = _engine_mock([PROPERTY_ID], [UPRN], [POSTCODE]) + mock_plan = _plan_mock() + skipped = [ + SkippedCohortCert( + certificate_number="8257-7539-1649-0633-4992", + error="ValueError: RdSapSchema17_1: missing required field 'window'", + ) + ] + + with ExitStack() as stack: + stack.enter_context( + patch("applications.modelling_e2e.handler.os.environ", _ENV) + ) + stack.enter_context( + patch( + "applications.modelling_e2e.handler._get_engine", + return_value=mock_engine, + ) + ) + stack.enter_context( + patch("applications.modelling_e2e.handler.EpcClientService") + ).return_value.get_by_uprn.return_value = MagicMock() + stack.enter_context( + patch("applications.modelling_e2e.handler.GeospatialS3Repository") + ) + stack.enter_context( + patch("applications.modelling_e2e.handler.GoogleSolarApiClient") + ) + stack.enter_context( + patch("applications.modelling_e2e.handler._spatial_for", return_value=None) + ) + stack.enter_context( + patch( + "applications.modelling_e2e.handler._solar_insights_for", + return_value=None, + ) + ) + stack.enter_context( + patch("applications.modelling_e2e.handler.overlays_from", return_value=[]) + ) + stack.enter_context( + patch("applications.modelling_e2e.handler.PropertyOverridesPostgresReader") + ) + stack.enter_context( + patch("applications.modelling_e2e.handler.ScenarioPostgresRepository") + ).return_value.get_many.return_value = [MagicMock()] + stack.enter_context( + patch( + "applications.modelling_e2e.handler.catalogue_with_off_catalogue_overrides" + ) + ) + stack.enter_context(patch("applications.modelling_e2e.handler.Session")) + stack.enter_context( + patch( + "applications.modelling_e2e.handler.run_modelling", + return_value=mock_plan, + ) + ) + # The repo accumulated a skipped (unmappable) cohort cert during the run. + stack.enter_context( + patch("applications.modelling_e2e.handler.EpcComparablePropertiesRepository") + ).return_value.skipped = skipped + MockUoW = stack.enter_context( + patch("applications.modelling_e2e.handler.PostgresUnitOfWork") + ) + MockUoW.return_value.__enter__.return_value = MagicMock() + MockUoW.return_value.__exit__.return_value = False + + # Act + result = _call_handler(_BODY) + + # Assert — the handler's return (→ subtask outputs.result) carries the cert + # numbers + errors of every skipped cohort cert. + assert result == { + "skipped_unmappable_cohort_certs": [ + { + "certificate_number": "8257-7539-1649-0633-4992", + "error": ( + "ValueError: RdSapSchema17_1: missing required field 'window'" + ), + } + ] + } + + # --------------------------------------------------------------------------- # EPC Prediction path # --------------------------------------------------------------------------- diff --git a/tests/repositories/comparable_properties/test_epc_comparable_properties_repository.py b/tests/repositories/comparable_properties/test_epc_comparable_properties_repository.py index 662d5b75..8f71be30 100644 --- a/tests/repositories/comparable_properties/test_epc_comparable_properties_repository.py +++ b/tests/repositories/comparable_properties/test_epc_comparable_properties_repository.py @@ -9,6 +9,8 @@ from datetime import date from pathlib import Path from typing import Any, Optional +import pytest + from datatypes.epc.domain.epc_property_data import EpcPropertyData from datatypes.epc.domain.mapper import EpcPropertyDataMapper from datatypes.epc.search.epc_search_result import EpcSearchResult @@ -126,3 +128,64 @@ def test_no_certs_in_the_postcode_yields_no_candidates() -> None: # Assert — no candidates, and the postcode was searched (normalisation/IO ran). assert candidates == [] assert client.searched_postcode == "LS6 1AA" + + +class _FakeEpcClientRaising: + """Serves the cohort, but raises the given exception for specific certs.""" + + def __init__( + self, results: list[EpcSearchResult], failures: dict[str, Exception] + ) -> None: + self._results = results + self._failures = failures + + def search_by_postcode(self, postcode: str) -> list[EpcSearchResult]: + return self._results + + def get_by_certificate_number(self, cert_num: str) -> EpcPropertyData: + if cert_num in self._failures: + raise self._failures[cert_num] + return _epc() + + +def test_unmappable_cohort_cert_is_skipped_and_recorded() -> None: + # Arrange — two certs share the postcode; one can't be mapped (the mapper + # raises ValueError for a missing required field, as the gov-API 16.x / sparse + # certs do). + here = Coordinates(longitude=-1.55, latitude=53.81) + client = _FakeEpcClientRaising( + [_result("CERT-OK", uprn=12345), _result("CERT-BAD", uprn=67890)], + failures={ + "CERT-BAD": ValueError( + "RdSapSchema17_1: missing required field 'window'" + ) + }, + ) + geospatial = _FakeGeospatial({12345: here}) + repo = EpcComparablePropertiesRepository(client, geospatial) + + # Act + candidates = repo.candidates_for("LS6 1AA") + + # Assert — the unmappable cert is excluded (does NOT sink the cohort) and the + # good one survives; the skip is recorded with the cert number + error so the + # mapper gap can be reported and closed later. + assert [c.certificate_number for c in candidates] == ["CERT-OK"] + assert len(repo.skipped) == 1 + assert repo.skipped[0].certificate_number == "CERT-BAD" + assert "missing required field 'window'" in repo.skipped[0].error + + +def test_transient_fetch_error_is_not_swallowed_as_unmappable() -> None: + # Arrange — a non-ValueError (e.g. a transient API failure) must NOT be + # silently skipped as "unmappable"; it propagates so the run fails loudly. + client = _FakeEpcClientRaising( + [_result("CERT-1", uprn=12345)], + failures={"CERT-1": RuntimeError("EPC API error 503")}, + ) + repo = EpcComparablePropertiesRepository(client, _FakeGeospatial({})) + + # Act / Assert + with pytest.raises(RuntimeError, match="503"): + repo.candidates_for("LS6 1AA") + assert repo.skipped == [] From 666cf304373fb142400fc8c2c1ceaf2bb03479f6 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 13:16:34 +0000 Subject: [PATCH 05/15] gated propertly --- datatypes/epc/domain/mapper.py | 15 ++++++------ .../epc/domain/tests/test_from_sap_schema.py | 23 +++++++++---------- .../test_real_cert_sap_accuracy.py | 22 ++++++++++++++++++ 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index ce0dbcc5..2b2045b6 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -3313,13 +3313,14 @@ def _normalize_sap_schema_16_x(data: Dict[str, Any]) -> Dict[str, Any]: # still fail loud — that is correct, the fabric data is insufficient. d.setdefault("insulated_door_count", 0) - # Some 16.x certs (e.g. 16.3 cert 0418-3986-7250-2884-7970) omit - # `multiple_glazed_proportion` while still lodging `multiple_glazing_type` — - # RdSapSchema17_1 requires it. It is an ML-feature field the SAP-10 calculator - # never reads (only `sap10_ml/transform`), so the value is non-load-bearing for - # the score; default the modal 100 ("fully" the lodged glazing type) to keep the - # cert mappable. Mirrors the `insulated_door_count` default above. - d.setdefault("multiple_glazed_proportion", 100) + # NB: we deliberately do NOT default `multiple_glazed_proportion` here. A 16.x + # cert that omits it (e.g. 16.3 cert 0418-3986-7250-2884-7970) is left to fail + # the RdSapSchema17_1 parse and be handled by the cohort skip-and-report path — + # synthesising a value (tried `100`) drew the otherwise-unmappable cert into the + # EPC-prediction donor pool and tipped near-tie similarity matches, regressing + # the frozen-fixture component-accuracy gate (has_hot_water_cylinder 30→29/36, + # door_count residual 23→25/36). The field is ML-only (the SAP calc never reads + # it), so there is no calc cost to leaving such certs unmapped. See worklist. # 16.2 lodges glazing in BOTH `multiple_glazing_type` (frequently the "ND" # not-defined sentinel) AND the windows[].description. When the numeric field diff --git a/datatypes/epc/domain/tests/test_from_sap_schema.py b/datatypes/epc/domain/tests/test_from_sap_schema.py index 85f8566e..d8d23fec 100644 --- a/datatypes/epc/domain/tests/test_from_sap_schema.py +++ b/datatypes/epc/domain/tests/test_from_sap_schema.py @@ -538,21 +538,20 @@ class TestFromSapSchema16_2: assert isinstance(epc, EpcPropertyData) assert epc.insulated_door_count == 0 - def test_16_x_missing_multiple_glazed_proportion_still_maps(self) -> None: - # Some 16.x certs (e.g. 16.3 cert 0418-3986-7250-2884-7970) lodge - # `multiple_glazing_type` but omit `multiple_glazed_proportion`, which - # RdSapSchema17_1 requires — previously raised "missing required field - # 'multiple_glazed_proportion'", aborting the prediction cohort. The - # normaliser defaults the modal 100 so the cert maps. (The field is an - # ML-only feature the SAP calculator never reads, and from_rdsap_schema_17_1 - # does not carry it onto EpcPropertyData — the point here is mappability.) + def test_16_x_missing_multiple_glazed_proportion_fails_loud(self) -> None: + # A 16.x cert omitting `multiple_glazed_proportion` (e.g. 16.3 cert + # 0418-3986-7250-2884-7970) is deliberately NOT defaulted — it fails the + # RdSapSchema17_1 parse and is handled by the cohort skip-and-report path. + # Synthesising a value drew the otherwise-unmappable cert into the + # EPC-prediction donor pool and regressed the component-accuracy gate; + # the field is ML-only so there is no calc cost to leaving it unmapped. data = load("sap_16_3.json") del data["multiple_glazed_proportion"] - assert "multiple_glazed_proportion" not in data - epc = EpcPropertyDataMapper.from_api_response(data) - - assert isinstance(epc, EpcPropertyData) + with pytest.raises( + ValueError, match="missing required field 'multiple_glazed_proportion'" + ): + EpcPropertyDataMapper.from_api_response(data) def test_recorded_co2_as_measurement_dict_is_coerced_not_crashed(self) -> None: # Some certs (e.g. 16.x cert 2308-4997-7262-0137-9930) lodge diff --git a/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py b/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py index aa8344b2..56989c71 100644 --- a/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py +++ b/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py @@ -581,6 +581,28 @@ _EXPECTATIONS: Final[tuple[RealCertExpectation, ...]] = ( cert_num="9978-7098-7226-2633-3994", sap_score=75, ), + # UPRN 10002468137 → cert 0215-2818-7357-9703-2145. RdSAP-Schema-17.1, + # all-electric high-heat-retention storage heaters on Economy 7, solid- + # brick uninsulated end-terrace. Ground truth is Elmhurst RdSAP10 = 60, + # reproduced on identical inputs (summary + full SAP 10.2 worksheet saved + # alongside: elmhurst_summary.pdf / elmhurst_worksheet.pdf). The engine + # produces 62 — a +2 over-rating localised to OFF-PEAK WATER HEATING: + # the worksheet (lines 243-246) prices the 7-hour off-peak immersion at a + # Table 13 split (19.36% @ 15.29p high + 80.64% @ 5.5p low), but the engine + # prices 100% at the 5.5p low rate, under-costing the bill (£595.68 vs + # £629.67) → lower ECF (2.69 vs 2.84) → SAP 62 not 60. (Space heating 100% + # off-peak IS correct for storage heaters — the worksheet agrees.) Strict + # xfail until the off-peak water-heating rate split is implemented. + RealCertExpectation( + schema="RdSAP-Schema-17.1", + sample="uprn_10002468137", + cert_num="0215-2818-7357-9703-2145", + sap_score=60, + known_bug_xfail=( + "off-peak (7-hour) water-heating high/low rate split not applied — " + "engine prices 100% at the low rate; see elmhurst_worksheet.pdf (243-246)" + ), + ), ) From 60ec922430bc33c62fd013cc244654149c9af4d4 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 13:17:23 +0000 Subject: [PATCH 06/15] fix regression tests --- .../skills/expand-sap-accuracy-corpus/worklist.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.claude/skills/expand-sap-accuracy-corpus/worklist.md b/.claude/skills/expand-sap-accuracy-corpus/worklist.md index e5c6b8fa..310582bc 100644 --- a/.claude/skills/expand-sap-accuracy-corpus/worklist.md +++ b/.claude/skills/expand-sap-accuracy-corpus/worklist.md @@ -67,10 +67,19 @@ prediction, and the skipped certs surface for follow-up: cert numbers, so the gaps can be closed deliberately. +3 tests; 0 new pyright. Live-verified on BN11 4EP: cohort now builds 35 + records the 1 skip. -**✅ DONE — 2 safe generic mapper fixes (+regression tests, 0 new pyright):** +**✅ DONE — generic mapper fixes (+regression tests, 0 new pyright):** - `_normalize_sap_schema_16_x`: `setdefault("insulated_door_count", 0)` (the - original prod crash) AND `setdefault("multiple_glazed_proportion", 100)` (16.3 - cert 0418-3986-7250-2884-7970; ML-only field the SAP calc ignores; modal 100). + original prod crash). +- ⚠️ REVERTED `setdefault("multiple_glazed_proportion", 100)` — it made an + otherwise-unmappable 16.3 cert (0418-3986-7250-2884-7970) join the EPC-prediction + **frozen-fixture donor pool** and tipped near-tie similarity matches, regressing + the component-accuracy gate (`has_hot_water_cylinder` 30→29/36; `door_count` + residual 23→25/36 — both ≫ the gate's 1e-3 float tolerance). The field is ML-only + (SAP calc never reads it) and the cohort skip-and-report path handles the cert, + so we leave it fail-loud instead of synthesising a value. Re-baselining the gate + was rejected (loosens a tighten-only gate for a real regression). For Khalim: if + 16.x certs missing `multiple_glazed_proportion` should map, derive it (single→0 / + double→100) rather than a flat default, and re-measure the gate. - `_with_recorded_performance` co2/consumption/rating: `float(co2)` → crashed on certs lodging `co2_emissions_current` as a Measurement dict `{'value':3.5, 'quantity':'tonnes per year'}` (16.x cert 2308-4997-7262-0137-9930, surfaced as From 2b0cb180bf276e7feb322444af54ed0c7ef63a1f Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 13:21:31 +0000 Subject: [PATCH 07/15] update air permebility --- datatypes/epc/domain/tests/test_from_sap_schema.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/datatypes/epc/domain/tests/test_from_sap_schema.py b/datatypes/epc/domain/tests/test_from_sap_schema.py index d8d23fec..d1bf36ed 100644 --- a/datatypes/epc/domain/tests/test_from_sap_schema.py +++ b/datatypes/epc/domain/tests/test_from_sap_schema.py @@ -324,7 +324,7 @@ class TestFromSapSchema17_1CodeBasedHeating: class TestFromSapSchema17_1Ventilation: - """Slice D5-vent: full-SAP sap_ventilation → measured air permeability (AP4), + """Slice D5-vent: full-SAP sap_ventilation → measured air permeability (AP50), ventilation_type → MechanicalVentilationKind, sheltered sides, wet rooms and the MEV PCDB index.""" @@ -333,9 +333,13 @@ class TestFromSapSchema17_1Ventilation: schema = from_dict(SapSchema17_1, load("sap_17_1.json")) return EpcPropertyDataMapper.from_sap_schema_17_1(schema) - def test_measured_air_permeability_fed_as_ap4(self, sample: EpcPropertyData) -> None: + def test_measured_air_permeability_fed_as_ap50(self, sample: EpcPropertyData) -> None: + # The lodged `air_permeability` is a q50 Blower-Door result, so it feeds the + # engine's AP50 path `(18) = AP50/20 + (8)` — NOT the AP4/Pulse formula + # `0.263 × AP4^0.924` (the air-permeability AP50 fix, uprn_10093116528). assert sample.sap_ventilation is not None - assert sample.sap_ventilation.air_permeability_ap4_m3_h_m2 == 2.6 + assert sample.sap_ventilation.air_permeability_ap50_m3_h_m2 == 2.6 + assert sample.sap_ventilation.air_permeability_ap4_m3_h_m2 is None def test_ventilation_type_6_is_extract(self, sample: EpcPropertyData) -> None: # ventilation_type 6 = MEV decentralised → EXTRACT_OR_PIV_OUTSIDE. From cbc14f1ca20f945e1b7a9922be4aab4ac87ce06b Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 23 Jun 2026 14:09:59 +0000 Subject: [PATCH 08/15] better tracking of already processed properties --- scripts/processed_postcodes_796.md | 90 --------------------------- scripts/query_failed_modelling_e2e.py | 33 +++++++--- scripts/trigger_modelling_e2e_sqs.py | 83 ++++++++++++------------ 3 files changed, 65 insertions(+), 141 deletions(-) delete mode 100644 scripts/processed_postcodes_796.md diff --git a/scripts/processed_postcodes_796.md b/scripts/processed_postcodes_796.md deleted file mode 100644 index 53a05f69..00000000 --- a/scripts/processed_postcodes_796.md +++ /dev/null @@ -1,90 +0,0 @@ -# Processed Properties — Portfolio 796 - -| Postcode | Property IDs | Processed | -|----------|--------------|-----------| - -| BN10 8EQ | 739489 | 2026-06-23 | -| BN11 2LT | 740998 | 2026-06-23 | -| BN11 4HB | 733255 | 2026-06-23 | -| BN13 2QP | 739481 | 2026-06-23 | -| BN14 7EH | 725823 | 2026-06-23 | -| BN15 0NF | 739509 | 2026-06-23 | -| BN15 9HT | 739500 | 2026-06-23 | -| BN15 9JB | 723564 | 2026-06-23 | -| BN15 9LH | 715324 | 2026-06-23 | -| BN15 9PA | 715063 | 2026-06-23 | -| BN1 5LA | 725286 | 2026-06-23 | -| BN17 6RE | 717496 | 2026-06-23 | -| BN17 7NS | 715550 | 2026-06-23 | -| BN1 7BX | 723873 | 2026-06-23 | -| BN1 7ER | 739508 | 2026-06-23 | -| BN18 0RT | 719161 | 2026-06-23 | -| BN1 8DH | 727964 | 2026-06-23 | -| BN1 8LG | 719523 | 2026-06-23 | -| BN1 9BW | 733567 | 2026-06-23 | -| BN1 9BZ | 733592 | 2026-06-23 | -| BN2 0FB | 715445 | 2026-06-23 | -| BN2 3PE | 733597 | 2026-06-23 | -| BN2 4BE | 728215 | 2026-06-23 | -| BN2 4JS | 731660 | 2026-06-23 | -| BN2 4LL | 715371 | 2026-06-23 | -| BN2 4RT | 710129 | 2026-06-23 | -| BN2 4RW | 725006 | 2026-06-23 | -| BN2 4TJ | 726521 | 2026-06-23 | -| BN2 6TL | 727827 | 2026-06-23 | -| BN2 8LS | 725067 | 2026-06-23 | -| BN3 5AE | 729390 | 2026-06-23 | -| BN3 5AG | 726500 | 2026-06-23 | -| BN41 1DQ | 722904 | 2026-06-23 | -| BN41 1SA | 731765 | 2026-06-23 | -| BN43 5ZE | 741057 | 2026-06-23 | -| BN11 2NH | 733234 | 2026-06-23 | -| BN11 4EP | 730259 | 2026-06-23 | -| BN13 2NN | 739497 | 2026-06-23 | -| BN15 0DU | 739485 | 2026-06-23 | -| BN15 0LT | 731504 | 2026-06-23 | -| BN16 3HL | 719864 | 2026-06-23 | -| BN1 7EH | 726123 | 2026-06-23 | -| BN2 0AE | 715891 | 2026-06-23 | -| BN2 4PL | 716049 | 2026-06-23 | -| BN2 4TQ | 726467 | 2026-06-23 | -| BN2 9ZN | 721815 | 2026-06-23 | -| BN3 1DL | 741420 | 2026-06-23 | -| BN3 7FN | 717435 | 2026-06-23 | -| BN41 2TP | 723881 | 2026-06-23 | -| BN42 4HS | 728370 | 2026-06-23 | -| BN43 5LA | 724702 | 2026-06-23 | -| BN43 6NN | 728476 | 2026-06-23 | -| BN43 6WE | 741142 | 2026-06-23 | -| BN44 3JG | 720812 | 2026-06-23 | -| BN44 3JH | 719419 | 2026-06-23 | -| BN44 3JT | 712902 | 2026-06-23 | -| BN7 2QF | 733723 | 2026-06-23 | -| BR1 2ND | 741004 | 2026-06-23 | -| BR1 2SN | 718709 | 2026-06-23 | -| BR1 3LR | 728414 | 2026-06-23 | -| BR1 3PE | 712401 | 2026-06-23 | -| BR1 3QH | 733236 | 2026-06-23 | -| BR1 3QJ | 726048 | 2026-06-23 | -| BR1 3QW | 711383 | 2026-06-23 | -| BR1 3RG | 715615 | 2026-06-23 | -| BR1 3RW | 728883 | 2026-06-23 | -| BR1 3ST | 712335 | 2026-06-23 | -| BR1 4DE | 723589 | 2026-06-23 | -| BR1 4JZ | 730244 | 2026-06-23 | -| BR1 4NW | 726966 | 2026-06-23 | -| BR1 4PU | 717828 | 2026-06-23 | -| BR1 4PY | 711228 | 2026-06-23 | -| BR1 4QF | 710339 | 2026-06-23 | -| BR1 4QQ | 729946 | 2026-06-23 | -| BR1 4QW | 710693 | 2026-06-23 | -| BR1 4RE | 722824 | 2026-06-23 | -| BR1 4SA | 733315 | 2026-06-23 | -| BR1 4SG | 711136 | 2026-06-23 | -| BR1 4SH | 730586 | 2026-06-23 | -| BR1 5BB | 731579 | 2026-06-23 | -| BR1 5EG | 726592 | 2026-06-23 | -| BR1 5EN | 723121 | 2026-06-23 | -| BR1 5EP | 714805 | 2026-06-23 | -| BR1 5ER | 715406 | 2026-06-23 | -| BR1 5EZ | 719897 | 2026-06-23 | diff --git a/scripts/query_failed_modelling_e2e.py b/scripts/query_failed_modelling_e2e.py index f22c3f8e..a4cca69f 100644 --- a/scripts/query_failed_modelling_e2e.py +++ b/scripts/query_failed_modelling_e2e.py @@ -35,13 +35,14 @@ with engine.connect() as conn: JOIN tasks t ON t.id = st.task_id WHERE t.task_source = 'modelling_e2e' AND st.status = 'failed' - AND st.updated_at >= '2026-06-23 12:34:26.990+01:00' ORDER BY st.updated_at DESC """)).fetchall() if not subtask_rows: print("No failed modelling_e2e subtasks found.") - _OUTPUT.write_text("# Failed modelling_e2e Subtasks\n\nNone found.\n", encoding="utf-8") + _OUTPUT.write_text( + "# Failed modelling_e2e Subtasks\n\nNone found.\n", encoding="utf-8" + ) exit(0) # Collect all property_ids across all rows @@ -49,11 +50,25 @@ with engine.connect() as conn: parsed: list[tuple[str, str, list[int], str, str]] = [] for subtask_id, task_id, inputs_raw, updated_at in subtask_rows: try: - inputs = json.loads(inputs_raw) if isinstance(inputs_raw, str) else (inputs_raw or {}) - property_ids: list[int] = [int(p) for p in (inputs.get("property_ids") or [])] + inputs = ( + json.loads(inputs_raw) + if isinstance(inputs_raw, str) + else (inputs_raw or {}) + ) + property_ids: list[int] = [ + int(p) for p in (inputs.get("property_ids") or []) + ] except Exception: property_ids = [] - parsed.append((str(subtask_id), str(task_id), property_ids, str(updated_at), inputs_raw or "")) + parsed.append( + ( + str(subtask_id), + str(task_id), + property_ids, + str(updated_at), + inputs_raw or "", + ) + ) all_property_ids.extend(property_ids) # Look up UPRNs @@ -76,9 +91,13 @@ for subtask_id, task_id, property_ids, updated_at, inputs_raw in parsed: if property_ids: for pid in property_ids: uprn = uprn_map.get(pid, "unknown") - lines.append(f"| {subtask_id} | {task_id} | {updated_at} | {pid} | {uprn} | {inputs_cell} |") + lines.append( + f"| {subtask_id} | {task_id} | {updated_at} | {pid} | {uprn} | {inputs_cell} |" + ) else: - lines.append(f"| {subtask_id} | {task_id} | {updated_at} | — | — | {inputs_cell} |") + lines.append( + f"| {subtask_id} | {task_id} | {updated_at} | — | — | {inputs_cell} |" + ) _OUTPUT.write_text("\n".join(lines) + "\n", encoding="utf-8") print(f"Written {len(parsed)} failed subtasks → {_OUTPUT}") diff --git a/scripts/trigger_modelling_e2e_sqs.py b/scripts/trigger_modelling_e2e_sqs.py index 6aeea292..456497ec 100644 --- a/scripts/trigger_modelling_e2e_sqs.py +++ b/scripts/trigger_modelling_e2e_sqs.py @@ -1,8 +1,9 @@ """Enqueue one SQS message per postcode group for the modelling_e2e Lambda. Reads postcode → property ID groups from the file produced by -list_properties_by_postcode.py, skips postcodes already logged in the tracking -markdown, then sends one SQS message per postcode batch. +list_properties_by_postcode.py, queries the DB for already-completed +property IDs, then sends one SQS message per postcode batch containing only +the properties that still need processing. Edit the CONFIG block below, then hit Run. AWS creds come from the ambient ~/.aws profile. @@ -19,8 +20,9 @@ PORTFOLIO_ID: int = 796 SCENARIO_ID: int = 1268 SQS_QUEUE_NAME: str = "modelling_e2e-queue-dev" -# Number of postcodes to process this run. -POSTCODES_LIMIT: int = 50 +# Number of postcodes to process this run (postcodes where all properties are +# already completed are skipped and do not count toward this limit). +POSTCODES_LIMIT: int = 100 # True → Lambda runs the full pipeline but skips all DB writes (safe for testing). DRY_RUN: bool = False @@ -32,20 +34,20 @@ NO_SOLAR: bool = False import ast import json import sys -from datetime import date from pathlib import Path from typing import Any, cast -from uuid import uuid4 _REPO_ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(_REPO_ROOT)) import boto3 # noqa: E402 +from sqlalchemy import text # noqa: E402 + +from scripts.e2e_common import ENV_PATH, build_engine, load_env # noqa: E402 logger = setup_logger() _POSTCODES_FILE = _REPO_ROOT / "scripts" / f"properties_by_postcode_{PORTFOLIO_ID}.txt" -_PROCESSED_MD = _REPO_ROOT / "scripts" / f"processed_postcodes_{PORTFOLIO_ID}.md" def _load_postcode_map() -> dict[str, list[int]]: @@ -63,44 +65,40 @@ def _load_postcode_map() -> dict[str, list[int]]: return result -def _already_processed() -> set[str]: - if not _PROCESSED_MD.exists(): - return set() - processed: set[str] = set() - for line in _PROCESSED_MD.read_text(encoding="utf-8").splitlines(): - if ( - line.startswith("| ") - and not line.startswith("| Postcode") - and "---" not in line - ): - parts = [p.strip() for p in line.split("|")] - if len(parts) >= 2 and parts[1]: - processed.add(parts[1]) - return processed - - -def _record_processed(postcode: str, ids: list[int]) -> None: - today = date.today().isoformat() - ids_str = ", ".join(str(i) for i in ids) - row = f"| {postcode} | {ids_str} | {today} |\n" - if not _PROCESSED_MD.exists(): - _PROCESSED_MD.write_text( - f"# Processed Properties — Portfolio {PORTFOLIO_ID}\n\n" - "| Postcode | Property IDs | Processed |\n" - "|----------|--------------|-----------|\n" + row, - encoding="utf-8", - ) - else: - with _PROCESSED_MD.open("a", encoding="utf-8") as f: - f.write(row) +def _completed_property_ids() -> set[int]: + """Return all property IDs with a completed modelling_e2e subtask for this + portfolio + scenario. Single DB round-trip.""" + load_env(ENV_PATH) + engine = build_engine() + with engine.connect() as conn: + rows = conn.execute( + text(""" + SELECT DISTINCT (elem.value::int) AS property_id + FROM sub_task st + JOIN tasks t ON t.id = st.task_id + CROSS JOIN jsonb_array_elements_text(st.inputs->'property_ids') AS elem(value) + WHERE t.task_source = 'modelling_e2e' + AND st.status = 'completed' + AND (st.inputs->>'portfolio_id')::int = :portfolio_id + AND (st.inputs->>'scenario_id')::int = :scenario_id + """), + {"portfolio_id": PORTFOLIO_ID, "scenario_id": SCENARIO_ID}, + ).fetchall() + return {int(r[0]) for r in rows} def main() -> None: postcode_map = _load_postcode_map() - done = _already_processed() + completed = _completed_property_ids() + logger.info(f"{len(completed)} property IDs already completed — skipping") - pending = [(pc, ids) for pc, ids in postcode_map.items() if pc not in done] - to_process = pending[:POSTCODES_LIMIT] + batches: list[tuple[str, list[int]]] = [] + for postcode, ids in postcode_map.items(): + pending = [pid for pid in ids if pid not in completed] + if pending: + batches.append((postcode, pending)) + + to_process = batches[:POSTCODES_LIMIT] if not to_process: logger.info("Nothing left to process.") @@ -130,12 +128,9 @@ def main() -> None: } ), ) - _record_processed(postcode, ids) logger.info(f" sent {postcode}: {ids}") - logger.info( - f"\ndone — {len(to_process)} messages enqueued, tracking → {_PROCESSED_MD}" - ) + logger.info(f"\ndone — {len(to_process)} messages enqueued") main() From c12bfc74139b777725cf1e0998bf123bdde5fb3d Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 14:11:30 +0000 Subject: [PATCH 09/15] test for 16 --- .../expand-sap-accuracy-corpus/worklist.md | 49 ++++++++++++++++++- .../lambda/modelling_e2e/variables.tf | 2 +- .../epc_comparable_properties_repository.py | 16 ++++-- ...st_epc_comparable_properties_repository.py | 25 ++++++++++ 4 files changed, 86 insertions(+), 6 deletions(-) diff --git a/.claude/skills/expand-sap-accuracy-corpus/worklist.md b/.claude/skills/expand-sap-accuracy-corpus/worklist.md index 310582bc..caf8851d 100644 --- a/.claude/skills/expand-sap-accuracy-corpus/worklist.md +++ b/.claude/skills/expand-sap-accuracy-corpus/worklist.md @@ -114,7 +114,54 @@ not-predictable (empty/insufficient cohort) or already fixed by the and skipped rate-limited fetches, so a deeper gap could be missed. **Also done:** `deployment/terraform/lambda/modelling_e2e/variables.tf` -`maximum_concurrency` default 2 → 4 (per request). +`maximum_concurrency` default 2 → 4 (per request). Cohort skip-guard widened to +`(ValueError, AttributeError, KeyError, TypeError)` (mapper-shape errors) so a +malformed cert (e.g. PV-as-list AttributeError) is skipped+reported too, not just +missing-field ValueErrors; transient `EpcApiError` (subclasses `Exception`) still +propagates. +regression test. + +### 📋 PLAN — close the 8 modelling_e2e mapping gaps (2026-06-23 run, portfolio 796) +The 8 failed prediction targets reduce to **5 distinct mapper-gap classes** (the fix +targets). Per class: fix the mapper GENERICALLY, guard with BOTH the RdSAP-21.0.1 +corpus gauge AND the **component-accuracy gate** (`test_component_accuracy_gate.py` +— every newly-mappable cert joins the prediction donor pool and can tip near-tie +similarity, as `multiple_glazed_proportion=100` did: regressed has_hot_water_cylinder +30→29/36 + door_count 23→25/36 ⇒ REVERTED). Then validate the now-mappable cert via +`/expand-sap-accuracy-corpus` on **the cohort cert's UPRN** (below), saving +epc.json + elmhurst_summary.pdf + elmhurst_worksheet.pdf under +`real_life_examples//uprn_/` and committing them. + +- **P1 — `built_form` missing (SAP-16.0)** — HIGHEST impact (5 certs / 3 targets: + 10013151061, 100020397529, 100020407755). Cert→UPRN: 8742-…-4926→10070004512, + 0004-…-7395→100020407745, 2338-…-5950→100020407732, 9328-…-0924→100020407771 + (8904-…-4623 has NO uprn — validate via one of the others). ⚠ built_form IS a + strong prediction similarity feature → highest gate-regression risk: DERIVE it + (from `dwelling_type` text / `property_type`), don't flat-default; re-measure the + gate. Corpus-validate uprn 10070004512. +- **P2 — `photovoltaic_supply` lodged as a LIST → AttributeError (`'list' has no + attribute none_or_no_details`)** — target 22086690 (BN2 9ZN). NEW real shape bug + (not missing-field); escaped the skip net until widened above. Clean fix: coerce + the list shape in the PV mapper (like the Measurement-dict co2 fix). Low gate risk. + ⚠ FIRST identify the offending cert in the BN2 9ZN cohort (lookup didn't surface it + in the first 50 — search the full cohort for `photovoltaic_supply` as list). +- **P3 — `window` missing, `windows` is a DICT not list (SAP-16.1)** — cert + 9768-…-7974 → uprn 100062614005, target 100061905741. Clean normaliser fix: handle + `windows` as a dict (take it directly) in `_normalize_sap_schema_16_x`. Corpus- + validate uprn 100062614005. +- **P4 — `multiple_glazed_proportion` missing (SAP-16.3)** — cert 0418-…-7970 → uprn + 22144943, target 22082258. The flat-100 default REGRESSED the gate (reverted). + DERIVE it (single→0 / double→100 from `multiple_glazing_type` / window desc) so it + doesn't perturb similarity, then re-measure the gate. Corpus-validate uprn 22144943. +- **P5 — RdSAP-21.0.0 systematic ADR-0028 alignment** (`SapWindow.glazing_gap` + + 13 top-level fields) — cert 3135-…-2206 → uprn 100021919725, target 100021919718. + Align RdSapSchema21_0_0 Optionals to 21.0.1 + review `from_rdsap_schema_21_0_0` + None-coalescing. Larger/riskier. Corpus-validate uprn 100021919725. +- **P6 — `window` + genuinely sparse (SAP-16.2)** — cert 8257-…-4992 → uprn + 10070009758, target 100020401711. Also omits door_count/habitable/glazed_area → + fail-loud is likely CORRECT (insufficient data). DOCUMENT decision; don't force-map. + +After all: re-run the modelling_e2e failure sweep to confirm the cohort skips drop +to zero (or only P6-class), and that no new gate regression slipped in. - [x] 🔧 10096028301 — SAP-Schema-19.1.0 (full-SAP g/f FLAT, band M, combi PCDB 17929, MEV, AP50 3.5) · eng 82 / elm 82 (lodged 85) · PINNED engine 82. 🔧 mapper added: `from_sap_schema_19_1_0`. Built in Elmhurst (boiler 17929 via search, control CBE/2106, water from primary, MEV on, AP50 Blower Door 3.5+cert). Engine EXACTLY matches Elmhurst worksheet (82.11 vs 82); engine-on-Elmhurst-inputs 82.16 ≈ 82 → calculator faithful. −3 vs lodged = measured-U-vs-RdSAP-default + MEV extract-not-recovery (documented). No mapper change beyond coverage. - [x] 🔧 100021943298 — SAP-Schema-16.1 (g/f FLAT, band B, solid-brick internal, combi PCDB 10328) · eng 76 / elm 75 (lodged 72) · PINNED engine 76. 🔧 mapper added: `from_sap_schema_16_1`. Built in Elmhurst (boiler 10328 via search, control CBE/2106, water from primary, wall insulation thickness Unknown); worksheet 75 → engine within ~1 (tightest agreement, reduced-field). Boiler-select + water-heating + control dialogs all driven via automation (two-step row→Select / cascade + coordinate-OK). No mapper change beyond coverage. diff --git a/deployment/terraform/lambda/modelling_e2e/variables.tf b/deployment/terraform/lambda/modelling_e2e/variables.tf index 27063494..02cba590 100644 --- a/deployment/terraform/lambda/modelling_e2e/variables.tf +++ b/deployment/terraform/lambda/modelling_e2e/variables.tf @@ -26,7 +26,7 @@ variable "reserved_concurrent_executions" { variable "maximum_concurrency" { type = number - default = 4 + default = 16 description = "Maximum concurrent Lambda invocations from the SQS trigger." } diff --git a/repositories/comparable_properties/epc_comparable_properties_repository.py b/repositories/comparable_properties/epc_comparable_properties_repository.py index e0d09e0a..e1e7bd4d 100644 --- a/repositories/comparable_properties/epc_comparable_properties_repository.py +++ b/repositories/comparable_properties/epc_comparable_properties_repository.py @@ -80,18 +80,26 @@ class EpcComparablePropertiesRepository(ComparablePropertiesRepository): cohort.append(comparable) return cohort + # Mapper-shape errors: the cert's lodged data does not fit the schema/mapper. + # `ValueError` — missing required field / unmapped code (`UnmappedApiCode`); + # `AttributeError` — a field lodged in the wrong shape (e.g. `photovoltaic_supply` + # as a list where a `PhotovoltaicSupply` object is expected → "'list' object has + # no attribute 'none_or_no_details'"); `KeyError`/`TypeError` — analogous + # structural mismatches. Transient API failures (`EpcApiError` &c.) subclass + # `Exception` directly, NOT these, so they still propagate and fail the run loud. + _UNMAPPABLE_CERT_ERRORS = (ValueError, AttributeError, KeyError, TypeError) + def _comparable_or_skip( self, result: EpcSearchResult, coordinates: dict[int, Coordinates] ) -> Optional[ComparableProperty]: """Map one cohort cert, or record + skip it when the mapper raises a - ``ValueError`` (missing required field / unmapped code — see - ``UnmappedApiCode``). One unmappable cert must NOT abort the whole cohort; - transient API errors are NOT ``ValueError`` and still propagate.""" + mapper-shape error (see ``_UNMAPPABLE_CERT_ERRORS``). One unmappable cert + must NOT abort the whole cohort; transient API errors still propagate.""" try: epc: EpcPropertyData = self._epc_client.get_by_certificate_number( result.certificate_number ) - except ValueError as exc: + except self._UNMAPPABLE_CERT_ERRORS as exc: self.skipped.append( SkippedCohortCert( certificate_number=result.certificate_number, diff --git a/tests/repositories/comparable_properties/test_epc_comparable_properties_repository.py b/tests/repositories/comparable_properties/test_epc_comparable_properties_repository.py index 8f71be30..418b2af6 100644 --- a/tests/repositories/comparable_properties/test_epc_comparable_properties_repository.py +++ b/tests/repositories/comparable_properties/test_epc_comparable_properties_repository.py @@ -176,6 +176,31 @@ def test_unmappable_cohort_cert_is_skipped_and_recorded() -> None: assert "missing required field 'window'" in repo.skipped[0].error +def test_malformed_cert_shape_attributeerror_is_skipped_and_recorded() -> None: + # Arrange — a cohort cert lodges a field in the wrong shape (e.g. + # `photovoltaic_supply` as a list), so the mapper raises AttributeError + # ("'list' object has no attribute 'none_or_no_details'") — a mapper-shape + # error like the missing-field ValueErrors, so it must skip + record, not abort. + client = _FakeEpcClientRaising( + [_result("CERT-OK", uprn=12345), _result("CERT-BAD", uprn=67890)], + failures={ + "CERT-BAD": AttributeError( + "'list' object has no attribute 'none_or_no_details'" + ) + }, + ) + repo = EpcComparablePropertiesRepository(client, _FakeGeospatial({})) + + # Act + candidates = repo.candidates_for("LS6 1AA") + + # Assert — bad cert skipped + recorded; good cert survives. + assert [c.certificate_number for c in candidates] == ["CERT-OK"] + assert len(repo.skipped) == 1 + assert repo.skipped[0].certificate_number == "CERT-BAD" + assert "none_or_no_details" in repo.skipped[0].error + + def test_transient_fetch_error_is_not_swallowed_as_unmappable() -> None: # Arrange — a non-ValueError (e.g. a transient API failure) must NOT be # silently skipped as "unmappable"; it propagates so the run fails loudly. From 6ee2f6257ab529a219c258ddb1f33cba0a618174 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 14:51:40 +0000 Subject: [PATCH 10/15] fix(mapper): close modelling_e2e cohort mapping gaps (built_form, PV-list, windows-dict) Closes the mapper-coverage gaps surfaced by the modelling_e2e prediction-cohort failures (portfolio 796): - built_form (SAP-16.0): derive from dwelling_type in _normalize_sap_schema_16_x (Mid-terrace->4, End-terrace->3, Semi-detached->2, Detached->1; flats->modal 4). ML-only field (SAP calc never reads it) so SAP- and gate-neutral. 5 flat certs that omitted built_form now map. - photovoltaic_supply as a measured-array LIST: routed all pre-21 RdSAP mappers (17.0/17.1/18.0/19.0/20.0.0) through _map_schema_21_pv, whose list branch is now dict-tolerant (_pv_array_field reads dict OR dataclass). They capture the PV arrays like 21.0.x instead of raising "'list' object has no attribute none_or_no_details" and sinking the whole cohort. - windows-as-dict (16.x): handled in the normalizer (not just windows-as-list). Genuinely-sparse certs (omit door_count/habitable/glazed_area) remain fail-loud; the gate-regressing multiple_glazed_proportion default and the recursive RdSAP-21.0.0 ADR-0028 alignment are left fail-loud + flagged for review (worklist). +5 regression tests; component-accuracy gate 26/26; 0 new pyright errors. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../expand-sap-accuracy-corpus/worklist.md | 41 +++++ datatypes/epc/domain/mapper.py | 141 +++++++++++------- .../domain/tests/test_from_rdsap_schema.py | 24 +++ .../epc/domain/tests/test_from_sap_schema.py | 26 ++++ 4 files changed, 177 insertions(+), 55 deletions(-) diff --git a/.claude/skills/expand-sap-accuracy-corpus/worklist.md b/.claude/skills/expand-sap-accuracy-corpus/worklist.md index caf8851d..cdd3abbd 100644 --- a/.claude/skills/expand-sap-accuracy-corpus/worklist.md +++ b/.claude/skills/expand-sap-accuracy-corpus/worklist.md @@ -163,6 +163,47 @@ epc.json + elmhurst_summary.pdf + elmhurst_worksheet.pdf under After all: re-run the modelling_e2e failure sweep to confirm the cohort skips drop to zero (or only P6-class), and that no new gate regression slipped in. +### ✅ OUTCOMES (2026-06-23, "do all") — 553 tests pass, gate 26/26, 0 new pyright +- **P1 ✅ FIXED** — `_normalize_sap_schema_16_x` derives `built_form` from the + dwelling_type text (`_derive_built_form_16x`: Mid-terrace→4 / End-terrace→3 / + Semi-detached→2 / Detached→1; flats → modal 4). built_form is ML-only (SAP calc + never reads it) so SAP-neutral; gate verified insensitive (26/26). 5 SAP-16.0 + flat certs now map (8742→SAP 66=lodged, etc.). +2 tests. +- **P2 ✅ FIXED** — `photovoltaic_supply` as a measured-array LIST crashed + `from_rdsap_schema_{17_0,17_1,18_0,19_0,20_0_0}` (`'list' has no attribute + none_or_no_details`). All 5 now route through `_map_schema_21_pv`, whose list + branch is made dict-tolerant (`_pv_array_field` reads dict OR dataclass) — they + now CAPTURE the PV arrays like 21.0.x instead of crashing/dropping. cert + 6102-…-2292 (uprn 22086693, RdSAP-20.0.0) maps with 2 arrays @1.14kW. +test. +- **P3 ✅ generalised / cert fail-loud** — `_normalize_sap_schema_16_x` now handles + `windows` as a dict (not just list). cert 9768 (uprn 100062614005, 16.1) still + fails loud — it ALSO omits door_count/habitable_room_count/glazed_area + (genuinely sparse "High performance glazing" cert) → CORRECT to fail; resilience + skips+reports it. +- **P6 ✅ same as P3** — cert 8257 (uprn 10070009758, 16.2) — identical sparse + "High performance glazing" pattern, fails loud on door_count. Correct. +- **P4 ⚖️ FOR KHALIM (gate decision)** — left `multiple_glazed_proportion` fail-loud. + Re-confirmed: defaulting it (ANY value) still regresses the gate (29/36 + + 25/36) because it makes a frozen-fixture cert a prediction donor — the field is + ML-only (not carried to EpcPropertyData), so the regression is donor-pool + composition, NOT the value. Closing this gap needs a GATE RE-BASELINE decision + (whether the donor-pool tip is benign per the #1245 precedent) — your call; I did + not unilaterally loosen the tighten-only gate. +- **P5 🔍 FOR KHALIM (large recursive alignment)** — RdSAP-21.0.0 lacks the + ADR-0028 Optional widenings 21.0.1 has, and the gap is RECURSIVE (not just the + ~13 top-level + SapWindow): `SapBuildingPart` (13 fields incl. + construction_age_band/wall_construction/identifier — CORE FABRIC), + `SapEnergySource` (pv_battery_count, wind_turbine_details), MainHeatingDetail, + ShowerOutlets, PvBatteries, Addendum, + top-level low_energy_fixed_lighting_ + bulbs_count/multiple_glazed_proportion/suggested_improvements. Aligning to + 21.0.1's "everything Optional, tolerate sparse" means the 21.0.0 mapper must + None-coalesce CORE fabric — a modelling decision in your domain. Partial widening + was REVERTED (half-aligned schema is worse). cert 3135 (uprn 100021919725) stays + fail-loud → resilience skips+reports. Recommend: align RdSapSchema21_0_0 fully to + 21.0.1 (recursive) + review mapper coalescing, in a dedicated change. +- **Corpus-validation pending** for the 2 now-mappable certs (P1 uprn 10070004512, + P2 uprn 22086693) — Elmhurst build + summary/worksheet + commit. + - [x] 🔧 10096028301 — SAP-Schema-19.1.0 (full-SAP g/f FLAT, band M, combi PCDB 17929, MEV, AP50 3.5) · eng 82 / elm 82 (lodged 85) · PINNED engine 82. 🔧 mapper added: `from_sap_schema_19_1_0`. Built in Elmhurst (boiler 17929 via search, control CBE/2106, water from primary, MEV on, AP50 Blower Door 3.5+cert). Engine EXACTLY matches Elmhurst worksheet (82.11 vs 82); engine-on-Elmhurst-inputs 82.16 ≈ 82 → calculator faithful. −3 vs lodged = measured-U-vs-RdSAP-default + MEV extract-not-recovery (documented). No mapper change beyond coverage. - [x] 🔧 100021943298 — SAP-Schema-16.1 (g/f FLAT, band B, solid-brick internal, combi PCDB 10328) · eng 76 / elm 75 (lodged 72) · PINNED engine 76. 🔧 mapper added: `from_sap_schema_16_1`. Built in Elmhurst (boiler 10328 via search, control CBE/2106, water from primary, wall insulation thickness Unknown); worksheet 75 → engine within ~1 (tightest agreement, reduced-field). Boiler-select + water-heating + control dialogs all driven via automation (two-step row→Select / cascade + coordinate-OK). No mapper change beyond coverage. diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index 2b2045b6..2f2bd00b 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -189,6 +189,15 @@ def _sap_opening_area_m2(width: Any, height: Any) -> float: ) +def _pv_array_field(array: Any, name: str) -> Any: + """Read a PV-array field from either a `PhotovoltaicArray` dataclass (21.0.x, + where the schema Union parsed the nested list) or a raw dict (older schemas + that leave the list unparsed).""" + if isinstance(array, dict): + return cast(Dict[str, Any], array).get(name) + return getattr(array, name) + + def _map_schema_21_pv( es_pv_supply: Any, ) -> tuple[Optional[PhotovoltaicSupply], Optional[List[PhotovoltaicArray]]]: @@ -206,12 +215,18 @@ def _map_schema_21_pv( None. With no PV data at all, both are None. """ if isinstance(es_pv_supply, list): + # The nested list's leaves are `PhotovoltaicArray` dataclasses when the + # schema's Union type parsed them (21.0.x), or raw dicts when an older + # schema (17.0–20.0.0) types the field as the wrapper only and leaves the + # list unparsed — `_pv_array_field` reads either shape. flattened = [ PhotovoltaicArray( - peak_power=_measurement_value(array.peak_power), - pitch=int(_measurement_value(array.pitch)), - orientation=_pv_orientation(array.orientation), - overshading=int(_measurement_value(array.overshading)), + peak_power=_measurement_value(_pv_array_field(array, "peak_power")), + pitch=int(_measurement_value(_pv_array_field(array, "pitch"))), + orientation=_pv_orientation(_pv_array_field(array, "orientation")), + overshading=int( + _measurement_value(_pv_array_field(array, "overshading")) + ), ) for inner_list in es_pv_supply for array in inner_list @@ -538,6 +553,7 @@ class EpcPropertyDataMapper: @staticmethod def from_rdsap_schema_17_0(schema: RdSapSchema17_0) -> EpcPropertyData: es = schema.sap_energy_source + pv_supply, pv_arrays = _map_schema_21_pv(es.photovoltaic_supply) return EpcPropertyData( uprn=schema.uprn, assessment_type=schema.assessment_type, @@ -656,17 +672,8 @@ class EpcPropertyDataMapper: is_dwelling_export_capable=False, wind_turbines_terrain_type=str(es.wind_turbines_terrain_type), electricity_smart_meter_present=False, - photovoltaic_supply=( - PhotovoltaicSupply( - none_or_no_details=PhotovoltaicSupplyNoneOrNoDetails( - percent_roof_area=es.photovoltaic_supply.none_or_no_details.percent_roof_area, - ) - ) - # ADR-0028: photovoltaic_supply can be absent, None, or a - # sparse shape without none_or_no_details — guard the read. - if getattr(es.photovoltaic_supply, "none_or_no_details", None) - else None - ), + photovoltaic_supply=pv_supply, + photovoltaic_arrays=pv_arrays, ), sap_building_parts=[ SapBuildingPart( @@ -954,6 +961,7 @@ class EpcPropertyDataMapper: @staticmethod def from_rdsap_schema_17_1(schema: RdSapSchema17_1) -> EpcPropertyData: es = schema.sap_energy_source + pv_supply, pv_arrays = _map_schema_21_pv(es.photovoltaic_supply) # ADR-0028: instantaneous_wwhrs holds bath/shower ROOM counts. iw = schema.sap_heating.instantaneous_wwhrs return EpcPropertyData( @@ -1097,15 +1105,8 @@ class EpcPropertyDataMapper: is_dwelling_export_capable=False, wind_turbines_terrain_type=str(es.wind_turbines_terrain_type), electricity_smart_meter_present=False, - photovoltaic_supply=( - PhotovoltaicSupply( - none_or_no_details=PhotovoltaicSupplyNoneOrNoDetails( - percent_roof_area=es.photovoltaic_supply.none_or_no_details.percent_roof_area, - ) - ) - if getattr(es.photovoltaic_supply, "none_or_no_details", None) - else None - ), + photovoltaic_supply=pv_supply, + photovoltaic_arrays=pv_arrays, ), sap_building_parts=[ SapBuildingPart( @@ -1145,6 +1146,7 @@ class EpcPropertyDataMapper: @staticmethod def from_rdsap_schema_18_0(schema: RdSapSchema18_0) -> EpcPropertyData: es = schema.sap_energy_source + pv_supply, pv_arrays = _map_schema_21_pv(es.photovoltaic_supply) # ADR-0028: instantaneous_wwhrs holds bath/shower ROOM counts. iw = schema.sap_heating.instantaneous_wwhrs return EpcPropertyData( @@ -1295,16 +1297,8 @@ class EpcPropertyDataMapper: is_dwelling_export_capable=False, wind_turbines_terrain_type=str(es.wind_turbines_terrain_type), electricity_smart_meter_present=False, - photovoltaic_supply=( - PhotovoltaicSupply( - none_or_no_details=PhotovoltaicSupplyNoneOrNoDetails( - percent_roof_area=es.photovoltaic_supply.none_or_no_details.percent_roof_area, - ) - ) - if es.photovoltaic_supply - and es.photovoltaic_supply.none_or_no_details - else None - ), + photovoltaic_supply=pv_supply, + photovoltaic_arrays=pv_arrays, ), sap_building_parts=[ SapBuildingPart( @@ -1375,6 +1369,7 @@ class EpcPropertyDataMapper: @staticmethod def from_rdsap_schema_19_0(schema: RdSapSchema19_0) -> EpcPropertyData: es = schema.sap_energy_source + pv_supply, pv_arrays = _map_schema_21_pv(es.photovoltaic_supply) return EpcPropertyData( uprn=schema.uprn, assessment_type=schema.assessment_type, @@ -1496,17 +1491,8 @@ class EpcPropertyDataMapper: is_dwelling_export_capable=False, wind_turbines_terrain_type=str(es.wind_turbines_terrain_type), electricity_smart_meter_present=False, - photovoltaic_supply=( - PhotovoltaicSupply( - none_or_no_details=PhotovoltaicSupplyNoneOrNoDetails( - percent_roof_area=es.photovoltaic_supply.none_or_no_details.percent_roof_area, - ) - ) - # ADR-0028: photovoltaic_supply can be absent, None, or a - # sparse shape without none_or_no_details — guard the read. - if getattr(es.photovoltaic_supply, "none_or_no_details", None) - else None - ), + photovoltaic_supply=pv_supply, + photovoltaic_arrays=pv_arrays, ), sap_building_parts=[ SapBuildingPart( @@ -1581,6 +1567,12 @@ class EpcPropertyDataMapper: @staticmethod def from_rdsap_schema_20_0_0(schema: RdSapSchema20_0_0) -> EpcPropertyData: es = schema.sap_energy_source + # `photovoltaic_supply` is polymorphic in 20.0.0 too (None / wrapper dict / + # measured-array LIST) — route it through the shared dispatch like 21.0.0 so a + # cert lodging measured arrays as a list (e.g. cert 6102-6227-8000-0083-2292, + # uprn 22086693) maps instead of raising "'list' object has no attribute + # 'none_or_no_details'" and sinking the whole prediction cohort. + pv_supply, pv_arrays = _map_schema_21_pv(es.photovoltaic_supply) # ADR-0027: instantaneous_wwhrs holds bath/shower ROOM counts. iw = schema.sap_heating.instantaneous_wwhrs return EpcPropertyData( @@ -1737,16 +1729,8 @@ class EpcPropertyDataMapper: is_dwelling_export_capable=False, wind_turbines_terrain_type=str(es.wind_turbines_terrain_type), electricity_smart_meter_present=False, - photovoltaic_supply=( - PhotovoltaicSupply( - none_or_no_details=PhotovoltaicSupplyNoneOrNoDetails( - percent_roof_area=es.photovoltaic_supply.none_or_no_details.percent_roof_area, - ) - ) - if es.photovoltaic_supply - and es.photovoltaic_supply.none_or_no_details - else None - ), + photovoltaic_supply=pv_supply, + photovoltaic_arrays=pv_arrays, ), sap_building_parts=[ SapBuildingPart( @@ -3258,6 +3242,34 @@ def _default_missing_post_town(data: Dict[str, Any]) -> Dict[str, Any]: return {**data, "post_town": ""} +def _derive_built_form_16x(dwelling_type: Any) -> int: + """Derive the RdSAP `built_form` code from a cert's `dwelling_type` text when + the numeric field is omitted (some 16.0 certs). The form is stated in the + description for houses/bungalows ("Mid-terrace house" → 4, "End-terrace" → 3, + "Semi-detached" → 2, "Detached" → 1). Flats ("Ground-floor flat") do not encode + a form, so fall back to the modal 4 (Mid-terrace) — `built_form` is an ML-only + feature the SAP calculator never reads, so the fallback is SAP-neutral. + + `dwelling_type` arrives as a plain string or a `{'value': ...}` dict (real-API + shape); both are handled.""" + if isinstance(dwelling_type, dict): + dwelling_type = cast(Dict[str, Any], dwelling_type).get("value") + text = str(dwelling_type or "").lower() + if "semi-detached" in text: + return 2 + if "detached" in text: + return 1 + if "enclosed end" in text: + return 5 + if "enclosed mid" in text: + return 6 + if "end-terrace" in text: + return 3 + if "mid-terrace" in text or "terrace" in text: + return 4 + return 4 # flats / unstated form → modal built_form (SAP- and gate-neutral) + + def _normalize_sap_schema_16_x(data: Dict[str, Any]) -> Dict[str, Any]: """Rewrite a `SAP-Schema-16.2`/`16.3` API doc onto the `RdSAP-Schema-17.1` shape so it can reuse the tested `from_rdsap_schema_17_1` mapper. @@ -3294,6 +3306,13 @@ def _normalize_sap_schema_16_x(data: Dict[str, Any]) -> Dict[str, Any]: if isinstance(windows, list) and windows: window_list: List[Any] = cast(List[Any], windows) d.setdefault("window", window_list[0]) + elif isinstance(windows, dict): + # Some 16.x certs (e.g. "High performance glazing" certs 9768-…-7974 / + # 8257-…-4992) lodge `windows` as a single dict rather than a list — take + # it directly. (These particular certs still fail loud below: they also omit + # door_count / habitable_room_count / glazed_area — genuinely insufficient + # data — but a windows-as-dict cert that DOES carry the rest now maps.) + d.setdefault("window", windows) d.setdefault("schema_version_original", d.get("schema_version", "")) # Some 16.x certs (notably 16.0) omit `tenure` — RdSapSchema17_1 requires it. # It is address/occupancy metadata the SAP cascade never reads, so default a @@ -3313,6 +3332,18 @@ def _normalize_sap_schema_16_x(data: Dict[str, Any]) -> Dict[str, Any]: # still fail loud — that is correct, the fabric data is insufficient. d.setdefault("insulated_door_count", 0) + # Some 16.x certs (notably 16.0, e.g. cert 8742-6624-9300-2780-4926) lodge + # `property_type`/`dwelling_type` but omit `built_form` — RdSapSchema17_1 + # requires it. `built_form` is an ML-only feature (the SAP-10 calculator never + # reads it — only `sap10_ml/transform`), so it is SAP-neutral; and a default is + # gate-neutral here (verified — the component-accuracy fixture has no + # built-form-missing cert, so unlike `multiple_glazed_proportion` it does not + # tip the donor pool). DERIVE it from the dwelling_type description where the + # form is stated (houses), falling back to the modal value for flats (whose + # dwelling_type — "Ground-floor flat" — does not encode form). + if "built_form" not in d: + d["built_form"] = _derive_built_form_16x(d.get("dwelling_type")) + # NB: we deliberately do NOT default `multiple_glazed_proportion` here. A 16.x # cert that omits it (e.g. 16.3 cert 0418-3986-7250-2884-7970) is left to fail # the RdSapSchema17_1 parse and be handled by the cohort skip-and-report path — diff --git a/datatypes/epc/domain/tests/test_from_rdsap_schema.py b/datatypes/epc/domain/tests/test_from_rdsap_schema.py index 77be7628..e0c6b1ba 100644 --- a/datatypes/epc/domain/tests/test_from_rdsap_schema.py +++ b/datatypes/epc/domain/tests/test_from_rdsap_schema.py @@ -191,6 +191,30 @@ class TestFromRdSapSchema20_0_0: schema = from_dict(RdSapSchema20_0_0, load("20_0_0.json")) return EpcPropertyDataMapper.from_rdsap_schema_20_0_0(schema) + def test_photovoltaic_supply_as_dict_list_is_mapped_not_crashed(self) -> None: + # 20.0.0 types `photovoltaic_supply` as the wrapper only (not the 21.0.x + # Union), so a cert lodging measured arrays as a LIST leaves the leaves as + # raw dicts. The mapper previously did `es.photovoltaic_supply.none_or_no_ + # details` → "'list' object has no attribute 'none_or_no_details'", sinking + # the whole prediction cohort. Regression for cert 6102-6227-8000-0083-2292 + # (uprn 22086693). It now routes through `_map_schema_21_pv`, whose + # dict-tolerant array reader captures the arrays. + data = load("20_0_0.json") + data["sap_energy_source"]["photovoltaic_supply"] = [ + [{"pitch": 2, "peak_power": {"value": 1.14, "quantity": "kW"}, + "orientation": 5, "overshading": 1}], + [{"pitch": 2, "peak_power": 1.14, "orientation": 5, "overshading": 1}], + ] + schema = from_dict(RdSapSchema20_0_0, data) + + result = EpcPropertyDataMapper.from_rdsap_schema_20_0_0(schema) + + arrays = result.sap_energy_source.photovoltaic_arrays + assert arrays is not None and len(arrays) == 2 + assert arrays[0].peak_power == 1.14 + assert arrays[0].orientation == 5 + assert result.sap_energy_source.photovoltaic_supply is None + def test_uprn(self, result: EpcPropertyData) -> None: assert result.uprn == 12457 diff --git a/datatypes/epc/domain/tests/test_from_sap_schema.py b/datatypes/epc/domain/tests/test_from_sap_schema.py index d1bf36ed..4cc08213 100644 --- a/datatypes/epc/domain/tests/test_from_sap_schema.py +++ b/datatypes/epc/domain/tests/test_from_sap_schema.py @@ -523,6 +523,32 @@ class TestFromSapSchema16_2: assert epc.uprn == 100020933894 assert Sap10Calculator().calculate(epc).sap_score == 61 # lodged 56 + def test_16_x_missing_built_form_is_derived_from_dwelling_type(self) -> None: + # Some 16.0 certs (e.g. cert 8742-6624-9300-2780-4926) lodge + # `property_type`/`dwelling_type` but omit `built_form`, which RdSapSchema17_1 + # requires — previously aborted the prediction cohort. The normaliser derives + # it from the dwelling_type text ("Semi-detached house" → 2). built_form is + # ML-only (SAP calc never reads it), so this is SAP- and gate-neutral. + data = load("sap_16_0.json") + del data["built_form"] + assert data["dwelling_type"] == "Semi-detached house" + + epc = EpcPropertyDataMapper.from_api_response(data) + + assert isinstance(epc, EpcPropertyData) + assert epc.built_form == "2" + + def test_16_x_missing_built_form_for_flat_falls_back_to_modal(self) -> None: + # A flat's dwelling_type ("Ground-floor flat") does not encode a form, so the + # derivation falls back to the modal 4 (Mid-terrace) — keeps the cert mappable. + data = load("sap_16_0.json") + del data["built_form"] + data["dwelling_type"] = "Ground-floor flat" + + epc = EpcPropertyDataMapper.from_api_response(data) + + assert epc.built_form == "4" + def test_16_x_missing_insulated_door_count_defaults_to_zero(self) -> None: # Some 16.x certs lodge `door_count` but omit `insulated_door_count`, # which RdSapSchema17_1 requires — previously raised "missing required From 5737923622cdf46dc579ffe1d4354b47740d876c Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 15:01:34 +0000 Subject: [PATCH 11/15] 32 and delete in plan --- repositories/plan/plan_postgres_repository.py | 30 ++++++--- repositories/plan/plan_repository.py | 15 +++-- .../plan/test_plan_postgres_repository.py | 61 ++++++++++++++----- 3 files changed, 75 insertions(+), 31 deletions(-) diff --git a/repositories/plan/plan_postgres_repository.py b/repositories/plan/plan_postgres_repository.py index 376cf8b8..7be21bac 100644 --- a/repositories/plan/plan_postgres_repository.py +++ b/repositories/plan/plan_postgres_repository.py @@ -1,6 +1,6 @@ from __future__ import annotations -from sqlmodel import Session, col, delete +from sqlmodel import Session, col, update from domain.modelling.plan import Plan from infrastructure.postgres.modelling import PlanModel, RecommendationModel @@ -10,7 +10,12 @@ from repositories.plan.plan_repository import PlanRepository class PlanPostgresRepository(PlanRepository): """Maps a Plan and its Plan Measures onto the live ``plan`` / ``recommendation`` tables (ADR-0017). Does not commit — the Unit of Work - owns the transaction (ADR-0012).""" + owns the transaction (ADR-0012). + + A re-run INSERTs a fresh Plan rather than deleting the prior one (the cascade + delete was slow); when the new Plan is the default it demotes any prior + default Plan for the same (property_id, scenario_id) to ``is_default=False``, + so readers can select the current Plan via ``is_default=True``.""" def __init__(self, session: Session) -> None: self._session = session @@ -24,15 +29,20 @@ class PlanPostgresRepository(PlanRepository): portfolio_id: int, is_default: bool, ) -> int: - # Idempotent replace for (property_id, scenario_id): deleting the Plan - # cascades to its recommendation rows via the plan_id FK (ON DELETE - # CASCADE), so a re-run overwrites rather than duplicating (ADR-0012). - self._session.exec( # type: ignore[call-overload] - delete(PlanModel).where( - col(PlanModel.property_id) == property_id, - col(PlanModel.scenario_id) == scenario_id, + # Soft-replace (ADR-0012): keep prior Plans as history rather than DELETEing + # them — the cascade delete of recommendation rows was the slow part. When + # this Plan is the default, demote every prior Plan for the same + # (property_id, scenario_id) to is_default=False, so exactly one Plan for + # the pair stays default (the one just inserted). + if is_default: + self._session.exec( # type: ignore[call-overload] + update(PlanModel) + .where( + col(PlanModel.property_id) == property_id, + col(PlanModel.scenario_id) == scenario_id, + ) + .values(is_default=False) ) - ) plan_row = PlanModel.from_domain( plan, diff --git a/repositories/plan/plan_repository.py b/repositories/plan/plan_repository.py index 02bafe25..b534e8ea 100644 --- a/repositories/plan/plan_repository.py +++ b/repositories/plan/plan_repository.py @@ -8,10 +8,12 @@ from domain.modelling.plan import Plan class PlanRepository(ABC): """Persists a Plan (and its Plan Measures) for a Property + Scenario. - One Plan per (Property, Scenario). The write is idempotent on re-run: it - replaces the existing Plan for that pair rather than duplicating (ADR-0012 - / ADR-0017). `portfolio_id` and `is_default` are supplied by the - orchestrator (the former from the trigger, the latter from the Scenario). + A re-run INSERTs a fresh Plan and keeps the prior one as history rather than + deleting it. When the new Plan is the default, prior default Plans for the + same (Property, Scenario) are demoted to `is_default=False`, so the current + Plan is the one with `is_default=True` (ADR-0012 / ADR-0017). `portfolio_id` + and `is_default` are supplied by the orchestrator (the former from the + trigger, the latter from the Scenario). """ @abstractmethod @@ -24,6 +26,7 @@ class PlanRepository(ABC): portfolio_id: int, is_default: bool, ) -> int: - """Persist ``plan`` and return its Plan id, replacing any existing Plan - for ``(property_id, scenario_id)``.""" + """Persist ``plan`` and return its Plan id. Keeps prior Plans for + ``(property_id, scenario_id)`` as history; when ``is_default`` is True, + demotes those prior Plans to ``is_default=False``.""" ... diff --git a/tests/repositories/plan/test_plan_postgres_repository.py b/tests/repositories/plan/test_plan_postgres_repository.py index 3e428bd8..200c38d6 100644 --- a/tests/repositories/plan/test_plan_postgres_repository.py +++ b/tests/repositories/plan/test_plan_postgres_repository.py @@ -2,10 +2,11 @@ Plan Measures to the live ``plan`` / ``recommendation`` tables (ADR-0017). The Plan is the parent; each selected Plan Measure is a ``recommendation`` row -linked by the new ``plan_id`` FK. A re-run replaces (delete the Plan for the -(property, scenario) → cascade its recommendations → insert fresh), so the -batch write is idempotent (ADR-0012). CO₂ is stored in tonnes (calculator kg -÷ 1000) to match the live column contract. +linked by the new ``plan_id`` FK. A re-run INSERTs a fresh Plan and keeps the +prior one as history (no cascade delete); when the new Plan is the default it +demotes prior default Plans for the (property, scenario) to ``is_default=False`` +(ADR-0012). CO₂ is stored in tonnes (calculator kg ÷ 1000) to match the live +column contract. """ from __future__ import annotations @@ -147,31 +148,61 @@ def test_save_persists_null_per_measure_savings_when_unbilled( assert rec_rows[0].energy_cost_savings is None -def test_save_is_idempotent_on_rerun_for_the_same_property_and_scenario( +def test_rerun_keeps_history_and_demotes_the_prior_default_plan( db_engine: Engine, ) -> None: - # Arrange — first run + # Arrange — first (default) run with Session(db_engine) as session: - PlanPostgresRepository(session).save( + first_id = PlanPostgresRepository(session).save( _plan(), property_id=10, scenario_id=7, portfolio_id=1, is_default=True ) session.commit() - # Act — re-run the same (property, scenario) + # Act — re-run the same (property, scenario) as the default with Session(db_engine) as session: - PlanPostgresRepository(session).save( + second_id = PlanPostgresRepository(session).save( _plan(), property_id=10, scenario_id=7, portfolio_id=1, is_default=True ) session.commit() - # Assert — replaced, not duplicated (cascade removed the old measures) + # Assert — the prior Plan is kept as history (no delete), and only the new + # Plan is the default; exactly one Plan for the pair stays is_default=True. with Session(db_engine) as session: plan_rows = session.exec( select(PlanModel).where(col(PlanModel.property_id) == 10) ).all() - rec_rows = session.exec( - select(RecommendationModel).where(col(RecommendationModel.property_id) == 10) - ).all() + by_id = {p.id: p for p in plan_rows} - assert len(plan_rows) == 1 - assert len(rec_rows) == 1 + assert len(plan_rows) == 2 + assert first_id != second_id + assert by_id[first_id].is_default is False # demoted + assert by_id[second_id].is_default is True # the current default + assert sum(1 for p in plan_rows if p.is_default) == 1 + + +def test_rerun_as_non_default_does_not_demote_the_prior_default( + db_engine: Engine, +) -> None: + # Arrange — a default Plan exists + with Session(db_engine) as session: + first_id = PlanPostgresRepository(session).save( + _plan(), property_id=12, scenario_id=7, portfolio_id=1, is_default=True + ) + session.commit() + + # Act — re-run as NON-default (e.g. a non-default scenario); no demotion runs + with Session(db_engine) as session: + PlanPostgresRepository(session).save( + _plan(), property_id=12, scenario_id=7, portfolio_id=1, is_default=False + ) + session.commit() + + # Assert — the prior default is untouched (we only demote when saving a default) + with Session(db_engine) as session: + plan_rows = session.exec( + select(PlanModel).where(col(PlanModel.property_id) == 12) + ).all() + by_id = {p.id: p for p in plan_rows} + + assert len(plan_rows) == 2 + assert by_id[first_id].is_default is True From 119ff3740c642853ac3f089b92d7acc8e8fc87d7 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 15:35:47 +0000 Subject: [PATCH 12/15] fix(task_handler): persist cloud_logs_url for modelling_e2e @task_handler never built or passed cloud_logs_url, so every app using it (incl. modelling_e2e) ran run_subtask with the None default and the CloudWatch deep-link was never saved onto the SubTask. @subtask_handler did this correctly. Extract the URL builder into a shared utilities/aws_lambda/cloud_logs.py (public cloudwatch_url()), use it from both handlers, and pass the URL into run_subtask from @task_handler. Add regression tests. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../utilities/aws_lambda/test_task_handler.py | 104 ++++++++++++++++++ utilities/aws_lambda/cloud_logs.py | 27 +++++ utilities/aws_lambda/subtask_handler.py | 22 +--- utilities/aws_lambda/task_handler.py | 3 + 4 files changed, 136 insertions(+), 20 deletions(-) create mode 100644 tests/utilities/aws_lambda/test_task_handler.py create mode 100644 utilities/aws_lambda/cloud_logs.py diff --git a/tests/utilities/aws_lambda/test_task_handler.py b/tests/utilities/aws_lambda/test_task_handler.py new file mode 100644 index 00000000..fae35de2 --- /dev/null +++ b/tests/utilities/aws_lambda/test_task_handler.py @@ -0,0 +1,104 @@ +from collections.abc import Generator, Iterator +from contextlib import contextmanager +from dataclasses import dataclass +from typing import Any +from uuid import UUID + +import pytest +from sqlalchemy import Engine +from sqlmodel import Session + +from domain.tasks.tasks import Source +from orchestration.task_orchestrator import TaskOrchestrator +from repositories.tasks.subtask_postgres_repository import SubTaskPostgresRepository +from repositories.tasks.task_postgres_repository import TaskPostgresRepository +from utilities.aws_lambda.task_handler import task_handler + + +@dataclass +class Harness: + orchestrator: TaskOrchestrator + tasks: TaskPostgresRepository + subtasks: SubTaskPostgresRepository + + @contextmanager + def factory(self) -> Generator[TaskOrchestrator, None, None]: + yield self.orchestrator + + +@pytest.fixture +def harness(db_engine: Engine) -> Iterator[Harness]: + with Session(db_engine) as session: + tasks = TaskPostgresRepository(session=session) + subtasks = SubTaskPostgresRepository(session=session) + yield Harness( + orchestrator=TaskOrchestrator(task_repo=tasks, subtask_repo=subtasks), + tasks=tasks, + subtasks=subtasks, + ) + + +def _direct_event(property_id: str) -> dict[str, Any]: + return {"property_id": property_id} + + +def test_task_handler_records_cloudwatch_url_on_subtask( + harness: Harness, monkeypatch: pytest.MonkeyPatch +) -> None: + # arrange + monkeypatch.setenv("AWS_REGION", "eu-west-2") + monkeypatch.setenv( + "AWS_LAMBDA_LOG_GROUP_NAME", "/aws/lambda/modelling-e2e" + ) + monkeypatch.setenv( + "AWS_LAMBDA_LOG_STREAM_NAME", "2026/05/20/[$LATEST]abc123" + ) + + @task_handler( + task_source="modelling_e2e", + source=Source.PROPERTY, + orchestrator_cm=harness.factory, + ) + def handler(body: dict[str, Any], context: Any) -> None: + return None + + # act + result = handler(_direct_event("prop-1"), context=None) + + # assert + subtask_id = result[0]["subtask_id"] + saved_url = harness.subtasks.get(UUID(subtask_id)).cloud_logs_url + assert saved_url is not None + assert saved_url.startswith( + "https://eu-west-2.console.aws.amazon.com/cloudwatch/home" + ) + # Log group / stream are console-encoded ("/" -> "$252F"). + assert "$252Faws$252Flambda$252Fmodelling-e2e" in saved_url + assert "$255B$2524LATEST$255D" in saved_url + + +def test_task_handler_leaves_cloudwatch_url_unset_outside_lambda( + harness: Harness, monkeypatch: pytest.MonkeyPatch +) -> None: + # arrange + for var in ( + "AWS_REGION", + "AWS_LAMBDA_LOG_GROUP_NAME", + "AWS_LAMBDA_LOG_STREAM_NAME", + ): + monkeypatch.delenv(var, raising=False) + + @task_handler( + task_source="modelling_e2e", + source=Source.PROPERTY, + orchestrator_cm=harness.factory, + ) + def handler(body: dict[str, Any], context: Any) -> None: + return None + + # act + result = handler(_direct_event("prop-1"), context=None) + + # assert + subtask_id = result[0]["subtask_id"] + assert harness.subtasks.get(UUID(subtask_id)).cloud_logs_url is None diff --git a/utilities/aws_lambda/cloud_logs.py b/utilities/aws_lambda/cloud_logs.py new file mode 100644 index 00000000..9a8da920 --- /dev/null +++ b/utilities/aws_lambda/cloud_logs.py @@ -0,0 +1,27 @@ +"""Build a CloudWatch console deep-link for the running Lambda invocation. + +Shared by @task_handler and @subtask_handler so both persist the same +`cloud_logs_url` onto the SubTask they run. +""" + +import os +from typing import Optional +from urllib.parse import quote + + +def _console_encode(value: str) -> str: + return quote(value, safe="").replace("%", "$25") + + +def cloudwatch_url() -> Optional[str]: + """Deep-link to this invocation's log stream, or None outside Lambda.""" + region = os.environ.get("AWS_REGION") + log_group = os.environ.get("AWS_LAMBDA_LOG_GROUP_NAME") + log_stream = os.environ.get("AWS_LAMBDA_LOG_STREAM_NAME") + if not (region and log_group and log_stream): + return None + return ( + f"https://{region}.console.aws.amazon.com/cloudwatch/home" + f"?region={region}#logsV2:log-groups/log-group/" + f"{_console_encode(log_group)}/log-events/{_console_encode(log_stream)}" + ) diff --git a/utilities/aws_lambda/subtask_handler.py b/utilities/aws_lambda/subtask_handler.py index e5ac086a..6b513ba4 100644 --- a/utilities/aws_lambda/subtask_handler.py +++ b/utilities/aws_lambda/subtask_handler.py @@ -6,12 +6,11 @@ TaskOrchestrator.run_subtask(...) calls. import json import logging -import os from contextlib import AbstractContextManager from functools import wraps from typing import Any, Callable, Optional, cast -from urllib.parse import quote +from utilities.aws_lambda.cloud_logs import cloudwatch_url from utilities.aws_lambda.default_orchestrator import default_orchestrator from utilities.aws_lambda.subtask_trigger_body import SubtaskTriggerBody from orchestration.task_orchestrator import TaskOrchestrator @@ -42,7 +41,7 @@ def subtask_handler( @wraps(func) def wrapper(event: dict[str, Any], context: Any) -> None: - cloud_logs_url = _cloudwatch_url() + cloud_logs_url = cloudwatch_url() with factory() as orchestrator: for record in _records(event): body = _parse_body(record) @@ -95,20 +94,3 @@ def _records(event: dict[str, Any]) -> list[dict[str, Any]]: if isinstance(raw_records, list): return [r for r in cast(list[Any], raw_records) if isinstance(r, dict)] return [event] - - -def _console_encode(value: str) -> str: - return quote(value, safe="").replace("%", "$25") - - -def _cloudwatch_url() -> Optional[str]: - region = os.environ.get("AWS_REGION") - log_group = os.environ.get("AWS_LAMBDA_LOG_GROUP_NAME") - log_stream = os.environ.get("AWS_LAMBDA_LOG_STREAM_NAME") - if not (region and log_group and log_stream): - return None - return ( - f"https://{region}.console.aws.amazon.com/cloudwatch/home" - f"?region={region}#logsV2:log-groups/log-group/" - f"{_console_encode(log_group)}/log-events/{_console_encode(log_stream)}" - ) diff --git a/utilities/aws_lambda/task_handler.py b/utilities/aws_lambda/task_handler.py index 34811515..43699aee 100644 --- a/utilities/aws_lambda/task_handler.py +++ b/utilities/aws_lambda/task_handler.py @@ -10,6 +10,7 @@ from contextlib import AbstractContextManager from functools import wraps from typing import Any, Callable, Optional, cast +from utilities.aws_lambda.cloud_logs import cloudwatch_url from utilities.aws_lambda.default_orchestrator import default_orchestrator from domain.tasks.tasks import Source from orchestration.task_orchestrator import TaskOrchestrator @@ -41,6 +42,7 @@ def task_handler( def decorator(func: Callable[..., Any]) -> Callable[..., Any]: @wraps(func) def wrapper(event: dict[str, Any], context: Any) -> Any: + cloud_logs_url = cloudwatch_url() with factory() as orchestrator: task_ids: list[dict[str, str]] = [] failures: list[dict[str, Any]] = [] @@ -66,6 +68,7 @@ def task_handler( orchestrator.run_subtask( subtask.id, work=lambda body=body: func(body, context), + cloud_logs_url=cloud_logs_url, ) except Exception: logger.exception( From a7d3e001786431de95707bbd4b6931c50d67c99b Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 15:38:38 +0000 Subject: [PATCH 13/15] 32 --- .../uprn_22086693/epc.json | 438 ++++++++++++++++++ .../lambda/modelling_e2e/variables.tf | 2 +- scripts/hyde/elmhurst_download.py | 2 +- 3 files changed, 440 insertions(+), 2 deletions(-) create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/epc.json diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/epc.json b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/epc.json new file mode 100644 index 00000000..343215d1 --- /dev/null +++ b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/epc.json @@ -0,0 +1,438 @@ +{ + "uprn": 22086693, + "roofs": [ + { + "description": { + "value": "Pitched, 200 mm loft insulation", + "language": "1" + }, + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + }, + { + "description": { + "value": "Flat, insulated (assumed)", + "language": "1" + }, + "energy_efficiency_rating": 3, + "environmental_efficiency_rating": 3 + } + ], + "walls": [ + { + "description": { + "value": "Cavity wall, as built, no insulation (assumed)", + "language": "1" + }, + "energy_efficiency_rating": 2, + "environmental_efficiency_rating": 2 + }, + { + "description": { + "value": "Cavity wall, as built, insulated (assumed)", + "language": "1" + }, + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "floors": [ + { + "description": { + "value": "Suspended, no insulation (assumed)", + "language": "1" + }, + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + }, + { + "description": { + "value": "Solid, no insulation (assumed)", + "language": "1" + }, + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + } + ], + "status": "entered", + "tenure": 2, + "window": { + "description": { + "value": "Fully double glazed", + "language": "1" + }, + "energy_efficiency_rating": 3, + "environmental_efficiency_rating": 3 + }, + "addendum": { + "addendum_numbers": [ + 8 + ], + "cavity_fill_recommended": "true" + }, + "lighting": { + "description": { + "value": "Low energy lighting in all fixed outlets", + "language": "1" + }, + "energy_efficiency_rating": 5, + "environmental_efficiency_rating": 5 + }, + "postcode": "BN2 9ZN", + "hot_water": { + "description": { + "value": "From main system", + "language": "1" + }, + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + }, + "post_town": "BRIGHTON", + "built_form": 2, + "created_at": "2022-03-22 14:09:56", + "door_count": 1, + "glazed_area": 1, + "glazing_gap": "16+", + "region_code": 14, + "report_type": 2, + "sap_heating": { + "cylinder_size": 1, + "water_heating_code": 901, + "water_heating_fuel": 26, + "instantaneous_wwhrs": { + "rooms_with_bath_and_or_shower": 1, + "rooms_with_mixer_shower_no_bath": 0, + "rooms_with_bath_and_mixer_shower": 0 + }, + "secondary_fuel_type": 29, + "main_heating_details": [ + { + "has_fghrs": "N", + "main_fuel_type": 26, + "boiler_flue_type": 2, + "fan_flue_present": "Y", + "heat_emitter_type": 1, + "emitter_temperature": 0, + "main_heating_number": 1, + "main_heating_control": 2106, + "main_heating_category": 2, + "main_heating_fraction": 1, + "sap_main_heating_code": 113, + "central_heating_pump_age": 0, + "main_heating_data_source": 2 + } + ], + "immersion_heating_type": "NA", + "secondary_heating_type": 691, + "has_fixed_air_conditioning": "false" + }, + "sap_version": 9.94, + "schema_type": "RdSAP-Schema-20.0.0", + "uprn_source": "Energy Assessor", + "country_code": "EAW", + "main_heating": [ + { + "description": { + "value": "Boiler and radiators, mains gas", + "language": "1" + }, + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "dwelling_type": { + "value": "Semi-detached house", + "language": "1" + }, + "language_code": 1, + "property_type": 0, + "address_line_1": "30 Hallett Road", + "assessment_type": "RdSAP", + "completion_date": "2022-03-22", + "inspection_date": "2022-03-17", + "extensions_count": 1, + "measurement_type": 1, + "total_floor_area": 80, + "transaction_type": 8, + "conservatory_type": 1, + "heated_room_count": 4, + "pvc_window_frames": "true", + "registration_date": "2022-03-22", + "sap_energy_source": { + "mains_gas": "Y", + "meter_type": 1, + "photovoltaic_supply": [ + [ + { + "pitch": 2, + "peak_power": { + "value": 1.14, + "quantity": "kW" + }, + "orientation": 5, + "overshading": 1, + "pv_connection": 2 + } + ], + [ + { + "pitch": 2, + "peak_power": { + "value": 1.14, + "quantity": "kW" + }, + "orientation": 7, + "overshading": 1, + "pv_connection": 2 + } + ] + ], + "wind_turbines_count": 0, + "wind_turbines_terrain_type": 2 + }, + "secondary_heating": { + "description": { + "value": "Room heaters, electric", + "language": "1" + }, + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + }, + "lzc_energy_sources": [ + 11 + ], + "sap_building_parts": [ + { + "identifier": "Main Dwelling", + "wall_dry_lined": "N", + "wall_thickness": 280, + "floor_heat_loss": 7, + "roof_construction": 4, + "wall_construction": 4, + "building_part_number": 1, + "sap_floor_dimensions": [ + { + "floor": 0, + "room_height": { + "value": 2.3, + "quantity": "metres" + }, + "floor_insulation": 1, + "total_floor_area": { + "value": 36.86, + "quantity": "square metres" + }, + "party_wall_length": { + "value": 6.8, + "quantity": "metres" + }, + "floor_construction": 2, + "heat_loss_perimeter": { + "value": 13.4, + "quantity": "metres" + } + }, + { + "floor": 1, + "room_height": { + "value": 2.3, + "quantity": "metres" + }, + "total_floor_area": { + "value": 36.86, + "quantity": "square metres" + }, + "party_wall_length": { + "value": 6.8, + "quantity": "metres" + }, + "heat_loss_perimeter": { + "value": 17.4, + "quantity": "metres" + } + } + ], + "wall_insulation_type": 4, + "construction_age_band": "C", + "party_wall_construction": 0, + "wall_thickness_measured": "Y", + "roof_insulation_location": 2, + "roof_insulation_thickness": "200mm", + "wall_insulation_thickness": "NI", + "floor_insulation_thickness": "NI" + }, + { + "identifier": "Extension", + "wall_dry_lined": "N", + "floor_heat_loss": 7, + "roof_construction": 1, + "wall_construction": 4, + "building_part_number": 2, + "sap_floor_dimensions": [ + { + "floor": 0, + "room_height": { + "value": 2.3, + "quantity": "metres" + }, + "floor_insulation": 1, + "total_floor_area": { + "value": 6, + "quantity": "square metres" + }, + "party_wall_length": 0, + "floor_construction": 1, + "heat_loss_perimeter": { + "value": 7, + "quantity": "metres" + } + } + ], + "wall_insulation_type": 4, + "construction_age_band": "H", + "party_wall_construction": 0, + "wall_thickness_measured": "N", + "roof_insulation_location": 6, + "wall_insulation_thickness": "NI", + "floor_insulation_thickness": "NI", + "flat_roof_insulation_thickness": "AB" + } + ], + "low_energy_lighting": 100, + "solar_water_heating": "N", + "habitable_room_count": 4, + "heating_cost_current": { + "value": 710, + "currency": "GBP" + }, + "insulated_door_count": 0, + "co2_emissions_current": 2.4, + "energy_rating_average": 60, + "energy_rating_current": 72, + "lighting_cost_current": { + "value": 74, + "currency": "GBP" + }, + "main_heating_controls": [ + { + "description": { + "value": "Programmer, room thermostat and TRVs", + "language": "1" + }, + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "multiple_glazing_type": 3, + "open_fireplaces_count": 0, + "has_hot_water_cylinder": "false", + "heating_cost_potential": { + "value": 548, + "currency": "GBP" + }, + "hot_water_cost_current": { + "value": 95, + "currency": "GBP" + }, + "mechanical_ventilation": 0, + "percent_draughtproofed": 100, + "suggested_improvements": [ + { + "sequence": 1, + "typical_saving": { + "value": 112, + "currency": "GBP" + }, + "indicative_cost": "\u00a3500 - \u00a31,500", + "improvement_type": "B", + "improvement_details": { + "improvement_number": 6 + }, + "improvement_category": 5, + "energy_performance_rating": 77, + "environmental_impact_rating": 75 + }, + { + "sequence": 2, + "typical_saving": { + "value": 49, + "currency": "GBP" + }, + "indicative_cost": "\u00a3800 - \u00a31,200", + "improvement_type": "W1", + "improvement_details": { + "improvement_number": 57 + }, + "improvement_category": 5, + "energy_performance_rating": 79, + "environmental_impact_rating": 78 + }, + { + "sequence": 3, + "typical_saving": { + "value": 30, + "currency": "GBP" + }, + "indicative_cost": "\u00a34,000 - \u00a36,000", + "improvement_type": "N", + "improvement_details": { + "improvement_number": 19 + }, + "improvement_category": 5, + "energy_performance_rating": 81, + "environmental_impact_rating": 80 + } + ], + "co2_emissions_potential": 1.5, + "energy_rating_potential": 81, + "lighting_cost_potential": { + "value": 74, + "currency": "GBP" + }, + "schema_version_original": "LIG-19.0", + "alternative_improvements": [ + { + "improvement": { + "sequence": 1, + "typical_saving": { + "value": 59, + "currency": "GBP" + }, + "improvement_type": "Q2", + "improvement_details": { + "improvement_number": 55 + }, + "improvement_category": 6, + "energy_performance_rating": 80, + "environmental_impact_rating": 78 + } + } + ], + "hot_water_cost_potential": { + "value": 66, + "currency": "GBP" + }, + "renewable_heat_incentive": { + "water_heating": 2107, + "impact_of_cavity_insulation": -1824, + "space_heating_existing_dwelling": 9574 + }, + "energy_consumption_current": 171, + "has_fixed_air_conditioning": "false", + "multiple_glazed_proportion": 100, + "calculation_software_version": "2.1.0.1", + "energy_consumption_potential": 103, + "environmental_impact_current": 69, + "fixed_lighting_outlets_count": 10, + "windows_transmission_details": { + "u_value": 2.6, + "data_source": 2, + "solar_transmittance": 0.76 + }, + "current_energy_efficiency_band": "C", + "environmental_impact_potential": 80, + "has_heated_separate_conservatory": "false", + "potential_energy_efficiency_band": "B", + "co2_emissions_current_per_floor_area": 30, + "low_energy_fixed_lighting_outlets_count": 10 +} \ No newline at end of file diff --git a/deployment/terraform/lambda/modelling_e2e/variables.tf b/deployment/terraform/lambda/modelling_e2e/variables.tf index 02cba590..2595d86c 100644 --- a/deployment/terraform/lambda/modelling_e2e/variables.tf +++ b/deployment/terraform/lambda/modelling_e2e/variables.tf @@ -26,7 +26,7 @@ variable "reserved_concurrent_executions" { variable "maximum_concurrency" { type = number - default = 16 + default = 32 description = "Maximum concurrent Lambda invocations from the SQS trigger." } diff --git a/scripts/hyde/elmhurst_download.py b/scripts/hyde/elmhurst_download.py index f148ba28..0c317033 100644 --- a/scripts/hyde/elmhurst_download.py +++ b/scripts/hyde/elmhurst_download.py @@ -28,7 +28,7 @@ SESSION_DIR = HERE / ".elmhurst-session" SAMPLE_DIR = ( HERE.parent.parent / "backend/epc_api/json_samples/real_life_examples" - / "SAP-Schema-16.3/uprn_100061905751" + / "SAP-Schema-16.0/uprn_10070004512" ) ASSESSMENT_GUID = "B44A0DB4-4C08-4241-B818-86F060172105" From 79a76b10a90ebbc965dd53bfbfc4e71a5aead4ed Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 23 Jun 2026 16:36:59 +0000 Subject: [PATCH 14/15] fix db issues --- applications/modelling_e2e/handler.py | 7 ++++++- infrastructure/postgres/engine.py | 21 ++++++++++++-------- scripts/trigger_modelling_e2e_sqs.py | 19 +++++++++++------- utilities/aws_lambda/default_orchestrator.py | 6 +++++- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/applications/modelling_e2e/handler.py b/applications/modelling_e2e/handler.py index de7b5542..a9e351b3 100644 --- a/applications/modelling_e2e/handler.py +++ b/applications/modelling_e2e/handler.py @@ -23,6 +23,7 @@ invocations (ADR-0012). from __future__ import annotations +import dataclasses import io import os from collections.abc import Callable @@ -92,7 +93,11 @@ logger = setup_logger() def _get_engine() -> Engine: global _engine if _engine is None: - _engine = make_engine(PostgresConfig.from_env(dict(os.environ))) + config = PostgresConfig.from_env(dict(os.environ)) + # Reduced pool for Lambda: 32 concurrent containers × 3 connections = 96 max, + # vs the default 3+5=8 which would reach 256+ and exhaust RDS max_connections. + # pool_size=2 covers the simultaneous read_session + UoW session per invocation. + _engine = make_engine(dataclasses.replace(config, pool_size=2, max_overflow=1)) return _engine diff --git a/infrastructure/postgres/engine.py b/infrastructure/postgres/engine.py index 2558532e..cf455219 100644 --- a/infrastructure/postgres/engine.py +++ b/infrastructure/postgres/engine.py @@ -1,20 +1,25 @@ from collections.abc import Iterator from contextlib import contextmanager +from typing import Any, Optional, Type from sqlalchemy.engine import Engine +from sqlalchemy.pool import Pool from sqlmodel import Session, create_engine from infrastructure.postgres.config import PostgresConfig -def make_engine(config: PostgresConfig) -> Engine: - return create_engine( - config.url(), - pool_size=config.pool_size, - max_overflow=config.max_overflow, - pool_pre_ping=config.pool_pre_ping, - pool_recycle=config.pool_recycle, - ) +def make_engine( + config: PostgresConfig, poolclass: Optional[Type[Pool]] = None +) -> Engine: + kwargs: dict[str, Any] = {"pool_pre_ping": config.pool_pre_ping} + if poolclass is None: + kwargs["pool_size"] = config.pool_size + kwargs["max_overflow"] = config.max_overflow + kwargs["pool_recycle"] = config.pool_recycle + else: + kwargs["poolclass"] = poolclass + return create_engine(config.url(), **kwargs) def make_session(engine: Engine) -> Session: diff --git a/scripts/trigger_modelling_e2e_sqs.py b/scripts/trigger_modelling_e2e_sqs.py index 456497ec..f0eaed38 100644 --- a/scripts/trigger_modelling_e2e_sqs.py +++ b/scripts/trigger_modelling_e2e_sqs.py @@ -22,7 +22,7 @@ SQS_QUEUE_NAME: str = "modelling_e2e-queue-dev" # Number of postcodes to process this run (postcodes where all properties are # already completed are skipped and do not count toward this limit). -POSTCODES_LIMIT: int = 100 +POSTCODES_LIMIT: int = 1000 # True → Lambda runs the full pipeline but skips all DB writes (safe for testing). DRY_RUN: bool = False @@ -73,16 +73,21 @@ def _completed_property_ids() -> set[int]: with engine.connect() as conn: rows = conn.execute( text(""" - SELECT DISTINCT (elem.value::int) AS property_id + SELECT DISTINCT elem.value::int AS property_id FROM sub_task st JOIN tasks t ON t.id = st.task_id - CROSS JOIN jsonb_array_elements_text(st.inputs->'property_ids') AS elem(value) + CROSS JOIN jsonb_array_elements_text( + (st.inputs::jsonb)->'property_ids' + ) AS elem(value) WHERE t.task_source = 'modelling_e2e' - AND st.status = 'completed' - AND (st.inputs->>'portfolio_id')::int = :portfolio_id - AND (st.inputs->>'scenario_id')::int = :scenario_id + AND st.status = 'complete' + AND ((st.inputs::jsonb)->>'portfolio_id')::int = :portfolio_id + AND ((st.inputs::jsonb)->>'scenario_id')::int = :scenario_id """), - {"portfolio_id": PORTFOLIO_ID, "scenario_id": SCENARIO_ID}, + { + "portfolio_id": PORTFOLIO_ID, + "scenario_id": SCENARIO_ID, + }, ).fetchall() return {int(r[0]) for r in rows} diff --git a/utilities/aws_lambda/default_orchestrator.py b/utilities/aws_lambda/default_orchestrator.py index f78886b9..cd4c7d1e 100644 --- a/utilities/aws_lambda/default_orchestrator.py +++ b/utilities/aws_lambda/default_orchestrator.py @@ -2,6 +2,7 @@ import os from collections.abc import Generator from contextlib import contextmanager +from sqlalchemy.pool import NullPool from sqlmodel import Session from infrastructure.postgres.config import PostgresConfig @@ -17,8 +18,11 @@ def default_orchestrator() -> Generator[TaskOrchestrator, None, None]: Connection params come from os.environ via PostgresConfig.from_env. Each handler invocation gets its own session, cleaned up on context exit. + + NullPool is intentional: a new engine is created on every invocation, so + pooling would accumulate idle connections across warm Lambda containers. """ - engine = make_engine(PostgresConfig.from_env(dict(os.environ))) + engine = make_engine(PostgresConfig.from_env(dict(os.environ)), poolclass=NullPool) with Session(engine) as session: yield TaskOrchestrator( task_repo=TaskPostgresRepository(session=session), From 93f6fbe1b9db4f90bf1ee4989da351f64f1623d6 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 23 Jun 2026 16:39:49 +0000 Subject: [PATCH 15/15] revert pytest.ini --- pytest.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index cb6af047..2bcd6178 100644 --- a/pytest.ini +++ b/pytest.ini @@ -25,6 +25,5 @@ testpaths = etl/epc_clean/tests etl/hubspot/tests etl/spatial/tests - tests/ markers = integration: mark a test as an integration test