From de7e41ca36e2cc1bd458c518469a865cdb13fc68 Mon Sep 17 00:00:00 2001 From: Alexander Bakst Date: Tue, 19 Apr 2022 15:31:41 -0700 Subject: [PATCH 01/13] Add prover tests to CI --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 92fd5da248..0ca3418e2e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -135,6 +135,7 @@ jobs: targets: | integration_tests cryptol-saw-core-tc-test + prover_tests dest: dist-tests - uses: actions/upload-artifact@v2 From 342bb740d38d3fa5d31fc90de91a593f881381a5 Mon Sep 17 00:00:00 2001 From: Alexander Bakst Date: Tue, 19 Apr 2022 17:55:12 -0700 Subject: [PATCH 02/13] Fix build for GHC 9.0.2 --- heapster-saw/proverTests/Main.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/heapster-saw/proverTests/Main.hs b/heapster-saw/proverTests/Main.hs index 2fc56f813d..bf7bccfbda 100644 --- a/heapster-saw/proverTests/Main.hs +++ b/heapster-saw/proverTests/Main.hs @@ -133,10 +133,10 @@ int32array :: (ArrayIndexExpr a1, ArrayIndexExpr a2) => a1 -> a2 -> AtomicPerm ( int32array off len = Perm_LLVMArray (int32ArrayPerm off len) int64ArrayPerm :: (ArrayIndexExpr a1, ArrayIndexExpr a2) => a1 -> a2 -> LLVMArrayPerm 64 -int64ArrayPerm off len = arrayPerm (toIdx off) (toIdx len) 8 (fieldShape (intValuePerm @ 64)) +int64ArrayPerm off len = arrayPerm (toIdx off) (toIdx len) 8 (fieldShape (intValuePerm @64)) int32ArrayPerm :: (ArrayIndexExpr a1, ArrayIndexExpr a2) => a1 -> a2 -> LLVMArrayPerm 64 -int32ArrayPerm off len = arrayPerm (toIdx off) (toIdx len) 4 (fieldShape (intValuePerm @ 32)) +int32ArrayPerm off len = arrayPerm (toIdx off) (toIdx len) 4 (fieldShape (intValuePerm @32)) arrayPerm :: PermExpr (BVType w) -> From 938998b5af3c49654b2e018c4a77ebc95dd0d85f Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 20 Apr 2022 06:41:36 -0700 Subject: [PATCH 03/13] added syntax for the false permission and the false shape --- heapster-saw/src/Verifier/SAW/Heapster/Parser.y | 4 ++++ heapster-saw/src/Verifier/SAW/Heapster/Token.hs | 4 ++++ heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs | 2 ++ heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs | 6 +++++- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Parser.y b/heapster-saw/src/Verifier/SAW/Heapster/Parser.y index 000ab3bc6c..1c6880dd8b 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Parser.y +++ b/heapster-saw/src/Verifier/SAW/Heapster/Parser.y @@ -47,6 +47,7 @@ import Verifier.SAW.Heapster.UntypedAST '<=u' { Located $$ TUnsignedLe } 'or' { Located $$ TOr } 'true' { Located $$ TTrue } +'false' { Located $$ TFalse } 'empty' { Located $$ TEmpty } 'exists' { Located $$ TExists } 'eq' { Located $$ TEq } @@ -72,6 +73,7 @@ import Verifier.SAW.Heapster.UntypedAST 'struct' { Located $$ TStruct } 'shape' { Located $$ TShape } 'emptysh' { Located $$ TEmptySh } +'falsesh' { Located $$ TFalseSh } 'eqsh' { Located $$ TEqSh } 'ptrsh' { Located $$ TPtrSh } 'fieldsh' { Located $$ TFieldSh } @@ -153,6 +155,7 @@ expr :: { AstExpr } -- Shapes | 'emptysh' { ExEmptySh (pos $1) } + | 'falsesh' { ExFalseSh (pos $1) } | expr 'orsh' expr { ExOrSh (pos $2) $1 $3 } | expr ';' expr { ExSeqSh (pos $2) $1 $3 } | 'eqsh' '(' expr ',' expr ')' { ExEqSh (pos $1) $3 $5 } @@ -167,6 +170,7 @@ expr :: { AstExpr } -- Value Permissions | 'true' { ExTrue (pos $1) } + | 'false' { ExFalse (pos $1) } | expr 'or' expr { ExOr (pos $2) $1 $3 } | 'eq' '(' expr ')' { ExEq (pos $1) $3 } | 'exists' IDENT ':' type '.' expr { ExExists (pos $1) (locThing $2) $4 $6 } diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Token.hs b/heapster-saw/src/Verifier/SAW/Heapster/Token.hs index 4f342923cf..aaca511b3c 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Token.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Token.hs @@ -32,6 +32,7 @@ data Token | TUnsignedLe -- ^ symbol @<=u@ | TOr -- ^ keyword @or@ | TTrue -- ^ keyword @true@ + | TFalse -- ^ keyword @false@ | TEmpty -- ^ keyword @empty@ | TExists -- ^ keyword @exists@ | TEq -- ^ keyword @eq@ @@ -57,6 +58,7 @@ data Token | TStruct -- ^ keyword @struct@ | TShape -- ^ keyword @shape@ | TEmptySh -- ^ keyword @emptysh@ + | TFalseSh -- ^ keyword @falsesh@ | TEqSh -- ^ keyword @eqsh@ | TPtrSh -- ^ keyword @ptrsh@ | TFieldSh -- ^ keyword @fieldsh@ @@ -112,6 +114,7 @@ describeToken t = TUnsignedLe -> "'<=u'" TOr -> "keyword 'or'" TTrue -> "keyword 'true'" + TFalse -> "keyword 'false'" TEmpty -> "keyword 'empty'" TExists -> "keyword 'exists'" TEq -> "keyword 'eq'" @@ -137,6 +140,7 @@ describeToken t = TStruct -> "keyword 'struct'" TShape -> "keyword 'shape'" TEmptySh -> "keyword 'emptysh'" + TFalseSh -> "keyword 'falsesh'" TEqSh -> "keyword 'eqsh'" TPtrSh -> "keyword 'ptrsh'" TFieldSh -> "keyword 'fieldsh'" diff --git a/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs b/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs index 51a0c87531..2fc64dfa66 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs @@ -436,6 +436,7 @@ tcLLVMShape (ExArraySh _ len stride sh) = <$> tcKExpr len <*> (Bytes . fromIntegral <$> tcNatural stride) <*> tcKExpr sh +tcLLVMShape (ExFalseSh _) = pure PExpr_FalseShape tcLLVMShape e = tcError (pos e) "Expected shape" -- | Field and array helper for 'tcLLVMShape' @@ -466,6 +467,7 @@ tcValPermInCtx ctx tp = inParsedCtxM ctx . const . tcValPerm tp -- | Parse a value permission of a known type tcValPerm :: TypeRepr a -> AstExpr -> Tc (ValuePerm a) tcValPerm _ ExTrue{} = pure ValPerm_True +tcValPerm _ ExFalse{} = pure ValPerm_False tcValPerm ty (ExOr _ x y) = ValPerm_Or <$> tcValPerm ty x <*> tcValPerm ty y tcValPerm ty (ExEq _ e) = ValPerm_Eq <$> tcExpr ty e tcValPerm ty (ExExists _ var vartype e) = diff --git a/heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs b/heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs index 125bff3355..96143e60de 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs @@ -51,7 +51,8 @@ data AstExpr | ExStruct Pos [AstExpr] -- ^ struct literal with field expressions | ExLlvmWord Pos AstExpr -- ^ llvmword with value | ExLlvmFrame Pos [(AstExpr, Natural)] -- ^ llvmframe literal - | ExOr Pos AstExpr AstExpr + | ExOr Pos AstExpr AstExpr -- ^ or permission + | ExFalse Pos -- ^ false permission | ExEmptySh Pos -- ^ empty shape | ExEqSh Pos AstExpr AstExpr -- ^ equal shape @@ -63,6 +64,7 @@ data AstExpr | ExFieldSh Pos (Maybe AstExpr) AstExpr -- ^ field shape | ExPtrSh Pos (Maybe AstExpr) (Maybe AstExpr) AstExpr -- ^ pointer shape | ExArraySh Pos AstExpr AstExpr AstExpr -- ^ array shape + | ExFalseSh Pos -- ^ false shape | ExEqual Pos AstExpr AstExpr -- ^ equal bitvector proposition | ExNotEqual Pos AstExpr AstExpr -- ^ not-equal bitvector proposition @@ -97,6 +99,7 @@ instance HasPos AstExpr where pos (ExEqSh p _ _ ) = p pos (ExEq p _ ) = p pos (ExOr p _ _ ) = p + pos (ExFalse p ) = p pos (ExTrue p ) = p pos (ExExists p _ _ _ ) = p pos (ExSeqSh p _ _ ) = p @@ -119,6 +122,7 @@ instance HasPos AstExpr where pos (ExLlvmFrame p _ ) = p pos (ExArray p _ _ _ _ _ _) = p pos (ExArraySh p _ _ _ ) = p + pos (ExFalseSh p ) = p -- | Returns outermost position instance HasPos AstType where From eee5159f8b20a05f434b13a5d63d89706840a4f5 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 20 Apr 2022 06:47:15 -0700 Subject: [PATCH 04/13] whoops, forgot to add support for the false permission and false shape to the lexer --- heapster-saw/src/Verifier/SAW/Heapster/Lexer.x | 2 ++ 1 file changed, 2 insertions(+) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Lexer.x b/heapster-saw/src/Verifier/SAW/Heapster/Lexer.x index f4a63c97fa..b5d24c8164 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Lexer.x +++ b/heapster-saw/src/Verifier/SAW/Heapster/Lexer.x @@ -37,6 +37,7 @@ $white+ ; "<=u" { token_ TUnsignedLe } "or" { token_ TOr } "true" { token_ TTrue } +"false" { token_ TFalse } "empty" { token_ TEmpty } "exists" { token_ TExists } "eq" { token_ TEq } @@ -61,6 +62,7 @@ $white+ ; "struct" { token_ TStruct } "shape" { token_ TShape } "emptysh" { token_ TEmptySh } +"falsesh" { token_ TFalseSh } "eqsh" { token_ TEqSh } "ptrsh" { token_ TPtrSh } "fieldsh" { token_ TFieldSh } From 7638ea012b33bc6ee879615b8eaf566b6b4802fe Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 20 Apr 2022 15:48:02 -0700 Subject: [PATCH 05/13] fixed up all the rustc warnings from upgrading to rustc 1.60; commented out get_out because it produces inline assembly that SAW currently cannot handle; added extract_from_result_infallible example function --- heapster-saw/examples/rust_data.bc | Bin 313568 -> 276928 bytes heapster-saw/examples/rust_data.rs | 32 ++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/heapster-saw/examples/rust_data.bc b/heapster-saw/examples/rust_data.bc index 8ea8b57a8e1ec50a34187ef03e35e5d5ce8993a5..41193d120f45258f62ea14f6d0eb85e730354c10 100644 GIT binary patch literal 276928 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 z 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/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

{0SkHzvyna}t-609VIR$g(%! z{D?HWH(2}rzILcQ{zyBR5`=b0^vljYVs3{q>U}FTk=+CWaYJ=>DAf?G@MjAQ2*gEw z^SqSZ*W|v1B!m4D2p(DNVU(pV7HXhK^ zUWBPXaA_as3wI4acco&;(<}q*gbz|3Aa}vxL?B4qlkllSAO8m69Ys^KlC7vffKT8FHA?J;Qy4;%@L09lmiE zSMl$}+mP0GBH4^-47r>`a{1wFr(|X@sjpTYr6So!IF2MHW$BqVQnnSs2ffNHTSMFK z`phM(f+e;0Nz2s2FA?Y|K$#oJdzwYH0Ee}m8tAFs0cSD^h^YPXnlv zgV<2wYoErob6KY3_rYnch}c9_zga|eE39Zocj$EwsTg4EWr`p6kZWsLLM&d5$rfts zxSYk!aPBG`GjnF~{!)LHUp0+Ads24lM*kw;CDC4}(7anoSPx#ZR=0WF*)k%H>iTpm z%LmPMelBb*1y+m1p9QN`Vw<(FodAQ@wVwd;#C>60Mf@5K-M~Q*r4VArC$EhKm_o+T zhBVinPD_t$t=Zrr41sqUm#|gL;=F zH0`9KQ4$CnM=aWwP3VMedy@+1C4BQj#`tK2B&~TeC@qXm8!lq#0kxN+f*Go zwE1vi=GMJQK6WJ&s7yAyqdKcZMec%^W=I3)x7mx!&T##{q|4gKx&*6o4cuxTXLRdR zd1`FOIh4#QtfJBtlwi7Qrh%1;GIF@ZfT}i!;0{l$ETef5IrJlOe{j#@y#_Yqm0}eT z8@V%W8Egr+o8Qzi<8)lWWzjSigzu;rl&n#RMEJ`q>dr4=P(`MlY;bt%v=wV)Ow0ca z%B89_D9oquXjjs{S(E#0i}10Ub=$TkX}eatcE?%0i>19SXZ7AK?M+rzTtH#@j7{j1 ze5Ycg6TDHAG)=`Ktwd527f@WDyu*qZ()5|*{%*Oi5tkgwOxaxy%Tp!+vjPpAB-kjy zDd4TYuo1?3{T>kK@&?rIV=(8 zDi2d}!$lhj^K1b@5+w5bPtBr$d5c+HP=IakQC(10DU?J3pD&G{#AI*~CcB#?{y+2J zKl8vw616f9@{1YH3X&{;@%dbP=5i!|YFYoLWB@zXy=xy%@emnJtGdv%bGFke!@Z{5 zS9BJWUp&8opH}$?%(rV;e6w!xmm7*YR%HY}IWvMjQ%$@ys|(gyyvH!0HLUdR%&?2BD;&p@~o-VbaTm)JLC z$;3>YHO=9tf|cg8(wF?CbKoW9{C({nKtf&=4f&34Zjq2(%p&bhP1lFE67qdWNYUE+ zHWG57%tb+QLbHTCFMhe8M=m5}hH8}y@wh=kb~WElHPgE%WKXta*(QRU*ht9kJH5Th zrImJ4=h}A+4{P%v!iluvdPvAf$i5L}Rl_Z^Z$xF}2pb9Mou(ZQI3v!As*y!m&WbuG zi{d3@S>=jD;aIiYLc|0kvyqTBm9JKj3xkJYYWh5MuLjM-CvgGivsa!Y--t|-A7T{N zICu|_Ia*q{tiL7|BjcUxj@FTJFMRzi+uQZ**o24(ZkKJpft8%a?GntlQ{@G9%EQR; zt;?p>&oVMj^T;am$f&k|-Y+Wst7mOSM&B#pefg1be(R`f*)}6%1C5M#_a^1G8MMH% zD(2@6GPzma+c0iUzxjC+GjZ0AHiJJ~V;&jBd4r264Gat4p?hvaFzkL1kNYpWxn*QL zVeZO|(S5cN0lj(c{EXJlbwx(&+Ic#%!#LZKaYK9St(6UDVDQRZaJm!BctKy`{yIDb}Ab(mCZ*+)6sp`C&*6r6f3wu=#wkh-IsEa9QP#|IGTD5yH~ekcVFuF*!}(r9ZmZIyLU?# zsUHqVx#v)^rFJ`Z_ow`V-3wRfXlkacV$0Qaxj34di{0<;a_ru{g57~BYh)Gg z*Y;ehes~~d9d<8#irs;!o3MK|co~kS7Gn4Np4c6j_BZU_O~USzDeuTC4%Y_fsUIFp zDaP)Fp4fddbuV_WCehK<1K9mOcsY)ym0|ZTg&s>NH<=uCE9;SE0EQFreRb+0`z3XS zL;1(bO9)y14ap88FCc|(?m{^tAa{Zg0l9D$2UlD`2E^P91rGi+6bHZWg;>eS3y77> zO*<;9__%&M9`!J#9J^=dVfU4k)7ZTvU4dN!9>t%Pk~fv0J@NJPD4vnB4!f7O)6vv7 zvHPtQn#=9ft=RqXj|NB>DvQ@W7)tARBTKd;Z|^LHh~}m2!fw6vW%a{5DIZ|>(md?W z%jg2!)o!LP@j4Pymv|lNq_X`PNp$vO05pwM-b7$zPbciA)c=6py}hx!V&jk4-9H|? z?md#Js`7sq0Av4HZu(5cC)I4s+M3 zv9mrUL@0BIKs-Kly%}3!^-X2w)8FW$SMeNhX1^ub5EO6UJQ#dt8eNPMg^?Y#hqcK0nkBk8?Mpg znw+)g9rhm9+~r$_A0Bt;6FPitgyUNB3sK&TZ9a*Rmr*&E&j%Stv2u&^;r(;4=(I1M zY^n<%Ij2@$GqR4>uZ{|YgkZfuVlJ7W(7bq3{dIU4*=aAH)Hy74alrIBI72$C z!=<7bh{+j4XQB<#6_xfc7lu0!%Ml->D$ajwkipZhGCfO?kHohM$y)poHO9!_&~WnE zRpmaCqrN7X(M{SE1$Tp1Q`2dHqoo($9J4*v2@C3)421#7(i*S+GJ~d3l(?>;lV1o0 zx^H>x)k5`9i5J5jW+C||xBhJqpZ{)yu|v|O_E=^O!AWl(OiEw;c_friui_P-!;rl! z&VoSjRvEtApmm@1W(R~Y2O)%+|8_?T=YO|B?>?uZgTJN{ZLz0JS)4Cog&x~ zz*TkVqUjgg4tB53i=yRk9ZagTzge&t`olgD@g_mhEv7F`gy?pJKQszs(H-%!@F~$B z^@i|2yB90Mb6v3_>{;lH72)mx9K3WF2RC=cim)fc1qUAt$H5=_W0_#)H5iD?te@L1|ZM zC774?v$T?nHXP|9Z*#f;px+C7Pj`V_kE7lF_mz@dFIqj9VD;RHOzyi^URJ3oCQcu{ zisQy&YnC$Qk864Ka^cm*a(!5nFvnkT3{vNg3;OKf(#qz}qd{NmSR~CR;I9 z8CvFpX*Jd@kW_g4m6IDLy?9dfRW_+@&Zaw`%G<?wx1`y}}h8qooei%*(Y6P3%m$y z1qIT7PYo%yUJbBjX5^`92<8}Go{`gz_sJ;5U#bv5AdDcm(jwi|F7xIqB(%2AOL-lw zd6p0iCDh{a-&5lUrM-sTyS75H6Wjt;CjoOqQ_Y{$95k*S?n@uN3gZx4^V&tnn`4V& zdsi!aC&nJJFcTPiOvq%}3&!-NWE*`ZO%&>n;eCI7jkD$YbmfM#lr=+-Y-GVqTe^-M zMo1-ak(zoS6V6*LQ@Jq1;XJ=`^11oIRg5Fvn6R&!EphBO@M~O)XVlGp`KcxU;%79> ze(+a5<56BzSFZQ9*)I=XqUn*{oh2Hm-N-S8erm0)c^@j@4!_oynvYL5tlt>M5;&ZQ zMppKEx}%d=18|XDPghtuNy@c6(FS?*fBQM~9yDew^%zONN}LstUyigAJ63@)){W3+ zioU1Gex=}elnOi5!QJiD^$Hndt8V={t+q$gY~1_K*Ye5{#LlSsXYJAIxEMG4$)LY* zT(lBr{?jp7l67tZr#Qv7ZRayna&SzqGRJbP`t2=)m}KCeiu?YR@BdfDkpEwQr@!*| z{cG>_=f~BbAIq74dj34x7JnXFk%GDACK+S#k25UFxiT3?H5Krya9`(68^zM|E`xZoAs^<2@IE>K4LdYsQu3_9tn^-qYshG3{Mr7;?~ zJzo*Z3Hj`|AiHx8t^47HB*!kNl3uT$J3#WJXtY6w)51l>ZF&)*)+5Au<|bpU@+5kkNpDZUvb6o@938I=JV{|y9N-lv{<-sEqu+4cyiM6K`o|nUIE%tcMie~osAMd+6WIPxSeYHThoWh6#+0H(|i5s=o*TUZ4!9C9KZlWb|2w`ZNVTY zmdE0HD=i+53vhKX9!{dH+TVlJ_FOYfZzr1s2O9tM8{?$U125E}S$+fAm}ZNx-w%=p@%OBDk@f!K8f7d^X4D)Y`fJtiZ|${U&3G7&}>*a*(Ye1Owq ztGv1G!{>k+&7|4#jH`H>Ku}O3a^+c3py9u>jT3`0Uc|N2CP|Cx_YxD_pf<@L#Uu`DqU0I*C=0lYL zn4#;K9&9GxR#XQo#1@N#=1ofhqE~^_%jSO6_gMGkD&}Aqfo~*3(#FzSF_FiKgnPXD zx(cQ|{7+9yBqmkrmA5_6ZK@7+$zVwuWaD?xC_{^Vcph&0y*U&=00HAK6w+r?f6r+f zPEYnMy^7I`T5%SkNxYPUzWTk|I;ffo9AnuHMjq!V}D8ex3sCuc*R}L zQ1XH$;bzX!2mupi;T>JFTP1F^VhnlNrj;K1oF|1Qe|Q9q30q7S>vet|HJ@Mo2hacb z51xPKcb*@HcQf;s)7-^8z`FjaoL)J=1v)re*ZJ-A!WqDFk_R{P{d`Khf@c?V(vdmr zDx5{5z_$hx!|8k&s28PVMJ6)UIM5VpkewOrHz@e@oN@5^hrm%WiE{@N8hrlScAdC! zz%z4m0YJVDDnmAN$Y|UtN9EQF&ZA>kfV=eBid$|S?L|Nn*IF}l`I^02(X9%_K9+{0mZxmu`^d40uDMdcW`x zsMINiPxaUy-Ka$QMy>t4l13TS7nLK+@#b-j3gkIZW!7llX7#59f*gYCxr}3NSi-3 z(a%3LZN8Pb($?GD`; zb!CZ@O()bGkq>qOSo8=Lf2(rr+86m)3X1*Y4`rN#AOYXun3L%ZNAXnVC@u()Wk#E; z@r*|HWB!o|d|q*F?BpYXKvU*c#`7fsAR0#(sNQgcKtn`%OSDbmVzNrtuUP$w4`qoU;!XIWplxNwTD?2LC` z%v?Z-UNw4+%~O-xS*J1tso-x|q>fk~nKhKfa1NC{6ahe3Nf<{86U!N5ZTEs^*-D2s2 zRUJu5QfO9QM6#HR1N(wT^G{P(CMdW!9YyL5D#=sJ>^$!+jyEgCVV(~cQ*6ydVL90n zI}z6(V+D~OE+eJD;Yd6ZBR9~7*mIA>Bat%Kq5OTq9t5SVbf`>wkh=i+TF*V$%?teQ zc2C_qGwU74DN|ln{@vx}ipRUobDA#RdhDKacGtrOFWEP49+_ny8ogxSb@RyN4rhAFet6O&Q!@m7Sa+g4 zG7Uo(d&ypk8|1-lkusfxY`!>YGVGf!;O(r_VJDSxB12T98S!(B=8QQmB*s4ZqeoZM zy3nojT5;*(P}f=DeF`NUfAZg_+R!#umJxpS-msO;u>Fy?*nXP#45|!lzp?28sZo}a zL(SICbApFUe>i_{P@{iKt zi5}kE@Y0zFl}k9^V#L;TGF4v|Tia$27okU^236A#XQ12zs>B*kMOi^-Wb2+lt_o@} z(zxGygLZ3k%p+dvb9@DXz9>a5V@O;$fxw6>b z#&$*fJ~jZhtHhpDp~hQMr)*V~q+|W603W}ZJg99s5jcKbe3n`{l3F=@*r}Qtmc*>r za$h$fxrbFxscQ406BYqhghjuu5QQngTk%!TR6@d!$}T##G?xW6r&)rUMv3_j%PhBGpBeQ&>Aa{e{dT5R%kRH>7UG zPU1ej>?rv3w3*3Y?)zdz81Jtt9hLQo+aRr|cNJd&-7sPU=+K6~e>UHEgeo!^HQd`h z(13C(Ka=j4@3?%TxZC54Qop~d$hYs$gwy541aQnOAwB!eXJ(XDmlJUF>rXld?&j>A z#0V;WC>Z>c|5hZgOOS(m0PL5qz+^7`^1s66z-IO^@sy-5((?ULuJ$Gg!ykM0nS$)> zTLYbeZb>6TVq{iy?rwdV0>`EV&=&_s5;_JiS~@CBS#zW_GNuJ?yuh(fi{h(Y14~EQ zd7fXaY*Sc>!&ToRH4KjkvK*ly^7=hapZClp6QWh^ zxBdRjb#Z3S%$(&t@AJIRdf&e|KW0At;{1PmK9LVY{a7LqRq$CJtZM<6w3b>;#lBqW zDhKpvQ8Oa>HHk2P3Lhq8ibZSUae<79=4cCc%=#FmvA;XU;W^TIC4(rg)+p!BqQZmc zV^^vhroIkj%YA1tGDwPL(5h4n-koLzF#;)!(FvpT3cS$5dFyQf!S-@5O&Xkc49Wv; zLm;2dx|GRp3{C|aTBt*vu|%>*>wlcIVSMa2k6o2CSo0^2{oCVp{_*2gUU<;^PmGre z_i2i?(Ad^LCxfl;Z01JedBHCvo~dZbNVW~Mnx*3%<%M4D)$NM`ndX^iy&Nu9dKOjo zXxq$(^)XCl_$hwu*t3-&P>M7oP)Z4tHIHG)T@vAYB0u~Mj_`*KCzJV-Q~LHx+7W`*V59psi-Zr zFeZ4tdl0u9Zg#tgVX`IO%hUhC<}TUk8_2$(9&w;J{8lXZM|{^wGLYG#^js*GU}eTl zFmRPfcrF5LIfECco>~S01%4h@`&wb#UJDc6ALuP?Ya<$dZu*|-cc$&pq4YhhqjQE! zN()3~8zYFfXTLKC!!y8AHN3cboIFOP4%bB|C5St$F}B!;dAm5X7W<>jSyqlg4%anf zjLQq1W>jNl+?DCv!t=&0!VfcbgRTyh`WTuB4z~rAkhCH|uIedR&5HCLME&!Q?1pU` zkYyw;a@CJ}b<#8kDauQayNdGSxZoo^_e{KQ2~0wD6X{J)$ruej40n4F!L4)E^$RkG zl9(=2H#exKO=rOZMC=_b*7bl(I9yrU)KilYbm^vBIoJ6xpTQ+9Q=2`)J7KbKO6_jg z+U~%CRZ@v+EHdizyxQ}*-c=th?0asxI!{}`qJ_J2Eo|g!#2^Cz{j_4w0F}HO-~5Ps z0FEp^l%Iinw|}WMH^@$0@Sc^~>3tnMD=m8Dw{dTV7J=LWhm-82!BM^P&L#4*XgZ~! z{?%XgxdqH8%M53S^q#dqe)5SBF;MqSWI@@S5;0Dd*z7UZ6RUNV7AFbbtGpL(u6*>q zNbNEn!g-79D%MmOu7Un7W8wt=fuMhjYRbUA4s;15%$zIw6pCih8j#s{-cle5KN6zw zt%yv*1Sq4tU6^krYsAExEt39ZVzC&-Q1};sHT}wm_oYjSAAjd%#pmj=PAx#emkF`BAG1 zPd`aj%z{F^Ii)xwsuTZ&+fuzi7N3w~MYRaq@r{EN)GIupkbLzd1qkiX2THyHtqUZ> zaoH*Gp<7)~abhselHjh*XM$@@f}1I}RP`sp9Ylf~ zWt$-OTxk^CJ?D_qCTxtub%MLveNP*gV<>F*m8k5zDg*nxr{hCaAGmY~b(CAO=KE!O z>vXVeHJ9;1kt|~FBM@`X7%1r`Erz_GwUHSDM)4Vicj1fKbr$P3SmkLg-rhfli?U-= zSWFO{E92%;14X__lrV;+Smt9X$+quQD>!Rs7S9Pl;cR9Fpea`D9Rda~!|=<^B3fti zy_j!u(o%t7KI&ZZ)GF>si+9E8m7){F4&*t|fiug_(TmUJ^WM_M@>YGM zvQsmvJTEorMk^Ou^lVv-U(+1!mEpY5Ho^rVU!YpsmBEoK_h0kF@eI^olW=9qiCcyU| z-wJ7)nH8mFcCggodm`Iigiy|&N z8M5R7S*jpennbcRgk-4$Fkj1Da>?GLKP_L!sc0j8(dNS_-%`syZ#P8-PG^H~z^uJ< z&$AV`Jc2zbw$A0-@o;nJx+06kEp%}*)dJMr2g~J}8e@<N$sg}8OcKhYpp-1zY^P8e49r{y_@Ip!pZGLMxRe7_*u z-jqYg{Kkk&v#>o(q<6Cd^nmnOX98R0Un*zZq-We%*~mrPbWQW{=T&ld``!9?FXUe= z1~uR8QCrI|0*WEgdam8WkgA%Lvu&VIG{il+wrtiIBcv){uID%hTxGUUOaGb?dk18= zmVS-bip(IU@!-_bIup@D<=Iaa$Sgx)-VwgqUwy9$>|VRaul+B(*G}wSh4>r|flz~B zG4?2Md58gLR(rK7QB*RGf6r^aZN$~(OYLPm3S;Aos3o1Shv zA}{d6VpvnWob$-#nb6Y0DL7zcA=ic7S=0nDH53~0AeaNfJ3#K#fpgUUB;6AbaSY!! zH3VvTj_Zu$m}JK14)M6vaamUN7Pu>M58$@MJ%kxKP$hfp%K8b}VxcLI5B_xt z(X|s9f@q=jvoNic1gq(b3a>7g)Q9uW3vsB4Mpu$?-U|0n^rZKII8s2w#fR>J;ej8H?(nmq`;6;pwp0 zJmXRK5aZDC`y&-CF$5mwWSU?%iq8nRe8$MPpfAkt^QmM=?KO0SO&W+b2z)`8^q^f7 zR9$NXT*Y3l9XeSS^X@(P&SQCt5trbUQ9L*XEPWNV>E5HLdq=G2HmW5jsH=$M=sx$c z`^=!2e`EJqCvXb7&pVhsjojxcy3bgAfkpU*`y@R}aU)@#2HxpFX;C3oy-hqAy?dCK zw0=k8kahlfgG3rW#GjTIbawr*f-jmKtIN$nf9zQOa7E>%0o!=)Der?ejk?J?|t7qC@r{)y0fakHC?60OCyGfEq9IwZ@n)Y{wpv_&S&;Q5=BwbEjCG_Drm@nFx{z*GM|$>Q{_$#^s)7ngLFFrLJu>C{ zwC0$w^3AMXRQ}j{(b_8&{h_JL$nV^<$LWwU0z_C`GzX#gz-E9j4n7JKfI2yHMj?>$#7D)GS+6uzz_)pcX%FMCBekO$SFX$wp?LXmx@aEN&{o&d;n?UTLhIq!`4mj;{fWN@JM^gxwxO=bQ3;G<$H z^c*NXV%PJ!QyDm_oX`{twV|o8FinR`=ppK0R z`9JrNpXlw@(g(IYIsTCQ3J_pQI$tCVfRShqx&CcW(E3)axexD6Uhdp6o3%IJLB8!< z!L~y6qhyIezBmDn-Aoq8v1=*&=M1rt6ZkjCP{_utlXK~uT)bs}TAt&c=Gkoh``J+I z`M>sLqbuea>%)ZgR%kT@6pSRb?CSZB;c4MC{zlZ|9Sl?cr^K>`IUzj}9UKIBR%A~4X zl7%uUWr;upU?@FDPb6Es=(D&qH%mMzM{|%YJ?0FJh~dya}~cSM5B~OEej)ELdUH zTq!J)aCi*OS4DDp?n0P1aVpX{{Bs8?_S%16nx6sq+!g}5N*S%hgG1zDcz$;|1Ch(w-2acn~{wI(XIi~ zNYIR?02R5X2B^qoSAdG_S_7n!Ac5*Hwq>AYp`So9m@jmt5SUa^GH|6*f7%Dc`jP>0 z=S0^*Ew>hXuufC`7^vk&o(`U>MEw{LKV}{$Px`eP&O*o5zNs<9X1IZEjtr&Bm{h%0 zUy)xEIp3s1<#rgp>3e>F~Jhml3~J zfHUlY4ux0iRXwm1e_Ed7{vGmgGyX4;ho+tWhvXqE@z*~p53>*K`&%AJEdG=7K%88r z{xVwMO!#2lOml%qNn^M3-Z$*s%pNM866EGOthl=DMCl7%Q`xTs7QO70r8gURSbY zoc&N>HLtL2W%1@SwFg+WD%boKc0$<)I{xDWFEP{Or)2R&uQ6Eo7ETJFgCWZjUW7sYP9^ z5KixIt_!Y#-hvZZ#^ zl`b|%ykRXI^E2d(w?pkuLBCfEFcQ^%cZcoFD`)3lbg=xrt9{!^*cZR{Gg!UsUX}!I z<|8e(;5NE8`EhU84H)WmY87SWJ(h$bhE|1Rcy!#l?8-Wk)PYw$bE zH3qE4#h#b4P^hfR2!K*K3Zn?L>ZKa?vsnDB;~jU)x}OCbvWC60oI@yRC@|K>+4mBu z*V&EL@B1~e+2LkwwquebZ?sG76(zk@JuYv!NL_(XccC_5AXDr0j-EIi;VtCX%Y1LA9aNR}uN`*yy-<4yk zR|2BW(Q0c|;?#GVAhL3(iKQr}a}Ql~#ufC-zoKfAT-3D$u{K+gn}A%e-u+ddT6-9Q z7}iNLvF@0NV_igLEe>=!D)NvVX|WaJ*s?10<#~CXgt45Av5W}asZ#fp&D(=hf;Xtr zqpE!8nP_D{nv=Dnj!SC3w2g<`c^;wl<}nMKc45==im2nN=BFf%mYj?oR@MrK{U|Ra zCa-De_Xq+WL=n$ntF6~kdO1Zerg=F-)#O5Au!W0lSLYxxVuOZjR%L-!AL;mbo2^yD zl@smRVWNC-n7#7uI7}CI0lDIiOICg@NzQA{KCh(D59YDY*>&WJJ63%CjpQ2yo|=k8 z(HXS}m#*%pcF@v7JInl2JB_{PC|b{J}~?6rKcFmuLPV&=4Z z-wHFQd*^Ij@8MJ|GH!kxW<;~GYYWqSTlrR6!50@R^|QiqAuyRb4wm@Rw8flZhDx&h zVwIgd{3X51rOXSMI`KZ=cq5IZQKRW*>6FDB*24$z-BmsZ4z^0PmJYWzhNm|xB{!vE zep2*pQTtYC)jJ^-k`;!}SWp^oD#KS?A<$$(G*CWV%cyZmKHLUVkM)D4Ii-kQ*cq}z``0MC_NXeFPSd~O5nnI3nx>_&Kh)q|)2`J3(_pHBYi z4#E%Jl1qRHc)SRw+n&4wFHe6OCeimF33lgc(|dxm`OYt3cRp$3Ebda6T;^h}{z=k*;lJYB9wa;xogBzZAS(*z5@06A2)PS5B z5(gC7ABzS8MRrCjP(SyWJ`gO=xBGzQxn=_f;F;8AR^>C}E&xd{aw`8|yB1|CDSBDO z$ZxlHBf96>NE~d^jG7xbOShCP`k=_iOFnb;&K_ge0sXIYFytCRw1y!AX- z508%l6=L#f@FU)t?uMOrM`P!=?_%dir@@bSM?mG7*a9Ctn1qjhnv8pYHg#@YW!$Nn z^K}S4^$bRj$Ag?aRfEC_`NDavY-gq_&X$40dMRFRI(<~A$6Jm!BOB#wUn2vF`;68A z3BI=w2 z*-?n+-0%3E8F-<_AO7! zGP8ZR_`voRJ@Z)Gcdnw^%=Rs_ud{uZ3~y-rmM5);?OSU9Sljp9za+gDqZ1lw0*_1*s8w|x_S z)As%1Z`=28+xKtVw{a}=zir?DF55Q(cDAXPk>cA7HwxPThhK+KjZJLkgmzI9cYoip zh;wU-G;NTNBQ1HVxnq8auS&wGdTJ}1QHRthr%XhuGJkj%&>QC5LU+caI^T1RvXkX3 z@EBMkSmAbH*%ydZNMN*}YXq3@+gn#P*%!}{gal3wf<_GjcMKZI$=xc1A4lmkyfmSt z-jtS)RO~9d7P1J?1HB#v<4*yQ+it4gyGccBy9hcTRFdVJELa{)z)jJ@H6R~hKAZ&= zyoP)i^WKS%+1Lnt85Vdg(b+f~(2NwjM1t`_`1p>o2C0#4Yiamw+~?iOSqB{@R9FT! zs&xe!z`#I+S;HkxbUffF@52zb3~h;M#dmx>qIcg5O`G<1TT^uM%ysMW#(I7wxabLrpmNUZ=?LAlBhZ1?J_5K`ivf9gu7h6s z+)rO2;9h9_x*+G*Q}a_}I0e7U8$rJ;LBkMgt7!h+0jwyY zW`3stJ0ZazoZcFQ-ks?P5XFe*ECe+}vV!&&4#eJFHPmibf);DX&Ca{~V9%*mtSRC| ziT)ary}$$Qj1n`VXi zTbY50tSiTievYR0#sV4|_NV1J?hnbjp)i5TI--G%$oi`*r0fUOQ^if0wN9H_3YK(eaJT`VEt;`)(U#l6Bh0WIeaAFJdRf26uXg=g)}K<=KZDdeNrthySz7CWQP9rUv7F(v``W_SSv#OQ zSVR5rJ%-ra9g6g+Y0EgKSx&dsnA>IBywG;FRQF`s-W@Ewe|Xzty$^^+8H8iYlf3+A#te_Y~PTV&lr^ z_A!I))eoP7rRk)jYK4$jQHVWE>t(5r9pHI##9XFBh8Ho1PxKoAduL2VDQd55fBxuM zabP9Kp)Vm%E$70eoQx2ftPQc!c0gK^HTA^m{BlL9hAgN-&$x!%1;gUFiqdPKlFyjd zw^^V}W*0If(R!oSBGfKjj08&p8DihWL?9dZzQEyBy=@>NR{EoZep%@XpW-OnmMSu( z)OhYxCpnpFkBECng|PD~LcE*a1jS9a{ZZUha~w2E(|@nx3H-e1hAm;e=O}VoaE@4Y z?xZXbLd@$Z>oOEk<0)X@3DZSWZlDke4Fr%c;(ObGySHcNkw!`OE|Ni)x(c74Yl8#4 zW`t*5jUA^W(LJ;cb;`X`(kaw_$kJ9F^Jss<8WcV?#MFvI$IVYgQ#Ik4;T>6(AjOlZ zwl6Mw4%%g3#@Z?EWrW9LHBbK)vQoDF(7#t!%HG@iZs0a(F7rpx0%a2NIhH1HLxW%l0r zKJrN0xx?V9T>4r5~>C|9G8pqJ<{4$ z*8^hGJf&Deuy?6II*1yf2-h)GvSVb!b#Ny(-15&(y|S}o4%hh@yh7Oxug-)N7w(q5 zD~$;1h5knF`S5Y|1!r;(|B(KGiqm{}xNXx+6pAeO2|>>s>gM@QH=bMWGwfr#w}Ayi zbxu`d{EPKtkE*3ZPonT6#6o;&i(9QOFe(G2Wj*Jp?W0>ag;VeDubPZihMRF~oPC~W zzK;fD=Z>+f{^0b&jBfcpV+RTB^;GE+_EP_;>ONMRPX6$@=PuB7uF= zgnALt!Ar~HrCTIJP{jfo00JzXm{^3x_WK0S9%mEPJ>n}2wCFyl=!qq{!}9{(3!cPF zwjb0gHc^q56TSKHn&K0BMppFZBd%ouePT&({vj9Me6Qy2*)%-`+`g2YOY*!=J0{3= z2V>2UamtpA=95Gt(}cu7AJp-_4G6q4Npm- zsK=2zQ)7UCbcEK*LR1v*O|6;1ve#Rew{#A7zGs%ijsyD3al(WFf8jOt^_r3aitp9x z@P#7g7AHYp9sHs97tyg;KN(OperPVb{{OS%Di7*B05KqF{R54|rMp z3t%*Mtvp*ch}$ogRHjFxp1Os|$G5`U9iV>SPKF5}PzGlaW$+K8fuj9FpN0*s=hAU- za@|nJd_aeWjWktwob-7(#TFgl6suj3G1fGhLxCIoX?c!>rsQQFndtZ`EBF8`oXm zF8%*Rch$ao^e@(3H~yo#Ye3dxbyu-TccpE30^Nn^SH14Sn|j@aH}$#;ZyM+>$5ZDm zXQ!={9*3sqspl|@GQ}U;18z-gq5vvBgO8+a@ z`Jbq<|4*FLgW2mZF?*eS;Cie|-P<8}i1nBb72^fGO4Bxcz*2@^Y1-E92lfNm^xqF| zxW#(O_Otkrw?s#^qdb?b@ZJnS!fdtdV-tX7k7peQ5`ZOdSDF;YO9;SH0Kh27a6K_L zl$+ZIMxWY0J|>TPr9Z5GE}*X}q4%MyP9EtWS9Xz=wlRl{xFr{F+OJd*ys>%&z#hti zlTUE*ny6nY;_Rj+?ypIs-xi}>~vn21vpu?`1aLH!+6(3(6vfl^>-Dl`LGvJd_x4?LZkT` zf%T2%bLYFYXp3~uwZZ2DtWfb@b%00&_vh*lbwD(1YS1%d^I*-!ye-6(wDa5MSN3h+ zdHgayD#&o@&MbTN$O`oiz`ACcF&gS}<<)AB1cgKsU~kqrzo9@-;7_{z zI;Mp{@*8-KJc;Mt2{d{VN2rAfPXx4 z2Yr6KMk>hSE(BWK%;~LAK^i>08OlTpXEDS4b}XtzYhFVk>GW18Bn_V7j?eCm!_Ldw zuydDSl)GOd3w=PVPle)7V9?Dx^~C*szbF_1Si&z-^cn6$u&pThU6|mf+b|RSND+V= zfoOMCPd>ou<9b;WQQ*-G#cs-9ooMO2d-eUTS7Crpuel0mVf#o0ndF5IE&VJD{8T!> z%FN|p$wtx@wY}q7qM-L^8@${}>DH#S29W?Q1>W4__=}Z*|@ZYx$bGT=Sg*s*A9=rb=AkG$XaqWp>E@^X9TgOq>V?P$pn9RKMZV-h zz?MYp zbqJ{9yfcU@L;M!6`(*CgwX;SG2Ecx|RVxg$u&PJN2u>j>ooZ#)(04>TtP}B_(sZuN zqD$i$ehy)uEW^D6@EFvw0LIyLf9rLHeD@E>A4Rjwrn-^a3KS64Gv#V|j@6Vr{yq`k zHoMP*z5djFele&1K1L7c8>dWFD!bENC z{HtC6edlk@{G(B<@0qZ5g?vV+9fPsgm238AJN}%RY~iwTcmQW?f5tq2sQ;N;Z%AFM zbSewOc76TUVUAkpb2jxmo3_Yfu>R*fV9KxbWjS^B9=Y^Jw*sd8fpFpXNRI0xxg*}& z(Hkk3etWE~WZMNtBh=p5&(FS1t;%bg*F(f6M5^ST<=nbsZ3iMff?URXlKNbR=Gjc% zwj?$^enket>Hg)0t=Bd{w%*clH`En_kXS!(T_T(6abaon;sfYZjF(G`C$v26Hf7Zz z#kQRjWZ!sEE!T3X7Tu#ulp#TB12Z(uD|!QTq#VRG2~EbHi(wcf+Va{{F{AB}r5@m` z8z+xNiN1Bll(1%<^9iA3LOD02x(yu0tt!OP-x_B>5`CvO8Q0^*Vi=*rv`XWsN zIIgJk&6XYyOj0c=8;EA@kI@wDD!p0Mest+Q#^R*u{Iw4CaxaT3pHb1(zY=CR!lU3$ z)=av&sM9n8G8qf{y}+C`I(|@=Xx<6i=IfeAzk=>X70(T~2+y;a{O8 z!N^ag-klXyV8!}WW!=%IddbLkR~EECPYVqeHbEy_^s)eGf9x)S*1O608iB8;h|uQ0 z_A5K~K~Qno%O#Zk*frduMa4c}BH^jwZ7c-N-6Jj9iPNK8r9ZiJIw|CXZYkzU-p>GBj8@yjWxOv1BHw6yItf8`bQOm1(6m!HI;q3!tA(c}@;pttMW+XLb79C-l_ z&x>o|Ar&E;uxI2?zvmUbXyqW8Jd^d@WeMaH`Dg!7lU?Ezjf5c2nxUC4g>e@Z0jdQs zFj8Fm9dH2dN&WU)wWO@yX`Jb`={(x!iaf|$io1r3-bOIq^MMtk4Y$9&sxmalK_s)1 z`(;jGNsR9(iQ(DOxiUPwa6QTZcPY-H2eOF#q_yNHRbQOK%kwt3bVkFds}L{4kRx8^ zkAAi=4?^j7M#)~OO~sbcRhFS&cgeH3j?d{&%X8fSyiWRV-+zxz@-6)D)k#}6nCYZX zK@%`2OF!=v>7-#3%yd#3bW$zTN&K-tsFP|L{p{a5>2IC%Cv{S9=q3|ZsSrmNo49_Q zKY!a6Hqq@N#7{Nd-9qftSuOGcS>721qMSW4fJ97yfP|Ilo7lOmKL7#otuQB`uhvJ)9D37V6|xz0hKmMo4@Sr_*sMz9lAWhv zL(02l-!o8q8*x<{)F{JorjCJ0$wWwZ8uf2c6@vs0qvfcpK1W5_bbF2I` zgTA%1Ri{z&z~vW|Ko9t*w1SJq5zTWSRA60smhHrUTAt&6e~iX}4=K`Swd+G;)N_>C z7_}cNj1j)|8)MXSnb{brckVKd(NxnIIqhh4jONe&508=HBZqyvmtQA&j`&C7WA4KF z(|`G3Fc?6DG7tUi?R{04B?NL$K1Q9_HW?3$D(ne|0eDI?1q)>FqjUOI?6R$D?yPIqp~4C;z}Isf5J(+FW@Ax z_uTpd@+b6;*sfDLiI$Xql2slJJS2Pxbv#-Z5eio1i4Mdmb%w}l28MvBh2T$QU$6e| zbMFf#IRz#R zn!}07FB~IAreYnpq1zydWMR}1|3wqB72*Kj450`%WKU_=bmx|GIIoK8EO*>QTAEN@ zWf_jk4_9%{(x$jWDWSgUWUD6#qEN5DpV{KsfB@)soMRSuyuSwEF>l z3mjxpsq4#CZ~9lON3sqS*L;7^3YFO7}GmaA`H^6|>gjf2LCRXeq zLUU|U5s8r-@-Prem1w+Sp9u)%sCxV*p<)bRi&^MxA)WFN`tOrvD+J@5`c+=6A(I3fvv11c=3nR$=lhIe@-M&9I78 zS=;!(2&UUzu$p(j2bIqoXHYm!I$KH+>?ITOCULAp`q6XQ5qP4sZgxBo4f^lv4|OyF2j~X>y*S*!c8!i zqA!WfE)Pj`&-cmqnF7)KM`y8Sh4%=ReB9QwjAlWla{}_2d*7ntm$eaghcUfN2^xKh z>~*8x&v!gFEz1sdm+5H#TG1LM@UsFvI=GK1_6*7Bf`WBY3jww>T1TA`9h&N2TK3{9 z^|yQFR#Ws;4mm;v+#j_>qS6{Mn7qdQ=+a@L0Ok}ueEXT%9x@2T1nGMY+&B=>eVAdE z3w@9yhm=NV7u{;G6r)l~o5vXR9&L!Oo4Iy*yNbJCU~QB`w3y-Hyuma2ST zlY>f8`-Il@^aAdeDa~1}%e6Q`f~SB$YUvm1%A0xWMRsv|L`9=GGg)OPl}VjTNN#JFK0J%ExSvFh+hqbohhOpL+c zn|hf__V1(^NQ~Q<#JHM?@mdmN;-Wjf6V-_SJV=F!r+2wCkNC}JTgqmdaK)MIW|QnD zKz6g4>~?_co-vc%8!Seb%wlx)vg>T*rl`jyysi{%Ft6T~c?0cpXJF{L_ccwZjguQW zyno=R)K^9aB#%z^4@lOgOwuMLO&yu=N@`jc|9-}|;dtjAJ;Zy6ckdzI0V$(j^Y1z~ zplk5x(eYgZyLAl;>=vZdM*MY0>dtFl88az)bjn0t`Bxs*XRG&fLtlFHNZJlZp1adZ-h@|`_b3hU|aaS@P4du|HIpzgKXIEO~(aK zE&Kg0l& zLYl}tp z^tI>$gQ9zYOgB+n(9W#9Th}wQ*7ktmX1vB?2Tzp}-8)M^>-0Hx5}oH3{7^!Adxrm@;0u^Z#YlBtHkD^$o4y~kL{Aw61ISIFTUq+0qybFqg|J(1sL z9MB0}f}%dS>u>3a3%bUG$#NO**~3W7r;~;%?LG#ET*%7>FBxu1)0B2^<6V!WYvX?o zwR%_hEIdg$ASlpkA`&!rf#zPe>14IyfTJ=NM4ao))o?|wJg?jr4bDee>=30_R!EC{ zo_P&A_q~Z?m26I$u+8wz;J-I9rHl?mp>*=exfqkA8J76u-No)aC9iwe((ftT>q&wI{0i zFW+e6wxQcT04mP6)4cqK$}{7QD}L&(1oC%wbJ@;QbNm@t-y2CWDZhHj%K|?w*70J@ zthkE-Hty#~jj=A*utPam1m_mMX+0N91)(HL%P_3_baulIOw^P$OSE3MDOa<*ci*OgX)@8kH~Rb|Z|%wF|gISlqDcW9+XTN-#h-Q--fWSSmz2rps8KN`DIJ?G2kXrz ze5)H&+0H0%b}L(*r^eR|Je<+;nV#I7~*UEYK)z&*s zwRE1De1EGCR>Xb^9JHp8V#mn}I;dn+B~iKN5X9a~PX*(KHGcO;HCRZG?>H!w_^%gY z;BG&tuOBZOS@R>#_{)2Ic_?RhyLwwXE9-f+RTD2i(785E`GT+rhrZ4b#rI7y7{|3R zh+^0Ix2UW$9>i8gNH+ylJ7{ox){phU}a+<$aE*Mf!ag^C;7Lj<5X5 z^<3xiTkAP1%>37^=kk%$&DQg(@%PQvbKQVIv-N!Y(I;Hbi<|xKdaf!QPV0H;nwt9$ zujiE5cxAJGULmdLro;wY&ndA{%+~W?Bh1$Gjmu~~zhbtY*M2dhemx)Z0oHSi$&Ih) z%9MYat>=c}m$04}G+58`gBn@Sub9^J>IUn1f%Qkfv!1VN@*C@U#dB}{y`KNQp6~iU zzMi*-4QS5w>z&ygFiGTV4rx~%=j*+2!D=5FK#6*wg;Z7;V-1X`CN^)4=BcQ@vURIx z`o;i?0iJ^iCKh{fB7MhPF&1tIk zYRG?E$6r{74`6|#33-~|yWX<-_1Ehb^w9NYc+_97yujNstE>~rK2j2s$KFQLssb)fu$ zu4UVNA2+le1YxGA);`lc(Hf**>CQ$J@f?Rs;BH+)`3JW%Dgh(72yL>3$v*=p43hv@ z5(1OEkP=$_3+n%fFK0nrJ-q^Xznfi^lCnC=yOi6~eWEBUhf~0jxbJSOHYj%K#kLk* zJo{Vt;l3%pOk)uz%|VQ+*>${Re_Ed7o@l&IKJj>cyZ4Wbm+nC6L*wPyc@~uX0Q2nJhExstJq;v} z6i{6%*_?peodD>DrmAE}aDaF2G7iW7v^>W>>2=l~eemdY4!*zm-*uf{xZ;Mrhg}#K zAmHl&-3PcgMEEUwc`lA$##dUfNDki2ZKL{I$RV8OPbtMjLi*zde6U@J4b(H{2y^1U?RvVh@rhu$UYajd6P+=LbS5yB zej18;Xle~p1^hbEnU&F=AuOcZE^WkJh?U%VCOX8FsiV9OINF-N$uB)w;U_wDInb|* zgOdI3PD*ir*H>pcBAP85)RNVSielml*>O1i2!VyvIL3U)ag-x*A%G<4ol3~YZuva0by5lA6jk&WTZG)~i@@xFX_7I zPs^L0op8N$ADExQ+`MhX{rb&q!a$qbZETjLZA5Vf$b>X}h>al+lF`PGjpx*D;@IA{wyj_v z@$a;B6gv_&7*en0G8@tW;NQeQs+U0({+@scx|V-%UH>@he2V5_GaxgGXwT0HJt7^?sW%&%K* zY{J}f!9X-R=hIm<~zpu{}fwHB|?}hSlHCknaM&0yMe42BBpY{v@aXj3Ddsk#K>^1 zylgGg^hWU+pBb1*Ke2^E@FMXkGZUY}g&!-|(Wgk#hdVnnd{dGUc+m;r=ZDpnc|Mz| z-AvIeWJM_YI%+` z=N+cCFnqQH{^z(ocA;`96?EaXQMc9=U^D^vpozb_*p? zc6&LLC557N%b7!7>XQ?>{(Y6_b!2g*uSDgL*lSkTl-JJ5OC_j@020$WJ^N@CeFWUx zkc7}SLMyc63JtX{Bx?j>H#Wlro0Hw^1@pd^=@wz~lf6;eV(wzp;mgsz#%1T^VZ;8k zyik8=;$WuFp?CQ~%r6$^d~ex=2m>a8T*le0lM91G`k`)|A34*bvP;LU_qPRIEm#q0 zIig{5By~I`VwJdEg`YaF%;IeNihSWFNl(E=+Ge(LT5Yzt zjXho@D)L16$+Apl5ed(TA5nNnA$!y8#_0NJ5}D=|=@Y@mF+Z1qol7%|`e0^@Dn;a| z>@&0V8b5C9#~t^M=^ljRjx`-OM#=R8jVdPI2GrEbi_rhAUWF$=-*{U(b0$|pT~&yCC{qmR|`1)I8O!MW?cDOOKm z^C^$cBh4pnLG1SKzQZ{@MVRPxzF;~Z%_AD)M$RY9ceQlL2+TqwF1;}S>_>7%$nG=b3?&~V&qcIng3 zJTixb9?kkWRPW!0ykPT_Ne*~-oL8-5W50;bo6W|a?bhebV&_fZJ}%umNR`Q!3U>a6 z&jA%@jhz3_JPTocG|hR~58yNiaKLp#2jMxyJn|fBn}@2LBJCf3?vI=IkB&_j^h0yp za`r56^PP5J&`G~xOx{+wET{R%cI%g0FQ;db!0ot{o!w?OR6rC{0n86+*@ zJ0^Gk>GOBQ95Ts0$%j$DEK#=uNdo=?9O7TF`Pno_bZk5fvuHf>X*{x5_+mWRZhgV5 z6&Me3B8|t{HYmCA(n$Gt7Nq=iNq)X!5sIT0Q|V_qnbjTLu4T&~R4i`R>@^(eEs@ag zL3;5bbmxvb-AVK5)MSiXG2De0%$*=D4;_H-J4t%i`SHTM_NBw%y4Pc_1lvG=LHprK z<@riq_QH92i15N~MLw-nJ1$8-ZR3m=*|Bf=@}1X~WZ(3v`T%#bOoP5m+(vvKDR7x- z$0*~DcBUO#?64hfQZQsG7vW;J!rOfTZl@?7?I@FKY9SMMu=@^s_KOcGY$JRcc>O;) z*s66SO$6|yeFU8>_+1bC#CRTegAtQ@ZU^*E-ix`CoPqK^tV3rb9Qd-Y@8$F}I>Z#8 ztLwd3Mgx10F6gH51Lgy(EE1cLf6iKR zqxt6@FfiGxP;VFhF(e;FVv7#GeFtQzQqzt z!cWZ*!K7%)Z?XG~I}j`hrFMLlrwGQHVN&394K)67*%=M|5^`EhGFxve3BHwZZjDbi z&h2YD_fd&Ru9ke<*g0@0riZZ1)je}sS4=jq!*jY^rG-jcU?&n!FE0|c$7k$5f!DK+ z$UfZQ!Ks@{KXUMW#~SpoJOCpoT3VI5$-#GvZJ4n=2jAH2ANbHWwm5`rvCWjPb3A;N z_efuj;`LkuuS<{<)@_W71SnmB&mM9TP`bVx5KU3I;22}OwaG`2rVer6+u+R^75O~y zw;z-YIL$0+Ap%$@a*A5f^_w#wpJk(ONkxgbrRv0Aq~)7h>B;Io8ayTDLD1DBk!*9E z<&W4ikj`rG40xQw6n_!yg>>d42=>AQhI7S3=|&i6 z4muBi)#rdcHdtDmkc-b73CW*PbIqA8Z}RWhJOxco+P$q`DQw>~dMtv+t;IzMF#%z1 zH_e4UOC~2>uY+ptl>fK`D=Bnr}1~ z^)@KxoEdjc!}U07s>v>jaf)nPt}LnOi{`(>vy{&M6Q~O?y3e-76J=vVfsLHLVk2RL zD2Yc$E?{P)bB>_|3I`vU#ZbuRBVfZKU>vH`JQy>JJ3J)HH9byFJRW=924>H}T;5^^ z2@G>t)X#b9s);-MHu@kPPp-pKVJ5CX*aq8_Ns`fTVic^H@oceTXdn)CyXZ|d2bW*lAt5Pno z^Q@iKrWJd@4~!33u={bH7aqM%VT?lS)==PQ{O&wHlyi{hR)%qtE4X$|(H!Dp8y_aK z4`cC5iti0g)dX^3cMB1I*=+_u87b@z#5aU75@JQaac=ZlvTwH z$d(pt57mQh16F<_I>gy(?@G&4NmHDjVRj2bK3UKQ2@}|j81F@hn}tfJ1A07+I4-7~ zn~3@do-7-hyF*juQO39~LVR^CkL(ay-V}Fx`rn(!gPDwG(;kj%cT3yb*5)K|&tul# zwvKcXYXa3E`AR>L9m>k^$uFdPpA6aBHb6mj8Z)2<^b;wD|7b{wtra}JZ_<4xofF`I z=Y!Z@xBBz>+%Y>}r|h+9)^9=;rR%vJZqjo;pqnC;jiw{~EW>#rb|%;gbRBWRb=>*w z>v(j`_XIW^b7PzyX$enV z#xat~9?7U+zw(2=cC00pjCFQw^Ch9X7M4d#hDq1QP%EjnHEmTDzI~+f6C-{ucyXFV zfK#70zp1JUUzFQwGK^`N_>!-O<4O&g<-BhGVfA)~uOt&!?rqvv-72d0cU6}p;UX`* zxOOcZFMwXZnc3uvMn(Kwhw+4EJbNA#_`0YC?pyo?)^||9V7(7UY$4A}Gr4-73G1^g zFZQ(}rvzD*xFgQ0^3?UuQ%5yX(z=tyb@#RE-?7|)kB`OIf2^6~Z~8cAQ^#X(Qqn$d3sPP(~$2G>MZ6$xCr8ItmbHG9d zgTtqD`92|2Dr(2NV%d1sw$jUgyq5)s4nnO&1ne-z{L_0U9`+Tj#%2EmCwC6+w#=KH zic!nB6`KJtE%gyaD(469rHk*z@cj>#E0EmCGe14J>@K+MsN@XQ%79 zP4=hd|BXI}WPhFI@LN6y%JlIJ1Yfs)ZU{EN$?phon1Wm!I3I<&j*C;o`jYG$HaCWS zH+iXjS>F~gpuG8ULFHM)$qC@%$zB8B3s)pP;Ioe=k*K0R|V5v-)eQqWY}^~vhA`Z2)0i7;XiQ^$n2oi*uNww%ox_o0MG-Ah*R%FGTn$ z_Mc7m=2c|VA0;A8`5Cvy+Q!Yyi-vQ`+0$IEh1#rg0DX`y^`6unij+i))}qJd5uRn^ zA*@+sXV98OdLzK03+fCQynzZ?q(w%qKzGx?HbmmDuky5BB=Xqys?B46=!e0>=c~mze4)KIKp%=TJdi$Z?b~n&e!87q^cqQ!Fz;>S6P%m^@ zd+ts*dwsNoDKIQ$3Mht{DgVLB$E&;kfNM(Nq|=?#4L4kb z?L{EXHeL!ZttBh|LJhMnyZ!_r1dic||*yRWnC8QQgNONok-J!WLe> zhC^f2Ee{Q|5v!&-=Xkeuv6-z(ROAb(%rAHu)R9j|F~68g8gAx$-vx@%I@I#S&f%ik za4TOhbCAo!WPanDU%-6wbUDfgC5~$`O+W+e(n77IuGV(oQvJM;RSZKm&8DRoWAV#kjX zt!Klhr5qN`hn<-5y;3pbPoEaE_Qe5=qlWdEh8TG=@mA1*jKd5uIkug_ zc!AnUG=r^6=ezM2(6>;PUX~cD1;Dn%67(P zM2?)yeyvWC>5mApH1c8h(Hev`x))aD@--u=z6nA9!_Kk0Oje7q3Tt_eOU3t{Bz@T& z7viqz?OPbHf1|iHKyPZ~d{x^dh0+4|5^vP!;~%qSwTqbBq5<;KT)nm>=F&R-n6Lnb zlJq(pH^YG9*0x(Dp^nDnr7?h_QH0hi8GzSX!u(27j|U`%UVOZM!Dh5i9ip2WIYg!VS_^)aE0uWN}iq;OY^eU1FFhukxV8 zo#~!)>Vcv;BUhfK&488X$XSE?Hgnhgt?<{dDTEj2;2(R=G}x;{DX^Q5qU6)ZaFpWf z3ORru>k=bf&ASO^NWOkNQ8K?*U<&x!UXJZ_k{Ma%*J)}*ZW2|4P^S$wa_WG&Uo>9?p*}cQ3 zy?UI&pF2lFvz7{`FO{YP0}VR|&>X8PBCT^fw?q2C$0d35JB9Pi7w-#!HylsP|7-jk z%JDQ}cRi7R^RKY2{>=64!Z?|D5(T*o_05X+%~|9-yWDr)S>FYY?G|-eOI=bNN4O{Pn&+^mE^2c{=}% zmyhm0v~A33e#V@i`*qp$+3AflKTvgwvVONFwY#MIKuB@~c|k61*B`ms%|rZF2t=ec zRl#-W_*Tm4@8oyGQ6T3{>-Ml&_a?qRAcyl?hJ>Xx5y?Jhx3OkscS-yq9Hk!}W#}uR zr&=BbMNc*4q=BTG`4gi3w z*|`SU8Fu{g9@tk-6^IU5LbGUm6j762ACjZ%^ofyqzVx}ShVSpZXRm)TlR$W+>`2yD zLr=Z*m1ijn813WPHC^C7sM*wAGHsv~7w%4KO5@`(cGBxZb99}*fUOpi!7gj7#XnL` ze=olq(HuiC4$u_1!6~(0U479*Ts15M<7CIKY^+^TZ&o4F9nUa(iqdaVD)@E>eR~lv z3sdIe<&RH=0Q8|%`Jk2G>kF#0r}2KkUsxK(A zEi}2jOgBuRxh&~l7w@^HGtGS)Dm^lr@4f5i`_GX!%LQAs&Fd`g;Pu4^s?HhT%%2u^ zrQ`Olqf1=g7ZZ2cnAXRxYCY0dn5K4mn^qsEw7M)mSvR!<-Iq^# zJvN7LYns}I&#XVH`Les@nYyXnZ|L|_ZyoczMDUSpYLC4UfB8&qR~&kId2ey#-A{%B}Xf z0R=S{&qxv-pp^!aR(c^_q}|qZvaG7^`ToP%VoyrvEAovIL7k} zEAmSb?odgiNhOsnov1r;^-T})Cm~QtXKjVcvJc$(?3S=v*Kx4z*QwbJo)wMRmO5Fc z8U=jC+#uo#uYK;>Ygg`kVXq&%75efJ)0ZQTN^4pR=@gD)H5-^dBQ^1@loUwHe7t-* zeU@vrC;rGqD6YcIG`-))^j1K<)h1%s_JuUP-^TP-K)qeN2qF08A>8oku7Gjb=H5~= z2XKO>Ilug3S;5glEp{ZYgil$+IKu&X)|ZeD3y%I?PcTJw>m38<_1F9U%*@#I);EPOuH8(NUnN)lpdYvG&B?OJ44SHl+g-6>5uuGzXoL?% zg=M(lji+XO?HMvJgb%@axWbwN&q&_)w+g4Qv-1ydRMG~u_dek0J#Og1q<^C%@-dXoqzdfAMI?MLtKKbeTO|5_ z%)NPB6W90uKQl>80-|U^Q9)8`+lWGw5Fink;8sLMTBYE1{Dx@t5)q| zwAMyyTk5{G;##EDTCLW#qIRLQTB@yDtM&J~GZP%9@Av!r{=EPC`DmGYpL6EibI(0@ znI$u??D}Ym=1_WYVlc`{yLtC)BX-($PU`0t+HJ~y1qxp9RQG16KGBgN^|`Fnn}OcX zI-t`hBrv@j@gGhLRAU4hrr0nKZ8mD(Cp)@Vwcc&pg>u}l?AkR&bG>`>V*b~em+|ZB zs*TqZ@y^DrVZ2~U_yJmdCHr0c?kO`~DXQvHPM?bQ<0|s`FX_4C>A=!5#nPeB$y~bm zQCPtvy}C^i%1PVz2<3$TXgh+hRtwjCpa1^FLmd)UJm3YnCU(45v5iin`;*;yDK%c% z_B4H46dtpDAbctLcX|Qf9Jy>qEMLf4ax>6V+$p6K%F$iA`Egi5@OpI{daCC)6+b$% zY#!1yL%XSymKWTg*ag*R6PPtkw_a&|>FMGoGwB6|0w(ua;V#587=FtdY;TNEJ2mC6 z@kO3qf4d*jaxP}AyBS!Om>5VOxKG(l?<)1awj7s-pY6vBk{A2Z2NE@0;v1fucP}(@ zFL@KUlxRp>gddKq5kh(e4e6biUWr#a4mI806y=nXh@$uf>7IiW!9yq^Iv;Y_a+VLU6-=smAPA= zl7{qcgtYUgX1rk8Q)OaEN9F8$w6i;T-cFw^M@Wz2Lz?s#Lb?M&?bOY?mm9I`R;yMX zMLBz~ynX5E`%i6`hV+By5z?Q3!V4bsZpY8`X-Lmpf9d9)u!4aT7YHH!m}?S`GV+CS zBl}~7boQ=ar)UPcq7tJ}PSwr3R~oVJf31>+bRUHD=nV~c!L*()2q8T<;M=ULHv=mw z#|R;Pyd@vfI{GcZVT$Vu5NfaP`(#)5wDz8a*(k@Iz3bi-O>R%KG^BHrRzG`xYb-B# zs{MPk`UvR>_ovLrE~{tMOFLgYP?4bb_mOx9(nR#8zxnOI@7_SG$%zOt^gWa2U6I zB2|T+_-M}VOGWX@=kBx?dSZcwzwc2)KO1t6RHdVb+{k+2R-m`x%u}zzJ!zM39t|s4 z^>JfqPdta7cv3g$$nHxE;+4j2^nGxM>JN)2?rJ_&lTp}Ji0bjelVNi;{6PH&oun$R z%)0#a?lpl=2M$M6@42)jUfD6ajWnwFKKn(}jR_Yuxx2!rYF=&7Q;3iwO}@+OdMl9h zD-j}O^D}&eWHzA@GUsv=ej;4hZvpnYivw+UHJQ6+PtjB!qlc&U(CB6>c?XW;9Y~+H zVwlbNzi_tU;r$7J;tT6HniU&Dr%Wi+9A0v-*K9-R-3jxMyfbAMXx2sbVf(M=UPUr{ zndY$bOs`@?-<=cgsSi7EY?_5+))gf0WUSWp-PyZM!`ZV&b}2Aii=A(HXwCXXb7X7hd#a(U6AwpCcF*y4}1t7uSj?iUwi47im$y)nb{1h zw!5S837D%zfQwS`Ap8%OZvo!>0r!YwW?s6%{`QSIYZr{T(`+Vv4&*e{-unT`dlRnW{dqTv zx+&S@RKF(5{FxCw0;}$R5ST!&4qadf{bRx*&EWyx6qXo5CuhBZUx=FWMM8o&8g^2#acrwttrG3=R>UO z2*jp1AU5t}i0!0esZ{I*s;wo&iWfnQ&|7B5(jj)6ianrW^Ql-5s_hwwRV;&;=Qza9 zIUzQEE5y1ChuHg6YzWoXp4#^MQR#i-5vZH*ITd;{N_cL`KXtxl z{js}&aXX7D=sgGG1}o@p#>@qC zvIo|{a6Lhb<{TN9o@`r?qkCu^9~l7hLVFL^|;uIUy-#%Ju>*; z>K6$Q^~_TrO})`&!hH47*=M>;_`AX3*;k*-_dGm+hxhtFrVk1oc#D5fXdiu0NO-WM zSKa=d0j>3qUue?jw==WFOE_-z8Jlv&Z~dE)zO!vle{So66SIdqvv5w8dgotv5qdXU zxK``L)^{I_-s6D3WzXNd%lq+A-yZG6=fnn-BnUqb!zai1pNTPeZj8R(2d|o3N;KW* z*SL;9rTH#q#p@Ht;EgWbs9WC)S$OoI-eT;twDt+e0 z9ovpoX=tu$+FU_%w%S5_qPZ3~nX`d5#XzIZzpa8k-7}Fs-Gf&sbarBV9(R2*n_weP2kiMpx9k!#^LVxV`$wK%G{6 ziegqlrK@QlciY4Ud6&C<_H@XCSB^02=@V9i8vfAcdg+8!7&FS;HBMa$(=#S?>-oy}@h(Rz-;cI-mj$wL3#`ioH zE-CP1paNUp7}ugNJuk(%Z_sleHp$`^`*Zx}?24^PgQQv@w6ro_YSwCUd&c zCl8LKzg~i$)lA|agg-b83t)T%oj?C!d;fHjJ|5GPe>~=GkFa{%&p#eh`xGu{($#GX zewlcRKFiRMe-Tm;?3==mar}D*#FuR02S5k#f)d%Yi@Tb%*6}0QH}og-b+>7==BW=I zXjLV&P1gY7T8r=u6`hV6z+dzk4RhUdGwXE>^CcYmj`Fh(QV*}z&6ggr9TGY2e5N5vfbRbSv+o0 zaL@gK?S@~q4`qk5Guc<&)7`%_FS&=gXSzAg50bx<`^1mKk6Gv5BKJsBo;@Hnq$LL% zxUFqEs+7gd(`lPaNF#QRk+UY`8wH+dU$tG8<>)SVX$Ppsx-h*zyyx) zHz_LXQZ)g)A>r4E{*B=OCh>pA-3r1&$nO$&x!@9arQmYGhImx~Lk{g^cBSp|>>|57 zHObe|ef06=IMU1i)pz34oopcb&S?yzs}At;+u8tq7n;8x;N`dH1N2>KUen0SZvz|Y z%NYu)0=zRX>DleJ;-<%=sd)4yoZ=_1!v2QtZjc-OjW;+6h~QA`y&j# zTbY&_d45oU_Xyz~kYub1f~{mkL(4qq@q{Rn=}hH4Mh021t;B8w9+}?IqQXev(TTe& zgxyJ|s-P%1{ByDv$NM9~qCI*=@u^coMz4v zzX19ZRqh+oG(f0HF9p+3L)P!mO-YOPBq|7^Fzr=Ok^*-%Nt)TymnY;^PqI)Y{nxyg z_2FJ25g4vN%jj76y`lFkQ>COH3=GwuW6Eje&XGYVjj4=bbf`iXMNN!QhXS#1hp6-d zV}lA^Bd;%^zvv^rg#MC`_!9cdKH^L0ub|~n>=lNnI8SEe?f^rh>gkR2-{LznTzO_> zML`dRt>{s=3d|1`PV*2%0GWrW945%=hu{CBN-ti_am7Uk6yzB?nQDO zpVX8pO5&Me)MQ0zJg>4cUa%pa|H-poC&7kJd_$Kjk~)df;{>u_QPPRVrDkiXu(c^F zg+pqDe7Rp|e*gXmVS8SY)R}(BS+hYgP9R=INoT$mr9%E#CBJ2AIy0H5lwTL#tcWgx z7lhonE=&$8a#?X*QNokJ8YD}*@HSU=5o#ca`gIj*(3MtQQ>91}65lDtb>$7auPEs% z6ffkJs!AcjscM7-qw-7PB_f1PlCT+pA3Jg{3RVNJ;y5QO%=0hD*a*o@wiro zNH@Y0t4g*j8CzMy>L7ixdk~r?q?<~wh)|RcstO9l2zP|s4x+D|nA^vl?0z65`y$B& zQ>vs%zhDbyL&noXmAsx|bSVwJ16YrmDZd|N2`+AZD#*~>&{{u`M@;Y&pi52mj{A!~z~ zp$yY-ggb#9?tVo6#*$`(prce!e#gC4P#uMR6qDR> z_lRbUgQqVSIK(9Pa=|!XvcjF)jJ_0%Oh*aSrOlWgSUR06Sa`jlq#2XU$7#T#>jlf3 zp;J+>oN%udlLaT;8+^$V?oyw?N%z)f!gT$i(8u)6_2b=x=qUA}Dq>_+5Jtv=iSE-7 zYKXaTlxHVG8*Q)8a??p)Q=uw_5JFlxk^SIyGa9mljP!geO69l*r9kSKDqzSmBG^BvgW&+hhTlj@3DmHkGcmX(vCfm_Y-&C?FhA~ z@C2Txr5eLCDbMwUs%fjayD(#_ay_lp(mUQ zp?r_0jW5ww&0x5s0o7Ho?E^LCfd*-@Rz6b6d&n$ ztJd58NqJR4XwcQP0h8TdxgRj)?mrnPTjL(=&U0UPw+yq)dx0Ts2Qx!RYI$l}7iKt_ zt{d&i_av&5*JA+H1bZ9bZ|*&f0hwWSwr(1X~R6zX;U)m$CMB8ys9Rh z8Pa_y^TB|sDa=rtzsWO8O@g6l3NzJ11VsgE+66sxg-xNbDW+}DcuLfC67eh)Hj4$g zR1jINW~j&tHGw-ltAyNYVY5~+?oA>0wvfYYN)Ol|Y&Hs;O~S@2XekwPTZGMrYP>d+ zC|<9MT3w!(HnVCOdCgPCvu9o}Z?w89kIZD2dtUQwRnsw2=V`9LNqecy8>$QQ-ehe` zdO}ql<_*^0;)htKbOwLI!(DLSZf#M~lZ`2!Pu0l@sK35e7+{MdUgZZ3uBW?cIGr8~ zh7`2q6P&Z4jX<0Q5kg{cfhn9ih;$4`M`K7gVUr|m1`3-I;Y<&xdFXcV3GShLTsYHG z$0(Oq7vzRBZ`zo}=eVYJcXh!m_OSabnU1|^_dnce?t*aUIZW<-3rYl4%Z1HaVY5Nl zl!nu)FrHu3$*c;4*z;9kfzR8TSA=>0Vr}ro>L5>${vn&DVahen2R@(E_WW}d&s8_} zK0%ox(m!IW7{lHTo$2{~t#!`@;a-DxxZ{yMs$C~H7HqI8n zF=HcbZEK&^KexKAt)V_3B|x9Rr8T4{L6)}npVd9*X=`cdP2f<5&em4njZawGdb@ER zkd*e_xpHjvVczZ>qu@wpq$WH+sJ6AfM_qPx^V-(l9vnhbcfYZ|C!eTo?CnW4*~;45 z8tZ%UNpD+AV{b1Gwb#`)*1yOn?l<dd6Y?4+W`n1fuJ8UNMl5M(eZ`CMfn&+1lRjWO{w9w3?jKH<=EY(K!M*owl zrRvJQ+J)MZ6%3{y%_jd+U!oF;#)PRF;lDx~p&F>ZrJk3+7a5p+7GoGv?1E(w47q2|99#Jih+uny5m=g$LH4_e_#DIe|(`fN~_Th)285f zkG7dsuYI`Dzgn$P;KO(;nF_4kzgBP3MkpdyGMOBc_{%CSEj1sqg<73=`d)nwl#!GRx(RDHnUmMChcJLr|JyK_z&s#0~0;ECFVk6iYQS93BOhJ zyjSD(kMJduR*CK&=S!5VV(!mjGDrBA`sZnL&^TkXCslLRo7DN*j*4#D3PtG?fhpQt z2#kV2p?VdXrHjG_fl8mM8ehWibw-DfiV!wQuhWxy-EGAd|4h|&#W*4RyO=F`ovz$) zetKF_`XpKTI^&(gE*;_DEJ^B~54C058uc&g?QpR{+fZAst$89Sb@LNJ+SGm!^jpo8 zBffu8G}YE9R%yN32m#b8f&f-%OSMU>c}pl5CnTwG$!g|)0h2hwf0#C38>?N72%s_3 zR$IE7(aoVTJwiJjJJ!M^8jNkUIK^Mh3=1HPcZB~q?J6~m^}FfiE`pa)-~v(I5t-Ue{1FeaVo6r_Rh(DxDes`cSnWa8YTyB%h6i2 z5kfLo+fkdehIjlpVN#bW*NuG%zqRyALSTdV(nAjtfCpy+&jKt zkPQXw)mCVe-lz&fSaahGEWx0o~tmcE5~2q!0R(ONS#Z}Dd(es9wb z#6-MJV}(h28%nTvep^_q3HwTgP37CXmKtH7-#X#Ab#$G@Bng{w>zLKZm8_$o$&{|6 z=PZG@wfD7^>x5&4jb9mmr6;0{w(*Mj zsq_5DT(7Dr^H18!mo#oGQ$|=_n$xk>zeGT#TbcZWSmLL8I`}iVW#WnQCu~DTGeYgR zjj2W0#gfIqnFn&eG1Q)Q+P+IPn;tt6S$PCX3Hz=^@ z7bbWvtLSc-msZ|1<>?TEib}I!s&pGzOQ=XQsHq?e6>}(S0}VO(#GoA<*r3gL4)`6a z`A`I8JqCX&%RzzvVNlyaQ;Iz#KR_2{2%wr3!G-L3<_33zD(Z*>stij8;Q$4+C=yim zs>9s??;Dy>VI{OQc_v|=Jxw25oi@8_bGd8bHBe6viZ(%X8_DFeZkcSNPHnNAZvjg~Mwc-e61N$kpi;!SRKokEd5Z+odq|uXIhX-i7up zPJOSwh3S`_iLw0)T?<{A$A%Zayv0?#b7bMzN|*OsYT+x3Gb-+mEu2u1QT^P^!tBeL zn&xW?CmtKC-?grAQrWn~=RYc(y#1BT*FP0KVRr(*G|xfkc)+L*op~>Ayroj=dr&}$PB5iDJ)`ZvWi2N{#iJm zJ(=wd(fwVxfc+)AA|&l`;UbpgREI3p7A;|S=4e`!H7r`jp3Tv>C~s8s8oPdCVvDq} zqLu8=6Ej;d`l8p_6}iPNYC9CIVM``?Ta09RXFM5Y1lM`F&Mi#xx9+;fj^3ROOjRe0sHrq>XteAMIW(irfOR0rWbw8zCTsp$~L2D8+&$YVyl$dMLXD4`I)WK z78LDb&*c}lN?TI2hkbpTw-tG#XdnCiw2D?aTZ%qmx6i0V%L?h`Y^-$A><7ESqYmMR`x*%Im`Z5 z!e)kfc88E}*li2g;;@|kA>;ykWdZ9AGaLvZm)NBX*@`ey8A7hGC-I`-u#}S_RXpz2q8DvLyOqN);U)~$oF{DFPqsq?P>`5k##R-i(Bh{3L!tS z?<{7$tqnhike}I8i`k0Sfww})P4+%siraeW{SfjiyLJhy39tPtg#5;Sy@b_=lfOgA z9rn=@HZeTSuLb#o-Mf^{47W9GLGH1qma@g+IgMJ7KiNA=S#Nk*NDJ~8`_3}9BHYlb z1$o3CU&dC4FAZx!9SAv;Vp=pTe6(h>r*0HkU8AGBuGN0SOg7xat`nDhoxF1%q75b_XEyyD7=1R6&Up2i2S;GDLI;&|H zSlogvf0F>wji%@pRZ;U+j-WtAS=0rZ?Ku|YWK7tuX8nTu*K~HkGCLexLt3u z-gc)>v>Hmixq`LzXE&#hR;>LZv3Eyz3E zo^@IaZBKV?B|wbANTG@Y(@K8O)K&V_n?feZf^^3MGkPcwz8TI zOFOk92f2;gS$&7J;jPGF?t>j{Vuzf}R^%vmZ6}-Ap?rEP@)r``PLawo9$Zm)xJ9u$su6Us{o`xYY+(eI)a^6*z=TPzu_se0nII^sFD7nDBe}wf$>XJjrC2q}8wjwfRL@2q! z9XQHXN2ZMlC0DuMkFuI5LuM$s#%(yp>Z5AMg_0Xw?PqLaRBdr6`JP)}!DdFKED0q) za*rz5;;5?Cq2woS)p6DvRkbFR{LH;~oUMqeT^mYna^=U_>ZqzWL&>k)<>Rd8g_L!n zi7%Ym5=#Ey7JtrWzEHb2l-%RK`kXC(;nb(0tox;c>#j3B_ zYRjplFtSAP_1CP%>KPkGmMPvl$Lg(tuY{4;6erHHiPoHHVPvIZ#d$W<8n`Bmysp@G zfi1R@x5CI8#mx(>*J=xCP2Ny^c#W;FriHd9Zz*c8vDH?hZ%x)Ij$UUq9jh#@$$Ew7 z2CMJ5G`=-?NAc|c5+?sr#cu>t&cPxLSHTg*K_fM=QzTDfIe60AmhSkS=wzMYO6jy54#Q0Mm zwkA6ir+#KL<8=pGlU<61zp%yeRhL_nJ&Jj^S#Nw`L^#=}_~I3E|{3#l5?1 zai^U8aB^JXxyO1t8D@l&&lR8CV=Fo_GsDRV#f^Jxb*Gfs;p9t2@qJd)*)u+NjY9ZoJO zj{U_}bT%9hCs!2f9Mq1j zPkvRn3ph>JvwS((|6TH>B$|%tpYBwtLFth`9o1Shs*3rta@@!@!K4(xNB9C zp8TmeG>`LkO`D)6e<^-0-2My{i)2k++nmS8&z6(}uSr>y)0A zoF>ULq8(YU+_RF?Cy`O@$UDk~uXBk>%%XPWUFFTyTxODIbvyE&^7z|aaS}<4Ae)t6 zZsfd41`N#aD=Rl~6-iaIBghBJnVeRap%lY`1j`#F7I+r{?eu=3z1Tw>p#lB?*KcE1C;qFnzaSKY7nuMXs@a?UAElU%NiB-fN%PI3C=+JH!M zL;1%kE-{&D5lOyRZv2YNOipPPNq$rw`-&@04h)MVKPj(##d(u$`bhG#a`|blBDtzv zB)O^Fdz!0GW+EfWugX906jgu55=nkju06x)`|IK($sOg%GhAYSPv=PThw_gzTxS2k z-jU><^5d_$;{K=lM3O(1=fCE>{Yn2w@|SY;S+1gg&ZtQ8Ncs3ISKa^A*hunNdGH*k z8J3b2N!+S=-*Eb2o@tR}j_QYRxWr+kIFig$tv}CY4y#=lNs3gr&U3}X$eKtpU$yH3 z=N;yGJCZC=J-EPC4D)y+$s*Oe7rE+TIa?yh64f^sInD5#4ct#SH1o%S3KNS6G_&nZhXsmhv(dnByXrHu5uN_Yad6F zw^RqJxa#2~G>WWK-M_|ZMl6krBI{MFZgBb$p7<#8j_TVRT;hmR!=uQ%s--`0nImj7 zqsV)zcW-jVBLb_V$Y#}#w>a;Jw7;Y1Im&{POD879Hv0R~mV`}nFRfZP=iIHA-VFb4 z@a4mk7#A*b3~z#`_7p32x5SAjPCA(-`-Ja*;yx||#9s-(hTm2}U|3I@!*8r1*8J3i_1pyS550Ndw0xg`Ivo-GcnCbn#}Ow*;M6}2aW}lq zKj0U^soi71X*>AZ>-nRCe5p)+I`|OCJp>;tk^d4L7xI{thQfOVefFr1F-#ZmdElLW z@`#h}B0nVKZjnEh@dG07go{j4J&!~_O~&It6UyBw})XNUu9{F#;BP4twcsu0T#<(~w;X6d$PR73le-?5Bz}rgX6~_fWS;qC? zsgPR(KE@|c+a272{5^2Hg#QHYLVj2vzV{^I$(6V!gZzH*93Mw}9RR0xcfeTpyoCQK z@tWlgVd_e5Z_W0`H0A?|}D^==oXXak$JZ<%X|>`Edp~JS=T(C5>Wa9ZHSGF}Xx2>FxX^f;gVDUkx;PE)VBc3PdDA8m7TIjcV;4etHQ{?YRxfyE}k)M|FBO+&8 zN%TPecaa-pyzN<`+*BDKEb_%NK3C+Q$oO`V|03mRukS?ODzv^mLFa^WlVrSy$fwD8 zp2)p2zER}gNIA;=TI3DF>X)nhMkqH%#?2yk%D7YHugUldksp%rBO?Dz%3;s%BGY`9?e;Idz$HDHo;Itlme}w&SfOkZGFSu30&x-txj5od{ z$ai?UzI<9@i>7mmdkt%t9^R+0CV@idXYBI89OUnb)pihP%hpB4EP8Gk5p1)M3h=b5X5o$X{i z37pOg{lV+Tf5hQ(k*|{Ri{M=#e+9g=q`o0l0&j^zrF^K!Uy|_^B3~inr@^~24D%H@ zEyw52Cf9`XvBu8}`+a<43{! zK&}kDZe4+R3;a>w4`h6#$a_TAm)|7v#WMaIxDEQxgG<}dSS_5_H;<}+UY`rz9r7=M zcf;0a{|=F_k@5Q?za-=FKM8umu$YnRnFZbxdQ-uBNc0~T`8zVMsS(awegq#Wk#~Zp zBHs;jB3d{f<>kTO1E+E`z!4sGdM=CnBN=aU zOPHT-fLkQ;N#Jz8X$2+H`Dh+EZKomN2|jt0`x$sI_``n2#rc z<1nTCXa3m6$kixUP<`2dC?U zvEX&}MY$KjSAeeve@!Bv^_y_r&x}O}-S4wsaa)Mn3UF!M_5!y-&JW6^{iqNes+r#4 zw0(Sf_KSR$jNcadHW}C75%gAr*NyYA|7CD$$8)Hhv|ToX)Ao27ysjTX{uX#&@b|&# zxWd~5-tl+AzPsRXd!3!xB9A~YNcl#QkCE{U;IzKW!RzV^{f+++)^DGI)BV13dx`v! zl%t@TB9BHe*2#l!7x`Ej{}~*vVb+1ub)rxIGj|1kPR2)qqevzI!HFu@$*&Z7FB$(5 z+y%MW;7*CW`5t_X{0;C734a3|MKZlHxzlod?S2kC8u>ZkCJEQx7wp~v9xLHC@MPqF z2Ja`~i@^sVZ$U7mNcdIoLC6<_50r4zpF%&q2rliX`QR@?E*wEi`?1f?1K_=pcY!BL zxaI-Fyo&q>;4>tAF8DO$^)`n8?Wj-BBXAm*9&r3ur@zZz0FfH6|}Z6beB#&3z-E#vJT3+3*UaVI!!_dmd; z?f!wtJ0p0c{I1C7$#_@Xv7vfS$at~HgAr^}Jzs%$g8XRkc!?hZSb?vW@!sGz$ejW2 zDv_Tr@}>xCDL)R5P+$gt)8l-8_TvP;Ovd|&{3{t>DDoySUaIE=co(W4yt7X~#yx+9 zz!%GSZ*Xeg=iu}>-X6#ogWHhT!g+P}gI9<=QN}e&LB2@F6GeVZ#*4wJA5=*a`=S51 z$a~7TpGuIQC*ys<5t__V@NU@p>|ZQ$H6|A+{|cOrJH5dXT6OZx8nC>-7J<|D_qEF) za5@ei2aoY_*g0S1f6Mp*a5^4FV{%LJ$)leJss%nr#_b|MBjZ~|{tO0NsU8J>cS-e6 zlJUVJKP=<#iu@@I-cmhxMV>C>FKPw-+hlyT$QAwT>-kCKgJis;AIqN?y#xM|#1G3w z{y@s%&l>RIkQ)Fahe_nS`?LIfw;9~&7gGo=0WJ8&AWiQskd4F5mVP>7R4 z@Va;a&j81UsQ{<*p|9Q7g2y5M7r1mD{0f|or$$U_biYqt8zAsZ8BYMG^XocrqfZ|8 zPXed$bPAl7?~7Y6cm(oFOrGr|{4{t6hgrxXs6*U@dqw@;`x7fBXD-LgcN6*5^zUmS1P|1E=-y z`KK2+hFWGhIEM5(z6cycBy%2|?)S-`1_aA|)j z2e*NVEOank>C!WJp5K7@=s*^rpUvgTq>V}hfmURyj#Y% ziTs9)H)|!x_e`s=XBs%I&wJo?^@Tm>!0q4){K2j|KgWd%JYB|DgVXpv3@#mqABpnM z!}vNq@Y|R$K~IsCquc}Fv|c}g*VPyDZCbOu-rm?r_xt==DDo{*4m~v@ZwzDV3ZM;5|_}DPI8o3gotckMqex&s~u>L#LN=`_n96 z9s#Gv`QrA3$bXh`Ya2oTP!uZFvk{!yQI0=2q)w0jGlHGZp%Qg=!k$Us^!P>KVh?}~hzj0d+9VFO%^Snm)|P#_hh`CnPp}{Z`d?kJCf*s4}3cEYr*kfUAa%k z2>dDRl=3%3zEH-4V+DEDjQa9RL_SN#wQ+*{JsF<^PRq-IlTd{^dme&Q`>VmF_D{F4 zydPbFv>v|x_y_nJi`68&3VE=vaI{VS?%fX?7nG9iCKcD?gIt%=cj4u`WL=+;GZ`?&F_gC<`a?K30 z3>+IKXHNa|h@&EZN5=mY`8gSn>?-Kd&aJP<4o=r~oxuA_?EetFC-TMMJtX`N_>0JY z0p3f(JK6-^bY6Y#2FFy#3&uske6EZKcN5n6)!;8k^!F5b z^P>8EGI%27dV$k=_}c3ekuQ>QRd?aM^=t4HiTqHJw=J&E-vf__TpoBwiTrhue<z^lE|MH`C1uo+*7zda}Jyy=hNR$IL=n&jGiR@$mh#= zLSI2ot&DF5?*qLrEvtW?_`As0%Xrs*EI+>d3{H>p*|R|8vCHf8Z@|Yv&J8|RBA<{f z@ERF^U*v;ct1lniUy$D~+_$%>A1QG zoR;IOuVsM1FUa^jaN0kgT~)td9}>A;#vg-sf&5$G(th1}pujK6_zaOZf4#o^9+3~0 z@p~d)CgU-K1pOyvd=j_~_V{D6?uxCizS~5eB;$8PK3~S82Mc;CWPFmy)mRkN(=YN~ zGJXeq4D6T(K3ZbWfFT0EF5@48CqS<2TFLbvOuV%spDp9Yp@RGY8P65@V;SEDo=Ww< zQU88@)0YJPmW)pX?*{q5z^Pqz{uFtqH|z61z`H|kCOAFLCvO=h@B=bF1Dxt*->P5V z{UT40@kik8Anyj(`}AWRer~wHH_Lc`@XnC?3cPNfg8V{}2fSUM9|x!L+#8%8$J-Bi z^$6iQQXx3q@8i9|ZO9)1uZsuB7lPAqTd__u-hzJ#PW|5pd+qYwVwDlg!D+cJ@I-8V`eR42{Qb=j!0CA4<8#4jJs*He{c{jJ z3Oshb$Z-e)j$o~YMjC{g-k~oKaT)JTYVsNSb6Tqq6hry-o=mDqg_y@SO9WR2@ zdPRBb*Q=>h7$02Vb>jod9RN<_@*QwmZ(qIK;8f3PnVvo1w7s>P>&J5qIJLtHE^U`* zTtd4~1gGub(?1NH#?`yvb^RIwD@FNhGWkky8lSFX@`}Oaag}yA**8wi=zx}{FKz=!Rdx`#O;N6k`1iYJs?+54W4=#44w0PGIR9 zDw!9+pOVNo1E=-x2JUNjs;4(N^>ZG$&(D<410Mzc5jc%^UO)IX@KEIaw&EE+A4j>5 zz#Aj~EO;XcZ{Mk7^3QLpFP{KT?FxUDx91;&s{WcU_>bE3t>Srgo)Xy2aJ!E~&zM{xP9}kyBzze-m3tRFO~P-3Q~OlAB<+QU z3YaAH_i%7uf2Vd10uO?`6Z|QOo|nPt_&yapPQurLQ-6I3PV3=|!!6*{Z+pS({09B| zL|!4|mEd$9IR{S5@##_I3D=_;tFs`XO+sAK1ylJf+_AWS*k(UBGF4cL%5Qu+PqE;8g!iaH;;?;I#hxz@>3@ z3_J$B0vu}V^!z3Ahca%MBKXI!x4wVIg41z16P)%xpFNwvsT~`^ed9K@|2uFC_%-l2 ziG1i(K~KoO`g(?gQ@w-1X}x{=SAuJir~ha>P)=WZ_cl27J7v#H_-EjL$VcISjf8(C z@>m(aByw5@sr>gMr)?(XzluCr#{U%gP#IU`vwYl)0axLF-hOPg;M7h!)=2d~CGuBf zJWS-1Wc+!N&yaDW$mhs-JUI2|0{k!aXAhAtm+^igUnAo~MedRDRB+lZ@8N%GyA+G^ zCuQ=>M1EGr*NS>B%k&%;#$nWP3guc121ii@okM_-ZUl8?ila# z?T-`p#~CN(=&-7&&ZF(v^<|9AF@2ML;EV*k5?#3KGn z7x-#n6{{>9ZL}D~ytv;Y*4kpCE)c715vy$R<;AL7gsK}Y7Ey^PXBCxO1*Il~sNCw? zFCJ&L3NAE=d4omFi`;1V?>r%xWikkdnQ#~l4wF%+i^<^IFBESw#ERw$)i4?2#JpgJ zNi@S`^o56DmdO~MIwILEaJGd=hL{t>KG&bwysHj2ww(Vq-p{;!qze&%|bwx#G z=S+%<8k^;Gt%=yq?=xo$B%FO;^4OQ{}}!lV_c@$Y>YF;MjP?Z zY_&V=J$V~qcpE0=IisS|v&WBjrRR;!&O%9<_DPvhQ4{PrC@s&GOAG7MwtL&5yxM;l zHx?pMQF*!cv3b-=Cc0;puFH!UtFEc2|mEJQy&z0q*qHPEEf_Qh)E0e~LO@~8#)(d(>rx=ZsaAYbB z!lAG!-4GpT$Z*6OozdxLOS+l2$tc()_&5ha9EBkwH4DCtib~GTN~TW!R|X0Pq-SSM zapmSkMfJ+fol!(@uGjIs3vd0?ju`w>Q$z{&Kc;x*5hgHrv zS9(UY$r0OVMK<|}ioHQit~M#oxWTt-K9G_@)^mJh1I z|LjcmtZ7kE30c!>0q_&+L=V;6SNgtm*X>zU$ zX(t8Fwp72x91~}CW!PO#hdtJ8`p^1JhD6xf&z?g=tgictrn<~=7MHf2iu-b`bTS(KvN%US=xwiYpf;I!s2ZAw4?AVlld6O|h>3Rj-*2BhY6|kB*CV z;JGd(8uf3`DrY}O=nNN6+|Fq>OqV=N|Xx-r(sk3iA?wvkN#w&qVXVoWnQ%tl9? zJ;rH{&EWe4)fk(Xnd`DUV=#%>#~b7N(oG-Nw7MQ|rmllUF;hrrb$DTDd{S{0uMx(>^^4P3Y9-vf{EP`09ecPOlV9f5APbw!=`L5C#p;SlcV$?dW(T$De^6t$7z|E0KEvTKI_wV1 z|Ek7rG`P%Y6Gt2tf*EoDqZ%}d*=RRAF+ADhOin?K`JaQ6IJG&lb91w&Mnw(I?msol z<)q%R~%P-=oMDM)51JHIoABo!H!=!*mDtS81tOGx@e4U(BzDc zbr~&YOPs?MXN)!pUW()G!g55aNw!ECoGmU>V44-C35yqK#5&m#ZH_gWOjr=Q41DJ| z3mPX+8ao|>*}q)Z{7dViGcxSy4udP*VK-W0qxo)X7UtxCql=ChQBmSbXi%Ojhq^8f zbxqCAa=|)7j4?Jg)@d~v?O4k>_<;W(G-BFwrt&60XPhb4ff>Ub<8+wf;;j7eWTtby z(J(fPuH`0;O`n7@68?9kI;Q2hCgC7VQx=yiCN4VKX)>ELjC@@E;~;B#cFwd^%z@ch zNsPDWzj@mdW6a2~X1GlDxM*jb`TtgDi`8t1i^(uJGK^N2!~TCeINe~$h%*>n z8BQ0gR#Wv?KEX$WX`l3?JwGp)o zBl5q}o?_3<8*3lmb7K86FxsL7lWQUhFxaExtQM2qnc>9gqw~o)ATeJU2>(L?|F#yU z@pN*uxJ+?QCq_lH-Dv#RE{YWf$p26VDj}XLb)(kTs}Y^4`AJ=G{I>n-CF`&V$ScFwvj05w(#TtjPp`LGJCt$_Fi&?E$qNK-}FxR*sE==uw;L)ky zkdXWG#Y%c1l{HecQ?oNtr_jYRhBVBPj`WzA7_;3K zYm^Ku5H^dY;{+o%#%gf7Fj6_p4vFKa(4?t2O@k&Z0u31LOy(F|+KZ9YUm|2eS-4VT zwqmHlYE4+W@Zl*Diit7c%-3u;S?uOmhpB!Ae8nN4T$m{xaaLo7CByY(ri+$nO1B%V zv2hNE8RJE)(<$baPi7+Crab#AbbaKCw%V;&#oJ9rb8NbkzeFTNIEsr!~Y0t#7|X&WMI~ z;EXi}mtqa+E@3_B^O!`=YR1wt!(un#gb@K;KOiM?88}6ab~t0B&Gu+aijw$3UpAU> ziD!f>H+u*TN`6R6ot%}P=}LcvUxb?t_H-vsNO77HYc~ql8w6MV(uvPEavuQBHG`1+FVO=K7BsztE#-#_* zYz_Kb)CBdz@%~wq2o>Jjyu>tzFj+KVoq7A~Y$e8R9ybn*XqhO?L6D$+C9`py?8;Ef z-BIqyB94Oyi)D>)oMo-|rk?G~d{SGKfs(hgt%|NdHJPsN$8m&UG3EZG$KuvHo%Ai`Zz`dB^P_w)6Dc`+wcnZGoldmK~!v92Z*^ zM!a}fG|DRQ9t6zFCX%OYFLs&!Ld>(I#)1|j2&X)?_0J7kr^)gp&MSl#Pncf+yyP&NmYW7+JGROTn*e)R#XbmlN}IB(FKq(e zTMRU1lonap295Xjt#*bhx9oxf!5Wb~wl>`}n}AK54K8kA)R-)fFhJK;$IkR_qxIUeu5Nf9OcIBAm3y!5`sW=Mh}>XObw&Jh59kcA}8l7N zd5_h(LN&%pr0zUvxDtzP-7CWw<6)7730}r5nQf61-7DK7!Lo+^GDk^?W*g;1p*qi* zaKy+C>qcm8=;Pi!QAnRz`~=wk>a>lfH%Az#=W;Jj!2O~86LbCHS>%qiM(IZ#zz9&Y zJ*Rsoj8<0HnLSO!jfuS{in_K=&2%=-733DoQFxOmiSnwjZqZ?I=L#aHV-96_Nt0J` zF}+F86-3oN>=&grPr+i*R}qo-K$e zv}jPK@`A@YpWf%^3d-i^eaCi>Hy}u-XD5u;R)2qY6d}ATGt(qEDOrsqsb_sn)^F3ib4(M6LKtl*#Z%G)bD}Ce6@ACRL4J6*$Rb ztW0>Ix-^|$UBg#Nz&p%!l_8U*xUtvk!c7@Rr5GNPD9dM0>QEOmj&5u+P91vbY)=kf zm1%`QT9jeJOz_ODw^(Lvi$qZ)Tqfw!)7yHet450k(8TRr#Vw-tq^{J008BCiIxN*` z!!uWQ9AO@#pvE?PvWFj23 zDzGiQwJFZd0^bN{jLkB83E!rPEWzE5ev_4;>T=&O${KENqQ?Y;bQYjxjxSGy=*fk! zxw7GX;8=o5=|KFU;05{gV!yt+EN-!u=P1Q_Tj#;_$ZoDKedxL;HDx2_V}wIvPD}i} zzCHh%smpZzpT%&6y{E$`A9lHzWUA?@-rT_qi|r5r$P3lQ;9h50dgkA zTs=V~F5g(J^_U!aXloN!Eb?S!uc`@5BK~G9sUa^$)V`vo43lt$O&RPGh^(0~c~zg< z82vD-(jcgCG0#-xGd1<_rK}LqipMAmxe2E0cBXj${&(1;s;&j&0B95E`qs%EUn3B6 z5!Mf|GX`Il#efaU)|no7HDGnjMfMAFo|IsE);85pW4}##8L)4P^1OLr$38R$`%}hs z9VQ0Y!t_x*(}%nPxO{5?E~deeTsP`pLLi(<^Be1k@f%}mD?+dYNMzIX02_1vWM82_5`~)V<+X(;D%e(6;jM!xe$PI6O9b-{=b%iN@hcHDmO>zUW=@mU3FLu-7U_tq+ z#83qo?d6>u>jZbi!vn$wbT4Z&-IrG_{8%SPEx{IOV*K+}GBe&^Rj2o6$W342=dY8p zL%jD6AwWG-sGxFu?((Te6IYgqqgcN2I{T-NLaD{}C)Yw`C@QW<3nz)OlAtWq4bI@k zUuQs{ymisn{5n8mo!7Lg0CZ;}=<=EZD;(BwwTyk##f}+Ls>C>p{cqe)Yh^r#aMTgO zfk7fc3pecYSzE;~_fNP&)_Mu-fyXQ33BxDpkotOeTd?@k4PfyPH;)3L2Gfk>FGvf8 zP5;(@65Ae7PH+s^%hDRb%Y)^O6(qK_OpwK0FDt>2TQwZ(KYZLWL)qd82sMqZKN@Wb4+2kR-J&^pZXW&o99m0o;=7%UWr93%8%2vV zAJ{p9tTQPp3g&DN`}WfM1sTgm?CXy~)bTxlEY^Am!h?AF?N4!4{9!wP?VC zCT(l{p`N&;HRNSeK2qq(B!VRVNSY(@I+(I@uEWIs1Jz%vB z6x3AS-u$XyNrW>rB3vf?KM@1NrZ`t9De=ve0GC3nmjD#E9R>xWl%-H{!PtM#(p@eTDD;ErNoVXe}D6A%niQ+Y;gt$e9$K8qO1kdTD9%? z&L)I=-M8-LTm^gT2fN+Z^4;X^bZ?ujf%R%q!W$Bz3xI3zQh1x)Z)07Qlgd}ykbNh& z-_Qz>+_dHj4$2OJ$@AVM>cKLRT)Bfdmt(ZGf6rUWt&-t8A@-r^63ow@5mqOPxzblVd-vJPiTz zHKDasO?=R7k}lL3-L~>TVZ7q_#1TFpG$_yIyJ?tx%wE&5w;RF~3s4K8=MC9Z%Vb@r1`7zzUN+TN!=_p`|K;#+4s)O8A@L@lzXZ3EkL{)pkAg2V$-ngX;bfWM z;kW(6Vc*_9$-{sKjV~p|zg!ybwo&ojSU%%arZML;sFD=G%rNB}%NK2%5}5|jyNXJD zg4dSE4hY5peJaU9beM6;H@1%@7q1LgQd~z>9gJex#`1WiiD4{p5aT8dJ=gBW^4R$W zYi)pd;XgIwv$wH)SEC=Y>r!C8xa>E~e|)?bGm^IlT43dP-&4>K9ZL83I-TspvJS#M za8H3533&AjPgFQnhlWH;gfdoP;#upgsR^gQyno{!e2zTAnx!Bsd5S$d)u{#(-S@KP zn^r6+X#6Z1rsRuTZYU`bQ}AJ!@j&k&P;D=X#}U_GhKSOk;Cb)(#olr|6C#ZkfZMHT z^UE7_=q(<7)Gtu=Y>*Jp`S#v+08-;B2jo&2+;gJ_fhhEJB(|vdNq@JO%GY0fqYvP6 zQJXXZJ4_>E1B4YVa5HxHnm;R5xx;>DsZX1jvt z3dnQ_@Me^b&h;MI843)=Js>Dz-N1W+H3#p(xUJ5#jE7k+9Xc++@eqtEND+Y1p?Be* zDW1Wfux}3<-yfz$8rB30mxgFF@APgf&n1;$Ey)RQBI3jYJ)RrA*FNwfw0I)#fp1`c z+ctc!dVT$$k(C*7a{W1D0PvfU2(KGgUcXClb-5{bdd1b9P57D7G zw|TmUxj$JLbKSmuyph5=zCkV_5Mc)BnkV0`6^^83vGw((>&j4+klYNIcHn8~Yo%i; zjdaug-WSK{7lK2oPyi5RJt6*F@n46&)9n^>cMPI9Hi&(5qIU&Z~gM69pGtf zCLo>=bK~)uUK@edzzF`Ac&MQdAjiTGg9^0>-v9gx7Se|!v_;(wBnCqrNnH?yo+eF` z6s+iY=}mi)6ONVNK=dP8B&gnDK@d}(_q4)o5>WhL5C|`_+FU7QKjg+sc56E#A;8h1{f%nV?{=TZd97Q)1 zoe&of|C5z}O??;%l&OZ}!1HV6s#nz~F|+J6+@nC5t?zL|ec#_dKZpSKiwIxxUyPqX zFeOH!c3TkUyfS?l_G{`RQYaI+UIX<655J!M*VKm}ydXRT!L}q8rqq-8n)=!tLnyeo zf@=XON*~3q~-H~Daa zgUt)KW_et2HJnLUg>E^t%G8i?`5 zFm|?Rq`uC&d@So5g`LL8>lGR%W`E*GY%HA{+_K@!nt3h2uD5n29gkO%0L8%K<>GWs z)!=Mfghe%JPK+}UU!r&Iy?bJ`qYa9nTO>;i-w~8`RjIPVsfKVS!!h-T*kO{C0Mo1{ z4ji$XoAliLWFnkc`&$JZ6;du-OO=>FR2sIe*`G0m{MYWONJ8;*UOl$5C7Ji~)S0f5`r30pu+ zj4{S{OzNO6=5;bP{ikIJG&@A_h$RxjYWjYydG+uYi`}X@s|AZlU=5ILXxSpwTu*&V z=pim$e3WcRLdnj4i*+VxLUu$3NT9P2HdimLGqd4W4@$AJpmicgFt5N}hTsl`i`oHP z-?!L~Q$`|(3T9Oz$RjAIuN)6FJT z`!zu1)eX72d~tm|93bBr_frW~M8@0+qoGhBZyi}WdFt(^N`zj6@L|Ai89Y^+_a;H~ zR${PEe;>ku46aDVMNdyY%;_n zU@P>6h|9$A8=b3Ov^$5U#rum=jNv#Ja7CzZu&Y=vfXmF#Rx7!Af<8hCZJl01 zC>#tpA>t=ch0bbasRb6eirsJjxP7QfOQ<$soOb{Gr9c^eYCF|P-62Q-oY$0^PAE*~>BT%Q;y z2;xmKzLk~~B7M^qi1Y@O&=M_93^)FOw;ux(JTZD702q`2u+MMbLXo#P?U97Srh_j; zPy5@>60TXoc7?|YY&pNb{TK*;z`PB;h{3!bHU2udbE!(gZs)5h%T2awv53MDuo=+D z99Ej#qBBxUAbU;S6Fd?-bwCDX&>;&A5GGStmI{4n-m-q8Yy!OG1vF%wvQS^}Y5k{9 zup40i!AT-pl!pNSImBf6&}$2W*xH7NtZiDNHHH3<-{dr7$KxkXGH`z$%R0#+A;S`4 zZy{^baa}~+I8B1@HvxMPE%2+}(2f^Rf=Y?11&m&hbircaQwx`|Wv$T(WIFfUh)iGZ zpwT!5noCB|$G~Ivg7FfYBq8_WI@B}p7A>Us2yWB_MgR{4s2v0ixVoHcEwvUqRU935 zMvPpOt5ua(#w8g5CTN@i*qpS#AC+W~;Nh%8cqi5ol(R)?yC$w(hf_<9VFpU%iu+nT zoi-%OHF1K+*zf<4>tUuU%UYNPstn`@mmlmb1Sf&uvPZ+uV=!HI6a56US!44|Or~)9 zoivu$`-6TgYDNuVMhXHDC?D)&_N9BHW}2}XAV3`uLCF4yGsknFTg-39LZV=QokF6P zyI3({=vI9Bxe>P_ljdAz&&;z z{E=Lm4wr`>nPN~aI|zM?z{2ibON)!`J1prIgQ^iT%WZM;awF71$WR~}gsK`QdD(ey z*2;Lnp{+wdNn8`e7Z`r^rOd31e&uEmuq8kqd1~|rnKy)9{h0#`XLyI37u^h0n!}}M zR&cZp*-bZT-V${KCp~k=WYfaLu;08$HpTLZ5 z-OTUTS_e^PMh-80_|TOn>Lh>1)-Z&$pja#L=Uj`bg1lvGvzs1URs-1(&}||}BFj4P zj?Ka9g!cr1GSQVV^Q(sbj?FQP;+{mTDdA_dv{did9Ki`Bbbzg1B65hO*Sr4>@53~qX*1B%qvpLLF@F9?3ARx1ZHEg_Na}7)@VB`|W_%NEr zRtS2(gMec-lIUwNM;UNsHF><_=mdEOH6ez&ir`P{1b@foP{_%-)3yO|V^QKnJ!^Ck zDYU|WgV2wkQF8eG`Ll!tTQoL;+zAOxRQ;vqpGPSPvrsWA5cnVj_4;~`hDiQKcrwJ% zIHLuvpbbq-7`>I{!wEdi0xBn_bP9>^D*yF>Ik@tHiDDlQ#WGx~9_V6!oOZ#yiGNn- zZt%7`N9lF5$0dbp96U1icnB$EQ28WL<5s)O$p|C{Hi!=7@Y8#Jd}NI$$Lt!ys8 zDvo%!14z8v?e~g@T#jr0VGo;>xfJN6{#ne(ttcIY)4||RAhI2#)z(N_b~+QJ(=D7@ zwJ^J!)TY3~L5mZCHbx`ifa?g~zP(YeYJ_7M1&%mZ95$9lG`Ba`{ILD|@KCiMTASHr zVgi{O=;cqRlUj-)73fKUAGpfN)Sx4@4W6A*Lhkzvg3IM}>f0%uj___mPZ9mF;S&9# z5^ZiF7%y+ruHje5o7=`MGkXVmaruie#~;*NLN!U8Pe`DbWn0ayVa}W1Ct?&^g-T$H zlb`<~unBvsef`C^dde4@NOjBgn~ew-a5<8W29Br3CIox`R!NbEW{DM8!i3=H)TMp* zu@(d-g~VDDnE)|}&8qVLVFW4&5t?dtv4~p@n3H=D z?o4o*-@e`4L&f#X_MrHCgLU4m#45Vf!A;^1&JT@j1Y9q1x<>V0B{WW z_>lN48)@))8V19Lp&YbjSreP3*N1CZZ|NaB=Wgd^=iKd9b8Rl)2raH&z#rRR)B_|w z0p56wIAH?|X8>(7ctLxbyf^pF+s!48bB|Y2`~$R1a1lwvFgucERri;*YkJH49@(YA zk6!f^Q)1h9?QqZUJRD#^_=pk-Xx?^e(qGvpG4N5)^-k!=r+9 zQg$1D#`Z(N{9%KH3-vTud3CUS&hf`2nSj~5gYO3c&C)k~&h{ai3ZUa44-;WqC^LE@ ztgz;t2)+2Kn`epC;!xi_|Hu!^LqEOvwn0b8Vu_)mf~j7(H*DUdVqGnqcR;V<#T!5E zg#78WcuX*RzzPuWhes-H?X_=JMJrd>%6iHrf!<6gmo81g`PM<}L1a)=2DT`|bM4-@ zt%x{&l_ii5NE=-SQrG%fCE+`4 z5|hN?F5CBVB`#)jM6ASAEh!Az8T_^(QZ`DCDf$0bGb_+_qPz1|OP4W#Q=!y6bZ4$Jxh!7y0P8JST z_9RU@#N(a7=-Q+Lg>SP}Zmp}QS!shTCZ%Q!KYuKXJe}L~{TY*&Ba_vDnDDa$oZ*tgdrhCtqoLp>o#iWR|*1SL1mk8^xUnY;vwdTm;q(HaqCh>cR4= z0prZ)h!9mktOCY%;O3Tc!~2|f%p_kO$(5+gJ2r;K60}w2lY|;Ht;mTfx#tncN&7^; z3T)}K4ZO9QJSRSc6g9Zhp6 zAU&#Zq0RTyTK^n6xaP_sK8||=eF>!Ph6!>d31yX(r;;p^{4_Q`@4^`RoT{KJFd=sx zG*Yml+2Fj5MM<88`2hN%f}CY=oNVat04RfggS@GPLJ@P&!69=^*@k@%{{#pw^vm30 ztS)p};(kbGz%Hyw9ZSNjmek4w(v|8G+g>;!Y&hV);O@idxMhXL*g}|8@OY3_oPz+F zf;v(+vr-Hyq@(@ECbhMc~Hk!_eSY1!fr@yiLk1*>`kx30w>ZfMySuF2s}f7zPY zAOk1TOwSwCaJTjGR^o~r5hlEJ#Q6gUAx;3REPHdM!)wLJeQrq3L}CMYP7n>&iao() zLW1r+y!m}*6U`~e7LFr=Jsm;lY=qfQb5Dy2CGK!v>D48~yl_6_95Tp_q_HI`YNhcF zwZO_tU=NbFB#w3&?yl_1#mA9oQ%Ix**vEQysOWeLN%!)=vzzhTWBPtfY~;y%X)Gyd)Tu%Im&v!adk)trBS*Z1^4WA}d3}ZM^z6j_c}rF0M3##Uu^6Fy`te5@rB3|E&;HC*lLNGvMv2MS2XeQ@11qIp?OF$f~P51f^&EQOo zn6?f+Bhq+UHkQlHh{vvBuW%fnp$C1C*BG&weFsg0WPamu-L_rUYJwt%P*#GqG9+LU zHgBsb6K-}Qy`gR8MS=BH0)5FvpYi-4f{{L(cLN+}P-3<1lbWKMf&RTuX$^h)qz z)e#d(pt&=7O<(Di%X&Hdiw*JeR74tp{RMcC+L)osYyX0VV9SG&T2gnD!4J3RyG>ok zx`3J{r?m#4&lPJC*w?1+nV{ZD_$xaHzdqJB#9_p&jKnA#`@B{afN_YtAtomt5<;Xk zX>n7pE-q+7_TCNyek~~}Q08CS=Zg)&4~;Pe2qBR?xcxTHbKXmN@JNv~rhSGLl~{aI z-V*fyr4|v7aF=iE^ohDi4nW5`5*-l(R9pYWrK986qQZpqJMg{1kXVqt`Kq#bO<<%z zPUgKO`OCJ6k43bSokq+OkzJ5U04D4==0ek)?RP{0E%mbA&nFY&6@JK(mEofrJv7)a#J=OLB?UT@hTERMq9ihrvTtu zQMgSEfBmMj>WW{yR6>HFjDbRvhzh8Hx9y3om6L;3;+}zE3XQ&voxC{h*{Dxq3BpVT z;0ve$W~*(x-7C+<)Nr^tFsPK!5p9||FOEF{B#sgd0SDX|q-VaiyhH|<1ie;pZDQ=* zcGUa!FD_jXKw&~?XNljM7^!VK$L8AW1l~WSZFW9N#KL^P{;KD~veMtMShul@k&_HK z5DdVZCeN<`$OTOH74Zj2jYz)jjVc}mq6T;8?_4^tZi0`6Zw=oF`kD13UV51(HIPMw zlpHW%6adaM2eX;f5E|?vOE;K%-vWTn@LrJC8MYacF)k^Aij-`41d?|3JEdMt{z3HOqY3WH=lY`>A}9+o z9j9DigsmD&#L8(}Dcjk^jPQsNbpZ!uNzP?tvSt7Lvc|UC8>b3Lr%*Cs^J@rgu!PLh zN$?AY%6+OyJX9Ou(W{BM6{c_qDQr4~)1{${Qvj*t0MX)5u7Rj!zEZM=lE?aN&%@B` zxlq?OEfSa3LwXLOe?ZuPMGEBV*?Qn(f4Kic^*m>*BUDkRV-E&$FOw=fHe>C=qKxxT z_9@|AHc;W@AY+*!IUWGmI@nD}8bc06%Yrm5lsWHq=Dh1z_U=FJ`Aa3o750gc09x>c z(5iAuR*b=m8fg5_mVAP8Q&17zz=*^SZ=t3o6rP+e%b8hJ!Yw8otq{#>UA7)L)vBBr z6sQYflU{o#=k>2ykTUB3$kLAg{O(>fb*O*=0KxY z4vM6ob082p%YCGM`oxgpUX@#VMt~qwCa>24tX@fV~54xN>Iax(7-+1 z%I4rpNzRJO(_#3+0Oa6X!u&#a6jDgo zfUsNScn`P$8q4HX3?G`fc{oafuIBjY4Ch#IVGHE}CsG(|wzUL|1(KmB;MkAKubq+{ zz3noNIuv@TrP}qHi0*#dKmQ3OTX}m_<0wi4`WOKSmyUxFIvjV02-k79ivW`a!$i(4%znj_(Yn+}PaXoAeOu8*=uvpvnDqhLOo(%Y-Tp?*vXP`#6syOO}Pk1|>sb5TtOXNG^eSPfbiu zyNBap92!svQk!&;XX2;mEJA(U6rq_G7#m6vyG_?pg7i}Cz}d($ua#k7DL02?8z(B4 z*l8y-jsuGqWya=83G6^*5iOXrH=7eXt{ZNxVaaghLfD6p3OhF(Eb}GPag7DWhS(fA z=PE%Jom`P>N`o-A3sHyn3Q`pC&mh5k9hf7KY zvtsxeNLQ5e?!t?VA#gVB2Diqu7kJNvp+`%aWTFo&cbd1j!H46Wz*>b2>g%2o%0yZR zx6)n+6zMA0HAJ9f63a+Yfk|}QX1HF9oFeL#+YLt1P7ZmA+X{a~6xU$8xgWOFqi4&n z$6G1T*)?}CIj$iFjTSSwHaNYsCeck_bf z(aVvqvg#bRZ%uyDWJ?zKb&gM{ z`csV{!^UB4aLCFmw_rlScZfDf;vKa`IOb}vFF#Y_8wzahh~yzd?nQvE1?MzdJQLmC za98#wT)KgmhBOw~g18Z&Wt?v;{rn>?EItL}21yI5GdCl4g4w4g`GKnYn^oeL;-PSV zsT%k^VDBZjc`11(=ABEyukWQ0SE%w^(Wnu;GWY{Y>Ox+o`I8&YJ_mS%{Rz8PT|&~^ z&OcAw=iUS;-7FFdFEAJzO`D8jo^A!5ovj2WYjVhAtijM$^7u_F2~)W}hn{d}Nbb;~2V}&E*&cZP z$p1xppjlxhSl8B_=}yH6{0?lHK@?JuNK(RpY;?jK2w{BVy=>iH8*YqIl1V~X-09_msk ztOUz-tBw{Z$(Y#`4m6&0h(r3$7DEtH7-+rvXX`@!_@HUAI3i+f<*Gy2!&4$fucJpj zIfVuR1BwU~wuWUdYdhv6lIc#IxI3&dhYoAXj#2A$*o;}b8`BSX?7tm4*MS&HP*of3 zbBq{PynZ4v4h?hI|D70ornB4EEStRe_Thl-O?*`t5ZL`{8#-`w1v*<8B~R7L_hAne1bTcy?~Hx#|lvtOj1^F5OUxgPuoD*EGdygS}5PZm9M&w4RU$A+kIKr?bFjYLL9j9 z3BaBaau;A-guBiWW$0>%(^0Z7MlOSAhlHn=^$Zga$WsXH@k`)t(Ob{w)^xNN7Fx># zty$dZ)5ad;_7bAn zH}Z1cJ<c%C&kAmV~TkP%bK*@kr5cb+~&3#^VV zkS@TKY!c3?kHeU6nZ}#yMqX!m4LU3NZ*yRBXd7}AHCllC_0ivp;#ck70whsX?5cEdU{5Xs0Tzh03o?Fu@<$2 z>Z5S$uC1S+|Ccv8WdOq!H$G5>($%^{Pj<=>7Wo=3BT}hax6J7>Yybv}a4h#60thru zwUskh%9zkT(G;>){~*WUMvgjCvPnLB)uV=Tx$>9gqeP!&p(Qe0RR=FjPWOA@(69Z3N9Bc${yFU9dBMlk4Jd zW*5i&%r3wM!{xM3%bjAq|0^@JexANhhqhppS_so$q$C^LIOx zX=vXO^Q5(ZViEq2)VaKB1+_F1#><~h2i)Rzl-!s&s7Otgl<3de5vzCUS>El=5*hj5 ze86E#^2PRExm$#z>1TRr=fyF7^xe1dvTj<8d7`9R=G2LY9tdbj5Zv570FZ2_j8EuG zWXo>XCrR4v{_ElXziUDIy&i>7TFD{?=y~sQyj28NM!3fktN`chiWhac z`0IHXF{#7>O+^G&8_i+););7jC8`Pe#rPkglvt2n-qR6l2$l=uqxklS1xHtXaUaJj zx!(W>LFghnAh~jeDpM=1Cn~I)Ol%Ri|7<@Ehd&n8p52pxej;>;{OzP{1Pi&j0?jDt zDoM#19^e)MYC@c*#KE~$9hDA%i0!X8_uvxlZ!oET6xceb2jX7wlr{$K^?Z@g{98)? zyZj^w7a4|f*t>0oYl@_*$R+rL4T&|hw%E$A_MTqc0#<*T*}b4;z`$K#Um;Ehl)_8v zA+aE2*^)7uQ41F2Mz3wvGWOV1{LuUNA0}CWf-B;krVk5tOUcWA)z2W#yi` zdHPK5K0hTL`z0f9J-9DKcd!$-I{Uhd`D8KKDm9b`u_o=lY#Oz%aNV&FNc9e9dYnr# zJwtSct;(u+GtI;Gjladp4T1dw(jq@eWd+i;{d=mc3S1j_>qGLkVIKidEQ7UGo=7xs zx_=U%hw_F3N3;btWm}njs!vpATTSQN$T?T@O2lzGaD#9>ODXuMDpd5FghjZMHLcVxS+h{HnuUiCr z^3F&&*HxvVeh^oZL+oe6eq?JR$2Pz)0=m#7 zI)Az3qeN_sdLel2{Dl+C>aqZ4K!LEb z4j?i?aC$vnFVJ)l|9~|kbd!@_``dH90Gb5ouL>^?C>>yG(-zd@V9fxtCGbR{m0jd) z^#OsXNev(c7LE?<(@N!Md<`mRO)4MGfsBQ9!u|(VIZ9GV@-88b!!G56qM!aJ&1Lw9 zz)sLrYx05t3_@WoQvWW%>L?(emXx3_4HSo%AS3+wm?b&N{tdJI7&>4es`zQi^9!QI zUt0OtNZ0odoq+x52O+UI%E^$Dz=o6xquJ1NzV5k1LV@K&ZVb*Ari#j+KKbhD&r)s! zQZGT$Rgl&b11dh3SzYcc0()Qw4Z-R_SOFo!`d8ThQJUj2%t>WS3b^&J*jzA?@emb; zR3(BEn)Keah1AZhD;!WDj@(4UL1e_d1K@&*ikSrbO}CpfoZMQ z)nJ%!6BZ2~6wdJME8$pVzFLA03MBs$%n}iU*3P6aQbda>cL$DLnO9PzmB6;S?pde# zD97)>J1E-?kDGw5W_t>_G`S^fmEn+glDb2B!}ScDciKJgLlUF_h9!wI0fksko&2cx z3O)2b1f>rwfW(^Un{4UX4)s3l&~YOm+7XEhB%iF;w7{7{Y(@VA(ES(LrFvNr#9e=E z;UE%uI}XVBjz)`ulLD*rN4O~M7&PV8=#Uynj}3}R@}&+7CLj$9+8VBuqe z?3*xt62yY2BqTf+N=MZjCuSU@<3#pjF@}Op6>8UJTGQ z4f^iJN*KXC6ey0WgTAA!5+(?y9RBW&m4tsDthl^)>JH{%t_t!cpv}R#zo{$3T(+pT z;G*EX5N%{~@MR?|jpeu!{S|A1nuKKp8{8|dJ|b=bTOZ;lF<{EXI$6(?wHUXH+)%K} zWukNgz(RSGFp4Xy!41lWEQBcyD`<^G4eZN*c+ZY$KC?s-#*(H4Uje{o2_xOsow1&$ zBXRCr=isPG+K7DI5JQFsgxmG+ivV8pBIUHlIk?}8^%Hl6 z-4we9?-#Kvm%iui2SNj&4;v4ufc=|nwLe668qA4ML(?5_5Ettw*uu1^GEjdYNcwwc zwSEW};f%v1N~So(2Y-XCf1fg=721f2NSQae4cEW#aCv|NKtTqfF4QXL*Ndb=DI!%R zbSzP8{4=y#Kgu)FJQ?XJVf-SD?qdCfQNRzz?SnxdJLtvlaY?f!B+{~ho$=y+;6=vd zQ${K2k^#o}Z_R4|xr@t=@LG7S0PCg~$IBju5kf)*k>HfI`}};OeM(Y-i0!~F>8!I> zJX!5ejzoc`LMELG*pZ;@&)1K>k^|%?!i2DYqFOF~FM=1~OgfWv=|pN-?GMT1LV?5+ zUrQdS%ljEMh*$*7+>j-)PcNRwHpA7)<6(&JBGAZxQ`h^`VW%cTc-BHwM_R(!cngtM zSIkuCfQ`hq!uu1V!E7rfs3(HLnxcbcDH6Z+WGzm#r8Z1nXW-Frv}OKlCL=mk3SPDb zah(7;Zp&h04&}?zQwpDur1aAEoSE{4Ag15*94>lo#PugJWCWp3fWYLCZQ2OK`bdB z;xfgIM2h;B@SNF{oGZ!wNK_LM!NQ*jmF)I55%00NGQ;xb{Vu^m(7JyPDF|&Vy zV*#_V*(AMbM%*p>DltwId5@{=zrwE-fD{sTJPbvWTXU_h+|=NEQQgt6pgZ!_QLir0 zA#k7N5agl>GQyBePznB9qWN1hkAc(h_ zT+-Kt-76u|6x$9VqolN%j&YzTH4y10@Q7ugZZl=@_nRC)1M@1R+nAY2HX->zS3e_t zJkU>+A;dVsc26~mw-j<0F=ha{f+6%oZIX;93{1vJM8BQy(V=f8i6AgF6Zyh~@D`q^ zt;|{yF2l-exMFz-PkaV23L`hnyF3_V%bIQP)Z!9MGDBZ1Rdd5zNC+$`a7h_U1lF{< z?e%0O4&f#!c~@a2kStUF%%7@eRHDy|8VpRhkQ&a- zpKYJ~KU}vN-ec@ztl_l%jHs|Zmv}TYcYX2IzrWz0)W>7#y=N{~j4znXaa$pHOP1J| zR=ZHHS!fvhVbX<#hE$ld`QF~&Ma2Xa3e!M^JsUNAF2ioF_$(86irW=B3WAm;=5hW~ zzD*k$agDr!J7QSnRh(m(ENlr0wdvh5xM(?wGD3&M-;>iSpeB>Q6RDL{&Cwp z14DgT++vz1;t&!z($dY2@8OI3Y;{+ z1VSiqG4e=u<`)fF7*_5r_YeX|2@@FhC@@th8q*r{9?fS`jN%gj6lKd|MG{xD!xq|VH0pCZ20s%cCse=lKRvQc|XU5=F zfk~4P{#*hw$c46jM#m~@EW|0V1?E%HzPGRMSOvT`4XRB=6t@9PF}u9a3?y$#s6H+J z#=sOw;$HP?AvDgk-HnwHhYK?Ys-Q$jL-{ma6_7voM5)WeH}ea~!>9k~J$<7s-CC^^ z=*VDWsGuVyx^QkEysmC8I_F6lZm6IJ(#_Q=G*^IMXX|iP_3n}EQDVT&y`r0A zr9h*2j==u_O=f{+`}3-?kCk%j2(p7K1+)OHyt8NNs!F|wL~efq*z-CmJJbOGJc28P zT=ej8w?962`P7+;_e>;KZ0oqbCkK#H>GPqyd45W+Mek5le4rNRLR2JX6Jp2kMmLky z2CI5|Yof3DbwKs@ISL-_`;Y^@&uz%|)6JtXA8sB61y1-cDuPhA zD7Ex&?I*DnfmvmLAyB=f^4DAdlw{*oT1cD{3qH9eBS z>?3*43OLLVhsc5kbH{oK7o3>ow1(z*j|s2-C_zz^Q%P_d zOgr-Mkm--i>|Q~E<|c~Fg<(Y_q6TldEcR|^vAg!*+CR-=i+l`|Euz?AhxUbC;8#so zuShl7Ytg;J>;d*fB)-g%JTekcdcu>&8+_hA#rKdO$)d2`aR$SCjJ-%R!wkzP^Wg5U zTz-~W$iH_#WKV#aEo`oX1qmWv;_``En@CeSE;!oDM@l`JM1as=Y5c+Wc3xVz<3AF! z3gkXP9>d5Bnd-P!HXJr}Npk|lTq*M>r3}&=>Jx4m{-5xNZKV=nEG&Ulg_uGCQfw=Q zxfBj^5_S?CfrZ1{hLawqHuTtpk7Xlqs(n|*{f$!+6Eh-T?%z+V#cgh|$zUNci9w10 z=Yly32gQkQ_Z`UTKqJ5b!N0W-iatp6CSlh=e_;cKG(a$d=PSVoChy(Yjmi1SvDHFt zQxfG%K&LRh^xI}_NKSh&@V3Mns08`|#N4Jr>MIV=k6XBk(HpiEs)`Vvx0L$>7>Ey7 zTI*gcgJgoRK;yz8zgP@9pFGs(o1!L2WGPn1z|@2RTXrv$7nh114yB+{v8!@P0Yzva z-5|U9#$p24;j!fgmGo)dg;h*S*BZHQbBVph-Ab6X5Kf+3uvD1QG)@tS2Z|OppcJib z;y7KKNrLzv+fwcoq2kEn7KkEVpTu{au9fpO8dwM-!WhU8O-e1GbMu}SU)~bX^gSs_ zjFH47U~QbW0tdK(#vLjX?0958@JcH2iF@=`A*vH*6#s&E&t9S*Ft7%)EZhZ|r0?MY z@pr!8$hyFH3;b%g`&xdRJl-~ngr{O?1~@UCG5FC-NY<4ZdRQ-Ym6=Fx;z8)kNoHpM zo-3VuhG=>qgs}FIRneOU`-uj7?tO17_;`SkfUocdi^FD7B%eBHoo5cR0O76=VcNmf z;yZ2~1(6n=+S~9aG1p2UG3r7c5J0IV)tu_&SCzlie z4R%C`F<$Nt$z(O1!%N*u)NEz1!P^@}KM9{3vN+Mi)J^o$l~qQ!t)}My!G(bxmRT5< zNTGUVEq!=m)3D1W)S1Dx=K;A0%Qx_SRR!-deW*)fD zfBc=CRmfpez&ls>plIP*#E34LeoGvWS66^R5sU>2SOUQvW4O8k48u5lBo72Ejxfw! zT>)NjA~s7r(l}&E9C>vGcn?}|;;_Ym%qk?O(3Q*B33WW%kG$OAxH==Hd^1Rda7XD zgXfV~SURXrFndglU8hPWdIn_s!g`UsDwPEX4JIZ7PzC_!Ev5j-Opgz!sjEN`zN$_wf}1WyZ2 z1w?n~KLls?MkdsyuuDk?!nA;%nMmnUsG9x5ysZN6EvUc^EL|kN!YRFN1YQq7I$;BV zf&l0Umb{Hq;8oCp-2$Bck-4$-5|#?0VQ;z z+(m@M;!WpeANzl@G?u@8`*MT8b@$Td0}7}CXeu* z5RQ9c*})UztJ^30?`y6GE_F5II=|gOG$K!#n_FBPRt2AcP`97A`DgA-y<~ejdtWtVI1# z64JD=iAhim=P-7ZQ~k&ZG|O)wLlWilCjSe-7)B=KG0L=A4NwAG!&+hNEq6@<72;oE z?^nh`kc0ZdE+^0X>g>5v(oSzrN{F1m-rt5`@%tzi7l%Dzw6I3n1?SH|(A2XZ1#DwU zM8t0B*oyWYdQF8$mIS9H1kFQzMnr%lgUsEB$Pw)v6s0beiVu8I0UQ;2y_kt)FBw$Ii zT-sClnhIN(8i9s(kdh||TK2hgEW789-p_|m-(pstOrx?0iIs(^B)Joj6C^x_>XYy( zE5JD({u%en2h02-wz|@CquOKcMY4fa!8~_;^vwlcm#0n*0Yn8iR@wxdE|x12At!+g36W~#Vco9HKF#| z@x0O!NjzY}gpe{I<2kSNvP9DUg+mh`B7CP}>821bIp!VqnIzZ41i2{W8k1mnsKGmO z(GcM-0cwjcK?wJ?!kZ8iR*h93Q$3)M<+qMMR(cQuA}3iQ!2!f^I8cmj)&5F?vcFjN zRt;lh(Sl4!auGsm7g@dV)W?KZ;zhAm6UQSDF~NQQw5?Q< z_jNFfM89C8f%pwEACem@=evp7VlYn`jO>0C4)8QQ5t#n!w7_)lcS398eyV>PzYlEa z4e?aa=5U)Vz6Y2f({{~8HM8pa7nWGU$Wg{r7r5`8Im`|;<$l98ncD076sm?)X9NHf zU;;fHnR5J@npPlZpBiOKP@VV^dnCdZH>EekOqNh4&e+rV>#;mY+)r1NIux0iJhUM} zul@-biX=akfBwh6UKdxS5F3#u4d4*O$sqXG8ZP`=zP2PbCXkB+28f4)_ych&Rj`aD zk`p(?;kmgQJ1F5gP_iP@TESb(ofLz!B|H3!>bXb=2_*wI8|BL67@Rt)Mg!zD#}<6c#Rs?X5^=`tcPZi&046E|J;Hy=HepfwQ}Q*iNe(0ewbz zYB=4$9v%b|K`c9)Rqf*7rPnv+YE5x{JRBg4AGcKrXGX^S2{~j3cz5&Q(upWw_f{fg zBLqtWz{{Za+P)qm2e!J?`tZDpz=aru4stlDavYh!h8c^j#}K$0al@Q?n2sd_+Sakf zZkov_h9fVK7zzxJ6Di~Df@%4SM}(C3;=#r&4=E?A>Q%kFTzgYSxqvCamLS}2Ue|4X z2c8DCE!Gq=puqfc-OOI>JE4lVdhGM`3Imp*ht7Opk}Zd*lTO|rCDA*Km%w=P`ClA)YCSt-%1|4 zofSQnb2D=)v!ISW4=f@fpui}h(8AYctF~D9@0ZmGR&L}bcO>Vqnj?z#=sB5oyx?5; z@-ef+b&73+Fy#~rUg=md(l>2_pmwkjlCz#@b=(Z^Fbb%N$hr${R*teDX;8$1`L?4V zgET+^grura*q;OcR{I16n6JWNp|`+>K<};aw-uNp?G5yI3xk`{m} z81{_=lDjspU5iuejYS8_>5A)HoT)CJ%e8TWCfXmt_c&tIbTQMbWj)LS+Xmo-n-GE; z;;KNAx!vohkC?8#iGG6rtyxJTHT_On%j^9?KV}1%8lI38G$N=%7~0(1_eSkBV><2v7%sbuyt9upyR-`C-fCfS>u*-&vR5oPbMo5An%;S_tw|+PHo{eF%2{a zCFy&GxJ*|ovq-&H947$~vi~67+E(vE%8UonY(nV40*&c)#Xy z0yNRBNHFzzpu3*zea|2f1ig6WB=bRRLSZJ8u=d)IiCIuK^j) z6=^k;w;bK<-pBaWz_SFRoKTm@F)F-cdk|aUgaI^7fGAlI-u@`e#>Yg8*ArQ%gvip7 zbG_sE2%aE`1}Om~dI*MqH{UL^@saz)07nSOtk)7fYt@8z93M%jtALy>Buo_AYHOW( z&-OBWZQy1LAcAnXz59G}3Lu?Af5h1rlGFIT*AE_NVDw!H|_OLx4jMZ&2bOr3apb@~S5igUVNH-X$&c-z56W66hWLx+`5(r9WsLnG4Hg_%Mn z=aX?#6q&?BfvHb9+6{_TE}SNQn^tU>Ulq-~+ewz<-F~k?%w@y#4|}|(Os8Nr_0MPu z_>j;@i2frr0@2iNm{yxRo2b(%9!~384E&_B1^5pBp9sh^>Ix^_j`8gq9MvxJ!*h8x zNM?BIacJ2V?IkupbpJj)RPBfM_vM66E&KAP88d+FQx{k-wpVa11y1EECliL>;@L@s zKcIQI`yj~+mOXIl-6@@qD0M<+kqEK-5}IR0-P}SuUf!r($FGhzw~bqB#tBKg{Ka1W zQC%1ijtTW9aY!KnX^xLJ&lOhUP4N>!m8}9Wu-wVd{}3>Sz2Lt7;#)oLi=A}F2uf@X zs2@oJ1gBNwlC!;kvm`D=^~7>4QB3fb+U0%s(G~GU*cO z&HYabXoBvcGqsoT=V_S)-w?ln`ok#;!?Qo*?>pug1U&dHl8U0g0v-K)Edxc&aQKjY zzLa<-`wkWMS@6c(OGe^MJtG)hb6Jx`CjfH;Mn5Ea%!NFBo|b{hVOOB%y0*^k%o{)U?EHdgDG{JV6y*K#H z8_p%>bdO(C+zK>J$P;PXFjA5V*S2oWpx#oyM>=qjKEl!wk>v?bgA2Yd-oNRKs2Etz zp@M?pTreIzsdllDQC{(Yde_{Vshtd23AO=f)}w+1UT!ab#twvp6NC+dFVx&%^{r>- zbIw3awhjo;JJ^g6+8hPN=j;G%S^>l&gHL($2iqrQj22Ds9^UO5)qf3s#sSV=RMFHdGY2?dm(>1Ej1H_AFv3-BI3+STlWN5 zMbZiywzi&AO29l5PN_?iaK3r4fbcLBm4Oh8Kw@_SZ1eN!M>qeTu?%!yHk#~Jqlf3U z16+@{CIMODqHv4P*1RykRAmW%gj64WW?0w!S?%FFbbv{+cbA}jxfmDp7eI%=4Izq) zNJ{~1!fyXz=0Qvk+C$QVxXB$r*eOz4i}q2vDD>idnUox#0$mp34Dcn^dvu`;B*;|< zO9mz)815bR^+FjeJT(b$iTj7DAaq&h#xg?R5N=Ly4>5Zu7`-;BK>xesp<65KIb+%& zi%D`ClguENwVuuJ`5uiq=MmLvuu(Yd!G#nKxVyD4V>KOq3kbd>{Tr^5msNA|UB$K4 z5vn1{i@?{ph{P-Vda)77Z`R;L#>yR&8PHlS-?|YL0cH#uGz6!pb+IyU-AE0WOhN1} zfDbG*4h=tTq_`7FPL7xel7OfIg9jbDKd@nI=s5E|l0_8|CV`P2h`Zwr@xJG6Gs#y+ za#bpukR{Z&WOP;eBtZ_~WN0^SGm-_sco2~10~`E&CvUAM&k0Z=;SZj9Smt^Oe7HZN zwR+C-+Jp5X^O)ukCHlps*SRpjvlT`pM!(5l?qVr zmPv9&#g7T4jpXYj*^dhxyfBPD(=B)nOwU~hNfzvHF2CT$vg9Yj(g3egL3%jYTDEj~ zz^lO_LM~gvvWR!+;KaGAaKoO5Km&XjdT8zdTo-yR@kiu-U_aI*^(7@)3oM=ZzS8>D zwwF$bZw|OWxD7E?Zd#}@?h#fPTqdM~=TJZdVSTb2+O}a7F*%JoNlDz0b(y%fEt4i~ zTbLt+u7aDvCf`6d>|l-?+P0y7y)YqKYt3({2A*Oj|xp|X1g37i8B8Kup7M+bV zyR0bZ4S-ynQ=|z3wk{DFv^1KSQ{f)Qh@|s~nGsV5?WS{zU7o*XMT9~}Pp$x?7y5zg>&$Xzi{Bud1Q`hK(5u{NN!$vCc|@(W#DOa~F+9uGAx8p&7NM%#^Uc;-ORWY$`67YHhag&!ps-VKd~?R~ z5KEDn5s`qnH^O{ZZ3)YHA1!tWhFy>oiqVmlBXY5@7iWGfFDVqzbR$f0iJ zH@4PJ4qyq-2Kg!323%n0#ktQ$?Grl^W-jn$pcycGZQS@?1zc4PXPv`?0t&&>w%PN7 z?voT8M~Phm=?_?c@pIvc>2FJz0|~NWelW6UaLXVDDLv>6ug!8tf@c7n^(e0k3)9mSel(1hh%hp611%G7R^S?IEqx66uoA{A z(%s=@NZR!em3%h&2jP{ECb%n~>yK){pfC`5oPL235^pRRYe#FPaA$L1LX<`n2+W%$ zxv!DiR=VgHHn!#7wpGBTg<1-AVMC;aqo|(FgkL&T?pMuzqN)q;VNGzb(5OSE;gUz3 zE)Ff80$3$`ik6314p1+XmXfKJwBqMGABJA%g~7LJ5zDk9(wYc!1=0xISYT(*R|IAK z!~Gws89H+xbPPHrdk~m=nOR}v8LJmsY5a?_WeGiVffFak8OtomSphoN!O%k99kNwA zTBm8L%=ytX=g7x8c>ih7Un)s38xXHw2faRlH_$V?r0f@}p!q*rvNp=qK}~c78x*^} zg`k)4eUjp=%+8`CTx`Np3)`+%W-Ed=uF8pwfvXXU?bRoAUQx)N@w+2@YC>E~w}`xF z&B^Kp1u?|WYi9F#ZAcTcZWM-liYb8-p5*d?wAT)eB=~cuL^75^b)3P6L~vv;yBv;8 zQ&T>dndA?7P+LAUg@9;53S*hXjo_rL;Y-Nw9&Tlq&;`khi;~n~JHvp~L&t_s3ASl$n1dlp<$))(8S}WaB8(*<$+I07&a|UakEi6UZ@Y}M4_{#FScknvqPySr&ws)@ zSKc05F=3--pcaxL3C`;nNVVNZLmOc*DXpWi0P(lDMHpRcH?|>nb*!RxRmQea=;TyOw@NTUyg%|7lpu#-`XNIp-`vhvOVCr!kjF@e10#41H^n zkt78GB96Lv-keEg1N-IJ%P6@x)l>M{qn0FltA|aB1+#MaFv$Ou^D;vgja_j*`{r35 z2ecvr$Y};l3&CqRUbRyp`^RL)-Ey860jyfTqi!d<+DU&(Tw^#pqPPZj&XuvLB0Xw;Mc#q|949jhGY^6Wn*43` z$xSw?56LQ`clax@LC5$Vsu(4FvD0MvZMc&^rkwLbo(SQogCxG4kIBe1$P{?f!1Zqk zCB{us^V0Uvit#we-QpJ+2Mh~V4vK?a!#jgZV=>@)$@1xw@-K6#Llc$8*hL8CTCAX4 z(vudY+}JEv8uZc;{D3A3VAq>9TYPvv@IM|NC&Z)7^2!z@z%C%}bg_Qpz8k+cff&t) zw2&%;SQjdj9(w7=rOki*zT_gby5#d-a8TU9R#{75#(XE}v zL_`*Ol(8d&TgMici6egbmiUEIDRd(*rMRF;dV>25_iI|s2RCWTmJ&5ba%_nE3aBtt z`Jtm7vdHmaZ|-(pH5R>LGEfa29bZoZyQyRs*?uvyw zTMJy@215mgM;KCg8)sb)Q@K@#zHp65`qrTjWE6?nDEJx4u|~?Jd1+;%*Y=&WliV)o zu9|8(M8HIG6nmK@r(W*03L-)gX<5bF7M>j*I7tNz%{H_P0fNf>8aLtWdqid=2cB!u zjj;^Rx@S^3t6`wyv9g}%eMr3})UPExw*#DZwoy#5cP9ps5YP*`yE<%Waqpp@eNGeZ zbKvumnh*a1$N;<)+N0D)2@i#KyB|0oO48Mh&m8vky#A0M~<^b`-zGN_@CeW_lIo1=b=;6M?tI)02~+v4Scpjw|IN|$K4L)2vXPNYEyfdT_%uVML1>ehiD z5oCAbLEd59Ids@&b~1GRH=C1ecVmW8k7Kao=YkNs3(9VT-H%}lEnq*P*qg?=?Eg}1 zNV93~Qya;iFTQ;^VAK-_8MX)xgW8)8oMplJ7SIGqP_twd2A^Z^FKl-QTmg3olE*uj zcVytMw}B$MV}HQxbodTlJ=xIQ@cO%ZRNZldjEHv_J2q%`z=&3wAL?KB?fA&naD7AN zBoYPILcGdV>U@Di*$aL9MJhVqH%Vv=vWCoLLf_rky)mgjV$_KZURxXg-yMbU>EUC> zhqfLnWDF+6HQ3u`(nMl|f7YsBpI&jbdH0#T>pYx15F|A2A%0t1Sf8X>3nW9TV`4Xf zZj_QfSdY-81)Zi@iUV((tWMLcksPQKj7I_yPg5ng)$QFqeY_n{PyPG|6UT6vj(5k~ zm4ha<@IJMnZq+XjzaHlk;-PbgDASZ-R-`Fqy6dWo5R5!q6w?C?cnUi z!7>tZIbgVi!mlR<(Nz(Lrx+e0mq)cj7*q>>hQ$boETsQ9LGbU`yU?c_brc^K2h0Or ze!^l)uQt9|If-Ti(&ZtjV6Bt95;_CIqw)0AhPy|us=KG(svRa>y#Q^DJM!4Z1_0hc z0BTw?JQGP-%bM6HMLX{Dz(~!O7~9cf=Olb-P;Bf+Jy9h-!jMpcx*^9fk@xbd_;tBI zxP&hKzqy<(V-o|TI{9rL%Ua&E{?=zp5Oa#$ma z@gU&_5-NUqUGE;HAM$c%SgB+K0lj-r(>=k~QH;lmAVaW5y_HrZU?sp2;4gB80;dsd zpD?06?E3-GZ`hO7#|8!m6qU<{I`xSd^DXmvQ{BiLPPWsP(Wfn#GSEB#3yCDr)%u_R zI#WwAERc2~kr)U3AkcRa&#Y57D?H{sp!=gEz60z>DlRkYGEc2yf+{jDffs_Bd|G-Os6j3i(c}5} zsA`ig4nQARHZaa-_9|NGa-d!QSxSwK)+BK2fLQ=_#wz3F!SjWO;SzKUy%Cv$BN!k- z3w`s0y%w^ZAMl&)a!x#kvzSXP#y$kNJSOo-PCp5U09CvTTnW7E!%t@TDg0so$Fq=1 zjo)R%cMz+xXuIL-Eb7Z;@$geJ{FDwqW$ve;$)v9%p+P-1iPW`e07KEfr9>LqRCH); z^K6YHEQXosYr#4*{N3n$H%;bH4!Fantn|zp~yq_bGr9-VliDGE8=vyL- zR$ogoemB%o&|jTcj7`H&GHlHn77YJtWOX-9Uf*dRY*!5g_`^^Au<^0pMtdqrR+Rz^=sjchUdR|NDQL`E0QO diff --git a/heapster-saw/examples/rust_data.rs b/heapster-saw/examples/rust_data.rs index 535af1eabb..f4391a5b5f 100644 --- a/heapster-saw/examples/rust_data.rs +++ b/heapster-saw/examples/rust_data.rs @@ -1,10 +1,13 @@ -use std::collections::{HashMap, HashSet}; +use std::collections::{HashMap}; use std::fmt; +use std::convert::{Infallible}; +/* /* A function that immediately panics */ pub fn get_out () -> ! { panic!("Uh oh!") } +*/ /* The logical and operation as a function on bool */ pub fn bool_and (x:bool, y:bool) -> bool { @@ -37,6 +40,7 @@ pub fn bool_and_struct (xy:BoolStruct) -> bool { /* A struct containing 2 32-bit values, to test how structs that fit into 1 * 64-bit value are represented */ +#[repr(C)] pub struct TwoValues(u32,u32); pub fn mk_two_values (x1:u32,x2:u32) -> TwoValues { @@ -65,6 +69,7 @@ pub extern fn two_values_proj1_extern (x:TwoValues) -> u32 { /* A struct containing 3 32-bit values, to test how structs that fit but don't * fill up 2 64-bit values are represented */ +#[repr(C)] pub struct ThreeValues(u32,u32,u32); pub fn mk_three_values (x1:u32,x2:u32,x3:u32) -> ThreeValues { @@ -90,6 +95,7 @@ pub extern fn three_values_proj1_extern (x:ThreeValues) -> u32 { /* A struct containing 4 32-bit values, to test how structs that fit into 2 * 64-bit values are represented */ +#[repr(C)] pub struct FourValues(u32,u32,u32,u32); pub fn mk_four_values (x1:u32,x2:u32,x3:u32,x4:u32) -> FourValues { @@ -115,6 +121,7 @@ pub extern fn four_values_proj1_extern (x:FourValues) -> u32 { /* A struct containing 5 32-bit values, to test how structs that do not quite * fit into 2 64-bit values are represented */ +#[repr(C)] pub struct FiveValues(u32,u32,u32,u32,u32); pub fn mk_five_values (x1:u32,x2:u32,x3:u32,x4:u32,x5:u32) -> FiveValues { @@ -156,9 +163,18 @@ pub fn test_result <'a> (r:&'a Result) -> bool { } } +/* Extract a value from a Result whose other branch is uninhabited */ +pub fn extract_from_result_infallible <'a> (r:&'a Result) -> u64 { + match r { + Ok(i) => match *i { }, + Err(x) => *x, + } +} + /* Sum of two types; yes, this is like Result, but defined locally so we can * make an impl block on it */ #[derive(Clone, Debug, PartialEq)] +#[repr(C)] pub enum Sum { Left (X), Right (Y) @@ -212,6 +228,7 @@ pub extern fn mk_sum_sum_left_asym_extern (x:Sum) -> Sum,u /* A struct containing a string */ +#[repr(C)] pub struct StrStruct(String); impl StrStruct { @@ -219,9 +236,13 @@ impl StrStruct { pub fn new(name: &str) -> StrStruct { StrStruct(name.to_string()) } + + // &str not considered FFI safe, so Rust doesn't like extern here + /* pub extern fn new_extern(name: &str) -> StrStruct { StrStruct(name.to_string()) } + */ /* Accessor for StrStruct */ pub fn name(&self) -> String { @@ -229,11 +250,15 @@ impl StrStruct { StrStruct(s) => s.to_string(), } } + + // String not considered FFI safe, so Rust doesn't like extern here + /* pub extern fn name_extern(&self) -> String { match self { StrStruct(s) => s.to_string(), } } + */ /* Version of name that maps to &str */ pub fn name_str (&self) -> &str { @@ -242,15 +267,19 @@ impl StrStruct { } } + // &str not considered FFI safe, so Rust doesn't like extern here + /* pub extern fn name_str_extern (&self) -> &str { match self { StrStruct(s) => s.as_str(), } } + */ } /* A struct with a mix of different field types */ #[derive(Clone, Debug, PartialEq)] +#[repr(C)] pub struct MixedStruct { pub s: String, pub i1: u64, @@ -409,6 +438,7 @@ pub fn opt_hash_map_for_string_and_list64 (str:String, Some(hash_map_for_string_and_list64 (str,l)) } + /* Sum the List64s in a HashMap */ pub fn sum_hash_map_string_list64 (map:&HashMap) -> u64 { let mut ret:u64 = 0; From 2a951475208edb5c572d5de01c3d4ec29591a7e8 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Thu, 21 Apr 2022 07:06:14 -0700 Subject: [PATCH 06/13] added the mk_result_infallible function to rust_data --- heapster-saw/examples/rust_data.bc | Bin 276928 -> 277168 bytes heapster-saw/examples/rust_data.rs | 5 +++++ 2 files changed, 5 insertions(+) diff --git a/heapster-saw/examples/rust_data.bc b/heapster-saw/examples/rust_data.bc index 41193d120f45258f62ea14f6d0eb85e730354c10..45751b007a167ce9446274dbe614a24afec44acf 100644 GIT binary patch delta 73894 zcmeFa3s_9s|1iGS%rs3k)pRvAU8bu_F_j{b=_0vA91^)q384}P2j|pG7s)*~?VLEu z3F&Z@uC84XLI_dF{Z8&7yq~pax=i2mJJ0j`|9{W>yzle8`>FQcYkl@wpWFJ})^bk8 zJ6`?=p4RP(UK#{k`tX}JXp`0$^k>1eL+Sw{AKlI3)`5wl&EmHrAHzr9?}Z|MBJnZ6 zNB4=Df7)k@e0cFdGmUvKVa)*y0?hJ#Krze-bG$6q(nVs>nj&o!|oc~Zk(`kv=n zhAbPiQZp(wd6SueEWM>`8tr!_+pFxzS_5AgItS=Jv9xVu&8p$Xv?dRWwDNEC)6KOS zE(*|H*Q&FY7ZB^bX)T}rL~{q=9AFK@_xAU(cCNPFoTlQkT4%FJ*Jrg3CtrR18I)?X zWtCM?jg9NL`>k4UgS5zKu8H1sOKupEg;;v75nfMe-W> z+m^f`oHe>EadUXGbz5>ej3Z&_HRxMKAiekcu4Uea8Ckh}3$=`_eHq>wBPv)EPx4~& zlX{E1CvCIuMVi@~lP5Lj>P4>Bwd<1-n-n}aLG9)moy`)}XQa2*Qq)S8X)QxC(ph_i zzIRA~V@hmw$mTSbrN-wP&U}%^4swI`%n@4*VIHRuS;ciVsXl|sm`=669$T2^4N0c; z3Fg)oY9q5s_!b&5*`;+`>JtZV@%3o+9@2U-4t8+-$>v#A|5QSo%8De`r zj50dZqBgd^96lObLk61+<_u4^;5uX&d6B=HP{^Eg zG2M>N6kasF$5h##c1gd5EU_4dBxJjVEzihWt;WsDI$_=eH{Y_m^Vp<|rIja4l@%F1 zJJ#2Z7#8iCBsf9Xt;n=LBuTU8TdV00@Z|~B0Ob66Zj4Z@n;VlNlzD@6j$|5ng_CKP zzws<=7kjuyWE(nX*KM=V$WA3qtah7L3P*_e`!49m;I)>f628Oe5Rcru={a}P$_zev z+scyZKblK2tq1ZlU>Wxn-ZuL4m*cJhx>N3vqpSxRTiT9*=BeT;*Oh{lUV2H^38`~Z z?`j^j=}Ydkwlo0TYLc_&q&Q|-+FB2pSq8I3t|qTpJE7D%tc#yp=;wO+nb5{G z1nEILTSz|_Zs?0xD4k4m@qm%fy7WVr$S*F==n3iQ>WmhX)8X$RGR@Ulb;tXZ3j?p5 zBKznX>8{99-JhoQPOQCXuY$je$@iYl zs)LMp9*g#@C!IZQG~*MrE&~DFRG|l8QtoA|BAdM68>Hy&4=Jo#tm^% z_3zEJ9CM+DtQ_2%TjOn#V)NCHbm| z8IFWKf7*Jo@8k(+1DQ1W7xa+)I=MF*RcJM3mYPb!Xx_T0!u2z`h$H0RO0E>D%rDH2 zc*S6IwyXKf3M||@X8=>0a%d!jAmB$vprrwvaPFh6Jc3}sLP3ldX;}=TkMrRfUkp~G z#l%$S?UQ^60ze2BC*Sv3+N>uBtqDR1?;M_F)dY5`t1Lvf3t%3z#>mG}4SE$LTt&K? zHtC&HNMEFVA+l5SM|DGDw=5`WjST_}2tq6)JadA@xnUN=T(`}lqD&gGc-8p)b;mrOxvU3*c(tsri zeBWQYPjf>2_gy7&=L%1?D3R;NbKx&i;wpO)yLv-+p4}E-mb4TkcN2{nN5BnF2Xf$t z7Vb^vh$LzD>Fxx@38O^oCU=wHGwlbODK6cmW0ROu*)p>`^M~;~_!pG0;fz=H{k=Oj zX5OumkV5Nj*x05z9|HkNJ5_0(UJbvcJL|5hg>&C@XWbXprKE)O-O=4A{7qCed3-l@ zGkBoQ_UMjoaUwtIx9;4X?)_bo(TR!_D{bFY=Q<^2=~csjqJ)ZurF!*_?gYhqj|{8r z90d>JlIq-`G>DP4W{P=teR50UBu(x<$RFNgY{Kdby9>#^)||UoNl0vG_E&OVjHR@# zJB!co!nvQiGiNa;du8RtZi{3y-{O>PMmIT)Sf4hO|4eBRopA2w?t{GN9A1eUx({M! zaVkqb2&u6k0tJw<3-k@2>JuDMj!U&z`vM}^uv~wI`_2DDOLkPOy;rB3#F0E;P2(a(uE(9^rUHpDnY=H7{K6SaQEFi!BMG) z2CxCxbYM$hv9-O|9-78M-RcM)q4j zsZpCCwB&{aU|Ia}yK@sXzDZ#)KoA=>+~=DY>o(=?P=W}8SD+3qo+RL53A=AHpu+Bs z<>JDM-c-mnM2Br4sobeK56$6~mg8_*?N%)kU4IEGX`8HBhyWZv-sA=v;a zf*Al3E}&;gqN=G3&@m(kshDoWZ2#Dr#dJYL3xIVIl6wh;gM_y8%eo>`wZL6;Bek6GT4Ec`(8>>FNu#C+6$X6v=QC zEuqz|7OGi@kO4-W0&*DS6@$hS#1jDNB&hhZs!1ylWCkeWZ)r99_@yOjD3Vpe8>UBw z)#z%R`Fx%OLHq^{G(Et7AgHEYys{_g)+6S-L=J=q(8r*F0T2}a)mMKc@D~zBA+*5- z8uv=NrD`8hA%QmxEXJaor?tr=z=uIxLDc_B0Hv5r;ltTt^2Ea%e`!yh2X*THpcP(lPDktlKg z@UOaBwoJlT08pJwdiH^oE*2RP{F~4!gkL$P%W~70XNigyHZ*k7bZ^8;t&crv%HNlt zaF!ri6_5(^(DqXpb1N7USoN5r3hR`;uZr!!Bq};Ec*?>HO1f*}L;Vo=9+s#O;Nb$< zd;YbZaSlIrs0m1P{K5qo*dL@Z5G!He61Q7>Dq!FNFr64&<@AjsTnVBcrWfO{fjv_0KJh|}Rl$hJ z0_TL;1s7m2EM3Fn31F}UztW9ZwEEN9#9-s{J46fY;g8?+%th4;7z^4#ix!ZpNP9ND z*TghHsTCT9^!FIo?4w(J8llS7g{u_U<#Kno{wY9qFu-*o>(KAdAa{az&<$DczNssW zRu+Qg2VdHSt3lH_hgv{s88mj`YBnRlA{vNQ!ZqQmkNSM@*g%9FS1HZd7rla)fnI!s zRw4Y#O^`u*zx})c1o1+FLE0F4A$UbJgqaWoAK*HjpJpk8F^FXc#OOB4VdjM*Ty;PSTsIS^K z;|VwcF(4*{9=L$FpX%Cu`oW_*e#LEA6AwkF=)VQl2H{t_5yvtcTytW9uvEamoB#c7 z$3kW~A|$vD*-6>Sw_H0JXhse+cJcPwoRQv(L6rds89gf2gOd_H^<3bsJ+uI2aN$*B zC>S3EnlVO!tDLo41Ksmm1`$LS11J*%q=L8aqUKeC#sw(GRm5_?-mGJSJ<3v|Y*CZH z;cU>O@$hvgWd@u92ZKCeIKUqd3l|7t`r#2Pn}9HIGF^nNyt3XYR|`0+OxdTH0E=J1 z87XPandQFfhe2kYT7xM&dpmPNBTyEgBn9c644>CZ8V*u$@II{{ulgSfK4?$9C(y5~ z;o+A(R)UX^DM?{vrk2w>&?9AB-Iq+yhCo7D3NQb>_D$Mli509pG%Fx}K!d*_mRz+j3JV`qLYWBdT?tH3~E>hHY^Q{^#;7A4VM{p+Gb z&VO*LD6UzS4C_{j2REdzeAR71TO9!fxG7fS<-4o&gFvf7pameCea}i%2SWvM30{o~bS2;BsxF5XKu)2FkOT%?{j||D9|kP!K5m{{ za&sk&o1uj7Lu;10GvMh2pcq|xjX4akn3@Kj1+1lvZlhPDy|ub4ix77}%FWF0lLGYT zaR}KIfTIbM(*9;*X_{R#U{DOrU4nQPZ!xacf*|H81R-C$6U}`8&i5sVM#UPFFWo#c zWoq^+a1F|ADAruLc#a;BWjHEd-O*jx#r1ulS;7(MjmBO(nx?_$_+t3^0CUW8zN zA;2jpEBAjO_J;+jOj+ytnCyv!q`pHCbR>CqVSkO;ETW<>eBC+jyxmr@Vk?3G%O-<% zxNuhVi?!-J0O^Nc=|(Ufd8e&Bf&g+E#Q)upJ!n?R5FnyniL5W5Ifl(3tQqhzmKkUh zBobeTFCm5#M7si4Xa!4G8fjm}c38+J(LSqE!K^9x25K<~*aEPV;CkPR!=tMSeXL`WhEf6FrAQgV$ zzEgIh11NzK22*}kGYnA!l~Q0JU%JJw$2%O;C5UIx+BvMlWooL_BAp;|p%v!CeUbp1 zq$}oi0Qwxi!mm8`axmOGF~bJ5Ucm!Jh%k1{-$A2b0B98hELhX*k1OK9mDR$V&1_rw+$w+@5Tx5xYy3r3<$!7=E7aYrtzQkeny6F8kN zbg!P%b4-QB{~8)QDa$MQBO+lt2v(W3pR6?=fk_w)pdG@Mra4^On^p#J%?iq(6PC@P zp-+7w*;ZOMYYglMb94wkc346H10(>_dPH^&K#H(UgATYr55mXI)4B->@e2G(H)1{5 zIsWI?F_1lVqYC2B2V2jsS_Wj{W#1`<;u90R>VT|I(AY_q!=gRn@IQbpN@Q&sprZQ* zG-e2Zc94~}rrG{iTw=fi7s4-Gfa{U5H>yX%fL*xa_%rcjp7t|<1+;`TBnEYw{GoCP z1P##8Ip|2YKI0^+J+h^O$gAv6Fg?)TiD=&70~HoKA^3!^J4xDFc-1RepWwDZBMpfl zq?S4u|NTso(<8Ckde&g@76AR+9W?LQ-}mn3fFbIjo;F1LmJic@K`7;vz79JNULb5i zSvw$s2LAZ1@mJaQDulQr0Rn0((xfB5_i+z_2msKO!EA5==;y4H>^=YrZ=EzbOe|`Y z?3RnOlcrf4gN=&7ske8B%-c~^-vW?N6w@n~>z{M8y+=b@reMC@B}(^QyW*3y4XQ>8 z7v2#j=dNVCsmLuE=D*y1-TX;Ia~?zh*gSPDEw{f7jhg`pV}iz5VP3WtpB3)y!B>^i zV51iR3Bi#VhJZ^7>uTP0honCkgv1=)J1N^;9&FaG1PYLk8lNTY1XTsVPOUZ=9Gb@q z1{QSFYVN-GH^;9m=n1(xG%pMMOLs`n|EageuQUU5p)~!nL zpCHVyoEhb{(8yfuASD=^>~tN<}|zy+*&^@*|a z5O5QII$3qqbVe4A?8E>9z;JP-qMRd-HT3U+PytLxH{#{@OI(7_RDgjWEPm($L{A)? zmhm5m9*V!=BL#r&km@fFhCBg1Qzq%N^oHN$9%D+M**Fh{LK9yMhzjvUv{5^-`f9>- zRKWv-jRyu10QI`#>a^dh6DeuXfN7FpM{JNAF3p-mh*AMfF*E|YK>c@v`^*yznYT4G zz`!svc$VVQ5c4(zf@=vQ(lP}DAoX=<~1gtE-VP0lP5O{;5bFt)kUidy5(`^ucLcxE~b0!XF;irpNzs`vxLgips1E32c%y;|ER{#i! zU+G4y0XOG-!vS%I5~62=NR=Bs48YYP^A3q&Og?<77!&k=WZ(glS3TWNOy1|j=pOE8 z&8*^(3ScRqDWfOHit^#_6pbT2Om*I%Yf}2_2%@)=)SH{n68(EXKHM2< zlm?JWq@P;chglE$R{_*?$uciyR{eN_*bY1v%gF>T-CWWq2`XfS4YWW9TsTfF%rwHa zV5LD@m%1|FFbJU%|zD&6Ju^0T|fD`>$E7StIo9REKY&|lWC zr$oP{uv>eG$>GkOTH-_xL~RnAjVihjRe0zA4=&J<*gj!>mhT`{TB>TlgXtlp?wVe` zzek82nEfdLCxi~TK=njtD;dA_*k)6o>JgF)h(bajqv7xZsdQ4+fPzYe67{@C5(_^} zCd}U{QI&Hhj(D357KvE?Imo`^_oS6Ph+3ebOG|$HIX`HIJUD@2aTn}0EqP_w0)-c) z1v22`L%%pwApsD~PBCVux|Zi4j3vE5F#XU6Rn(coRbK!<9q=pNh(UXM4hjNLP-q$5 zh9L`PuTpgd$POmSLnF&eTG}zNJ^_?QRGxL5+-qto1Lo&JYo}#&SoZP>UQPATDD9+v zSjjCxGl2H%&ZxW_FC*`QM3*U?lOmLx)4aPX4$OFmd!!kV_;`cCD-A+MDKG$X!8p$N zI)P`eLtJ)bd3)>F<3-OA2_}0|!MK6L2n}Bj;5w1C3fBhh;smyrFA`QItmtz|2$7lsp}#tvj@UtV{ex#~MZmW|U)%q<$%S!e%nd;qvQE8)8R zV=d&9k}@S%{-$)V)@K#MR|(g%&BuQVaR&a!Dv(u_Aew%)yAGKN{cydWkPf0Bvv+kt0z4q<_Q~91 z3oL4I&|+wT3p5~x$6cIojF3npJ20i?deVxYTD=|-Ssl`%HS7045pR_VlaMGeVB%hh zP|Fh#9ScKtlJ#tMrP$<|Mh{2zS%bYRANcydL$WjyANgGA$E?$^OVJ@Png=&r`A?7u zsJ9XliStGENnd)n%B?Gs63lQw0ceOZY4o_YCS0*a9XtaXGTcTFyUCOPAYmCIc)$o+ z6ESVloM+2LA**_hYoMNjhOUF%rYL~z6okWOE;AkyP-Wkm5Xo=z-UhYC?&IdXy&`H$ za)F{Xh__2=t{x1lQ2hoqlMc0&0)oDI$26Hi*u-+XWyhg+tj3iTQ-63|5dBx6wAKM#{Y{zD7uTtRA6Jvd;lj(b}O2w5{7b%*9S+Dq!3f zzV5_$2^mqLdIT``!t-~EY@YiWvB@$`A_aUajk1j1yWFw4a$uV=!TkcQv^vtJdAkks zXJP{CyPru`mYGf0$BCH)8Rg-NwC;-AqV2_aNx?Uf^!D-B)@T%rm$y zn#nZEzyIu#n)I_`m#h=zVXq>Ds!wT@yJ39x(U}&l_rTpnFal<>-1A-i5)rG~y_BhN zla(&SD%gJ$c4LMVwmUb>5^BAKp{K$Coy<7f|D4$5wkAOwRtyaUflK>69SyC4D$36a z`O)HYION1!oC?f%1o#R89xfaqPi4OoE$9(Te|hW@tFn~nI2wZ2AdEY4K2_N#mq&0H zcZ^Fj*{mPab70T4d1i%CtM_pztivo_=srA`r9U3hb9ZR%RJW@yDCF1-=q~9P7N+yf zbMDWakPkY16YHN4K7b4GeIChqEig|PzOR3;bO7_f?J%h{1`UneXOcTm z`~py{5JJ4_KAf8^QT@s$k^r<*EAxJLXAb%gBe}c8s2<}gfp0q*mREjW2DpO$gQ^Ol z2QIwiV%Uo@vP$`n!!NG2N%2hC-44Z}F?je6W6;f>V%|F39KiJAcz|0`QU%d6_FG~K zAxeY!#ds>3Fu%84=@-cZLQ<>5+iwqz+AC{O1x{PK*2UY4u5C%1m@^;@#x^+*UY$>r9DQAU_<86Z6)9S1KH)65Zo0YUlpbqUrm_tK62>$yH zlK75BCrZZW?Pu7sgeuT?v(XhAd18^zFH)@sPYRmS zC5x@qkz%bZL@-S-WgUd&?Yty33D+W0Ae8Qs#nuIXB99sqLdu0$xtB(?LktNX7nTKFFs@C~ zyjWFF6&5iU-aE&2Ft{qyYS!Y&E< z{RfVH-fb-U%3u-mpsjPIbK#=6<59APrV5JGgJ ztFm`qh3ZmOmP~2bHPfz2DuE5bG#l{xgMr`(NgjJy)-Pfrzr*y>g18;5*;esdMnnR> zG8z=4d*Gn)d-MdM7HH{2SAG4}7Oenn4sjh?JK1ox-(Qtx8D>1^&rx8FXRxE}g_Y z`$0xzbg-8mcI7eS?Ti-)(Yqg=BKC;`o;6CD4BBOOj(at6K2Pfq=uR}o34TFcAz?DT zF4l?!;+o*SlQ@HrzmZ8J5Lc>1T;o(G^ApGzKs$$>l{vpf^##GIP=Yj`CS?W!XoV7c z4?i{Te@vBCftRKH0u1Jjy)N+uv3-{hiQ7SHB}drnUn3NYwLyM?@)}=vYh<bTHMvNqK|v>)rnim<^F z_(IhAMbo&58;dS%uUM)(p(MkqcmDB{)PYB5)uMVej1*0HtD2R?-u31u`H!#7Zi#xV z(0Hf~{WI&YHBL=W4Gg(kIn^eqr^c>^pRuRLYHn>ub`1%U?OW)dhM*CSwG1;wKklyg zaeC6N`;57aVcxB~nbEhcvzr{gYp9+Wq%H$>5L&>R#h2`E;kI2fQQ+P|YpeEM+!gCk zWOvNiNqx`AwTb(#?2_fEhF#xE}27#UDoeT>QymotMZz6<-@wEbmvcAkCJ&uu10`xB|m z$cnR3`}ghnA~HVY;`vuzp4Vuzio|QP=NEqnbBu{Lygt>O{C#(XBsar9ZPZW3(~WNE z@0favZ@P&{T6>0NRCh^DRGTqgR`Yk=+b<&B<1WviR|mA8blKb~e(y%ABf;b<; z?jiQgLan_XNUdmH!a4r2b*PRE%C$fZW&~o);^&zhI2<9?R`)V zc{6{Yer|>ir;t_2zAL7`iW0UL8<5`*nvj3zcYtL4*C4v&_99cA9Dj9J9VZK8`hG-c zoI{>18blr|n7~fKH`xB83vY&C|aDl7(U zvgI8SC8lT>nOHI&024|*NnR;_?^`N=pUO*$S1DvAqyV2gKk5yj*=2g9U73ku^r?y` zd5;y{-}A5Y;lT#ElSHFNfQ8~aHu|Iq`SDj#0%A6YdWZ2jp3OTufum1ogN-7MWlM{{v0TO}7`;m=hJO#RK zM>^1TJZh>9qxne^NB>L+Q(3-aj*%fp7X#e+qrd8gpGcgXC^X^Vq6Uqj5n$-07-au3 zQy2Jj#Io?c9t6)X@ow+tK2OT{YYK(_G&aKCEf||Yec4Q>H9AR&gT*}VB1`h?v2ip$ zzAA=Mys5V2*5kc3ZKK3fGiI2JEds^;CzEH6_eS32o8!ZUOMxq;76Q)Dm~-r!onMRX z1w84iE4@T4@90W)<*X_)1&=#LE8Y5{uk<+_dM2Cmca>KAsrF1}df& ztC8;IeV`${+_s}(LwO&yKixr_-}Hv{QdJ(V;g9E55pX6&SCRcHY{)HjCS+`dg&M8G ze}c}Fw<{e~W&;g-$Z<7#q_B!h)t4a-*;=6jOYCEXi-vqM0f&mNCU;g^D0f?tD=W2o zfVj&?|J3^*Mpw-IAAP;atSU9Mo6M{7;&q#lUA06|K(1NdGd+k5nTsp7Qb7Go zs5P9*Dr8lGy@O1YSPD3NQQ>+A?X2LjO2`iq*}4CwDq>=yH_ldNk* z!yQ;?jG8C8u-1x?C;X@h6V8AMKdN!PW6djhtTGj<-hyF3R@Ul~6V8Z5!BOJ&vay*3 z=*|83=+o>fDTe+4(2_gw0P3h;acE$onn0)_^JsW*1X&sdSiZgVl2EIc0h@r;9 zV?*=3W4Gmd%WmX*r znO_wd_T6Y9)+pk;3mHko5prprnW}A+XsQ>i z%FH@0j0ain{_63%emE4_RD$Xd&y80cyxmo`;}Nl^xXo(q^>RN7{=_pnGVLi zWJXhgcdRLGyKazy=f%4I`!-dLX2qn^_hdEpu5skf^V8V07Fm#t3$AjAnnC{sMBW8g zAoKPG7jyS0$R~Z3obfnWn=U`EsWuQh5wq|dvP_I zO*+?mk^?Vt%^+#wal_T7rbyC-^|3-aKyZ)Z1<)q6it^eElC7&Z2}qq{#})7@Ls^6h z!7++J{@itKgtthfcibiMQZm60f0FXOqhAK?Q|#*eh+W>~;LEerEJLrD5FE=>`DET@OJ>4PwdBRiVo!_B=7Tj| z%!R3<>Lc$BdRg!7T;%M%+jp$Ua3PYphX^BUixiLX7P44}oAz^!eSvx7Qh4OZD-#Us zbzPcywTM4@K%4(ER<+4KUdX^DFUg`SlNqOfCAAy!2Z!b(OF~;H)LW|W$7?u#Mxb9F z__gQ~eJgenaHZ2S4_CHcFF|JdU#ABlF8yTGOnP#D)l#03BRX-;Eh&`cP*g^jO}#&hXX^3kgbN9RkadE?}6X zM=?~%&}*hD?%2>#Z-fjzDk_wrPX2zapUtUUSP{v8t%kdg@gI#kN#Qscn0;YzmvUvT zC0|`LLPto>^{j~WsG#=Zmsf(LMD0tW&jRsH@zLku_Sg%IV)cyskD!0atLwH=JpB@Y z`4Dqi&Y(;9<^{1qvY+G1Ap&lBpjgT*u%(Xt?M83yrebu6$nXt}k5l*My`N1Ux-paocDlcH0+-D3 z;k9hZ|H+p`H~aAMa{8##-AQ0WS*Akz-4t6SH3o|-OBiY;24cWi774zleiO@O^k#K$ z*-uqtG(E`OH$zQQV2Dq6h|GNNpsDaR?Q0anm^20avx_6Q)b>IuWPXz!#s7?W>+R^Ef^E0LTMR->1b@S8BWJTk0E$am{FzsJ32Sm7a3+B zz%Y6guu@oIAGTM0j8B|rl$fQCJ<`e0W3;s;{hBB69u=Y4NiPZ8$!lW-VcSt-J@K=Q>c zf3|xJ1Sbc`fw%jU0p(n>_O=e>05@+NYs|)U8(^VUl0R-6kWcQ|Q7i$2PwL+>)xmMF z5|O0OohcUdClIp?jc0=G2K`IG`q!KeG2?I%3&m7Y1uaOAtiQu2r?yzYJn=1ND45*Q zGMrC~u_HdgaYIMAkbe{zQnoV~TBKczmf1c_|4K)1?7eXsgEbrn#)?3gAY0o78p5zG zSi|EjaUOWr0WGE8WFsqb-CZN&KmFCK*?uCBYlhHB8U6CRE{q&?^4(nzd+ci=6J}je zie3cZ^llvTj-3io%;6#6pJM9CiTB3-t9rHG8=(WoQe{TUJHSKdGslE z)kdtXAAoqtPI$n|EXyR%-xp&pdnkWv_P`GQ>psID*!0J0iIElvU0gD0&{D@ca zLF$ODg!VF}kh z4%FF;m+lY?WBUFR7j2_^m}W`2iuTUVLx-P zmaVl~L{d~)ew>D{tk-z<-y!NEZ-4HZHxP|vkjYO2J#J$DUW3^1!^WB_R_@Cu`Oh7gv1=O1Vb6c@F$CA(7F~}~{um{iP!UeMrjzmkEFk`Ubp_8042H++ zv*Gb`=b{IB#R>|^@6SgH<*K*X5=Zw|Y<4PSIE`nfs?<1orzJ3`#B?(9g=7F8s01g= z@ipwU7lS$TnK$NIVK6#|nzcA1_8izB=;d3SAt| zmX6IVL~riIN1ud+m`PrHIr5*Ev^<E1UE3)3wU#GesanT5Z zgFDxuFFG{8Qb=qxg@7(Pv$Qe@t&N7q9fC55_P)s_4Hifm52n8%1rR#wL9*UW1D1!s z8)JMZWl8pawcb)4q#z`LI-jW|4e-lWRW;7)AwT{Rii6 zK$L^Tq84=nxU$SpWv=j|GYjaGr4;;sexPus_{29at;F&uYM zMvQpcbcFup#TR~{xNuMJz}3+aNjE$qTd;hAHl*aj=2SouTSAMxS)pZ@9(GO z+<2IdxXoEQEO!NeFM^_DyY>OBwA|waf*T1f0!ujw7EwIgm-hm@YpDtcqPIO{#OFXG z|2zn2aRS%#PM-bj&aAKxCz)SDm@0eI$?0FhSeDy2FD0wLtY)yI$uVF1k8C>X{pQZG zv4UgxHe;s>sMdn}?6sm{=U(ft^c#JO*8MAh`~6?Utc1XwpnFT>4E%VFC29h`Zh<~z zuIv!4 z;IOw_E+vnC_ZkJ+fa|b$m_{XE=>M~P71iT5FC1PRq=jt&))lHqt)H-=jDzVP&~_4t zOpZvl>BxyvNWUK=s51)~8iuYq9YJmj)UOR;4bcVfzkghs69()3KvOZS_ph2JRX&8~ zhh_#g7guNmW}bnYSj47oJJr=;|OV~4Kg1&tMvJs9{noj}W0{okClrXWQ z*fX2z%R;tPJ_FhO8%ET4g#J%M=_BKRFG{}hk|q`qwSt9)tKJ&|`DWEf>X-`R4~9Si zd`le&;=0@$VIxe7BebBy2-C$mHGzJBEAKkkg;?;NI)rZ6S&GL-j#PjOGVL}+j0zgg zxHp69Sbhl^Py^MF1&8*zvdAq|m>OE;2nECm z75A>V)3@uxV>ueAf5Xh~;SqL9bSRTjs;`cgBmN%jxL^^|cUfcxuKKjBjLe{RYoH-0 zmb$NjmTP`Ld0v-)S4{txQ*5cZTr|_nHG+BXbX-lMCTDfX8m3*2TB_|#cV2vRx@Pi> z0kf!QTr{3sd`U=6)kG#84_Z`TO{ArQscFN-3<2HS{hghX_LC|)e`knUL^bS%Cr;H-`Q$gWx>IG&K- zVhc@&E1@ao6}#$?;AldA>z){)G8FO$8YshrX|2vyB&g zOs`ItOQ(+Xe?W~cmHg}1o`&u)LDxQn+~81jb;ajj`V6Vx43UXju8kFryyRIat%_jr z==&a8VO({3-tqD~Z-_SPr>EUb5i^pWrqs8tmB3yHgT426Dz+CI?k`{Yb0DzYApq}m zy?7RQxApQm+KmE~Fq$#TFM||T8gquta?!!zYfuxm4tuC?z0geF7I|TI z+`Mc^V%>L*qhk3e2Ki8T_{eamyn;s8^SYb5$uRK!QZ?&bvnEqR}ggG;yf4}+BHYw9iPxIOY!3q9`r=6dl){#{DV z0WFeNy9>YH8h&9HC$V|B7W}SH;2E%ou71=19;z?*J!3QLJY0Nh7ncVw-s&AZx3JL z>SgzR`^Qc52ezNG=$q|cnRM^q5_9L9N%y7YbItd?N%Fw$Xy~@;1t#}&7g-Ik`~KzQ z+&=W}xvz6##h$pDzcttF{G{_ODpi>K)C!tT!Q`|LnQ50;@lofByDqS>#FW}bK+T}u6HeTcJ31*xI)qbS?BwY(GnBcV%{cX=BOF= zt=3Ppd85f%$SGb~rBexxU=`0$m6pg@I(vDAUve^6KfkSbqseI<*71!EOS1){Sw(9# zwaL(X13VU7ffTFBD?DHIK zt%Yi{qp_Q}3jQsq{qRdGTgd5td1ZxDJGa+hyAb@NCOq3r%4IZma0osce~qO6gb z3cc2-jj*puT{1>?|L3f%2{!+4W&OXE^?%{Y>Vvvv1mS(rc#$Ev)nZ&QgiKpe+NDe7 zc#jOi^U>mb9)#z@^Wv$v8Wnw#%I}BlC~iMw)NQ1`{r*3W6x1&ZM+e(?MrPrv5wR-) zM+qpEowpM93j4wx@1hHhb8)H-CA(azp9ql*-{Vw`2z`@YWc!QN)SYit@mTGqPzuV- zM+=F|3)P@lvln8QX_-fHQKT3uA=3o-@vuCu!3DcOT>Wv2*Me=@k3(=3uOvp)?jElP z@1KXk`}0ZOEbrr)rRbhxb-&S<7U@FAw{g(%&Yv#lUWJs&?0PzUR7{t4?-;_PTg-iE ze*6e>%KKiUzJ(Y(#Z)Lbxy7ji*~Q0!fq^sw%P=o@gi>y9$U)lF$sD}deN0oJZ;&69 zJQ2KAU?#4E;3|_eI7p z^1L5s(uYC13OD%Rp`!Rn-*J5azsu_c?#K#qqd(k{Ig7L1VJTJVj*`UbxK@C-ZC_y7 ze}I}&4GLJb9HV-t!orbNA9T?M1PJ8;Tw0fxcwjqcXJ`?6^V%!Aj!GVYtT;<(QB(HR z!2!sv13}?`6G7vFJrE2V_&<-}SPwLan%oy@P+L6ERBPHqK*9Y7y&Zs)q+(~hV+9Ak zF2V+LLVxDMZPbfFs6Q1j2pP#gj2iUc_%NVrTdh+Rogx|Ii3IYpu@;n#b2SdrWn*6K zyhbYC6M6ZtK_qxr9*d-V!D1;GHoBmHgG!v_^y1ME>A`WrBV$a-mlzh)TWxM6#Jf7Rk2CebF zBb}Vx9ySBx8E4n9>vae+sr*(b zqMD6Rpewd71%cJE0 z6thFMdgJ3$@K_d|shTVrwsxPHzBKM@@fm?5?46bWq_68dxwtZ)vjOJ_)0)bmieEBT zfKL&X%n)G1d-yzb9LPKYEwI6W`;X1&FjU~{B#it1)P-Tln3H+WTgP!jRtVKP3=NUm zMzvsf|3iKxNK-ISkLOrZPM=wUDt7gP$LaXgk(3X1`ok<3rm19^Xz))Fjq(cpwnqtX z?s(m^N&&<_!9f^Y?v~WBhhqmlA~-4^4lN4NA)(%EFxlnU*S!Np$FV;y7>1^}3aS16 zXk0Lz-O3_!a99BH%)#>QxaV(>zZY#&Zs+aVgysEaru?omM{(DZ-%+YR_0w=P2z{eA z3`cXBti7A5FT;_P*`i-m`da`>Md%u(G7`Dj3JMg*w`M1(j`9lt9b7xM=`;iaw?Z*r zi^c(8sc#|Hl+)w-n7KD2=6!aEc_lFRvL}9|Aj90!MZ?w8aLoBu6 z&L@b~qVeX}68VX)lWsUTTLrDhAq*LdECO$^ePyHNW{9q6%gxX;eEcmK=5UL73XgYA z!Q+P*d{pb5Ell?*<~g(~N{PL&-NOMdJDU1)EV2aIo*Iir25hH`%UdJ2V~Pnlh5@l@ z!X&uw?z(SMmmkk4(30Qp_J;c|*!fhv<2w}+gyxDW|B|G)z`@aUF&s`x(@DA)2-^`C zX8oNW#@waGfwP%s{53{->(=5E!|G$4JgGN9s2U|x#pBQZs-`LA2{&-}DRHy;t zk@>KueB>?mg2UG=^tpH%HVAa=RXP_Q*N2vX)_w-lBDn(LY{IlVbRiWVPWjXe-s9v2 zJ);d#)cb?ig5jmi9)Y*y1X%y6hTboMO)5HKT znvQIR$6JCjZ~R3Dy%o9x(2f(}$0N((bop+0J)eoaAr2WzAg&s}PA2C=OarMi7r-+Kn*nbYOKF@8t-f zru*EG`gp)f z0q|;G|2=esbPfc5-;mx34>^>8W9A!O`;LcU02pfk4!a;+x|m6go`ytd9ThhXxmu=2 zN!m*{wx!Y`I6fNJ8BHmo@5$7Lr3^mxY#Opk?FP@A_=&U>Gt)v#3*HD83)9BB1`I082LD0A$C<_UvXC#?)d1Q;tsxme(!nj=*RFSGochq z+yByD5vTz%WZKlrS%{S8gbu9Jt-uFx;UCAsuPww`ZPA+`R=gjK!^Q<$;PKNnc>El_ zO|^RGeH@4_kD=i4IeR(I==o17Tc4N2nQ_bGL-FIWkon-I2i})>*EWU}AZNb|Gpq0cEma-- zFEE5~K+EsJ^`*2azK3lbE{lAKZo%5W3S3TLD7ADBa?#ms#+5FZp$hfqcyov+k4&Zx z&p~|$zG0u7am6e8ExyG^=c-oUxwCWujuX;Vhx>*MeLIv5A!teT4;&dh!W}W+;PLS( z$~+Qz__;@mVNX93vhM5eqyL7FKcxW7ka!E2;n+Tyu{^T{J1rF;ZCdE_%GOU`pwuI~ z;t%M4idm^zEq&)tZI49eywzsbWBn$S!(p700Ps4UIv0sDY>Fe`fGvG&N~wYXE(_lG z{TAjL)H1%FN}Y?uOlF&qIyV>n%8XUNL5-M)s-?lONqH1kQl`<-O`ImKtW?7L0UX^F z$7#TOn;IzmV;u6tWnzbW47T0MZ{bQ+am+hRs9}t_{qWe#GW6zgJjCQRJdceQp!$IV zaBg>sz?Dhk1lSoDABM*rq2QvgA1Q#x<4vL?@Qi&7?C6*86R>LKZUz2rn=~5yn>6$g z?CSYNob52)Ko|i;;O&r72ri`S1$b2-j)O-!qPYH5jxC%9km4h# zo&II06n0|q;h}^$IHC3A7g&(-dia!Yy5el(j2U1@j!&bSqR}L=((d-2|L*SgU&~4t z#X#MkpRb4iy#qlE{$I?!2Ut``_Xm7ucBvvRin#Pe5f`vvL+oIS6|n}zvKnKI5hTWf z8r|7dkXSJ>4za|IF^1Sej3SmOpb}#xY81tSC2G_tu@dX|n|pU*_4Tda|9hT~hv&I- ze=~P_Ip@qdXR!*?Vq1;;PST4-PeiysaUOw|-Ym@VHElbyLEKl`Lr3icH^bzwS^eKMyH zcCkb(t-e=4HrIccC~ntpz1P^rxjTqGNnzbdA-|qXLb>5%&^|k1Wx{znFFo%5Sz;JhKdrfqdOl@*UcocAH=<75>4b$Oy- zwXZl%i}0JAxCX)d1E)niOBtW(w0Fcs$EiS*(h`j?zwmhQ0t_V2;Lt!BjVZg@u#q$OJ2l8e31ja?=CQA*!4LE z(&&gS=D}CujGe;IP9@cP_mXK%j{Rn1!sGn1`{m-mz5iARFucBh<9*lXfo|?v|QHtO+@3lV&rxBz?h6|goWcDSR5I%P(!PMXr3 z0odNp2jaav@qp9bKBv>BNBB)j%0uv?BZ3c;aIW-u+yxV$#rP9Wd;6cr`8cBI*2KLC zUdfq`VA78W-j{_F&3Ni`u!Cbv@)BYuQd1|Z&ayGEmOI=D_Gjthz`tQuo{%J^^94pS zwWe$6~ak(a6hn{du;u{$WHV*RD?74GdGS03Y!xOOY^;`@l z1^YNylGC|@`2EQ$yIB+}TYeTOdm+SP%F+ZCA`8aP724vA()Aojc`xDR2zKPomy z?Pj>4TThKs^u32)M7-F%r$o)IQYTsNCU_{eHrGNU6H197HUZOE$fv9n2+e-(dlHi^_^iix0EJwi}?kP?jG znp83|N>KlkX4>uq7DRXU__gOAkCrDvH9@p@NR%f_qJ{VcynJJ+MzT;Y>cV%WlJFjG zBNJ%V1kZ8BIhMUS4uMyzC)7+SUdL3RLULt=Gx^>^W}a+XKkcme$MpnLuPVvB%Zmq@eFN7 z$1F8KTH!ZaI{rRinMT5mIP1W0Qlz#XXPAsEs&biyNP?#dPl_Xpr{LPh3OSorcJp3GzB5r68t znH%Pj=5{H*oc9kYqUV#ATA3oX3hA&L$yT$sVHL|4&nKr^B#&EOH@d(iNj0(Rmm>cb zims(qFB(+eB43DPugmN(Y_s=V1Ut6PpMSZ4)TUsa2QGrr@r?zf?i4oSdN9ME9hm}H&iY0H| zJC5*(rKB_e^8j&m#EFaH=g&C_QRmH$exHB8l=#xl>-piOWYSxz`2&7bca=G0FHD`$ zLhv#}+-<-82F+rBUr*CV9m@U}tQOUAFRS4HIDxtXy8R zlf>n^?qws79)Cgp!k+EHMci;P=l;f?$VzzIWu$9V%((Y-Bde%16F%AK+GgAU4fFt- zdL+Gen5>o$kIKVEsEq!!jQFYPit3a3`DG*y6hp)1Ad1HFF3U;e+lA=styl|?<~t_E zJ&U{p=MWlCP&&}@Iw8)$M@bj4#ow|@z_5r)9w~H;FfIWrTd+!uyKKmmkVBLsBJn&w zv7Ef`9*Kz}U*$sH6&EjrT_HSq1@YEmUU{!bo>LXJa8mUx(ZVHxuuk^kU#%dW{$*@9 z*RLdcjV$Vsg<}Pd9UbZq{Yja=C5k*`!m ziB0^HybThg}!Y6%2 zI^oiH$5$k>nmBNCgg8>Zmkr@BzaovRyN&!{mPeD!KS_5nqrM6D`I>iFORQq8oZrd}cGRdF><Ac4`WNFo? z)Z6_FPH68Db9#r_{LVL|SDoe{_y4S;tb-MmZW{!lKeR;L*KG6V!`2e7D!!a`@cW~6OdtisBHh*#tr@|j0zE#77?an%aR%nze{JHW-%m?(`{ z7xL*YJN#(iB>Mhn3l%S1jT?le-;y9jDqvxd3Jfihr2@p%Z$Cf$Ey-*q?kt*v@Cc0x=r74QIRhX#2)D|M~wmdV7j18%{tpCTcg|7}FB>k$&>KLy7 zj+E+`%A4E)j8X|0$CzFhW&5eK(D1QcUJLQq6)zsKj(E937W7iM0a{eT{ynKbFt_Qz%)03l_gN&6`!g>ejUTbpAZvuR z!YqM|0s>b^AjY4*E~fvl2wil<*hJzY3^K^ki9(oM{1dkD9cLh)#D$E|dm3?+KmVSz z>2(@i3#(Z$*TTBWC|~YQO2VB$#oBx4I9?t{j??JVkn2{fZrlxFJTQL%Rvr|KVkU`x z>ypTC{Rl(1_1UCTC!q{1D|5-6B(pp?m6Xx$ql|W!@1QkU;Zdid;#tS`-YE=f08M`& zEyxJ|!4KGzEqw0}B$Dji_T&fX2DF4Y2F<=!(QKGakG~kAv=yv)N$y4=s~s+6v5B}` z9)Dk%KH497;*TWqtw?$D;s7+t$K4cJO6;e?NzG^y-3Zw5^pUGFDpb5 zjqhh&^F4WSE{X8OO{Lr7`<@GW`~Eb-dc9 z^A#B7E6Im1=exF(Hi{CIW(W35;qrs`L`c3&+h&y_%zqs?yaN>7YJP18Y2w*M)E|D* z+9#pfiu~Gv!;eQWkJ~Ay8oTpfq#ELmJ*4Ym!(PYK(zqj|3V6~k&=e87NW>c=zO98lCnO#Z zh51}fZa78MJPt{O8rimtJ>&~gU1nSxTHQxp@lJRAjVKk6`pHDjI!M3!>O2rY}AzBI!HrYI3Djo}E6T=YM#PGAlhidVN z0-}Xl#q$Ev{<9TZHJ`NRP4t$Uc zsmf;-l65?JAMtjSm%KlJ>u15&Z{{ETjB`^?vis+Ml4Sh>D8tD~o*ek+NrJfZK~lHU zytDa1vZo$8z3bvqVcvZT;I*jS~VsTJLmF<>1-5Mhg zJwkjTvttqa)NXm|Oza^S<=xGC@5P55!Kh@zjmQ60ZjG?i7a~(++xQr%!w(!G{+_6y z_kjjZ0Meg)QApiRaY2@r>^`XZjjw;N>>zs_jK8UQA9<%Z~Wh36eV7!t- z{U#O!DO%TroLYEyiUHMq0Uo78HB8;BogKgKFmme(M+s@~m8L;4>Ak zFAiK+M53BLSPb<`{I%4Mde3*Zl$q$9ZkPqna>Bo}*Ej?2#>=-TUJ7PfPxpO%UJWgzppZ zX5)wBgp@rmCS;pH<6Jrs!W$hYt(DK`O!(hEk93sM{Tu5q@QcSu%{u>Knch6&1ToYf zE!VI_sUZ}wUlp6c%vGa`Al6-o?>a%6wUCv6^y^Ek%0J>4dtPbhtGj>2=<#|dNlY#I z6cvk9W-%PBjwcGZ@g%AL&wKk(wL-Fuyz7~mPr(4^Rcu!IRzxW$Swy(L@DH2{y_8=j0dMaFG@ zPm|gXT>vS>125k~+<5kBQq^U(P-8>Rt9jvR)T(lI?C0}#BnFDsdhmtAX>C5g80WyGen>y9AJK|duHn~;$%H1S#zl|nbhY@${Ghh8nFQTz z>-CN-mnuR7E@Cb!ey|j}>{mYb45?jHnaOuTY%^JQI!(a4hJ^+npmm)x?a1rMy-2;Ki$* z2ZK<0j(G5u=Sa1G8m)U%OnZ{Td!HvY6_qF#>j0f6wX9S7Qm=ovk<{ep&f^;C4cRoi z@Me7e1>zkb_}U1*mau_igEL~YlpQnjpSx`c&&js4{Ag{_(6=BJ2wB!>X4xnu`ZPh{`p1HALA|S_l+q9jWnN|N=conIK`t* z#B`E{2ePxeXe_{cr6k-PF@nNW7@=Yweu*@|M}sbr`frE|S2x3X%?mF5a~Wsgz-W0Qd^5o>%TAZf?+qlW+ILlmB^zT#%Le z9?BA>`}~!w6i6hD@~I&V*8_zx39bjY3%tBF*!J=&IYJ`r{UgOFJgV9%e!bys^#(f) z{$j_jji>?b;y(P@HPTf5*XXHRc+=}-qB>=1-yVGZbuyWp=CyB-1|F9jh2j@@r}7!X zN^R$2Zn!}_jgd*oLT%6)x&l8NpQbN*0J5=ur+2P77K*pbt>m6i*KZC5l8&7s*24GR zR@hp7mUvQd>V@MpI!EN#Vm!Ei<6Wgk9FufC|86XliF3wjpm7cBd|7E+$f;~yI0bCP zOt?t8{T>uiVqgPTeuFftS}Byt=+J|={DXvZ&oWX2w4GpT4)B?OkQP<#bgDwP@Pa?c zG{4E?B6=Q%xB#x69#otuaJ{+b&S|f0@i$2yRc*!3E`D`L_BTaVnS}o-s~@)VGpUQ- zE#im%B(2;UkG5T|d>q6*?vNn21LG9=N8#N@g}mJzQrjm@E)EKqGJhtY`^(|htFzgg zPrF02~xd?Z+r3Inmo%zYm?aDuQ9THxMB7K*h4rLp zJ64+IE@}SX<+-h48R=nd^XwVcHjj8yo0s2zz0H^Izuso|2mi9o+qyp>AE<&92gdEJ z6H|Gn#|SCs{8dBC;~g9DQ;$*BJCRmrCqLI3$^FWS&dq#SaRG05_F^ROT26xhP5(CG zx#h5{_=cY?2icE~#ni~>AZbQr(-f&~44Ri&@~%i2r`cwT33oY%WCrkJiT55%q5 zA01O20mGWkgX0XE!EP?s8F=H~sp8+!8MXD?(H1Eb}~pAp)bKX;{p+(0RQBY}TN>2eP&W^kmSG_P9S zM18h+Yc1|Jk!qYPH0FD%sMb{`85MRmNkyCDh+M6r?Zok_@7fgH5dT9(n<@AB&=>uh zhp6eaI*w5K$&qDha4G30tY>>;!;y`CA1ZumTfSFK+xlSvSg(R)a?svGQdREfK>LSd z;@P=U5-pdnla#YL{)d=L^=I`~WOiThJvPZKy*T$C;li6G@cB+O25kFLC;9>R&`=#8XF7w-<1Jihnz0yX(dnOsVY2Ko?XHjwL6=&dFDt$}Hxt!AFn~Sa8KxE^DE7&6>htC^`8+xcl zwFD`qs7AGMr7fKcWH)=gOL)F3?j65&rCzT*K&sK_nqJ3?}w788d-FjYU zR)*L6!mF_pd9cWB)?iOuCnjs6Uml3wuwR+hO|*$TRt*k_RiS#l7>S%1c_w>dqS*N- z6087RURvD%@}erVn-B-P(MZK3rwbqGMngbS&2Xd5!iQ5$z5$6}8=i^n-r7v5O&>Qrr^b^O7@Ym zUtXOyA#wcs8ni(`BuW=1Jc^QFmkJhpAn+Xyd~yvMWldUJBo%U1SvIW*dOUpHj(M)c zG?U#(EZvrKs8prM=ei4^)QdeSen5vm z@}$e63ULfI7uGh%6x9x^sr(_wn0G*QjTaZ;7eS&ccl~0H=ZH0&bdVpYNeA%;2Z^f} zehR><+yp%!S;1Y1Zn+7S&U6Bv1&b#~2+R!Kn@}Z%8=|6T|F5@CJeQ?uTInIs60zWD^m@V*X3dTiV<6syRztWiZ z7nk#yI@$vi!$BRbEfW$l1H4@P7zTF>qW*SdLz5s{SB2lj;e&(dU_UV_UmXx}^1>OL z`g3pbn=&)VS3I^hO#)Z`Q*GL`#v2BZtLo4JcDH3br4FqXRMB_xSlE7LL!;29aOxYw zv+K}s*@2vn%=*J|N3QHZPW)I7zgvg)hJ*R`!L((|(O6uQpr%yWA8kc{fT@H^Nn%9L znPRs)DR#oApq&)QyTTf5IsYM;cCW04%s^(10pa8YA)Hks5JSrS>QZmH8l@8a*yUO( ztI@444XC22y{UPR=-}f;M=X3oT^bS!(q1NtD=Q=q&=K4xiJHih2|~ehqj`Q^+C3aT zLuUU^aZKY_=HS|eO6Z|8@1M(%RtZWV;z9~lX)+dL`zLedd z3X@`WiXogea&tY}kS_^`sBv`zT8sZtk46N^m4<6MyXVwbeCYF5dU_UWGMG-Xsu&j5 zm8FRh8pT(x?`Gw$SWLC#lAQeLa@_w#hth6J#+R(-o67UGjMs(!w;5-L(as(+-;Aq! z`A0*Rg|G zpuZ*xkMVW;9EUJ2`6^}&4uTk=@llFx9hV@PytqD%YOM@r8|z>~IU`N}B^2d};jt!)2QHLazB+XG8ql>3#mW{n0t2x{j1P3$-qbV7 zkC)Wtg$-$IP>f+sXb0Y@5smP_CX*B;ir4ppj;c#13bBEl3%Y|45heG4A*hzXfr9-t#(T&?0*odY|8kc7_ zqY?Z;Q|kXeefk!(B}T@fS~t{Rs*%jvDVz zK`5I@r!*VqDJI=EY@h9AC-P#>fiFEUOGATX%gbsVoM&G>4O@mt+Fvhw)6&437Fq|7 z1Sa8;0G(zacoY z1O|=Qcm9sxQQzGNTD{_*2Vfkw3dEjlWGhQd+xoh>H(!a9>~9#cz^zh@M_eixWAPZi z3JltFaYP7C?HLY@Y+vYUmuws03%?P*D7j>NF9bIV+sBe!-ynG2_s1BRRTvU}6xJ1R zNwT*?vk)|`MG~CH8gE@2r>UibsTE|M*YW;11f~buWu=@V9?}w={8~P^C2is%4k_ha z&L&@Jv|wIWwxrRBz0i^_)8aO_YmEpGu`B&8qyWopi85Nz+n$AhbCBoDL|A4mDiKy$ zvNd_Lf1@f<)*3%}CcF|yw4r)$+29)F?>{`Zeb|P+O^uUb5|uK;O&EE}hSWldF0tft ze%Y1s7>wT)g{?aWL#&6g8vM@20dDOth+j3DG#++ti!Qdn03Q(=PLpN|LGq3dF*d!h z-$Nr_D96Kpm+4o{zG$~=V!kG!w}#&pH1(t;XiW`&tc5`wY>%1Kz7C$B)r2wJZkxPe zczfEQcLEGhOQ3CJrxmhQsE^6szDjccM(~Jrh+y8^p_#Dt+LmaBf!9Tt$6>UNI+Bs% z7c6|yefPb1NqZWJ-me}_3wwgG6}{gj5rz{O$;rYk@c0vAD(47eyWw|*9#-@5g7km< z3UdqU{fe+Pk;hCZg5Hhf!7;RDsH`3fQSZNfZcB@y9jUQU)*ds#GVQb&hDV8?Ab8~z zf;mZ_B6wF=V^1~;cWU?%L;PG}&)LGtYiNnE^2&i~8Ejs$K$I2qlUN|9pIIe9zB0jN z)w>xW_H}V<31Pf2S%8ZIVff0scA_!He_L6hk@cT6>VHe;TG?CMs&}S2jz%vSCPpRh z$J{Dei(q+T5rWr4V569ubV}G;<{+3d{t`?hPe;ORaC_o)VYx0W2&X39L-6ioBZA}q zhT-FhQwZ)zG&{o_GA$i8kVy*=y!!~jR^vZ&-n-{S+9$AmO#BkTi;i=JMP%?Agl{cH z_-WGj2tLliP;Z;$3nuOoL<-BdW4sIb2R&(2(}V^EW%qObsO{F?m{1?VEu@ZH`&9{I zNVXoq=p>e4Cp(?{7lJE=5&7wz9{f~K`d*wb)>p}v=CGt6T5=V^ZLmJvvmoIbf;)tL z{ZGP#zU28-O-%9$>n5=j=Aly(VNPl+d4yn#q%8;<`!pRsm-lWF+{`8bb8!AQT21xqB@2 ztuE7j8A4l9xfvlJ^VYEtNW{Q557m0-$ifym8==%~b$X%EdC5%Vnpo;D$d0BSFQL;d zo-i@{njep)IgpZm(wq9bmOu+{DE8|e-aNZEjd?Y-Fe~9S?v1HS<7iYPdtur0IvttU zm#)b5G`Ll&693Tt(#EIl&Lp2r^$>A>^he$kV8aF8M2A z+fcvSJLi(|O@Bo^qfA>aqKLqNXT zUWZkL8ZI4bhr9DOCxuqkP+A=t4daK>R}~{R45f7|e-enF9ZGwtT~{=j%)^J#8U1q- z0Rpyxw#g)DL4^zD z&xX-HE?-;SM}5r)4yR2jwbCjSmoPD8QDgRSswIj6MCovnvEX( z@;mfm{LhZ6J|`fK(M*Egw5m@@7X%-|KaZ*pl%jwpl?gh@Ivj~Q&6XHn=T7hpLPsqB z(G-2|)Ht0c7xIcu_z`aU6@=B%x0eFi6~w*YrA8IHimz%64d3i{slM{9>|NRuBFeU- z>DxidDA-slu{h*yT4-ph@2mD|2Jx+?6_h=L7cxaSg zRDig84=+uip4(=;N4u(c>M2sgSkW;*yyLxPRJXhVU(|I@tLj`^&pc*P_`uTc*-`pK zMXILzypf7VgD zP2z8VK)Za__IqdXv(PoM_I7?iVe1HeMd&YSNjmo)M}uYAdH-?LYD&Agj&et2vn`QL zcE{1DZ9)@KTf7?aLI!+1wDu#z!N)z-33c_`_ zL~FmY-LLqFHVeSKY6itN^#TaB6uUZkjVPW2^7);QD1NP;`%I)h8my6K;QwQ+T1@%8 z(?qI=j5l#2B#@> zr`*0-{k2vU4MCPEv5*H$qO)9~4{!Y~QGP5RGXA_tv?XqIpG=~4{7ZjHQ5V#ge|uD{ z4KWn*0VuMU4K*9`F>p=x1`EzEZ@@yh^OQG`W3?QmuXK|1jQ5#Bha1%s=^Yl<%E7&p zi$qpNx3SERHL3d0=;(UdYFS_RGf0wiu8Zp*p3$1Rl6s=~4(r~^K`k-%xn&6>63gpj zSt?OHzsrGLH6k#yR? ztb9qN)E7tw*zsl+NYQxc_sWl~y|~2|iS+xVQl*Ew`ep5tm?Y_Rfkyp)Igc@JS^MR5 zr2+avIc`k7tU}4)-iNZ7deLsqAw_kQ>%~oETk(j9ILDbZd#dS4Cr`O9ms9=X! zKRxoh*+lAEutd@nxqPg0ZCdIHO=Wh_Ey@9(S(>SY;<6=D75f!MpSbCdq6#XB#+hy+ z1vI@aZB)!1!`#%;P9=yTOSFnr!4R~tbWkzyNWTUOBKQ8H< z`q0wodgV1WUS)%K6s!Y+C|yT@3q~rBv9JXd4H=?}9U-bt&r`{VXVHoy#+)O)iqlTqH-Xjzi5u=``~? zd?MO9uJV(tdRZk>9_H|kx*~@%fBiZ6wcPreb&mBjn58(Q&qNpIGDn^4THC|?e<&gO@8>v8-*;pGg!Ck_jsQZu-(=<6ayR+%M z$?Pt{?H7H>=DJIpFtne_@9J}`qiLDD1j`)tbX0Y;ZdX>TSBh3f!egwB%1IhQ4DuD8D!=FUQ@bk5zHsNKq5%`gwQQoDwOC zjHT1fXQhj#7*j`xAiL71BqJp#+b&NI+)H@ew1*lLuP?hxI?T1drQcaU(@ps$?QizG)ZcW^U0RJk)l4)$W-q1F>>0Z)-IA`dC+^Y) z;MFT|={CE`u1eXonlwz)8G~SUE|+dG*J?)VJ9Q~Xit5#*5R`O_{murMeB_t3o6_&n zKvV5%QUnIROuELx73=8+WB;A)ayg;&ps^t@4;PKVNVADgDr>4-YZMplztRhoAtoUn6UAF?yj3)02> zkaeS-%r99q`M@-`np7R5Kixb*sh?>13pTBqv`~_&KVvUh9@%R;!iw1`Dc^LInX5^= zG%k{7v82QmkYA;ftiW^_Ddtv_j7#xVwCSnoZ_|C#ODUi1Gv%A!H+_m)pt(;lW0onw zr2Xj>qsY4?nmjcT6Znl z%k;CU!1iYDX*ys!=qVX6aa|{xPn%+)M85WTB|u_LM@(zadP>uqD095CJUlF&TlfmnJfk5~uv z70Vl7iIW4C0hYcZp=9arV3gAhbbv1_$uuQ;xh38~!ZH5U6w7qWUQS=?S~4tS9GHKn8j@;dUa--ym>#;2OXjx?(@IyBPPL>sNL4i`sr2f=(y3CmG}JQ9fwe&X4l7FsL=RwXbVKs` zm$sH}yRQG(L28D4RmPRlK-~aK8#ct!Kd-fArqaN83lrVIbOSABxlz#rEwdd2Eoph% zk|syxy=_UCdo3tIinq*lV3?>4E-k;dqOwKlII|KDkCt7O|}$Z(#ZoBJvnc3>AHOmQgu1fFiAJXQfPb2n`D`6 zIbeH}CL1PO4%)I|lcXt@!w!<5!j38rW0CSa?f_a*vYb>Nrpp{wP7Zzuy*nBDtH^hbLLsCMr3QYa5l{q^*9Yktu z`{wt|t>m;)esW$Di^eH-1V%7EBqAg(L>H2^k61tpf)Us+0#ep~dF=It%A4}g{|pZc z9%y-GRg$1 z1k(k2L@7ym=#P?U33)3I{V`%d5$Rr8$7ERVTqGCe?9Vr(QLRyof7WrLBT{s!U)Ngt z6C$XKtCe*EJ39jY`jaAa1hP(&Xoo)35?wFdKgyqZ75VFb!|bM#^J<5&lcac*Id_tD z1CMo+Bz!9!oFt9G*Z zHbqX-U3rXE9&@M27KQ7S$H6J$z;&MObW;hKom^97WTsPCisaluW~LT)uMCb&F^YOS z_jQ@8Bz)npP6;e@I+!9wA!?b^O{7Qpu2bblnDXeZJjPBH`Ac)BidHz!by_!7=116s z06~efX#q0%a)W$iG6zW5B-DSHJ~GV>kRow<;l%sUWc)NhYA3&#CzzH6$UDsH0I^}Q zb@Cg%W!fAd4MY;nL>f;YkU{hzX>iQ+(6mE|zildz1Lm8igG%6*>3Bet1E`ar>4xc+ z94rEivHp&!pJ>lMr*+f8Vns{oUc8J9Hk$7Ri0w#<`Ph(c+3h5_nrKa+uD-rZj6Z@A zb+gJ${R~(>#ZIGLx_>M;Q2od>$m|m+csOSH*m3|10&^s(BOU^M% zh_1+G*2G6D1QGEKUyQ8Y~*Xst1em%+Y3_V9^rup4!1uJ3RAPSg_Oy#G>Ow z>b=)!ZW1h*Jk}~$8iq#)<VUVt!BQ7I1_w(G@faB_^~7Uruv8!U{BD{MEDkby z)ifZW_8*Ujo_7CWeOGnek4iIH@UbQ$}Zyw>M_CZB7x zxA|splmn=q($6eyTv!{4(G)mlUlP4kH`vn7g~8JzS)yBFiFSz{f#S2`%>8n4R2!x4 zOXM-z8P1E}IF_OCfJt zhPW^_NQciY6D`ABn1ln$0D=XNkq}~mnETu^3KBNFk9LXu3QzrDbH8%rnC8Tv&!e@B zQZl{?@@9nShfxDI+3dOp>SigyEClt#Wi(HqN-$TT2D3PT zG?QIQ9l|oDIFl4HVV%nZr|K?#E)!h3XUdyan##wd+lR_ck7Wvh`1`oOZzB{s+j{q%vk zUpl(xCZavD?F5hy%#+Lo$V7DJW|!C)MCudGf=-ggE|+H$yKF6Ehp33!Q0@_5Pd{Ex z;=IGzM_xz1jftEx|Hrc+D3zogHi9aihc zjOCpc(iQ=ST{fs{n(6)M)UVjw6?yIAg7guZ{?4xT)iu-1-}5gP!s28w&szwg_QOWN2KhTO@xLpyFLKINX4ls=+7(kCr>?+9&+fV2rO zMnv(@w29kC#`6YgljppXa=mq0%DHzkow}w?TRbYaR`;}z3r7{tiA|fC{%-m8L1~P9 z|E^Y>Jv_}!W*J9EX`{!c%_cvMj@RZTrKORj@15dN;mF*)=i6CwcIkEOKyCrcdenbJme_lXHD^Q|D|TIa7*#EHmb8 zBDbcL`(zvEWRuhstuLE9XEQmJ66LE|G-nIBGBw`Uk~JrXY@C+j8?kXtF8O47rf=EK zIXlRMk8_Q_5x3^-BFAPH`&#bI*-gGNmiuPEn3G3NGNSb>^2OFm)|yF_UqnMK14%iH z#QSO5YFQyM&n78;c|Eo40J%7uWcslLEjvigq>)@dmZW8e$>TIq>}N>PvZLhlIi%b# z+Nfnk>TvvNwI(Q3~zRU%*iC>{zWUiSt(h$oM;2$4tTT6h&C|pOCNTRe7BxN1(xmfVGqb}>q&fI@*W@dhvSU8%3Hfd#$qg*M;KQDgj7_9CF!`nrdqD~|k@7&x9UsQ%qVI`TZ_NAK zhneZ7?@5$C@2L-)P3QkW;`I@}zATMi*+NqE+3)+Zbh;S6xAbufFt+rE?Ic%Ul;z9j z(@T3uu|C_~k1eDR^GUfrBh-&&&>!GDDKw+LAN!Qf-bBp8* z^L~;NYDn;7nbde^KgkR=jP+y7=)9jvZm4ARV=L(22S{;f+)6+8CH>(bDGx2(pC`k#+{?m_T(fdb9W>|K)A6rK) z$4G8i+*3ccfgV3bio?oY__0mYR7A?dB8)EnESr8)M6}__Rs7jz`WU`z!VTX3Yzy7~ zD~S)!3-@O^^w;AgB|M^yKg*@XCrD@Zz(o)p)QF7ana>Av%%ynfsTe^x}(E)Z>lqCfoEak}{e ziE6-Z`?Hhu;sp}lfc@>yPSKqgNlF9VbAMJ$f4@jF8^pczXJ_drr6jjOvNnL7qbo0w z;sz1E#sGGK9=t@#8%O~Gtd!olM6?Z)>j$vQ^qVUrs$pFF0Ctt`yGr64MhpsI*XZrv zNlHV*@Bns$ny-<}hIwNG*iHJ=HImz~G%0}Hrn9b-;)co70@xk8>pCfKsF@MK%ILN0 zMBB)M((ci(Z;+@)Y+e9+K=<7+lK4i_f&li2p1VO(8W|P_uyT6u2FYw>$P8dl=+}Rc z+(y!h0QQWY|AQ1aip~mPFR0}vDQ{$0AHbOE;7y{9VjBaPS@qy1evnSu9>8X+*4-lU zQ4zZXSeoj|Es_$&ehFadsx7xkW)wRXz~-tx`IF>Em7WPOviYjbf0E*;^ptam%6?0qjdv`CU@pGQ&BLSyW5Qh_+R>Yam;# z`nil4qgrX)1KAqY(=rm@D$YBQtyOLQi=?#5^9y8IsvCci%vO1Ufoz@X!ab7PDy~-` z+n{>*fE2eX8XU+rsdhak<*mwQ1hQ<^i^oLUS~EA0ZB}JJAyKW%4h6C;DyWFYx6VEq z$Z}M(o|BZ;$!7vtu4?^rlG&P_3uML}steCaZfo7eK(kUy`Uc*=~BaPxXM&_%=GNo)xNKnvl{a!$;2!s5YBuW*dvI zo*h&bm}qVri=UnyR+X4&aT{Hro*h*!Hq-JphWdI|q$)Lo)oz>DNY9R|cFdwtZA;th z*-6#H*)+awTz5S?rP?~1rnHS4tY^iloK%|GHhGAiomCa5(%iOXWAyBt3fy{e+lX;` zc0qMJjh45KOVP7Z)t7UqwjG(gmUJHsM9 zyJ1xQ_zBHy7rj!?ZmJ%BLUY?0zSFbYs;s%RxLxuFJ-egIm`BUoMIY9)GF8cZs%;-} zOwaDAK3_ni+LxWtvj?ip3ut`%xN~~;NL9RmrnI+Q(6e&Y^93}see_K|d!o9$kmj~8 zd!lF0RJRt<;`T*VLfH$|$qZWF-dLs$WlX(tG1Yd>@C{{V^|{3~s%u$5D4VT5_$iI= zS{fC~($p6|qbXg>x`wiJ^{pi|vupB@P&QZn$x@ozRZ0wH^VPFBE$*8AaVT4;e#&Wi z*Njg>S%x}0lWMz33q#qb>KBK7|$ZZ}IwC|jX^vXT~eE4mTNzErRLl9qSNb`E0}^+gNScDICuvDNDG zwKS@G#MCghM!n-(8sFWJ9>&(Hk7v=8?#Y>9EK9xeJDS-&VtE)_r#|o<&F!9%6~;EG zzgpea4#j)t*Zb?Qc%*(2_37~7#fvXSQY$T%OycB$`eq{ThTZiKPj>J6J{d5?_S zVJuI5Z4=e@%)1-L3e*?Ar%^qNUWT!K>Q9W>G`?rHOE@c3AJ3*KJu|f7?11{@4>Yr9 zS;KI4Q2l%}&Fxtf70wQ;m;FeKdm37Wv!m*LKhpA^5pBa+k^0_`RNG58Je(a@&&i=t zy)^HKvyBZlB{Lf{ymQMka zCg61q;K6vl#GjD;_-FHg<PwlOebRF;`Fm2at(P)}W4o_M^y?m-}lOzxDY!|`&Y4DVrj@$!s z`Im_IZm}I6@PIp^|D$a2_&%8*5!rvgLy|rKJOiHP#@a>u?BZC0Uf%EQlB8}Zwox@n zmiO7R-@qHJMCJcRbRR_TMRc59?Yi@!B6|5xlJqvT8=~K}MWgCd_@9XODMhrHdaJ90!?#7_>neFX;7e4!O`d{3 zLwu-R{Ak|mOXQx3=%#=N)&SdQ7k!A&K(x;@L`MP6MRW_h=w|tRlgR!3d`Sosr8=HU zHnxsg$B=usmE{4Yd^ft`m4@u4lF+P^3*-3c5*$qIZta52(OkO0}w zmo-+r^=tSU;9Ze^Jn*;d@(DT!k&@`597NbpowpGo@LR9p3xJCj>-=AB@nPTzz=r`J zjHj&u^$tl=54`6B?{0@r04|1r2B81#*V8wM5M$mfK-p<*89fIs_YiRV9%^`4lG-Bu zPT*~91t7r(!0Y4vG4OC3j;`XsyWzcdplvc5m7}E;5gidR77=2M*MQ(9Z%Mf8-z}JWnJy5&0-7H0u zeg`gE{0{Jn76T72QszPya4{6N7QYW%49V}nTifB^0H29>T^$@#LZoTyiaNhygG9ti zM0{ZP!6M+IC!B-rDvA~qSaAsTUunQY;E0yS0T(@Gt5DtJN)IguUeQAlMoH?2h$tjH zfQX9qjU46y4;2{z*V{4zzQu~ytNSW`9=O;ydIJ~v*&60`LOHqS0GIPags5RO@YX0_ z%0@&hyAP%#Ld@Qqz$<1iKKK@Rd*C%g?3N$!YrvZT?+3iGT|U~AN`qzt7t7h!6TPkY z4&d_ow?(8`Bg*VQKmk7i7t1E3o^9DEEpYrzIq{Q#kFXVh^kaaJ#rrYf@7v+WfxnCQ zD0Js21vkoF(c+Y{0j)qpGrJGQ0T*Lc1YGopt)gF8@n^5$g;rdTezs44A9z=M-yir} zcKNhEjs6!A%U_F_bz14-%fRhtb-oo340{!SX~l=UhPN$NR>2p*?N`B6;3D6XMnqKX zTxfcZH9~`dx5w`TZ-)O_seg)pcF8!~-JB#z*54(iO(3X+c zd8I(ZYj^_iUP!kFxX93!KFf-iy@o#o{sGdp!HO7bm)>we!Pg30tbbcZhY%quqQN4z zZ&|gA3f}KEydUrmNWT<#j9osTTk+Gc;irKckWP!uVz@QEQ4Cg#QYB)FU4+0naMAUr zfZO-bIVtJ`gSQKqbV7 zwjT1ntfcD;+`iyp!22NGQs8lR>Awd)5bxK353s`>u1L~Eyti&{l%$XBBBmmuAKo`L zm!!US_+j88W3i9+w!{6dDzmva@NRbaXy9+-JrlU7fUN;P0T&Iu16*!^5iz2x>F-KJ zlNPVG>@DD8xl9IbU%+DEVkg@JT=bx=fMP4|5cMh^cuh&)<2Bqk8WCa#T#N|&t#K1@ z(PhQJ``Z=>G+Xz}^AV zj8~V!|wq%iU{ZS zuST@~QyI%R;Pzwr9q{o;{}XUA*0!F|-cj)I=vVPMz{T?Y0yzFF(jNdm2=8a2(f{#w z5kYsAF>Z{n?8kVN760fp{97x&^)>va6@UC1-k?kwvX;m^Rxa15bm_;|h&dGz3VsN< zm~_7Zx37@3fm@uR4@aa~3#%p*faMAO|ONbCVl{}Uapv@jA>pco< zO6-LHPh)2uCslFn@m@v{1VltoHc?rJZDx9w9@YUAK?fO7S%sc~fygEZ2$97Wq7h~D z8MSa>gbAa>h(SbfUlK4bV2p?eJWVh@V^E0_kR@R9J-4bZ)%DlQC(>Qt->Fkor>f4a zd%L0S9507gP+kTvcldYk1m$nwc@A%VO!JoPWtU$MmsC9jUM9h^4Xii96IuxQF*w;W z@=thy(?F*mHE+X`c6kN-2JA+`-2uE{_%j)t$*ObQ+*BfTa~dc%yenJ8<&)tg#mHEA zkz>Ek@CQA<4?Y;X_u-|EeY+EEOIa*U$&0idj(7$F3pbL2mpFVAT=KyaaHc=BKPHYS z|IPE$`=kzar)x8>imTw5Mi#(>{copWAHooX?Ff2%=v~m^lW;L`BRaJS*hPwT{T z4y}%K{49XWq8kfm(S`nZo+kdXNH!u2bA(IJn8oAqS@0#;4P|(X9s8s31(ZL6%l5Pb znDLXoCoHAaq~+|g4e)y@-<3vKYK466-~OYI&-Li8Y%A+%qTzi!{s>$eoCSCD!G)1% zz`ybM3b=HZby&Sj-~@)lP5Gg zS6A5M@e+7<9G!v}J0qJ9mqnKtow?{U@*Qq-iEcLj5v=?1HHX;VzIxWcWspmz<~V|LO5x7@j*e z)6d(6&-Qq_PCf1D1y3l2_oYL};nHKfh*lV0G%k~WVE8lRd@a0$atT~?%l``RML7-c>F}0(a3}R&fs1bK$H3(>eF7d{?$b29 z9zhIC#%DS@2v5Nm!Ujp+{2@F92!^lK8t7o;E^{iJ6WL89v|R z*^PArFL`{5;U_%)G+d^pXp)_pwBCMS8(~f;Xx{E3UEw*8R~mlUY#N%a#|HEWm ze)jy|u$kVM%Ml8k4h=B;EsrmR%eCM~xO*+w3YYEJZJP7Qm0flO-VQzm-Zu1~=5bha zEv(8A$N`3L@pz@-`#gT1;XiqNli^oPcN^xmUO4SX271D2Q(?NtFK-bI4j2!>Wh6mj zVU7nG{-Vcc8veP*mEl>p5P#Rv>qf{%aQXikUgq(7Ep>9b4&>%u09%$9|aMTRpx2E_41lyp3bOwpCi6-C`U7-Lu;} zR1n74XNbvcx!E6p7w+rjIhb$HHOQ{)OGZu z;bk7b`ZC?XT92&6s13~gY$!zC&0E?^d<?&D{|OC9@JaMo4iRXFQ6?9f5D zr0DE<&LbImGN7G45v_!m$o>x+K)44XLHPrOJcqvwmlIOt=g!CL*k9B>8hqS78ZNoq z`k4VAN%?vB2#5a>E_QWqKb!J{^MC6O(a7Bh;}Pz1D%8L^tVF(ompi;xM}5&6FyFao z(Vf;C&qa3S6!c|5`}=7AK#-?v*dc-DI>oMT|v@Or~{d%Sjzwl7$mX`h~A1my|4;QeuY65h{gpkb~K zU5_Q1kt>BuBtWGl!a(ejr0dJ*-8i*ET?crVI};If!3 ze-thQcnMzO@B_xrN!O1&|8HIp4K60hU+Tx`*3mM4R3N!rv21H?dNWfA29r= z$FD8o{6CW(PGFBo2D1&nf*|}Ok9SH&BY%MRy_c_FIQEAPkKdQcpDWh(J3Kz8yXN;S zBmcUNih5{a(DF=2rwl)DMJ9i(r?%ha@jH8IzG`KregEFk;2RP{SD8n?vj1fJ%`w8_ zP|&;vE~)rAc&;5WnQkwfm&h0JZVs>AN8g%VaKCeFhT$N%B(7obtE@fku1X`wB2ozM zBH9U`0N)KCZ!6%aTS+v?4+a0DKkEsm4E`&)B&^l&N!FeQPQfLi{R9`?PVxA@nva_J zfFt1OJtOS&cwRppi3DjYj06o-!sVh>2@fw?aHR&n!`BP{gq%d)gK<7y_-9bZQWh|TR3+%>BxEn34k4V*2T++}~c$lW>=*w`49RJAN*~rP`g_Z;Ljn#RNWZqa^ zZ+MBv?=}23kH2B~(;hztm-EnH;Mdv#&~D#Bq?bZK_M=Y22=fq%;3>H1Hl)wO3n)JX zXP{vu{$}{Q9>4e+ZGXn&gALDpjQG2bmLPP;@x;fRO9&l$6)qjBf`=WV;=kZBmmkC3 z&6#s;G*~+gALqfl?I?bJ4VNid0+)L7@ka3drh^D2fHx4rO9&M%E7klbk5?GpYfYy8 zI=D2j5Uv~0{{I3GE;(>%$40budazzBClTDml7jcgu&Bzpy3?U*xHz~S?soJGxHRx0 zTy)#O71wEg!sC^2@t;mUk=ejg2(tR;!>@E4eG8Y}@j5)*9dsyfh(1=t*E+`v_;k3~ z^@6*8Hp8!mFNWjq?AHrV8sU#x2uDy-rVm*4*JU2C9)l0Y(a+%FX`hC_hD#!S9zKaz z8;K!9^#SgZYUcnaUoYH(FdoB22o+9+Cc|`v&oe5pzu_tD`u*B@l0(D$;j+Ef!sYhF zHr)1leHU;DKFZ-~_)WAQ>A&82z>1>-2;<;Y@Uc#X;v1qt`QPxH9R4s|cFl+yXVfy=g%DU*)g1(!sV^P967 zQ21MLX>c0+JZn#fcEO7&&x1=O($-O}QQFb(JV*WEy)pa-E)7}x#c*-Z;pxoCy#((G zPr-XQ_Q#C>N8zFyKYYDtv`z@0Ajk-91GmGaffm2bY~VS#ES~G(vIYWsMz#}v5#{M{ ziJ;{N;R7izhF@(t5$ZTbBFg@I2f+>L3-#v7fH5vzycvPQbX-Nm&Y-U8kOF7@n) z-!%5aJ^K&f68Z^nJ2hz;LEW*@VEbQ zpMA{e<{SAnPrggl--Eo;$h$mwwdy5uwUIybBcJi)kJT=b zKR0syXy&|pt1`@hZ_&FNJ=@ch73vnz z`x(8vr zq1JN?lG-k*^+eK^wOt~=Q0w_d&)0fxtgt}!+Q-icC)D(P{ASC8`(hWQwP}$tElSRv zQ!#$p#IB}a$vjgwE|cc9ILB~PuQ*@(Dc1G!bIeeRt**P4pQDGCm!o-J?qvNYKPNA6 zke`z9OSJ7>BvGBW8?++D~qw@sq1NmY-Xoa$9BfP%rN1=VJe{Ki09K zZYR&Qo0m{S?~AukGndA@Y#VbRcC>NFyqxJ%Q?n+{zHQo^)Z|+xVLzG3*DRzuA@{Qbu^Z(wp7QPs*9`R&DG|0G;)7+{4%xZ7`|E`;}?8T6WcZ)i&aI{ z))TRoYV~oHvg5IV>f__FPHNlnSSyt}!Ed0{IT0JKnmieAqu#2CC)D#N_@US_PsY2b zt4_w=P=%*r_o@1)_$}S&hIsF7$4WW2B_rT%;hn zNqnlhWd~#Lz9Zgf+oMh6d+t^<*2d3i^ZyEB`I`7DwRe*f#H7S8Tg|SDmxaQO61t@l zwMMGXkyxSHc_fxl9oELb3?rA2pp{6x^3}cT;+<5X2~{h#WgP=0RDC5%O;n;f-da7* zyKR53j@LxhiJEv2sursBc&xM9vYwa{uMYZMRZToc;#Hs))xDp-z*L~$xe1h$-? zYu=Fz!gs~?U15%WSCBOC5=m=ES_qk~L29rpKeWqF*0pX(5Vsd)<&q#?D9UQDzADOU zI!$-1C^Rp^txXcvSu!tVVFStVT`}FX>B811&JW+&!ILypDw)+hO_nesdBVQSweLt3 zhLJ47ceXJSM##?Au#q5bST*--r>vS=7!G!!Xeqp5Y7}W) z<~SoQ$IU&&!dv0$?i9g`G+t3*w2T+AqGG9YVMLnu>gAU7EBaetJ{)HZ91`N_9bz03 z;_O}Tx~5ReXQ>gVLO0|jiga1~lhdwT7vItM+YH`B8<79v+VCbhaubLm^uX9R$-%j= z!v=CIH&?pOJu4}Z9dIVeEX>3=Nvzk`Vbhtl6(Ix8FbB7Z2R9?zcCqoAB39i}qkV-Y z7nd5{TWxahqzy`9ZEerZOw9Frkei*D>(!o{pU4_fo4pKL+H-$S%yn+hT?1$(43qt) zPD#k*vZ-&a*nC6L4oe4}4Mk-e#Ck*Jtf*r=-PDR4H=%gkMh^?p&efhgtv}mj!cyZW zp809a*g;u3rfZ!zMr#$&e*=8 zwOOX{=B?Ab)V5sF8qr6e9R47&?hVSw|DMh>%4%P$&ZwrN@Y1M5WUS2~PI#^Z*K>oF zKlzIdh4`e8?PfHz^1SUmrq-sy3#JmX+F=M1kR1-LJRN7920tg~tT_+-LTm5NVURwK zP6J`6qFE_3(n8&dAt}B&{3C?>l1(1_1clBVXC2dkP@X^sK+c}!rV2#HWvTfBnF!c; zaFdn4BU$M9Bk!)uf4zE{yb7w5s#YGJeqI^oXX zV;L8Rkwe|KpnK$FH(NBnQp>%9!HOO^;|AH} z?FRy#EQL-L^myndD7*AjT~Fw)V{})svWu(gdO>$xp}X!XyY!V^T5Y(Cob4rKZf-JI z)7w*gA0#lfvHKjLl7?ckf;tnG(hb;7NIJEqE0_a^%WpWBlAo zKR40Ogdv_ov}&wUUJts@J40s-?WpT0;ze)91K-gxWPz zv0WF%S1uTzjrt3WOOR!9q$3h&wQ{os&8?BBkkAw9hJWuUwwCZWdl1GF6sdSJ$vKjl zoD-@gVt5fAmbX@reI|}YBgveJ-=kaP=ZS7;V5QTf={j1gqj=n;%9Yc&h$FNtkwo!U zq*fLuy<)I=p5KMEj;LHWGk_^&?;FM-2>6i^C_R#s$bGnuM-VJ96vTK@Sj4b;`yD*v zi@|Dk7+2uEVSETd00_b2RD?b&oZh;}nIHu4nZuL(G?rc9+cDm_3t$ej!Aj(%1HCE? zSCFy3^ZL#qq%R6T5yfoN;oXQRl|_dxb3s4>L5O6;z>-)|nfTZmOd^aVlG(=e793BT zs)Gm-H1Gs+gPj(I-_6?FoeqNn@1pL6&e0CzOS~Mq(ZQ_K_g>GFcFpw@y34j24s@!S z;gYqeeuWFGi;nf8Ls`d-8C`Tl2@-_O6S__JnNEY{#a`WpS*MlAeb$|$HyGae?}l}b zB2AB6m}SZQq5CjLM1LqWraN13yh&raemoz`G!3q@=d*Ku?#{E@qKlH|y}8{)W5?lh z6V}6Y;D;9O4d&1sY1WDE6Uq=I3kxQ8pOE1LeYQ_`>9}Nd< zi80;O&Fq0;e*f;|R%Kg;{@9(nQ^j8;g`K2GvC{S_@NU#l7K;YUM;fH)IqK$Y={})M z@vsDWCl-vvr@*^O1BsQhKHI*#KKbQvLML`d@~e2HOG0C1cOm&V+H?PFH|BS_2woa5t%mE)clDl!4a1D)Qb$yA%YF&A^?pNk-yCK0Dy+MF&4xY(6Icm z^KBpGMiN9C^kSWRQrSCA4 z^IsX;Y)B{kGW;$OWf}9OEKBc;6p#Ud*r{PB6I%X*-!n-VK@`A8m>pa^N#wC=cAvFC z3J@xy+c1@p&4oFp;D-RJlgf3r{KXZH1Q7{Pom4KFdEa0vi;#gQ6e!;YDrcm$i&qeY zP&GcZ1DVSXtqdqLA_#X(3Vi{YXKRsm0D}-|b*FN4K!`&GLG%Y8OyvRwp3v$;V(mfT zqPjzR9txPC07#(t%Js+rv;G;W~X4v8y4BmoGX z&;W!XpS<}8$R&1}GJu?=f}{mB;8LhXD@SlR=mN!%qf7J?0TNcPU66~GH7a%iNg9wbmz5fvv6kd&vIHtp>wqJ!L;=bA#dtA(z10om7^ulbQ^afO@ORq}6`qf<)~XfL~1} zj1*daXyl7lpmKtm^Ynxcf1j=E%p{on?ns}VBh!Rdgyjur6u_^NN&UB$Z~i4=GjEE33dR0VST3OG%nC{K}F9wof?{_KbB3%)R0X&m`~$=(dCx`@pIu_%>N=2 zEPKx&GyiDNhTG60fM1at?ZQ`i?vVSyCuo7G!3Cn1I*xy6Isu4+(FJrPR+I03f17n0 zJ^^RCKttk74J81HonEKyjkD^NA@C)L2EZtS4!A(08zx?7ZiEJC?1CKC>qikl%2kj` zCm}7r8QU(OK@f#%#wz2N-ybvuLJbPmEL2i307mJ=d*yVmj8>S|84U_1#6M+jK!nTy z6NIV4+*+5d7q|;-Y9aneH_D_S+Vshd;+X_drlx>af@6>BwBLY0Yyl4I3$RCCSU!Xb zYy-x=!XI%PZB#`E%d!Uns0OVu*Go<7Kwi+%jn?OVN`?Le@t~7dDQ4HKMOJzH5Fr2u z)J5#V)2H1xgGXKrjVfZn0c@EXE4BkBYS6mwLx}Edh{Mp)MXTpoiWkpe2T^&=|=1cM){T$0^VGpN<=qe)*j#FkoPBK3AohQ zN$$c&EBNg|?r-4#yUlFUOc7cDq=F}uDG`9rx-w{t?lvYN@_?33Js9?3W3&h~V+0T( zP=W$)2R0XGKZDFiO{ez%!PZrWHlVdj!)XO?^3J>6 zQ^8A@pYzC-g2t6-5L>ZeRs!geCb3s`{H^=2rxccr-ICrPQjUJz<#lZLZ@N!Ghcx6h zM`}BM0zgJ;$ZO||4I$FcJ*Tx~c7*9|5J60L5sXV7Sjr3TDT3siv-3cWHAUd}YNXd0 zm{n=_S$Q7(ei8y*m#B41sof6k(p@=UAxLX5Hu1y>vv#0hyov&)t1qPt2g<+<_h{ht z&4_i#=*g{P&+oIHS%lmjKs$Bz*-ZO+P2jsE8a$9XbQEU8N`(ih0s%d$40G5=2Q57xZBqO2;>6-x((yJ zXSF(XCn&BOr_w2n@N?Am0r^_M_}v7&Gi8C^?~tJNfmY035uHus{x(tQL=fpPkN_It z0=)ZevY6J0XoAL0K`i^jDKHu!7imB~vOSpvka9HzG_7^7Ip)p4E$LK1*EOw!5f!cB z5Ck+lU0YB&vp<7qwE$48jG$1G$SYq*+cv^ltrdU7Z3NDbz1Pmj`WX;{^~mT(tX@}s z>!+6v^1_KrC#|}Er2%p$;Qw(AVn28s&a#7e0Y0>gu|8v-8oUJ}=R;#Bt>g9#`(747 z5Gz2*MbH5k4&||lT0sn=$OeCeU!}Lt+LNnW3={-HOBV$zU7{_eEYJHQsy zph_D{{7%PgEG)3FygMl{%NSlE9|rzYMS)7gW2l(B>mWF4@Sy6@1Kqu>9;?_})K{rw zJwZ%RgDSn!fd0Gdyg*=T9w=4j)V%q5lVC9jakEPbew2y*O=CJy6hXU^g7OcW$2w48 zxteGf57^1*3poZG0D2S_p?=yc(Ic+jLzJK%iYppEE?)<*E)LTMP}IQW%#K^RK3n;Py21AbRaDIp2dG;NaS+vsF9B z1~r%v#CsYc`~m$3r9D{sCgE3tsMVNOmA97h-=GITZ`ZWScY72Tz_eayOe;}A zz`JzT`iE0?u~3Y_{DdQOe{E&q}%e-FK|q@D(rsCLo|2v3>haT*?^ObGhXI zyMHYV51f)I0fGNZXK5LH1lGb^5q3m#j`Ugr$&u!oa?1}3*+NiOH6+Xd7QYXF_mA`-h|VP# z?XrG|->Vn~p-zR9hLk?*=;c2FKtV_{=zt66bhhXiyO$P>+HFqd!TV1Ym4f!D38f)d z|CYz@3y_c-(1fbYb*P?xBE)p;T`}{OA#n(0ZhZ#QwQ?0&91EmSbqeU+uM8+?g=PW# zs>0XONwcEIfL(x`M9``-ZvU#L*6n~0T7Y7ed$~|Pjvd&8vE@Hjos#V6QFwY-8Ef?x zD1f9#B`hgk+g_-8)7lgC*wI+~4gdwQiU1le@NRFKWAZA%6WimDbR&3Tzl-ZVS3q{F z0XeB9M$4}!LTRzrm|2UBTLZXPj39)6#H)S_duM*8&4zN+OJth7`3k^1kB7 zZsup^9$&v@Xswd9cf{$5KkemR&N)L~HnzUr!&|L;^b&32!XvMlJ!?V9KCo!{V zJR!^lhKisO7z?wHG5yRu%#ewlp#kOvc0Aj$5_1`nkJE*M}VHpl61<(qpfdQo}J~Cz@xu`p_CDz}0 znTF|Muc@RJP=KTsPuo!uN)R0y4*06gz`T7u70~6cW{*Nh=DHM+*8f8%Mi&2@0%l3l zb+`9az-OkF!4v*Xtz0*LL6CfEioo;i3&V^5rd3O4NHw$yW&(^2_xsGe0?|UvSm2~2 z(q-Ru`wAcyZ(FFW1&pQX>{odel&IB=1x{MVWTjozu7HddnA!yybna8pE+zZ1uxOm6 z=O^0ZY!;wIbQ@iNcs1ZTvl(FE2Wx;J(~XDyN;IRxPsKSvWsB3paFU5<|!FK3Ski76I`H4 z$9|2ol7VzI1eCa-SI&BdlxPJf-vv5-N1PQdk-2LiopS4pyeCq#eVeQbASL(EfUNun z$SZKR1mo0%{CMjOaTp?Gw8oqsw#{He=~i=2!MD%I4)>VTxO1DV_5h4hs04IoSt^zq78skIsv34phw5Udz@5+OoUaH+UtSw2un^y z8JJ_9XsF)oQ;Lub)VaY2NC0Vk-~=eT6OiA^lqkVKO8aQ*xqyai@X6+pq&N(haq1l}GCuL@v%e8JT3HebkE0=pp4+6C%5aL@*@rO7HLDO00y z-=!}~gVYFvir{6{s>Ar@69SYp8vLLPTH%7(Kb#$*-7`BaPk(v46~wd%v;_P=eF5m} zzIzHa|(M|h{77=O-4VVHEE!1}d zr?mGaEN1{p0W<+diLzvxArLnrl#PJxD7Mab1;iJuhtvv51d3dN(bq%?-fpi6&}zj!oaj< zb(nA)5>CJpK`jEB)~sHZ1))8yYuEyX$TXHq$bN-aJ1y2sCr4rT7Wf*Z!Pj86lsQ=D zL=c%8M1173mqdel13Urn7?H5#m+yp4IgnAw@kiW-m22D&ImkWNilA9bPmY$Czjn?b z9+-HY2HHmk?B_kvN=uey2wQ*hhTRK|ochYL1i9f0V5$bam$}SfcVF0T(!lFx&6Y;b zfHMPN`68M!Y>gxQxa~#3UCx-6h0DGK0xv5%(SrVgFfQol1osEL$5nV$eundtVjxcJ zK^eO6wgz%?YWE9e>lG{XgocI;rH!20{17ICWd zn5f?y$VT=9R3{N;yOw9odSM0nH@iEBJ*{k*7oGqoH0@`9AbZ>DnP3hY98ON>hTT68 z9#?}Cci&hRgqI-#r>|@) zSz9eTy8isy*{XoK2gwT!VJxihv^RY-%EwYWo+%UCLklKZfSGLeN0P*#6(|mZmQISF zEjZa~(*PQr0j-@(UdJaDfou5$w**={O~3pX*PMU32N0HcH$p0aE+xqwQS5nXsStM{ z&Wms>v~zdf*vx$(xYeCx?54g9u)3*Hr&RjXiKPf`Q(q?J&N600hk*! zm~o?m+fXb8)VMY*qsPOj4<}g_)WepU01}BV`7Jx|)B4jQCL!sA$)bUQ8CU+8E;D$| zCghW$rIQ)u>8B-jkAN945djT~i71=Q{sT&inx{1ONuT;G(lTSnvebBKCXc&4U7`(Z zdKqx2%d6P-Wd@Z6^hj@REwNe~0#%(RFw!n^?|t-<<^8}UiqvQU4;aYT=`!7FsMd6q z3Zyt@7@UvwWz8kBpnlP;r{1NAWAS5ukqi1E9SWTIwrm`0| z%_W34)rvz?aPAiOg&??xXT9?G47s)gFlH)^SB2K|!&#A?2(rR8(9p@+E1tiK?N`_k z+{JiLtc$m62jv7?1`?KUG)#HNVzyK`pAbIKAY#N@?$@FRzy`JQ(izmcXI5_&Cy~5J zt-Q1)8(;S&^45YSLr9{PSAey_<>1U#ZD}uUB1cWK2y;R=_q@n-k^#X!+@0ig?pqc1 zGIN3pDQXwR<%L1aXreb^`BsDC;tX~XF^Leq(4aV^gBy1DAt7n)PO&s*LV`72hFfV_ zZ1l0t4LyV8O&YQo@LfN_PaBxBVx=rV{CKvL z{XlUBLbw_)ZJDR8^lQxd1ttbI+vWINDrcwZ254&@jVr$yl{2OhHf{!Vx3{c$)|>0# zu%^aN*|W`;2%9B?j7JFPwN~?8vIO z5YdUMsuctgK1jb=^ioD}!1>CQ&Df(awoXdcX31u$0DXi?b4I+3-c*t)o3VgPtowgqutam9r8B5_dR>v+un-WC zLv$l|!A^Fm=z9@Sra|tTG5YQDS27}6gWM}St-Tg$v*Z}9@&YzUb;n*I4Br}Xh^x@n z8M)1llq36gpm#UW+Zlm84~~N!iNOLaADI#bkb7*8^-c5?p;iqxgiP~mW?o`4TKxd9 zGhq6in%LSSc^? zWz!$e5goAO5tZH9>p5ouz@+dk?#m_(4QROcB^0zCd@9L=F8vp{U|>Nc#s&myiBy@r{Mgqf)> zP~PN&>>r3s5%EBSVdoa=XDUX@h$jHpN$d23-&JV0YO^MYQlYs^%W|)^TD)Mvmvy>p zS?eM8J&Bu0bGP02rJo?@H3$MS64k{MCFY0{9*%|+5bemvw!Kc#s78g`NE^qm!=B|6{W} z-FR&E2EJRx;bYY9M~ynk77fFMW8Y{O6|uM79i#jSbt#qTrU|TrTJW&YIP}mj1aMJ=Ci)kYU%YzbT~mlWzSd?PU!6ZrwK-ecC&_ z$@p!-CPh|YY9KX%1IU!V?o{sGHVs8>_g|j9^V~Mcvr6|`-QK#T;mbpIUfdS_Y`^>3 zVZC(^#4fMfd39Ubvnuz^%X;f7<}A-HZ`oGlS>w)W>8*P_b9vp~)@`!nT6gDOeRNO# zOeU0g@R=Dq(c%hO$uZem*#iY*jVtpaGsHkHi|2kKOG_M_V)ZwSlf`Lma4pP<-Z0f5 zBw>D_<>A9dT0((kPPVsjgI8fW8MU)NnNq4t_9`7O6eV!Yw{uqzh3s&mfH~{XL9bn9 z+nx!n_x9=aUHQ%dBkbgfu`_1xzLMaTJpFy_WLt7yX_BO9LwMovG1gP9uA6R|e9O{y zHNjkdl4W(~f{swWAx4(_$LUwkgvN*ZwESKl*?#cF9s?)uT{R5@M)Znw=s_x z^cy*~qQ7Cu1|v=-OToS?qQOX`3I}r1-tG`<{}H0E(Qo0pzDB(rtm*qff%R|XFMEGx zr(uvxqjeE^vC37;73g_SCe+%HR@El(t+v&*7Gzkp5l`on?hGA< zzBZT#c3{emAFFLqG5Je%3;@2Yo&e9`HOl9K zGoZ?WBoEmFz}`bbA9!`>qQo761TQT6uG@`XPiiffRSLpsN(64VF(m`~u$jG=8RcXT z67jh68KlYK(KIc6$+d?~wb;qL$>!wl!*2TK$)d>{;_XEaQKEiUg#Ot2km|BW(~%6G*QnV z(}MV%@hJ*2LhfS3P8LoMN>Q-uA70arjx^y#kqU(^`HS38ht~Svz&yxv^`2U>Fw6Di zUAY&Soq@tfuXCgn_>Qll58diSZc!Na=y4z`>e=LNg$myXw;uTHRsCG;G09jop zL?vWhT@bI^knFmJEfplM-W$3?>i?muu-;EOflvQ5pfUHk%Bp*GudZ_=3md{r%`szj zfR8ElFcg1pR@&WI@<~JTKX=SJ=7)BWzaE>TwH>&7kW4(`NcKJM2r`K|?!!qP*0dAt zDA-J{INsk0yvyYMh|el;!6G=#uA3fLnU!|yJv6r?(~GPyQj2_iJS3{rU)PB}Y>7-@ zxk5Wd>!;DYdM~jsQBtPO$l<+pkj zBrqL?9D(+`mlepUL<=og#0{HNqNPUiA8YX3BAPoirY1@=k{nIgvCC>ddO<~^=yD5)$Z*{4(VZ0$mGEEb8ggpogynWqDU zr`UCS@G#YWd|vQh*Ny`%heq)$#Ay>N#IlVQ;zHZ3*Mz>~Wp+w*hu_Of=H$cE_SA}C zAbrCrOAb3ZdeE2$&{})ShT8Qfd^=fq#tfB`;b(&QSTOIgVB#tiX&?9N@VS)AIUw@$ zX%DjOjIE2oDhH9?eoKD=BZn9;i0#l@#XlpOf4j8Mto}TLoFR84xn~`sN^l^8NyELK zoh#vq*sNw7PK6V@;0Mr@iY;?FiUeSI{iIzq!|g&Zm}_ed6f>crf6+kG*TMq#qI5US-AS9L+$Xyvs@{nJb(7kbfTLB9+dP zGSFw3lV1C|)MO5WL*8uSSm#c1=kj@qI2NHraIBJ0ICn)mAr=bBL*&;cJ02KFM?030 z+G~4Va3%|yxI86MPyN+IQBC^DnJPPoOwDYab42C{_(~@y>PR~Jp#|A?fgcs?!w@}& zy#Ua;$KZP~^|DzjCb^#pdyzY9g|)|-u+7Vr_gy)fcXhuE+A%z_&6}KXak`Fi+$9@= z<9NJ~JbuxUId4n>`TU}2pvxNjLHa)Sf&yXa!MA1>&O177`_XorElW1|5V_oagq5>H zeqfA)EY+IIL5I-Zt(dK#Odh;!@%_lXo>!sHoB}Wsd?{T)zrA_WQeY;i- z0{n9^pCg^y%5G#x4E#RsU#fBx*TC?RH_5&_z)BY$O;}>>le`r}CPWvq_KExRlvxuN zTg6ppP$HGF^2ys*BXsi1zyflAUz$($xyI+`BtgL?Qsyev-Xz&v=bdIvyzH1|EKW3ec6>43E#1=9dqXt@g$V$!W6r zx|`vqDzuN-5E_-4p&QD38%rA82a}^4#Rj&(G8J9R&%UKQO(e)HWLAfvRM#DnpU%XMy$~lr;W)Tso$SOEpayKfZ_v2 z5mzCOp4i4pd8yL7m`m_4}n*O|VR)R+)!|G9F zo}ku4yhC?nNXEcq5la`xq+@Z1lrgF8=2+gny$}=#>mqOHHG*Dp?5+NK0|weghphG_!_zM!@@x#4y=+cgyu zhn?hu+x^IXH*IZ;U3DWkgOWv@ETXX0WG`qdxG#bT$8tl|*H~mj+TF46rorY7DXM2T z@Hm8ikde|O;e}8v1~tMWrnT!Bom`lZ+wZs;;fz;eb69#1+78Ocb%#BC|LbSzG#!H?&?DJ^vhjOLmWh_ z&G?*ebo5}8m+tnl-iE_pm=JifL13jh6aGCP#@b=zsC$7P_{|zWKI;+;(xtC05ZO2G z6Q@mvQ4a({R7yQh?!7naf1!0F?hiGBpgU1>uCM7yKWV>hIcSK z$yRv4S}uztJsyZK%L6svUGl&k{u!U&9=P7mQub71S(-FPYO9kb$t1{-jK zV~bhf!e?#p!)!Rit~(!(MbVq|dE`hHOhr6W_)y0ZbPO|_LujehOSN>w@*n%i!)?1V z#BET9tb{qmLX&wW+Y;uK2u&`i?nV~d63CKA#oYJH!HYJ67j3nhOpbmW4C(vo$L{bC z$Q*p^9#Y3v%%`;`=`6cW%CF37dkoy|_yoL>Y}%LA_Sbs&bV!TOy=b}xIeM|0qDRq6 z;Rfm{)dpQ|~jA(iWJ6O~AcLM9}WcCvwx=dC+@vy=eY80!a>>E0zHb~Y z!Q~XydW7yUaCO#6%1N%R$j}RwS;Vman4l{ZhjW*`h76>DY<(J)cpVGsIHZ>EUS7IN z->&V59wf@)98VU8H6%56vILe2b1@U{tWOpROpL7H@wrBX$Y6!?TE~Ogre0##-PsC~ z{OrIL%lYK0XR`xm-~jaUnm=FD<0QM`=;ta>v@=RY zGb6p9ds%??`WnHC3GQRt!&X?rze16%*tv^b@Z6J`x~z#Te*S$38)A%K%6UAUN6Esm z^2Ba#hqUGMf?r+2qXYBd@mefAe(dxDAmFr?edMGU!vw&5VEcSWJeCuiT>xoq)5*zN z4PN5HEC!Xmj%;`#3BZV|@p?KFXOu9LEQq%CzC!}ApSsMhI|`YLgVFGLz>%BgDe#50 zN73Y{mi=Vh%VDri-TrckF;07HM#WX4*LN~g8o+SlNS{~3{@DrWU}9li#kxe^JrO{* zy|Veg0T)WH_{)avO20||@z((L{8BZ@q6l(!P`dD;S75blU` zmC7Vw3ic(Piy%m#gXf+gceee@Xgy%9(c*g{7x#v@zOoWaviEBtxXY=pN7`Xa*JMow zxbvGzH{eg6dL4lMn6D95T$NNyNaHu8?V3$73+CM26;yjGC$!bV60%#1WZ%SSLcn3a zTSL~p36fNU4uO^)r*GG4L@aTXJ=2J_Fy%IzD|BAlmHao&n2j=pmZ`cn863IVao z3X;Ndx3tti#`s04T;ScLnGj?|3f% zHG`5RSXoTSjF%Q<+B-9yPR%EOewVICzpL~fq~Uu$<9Y?@_1?Q1(2V#02*mo}=Fv1P zoM@C(Yt!3szDBvT3h`2aw@r-wD#{BHXWPg;F z9GD9Bn(rW(C}Ug{1TOx5aL(BEWU@nfFL1UX)#5-Rxt^4NjIv^vLn@7ziaqb7>nDGR zTp?uqrwPo5+s(;?pAuNxHmzAe+J9ckc%Mv`f9^MI)1TtkcMgqep>Oe9wLszK-eWHp z4mtgoX$SxEWaAPhCKW_yW#xjs&Ra-Sw%B+-l;0(bH8Q8VKy8d6}Jys z{@e&_om-!)^!YZ}`kb%VpwVbJENa5Eyl_JOE%h9ExFe0H%;>vSECzp>{7;P*r2LB& z1i>3$QZ3lYqR56A8)fwnw4Gi6K$R~3tGVTNFo=VJ;5z@hHWRz}W9;L2tz$*5{Muh1 zR-BOVf!l;t@;36~SD{&KNIsvz;%?_Zs_T=T@bg$s{wBu-q{X+O;jr-V9g+$4KCKEt z_`j5g#mTg_%>p^mlKn0@MGjZ&MdS=)b$kz@FnGO~$lFxOx4YrlbZhQy$~_ z((wUveZ&Qv0mOlleSpa$oDkit24+Qu-^3ZrXmwpEmRiO_t`wJvT>jT|QGcNSp@hXS z|NkW{R9Ps+!lJISPy~Y!MA>U0+d+_mK!iFC@=%qAv0J94!r!ZQ%XIRt#W#)gBA_hYcrk9ihWgq3g2>btZ z&?xj9m8p$vsH<$`Z`|FcuH!}Z49ZR$#VcWA{zG>VCE#e#9nL{fsEu07L0*HEVf!Rz z%1@w-bI-!l9h&G&oPt7OtN#!OBNDI(<)^>8Tr3-j_&AmyZk#C(UT z3a_l9yCS?tVGivd)R_^i^`tt;pE`RS=~Hz&DBH_CIeM)8-X&N1b}b@}qlfxkp4L6r z!tsgDi_&Y-bkSmDS&HL4m?nLf&034|^wzvtYbnGry6*z&Fj|KnGL zIdzPSrrA|aW8OQF(IC_3ES<27>0Y8!;2P)8%e=W(KR3Q6i3-<8F}j#qy2Qz+ZsYn` zkO4C2(da{eRz~w4KwXXIRI&kj>P)930d##6lD}n;{Oww1rF8sRHGvq9BO` z3*4}Q1Omd?6rtC`xwqK$F^|)!(F`4rW!ftxpwreTm|UC6^+g!Zrnm(dv}XY(?T@Ky^u}rm?AjJLNt!wD_k$7Ma24 z4qq8ptEjkKlLC*s?RhCRSX2pL7{B}Y>nRbq-J^Zk`o{R&vKgyY9} zI=Ile9K|<7!Mrxu+A9h_XmZAwOV=%^Und~gm7@yG&`7$I7klWRI-RLQvB-e(H%E5n zt{|kY%@3s`qUZ{VGxhU-1|U;!np4f@$i{D$ixcn_iwYbdt$*tKc3M+>je6c?vkEB> z3$)5~UE$q)5hLemepB0W32dq`9&NX#&RC#`aHaLngfw_d3%JT_RS6IPS1Qx`jeAkn z2-Y;bp2JJrJC9%nwXg!0rZ%!!K1Mj%joySk#CmF?C7Q-7RIaPVcwK$Lf18*(V~J8@ zhn3__n5pwKxJ@`BL3|H+aVBJ3ZOWn_U32X2`mA7}`_-6LIB&y|^sjvQbXbe;E*A<+ z?)8(;hn3V5SE|qoP58$VBPo$Ja{d2s*!~o3KiL`J>bck6mvUyp$*ab()LUodCoRJc z4EE{iJ1j&0@$RAOfA6I1pY5u=tJ~G@)jBKN!6DLkK-&Lshl+>XNVFue*`}nHL)V%_ z#=WSUe3Xxzr~p^w#yTD4J%IYz21yvveW^AZ;H7O>swl=n-|)4jo7Hs7W4ZDkLfgJWy|6{}c%<=RYuFK)NCKX2KS(U57l%pPtrhCd&@{pCi4K?5iI;CrLr2fJr(`mox>JGN0{!)j3Fgis^Q5{LujTE}Z$~WY73BVP^ZV7`_3t?D z(5JXso^x-{Li@efbM8~w4#+f-AK?D=)BD*@^zC`5ceZ?cM#C=sWm`WOeMv45ls$EV zrsFUg9aE;cXUpFko%R=G-i}CqBU{SRv2vHZo^9`4&%9r=*#5vOnUOhTR@n)|&B*r- z^FC2hA902{(+f$oC*oD){tHyRBQonf58D>K6LFx5&NJH-ukRd=|J`cD_Cw02i-wzfpkX(v0b-)h77r{#RmDBgWu#kcE>Dxys5*yh9 z-s&%WFa3lsjbXwyt8A9TI^&g7K8AehL?wb#{oL5wRGjv?;28DV3t4-{E|!Po=5kFd z+N)OCoG@Y?UUfNr3tu>W|8jjpGVWeL;M|L_25SjQ+(RWeArmjxMTFVqeI1N8g5i@8 zl(;qfZh*l&o!Ar{@14SbjP5w_(#agwdEdWs3a=@0LgC0pWh?|M;bgjnBuUu9oZR$r z1`)X&&X7@k_{i;lj_Fjm{2$Z#Kc@3P#B|&dwYd+nq7Dy0dX&5miWagV8dlL2Bv=J2 z>%w&H9dExu$~{6Y^a__qt$M?-!XKlvy zAY$7*9OqHN@tt|F|JVoacqd+9y#ueOVV%8$S}sH+qy7*j@J3&J&auNqI=bGs>UgXU zTPX6xRiJsq#d+YwUhIJEV@lkgxZJT9Y8+Eq4&rhLqDJ{3Yw7k>VTXUF32f_r90C=) z=i|jJ@!_}{bkD24?}!WYjiKYqXz2LcpDycO#><_2c&Cc4@ZMp=qhIPhXnlMY7Ks6{ zc~CEX9H3l{{EGqAm$wrk*}V1$-~v>oqYLWt0xageB=LBsL9ARiLYcZKt_oK7;mNe0 zy#0mu6Rus2|ctsE!)xhiu$l!nQMP zkBGplPlke#UxqGBxat6~DT-!OE#}x3KDF8pc}h2RvITF0AJXBQnpH&Sj)qVZ6^Bb2 zxJo2V;qQmX8YnDDS8l3=N)hZlalftPEPSr|)+tLEUx${<83mpnu zF!ZV|0@qxi!qE!89_!mr=D6N-6-xRo63CE1(a<7$`R$`^*-JKeu1U_4vIt# zDDtO;nAAIR2fW{M-UUPjOMF~hS5|9a*Jvw$KYIOFP|9hlH2^tr=Fvi>TqwQ%$WKk6 z;J-;=djB2-9`67DK7qdnq5(Rvmq;^Z8}%v>O?9Rn0o2;R(Ype8#ZuK9?~cJSu=B8C zoz;&yZz7d807Z3s@%VuM#*6)^9|s~+Yvn#iccF9&r+gsdD+|B|PyjB|J3tqJd8u=n zs2c-OklT9@QP;0{BGGXwco4Eianz(i$p60_ZqR=oZqWb6aD&n4 zeyth{V92jkTk)>Lm0R)b&5rZSIewv+e;yqg+1tbK*yZ(Os5^sEopj>JMmW|+IKZNY z!aEFGah)(j4-D_UAKqGcp90I>g?PE!0?XaFYFO^3L(_qAc)1H3U;AKjQ_=Q5S>Saz zkIz~TMmSt`rs6uRsaj5`cfH)O5y@ej8g@ro!RExcs`z9kB?v}iVF`No4zj1#1|ypu z#SC+*DHyq+66$?0S`+k$E|B30&^2?g7%UVx$f4Y7hdnP)BD^2bx$JEL3jU_!2UyKf zK6PA#hMT|+!zIg^3^)VZeC279NVesXjB*yE0z1qv1BVhJNT&X`B_RhIDACE4~LD)sOcfdgBdXH z3AH)|eL*5>RVW&3t{B#s7Fwh&5#DOGdu_!17aRn+wYG%%7>ZU{BRF@I6gqMD=(Jj% z`DeUxM@EOYFtb9W`)f4w%zFWd*f(2og$HYaf%gWMc@|;$s_zv)D?jhwsM*fjmWAd0dYbZXG*fjq zP~K4io7xkB2A~e=Sp=HRe6Zb^ij724=1tR*n&wDUfY5O&VHomrZBd{0njzC39v0as zLd!?BoPfOG79U5s{ZYWzj7`*`VNmkgMBN^S_DM;9p<~Fl^(VLK=ik|`e?!v#@jj&1V36brpkN*=Zl;hE3oU75{qkSN(k5 z2`lbM+W)%2GtB>X@IBs;ce_YG0|4=t422$aF5T{-?*fjK1~fxOW+>dgo=$0a>k*8g;y z-kALpl(`b#LdLH1GpiI>gty4i4vmT-5iThxkge zXRV-KN1-@$fQlN4W-}CrsM?Vz4eg{nMj?LG_T<7rt4(-E!$eoXD*RKR05|uVKjcZ( zDwhsrx1%fZ#;RWmBv^Cre88Kjcw1|s@|@T)><6F!1g(c5K^cV{qMF&EvJpyOMAxO2 zzUV1FG8YbG_@zF9$2-;V_%0Qn2m9L`hWn8E3|dvCKMU*@ajyG5nff*gIf8&4qtUQP z`b-DRbOW9-0cScOH_aLk_tLKWYF*`7kG%%U`&~DZ0!~f;V|@a1n+^vKf1V828!k3(#3znVMfDy)MU6)FNJbgOpz*WV zDQdpGpDXNGl);6N@YVxZLGMJT!~=ugWf(wXtuiKJw(Z^uTbJ+XG`9n1vmdlUowsbN zKw?o49PDPHk5v<~8==#j)Q1?{vdi)7N3iJu0zUwXFpB^Q{s-oXc@7(SkjgVJHkaj=gX$b*7YVFP$;9QA7~8unk5UPJyvA6<2Y zQ{STgGazyCDi{*RRV0Ukd+f27%wNfiwGEr$XqX4{Ykt1lXBKo`9SfT0c^&Cm<907~_8e z9i~Jd{oBp|4*Cfbk*yx&l1^+bB3l9_LD@tUX^mrejTz<}olBp<`#LSK4fUK&{n3id zsrHGG=ANN!CLxKZtJ*I$(|#!d4k*#vvG8pXs13u0?L}_GLTsa|cMnZMR#vpWsLygh z%HR2!dNm2nABzv=RDq`BJRYCKSh)#@$b)9^cowo*nPvA>{sjB9Ng#Ud1dERRX>**XO( zbDvG`lw0o0!s+;Rm?I80yA4io`39XcrNh~Ub1atL>%Php zOchzaP{r(^zXfsa1Wu3nAkUWfu=}FihQXl$uWR8P!DL(#!2Yo%JXyw(GdYd9*Q>;; zLa1ex`an(wc3{{31XGuuZNbX%rS~x94!!aq!o%2q=rUrISx`e~AW~Ws*Z+*M93QPE2oiqHA$e<0DTD;{emKrW=aTUF;W#{gOxd7a zzx6)O?iQ!6hsWpd7vb7L^J7KZ^XkQR+@qQNC-8V^Aw1r0sZcmLSiK&Yr(?%${I=nU zShfK=|EgJS$Nlz43x51_3Yat%Hxu!}aeqG(*$>+EKzxCBb(Q5_B6i z84-To_K>6=97mbW zLVfzTv5&=H3QBp6Z<#4OwCnHOnE~Ri0(*Z^}R0<;=jcbKyu^++IrtqID+CF@Oa+2(l zKal$&HCMY{`nNyTJ`36N^6Z>Pg^fK5$99eZz+d^4+ibMKWp@%B!l#cGYSbzq5W?r3 zKPLD_x5iXZ4`w3~GiQkdK$Xrx_2%KAbbsQS%@jIY%Fu`4Uv-$u{0>>c z=_jy@L$K?1^cFt8RF(P$&x)NY>Nqeet`@z1oC#Td121ruEhv6e3naLA_CxfOX0#l^ zfv^f5x9}mJUpu%P9uIGVKz7?3aqbSNE z8U1WbpV7~4RG!txYq8N(O)?5JsE;xlFs`itIoQMTIv46|GFpsd)8Z85HT%C>i75B8 zXLqfIHtxl1A;>Ub5)jm{)j-}MUD<-SM-D88M>^TK_E||ToD7iSbFZqfLK&nYYr}li z`N;Tqa2SUtQUR%Gyhvl$di#HO*ZTMLnscd8?zb#7!QZn`{^Q)~^v*S?ZOr5K%AM<2 zXz_9A{EbA`{*OZ}T&we#EB z7F_|L41P-wWYKT!pV-(S-Ar>rAB1W;q9wo71|9$6qc5yYi_r3SN@Bj1X^U;|(GtbmBXU?2C z=WM@&eK)`Lvu@CbLwZlzeD!C2B4%LU6w=qlByO@*$>LIb;oiGZfzy)zf#~gSGr+-4 z;4ZsIoxPU^Xv!Q!Z(%0}PMfgSW%rn4VKbt772pEAd(4HfcM(m=M)Y==N!P1jJ$Bvf z+=u3NgGe`Xq{T`ANHi0^cO&T~|+$>BJFW*av3cN4K#l%}-X;Hn} zBtLZCJ*7Ns0;1vuFy(q!3ZfIfbJ_j%*}bTuUCM4mZ+Dv+^?1gFGUqtseV1LMesbBp z^Xy)L+NT^t^meydQIFr7@G~$!_i0?z>jlu%j)nol_JzPOlQZ_=omJu_n$CS^5ie5@ znVA#fob>_scU9i5635c*S3BWqSzd+o_JtuH9nX$*1FxP^?y~#v*?Y5ffty!^xb90n z>r%Y1{H{6m#=V)k!0*LgoF#9|swTjIV{JO&*-dQzf?4%|7WZ-d87~yfj(Yqg`38v9 zh06xDd3}httWozXibYSj4e;%5eDf^QGBg^bto4LDAf)%}qM{Wm(SfP68{@sN06F)P zA9J_aq;2pcmpvnoZTTZaW9ofDSSm$N09~7KzW~wukZBla6Q9m~LH~XYarRbMCGT_D z-S_0Q_o4!)rtC!Y?7bOLfp=3tc>CUu1~RmnaMWe@fMaWBM)lg9T#V?2HSZysvXO6@ zO@8A^6G`1*P(^mA4a^p0X|Ak-%ErNt?Le0+mT~EP)kN}69a%V|Gw+(Rdqh>&r~?b# z<0kgcA{;!&B#Fv{$-DojXkFoDDk9KE0a0LI&kYN;;E?59DbP+;cmCn5_V4k0u$QyNJ zD>fr!R2u)!WEqtacO$;iLW1}bMv~l4$nU4e?j`f)?~?}O2L@<%-aIxI$J(}$0pNUk zEyOJdR9`Sbg@Qx=-X<%W-%vI>EmkNe#Bj$YoJb*%b`Of!AlmG1?-~H#~`{4iIp_v`n;$q%29inC;U+-q7lPG^*Af7CW#+yau z^+uR9n~j?r-^Rsv>(PX$(yx_}NSxE3fkhXgL{2A1=FPcePL%IN_>^|_a$`I zb-ee%-?gtZLHAsSBP2qxGaIn5TRua zL5SO-oCYxyVJ-FdF`YO1Iy-d;RpbV#;i+397Z4vpy79P$B-o_fbaS>rVhk0&$KMMX z)$m*)k1YUm3wf;I^kl-dzFhEs-(>)LP*66zkp)QC&ScC0T%G^Lru2v`RCp85COgH( zc?f!zKN6A0c#$m)*{xC2!oIv>A-P*e#wWa1Ayj%AHG5KDer*wH7bwW0QQW0#mD5;sOpC}hatXh82742_E`v-szRgPGi$om z(=j*^adT?w6v2I#l7t#UW+7W8CYSIDOGzD9+kQR3=Po5(HP5>Ut8c71Kev?V>CAB);i z-tRJL#p)g&ink@jJO(Bh;z5g;pbvN@nm^)DrgZEN5MJ(2m`cic%q=-&@rd;Q&%4ls zTR(xq#e-8&xY+XvsilJd3I59`q%&E;otjuw4GhGSWT9ko1;rbPbhe^atzRW0MAIU>woXJLM%3zgi~g z&q=;e>h#Mcfoe-`ttq^1E=llPKju{r&;A6y0$%we$MVinD@51p%+k>ze045~9$bKh z+KinA@%_EzgvZf0j|m(Dzwx;Btz+V-x|ebW#QC~SScNTFeox^hgq;YkpT#TB3QHOs zTgHF_q7e7w)4bVo^0sG~{Qw=BAD5uz9j4PTeqcHA(*jHVmZ#3C3Bx$4)+R%=s|yu| z!Or~2a?<5r=0@=J6-2L*g)y=;YnO9pr^s%6`wEiqS7_j;B#x}&BR(a*cn+QVDT$RU zPapk4)8J9j^pBsC!9jApkiN=7o|W>sFNm-Fs^BYpe)#ZTP7^O~TuEA?#?X}ze#r37 zHGGA=pin?P?#!R9B(MByzIXG$KbumY#WatXYe3PoXk zfd4oGh)`CgaM0;$zxBi6yJk5+1*X^zPDJsZ$n2 zE`RRLK`_|Eb7eV&5J7(wvP;n_k+;P$u~OoRTrrK9$jjFdKlh;MYfqe2t;=E6ToBq@=>M1cteg zW4GmZ^2qqG>UVnO4kt^uY!8U=>LFyAt7@!n&eOjn72Pvs(zg$5T8;~AT<^28Y1A*! z__4oRyWzfU6M6^A?_6HEV%vxbggVcJAEEiVd>y=2!dT?MT9V)e-wQ%)8Y-HCE&z}C ziZpU6{4(wfS3dYFGQ8difk=265CTPcnQV4v7)be83}j0~e&Q>l$K%nnuSh?wJb8)sZb$QLE5NFf)vcv76tO3UNuO}ankGJ&OKsplQ z#20;yP43N4eoZ0=<+mJ^(=cnw9;<|>$Jxb)5=SjHx(gR-aM~(CYy!b3gd!78UKZP> z6tT1SFj3KX_Ja6uP_hvE=6nxIzU^m-7V(54G@(Wv^ zsVTxV(Y{yTID*9euq2Is8rFQXO)>7WQ2U?T7dsVNMsZWcOhxl^`S?wtL5n?(`tjsv z#HBvo@r6cUwa1;Nisv1Bx=T3T`R9K_+K`ca-#271G4ha&B%18pGH4?n|JyCnqWIc77=l0M_p zHj@^AA<73flTf#61Al&RGwBvA@4IT*W;qT_VL1)Ee({7D#)lM;LE3I;OumrjBHK?{ zwq4HVN!%!&;m#D0aNlUWZ*6{Vqhd4G;K5r+y+omAw`{C90`SJ>z$nW6gPew=0E8a| zz6HkdnRuQ2N9&gu$I#t1&D8l=&1uc+?h-HD#l35`<2hSMPB&k9b_JrmuouO{TDdsG z1Ql12nSi?7L#rB?tukZw?>wGb`>jl{9E5%0+<=Sl|R&n*gqu~08 zvu!Y>a^?%Sk@oU47|g51I~lx!)Z!1fky?&Gc*F7o3(@I2(!wWN3`4xlrl9wV{F!i% z?Km23rS|@-Qo}q!I=U}37CUEDBpe*Gi%;85y1fi5*-pNwS>*h_j~gB=T|Iy9<;!P( zPg*{=&gR>`C)v8OSmv#-mBZKA<=J-c5oYSiAOYve9(Pqhy>?<0YK zZK)HV^*M3p{eL92`L(@dSqP@S`@&Qk-BBc+AXgsgt>k_0$3sfQCI1_~Zy&DF_HTW7 z#D4P0zxAyvp6F$dReYg44d6HSVX*dU*8ev(j42@v`7B@R&KH-E?;H8zwR2&Gu;D~- z@exRqHPCBGx^St^Wt?yxigSM#NdN&`t5(`QMXK~N$F^~Rq~`)0{Fl~ zq?y2A*{vR*dq}>A96BW5L%hpDj#lwL<<%*<1@+(EO3*@mo`0BV>p*TST)-J59}N@! zHLH8z!~J}T*V0l_*Bu`-)XpsDs};c&nzV|Z8t3xhIf+G z)^*HV0qIgsvTK$RMw+q{apxo>p0leqDIN%B+s=8&1}8jfCGqB`Nr+qVA|&cgUX; z)LbvuF=x_$S4Vrf3&uIA|J~<)eC{z~j2t9)I9KT~RJ5O~beu)cVWX;1MG=KU_;T%W z(#l&_9nybQZrAPc;H!pFzuH1t_0p>GRl{jrZaq#K)U7^La05AD?@dg7gA4I}F(g_mb1y8LlyNVB=2r+j6Uv~n}459DP+C1_d>MH-|+|qk?J=|33Niw2wK~j|K zfj8h#Nfr@Z@P$fMS(lt@zFa8g>_u%j_&zv^o~`0LPLg`=(E!Q)SJ;T9WyH^ImC%Mn z#jAL|GSbvxYY6{20#h~2RE`?A|;9(0Pt{4a^g z2cHtXTt(sE(W8GtyXKDj8;OccyI!UX@D2Y0orrxY{hUO=p`kOsc^a~|&mnU066gz) zcpI8I^LKv5aip0}UHGlj#P45cyYt?^{(Ti4!?{dbKuhP=i)CjH zb$DzA@o}prHvHTmkeSp9ob0k8C%(1vGLWqW~Q1cuy2=?wAiSR^@ z;BUbJ;FQVXw*XU#gKP6S68SfoP4Qju`M>?H4o^Cdb7d2sb)K}>iB0dYD2~K4DJrsy ziYJ^PKAz&Rs6PDG@rUP0%bJ4yDpK1t#(296@p2R-|^k2-! zmNj?CJE~Bn=?*r8Rzl_Mox5`QokZsd-l7U~KRVjxTV-F}Q9P}R=sZRrP`uw8A3yEH zKdT}Q{zY42?ptu52QUixj7LAf#RQX%t9lV1`GE9r@wFwsegF>UUlkbn(6RJGl>VGw zLf`@{vsYJ#Gw~SF;Ssq1xqRRw65@izQgR;>J^#X=2JxatL|xtN3w=NW+^@_>^SHX?YS-*fT8uBz@MllRs?ctrBvX@RfiOn@ z_^xc7dZ#Ufz$f=6=>}|W!goC-fllI)JK*C>bObj%Q*NmLr~PRAaV#D8pY~-^@T~f~ z6MWx{GaI^}-Jh`h2SZ#fM2w$x9g?8a9Bsp=K}HYVZ*kACvF*E@Gg=098G~O&nEz;V zsO%`xcINFMv?s2%!lyUaQChRk@t=0U@4fh`57`^8t(crYb13!TNxg^%Po=bpYmw~p z4cFsQHL#M~DHT$ygOujt-W-Ly^e#R@MVmGO3t(5+f7Sxe@o=iH(MWD~&)$MF6o=wH zMR-%9qAhWjK2^~U;{4WkZ;2}&@2aM)77xE(gQu%$TK#(%T7fJ@gcr>~VJQ3>sFZBU zd{?<*w}o>p`br>nhV9WyVUZjx2i2+Hc~{MZW)W!vci6(svM~XlMxE>`Lp(+Y5g6_*WY0$8WgOP{l!&zZ*>h&$-x*X8NAQv2}8v zaF8YYb2}*>HXxE|=1v3az-(aAYq_A^53t_VT&dBW`Z;$66F;Gpo7`zXzJj8?N_X0@ zI_AYY*8nca8EG}BPaB)Sqn={g94iaYX4QXxf$!VGm9q=E^O4819_we?I8rx9yGcZ_!z-U`;chwqw;#z z=D~gt68+*qTPe6Yt@Y9*yaE4y5|b+!IB`eaDkJ;L0!L*fZ4WPeYfaiYAX+XQ@LW0x z7RtxQL)Z1BJ^p2Z_fQ~6)KDnj;V(RwZ`!o4ocK9U+6e5Pn-_gGKy<87?ihY`0hj0J z=V}0d$BQ;ZxrL&fvRj8Lm+WGj7(|f@@Y`Orow6RiG}Nu8@*cOT)ARSZ#ra2^dA5f7 zJ0eXRE&V2_xQ6&~hUT(0EB2YJ>-YtKsG;lpcR4$^@LmWMF+;2Rq9A&*hooo8hj@`U z)xj6qId2*X=G?OuwJ08BHf@gw06}t;LC9B3 zyHsF6ZQ24BuQhyVli)BkB+PXbUB77YTs1{pkh=lCjqszjX^gFCJyBGMU}b@}A{eR} z;BnYz1yD!!YHgFhr}|Jm1iq=TplQ|xJ4+^3g+A1We8dm>(2lZXT(0Q3K8Ji=YL4Oc zt3#K?6yOMGEo^HJ2gui0o8f(lbKDzXh9(3E37)`8`FTTNZh_cTDL?WCzVvmSaNhQ9(j2X9?mwW2u)hN-J-W97v+g`nmEWz!r{Rkp|NfAA_$ZQ_l}vyn!y3RK&U{$ zuM6I_T=1@KpqMJVK==ZzXv)w0Pc3~<&>ufK6axO|7S>MugdZIeF%3(LpRiE;j5+8b zDa+tEXM6cje;R5NqgD9RT6~Q^o{V#j5G_Zt)yuK80IGlardAX{8)|kb#|zpNQn8cK z{B8h^cy45mW93B$>%3hcZ5k+6N%+iHoRJH2nE*H<7hbpv2~Q8C?O(M?A!X$zS>@G1 zTTF;B<0J?Xb#+M;?pxiYG1j8bWxvx=@H;)KX@%@}TDZFB&Ox+W;2Jb{Uow#XE671S>h)X;QcXBEqXV}TXfZ^HaNQvbC=zbs)RdIs<!MO<%kwKgWkAf(9HE_mNF-m5OT!2&aROYwVV@L-{Ek zn2OarEEEg>^<)~zD{B%p9~Vl4eD8n)l>Gu4}oYDZV}#pn{$r_G(z?$rz7uQ zb>3Dedz2GD)5CicjVKhDhE=>mNIy<^Fk?k7a!X@3;?n=V;s}6io7;Q`< z`1UY5tOZWos72?*!wQ0vZ#nAEWi$*>?@<^q8BLDMXwsF(H=+$`*|&URBigc^q6^s6 zAHQG@?j14#Y-BN2$^(KqPV&>IHkQ?RJfOytX7kJ;JUa3-jcC*Qf~pB2=1xJ&%Yc2m zFc+LgnGWGo3^D?h8K;z?bUjDQNqEV91(n*ufVvlcO|>m)`Pk zls9hq2RL#Ib{VQRJMra>X%D61b2d9rC48x3=kWiuVvh*g)my$QL)$?9T@(@W(Gj$v zqAmAf1bvfx=xIIDn%9n`h5%Xr6+cqqkK#gUp^xn|gghmZhRAp>0nanH=2xQ@UlmE; z(Vq}g_)37s$2hC;;#iFtI1}Pz5BH$wja#n(${$Xa{dRRkeL_h59t5YuX3`Ai4`Kf0I~-f3o<>@3Mpj zsDHNcjPnD*IhRFI_ee5mlZ}IQ6P?txxr2ZsU9r9YO_$?nQ(TmpjXhw zan|@P0xxYQT{17)xEFz-_-RcjWPo7FlnYv```_2lP}yA5tCMT`#goo_W;7k3mtA^k z;L;1DgIk1&!Yu+GXD5#Thb&l>;SexR+)@=yrxMdN=+ndqqpbOtmm*r2BIJsGkTLxn#0ma73Crat8&x)sVvrj%R}{qAi<50=9k z^77Urh|bOx(eKV7dZ-+VOqXr0_33Dnx%R-xvq`3uC~y!VCkhPtkd~Ph&`{fB98ocyh!Yv15>0tWGSXhSH{8PwEoIDHu9EWzo(`^qYDaUvWfCD=RKW#7JI`yaEDzg@LfmRQbNGasD{vkolhG~qpX!ZCro1;YGr>_?(u~)jV_!^!o|8g0$-e4^&?0n@t^S#&-Cm-A7GyyV~WqaD}D^7KB7lhPZm|?)D z0Tk`8@Xxx?IMe^wS;0p9JA?Y~%DF$Ett}~CX@RrJ8K#;s$$MaHTD}y~s^r6nUiO96 zW?{LdObY%dj)XB|1Vs(;p#gY{M zj_3+uYku;(n!H7C`c^{uIiU5X<}kP)o_i6|EwI7d`BA_nM7Ieu{O^UOefg7jHF2rO zYy=_`2D8(XVPI=2zl3O;ly4Eeyc9;S_fvN8tG%h-6TGpX#wgwdU73%XhxDO-brd;? zcv6ymS)}a3ekg)(9~x6j=HC{KgNtV6Q6uhq&ihbZ3&XTM6^6Qa9bL3`Wy9`c-PGb| zdc|+ht&wFea$Uj=g^W=+-*mEO$I{nmkYF@gdOw4rxd>r^wwgD6jTYz~caQwTFklOf zXF;6r!&ZmoLLG2865Hx?@ZN$VT*5fvEClS#_2*J3+pCgIH->xmqusp0vWxOzparr3BY=P3 zk2c~9eucbtQ9tVc_XS>ss3tWA!ZqQ>XAZ>27f*sy6u+jM2__qdRK5PRDOte#_NNnK z{!(;}e9%J$cBEjkKt=7J*{<`7XlN|2>QCznJ+hzyw2gRh7(gQ;QCasI^)#}2jPlGV z#1;XLQifg5b2jPdxnmM98bVAIxaAcRnxc=ABnzJ51( z>V%}qVd^llJyNeCg)%wup9az(=szYrc2IA*H;^`p14q@#`Oi~O_=@@PTjh5?A9iyl z_FonKU|`bOJ(|3XICxnSQgopt6fMrj=Q=GT2GMAL0h15j0K49gqS3V3jc*u4!(Wt% zL_Eh7AT2N@)%PudDb7OtN@YyJFO{C%A65Mb(0(ut5`y>vLJ&U^N2aM7*W?}5zMgV3 zdNG_;U$x6ONz`0J)ZBGwAaD?>_;_9@%or*^FSO95t`fFj<@p{(Nu70&=Xa^4DT<6M zZPOxhN?cteHQp#+bo_^wsK#4V^U?4!CnpsRoyCI_X$!HwFXGkGYRrVr%q`sMgej{H z%Vs9hfsiE}O{69S{a%*?duj-s{(?iG<3nhy_n_+9fH9$dqjvGop|rD2B84}M`T+^e zZhPB*_gwxZRIwJy0|b7UQp=AHr6XL!%& z-8`0wo^Ksl4%aUbIv)|170PaNhETAZ9qR-is@!{d;z-)pZMDr0+iJdXByHg=*usK3 zJmn0j$32Wx%cpdN058@^b_FFUEJiw&m*3Ooo&xiwCTTBcYFTxC|dtNZlKXt%IrcG;16JvuewHlkJ%^UP#&2OHUSxHMql1@_yIY}4%U^!hibfejD zBNL$QL44|)KyqJx_f6UnLF=*f4FsQzrGrD2DYswR#72?ny-+n(-&XC`_;K&IXfw#d z#R_2rgvY-{p`I<)7OSv|XTC*SK$Aox|H`Eh!|&wz!>G@eU*4kKRXVvGR?Q)-o|si{ z_^sn{?@-@_vTwZKr%=Dw?%Y<|yk6=+*lyO>GaIbqcl+(x9ltAT-a=$&HPExyY20oz zD50Q+W6?EPS6kpV9VtPCO}S|nDVb0`8ehOppn-XUwu}CN2Sv4^)iz*u>$Fy%dWwE*nap` zHnLd5m!;BhA45`Yox%CrR}5YfRQ_y!(8^M2ES{RMW0fBP6a>KGsV#svn@F2uYN1FK zfdHygQ1qKfYXoT(JyxMo1|~reWf^TCVZl$DD(@&)CelDC;{SbS)9;c* z!Mt6P5juPNV#$CYPYLw9B}pl}8y%H&+7SI7sY01FLtx$>IoDJctp7o-bDT%s4{|wU zBmG_p%}IF(Jo{4CwvoX@3ftdsT%+zaOKXNNbe0AKH_Wv8Z8wpf*_lqr^l{e?(86SweRMYosrcm`T7&B%ND-v6feA z>VIPW^=SKAiwYl@fU;r_DGEV}M~o9nT3e|Y@sM0QIE`;v;S(-N^bk9bEH$#)shB6$ zu%$ItC3q@p2NkP<1#e?Ds2E&Fl2+DSYbP0|Yh~@C>SGooJYte`E`4c5Ory#=uD+E+ zwiSmTm2?!7RWlC}Cv`=lM)J)GiSm_dCN$C?Q)b^c?-=VJg}IGZJ#=ZRdg|idTEbX0 z^;Bu9@YWSREhNcu-rTRIq(#?0WbPXKz>Y^fRJ zgpOKAqi;Zj{S8YSE@-6xh4r_hr98KXF6-Q$x{Qym@IkGa!{~6!yO!1XM2vO(^G~de z^yN|!u(_h4sNqUbo|3GzCH1FSf1^c8@So&1+ikSUG+tHVbjQWr?Vgj)Exb*Ik5!V~ z$6KD7-=@#VFw0T&S_Q0VW1Xhza}KLqR8xNjJ(48tB)4l$V^wSMNmHHV?lO%2%4U=4 zmOpDseXs}TPNpUJ{wF*;pJ5NHVLt*^BEzVsT+TFivIRhTKnA*dN?26q_speas=1bu zm|;FbrkVXcrFxR2Mvl3j5(V5G?kTmZF5kjaT))%LN%`$Or5N-9+x0vvH+S-sdLflH z*>X-QC;9Q70zE9}SU(XlNhmYK4jL^-02%KoVNuc(%%{wg#$y~}=viWVx40?*4f!R!F z%QN<>1)6d9&2N%t(h2FN^rrb9dmxP?6G$iX(dQrMfB3tURW7Bx__67Qui5V}e0|DO z(gD}1*hQ(o`MjKPejxqE`kSwLN~w*VqO2r>C?I@I}>dc3rwA zU6k@4dP*ZSUBx0~-A764WlNgq2lu6G%-u^0Lrd4B-=u-&T5`hq8oS5_n*F^50Z>=6 z-&j34ntn^V#KOI#u~>i>UP2w6wUYySn|1P%u=ldXe9tgHle(MZy`)$f6D%h4baOv1 zNv}e3$z;oEHp4QE?s(5c-m}awPba6?5HHDHrFm0YHkoE;-;sV{Pt0BEU8#qqGkqo* z%;U|Yy`)-L{TY_=O8>;jpRh?@(mY98^hkOp6`7082c)&p0OhHZnBHKZO%q7Fx-b2!6GI42pF?WZaVWJ zn?a74SIY^Y+EnveFM*Kh7=U@B9Xidt%}eYRdXg1;Nez&F0^KZ8=I)X7gdO#g{4r^# ziJ&~TWW9FwO zAnGZWWX=oskv_w8&3h)DvXy+w9l)S@-Te^Y<^{Y;gpxuxj;v=O-bp=*h<_-s$>SCE`?oQt|$D2p{n5uI|h#b8B zziN4x#GA+a2m+94AlKOyHpxfwjFJrbJ~=*luaXK$C8hTyJWVbonM`~9j z)v7tK=KOhHGc7aeEXyL~qEld8elRbqj_)KJ$4c zvfq5oM~XB`t{G}|n&nTd4|02(%ny~x0v)b0cQIdLuaY&ijy#_NM7om8(yQh*?sa0E zym5-=R`j=aagyrjq%P_`_0^vmSF)AXmDX-fl3<_)Si3tha3I!rCFtdZxnkCV);@BC z4YVeRf|9kLl0U%7#8i?rYPv4hI><@FF>apD-m@k;fmL8^iFJq^F)pzVvqwhQvy4tm z;RP$&T1PuE@OsiK)-g_!lSW!SX3QYAz&h561$C({U07bEHW?NghZq-G$I0EOm~9>J z#Qebqo?mX#T^(vov?eM2Gg(uV`d3&}otReU>)0UOVCy6&$$x+-ZyjnFY#n5s;v{*x zN}~rGW)!U~de=J5Nvf$qOBH(t6}?-rvSOGu&55-^1HUaV8mJp+jFpC22NboJZn%Fn z!%1p|dQoU)R=}?F6>d8}r@5S5O5y+T2c#uui^GAofeVub5!gPYH%7foZf7 zj`x*!dnfZGB@$5dG5@wGOv}wqdzKM-&aW z-V>c*t43I-7>8S{1YQ7+(hucI%p5LYO|Rdzdy%zlT^QNtb||gosG`ALO;q`$0+Vm4iGb(C;JYiIk@V`u$33 zKhc5zlJq}{4|S=5c}j!@>PuuuT3}uYDUu{ZY9KBfKZyzrS%~KSBtz2#^ne^?0(wAc z_@L78LAeb*Opqlse25s)1oPD&R?>&%2BaXpsgwv@$WsFS5hbMr`lCcgBtu!Cp>CcW z)pf6{KL+|Q>ADBy9TV*!qCZXyPJMChX~cq}g3^5V2jv|H`cui(>J&d!0;ea9pDJBJ zkUdqxx6<0F(l`Vqa-K=LrX<~`$(i9w5I;>EEzQldnd%QYo3)5YD8Cb@Q6B54k}%?p1XjZYK(c1>^_ zpC*6$*eP3y%yn6tCdD8t$E5_t(LOh1QLPE}OXJ@aeRj=q$$nS9qppKsN|cjo43g^dd*y{M6R1lf@7S(v5@x+?^!pw^a&Nq{JXio z=zXzE_ItQ?8Kf-Vx|QbFE!Tntagsu38uG2%UBpGl;2NTh%)2EP8&Q2jeWkg-5u53R z%NV!tnezD3?~>OowL-+T&cxVE>t5^+U_@aZ{h#Lkm=M>EE^B8>u5n9Y2Fqhcm-A*B7Eeqk`Sp6f}0D7AWk#O1@oi^QmrWLz~H=B zX%VjM3BmgAvfF{>f-WexScEP{f%wr~qyESAo-m0SE`c`J`!ET3zZK9=(hVw{9vX|c7P z8;h0L`RNslDi-UON<*x%ZVav~&n=dgSUb4&8HMKc36}naIIpE}(-L{L);Yy55tyL) z%x#_1_$87yZixhJ$#d%Ew!taeA>9Y*wM(QN6kX@k$*ly%(4QSH*ObTsH}{X_o!ZYW z{A0-i?9(QckK;y;!QC>QH8{$p9ppx$G-WFFlxCc{KrrE|`MtwY?H8vMh@Y>IW5 z87sG-cT05(&ylHAx?6lsg^$2z|F9S*Y-4MdTOX{x&NVD=w55L$ zdTVhjK@m(mYlk90SF33ORsl|Z zI#nGDy=}-?#l|l$>W~nskJ1cqb&pin$+R@%kLS@alE~}NhiLsn{`!2{$;9S5NfR;3 z{h&xKJT>*w4Z8w)ux>p3F*VMb$-m~_vx^hsU;Z$@`ojU{8PrD;$dl<4`d`>8kW=b zaK?})!wT=7${1ESylmj^op#2YzZbj+NQJ*Mz}eCEuGgK`f-KY%DI_y$=Pvb+RAyE z^T_+}RB0;C*=4U zo@Fj0>8XW&8n-#iNpWhKUun%bpOWPht4w}U;2bNtKT+$SA3kR_xil%ppEaBF8M!w( z(LW)6&Kj~{YMOu4&^dWz&a@o=grqrZ$)jn7{*~{}Sx0tHFY`CdnzMmioL=Q$F?&uv zS(v5`Fnl;?BRQ286Hv5#&L(pE-NXRnmvaip_8Dmby07OHlDzkF0!k0g*+!PnE(|cS z>vOh~W3$TwDyrt}AjeHr0i`vxxV5e^6K!Cn9>ka&u#lL*1u>2WWBU(KUtMQasqWpT2?}iWRk)_DMiZ;kXxCgEU;pNmK`F$&LLHSMIUNeDLIiv zv_Zx%wd^SQI-A6pf-2T&*>UoFHc1SMD%7$Q6Dh8A|Edz zg+bOdKX#gY&q-O3Wb%W|t>6<<6=W>*V-@6PF3|=X5Bjn5WbO(Q6RbP!$1W1frzA00 zcf*feA_Xf+TCnl4AG<u~r9SXy7W(DuLufc z^QfhmROzja1K9$)v6yHZmo^P#i|FCqB&Kmx_dvFUZrMW;8|U{4WJ~GFA4po`)Zu|F zhnnW^B{_`^69U;X`pZ62*jP6&kS(V>ek5g$tzQPRPwB}LQq{P!Fpyd4?>`Z3c>aMv zwwiu?ki>**t^~5r=+Z+ZF}(CzAX`KC93pAqMZX8KJbLF4$q8Rj70A}oPY;vA@cc)C zY#l8-Ov=KoPXpNo`uH%Z3a>D^2C;lB8Y9Lg(pZ^L}hjm+d;EWk*WyemqDzE z7M>#7NaOk-R!pD5-ALqutwC%L-B3;vBlGtMvAuM$=`=};%r6OI`{~}(Bqy@+P!KDj zPfwG=$kMVPc7U$RrCQ$*VV0MQ7 zc#c#xNev2S6*T`m(KfA!31;W%nF}PQX=!{gyGS2jB#BKEh6l4t^z3gWt!e&FTpr}RQbP?vY3R^!EB!D)bFG!#&{-} zEl~aWJJGhSI2+6ssj_au|5NGJV75fH@g_-Zn|dRdEmi$`lccrP+zMtnsyVkvPTSH4 z!EBjo(=AfiHve%jTdq2BiuXiZBiY7OcL7{9SUIuD)xk= zwKx0{!U|R2JRv#lQ%{F5(>7K46H?f|@=OTZu6podxe)U#66Zx&n@Ux{j`XGc|+-={IJq;}M^!CX3tvfiThC6b)@9PNR}zx-?2PJW zCaroUHBHYdRIBDtZHK6tdUjs*+Z-Cx!D!O6i>mZ2n%Kecfu3Dboz0?Y9g05DvnwXm z_aD%l4izi(?3(J?2ehz*=1V=hp~}yuWgQlLt!Fn?>*vy{4u%7IR;fBYmufp!9M-cx zRaqa=n2!0s=-D0BhL31sN6l$HyQez#5l!o8Jfmk-s*mQ;oR0Z7^z5N3XFe_LXn3M$ zk5y|H(6WxDH5#+0s;ULFs-wxMZOoW@^+Kxco)FlWS=40h>I4$dLnBADoQ(JOqRrduS zG-eCbKju(vkJNdM*&_AR92(Q3Vp(IhL|yy|P3)1nvN2n#HmzGm(|S}CHfA~MeamT1 zkJLkr*)sJ%R?xy8QD+*nAmB#E-^_`Wpst5B3XIAy%)l?g=NeO4G)sNTE znE0p};p{W@tuJU|eEx^wY>m1ykEX>NbHZ7kdij?$Cti~q&ep2`{E`;NOJ9bwb?WtN zX<5A0^i??9p#Ehot%^5n2xs|f_7&CkG;9rL8`Z16qA@)awuiG#>UryEV$X__a8{r` zw2r3rtT+_T3f1%0)102h@^H3IUA&$a_RRk^oNZTEt*2!@6Rw7{9qNr6XjRY38{w=- z{o4kr?UnjCoE57teNAI}>7IqNJ?eB*K27YEUn7F;RsWe!(|VN#M6mtpvW+ySm$7LC zD^cIuNDF&K#YC_J>iOT&vRvGu8H%MnW7DLkLqI%JHG_gCy&C67KAJjlqAoa)`T={3pW2s8)x2y7+r$E2#Y%*GQy=lt=v8^F>^g7k^PGGZbMw z(nAnF!=I1>eaMq@X+A>i+FMCd79TFMeZQ5Y`2aV-&2gSX z_UHT~WczpABuVQ4?uonGR}R_NH}M_IsjvUh%@C(z8c$<-R0!pfqxKU8{3i1KE^onf z1AYr4D6KsoGb8b!6==QfHc9G;R7d#a6Z3ALxHR5dWMBABl6nAq8Ozz-Av==K64_I? zOHyxur+Z;N?b&F&n6DSvwZE67z5v(ONJ4f~-M2CPSCRc4vc;lrMfPBa?ApBMrx^Lv z9Y7#}Cwfbgz!m$*PVL|wKE=okJ0-s;L*@FpvfJ$9FZ zFoS#?5C-K|@!=x-II;yE6(hT?!`GhtBaz*uSdv}=I0{mmSchyg{~p=?-y&OlwF22O z4%s(~`OTG>m(bnHXKs))2&}e`Y&Z|HqW1a77N1W=w&Umfd2f;Z6xm`#=aJpg;cK}3 zK(=Z89!Y8jaId-Bpa~yLM248^&d6|_>TdxTBT5Gx#i}d10=Sr&Lckq2 zY3m=A@@hzj9LtXfT+C1m;Epq71>Dpf8Og|a)v*EF2b*5{Ah<*s@m0VbM?4(xq4>U0 zkOQ$s4+;VA3Ah>Xc!&B`KPgM_6K=lpp0!U=G%^xV@CiN`?C`-nz{S)J2zHn{G_Vu! zNWjwpk8mh|9dNPXz6Lzj4#%$7A5f6=I^bg9&z_l-V`U;TIs?!$L|F=Zhc?;ZQyt-` z=sw_LinjpnxTzuzD!T%bY^ke5!xI4)NZm~5fYhjGrwJJdrJ2ZZM3!5Ci;BMjTu?Q8 zhw2?t%KZv>QwMloz(u-7s3bLUfSUjp^~3<~SkFelEr6TGBg1U}06l4SSeb$AfXCV4 z80s{@#eR>h=P)wBw*%e*@QHwnDYtj@A>d-_Hvrz=0Uli{Nwbl@3ivFs|K$(R@Frv= zA!BTP5DkY9bVrmC909y~1SsF%23Iw3fTKg1fFoOK4R|w$dI|s+Gc*S9>KTeMNzz4R zi2c0~8P)q6H3S}&q{e{n2V8Hj2=J~pc;!p*6u<@D&^A=+vk&YGz{3Gg09@2(haUmF zJ=&MvMMgV^43A?9R(}h4HCChH7{EKC+!?^dl-nzs4tNWs1H&9nK9v6wa513XfQ$Vv zm&XiM*x>I2ZgR}1dtCWotK$c#s1M*hP{A$0m2IQ!8V>kqz}qy!d%e8@lz#yDc%*Xx zf7=26#?J}^Kro$S6u3#|>h>c;P^LGL(aPb2CxDB!`ULPuI~)bVPblyoUV;y{!T)#( zo(_0-d>@4QcO-NNPGJ5;#+a8fd`>D;{1xDiSl!PCzw#1%feqde3+-6`5a41Lj0W6s z7r2)xxzq|xb2VAUq9Uz2b1I0FYzn9?BFG~6OFTp$5;0J7QlN~8$ zBI8Xo;D&j&t<5vB7Uyj6ez5HmvyNdJw zH)Mzk?HOOl8Q80!9**!EfcHkZWWakllyCd10^j-)JQMJDP|gWEV!T87KWy*`0xtHy zz2RYJlm>r6hU3VrHh5t37vUEH?}YD10`5qv!_F#j>r3!)fE!W%9N;5u?V7}5?YCtZ zKt=2s0Ek7lo6Z)+;L=U0T<;0&^gBr-2%KX;3EM~aA?4A9>0l(^w)q7bbv1fdj4+otc_MEqP_Gwq-oBXV~CnfQtq?wt2CEdcP@@EDLZkgZ2jAw!sg*1kbm@ePUiLZ@P~R zK>>##!;v(0yrfLoD!>OgG_VA4F%x$IcbtiffTsZ7r7d=dL-~G}m2LM8;9?;5j;;V4 z- z&If>trM7qIeZbrH0N}_=83&M&0=Qqt7uT}g@3;j4o(Xsg|7HWNZMq|(4s~j8Dm!+x z;l-`~I^eIP+-krR5!(B(5%A7PKLp%yRqxv1vDp5O@R(al`PmBG#y(>3@7XenUix4M z;IE+pidyk0!;&a0MZ1zNYK9j*VUQ8NmX2XxR*gez=c&-QCWq78MDn#C@8WS6l}$~ph6-bMUWi@4dM%dh>Au8HxdaC1r-sOC+ahCV*n9QlJDHA zx>L9K{hXfq{-;h=om+LP?wxMiUYaJy^{H+Myxie;!&8*E!ZYjuVTH{`_zJ=0N8pm3 zFJ@T}cI@*`XgNd9 z$KHl_a2oi#;U_(Q8cw>4wPdl7SHliAv?d{zIJ`St7WM=<7d5nh04{!>g}Z+C!U=39b{xTtY_n53*woE$|WWf5L}bKaxXh{G#VlONQk}Vl-T)#7y|LwgUElHvDam zCx6xV#SID5y^j6;@Vh8K0hiTiBN{tP{EGl}X|>P_Os*n?d6WmjAF`Z=cfxsz9e~R! zvW|W-yeb#eKwe+5>M7KLF2m8a@LbLpd=t zns-L=G<-IEEL<){5IOvOm_f(~97f2qLYn9EJVw8ra;@uQ!8^)qg$#Tud@fvc%a6im zP(B8q?(myw0&)+v}@lJ z-je#o@D`4riSRa*e*>pum7Cx~BRr~waB^)oe5=Qg82+)xYo4nc$YQO@$b$$m;(Wu~ zML3&K8G`h52!h+w`wgGv@r{PB^!Pq_C;aS!7dZ`Auc{~AFL22(wnJCJ`_q1`=!R$l zSu6tlK97HD_#Tg6QBB*|9~t#C!|*X4-(mPhc*f0K)z9O7eKdRmp_o_O)BbQ-1?f@F zDv(KJ_)L%QGyDaQ*Qu`koUY`06C7rQE~BFjEHnIWj~|9}R*LO_mpC15T0?Vr|E$Z) z3@`Ec>Kc61Rvg{q37=DePR4e?2}T%+t~KMq`J+);^xkMOTvGJyaFShU{}o(O-U(mg z@Hywlg9s1Llt-V3y^N5L;SzY54@eXhroulw``iokC96i(2`?G;x5H(!^@Vrg)#i!k z;N2+y4la7e3g05gKK&X(U#CLeh1yZIu~A1;;S4I)3r>*22KK>wP+kY`ZaH(M_C@i) z?-4j>ARD1fY@`v|-WU;L>kOaj@qZisqQ_IUbOUm3bQ*}=1uvn&KJYL?bZC3PGu#n) z!WmQH4Uc!OtsP~Ji#oc?@SYyuZune}pE3M3;k0i<5$jw>UmN)pr(7Gm{AL;6)#KX? zztiI<4BzJQRNZ)R%0CXDWBdotP&OOk_VJa1Z1f%K#e)OL_i&lrwnK9bFPRYK2jKXQ zErc_;(7tnhJy%Y`!?}Y0W%c8k!12(D(Pi^3708yc^>EUA=%^QeH0IC~I}7I&74k)f z_rE#HKR0}-$2;&x=mP40DbKKEx!IB3gwUCCqg$dkK5O7&HxwQ&OGfa4;SYPfW<$Lf zyb5>sflK@JVnv zvi%6Z%Hhw$2U0GY8NH29wulFhz3zuIf5S*jg-eRg97ABE3q$t-g6!MF?r@G!^zh=A z@!;N0!8J95Z>gv)+j$`7QFPj07gIzNKbr;vXGf1L8ryNUl| zN4PsX9+UDn2#XwEtGy20YIoCtMDjHbQIQ61l9o(a0T!OC*coogDj%b2HDfF6_>m z#~>X0OrhrQc)UlEaAxj;hocp$bkY?DKN96{8(!J9UQ(C-h=W-aGAtn z&;M!zfFPNx(I29jt68z0MCEXI5{-u6i2ZW-SmQ|i?0`#tI13lucBpwtJV;n$9^)-C zmXkjoDdGGt8SO0uH=`Y+g7EeW9ZmxyyKDZq$9KUc62HL1NYKCucnY3PHWNMQ5WIDd zc(9$9Eh7E}j!`%`ckY4&0#5;QQXr{=%+_^WVP_ebHu^3KpD zIihsAG9J9$WHO0aMs9oh6nr}61Mq1MZ_q0qJPq%=#CaM{geJfTW48o;wY7)80G9!M z3D38jb~8U9NTO(@qSv@xZ#^f5!FxFsroykGyc{kK*^cgl%Yo!ucwdLt=%W)?da0AR z=um$+k;}xUBDj<2IRxq9et4ea=!oIfIOw^&VP9?E&Eta&pXTug-~;gcG`zp8|6m04 z=v`Ccm|Fo}^(q~@*2|pG!HeP2ky1F33?nh!@P!_K#_%^?F6aMGjBwf&;I;edO{M)4 z&Za`c1K|ZUI3Dg^%iqD}Qm%lz%k?$5%$cGz~cxU)K@J^2XS>xxN)lok^Ggrrhr&awB#G&o!!-oICbDr(cz%B6p*iVGZ4U6^vJX|`y1wKO7zZEXLPCs(3@uc&}6-SfcrBoOXAMH5$ zJ6y`I!$)eyaEnmy&L8dlR7!$(AThChoTNXA--(8oHW!WV`g^myB$+P>NPsQonf z80wFQmpgv;!|PCf3trpss`&qZcw^d+eT2}+3hg+(ULTKLK=}mxe23SDXH!mYsQgol zI4XfRgm-{9aO`h@OJw@OWzI;X#r}DC5#@F8OrazEfFR{V2$EoIg;v9KrmOXIWu_BH zqYUru@yFoO@jKx)tse%q3NGab;WaeR1U-5dK}Ng?AsjIcY=_r@uYtRv+Y9dv-wN-g z9R+^s4%Zp*6ugVWuZ2s4dC%}JW6SAK>2S{f5{eQ8HxkM?`Yqgbv>)CL`>k-B(IgVJ zM(D^Lg}agK2bcP-|5SNHBK8l!rT&c>1h;`*2z?M%!DWQ@5}bE~Zs1F}+dvPv%$>#? zIX7B+Mm8E=mvTN_A{h9APlflT+z&48WNZU3AxMLdA-Expjnw(zeYnhSYd;pAqFnH7 z<t-2tTKiXJUI0iUF$-B(%1H8l&{c4#UHd5vo>jnIk9R z?&QjYH-=|zims+>jQu5W*S-wiMfU%82%VjVpFk+5JRV-=@H0V$SnN&DzF@Srk3Sc+ zSMVFDUk)GZ_&E)4L3t;GSN9_`61 zO4Y6V`CQlrqfhqq&82Fk=-Z7x$J5^^RsR%yuhHjw`oU6lR`f57zQWVLD^=|e@F}E| zM&IP=aW(n?qpMz~1OJLA*H!aHzQo9TJh_c}MdXx`4|{S~^_|FljQpJ^U!$75k37=I zzk2dGHBjW+j9fDwy)LuV9FgxcauZLUuQnk!R7TGBQ>ReHu_{wKU$_%qBl5W^f{hhMeX^3(OpokugiQ- zZlHb@`Enz#@Z@Zj{ULIJkvDmAcQqQhp)&G$iD=)~l&b|FN^FeY(9{1~uKp(at46=V z(|4Dv??r#l=$$Xn0uR@HK~o}aJ2Jji#lq|~nm z`8fK_>0`!D8rR-B%`s)`+&C>PG~6^+)KNPtG9xL{olF%OKSkC~52|C1<{fkOYdS{{ zI-N5@_bQ#E8%pPBhiOwGoufOF&e0CjIkqDvD*4(`Zocu8t2>s?O{slNvr;POP@+vW z<2yG`U3-YHs(Ec*@~Ulz4keD)QKc)Bd8+f##8v8?3cic`@X{3WXrl6e;z!e;_==CmkMj+PhfgHB zs~zi-^|np?DX}uHdj6c~tCl{6uOo@%g=)w8?851rOsW=@V2i`W`{wlrJh@zJbxRJsumBU)KJ~BHrY}_ zm69l3s#>f|HdiZ#ChJI)YN;32;>L!mky^cuZV;+^>aumo3EPO$_8>s5)n`vpnJ6_= z5B-@cHcGA3r1i;h5}*!h-l;@O)n)^BM5&EB@>H^kL@8U{u_5`ogesMY#A(da$#L6= z(*=zsL~|uNm#cnnB>SrT-6lke5Y^h&`OV~$w`WoV%JhOr6_f>QIxH8N-&oh-Zw29R zh2d}c<~P=N_**5jHCW|VO^0^r{PV0E*7}6Ptla9k){51>tT3w;tNn$-tY+bAw{l_5 zfHJ${Ll!nsNcZfzw`x(x@V9W#MRpjh|4+ (r:&'a Result) -> bool { } } +/* Make a Result whose other branch is uninhabited */ +pub fn mk_result_infallible (x:u64) -> Result { + Err(x) +} + /* Extract a value from a Result whose other branch is uninhabited */ pub fn extract_from_result_infallible <'a> (r:&'a Result) -> u64 { match r { From 2a2f016f250e122f8928023956c4f4824a4b9c79 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Thu, 21 Apr 2022 07:08:30 -0700 Subject: [PATCH 07/13] added support for the Rust niche optimization that converts a sum type where one branch is uninhabited to just the other type, without the tag --- heapster-saw/examples/rust_data.saw | 32 +++++++++++++++---- .../src/Verifier/SAW/Heapster/RustTypes.hs | 26 +++++++++++++-- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/heapster-saw/examples/rust_data.saw b/heapster-saw/examples/rust_data.saw index e6d5b04a2b..6464aceefa 100644 --- a/heapster-saw/examples/rust_data.saw +++ b/heapster-saw/examples/rust_data.saw @@ -27,6 +27,9 @@ heapster_define_llvmshape env "Box" 64 "T:llvmshape 64" "ptrsh(T)"; // Result type heapster_define_rust_type env "pub enum Result { Ok (X), Err (Y) }"; +// Infallable type +heapster_define_llvmshape env "Infallible" 64 "" "falsesh"; + // Sum type heapster_define_rust_type env "pub enum Sum { Left (X), Right (Y) }"; @@ -252,7 +255,7 @@ heapster_assume_fun env "llvm.memcpy.p0i8.p0i8.i64" // Box>::clone box_list20_u64_clone_sym <- heapster_find_symbol_with_type env - "alloc..boxed..Box$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone" + "alloc..boxed..Box$LT$T$C$A$GT$$u20$as$u20$core..clone..Clone$GT$5clone" "%\"List20\"*(%\"List20\"**)"; heapster_assume_fun_rename_prim env box_list20_u64_clone_sym "box_list20_u64_clone" "<'a> fn(x:&'a Box>) -> Box>"; @@ -328,7 +331,7 @@ heapster_assume_fun_rename_prim env panicking_panic_sym "panicking_panic" hashmap_u64_u64_insert_sym <- heapster_find_symbol_with_type env "std11collections4hash3map24HashMap$LT$K$C$V$C$S$GT$6insert" "{ i64,\ -\ i64 }(%\"std::collections::hash::map::HashMap\"*,\ +\ i64 }(%\"std::collections::hash::map::HashMap\"*,\ \ i64, i64)"; heapster_assume_fun_rename_prim env hashmap_u64_u64_insert_sym "hashmap_u64_u64_insert" "<'a> fn (&'a mut HashMap,u64,u64) -> Option"; @@ -346,7 +349,7 @@ heapster_assume_fun_rename_prim env hashmap_u64_u64_insert_sym "hashmap_u64_u64_ hashmap_String_List64_insert_sym <- heapster_find_symbol_with_type env "std11collections4hash3map24HashMap$LT$K$C$V$C$S$GT$6insert" "void(%\"core::option::Option\"*,\ -\ %\"std::collections::hash::map::HashMap\"*,\ +\ %\"std::collections::hash::map::HashMap\"*,\ \ %\"alloc::string::String\"*, %List64*)"; // FIXME: assume hashmap_String_List64_insert_sym @@ -444,14 +447,18 @@ heapster_assume_fun_rename_prim env Formatter__write_fmt_sym "Formatter__write_f "<'a> fn (&'a mut fmt::Formatter, fmt::Arguments) -> fmt::Result"; // std::panicking::begin_panic -begin_panic_sym <- heapster_find_symbol env "3std9panicking11begin_panic17"; -heapster_assume_fun_rename_prim env begin_panic_sym "begin_panic" "<'a, 'b> fn(&'a str, &'b panic::Location) -> !"; +// FIXME: add this back in when we add get_out back +//begin_panic_sym <- heapster_find_symbol env "3std9panicking11begin_panic17"; +//heapster_assume_fun_rename_prim env begin_panic_sym "begin_panic" "<'a, 'b> fn(&'a str, &'b panic::Location) -> !"; + /*** *** Type-Checked Functions ***/ -get_out_sym <- heapster_find_symbol env "7get_out"; -heapster_typecheck_fun_rename env get_out_sym "get_out" "<> fn() -> !"; + +// FIXME: SAW cannot currently handle get_out in the binary +//get_out_sym <- heapster_find_symbol env "7get_out"; +//heapster_typecheck_fun_rename env get_out_sym "get_out" "<> fn() -> !"; // bool_and bool_and_sym <- heapster_find_symbol env "8bool_and"; @@ -496,6 +503,17 @@ heapster_typecheck_fun_rename env test_result_sym "test_result" //heapster_typecheck_fun_rename env test_result_sym "test_result" // "().arg0:memblock(R,0,16,Result),fieldsh(int64<>)>) -o ret:int1<>"; +// mk_result_infallible +mk_result_infallible_sym <- heapster_find_symbol env "20mk_result_infallible"; +heapster_typecheck_fun_rename env mk_result_infallible_sym "mk_result_infallible" + "<> fn (x:u64) -> Result"; + +// extract_from_result_infallible +extract_from_result_infallible_sym <- heapster_find_symbol env "30extract_from_result_infallible"; +heapster_typecheck_fun_rename env extract_from_result_infallible_sym "extract_from_result_infallible" + "<'a> fn (r:&'a Result) -> u64"; + + // test_sum_impl test_sum_impl_sym <- heapster_find_symbol env "13test_sum_impl"; heapster_typecheck_fun_rename env test_sum_impl_sym "test_sum_impl" diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index 2f0f477a94..8c2892529b 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -380,6 +380,19 @@ matchMbOptionLikeShape :: Mb ctx (PermExpr (LLVMShapeType w)) -> matchMbOptionLikeShape = mbMaybe . mbMapCl $(mkClosed [| matchOptionLikeShape |]) +-- | Test if a shape is a sum type where one branch is empty, i.e., a tagged +-- union shape with two tags, one of which has the false shape as contents. If +-- so, return the non-false shape @sh@. +matchSumFalseShape :: PermExpr (LLVMShapeType w) -> + Maybe (PermExpr (LLVMShapeType w)) +matchSumFalseShape top_sh = case asTaggedUnionShape $ simplifyShape top_sh of + Just (SomeTaggedUnionShape (taggedUnionDisjsNoTags -> [sh1, sh2])) + | PExpr_FalseShape <- simplifyShape sh1 -> Just sh2 + Just (SomeTaggedUnionShape (taggedUnionDisjsNoTags -> [sh1, sh2])) + | PExpr_FalseShape <- simplifyShape sh2 -> Just sh1 + _ -> Nothing + + -- | Build a `ShapeFun` from a `SomeNamedShape` namedShapeShapeFun :: (1 <= w, KnownNat w) => RustName -> NatRepr w -> SomeNamedShape -> RustConvM (ShapeFun w) @@ -410,8 +423,17 @@ namedShapeShapeFun nm w (SomeNamedShape nmsh) namedShapeShapeFun nm w (SomeNamedShape nmsh) | Just Refl <- testEquality w (natRepr nmsh) = - return $ mkShapeFun nm (namedShapeArgs nmsh) $ - \exprs -> PExpr_NamedShape Nothing Nothing nmsh exprs + return $ mkShapeFun nm (namedShapeArgs nmsh) $ \exprs -> + case namedShapeBody nmsh of + -- Test if nmsh applied to exprs unfolds to a sum with false, and if so, + -- return just the non-false payload shape + DefinedShapeBody mb_sh + | unfolded_sh <- simplifyShape (subst (substOfExprs exprs) mb_sh) + , Just sh <- matchSumFalseShape unfolded_sh -> + sh + -- Otherwise just return the named shape applied to exprs + _ -> PExpr_NamedShape Nothing Nothing nmsh exprs + namedShapeShapeFun _ w (SomeNamedShape nmsh) = fail $ renderDoc $ fillSep [pretty "Incorrect size of shape" <+> pretty (namedShapeName nmsh), From 68a026d8553eee545bc7b79677344684f79cefff Mon Sep 17 00:00:00 2001 From: Brian Huffman Date: Thu, 21 Apr 2022 10:50:20 -0700 Subject: [PATCH 08/13] Update submodule versions. --- deps/aig | 2 +- deps/crucible | 2 +- deps/cryptol | 2 +- deps/elf-edit | 2 +- deps/jvm-parser | 2 +- deps/macaw | 2 +- deps/parameterized-utils | 2 +- deps/what4 | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/deps/aig b/deps/aig index c9a7dd9691..00f138637d 160000 --- a/deps/aig +++ b/deps/aig @@ -1 +1 @@ -Subproject commit c9a7dd9691774b88493fcc7d7e64b5cf957ec9f0 +Subproject commit 00f138637d8936566534103878ca895613b7f714 diff --git a/deps/crucible b/deps/crucible index d18505d1ad..e826210639 160000 --- a/deps/crucible +++ b/deps/crucible @@ -1 +1 @@ -Subproject commit d18505d1ad1fe03e142371359852b5f52ea0b1f0 +Subproject commit e826210639edaf608687041136443f056c25e596 diff --git a/deps/cryptol b/deps/cryptol index fe0bd96ca7..31bfcc63f9 160000 --- a/deps/cryptol +++ b/deps/cryptol @@ -1 +1 @@ -Subproject commit fe0bd96ca72c493608ffed5bf7547f2ab2aad2bc +Subproject commit 31bfcc63f99b094c7c8627568e25f7d5fd8bd509 diff --git a/deps/elf-edit b/deps/elf-edit index fb4699a2bb..e7d7a38f9b 160000 --- a/deps/elf-edit +++ b/deps/elf-edit @@ -1 +1 @@ -Subproject commit fb4699a2bba68c4d46ea3dee436f640c328fb682 +Subproject commit e7d7a38f9bc9dfb535b96c79c06150cac6281ce4 diff --git a/deps/jvm-parser b/deps/jvm-parser index c6e4eebe4d..b1a5a21684 160000 --- a/deps/jvm-parser +++ b/deps/jvm-parser @@ -1 +1 @@ -Subproject commit c6e4eebe4db12245fa944bacec4eed44d586d36a +Subproject commit b1a5a216849a573ffc214c96b9aefb61e987365b diff --git a/deps/macaw b/deps/macaw index 45f8af1e5a..bbc0b6a40a 160000 --- a/deps/macaw +++ b/deps/macaw @@ -1 +1 @@ -Subproject commit 45f8af1e5a0023f00c8c1985834bdf3b1e8bcfbc +Subproject commit bbc0b6a40a2b99875c45fe137c97cc6c9e142f7d diff --git a/deps/parameterized-utils b/deps/parameterized-utils index fea8c1ab6c..e029a8593d 160000 --- a/deps/parameterized-utils +++ b/deps/parameterized-utils @@ -1 +1 @@ -Subproject commit fea8c1ab6c354485d065eb4764714b06b015ce93 +Subproject commit e029a8593d67fa1b25c700db08fd68e76c989c77 diff --git a/deps/what4 b/deps/what4 index ea717ac94a..4183a84d75 160000 --- a/deps/what4 +++ b/deps/what4 @@ -1 +1 @@ -Subproject commit ea717ac94a186b5ee18f138b71d8b4b4b2f00955 +Subproject commit 4183a84d75d6a540e0581f98d51ccf6355eb0bd9 From eca7a0c91e22eb61fb9ce6340799bce75403e2e0 Mon Sep 17 00:00:00 2001 From: Brian Huffman Date: Thu, 21 Apr 2022 17:06:08 -0700 Subject: [PATCH 09/13] Include parameterized-utils#131 and regenerate freeze files. Fixes #1635. --- cabal.GHC-8.10.7.config | 81 ++++++++++++++++++++-------------------- cabal.GHC-8.8.4.config | 81 ++++++++++++++++++++-------------------- cabal.GHC-9.0.2.config | 81 ++++++++++++++++++++-------------------- deps/parameterized-utils | 2 +- 4 files changed, 121 insertions(+), 124 deletions(-) diff --git a/cabal.GHC-8.10.7.config b/cabal.GHC-8.10.7.config index 90a56fbd41..095b8fb734 100644 --- a/cabal.GHC-8.10.7.config +++ b/cabal.GHC-8.10.7.config @@ -20,7 +20,7 @@ constraints: any.Cabal ==3.2.1.0, any.adjunctions ==4.4, any.aeson ==1.5.6.0, aeson -bytestring-builder -cffi -developer -fast, - any.aeson-typescript ==0.3.0.1, + any.aeson-typescript ==0.4.0.0, any.alex ==3.2.7.1, any.ansi-terminal ==0.11.1, ansi-terminal -example, @@ -38,29 +38,28 @@ constraints: any.Cabal ==3.2.1.0, any.attoparsec ==0.14.4, attoparsec -developer, any.auto-update ==0.1.6, + any.barbies ==2.0.3.1, any.base ==4.14.3.0, any.base-compat ==0.11.2, any.base-compat-batteries ==0.11.2, any.base-orphans ==0.8.6, any.base16-bytestring ==1.0.2.0, any.base64-bytestring ==1.2.1.0, - any.basement ==0.0.12, + any.basement ==0.0.14, any.bifunctors ==5.5.11, bifunctors +semigroups +tagged, any.bimap ==0.4.0, any.binary ==0.8.8.0, any.binary-orphans ==1.0.2, - any.binary-parsers ==0.2.4.0, any.bitwise ==1.0.0.1, any.blaze-builder ==0.4.2.2, any.blaze-html ==0.9.1.2, any.blaze-markup ==0.8.2.8, - any.boomerang ==1.4.7, + any.boomerang ==1.4.8, any.bsb-http-chunked ==0.0.0.4, - any.bv-sized ==1.0.3, + any.bv-sized ==1.0.4, any.byteorder ==1.0.4, any.bytestring ==0.10.12.0, - any.bytestring-lexing ==0.5.0.8, any.cabal-doctest ==1.0.9, any.call-stack ==0.4.0, any.case-insensitive ==1.2.1.0, @@ -70,24 +69,24 @@ constraints: any.Cabal ==3.2.1.0, cereal -bytestring-builder, any.chimera ==0.3.2.0, chimera +representable, - any.clock ==0.8.2, + any.clock ==0.8.3, clock -llvm, any.code-page ==0.2.1, any.colour ==2.3.6, any.comonad ==5.0.8, comonad +containers +distributive +indexed-traversable, any.concurrent-extra ==0.7.0.12, - any.concurrent-output ==1.10.14, + any.concurrent-output ==1.10.15, any.conduit ==1.3.4.2, any.conduit-extra ==1.3.5, any.config-schema ==1.2.2.0, - any.config-value ==0.8.2, - any.constraints ==0.13.2, + any.config-value ==0.8.2.1, + any.constraints ==0.13.3, any.containers ==0.6.5.1, any.contravariant ==1.5.5, contravariant +semigroups +statevar +tagged, any.cookie ==0.4.5, - any.criterion ==1.5.12.0, + any.criterion ==1.5.13.0, criterion -embed-data-files -fast, any.criterion-measurement ==0.1.3.0, criterion-measurement -fast, @@ -96,7 +95,7 @@ constraints: any.Cabal ==3.2.1.0, any.cryptohash-sha1 ==0.11.101.0, cryptol +relocatable -static, cryptol-remote-api -notthreaded -static, - any.cryptonite ==0.29, + any.cryptonite ==0.30, cryptonite -check_alignment +integer-gmp -old_toolchain_inliner +support_aesni +support_deepseq -support_pclmuldq +support_rdrand -support_sse +use_target_attributes, any.cryptonite-conduit ==0.2.2, any.data-accessor ==0.2.3, @@ -137,7 +136,7 @@ constraints: any.Cabal ==3.2.1.0, any.filelock ==0.1.1.5, any.filemanip ==0.3.6.3, any.filepath ==1.4.2.1, - any.fingertree ==0.1.4.2, + any.fingertree ==0.1.5.0, any.free ==5.1.7, any.generic-deriving ==1.14.1, generic-deriving +base-4-9, @@ -164,8 +163,8 @@ constraints: any.Cabal ==3.2.1.0, any.haskeline ==0.8.2, any.haskell-lexer ==1.1, any.haskell-src-exts ==1.23.1, - any.haskell-src-meta ==0.8.8, - any.hedgehog ==1.0.5, + any.haskell-src-meta ==0.8.9, + any.hedgehog ==1.1.1, any.hedgehog-classes ==0.2.5.3, hedgehog-classes +aeson +comonad +primitive +semirings +vector, any.heredoc ==0.2.0.0, @@ -175,13 +174,13 @@ constraints: any.Cabal ==3.2.1.0, any.hpc ==0.6.1.0, any.hsc2hs ==0.68.8, hsc2hs -in-ghc-tree, - any.hspec ==2.9.4, - any.hspec-core ==2.9.4, - any.hspec-discover ==2.9.4, + any.hspec ==2.9.7, + any.hspec-core ==2.9.7, + any.hspec-discover ==2.9.7, any.hspec-expectations ==0.8.2, any.http-date ==0.0.11, any.http-types ==0.12.3, - any.http2 ==3.0.2, + any.http2 ==3.0.3, http2 -devel -doc -h2spec, any.indexed-profunctors ==0.1.1, any.indexed-traversable ==0.1.2, @@ -213,26 +212,26 @@ constraints: any.Cabal ==3.2.1.0, llvm-pretty-bc-parser -fuzz -regressions, any.logict ==0.7.0.3, any.lucid ==2.9.12.1, - any.lumberjack ==1.0.0.1, + any.lumberjack ==1.0.1.0, any.math-functions ==0.3.4.2, math-functions +system-erf +system-expm1, any.megaparsec ==9.0.1, megaparsec -dev, - any.memory ==0.16.0, - memory +support_basement +support_bytestring +support_deepseq +support_foundation, + any.memory ==0.17.0, + memory +support_bytestring +support_deepseq, any.microlens ==0.4.12.0, any.microlens-th ==0.4.3.10, any.microstache ==1.0.2, - any.mmorph ==1.1.5, + any.mmorph ==1.2.0, any.mod ==0.1.2.2, mod +semirings +vector, - any.modern-uri ==0.3.4.2, + any.modern-uri ==0.3.4.4, modern-uri -dev, any.monad-control ==1.0.3.1, any.monad-par ==0.3.5, monad-par -chaselev -newgeneric, any.monad-par-extras ==0.3.3, - any.monadLib ==3.10, + any.monadLib ==3.10.1, any.mono-traversable ==1.0.15.3, any.mtl ==2.2.2, any.mwc-random ==0.15.0.2, @@ -241,7 +240,7 @@ constraints: any.Cabal ==3.2.1.0, any.network ==3.1.2.7, network -devel, any.network-byte-order ==0.1.6, - any.network-info ==0.2.0.10, + any.network-info ==0.2.1, any.newtype-generics ==0.6.1, any.numtype-dk ==0.5.0.3, any.old-locale ==1.0.0.7, @@ -290,7 +289,7 @@ constraints: any.Cabal ==3.2.1.0, any.scotty ==0.12, any.semigroupoids ==5.3.7, semigroupoids +comonad +containers +contravariant +distributive +tagged +unordered-containers, - any.semigroups ==0.19.2, + any.semigroups ==0.20, semigroups +binary +bytestring -bytestring-builder +containers +deepseq +hashable +tagged +template-haskell +text +transformers +unordered-containers, any.semirings ==0.6, semirings +containers +unordered-containers, @@ -304,9 +303,9 @@ constraints: any.Cabal ==3.2.1.0, any.split ==0.2.3.4, any.splitmix ==0.1.0.4, splitmix -optimised-mixer, - any.statistics ==0.16.0.1, + any.statistics ==0.16.0.2, any.stm ==2.5.0.1, - any.streaming-commons ==0.2.2.3, + any.streaming-commons ==0.2.2.4, streaming-commons -use-bytestring-builder, any.strict ==0.4.0.1, strict +assoc, @@ -322,7 +321,7 @@ constraints: any.Cabal ==3.2.1.0, any.tasty-expected-failure ==0.12.3, any.tasty-golden ==2.3.5, tasty-golden -build-example, - any.tasty-hedgehog ==1.1.0.0, + any.tasty-hedgehog ==1.2.0.0, any.tasty-hspec ==1.2, any.tasty-hunit ==0.10.0.3, any.tasty-quickcheck ==0.10.2, @@ -330,7 +329,7 @@ constraints: any.Cabal ==3.2.1.0, any.tasty-sugar ==1.1.1.0, any.template-haskell ==2.16.0.0, any.temporary ==1.3, - any.terminal-size ==0.3.2.1, + any.terminal-size ==0.3.3, any.terminfo ==0.4.1.4, any.test-framework ==0.8.2.0, any.test-framework-hunit ==0.3.0.2, @@ -359,7 +358,7 @@ constraints: any.Cabal ==3.2.1.0, any.transformers ==0.5.6.2, any.transformers-base ==0.4.6, transformers-base +orphaninstances, - any.transformers-compat ==0.6.6, + any.transformers-compat ==0.7.1, transformers-compat -five +five-three -four +generic-deriving +mtl -three -two, any.type-equality ==1, any.typed-process ==0.2.8.0, @@ -369,9 +368,9 @@ constraints: any.Cabal ==3.2.1.0, any.unix-compat ==0.5.4, unix-compat -old-time, any.unix-time ==0.4.7, - any.unliftio ==0.2.20, + any.unliftio ==0.2.21.0, any.unliftio-core ==0.2.0.1, - any.unordered-containers ==0.2.16.0, + any.unordered-containers ==0.2.18.0, unordered-containers -debug, any.utf8-string ==1.0.2, any.uuid ==1.3.15, @@ -384,15 +383,15 @@ constraints: any.Cabal ==3.2.1.0, vector-algorithms +bench +boundschecks -internalchecks -llvm +properties -unsafechecks, any.vector-binary-instances ==0.2.5.2, any.vector-th-unbox ==0.2.2, - any.versions ==5.0.2, + any.versions ==5.0.3, any.void ==0.7.3, void -safe, any.wai ==3.2.3, - any.wai-extra ==3.1.8, + any.wai-extra ==3.1.10, wai-extra -build-example, - any.wai-logger ==2.3.7, - any.warp ==3.3.18, - warp +allow-sendfilefd -network-bytestring -warp-debug, + any.wai-logger ==2.4.0, + any.warp ==3.3.20, + warp +allow-sendfilefd -network-bytestring -warp-debug +x509, any.warp-tls ==3.3.2, any.wcwidth ==0.0.2, wcwidth -cli +split-base, @@ -405,10 +404,10 @@ constraints: any.Cabal ==3.2.1.0, any.x509-store ==1.6.9, any.x509-validation ==1.6.12, any.xml ==1.3.14, - any.yaml ==0.11.7.0, + any.yaml ==0.11.8.0, yaml +no-examples +no-exe, any.zenc ==0.1.2, any.zlib ==0.6.2.3, zlib -bundled-c-zlib -non-blocking-ffi -pkg-config, any.zlib-bindings ==0.1.1.5 -index-state: hackage.haskell.org 2022-01-24T13:23:29Z +index-state: hackage.haskell.org 2022-04-21T22:07:51Z diff --git a/cabal.GHC-8.8.4.config b/cabal.GHC-8.8.4.config index d80be71981..0ef36fea2d 100644 --- a/cabal.GHC-8.8.4.config +++ b/cabal.GHC-8.8.4.config @@ -20,7 +20,7 @@ constraints: any.Cabal ==3.0.1.0, any.adjunctions ==4.4, any.aeson ==1.5.6.0, aeson -bytestring-builder -cffi -developer -fast, - any.aeson-typescript ==0.3.0.1, + any.aeson-typescript ==0.4.0.0, any.alex ==3.2.7.1, any.ansi-terminal ==0.11.1, ansi-terminal -example, @@ -38,29 +38,28 @@ constraints: any.Cabal ==3.0.1.0, any.attoparsec ==0.14.4, attoparsec -developer, any.auto-update ==0.1.6, + any.barbies ==2.0.3.1, any.base ==4.13.0.0, any.base-compat ==0.11.2, any.base-compat-batteries ==0.11.2, any.base-orphans ==0.8.6, any.base16-bytestring ==1.0.2.0, any.base64-bytestring ==1.2.1.0, - any.basement ==0.0.12, + any.basement ==0.0.14, any.bifunctors ==5.5.11, bifunctors +semigroups +tagged, any.bimap ==0.4.0, any.binary ==0.8.7.0, any.binary-orphans ==1.0.2, - any.binary-parsers ==0.2.4.0, any.bitwise ==1.0.0.1, any.blaze-builder ==0.4.2.2, any.blaze-html ==0.9.1.2, any.blaze-markup ==0.8.2.8, - any.boomerang ==1.4.7, + any.boomerang ==1.4.8, any.bsb-http-chunked ==0.0.0.4, - any.bv-sized ==1.0.3, + any.bv-sized ==1.0.4, any.byteorder ==1.0.4, any.bytestring ==0.10.10.1, - any.bytestring-lexing ==0.5.0.8, any.cabal-doctest ==1.0.9, any.call-stack ==0.4.0, any.case-insensitive ==1.2.1.0, @@ -70,24 +69,24 @@ constraints: any.Cabal ==3.0.1.0, cereal -bytestring-builder, any.chimera ==0.3.2.0, chimera +representable, - any.clock ==0.8.2, + any.clock ==0.8.3, clock -llvm, any.code-page ==0.2.1, any.colour ==2.3.6, any.comonad ==5.0.8, comonad +containers +distributive +indexed-traversable, any.concurrent-extra ==0.7.0.12, - any.concurrent-output ==1.10.14, + any.concurrent-output ==1.10.15, any.conduit ==1.3.4.2, any.conduit-extra ==1.3.5, any.config-schema ==1.2.2.0, - any.config-value ==0.8.2, - any.constraints ==0.13.2, + any.config-value ==0.8.2.1, + any.constraints ==0.13.3, any.containers ==0.6.2.1, any.contravariant ==1.5.5, contravariant +semigroups +statevar +tagged, any.cookie ==0.4.5, - any.criterion ==1.5.12.0, + any.criterion ==1.5.13.0, criterion -embed-data-files -fast, any.criterion-measurement ==0.1.3.0, criterion-measurement -fast, @@ -96,7 +95,7 @@ constraints: any.Cabal ==3.0.1.0, any.cryptohash-sha1 ==0.11.101.0, cryptol +relocatable -static, cryptol-remote-api -notthreaded -static, - any.cryptonite ==0.29, + any.cryptonite ==0.30, cryptonite -check_alignment +integer-gmp -old_toolchain_inliner +support_aesni +support_deepseq -support_pclmuldq +support_rdrand -support_sse +use_target_attributes, any.cryptonite-conduit ==0.2.2, any.data-accessor ==0.2.3, @@ -138,7 +137,7 @@ constraints: any.Cabal ==3.0.1.0, any.filelock ==0.1.1.5, any.filemanip ==0.3.6.3, any.filepath ==1.4.2.1, - any.fingertree ==0.1.4.2, + any.fingertree ==0.1.5.0, any.free ==5.1.7, any.generic-deriving ==1.14.1, generic-deriving +base-4-9, @@ -165,8 +164,8 @@ constraints: any.Cabal ==3.0.1.0, any.haskeline ==0.7.5.0, any.haskell-lexer ==1.1, any.haskell-src-exts ==1.23.1, - any.haskell-src-meta ==0.8.8, - any.hedgehog ==1.0.5, + any.haskell-src-meta ==0.8.9, + any.hedgehog ==1.1.1, any.hedgehog-classes ==0.2.5.3, hedgehog-classes +aeson +comonad +primitive +semirings +vector, any.heredoc ==0.2.0.0, @@ -176,13 +175,13 @@ constraints: any.Cabal ==3.0.1.0, any.hpc ==0.6.0.3, any.hsc2hs ==0.68.8, hsc2hs -in-ghc-tree, - any.hspec ==2.9.4, - any.hspec-core ==2.9.4, - any.hspec-discover ==2.9.4, + any.hspec ==2.9.7, + any.hspec-core ==2.9.7, + any.hspec-discover ==2.9.7, any.hspec-expectations ==0.8.2, any.http-date ==0.0.11, any.http-types ==0.12.3, - any.http2 ==3.0.2, + any.http2 ==3.0.3, http2 -devel -doc -h2spec, any.indexed-profunctors ==0.1.1, any.indexed-traversable ==0.1.2, @@ -214,26 +213,26 @@ constraints: any.Cabal ==3.0.1.0, llvm-pretty-bc-parser -fuzz -regressions, any.logict ==0.7.0.3, any.lucid ==2.9.12.1, - any.lumberjack ==1.0.0.1, + any.lumberjack ==1.0.1.0, any.math-functions ==0.3.4.2, math-functions +system-erf +system-expm1, any.megaparsec ==9.0.1, megaparsec -dev, - any.memory ==0.16.0, - memory +support_basement +support_bytestring +support_deepseq +support_foundation, + any.memory ==0.17.0, + memory +support_bytestring +support_deepseq, any.microlens ==0.4.12.0, any.microlens-th ==0.4.3.10, any.microstache ==1.0.2, - any.mmorph ==1.1.5, + any.mmorph ==1.2.0, any.mod ==0.1.2.2, mod +semirings +vector, - any.modern-uri ==0.3.4.2, + any.modern-uri ==0.3.4.4, modern-uri -dev, any.monad-control ==1.0.3.1, any.monad-par ==0.3.5, monad-par -chaselev -newgeneric, any.monad-par-extras ==0.3.3, - any.monadLib ==3.10, + any.monadLib ==3.10.1, any.mono-traversable ==1.0.15.3, any.mtl ==2.2.2, any.mwc-random ==0.15.0.2, @@ -242,7 +241,7 @@ constraints: any.Cabal ==3.0.1.0, any.network ==3.1.2.7, network -devel, any.network-byte-order ==0.1.6, - any.network-info ==0.2.0.10, + any.network-info ==0.2.1, any.newtype-generics ==0.6.1, any.numtype-dk ==0.5.0.3, any.old-locale ==1.0.0.7, @@ -291,7 +290,7 @@ constraints: any.Cabal ==3.0.1.0, any.scotty ==0.12, any.semigroupoids ==5.3.7, semigroupoids +comonad +containers +contravariant +distributive +tagged +unordered-containers, - any.semigroups ==0.19.2, + any.semigroups ==0.20, semigroups +binary +bytestring -bytestring-builder +containers +deepseq +hashable +tagged +template-haskell +text +transformers +unordered-containers, any.semirings ==0.6, semirings +containers +unordered-containers, @@ -305,9 +304,9 @@ constraints: any.Cabal ==3.0.1.0, any.split ==0.2.3.4, any.splitmix ==0.1.0.4, splitmix -optimised-mixer, - any.statistics ==0.16.0.1, + any.statistics ==0.16.0.2, any.stm ==2.5.0.0, - any.streaming-commons ==0.2.2.3, + any.streaming-commons ==0.2.2.4, streaming-commons -use-bytestring-builder, any.strict ==0.4.0.1, strict +assoc, @@ -323,7 +322,7 @@ constraints: any.Cabal ==3.0.1.0, any.tasty-expected-failure ==0.12.3, any.tasty-golden ==2.3.5, tasty-golden -build-example, - any.tasty-hedgehog ==1.1.0.0, + any.tasty-hedgehog ==1.2.0.0, any.tasty-hspec ==1.2, any.tasty-hunit ==0.10.0.3, any.tasty-quickcheck ==0.10.2, @@ -331,7 +330,7 @@ constraints: any.Cabal ==3.0.1.0, any.tasty-sugar ==1.1.1.0, any.template-haskell ==2.15.0.0, any.temporary ==1.3, - any.terminal-size ==0.3.2.1, + any.terminal-size ==0.3.3, any.terminfo ==0.4.1.4, any.test-framework ==0.8.2.0, any.test-framework-hunit ==0.3.0.2, @@ -360,7 +359,7 @@ constraints: any.Cabal ==3.0.1.0, any.transformers ==0.5.6.2, any.transformers-base ==0.4.6, transformers-base +orphaninstances, - any.transformers-compat ==0.6.6, + any.transformers-compat ==0.7.1, transformers-compat -five +five-three -four +generic-deriving +mtl -three -two, any.type-equality ==1, any.typed-process ==0.2.8.0, @@ -370,9 +369,9 @@ constraints: any.Cabal ==3.0.1.0, any.unix-compat ==0.5.4, unix-compat -old-time, any.unix-time ==0.4.7, - any.unliftio ==0.2.20, + any.unliftio ==0.2.21.0, any.unliftio-core ==0.2.0.1, - any.unordered-containers ==0.2.16.0, + any.unordered-containers ==0.2.18.0, unordered-containers -debug, any.utf8-string ==1.0.2, any.uuid ==1.3.15, @@ -385,15 +384,15 @@ constraints: any.Cabal ==3.0.1.0, vector-algorithms +bench +boundschecks -internalchecks -llvm +properties -unsafechecks, any.vector-binary-instances ==0.2.5.2, any.vector-th-unbox ==0.2.2, - any.versions ==5.0.2, + any.versions ==5.0.3, any.void ==0.7.3, void -safe, any.wai ==3.2.3, - any.wai-extra ==3.1.8, + any.wai-extra ==3.1.10, wai-extra -build-example, - any.wai-logger ==2.3.7, - any.warp ==3.3.18, - warp +allow-sendfilefd -network-bytestring -warp-debug, + any.wai-logger ==2.4.0, + any.warp ==3.3.20, + warp +allow-sendfilefd -network-bytestring -warp-debug +x509, any.warp-tls ==3.3.2, any.wcwidth ==0.0.2, wcwidth -cli +split-base, @@ -406,10 +405,10 @@ constraints: any.Cabal ==3.0.1.0, any.x509-store ==1.6.9, any.x509-validation ==1.6.12, any.xml ==1.3.14, - any.yaml ==0.11.7.0, + any.yaml ==0.11.8.0, yaml +no-examples +no-exe, any.zenc ==0.1.2, any.zlib ==0.6.2.3, zlib -bundled-c-zlib -non-blocking-ffi -pkg-config, any.zlib-bindings ==0.1.1.5 -index-state: hackage.haskell.org 2022-01-24T13:23:29Z +index-state: hackage.haskell.org 2022-04-21T22:07:51Z diff --git a/cabal.GHC-9.0.2.config b/cabal.GHC-9.0.2.config index 721ac648de..2e72040337 100644 --- a/cabal.GHC-9.0.2.config +++ b/cabal.GHC-9.0.2.config @@ -20,7 +20,7 @@ constraints: any.Cabal ==3.4.1.0, any.adjunctions ==4.4, any.aeson ==1.5.6.0, aeson -bytestring-builder -cffi -developer -fast, - any.aeson-typescript ==0.3.0.1, + any.aeson-typescript ==0.4.0.0, any.alex ==3.2.7.1, any.ansi-terminal ==0.11.1, ansi-terminal -example, @@ -38,29 +38,28 @@ constraints: any.Cabal ==3.4.1.0, any.attoparsec ==0.14.4, attoparsec -developer, any.auto-update ==0.1.6, + any.barbies ==2.0.3.1, any.base ==4.15.1.0, any.base-compat ==0.11.2, any.base-compat-batteries ==0.11.2, any.base-orphans ==0.8.6, any.base16-bytestring ==1.0.2.0, any.base64-bytestring ==1.2.1.0, - any.basement ==0.0.12, + any.basement ==0.0.14, any.bifunctors ==5.5.11, bifunctors +semigroups +tagged, any.bimap ==0.4.0, any.binary ==0.8.8.0, any.binary-orphans ==1.0.2, - any.binary-parsers ==0.2.4.0, any.bitwise ==1.0.0.1, any.blaze-builder ==0.4.2.2, any.blaze-html ==0.9.1.2, any.blaze-markup ==0.8.2.8, - any.boomerang ==1.4.7, + any.boomerang ==1.4.8, any.bsb-http-chunked ==0.0.0.4, - any.bv-sized ==1.0.3, + any.bv-sized ==1.0.4, any.byteorder ==1.0.4, any.bytestring ==0.10.12.1, - any.bytestring-lexing ==0.5.0.8, any.cabal-doctest ==1.0.9, any.call-stack ==0.4.0, any.case-insensitive ==1.2.1.0, @@ -70,24 +69,24 @@ constraints: any.Cabal ==3.4.1.0, cereal -bytestring-builder, any.chimera ==0.3.2.0, chimera +representable, - any.clock ==0.8.2, + any.clock ==0.8.3, clock -llvm, any.code-page ==0.2.1, any.colour ==2.3.6, any.comonad ==5.0.8, comonad +containers +distributive +indexed-traversable, any.concurrent-extra ==0.7.0.12, - any.concurrent-output ==1.10.14, + any.concurrent-output ==1.10.15, any.conduit ==1.3.4.2, any.conduit-extra ==1.3.5, any.config-schema ==1.2.2.0, - any.config-value ==0.8.2, - any.constraints ==0.13.2, + any.config-value ==0.8.2.1, + any.constraints ==0.13.3, any.containers ==0.6.4.1, any.contravariant ==1.5.5, contravariant +semigroups +statevar +tagged, any.cookie ==0.4.5, - any.criterion ==1.5.12.0, + any.criterion ==1.5.13.0, criterion -embed-data-files -fast, any.criterion-measurement ==0.1.3.0, criterion-measurement -fast, @@ -96,7 +95,7 @@ constraints: any.Cabal ==3.4.1.0, any.cryptohash-sha1 ==0.11.101.0, cryptol +relocatable -static, cryptol-remote-api -notthreaded -static, - any.cryptonite ==0.29, + any.cryptonite ==0.30, cryptonite -check_alignment +integer-gmp -old_toolchain_inliner +support_aesni +support_deepseq -support_pclmuldq +support_rdrand -support_sse +use_target_attributes, any.cryptonite-conduit ==0.2.2, any.data-accessor ==0.2.3, @@ -137,7 +136,7 @@ constraints: any.Cabal ==3.4.1.0, any.filelock ==0.1.1.5, any.filemanip ==0.3.6.3, any.filepath ==1.4.2.1, - any.fingertree ==0.1.4.2, + any.fingertree ==0.1.5.0, any.free ==5.1.7, any.generic-deriving ==1.14.1, generic-deriving +base-4-9, @@ -165,8 +164,8 @@ constraints: any.Cabal ==3.4.1.0, any.haskeline ==0.8.2, any.haskell-lexer ==1.1, any.haskell-src-exts ==1.23.1, - any.haskell-src-meta ==0.8.8, - any.hedgehog ==1.0.5, + any.haskell-src-meta ==0.8.9, + any.hedgehog ==1.1.1, any.hedgehog-classes ==0.2.5.3, hedgehog-classes +aeson +comonad +primitive +semirings +vector, any.heredoc ==0.2.0.0, @@ -176,13 +175,13 @@ constraints: any.Cabal ==3.4.1.0, any.hpc ==0.6.1.0, any.hsc2hs ==0.68.8, hsc2hs -in-ghc-tree, - any.hspec ==2.9.4, - any.hspec-core ==2.9.4, - any.hspec-discover ==2.9.4, + any.hspec ==2.9.7, + any.hspec-core ==2.9.7, + any.hspec-discover ==2.9.7, any.hspec-expectations ==0.8.2, any.http-date ==0.0.11, any.http-types ==0.12.3, - any.http2 ==3.0.2, + any.http2 ==3.0.3, http2 -devel -doc -h2spec, any.indexed-profunctors ==0.1.1, any.indexed-traversable ==0.1.2, @@ -214,26 +213,26 @@ constraints: any.Cabal ==3.4.1.0, llvm-pretty-bc-parser -fuzz -regressions, any.logict ==0.7.0.3, any.lucid ==2.9.12.1, - any.lumberjack ==1.0.0.1, + any.lumberjack ==1.0.1.0, any.math-functions ==0.3.4.2, math-functions +system-erf +system-expm1, any.megaparsec ==9.0.1, megaparsec -dev, - any.memory ==0.16.0, - memory +support_basement +support_bytestring +support_deepseq +support_foundation, + any.memory ==0.17.0, + memory +support_bytestring +support_deepseq, any.microlens ==0.4.12.0, any.microlens-th ==0.4.3.10, any.microstache ==1.0.2, - any.mmorph ==1.1.5, + any.mmorph ==1.2.0, any.mod ==0.1.2.2, mod +semirings +vector, - any.modern-uri ==0.3.4.2, + any.modern-uri ==0.3.4.4, modern-uri -dev, any.monad-control ==1.0.3.1, any.monad-par ==0.3.5, monad-par -chaselev -newgeneric, any.monad-par-extras ==0.3.3, - any.monadLib ==3.10, + any.monadLib ==3.10.1, any.mono-traversable ==1.0.15.3, any.mtl ==2.2.2, any.mwc-random ==0.15.0.2, @@ -242,7 +241,7 @@ constraints: any.Cabal ==3.4.1.0, any.network ==3.1.2.7, network -devel, any.network-byte-order ==0.1.6, - any.network-info ==0.2.0.10, + any.network-info ==0.2.1, any.newtype-generics ==0.6.1, any.numtype-dk ==0.5.0.3, any.old-locale ==1.0.0.7, @@ -291,7 +290,7 @@ constraints: any.Cabal ==3.4.1.0, any.scotty ==0.12, any.semigroupoids ==5.3.7, semigroupoids +comonad +containers +contravariant +distributive +tagged +unordered-containers, - any.semigroups ==0.19.2, + any.semigroups ==0.20, semigroups +binary +bytestring -bytestring-builder +containers +deepseq +hashable +tagged +template-haskell +text +transformers +unordered-containers, any.semirings ==0.6, semirings +containers +unordered-containers, @@ -305,9 +304,9 @@ constraints: any.Cabal ==3.4.1.0, any.split ==0.2.3.4, any.splitmix ==0.1.0.4, splitmix -optimised-mixer, - any.statistics ==0.16.0.1, + any.statistics ==0.16.0.2, any.stm ==2.5.0.0, - any.streaming-commons ==0.2.2.3, + any.streaming-commons ==0.2.2.4, streaming-commons -use-bytestring-builder, any.strict ==0.4.0.1, strict +assoc, @@ -323,7 +322,7 @@ constraints: any.Cabal ==3.4.1.0, any.tasty-expected-failure ==0.12.3, any.tasty-golden ==2.3.5, tasty-golden -build-example, - any.tasty-hedgehog ==1.1.0.0, + any.tasty-hedgehog ==1.2.0.0, any.tasty-hspec ==1.2, any.tasty-hunit ==0.10.0.3, any.tasty-quickcheck ==0.10.2, @@ -331,7 +330,7 @@ constraints: any.Cabal ==3.4.1.0, any.tasty-sugar ==1.1.1.0, any.template-haskell ==2.17.0.0, any.temporary ==1.3, - any.terminal-size ==0.3.2.1, + any.terminal-size ==0.3.3, any.terminfo ==0.4.1.5, any.test-framework ==0.8.2.0, any.test-framework-hunit ==0.3.0.2, @@ -360,7 +359,7 @@ constraints: any.Cabal ==3.4.1.0, any.transformers ==0.5.6.2, any.transformers-base ==0.4.6, transformers-base +orphaninstances, - any.transformers-compat ==0.6.6, + any.transformers-compat ==0.7.1, transformers-compat -five +five-three -four +generic-deriving +mtl -three -two, any.type-equality ==1, any.typed-process ==0.2.8.0, @@ -370,9 +369,9 @@ constraints: any.Cabal ==3.4.1.0, any.unix-compat ==0.5.4, unix-compat -old-time, any.unix-time ==0.4.7, - any.unliftio ==0.2.20, + any.unliftio ==0.2.21.0, any.unliftio-core ==0.2.0.1, - any.unordered-containers ==0.2.16.0, + any.unordered-containers ==0.2.18.0, unordered-containers -debug, any.utf8-string ==1.0.2, any.uuid ==1.3.15, @@ -385,15 +384,15 @@ constraints: any.Cabal ==3.4.1.0, vector-algorithms +bench +boundschecks -internalchecks -llvm +properties -unsafechecks, any.vector-binary-instances ==0.2.5.2, any.vector-th-unbox ==0.2.2, - any.versions ==5.0.2, + any.versions ==5.0.3, any.void ==0.7.3, void -safe, any.wai ==3.2.3, - any.wai-extra ==3.1.8, + any.wai-extra ==3.1.10, wai-extra -build-example, - any.wai-logger ==2.3.7, - any.warp ==3.3.18, - warp +allow-sendfilefd -network-bytestring -warp-debug, + any.wai-logger ==2.4.0, + any.warp ==3.3.20, + warp +allow-sendfilefd -network-bytestring -warp-debug +x509, any.warp-tls ==3.3.2, any.wcwidth ==0.0.2, wcwidth -cli +split-base, @@ -406,10 +405,10 @@ constraints: any.Cabal ==3.4.1.0, any.x509-store ==1.6.9, any.x509-validation ==1.6.12, any.xml ==1.3.14, - any.yaml ==0.11.7.0, + any.yaml ==0.11.8.0, yaml +no-examples +no-exe, any.zenc ==0.1.2, any.zlib ==0.6.2.3, zlib -bundled-c-zlib -non-blocking-ffi -pkg-config, any.zlib-bindings ==0.1.1.5 -index-state: hackage.haskell.org 2022-01-24T13:23:29Z +index-state: hackage.haskell.org 2022-04-21T22:07:51Z diff --git a/deps/parameterized-utils b/deps/parameterized-utils index e029a8593d..d3873f33a0 160000 --- a/deps/parameterized-utils +++ b/deps/parameterized-utils @@ -1 +1 @@ -Subproject commit e029a8593d67fa1b25c700db08fd68e76c989c77 +Subproject commit d3873f33a06dd427f021575c795ae4b3bb6dbf46 From b716aab9fab8536d2ea33ae8706128abb94cdb89 Mon Sep 17 00:00:00 2001 From: Brian Huffman Date: Thu, 21 Apr 2022 17:14:37 -0700 Subject: [PATCH 10/13] Bump submodules. --- deps/parameterized-utils | 2 +- deps/what4 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps/parameterized-utils b/deps/parameterized-utils index d3873f33a0..1baefb9892 160000 --- a/deps/parameterized-utils +++ b/deps/parameterized-utils @@ -1 +1 @@ -Subproject commit d3873f33a06dd427f021575c795ae4b3bb6dbf46 +Subproject commit 1baefb98929bbc658e0f56f21dcf0c83f7beacd9 diff --git a/deps/what4 b/deps/what4 index 4183a84d75..1786acf8d7 160000 --- a/deps/what4 +++ b/deps/what4 @@ -1 +1 @@ -Subproject commit 4183a84d75d6a540e0581f98d51ccf6355eb0bd9 +Subproject commit 1786acf8d720d51a415b30c08246f05a97b2e45d From b6e9afc50327ab3131cdb63106ed1b88accef980 Mon Sep 17 00:00:00 2001 From: Brian Huffman Date: Fri, 22 Apr 2022 08:00:30 -0700 Subject: [PATCH 11/13] Use numbers instead of primes to distinguish shadowed saw-core variables. Fixes #1619. --- saw-core/src/Verifier/SAW/Term/Pretty.hs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/saw-core/src/Verifier/SAW/Term/Pretty.hs b/saw-core/src/Verifier/SAW/Term/Pretty.hs index 58cf0de96e..4e2ac6e2e8 100644 --- a/saw-core/src/Verifier/SAW/Term/Pretty.hs +++ b/saw-core/src/Verifier/SAW/Term/Pretty.hs @@ -41,7 +41,7 @@ module Verifier.SAW.Term.Pretty , ppName ) where -import Data.Char (intToDigit) +import Data.Char (intToDigit, isDigit) import Data.Maybe (isJust) import Control.Monad.Reader import Control.Monad.State.Strict as State @@ -176,9 +176,20 @@ lookupVarName False _ i = Text.pack ('!' : show i) freshName :: [LocalName] -> LocalName -> LocalName freshName used name | name == "_" = name - | elem name used = freshName used (name <> "'") + | elem name used = freshName used (nextName name) | otherwise = name +-- | Generate a variant of a name by incrementing the number at the +-- end, or appending the number 1 if there is none. +nextName :: LocalName -> LocalName +nextName = Text.pack . reverse . go . reverse . Text.unpack + where + go :: String -> String + go (c : cs) + | c == '9' = '0' : go cs + | isDigit c = succ c : cs + go cs = '1' : cs + -- | Add a new variable with the given base name to the local variable list, -- returning both the fresh name actually used and the new variable list. As a -- special case, if the base name is "_", it is not modified. From e16cc8c11b53056be28f6f4c8b002856e29f56a7 Mon Sep 17 00:00:00 2001 From: Brian Huffman Date: Fri, 22 Apr 2022 08:08:36 -0700 Subject: [PATCH 12/13] Reduce excessive linebreaks when printing large terms. This is accomplished by using a layout with an extremely large page width, combined with a normal (64-character) ribbon width. With this setup, the pretty-printer should almost never in practice go into the bayond-the-margin mode where it prints only one token per line. Fixes #1618. --- saw-core/src/Verifier/SAW/Term/Pretty.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/saw-core/src/Verifier/SAW/Term/Pretty.hs b/saw-core/src/Verifier/SAW/Term/Pretty.hs index 4e2ac6e2e8..1ba288aa00 100644 --- a/saw-core/src/Verifier/SAW/Term/Pretty.hs +++ b/saw-core/src/Verifier/SAW/Term/Pretty.hs @@ -695,7 +695,8 @@ renderSawDoc :: PPOpts -> SawDoc -> String renderSawDoc ppOpts doc = Text.Lazy.unpack (renderLazy (style (layoutPretty layoutOpts doc))) where - layoutOpts = LayoutOptions (AvailablePerLine 80 0.8) + -- ribbon width 64, with effectively unlimited right margin + layoutOpts = LayoutOptions (AvailablePerLine 8000 0.008) style = if ppColor ppOpts then reAnnotateS colorStyle else unAnnotateS -- | Pretty-print a term and render it to a string, using the given options From 7feac1413d632f969d04bda6793c487c6bd4a038 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 27 Apr 2022 09:49:17 -0700 Subject: [PATCH 13/13] Generalized Heapster lifetime ownership permissions (#1645) * changed lowned permissions to allow arbitrary input and output permissions, not just field, array, and block permissions * trying to work out how to rewrite solveForPermImpl... * figured out an idea for how to make solveForPermListImpl work with arbitrary lowned permissions... * got Implication.hs to compile (modulo some fixmes) with the new lowned permissions * implemented mbRangeFTsSubsetTo * fixed a non-exhaustive pattern-match * finished implementing neededPermsForRanges * implemented getExprRanges * updated RustTypes.hs to work with the newly generalized lowned permissions * fixed compiler errors in TypeChecker.hs * fixed TypedCrucible.hs with the new lowned permission changes * updated SAWTranslation.hs for the lowned permission changes * finished updating IRTTranslation.hs for new lowned permissions * bug fix: incorrect modalization computation in the output permissions of SImpl_ElimLOWnedSimple * bug fix: translating ExprPerms should go via DistPerms * fixed bugs in callBlockWithPerms and in how it was being called in tcJumpTarget * added a fixme for later * changed recombinePerm to drop extra eq permissions rather than raise an error, since these can now come about from lifetimes ending * changed lifetimesTheCouldProve so that it does not suggest ending a lifetime that has an lowned perm that needs to be proved * added list64_head_mut example to rust_data.rs * changed all ExprPerm manipulation to go through DistPerms * bug fix in solveForPermListImpl: changed it to apply the offsets that come from converting ExprPerms to DistPerms * whoops, last commit forgot erased the casts of the LHS and RHS permissions in solveForPermListImpl * changed proveNeededVars to also prove any permissions on variables y that occur as fieldsh(eq(y)) in shapes of block permissions that are needed * fixed up some comments --- heapster-saw/examples/rust_data.bc | Bin 277168 -> 277472 bytes heapster-saw/examples/rust_data.rs | 8 + heapster-saw/examples/rust_data.saw | 12 + .../src/Verifier/SAW/Heapster/CruUtil.hs | 13 + .../Verifier/SAW/Heapster/IRTTranslation.hs | 12 +- .../src/Verifier/SAW/Heapster/Implication.hs | 826 ++++++++------ .../src/Verifier/SAW/Heapster/Permissions.hs | 1011 ++++++++++------- .../src/Verifier/SAW/Heapster/RustTypes.hs | 136 +-- .../Verifier/SAW/Heapster/SAWTranslation.hs | 80 +- .../src/Verifier/SAW/Heapster/TypeChecker.hs | 27 +- .../Verifier/SAW/Heapster/TypedCrucible.hs | 29 +- 11 files changed, 1292 insertions(+), 862 deletions(-) diff --git a/heapster-saw/examples/rust_data.bc b/heapster-saw/examples/rust_data.bc index 45751b007a167ce9446274dbe614a24afec44acf..80a74acce427992ed8480b2cdbf9da44135af51a 100644 GIT binary patch delta 90143 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


=(kKk``F?js}E{af#pz}3_x3gB} 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

6b#HIl56JmPvo#DWsbV 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 U^hM-omhW`dx2=b(gU6r$1@%AM6951J diff --git a/heapster-saw/examples/rust_data.rs b/heapster-saw/examples/rust_data.rs index ae824cdd79..f50c96ef50 100644 --- a/heapster-saw/examples/rust_data.rs +++ b/heapster-saw/examples/rust_data.rs @@ -421,6 +421,14 @@ pub fn list64_sum(l:&List64) -> u64 { } } +/* Return a mutable reference to the head of a list, or None if it is empty */ +pub fn list64_head_mut <'a> (l:&'a mut List64) -> Option<&'a mut u64> { + match l { + List64::Nil64 => None, + List64::Cons64 (h,_) => Some (h), + } +} + /* Find an element in a List64 and return a mutable reference to it */ pub fn list64_find_mut <'a> (x:u64, l:&'a mut List64) -> Option<&'a mut u64> { match l { diff --git a/heapster-saw/examples/rust_data.saw b/heapster-saw/examples/rust_data.saw index 6464aceefa..8eba8ebcf1 100644 --- a/heapster-saw/examples/rust_data.saw +++ b/heapster-saw/examples/rust_data.saw @@ -596,6 +596,17 @@ list64_tail_sym <- heapster_find_symbol env "11list64_tail"; heapster_typecheck_fun_rename env list64_tail_sym "list64_tail" "<> fn (l:List64) -> Option"; +// list64_head_mut +list64_head_mut_sym <- heapster_find_symbol env "15list64_head_mut"; +heapster_typecheck_fun_rename env list64_head_mut_sym "list64_head_mut" + "<'a> fn (l:&'a mut List64) -> Option<&'a mut u64>"; + +// list64_find_mut +list64_find_mut_sym <- heapster_find_symbol env "15list64_find_mut"; +heapster_typecheck_fun_rename env list64_find_mut_sym "list64_find_mut" + "<'a> fn (x:u64, l:&'a mut List64) -> Option<&'a mut u64>"; + +/* hash_map_insert_gt_to_le_sym <- heapster_find_symbol env "hash_map_insert_gt_to_le"; heapster_typecheck_fun_rename env hash_map_insert_gt_to_le_sym @@ -628,6 +639,7 @@ heapster_set_translation_checks env false; list20_head_sym <- heapster_find_symbol env "11list20_head"; heapster_typecheck_fun_rename env list20_head_sym "list20_head" "<'a> fn (x:&'a List20>) -> &'a List"; +*/ /*** diff --git a/heapster-saw/src/Verifier/SAW/Heapster/CruUtil.hs b/heapster-saw/src/Verifier/SAW/Heapster/CruUtil.hs index 0b527541a6..bd52c55aa6 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/CruUtil.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/CruUtil.hs @@ -749,6 +749,19 @@ cruCtxReplicate n tp = | Some ctx <- cruCtxReplicate (predNat n) tp -> Some (CruCtxCons ctx tp) +-- | A representation of a context of types as a sequence of 'KnownRepr' +-- instances +-- +-- FIXME: this can go away when existentials take explicit 'TypeRepr's instead +-- of 'KnownRepr TypeRepr' instances, as per issue #79 +type KnownCruCtx = RAssign (KnownReprObj TypeRepr) + +-- | Convert a 'KnownCruCtx' to a 'CruCtx' +knownCtxToCruCtx :: KnownCruCtx ctx -> CruCtx ctx +knownCtxToCruCtx MNil = CruCtxNil +knownCtxToCruCtx (ctx :>: KnownReprObj) = + CruCtxCons (knownCtxToCruCtx ctx) knownRepr + ---------------------------------------------------------------------- -- * Misc Operations on Crucible Objects diff --git a/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs index 3745ad295d..bbf88f092e 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs @@ -154,8 +154,8 @@ instance ContainsIRTRecName (AtomicPerm a) where containsIRTRecName n (Perm_NamedConj _ args _) = containsIRTRecName n args containsIRTRecName n (Perm_LLVMFrame fperm) = containsIRTRecName n (map fst fperm) - containsIRTRecName _ (Perm_LOwned _ _ _) = False - containsIRTRecName _ (Perm_LOwnedSimple _) = False + containsIRTRecName _ (Perm_LOwned _ _ _ _ _) = False + containsIRTRecName _ (Perm_LOwnedSimple _ _) = False containsIRTRecName _ (Perm_LCurrent _) = False containsIRTRecName _ Perm_LFinished = False containsIRTRecName n (Perm_Struct ps) = containsIRTRecName n ps @@ -414,9 +414,9 @@ instance IRTTyVars (AtomicPerm a) where [nuMP| Perm_NamedConj npn args off |] -> namedPermIRTTyVars mb_p npn args off [nuMP| Perm_LLVMFrame _ |] -> return ([], IRTVarsNil) - [nuMP| Perm_LOwned _ _ _ |] -> + [nuMP| Perm_LOwned _ _ _ _ _ |] -> throwError "lowned permission in an IRT definition!" - [nuMP| Perm_LOwnedSimple _ |] -> + [nuMP| Perm_LOwnedSimple _ _ |] -> throwError "lowned permission in an IRT definition!" [nuMP| Perm_LCurrent _ |] -> return ([], IRTVarsNil) [nuMP| Perm_LFinished |] -> return ([], IRTVarsNil) @@ -664,9 +664,9 @@ instance IRTDescs (AtomicPerm a) where ([nuMP| Perm_NamedConj npn args off |], _) -> namedPermIRTDescs npn args off ixs ([nuMP| Perm_LLVMFrame _ |], _) -> return [] - ([nuMP| Perm_LOwned _ _ _ |], _) -> + ([nuMP| Perm_LOwned _ _ _ _ _ |], _) -> error "lowned permission made it to IRTDesc translation" - ([nuMP| Perm_LOwnedSimple _ |], _) -> + ([nuMP| Perm_LOwnedSimple _ _ |], _) -> error "lowned permission made it to IRTDesc translation" ([nuMP| Perm_LCurrent _ |], _) -> return [] ([nuMP| Perm_LFinished |], _) -> return [] diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index ea176e346c..d1608cef1a 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -69,28 +69,6 @@ import Unsafe.Coerce import Data.Functor.Constant (Constant(..)) --- * Helper functions (should be moved to Hobbits) - --- | Append two existentially quantified 'RAssign' lists -apSomeRAssign :: Some (RAssign f) -> Some (RAssign f) -> Some (RAssign f) -apSomeRAssign (Some x) (Some y) = Some (RL.append x y) - --- | Concatenate a list of existentially quantified 'RAssign' lists -concatSomeRAssign :: [Some (RAssign f)] -> Some (RAssign f) -concatSomeRAssign = foldl apSomeRAssign (Some MNil) --- foldl is intentional, appending RAssign matches on the second argument - --- | Map a monadic function over an 'RAssign' list from left to right while --- maintaining an "accumulator" that is threaded through the mapping -rlMapMWithAccum :: Monad m => (forall a. accum -> f a -> m (g a, accum)) -> - accum -> RAssign f tps -> m (RAssign g tps, accum) -rlMapMWithAccum _ accum MNil = return (MNil, accum) -rlMapMWithAccum f accum (xs :>: x) = - do (ys,accum') <- rlMapMWithAccum f accum xs - (y,accum'') <- f accum' x - return (ys :>: y, accum'') - - ---------------------------------------------------------------------- -- * Equality Proofs ---------------------------------------------------------------------- @@ -144,6 +122,10 @@ eqProofStepRHS (EqProofStep eq_perms f) = f (RL.map eqPermRHS eq_perms) eqProofStepPerms :: EqProofStep ps a -> DistPerms ps eqProofStepPerms (EqProofStep eq_perms _) = RL.map eqPermVarAndPerm eq_perms +-- | Get the equalities required by an 'EqProofStep' +eqProofStepEqs :: EqProofStep ps a -> RAssign EqPerm ps +eqProofStepEqs (EqProofStep eq_perms _) = eq_perms + instance Functor (EqProofStep ps) where fmap f (EqProofStep eq_perms g) = EqProofStep eq_perms (f . g) @@ -248,6 +230,12 @@ someEqProofRHS :: SomeEqProof a -> a someEqProofRHS (SomeEqProofRefl a) = a someEqProofRHS (SomeEqProofCons _ eq_step) = eqProofStepRHS eq_step +-- | Get all the equality permissions used by a 'SomeEqProof' +someEqProofEqs :: SomeEqProof a -> Some (RAssign EqPerm) +someEqProofEqs (SomeEqProofRefl _) = Some MNil +someEqProofEqs (SomeEqProofCons some_eqp eq_step) = + apSomeRAssign (Some $ eqProofStepEqs eq_step) (someEqProofEqs some_eqp) + -- | Get all the equality permissions used by a 'SomeEqProof' someEqProofPerms :: SomeEqProof a -> Some DistPerms someEqProofPerms (SomeEqProofRefl _) = Some MNil @@ -913,7 +901,8 @@ data SimplImpl ps_in ps_out where SImpl_SplitLifetime :: KnownRepr TypeRepr a => ExprVar a -> LifetimeFunctor args a -> PermExprs args -> PermExpr LifetimeType -> ExprVar LifetimeType -> - [PermExpr LifetimeType] -> LOwnedPerms ps_in -> LOwnedPerms ps_out -> + [PermExpr LifetimeType] -> CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> SimplImpl (RNil :> a :> LifetimeType :> LifetimeType) (RNil :> a :> LifetimeType) @@ -922,7 +911,8 @@ data SimplImpl ps_in ps_out where -- -- > l1:lowned[ls] (ps_in -o ps_out) -o l1:lowned[l2,ls] (ps_in -o ps_out) SImpl_SubsumeLifetime :: ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> PermExpr LifetimeType -> SimplImpl (RNil :> LifetimeType) (RNil :> LifetimeType) @@ -933,7 +923,8 @@ data SimplImpl ps_in ps_out where -- > -o l1:[l2]lcurrent * l1:lowned[ls1,l2,ls2] (ps_in -o ps_out) SImpl_ContainedLifetimeCurrent :: ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> PermExpr LifetimeType -> SimplImpl (RNil :> LifetimeType) (RNil :> LifetimeType :> LifetimeType) @@ -944,7 +935,8 @@ data SimplImpl ps_in ps_out where -- > -o l1:lowned[ls1,ls2] (ps_in -o ps_out) SImpl_RemoveContainedLifetime :: ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> ExprVar LifetimeType -> SimplImpl (RNil :> LifetimeType :> LifetimeType) @@ -968,8 +960,8 @@ data SimplImpl ps_in ps_out where -- > Ps1 * Ps2 * l:lowned [ls](Ps_in -o Ps_out) -o l:lowned[ls] (Ps_in' -o Ps_out') SImpl_MapLifetime :: ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> - LOwnedPerms ps_in' -> LOwnedPerms ps_out' -> + CruCtx ps_in -> CruCtx ps_out -> ExprPerms ps_in -> ExprPerms ps_out -> + CruCtx ps_in' -> CruCtx ps_out' -> ExprPerms ps_in' -> ExprPerms ps_out' -> DistPerms ps1 -> DistPerms ps2 -> LocalPermImpl (ps1 :++: ps_in') ps_in -> LocalPermImpl (ps2 :++: ps_out) ps_out' -> @@ -982,7 +974,8 @@ data SimplImpl ps_in ps_out where -- -- > ps_in * l:lowned (ps_in -o ps_out) -o ps_out * l:lfinished SImpl_EndLifetime :: ExprVar LifetimeType -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> SimplImpl (ps_in :> LifetimeType) (ps_out :> LifetimeType) @@ -991,7 +984,7 @@ data SimplImpl ps_in ps_out where -- -- > ps * l:lowned(empty -o empty) -o [l]ps * l:lowned(ps) SImpl_IntroLOwnedSimple :: - ExprVar LifetimeType -> LOwnedPerms ps -> + ExprVar LifetimeType -> CruCtx ps -> ExprPerms ps -> SimplImpl (ps :> LifetimeType) (ps :> LifetimeType) -- | Eliminate a simple @lowned(ps)@ permission into standard @lowned@ @@ -999,7 +992,7 @@ data SimplImpl ps_in ps_out where -- -- > l:lowned(ps) -o l:lowned([l](R)ps -o ps) SImpl_ElimLOwnedSimple :: - ExprVar LifetimeType -> LOwnedPerms ps -> + ExprVar LifetimeType -> CruCtx ps -> ExprPerms ps -> SimplImpl (RNil :> LifetimeType) (RNil :> LifetimeType) -- | Reflexivity for @lcurrent@ proofs: @@ -1435,7 +1428,7 @@ data PermImpl1 ps_in ps_outs where -- -- > x:memblock(rw,l,off,len,sh) -- > -o y. x:memblock(rw,l,off,len,eqsh(len,y)), - -- > y:shape('modalizeShape'(rw,l,sh)) + -- > y:shape('modalize'(rw,l,sh)) Impl1_ElimLLVMBlockToEq :: (1 <= w, KnownNat w) => ExprVar (LLVMPointerType w) -> LLVMBlockPerm w -> PermImpl1 (ps :> LLVMPointerType w) @@ -1994,43 +1987,44 @@ simplImplIn (SImpl_LLVMArrayIsPtr x ap) = distPerms1 x (ValPerm_Conj [Perm_LLVMArray ap]) simplImplIn (SImpl_LLVMBlockIsPtr x bp) = distPerms1 x (ValPerm_Conj [Perm_LLVMBlock bp]) -simplImplIn (SImpl_SplitLifetime x f args l l2 sub_ls ps_in ps_out) = +simplImplIn (SImpl_SplitLifetime x f args l l2 sub_ls tps_in tps_out ps_in ps_out) = -- If l=always then the second permission is l2:true let (l',l'_p) = lcurrentPerm l l2 in distPerms3 x (ltFuncApply f args l) l' l'_p - l2 (ValPerm_LOwned sub_ls ps_in ps_out) -simplImplIn (SImpl_SubsumeLifetime l ls ps_in ps_out _) = - distPerms1 l (ValPerm_LOwned ls ps_in ps_out) -simplImplIn (SImpl_ContainedLifetimeCurrent l ls ps_in ps_out l2) = + l2 (ValPerm_LOwned sub_ls tps_in tps_out ps_in ps_out) +simplImplIn (SImpl_SubsumeLifetime l ls tps_in tps_out ps_in ps_out _) = + distPerms1 l (ValPerm_LOwned ls tps_in tps_out ps_in ps_out) +simplImplIn (SImpl_ContainedLifetimeCurrent l ls tps_in tps_out ps_in ps_out l2) = if elem l2 ls then - distPerms1 l (ValPerm_LOwned ls ps_in ps_out) + distPerms1 l (ValPerm_LOwned ls tps_in tps_out ps_in ps_out) else error ("simplImplIn: SImpl_ContainedLifetimeCurrent: " ++ "lifetime not in contained lifetimes") -simplImplIn (SImpl_RemoveContainedLifetime l ls ps_in ps_out l2) = +simplImplIn (SImpl_RemoveContainedLifetime l ls tps_in tps_out ps_in ps_out l2) = if elem (PExpr_Var l2) ls then - distPerms2 l (ValPerm_LOwned ls ps_in ps_out) l2 ValPerm_LFinished + distPerms2 l (ValPerm_LOwned ls tps_in tps_out ps_in ps_out) l2 ValPerm_LFinished else error ("simplImplIn: SImpl_RemoveContainedLifetime: " ++ "lifetime not in contained lifetimes") simplImplIn (SImpl_WeakenLifetime x f args l l2) = let (l',l'_p) = lcurrentPerm l l2 in distPerms2 x (ltFuncApply f args l) l' l'_p -simplImplIn (SImpl_MapLifetime l ls ps_in ps_out _ _ ps1 ps2 _ _) = - RL.append ps1 $ DistPermsCons ps2 l $ ValPerm_LOwned ls ps_in ps_out -simplImplIn (SImpl_EndLifetime l ps_in ps_out) = - case lownedPermsToDistPerms ps_in of +simplImplIn (SImpl_MapLifetime l ls tps_in tps_out ps_in ps_out _ _ _ _ ps1 ps2 _ _) = + RL.append ps1 $ DistPermsCons ps2 l $ + ValPerm_LOwned ls tps_in tps_out ps_in ps_out +simplImplIn (SImpl_EndLifetime l tps_in tps_out ps_in ps_out) = + case exprPermsToDistPerms ps_in of Just perms_in -> - DistPermsCons perms_in l $ ValPerm_LOwned [] ps_in ps_out + DistPermsCons perms_in l $ ValPerm_LOwned [] tps_in tps_out ps_in ps_out Nothing -> error "simplImplIn: SImpl_EndLifetime: non-variables in input permissions" -simplImplIn (SImpl_IntroLOwnedSimple l lops) = - case lownedPermsToDistPerms lops of - Just dps -> DistPermsCons dps l (ValPerm_LOwned [] MNil MNil) +simplImplIn (SImpl_IntroLOwnedSimple l _ lops) = + case exprPermsToDistPerms lops of + Just dps -> DistPermsCons dps l (ValPerm_LOwned [] CruCtxNil CruCtxNil MNil MNil) Nothing -> error "simplImplIn: SImpl_IntroLOwnedSimple: malformed permissions list" -simplImplIn (SImpl_ElimLOwnedSimple l lops) = - distPerms1 l (ValPerm_LOwnedSimple lops) +simplImplIn (SImpl_ElimLOwnedSimple l tps lops) = + distPerms1 l (ValPerm_LOwnedSimple tps lops) simplImplIn (SImpl_LCurrentRefl _) = DistPermsNil simplImplIn (SImpl_LCurrentTrans l1 l2 l3) = distPerms2 l1 (ValPerm_LCurrent $ PExpr_Var l2) l2 (ValPerm_LCurrent l3) @@ -2349,42 +2343,52 @@ simplImplOut (SImpl_LLVMArrayIsPtr x ap) = simplImplOut (SImpl_LLVMBlockIsPtr x bp) = distPerms2 x (ValPerm_Conj1 Perm_IsLLVMPtr) x (ValPerm_Conj [Perm_LLVMBlock bp]) -simplImplOut (SImpl_SplitLifetime x f args l l2 sub_ls ps_in ps_out) = +simplImplOut (SImpl_SplitLifetime x f args l l2 sub_ls tps_in tps_out ps_in ps_out) = distPerms2 x (ltFuncApply f args $ PExpr_Var l2) l2 (ValPerm_LOwned sub_ls - (RL.append (MNil :>: ltFuncMinApplyLOP x f (PExpr_Var l2)) ps_in) - (RL.append (MNil :>: ltFuncApplyLOP x f args l) ps_out)) -simplImplOut (SImpl_SubsumeLifetime l ls ps_in ps_out l2) = - distPerms1 l (ValPerm_LOwned (l2:ls) ps_in ps_out) -simplImplOut (SImpl_ContainedLifetimeCurrent l ls ps_in ps_out l2) = + (appendCruCtx (singletonCruCtx $ exprType x) tps_in) + (appendCruCtx (singletonCruCtx $ exprType x) tps_out) + (RL.append (MNil :>: + ExprAndPerm (PExpr_Var x) + (ltFuncMinApply f (PExpr_Var l2))) ps_in) + (RL.append (MNil :>: + ExprAndPerm (PExpr_Var x) + (ltFuncApply f args l)) ps_out)) +simplImplOut (SImpl_SubsumeLifetime l ls tps_in tps_out ps_in ps_out l2) = + distPerms1 l (ValPerm_LOwned (l2:ls) tps_in tps_out ps_in ps_out) +simplImplOut (SImpl_ContainedLifetimeCurrent l ls tps_in tps_out ps_in ps_out l2) = if elem l2 ls then - distPerms2 l (ValPerm_LCurrent l2) l (ValPerm_LOwned ls ps_in ps_out) + distPerms2 l (ValPerm_LCurrent l2) + l (ValPerm_LOwned ls tps_in tps_out ps_in ps_out) else error ("simplImplOut: SImpl_ContainedLifetimeCurrent: " ++ "lifetime not in contained lifetimes") -simplImplOut (SImpl_RemoveContainedLifetime l ls ps_in ps_out l2) = +simplImplOut (SImpl_RemoveContainedLifetime l ls tps_in tps_out ps_in ps_out l2) = if elem (PExpr_Var l2) ls then - distPerms1 l (ValPerm_LOwned (delete (PExpr_Var l2) ls) ps_in ps_out) + distPerms1 l (ValPerm_LOwned (delete (PExpr_Var l2) ls) + tps_in tps_out ps_in ps_out) else error ("simplImplOut: SImpl_RemoveContainedLifetime: " ++ "lifetime not in contained lifetimes") simplImplOut (SImpl_WeakenLifetime x f args _ l2) = distPerms1 x (ltFuncApply f args $ PExpr_Var l2) -simplImplOut (SImpl_MapLifetime l ls _ _ ps_in' ps_out' _ _ _ _) = - distPerms1 l $ ValPerm_LOwned ls ps_in' ps_out' -simplImplOut (SImpl_EndLifetime l _ ps_out) = - case lownedPermsToDistPerms ps_out of +simplImplOut (SImpl_MapLifetime l ls _ _ _ _ tps_in' tps_out' ps_in' ps_out' _ _ _ _) = + distPerms1 l $ ValPerm_LOwned ls tps_in' tps_out' ps_in' ps_out' +simplImplOut (SImpl_EndLifetime l _ _ _ ps_out) = + case exprPermsToDistPerms ps_out of Just perms_out -> DistPermsCons perms_out l ValPerm_LFinished _ -> error "simplImplOut: SImpl_EndLifetime: non-variable in output permissions" -simplImplOut (SImpl_IntroLOwnedSimple l lops) = - case lownedPermsToDistPerms (modalizeLOwnedPerms - Nothing (Just (PExpr_Var l)) lops) of - Just dps -> DistPermsCons dps l $ ValPerm_LOwnedSimple lops +simplImplOut (SImpl_IntroLOwnedSimple l tps lops) = + case modalize Nothing (Just (PExpr_Var l)) lops >>= exprPermsToDistPerms of + Just dps -> DistPermsCons dps l $ ValPerm_LOwnedSimple tps lops Nothing -> error "simplImplOut: SImpl_IntroLOwnedSimple: non-variables in permission list" -simplImplOut (SImpl_ElimLOwnedSimple l lops) = - distPerms1 l (ValPerm_LOwned [] (lownedPermsSimpleIn l lops) lops) +simplImplOut (SImpl_ElimLOwnedSimple l tps lops) = + case lownedPermsSimpleIn l lops of + Just lops' -> distPerms1 l (ValPerm_LOwned [] tps tps lops' lops) + Nothing -> + error "simplImplOut: SImpl_ElimLOwnedSimple: could not modalize permission list" simplImplOut (SImpl_LCurrentRefl l) = distPerms1 l (ValPerm_LCurrent $ PExpr_Var l) simplImplOut (SImpl_LCurrentTrans l1 _ l3) = @@ -2679,7 +2683,8 @@ applyImpl1 _ (Impl1_ConcatLLVMWordFields x fp1 e2 endianness) ps = else error "applyImpl1: Impl1_ConcatLLVMWordField: unexpected input permissions" applyImpl1 _ Impl1_BeginLifetime ps = - mbPermSets1 $ nu $ \l -> pushPerm l (ValPerm_LOwned [] MNil MNil) ps + mbPermSets1 $ nu $ \l -> + pushPerm l (ValPerm_LOwned [] CruCtxNil CruCtxNil MNil MNil) ps applyImpl1 _ (Impl1_TryProveBVProp x prop _) ps = mbPermSets1 $ emptyMb $ pushPerm x (ValPerm_Conj [Perm_BVProp prop]) ps @@ -2910,40 +2915,50 @@ instance SubstVar PermVarSubst m => SImpl_LLVMArrayIsPtr <$> genSubst s x <*> genSubst s ap [nuMP| SImpl_LLVMBlockIsPtr x bp |] -> SImpl_LLVMBlockIsPtr <$> genSubst s x <*> genSubst s bp - [nuMP| SImpl_SplitLifetime x f args l l2 sub_ls ps_in ps_out |] -> + [nuMP| SImpl_SplitLifetime x f args l l2 sub_ls tps_in tps_out ps_in ps_out |] -> SImpl_SplitLifetime <$> genSubst s x <*> genSubst s f <*> genSubst s args <*> genSubst s l <*> genSubst s l2 <*> genSubst s sub_ls + <*> genSubst s tps_in <*> genSubst s tps_out <*> genSubst s ps_in <*> genSubst s ps_out - [nuMP| SImpl_SubsumeLifetime l ls ps_in ps_out l2 |] -> + [nuMP| SImpl_SubsumeLifetime l ls tps_in tps_out ps_in ps_out l2 |] -> SImpl_SubsumeLifetime <$> genSubst s l <*> genSubst s ls + <*> genSubst s tps_in <*> genSubst s tps_out <*> genSubst s ps_in <*> genSubst s ps_out <*> genSubst s l2 - [nuMP| SImpl_ContainedLifetimeCurrent l ls ps_in ps_out l2 |] -> + [nuMP| SImpl_ContainedLifetimeCurrent l ls tps_in tps_out ps_in ps_out l2 |] -> SImpl_ContainedLifetimeCurrent <$> genSubst s l <*> genSubst s ls + <*> genSubst s tps_in <*> genSubst s tps_out <*> genSubst s ps_in <*> genSubst s ps_out <*> genSubst s l2 - [nuMP| SImpl_RemoveContainedLifetime l ls ps_in ps_out l2 |] -> + [nuMP| SImpl_RemoveContainedLifetime l ls tps_in tps_out ps_in ps_out l2 |] -> SImpl_RemoveContainedLifetime <$> genSubst s l <*> genSubst s ls + <*> genSubst s tps_in <*> genSubst s tps_out <*> genSubst s ps_in <*> genSubst s ps_out <*> genSubst s l2 [nuMP| SImpl_WeakenLifetime x f args l l2 |] -> SImpl_WeakenLifetime <$> genSubst s x <*> genSubst s f <*> genSubst s args <*> genSubst s l <*> genSubst s l2 - [nuMP| SImpl_MapLifetime l ls ps_in ps_out ps_in' ps_out' - ps1 ps2 impl1 impl2 |] -> - SImpl_MapLifetime <$> genSubst s l <*> genSubst s ls <*> genSubst s ps_in - <*> genSubst s ps_out <*> genSubst s ps_in' - <*> genSubst s ps_out' <*> genSubst s ps1 - <*> genSubst s ps2 <*> genSubst s impl1 - <*> genSubst s impl2 - [nuMP| SImpl_EndLifetime l ps_in ps_out |] -> - SImpl_EndLifetime <$> genSubst s l <*> genSubst s ps_in - <*> genSubst s ps_out - [nuMP| SImpl_IntroLOwnedSimple l lops |] -> - SImpl_IntroLOwnedSimple <$> genSubst s l <*> genSubst s lops - [nuMP| SImpl_ElimLOwnedSimple l lops |] -> - SImpl_ElimLOwnedSimple <$> genSubst s l <*> genSubst s lops + [nuMP| SImpl_MapLifetime l ls tps_in tps_out ps_in ps_out + tps_in' tps_out' ps_in' ps_out' + ps1 ps2 impl1 impl2 |] -> + SImpl_MapLifetime <$> genSubst s l <*> genSubst s ls + <*> genSubst s tps_in <*> genSubst s tps_out + <*> genSubst s ps_in <*> genSubst s ps_out + <*> genSubst s tps_in' <*> genSubst s tps_out' + <*> genSubst s ps_in' <*> genSubst s ps_out' + <*> genSubst s ps1 <*> genSubst s ps2 + <*> genSubst s impl1 <*> genSubst s impl2 + [nuMP| SImpl_EndLifetime l tps_in tps_out ps_in ps_out |] -> + SImpl_EndLifetime <$> genSubst s l + <*> genSubst s tps_in <*> genSubst s tps_out + <*> genSubst s ps_in <*> genSubst s ps_out + [nuMP| SImpl_IntroLOwnedSimple l tps lops |] -> + SImpl_IntroLOwnedSimple <$> genSubst s l + <*> genSubst s tps <*> genSubst s lops + [nuMP| SImpl_ElimLOwnedSimple l tps lops |] -> + SImpl_ElimLOwnedSimple <$> genSubst s l + <*> genSubst s tps <*> genSubst s lops [nuMP| SImpl_LCurrentRefl l |] -> SImpl_LCurrentRefl <$> genSubst s l [nuMP| SImpl_LCurrentTrans l1 l2 l3 |] -> @@ -3295,11 +3310,15 @@ getExVarType memb = getPSubst :: ImplM vars s r ps ps (PartialSubst vars) getPSubst = use implStatePSubst +-- | Get phantom arguments for the current existential variables +getVarProxies :: ImplM vars s r ps ps (RAssign Proxy vars) +getVarProxies = uses implStateVars cruCtxProxies + -- | Add a multi-binding for the current existential variables around a value -- (that does not use those variables) mbVarsM :: a -> ImplM vars s r ps ps (Mb vars a) mbVarsM a = - do px <- uses implStateVars cruCtxProxies + do px <- getVarProxies pure (mbPure px a) -- | Build a multi-binding for the current existential variables using a @@ -3309,7 +3328,7 @@ mbSubstM :: ((forall a. Substable PermVarSubst a Identity => Mb vars a -> a) -> b) -> ImplM vars s r ps ps (Mb vars b) mbSubstM f = - do vars <- uses implStateVars cruCtxProxies + do vars <- getVarProxies return (nuMulti vars $ \ns -> f (varSubst $ permVarSubstOfNames ns)) @@ -3337,7 +3356,7 @@ modifyPSubst f = implStatePSubst %= f -- raising an error if it is already set setVarM :: Member vars a -> PermExpr a -> ImplM vars s r ps ps () setVarM memb e = - do vars <- uses implStateVars cruCtxProxies + do vars <- getVarProxies _ <- implTraceM (\i -> pretty "Setting" <+> permPretty i (nuMulti vars $ \ns -> RL.get memb ns) <+> pretty "=" <+> permPretty i e) @@ -3454,6 +3473,10 @@ getAtomicPerms x = getPerm x >>= \case getDistPerms :: ImplM vars s r ps ps (DistPerms ps) getDistPerms = use (implStatePerms . distPerms) +-- | Get ghost arguments to represent the current stack at the type level +getDistPermsProxies :: ImplM vars s r ps ps (RAssign Proxy ps) +getDistPermsProxies = RL.map (const Proxy) <$> getDistPerms + -- | Get the top permission in the stack getTopDistPerm :: ExprVar a -> ImplM vars s r (ps :> a) (ps :> a) (ValuePerm a) getTopDistPerm x = use (implStatePerms . topDistPerm x) @@ -3467,8 +3490,8 @@ getTopDistPerms ps1 ps2 = snd <$> RL.split ps1 ps2 <$> getDistPerms implFindLOwnedPerms :: ImplM vars s r ps ps [(ExprVar LifetimeType, ValuePerm LifetimeType)] implFindLOwnedPerms = - mapMaybe (\case NameAndElem l p@(ValPerm_LOwned _ _ _) -> Just (l,p) - NameAndElem l p@(ValPerm_LOwnedSimple _) -> Just (l,p) + mapMaybe (\case NameAndElem l p@(ValPerm_LOwned _ _ _ _ _) -> Just (l,p) + NameAndElem l p@(ValPerm_LOwnedSimple _ _) -> Just (l,p) _ -> Nothing) <$> NameMap.assocs <$> view varPermMap <$> getPerms @@ -4545,7 +4568,7 @@ implBeginLifetimeM :: NuMatchingAny1 r => implBeginLifetimeM = implApplyImpl1 Impl1_BeginLifetime (MNil :>: Impl1Cont (\(_ :>: n) -> pure n)) >>>= \l -> - recombinePerm l (ValPerm_LOwned [] MNil MNil) >>> + recombinePerm l (ValPerm_LOwned [] CruCtxNil CruCtxNil MNil MNil) >>> implTraceM (\i -> pretty "Beginning lifetime:" <+> permPretty i l) >>> pure l @@ -4557,15 +4580,18 @@ implBeginLifetimeM = -- Recombine all the returned permissions @ps_out@ and @l:lfinished@ returned by -- ending @l@, leaving just @ps@ on the stack. implEndLifetimeM :: NuMatchingAny1 r => Proxy ps -> ExprVar LifetimeType -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> ImplM vars s r ps (ps :++: ps_in :> LifetimeType) () -implEndLifetimeM ps l ps_in ps_out@(lownedPermsToDistPerms -> Just dps_out) - | isJust (lownedPermsToDistPerms ps_in) = - implSimplM ps (SImpl_EndLifetime l ps_in ps_out) >>> +implEndLifetimeM ps l tps_in tps_out ps_in ps_out + | Just dps_out <- exprPermsToDistPerms ps_out + , isJust (exprPermsToDistPerms ps_in) = + implSimplM ps (SImpl_EndLifetime l tps_in tps_out ps_in ps_out) >>> implTraceM (\i -> pretty "Ending lifetime:" <+> permPretty i l) >>> implDropLifetimePermsM l >>> recombinePermsPartial ps (DistPermsCons dps_out l ValPerm_LFinished) -implEndLifetimeM _ _ _ _ = implFailM "implEndLifetimeM: lownedPermsToDistPerms" +implEndLifetimeM _ _ _ _ _ _ = + implFailM "implEndLifetimeM: exprPermsToDistPerms" -- | Drop any permissions of the form @x:[l]p@ in the primary permissions for -- @x@, which are supplied as an argument @@ -4605,15 +4631,17 @@ implSplitLifetimeM :: (KnownRepr TypeRepr a, NuMatchingAny1 r) => ExprVar a -> LifetimeFunctor args a -> PermExprs args -> PermExpr LifetimeType -> ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> ImplM vars s r (ps :> a) (ps :> a :> LifetimeType :> LifetimeType) () -implSplitLifetimeM x f args l l2 sub_ls ps_in ps_out = +implSplitLifetimeM x f args l l2 sub_ls tps_in tps_out ps_in ps_out = implTraceM (\i -> sep [pretty "Splitting lifetime to" <+> permPretty i l2 <> colon, permPretty i x <> colon <> permPretty i (ltFuncMinApply f l)]) >>> - implSimplM Proxy (SImpl_SplitLifetime x f args l l2 sub_ls ps_in ps_out) >>> + implSimplM Proxy (SImpl_SplitLifetime x f args l l2 + sub_ls tps_in tps_out ps_in ps_out) >>> getTopDistPerm l2 >>>= recombinePerm l2 @@ -4623,12 +4651,13 @@ implSplitLifetimeM x f args l l2 sub_ls ps_in ps_out = -- permission with @l1:lowned[l2,ls] (ps_in1 -o ps_out1)@. implSubsumeLifetimeM :: NuMatchingAny1 r => ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> PermExpr LifetimeType -> ImplM vars s r (ps :> LifetimeType) (ps :> LifetimeType) () -implSubsumeLifetimeM l ls ps_in ps_out l2 = - implSimplM Proxy (SImpl_SubsumeLifetime l ls ps_in ps_out l2) +implSubsumeLifetimeM l ls tps_in tps_out ps_in ps_out l2 = + implSimplM Proxy (SImpl_SubsumeLifetime l ls tps_in tps_out ps_in ps_out l2) -- | Prove a lifetime @l@ is current during a lifetime @l2@ it contains, @@ -4639,13 +4668,15 @@ implSubsumeLifetimeM l ls ps_in ps_out l2 = -- is on top of the stack, and replacing it with @l1:[l2]lcurrent@. implContainedLifetimeCurrentM :: NuMatchingAny1 r => ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> PermExpr LifetimeType -> ImplM vars s r (ps :> LifetimeType) (ps :> LifetimeType) () -implContainedLifetimeCurrentM l ls ps_in ps_out l2 = - implSimplM Proxy (SImpl_ContainedLifetimeCurrent l ls ps_in ps_out l2) >>> - recombinePerm l (ValPerm_LOwned ls ps_in ps_out) +implContainedLifetimeCurrentM l ls tps_in tps_out ps_in ps_out l2 = + implSimplM Proxy (SImpl_ContainedLifetimeCurrent + l ls tps_in tps_out ps_in ps_out l2) >>> + recombinePerm l (ValPerm_LOwned ls tps_in tps_out ps_in ps_out) -- | Remove a finshed contained lifetime from an @lowned@ permission. Assume the @@ -4658,13 +4689,16 @@ implContainedLifetimeCurrentM l ls ps_in ps_out l2 = -- on @l1@ off of the stack. implRemoveContainedLifetimeM :: NuMatchingAny1 r => ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> ExprVar LifetimeType -> ImplM vars s r ps (ps :> LifetimeType :> LifetimeType) () -implRemoveContainedLifetimeM l ls ps_in ps_out l2 = - implSimplM Proxy (SImpl_RemoveContainedLifetime l ls ps_in ps_out l2) >>> - recombinePerm l (ValPerm_LOwned (delete (PExpr_Var l2) ls) ps_in ps_out) +implRemoveContainedLifetimeM l ls tps_in tps_out ps_in ps_out l2 = + implSimplM Proxy (SImpl_RemoveContainedLifetime + l ls tps_in tps_out ps_in ps_out l2) >>> + recombinePerm l (ValPerm_LOwned (delete (PExpr_Var l2) ls) + tps_in tps_out ps_in ps_out) -- | Find all lifetimes that we currently own which could, if ended, help prove @@ -4674,14 +4708,17 @@ lifetimesThatCouldProve :: NuMatchingAny1 r => Mb vars (DistPerms ps') -> AtomicPerm LifetimeType)] lifetimesThatCouldProve mb_ps = do Some all_perms <- uses implStatePerms permSetAllVarPerms + let needed_ls = lownedsInMbDistPerms mb_ps pure (RL.foldr (\case - VarAndPerm l (ValPerm_LOwned ls ps_in ps_out) - | mbLift $ fmap (lownedPermsCouldProve ps_out) mb_ps -> - ((l, Perm_LOwned ls ps_in ps_out) :) - VarAndPerm l (ValPerm_LOwnedSimple ps) - | mbLift $ fmap (lownedPermsCouldProve ps) mb_ps -> - ((l, Perm_LOwnedSimple ps) :) + VarAndPerm l (ValPerm_LOwned ls tps_in tps_out ps_in ps_out) + | notElem l needed_ls + , mbLift $ fmap (lownedPermsCouldProve ps_out) mb_ps -> + ((l, Perm_LOwned ls tps_in tps_out ps_in ps_out) :) + VarAndPerm l (ValPerm_LOwnedSimple tps ps) + | notElem l needed_ls + , mbLift $ fmap (lownedPermsCouldProve ps) mb_ps -> + ((l, Perm_LOwnedSimple tps ps) :) _ -> id) [] all_perms) @@ -5390,10 +5427,10 @@ getLifetimeCurrentPerms :: NuMatchingAny1 r => PermExpr LifetimeType -> getLifetimeCurrentPerms PExpr_Always = pure $ Some AlwaysCurrentPerms getLifetimeCurrentPerms (PExpr_Var l) = getPerm l >>= \case - ValPerm_LOwned ls ps_in ps_out -> - pure $ Some $ LOwnedCurrentPerms l ls ps_in ps_out - ValPerm_LOwnedSimple ps -> - pure $ Some $ LOwnedSimpleCurrentPerms l ps + ValPerm_LOwned ls tps_in tps_out ps_in ps_out -> + pure $ Some $ LOwnedCurrentPerms l ls tps_in tps_out ps_in ps_out + ValPerm_LOwnedSimple tps ps -> + pure $ Some $ LOwnedSimpleCurrentPerms l tps ps ValPerm_LCurrent l' -> getLifetimeCurrentPerms l' >>= \some_cur_perms -> case some_cur_perms of @@ -5407,10 +5444,10 @@ getLifetimeCurrentPerms (PExpr_Var l) = proveLifetimeCurrent :: NuMatchingAny1 r => LifetimeCurrentPerms ps_l -> ImplM vars s r (ps :++: ps_l) ps () proveLifetimeCurrent AlwaysCurrentPerms = pure () -proveLifetimeCurrent (LOwnedCurrentPerms l ls ps_in ps_out) = - implPushM l (ValPerm_LOwned ls ps_in ps_out) -proveLifetimeCurrent (LOwnedSimpleCurrentPerms l ps) = - implPushM l (ValPerm_LOwnedSimple ps) +proveLifetimeCurrent (LOwnedCurrentPerms l ls tps_in tps_out ps_in ps_out) = + implPushM l (ValPerm_LOwned ls tps_in tps_out ps_in ps_out) +proveLifetimeCurrent (LOwnedSimpleCurrentPerms l tps ps) = + implPushM l (ValPerm_LOwnedSimple tps ps) proveLifetimeCurrent (CurrentTransPerms cur_perms l) = proveLifetimeCurrent cur_perms >>> let l' = lifetimeCurrentPermsLifetime cur_perms @@ -5458,19 +5495,24 @@ recombinePermExpl x x_p p = -- | This is the implementation of 'recombinePermExpl'; see the documentation -- for that function for details -recombinePerm' :: HasCallStack => NuMatchingAny1 r => ExprVar a -> ValuePerm a -> ValuePerm a -> +recombinePerm' :: HasCallStack => NuMatchingAny1 r => + ExprVar a -> ValuePerm a -> ValuePerm a -> ImplM vars s r as (as :> a) () recombinePerm' x _ p@ValPerm_True = implDropM x p recombinePerm' x _ ValPerm_False = implElimFalseM x recombinePerm' x _ p@(ValPerm_Eq (PExpr_Var y)) | y == x = implDropM x p recombinePerm' x ValPerm_True (ValPerm_Eq e) = simplEqPerm x e >>>= \e' -> implPopM x (ValPerm_Eq e') -recombinePerm' x x_p (ValPerm_LOwnedSimple lops) = - -- If p is a simple lowned permission, eliminate it - -- FIXME: do we want to do this? If not, we need more subtle rules for proving - -- simple lowned permissions, and probably widening support for it too... - implSimplM Proxy (SImpl_ElimLOwnedSimple x lops) >>> - recombinePerm' x x_p (ValPerm_LOwned [] (lownedPermsSimpleIn x lops) lops) +recombinePerm' x x_p (ValPerm_LOwnedSimple tps lops) = + case lownedPermsSimpleIn x lops of + Just ps_simple -> + -- If p is a simple lowned permission, eliminate it + -- FIXME: do we want to do this? If not, we need more subtle rules for proving + -- simple lowned permissions, and probably widening support for it too... + implSimplM Proxy (SImpl_ElimLOwnedSimple x tps lops) >>> + recombinePerm' x x_p (ValPerm_LOwned [] tps tps ps_simple lops) + Nothing -> + error "recombinePerm: cannot compute input permissions for simple lowned permission" recombinePerm' x ValPerm_True p = implPopM x p recombinePerm' x (ValPerm_Eq (PExpr_Var y)) _ | y == x = error "recombinePerm: variable x has permission eq(x)!" @@ -5480,28 +5522,26 @@ recombinePerm' x x_p@(ValPerm_Eq (PExpr_Var y)) p = implPushCopyM x x_p >>> invertEqM x y >>> implSwapM x p y (ValPerm_Eq (PExpr_Var x)) >>> introCastM y x p >>> getPerm y >>>= \y_p -> recombinePermExpl y y_p p -recombinePerm' x x_p@(ValPerm_Eq (PExpr_LLVMOffset y off)) (ValPerm_Conj ps) = +recombinePerm' x x_p@(ValPerm_Eq (PExpr_LLVMOffset y off)) p = implPushCopyM x x_p >>> implSimplM Proxy (SImpl_InvertLLVMOffsetEq x off y) >>> - implSwapM x (ValPerm_Conj ps) y (ValPerm_Eq - (PExpr_LLVMOffset x (bvNegate off))) >>> - castLLVMPtrM x (ValPerm_Conj ps) (bvNegate off) y >>> + implSwapM x p y (ValPerm_Eq (PExpr_LLVMOffset x (bvNegate off))) >>> + castLLVMPtrM x p (bvNegate off) y >>> getPerm y >>>= \y_p -> - recombinePermExpl y y_p (ValPerm_Conj $ mapMaybe (offsetLLVMAtomicPerm off) ps) + recombinePermExpl y y_p (offsetLLVMPerm off p) recombinePerm' x _p p'@(ValPerm_Eq PExpr_Unit) = -- When trying to combine a permission x:eq(()), just drop this permission implDropM x p' recombinePerm' x p p'@(ValPerm_Eq _) = -- NOTE: we could handle this by swapping the stack with the variable perm and -- calling recombinePerm again, but this could potentially create permission - -- equality cycles with, e.g., x:eq(y) * y:eq(x). Plus, we don't expect any - -- functions or typed instructions to return equality permissions unless it is - -- for a new, fresh variable, in which case the above cases will handle it + -- equality cycles with, e.g., x:eq(y) * y:eq(x). So instead we just drop the + -- new equality permission. implTraceM (\i -> pretty "recombinePerm: unexpected equality permission being recombined" <> softline <> permPretty i x <+> colon <+> permPretty i p <+> pretty "<-" <+> permPretty i p') >>> - error "recombinePerm: unexpected equality permission being recombined" + implDropM x p' recombinePerm' x x_p (ValPerm_Or _ _) = elimOrsExistsM x >>>= \p' -> recombinePermExpl x x_p p' recombinePerm' x x_p (ValPerm_Exists _) = @@ -5642,10 +5682,10 @@ recombineLifetimeCurrentPerms :: HasCallStack => NuMatchingAny1 r => LifetimeCurrentPerms ps_l -> ImplM vars s r ps (ps :++: ps_l) () recombineLifetimeCurrentPerms AlwaysCurrentPerms = pure () -recombineLifetimeCurrentPerms (LOwnedCurrentPerms l ls ps_in ps_out) = - recombinePermExpl l ValPerm_True (ValPerm_LOwned ls ps_in ps_out) -recombineLifetimeCurrentPerms (LOwnedSimpleCurrentPerms l ps) = - recombinePermExpl l ValPerm_True (ValPerm_LOwnedSimple ps) +recombineLifetimeCurrentPerms (LOwnedCurrentPerms l ls tps_in tps_out ps_in ps_out) = + recombinePermExpl l ValPerm_True (ValPerm_LOwned ls tps_in tps_out ps_in ps_out) +recombineLifetimeCurrentPerms (LOwnedSimpleCurrentPerms l tps ps) = + recombinePermExpl l ValPerm_True (ValPerm_LOwnedSimple tps ps) recombineLifetimeCurrentPerms (CurrentTransPerms cur_perms l) = implDropM l (ValPerm_LCurrent $ lifetimeCurrentPermsLifetime cur_perms) >>> recombineLifetimeCurrentPerms cur_perms @@ -5963,13 +6003,13 @@ proveVarLifetimeFunctor' x f args l mb_l psubst = case mbMatch mb_l of -- some ps' and then split the lifetime of x. Note that, in proving -- l:[l2]lcurrent, we can change the lowned permission for l2, -- specifically if we subsume l1 into l2. - ValPerm_LOwned _ _ _ -> + ValPerm_LOwned _ _ _ _ _ -> let (l',l'_p) = lcurrentPerm l l2 in proveVarImplInt l' (mbConst l'_p mb_z) >>> getPerm l2 >>>= \case - l2_p@(ValPerm_LOwned sub_ls ps_in ps_out) -> + l2_p@(ValPerm_LOwned sub_ls tps_in tps_out ps_in ps_out) -> implPushM l2 l2_p >>> - implSplitLifetimeM x f args l l2 sub_ls ps_in ps_out >>> + implSplitLifetimeM x f args l l2 sub_ls tps_in tps_out ps_in ps_out >>> return (PExpr_Var l2) _ -> error ("proveVarLifetimeFunctor: unexpected error: " ++ "l2 lost its lowned perms") @@ -5992,53 +6032,145 @@ proveVarLifetimeFunctor' x f args l mb_l psubst = case mbMatch mb_l of -- * Solving for Permission List Implications ---------------------------------------------------------------------- --- | A permission that needs to be proved for an implication, which has at least --- those evars mentioned in @vars@ but possibly more -data NeededPerm vars a where - NeededPerm :: KnownCruCtx vars' -> ExprVar a -> - Mb (vars :++: vars') (ValuePerm a) -> - NeededPerm vars a - -instance PermPretty (NeededPerm vars a) where - permPrettyM (NeededPerm _ x mb_p) = +-- | A permission that needs to be proved for an implication +data NeededPerm a + -- | An equality permission that is needed + = NeededEq (EqPerm a) + -- | A block or struct permission for a range + | NeededRange (ExprVar a) (MbRangeForType a) + +instance PermPretty (NeededPerm a) where + permPrettyM (NeededEq eq_perm) = + do x_pp <- permPrettyM (eqPermVar eq_perm) + p_pp <- permPrettyM (eqPermPerm eq_perm) + return (x_pp <> colon <> p_pp) + permPrettyM (NeededRange x rng) = do x_pp <- permPrettyM x - pp_mb_p <- permPrettyM mb_p - return (x_pp <> colon <> pp_mb_p) + rng_pp <- permPrettyM rng + return (x_pp <> colon <> pretty "range" <> parens (rng_pp)) -instance PermPrettyF (NeededPerm vars) where +instance PermPrettyF NeededPerm where permPrettyMF = permPrettyM -- | A sequence of permissions in bindings that need to be proved -type NeededPerms vars = Some (RAssign (NeededPerm vars)) - --- | A single needed permission -neededPerms1 :: ExprVar a -> Mb vars (ValuePerm a) -> NeededPerms vars -neededPerms1 x mb_p = Some (MNil :>: NeededPerm MNil x mb_p) - --- | A single needed permission with a single existential variable -mbNeededPerms1 :: KnownRepr TypeRepr tp => ExprVar a -> - Mb (vars :> tp) (ValuePerm a) -> NeededPerms vars -mbNeededPerms1 x mb_p = - Some (MNil :>: NeededPerm (MNil :>: KnownReprObj) x mb_p) - --- | Convert an existential 'DistPerms' not in a binding to a 'NeededPerms' -someDistPermsToNeededPerms :: RAssign Proxy vars -> Some DistPerms -> - NeededPerms vars -someDistPermsToNeededPerms prxs = - fmapF $ RL.map (\(VarAndPerm x p) -> - NeededPerm MNil x (nuMulti prxs (const p))) - --- | Prove the permission represented by a 'NeededPerm' -proveNeededPerm :: NuMatchingAny1 r => NeededPerm vars a -> - ImplM vars s r (ps :> a) ps () -proveNeededPerm (NeededPerm ctx x mb_p) = - withExtVarsMultiM ctx $ proveVarImpl x mb_p +type NeededPerms = Some (RAssign NeededPerm) + +-- | Convert a sequence of 'EqPerm's to a 'NeededPerms' +eqPermsToNeededPerms :: Some (RAssign EqPerm) -> NeededPerms +eqPermsToNeededPerms = fmapF (RL.map NeededEq) --- | Prove the permission represented by a 'NeededPerm' -proveNeededPerms :: NuMatchingAny1 r => RAssign (NeededPerm vars) ps' -> - ImplM vars s r (ps :++: ps') ps () -proveNeededPerms MNil = return () -proveNeededPerms (ps :>: p) = proveNeededPerms ps >>> proveNeededPerm p +-- | Convert a sequence of 'MbRangeForType's to a 'NeededPerms' +neededPermsForRanges :: ExprVar a -> [MbRangeForType a] -> NeededPerms +neededPermsForRanges x rngs = + concatSomeRAssign $ map (\rng -> Some (MNil :>: NeededRange x rng)) rngs + +-- | No permissions needed +neededPerms0 :: NeededPerms +neededPerms0 = Some MNil + +-- | A permission in some context of existential variables extending @vars@ +data SomeMbPerm vars a where + SomeMbPerm :: KnownCruCtx vars' -> + Mb (vars :++: vars') (ValuePerm a) -> + SomeMbPerm vars a + +-- | Convert an 'MbRangeForType' to a corresponding permission-in-binding +someMbPermForRange :: RAssign Proxy vars -> MbRangeForType a -> + SomeMbPerm vars a +someMbPermForRange vars (MbRangeForLLVMType vars' mb_rng) = + -- For a range on an LLVMPointerType, create a block permission with + -- existential modalities and shape + let bp_prxs = MNil :>: Proxy :>: Proxy :>: Proxy + bp_vars = MNil :>: KnownReprObj :>: KnownReprObj :>: KnownReprObj + vars'_bp_vars = RL.append vars' bp_vars + vars'_bp_prxs = RL.map (const Proxy) vars'_bp_vars in + SomeMbPerm vars'_bp_vars $ + mbCombine vars'_bp_prxs $ nuMulti vars $ const $ + mbCombine bp_prxs $ flip fmap mb_rng $ \rng -> + nuMulti bp_prxs $ \(_ :>: rw :>: l :>: sh) -> + ValPerm_LLVMBlock $ + LLVMBlockPerm { llvmBlockRW = PExpr_Var rw, + llvmBlockLifetime = PExpr_Var l, + llvmBlockOffset = bvRangeOffset rng, + llvmBlockLen = bvRangeLength rng, + llvmBlockShape = PExpr_Var sh } +someMbPermForRange vars (MbRangeForStructType prxs memb rng) + | SomeMbPerm vars' mb_p <- someMbPermForRange vars rng = + SomeMbPerm vars' $ flip fmap mb_p $ \p -> + ValPerm_Conj1 $ Perm_Struct $ + RL.set memb p $ RL.map (const ValPerm_True) prxs + +{- +-- | Convert a 'SomeMbPerm' on an expression to a 'NeededPerms' +someMbPermToNeededs :: PermExpr a -> SomeMbPerm vars a -> NeededPerms vars +someMbPermToNeededs (asVarOffset -> Just (x,off)) (SomeMbPerm vars' mb_p) = + Some $ MNil :>: NeededPerm vars' x (fmap (offsetPerm off) mb_p) +someMbPermToNeededs (PExpr_Struct es) (SomeMbPerm vars' + [nuP| ValPerm_Struct mb_ps |]) = + concatSomeRAssign $ RL.toList $ + RL.map2 (\e (Compose mb_p) -> + Constant $ someMbPermToNeededs e $ SomeMbPerm vars' mb_p) + es (mbRAssign mb_ps) +someMbPermToNeededs _ _ = + -- In this case, we can't convert to permissions, so we just throw it away + neededPerms0 + +-- | Generate a set of 'NeededPerms' for a range on an expression +neededPermsForRange :: RAssign Proxy vars -> PermExpr a -> MbRangeForType a -> + NeededPerms vars +neededPermsForRange vars e rng = + someMbPermToNeededs e $ someMbPermForRange vars rng + +-- | Generate a set of 'NeededPerms' for a list of ranges on an expression +neededPermsForRanges :: RAssign Proxy vars -> PermExpr a -> [MbRangeForType a] -> + NeededPerms vars +neededPermsForRanges vars e = + concatSomeRAssign . map (neededPermsForRange vars e) +-} + +-- | Prove a 'SomeMbPerm' +proveSomeMbPerm :: NuMatchingAny1 r => ExprVar a -> SomeMbPerm vars a -> + ImplM vars s r (ps :> a) ps () +proveSomeMbPerm x (SomeMbPerm ctx mb_p) = + withExtVarsMultiM ctx $ proveVarImplInt x mb_p + +-- | Prove the permission represented by a 'NeededPerm', returning zero or more +-- auxiliary permissions that are also needed +proveNeededPerm :: NuMatchingAny1 r => RAssign Proxy vars -> NeededPerm a -> + ImplM vars s r (ps :> a) ps (Some DistPerms) +proveNeededPerm _ (NeededEq eq_perm) = + mbVarsM (eqPermPerm eq_perm) >>>= \mb_p -> + proveVarImplInt (eqPermVar eq_perm) mb_p >>> + return (Some MNil) +proveNeededPerm vars (NeededRange x rng@(MbRangeForLLVMType _ _)) = + proveSomeMbPerm x (someMbPermForRange vars rng) >>> + getTopDistPerm x >>>= \(ValPerm_LLVMBlock bp) -> + case NameSet.toRAssign (findEqVarFieldsInShape (llvmBlockShape bp)) of + NameSet.SomeRAssign ns -> + Some <$> traverseRAssign (\n -> VarAndPerm n <$> getPerm n) ns +proveNeededPerm vars (NeededRange x rng) = + proveSomeMbPerm x (someMbPermForRange vars rng) >>> + return (Some MNil) + +-- | Prove the permissions represented by a sequence of 'NeededPerms', returning +-- zero or more auxiliary permissions that are also needed +proveNeededPerms :: NuMatchingAny1 r => RAssign Proxy vars -> + RAssign NeededPerm ps' -> + ImplM vars s r (ps :++: ps') ps (Some DistPerms) +proveNeededPerms _ MNil = return (Some MNil) +proveNeededPerms vars (ps :>: p) = + proveNeededPerms vars ps >>>= \auxs1 -> + proveNeededPerm vars p >>>= \auxs2 -> + return (apSomeRAssign auxs1 auxs2) + +-- | Call 'proveNeededPerms' and then reassociate the resulting stack +proveNeededPermsAssoc :: + NuMatchingAny1 r => RAssign Proxy vars -> + prx ps -> prx1 ps1 -> RAssign NeededPerm ps2 -> + ImplM vars s r (ps :++: (ps1 :++: ps2)) (ps :++: ps1) (Some DistPerms) +proveNeededPermsAssoc vars ps ps1 ps2 + | Refl <- RL.appendAssoc ps ps1 ps2 + = proveNeededPerms vars ps2 -- | If the second argument is an unset variable, set it to the first, otherwise -- do nothing @@ -6052,107 +6184,105 @@ tryUnifyVars x mb_x = case mbMatch mb_x of _ -> pure () _ -> pure () - --- | Find all the permissions @ps@ that need to be added to the given list --- @lops@ of 'LOwnedPerms' to prove the given block permission. That is, given --- @bp@, solve for the least @ps@ such that @x:ps * lops |- x:bp@. This is done --- by finding all field, array, and block permissions for @x@ in @lops@ and --- subtracting (via 'bvRangesDelete') their ranges from the range of @bp@. For --- whatever ranges are left, return block permissions for those ranges with --- fresh existential variables for their shapes, since a block permission with --- an existential shape is the most general form of block permission. --- --- NOTE: This function requires the range of the block permission to be known, --- i.e., to not have any existential variables, so that 'bvRangesDelete' knows --- how to perform the range subtraction. The range of the block permission is --- passed as the third argument. The ranges of permissions in @lowned@ --- permissions should always be known anyway, so this should not be a problem. -solveForPermListImplBlock :: (NuMatchingAny1 r, 1 <= w, KnownNat w) => - LOwnedPerms ps_l -> ExprVar (LLVMPointerType w) -> - BVRange w -> Mb vars (LLVMBlockPerm w) -> - ImplM vars s r ps ps (NeededPerms vars) - --- If there is at least one perm for x in lops, use it to set the modalities of --- mb_bp, and then delete the left-hand ranges from the right-hand range -solveForPermListImplBlock lops x bp_rng mb_bp - | Just some_lop <- findLOwnedPermForVar x lops = - - -- Use the modalities of some_lop to set the modalities of mb_bp - let (rw,l) = llvmLownedPermModalities some_lop in - tryUnifyVars rw (mbLLVMBlockRW mb_bp) >>> - tryUnifyVars l (mbLLVMBlockLifetime mb_bp) >>> - - -- Find all the ranges covered by perms for x in lops, and subtract them - -- from the range of mb_bp - let rngs_lhs = lownedPermsOffsetsForLLVMVar x lops in - let rngs_rem = bvRangesDelete bp_rng rngs_lhs in - {- - implTraceM (\i -> pretty "solveForPermListImplBlock for" <+> - permPretty i x <> colon <> line <> - permPretty i bp_rng <+> - pretty "-" <+> permPretty i rngs_lhs <+> pretty "=" <+> - permPretty i rngs_rem) >>> -} - - -- Subtract all ranges of offsets in lops from that of mb_bp, and, for each - -- remaining range, create a memblock permission with existential shape - let mb_ex_bps = - fmap (\bp -> - map (\rng -> nu $ \z -> - (llvmBlockSetRange bp rng) - { llvmBlockShape = PExpr_Var z }) - rngs_rem) mb_bp in - return $ concatSomeRAssign $ - map (\mb_ex_bp -> mbNeededPerms1 x $ mbValPerm_LLVMBlock $ - mbCombine RL.typeCtxProxies mb_ex_bp) $ - mbList mb_ex_bps - --- If none of our lowned perms contain x, we need all of mb_bp -solveForPermListImplBlock _ x _ mb_bp = - return $ neededPerms1 x $ mbValPerm_LLVMBlock mb_bp - +-- | Get the ranges of offsets covered by the current permissions on an +-- expression, eliminating permissions if necessary +getExprRanges :: NuMatchingAny1 r => TypeRepr a -> PermExpr a -> + ImplM vars s r ps ps [MbRangeForType a] +getExprRanges tp@(LLVMPointerRepr w) (asVar -> Just x) = + getSimpleVarPerm x >>>= \case + ValPerm_Conj ps -> + withKnownNat w $ pure $ + mapMaybe (fmap (MbRangeForLLVMType MNil . emptyMb . llvmBlockRange) . + llvmAtomicPermToBlock) ps + ValPerm_Eq e -> getExprRanges tp e + _ -> return [] +getExprRanges tp@(LLVMPointerRepr _) (asVarOffset -> Just (x,off)) = + map (offsetMbRangeForType $ negatePermOffset off) <$> + getExprRanges tp (PExpr_Var x) +getExprRanges (StructRepr tps) (PExpr_Struct es) = + let prxs = RL.map (const Proxy) es in + concat <$> RL.toList <$> + traverseRAssign (\memb -> + Constant <$> map (MbRangeForStructType prxs memb) <$> + getExprRanges (RL.get memb $ cruCtxToTypes $ mkCruCtx tps) + (RL.get memb es)) + (RL.members es) +getExprRanges _ _ = + -- NOTE: this assumes that struct variables have already been eliminated + pure [] + +-- FIXME HERE NOW: explain the justification of the following approach, that we +-- expect any offsets mentioned at all on the right will be useful in the proof +-- if the do not occur on the left but are currently held for the given variable -- | The second stage of 'solveForPermListImpl', after equality permissions have --- been substituted into the 'LOwnedPerms' -solveForPermListImpl1 :: NuMatchingAny1 r => LOwnedPerms ps_l -> - Mb vars (LOwnedPerms ps_r) -> - ImplM vars s r ps ps (NeededPerms vars) -solveForPermListImpl1 ps_l mb_ps = case mbMatch mb_ps of - -- If the RHS is empty, we are done - [nuMP| MNil |] -> - pure (Some MNil) - - -- If the head of the RHS converts to a block permission, call - -- solveForPermListImplBlock, and recurse on the tail - [nuMP| mb_ps_r :>: mb_p_r |] - | Just [nuP| (mb_x, SomeLLVMBlockPerm mb_bp) |] <- - mbLownedPermVarBlockPerm mb_p_r - , Right x <- mbNameBoundP mb_x -> - do bp_rng <- - partialSubstForceM (mbLLVMBlockRange mb_bp) "solveForPermListImpl1" - neededs1 <- solveForPermListImplBlock ps_l x bp_rng mb_bp - neededs2 <- solveForPermListImpl1 ps_l mb_ps_r - pure (apSomeRAssign neededs1 neededs2) - - -- Otherwise, drop the head and recurse on the tail - [nuMP| mb_ps_r :>: _ |] -> - solveForPermListImpl1 ps_l mb_ps_r - --- | Determine what additional permissions from the variable permissions, if --- any, would be needed to prove one list of permissions implies another. Also --- instantiate any existential variables as needed for the implication. This is --- just a "best guess", so just do nothing and return if nothing can be done. -solveForPermListImpl :: NuMatchingAny1 r => LOwnedPerms ps_l -> - Mb vars (LOwnedPerms ps_r) -> - ImplM vars s r ps ps (NeededPerms vars) -solveForPermListImpl ps_l mb_ps_r = +-- been substituted into the 'ExprPerms' +solveForPermListImplH :: NuMatchingAny1 r => RAssign Proxy vars -> + ExprPerms ps_l -> CruCtx ps_r -> ExprPerms ps_r -> + ImplM vars s r ps ps NeededPerms +-- If the RHS is empty, we are done +solveForPermListImplH _ _ _ MNil = + pure neededPerms0 + +-- If the RHS is a varible x, get all the offsets mentioned in RHS permissions +-- for x, subtract any ranges on the LHS for x, and then return block +-- permisisons for any of the remaining ranges that are currently held for x +solveForPermListImplH vars ps_l (CruCtxCons tps_r' tp_r) (ps_r' :>: e_and_p) + | Just (VarAndPerm x p) <- exprPermVarAndPerm e_and_p + , lhs_ps <- exprPermsForVar x ps_l + , lhs_rngs <- concatMap getOffsets lhs_ps + , rhs_rngs <- getOffsets p + , needed_rngs <- mbRangeFTsDelete rhs_rngs lhs_rngs = + getExprRanges tp_r (PExpr_Var x) >>>= \expr_rngs -> + let res_rngs = mbRangeFTsSubsetTo expr_rngs needed_rngs in + implVerbTraceM + (\i -> pretty "solveForPermListImplH" <+> + permPretty i x <> colon <> line <> pretty " " <> + align (sep [pretty "RHS:" <+> permPretty i p, + pretty "LHS:" <+> permPretty i lhs_ps, + pretty "Needed ranges:" <+> permPretty i needed_rngs, + pretty "Held ranges:" <+> permPretty i expr_rngs, + pretty "Result ranges:" <+> permPretty i res_rngs])) + >>>= \_ -> + apSomeRAssign (neededPermsForRanges x res_rngs) <$> + solveForPermListImplH vars ps_l tps_r' ps_r' + +-- If the RHS is not a variable, ignore it and keep going +solveForPermListImplH vars ps_l (CruCtxCons tps_r' _) (ps_r' :>: _) = + solveForPermListImplH vars ps_l tps_r' ps_r' + +-- | Determine what additional permissions from the current set of variable +-- permissions, if any, would be needed to prove one list of permissions implies +-- another. This is just a "best guess", so just do nothing and return if +-- nothing can be done. +-- +-- At a high level, this algorithm currently works as follows. It starts by +-- substituting any equality permissions in the current permission set, +-- returning those equalities as needed permissions. Next, it finds all LLVM +-- pointer offsets and ranges of offsets for any LLVM variable @x@ that are +-- mentioned on the right and subtracts those for the same variable that are +-- mentioned on the left. It then returns ranges for any of these remaining +-- offsets that are held as permissions in the current permission set. The +-- intuition is that these offsets are the ones that are important to the right- +-- or left-hand sides, but we don't know exactly how the proof will go, so we +-- only pick those offsets that can actually be satisfied by the current +-- permission set without failing. +solveForPermListImpl :: NuMatchingAny1 r => ExprPerms ps_l -> + CruCtx ps_r -> Mb vars (ExprPerms ps_r) -> + ImplM vars s r ps ps NeededPerms +solveForPermListImpl ps_l tps_r mb_ps_r = let prxs = mbToProxy mb_ps_r in + -- FIXME HERE: eliminate struct variables substEqsWithProof ps_l >>>= \eqp_l -> - give prxs (substEqsWithProof mb_ps_r) >>>= \eqp_r -> - let neededs = - someDistPermsToNeededPerms prxs $ - apSomeRAssign (someEqProofPerms eqp_l) (someEqProofPerms eqp_r) in - apSomeRAssign neededs <$> - solveForPermListImpl1 (someEqProofRHS eqp_l) (someEqProofRHS eqp_r) + (psubstProxies <$> getPSubst) >>>= \vars -> + partialSubstForceM mb_ps_r "solveForPermListImpl" >>>= \ps_r -> + give prxs (substEqsWithProof ps_r) >>>= \eqp_r -> + let neededs1 = eqPermsToNeededPerms $ someEqProofEqs eqp_l + neededs2 = eqPermsToNeededPerms $ someEqProofEqs eqp_r + neededs = apSomeRAssign neededs1 neededs2 + ps_l' = someEqProofRHS eqp_l + ps_r' = someEqProofRHS eqp_r in + apSomeRAssign neededs <$> solveForPermListImplH vars ps_l' tps_r ps_r' ---------------------------------------------------------------------- @@ -7903,13 +8033,15 @@ proveVarAtomicImpl x ps mb_p = case mbMatch mb_p of -- FIXME HERE: eventually we should handle lowned permissions on the right -- with arbitrary contained lifetimes, by equalizing the two sides - [nuMP| Perm_LOwned [] _ _ |] - | [Perm_LOwned (PExpr_Var l2:_) _ _] <- ps -> + [nuMP| Perm_LOwned [] _ _ _ _ |] + | [Perm_LOwned (PExpr_Var l2:_) _ _ _ _] <- ps -> recombinePerm x (ValPerm_Conj ps) >>> implEndLifetimeRecM l2 >>> proveVarImplInt x (mbValPerm_Conj1 mb_p) - [nuMP| Perm_LOwned [] mb_ps_inR mb_ps_outR |] - | [Perm_LOwned [] ps_inL ps_outL] <- ps -> + [nuMP| Perm_LOwned [] mb_tps_inR mb_tps_outR mb_ps_inR mb_ps_outR |] + | [Perm_LOwned [] tps_inL tps_outL ps_inL ps_outL] <- ps + , tps_inR <- mbLift mb_tps_inR + , tps_outR <- mbLift mb_tps_outR -> -- Compute the necessary "permission subtractions" to figure out what -- additional permissions are needed to prove both ps_inR -o ps_inL and @@ -7919,44 +8051,58 @@ proveVarAtomicImpl x ps mb_p = case mbMatch mb_p of -- name-binding, so ps_inR cannot have any evars. partialSubstForceM mb_ps_inR "proveVarAtomicImpl" >>>= \ps_inR -> let mb_ps_inL = mbConst ps_inL mb_ps_inR in - solveForPermListImpl ps_inR mb_ps_inL >>>= \(Some neededs1) -> - solveForPermListImpl ps_outL mb_ps_outR >>>= \(Some neededs2) -> - - -- Prove ps1 and ps2, which can have evars, and then look at the - -- substitution instances of ps1 and ps2 that were actually proved on top - -- of the stack. We do it this way because we can't substitute expressions - -- for variables in a DistPerms, because DistPerms need to have variables - -- on the LHSs and not arbitrary expressions - getDistPerms >>>= \ps0_with_a -> - let ps0 = RL.tail ps0_with_a in - let neededs12 = RL.append neededs1 neededs2 in + solveForPermListImpl ps_inR tps_inL mb_ps_inL >>>= \(Some neededs1) -> + solveForPermListImpl ps_outL tps_outR mb_ps_outR >>>= \(Some neededs2) -> + + -- Prove neededs1 and neededs2 along with their corresponding auxiliary + -- permissions, and then look at the substitution instances of these + -- permissions that were actually proved on top of the stack. We do it + -- this way because we can't substitute expressions for variables in a + -- DistPerms, because DistPerms need to have variables on the LHSs and not + -- arbitrary expressions implTraceM (\i -> hang 2 (pretty "Proving needed perms for lowned implication:" - <> line <> permPretty i neededs12)) >>> - proveNeededPerms neededs12 >>> - getTopDistPerms ps0_with_a neededs12 >>>= \ps12 -> - let (ps1,ps2) = RL.split neededs1 neededs2 ps12 in + <> line <> permPretty i neededs1 <> line <> + pretty "And:" <> line <> permPretty i neededs2)) >>> + getVarProxies >>>= \vars -> + getDistPermsProxies >>>= \prxs0_a -> + let prxs0 = RL.tail prxs0_a in + proveNeededPerms vars neededs1 >>>= \(Some auxs1) -> + mbVarsM auxs1 >>>= \mb_auxs1 -> + proveVarsImplAppendIntAssoc prxs0_a neededs1 mb_auxs1 >>> + let prxs1 = + RL.map (const Proxy) neededs1 `RL.append` RL.map (const Proxy) auxs1 in + proveNeededPermsAssoc vars prxs0_a prxs1 neededs2 >>>= \(Some auxs2) -> + mbVarsM auxs2 >>>= \mb_auxs2 -> + proveVarsImplAppendIntAssoc4 prxs0_a prxs1 neededs2 mb_auxs2 >>> + let prxs2 = + RL.map (const Proxy) neededs2 `RL.append` RL.map (const Proxy) auxs2 + prxs12 = RL.append prxs1 prxs2 in + getTopDistPerms prxs0_a prxs12 >>>= \ps12 -> + let (ps1,ps2) = RL.split prxs1 prxs2 ps12 in partialSubstForceM mb_ps_outR "proveVarAtomicImpl" >>>= \ps_outR -> -- Build the local implications ps_inR -o ps_inL and ps_outL -o ps_outR - (case (lownedPermsToDistPerms ps_inL, lownedPermsToDistPerms ps_outL, - lownedPermsToDistPerms ps_inR, lownedPermsToDistPerms ps_outR) of + (case (exprPermsToDistPerms ps_inL, exprPermsToDistPerms ps_outL, + exprPermsToDistPerms ps_inR, exprPermsToDistPerms ps_outR) of (Just dps_inL, Just dps_outL, Just dps_inR, Just dps_outR) -> pure (dps_inL, dps_outL, dps_inR, dps_outR) - _ -> implFailMsgM "proveVarAtomicImpl: lownedPermsToDistPerms") + _ -> implFailMsgM "proveVarAtomicImpl: exprPermsToDistPerms") >>>= \(dps_inL, dps_outL, dps_inR, dps_outR) -> localProveVars (RL.append ps1 dps_inR) dps_inL >>>= \impl_in -> localProveVars (RL.append ps2 dps_outL) dps_outR >>>= \impl_out -> -- Finally, apply the MapLifetime proof step, first moving the input -- lowned permissions to the top of the stack - implMoveUpM ps0 ps12 x MNil >>> - implSimplM Proxy (SImpl_MapLifetime x [] ps_inL ps_outL ps_inR ps_outR + implMoveUpM prxs0 ps12 x MNil >>> + implSimplM Proxy (SImpl_MapLifetime x [] + tps_inL tps_outL ps_inL ps_outL + tps_inR tps_outR ps_inR ps_outR ps1 ps2 impl_in impl_out) - [nuMP| Perm_LOwnedSimple mb_lops |] + [nuMP| Perm_LOwnedSimple mb_tps mb_lops |] | Just mb_dps <- mbMaybe (mbMapCl - $(mkClosed [| lownedPermsToDistPerms |]) mb_lops) -> + $(mkClosed [| exprPermsToDistPerms |]) mb_lops) -> -- Pop the permissions for x, and prove the mb_lops permissions that are -- going to be borrowed by the lifetime x implPopM x (ValPerm_Conj ps) >>> @@ -7965,12 +8111,14 @@ proveVarAtomicImpl x ps mb_p = case mbMatch mb_p of partialSubstForceM mb_lops "proveVarAtomicImpl" >>>= \lops -> -- Prove an empty lowned permission for x - mbVarsM (distPerms1 x $ ValPerm_LOwned [] MNil MNil) >>>= \mb_p' -> + mbVarsM (distPerms1 x $ + ValPerm_LOwned [] CruCtxNil CruCtxNil MNil MNil) >>>= \mb_p' -> proveVarsImplAppendInt mb_p' >>> -- Coerce the lowned permission to a simple lowned permission, and then -- recombine all the resulting permissions for mb_lops - implSimplM (Proxy :: Proxy ps0) (SImpl_IntroLOwnedSimple x lops) >>> + let tps = mbLift mb_tps in + implSimplM (Proxy :: Proxy ps0) (SImpl_IntroLOwnedSimple x tps lops) >>> getDistPerms >>>= \perms -> let (_, ps_lops_l@(ps_lops :>: p_l)) = RL.split ps0 (RL.map (const Proxy) lops :>: Proxy) perms in @@ -7987,11 +8135,12 @@ proveVarAtomicImpl x ps mb_p = case mbMatch mb_p of [Perm_LCurrent (PExpr_Var l)] -> proveVarImplInt l (mbValPerm_Conj1 mb_p) >>> implSimplM Proxy (SImpl_LCurrentTrans x l l') - [Perm_LOwned ls ps_in ps_out] - | elem l' ls -> implContainedLifetimeCurrentM x ls ps_in ps_out l' - [Perm_LOwned ls ps_in ps_out] -> - implSubsumeLifetimeM x ls ps_in ps_out l' >>> - implContainedLifetimeCurrentM x (l':ls) ps_in ps_out l' + [Perm_LOwned ls tps_in tps_out ps_in ps_out] + | elem l' ls -> + implContainedLifetimeCurrentM x ls tps_in tps_out ps_in ps_out l' + [Perm_LOwned ls tps_in tps_out ps_in ps_out] -> + implSubsumeLifetimeM x ls tps_in tps_out ps_in ps_out l' >>> + implContainedLifetimeCurrentM x (l':ls) tps_in tps_out ps_in ps_out l' _ -> proveVarAtomicImplUnfoldOrFail x ps mb_p [nuMP| Perm_LFinished |] -> @@ -8491,7 +8640,7 @@ isProvablePerm :: NameSet CrucibleType -> Maybe (ExprVar a) -> ValuePerm a -> Int -- Simple lifetime permissions should be proved first, so get highest priority -isProvablePerm unsetVars maybe_x p@(ValPerm_Conj [Perm_LOwnedSimple _]) +isProvablePerm unsetVars maybe_x p@(ValPerm_Conj [Perm_LOwnedSimple _ _]) | neededs <- maybe id (\x -> NameSet.insert x) maybe_x $ neededVars p , NameSet.null $ NameSet.intersection neededs unsetVars = 3 @@ -8596,6 +8745,26 @@ proveVarsImplAppendInt mb_ps = permPretty i mb_ps]]) >>>= implFailM +-- | Like 'proveVarsImplAppendInt' but re-associate the appends +proveVarsImplAppendIntAssoc :: + NuMatchingAny1 r => prx ps_in -> prx1 ps1 -> ExDistPerms vars ps -> + ImplM vars s r (ps_in :++: (ps1 :++: ps)) (ps_in :++: ps1) () +proveVarsImplAppendIntAssoc ps_in ps1 ps + | ps_prxs <- mbLift $ mbMapCl $(mkClosed [| RL.map (const Proxy) |]) ps + , Refl <- RL.appendAssoc ps_in ps1 ps_prxs = + proveVarsImplAppendInt ps + +-- | Like 'proveVarsImplAppendInt' but re-associate the appends +proveVarsImplAppendIntAssoc4 :: + NuMatchingAny1 r => prx ps_in -> prx1 ps1 -> prx2 ps2 -> + ExDistPerms vars ps -> + ImplM vars s r (ps_in :++: (ps1 :++: (ps2 :++: ps))) (ps_in :++: (ps1 :++: ps2)) () +proveVarsImplAppendIntAssoc4 ps_in (ps1 :: prx1 ps1) (ps2 :: prx2 ps2) ps + | ps_prxs <- mbLift $ mbMapCl $(mkClosed [| RL.map (const Proxy) |]) ps + , ps12 <- Proxy :: Proxy (ps1 :++: ps2) + , Refl <- RL.appendAssoc ps1 ps2 ps_prxs = + proveVarsImplAppendIntAssoc ps_in ps12 ps + -- | Prove a list of existentially-quantified distinguished permissions and put -- those proofs onto the stack. This is the same as 'proveVarsImplAppendInt' -- except that the stack starts out empty and is replaced by the proofs, rather @@ -8650,8 +8819,8 @@ implEndLifetimeRecM :: NuMatchingAny1 r => ExprVar LifetimeType -> implEndLifetimeRecM l = getPerm l >>>= \case ValPerm_LFinished -> return () - p@(ValPerm_LOwned [] ps_in ps_out) - | Just dps_in <- lownedPermsToDistPerms ps_in -> + p@(ValPerm_LOwned [] tps_in tps_out ps_in ps_out) + | Just dps_in <- exprPermsToDistPerms ps_in -> -- Get the permission stack on entry getDistPerms >>>= \ps0 -> -- Save the lowned permission for l @@ -8662,23 +8831,22 @@ implEndLifetimeRecM l = -- Move the lowned permission for l to the top of the stack implMoveUpM ps0 ps_in l MNil >>> -- End l - implEndLifetimeM Proxy l ps_in ps_out >>> + implEndLifetimeM Proxy l tps_in tps_out ps_in ps_out >>> -- Find all lowned perms that contain l and remove l from them implFindLOwnedPerms >>>= \lowned_ps -> forM_ lowned_ps $ \case - (l', p'@(ValPerm_LOwned ls' ps_in' ps_out')) + (l', p'@(ValPerm_LOwned ls' tps_in' tps_out' ps_in' ps_out')) | elem (PExpr_Var l) ls' -> implPushM l' p' >>> implPushCopyM l ValPerm_LFinished >>> - implRemoveContainedLifetimeM l' ls' ps_in' ps_out' l + implRemoveContainedLifetimeM l' ls' tps_in' tps_out' ps_in' ps_out' l _ -> return () - (ValPerm_LOwned ((asVar -> Just l') : _) _ _) -> + (ValPerm_LOwned ((asVar -> Just l') : _) _ _ _ _) -> implEndLifetimeRecM l' >>> implEndLifetimeRecM l _ -> implTraceM (\i -> pretty "implEndLifetimeRecM: could not end lifetime: " <> permPretty i l) >>>= implFailM - -- | Prove a list of existentially-quantified distinguished permissions, adding -- those proofs to the top of the stack. In the case that a the variable itself -- whose permissions are being proved is existentially-quantified --- that is, diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs index 79c75ae4b6..c60bb5cfdb 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs @@ -42,6 +42,7 @@ import Data.String import Data.Proxy import Data.Reflection import Data.Functor.Constant +import Data.Functor.Compose import qualified Data.BitVector.Sized as BV import Data.BitVector.Sized (BV) import Numeric.Natural @@ -49,6 +50,8 @@ import GHC.TypeLits import Data.Kind import Data.Map.Strict (Map) import qualified Data.Map.Strict as Map +import Data.Set (Set) +import qualified Data.Set as Set import Control.Applicative hiding (empty) import Control.Monad.Identity hiding (ap) import Control.Monad.State hiding (ap) @@ -93,6 +96,28 @@ import GHC.Stack import Debug.Trace +-- * Helper functions (should be moved to Hobbits) + +-- | Append two existentially quantified 'RAssign' lists +apSomeRAssign :: Some (RAssign f) -> Some (RAssign f) -> Some (RAssign f) +apSomeRAssign (Some x) (Some y) = Some (RL.append x y) + +-- | Concatenate a list of existentially quantified 'RAssign' lists +concatSomeRAssign :: [Some (RAssign f)] -> Some (RAssign f) +concatSomeRAssign = foldl apSomeRAssign (Some MNil) +-- foldl is intentional, appending RAssign matches on the second argument + +-- | Map a monadic function over an 'RAssign' list from left to right while +-- maintaining an "accumulator" that is threaded through the mapping +rlMapMWithAccum :: Monad m => (forall a. accum -> f a -> m (g a, accum)) -> + accum -> RAssign f tps -> m (RAssign g tps, accum) +rlMapMWithAccum _ accum MNil = return (MNil, accum) +rlMapMWithAccum f accum (xs :>: x) = + do (ys,accum') <- rlMapMWithAccum f accum xs + (y,accum'') <- f accum' x + return (ys :>: y, accum'') + + ---------------------------------------------------------------------- -- * Data types and related types ---------------------------------------------------------------------- @@ -272,6 +297,27 @@ type PermVar (a :: CrucibleType) = Name (ValuePermType a) data BVRange w = BVRange { bvRangeOffset :: PermExpr (BVType w), bvRangeLength :: PermExpr (BVType w) } +-- | A range of offsets, possibly inside bindings for zero or more existential +-- variables, that makes sense for a given Crucible type +data MbRangeForType a where + MbRangeForLLVMType :: (1 <= w, KnownNat w) => KnownCruCtx vars -> + Mb vars (BVRange w) -> + MbRangeForType (LLVMPointerType w) + MbRangeForStructType :: RAssign Proxy (CtxToRList args) -> + Member (CtxToRList args) a -> + MbRangeForType a -> + MbRangeForType (StructType args) + +-- | Build an 'MbRangeForLLVMType' from a 'BVRange' +rangeForLLVMType :: (1 <= w, KnownNat w) => BVRange w -> + MbRangeForType (LLVMPointerType w) +rangeForLLVMType rng = MbRangeForLLVMType MNil $ emptyMb rng + +-- | A name-binding over some list of typed existential variables +data SomeTypedMb a where + SomeTypedMb :: CruCtx ctx -> Mb ctx a -> SomeTypedMb a + + -- | Propositions about bitvectors data BVProp w -- | True iff the two expressions are equal @@ -351,7 +397,8 @@ data AtomicPerm (a :: CrucibleType) where -- Additionally, a lifetime may contain some other lifetimes, meaning the all -- must end before the current one can be ended. Perm_LOwned :: [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> AtomicPerm LifetimeType -- | A simplified version of @lowned@, written just @lowned(ps)@, which @@ -361,7 +408,7 @@ data AtomicPerm (a :: CrucibleType) where -- and output permissions are the same except that the input permissions are -- the minimal possible versions of @ps@ in lifetime @l@ that could be given -- back when @l@ is ended. - Perm_LOwnedSimple :: LOwnedPerms ps -> AtomicPerm LifetimeType + Perm_LOwnedSimple :: CruCtx ps -> ExprPerms ps -> AtomicPerm LifetimeType -- | Assertion that a lifetime is current during another lifetime Perm_LCurrent :: PermExpr LifetimeType -> AtomicPerm LifetimeType @@ -415,12 +462,6 @@ data ValuePerm (a :: CrucibleType) where ValPerm_False :: ValuePerm a -- | A sequence of value permissions -{- -data ValuePerms as where - ValPerms_Nil :: ValuePerms RNil - ValPerms_Cons :: ValuePerms as -> ValuePerm a -> ValuePerms (as :> a) --} - type ValuePerms = RAssign ValuePerm -- | A binding of 0 or more variables, each with permissions @@ -505,18 +546,15 @@ data LLVMFieldShape w = forall sz. (1 <= sz, KnownNat sz) => LLVMFieldShape (ValuePerm (LLVMPointerType sz)) --- | A form of permission used in lifetime ownership permissions -data LOwnedPerm a where - LOwnedPermField :: (1 <= w, KnownNat w, 1 <= sz, KnownNat sz) => - PermExpr (LLVMPointerType w) -> LLVMFieldPerm w sz -> - LOwnedPerm (LLVMPointerType w) - LOwnedPermArray :: (1 <= w, KnownNat w) => PermExpr (LLVMPointerType w) -> - LLVMArrayPerm w -> LOwnedPerm (LLVMPointerType w) - LOwnedPermBlock :: (1 <= w, KnownNat w) => PermExpr (LLVMPointerType w) -> - LLVMBlockPerm w -> LOwnedPerm (LLVMPointerType w) +-- | A pair of an epxression and its permission; we give it its own datatype to +-- make certain typeclass instances (like pretty-printing) specific to it +data ExprAndPerm a = + ExprAndPerm { exprAndPermExpr :: PermExpr a, + exprAndPermPerm :: ValuePerm a } --- | A sequence of 'LOwnedPerm's -type LOwnedPerms = RAssign LOwnedPerm +-- | A list of expressions and associated permissions; different from +-- 'DistPerms' because the expressions need not be variables +type ExprPerms = RAssign ExprAndPerm -- | A function permission is a set of input and output permissions inside a -- context of ghost variables @ghosts@ with an additional context of output @@ -696,10 +734,12 @@ data LifetimeCurrentPerms ps_l where -- -- > l:lowned[ls](ps_in -o ps_out) LOwnedCurrentPerms :: ExprVar LifetimeType -> [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> LifetimeCurrentPerms (RNil :> LifetimeType) -- | A variable @l@ with a simple @lowned@ perm is also current - LOwnedSimpleCurrentPerms :: ExprVar LifetimeType -> LOwnedPerms ps -> + LOwnedSimpleCurrentPerms :: ExprVar LifetimeType -> + CruCtx ps -> ExprPerms ps -> LifetimeCurrentPerms (RNil :> LifetimeType) -- | A variable @l@ that is @lcurrent@ during another lifetime @l'@ is @@ -843,7 +883,7 @@ instance NuMatchingAny1 ValuePerm where instance NuMatchingAny1 VarAndPerm where nuMatchingAny1Proof = nuMatchingProof -instance NuMatchingAny1 LOwnedPerm where +instance NuMatchingAny1 ExprAndPerm where nuMatchingAny1Proof = nuMatchingProof instance NuMatchingAny1 DistPerms where @@ -856,6 +896,8 @@ $(mkNuMatching [t| forall b args w. NamedShape b args w |]) $(mkNuMatching [t| forall w . LLVMFieldShape w |]) $(mkNuMatching [t| forall a . PermExpr a |]) $(mkNuMatching [t| forall w. BVRange w |]) +$(mkNuMatching [t| forall a. MbRangeForType a |]) +$(mkNuMatching [t| forall a. NuMatching a => SomeTypedMb a |]) $(mkNuMatching [t| forall w. BVProp w |]) $(mkNuMatching [t| forall w sz . LLVMFieldPerm w sz |]) $(mkNuMatching [t| forall w . LLVMArrayBorrow w |]) @@ -865,12 +907,12 @@ $(mkNuMatching [t| forall ns. NameSortRepr ns |]) $(mkNuMatching [t| forall ns args a. NameReachConstr ns args a |]) $(mkNuMatching [t| forall ns args a. NamedPermName ns args a |]) $(mkNuMatching [t| forall a. PermOffset a |]) -$(mkNuMatching [t| forall w . LOwnedPerm w |]) $(mkNuMatching [t| forall ghosts args gouts ret. FunPerm ghosts args gouts ret |]) $(mkNuMatching [t| forall a . AtomicPerm a |]) $(mkNuMatching [t| forall a . ValuePerm a |]) -- $(mkNuMatching [t| forall as. ValuePerms as |]) $(mkNuMatching [t| forall a . VarAndPerm a |]) +$(mkNuMatching [t| forall a . ExprAndPerm a |]) $(mkNuMatching [t| forall w . LLVMArrayIndex w |]) $(mkNuMatching [t| forall args ret. SomeFunPerm args ret |]) @@ -1992,6 +2034,11 @@ bvRangeSuffix :: (1 <= w, KnownNat w) => PermExpr (BVType w) -> BVRange w -> bvRangeSuffix off' (BVRange off len) = BVRange off' (bvSub len (bvSub off' off)) +-- | Build the range of offsets not in a 'BVRange' +bvRangeInvert :: (1 <= w, KnownNat w) => BVRange w -> BVRange w +bvRangeInvert (BVRange off len) = + BVRange (bvAdd off len) (bvSub (bvInt 0) len) + -- | Subtract a bitvector word from the offset of a 'BVRange' bvRangeSub :: (1 <= w, KnownNat w) => BVRange w -> PermExpr (BVType w) -> BVRange w @@ -2045,6 +2092,89 @@ bvRangesDelete :: (1 <= w, KnownNat w) => BVRange w -> [BVRange w] -> bvRangesDelete rng_top = foldr (\rng_del rngs -> concatMap (flip bvRangeDelete rng_del) rngs) [rng_top] +-- | Find all offsets in the first range that could (in the sense of +-- 'bvPropCouldHold') be in the second. This is an asymmetric form of +-- intersection, and is equivalent to 'bvRangeDelete' of the complement of the +-- second range +bvRangeSubsetTo :: (1 <= w, KnownNat w) => BVRange w -> BVRange w -> + [BVRange w] +bvRangeSubsetTo rng1 rng2 = bvRangeDelete rng1 $ bvRangeInvert rng2 + +-- | Find all offsets in any of the first list of ranges that could (in the +-- sense of 'bvPropCouldHold') be in one of those in the second list +bvRangesSubsetTo :: (1 <= w, KnownNat w) => [BVRange w] -> [BVRange w] -> + [BVRange w] +bvRangesSubsetTo rngs1 rngs2 = + flip concatMap rngs1 $ \rng1 -> flip concatMap rngs2 $ \rng2 -> + bvRangeSubsetTo rng1 rng2 + +-- | Convert an 'MbRangeForType' in a binding to an 'MbRangeForType' +mbMbRangeForType :: KnownCruCtx ctx -> Mb ctx (MbRangeForType a) -> + MbRangeForType a +-- If the range can be lifted out of the binding, do so +mbMbRangeForType ctx mb_rngft + | Just rngft <- partialSubst (emptyPSubst $ knownCtxToCruCtx ctx) mb_rngft + = rngft +-- Otherwise, add the new variables to the existing bound variables +mbMbRangeForType ctx mb_rngft = case mbMatch mb_rngft of + [nuMP| MbRangeForLLVMType vars rng |] -> + MbRangeForLLVMType (RL.append ctx $ mbLift vars) + (mbCombine (RL.map (const Proxy) (mbLift vars)) rng) + [nuMP| MbRangeForStructType prxs memb rng |] -> + MbRangeForStructType (mbLift prxs) (mbLift memb) $ mbMbRangeForType ctx rng + +-- | Add a 'PermOffset' to an 'MbRangeForType +offsetMbRangeForType :: PermOffset a -> MbRangeForType a -> MbRangeForType a +offsetMbRangeForType NoPermOffset rng = rng +offsetMbRangeForType (LLVMPermOffset off) (MbRangeForLLVMType vars mb_rng) = + MbRangeForLLVMType vars $ fmap (offsetBVRange off) mb_rng + +-- | Like 'bvRangeDelete' but for 'MbRangeForType's +mbRangeFTDelete :: MbRangeForType a -> MbRangeForType a -> + [MbRangeForType a] +mbRangeFTDelete (MbRangeForLLVMType vars1 mb_rng1) (MbRangeForLLVMType + vars2 mb_rng2) = + map (MbRangeForLLVMType (RL.append vars1 vars2)) $ mbList $ + mbCombine (RL.map (const Proxy) vars2) $ + flip fmap mb_rng1 $ \rng1 -> flip fmap mb_rng2 $ \rng2 -> + bvRangeDelete rng1 rng2 +mbRangeFTDelete (MbRangeForStructType prxs1 memb1 rng1) (MbRangeForStructType + _ memb2 rng2) + | Just Refl <- testEquality memb1 memb2 = + map (MbRangeForStructType prxs1 memb1) $ mbRangeFTDelete rng1 rng2 +mbRangeFTDelete rng1@(MbRangeForStructType _ _ _) (MbRangeForStructType _ _ _) = + [rng1] + +-- | Delete all ranges in any of a list of ranges from +mbRangeFTsDelete :: [MbRangeForType a] -> [MbRangeForType a] -> + [MbRangeForType a] +mbRangeFTsDelete rngs_l rngs_r = + foldr (\rng_r rngs -> concatMap (flip mbRangeFTDelete rng_r) rngs) rngs_l rngs_r + +-- | Find all the offsets in the first 'MbRangeForType' that could be in the +-- second, in a manner similar to 'bvRangeSubsetTo' +mbRangeFTSubsetTo :: MbRangeForType a -> MbRangeForType a -> + [MbRangeForType a] +mbRangeFTSubsetTo (MbRangeForLLVMType vars1 mb_rng1) (MbRangeForLLVMType + vars2 mb_rng2) = + map (MbRangeForLLVMType (RL.append vars1 vars2)) $ mbList $ + mbCombine (RL.map (const Proxy) vars2) $ + flip fmap mb_rng1 $ \rng1 -> flip fmap mb_rng2 $ \rng2 -> + bvRangeSubsetTo rng1 rng2 +mbRangeFTSubsetTo (MbRangeForStructType prxs1 memb1 rng1) (MbRangeForStructType + _ memb2 rng2) + | Just Refl <- testEquality memb1 memb2 = + map (MbRangeForStructType prxs1 memb1) $ mbRangeFTSubsetTo rng1 rng2 +mbRangeFTSubsetTo (MbRangeForStructType _ _ _) (MbRangeForStructType _ _ _) = [] + +-- | Find all the offsets in an 'MbRangeForType' in the first list that could be +-- in one in the second, in a manner similar to 'bvRangesSubsetTo' +mbRangeFTsSubsetTo :: [MbRangeForType a] -> [MbRangeForType a] -> + [MbRangeForType a] +mbRangeFTsSubsetTo rngs1 rngs2 = + flip concatMap rngs1 $ \rng1 -> flip concatMap rngs2 $ \rng2 -> + mbRangeFTSubsetTo rng1 rng2 + -- | Build a bitvector expression from an integer bvInt :: (1 <= w, KnownNat w) => Integer -> PermExpr (BVType w) bvInt i = PExpr_BV [] $ BV.mkBV knownNat i @@ -2318,18 +2448,20 @@ pattern ValPerm_LLVMBlockShape sh <- ValPerm_Conj [Perm_LLVMBlockShape sh] -- | A single @lowned@ permission pattern ValPerm_LOwned :: () => (a ~ LifetimeType) => [PermExpr LifetimeType] -> - LOwnedPerms ps_in -> LOwnedPerms ps_out -> ValuePerm a -pattern ValPerm_LOwned ls ps_in ps_out <- ValPerm_Conj [Perm_LOwned - ls ps_in ps_out] + CruCtx ps_in -> CruCtx ps_out -> + ExprPerms ps_in -> ExprPerms ps_out -> ValuePerm a +pattern ValPerm_LOwned ls tps_in tps_out ps_in ps_out <- + ValPerm_Conj [Perm_LOwned ls tps_in tps_out ps_in ps_out] where - ValPerm_LOwned ls ps_in ps_out = ValPerm_Conj [Perm_LOwned ls ps_in ps_out] + ValPerm_LOwned ls tps_in tps_out ps_in ps_out = + ValPerm_Conj [Perm_LOwned ls tps_in tps_out ps_in ps_out] -- | A single simple @lowned@ permission pattern ValPerm_LOwnedSimple :: () => (a ~ LifetimeType) => - LOwnedPerms ps -> ValuePerm a -pattern ValPerm_LOwnedSimple ps <- ValPerm_Conj [Perm_LOwnedSimple ps] + CruCtx ps -> ExprPerms ps -> ValuePerm a +pattern ValPerm_LOwnedSimple tps ps <- ValPerm_Conj [Perm_LOwnedSimple tps ps] where - ValPerm_LOwnedSimple ps = ValPerm_Conj [Perm_LOwnedSimple ps] + ValPerm_LOwnedSimple tps ps = ValPerm_Conj [Perm_LOwnedSimple tps ps] -- | A single @lcurrent@ permission pattern ValPerm_LCurrent :: () => (a ~ LifetimeType) => @@ -2344,6 +2476,14 @@ pattern ValPerm_LFinished <- ValPerm_Conj [Perm_LFinished] where ValPerm_LFinished = ValPerm_Conj [Perm_LFinished] +-- | A single @struct@ permission +pattern ValPerm_Struct :: () => (a ~ StructType ctx) => + RAssign ValuePerm (CtxToRList ctx) -> + ValuePerm a +pattern ValPerm_Struct ps <- ValPerm_Conj [Perm_Struct ps] + where + ValPerm_Struct ps = ValPerm_Conj [Perm_Struct ps] + pattern ValPerms_Nil :: () => (tps ~ RNil) => ValuePerms tps pattern ValPerms_Nil = MNil @@ -2514,118 +2654,51 @@ instance Eq (LLVMFieldShape w) where _ == _ = False -instance TestEquality LOwnedPerm where - testEquality (LOwnedPermField e1 fp1) (LOwnedPermField e2 fp2) - | Just Refl <- testEquality (exprType e1) (exprType e2) - , Just Refl <- testEquality (llvmFieldSize fp1) (llvmFieldSize fp2) - , e1 == e2 && fp1 == fp2 - = Just Refl - testEquality (LOwnedPermField _ _) _ = Nothing - testEquality (LOwnedPermArray e1 ap1) (LOwnedPermArray e2 ap2) - | Just Refl <- testEquality (exprType e1) (exprType e2) - , e1 == e2 && ap1 == ap2 - = Just Refl - testEquality (LOwnedPermArray _ _) _ = Nothing - testEquality (LOwnedPermBlock e1 bp1) (LOwnedPermBlock e2 bp2) - | Just Refl <- testEquality (exprType e1) (exprType e2) - , e1 == e2 && bp1 == bp2 - = Just Refl - testEquality (LOwnedPermBlock _ _) _ = Nothing +-- | Convert an 'ExprAndPerm' to a variable plus permission, if possible +exprPermVarAndPerm :: ExprAndPerm a -> Maybe (VarAndPerm a) +exprPermVarAndPerm (ExprAndPerm e p) + | Just (x, off) <- asVarOffset e = + Just $ VarAndPerm x (offsetPerm off p) +exprPermVarAndPerm _ = Nothing + +-- | Convert an 'ExprPerms' to a 'DistPerms', if possible +exprPermsToDistPerms :: ExprPerms ctx -> Maybe (DistPerms ctx) +exprPermsToDistPerms = traverseRAssign exprPermVarAndPerm + +-- | Find all permissions in an 'ExprPerms' list for a variable +exprPermsForVar :: ExprVar a -> ExprPerms ps -> [ValuePerm a] +exprPermsForVar _ MNil = [] +exprPermsForVar x (ps :>: e_and_p) + | Just (VarAndPerm y p) <- exprPermVarAndPerm e_and_p + , Just Refl <- testEquality x y + = p : exprPermsForVar x ps +exprPermsForVar x (ps :>: _) = exprPermsForVar x ps + +-- | Get the permissions resulting from converting an 'ExprPerms' to a +-- 'DistPerms', if possible. Note taht this can be different from just getting +-- the permissions in the 'ExprPerms', because they may be offset by offsets on +-- variables in the expressions. +exprPermsToValuePerms :: ExprPerms ctx -> Maybe (ValuePerms ctx) +exprPermsToValuePerms = fmap distPermsToValuePerms . exprPermsToDistPerms + +-- | Get the permisisons in an 'ExprPerms' in bindings +mbExprPermsToValuePerms :: Mb ctx (ExprPerms ps) -> + Maybe (Mb ctx (ValuePerms ps)) +mbExprPermsToValuePerms = + mbMaybe . mbMapCl $(mkClosed [| exprPermsToValuePerms |]) + +-- | Convert an expression plus permission to an 'ExprAndPerm' +varAndPermExprPerm :: VarAndPerm a -> ExprAndPerm a +varAndPermExprPerm (VarAndPerm x p) = ExprAndPerm (PExpr_Var x) p -instance Eq (LOwnedPerm a) where - lop1 == lop2 | Just Refl <- testEquality lop1 lop2 = True - _ == _ = False +-- | Convert a 'DistPerms' to an 'ExprPerms' +distPermsToExprPerms :: DistPerms ps -> ExprPerms ps +distPermsToExprPerms = RL.map varAndPermExprPerm -instance Eq1 LOwnedPerm where - eq1 = (==) +-- | Convert the expressions in an 'ExprPerms' to variables, if possible +exprPermsVars :: ExprPerms ps -> Maybe (RAssign Name ps) +exprPermsVars = fmap distPermsVars . exprPermsToDistPerms --- | Convert an 'LOwnedPerm' to the expression plus permission it represents -lownedPermExprAndPerm :: LOwnedPerm a -> ExprAndPerm a -lownedPermExprAndPerm (LOwnedPermField e fp) = - ExprAndPerm e $ ValPerm_LLVMField fp -lownedPermExprAndPerm (LOwnedPermArray e ap) = - ExprAndPerm e $ ValPerm_LLVMArray ap -lownedPermExprAndPerm (LOwnedPermBlock e bp) = - ExprAndPerm e $ ValPerm_LLVMBlock bp - --- | Convert an 'LOwnedPerm' to a variable plus permission, if possible -lownedPermVarAndPerm :: LOwnedPerm a -> Maybe (VarAndPerm a) -lownedPermVarAndPerm lop - | Just (x, off) <- asVarOffset (lownedPermExpr lop) = - Just $ VarAndPerm x (offsetPerm off $ lownedPermPerm lop) -lownedPermVarAndPerm _ = Nothing - --- | Convert an expression plus permission to an 'LOwnedPerm', if possible -varAndPermLOwnedPerm :: VarAndPerm a -> Maybe (LOwnedPerm a) -varAndPermLOwnedPerm (VarAndPerm x (ValPerm_LLVMField fp)) = - Just $ LOwnedPermField (PExpr_Var x) fp -varAndPermLOwnedPerm (VarAndPerm x (ValPerm_LLVMArray ap)) = - Just $ LOwnedPermArray (PExpr_Var x) ap -varAndPermLOwnedPerm (VarAndPerm x (ValPerm_LLVMBlock bp)) = - Just $ LOwnedPermBlock (PExpr_Var x) bp -varAndPermLOwnedPerm _ = Nothing - --- | Get the expression part of an 'LOwnedPerm' -lownedPermExpr :: LOwnedPerm a -> PermExpr a -lownedPermExpr = exprAndPermExpr . lownedPermExprAndPerm - --- | Convert the expression part of an 'LOwnedPerm' to a variable, if possible -lownedPermVar :: LOwnedPerm a -> Maybe (ExprVar a) -lownedPermVar lop | PExpr_Var x <- lownedPermExpr lop = Just x -lownedPermVar _ = Nothing - --- | Get the permission part of an 'LOwnedPerm' -lownedPermPerm :: LOwnedPerm a -> ValuePerm a -lownedPermPerm = exprAndPermPerm . lownedPermExprAndPerm - --- | Convert the permission part of an 'LOwnedPerm' to a block permission on a --- variable, if possible -lownedPermVarBlockPerm :: LOwnedPerm a -> Maybe (ExprVar a, SomeLLVMBlockPerm a) -lownedPermVarBlockPerm lop - | Just (x, perm_off) <- asVarOffset (lownedPermExpr lop) - , ValPerm_Conj1 p <- lownedPermPerm lop - , Just (SomeLLVMBlockPerm bp) <- llvmAtomicPermToSomeBlock p - , off <- llvmPermOffsetExpr perm_off = - Just (x, SomeLLVMBlockPerm (offsetLLVMBlockPerm off bp)) -lownedPermVarBlockPerm _ = Nothing - --- | Convert the permission part of an 'LOwnedPerm' in a binding to a block --- permission on a variable in a binding, if possible -mbLownedPermVarBlockPerm :: Mb ctx (LOwnedPerm a) -> - Maybe (Mb ctx (ExprVar a, SomeLLVMBlockPerm a)) -mbLownedPermVarBlockPerm = - mbMaybe . mbMapCl $(mkClosed [| lownedPermVarBlockPerm |]) - --- | Get the read/write and lifetime modalities of an 'LOwnedPerm' of LLVM type -llvmLownedPermModalities :: LOwnedPerm (LLVMPointerType w) -> - (PermExpr RWModalityType, PermExpr LifetimeType) -llvmLownedPermModalities (LOwnedPermField _ fp) = - (llvmFieldRW fp, llvmFieldLifetime fp) -llvmLownedPermModalities (LOwnedPermArray _ ap) = - (llvmArrayRW ap, llvmArrayLifetime ap) -llvmLownedPermModalities (LOwnedPermBlock _ bp) = - (llvmBlockRW bp, llvmBlockLifetime bp) - --- | Find an 'LOwnedPerm' for a particular variable in an 'LOwnedPerms' list -findLOwnedPermForVar :: ExprVar a -> LOwnedPerms ps -> Maybe (LOwnedPerm a) -findLOwnedPermForVar _ MNil = Nothing -findLOwnedPermForVar x (_ :>: lop) - | Just (y, _) <- asVarOffset (lownedPermExpr lop) - , Just Refl <- testEquality x y = Just lop -findLOwnedPermForVar x (lops :>: _) = findLOwnedPermForVar x lops - --- | Find all 'LOwnedPerm's for a specific variable of LLVM pointer type in an --- 'LOwnedPerms' list, and return the ranges of offsets that each of those cover -lownedPermsOffsetsForLLVMVar :: (1 <= w, KnownNat w) => - ExprVar (LLVMPointerType w) -> LOwnedPerms ps -> - [BVRange w] -lownedPermsOffsetsForLLVMVar _ MNil = [] -lownedPermsOffsetsForLLVMVar x (lops :>: lop) - | Just (y, SomeLLVMBlockPerm bp) <- lownedPermVarBlockPerm lop - , Just Refl <- testEquality x y = - llvmBlockRange bp : lownedPermsOffsetsForLLVMVar x lops -lownedPermsOffsetsForLLVMVar x (lops :>: _) = - lownedPermsOffsetsForLLVMVar x lops -- | Extract the @args@ context from a function permission funPermArgs :: FunPerm ghosts args gouts ret -> CruCtx args @@ -2661,6 +2734,12 @@ funPermOuts :: FunPerm ghosts args gouts ret -> MbValuePerms ((ghosts :++: args) :++: gouts :> ret) funPermOuts (FunPerm _ _ _ _ _ perms_out) = perms_out +-- | Build the context of types for the output permissions of a function +funPermOutCtx :: FunPerm ghosts args gouts ret -> + CruCtx ((ghosts :++: args) :++: gouts :> ret) +funPermOutCtx fun_perm = + appendCruCtx (funPermTops fun_perm) (funPermRets fun_perm) + -- | Test whether a name of a given 'NameSort' can be folded / unfolded type family NameSortCanFold (ns::NameSort) :: Bool where @@ -2920,21 +2999,6 @@ data DistPerms ps where type MbDistPerms ps = Mb ps (DistPerms ps) --- | A pair of an epxression and its permission; we give it its own datatype to --- make certain typeclass instances (like pretty-printing) specific to it -data ExprAndPerm a = - ExprAndPerm { exprAndPermExpr :: PermExpr a, - exprAndPermPerm :: ValuePerm a } - --- | A list of expressions and associated permissions; different from --- 'DistPerms' because the expressions need not be variables -type ExprPerms = RAssign ExprAndPerm - --- | Convert a 'DistPerms' to an 'ExprPerms' -distPermsToExprPerms :: DistPerms ps -> ExprPerms ps -distPermsToExprPerms = - RL.map (\(VarAndPerm x p) -> ExprAndPerm (PExpr_Var x) p) - -- FIXME: change all of the following functions on DistPerms to use the RAssign -- combinators @@ -2977,6 +3041,13 @@ valuePermsToDistPerms (ns :>: n) (ps :>: p) = mbValuePermsToDistPerms :: MbValuePerms ps -> MbDistPerms ps mbValuePermsToDistPerms = nuMultiWithElim1 valuePermsToDistPerms +-- | Extract the permissions for a particular variable in a 'DistPerms' list +distPermsForVar :: ExprVar a -> DistPerms ps -> [ValuePerm a] +distPermsForVar _ MNil = [] +distPermsForVar x (ps :>: VarAndPerm y p) + | Just Refl <- testEquality x y = p : distPermsForVar x ps +distPermsForVar x (ps :>: _) = distPermsForVar x ps + -- | Extract the permissions from a 'DistPerms' distPermsToValuePerms :: DistPerms ps -> ValuePerms ps distPermsToValuePerms DistPermsNil = ValPerms_Nil @@ -3000,6 +3071,10 @@ trueDistPerms (ns :>: n) = DistPermsCons (trueDistPerms ns) n ValPerm_True -- | A list of "distinguished" permissions with types type TypedDistPerms = RAssign (Typed VarAndPerm) +-- | Get the 'CruCtx' for a 'TypedDistPerms' +typedDistPermsCtx :: TypedDistPerms ctx -> CruCtx ctx +typedDistPermsCtx = cruCtxOfTypes . RL.map typedType + -- | Convert a permission list expression to a 'TypedDistPerms', if possible permListToTypedPerms :: PermExpr PermListType -> Maybe (Some TypedDistPerms) permListToTypedPerms PExpr_PermListNil = Just $ Some MNil @@ -3037,6 +3112,12 @@ instance Eq (VarAndPerm a) where instance Eq1 VarAndPerm where eq1 = (==) +instance Eq (ExprAndPerm a) where + ExprAndPerm e1 p1 == ExprAndPerm e2 p2 = e1 == e2 && p1 == p2 + +instance Eq1 ExprAndPerm where + eq1 = (==) + {- instance TestEquality DistPerms where testEquality DistPermsNil DistPermsNil = Just Refl @@ -3068,17 +3149,17 @@ lcurrentPerm (PExpr_Var l) l2 = (l, ValPerm_LCurrent $ PExpr_Var l2) lifetimeCurrentPermsLifetime :: LifetimeCurrentPerms ps_l -> PermExpr LifetimeType lifetimeCurrentPermsLifetime AlwaysCurrentPerms = PExpr_Always -lifetimeCurrentPermsLifetime (LOwnedCurrentPerms l _ _ _) = PExpr_Var l -lifetimeCurrentPermsLifetime (LOwnedSimpleCurrentPerms l _) = PExpr_Var l +lifetimeCurrentPermsLifetime (LOwnedCurrentPerms l _ _ _ _ _) = PExpr_Var l +lifetimeCurrentPermsLifetime (LOwnedSimpleCurrentPerms l _ _) = PExpr_Var l lifetimeCurrentPermsLifetime (CurrentTransPerms _ l) = PExpr_Var l -- | Convert a 'LifetimeCurrentPerms' to the 'DistPerms' it represent lifetimeCurrentPermsPerms :: LifetimeCurrentPerms ps_l -> DistPerms ps_l lifetimeCurrentPermsPerms AlwaysCurrentPerms = DistPermsNil -lifetimeCurrentPermsPerms (LOwnedCurrentPerms l ls ps_in ps_out) = - DistPermsCons DistPermsNil l $ ValPerm_LOwned ls ps_in ps_out -lifetimeCurrentPermsPerms (LOwnedSimpleCurrentPerms l lops) = - distPerms1 l $ ValPerm_LOwnedSimple lops +lifetimeCurrentPermsPerms (LOwnedCurrentPerms l ls tps_in tps_out ps_in ps_out) = + DistPermsCons DistPermsNil l $ ValPerm_LOwned ls tps_in tps_out ps_in ps_out +lifetimeCurrentPermsPerms (LOwnedSimpleCurrentPerms l tps lops) = + distPerms1 l $ ValPerm_LOwnedSimple tps lops lifetimeCurrentPermsPerms (CurrentTransPerms cur_ps l) = DistPermsCons (lifetimeCurrentPermsPerms cur_ps) l $ ValPerm_Conj1 $ Perm_LCurrent $ lifetimeCurrentPermsLifetime cur_ps @@ -3088,8 +3169,8 @@ mbLifetimeCurrentPermsProxies :: Mb ctx (LifetimeCurrentPerms ps_l) -> RAssign Proxy ps_l mbLifetimeCurrentPermsProxies mb_l = case mbMatch mb_l of [nuMP| AlwaysCurrentPerms |] -> MNil - [nuMP| LOwnedCurrentPerms _ _ _ _ |] -> MNil :>: Proxy - [nuMP| LOwnedSimpleCurrentPerms _ _ |] -> MNil :>: Proxy + [nuMP| LOwnedCurrentPerms _ _ _ _ _ _ |] -> MNil :>: Proxy + [nuMP| LOwnedSimpleCurrentPerms _ _ _ |] -> MNil :>: Proxy [nuMP| CurrentTransPerms cur_ps _ |] -> mbLifetimeCurrentPermsProxies cur_ps :>: Proxy @@ -3103,16 +3184,6 @@ ltFuncApply (LTFunctorArray off len stride sh bs) (MNil :>: rw) l = ltFuncApply (LTFunctorBlock off len sh) (MNil :>: rw) l = ValPerm_LLVMBlock $ LLVMBlockPerm rw l off len sh --- | Apply a functor to its arguments to get out an 'LOwnedPerm' on a variable -ltFuncApplyLOP :: ExprVar a -> LifetimeFunctor args a -> PermExprs args -> - PermExpr LifetimeType -> LOwnedPerm a -ltFuncApplyLOP x (LTFunctorField off p) (MNil :>: rw) l = - LOwnedPermField (PExpr_Var x) $ LLVMFieldPerm rw l off p -ltFuncApplyLOP x (LTFunctorArray off len stride sh bs) (MNil :>: rw) l = - LOwnedPermArray (PExpr_Var x) $ LLVMArrayPerm rw l off len stride sh bs -ltFuncApplyLOP x (LTFunctorBlock off len sh) (MNil :>: rw) l = - LOwnedPermBlock (PExpr_Var x) $ LLVMBlockPerm rw l off len sh - -- | Apply a functor to a lifetime and the "minimal" rwmodalities, i.e., with -- all read permissions ltFuncMinApply :: LifetimeFunctor args a -> PermExpr LifetimeType -> ValuePerm a @@ -3123,17 +3194,6 @@ ltFuncMinApply (LTFunctorArray off len stride sh bs) l = ltFuncMinApply (LTFunctorBlock off len sh) l = ValPerm_LLVMBlock $ LLVMBlockPerm PExpr_Read l off len sh --- | Apply a functor to a lifetime and the "minimal" rwmodalities, i.e., with --- all read permissions, getting out an 'LOwnedPerm' on a variable -ltFuncMinApplyLOP :: ExprVar a -> LifetimeFunctor args a -> - PermExpr LifetimeType -> LOwnedPerm a -ltFuncMinApplyLOP x (LTFunctorField off p) l = - LOwnedPermField (PExpr_Var x) $ LLVMFieldPerm PExpr_Read l off p -ltFuncMinApplyLOP x (LTFunctorArray off len stride sh bs) l = - LOwnedPermArray (PExpr_Var x) $ LLVMArrayPerm PExpr_Read l off len stride sh bs -ltFuncMinApplyLOP x (LTFunctorBlock off len sh) l = - LOwnedPermBlock (PExpr_Var x) $ LLVMBlockPerm PExpr_Read l off len sh - -- | Convert a field permission to a lifetime functor and its arguments fieldToLTFunc :: (1 <= w, KnownNat w, 1 <= sz, KnownNat sz) => LLVMFieldPerm w sz -> @@ -3199,14 +3259,16 @@ instance Eq (AtomicPerm a) where (Perm_LLVMBlockShape _) == _ = False (Perm_LLVMFrame frame1) == (Perm_LLVMFrame frame2) = frame1 == frame2 (Perm_LLVMFrame _) == _ = False - (Perm_LOwned ls1 ps_in1 ps_out1) == (Perm_LOwned ls2 ps_in2 ps_out2) - | Just Refl <- testEquality ps_in1 ps_in2 - , Just Refl <- testEquality ps_out1 ps_out2 - = ls1 == ls2 - (Perm_LOwned _ _ _) == _ = False - (Perm_LOwnedSimple lops1) == (Perm_LOwnedSimple lops2) - | Just Refl <- testEquality lops1 lops2 = True - (Perm_LOwnedSimple _) == _ = False + (Perm_LOwned + ls1 tps_in1 tps_out1 ps_in1 ps_out1) == (Perm_LOwned + ls2 tps_in2 tps_out2 ps_in2 ps_out2) + | Just Refl <- testEquality tps_in1 tps_in2 + , Just Refl <- testEquality tps_out1 tps_out2 + = ls1 == ls2 && ps_in1 == ps_in2 && ps_out1 == ps_out2 + (Perm_LOwned _ _ _ _ _) == _ = False + (Perm_LOwnedSimple tps1 lops1) == (Perm_LOwnedSimple tps2 lops2) + | Just Refl <- testEquality tps1 tps2 = lops1 == lops2 + (Perm_LOwnedSimple _ _) == _ = False (Perm_LCurrent e1) == (Perm_LCurrent e2) = e1 == e2 (Perm_LCurrent _) == _ = False Perm_LFinished == Perm_LFinished = True @@ -3365,7 +3427,7 @@ instance PermPretty (AtomicPerm a) where permPrettyM (Perm_LLVMFrame fperm) = do pps <- mapM (\(e,i) -> (<> (colon <> pretty i)) <$> permPrettyM e) fperm return (pretty "llvmframe" <+> ppEncList False pps) - permPrettyM (Perm_LOwned ls ps_in ps_out) = + permPrettyM (Perm_LOwned ls _ _ ps_in ps_out) = do pp_in <- permPrettyM ps_in pp_out <- permPrettyM ps_out ls_pp <- case ls of @@ -3373,7 +3435,7 @@ instance PermPretty (AtomicPerm a) where _ -> ppEncList False <$> mapM permPrettyM ls return (pretty "lowned" <> ls_pp <+> parens (align $ sep [pp_in, pretty "-o", pp_out])) - permPrettyM (Perm_LOwnedSimple lops) = + permPrettyM (Perm_LOwnedSimple _ lops) = (pretty "lowned" <>) <$> parens <$> permPrettyM lops permPrettyM (Perm_LCurrent l) = (pretty "lcurrent" <+>) <$> permPrettyM l permPrettyM Perm_LFinished = return (pretty "lfinished") @@ -3393,12 +3455,6 @@ instance PermPretty (PermOffset a) where do e_pp <- permPrettyM e return (pretty '@' <> parens e_pp) -instance PermPretty (LOwnedPerm a) where - permPrettyM = permPrettyM . lownedPermExprAndPerm - -instance PermPrettyF LOwnedPerm where - permPrettyMF = permPrettyM - instance PermPretty (FunPerm ghosts args gouts ret) where permPrettyM (FunPerm ghosts args gouts _ mb_ps_in mb_ps_out) = fmap mbLift $ strongMbM $ @@ -3431,6 +3487,14 @@ instance PermPretty (BVRange w) where (\pp1 pp2 -> braces (pp1 <> comma <+> pp2)) <$> permPrettyM e1 <*> permPrettyM e2 +instance PermPretty (MbRangeForType a) where + permPrettyM (MbRangeForLLVMType _ mb_rng) = permPrettyM mb_rng + permPrettyM (MbRangeForStructType prxs memb rng) = + do pp_rng <- permPrettyM rng + return $ hcat $ intersperse comma $ + RL.toList $ RL.set memb (Constant pp_rng) $ + RL.map (const $ Constant PP.emptyDoc) prxs + instance PermPretty (BVProp w) where permPrettyM (BVProp_Eq e1 e2) = (\pp1 pp2 -> pp1 <+> equals <+> pp2) <$> permPrettyM e1 <*> permPrettyM e2 @@ -3501,19 +3565,6 @@ exPermBody tp (ValPerm_Exists (p :: Binding tp' (ValuePerm a))) | Just Refl <- testEquality tp (knownRepr :: TypeRepr tp') = p exPermBody _ _ = error "exPermBody" --- | A representation of a context of types as a sequence of 'KnownRepr' --- instances --- --- FIXME: this can go away when existentials take explicit 'TypeRepr's instead --- of 'KnownRepr TypeRepr' instances, as per issue #79 -type KnownCruCtx = RAssign (KnownReprObj TypeRepr) - --- | Convert a 'KnownCruCtx' to a 'CruCtx' -knownCtxToCruCtx :: KnownCruCtx ctx -> CruCtx ctx -knownCtxToCruCtx MNil = CruCtxNil -knownCtxToCruCtx (ctx :>: KnownReprObj) = - CruCtxCons (knownCtxToCruCtx ctx) knownRepr - -- | Construct 0 or more nested existential permissions valPermExistsMulti :: KnownCruCtx ctx -> Mb ctx (ValuePerm a) -> ValuePerm a valPermExistsMulti MNil mb_p = elimEmptyMb mb_p @@ -3560,16 +3611,16 @@ isLLVMPointerPerm _ = False -- | Test if an 'AtomicPerm' is a lifetime permission isLifetimePerm :: AtomicPerm a -> Maybe (a :~: LifetimeType) -isLifetimePerm (Perm_LOwned _ _ _) = Just Refl -isLifetimePerm (Perm_LOwnedSimple _) = Just Refl +isLifetimePerm (Perm_LOwned _ _ _ _ _) = Just Refl +isLifetimePerm (Perm_LOwnedSimple _ _) = Just Refl isLifetimePerm (Perm_LCurrent _) = Just Refl isLifetimePerm Perm_LFinished = Just Refl isLifetimePerm _ = Nothing -- | Test if an 'AtomicPerm' is a lifetime permission that gives ownership isLifetimeOwnershipPerm :: AtomicPerm a -> Maybe (a :~: LifetimeType) -isLifetimeOwnershipPerm (Perm_LOwned _ _ _) = Just Refl -isLifetimeOwnershipPerm (Perm_LOwnedSimple _) = Just Refl +isLifetimeOwnershipPerm (Perm_LOwned _ _ _ _ _) = Just Refl +isLifetimeOwnershipPerm (Perm_LOwnedSimple _ _) = Just Refl isLifetimeOwnershipPerm _ = Nothing -- | Test if an 'AtomicPerm' is a struct permission @@ -3881,6 +3932,12 @@ llvmBlockPermToField sz bp llvmFieldContents = p } llvmBlockPermToField _ _ = Nothing +-- | Get the range of bytes described by an array permisison. Note that these +-- bytes may not currently be *in* the array permission, if it has any borrows. +llvmArrayRange :: (1 <= w, KnownNat w) => LLVMArrayPerm w -> BVRange w +llvmArrayRange fp = + BVRange (llvmArrayOffset fp) (llvmArrayLengthBytes fp) + -- | Convert an array permission with total size @sz@ bits to a field permission -- of size @sz@ bits, assuming it has no borrows llvmArrayToField :: (1 <= w, KnownNat w, 1 <= sz, KnownNat sz) => @@ -4076,6 +4133,47 @@ isLLVMPointerShape (PExpr_FieldShape (LLVMFieldShape (ValPerm_Conj1 p))) = isLLVMPointerShape (PExpr_PtrShape _ _ _) = True isLLVMPointerShape _ = False +-- | Find any shapes of the form @fieldsh(eq(y))@ in a shape and return the @y@ +-- variables +findEqVarFieldsInShape :: PermExpr (LLVMShapeType w) -> NameSet CrucibleType +findEqVarFieldsInShape sh = + runReader (findEqVarFieldsInShapeH sh) Set.empty + +-- | Find any shapes of the form @fieldsh(eq(y))@ in a shape and return the @y@ +-- variables, using the supplied 'Set' to indicate recursive named shapes that +-- have already been unfolded to get the current shape, to avoid infinite loops +findEqVarFieldsInShapeH :: PermExpr (LLVMShapeType w) -> + Reader (Set String) (NameSet CrucibleType) +findEqVarFieldsInShapeH (PExpr_NamedShape _ _ nmsh args) + | DefinedShapeBody _ <- namedShapeBody nmsh = + -- NOTE: we don't need to modalize the unfolding because that doesn't change + -- the variable fields + findEqVarFieldsInShapeH (unfoldNamedShape nmsh args) +findEqVarFieldsInShapeH (PExpr_NamedShape _ _ nmsh args) + | RecShapeBody _ _ _ <- namedShapeBody nmsh = + do seen_names <- ask + if Set.member (namedShapeName nmsh) seen_names then + return NameSet.empty + else + -- NOTE: we don't need to modalize the unfolding because that doesn't + -- change the variable fields + local (Set.insert (namedShapeName nmsh)) $ + findEqVarFieldsInShapeH (unfoldNamedShape nmsh args) +findEqVarFieldsInShapeH (PExpr_PtrShape _ _ sh) = findEqVarFieldsInShapeH sh +findEqVarFieldsInShapeH (PExpr_FieldShape (LLVMFieldShape + (ValPerm_Eq (PExpr_Var y)))) = + return $ NameSet.singleton y +findEqVarFieldsInShapeH (PExpr_FieldShape _) = return $ NameSet.empty +findEqVarFieldsInShapeH (PExpr_ArrayShape _ _ sh) = findEqVarFieldsInShapeH sh +findEqVarFieldsInShapeH (PExpr_SeqShape sh1 sh2) = + NameSet.union <$> findEqVarFieldsInShapeH sh1 <*> findEqVarFieldsInShapeH sh2 +findEqVarFieldsInShapeH (PExpr_OrShape sh1 sh2) = + NameSet.union <$> findEqVarFieldsInShapeH sh1 <*> findEqVarFieldsInShapeH sh2 +findEqVarFieldsInShapeH (PExpr_ExShape mb_sh) = + fmap NameSet.liftNameSet $ strongMbM $ + fmap findEqVarFieldsInShapeH mb_sh +findEqVarFieldsInShapeH _ = return $ NameSet.empty + -- | Return the expression for the length of a shape if there is one llvmShapeLength :: (1 <= w, KnownNat w) => PermExpr (LLVMShapeType w) -> Maybe (PermExpr (BVType w)) @@ -4178,55 +4276,233 @@ matchLLVMFieldShapeSeq (PExpr_SeqShape sh1 sh2) = (++) <$> matchLLVMFieldShapeSeq sh1 <*> matchLLVMFieldShapeSeq sh2 matchLLVMFieldShapeSeq _ = Nothing +-- | Get all the top-level ranges of offsets potentially covered by a permission +-- in any of its disjunctive branches +class GetOffsets f where + getOffsets :: f a -> [MbRangeForType a] + +instance GetOffsets ValuePerm where + getOffsets (ValPerm_Eq _) = [] + getOffsets (ValPerm_Or p1 p2) = getOffsets p1 ++ getOffsets p2 + getOffsets (ValPerm_Exists mb_p) = + map (mbMbRangeForType (MNil :>: KnownReprObj)) $ + mbList $ fmap getOffsets mb_p + getOffsets (ValPerm_Named _ _ _) = [] + getOffsets (ValPerm_Var _ _) = [] + getOffsets (ValPerm_Conj ps) = concatMap getOffsets ps + getOffsets ValPerm_False = [] + +instance GetOffsets AtomicPerm where + getOffsets (Perm_LLVMField fp) = + [rangeForLLVMType $ llvmFieldRange fp] + getOffsets (Perm_LLVMArray ap) = + [rangeForLLVMType $ llvmArrayRange ap] + getOffsets (Perm_LLVMBlock bp) = + [rangeForLLVMType $ llvmBlockRange bp] + getOffsets (Perm_Struct ps) = + concat $ RL.mapToList (\memb -> + map (MbRangeForStructType + (RL.map (const Proxy) ps) memb) $ + getOffsets $ RL.get memb ps) $ + RL.members ps + getOffsets _ = [] + + -- | Add the given read/write and lifetime modalities to all top-level pointer --- shapes in a shape. Top-level here means we do not recurse inside pointer --- shapes, as pointer shape modalities also apply recursively to the contained --- shapes. If there are any top-level variables in the shape, then this fails, --- since there is no way to modalize a variable shape. +-- permissions or shapes in a permission or shape. Top-level here means we do +-- not recurse inside pointer shapes, as pointer shape modalities also apply +-- recursively to the contained shapes. If there are any top-level variables in +-- the permission or shape, then this fails, since there is no way to modalize a +-- variable. -- -- The high-level idea here is that pointer shapes take on the read/write and -- lifetime modalities of the @memblock@ permission containing them, and --- 'modalizeShape' folds these modalities into the shape itself. -modalizeShape :: Maybe (PermExpr RWModalityType) -> - Maybe (PermExpr LifetimeType) -> - PermExpr (LLVMShapeType w) -> - Maybe (PermExpr (LLVMShapeType w)) -modalizeShape Nothing Nothing sh = - -- If neither modality is given, it is a no-op - Just sh -modalizeShape _ _ (PExpr_Var _) = - -- Variables cannot be modalized; NOTE: we could fix this if necessary by - -- adding a modalized variable shape constructor - Nothing -modalizeShape _ _ PExpr_EmptyShape = Just PExpr_EmptyShape -modalizeShape _ _ sh@(PExpr_NamedShape _ _ nmsh _) - | not (namedShapeCanUnfold nmsh) = - -- Opaque shapes are not affected by modalization, because we assume they do - -- not have any top-level pointers in them +-- 'modalize' folds these modalities into the shape itself. This is also used to +-- compute the least version of a permission when building @lowned@ permissions. +class Modalize a where + modalize :: Maybe (PermExpr RWModalityType) -> + Maybe (PermExpr LifetimeType) -> + a -> Maybe a + +instance Modalize (PermExpr (LLVMShapeType w)) where + modalize Nothing Nothing sh = + -- If neither modality is given, it is a no-op Just sh -modalizeShape rw l (PExpr_NamedShape rw' l' nmsh args) = - -- If a named shape already has modalities, they take precedence - Just $ PExpr_NamedShape (rw' <|> rw) (l' <|> l) nmsh args -modalizeShape _ _ sh@(PExpr_EqShape _ _) = Just sh -modalizeShape rw l (PExpr_PtrShape rw' l' sh) = - -- If a pointer shape already has modalities, they take precedence - Just $ PExpr_PtrShape (rw' <|> rw) (l' <|> l) sh -modalizeShape _ _ sh@(PExpr_FieldShape _) = Just sh -modalizeShape _ _ sh@(PExpr_ArrayShape _ _ _) = Just sh -modalizeShape rw l (PExpr_SeqShape sh1 sh2) = - PExpr_SeqShape <$> modalizeShape rw l sh1 <*> modalizeShape rw l sh2 -modalizeShape rw l (PExpr_OrShape sh1 sh2) = - PExpr_OrShape <$> modalizeShape rw l sh1 <*> modalizeShape rw l sh2 -modalizeShape rw l (PExpr_ExShape mb_sh) = - PExpr_ExShape <$> mbM (fmap (modalizeShape rw l) mb_sh) -modalizeShape _ _ PExpr_FalseShape = Just PExpr_FalseShape - --- | Apply 'modalizeShape' to the shape of a block permission, raising an error --- if 'modalizeShape' cannot be applied + modalize _ _ (PExpr_Var _) = + -- Variables cannot be modalized; NOTE: we could fix this if necessary by + -- adding a modalized variable shape constructor + Nothing + modalize _ _ PExpr_EmptyShape = Just PExpr_EmptyShape + modalize _ _ sh@(PExpr_NamedShape _ _ nmsh _) + | not (namedShapeCanUnfold nmsh) = + -- Opaque shapes are not affected by modalization, because we assume they do + -- not have any top-level pointers in them + Just sh + modalize rw l (PExpr_NamedShape rw' l' nmsh args) = + -- If a named shape already has modalities, they take precedence + Just $ PExpr_NamedShape (rw' <|> rw) (l' <|> l) nmsh args + modalize _ _ sh@(PExpr_EqShape _ _) = Just sh + modalize rw l (PExpr_PtrShape rw' l' sh) = + -- If a pointer shape already has modalities, they take precedence + Just $ PExpr_PtrShape (rw' <|> rw) (l' <|> l) sh + modalize _ _ sh@(PExpr_FieldShape _) = Just sh + modalize _ _ sh@(PExpr_ArrayShape _ _ _) = Just sh + modalize rw l (PExpr_SeqShape sh1 sh2) = + PExpr_SeqShape <$> modalize rw l sh1 <*> modalize rw l sh2 + modalize rw l (PExpr_OrShape sh1 sh2) = + PExpr_OrShape <$> modalize rw l sh1 <*> modalize rw l sh2 + modalize rw l (PExpr_ExShape mb_sh) = + PExpr_ExShape <$> mbM (fmap (modalize rw l) mb_sh) + modalize _ _ PExpr_FalseShape = Just PExpr_FalseShape + +instance Modalize (ValuePerm a) where + modalize _ _ p@(ValPerm_Eq _) = Just p + modalize rw l (ValPerm_Or p1 p2) = + ValPerm_Or <$> modalize rw l p1 <*> modalize rw l p2 + modalize rw l (ValPerm_Exists mb_p) = + fmap ValPerm_Exists $ mbMaybe $ fmap (modalize rw l) mb_p + modalize _ _ (ValPerm_Named _ _ _) = + -- Cannot modalize an arbitrary opaque named permission; this would require + -- special-purpose modality arguments to every opaque named permission, so + -- we could be sure that changing these would modalize its unfolding + Nothing + modalize _ _ (ValPerm_Var _ _) = Nothing + modalize rw l (ValPerm_Conj ps) = ValPerm_Conj <$> mapM (modalize rw l) ps + modalize _ _ ValPerm_False = Just ValPerm_False + +instance Modalize (AtomicPerm a) where + modalize rw l (Perm_LLVMField fp) = + Just $ Perm_LLVMField $ + fp { llvmFieldRW = fromMaybe (llvmFieldRW fp) rw, + llvmFieldLifetime = fromMaybe (llvmFieldLifetime fp) l } + modalize rw l (Perm_LLVMArray ap) = + Just $ Perm_LLVMArray $ + ap { llvmArrayRW = fromMaybe (llvmArrayRW ap) rw, + llvmArrayLifetime = fromMaybe (llvmArrayLifetime ap) l } + modalize rw l (Perm_LLVMBlock bp) = + Just $ Perm_LLVMBlock $ + bp { llvmBlockRW = fromMaybe (llvmBlockRW bp) rw, + llvmBlockLifetime = fromMaybe (llvmBlockLifetime bp) l } + modalize _ _ p@(Perm_LLVMFree _) = Just p + modalize _ _ p@(Perm_LLVMFunPtr _ _) = Just p + modalize rw l (Perm_LLVMBlockShape sh) = + Perm_LLVMBlockShape <$> modalize rw l sh + modalize _ _ p@(Perm_IsLLVMPtr) = Just p + modalize _ _ p@(Perm_NamedConj _ _ _) = Just p + modalize _ _ p@(Perm_LLVMFrame _) = Just p + modalize _ _ p@(Perm_LOwned _ _ _ _ _) = Just p + modalize _ _ p@(Perm_LOwnedSimple _ _) = Just p + modalize _ _ p@(Perm_LCurrent _) = Just p + modalize _ _ p@(Perm_LFinished) = Just p + modalize rw l (Perm_Struct ps) = + Perm_Struct <$> traverseRAssign (modalize rw l) ps + modalize _ _ p@(Perm_Fun _) = Just p + modalize _ _ p@(Perm_BVProp _) = Just p + +instance Modalize (ExprAndPerm a) where + modalize rw l (ExprAndPerm e p) = + ExprAndPerm e <$> modalize rw l p + +instance Modalize (ExprPerms ctx) where + modalize rw l perms = traverseRAssign (modalize rw l) perms + + +-- | Apply 'modalize' to the shape of a block permission, using the +-- modalities of that block permission, raising an error if 'modalize' +-- cannot be applied modalizeBlockShape :: LLVMBlockPerm w -> PermExpr (LLVMShapeType w) modalizeBlockShape (LLVMBlockPerm {..}) = maybe (error "modalizeBlockShape") id $ - modalizeShape (Just llvmBlockRW) (Just llvmBlockLifetime) llvmBlockShape + modalize (Just llvmBlockRW) (Just llvmBlockLifetime) llvmBlockShape + +-- | Convert an 'ExprPerms' list @ps@ to the input permission list @[l](R)ps@ +-- used in a simple @lowned@ permission +lownedPermsSimpleIn :: ExprVar LifetimeType -> ExprPerms ps -> + Maybe (ExprPerms ps) +lownedPermsSimpleIn l = modalize (Just PExpr_Read) (Just $ PExpr_Var l) + +instance Functor SomeTypedMb where + fmap f (SomeTypedMb ctx mb_a) = SomeTypedMb ctx (fmap f mb_a) + +instance Applicative SomeTypedMb where + pure a = SomeTypedMb CruCtxNil $ emptyMb a + liftA2 f (SomeTypedMb ctx1 mb_a1) (SomeTypedMb ctx2 mb_a2) = + SomeTypedMb (appendCruCtx ctx1 ctx2) $ + mbCombine (cruCtxProxies ctx2) $ + flip fmap mb_a1 $ \a1 -> flip fmap mb_a2 $ \a2 -> f a1 a2 + +-- | Commute a 'SomeTypedMb' out of a name-binding +mbSomeTypedMb :: NuMatching a => Mb ctx (SomeTypedMb a) -> + SomeTypedMb (Mb ctx a) +mbSomeTypedMb (mbMatch -> [nuMP| SomeTypedMb ctx mb_a |]) = + SomeTypedMb (mbLift ctx) $ mbSwap (cruCtxProxies $ mbLift ctx) mb_a + +-- | Generic function to abstract all the read/write and lifetime modalities in +-- a permission +class AbstractModalities a where + abstractModalities :: a -> SomeTypedMb a + +instance (NuMatching a, AbstractModalities a) => + AbstractModalities (Mb ctx a) where + abstractModalities mb_a = mbSomeTypedMb $ fmap abstractModalities mb_a + +instance AbstractModalities (ExprAndPerm a) where + abstractModalities (ExprAndPerm e p) = + ExprAndPerm e <$> abstractModalities p + +instance AbstractModalities (RAssign ExprAndPerm a) where + abstractModalities MNil = pure MNil + abstractModalities (eps :>: ep) = + (:>:) <$> abstractModalities eps <*> abstractModalities ep + +instance AbstractModalities (ValuePerm a) where + abstractModalities p@(ValPerm_Eq _) = pure p + abstractModalities (ValPerm_Or p1 p2) = + ValPerm_Or <$> abstractModalities p1 <*> abstractModalities p2 + abstractModalities (ValPerm_Exists mb_p) = + ValPerm_Exists <$> abstractModalities mb_p + abstractModalities p@(ValPerm_Named _ _ _) = + -- Cannot abstract modalities out of an arbitrary named permission; this + -- would require special-purpose modality arguments to every named + -- permission, so we could be sure that abstract these would abstract its + -- unfolding + pure p + abstractModalities p@(ValPerm_Var _ _) = pure p + abstractModalities (ValPerm_Conj ps) = + ValPerm_Conj <$> traverse abstractModalities ps + abstractModalities ValPerm_False = pure ValPerm_False + +instance AbstractModalities (AtomicPerm a) where + abstractModalities (Perm_LLVMField fp) = + SomeTypedMb knownRepr $ + nuMulti (MNil :>: Proxy :>: Proxy) $ \(_ :>: rw :>: l) -> + Perm_LLVMField $ fp { llvmFieldRW = PExpr_Var rw, + llvmFieldLifetime = PExpr_Var l } + abstractModalities (Perm_LLVMArray fp) = + SomeTypedMb knownRepr $ + nuMulti (MNil :>: Proxy :>: Proxy) $ \(_ :>: rw :>: l) -> + Perm_LLVMArray $ fp { llvmArrayRW = PExpr_Var rw, + llvmArrayLifetime = PExpr_Var l } + abstractModalities (Perm_LLVMBlock fp) = + SomeTypedMb knownRepr $ + nuMulti (MNil :>: Proxy :>: Proxy) $ \(_ :>: rw :>: l) -> + Perm_LLVMBlock $ fp { llvmBlockRW = PExpr_Var rw, + llvmBlockLifetime = PExpr_Var l } + abstractModalities p@(Perm_LLVMFree _) = pure p + abstractModalities p@(Perm_LLVMFunPtr _ _) = pure p + abstractModalities p@(Perm_LLVMBlockShape _) = pure p + abstractModalities p@(Perm_IsLLVMPtr) = pure p + abstractModalities p@(Perm_NamedConj _ _ _) = pure p + abstractModalities p@(Perm_LLVMFrame _) = pure p + abstractModalities p@(Perm_LOwned _ _ _ _ _) = pure p + abstractModalities p@(Perm_LOwnedSimple _ _) = pure p + abstractModalities p@(Perm_LCurrent _) = pure p + abstractModalities p@(Perm_LFinished) = pure p + abstractModalities (Perm_Struct ps) = + Perm_Struct <$> traverseRAssign abstractModalities ps + abstractModalities p@(Perm_Fun _) = pure p + abstractModalities p@(Perm_BVProp _) = pure p + -- | Extract the shape-in-bindings for an unfoldable shape namedShapeBodyShape :: KnownNat w => NamedShape 'True args w -> @@ -4247,13 +4523,13 @@ unfoldNamedShape (NamedShape _ _ (DefinedShapeBody mb_sh)) args = unfoldNamedShape sh@(NamedShape _ _ (RecShapeBody mb_sh _ _)) args = subst (substOfExprs (args :>: PExpr_NamedShape Nothing Nothing sh args)) mb_sh --- | Unfold a named shape and apply 'modalizeShape' to the result +-- | Unfold a named shape and apply 'modalize' to the result unfoldModalizeNamedShape :: KnownNat w => Maybe (PermExpr RWModalityType) -> Maybe (PermExpr LifetimeType) -> NamedShape 'True args w -> PermExprs args -> Maybe (PermExpr (LLVMShapeType w)) unfoldModalizeNamedShape rw l nmsh args = - modalizeShape rw l $ unfoldNamedShape nmsh args + modalize rw l $ unfoldNamedShape nmsh args -- | Unfold the shape of a block permission using 'unfoldModalizeNamedShape' if -- it has a named shape @@ -4812,6 +5088,7 @@ llvmArrayIsBorrowed ap = = True | Just i <- findIndex (permForOff off) borrows = go (bvAdd off (bvRangeLength (borrows!!i))) (deleteNth i borrows) + go _ _ = False permForOff o b = bvCouldEqual o (bvRangeOffset b) @@ -5522,8 +5799,8 @@ atomicPermIsCopyable (Perm_LLVMFunPtr _ _) = True atomicPermIsCopyable Perm_IsLLVMPtr = True atomicPermIsCopyable (Perm_LLVMBlockShape sh) = shapeIsCopyable PExpr_Write sh atomicPermIsCopyable (Perm_LLVMFrame _) = False -atomicPermIsCopyable (Perm_LOwned _ _ _) = False -atomicPermIsCopyable (Perm_LOwnedSimple _) = False +atomicPermIsCopyable (Perm_LOwned _ _ _ _ _) = False +atomicPermIsCopyable (Perm_LOwnedSimple _ _) = False atomicPermIsCopyable (Perm_LCurrent _) = True atomicPermIsCopyable Perm_LFinished = True atomicPermIsCopyable (Perm_Struct ps) = and $ RL.mapToList permIsCopyable ps @@ -5579,67 +5856,34 @@ shapeIsCopyable rw (PExpr_ExShape mb_sh) = shapeIsCopyable _ PExpr_FalseShape = True --- FIXME: need a traversal function for RAssign for the following two funs - --- | Convert an 'LOwnedPerms' list to a 'DistPerms' -lownedPermsToDistPerms :: LOwnedPerms ps -> Maybe (DistPerms ps) -lownedPermsToDistPerms MNil = Just MNil -lownedPermsToDistPerms (lops :>: lop) = - (:>:) <$> lownedPermsToDistPerms lops <*> lownedPermVarAndPerm lop - --- | Optionally set the modalities of the permissions in an 'LOwnedPerms' list -modalizeLOwnedPerms ::Maybe (PermExpr RWModalityType) -> - Maybe (PermExpr LifetimeType) -> LOwnedPerms ps -> - LOwnedPerms ps -modalizeLOwnedPerms rw l = RL.map $ \case - LOwnedPermField x fp -> - LOwnedPermField x $ - fp { llvmFieldRW = fromMaybe (llvmFieldRW fp) rw, - llvmFieldLifetime = fromMaybe (llvmFieldLifetime fp) l } - LOwnedPermArray x ap -> - LOwnedPermArray x $ - ap { llvmArrayRW = fromMaybe (llvmArrayRW ap) rw, - llvmArrayLifetime = fromMaybe (llvmArrayLifetime ap) l } - LOwnedPermBlock x bp -> - LOwnedPermBlock x $ - bp { llvmBlockRW = fromMaybe (llvmBlockRW bp) rw, - llvmBlockLifetime = fromMaybe (llvmBlockLifetime bp) l } - --- | Convert an 'LOwnedPerms' list @ps@ to the input permission list @[l](R)ps@ --- used in a simple @lowned@ permission -lownedPermsSimpleIn :: ExprVar LifetimeType -> LOwnedPerms ps -> - LOwnedPerms ps -lownedPermsSimpleIn l = - modalizeLOwnedPerms (Just PExpr_Read) (Just $ PExpr_Var l) - --- | Convert the expressions of an 'LOwnedPerms' to variables, if possible -lownedPermsVars :: LOwnedPerms ps -> Maybe (RAssign Name ps) -lownedPermsVars = fmap distPermsVars . lownedPermsToDistPerms - --- | Test if an 'LOwnedPerm' could help prove any of a list of permissions -lownedPermCouldProve :: LOwnedPerm a -> DistPerms ps -> Bool -lownedPermCouldProve (LOwnedPermField (PExpr_Var x) fp) ps = - any (\case (llvmAtomicPermRange -> Just rng) -> - bvCouldBeInRange (llvmFieldOffset fp) rng - _ -> False) $ - varAtomicPermsInDistPerms x ps -lownedPermCouldProve (LOwnedPermArray (PExpr_Var x) ap) ps = - any (\case (llvmAtomicPermRange -> Just rng) -> - bvRangesCouldOverlap (llvmArrayAbsOffsets ap) rng - _ -> False) $ - varAtomicPermsInDistPerms x ps -lownedPermCouldProve (LOwnedPermBlock (PExpr_Var x) bp) ps = - any (\case (llvmAtomicPermRange -> Just rng) -> - bvRangesCouldOverlap (llvmBlockRange bp) rng - _ -> False) $ - varAtomicPermsInDistPerms x ps -lownedPermCouldProve _ _ = False - --- | Test if an 'LOwnedPerms' list could help prove any of a list of permissions -lownedPermsCouldProve :: LOwnedPerms ps -> DistPerms ps' -> Bool +-- | Test if a permission that might be in a lifetime ownership permission (so +-- not a lifetime permission) could help prove any of a list of permissions. For +-- now, this just tests if the variable on the left occurs on the right. +lownedPermCouldProve :: ExprAndPerm a -> DistPerms ps -> Bool +lownedPermCouldProve (ExprAndPerm (PExpr_Var x) _) (_ :>: VarAndPerm y _) + | Just Refl <- testEquality x y = True +lownedPermCouldProve e_and_p (ps :>: _) = lownedPermCouldProve e_and_p ps +lownedPermCouldProve _ MNil = False + +-- | Test if a list of permissions that might be in a lifetime ownership +-- permission (so not a lifetime permission) could help prove any of a list of +-- permissions. For now, this just tests if there is any overlap between +-- variables on the left and on the right. +lownedPermsCouldProve :: ExprPerms a -> DistPerms ps -> Bool lownedPermsCouldProve lops ps = RL.foldr (\lop rest -> lownedPermCouldProve lop ps || rest) False lops +-- | Find all lifetimes with ownership permissions in a 'DistPerms' in binding +lownedsInMbDistPerms :: Mb ctx (DistPerms ps) -> [ExprVar LifetimeType] +lownedsInMbDistPerms = + catMaybes . RL.mapToList + (\case + Compose [nuP| VarAndPerm mb_l (ValPerm_Conj1 mb_p) |] + | Just Refl + <- mbLift $ mbMapCl $(mkClosed [| isLifetimeOwnershipPerm |]) mb_p + , Right l <- mbNameBoundP mb_l -> Just l + _ -> Nothing) + . mbRAssign {- -- | Convert a 'FunPerm' in a name-binding to a 'FunPerm' that takes those bound @@ -5806,9 +6050,9 @@ instance FreeVars (AtomicPerm tp) where freeVars Perm_IsLLVMPtr = NameSet.empty freeVars (Perm_LLVMBlockShape sh) = freeVars sh freeVars (Perm_LLVMFrame fperms) = freeVars $ map fst fperms - freeVars (Perm_LOwned ls ps_in ps_out) = + freeVars (Perm_LOwned ls _ _ ps_in ps_out) = NameSet.unions [freeVars ls, freeVars ps_in, freeVars ps_out] - freeVars (Perm_LOwnedSimple lops) = freeVars lops + freeVars (Perm_LOwnedSimple _ lops) = freeVars lops freeVars (Perm_LCurrent l) = freeVars l freeVars Perm_LFinished = NameSet.empty freeVars (Perm_Struct ps) = NameSet.unions $ RL.mapToList freeVars ps @@ -5837,6 +6081,11 @@ instance FreeVars (DistPerms tps) where NameSet.unions $ RL.mapToList (\(VarAndPerm x p) -> NameSet.insert x (freeVars p)) dperms +instance FreeVars (ExprPerms tps) where + freeVars eps = + NameSet.unions $ + RL.mapToList (\(ExprAndPerm e p) -> NameSet.union (freeVars e) (freeVars p)) eps + instance FreeVars (LLVMFieldPerm w sz) where freeVars (LLVMFieldPerm {..}) = NameSet.unions [freeVars llvmFieldRW, freeVars llvmFieldLifetime, @@ -5867,17 +6116,6 @@ instance FreeVars (PermOffset tp) where freeVars NoPermOffset = NameSet.empty freeVars (LLVMPermOffset e) = freeVars e -instance FreeVars (LOwnedPerm a) where - freeVars (LOwnedPermField e fp) = - NameSet.unions [freeVars e, freeVars fp] - freeVars (LOwnedPermArray e ap) = - NameSet.unions [freeVars e, freeVars ap] - freeVars (LOwnedPermBlock e bp) = - NameSet.unions [freeVars e, freeVars bp] - -instance FreeVars (LOwnedPerms ps) where - freeVars = NameSet.unions . RL.mapToList freeVars - instance FreeVars (FunPerm ghosts args gouts ret) where freeVars (FunPerm _ _ _ _ perms_in perms_out) = NameSet.union @@ -5949,8 +6187,8 @@ instance NeededVars (AtomicPerm a) where neededVars (Perm_LLVMArray ap) = neededVars ap neededVars (Perm_LLVMBlock bp) = neededVars bp neededVars (Perm_LLVMBlockShape _) = NameSet.empty - neededVars p@(Perm_LOwned _ _ _) = freeVars p - neededVars (Perm_LOwnedSimple lops) = neededVars $ RL.map lownedPermPerm lops + neededVars p@(Perm_LOwned _ _ _ _ _) = freeVars p + neededVars (Perm_LOwnedSimple _ ps) = neededVars $ RL.map exprAndPermPerm ps neededVars p = freeVars p instance NeededVars (LLVMFieldPerm w sz) where @@ -6104,6 +6342,12 @@ genSubstMb p s mbmb = instance SubstVar s m => Substable s (Member ctx a) m where genSubst _ mb_memb = return $ mbLift mb_memb +instance SubstVar s m => Substable s (TypeRepr a) m where + genSubst _ mb_tp = return $ mbLift mb_tp + +instance SubstVar s m => Substable s (CruCtx ctx) m where + genSubst _ mb_ctx = return $ mbLift mb_ctx + instance (NuMatchingAny1 f, Substable1 s f m) => Substable s (RAssign f ctx) m where genSubst s mb_xs = case mbMatch mb_xs of @@ -6198,6 +6442,13 @@ instance SubstVar s m => Substable s (BVRange w) m where genSubst s (mbMatch -> [nuMP| BVRange e1 e2 |]) = BVRange <$> genSubst s e1 <*> genSubst s e2 +instance SubstVar s m => Substable s (MbRangeForType a) m where + genSubst s (mbMatch -> [nuMP| MbRangeForLLVMType vars rng |]) = + MbRangeForLLVMType (mbLift vars) <$> + genSubstMb (RL.map (const Proxy) $ mbLift vars) s rng + genSubst s (mbMatch -> [nuMP| MbRangeForStructType prxs memb rng |]) = + MbRangeForStructType (mbLift prxs) (mbLift memb) <$> genSubst s rng + instance SubstVar s m => Substable s (BVProp w) m where genSubst s mb_prop = case mbMatch mb_prop of [nuMP| BVProp_Eq e1 e2 |] -> @@ -6223,9 +6474,11 @@ instance SubstVar s m => Substable s (AtomicPerm a) m where [nuMP| Perm_LLVMBlockShape sh |] -> Perm_LLVMBlockShape <$> genSubst s sh [nuMP| Perm_LLVMFrame fp |] -> Perm_LLVMFrame <$> genSubst s fp - [nuMP| Perm_LOwned ls ps_in ps_out |] -> - Perm_LOwned <$> genSubst s ls <*> genSubst s ps_in <*> genSubst s ps_out - [nuMP| Perm_LOwnedSimple lops |] -> Perm_LOwnedSimple <$> genSubst s lops + [nuMP| Perm_LOwned ls tps_in tps_out ps_in ps_out |] -> + Perm_LOwned <$> genSubst s ls <*> return (mbLift tps_in) <*> + return (mbLift tps_out) <*> genSubst s ps_in <*> genSubst s ps_out + [nuMP| Perm_LOwnedSimple tps lops |] -> + Perm_LOwnedSimple (mbLift tps) <$> genSubst s lops [nuMP| Perm_LCurrent e |] -> Perm_LCurrent <$> genSubst s e [nuMP| Perm_LFinished |] -> return Perm_LFinished [nuMP| Perm_Struct tps |] -> Perm_Struct <$> genSubst s tps @@ -6343,16 +6596,11 @@ instance SubstVar s m => Substable s (LLVMFieldShape w) m where genSubst s (mbMatch -> [nuMP| LLVMFieldShape p |]) = LLVMFieldShape <$> genSubst s p -instance SubstVar s m => Substable s (LOwnedPerm a) m where - genSubst s mb_x = case mbMatch mb_x of - [nuMP| LOwnedPermField e fp |] -> - LOwnedPermField <$> genSubst s e <*> genSubst s fp - [nuMP| LOwnedPermArray e ap |] -> - LOwnedPermArray <$> genSubst s e <*> genSubst s ap - [nuMP| LOwnedPermBlock e bp |] -> - LOwnedPermBlock <$> genSubst s e <*> genSubst s bp - -instance SubstVar s m => Substable1 s LOwnedPerm m where +instance SubstVar s m => Substable s (ExprAndPerm a) m where + genSubst s (mbMatch -> [nuMP| ExprAndPerm e p |]) = + ExprAndPerm <$> genSubst s e <*> genSubst s p + +instance SubstVar s m => Substable1 s ExprAndPerm m where genSubst1 = genSubst instance SubstVar s m => Substable s (FunPerm ghosts args gouts ret) m where @@ -6375,11 +6623,13 @@ instance SubstVar PermVarSubst m => Substable PermVarSubst (LifetimeCurrentPerms ps) m where genSubst s mb_x = case mbMatch mb_x of [nuMP| AlwaysCurrentPerms |] -> return AlwaysCurrentPerms - [nuMP| LOwnedCurrentPerms l ls ps_in ps_out |] -> + [nuMP| LOwnedCurrentPerms l ls tps_in tps_out ps_in ps_out |] -> LOwnedCurrentPerms <$> genSubst s l <*> genSubst s ls + <*> return (mbLift tps_in) <*> return (mbLift tps_out) <*> genSubst s ps_in <*> genSubst s ps_out - [nuMP| LOwnedSimpleCurrentPerms l ps |] -> - LOwnedSimpleCurrentPerms <$> genSubst s l <*> genSubst s ps + [nuMP| LOwnedSimpleCurrentPerms l tps ps |] -> + LOwnedSimpleCurrentPerms <$> genSubst s l + <*> return (mbLift tps) <*> genSubst s ps [nuMP| CurrentTransPerms ps l |] -> CurrentTransPerms <$> genSubst s ps <*> genSubst s l @@ -6639,6 +6889,10 @@ completePSubst ctx (PartialSubst pselems) = PermSubst $ helper ctx pselems where psubstLookup :: PartialSubst ctx -> Member ctx a -> Maybe (PermExpr a) psubstLookup (PartialSubst m) memb = unPSubstElem $ RL.get memb m +-- | Get 'Proxy's for the domain of a 'PartialSubst' +psubstProxies :: PartialSubst ctx -> RAssign Proxy ctx +psubstProxies (PartialSubst m) = RL.map (const Proxy) m + -- | Append two partial substitutions psubstAppend :: PartialSubst ctx1 -> PartialSubst ctx2 -> PartialSubst (ctx1 :++: ctx2) @@ -7016,13 +7270,16 @@ instance AbstractVars (AtomicPerm a) where abstractPEVars ns1 ns2 (Perm_LLVMFrame fp) = absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LLVMFrame |]) `clMbMbApplyM` abstractPEVars ns1 ns2 fp - abstractPEVars ns1 ns2 (Perm_LOwned ls ps_in ps_out) = + abstractPEVars ns1 ns2 (Perm_LOwned ls tps_in tps_out ps_in ps_out) = absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LOwned |]) `clMbMbApplyM` abstractPEVars ns1 ns2 ls + `clMbMbApplyM` (absVarsReturnH ns1 ns2 $ toClosed tps_in) + `clMbMbApplyM` (absVarsReturnH ns1 ns2 $ toClosed tps_out) `clMbMbApplyM` abstractPEVars ns1 ns2 ps_in `clMbMbApplyM` abstractPEVars ns1 ns2 ps_out - abstractPEVars ns1 ns2 (Perm_LOwnedSimple lops) = - absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LOwnedSimple |]) + abstractPEVars ns1 ns2 (Perm_LOwnedSimple tps lops) = + absVarsReturnH ns1 ns2 ($(mkClosed [| Perm_LOwnedSimple |]) + `clApply` toClosed tps) `clMbMbApplyM` abstractPEVars ns1 ns2 lops abstractPEVars ns1 ns2 (Perm_LCurrent e) = absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LCurrent |]) @@ -7146,21 +7403,13 @@ instance AbstractVars (DistPerms ps) where `clMbMbApplyM` abstractPEVars ns1 ns2 perms `clMbMbApplyM` abstractPEVars ns1 ns2 x `clMbMbApplyM` abstractPEVars ns1 ns2 p -instance AbstractVars (LOwnedPerm a) where - abstractPEVars ns1 ns2 (LOwnedPermField e fp) = - absVarsReturnH ns1 ns2 $(mkClosed [| LOwnedPermField |]) +instance AbstractVars (ExprAndPerm a) where + abstractPEVars ns1 ns2 (ExprAndPerm e p) = + absVarsReturnH ns1 ns2 $(mkClosed [| ExprAndPerm |]) `clMbMbApplyM` abstractPEVars ns1 ns2 e - `clMbMbApplyM` abstractPEVars ns1 ns2 fp - abstractPEVars ns1 ns2 (LOwnedPermArray e ap) = - absVarsReturnH ns1 ns2 $(mkClosed [| LOwnedPermArray |]) - `clMbMbApplyM` abstractPEVars ns1 ns2 e - `clMbMbApplyM` abstractPEVars ns1 ns2 ap - abstractPEVars ns1 ns2 (LOwnedPermBlock e bp) = - absVarsReturnH ns1 ns2 $(mkClosed [| LOwnedPermBlock |]) - `clMbMbApplyM` abstractPEVars ns1 ns2 e - `clMbMbApplyM` abstractPEVars ns1 ns2 bp + `clMbMbApplyM` abstractPEVars ns1 ns2 p -instance AbstractVars (LOwnedPerms ps) where +instance AbstractVars (ExprPerms a) where abstractPEVars ns1 ns2 MNil = absVarsReturnH ns1 ns2 $(mkClosed [| MNil |]) abstractPEVars ns1 ns2 (ps :>: p) = @@ -7333,11 +7582,11 @@ instance AbstractNamedShape w (AtomicPerm a) where abstractNSM (Perm_NamedConj n args off) = mbMap2 (Perm_NamedConj n) <$> abstractNSM args <*> abstractNSM off abstractNSM (Perm_LLVMFrame fp) = fmap Perm_LLVMFrame <$> abstractNSM fp - abstractNSM (Perm_LOwned ls ps_in ps_out) = - mbMap3 Perm_LOwned <$> abstractNSM ls <*> abstractNSM ps_in <*> - abstractNSM ps_out - abstractNSM (Perm_LOwnedSimple lops) = - fmap Perm_LOwnedSimple <$> abstractNSM lops + abstractNSM (Perm_LOwned ls tps_in tps_out ps_in ps_out) = + mbMap3 (\ls' -> Perm_LOwned ls' tps_in tps_out) <$> + abstractNSM ls <*> abstractNSM ps_in <*> abstractNSM ps_out + abstractNSM (Perm_LOwnedSimple tps lops) = + fmap (Perm_LOwnedSimple tps) <$> abstractNSM lops abstractNSM (Perm_LCurrent e) = fmap Perm_LCurrent <$> abstractNSM e abstractNSM Perm_LFinished = pureBindingM Perm_LFinished abstractNSM (Perm_Struct ps) = fmap Perm_Struct <$> abstractNSM ps @@ -7370,17 +7619,13 @@ instance AbstractNamedShape w' (LLVMBlockPerm w) where <*> abstractNSM off <*> abstractNSM len <*> abstractNSM sh -instance AbstractNamedShape w (LOwnedPerms ps) where +instance AbstractNamedShape w (ExprPerms ps) where abstractNSM MNil = pureBindingM MNil - abstractNSM (fp :>: fps) = mbMap2 (:>:) <$> abstractNSM fp <*> abstractNSM fps + abstractNSM (p :>: ps) = mbMap2 (:>:) <$> abstractNSM p <*> abstractNSM ps -instance AbstractNamedShape w (LOwnedPerm a) where - abstractNSM (LOwnedPermField e fp) = - mbMap2 LOwnedPermField <$> abstractNSM e <*> abstractNSM fp - abstractNSM (LOwnedPermArray e ap) = - mbMap2 LOwnedPermArray <$> abstractNSM e <*> abstractNSM ap - abstractNSM (LOwnedPermBlock e bp) = - mbMap2 LOwnedPermBlock <$> abstractNSM e <*> abstractNSM bp +instance AbstractNamedShape w (ExprAndPerm a) where + abstractNSM (ExprAndPerm e p) = + mbMap2 ExprAndPerm <$> abstractNSM e <*> abstractNSM p instance AbstractNamedShape w (ValuePerms as) where abstractNSM ValPerms_Nil = pureBindingM ValPerms_Nil @@ -7850,9 +8095,9 @@ instance GetDetVarsClauses (AtomicPerm a) where getDetVarsClauses (Perm_LLVMBlockShape sh) = getDetVarsClauses sh getDetVarsClauses (Perm_LLVMFrame frame_perm) = concat <$> mapM (getDetVarsClauses . fst) frame_perm - getDetVarsClauses (Perm_LOwned _ _ _) = return [] - getDetVarsClauses (Perm_LOwnedSimple lops) = - getDetVarsClauses $ RL.map lownedPermPerm lops + getDetVarsClauses (Perm_LOwned _ _ _ _ _) = return [] + getDetVarsClauses (Perm_LOwnedSimple _ lops) = + getDetVarsClauses $ RL.map exprAndPermPerm lops getDetVarsClauses _ = return [] instance (1 <= w, KnownNat w, 1 <= sz, KnownNat sz) => diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index 8c2892529b..9e3a3ace7d 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -48,6 +48,7 @@ import Data.Parameterized.Context (Assignment, IsAppend(..), incSize, zeroSize, sizeInt, size, generate, extend) import qualified Data.Parameterized.Context as Ctx +import Data.Parameterized.TraversableF import Data.Binding.Hobbits import Data.Binding.Hobbits.MonadBind @@ -108,10 +109,6 @@ data ArgLayoutIO where data Some3FunPerm = forall ghosts args gouts ret. Some3FunPerm (FunPerm ghosts args gouts ret) --- | A name-binding over some list of types -data SomeTypedMb a where - SomeTypedMb :: CruCtx ctx -> Mb ctx a -> SomeTypedMb a - ---------------------------------------------------------------------- -- * Template Haskell–generated instances @@ -121,7 +118,6 @@ $(mkNuMatching [t| SomeLLVMPerm |]) $(mkNuMatching [t| forall ctx. ArgLayoutPerm ctx |]) $(mkNuMatching [t| ArgLayout |]) $(mkNuMatching [t| Some3FunPerm |]) -$(mkNuMatching [t| forall a. NuMatching a => SomeTypedMb a |]) ---------------------------------------------------------------------- @@ -1185,78 +1181,45 @@ layoutFun abi arg_shs ret_sh = -- * Converting Function Types ---------------------------------------------------------------------- -instance Functor SomeTypedMb where - fmap f (SomeTypedMb ctx mb_a) = SomeTypedMb ctx (fmap f mb_a) - -instance Applicative SomeTypedMb where - pure a = SomeTypedMb CruCtxNil $ emptyMb a - liftA2 f (SomeTypedMb ctx1 mb_a1) (SomeTypedMb ctx2 mb_a2) = - SomeTypedMb (appendCruCtx ctx1 ctx2) $ - mbCombine (cruCtxProxies ctx2) $ - flip fmap mb_a1 $ \a1 -> flip fmap mb_a2 $ \a2 -> f a1 a2 - --- | Abstract over all the read/write and lifetime modalities in an --- 'LOwnedPerms' sequence -abstractMbLOPsModalities :: Mb ctx (LOwnedPerms tps) -> - SomeTypedMb (Mb ctx (LOwnedPerms tps)) -abstractMbLOPsModalities mb_lops = case mbMatch mb_lops of - [nuMP| MNil |] -> pure mb_lops - [nuMP| lops :>: LOwnedPermField mb_e mb_fp |] -> - liftA2 (mbMap2 (:>:)) - (abstractMbLOPsModalities lops) - (SomeTypedMb (CruCtxCons (CruCtxCons CruCtxNil RWModalityRepr) LifetimeRepr) $ - nuMulti (MNil :>: Proxy :>: Proxy) $ \(_ :>: rw :>: l) -> - mbMap2 (\e fp -> - LOwnedPermField e (fp { llvmFieldRW = PExpr_Var rw, - llvmFieldLifetime = PExpr_Var l })) - mb_e mb_fp) - [nuMP| lops :>: LOwnedPermArray mb_e mb_arrp |] -> - liftA2 (mbMap2 (:>:)) - (abstractMbLOPsModalities lops) - (SomeTypedMb (CruCtxCons (CruCtxCons CruCtxNil RWModalityRepr) LifetimeRepr) $ - nuMulti (MNil :>: Proxy :>: Proxy) $ \(_ :>: rw :>: l) -> - mbMap2 (\e arrp -> - LOwnedPermArray e (arrp { llvmArrayRW = PExpr_Var rw, - llvmArrayLifetime = PExpr_Var l })) - mb_e mb_arrp) - [nuMP| lops :>: LOwnedPermBlock mb_e mb_bp |] -> - liftA2 (mbMap2 (:>:)) - (abstractMbLOPsModalities lops) - (SomeTypedMb (CruCtxCons (CruCtxCons CruCtxNil RWModalityRepr) LifetimeRepr) $ - nuMulti (MNil :>: Proxy :>: Proxy) $ \(_ :>: rw :>: l) -> - mbMap2 (\e bp -> - LOwnedPermBlock e (bp { llvmBlockRW = PExpr_Var rw, - llvmBlockLifetime = PExpr_Var l })) - mb_e mb_bp) - - --- | Find all field or block permissions containing lifetime @l@ and return them --- as an 'LOwnedPerms' list, also returning the result of removing these --- permissions from the input permissions -lownedPermsForLifetime :: ExprVar LifetimeType -> DistPerms ctx -> - RustConvM (Some LOwnedPerms, DistPerms ctx) -lownedPermsForLifetime _ MNil = return (Some MNil, MNil) -lownedPermsForLifetime l (perms :>: VarAndPerm x (ValPerm_LLVMField fp)) - | NameSet.member l (freeVars fp) = - do (Some lops, perms') <- lownedPermsForLifetime l perms - return (Some (lops :>: LOwnedPermField (PExpr_Var x) fp), - perms' :>: VarAndPerm x ValPerm_True) -lownedPermsForLifetime l (perms :>: VarAndPerm x (ValPerm_LLVMBlock bp)) - | NameSet.member l (freeVars bp) = - do (Some lops, perms') <- lownedPermsForLifetime l perms - return (Some (lops :>: LOwnedPermBlock (PExpr_Var x) bp), - perms' :>: VarAndPerm x ValPerm_True) -lownedPermsForLifetime l (perms :>: VarAndPerm x p) - | Nothing <- testEquality x l - , not (NameSet.member l $ freeVars p) = - lownedPermsForLifetime l perms >>= \(some_lops, perms') -> - return (some_lops, perms' :>: VarAndPerm x p) -lownedPermsForLifetime l (_ :>: vap) = - rsPPInfo >>= \ppInfo -> - fail $ renderDoc $ fillSep - [pretty "lownedPermsForLifetime: could not compute lowned permissions for " - <+> permPretty ppInfo l <+> pretty "in:", - permPretty ppInfo vap] +-- | An 'ExprPerms' with types for the expressions +data TypedExprPerms ctx = TypedExprPerms (CruCtx ctx) (ExprPerms ctx) + +-- | Convert a 'TypedDistPerms' to a 'TypedExprPerms' +typedDistToExprPerms :: TypedDistPerms ctx -> TypedExprPerms ctx +typedDistToExprPerms perms = + TypedExprPerms (typedDistPermsCtx perms) (distPermsToExprPerms $ + unTypeDistPerms perms) + +-- | Find all portions of an atomic permission containing a lifetime, returning +-- 'Nothing' if it does not contain the lifetime +atomicPermForLifetime :: ExprVar LifetimeType -> AtomicPerm a -> + Maybe (AtomicPerm a) +atomicPermForLifetime l p | not $ NameSet.member l $ freeVars p = Nothing +atomicPermForLifetime l (Perm_Struct ps) = + Just $ Perm_Struct $ + RL.map (\p -> fromMaybe ValPerm_True (permForLifetime l p)) ps +atomicPermForLifetime _ p = Just p + +-- | Find all portions of a permission containing a lifetime, returning +-- 'Nothing' if it does not contain the lifetime +permForLifetime :: ExprVar LifetimeType -> ValuePerm a -> Maybe (ValuePerm a) +permForLifetime l p | not $ NameSet.member l $ freeVars p = Nothing +permForLifetime l (ValPerm_Conj ps) = + Just $ ValPerm_Conj $ mapMaybe (atomicPermForLifetime l) ps +permForLifetime _ p = Just p + +-- | Find all permissions containing lifetime @l@ and return just those portions +-- of the these permissions that contain @l@ +lownedPermsForLifetime :: CruCtx ctx -> ExprVar LifetimeType -> DistPerms ctx -> + Some TypedExprPerms +lownedPermsForLifetime tps l ps = + fmapF typedDistToExprPerms $ concatSomeRAssign $ + RL.mapToList (\case + (Typed tp (VarAndPerm x p)) + | Just p' <- permForLifetime l p -> + Some (MNil :>: Typed tp (VarAndPerm x p')) + _ -> Some MNil) + (RL.map2 Typed (cruCtxToTypes tps) ps) -- | Get the 'String' name defined by a 'LifetimeDef' lifetimeDefName :: LifetimeDef a -> String @@ -1290,6 +1253,7 @@ mbLifetimeFunPerm (LifetimeDef _ _ [] _) let args_prxs = cruCtxProxies args let ret = mbLift $ fmap funPermRet fun_perm let l_prxs = MNil :>: (Proxy :: Proxy LifetimeType) + let fp_outs = mbLift $ fmap funPermOutCtx fun_perm let mb_ps_in = mbCombineAssoc l_prxs ghosts_prxs args_prxs $ fmap (mbValuePermsToDistPerms . funPermIns) fun_perm @@ -1300,11 +1264,15 @@ mbLifetimeFunPerm (LifetimeDef _ _ [] _) let mb_l_out = extMbMulti rets_prxs $ extMbMulti args_prxs $ extMbMulti ghosts_prxs $ nu id - [nuMP| (Some mb_lops_in, _) |] <- - mbMatchM $ mbMap2 lownedPermsForLifetime mb_l mb_ps_in - [nuMP| (Some mb_lops_out, _) |] <- - mbMatchM $ mbMap2 lownedPermsForLifetime mb_l_out mb_ps_out - case abstractMbLOPsModalities mb_lops_in of + [nuMP| Some (TypedExprPerms mb_tps_in mb_lops_in) |] <- + return $ mbMatch $ mbMap2 (lownedPermsForLifetime + (appendCruCtx ghosts args)) mb_l mb_ps_in + [nuMP| Some (TypedExprPerms mb_tps_out mb_lops_out) |] <- + return $ mbMatch $ + mbMap2 (lownedPermsForLifetime fp_outs) mb_l_out mb_ps_out + let tps_in = mbLift mb_tps_in + let tps_out = mbLift mb_tps_out + case abstractModalities mb_lops_in of SomeTypedMb ghosts' mb_mb_lops_in_abs -> return $ mbGhostsFunPerm3 ghosts' $ flip fmap mb_mb_lops_in_abs $ \mb_lops_in_abs -> @@ -1312,14 +1280,14 @@ mbLifetimeFunPerm (LifetimeDef _ _ [] _) FunPerm (appendCruCtx (singletonCruCtx LifetimeRepr) ghosts) args gouts ret (mbMap2 (\ps_in lops_in_abs -> - assocAppend (MNil :>: ValPerm_LOwnedSimple lops_in_abs) + assocAppend (MNil :>: ValPerm_LOwnedSimple tps_in lops_in_abs) ghosts args_prxs $ distPermsToValuePerms ps_in) mb_ps_in mb_lops_in_abs) (mbMap3 (\ps_out lops_out lops_in_abs -> let (ps_ghosts, ps_args, ps_rets) = rlSplit3 ghosts_prxs args_prxs rets_prxs $ distPermsToValuePerms ps_out in - (((MNil :>: ValPerm_LOwned [] lops_out lops_in_abs) + (((MNil :>: ValPerm_LOwned [] tps_out tps_in lops_out lops_in_abs) `RL.append` ps_ghosts) `RL.append` ps_args) `RL.append` ps_rets) mb_ps_out mb_lops_out (extMbMulti rets_prxs mb_lops_in_abs)) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs index 5679e4e417..75e75fe157 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs @@ -1062,13 +1062,14 @@ data AtomicPermTrans ctx a where -- | @lowned@ permissions translate to a monadic function from (the -- translation of) the input permissions to the output permissions APTrans_LOwned :: Mb ctx [PermExpr LifetimeType] -> - Mb ctx (LOwnedPerms ps_in) -> - Mb ctx (LOwnedPerms ps_out) -> + CruCtx ps_in -> CruCtx ps_out -> + Mb ctx (ExprPerms ps_in) -> + Mb ctx (ExprPerms ps_out) -> OpenTerm -> AtomicPermTrans ctx LifetimeType -- | Simple @lowned@ permissions have no translation, because they represent -- @lowned@ permissions whose translations are just the identity function - APTrans_LOwnedSimple :: Mb ctx (LOwnedPerms ps) -> + APTrans_LOwnedSimple :: CruCtx ps -> Mb ctx (ExprPerms ps) -> AtomicPermTrans ctx LifetimeType -- | LCurrent permissions have no computational content @@ -1230,8 +1231,8 @@ instance IsTermTrans (AtomicPermTrans ctx a) where transTerms (APTrans_NamedConj _ _ _ t) = [t] transTerms (APTrans_DefinedNamedConj _ _ _ ptrans) = transTerms ptrans transTerms (APTrans_LLVMFrame _) = [] - transTerms (APTrans_LOwned _ _ _ t) = [t] - transTerms (APTrans_LOwnedSimple _) = [] + transTerms (APTrans_LOwned _ _ _ _ _ t) = [t] + transTerms (APTrans_LOwnedSimple _ _) = [] transTerms (APTrans_LCurrent _) = [] transTerms APTrans_LFinished = [] transTerms (APTrans_Struct pctx) = transTerms pctx @@ -1287,9 +1288,10 @@ atomicPermTransPerm _ (APTrans_NamedConj npn args off _) = atomicPermTransPerm _ (APTrans_DefinedNamedConj npn args off _) = mbMap2 (Perm_NamedConj npn) args off atomicPermTransPerm _ (APTrans_LLVMFrame fp) = fmap Perm_LLVMFrame fp -atomicPermTransPerm _ (APTrans_LOwned ls ps_in ps_out _) = - mbMap3 Perm_LOwned ls ps_in ps_out -atomicPermTransPerm _ (APTrans_LOwnedSimple lops) = fmap Perm_LOwnedSimple lops +atomicPermTransPerm _ (APTrans_LOwned mb_ls tps_in tps_out mb_ps_in mb_ps_out _) = + mbMap3 (\ls -> Perm_LOwned ls tps_in tps_out) mb_ls mb_ps_in mb_ps_out +atomicPermTransPerm _ (APTrans_LOwnedSimple tps mb_lops) = + fmap (Perm_LOwnedSimple tps) mb_lops atomicPermTransPerm _ (APTrans_LCurrent l) = fmap Perm_LCurrent l atomicPermTransPerm prxs APTrans_LFinished = nus prxs $ const Perm_LFinished atomicPermTransPerm prxs (APTrans_Struct ps) = @@ -1351,9 +1353,10 @@ instance ExtPermTrans AtomicPermTrans where extPermTrans (APTrans_DefinedNamedConj npn args off ptrans) = APTrans_DefinedNamedConj npn (extMb args) (extMb off) (extPermTrans ptrans) extPermTrans (APTrans_LLVMFrame fp) = APTrans_LLVMFrame $ extMb fp - extPermTrans (APTrans_LOwned ls ps_in ps_out t) = - APTrans_LOwned (extMb ls) (extMb ps_in) (extMb ps_out) t - extPermTrans (APTrans_LOwnedSimple lops) = APTrans_LOwnedSimple (extMb lops) + extPermTrans (APTrans_LOwned ls tps_in tps_out ps_in ps_out t) = + APTrans_LOwned (extMb ls) tps_in tps_out (extMb ps_in) (extMb ps_out) t + extPermTrans (APTrans_LOwnedSimple tps lops) = + APTrans_LOwnedSimple tps (extMb lops) extPermTrans (APTrans_LCurrent p) = APTrans_LCurrent $ extMb p extPermTrans APTrans_LFinished = APTrans_LFinished extPermTrans (APTrans_Struct ps) = APTrans_Struct $ RL.map extPermTrans ps @@ -1761,15 +1764,16 @@ instance TransInfo info => APTrans_NamedConj (mbLift npn) args off t) ptrans [nuMP| Perm_LLVMFrame fp |] -> return $ mkTypeTrans0 $ APTrans_LLVMFrame fp - [nuMP| Perm_LOwned ls ps_in ps_out |] -> + [nuMP| Perm_LOwned ls tps_in tps_out ps_in ps_out |] -> do tp_in <- typeTransTupleType <$> translate ps_in tp_out <- typeTransTupleType <$> translate ps_out let tp = arrowOpenTerm "ps" tp_in (applyOpenTerm (globalOpenTerm "Prelude.CompM") tp_out) - return $ mkTypeTrans1 tp (APTrans_LOwned ls ps_in ps_out) - [nuMP| Perm_LOwnedSimple lops |] -> - return $ mkTypeTrans0 $ APTrans_LOwnedSimple lops + return $ mkTypeTrans1 tp (APTrans_LOwned ls + (mbLift tps_in) (mbLift tps_out) ps_in ps_out) + [nuMP| Perm_LOwnedSimple tps lops |] -> + return $ mkTypeTrans0 $ APTrans_LOwnedSimple (mbLift tps) lops [nuMP| Perm_LCurrent l |] -> return $ mkTypeTrans0 $ APTrans_LCurrent l [nuMP| Perm_LFinished |] -> @@ -1848,19 +1852,14 @@ instance TransInfo info => (PermTransCtx ctx ps)) where translate = translate . mbDistPermsToValuePerms . fmap unTypeDistPerms --- LOwnedPerms translate to a single tuple type, because lowned permissions --- translate to functions with one argument and one return value instance TransInfo info => - Translate info ctx (LOwnedPerms ps) (TypeTrans - (PermTransCtx ctx ps)) where - translate mb_lops = - translate $ flip fmap mb_lops $ \lops -> - -- NOTE: if we can't translate lops to a DistPerms, we just translate the - -- "raw" / un-offset permissions returned by lownedPermPerm, so that we at - -- least have something to return, and it doesn't really matter what because - -- in this case lops can't really be instantiated anyway - maybe (RL.map lownedPermPerm lops) distPermsToValuePerms $ - lownedPermsToDistPerms lops + Translate info ctx (ExprPerms ps) (TypeTrans + (PermTransCtx ctx ps)) where + translate mb_eps + | Just mb_ps <- mbExprPermsToValuePerms mb_eps = translate mb_ps + translate mb_ps = + error ("Translating expression permissions that could not be converted " ++ + "to variable permissions:" ++ permPrettyString emptyPPInfo mb_ps) -- Translate a FunPerm to a pi-abstraction (FIXME: more documentation!) instance TransInfo info => @@ -2484,6 +2483,8 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of m [nuMP| SImpl_CastLLVMPtr _ _ _ _ |] -> + -- FIXME: offsetLLVMPerm can throw away conjuncts, like free and llvmfunptr + -- permissions, that change the type of the translation do tptrans <- translateSimplImplOutHead mb_simpl withPermStackM RL.tail (\(pctx :>: _ :>: ptrans) -> @@ -2827,7 +2828,7 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of pctx :>: PTrans_Conj [APTrans_IsLLVMPtr] :>: ptrans) m - [nuMP| SImpl_SplitLifetime _ f args l _ _ ps_in ps_out |] -> + [nuMP| SImpl_SplitLifetime _ f args l _ _ _ _ ps_in ps_out |] -> do pctx_out_trans <- translateSimplImplOut mb_simpl ps_in_trans <- translate ps_in ps_out_trans <- translate ps_out @@ -2846,14 +2847,14 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of typeTransF pctx_out_trans (transTerms ptrans_x ++ [f_tm])) m - [nuMP| SImpl_SubsumeLifetime _ _ _ _ _ |] -> + [nuMP| SImpl_SubsumeLifetime _ _ _ _ _ _ _ |] -> do pctx_out_trans <- translateSimplImplOut mb_simpl withPermStackM id (\(pctx :>: ptrans_l) -> RL.append pctx $ typeTransF pctx_out_trans (transTerms ptrans_l)) m - [nuMP| SImpl_ContainedLifetimeCurrent _ _ _ _ _ |] -> + [nuMP| SImpl_ContainedLifetimeCurrent _ _ _ _ _ _ _ |] -> do pctx_out_trans <- translateSimplImplOut mb_simpl withPermStackM (\(ns :>: l1) -> ns :>: l1 :>: l1) @@ -2864,7 +2865,7 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of RL.append pctx $ typeTransF pctx_out_trans (transTerms ptrans_l)) m - [nuMP| SImpl_RemoveContainedLifetime _ _ _ _ _ |] -> + [nuMP| SImpl_RemoveContainedLifetime _ _ _ _ _ _ _ |] -> do pctx_out_trans <- translateSimplImplOut mb_simpl withPermStackM (\(ns :>: l1 :>: _) -> ns :>: l1) @@ -2885,7 +2886,7 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of RL.append pctx (typeTransF pctx_out_trans $ transTerms ptrans_x)) m - [nuMP| SImpl_MapLifetime l _ ps_in ps_out + [nuMP| SImpl_MapLifetime l _ _ _ ps_in ps_out _ _ ps_in' ps_out' ps1 ps2 impl_in impl_out |] -> -- First, translate the output permissions and all of the perm lists do pctx_out_trans <- translateSimplImplOut mb_simpl @@ -2916,10 +2917,10 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of fromJustOrError Nothing = error "translateSimplImpl: SImpl_MapLifetime" ps_in'_vars = RL.map (translateVar . getCompose) $ mbRAssign $ - fmap (fromJustOrError . lownedPermsVars) ps_in' + fmap (fromJustOrError . exprPermsVars) ps_in' ps_out_vars = RL.map (translateVar . getCompose) $ mbRAssign $ - fmap (fromJustOrError . lownedPermsVars) ps_out + fmap (fromJustOrError . exprPermsVars) ps_out impl_in_tm <- translateCurryLocalPermImpl "Error mapping lifetime input perms:" impl_in pctx1 vars1 ps_in'_trans ps_in'_vars ps_in_trans @@ -2942,7 +2943,7 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of (\_ -> RL.append pctx_ps $ typeTransF pctx_out_trans [l_res_tm]) m - [nuMP| SImpl_EndLifetime _ ps_in ps_out |] -> + [nuMP| SImpl_EndLifetime _ _ _ ps_in ps_out |] -> -- First, translate the output permissions and the input and output types of -- the monadic function for the lifeime ownership permission do ps_out_trans <- tupleTypeTrans <$> translate ps_out @@ -2959,7 +2960,7 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of fromJustHelper _ = error "translateSimplImpl: SImpl_EndLifetime" let vars_out = RL.append ps_vars $ RL.map (translateVar . getCompose) $ - mbRAssign $ fmap (fromJustHelper . lownedPermsVars) ps_out + mbRAssign $ fmap (fromJustHelper . exprPermsVars) ps_out -- Now we apply the lifetime ownerhip function to ps_in and bind its output -- in the rest of the computation @@ -2974,7 +2975,7 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of PTrans_Conj [APTrans_LFinished]) m] - [nuMP| SImpl_IntroLOwnedSimple _ _ |] -> + [nuMP| SImpl_IntroLOwnedSimple _ _ _ |] -> do let prx_ps_l = mbRAssignProxies $ mbSimplImplIn mb_simpl ttrans <- translateSimplImplOut mb_simpl withPermStackM id @@ -2983,7 +2984,7 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of RL.append pctx0 $ typeTransF ttrans (transTerms pctx_ps)) m - [nuMP| SImpl_ElimLOwnedSimple _ mb_lops |] -> + [nuMP| SImpl_ElimLOwnedSimple _ _ mb_lops |] -> do ttrans <- translateSimplImplOutHead mb_simpl lops_tp <- typeTransTupleType <$> translate mb_lops let f_tm = @@ -3691,7 +3692,8 @@ translatePermImpl1 prx mb_impl mb_impls = case (mbMatch mb_impl, mbMatch mb_impl ([nuMP| Impl1_BeginLifetime |], _) -> translatePermImplUnary mb_impls $ \m -> inExtTransM ETrans_Lifetime $ - do tp_trans <- translateClosed $ ValPerm_LOwned [] MNil MNil + do tp_trans <- translateClosed (ValPerm_LOwned + [] CruCtxNil CruCtxNil MNil MNil) let id_fun = lambdaOpenTerm "ps_empty" unitTypeOpenTerm $ \x -> applyOpenTermMulti (globalOpenTerm "Prelude.returnM") diff --git a/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs b/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs index 2fc64dfa66..3c52c1ef52 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs @@ -608,27 +608,26 @@ tcBlockAtomic e = tcError (pos e) "Expected llvmblock perm" -- | Check a lifetime permission literal tcLifetimeAtomic :: AstExpr -> Tc (AtomicPerm LifetimeType) -tcLifetimeAtomic (ExLOwned _ ls x y) = - do Some x' <- tcLOwnedPerms x - Some y' <- tcLOwnedPerms y +tcLifetimeAtomic (ExLOwned _ ls ps_in ps_out) = + do Some ps_in' <- tcDistPerms ps_in + Some ps_out' <- tcDistPerms ps_out ls' <- mapM tcKExpr ls - pure (Perm_LOwned ls' x' y') + let eps_in = distPermsToExprPerms $ unTypeDistPerms ps_in' + let eps_out = distPermsToExprPerms $ unTypeDistPerms ps_out' + pure (Perm_LOwned ls' (typedDistPermsCtx ps_in') + (typedDistPermsCtx ps_out') eps_in eps_out) tcLifetimeAtomic (ExLCurrent _ l) = Perm_LCurrent <$> tcOptLifetime l tcLifetimeAtomic (ExLFinished _) = return Perm_LFinished tcLifetimeAtomic e = tcError (pos e) "Expected lifetime perm" --- | Helper for lowned permission checking -tcLOwnedPerms :: [(Located String,AstExpr)] -> Tc (Some LOwnedPerms) -tcLOwnedPerms [] = pure (Some MNil) -tcLOwnedPerms ((Located p n,e):xs) = +-- | Check a sequence @x1:p1, ..., xn:pn@ of variables and permissions +tcDistPerms :: [(Located String,AstExpr)] -> Tc (Some TypedDistPerms) +tcDistPerms [] = pure (Some MNil) +tcDistPerms ((Located p n,e):xs) = do Some (Typed tp x) <- tcTypedName p n perm <- tcValPerm tp e - lop <- case varAndPermLOwnedPerm (VarAndPerm x perm) of - Just lop -> return lop - Nothing -> tcError (pos e) ("Not a valid lifetime ownership permission: " - ++ permPrettyString emptyPPInfo perm) - Some lops <- tcLOwnedPerms xs - pure (Some (lops :>: lop)) + Some ps <- tcDistPerms xs + pure (Some (ps :>: Typed tp (VarAndPerm x perm))) -- | Helper for checking permission offsets tcPermOffset :: TypeRepr a -> Pos -> Maybe AstExpr -> Tc (PermOffset a) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs index 70599c03ad..df101b4a7f 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs @@ -81,9 +81,9 @@ import Verifier.SAW.Heapster.NamePropagation import Verifier.SAW.Heapster.Permissions import Verifier.SAW.Heapster.Widening - import GHC.Stack (HasCallStack) + ---------------------------------------------------------------------- -- * Handling Crucible Extensions ---------------------------------------------------------------------- @@ -1946,6 +1946,15 @@ top_get = gcaptureCC $ \k -> deltas <- innerStateDeltas <$> unClosed <$> get k $ applyDeltasToTopState deltas top_st +-- | Get the current top-level state modulo the modifications to the current +-- block info map in an 'InnerPermCheckM' computation +inner_top_get :: InnerPermCheckM ext cblocks blocks tops rets + (TopPermCheckState ext cblocks blocks tops rets) +inner_top_get = + do top_st <- ask + deltas <- innerStateDeltas <$> unClosed <$> get + return $ applyDeltasToTopState deltas top_st + -- | Set the extension-specific state setInputExtState :: ExtRepr ext -> CruCtx as -> RAssign Name as -> PermCheckM ext cblocks blocks tops rets r ps r ps () @@ -2066,10 +2075,11 @@ callBlockWithPerms :: TypedEntryID blocks args_src -> InnerPermCheckM ext cblocks blocks tops rets (TypedCallSiteID blocks args vars) callBlockWithPerms srcEntryID destID vars cl_perms_in = - do blk <- view (stBlockMap . member (typedBlockIDMember destID)) <$> ask + do top_st <- inner_top_get + let blk = view (stBlockMap . member (typedBlockIDMember destID)) top_st let siteID = newCallSiteID srcEntryID vars blk innerEmitDelta ($(mkClosed [| TypedBlockMapAddCallSite |]) - `clApply` toClosed siteID `clApply` cl_perms_in) + `clApply` toClosed siteID `clApply` cl_perms_in) return siteID -- | Look up the current primary permission associated with a variable @@ -3746,14 +3756,14 @@ simplify1LOwnedPermForDetVars :: NuMatchingAny1 r => -- For permission l:lowned[ls](ps_in -o ps_out) where l or some free variable in -- ps_in or ps_out is not determined, end l -simplify1LOwnedPermForDetVars det_vars l (ValPerm_LOwned _ ps_in ps_out) +simplify1LOwnedPermForDetVars det_vars l (ValPerm_LOwned _ _ _ ps_in ps_out) | vars <- NameSet.insert l $ freeVars (ps_in,ps_out) , not $ NameSet.nameSetIsSubsetOf vars det_vars = implEndLifetimeRecM l -- For lowned permission l:lowned[ls](ps_in -o ps_out), end any lifetimes in ls -- that are not determined and remove them from the lowned permission for ls -simplify1LOwnedPermForDetVars det_vars l (ValPerm_LOwned ls _ _) +simplify1LOwnedPermForDetVars det_vars l (ValPerm_LOwned ls _ _ _ _) | l':_ <- flip mapMaybe ls (asVar >=> \l' -> if NameSet.member l' det_vars then Nothing else return l') = @@ -3909,7 +3919,12 @@ tcJumpTarget :: PermCheckExtC ext => CtxTrans ctx -> JumpTarget cblocks ctx -> StmtPermCheckM ext cblocks blocks tops rets RNil RNil (AnnotPermImpl (TypedJumpTarget blocks tops) RNil) tcJumpTarget ctx (JumpTarget blkID args_tps args) = - top_get >>= \top_st -> + -- NOTE: we need to get the "raw" top-level state, without deltas being + -- applied to it, to run the InnerPermCheckM inside the ImplM monad below. + -- FIXME: there should be a nicer way to do this... maybe if we got rid of + -- InnerPermCheckM and just had TopPermCheckM be a state monad on a Closed + -- TopPermCheckState? + (gcaptureCC $ \k -> ask >>= k) >>>= \top_st_raw -> get >>= \st -> gets (permCheckExtStateNames . stExtState) >>= \(Some ext_ns) -> tcBlockID blkID >>>= \tpBlkID -> @@ -4011,7 +4026,7 @@ tcJumpTarget ctx (JumpTarget blkID args_tps args) = implGetVarTypes ghosts_ns >>>= \ghosts_tps -> (case stCurEntry st of Some curEntryID -> - lift $ flip runReaderT top_st $ + lift $ flip runReaderT top_st_raw $ callBlockWithPerms curEntryID tpBlkID ghosts_tps cl_mb_perms_in) >>>= \siteID -> implTraceM (\_ ->