From 17ced10e94baeceb1394e9d2521447336b13f08f Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Fri, 3 Jul 2026 04:16:47 +0000 Subject: [PATCH] test(accuracy): validate + pin 217091901 (single-glazing confirmed vs Elmhurst) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Top-floor flat, solid brick uninsulated, uninsulated flat roof, gas combi, SINGLE glazing (glazed_type 5). Built in accredited Elmhurst RdSAP10 and every heat-loss element matches the engine EXACTLY: walls 53.18, flat roof 145.57, floor 0, party 0, and — with the faithful single glazing — windows 34.7114 W/K (8.62 m2 x eff U 4.0268). Confirms the mapper's glazed_type 5 -> single (raw U 4.8) is spec-correct per epc_codes.csv, not the double it superficially resembles. Engine 61 vs lodged 62; the -1.18 is a cost-side residual, not a fabric bug. Pinned to the observed engine 61. Co-Authored-By: Claude Opus 4.8 --- .../uprn_217091901/elmhurst_summary.pdf | Bin 0 -> 79974 bytes .../uprn_217091901/elmhurst_worksheet.pdf | Bin 0 -> 43333 bytes .../uprn_217091901/epc.json | 384 ++++++++++++++++++ scripts/hyde/build_217091901.py | 287 +++++++++++++ .../test_real_cert_sap_accuracy.py | 21 + 5 files changed, 692 insertions(+) create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/elmhurst_summary.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/elmhurst_worksheet.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/epc.json create mode 100644 scripts/hyde/build_217091901.py diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/elmhurst_summary.pdf b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/elmhurst_summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bf5e1e38263ee164b96224bf04b600cede8742eb GIT binary patch literal 79974 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 literal 0 HcmV?d00001 diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/elmhurst_worksheet.pdf b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/elmhurst_worksheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c995532927f9a81fbcb3ab7ad56a19c8bfe61171 GIT binary patch literal 43333 zcmeFYb#NrjlO-r-wU}DW++wMOEoNqBW@d&KGqYOE%*@Qp%*+he{r$#fW_QnS=4{vO z{<$j4%!-Ov>0y!2t>T5dlgbJT(=z;EhG8I}C$P~s=i;JMbh9<06VP+iv$QdxlhrdZ zav)&*(<#rxV`Odk2LkiA^`D^sK2{Lj{etPN}o&8$u6RLrdTtR2k$y)A5J@8Bq4 zs%QUqD3W^r_L+f|=?~J-(bPeMm7bp9|3Ch}nFIPikNtn|{Xac9t$*0|AIv29ht2=a z;=iQ+Pb~iHJAZu4-sq3-{NrSFQbvYmdVjh4cT_CwEI%08SXc=F%nUyO0Cs@ZAI4cb z{y{qsu>R?nr;|5w_(OODBZohZ`;6WqbUIsJv}oIkAtJVk)9QdYS4tbhRt3hviFuwPco>bU&2_pXsp-R z#0vKWd=wj>UpqZ3N*T4pFA|%y&(}%WTF(i}x?{>-u$sNGp&i>FTX1g7uieAN{y(1; zxV^sH<`xs>4I#uK5d+Xl5)GMOp6|Noy}y5a?l|7>9Q(iypqR@e1rmKUv$vCF$dL^v z>vx(Chg#sYd;x~F9KIBu!Q!)3U&ZKu?-lC(B2(|EYhdC_W#lXFA(|SQ{;8d0IHemw z9w*{gs4Q3E>Yt+%=6*ROrHpR4`@IXCYM#7ME(qq@2fE9S2~$ESE)eV2X9+}2wr$vk zojTV+Wr|=fjJe@=S-UqKaMHYz^p~{tR<0*HyXBI?P($FiR;r^;bM26HNh+Ns4GxBV zlCpHToH7i1Hm8NXo=%JrH#NyoB75h0!<9+x#fjz&OB*4!OXeDp0DvrQ$svbt7S|is zR2aFvl2NCrX5H`Rv0C#&yA-Mdf3=3+g)?KGD(a5?p!Ts+-gqyi_6GQ&Q^kA^eYDo2 zqh0fy!yByqJEYKw%2uNu&-)`tm>UqAdN^5)u;0WZ!}?6Z)JZ`<-5znhAkb=tK=e`<<5B?x(Yjm5a$ShfXU{V8T&wD($he1C zQeG?$>@BuyJrF}?!0G(L7)$$YV;FYc`4#z^tGM?Xg3I*^Xcg{O%u)rSNcZ;$h^0XD zoFO%w{5r3NC+A1yRC;n3cRCxM-w=x2s(V1~HPM|EX#Fq0@nZseSag^JeW&d~?Scq} z#F9j#B+ipBb~MB5$e7}rgiUs`L%@+q0VSes&?V&xN*&`$-?o?blzTf{U$|Bpjt+14 zpi`yvOe!qbP{|N2$xlirm~H3-s#h^N-up^Raui29>PS+rX;cCeAV<8^-GJOLP1QG5 zrP_tZD`P3jAWb)Bq8S@vOPeUfbAM=eyP*2LTG)mz?@8uKEx%`^JFDi9gs{j{ zfI70;?;P0x1!lcbObiFPmyf1K(4i*Op>;yd=Z3vi$R-f{ z3e0GE0j7C@27(afC+|_f&5s;KV==skfwFr#cyzNN+h^q|vy}>xcP@!&gTuUZka}($ z#;8=~>ILg&)eUO8%7`Gk{M@g?3g1@Ja zjwd>feWRH@}{y+A+l3_waX8wF%`Qe4jye4`OQ7@%5_6w`Il zq-5B`6_rY5R9x$Yy}yvdz}2(ss)>&1cSchSq9iVB?XK+gZGgtlu{m${>ql6l#&yQ; zp2jOW6xk5Djh{Nk4%KG&cMdvSJ0?|Ua9kF*Z@J&-5V-e$LEz*64xu7~6-=Z^E9~fE zcnwo#Ylq8_hN5^mMSNO|fcQPn&CC3nD8R^Z6a53qL5--(LIFADY!K9Q&k>WHq*^=` zW>Yz{bFef#f~(lk15Q(0+z%7i=5x`*wVltuy(B|{zsngV3jQrf5? z1r+fPDzP~wxjADhyaGb} zG29}1W&)8`8tvPpdp1DKn{7X9T>bs|jn+iL8I0BDbOW(~PF|6?3MiR08_ydn>#le( z_YkmU^h=~sTIO}4CdQdmg1styzz{@#B-GJPQGg1UXYOVL9AjmZ>b;gMbO=pN*SX{F<{V_b=BgMt9!a?h)K`I^7si@P7&V#ltEoIZ zHJ9YYc?8hORIX1OT(*d2^g`vq?q#QQWOg<$uU`RxBw1p`+a^I$7%6oD6l-_9hQgVN z9%3iTikyf$JjA@&&2OxwxnwdwD#wT;bJIwB)$kb=2LiZE zmv5HA;zYX8EdhiX|mW+mt#DA}8{y?8!4lYG{O!r5WG%iX&P7<(_MNoHk48CkE% z>7d^!DM)ZTb+x~8BXkA4ncE}h8*Aqa)om!r!SvwHKkB<)RC&b`8{G?%ungC}j}=c` zgeywK$q(1MAAq)a^u+rQDlNmiNKj#_T?_}#D3&C;N+n*gFep0UYU$MLEfE6K@sAP_UpO3NbXmkSmWk`A*k1X6R z6O%)iCxt8hq_5utS=}*?K!RgrN&#j4*iC6L{8i|0#h(okS8b*wz&0{HPvq1KmZ(`+ zRzaQZ2OXeK6-=9q*T~Ht@{!R`dom{8#UyeKZv zm93tK5?+<_Z&M;mx-D(>0MLoHbV~b!b$N<@WiM&bJC9(a3^=OcbEYM515GL1u)yI| zuub)2Y&k?f^$E`kHh_-dE~=ygk{$?w3o2d{IvquMt~Afd{#mQe#<3HkN$I+Hd(pIw z=1Ox0YWNB$kigFMcA8n_iq$3y&+cpQx@mjGbP;|?ct!aToot)bD+wwtS+idK8R~{) z4YJ3D^I%#Z-4qQ!qaPQDOfaF))SCP^B7I=%DB7M+%9ge_uJ%wAN~vpq&?^_fu+Xyf zg?|t;fq}j2H*wR*Ti^WOTT73hyM^#fz;91HKGi!N2tpZw!WqHuoO$d>@6Xdk9(pU?56!kWv;6=ht- zG-|JTJlnn<;<_`b1P$-*3BLVnZ|J(Baug?BIBRc^9uVlwx^nWEgm>F0Y z{*&xj(A035Z$$S#Qh8=Tm38cLtl-Hnl3fLv;0U~(J_%sj6Vv2!j=CV+-^%VFUE4Fn z$>l|cs6nqAG8lU$xp-6d=5ZH{&-?z_=kqY~37bTb8<%%L%!e|DI-?xEZ(5W5{Ai(7 zF(yE1Wp=z&8597gEU#RW$kuk(87ILClKRH||0=X0qdX+vt;G^SNAs_(ioeoDP7m z3UAZN`As~%flRN&wE+@O?TP_E6rvI499T@7X&pBf^awyIUm0(f?nq5;|3K`vhHA0w zTw1u6g&wI;B=7`D&s{JDZ$>7%`=q5+o9a8VrG^oAz6rwgE`$;IOqduBD*1?x+RCBO z>Y-BVyjl9dgC5+D{OAUVF-1-9FnqSpS|jp^nlgFOLTeOuSCSx1E7Kl+L-P%_1OAVq6pZvLt>1?CaQPB#KS(%}>BE0Nad#6BZIA9qpN>$4wkTmD2a(fxiQvr=V z!YdPP#4ZtIMeFntZ)o0~CfClED5DigWFaeed6*Y-izN^^SauCitBRwEWO9LqGbF_F z1q6f_wNRxIZAA0!Fa#vvi7~1@&`jsR3f7%rgr~uY15$y3_6lK|HD(}b+Q{U*Y-r;0LPtp?%s7#$2tEKJ^ipuW|kN7{CqsYK{goS z3(0T_xu4L@UcXPuwJ$WnHuICiPxB4NbI3D~W<6D0>=wZ4_uTw%;dLuUQW^^s^|y?` zC+RfqUj~gTtQwy)UMvt*4l@8uy4Mc)Ll0v+V&Hu&zCt8fd_xvoI9r#L$g?5 z3oxMO&kwZbI@8+E$12sbiLh%^iU@!)B!y8T&8ef8{VJJ|lc#45FyBHZJQIj;6A=;m zFOakvpgsDsBl_Wc5&`R$oL82en=W*py@1BW8VsBPQD(Lg0Uyj)Xc7g0h3LY?k+onAR0`K!P<{*pvc* z_zg72txtsD(mm^X6mr{wLX`d1kt~8bEKOKmKpfp1($Km`pN4?4Z79&x>S6Z%Mf13$ zn)KFngU8o6;ZLL1ETiXiJ*vT;L9qhAgMX)od(D=sZbf(&w%{{{TDVN>Nc{1s6|j4^ zsi!>|{y=o5a(af;N0BOm))*7KXJQ?!_W8*XQH`#4FUvFY8{)Ug z(}{)fof@YW!tkBV2Qit>iAnd{sTTr;O+|c<+hofuLE&2FM1swPzMH&ZDc)oRn%}%Q zE>%S7PzTTIWT}$y6p0sV^XgTrlPE#dO$pP(j{ypQF#l7@624ArYfkLQBQ(pJU;cGrLH}2Nx zY+Y47jq&?#u}SD%AVxE+_tDaRbiTP%#$GN)DG_zK0~t(q0i9j1-Z5z7`T&_P#{C#&HOEWqb*+f%-r2SD1z9vl7SZx^^1+S3w*OG^Il%4%;}yg7 zWo6q#tWmDk*S(||V^xATTKts;(H-*;QcKYEo&HO?t|OqRyOC|+7&D0dYc&mm7uf=s z+8i2G0VuXzH2Tc5Q;tBUgXD$MtxcORS^LK(M?X}$z!MsbY1z-7o*N$eQ9sUtIJUdC z5con07!6FC>hu9?MVDDhBHtU~w+H%)wQ%f|%fZ4PxF#LipMvFHv=yY%(+m;6?GFId zrFV3K_88y*C}LJ7N?J%1Wmg=LBDD?>GK~TQ1;|!TcQ2?ve|cqw_^=VWWx%zxEUwA$ z??F83Wcu(DX3Tn$I{YB(P2D8JmRDM!qUbA(bbNB)uwV%_y@4`k15%5W45;ibSdS)Q zq6Ra;=p5*w&N<8(BKE2Wx`kQ;cf9aJ8P@VY^rVOgp{6l1qQmAZLwetE>W>F<@j`$h zl82kucNSFRMX038VUzBfP0c}#v(WEYG=t#lOGh8;o4Y?R&Tn8g#rd{_mcx2sv#sTX z$^4Lb=R>YoGKff3^O9a}o=|GduJe$`VL3xXMe;c10S7FYnB&5fi?N!JU+S3EuKr>k zsfzq=Qy68!`8z6j@w%yI-(Q6+gm0`PcVl?JRz;)xIYX>6lO~Y!N83k}#)f%pp^Wue zT0k2rNFPXoCxn$mV7`?hLQRdpm0-yWfHXDS;zd6<}wBi-=(IQQ+>v^c$6sB zt+wuFSd-}c|YOYb*? zrHd{$Fc-;3&bKt<4v>J{w5cT%Gj@EEi2$}37U3L*9|jx5zu`?W_w3rs)om|rKNjIj zVRTAjef+N`%$%|oqzt2VVRO{ila^KMB{~j4P0$)^A2iAMaGRq9=XfFa_>rdlwBh_8 zdYJDZKvQta$4t7FtW|yJ0A2NGe6^R_!8drD9jfvd;M$Hn0u*9_XiJmhcB@&!lTdJ@ zSlmjMgFWcS`K&R>a}c6bvTGbMIX!a5;Blon!~kJ&|ETQ@Or%;?94+}tj#&HxS>@(^C= zZW<;NpF|zaJ{2RL1%>rcq^$lVx=he!vfTDbBg zQP9U32Eh(DBgoD0^^A0h*^lBKB6bU5p+!uflL;G+ZKcY$mUJUjw|7YTxhbEtf$|_E z6DoBe_z4^#s%e-tN0;MB{CX7esNAw3X}KUZAm`Y}{b7&Vr-5t4X&ylJSN+7lWWBu~wCc`mYaZ_4rulN|~VpHv1Nyg%ne$z(dbwoUr zu}fnWX#lz{K~d^ymdxy`+EMk1GUrH?LQsHEL0@%j2Z{M)iFBzxI>&3gFI+G7kO@0M zaL;&vdiX2Cd=xadn$r|z&X>Rz1=unAJ5-YRrYMNo;5baGag}7@Q%)MSMg51sEiOoj z%j@L%TDp}~IjZDRK!x((@OXW|XQKt2=?=%+N*P%bAT-c^9dP~Gz0hx=3zPpTQpY__ zN9W^l)HQ+kg}FjbJRgLdTphK?v)4L}?6ojLl`5D2njTZfjmF&uV;EEO+tDm_oGz?g z^EpIxrO<7KB-}D~%1g1lB+N18eRxt21+%ft0Tr8bpP-I}N>b-7rE2z7ALVNu7^j90 z|3?hBz~g;M~&kR4hQD0rKkxh#jUb_YyvS`b0cb1A7j2kUybn+qrf#bfGFW7XuN zqow;dO(&XkN9@Z7x%J6pP1o?d_qZnZu#4SjHIAR~e4EWreq!ej_s-)oqL>~0(>bBt zcu%Vlc|4Arm4?#(7kKlH4T4NF7K+>O2V(RL1qg|Z#CGZIGQCO%?@B(^tL$Ge$2~8i z6w-c%IA~o_PR9UI6HL8ga*wauE*qC{+=h^cF2J&C94Es5b(LXkfEjm2;~F?YjWx<8 z)@Tdl?V`j|JC{aN8z{-*%ud4YZ;foaFDFPBbiCOR5dZg8rN)mIYdhK`rv~xKr#%wz zItbbwTr|`gJP`H0Ua26n%SP~($f7m+Ll?^TrL_gXp{|O9UbVbjx&|SGs=RKSeT!T8 z$rxfy+67CEm#IW+X;K-Gv#!OM>hBTeA&0_vfOU;}W>Lc+*V_&Fa9N>Lk33DC`G&69 z)FO^fUAb9TrA~-2C70FcFU8GJHf7MdD5bACur0i*GpsbSG-)Z6XQ!y3R?Ui#oE~!i zZx^1f@Sol)y0FSDm=vF-yU$M+{uO=On}{ijAQ|t7$0{i$Pz>UcL5qaa!ByKmbO9I& z#M5T8HIoeSI5K{@VcK0;jVB}G0ZFVl^R~QMw zY%;SM#Szmxk;rZ}E>%DS8eE7llKgF3vC@?%1s{ano zUK}40@Yr__LxX1M8T@Hd@wYfIx(wA}QA}n_e`<^~b*fncs?%<1KetL&2r|32j+8C^QHP)?U zg;owayM|2lxuQ+>814s>tPI_kpGuQYK8~J~JOsyhvKv(|LQJ4)-}zv)!q)t+J05>i z3jWXRcrg5p#Qygqt^dIPt33}UR(7`kVb4Rt0ec9k^GxM@K*=$YIqk%)hzfEgR=7C9)TUCp6Pf4^#`6#c>{K!2?)F{3;nV4=ex8?cu>`o`Eoy+HTVrXSrO>Vq* za4JBlqqy?4$DFaP{0C(G3bH~b!lumGD8`fsl@JGzL}FcSR$Po+>i+jxDqMR*Ms}m} z3CY2He`0cylAOAAY~;hnLfnQxBc>BH%osT!-S)(xTIJXbbVf=>KHcB^toq+Z!RahB zrc?sVSW_MKWgx4sS*ee5QD%#Eb4}z$u8W}a!_{9T`PHG)P(CvnsWc{{ z)yAy^hzJ?fV7N|05@hLiT`h?;n>ijKV1318Gn_)RAGd>Pk&AGGGtZyY<1n(+w3ot zZKVF{b8lJiIJi0}e$8iAbK!mY+HNhZ!2ceOqMo$5G2b`h%2+NOu<#*p!GZ^;ayRh# z{u84z+lj%m_w`BV*|QHBeZKbI+sCwd>iM|a)9B1aJ9hH3K7X~>+#*h>Bb82B#R#Yu zIA(E;Sh!3Vdv8-`TEEK!<5%t`eps6TYp)5w4!Uw4PQ5wfTn0|_ma2#(e6`k(lS_G* zHk7Ch925ZEnTe6s|-sogwUKE!H9>_CZ4am+8ZhUPT?wd#O=dOJcYbf;DoX{n7e#4}ch*e%-Lq5Wu zv-sz(ZBl;SB#`H6zL;xU;6b;naf2IFFw`p?P0PJhFXdEF*lRf&l0hmI;8!u|&~H?~ zD8j=^-L(*m(`}8FbhhThd(1nEdrUFjY0rA>d8m!l9cXf8!cTm=89k`OIktA~>b2#WoV*A8uP+9cj1JE_!y{%bvj`Ll2%SV_ z0T_Yt_$u)yhM@&hCYe>(Q=A1R=HY%t3zqs>+Ivc4t(TZss9p2jfPLFxG$Q7cVHKyV zS#1ROuD4y|8mx{Be2ppA{rWDK4M@_f)AXqKBin^on?rn#TN@USvDya_$UNTIrLOPg zE{irfy9}bjek9Uox*W5u>v3dZ14xWR)~LUj@CfusG~$SYK8AFSTjet06B&FBhvG0G zAm-A`G66%~^rTx*sAKVGVxb>F%!OS&s;8oikBBSzM)o$jpwTD4)CdD84ZCewso=^9 z8`pBxSb@hI*~sva`QWQC3}jy6&5DWhW^hl^-ebi!NFtHhQ>J5Q9+;XduvSe2j;u7( zV|ejSvBg$G^`A-K@d z^YIhj>xA(q_~AVGt~B*D3}UG-q6MC+fVXl5y5w;8meRw$Q}a&kMI!~-LG5M7Y(sf+ z6?))~<$8!9F=vTPKw(sbnoGV5H{phULovb#qm< zBbOH|(+A_ZnMHS2?TI9?X0F)?qCt@=$LTW9FTskn6C9_j?)qcZAGF!v zkt85DcN^Ol^sh!8np#VBN)O;aXn(69f#S6w0ii;q2`%N7Zp11qhs?IajFx6Fz2x&d zWUtD?hKrZFyD(ucdhvD^`)J9aHw=reSZY!iy6V%24_4e|vv@v=ekds1Zb-AMv-s1U zam$Hz1mBe)0jDFO}az}S#m%od0yh?Np)zzRyz1$MTHD>G2 zd2252JrtI2BW1c16Xwf&YY)RPY744}&jr@|PCXFKD~cH*xCmvh$c${m?kY2iyv%9n zG$KmbV>BU7)!-c98)~oMd;}BN-pd(d2uK|-z{;`tMx_1O8Rw|wgnjxQaxSKY7)im| z@Khx7WK93M`ZsYO>j^7cO4R%ZywbVI4XZh~h8gNODf$);lNY2^RpH%1t-ne!tVA7D zC@Q|y#sYabH`pl75A_Qa4dZhZLVFcay&4ZeR%$S+B(*?gV|^5h=gsy0c;My0!*>$b z-a?0WeYoJZ5v<0s<|XxS(y`HgPO&2Gn1fpuE5oyx-yO=9Q%beUp0={9M#%{Jum5CC z;7CGrvl5nrrvsa*>w+^8t*HZ8GosZ-oNB;C?M{&iH>}Qv#LjtCmQ?8?LBCNtq>l4~ zZ|i4>3Q*C~x$1X38smpry?vFdi_s$92sml<@oHxP7avJ}b~&YhVjv#^xm-lj8u$?_ zWseu$yWbm|OUI0V8spVbBM9CachYT04hsn;)I|5&@@UYKT`lc$;kmGt6te92C%ocD~DkNhIQIF}kkJYvBA z7A*s@!d3w8k`7d5)+X(o^S$cqL@y?+XmMiZKr5trM4NrWNd?7DApwOQ#eVmpjy|^D zdN@_Pws|Rr^BYkfF$nXnFcMUW@_uuCprbG#RU;&2+nRaB=8Javd_a&F3r@YU0 zN)VWrd5+OOg!RM?jLYiyUCA1JyuSgTJ{S-7M>U^B?&otAT;BOjdxZlXXWR=bhrX%m zFKdfJhhlAux2k|`F`He7XHF`$3zpc-Ab z%0;MOL}YstIRW;+Cgi`D@-Yp>MKp$bO{!-WjWfbe{ciT_6yn5)fN|Z5GMW!4Aa)bm zd%Qk=1&p^qD3D8c(jHmdwt2JfiIK5j0cp32AR-dG43IHZ)S<+s9Gv=6EwUtkRFuSbas|*#F7$Osv?D&injIX4ru6>>fnoVmg1#+&xP%f;s^9W|elv$0+KS?CL zk+^x#v?B%zKi5V%T9dTp(3g>A`6Ntg)rS#%VZn6Bu-w!zma<2(fg4_h_t!ewS>ScaCNQm40@nht-iA1z1G_;Co-m6GsR>sD( z@XW@^?_+T}X3Elir$|2nR0nU#p-+lO%k5IT zl&KB&8Qj75UjyR^T#Aisu1xajpn1^$NQEAJ*pxhR*FlKS?uiWjiIN!L3H-4cZ!|e) z{_+)Kodj;5e&Y?f2h?Izm%=&jhXguDFaDRl>n7>_CruWWN$XepVOM&M&jMSX3H-W- z4Xr-+Ms>@EhU~nE!TN~vjPi)0vou0CPvLiTVkbgk_8S$a`WM~y z&bo^4`mD_hMtv<0i#73O!Cb=oL8I^|8V3oQTM{o8OX@+0VJ5CSxkrW4AVP7=x zJ^|!a9&dBXflma!3EFEdYLxi>_&Y2Wq2w=#zl+h7wql(+(P$z{I6>HpX~hqLvs0FdCdRa#AJs5 zs3!P-$V_IV2mB9mS;OH^Xxn?Lsyk1CocY`^yj%gT{r*FY%b#Cd|#h+pMjT6LLp=cM@F|nXhubS zBUBOcz08k+-pQdAmRAJ#(9s}VqZ3pqOLbaU4W6GbPb)nmb=h59-^J+XLh&zjt;6rI z6$_J{BW^)5HC$tqul465bwS`WFX=0#vqeDkmQ5GIYiY85A2|JvMF}|MR4GpUGWOA+ z94(7h3TS~M;Je8PG8{RafX3i`bJ7@t&`4K78D@BaI{pNH$KdM$g>XaS@;fQHBm>8` zW<{n6$x6@?rfSA_4vukIQna~nv|*O0Em8H0DbR$Cu;paSwil`HhPXF#%RU!JHXZ5d z7l6;iZvXh9!>_xd@DA*BbPF4r$L)&GzOUC#yLX8I=)J73Js}teJK)BZl4S{Ii8^*F zo6*rp#14$Ngd4B~j+w%*Z$rJl4=oE|MJe&s3E-hxqj9~jD*8t8+8rhov|~72Q4WYI zYEHoRnG;EO<*g-l+>KV|k!90d=pivFv4Y>k^6T?Fd8EU!F=KnDfBNPbL9ae+-GN2` z*P%^d7s%^9H+GtSqehdQNV+no ziA7d`H($39I2FpoM(;TYHBBDEI=rUE-MY}!WTh)}{PwlxsYb-vkOut&wq= zuoYCHoQAgq;voJe!?~$(%#02j4`3KHU{{|+KY(QxJ0cZ7+CvMRTKu7{y^jVbWjnjT z{0g6DtjL89!z5XMuNtRH!Q6w~JCUVYxbh-YVe+K=sT{AlO@ibFkNpcIT!=~<7ZuB@ zn*tIIeH3zH&raFs1*be^uBs-0u~jtuE)q-u*U_>-CvFggP**uYnOZ_~C~&gGI^jb} zf>$O2A`1r*3qDY{GGw*XSIm!CisVUB4rXTO<`aqPJLJuG#{))eI=xwJ1r5&D=AOtw z`C?iDONv4+xlEQz7BfroxqANv@7B4%zM?6g^$ckw8r2SFeJ0)la0r>)H(9b13Lth@ zr)Qu`+l9}{2V5;S&(DCzbp_xlXQaUI`}p??8>s;^vplD9HP&*J0ql-XJunozMjTqJ zboTXrWIf~5xx~P-8M1RA6lu@brYzxu|ASW}e{LB+&1C`=}^ZA3UjKnakq zr}%A>ACSgLe`HaPc5ilyhciuw+a>9k7=)kGP)o=r+=ee=fDFtyo_svhV57Z^sdV8E zcyX)z_|CS*LJrqnvU4~S|F|l=NOziQU4Bpz6^Tmp65P&PHgxDiVfN*Dc{{5;tNk-V zdKGOUrMRC_->~y3?2=QRF%@Wk=g8MMy!npBp^?!Goya1Z6mRk z`0B>pK6kLdZPbL23Oz)UnPiB}tu?`mw?(%HS@bU9T2_!5H7qCxHx&@<>I6Ig3mfB- zMu3Emti~+_j1T!oT(jo~o)tjDWt0?f#_hPmk;q3>Gm|?HL0uT%R{Ica?y`T1Ct90S zMy|@F#}%_ID`EZ%i+F^#?E&Qc`I_v4?0a&czA^Hl@9{D&M+ph*PH~UgrV@RfuMp$e zm?snbIY<>snduvBAqFh+ZRyflY*6>Q{{%8koR9XMHdm_unz4b9L>!eL|4M{=YT6K?yxYX@9iF+}P!@M#*yS>MR>#&c}&u&)PK`RdKh z9kuBVI`<_v|J=JC%HkQq1ZB`sNQD>{VD1vbhYr=Hm->^$HL=@rPkqe?P&0@KKH1T8 zcTK^=D-33v>)W`$KR`>rgCV46aBQQh16xux+ey{O{4hIGVwL(}@T2CBzyY0QE@*2avBJ2M54!hdg+2iO~xxa^qA`Jeo6`DHY_w zatbR&3D2!B+)CH(0$Ww~@j=@5zj9>xf*REZ8)UvPW*ZxH)rC*qTAJg#!=C+ci!iXm z4AP4ntJ;C$oVRv(>LIKLG;0p&<=J(cP+aT)(hu{dfOH)sK7P1K>f4z{p&@bOtl$)S zB`Kjj3mH~XCu;{~o(}ahRP*Fg?=;V*khKOI#3mUzo6V4JFK2Av_99tTq4sbPf}R2-ncr65s1Aq?4Vd3otxli>z(3B^vdX{zYk>Y zX!|*t5X=i<`>%bP`;-DB9y(2_)%N>7uOZ3i9*~G-BA`jkLn6!eyrmr3u~{uFhoUbx zp2y$B`$u#!PL~5cem%)|vxN$<62w5Zw>DY4Q)XuAmrpSZ;zTu^a~a|pP^mtnk?2#iG@4ecYF_|dFi940`ji^J zISecMH?B)7%CjLG=sST1qx>i6ulra&=R%hlYZCWObF=v7+C8`Ovy^p?ULY~c6NpI^ zt=kZDkRjX}W$UrIJqYr61j%#ExgIqnO=z`_2hQIa#DZDr*sp=S> zZ*P00seQn2#nS4+m>0o&bGwPe_)AQ;J&H>&cUDin5feV*<27mi@B`)CiQERv+vE@LIgSD&p>3b zd5fG)NfLN5N-grB66$yB`0?sr3A4;3X!^eA_ZKnN^lS(Ewq^QJCrtpU5+?nqIH zmk!OFKYcGZNb%a$xqN&3TQSUw+c3OfA!uxxvh5S4i%4&&Sf{%yNVJr#r#d-FF0|JR z%P@gkUbQ6~!hB-|`=)!fLh=0N_7Qitf_AAPKR;Yns66ddf(zPgpPVqcSWyc{w_9~- z6!?5 zh;0rZsn4qvF_YWyG#c@0plpJ=wBmBLjF19%P)Tj0Up-A^;+&}JL>Uo4-2q_M6vZb{ zyI63Px4~+R>&8yZTG#JYQgm^HT)49ccvKEUDZ(IHSO;gU!{!!*lzDeN#R zxYMk6=3&MuGNY0dd@gK~rpm%g-V(8&6ttP1mHpYP=xW*^m$qcZg+pzzPISG_zxtBI z_17y*r@Wc)%LZAb6+AhL3yxQbjvy&+wJPI&fwTeS_xyS`!3yG9Pa)mF}^SryzdKcYNtOiSJFEW6Pfr zcALFW6q_Npd9WIBr%wqv)~R5)e06+w6I4m^wie(*`DOb9q~7U+;K?o>ls_n>PAaVh zc0S<2{|iAvoYKXI!*my4r0E6HpoiT|wD1{7>@2ffBcDFhItzJpwMak4^3D0D@JFHY zy-n6g|3;RzUdClUUwYO#2DL0Gn6f1A^-q^R!HWMI<@`U@rT=eK^fLTYw)@{M>HP=( zUj>?(>Dd|o2j#5hfYXHJ{Z!R0QCds|)9aN_g}{?9O37{~A_VO*?&CPMlX zBWEh6ll*V1OlAd-;!YK0r=3+Q>Q2Ofjfa6|;nd4MX+2G3Nd@ZE5X#l(9K#=J4^9Pw z{_&Hg0>})&`cRF;xXx_x+J%TPC-l&J9P%&2_Kb)E(ggvrGwurwX_k&6g&F!k{V%oq znvd7L;1y$sg(?I+<3^VuNo!Sg?xw5?R7G(e0VL?yMvg)VmNBYehg0q)3C3!wrdCBf zi=um=baew^1-)B8TITeQ8ZvvFd1ky)`WZ{nVCScb&sR{}Es{y1?3hwF!_IIC8!#O> z)ace0>g*gmKKFaL-$U^#s(X7#^#>O1_2UD%pCFY5-z!p|_QM}@$$c!7xL+2k#DwO9WW!p=c!uQ-M9rXX7Rl-)d958W-j5K!;LhH%TuvU|lJY~D znr|1%NEiHyY}4g7RVk_>AD#-w{>OD8JBGv5WbHE+otAQWfUtpjXEOw;9?i1oDM`(u zC05PkCdQG!G7YW=YB73!9zO7AS$`?oC_OH{ZPb-Lw*+K5S+ zZ5{2-*Hj-4pWCBW29!dXMI3`9r*+&qdnnq5iQxS30r^tiSUQ2M>}T^6VMrGnqMDmi z`3UQx_!msZ!issxLuv-=p?IWz9`v$-daOVlHdoPQ7#_Tm2>pr(UD!J5@j;ofk#e<7 z=eIk+^KgTwYh%aw&{O!zfZ-VU@5^&oYe!&d^47Kr`o-0=whA$h zhcdc>*_$&jjk}81=qmFPK@B_ zAFA7JYUXS%AZYx;V>_1)~+yXsxvTF)Yi?WW{E zVeD3||M;`plvob64h5Y5pq7W9zBa^UlvFI>5(~pkR2(WA2fig%KdE+#Rdr{JXN(t$ zDy(Z{b7C)Oc+5?X^lO5^Q9#1=1ISk>b<{v4f18!5A)~18bI$9Io}UNFijvE&;AJfu z!vp+J)}y_iA)j1g)vW%1S;{!Wr18V`oub|l5=>=NvPn$fb9p@l+uD!diuBiWWQ^Iu zH|^J7JZ|+mg)k!&@f0sQry*EJ&o*aYxfhni&Mo}55IL$sm0sh0Z{d#RhWR8c#dt*n zTqDO*&`~|ab?4(!#cQ1CP$+g_HrT`gV@8oEEE1dqL+L+Nh5KZPF?yt=0BQRXGV!H@ zj!lkDuu`HJqc$R{3jlWFCXjR_T62O)#l;t?e2FQP2v5Lj0GEwME`U$d&`_+jb|xDi zl8L-XUX?Vyq;R+UC*k`{b@I7FCjs98&d84);`0>aw*G0k(L_T$1}Wt*QBr|$NQHj+ zlztc7ZV3D;sHbRsVoDgdb~^W^oG9G zrT@dZpzteyeJAg<8}c4qU8we4iFB;$1!Wf@0Y%eRV+Wu>#Y`%|WKh1e6^hSc-X{XrxbYT)Ohe{Ln|~obT`m>@X-( zSPMdYiFKrSi3>j?<{0qdTc@MH0w2%DC413q@f|AnT#uPDY5OX)wEU8L=!0qyQd`;$ zz6qBz3&JQu70ywhUm-xbJ(=@-wO5enMnd61rNpWa?5Tm9HHxh!x6eC2*!DM5!zv`7 z<#cI3X~*cu7UI1wLxmP3cHx?_v8A&UWuN$U0;ymc+FVdxUa>Z@F{&lh;rsG7lFzdQ zG^IeaNK;BCWOD!u6Br{3JXk)5W|)K|ID$Bw0eh{zEG&+<`GmD{AsVfd6FbKIFCO&N zxH2_?2?kFQ@o5IC%gVG?}DJ`j6zjk>(8h-O2Wxt;XJ=EJ}5ghaLMR zF3?bCswLEVYSaWU$`acYs9QIH6t_Q>h;xoB`DVg;w0`{H`cL6>UtEtDKMb*A9eeqa zt(!#V^Yw+bLUMaSmiYsrq9Aq^tmJ6#_`!rvD}|=?&ef%H!!$tjg2jRE2;G-&W8&X2 z=Y>O5!;1Vr|K4y?{9y>NyU#uDvE%Z-TOo32rQZTS;qiA&V+eRfIuWZYlgLaICu4*5 z57<2EptP)&g+bYEO_Z}OmQB|(Y->%c)gx#3cG-PIW14QI78XWkZo8kKHsRKU6)or3RbCy* z8EO4SG%x?W9(W&Y7N+`FshIGduB{(dCQbb$zvYCvD~m2#1DV`qVs!tgfYb4oW2y8# zKl#~;h{M?((3Hfx@ki?PQV3!chtK!>yfh|%m(w9l?uxj3QzCA&*n@SNE0GI}`xzo( zV+mW-H!t6^nrDac#sMeW@fol`l{%H!dRM#-9x}JddB<%&AJxy%s~8O_s;gijRM_EfBjjB{t@*%15&>w~^)(wh^=c zVeirT&=u$~UA8+A_EN5pr$VP`PlxL|R^qg$tObMx7TAmTecH+j+ zj>#JqS{@6EA-~_9R}ppgFm7)f2yX{OadS_V6N0@=Z?*CjOBYyPmk{iE{NyNDl=3OL zUK3$X`u<`!Id@UCS>X;22>x=ET!>r@-iPEl>(W(*hTt)tvOptw`<(?4JPHc1!`ziyIldCMdyFHIL93+NH@qBIO8 z2@{uOlvXy%P_tEOdBngQgiOrm=Ny2p5%ypu4t?RkwWGUvdA2=4)Ln1yNtdo?wno@! zDpAdG5JBs}Z)iKPw(MN>?TTb@3y|i@A zq)|uU6W&CvLKoMW2KlKIv zt5m-7zfdmz_gG}C|1%ibe~$lm$^|gj}vrDi&h#YwNv z|2psV^$?yq)5^*3L4s|swR9L4FbxZvZ?<_}r!*Iabp9ctxF5GxYU=(y~)jfwA3?>z`-#7yNl8;*c66u53O8qpqtk z;LwnW7T)|v+4R0Wsx>Loi-}RkYM}gpMLmRmtei`Afbb8SRq>NUMQA8~@}{aJFpxxk zuN5tqs(R_Bk0m`w?}y6ik6*||R!{uP6sp9#6r7o$@5_y`S^}e#m2|k_O+RQ#n(Ink zC<9e`q1-e8Y?$FH7&ae%l(FJH3@}=*X?*!^$?$EWteZ}BoFlG-n9mZsj;?)C`Lnob z7^}^XiTfoGal=!~bhVjIBMvM~7**PgX2=?fpmLm?m|(R5g~1!ntPrc;>5cl3B7I;x zr!@e~&)g$*oKT}gu0$7%_d>lDYMKl$Ley_&eRxIfAz%adRC|vsE!UWOe6SY9eR7bM zO9H2VaIQu2aTZZGt$$<_Aat#d{Q1jSbcT*7b)7u|i%{9>kgrsvx&+^oK*HG1qvuh1 z8})9n2UwSOl^d48^nTVa-#J;o>IG~VfA zE2_%0YrcH8?4?eV*!wLoOXd-YWDF){^pIhwJ;BeWewAcXij!J{mnYL%yToDe& ztZ_M4M_ktNt%2bs=^cg*&J3+Cs#01)WM9Oy#?q_PPaPPhx9bYSz5X^ZIcWx^U!TD= zh>$QY9Fw-=ViIy|$=6PpRD~0tRHdhcK?dOPGwMzH)wXU;%dS}VX!pSmMwS%FBiF=+ zI%?_Xi=J~=75EE-Ns2ls%%ljC;+xG9JO?v`)QC=_Iz&voC;k;?ZF3388#8o?a<6N3 zqNpG9XYJyR>cIE*)IScV$#MI5;ZLt{6e*E7EDlV*P)-7f9{}iSS10M;;;3{#Cn23Y zrG<233}=frHk1)>^A5zXP=v5{@ibnZL_TxPhM@eCUL_(hcV;dovr8sZ&)Xo62qa|( zAn4M>HuSBoq>;FUGBnaWQQaz}(>-T&i=>wX1uIPity+)XSG+pg@P8aev%GnI>S|r6 zmWdGXs>Le0KDksTxmJ=)dUlj9oZu|N7qr8nqg^gM&|C%o*6(>+T)r4F-8#~Aj9I(7 zt(U<>G-|q@SnwsS zXMEHUpH)cgPhgZ$=J&DUY?A@UNrEde4N4^Pa+Jw!wJ|L%W)@-=ZEk7Gdlo<9Hz6}pHn}n88Z4bR(}wDp4m}fF4(v`) z(0k}IoP`^y20mraumb-@N@=hcc@RTXvU<-eVh|!_^E?;JX z;2oi99z=G?rREMaNjrSH?u@iYjvdT^PBf7-1v<%$aA%x4=$)Su-ZvQf^Ti~?9#s|a zmWenM6SduYcEJ#$*nV}yL3MRNUP z&TeZ4k7;WvLQHWHvauPRo=E5bwilZWm=Vs4kl~TLknFXJB9_$BV^=vSu=qy} zFsj8~mVYl&Msma(tS?0k$i{faEy#o!p_aU}L~urEk!KT>sAgz00)`-&W0>_=e$k#&Rg8J#ytw~rTYkgw(pDsE zzrIqx;KmH<^o7^2cKc-R>Mv}~m(Tc~5~+)&sjZ%r0@DUGpzqS4A9rLYU@%W<2Pm_~ zZrm*PGj|E0Q{czRMeyNJ_#GtSr?1ReXd75mI|?@XTM<;%S3oIvDFrUuWG6^^mbeGd zuBpij;(B7`-6caxn*KrwDs`&g+)D>JLqMpQ?Hv&nr~=yWgZK(oxaIn2C=cY-g@@Y=ycm9e5D zCq)8KyOzNv{lJ2->=KPcFo>vWI7LI-64m>hgbfT)5h4mcA<_3iPQ4Q(mjCrI;JG>x z{po;rQR!Kd^6a75RMCRzDox$GF%$9q4Z(fWjLGcLu+-8a_XE%-KXtTSV%nz4W7Xtm z@xq-jYQHj?q#<)q#hxJ{OIrTpLiN)RKv5J_^K1Zji-IfB^)^G%!4&ab&v8KojdlS* zafd;+9ER=M;VbQq96Bgs-KurDuMHWxm$01WLXzmDV(;cf@U5+{HKI>2rw|xD=DoEG zzZms6p+=!2hY$L~8A??Ms8dT%^HNmZFTD03l3nNce1^4U_mMR)7n@pQN zN{>o=LcesZhJ(o5%i<*|Qse9o$4g0>{KogUf=BVjYni@!;Uj_;aybF7s51fHkR265 zUHkJ>k~!I$Wq8AKWvBg^^I!{6X7q_J6lh)tEaHk91z_mrzLw~hhlKT3D@k3jjixt# zT=(jM#VDnE|Jx-Bqg^AEhsFwsqNzRfm^%aIvn~Rw_*L~ZMX1U{i+G@2ZVD7Yw_mX~ zvZoaw4oWH62Mf>Hmnot4aM5V&T9yr1UpdNyW&?>(gl7=#$@pT9<_s+iItqN- zWX!1QSL>QfAn*<9mFdp){ai_N9~n75I5=nL{mh6ff=2cW*{yX;buhk9>{Tc2P28^>WVz?6a zdG&E~d=Kk<@$&Kd))lFQ;=z&TE_b25&$|JHFA>OHzQ|ODnAwsl;Gs0%77yiT#&aG_ zgAvIT4|Q8t0!cYpUc=dp1jvSsXbllP!V{>IS_}CEhLCT9+xGr!@;a8}%?65PzKiYc zuF`zLnw(ByTy#GmNg0u=1T%9zh`ZBm9TIGppDuHBR*%zO+7qQ7G7ad7551T&-p-`> zv7UV$m%iy6)NwqBpum2ew^%{-IrT{3I=3 z;a$V4=5eXPkS-fbCB7jf%o`-#TdQ?-tyNuT{vdumlmChC6`rixO0z6)hGc^M-Kkna z=FcwtpNPLxJ{LZ52oBUiRb!Oa7o*zz^~=DjCi3I;gz}uF6Iq2I!4c=qt@XG=j%nLu zfU*;66hNrTeSS}4V(?1^BRBg3iveG4+V`AI&Waph$BN5XX6Z_7e9dEPK4{-GNS@|F z#vS$L$kz^aaEM83FAn}rL5#U;C)|OD<0(tPuKVF%)qqg=ud_jq`c^U7BzyIZk5jKewMRp zI$#;Ba1D0ZQoV(_q_+y^kWKgR_C0z|z4xN{&gbSHBZ6uk-r6$iI3mKYo2iC<`_BhM z0s)qj{_g}ycV2TpG<6+Ui)b}LPEL9X(dxhCk8EMBG?+om(ckn_8XUJ8gA$#Ae>k_kwM5BrDp69%~8 z$^U{5HvHgv^&jJhd)HA~MNM$rr6L6UBRRTUdaFPq{>YDCSt#P z`Zw}RUTYR)QK9wg6>d2gn_5xyxGuUe8 zKQ36$kRz57!j1P0ku!>A>Chh6cFF^ zmW>t@UHg%I2{o4K3fBb4Xr4>={1Tla|MC@cfKC=WFSK^)4=U_u(F26PA&%rHZ@ev#(NZp)l>kZGjdj!L2-@9P+- z)saT^Y{uong*X(lz}4@859_y`C1BTFHe}x@`!yGbnTTEVm z1+4bb$KNrIEiN2Y4_xLqYmDXjQ|vf^lp&I|z3^8Ni9)G4oTgUTBG|z^AABL-pP7rR zNXePZxhel42p-c;>(}9Z94ChUJ<^#Oo4yjruvCbcRf?9ZvN41#JHk0w$`dZ+UWW*; z3>Twt!yNoe8Ax{K>B<)`oI)N_6n%Jfx%9l=z7~IXv-Yqi(p|v>bDK6sqvmI~{r$jw z3CjOCcH678IC7sl;g?8S+^>EXQ8Ix99}-Rkd{uiH&iHQ{(?avMxrg3*3zIf7X)fWD zO9#u}utK(XR`nQy0OrpkctVLzo%|4(jkD-ur2Nl9PIq|QcX)gor)igHKppHAyjd{` z66pnDFK8TY=|69LU@?C>NJvGxoFPv-ab(UeL}V{vRpHi>{zZY;DP!?+V>ir>Ia|Z5 zNL*(VklUE*mlD@@$bjYzTG0DgOn$s4Zw>w735x@o49Ei!h#9Vs71HzC-Eql~e!)|n z$4x9k25k}OnbrtDO*0S;=o|z-zA@S>v$0&M6C@iAMORV;x14!lKl!vWG08gdk@&E8 zsQ=V>3^c?9I^yr;=T3p3p*!j~p5*q#ta^GU0*eG-O#OaqNKaG}F!}qw{?4vxsVXA> zo2DNgP5kunYD@)I#YaybkSE)EQ8baeg2nc9d$B9_+4`}+F)($QC%pNL$;}4t@V&yi zKUKzSql1zRecdRp^c$5xmi zpTY$O7#}+@K%?Tt3^YaH|Kh^oC-}Oq$%gM}8#Ke1KaJZ{ZhNeC9F)Q~Bxs>W?5@y| z1SCS^RD!FdNNB=}J2*Ny+(Y3%8PD}2V@Wh} z-Hd;#u>Z0}4fDg|*YTW>kq`gev%5)$p&mi02r><$d~_6OGsHChen)G0YuJ{xk_BIz z+Hz69a_HpxkihsfXJ!a|n@J_2Tbbsftyt-K-s(+Qu==CtM;3v6HQXr$=aiJ>P;59W zi8FG%4eLOHJ_|vjk5?Y;`d{i+ zs003(o)gch4bWDMJ0?y-sHPYdi;}m667a-p!3ihMkA{!)^Fn)7#Jz!$5MISfLE=uI zCdVt6j02w~$w^3SpJ{of&{pI4j{bBzPe6MIr2I}dq=C5Qk%y+`sgIS3yFawenQhcM zLWS=54k^y{{dYb!X1q)}_I45*MYLFg&8mT~jg9_9588CBCF6dr>>28wpPomH+xNdYeQ*W4ehXnGUklF@ z>A$!FoV3Vr3XoJgzRB>qP;G^6dNE$#tbu)aJLNma`r1M|3&ij!B8@lZcWWQ{`pXfF zhvfHa;gb4jmWn~lgB$Bx?JvspT>aj2Z}l!)xdp?C*o{A5g+(u!4-0Cjn3r$Zv#p9C z_mx|AUHUQ605a10u-9ew=Dt4InQ1u=*Hmwt)b-M4zZ`-Lt|n+u91$gS-SPqtF3gc% z#x`ZgrJT~VPjoCB#aL;xODNq5cSRkEc7rYh9@%dtR7RxWJ$UQ5A77X@o!@#TXL?R7 z5k)Gv3JMH$)>-BA?K3Ta^ZlkKOwNxTSI5V4si$H2>W`wCX(ZDOcycd6A7}_G+^B$M zd^LxZ^fdW0oU+C6SbITa6j-22`FXKFY1zg%a}d$nY0*)$DsLn$2l7&#FyWSIz2X}4 zH7ZSPr)~qdB^5u*u#r+QAg9!GCBCcBdd28p#7_0U-pCyhu3CUj~2_9iAy3FivwNguZ=XfPQHVdP~80c`*~!P%O?41UZ;^KpeaI>XO-J4n9@uQWyAil?C-8SxZM?Es1ONM!wz zI5UY@xxLE;0>A(SbTJG*6wu@y4~fV6HKtA{h}Pe3Pgm7hYDA^C;_c97sPBg41@=x~k11RP28sP;ADczPuG|NnP`pT8LBwgl; z!!l_PDgdG;nU>as2(BoD%u?d4zVx+e!8Jy%`1u=OvpASov3AOHNoRM#O^_TW7xysm zg@u&DkvPS4o;~cOcONhLI@w#FC<(z3HI(9>=!j2NYO;Y9(6+-=%4CIsnjdjK3wf_e zR#)i}1+z1Nmb3*q5kguUtLmswPg=2=CSiFnHwJz`5uMgE3`&yznmj{i(^C%fiLteP z%2)}#pTup5>)1d&?FkX!Wm(${P04qOYVFR(Oaggs$s0=)Yo)j@U@ll`D;fQ$vOYc> zeeaxx&am1mxTWECEBEOAru0BvllD-kqi4I9hYTidH!H1jD_{DWbatZ8-qg}U+)k0P1a|pX{&=8mW!K~8lW|v>@M5EE#>H~?}W!V zJz@RlNW&)0uWEeE^V_YNUz~BPmC{GT54<97D7^hZL87J%3SXQ;UD}}1*P?RDE_01? z(IQ!NUsOXwBP(>*vVjIJZJ7Su-|#nf0`6F1?@(TFtnaXAIFIQRL-x*ud?!T&iVr6C z`tQe61M5JI!&m*E{mMT`FaFVk7Vt_RJk~Es!Ny#(@;z{oD-e$ql7G88*XaookhB4T zjhR~ZWbwz_!o4MuWgNHhII9QK(iA;anjH8IrX4g)$n2(}fm{0_{`vJ}D}Z>G1uVN9Tu_5#S>xE@`=Y19-O}4HYuV;JJy9!H5Za@WTGJVD+{-Q9XJRmQVA78a?-_qp z+ED&)j${(2?W!&04nS1DCwMpQ z3J*~Bk~BnqZSzeD4_Z?=^lcXoFO4iEb-Y@w5hz5Ow zR?*G-3KfRQoYjrPpg>4i0E*hbbQ?yE8adOa8L z!W|g2^Tcyn!z)e@AxQ(hDw~#Cv{>q7`a6OYsj$r)Px+hA&E|Y>7ij za?wtq091)_?}*N}Hjeo5H*!P=E4{R-;?v7P*$C;q66L%;c_$gh?E!iCXz@@uZNBm9 z!N27plvJvQT(~~*6YVl#SV||Zv?MVhKzG`mtnm;@xF0g9@*)#4KzP^)FTNmD1x|%B zRwGtK+(JAKR`!-&NejTgzqix%hVWH84XbNH(h)lkKwV`0@>l9k9qQ(nD+NymK3$+{ zDY~zUQ;!}q)88IBoG)zDCf2@7u|GqNZwBVnuuLsH!9mxGCF5b5Cmixa(?3R$TTNOxP{Ih++yB$iU(wGLjA5bj|NW{A( zyXpDss5Kkw$D&CDvQ?y0@KE_wK75NpdK~=OzVb70thm_8D@V0U5lG#iALyh14^|=@ zW^m_#iD zjgkcXf~HNpB(q1Sg7=EpuEW(Gf|ho>qKxaSWE_j%J^SY8riB`L;dSBjbax+EBHXfJSe2R7XM^hzYFHpPM%Bda@ zF9#ZRw){Z$Erj&`Sz%xPDvigY|Al_?zsFW%`=7DZ{&W1l(@)qrdH!GeiTy9`{|Jlk zOh7R0%pSxKOhCNFyP-EmQ)LzYIT~UfnNO(x&Cu3f{BX4<+|KUI)c(`0oXTwxodjp$ zIQ~6spw02G{fs`2t5Dh3^Y;7cd8~T5N=}>}Pf?;Ip{m2Fk4K@<)r*50B%xpy= z73ARAV_AEnvca*ru+4qk)9vB=xwkQLY+oOiZu-fbw@aIi@fSms>cNgnUoVZ7zr zl1KY$zYH>8>~y5aJS;DiS=fWH^js!oKQp!e0xv3bU2Gg zfqjDtPS0HY`2$wNJ3ET`v5sjAmR{y(0@vnV_Qyz;vcI8F7k&7ifv?}G*nvi*kt)GY zpRFMjcsV-B0Lkh<%S%6E%O<>pD215MvNpW*7&Y%Q1N2swoCLa5quaG7OH1;DSN>#> zL&i4#)A}RVdwF!Ga1CIS*GC$5gPsdgSDG?ogq^H8Yv?&MXY907vXz!znkYYg+;0>z zUcLT;qbX}BQK<{#on-c*~8K`RZ*=uT;B#n1fC-v+u8d|K__rer+cI68!0Q z(6KfGd^ew3uDAItrW?H-eNS7mvi^i?+;FxSBM|s@A~PkikjN`?7eq}+8Da zfb}Dpro~92kWu1pLpUsnoTS;4LbqyWVcKlPhDhm-IGoS$t3h)Cti42411 zEf==hvy<5Kg-cZjAqK-?3I^t?2mq^+vEi0%sDjM0H0aQT8jCPh+4^poPrlI3d0*YQ zx|)c}+C*W7t772hW;U7yhkUUK`==|9AL4YBb$os`MXoe+W zcFd4uz(Kn_o7iYlN~wnBJVc=~o6y&u8iU(DqtjS-*5V51VIWz zC3X6btg$Gm8zTP=Lf1ovZA#llj2Wn+gG0I|YEcqPkf;b#mnItbfncFP?a^51+avV! zLACu5?>rExGa4B`%6wapHaSJv6zON`EEhIg4nfAgY9~o*+(HCy)59@)&acJ4!AyR1 z+3?p`y4@|@u?I_syS8XKI>{!=@u%vRmcx6iY44a=eTh$|`Taiq19B7Z4(?Q@fTWeJ z<{)RO(1t3-oVDt^W6f`p;G?=<2?Q$>U>|Jp^H<3Lx2e;)&z3)~?fqsUxg0rctOfdl z+9!6#qGj}|`+{glG()I~ZUK%fFO^|Ezp*B=yxM>0@3QWBVM5eWBmlrTl75F*>LwWf zjF@kwi}x1u;wDP5R$SKj^_XFy3IOHVgG9IZ5AI%DmOS*LV=x|J_zpZwP;^NiEavr> ze33-xvc!*a(u=mFd50F0y0BBoUCijc7qm)3y09@vVJ!ek)9P|$k9m~ny4&J^`HPNn zCynrA_iwvyj2?ds!kq%9F~Y$y)np-0YyQ_-5v z>~wvN&GFdWO=edUD(st@XMkFd*T2|o68%1cE@T#Z@{P7-i$tw=WOH_V1))(0wike! zNoz(0qkM~};##m_Fp~4#9rzOv$A0n9lj|tFan>GtjS-Dro#V9HY_j!IHhHsAO5)w= zT&$E@GZI*05aJ^MIcg+a>TpC^>tfxDH353bpz^L(?$q{TY=|;grwVq3$3Wkofpyhi zpKrVEwXh&TZ;K}mL%%NWtxK%|1)wJIYey-aRMI|!hzmyJ?1o<VGuaJm zBw&26am`nL8w4qMjReFx1JQI~h>C{_ZP9^)J74U7XC%OS~X&cP}I1-i*WbBU?;q@Z_1koOMo{y?M5ff!ur6h=sJ z(_EOb$6ZY9O6E+u?!82mkFU(Q=ofIfLo#ArvR0r%$MV5Td#2`+YsgsC=z73KrtZc; zvVNABep7|SwSh-{|HPmk&uL-GgC(!){qpT8l-xNH;liyKiH%DvhICR!AgwEYG4d{F7lB9o%bSh6g>XGUq7Vb9teCqyhdn^`dRe{N+2`~BS5D3p8 zsb>sK>uh0ywFNtDHV>?I0393)W{HRjgrglB*-+U|%iXeFS9h2{P(vsZtkjzVEa^BM{%CzC zy{y)Fdle;LH6rLOJ2@h;q%%*XRQQ)@9A#yz;7GV)wAjxgi|>*@oieu!4{MH?c*6-6 z=>YMj-S_gU!l%pR8+$iOTXpd-?O4_Qp5Fn(s>QzwvVCi+YBuB6vW3av)Y@UCdNa(Qs!{O~Gw5 zCiqQ*?KE|gE?<%ql9s$KmTSI4^hYu!!eyqhI(<{5!UvJ(HR*&3e_d!PMdXokCX0La zMWe#pP_zG|_e`$W@7$-z);}yILJiT1u=~(({?bUNQ|%)Zlm*?Ck^7~TW386iQja4+E5+I&{v$A)aZiIETXTe_VZ)h`LVq|x@oJ+vUB-5G8EEG z0d#1h>&<3)wPsjyw1nUkI|>=7C`|VF1!Ryp;P}A^>)_NxU8bRj`i^GA^kdkUxe<=|i zRun7(rs1SLAjn!}I;ZxQ*U0;Qnwq_hzeRSK%axL1vbzGPdN4EeD3j3Xu$`-&m?lN1 zDkD^BZ>>DqozbjK8{Zgy$*{e?n0>hMn=M_U69aCD0#zlTGj}ogFgy9|R#A6JjVZ1? z{Pb3_>&sL$r@OtYx@_Qv_>@ud3Y&W2HOlQ}MEj$;vQ+N1)I(xDPsnxeT&Ib0Mw(=r zt%Qx?V9wm0`1sG2apKLPl^<{JvVLM*80aw53p%$^SV-vANC@kp29M za$dl}m1C%6nNVC@Tz7h$g=^HKqmWSe>;0&q!Hk-KP_7ZHlI}807WwqPY92wifm#Y_ zMA*N>4Qa99vKLVqYD(3Fl2eRdLr;;8C)yJ-KWodhr6GQ&Wx)oIR~~x=>|tNT>qLs* zHW=hQ`s~+1jXGl>j^0tD1!t?WfgwYlpa;)Di$!sAB&K;PlOZEg8}+kN#1l}n zwDu5t<7J-mB4qE%`}Q;Mk?XP|p}1B`m7y%cr)K&ReG!m$-OhviBdO1d%nrF)>+1CV zS>l0^E8mT^UzC>V?2x59aDFj_k*=G_wfV7Yv7Sgr$vkOo$%B0qXBOFh>4bkRMHn*< z)(2T>*!ycDEcl6nf!3F6zd@CR=~_Vm{5G(twkV(;mjn}%)dy3lYUIg#fF!JOzfzbv zd9M)&J(6~_v-|U^#A{+Vd>!3S06kTehU?Z>AaGvkj@k{${;V(E<+wZ*!7IA|528LW z_`>!Nl(qGdz*9qC>O8xc^)p%57St{0dt-QDaxTizAoi(&EkgK12-!BTVFkX9jY4JQ zb3ybm7%Iv$Gr9)`K?wOjS>{a18;_!p|Y$+1jXdfq_7Ni5aKpTO*N%2QT^M;7{8{C=bqcm zZ?`4-t7C-~IJJd&d9oE%HBG zz5jniw*S?M|4-Q9|2h8O?yo#7od3uD|Ayu!7rOtIeu1HHf}PunPcwJm*JoBj=cAsyazEv-ChC~3dI4ce4s6SVZAE{hgT@g5>z-Sq;{bF8 zPF}(f3S37Wwfz{1vVrP_Ld6l2E1CGl$|%v?<+XU9u`@X~8mgoTsI<$zvo4zm>L?V%diiiE9ymA2}=*ZH;xvZ zN|}PdjQk#TxpX3KQ>^I&uQQlR5AZ1WIy7oCLCT)Mv(M zax^G%koe*9>d#MyOjX1eVyL1MhkHclvm;0Pp;IQU;wU3S_x{6gonnZ4jGY#ny%qdo zdKptXuZ;>V38p#h6cTh56%5g!LUUMfjuh^hgRM4eM58Yr!qzH35q(~Vx%`c9ZY=F+ zP6WqwzETn0+|UF@QeBw#O;=?yXq3LD``@Q%gz;D4D6rEb2yG4JfZvUy2^C z6yBv}&xZ1%sY0ld91CPP=o@FgTvO!HFLzAkV))6ef8|>XgKbzMyiZDsy+}bYk75r+ z4k2|8b;f<@m3`lH#d)Q@yKzmK(E^}G!kKBa0(bb1S4%vZSQBuoaYMnhsTm zUT6kyu1Ky`j_O{%?suJzspQglK3oDFPmtal{m{>(Zf9uIB2N%dsV#+Ui-Ff~H_T}C z6^k~UB2W|5&y{NSP&{&oCJ;YTBV93L)iLBFwr2lr-mn+LJam0Feu5S~{%w>dBfY~S z*Q7S9x@JOI1BkX_g zh>R7FktMNH=VH?9kv@rAR%uPvLGbCj+1K_Ysryr?5|lZ(zESuPPS-N{A2={9P_P9p zrWv3LWLn(E$<|Wbk{e8kSmr}F=cN|VDBKthsW#d^D^)f`03N&?d5R~Bp{6c z*cVhDr!J$O8T;HANJ4M*6?5C}q8PbC-oEVq$~y1a@c(+-&Yc=)8M%u4T=xg)`K|ij z9bIo-IWo5Z@eH|bWEecugKTls4B`m4tJEdack;8l==*7TU$awAJT}K@e>aP#XQa^d z2DjF#hF=s+1(qW&8Is>5V4m4!lw1tKLmjVuZ(aSnT)q4b!kMAcqIlb>;Uzxk9?EYf z%nD~V|CRJ>XtNB0OR&crf+B2!@|*EXDJ1Btm$c;K3v-&=|n+Nhn1)tLlY<$d0lfa0Gwds^I! zH;+H>)(<;0XV`WKbDqB7&b@O6*!-g8Ts zlbyiVm06N=uU?FdV~Rqb;28D7`H^KkIL=E3PqP`1yiIo`8+;SP$pC8*%g2~19!mJ% zK2+-`jK7XL%{s$#NJEOjRMlrL4jJD8y77IjYdTD*^8vk-+fGp=k3F_bXEGoRKVO9)Ewe6in9JyOae_y z^}{^&TU-Z$oIe)>sMR$gh10dUFRas*Q98vbn*T^)FplL!1aq%Z{FN>;o?bS3J*sYZ zXlc-;=^;JcNh)?TDAV4ym5xbCcJ{&Re0ohUp|dTyAds=@l3Ghb_U0 zn@D_S{PHUA&bwc$*8$&=4Y*rqg>)^$45>Y~ZA0B$j9SDn78XY-5EZFSQ}m&FJ7FQ# z-5o#dUwr{}+iEP}>|9AdsNkXXS$BSp_Do{Kp4W{F=PE_~e36cD#63LQ?=!xWF@@Nz zn*|>Q=uX2tROx`K)i^T%8F&EI-mr7IYFZsP7 z@DW&y)F6x5F{rv{%*et?lpDSg43i!~VGPZ708#RUsc|#0Lm*>kO4U<=?CE&mV8E|; zq(uVFwa!<;;Y$33Rdp-)K&Ji9P&UTVT6yzUJ}#!|8GAkyd10I^RF+KCNZqkS4b_1k z0gl-zkOpjBqYlmfV`T$-agV}u_m zo{}!0Utmk_kHa))J9|Gyh9dvONS_-;aKx;Kc#@1541;i?a9tkfS$?{%S+-Dp99^S4xw0B^T^sh!*KCazIk3wG@#+h?Ps;9M_dYl{p1B5tjb ze8hH3tE0;)QFm&rNED>@2Q%;ZV8TX(OtZcie63q{2Rr7QCo zzp5L>8Koz4MOJl!h1@i!0>+gC!#9MYNIPv9)xSjZYeMr(n-{0+zw0FHzgQ_yrEMbU zwZupZ>vwDCdSbz2^lMTPUsXcnnd((p3~_^+!WI?6w%HE6T$p#u0qiVl*3ga103x_9FPUDGG zXO`It4t4bH?|MeeAx=;#NKoS!g_9jsdYigmcSEvP8%(Qd!pGP(Z+^anu)PLR)o%YF zo85`@&nXkg{OC7cH~;z>whqgLHT**H6TljaAZD0d=}yGaQ#YBBi5h&cxa@hUyjrv- zvehUzbp!E^W`?FsrbKh@ByrwWG!3zLh2G9U-m~=KG2Sx-PrVLxSW+|!DJl~@22uN& z<7qAeza!G>bIH(W@en#0o`io-wNnls8XZFU&|?OYM-GFZvvj5R&h7qRt(|pH9ZQt| zfk1GV0KqjtunSyVgF81k7YOd|?yeVi2<`-T2*KSw1c%@*0Rns9+p68)%llPrZPoUl z-#OiNdS+^-`*io`yhA;|vI}w;tbTcLx1ZH@47J!gR3rf`kQ0EE3qI&+4%wxdx(wOE zpe>WA5U6S(#BS_ZTix-t(z2RL+~u{xY8#>jgT}M_IhK6qD~Ea%bV9Dg z5wsNBvs2lqAV@r9ZFNRs_%a&XpUtaenFeL z_yoKyfu-+n=pxx3v@7KI0tTcS4lQQc48C1lkCz*WDNu0z&N%k+Edhla4pYwSdH?q` zK0}!dyp{BBr4GGTexe#^qm^MTzUjg#0I$WTR+44TX1KWaD~JTA>LR#NYRjmvO}=Cv ziE|`xNV1>>s2Vs}_$WEMDW#tkW;R`~YMVU=rl}|_0IHO?j`j@Oof2bLz5tdNbUnwo zU+ZGG!=cvn1kIBTuoM^S8~0=)+vJ68RvZ{ z?nE$qA?B+IVt4T?Lu4Q>D;M|FMwet|A7c%-3-+M>FRGQjlOcTt^USgJRh&q3n2%Wq z77!#-!~mV>M#11z3u!tL+^Hto_OE&^UF``zy=!)!?{Q#yd*?Ef=SS1O8BOOfNDN<6 zp6$sgnA~=2=>b1)EH6BLcn!%<IMr`u4#3+g#$%*G(w0zcp3 zi>4<(ANfz~&t0wWU9sumyEvu!sDI8rFC+fN1rDp3l<>V6-u$)R#UXaj@UFN6ZnlMe z^9k)0zg0qLgR0!N#y5Q1C^kFp*0sW~t2Kd0tePH+ESTK+n!KCFfk{kT*vu;aMJykFW_ z=c{?rn?@od{|+?T8}a zteLj^LH}~U8FVXGCmMsM15gko#7 zc(ES;wzjM5RB|R45_T|keBK#euF3WBx?R?=+y7u_+?#hxu{e!e)0?VB7nRqF#0bXn7WgpaipoWRG)B$gp!bz{@o7dcsYG{ zht`RtU0ANo8-7Qjj`q&u;nWiarDx9N>z%k!Zoyv){5>xf3*=7mEbe+Q+;?tyju^Db zO4NWUK55bd1Dr@>HDizrdA=dUE8S^FMM8ET@SBC+B8!>km!uKxl;GN#{UL9{XuieC4N4*^pHLSBy2O-;4>%jWi?uP^d=TE=Z|k( zIdoY1yj%59aireiGL?1S7bH%)tbOm1F-v}1t92YUneLP4V6UNJr&n**C**ae#vNG|C2y)J{nJdknEJCCW6Npp>&!KF^}$djHn>si4#OZ_ zyOd*DEy;cQ(d7H*U#w3hSM+{0SszF9UQKGoV*aqC)wSy#SHk>iiGdJ~zV_sNNGE$W5UiTbsPde|Ig#|9=V zmR;)GPLBT*2KH4z@C*LM#m(izjrCy2xvXg}4_+&bSJdh0yR63Bhg0)}2@}DNPx5zg za7n(Slc#Yxx$wH^W~!T>1v4Nc$=*#(70~1G8A&T2|(L{IdJa;iF%d0E-h^Q<*W1F+84K zIwbdnwwOc2YUQNBV8?}-8d)VN0fp@{q4UVvp?-}7le#fN5yp2G$UzN7jEc=?z@aQS zz)_1YMfMFVt)ia{^jmr``}%3`Gl@xy_(ADuHKhtTa2tLL7Qr!hPk1jruZ}uxKEFVT zgq>}kvNXWT-i3yrfmJaG;8?yssoE{x?N91m&~vh%jw3Ynnf>fE_UVsSWUy)*91H%2 zgw0pa5|v7L-}x{<&hP3BWtD8*Fn26?&cd*=tn9inuV7OOf2mdIu0I=!L7y>B4$nM8 zh64kPnP0bK!YCs6bP8=DCYDJjN%jRFV}$mUeLSBjPauLoT+_Wp7RcqAg2wupfKr?2 zYJn(Q)9xBhraR0apV9UMQr`iOTK^MR>4Rt7Vq>%WFOeyr66H)PL}NXc*QVQ7-5X^( zc*#g&dlDWDIn*Zl%y}P8&hnUTm?kn7uhiYA-xq(=unLkaCLV)0RK)9h+3J&*h*% zj$t55+B%Ub18AqHfvT|n2!WO3UwneSI3t(+3-{_x*)101aA>n=hC!>sl=AMYg;Iwm zufOz~?k#^sKLSy4`5Ud+L(pJivg&aWY|6~;(xag?8M@OQNh5tqPy&M zc{;OdYfO|FW9Y@D!3p@^geK$Gf~nIuERf$gkP7k^&LSu#1i5)PQEku!G3pU(nNqQ7 zN=<5rp0dMBN>UwptQ~-79P6#VIh311O&{g<(V-;?mu_;Cw!$hg8&hblHWeP@?2 zXY1s>vvJqRjn2;A-cZ8|V!9)&lrW1%W(6NC&bKoPkvo`}$N1wOoyZl8x$MuSrP z9BUB!mrZMi?}Rag+p@_(OFp#sq!?+?BwK!1@%1c)2+P^I(>(^C#!@Veq6@lEv=^}K z5QRGSjJ&kt2X$I2mk@Wz^ri!0w2DTf>EP=4&wioBN~^_gV-0@B{hlL=rEw%i#kZeN zfEVPnMcg0qD1-FYJpq<7S0Zzpx!T1Y3Ara0;^I+z-i4#sZJNWkIa>7xuD zYc!ESZNPX3SdhGuNm{iA0$_o&58UIopMK|z^(2EhT?7G5T^}+6d(YyB?mTfGZ21AZ zgr|vKXQvQOEz(!^;)&Y+|u-a^T9fvv4F<0{=_~ z4oO7x?nXd-pi3{>!r&(E%AN6obr&>D{Wkt+cgXtb{OQ;qJ-fCkp(gP7L)qsC2?muw zaiK-GLecATYA1#Y_VkZrLp<@tBDB3GjRty?HqqCO(s1zPjq|c^OLNN8;_8_UPA{=r z4j{uz$=YY}KceG@Pb9C{KA^ZpI~NFFsWQknCX1n7HP4}}9qpFu+Vx$Eftjtm44H8( z2_K}bhzy2HB)Vbg3?AHyCIg{9C_fKWKHAgTIe(%TH!jR)laln)Rp7wSFag~*~w7_n2mxa zZ_^maLNf8O(7k1Gx9wu4)uH+`l2RGhB6}VLd&+@JLSN6BAAc>Dq*rooPfZqv=wy9kyt4O4nC46_C>B!g&KD+84LivI^=8 zvW_tv`YG{#&Alp5a#Es7x#<~er38o_JbpC`JRRP+gsGo9#Wlb@yg<(ZXU2UPEiBlA zy{NTiZEF7pxBF5n;$;_apfc#nz}|Vt9frv?&FM=6v={GWkR@?iDp31vu> zVP4}LN^ks_N@go&(Rr*hCt~%@W?3A8?{4!nmI3dl$HzyLe}OXK=298mh2?X1Lhi*SQo9MS?}7OoS@P z-+3i9C5- zDaZ#{8Hx6HNg*TCxFj=m6~KQ61>icCBFs8F=ftZytet*+`F&entu@M{)EQ4bt~~*t z=NAjb_qR|gTB4I;n0`#c5B!NSi3Hd7oqA}cR~tQOx~u`5u!K7(BBcPMH!G^6*ckHK z=-^hKSIUP6$D0LcXOZrG7Ds6U0M6^0&Oy{ny-#jH^LunB8Am)wpWmh7RA-AKMc4KRsBIIEq7G-DVx0=o=+@9p^$+Xu> zZ76|&zC46dsd>$ZRtVf8!ROK`gkRrp+?72ubz@zp?fZOlC%ovx!^aoH$6^pn(;f;j z^I0?Spj-(0k$e^Gg36Q*tXM5MIvF3&>KEreij)s^eOtAjNG-0Y#W`NOLKTcrteW?X z$+QSFv(_fp{D|nQYR4%#zd*@}zkYxf|LLl~-x^@`CQ-+*`2F)&24@|SL4o`BZXc1* zgrg4?Dvd*0vnM@yWc`u9&MS|V;lAl{F@@UJ#eBJpcOkiSVSK**vFx9GOjyQDYbBRm zX;8U*k~nn91yZw->mCiF?6RdZI)Gc2-XC-Ll(T|94~Y$tgr7ORzJ3a3KCNCYeGbm2 z8?PlR_`xiY;Eh)5_h>xjqpRaAm7wruOj6vX)@FZOtUQa4zT7GHAR%t%Kske~>?H_u zw=@e$cx3T)CsP&uHK2<1fwA`ZAfbp(Rq>)KznbWo+X5>cHUgLG)1P)?x2>HOx{TtZc65Hp~ykepx|i^s~#lS7yI zZRZye4cgI7j`>k*-a8<2hPrn{F@MXNR&l|rT`5%mj0R`*-yOfZV@1@*q*^60O{QO9 zD@=8DOl*yvoE=RJZ2pQcKqvJmfd4zz8Q_1%I{VxFe~K#rIJp18I@4KmgyuKvn*6vi zb5M)@#NzLiT6l3i#wmD8qU5#xHY1-Ih;xvj3KCY*zkZ*BBQacuXlpGaO&1`7-Phc{ z^xGBLr^TCk$t38dPk8*K-D&uJ^YP_g48fS(Xit!7YGUGgeYN>g!%$mYn~&G8!Azx8 zJ0Ss|W+ZUy`MK=^o*&CdaoQWTRG!4G9}F20Hk?K1m<#1g__1E-RIbSzLLwx|J@!GV zhKpVppby7zEaS3rx*IE+xa}C-sC3G2q-^r0VR(q)1mVn(Kr=!3+#nBE7r4Dc8yqw# z4z0k8gT3Oh(fpA!EuY>l^sSzk+tsXHxVKx%I0*qrES2;W7ea0~u3b6PsCcEpCK}pB zKY0UI!v$Rh7dIZJ-zG`?iEvS;NB-o9(T{u99 z+D8nJmyg$L9o20XE721UCeh0Vm9RDg*8`TX7R4Tx`p<$c=eWX06XzMWTa>YA3-C_G zzK6~wlepn6QxQ`Pi8Nb`7S(cEUZ84Ep;0)@x)a|7$bBY}p(~Uf*rc0@wSPKe8AVN5 zym@cCp82k1|I`4nrFCn>GgHN}*EEgL*(>eTQN}{~eL1qAQm|uf+Ir*r3c6!~qdVNg zdFeyA=AMHSl{qH&OumQXRjhDDM5^gffBz@&55-~LnrJn9Tw_ieXGm$Q$W}tAm#A-| z3@4_M`5TV!Q>E*)=5`P0F-&mIkU4Y#bBX-;NJLQ<&WX2pQwz!Fc?s6ZpCeGQ0{lx= zDFz&A18FDum@cbD_gB{HSMwQ(zmMU%`b@I;S~<+zxw%PjF}xV&*8JESEN|)8eQx~Z z$5L0`>jla!6_gcQF5X3dw8%~Q(Tro$p~JaoqSjGJGTn-BhRB<- zome1~LakjZF>zf;QgWAAEX0(OsD8fS)dN>fWk_O?qpAK*-S+5PF~-6csp_qJHi)YkFU+?Feg#xA;sG8!y6 z?eT;4>A@AA$h2TH>zrhKtFzVWG>+lh>73yeiyj3!8Utmz+cz*u)L;>*E(E&yB={RV;ha;v;3a5yjoPa zZN@Rn;l+^MkrZ8=F};cGL_3of%h4sMYJxxlZ}>T22|Jz&Km3X$iJBsnJ;#PEq;%g_ z`^$0Lvvw8+iOeqM(@E~ER=l)MVKo)^RW^II`HKj7(uxx~#cF@9 z9z~bH?$W360T)oc>a}31@9^tv0Y2JALa6Fc%SR`cBZfrS+q9&6s_BXA#sO$g9liv9 z0#bR@P{q#yC#Dk|uI)Y>;<)0y8~CNd_!{?UIC#4xTSi&DL1OMMil(*HC}v|u7{ZoY zJIQ|ciQh3!P*g@DpUbT?ibVaF6-}s{gkJt&hv;Otc_h#VuscQluC=xOQQU?()2A7t z3R=h1#;6MRQxlbpCVyAJh16e#DFv-E8LEZ z3M&@{zW%iZEiCWq2RU%k4hFA2I0=u)>>3VOvs&HH++c2``Fwsb=;XSneBZ`bOF0j( z@bzb8=0PdU+cS?TF+p#xr>zrjrp&xan!zyrC>$kl_ZGqM2vg0A3X8`b2CEI`bGDvA z4>(5-`OrYGdI3Vqq!cg+ojDc1H+CUn494?F=M)j;U*H1*E%{3iA@kN@SqVWt*_F0}= z2~?pQ5s!CbXSZ7l7BlCQPV*9(#5y9d6DWrQnUUFJ;g>Ldd2)cPM|syctJ=_ z+8Sa^vC)DyK^7}^3SgN^YaF3XnzJl=-J^>|oh|;Y(c#NOyNW=)j0Fw%1js*ZuBEhU zbHyrifV{il#58WYCHe=QAt6CyLsG5?W7*=s#l{1*M*GsXT%%MAH7qiw`IpTh_0kjs zDD*4FvSBK>nfPge;o+jQ!+&MD(0M3lOHLSm3&bHwI(ZTlxSjuI#L0}AS=O=;{6>K{ z?%8SBNku2K>e@0J1#Ua`M;XKii#dXm)jB2t7d<1e zO)e&6#EJ~Q1-fB_bfCz{hn`TWd()w8n(f(pEO;X}+&lo~^(Jf)HA`b#QPvLCwNwX& zXhXazH0Bu7ADN0O?&D*r7ebRB)C>*rpay7e0|%4($HZP6Mhhk9zKdF&^60+R(V?`| z5A$6>hjFW(Yg!yS2b{micT40pLbq`>#R)k{L79VYVxNYCmT2WzchBTt0u=@o;hc z*&aIp!272!>;O)7DD>(d{;>nud7-Oqe`p-+f7S)CadQ7#=3~ znUf8`^Z(paXGa4IYZFHl0Ra@&j~1TLoaEdntROo(XA0=Upa7u=386SS8#p@u{Wfs| NxS^M6X(f~-{{zw*HXi^0 literal 0 HcmV?d00001 diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/epc.json b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/epc.json new file mode 100644 index 000000000..5ac1c41ad --- /dev/null +++ b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_217091901/epc.json @@ -0,0 +1,384 @@ +{ + "uprn": 217091901, + "roofs": [ + { + "description": "Flat, no insulation", + "energy_efficiency_rating": 1, + "environmental_efficiency_rating": 1 + } + ], + "walls": [ + { + "description": "Solid brick, as built, no insulation (assumed)", + "energy_efficiency_rating": 2, + "environmental_efficiency_rating": 2 + } + ], + "floors": [ + { + "description": "(another dwelling below)", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + } + ], + "status": "entered", + "tenure": 3, + "window": { + "description": "Single glazed", + "energy_efficiency_rating": 1, + "environmental_efficiency_rating": 1 + }, + "lighting": { + "description": "Good lighting efficiency", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + }, + "postcode": "W11 1EP", + "hot_water": { + "description": "From main system", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + }, + "post_town": "LONDON", + "built_form": "NR", + "created_at": "2026-05-16 15:45:17", + "door_count": 0, + "region_code": 17, + "report_type": 2, + "sap_heating": { + "number_baths": 1, + "cylinder_size": 1, + "shower_outlets": [ + { + "shower_wwhrs": 1, + "shower_outlet_type": 1 + } + ], + "number_baths_wwhrs": 0, + "water_heating_code": 901, + "water_heating_fuel": 26, + "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": 2107, + "main_heating_category": 2, + "main_heating_fraction": 1, + "central_heating_pump_age": 0, + "main_heating_data_source": 1, + "main_heating_index_number": 18658 + } + ], + "immersion_heating_type": "NA", + "has_fixed_air_conditioning": "false" + }, + "sap_version": 10.2, + "sap_windows": [ + { + "pvc_frame": "true", + "orientation": 5, + "window_type": 1, + "glazing_type": 5, + "window_width": 1.2, + "window_height": 1.8, + "draught_proofed": "false", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 5, + "window_type": 1, + "glazing_type": 5, + "window_width": 1.2, + "window_height": 1.8, + "draught_proofed": "false", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 9, + "window_type": 2, + "glazing_type": 5, + "window_width": 0.5, + "window_height": 0.5, + "draught_proofed": "false", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 9, + "window_type": 2, + "glazing_type": 5, + "window_width": 0.7, + "window_height": 0.5, + "draught_proofed": "false", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 1, + "window_type": 1, + "glazing_type": 5, + "window_width": 1.2, + "window_height": 1.8, + "draught_proofed": "false", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 1, + "window_type": 1, + "glazing_type": 5, + "window_width": 1.1, + "window_height": 1.4, + "draught_proofed": "false", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + } + ], + "schema_type": "RdSAP-Schema-21.0.1", + "uprn_source": "Energy Assessor", + "country_code": "ENG", + "main_heating": [ + { + "description": "Boiler and radiators, mains gas", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "air_tightness": { + "description": "(not tested)", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + }, + "dwelling_type": "Top-floor flat", + "language_code": 1, + "pressure_test": 4, + "property_type": 2, + "address_line_1": "Second Floor Flat", + "address_line_2": "216 Westbourne Park Road", + "assessment_type": "RdSAP", + "completion_date": "2026-05-16", + "inspection_date": "2026-05-16", + "extensions_count": 0, + "measurement_type": 1, + "sap_flat_details": { + "level": 3, + "top_storey": "Y", + "storey_count": 3, + "flat_location": 2, + "heat_loss_corridor": 0 + }, + "total_floor_area": 63, + "transaction_type": 8, + "conservatory_type": 1, + "has_draught_lobby": "true", + "heated_room_count": 3, + "registration_date": "2026-05-16", + "sap_energy_source": { + "mains_gas": "Y", + "meter_type": 2, + "pv_connection": 0, + "photovoltaic_supply": { + "none_or_no_details": { + "percent_roof_area": 0 + } + }, + "wind_turbines_count": 0, + "gas_smart_meter_present": "true", + "is_dwelling_export_capable": "false", + "wind_turbines_terrain_type": 2, + "electricity_smart_meter_present": "true" + }, + "secondary_heating": { + "description": "None", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + }, + "sap_building_parts": [ + { + "identifier": "Main Dwelling", + "wall_dry_lined": "N", + "wall_thickness": 280, + "floor_heat_loss": 6, + "roof_construction": 1, + "wall_construction": 3, + "building_part_number": 1, + "sap_floor_dimensions": [ + { + "floor": 0, + "room_height": { + "value": 2.85, + "quantity": "metres" + }, + "total_floor_area": { + "value": 63.29, + "quantity": "square metres" + }, + "party_wall_length": { + "value": 22.8, + "quantity": "metres" + }, + "heat_loss_perimeter": { + "value": 14, + "quantity": "metres" + } + } + ], + "wall_insulation_type": 4, + "construction_age_band": "A", + "party_wall_construction": 0, + "wall_thickness_measured": "Y", + "roof_insulation_location": 6, + "wall_insulation_thickness": "NI", + "flat_roof_insulation_thickness": "AB" + } + ], + "solar_water_heating": "N", + "habitable_room_count": 3, + "heating_cost_current": { + "value": 967, + "currency": "GBP" + }, + "insulated_door_count": 0, + "co2_emissions_current": 2.8, + "energy_rating_average": 60, + "energy_rating_current": 62, + "lighting_cost_current": { + "value": 43, + "currency": "GBP" + }, + "main_heating_controls": [ + { + "description": "Programmer, TRVs and bypass", + "energy_efficiency_rating": 3, + "environmental_efficiency_rating": 3 + } + ], + "blocked_chimneys_count": 1, + "has_hot_water_cylinder": "false", + "heating_cost_potential": { + "value": 330, + "currency": "GBP" + }, + "hot_water_cost_current": { + "value": 167, + "currency": "GBP" + }, + "mechanical_ventilation": 0, + "percent_draughtproofed": 0, + "suggested_improvements": [ + { + "sequence": 1, + "typical_saving": { + "value": 411, + "currency": "GBP" + }, + "indicative_cost": "\u00a3900 - \u00a31,200", + "improvement_type": "A2", + "improvement_details": { + "improvement_number": 45 + }, + "improvement_category": 5, + "energy_performance_rating": 74, + "environmental_impact_rating": 76 + }, + { + "sequence": 2, + "typical_saving": { + "value": 129, + "currency": "GBP" + }, + "indicative_cost": "\u00a37,500 - \u00a311,000", + "improvement_type": "Q", + "improvement_details": { + "improvement_number": 7 + }, + "improvement_category": 5, + "energy_performance_rating": 78, + "environmental_impact_rating": 81 + }, + { + "sequence": 3, + "typical_saving": { + "value": 18, + "currency": "GBP" + }, + "indicative_cost": "\u00a3150 - \u00a3250", + "improvement_type": "D", + "improvement_details": { + "improvement_number": 10 + }, + "improvement_category": 5, + "energy_performance_rating": 79, + "environmental_impact_rating": 82 + }, + { + "sequence": 4, + "typical_saving": { + "value": 78, + "currency": "GBP" + }, + "indicative_cost": "\u00a34,500 - \u00a36,000", + "improvement_type": "O", + "improvement_details": { + "improvement_number": 8 + }, + "improvement_category": 5, + "energy_performance_rating": 81, + "environmental_impact_rating": 85 + } + ], + "co2_emissions_potential": 1.0, + "energy_rating_potential": 81, + "lighting_cost_potential": { + "value": 45, + "currency": "GBP" + }, + "schema_version_original": "21.0.1", + "hot_water_cost_potential": { + "value": 167, + "currency": "GBP" + }, + "renewable_heat_incentive": { + "water_heating": 2022.69, + "space_heating_existing_dwelling": 9246.82 + }, + "draughtproofed_door_count": 0, + "energy_consumption_current": 245, + "has_fixed_air_conditioning": "false", + "multiple_glazed_proportion": 0, + "calculation_software_version": "5.02r0344", + "energy_consumption_potential": 90, + "environmental_impact_current": 59, + "cfl_fixed_lighting_bulbs_count": 2, + "current_energy_efficiency_band": "D", + "environmental_impact_potential": 85, + "led_fixed_lighting_bulbs_count": 9, + "has_heated_separate_conservatory": "false", + "potential_energy_efficiency_band": "B", + "co2_emissions_current_per_floor_area": 45, + "incandescent_fixed_lighting_bulbs_count": 0 +} \ No newline at end of file diff --git a/scripts/hyde/build_217091901.py b/scripts/hyde/build_217091901.py new file mode 100644 index 000000000..f487d973c --- /dev/null +++ b/scripts/hyde/build_217091901.py @@ -0,0 +1,287 @@ +"""Elmhurst build for UPRN 217091901 (RdSAP-21.0.1, TOP-FLOOR FLAT, band A, +SOLID BRICK 280 mm UNINSULATED, FLAT ROOF no insulation (As Built), floor over +ANOTHER DWELLING below (zero loss), mains-gas COMBI (PCDB 18658), 6 DG windows +~8.62 m², no doors, TFA 63. Lodged SAP 62; engine 60.82 (Δ −1.18, PE +8.7). + +Per-cert worksheet validation. The roof dominates loss (145.6 W/K at flat-default +U 2.30); this build confirms the accredited uninsulated flat-roof + solid-brick +wall U against the engine. Run: + DISPLAY=:99 python scripts/hyde/build_217091901.py +""" +from __future__ import annotations +import sys +from pathlib import Path +import elmhurst_lib as E + +DIM = "TabContainer_TabPanelMain_WebUserControlDimensionsMain_" +WALL = ("TabContainer_TabPanelMain_InnerTabContainerMain_" + "TabPanelExternalWallMain_WebUserControlWallMain_") +ROOF = "TabContainer_TabPanelMain_WebUserControlRoofMain_" +FLOOR = "TabContainer_TabPanelMain_WebUserControlFloorsMain_" +WP = "TabContainer_TabPanelWindowsPanel_" +DP = "TabContainer_TabPanelDoorsPanel_" +VP = "TabContainer_TabPanelVentilationPanel_" +APT = "TabContainer_TabPanelAirPressureTest_" +LP = "TabContainer_TabPanelLighting_" +MV = "TabContainer_TabPanelMechVent_" +WH = "TabContainer_TabPanelWaterHeating_" +MH1B = "TabContainer_TabPanelMainHeating1_WebUserControlMainHeating1_" +_SAMPLE_DIR = (Path(__file__).parent.parent.parent + / "backend/epc_api/json_samples/real_life_examples" + / "RdSAP-Schema-21.0.1/uprn_217091901") + + +def _pick(page, suffix, contains): + val = page.evaluate( + """(a)=>{const s=document.getElementById(a[0]);if(!s)return null; + for(const o of s.options){if(o.text.toLowerCase().includes(a[1].toLowerCase()))return o.value;}return null;}""", + [f"{E.FP}{suffix}", contains]) + if val is not None: + E.set_select(page, suffix, val) + return val + + +def _options(page, suffix): + return page.evaluate( + """(id)=>{const s=document.getElementById(id);if(!s)return []; + return Array.from(s.options).map(o=>o.text);}""", f"{E.FP}{suffix}") + + +def property_description(page): + E.goto(page, "PropertyDescription", "WebFormPropertyDescription.aspx") + _pick(page, "DropDownListPropertyType1", "flat") or \ + E.set_select(page, "DropDownListPropertyType1", "F Flat") + E.set_text(page, "TextBoxStoreys", "1") + E.set_text(page, "TextBoxHabitableRooms", "3") + E.set_text(page, "TextBoxHeatedHabitableRooms", "3") + print("date ->", _pick(page, "DropDownListDateBuiltMain", "before 1900")) + E.set_select(page, "DropDownListDateBuiltFirst", "") + E.save_close(page) + + +def flats(page): + E.goto(page, "Flats", "WebFormFlats.aspx") + print("flat positions:", _options(page, "" if False else "DropDownListPositionOfFlat")) + _pick(page, "DropDownListPositionOfFlat", "top") or \ + E.set_select(page, "DropDownListPositionOfFlat", "Top Floor") + E.set_text(page, "TextBoxFloor", "3") + E.set_select(page, "RadioButtonListFlatCoridor", "None") + E.save_close(page) + + +def dimensions(page): + E.goto(page, "Dimensions", "WebFormDimensions.aspx") + E.set_text(page, f"{DIM}TextBoxFloorAreaLowestFloor", "63.29") + E.set_text(page, f"{DIM}TextBoxRoomHeightLowestFloor", "2.85") + E.set_text(page, f"{DIM}TextBoxWallPerimeterLowestFloor", "14.0") + E.set_text(page, f"{DIM}TextBoxPartyWallLengthLowestFloor", "22.8") + E.save_close(page) + + +def walls(page): + E.goto(page, "Walls", "WebFormWalls.aspx") + _pick(page, f"{WALL}DropDownListType", "solid brick") + page.wait_for_timeout(500) + print("insulation opts:", _options(page, f"{WALL}DropDownListInsulation")) + _pick(page, f"{WALL}DropDownListInsulation", "as built") or \ + _pick(page, f"{WALL}DropDownListInsulation", "none") + E.save_close(page) + + +def roofs(page): + E.goto(page, "Roofs", "WebFormRoofs.aspx") + print("ROOF TYPE opts:", _options(page, f"{ROOF}DropDownListType")) + _pick(page, f"{ROOF}DropDownListType", "flat") + page.wait_for_timeout(600) + _pick(page, f"{ROOF}DropDownListInsulationAt", "flat roof insulation") + page.wait_for_timeout(600) + # discover the thickness/additional field that appears for flat-roof insulation + for suf in (f"{ROOF}DropDownListThickness", f"{ROOF}DropDownListInsulation", + f"{ROOF}DropDownListAdditionalInsulation"): + if page.locator(f"#{E.FP}{suf}").count(): + print(f" {suf.split('_')[-1]} opts:", _options(page, suf)) + _pick(page, suf, "as built") or _pick(page, suf, "unknown") or \ + _pick(page, suf, "none") or _pick(page, suf, "nil") + E.save_close(page) + + +def floors(page): + E.goto(page, "Floors", "WebFormFloors.aspx") + print("FLOOR LOCATION opts:", _options(page, f"{FLOOR}DropDownListLocation")) + # "(other premises below)" = above a partially-heated space + _pick(page, f"{FLOOR}DropDownListLocation", "another dwelling below") + E.save_close(page) + + +def openings(page): + E.goto(page, "Openings", "WebFormOpenings.aspx") + E.click_tab(page, "TabContainer_TabPanelWindowsPanel") + E.set_single_window(page, 8.62, "North", _glazing(page)) + _delete_zero_rows(page) + E.click_tab(page, "TabContainer_TabPanelDoorsPanel") + E.set_text(page, f"{DP}TextBoxDoors", "0") + E.set_text(page, f"{DP}TextBoxDoorsInsulated", "0") + E.set_text(page, f"{DP}TextBoxDraughtProofedDoors", "0") + E.save_close(page) + + +def _glazing(page): + # Cert glazed_type=5 → SINGLE glazing (epc_codes.csv, RdSAP-Schema-21). + for opt in _options(page, f"{WP}DropDownListExtGlazing"): + if "single" in opt.lower(): + return opt + return "Single glazed" + + +def _add_window(page, area, orientation, glazing): + print("glazing ->", glazing) + E.set_select(page, f"{WP}DropDownListExtGlazing", glazing) + page.wait_for_timeout(400) + ft = page.locator(f"#{E.FP}{WP}DropDownListExtFrameType") + if ft.count(): + ft.select_option("PVC") + gg = page.locator(f"#{E.FP}{WP}DropDownListExtGlazingGap") + if gg.count(): + gg.select_option("12 mm") + wid = f"{E.FP}{WP}TextBoxExtWidth" + page.evaluate( + """(a)=>{const e=document.getElementById(a[0]);if(e){e.value=a[1]; + e.dispatchEvent(new Event('input',{bubbles:true})); + e.dispatchEvent(new Event('change',{bubbles:true})); + e.dispatchEvent(new Event('blur',{bubbles:true}));}}""", [wid, str(area)]) + page.locator(f"#{E.FP}{WP}TextBoxExtHeight").fill("1.00") + page.locator(f"#{E.FP}{WP}DropDownListExtOrientation").select_option(orientation) + page.locator(f"#{E.FP}{WP}DropDownListExtBuildingPartId").select_option("Main") + page.locator(f"#{E.FP}{WP}DropDownListExtLocation").select_option("External wall") + page.wait_for_timeout(300) + before = E.window_row_count(page) + page.evaluate("(id)=>{const e=document.getElementById(id); if(e)e.click();}", f"{E.FP}{WP}ButtonAddWindow") + for _ in range(25): + page.wait_for_timeout(200) + if E.window_row_count(page) > before: + break + + +def _grid_rows(page): + return page.evaluate( + """()=>{const t=document.querySelector("[id*=GridViewExtendedWidows]"); + if(!t)return[];return Array.from(t.querySelectorAll('tr')).slice(1) + .map(r=>Array.from(r.querySelectorAll('td')).map(c=>c.innerText.trim()));}""") + + +def _delete_zero_rows(page): + g = 0 + while g < 6 and E.window_row_count(page) > 1: + g += 1 + rows = _grid_rows(page) + bad = next((i for i, c in enumerate(rows) if len(c) > 1 and c[1] in ("0.00", "0", "0.0")), None) + if bad is None: + break + _delete_row(page, bad) + page.wait_for_timeout(400) + + +def _delete_row(page, idx): + before = E.window_row_count(page) + btn = page.evaluate( + """(i)=>{const b=document.querySelectorAll("[id*='GridViewExtendedWidows_DeleteButton_']");return b[i]?b[i].id:null;}""", idx) + if not btn: + return + page.evaluate("(id)=>{const e=document.getElementById(id); if(e)e.click();}", btn) + page.wait_for_selector(f"#{E.FP}DeleteWindowDialog_LinkButtonYes", state="visible", timeout=5000) + page.evaluate("(id)=>{const e=document.getElementById(id); if(e)e.click();}", f"{E.FP}DeleteWindowDialog_LinkButtonYes") + for _ in range(20): + page.wait_for_timeout(200) + if E.window_row_count(page) < before: + break + + +def ventilation(page): + E.goto(page, "VentilationAndCooling", "WebFormVentilationAndCooling.aspx") + E.click_tab(page, "TabContainer_TabPanelVentilationPanel") + E.set_text(page, f"{VP}TextBoxIntermittentFans", "0") + cool = page.locator(f"#{E.FP}{VP}CheckBoxFixedSpaceCooling") + if cool.count() and cool.is_checked(): + E.commit(page, cool.uncheck) + E.click_tab(page, "TabContainer_TabPanelMechVent") + mv = page.locator(f"#{E.FP}{MV}CheckBoxMechanicalVentilation") + if mv.count() and mv.is_checked(): + E.commit(page, mv.uncheck) + E.click_tab(page, "TabContainer_TabPanelAirPressureTest") + E.set_select(page, f"{APT}DropDownListTestMethod", "Not available") + E.click_tab(page, "TabContainer_TabPanelLighting") + E.set_text(page, f"{LP}TextBoxLightsTotal", "6") + E.set_text(page, f"{LP}TextBoxLedLightsTotal", "0") + E.set_text(page, f"{LP}TextBoxCflLightsTotal", "0") + E.save_close(page) + + +def space_heating(page): + E.goto(page, "SpaceHeating", "WebFormSpaceHeating.aspx") + page.wait_for_timeout(1000) + mhc = page.locator(f"#{E.MH1}TextBoxMainHeatingCode") + code = mhc.input_value() if mhc.count() else "" + if code and code not in ("0",): + print(f"clearing leftover MainHeatingCode {code}") + page.evaluate("""(id)=>{const e=document.getElementById(id);if(e){e.value=''; + e.dispatchEvent(new Event('change',{bubbles:true}));}}""", f"{E.MH1}TextBoxMainHeatingCode") + page.wait_for_timeout(400) + E.save_close(page) + return + E.set_heating_dialog(page, f"{MH1B}ButtonMainHeatingCode", + "^Gas", "Mains gas", "Boilers", "Post 1998", "Condensing", + "Combi condens") + print("code:", page.locator(f"#{E.MH1}TextBoxMainHeatingCode").input_value()) + E.set_heating_dialog(page, f"{MH1B}ButtonMainHeatingControls", + "^Boilers", "^Standard", "CBE Programmer, room thermostat and TRVs") + print("control:", page.locator(f"#{E.MH1}TextBoxMainHeatingControls").input_value()) + E.set_select(page, "DropDownListSecondaryHeatingPresent", "No") + E.save_close(page) + + +def water_heating(page): + E.goto(page, "WaterHeating", "WebFormWaterHeating.aspx") + E.click_tab(page, "TabContainer_TabPanelWaterHeating") + page.wait_for_timeout(400) + E.clear_hot_water_cylinder(page) + E.set_heating_dialog(page, f"{WH}ButtonWaterHeatingCode", + "From Space Heating", "From the primary heating system") + print("water code:", page.locator(f"#{E.FP}{WH}TextBoxWaterHeatingCode").input_value()) + E.save_close(page) + + +def download(page): + _SAMPLE_DIR.mkdir(parents=True, exist_ok=True) + E.goto(page, "Recommendations", "WebFormRecommendations.aspx") + page.wait_for_timeout(1500) + with page.expect_navigation(wait_until="networkidle", timeout=40000): + page.click("#ContentBody_buttonActionSummary_Link", timeout=15000) + page.wait_for_timeout(2000) + for btn, fname in (("ContentBody_ContentPlaceHolder1_LinkButtonSummary", "elmhurst_summary.pdf"), + ("ContentBody_ContentPlaceHolder1_ButtonDebugInforPdf", "elmhurst_worksheet.pdf")): + try: + with page.expect_download(timeout=60000) as dl: + page.click(f"#{btn}", timeout=15000) + dl.value.save_as(str(_SAMPLE_DIR / fname)) + print("saved", fname) + except Exception as e: + print("!! download failed", fname, type(e).__name__, str(e)[:120]) + + +_ORDER = ["property_description", "flats", "dimensions", "walls", "roofs", + "floors", "openings", "ventilation", "space_heating", "water_heating", + "download"] + + +def main(): + if len(sys.argv) < 2 or sys.argv[1] not in _ORDER: + print("usage: build_217091901.py <" + "|".join(_ORDER) + ">") + return 2 + with E.session() as (ctx, page): + globals()[sys.argv[1]](page) + print("done:", sys.argv[1], "->", page.url) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) 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 d7b72cb49..a1caa14aa 100644 --- a/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py +++ b/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py @@ -842,6 +842,27 @@ _EXPECTATIONS: Final[tuple[RealCertExpectation, ...]] = ( cert_num="uprn-100050881708", sap_score=72, ), + # UPRN 217091901 (corpus; no cert number lodged). RdSAP-21.0.1 native — + # TOP-FLOOR FLAT, band A (before 1900), SOLID BRICK 280 mm uninsulated, + # FLAT ROOF no insulation (As Built), floor over ANOTHER DWELLING below + # (zero loss), mains-gas COMBI, SINGLE glazing (glazed_type 5), TFA 63. + # Lodged 62 / engine 61 (60.82). Built in accredited Elmhurst RdSAP10 + # (evidence saved: elmhurst_summary.pdf / elmhurst_worksheet.pdf): EVERY + # heat-loss element matches the engine EXACTLY — walls (solid U 1.70, + # 53.18 W/K), flat roof (uninsulated U 2.30, 145.57 W/K), floor (0), + # party (0), and — with the faithful SINGLE glazing entered — WINDOWS + # (8.62 m² × effective U 4.0268 = 34.7114 W/K, identical to the engine). + # This confirms the mapper''s glazed_type 5 → single (raw U 4.8) is + # spec-correct (epc_codes.csv: glazed_type 5 = single glazing), NOT the + # double it superficially resembles. The −1.18 vs lodged is a cost-side + # methodology residual (PE +8.7 kWh/m², CO2/PE-driven), not a fabric bug. + # PINNED to the observed engine 61. + RealCertExpectation( + schema="RdSAP-Schema-21.0.1", + sample="uprn_217091901", + cert_num="uprn-217091901", + sap_score=61, + ), )