ELF@4 |4 (44 j j l l H H/usr/lib/ld.so.1 "$%&'(*+-0123789:<=>?ACDFGHJKNORSTUVWXZ[]_`dfgijkmopqrtuvwxz{|  !"#%&')+./014789:;<@ABCDEGKLNOQRUVXZ[\]^_behjklmnoprtuvwyz{|}~  !#),./456;@BEILMPQY\^abcehlnsy}~    $(*,-2356=>?FHIJMPSTWY`acdfgiqsx H  ( '0 3:@BHSZt fotxdHD  0 x 8 \   S D 89 > TD   < (/2¸ :H< D!L`  Z]8 h mL y| m0|  K R `  =0 >H  p <<< 0@X    Tـ Wh #x /B 7F =H R ` Y~H `i pC$ zx  `\D- `p | 0(L CڐT p 0 P  h( $ ʨ p "m *Ġ  4?HHMH @d W<P _X  iC tD ~N8 D | PL   84   n X  @   sp #+7 T ?8L HS Yt ea8 m z,  C 8  HT ܘH R8X 4}x   sH -T 0   * 1O@ =IZp V K\;X h t{$    x  N, |0@!y4 ( ` <A( $  0  th@ p X ): 0 pJ>h\ R4x \j s |Z`p M@ W 8  hp h X { x W 0  J 4 Ɛl ,P$ ! (`D q 4 6:|0<  By Mx Sp0 \ lr 8 ~l,  ! pH T HS* Zvx gXL p0 T z V% N l 8 x8 4DL H8Z (< o0 L  H  #B - 8" E8 M\ T3 ] g  q w  ~ հD 0` T,    ( D8 8@    h ި| $d [ $ |x  Ϡ &$ >0$ (VT ={ IL OT Yx _[\ j t>l    }4  $    h +@ P 0 9 \ 0 c D     E(  ǰ %  1F( >  GD O_ Yx d8 n= wx0 wx C   < ĸP XP Cp ` 1  EP .    h   ( j /, 8JhT  B` L  S?X \ eP n  r| z\X uv \  @`    א +(  \ 1p   0 h L t t   G k`   (h 2-l <2x B +  HH P n x z  @  ;`< Th` ̀h `  , F D  Z   l   |    !Ap +0 6%ht p ?۰4 I  S[fm8 w |, X|   H Q  ( X$ L 3, p 6X  P Mp  H!E *5P, CD T `'eHsx{\ F  < PH AD X   ( D ߀d aX`$ H8   _DYNAMICntimesplunk_c_declsclaimnrtwocasestl_yycharXu_ListAl_EleventmapnroFnamemake_atomicno_printTestOnlyTstOnlycommenthas_iomemsetqfullAST_storetl_yylexspitboxdelbasenamepreprocessputstmntcheckrunsameformrealread.st_double_forefftl_explainuse_freestrncmpfsm_tbltbungetchas_typputarrow_environchanaccessdepthplunk_expryyinstruct_nameremotevaradd_seqputgridfull_namenewbasenameexport_astDoDumpfopenone_lftsametreeshookuptl_outtteventmaptl_nn__iobrev_escapedo_varstrstrtl_lookupexpandstart_claim.st_int_initmulti_ovalc_previewpslineenablehastrackfflush.st_llongplunk_inlinesprintfhas_stateIArgsdumptabqmakeLastXdolocalxspinyyoutstrchrtl_emalloctl_GetchartrackchanuseevalsscanfFatalEtimeoutssetmtypehas_nphashset_labrepro_srcHave_claimhas_code_endunclutterdupnodeunrem_Seq.st_doubledumplocalyynerrssr_mesggenotherin_boundc_wrapperana_srcsetlocalnr_errspreconditionpickup_inlinehuntstartget_labnrRdyc_add_loccpyfileputnameany_operpushbreakAll_Memlimited_visalldonecast_valtl_verbose_exitglob_inlineseqlistc_stack_sizeright_linkedwhoruns.st_floatrepro_subunskipgenaddproctl_mainLastStepdump_structall_namesjump_etc__filbuffgetsmstjumpstepsnstopfind_labcnt_mparsproper_enablerstrcmpwalk_structhas_badelsecross_dstepstyp2creleasenodeprep_inlineccacheyywrapc_add_definteractiveTotalatoieval_submergerdoqUniquehas_pcvalueBufreadynon_fatalcheck_param_countCaccessNid.ld_int___Argvbreak_destf_pidputpostludecached_PROCEDURE_LINKAGE_TABLE_isutypeDone_casetrailfilenamesputtyperetargettail_addwalk2_structno_internalstl_yyerrorgensrcStack_mxtl_yylvalsymvarbsntl_parsefind_maxelNparsputlegendhas_unlessputcodenotabsqhideputskipdotagstrcpyplunk_reversePidc_statehas_globalSrandtrackrun_GLOBAL_OFFSET_TABLE_dumpglobalsfirstrowa_stats__ctypehas_enabled__xargvfclose__environ_lockfix_desthas_lastgetnode__fsr_init_value.ld_doubleNextLabaddtransno_wrapupsymdumprdyEnabled0Levelisalnum_s_trailscan_treehas_remoteputboxgencodetableopen_seqrepro_sequnlinkyytextno_arraysputpageshas_xufprintfhas_hiddenrunnableR13Mtypec_splurgeR14is_skipR15Ntimeoutsoptimizationshas_labtl_tersec_add_hiddenprintmfsm.ld_float_get_exit_frame_monitorfindloclinenobb_or_ddlike_javaundostmntnprocatexit__xargcdo_locinitsqlenc_add_globinitputremoteLval_structdumpsrcRvous_edataany_undostartpageprehintcheck_sequenceannounceusagegenheaderfsm_printputunamesno_nested_array_refsfind_inlineMparsevalindexrvoptisproctyperemotelabgetunamec_splurge_any__flsbufsetaccessgetlocaltfreenocaststepnumberin_cachesetptypeExpand_Okloose_endsOkBreaku_syncntrailMax_Redsetxusyyparseinterprintputsrc__cg92_used_lib_versionseparateany_lordo_unlessDstepStartclaimprocall_lftsgensvmapdumplabelsRval_structhas_providedtl_errscomplete_rendezany_runsmk_explicitany_termqtabqsendu_asyncanywherepush_negationtrapwonlychnameSkip_claimdeadvar_etextcheckvarqishiddenhas_stacksignalsetutypeonly_nxtdoindentpnoc_trackprune_optsplunk_c_fctsdump_condgetvalpstextAST_tracknqsq_is_syncsystemtl_UnGetcharspit_recvsvalidrefElcntownerTvalrepro_procWidth_setmk_skiprem_varhuntelenot_claimcanonicalqrecvschedgenunio__1cG__CrunMdo_exit_code6F_v_match_trailstat_startcache_statscheckindexismtypep_talkmemcpySym_typany_andc_add_stacksetpnameMadeChoicegenaddqueuestrlentl_clutterIsGuardanalyzecount_runstime.ld_llongputpreludepc_valueput_uformqlen_typecolumnshas_remvarm_losschecktypeRandcontextc_varsetvalnewstatescutoffrm_selfrefsini_structnochan_manipno_side_effectsAST_sliceCanonicalo_maxprerusehas_randomtyp_cktrackvarsr_bufstrcatCnt_fldshas_sortedc_add_locinit.st_float_forefftl_balancedltabNamesNotAddedGenCodeclose_seq_finisetunamec_structisequalc_add_svlabtabc_chandumpfscanfrem_labrel_usedumpclaimsgetsymcolboxstrncpylibc.so.1SYSVABI_1.3SUNWprivate_1.17̳ Nq,|0:    { g      < $> 0U < H T= `K l x   2    q H  [     , 8 @"cD"c"b$, @' $+`-` `?-)è"- =--% # @rQ@r""( ",@r@D@,4@r@r "      **`* @*  ""  "     + **      + **     **   㿘 "    //// 77㿘 "" "   ////    ////   7777 `" 2 2 *@2 *`2 *`*`2@2`""2 2 **2 **2`*2`*2`**222`22"㿘`" 6 6 6 6 .@.`.`.`'6@6`'㿘" &"6 6 6 6 ....6`6`6`....?6`6666?&`" 2 2 2 2 *@*`*`*`2@2`"""2 2 2 2 ****2`2`2`****2`2222"㿠'L1Y @㺨'X'T0', '$''!$ ?!$#`@5`T$-$ @h%@< <  ! #  '$'$T'$, , @qX '  'T,T@4@ ''T$,  ' 4 , ' ',,@$@ '',$,  ' 4 , 'X@@q @T.$ ,.$ $, $  H, #Qb,TV#c?@l$c!#'$# M#Ra`  '  $ , #RbT*#U`(T` X# `)#c ?$c`!#'`쀤$ '2'#Wa l#Wc<' , @, !3,#`!$@@Y`` !$",",$ 4#b0 $b0!$"4#b0$ $b0!"4"@- `  @K'`(`.  *'`  ' '@Kl  ' @"<@Lp!  $ 4@ !"4  ,`!$",!/@-Җ" !/@-ʖ " !/@- " !/@-'`` " `  "D@,Ȓ !/@- $ `"d@,``4!/"|@,`$s` !n$",!",` @KP ' '@Jڔ "@K!Q$",` !$",!"8"@,t`  !>$"8 ` @K !3$",` !$",!"<"@,V`  !$"<#b@ $b@ ` @J!$",#b@$  $b@!","` @,x ` !$ t@!$ t`@`!"D"` @,_ #bH $bH @#bH$ $bH ` @ Q !4!\ !4!H ` @ X !4!\ !4!H  `@ 6  !4!\ !4!H  `@ <  !4!\ !4!H%H $H@H$ $H!@,"  !4!H%H $H@H$ $H 2 !@,"  !s4!H%H $H@H$ $H!@,s" @) ![4!H@A͐ W @@,b@GN@BJ' `@GB`@F:8`@ 2#@+,# @+&$`@C````` @`` @U`!@U"0 !#@@+r@쀤#X @+! !",#t@+^` ,@+߸`@+ ,ظָ``!1@+ߖ͸`@+ؒ!1Ƹ`!0@+і`!0@+ʔ`!/@+–` $ 4`  4$ `'` $ 4@```!/ !2 ` D !$"4 !$"4`'` $ 4 !$"4 #`ܠ $`#`ؠ $`@6E@%L<`< @`@ $@'$L @@+n Y"  ` $ S`` '` $ `  # @*r  `$  '` $ 8 '`  $   , ,`!"0@!2%`!2@+0!$ t!2@+&#bP $bP` ` `$!@)/@?̐ @@ $   @E@>@> !@)@? @@ $   @E @>@>j!@(@? @@ʒ' #bD $bD @#bD$ $bD`` @@'  `@@ ' @>=@(Җ@?o ' ```@( +`@( -`@( *`@( /`@( %`@( &`@( ^`@( |y`@(!Fr`@(}!Ek`@(v!Dd`@(o!C]`@(h!BV`@(a!AO`@(Z!@H`@(S!?A`@(L!H:`@(E!G3` ~@(>,`!L@(7%` !@(0@()!? ?@(##b0 $b0!", 0@'z#b0$ $b0! @( `  ' @< A@z! @'! @'#Tbܠ 4b#b0 $b0#b0$ $b0#Ta 4a@'Ԓ R¸#b0 $b0#b0$ $b0#Ta 4a@' R !4"ڠ " `@'H``!/@'`T 2 ` " !!@'!"@'#Tb 4b!@'#Tb x4b `@( p ` @( g ` @(_ `  @(ҒVTR`P`N`L@ L@&s> d@&i75`3`@'>!@,`@'7!@%`@'0!?`@')!?`@'"!@`@'!? !+@'!-@' !,@'!.@&' `  $   @&V` '  ' ` @&Ѹ `@&ܔʸȸ`ĸ``@ ,@Ð ,@&`` ,@ ,@@&@ ,`@` ,@&``@ϐ@@&'`! @&@&y!/@&`T 2 ` l" !/@&w`  a" `` ,@ ,@@&eR@ ,`@U` ,@&R?@ ,@B ,@&?,*`!2@&5 ,@&/`!2@&( ,@&" & , ![!, '@, &@@`'`#X`.#X`4TU`' $, #RbTU`@#U`(T'.#X`T'쀤 #` $` @쀤 #c ^ Y (x?$c ,'@,&@V`' ', #Qb,T>  $, #RbT  #U`(TT@Y <#XbL 8@'`@&`V`')`!#'`L' ' ' @ '!#  ? Y L T@%XL'YlV` @'`@&`T@TX@@g@'I`jjjjjjjjjjjjIlIIKK<K`KhKKLlLLM@MlMNNDNXN`NNNjNOODO|OP PlPPQQQ0QPQXQpQQQQQQQjjQQR$RRRRRSS S<SXSTT8TTUXUUUUUV$VVWWWHW\WWXXLX\XXYYpYZHZZ[[,[H[t[|[[\\`\t\\]X]|]]]^^X^h^^^^^_ _j_D_L_T_\_d_l_t____```8`T`p`````aa4aPalaaaab0bbbbc0cDccccdd,dXdxddddddeee@e\edeleeeeeff0fLfhffjffggg g(g0g8ggh h,hThhhi<iiii㿠'H'L'P'T'X@#m㿘 "  @'㿘! @ `_ @'㿘! '㿘! '㿀!,#+ #c/@`\$!"X %  $ ' `$ @f.   %@#c/@`!"X %  $ ' `$ @f    %@u@#c/@!"X !# @e@㿀!"X %  $ ' `$ @e    '`$` @@6@'@!"X !# @e@@㿘@e@" @e!2!@ `@e  `@"Q '`'`'`!#,'``$@@" (" " " @e~  @ey@" `$  @eu'`!#,'`%2'`$$㿀! !Y @e_ @e\ @eY!T!H!2!    |Y`  @eA O`   \ `O`   \Y`@e'O`G+Y`@e5Y`@e/Y`@e)$ '`$O`@e '``$`O`.5.`O` "  %`O`O`Y`@dՐ!Y ؐ@dВ @d͐ $|!Y @dĒ @d㿘!2!@` @d `$@㿀'2$L  $!"X, #2a `&O` !"X, #2a &N 1'X, %2` !$"\X,  !$#,X$ $X %  $  $ @dF    '` $` @@㿘2a" "a"X* 2! @'`" "`㿘!2!@ ` @d`$@@ @!@'㿘@! '" " " #2a" $a㿘@  " " " #2a" $a*#Ya@cђ@ '`@cȒ` @c’` @c`$ !@ n !4"`㿘N   `O`  O`    `O`  O`   `O`  O` *`O` *O`   `O`  O` !4@ W@@c^ [@@cX {!H@ @@㿐Ya0@c;!2!@x@`o` 'YH@c" @@c0 -` O L` " ,`L \ , O `_ @@ Ya`` @b@7` (@b4@b@ +` O L` " ,`L \ , O `( @@ Ya` @bĔ@` @Ya@b㿈 Ya@b@!2!y`p` !Y!@b @@b c  O`@L` " ,``O`    Y!@bqO`   `O`  @b_@@p @b]@@bX" O`   /`'`O`  @bI Ya@bB@ Ya  @@b5@ Yb@b-㿘#$c!2! $c܁!2!@0` 'Y@b @@b ` @a$@@b ` 0@a8@a@  !$#܁` @㿐!2! !2!Ƕ!2!@` !Y"H@a @@aʒ  ` @a` @!2!@,` 'Yh@a @@a ` @a$@@a ` 0@a8@a@  ` @!2!@ ` @ nYb@ar!2!@:` 'Y@a^ @@al )` @aR$@@a` ` 0@aF8@@aT !!x@?,? @` @a: ` @!2!@@!!@?,? Yc @a ` @ Yc@aYc@a  㿐!2!@@!!@?,? 'Yc @` ` @ Yc @`ݐ㿘!2!!2!!T"`!2!@ ` ` @ Yc$@`㿘!2!@'` 'Y@@` @@`  ` @`" ,`  @` "` @`v" ,` @㿘#2aA!2!@`a@Ycl@`oa@4` %Yp@`P@@`^ #` @`EO    O  2a@`7 Yc` @`1` @㿘Yc@`!!2!@X ` @`" , ` ,  ` @`" , ` ,  'Y@_ @@` ` @_$@@_ ` 0@_ސ8@_@ ` @_ &!`@ Z`` ` @_ʐ` @!2!@    ` @_" ,` , ` @_" ,` , ` @! Z`@_!T"`@!Z @_ $@_ D@_ T@_ |@_!2!@&@`%Z` @_u ` ` @_n(@_k0` @_fL` @_a` @Z`@_Y!Z @_T @_Q 0@_N T@_K!2!@9` 'ZX@_7 @@_E ` @_+$@@_9 ` 0@_8@@_- @` ` @_d` @_` @!2!@&@`%Z` @^ ` ` @^(@^0` @^L` @^` @#Zb0@^@!T"`3`@^ِ`$@^֐`4@^Ӑ`\@^А!2!@@`%Z` @^ ` ` @^(` @^` @Zb@^!Z"А@^ @^ 0@^ T@^!2!@9` 'Z,@^ @@^ ` @^}$@@^ ` 0@^q8@@^ @` ` @^jd` @^e` @!2!@@`%Z` @^P ` ` @^I(` @^D` @!Z#@^; @^8㿘@L $`DC@?Zc@^`O`   \ `O`   \@[`@^ @#[` /  @^@![ @]@ ` @]㿠!2! 㿠!  !#܀!2! !2!!2![` @][`4@]!#܀w[@O! /! @*` ' @]y %[H` @@] @]}@  `@]y ! @[ `@㿘3@ú[``@]J㿘@,!   @%[@]+@,@](T`@]$`@] @]$ؐ` Ր㿐' [aX@]@@@] ( '㿘ɐ@Y%[`@\`@@\Ք@$`@\ѐ@@\ΐL`@\ʐ[a@\Ð#[b`@\@`@\㿘 @@\ ;!["@@\ @\@ !$"\ !$#,!@E@@\ =@L ! > < ``@L` =`@@\u =㿈C #bX $bX!@R!"\&!#,& @@ ` $$"@0 @U!s +!JO +m =!CI!E <E!Hc =!D?!F >;!GY =!B5!:S !!=/!> =+!AI ?!;%!<C &!@ &= |!? |75!3@ : - *  ! & + /w | $ : , !l!4! "h@Z!$#@DpL<d㿈@@!$#!"l'/`+êbl@V /`#âbt'$ #âbx@Ґ$ /`#âbp`/`@#c䀢 $  c4 Ų!/[b@Vi #TbР 4b!"X`!2!,`#2a`    @VJ~'X, +2a` /`@V< pX,  7!"X, #2a` /`  @V% #["!"\  @V2 #!"X, #2a` @   '4  @P $ Y!2 $!"X, #2a` /`@VL .@UL@ .@U!"X, #2a` /`!2$!#$@`x@!#$ @U!3@ !4!5!2@㿈#b$bV' !  $b$ y!% }&@a$"a9a7aaa`}a  a !$"$ P!a!",!$ tn!$"`}a#b$b!$" !"D0)#'[ؐ@U7  #b$ $b$. #3a,@U( #b($b('!$"$!3,! !"$, #3a@U@U  #b($  $b(!"$, #3a@Ua/M ' !# @T!"$, #3a@Ta/%[b!# @T!"$, #3a@Tے#[b@T#[b@T#[b@T#[b@T#[c@T#[c@T#[c@Tx#[c @Tp#[c@Th#[c@Tw`#[c@ToX#[c@TgP#[c @T_H#[c$@TW@#[c(@TO8#[c,@TG0#[c0@T?(#[c4@T7 #[c8@T/@!: !k!` $!: , !n#!"$, #3ac@T@T4t4t4T㿘@ @@ @S``?@㿘N N @ /`@ a`N `'㿐ߐ* #c@`@S `D!", `@! t_@`H@!",!/ #c@`@S @`D `@! t;@`H@@y L@Sc@t '``@S` @$! $!",$D! t$@!"H / #c$H$@V '$%0@!$"4$0$`$0@㿘 @?4``  `  *`    *`   ` ` *`` !` ` *`` ` *``!/!2㿠!"8@{$"8`'H!"8N ' D@B =H2  a/   ` !`a2  ``` ` $'Ķ$@` `O!  J`!!Т@?,? '@RiȤ @@R` $ L  آ`,$`L @RLȀ @F D -#[c< @@RN`(@RJ 㿐  `    @@ `  @q`$ @㿐!"\ ` ` +%b\!$#,!@ %b\@,<  4 !"0   / @@@/ F`    ! @   `  $`"@e  ` "4@Z`;  '[p@Q      / #bԠ $bԀ`"`@  @Q      /  @Qx      @/ `@ #b< $b< $ $  4 @ !$#,!$"\"@A   +%b\!$#,"@  %b\ $`4㿠 $`@$`' (.`? ',@Q  [# (.`? ,@Q "@  !", (.`$?㿘 @` ` 8@`@@`$@ $㿐 !4!N!#Ȁ`  9"[# @P!",  !$"\ !$#,"@ 7@  (@" ` " !"," #b@" $$b@``8`@S%\`$\`!$#,#@  $\`$@㿐#b\$b\!$#,!"D$"D $`$`$'`$!"D @B` @` `!2` # @ !`  !  .! 4 !/@ ` ` $ 4`  4 $ 4 @#8@ `$ @!$"\!#d@ 㿐 !"D@`   @Oِ  `$@㿘D[c@Ov\`@Op\`@Oj\`@Od\`@O^\` @OX\`(@OR\`0@OL\`8@OF\`D@OA\`L@O;@ @       !  @ !!!$ @|w\ T@OM @㿘 #\`X@O9@ @`@O2 \ `@O. `  ` \ d@O! `@4 \ l@O` \ p<@O  !\ t@:r4@N`@\ x@N`D\ @N\ @N   \ @Nݒ \ @N` @3`4/ $@ `$@\ @N 4 $@@ ` \  @N V@`$\ @N`$@\ @N㿘!"4@L``@㿠#\`@N~@ D`@Nw  @\ @No \ @Nk `  ` \ @N^ \ @NZ㿈!   0@` `r `s `@   0@` .#ĢbH `@ 8\ .#ĢbL@N  0@,@ .#ĢbH#\a @M@``@M `\!@M'  \!@M`@ !#@?,? '\!@M!"4@`@yT!#b`n`` g! `D!T!H !"'x  ,!  !T!HD%\ !#, @M~|` ` D@@Mr`@Mn \!H|`@Mh %     @   !`@㿐 `'\l@M  @ ̒]`@M  ! Ā M`@L !   9`@L ! , !T '$`@Lؒ ! ! $@`D `@2@``& @Đ㿘`D `@2$@ ``& @7@@㿠@@<`!20` @L~ )` D D` D@ D`@Lf `!$"\`!$#, @  !/6`&`` Ȑ`$Ő㿐!"\!#,@1p@=`  @` 6 `(`@ 2, &   @ 4@7 4 /` $!#耤@ /`$` @!$"\!$#, 㿐 @7z @` !  @@%\!@K`@` @@ @ ``.@ `P`` `@&@`!@`a.`4 ``, 4 ` @?  4@@/ <`\a@@K! @(/ <`'㿐`  @ @v@"@6  @  /`  @'  /`$! $  '  㿐! !"@@` @K  `$@ @!$ \a@K !"@@-` @J " %4V'0` @v4V+\a`@J@ %4L` @v4L`@Jݔ`$@\a@JՐ!$ 㿈#b !/@U!2@P$b!"4@@D@a$`` ` a @ ! ` `@ ! @! `@@@ @@! ` `@ ! @! %$  $ O\!@JU`@`  ` \!@JH#\a@JD@#@`!`?@Ò@J:`! |@ w',! |!# `@J`@J`!`?@T` ` %,`<  . X` $ $! @ $ @!# `@@3! | \" `@I&#\b@Iؐ@`! @IӔ@@Iѐ`8``@I`@`  ` \"|@I\"`@I `7㿐  #b !/@!2@$b@` `@@`@ @@! ` `@ ! @! #b$ b $ \"   !T $@IR`@`  ` \"@IE%\@IA#c@!"`!`?@@@I3! @ +`-`! |!#     @I@    @I @!"`!`?@D` ` %,`<  . X` $ $! @ $ @!# `@@9! | \"`@H,%\    @HŐ! @H@H@h   @H`@`  ` \#D@H\#L`@H `!`H@ 㿠!#  !#@Hm @H!#쀤 !#耤!#!#쀤!# ! \#T!@Hc#! |!#耤!#쀤\#d@HL\#@HF@H㳘!@H"  !"@'Ħ%+\c@H@/`@H`@@G$ #@\c@G| \c@H@@H@H@@H#@\c@G` @G㻐!\#@G @G@@@@ \#@GΔ@9 $@Gה@!] @G@@$@Gɔ@@Gǐ@'㿠!] @G@G (@G X@G x@G @G @G @G!,@G!T@G!|@G!@G!@G!@G"@G",@G"P@G"p@G"@G"@G~#@G|#<@Gz#\@Gx#t@Gv#@Gt#@Gr#@Gp$@Gn$D@Gl$h@Gj$@Gh$@Gf%@Gd%4@Gb%@G`%@G^%@G\%@GZ&@GX&L@GV&d@GT&@GR&@GP&@GN'@GL',@GJ'\@GH' 㿘#b  $b!  !!P@?,  ^#@G$@#b  $b!  !!X@?,  ^#@G @#b  $b!  !!`@?,  _ @F@#`x  $`x!  !!h@?,  _ 4@Fܒ@#b  $b!  !!p@?,  _ `@FĒ@_ @F& 1 , !|!L ?c@F#c0!$# #c@!$ !$#؀ ;`L -6`@F !$  !$# !$# !$# !$# !$#  !$##b '$b`, #c$ !$ #b '$b` , #c$`!$"& `!$"& ݲ`#` $` !$# !$# !$  !$ `@F$ !$  !$#`!$#& `#` $` !$# !$#`!$"& ``@E  !$!`L  ` !$"#` $`` L#a  @Eܐ@Dt#` $`n#` $`h !$#c !$#` L#a  @E!$#Q#b '$b`, #cE$`@E !$#>#` $`8_ ax@E.#` @$`( !$#Т !$ |zb @E  !$  !$#`L $ A 6, !!& `  L - !#耤_ @EL'ⴀ,$ !$" f`,  #_`@EG@!?'!$#ؐ`@E0  %!#@E5@E6##c@$#آ!"$ #_a@D!"!"0_a@D#b`0%$b@ !$#@Ec B#b8 !_!@D', b@D F `0!$#ؐ,,@Dߒ$,%_,!# @D@,@@Dϒ$!@D#@D,0cz `cs!#%#_a0@D@',!$# ,`@D `#_aL@@D   `` @Dy   p_a`@Dz`p@D]`p',!$#,,%$ L` "@DJ@'( ,?  $+!'!$#,!$#!"@  @R@@D_!d@DA !_!a@D9@D7 #@@DN!# ! |!  =_!@D  @ !#% ` ``$!#  ! #` $`@+>@!$##a(@ 2 #` 2 ` 2 ` 2 ` &2 !@C# @! @# !#!#쀤!"!"!"!@="@$!#tP<dLPP`h|$P| 8d8㿘 '  㿘!#, ;a_!!"\@CQ@@@CJ@CF#c?   !_!@C:@Ic@C6 !#@C _!@C+_"@C'#c $c㿠@ 㿘 @Bڐ!@@C@㿐  @7*`: !*`:  *`:  *`:   *`:  *`:  "T   ' ` *`㿘 0@@!",@@ @ @`@ !"," " " "  0`" $`㿐s (.`< 4@ ``$$$@ ``'`'`@ ``'`'`!"\'`!#,'` '`'` '`$! x'` a!#c$ $c$!",Ӯ@@ r s`s@`R`k P!", !"8@!D _"@B u"o!#(!#$#c( $c(#c$$ [$c$` $` '` $`!  !_"0@Aڐ ,`@A >@@9@!! r  R c!   r s!:!+!!$!+ , !#!_"@A@@@A "(p)@! !'@ $a !"\@?,? _"@Al$ a""hG@㿐#c $c!6@j ?@Ŗ'` p@"k'`!2'" q'"!B@'㿘#c $c#c $c!$" ?@'` p@$ '㿘;c@  !_bА@@@˔_bܐ@@@Ɣ_b@@@_b@@@_b@@@_b@@@_b@@@_b@@@_c@@@_c@@@_cĔ@@@_c @@@_c$@@@_c0Ĕ@@z@_c<Ĕ@@r@_cDĔ@@j@_cHĔ@@b@_cTĔ@@Z@_c`Ĕ@@R@_chĔ@@J@_ctĔ@@B@_cĔ@@:@_cĔ@@2@_cĔ@@*@_cĔ@@"@_c@@@_cĔ@@@_cĔ@@ @_cĔ@@@_cĔ@?@_c@?@_cĔ@?@_cĔ@?@_cĔ@?ސ@``Ĕ@?֐@`` Ĕ@?ΐ@``Ĕ@?Ɛ@``Ĕ@?@``$Ĕ@?@``,Ĕ@?@``4Ĕ@?@``8Ĕ@?@``DĔ@?@``LĔ@?@``T@?@```Ĕ@?@``lĔ@?x@``tĔ@?p@``|@?j@``Ĕ@?b@``Ĕ@?Z@``Ĕ@?R@``Ĕ@?J@``Ĕ@?B@``@?<@``Ĕ@?4@``Ĕ@?,@``Ĕ@?$@``Ĕ@?@``@?@``Ĕ@?@`aĔ@?@`aĔ@>@`aĔ@>@`aĔ@>@`a Ĕ@>@`a,@>@`a<Ĕ@>ؐ@`aHĔ@>А@`aTĔ@>Ȑ@`a`Ĕ@>@`alĔ@>@`axĔ@>@`a|Ĕ@>@`aĔ@>@`aĔ@>@`a@>@`a@>@`aĔ@>@`aĔ@>|@`a@>v@`aĔ@>n@`aĔ@>f@`a@>`@`aĔ@>X@`aĔ@>P@`aĔ@>H@`b@>B@`bĔ@>:@0? $ X, ! 8cR ?@D@rck8ssj1$ K-, ! P  ( X @ p     @ `  ph P  P      p   H(  px   8 P( `hHP0 @8  0 p  X 8㿘#`!`" @=`@= `@= ,`@= @` l!" @= !#̀ ;b#`%`!"@=y@`@=v0㿘#b $b! `b@=c!"$ `! @, @ d?@~@'``%'`@=D#b@=> ib i@=8"X("X@=3 d8@=/ d@=,H`!X#艠$;X[X0p ;X[X0p @=!!@=K!!"$!X#Dt;X[X0p ;X[X0p @=㾐!#̀ 5Ԥ#`c|@@<`@= !$ "ے#`!`#@<ْ` #b@<Ӕ@!#̀ `$! #`c@@<Ĕ @<` Ė@15 !#쀤Y!#Ԁ!#̀ ;c`c!#@<@!#̀ ;c`c@<@%a@<@<|" ,@<# t !$"!@<'Ħ $!@<@<#be, !$!b`, !$!b[, !$! bV, !$!bQ, !$!bL, !$ H$!$!㿘@%#a`@<)@@<&``!@.'` 4 $ @  `@ѐ@@ `.$ $%`'` $`W`, #` $W`㿘@" " ') , #`    6 @㿘@"a " ')  , #` @㿘@"E " ') , #`  `?@㿘@"% " ? b @6#) , #`@! $`` @@8@@{@x@! " S @ b`4@6V8!!dX  $@*`  !/! %0$ '耤`$@6*$'ܶ'` }"`#`$@)   ;bxb <@6)@,#`@ ! $`@h@㿀'D'HD <H $0D +D / @!^ @'D  ^, '䀥@$'@@D D $ *'D  D ], @\, %@- $  'D @' D ^'㾠!  #@@`@ @@@啒呒@b`l@@5c"|㿈 ` \   `@!#!!d @`3@!   >.! , $`$>@:@  ' /`J @, $!  ! ! @ @@ /`@ n@ $'`@ @!  -! ! @&@ @%@@g  @b !@4 b !@4  ` $` 㿀'D'H'L'D  'H $JD E `!/D  \, `@ `! #D  \, @` H      'D @H' $'@D @!!d 2'!  D  b !@4:  b!!@40 ! H!$ dD!$ hD, 'H $ !#L!  ,! '! ! @ L H  !"'!"'HD`` \, @vLN `!/! D  \, @D .@` 3@H  ('D $ @ D \@, @], %@- $  'D $ @ $'@D @n!#L9!  4! /! ! @('D "L H  !"'!"'HD@ 'D @!# L!  ! ! @@L H  D `$ $` '㿀! `$@& " / @q` @/ / $@ @` k@`$ @@ @ @& & ڴ!!d& Ҵ %$ !  ! @`$#`'$`@ @&` ؖ@@F`$ @@ @ %@@-   b!4!@2  @b!`!@2| !$ !#쀤m! d! h"M! d $@3 /` `!2 ` ba@28 @` !   ! d! h@Ҙ`$ @@ @!   %Ťh')Ũ d @ !# ! @!$ d!$ h 㽘 @ @1@2 #` @1ސ@4+D@ΐ  ba@1@ڐ@#ba`@1Ȑ@`@1 @ @ؖ @1 ba@1  #ba@@1@ @1㿘',ba@@1 !# @?,  @1w@ ba@1oN` [ ba@1e .!`?@ $ '!#쀤! !  !T $N` [ ba@19`@㿘'D'L! l,b!@1)! ! $!T $+Ū`-Ŭ/Ů)b!@1@`$U`$@b!@1!$ l<b!@0W #`` !T $+Ū`-Ŭ)b!@0` U`$@%b@0ڐ',D @@0Ŕ @??  ?'@0Ȓb!@0N` [b!@0#@L .!`?@6 $ N` [b!@0b!@0㿘퇐 '" #a" $a㿘!@ @@ @ @ !#  @@@@! |2!  N [ %b@ @@0/ %b @ @@0$!b"@0  @0 @0  @/  @ b"(   @0b"8@/#@`/ !`?@|@` $ %! |#bb<@/@!  @/ߐ`%bD@J @/Ւ! , Ր@/͒#@@/㽐 !"D@/@,`  @/ " #(`  G bb\`   @/@ @/@`$'@@bb`@/ @/z㿠! , @@/\㿐 ! `@@U  .`u! |  !   ! @e@` `!b"dT`@/=@  ` `!T @/1$`  `  b"| @/#@b"@/``0b"@/`  b"@/#@`` ^, `/ !`? ` b"@.`b"@.` @㿘 . @*` @&@ L@  !/#@뢒@ @ ` @ @ V@@`! ! !+ !-!,!.`@` @#Xg@Ȗ V`!2 .` @`$ 㿘! @`@.@ `` $``@> @.(9 '` '``@.#%'`$㿘! @"`@. @$ $  @$`!$ @`@㿘! @`@- #tꔒ@`@㻀l!$"\28 @-ΐ@  @-ʐ "#bb@@-@i@@-@`@-@`@- @Ք` @-@@@-@ $@”/!b"@@-  @-@@-@.!b"@@- @- @!b"@@-t @-q㻠!$ #bbȐ@-M@`@-I{㿘  @-+!b"@-&@ @-&@ @-@!b"@-@  @-@ #@㿘 '!@g p'$ p !$ t㿠 |" x㿠?" x㿐@@B@?@" @`!@@\' ! x@ ` !$"\` !$#,`$    `0@@@ 㿠@@ ` !$"\!$#,#l㿘`!! c` @ `!/`  @'㿐 @B`А6@@0  *`!%!"!  b"``@,+ @`` ` ` $`0&0@`0@㿘!",@!"8 `@+ޒ  @``@㿈! p `@`   7`  b# @+Z!b#8@+@+ $@+ LZ!b#@+@+ @+ 4@+ HN!c @+@+ @+ 8@+ LB!c @+@+ @+ 8@+ L6!c @+@+ @+ 0@+ D*!c!T@+{@+y @+w $@+u 0@+s H@+q X@+o l@+m @+k @+i c"@+c &  , !#   `f`#/#`p $`p! t'` ``'`` @']]]^^H^x^㿐! 螖 "  " #Tbޠ 4bޢ@`! `@:@( @V  $ A:5  !!!*   $  ' Ɛ@[ @&'  '  '  :L "  "  @ߐ @ @' 㿘磐 '$ $ '㿐@`!!@! @ @{ 4'" #`t$`t" #`| $`|" #`" ,$`@㿘@($ `!+  r s$!+ , !#   $@bbbb㿈! @@ @ 0pc`0  .  0  .* ?  ?`    0 ?c"``  ` ` @@)#\`    0 $   !@ ` <g$ `$! , !!`,@cccx '  .1` ( ! Ti@`@@$`'& @`@ $  h?' @`  `! $`#Tb 4b ߒ#c$ $c涖&``$ &`$ `@@`@!! p @!昖x@@d#` $`#`p @@`p @@'㿘 (@ @@E@ (@ `@I@`@ (*@$$`( $ @;@ $@ `@2@`@    ʒ@   @@` $! , !!i4ii4iiiiihi㿘 @@@@ @`0@㿈  .! '  $ ' $   B `@;`@ #`p @.`p @*'㿘!/岖' " c媖'㿘` !@@’  @@@@@$$ 0&`㿘@` : `  @5!$! =@@㿘@!$! ِ@'!  !! !  ! p @㿘+! @@@!",@ 5`@䁐 " !"," " #`" $`㿐 ! @ @@ !$"\ !$#,@ A 㿘! @8@/@ )   cbD@', ` ` cbL@' ` ` cbP@' ``@㿘! @@@$@@  !$"\ !$#,  㿈! @ `@&  ``@& `@@%c\ `@&! \ !",@@&  !  `  !@㓐 4``  `  ` " @>@' ` 0' 0#`|$`|' %' ,$!/ c`$   $  $   $  $    $ $ 0`   '   &!4 㿘! @ `@&) ``@&"  ` $` `@H #``$`''cb@&@D'' %' $㿘! !h!  @㿘  @1@ `  @`$ @` ?$ $` $! , !!dttut㿈!#,!"\@ O$!  !!@?,  'c"`  @%  !  9#cb`   @%@@%`,@%{`@&!`4 `     c#@`  @%c   $! , !#`$     @@`0!$#,!$"\uvvv㿘! @@`` L : c#x` @%`@㿐 $ " V " #`$`! &!T " !  ` `   ;ac# @$@`` ;a!Ồ@   @"f?'  '   ` @'`! $  $$ @ɐ%$!$ 㿀'D'L'Tᖐ 'D" " L" T" #`'$`2    #Pcc@$p.< , %$ $@@ @`$@$%<`< @`@ $@'$! '㿐 @@@   '  @`t "`t㿐 )` ?` @@ ," &  " &`$@ $㿠%, !$ l ) cc+`-U$ @#` U$덒 c#! !T $@# ! !#耤 !#쀤!  c#@#@ G +d`) !T $ @#@  `@#d (@#㿐   `  $`! @1`@#` &! ! $ d ,@#i  @Vd! @@@m   !T $!T `@㿈`! @:`@#! /`   !$"\ !$#,` $ $@ d P@@#!߬ `@㿐! T@ d`x@"  ٔ  d @" !84 !# '!$ a|! @` !d @"% ` ` @"` a` @#` "` $`$$  !4 ! @`!T $`  $ 㿐?! @` @"^   !d @"k $`@"g`` @'㿘!$ !# !#d!@"=!#Q%'@.+`d!,$!T $!T @"#` ?B%`%`%`` %`! !$   %Ť@ $!$ ! |! ;a;ad!! ! ! $!@l! : . X@"!  & ' & $ഀ! $!  & ?!$ d!T@ ! %$ )   , 4 ` `@ =! ! @`, 4#`! `$ ` `$S`O@@`?''Ԁ @! |Ԁ !  `'̺`'#dah@ @!  @|Ԁ@ y`%d@ u#@#`  @U`  (@ ed!@ a'''!   $\ 'ԀP ! ! @? ''@A`@6`?''Ѐ @! |Ѐ !  "`'Ⱥ`'#da@ @!  @ Ѐ@ `#da@ @#@ @U7@`'ܤ$ؠ'@$ #daĐ@@!  @ߒ@`#da@@ؒ!  @В@ѐ`% $! !$ '@  #`  $`в?! |d"@'`'@ d"@d"4@'`! | '@ d"D@@)@#@@d"H@?O#a  @q`@d"P@j}!$#! !$  &+`    , T!  , T  ! $#` %``'㿈!  В!T"܀! ؀  !d"l@@ (#c $c!#耤@#!#쀤@a!"8d"@!"<d"@! !$  % !$",    !$"\   !$#,%`!  !d#$@ @~#` $`!$ #` ` @) %   @ @! |!  `  ` !  @ d#X@! @ ! ! @S!  `  `I! @'  !  #` @M d#l@L%` $#@!  @Std#p@9!  U!  !ԁ    ! |d#t@! @   "y'`! !$ !#܀!$ !$@!! `  @ !     #`$ $``   "r! `b ^ @Z`! ! $$ P! @ ` $ !  !$ #` $`'!  $$!   @1 #@b ! !$ !#܀!$ ! ! @H!$@!!  ! !$  % #`) $`! ! @ $#@b,G$! !  ! \!$",㿀! ! !#!#쀤 `  "8 !$ !@]$#! : . X@"! !$   ' ' ' $ഀ! $!  ' ! ! $ x! @d`@A[#`@h S!!d$`!F$ !  `  `5@#`$`@ #dcx@@#@@QԔ@`@#`$`#`$`#`@ %d@#@` @Q@!$ ! $ !$# % $! $'  !$ !$ !$#ܰ㿘'DD @ `@5` V`H@9 L@%5 - %%4%4! %D %D  , '`` `.@`$`ϲ "X`8'`8`<'`<`@'`@D '`H$㿐#`$`!"4@=`4 D0  @ )` $`  !  @     @"xP `@!$ ! "} ``  ` "`o @ @j& !$ @j!@@@`@ @@ˑpˍ@dc @@^"!26``@ΐ!$ 㿐!$"\!$#,`' @@` , @@` @`$@`$@@ $㿘!  @ `@ `H@@!   @㿘@ @`d#  @Ҕ@"o  @㿐 @0 @@ ` @@hv Œ@   /` 㿐 @ @@ `  @h@  @έ@`/ $! '` '  㿠! /d#!@Y #dc@U@!T  !   @H` d#!  !T @=$d#!  @6 㿠!  `  ` @ d#@!  7!  d㿐?  !T !   ! Ȥ@@ ! |d#@ڒ!$ q@/  ?   9"e  @! |` @@_ e (@㿘 !$"\ !$#,   ! e <@" n ` #`d    /  #0 V @'x !$"\ !$#,  @   @@#T`T`! ! $! @F' >`   @ e T   @'&#H`   e`@  `N L''$ഢ ` $$` ``& ː& & $6` @%e   &@#h Ջ @! ! $$ ! @`   @ e ` @Β` 'ܸ' @㿠" ́㿘`|: . X@ "!Z@: . **@*@* @* @##`̀`#@#` ̰@㿘 ' @  @p< a! 1!$ ђ ' @۔?'  뤐!a $  $'''!#܀1!#,! Ѐ'! Ԁ" ! ! @!e @@ ! ! $ e @ $@l!#܀b!#]! ЀX! ԀS  N! ! @G` @B! | !  @@2` ` !! '`0''#e`ܐ@@`@ @`Ԡ '#@`  @LȔe @`@Ԁ  e!@~!#܀\! ! @U! ԀP  K! ЀF+c-! |e!@Ue!(@O#@@fe!8@jO#a  @@qΣ?%c`@ e!@@#$`  b: . X@"'' $` @1` !,'! '`0'!#܀! ! @ ! Ԁ   `' $'{` ?  !!7`     ` !,'! '`0'!#܀! ! @ ! Ԁ   `' $'9쀤@,`# 'b!#܀! ! @  ! Ѐ ! Ԁe!X@_A`' $' 'N!$ ,     '     0&0   '     0&0. !  0 0  = (9!  4#eah@@#@ @K*@` (!e!@   !!   #@@K e!@ e!@!#쀤T#`Ԡ $`! ? (!  e!@#`Ԡ$ $`0 (, = !!  #ea@@ ` @e!@#`Ԡ$ $`_ #`Ԡ$ $`!$ 5  rcs$ , ! !  :!  @" 0''@  0''ܲ@㿐 @@@` r ` '@!$ @d㿘!!d.  @c $ $ !+ ! ! $!+ , !!@ce x9@ @, $@㿘! @`S ` @ x!$"\!$#,  `?'~ z  v:  $<`@.; g  $\@_  $X$@  $Q@  $<`@. X@$@@  $@ & 5  $@ 4 *  $# @  $@  $@  $@ $  w t $@ 6 l i $@@ b _ $@`?X S $ ܺI  D $ ͺ: 7 $ƻ,@3 0 $<@,  $&  $! $@J %ܭ܇ܥ `?|`?'ܗ  4 !#쀤} @ y u@Y ql1h! d!!d АXܟTҒ O K!!d #@@=!!d #@@g/B+!#耤e! @ #@    !#耤#ea  @ @#@  @` !!dl  #ϓ#ea@@#@ @H @`(!#쀤 ! |ݺ  ٺ ׺պ #ea @ΐ@!#쀤@ǐ` #Ϫ zpD-*%!-]&@+LR? $- , ! @^R^c/(~| $p , ! K~$ , ! $ z, ! 2.+! $ g, !  UY$ U, ! $+ K, ! ? 2::$? 6, ! @,lP((l (0L` (T|dH(((㿘!, !#!#쀤 ! ! @` T``@@ `ٟ '  ?a` ` !, !#!#쀤 ! ! @@_ ebD@e ebH@]`O n t`L-<  %  ebL@?#ߒ} ?$ebP@/VebT@(O#}! @, _ @@<ebX@5eb\@.eb`@'#͝$  /-<o $c , !!uoxO// @ʒO % "Tr \O`@@C`ذ @! #͒ '  ǘǴ㿐! Z @>"! z '$%Т $Р$ $$ki ٢! ] '$d+%`%Т $ӐР$ $$d%`JE`?D}= R6 '$%Т $Р$ $Т r6 $* rcs $ , ! 8:@ʈʈʈʈ㿘 q(!  ! ! $$ `?a_ ! XV  $  P    I ! @ .! $! , !"L`$`  `@`(@`   `@ 㿈! ! $! `#`S ! @& %$Y`$` @'㿠  !#ebd @( 㿐! !@[#e#c%ep! @ c!@ c@(c@8c@Lc@`c@tc@c@c@c@@[qc!#@! @! '@! @?,  !#ec<@ϖ` @#c%eP@”c@#c@! c@0c@@! @%Ť'` W`@ \ `@ ! !!@ P`%Ŗ@  ! #ec@@ Ŗl@ @{`(w@v`<Ŗ @ #cŖh@ !$# @G c%$c!e#@Xc@U c@R c@O 0c@L Pc@I \c `@E! @㿘! B!#f`P@)!#@%Ť'fd)# @@`@#cŖ@ c!  Ɩ0@ cƖ8@z !T"#c!f p@ c@  ,c@  @@ !  %W $@  ! 8!$ !T" #c!f @ ̒c@ ɒ ,#c`Ɩ@@<@!  c!  Ɩ0@/  c! Ɩ0@& !#Ɩᜒ@ 㿘! @ W`` ߐ`@㿘9!"耤` !#`Ɩ@@6#cƖ @ c%'Ʀؒ@c ! @ٖ!#Ɩ @Д #!  Ɩ@Ȓ ! , !"L! @ `@W``@5!"耤` !#`ƖH@@%'#ƢbH@@ ! @@!f!@  @ !#! ƖH@| ! , !"X!#ƖP@h !  #b  $b#c!"`Ɩ@Sc!#`Ɩ @Kc#`  Ɩ@B%!f!0@ ’Ɩ@@6 ɖ㬒@0 ̖㸒@* ז㐒@$ ` @@  @  @  #`@@|  @  0`@s @  D#c! \ @ c!f!|@ |c@ y 4֬L׌T㿠!#@ܔ 'D'H!"\'!#,'H!"耤@!  H!"耤@ ! ! @! v` / / 1 #`@ + ]` D@  U!#/fḥ/ / #`H` @ +b--#`@%b'#`@$` ` p@ @ & `"p,@ @`  !$"\  !$#,#, 'l! ,'lf!!"\l@ ٖp / / #``@! @@` ` D D@   !#fb(H`@  `@!$"\!$#,㿐@@'f@/`#\@ r#`@ o `/`㿘f"D@ n@`D 4`4@' f"T  @ X @       `>! @` @@  `@@#     @   $'h$ `9!  l@ ѐ $ L  `,$`L h Df"d@ ђ@f"t@ f"| @ Ŕ`6 `2!  -Ւ@@ " L  ,&L 0 Df"@ @f"@ f" @ 'D'H'P6!"4/@ D@% @!`@ S @` hfbP@ W@D 0  @@@#\''!"4@D@{, #a8r     b@`  ` Y`D @  R9` @!  7h#fbH@@ `P@ h` @ D<@@#\hfcP@ ߐ@D @  @@@m#\   !f#0@    `@ Ò#c $c{  q'  k''㾘#`` !f#T@  @ !f#@ { @ x 4@ u @@ r l@ o @ l @ i @ f @ c``@B%gtW`@ YW`@ f@ @ P@L@ M` `,! g`Ԕ@ ;g`@ 3 ` !g!$@ ) @ & @ #` @!g!H@  @ 㾐#ga`@ @` @ @@Z--`  `  ga`@@@#ga@ݒ@`@ِ`8@֐`@@@Ϙ@`t@̐`|@ɐ`  ` %g,`@(@@@@@@@#%g@@,@@@@#\@#`L@@@`@     @  w t [㿐  #gb@T@ A  @M` :  @F` 3!"4@.` D@   ` @0 `@ `  `! :` `@X` #gc@@ I` @` B` @` ;!"4@6` D@   ``@ `@ `  `! ` gcV`@Ր@@`@㿈!g#4@ (@!"4%@`D`@ `  `! ``L{@!g#x@~ @{ 4@x! @"#gcW`@m@@ ` ` @cV@`<@[h`@W`@!h @N @K @H!"D h`D   @: $'@@!h d@+ @( $@%㿈!"4c @DY@U.#a8M!E9` @!  :@ ` 4!#T @@@#\'@@ ` 'd@?, '!# @@@m#\ @ , !! '@㿐!"4@1` '.#a8D@ |{ ` @ r`!#h`@p@`@!#h`@`㿘\'\ ` @o@  \@@@W#\4`` # ` %h`@ @`  @@}h`\@a`4/ @+`$%h@#\` @@Pha\@/#ha @Ւ@`@ѐ`8@ΐ`@@ǚ@` `T@4@#!h!l\@ @ @@ , !!㿘@`4'` @#@'`4 @ha|,#`   `?@vha@o`4@"㿐   @`/ `'㿘#ha@?@ !#`@:@#ha@2@ &`@,  `@& `@  `$@ `8@ !#`<@@%'h@@@ D@@l@@)%# !$!X!#` @rl@ؔ@#؀`!T!\ !#hb@Ɣ@!#؀`#c%hĒ@@@`c !!X < @< !#   !#   !#hb!#  @@D!#hc!!X < @~< ]!#  !#hc !!X < @j< I!#hc@bA!#hc@Z9!#hc @R1 !#F )!#      @   !!#hc(@㿘! #c%h,@@c@@c4@@cT@@ct@@c@@#c@@! c@@c@@ߖ@c@۔@c(@ה@c@@Ӕ@!#i`@p  '  'V @!"耤@! %'i @@@@@,!"耧@!  @>? %'i̒@@!"耧@@!"쀧@!#i`@u#c%i @m@c@@h@c4@@ccT@@^!T"##ch @S@  c@Lc @ c@E#c%i@? c@8 !#ia@2耦@^'` V` ,` ''' `  ` !$"\!$#,  '+ia̒@@@` @@R !$"\!$#,  `@!#ia@$'Ԡ '`$@%'i@̒#a @V@'؀ @`  I@@(#c%i$@c@@c@(c }@c@0㿀&' '@@` .`0 @` ! `$   ' @! _@'㿐] Y@@T`ߒ ` ն3@ 0@L*@`$  @ה"@@ !! .!$! , ! `   @@`@!<@|||\㿘  `  !#ib`@` !#ibl`@`!$#+aX@= . X@%` $@%aX'X $X`  `  ` !#ib@`!$##aX $aX `  !  i"`@`'X , $X!#ib@p !b$#!#ib@g !Y$#!#ib@^ !P$#آ`<!XN`!#ib < @J !<$#؁!x= 4  $ , !  PS@  @`  ` !#ib@ !#ic@㿘 'i/`@@٘@֒`/`㿠%'i @a@!?#@@ @!#ic(@㾈!#`  !T!! \@ !#ic@@@ !#ich!@x \#c%ix'\ @oc\@j ! `@ `@@` @! `@W`#c%i@Nc` @I` < @`  @c0@=c@:D#cP@5oc@0hc@-` [0` #c!j 0@c @D!#j`L@<!#j`\@4!#j`l@,! &`/      @ ! ` ` < @`  @'#c!j |@c @W`` @d#c%j@c@(c@4!#ጒ !T"ڀc@<!"L%äL'j)# @ !##j`@@!#@~`!"L%äL'j)# @m #c!j! @bc@_ c@\ c@Y c@V @c@S Tc@P |c@M c@J c@G и!"L%äL'j)# @7 @2 @/8 #c!j"<@$c@! c@ c@ #c!j"`@c@ !"L%äL'j)# @ !#jb@#k ! `@+jbW`@@@!!@?,  #c`T@֖` c@ϒ` !T"؀m#c%jW`@Òc @c@@`W`@ɐ` 'j`)# @  @ 8@W` ` %'j@@W`W`@@$@@@L` 'k)# @s @n ` #c!k <@cc @_W`#c%kh@Yc@Vc@S,c4@@M@LW`@[@` 'k)# @9 ` #c%k` @-c@)` c@&8c@#lc@ xc@c@` @,!#8 ! `@@``?!#kaT`@` @!#‒n ! `@@` < @`  @!#kaT`@` @!#O ! `@-kW`@@ے@!!@?,  #cT@`  c @@c@8c@PcW``  tc@`c@tc@%'k@` @@(@@8W`@@4P@{@d@w@@tx@qW`@@` 'k4)# @^ @Y ` !#kc\@N` 'kd)# @? ` #c%kx` @3c@0c@-@c@*H` @X!#| ! `@#kc%W`@@` @!#ฒ !#y #kc@!"L%äL'l)# @ #c!l @c@ݒ !#%Ť'l8)# @Β !#l`<@㿘! @` @  W``@"?㿠  !#l`@@ 㿠@ !#l`P@y` 㿈% $'''+l``@@``$''`@W@! |a@O` !@@@F`<@A`\#b$%l@;! b$@3b$@.@#b$!l!L@(b$@% b$@" ,b$@ D㿠#c!l!@c@  c@  $c@ Lc@ dc@ c@ c@ c@ 㿈% , #b'l@!2$# , #b@!&$# , #b@'!$# , #b@ '!$"$ , #b@Ԓ'!$#l"@* #c%l@c!#@ c@8c@Hc@lc@c@c@! c@c@}#c!l#@wc@t c@q $c@n 4c@k <c@h Lc@e \c@b dc@_ lc@\ |c@Y c@V c@S c@P #c!m @Hc@E ,c@B 8 @@ TT@@  @@ @@    $`$ @㿐@@@@@@  @@ 㿘`! @ؒ ' ?0@㿘@@63 /ڐ@@@(#@` !! .!@ @㿈`` @`` @! @@@@  @ `㿐'% # !     ! r c s!:/ #bL@` ` `  @@`@㿘'% # !     ! r c s!:0 '" " " "  "  " /`#bL`" $`㿐"*`   `  $  !/! ` $   r!: ! `!: `$`!/`   ` `   @'㿈@`` @@ `!@9 '@`: 0@@&` "``'$+t``` `@@o$`@"$` ` ``@d @ @'㿠%d@!"$ta(@B@d!$"h$d㿘``@ y` !!"( !t!P@" @!"!T!H` @ta`` @ ~``!: `$`!/` w` r`%l$!t!@ @ (@c\`@Z`!", , #b$!", #b'T` 4`#`wta`$ @콐` $`tb@촐+ch-, , '☔`@@U!t"@젒 @읐 (@욐`, , ` @@  %`  ` @rtbL@}㿘@$k '☡,#bT $$w%#c!t"T@U@c @Q  $#TaJ 4aJ!", #bT @!", #b'T`$ 4`#b$ $b #|('+tbt#b@$@cb, , #b`@ǖ#` $ $``@ $ !", #bT   . !#tb@ @!W #TaJ$ 4aJ#b$ $b @㿘@ `!@w '@`x 0@@  @Д@=㿀@h 9!", @] L@` &tb`!@ `D!$", .!$",#`$`'耥'#dP'H!"''` 'T`  !"2T` .` .!%'t! `@6@3 @ { @,( !#tb! @"  H?'!#%t#` @!"6`!"耤@0!"쀤@+Z@@$'`` '#b$    @ b$ @ 7b$4  V    T #\#`@#d#b'̠$b''#b$tcD    @ b$ @ ` ` '@''!"$tcl  @V ܀ #  r! !"耤@ !"쀤@!"$tc@!"d !"h #y܀  !$ !$"d!$ "@ꞔ"!$"!$"! !"耤@$#b$%t@Zb$(@V b$H@R b$@Ohb$@K b$@G b$@Db$@Ab$@>#b$u`! @6 b$`` e@ `!@¼ '@`罔 0@@F`A` ` !"$u`Д@0%$#u`@@$`@5$` ` `@$` ! @`#b $b2@` '$@@T` `T` 4`%$'u(@7 @@黒!#Ȁ   s$@鮒!"$uaH!@"!$"d!$ &'+ua`@钒@` `%#c!u!h@}c @y  $!#ua@n@i`(#c%u@c'hc@Z$h!  !#ua@N`  `! @H`` ! @?, '!#ua ؚ#\@#`@?''㿈`!@  歔?  v 0 枔?      ` $` 3: @k @g  #c%u!  @迒c   @@跚@ `!/ `  @A@@ # !!  . c!$! , !ڠ#`  @`% @ 'u @a@` @@X X !"8 @M  @@  @@#c%u,  @6@c! @0@#c%uX@*!" c ` `@Whhh㿐 (`(@@@ @@>` !9 .6`$ 0`  5  !u"x@ߔ@ݐ ,@ې @@ِ P@א \@Ր x@Ӑ @ѐ @ϐ @͐ @ː @ɐ ؁㿀u#d @  @Ou#p@`@` u#|@2`$ @i@` ! u#@`$ @Ȕ`$u#@{%#uc! `@]@```@W `@````$` @ '#c%u@@>c@;!" c`` @/``$  @   @`(@@` c-` `!/(` $( !#uc@ '!    /v  @'v L@  !#v`\@!#v`l@#cv`|`` @Ƙc`@`     %    @ #c%v@@橘c@榒!" c`` @`쀤!#v`@ c`$  @ڔ $v `@ ` !!!@@ v @u`@@N@ @`0@v @b㿐 @D`@-`!)@Ғ ` ``   $ $``   $ $ `$  @ @`0@㿘 @(`` $`` !!!`  `$  @ @`0@㿈7#`$`' '  J   !@ 0@  @F?   !!@㿘 !$"\ !$#,!$ @㿐 (#  aa$$@` @  `@ 0㿐 @J@` @`> @` !` @' !#v`` `@  `$    @ @`0@㿐 $@` !/ ! @8 @4`$@'㿘! @  `@ ` @ `@㿈x!T!@q  T jhf    $   V   $   F@   $   6  $  @ .  $  @ &  $  @   $  @   $  @  `D ` @`#va @@    @ `  S   f b ] $ Ѻ  O ƺ  $B  hpD-*%!&+R? $- , !ߠ#@^R8ycr| $p h, !ߠ#~|[$ W, !ߠ#29!!]@$ <, ! $ 2, ! + !A">!$+ , ! ,? 2:1 $? , ! @@|Hz |H|(|(zpz0|8|||||{p|(z z z(z z z {0{P{zz |H|H|H|H|H|H|H|H|H|H|8㿠!!x va,@۔@!!|va8!!, #`@ɖ@va@@”@H'D@ Dva`@!$"\! f$#,Dvad@`D#vah@⚒@D` ޔD@ⓒ`D#vap@⌒@D` ДD@⅒`D#vax@~@D` ”D@w`D#va@p@D` D@i`D`$D@b`D#va@[@D` D@T`D`$D@M`D#va@F@D` D@?`D`$D@8`D#va@1@D` uD@*`D`$nD@#`D#va@@D` `D@`D`$YD@`D#va@@D` KD@`D`$DD@`D#va@@D` 6D@`D`$/D@`D#va@ݒ@D` !D@֒`D`$D@ϒ`D#va@Ȓ@D`  D@`D`$D@Ẓ`D#va@᳒@D` D@ᬒ`D`$D@ᥒ`D#va@ធ@D` D@ᗒ`D`$۔D@ᐒ`D#vb@ቒ@D` ͔D@႒`D`$ƔD@{`D#vb@t@D` D@m`D`$D@f`D#vb@_@D` D@X`D`$D@Q`D#vb(@J@D` D@C`D`$D@<`D#vb4@5@D` yD@.`D`$rD@'`D#vb@@ @D` dD@`D`$]D@`D#vbL@ @D` OD@`D`$HD@`!  DvbX@Dvbd@!!xv"t!@"\` 4@W*%8@ ` @ʒ@  P8%<@ ` @ຒ@  l@Dc` `@D`@3 `!/D@rD` l $'D!w"@D@ !#c` `@!!tD#wb@@! ؀D@`D%` @! ؀@` D ` @D$` ,@D'w@ג`  N`$'F  /D#wb@@D D@ܹ`D`` `@bD`@ܮ" D#wc@ܤ@D  D@ܜ`D`(` `@ED`@ܑ ' $'QD@܁<D`4` `@*`$,  a/ Dwc<@kD a DwcD@]D  DwcL@Q $'!"L%äL'wTD@?Dwc\@5Dwc`@0!T!N)D%wd@$D#`<` `@@̖D`` `(@Ɩ!T"ڀ ` D@ 0D!w#@D@ ! ؀j` -! ܀D#wc@@D`p` `@D@`D#wc@@D@ݒ`! ܀D@Ւ`$Dx`,@;D%x<@ɒ! ܀  D`|` `@mD#`` `@@cD@۰D` ` `@ZDÒ`D@ۤD`! ܀Dx`l@ەD#`` ` @@=D``$'  !/!  ' $D+x`t@r@`  V`$O  /"D#x`@\@D@Y`D D@R`D%` @D`@FD_ $ !D#x`@9@D@6`D  yD@.`D%` @֖D`@"D;  $'wD@`TD`` `@`$,  a/ Dx`@D Ba Dx`@D  3Dx`@ $'!"L%äL'xD@ҒD%x@ȒD`!!xD@ڻ#`hD`@گ$ ` $`D@ڧ,DxaD@ڢ!T"܀DxaH@ژ  `  Dxad@ڋ!!x'D#xal@~@ ` D@s`D`` `@D` @hD@e`,`$  !/!  ' $쀤^`$Y  !/! I#`xa`@D$ ` $`xa@:   #xa@@D@Da ` `@D`@ %TJ 4JD@D HDxb@TJ$ 4J $'쀤C`$? `!/6! 3`@/` +` ' ` #`xb@  $'耤    @!` $'耤 $`$  !/!  $D+xb @ٗ@ `!/!! ` @م`  '4P%TJ 4JD ”TJ$ 4J4PD@s` DaH` `@Dxb0@g $` ' 'D%x<@U `!/E! B`> @C 8 `!2`  @.D/xD@4D@1 %4P '4L +5aR-UJ 5JD h4P4L5aRD@ D ^UJ$ 5JD@$D@ 0 $'aD!x"x@D@ D@ D@ 8DaT` ` @#TaJ 4aJ`$1  ! D#xb@ߒ@D #D@ؒ`D#xc@ђ@D  D@ɒ` $Dxc8@ $'#TaJ$ 4aJD#xcT@ر@D@خ`! ؀EDax` ` @RD@؟`D@؜`$D@ؙ`4D@ؖ`HD@ؓ``D@ؐ`tD@؍`D@؊`D@؇`D@؄`D@؁aD@~a D@{aD@xaPD@ua|D@raD@oaD@laD@iaD@fa؁!T!L1!!t,!T!N'D%y4@PD#a` ` @@D@ED`` `@D`,` `8@D`D` `P@D@0 ! ؀  Da` `@Ԗ`$'  !/!  ' $'@ BDa` `@`$/  !/! !D#ya`@@Db` `@D`@ `!/D@D`  $'Dya@NDb `@m`$,  a/ Dya@׮D a Dya@נD  Dya@ה $'!"L%äL'yD@ׂDya@xDz3` D#ya@n@D` D@g`Db~!!x!  Dya@QDya@JDb aDya@>` D#ya@3@D` wD@,``$D#ya@#@D`$ fD@`D@` D`$ $[D@`!T"܀Dyb @#TaJ 4aJ!!x,#`'y(`$ @` $`D@D` *D@ߒD#ybL@ؒ@D` D@ђ` %4PD` 4PDybl@#TaJ$ 4aJD`$`  @!  .D/yp@֭D@֪ %4P '4L +5aR-UJ 5JD` 4P4L5aRD@֓ D` הUJ$ 5JD@։$D@ֆ0!T"܀Dyb@zDyb`@t ` #ybD@k@D  $Dyb@^!T"܀Dyb@RD#yb@M@`  TD`@AD` Dyb@6!T!P@`@$@  Db$`@@Ζ Db0`@@ŖD@@!T!L Dyc`@  D#ycs@@@D#yc@@D`x D@``Dyc@ !T"܀Dyc@` D !!xx "8@L!!xD!y#8@պD@շ D@մ 0D@ձ \!T"܀Dyc@եD%y@ՠD` D@ՙ '4P )5!LD@Ր D` ԔD@Չ4P5!L! !"쀤@Dyc@y@! !"쀤@ Dyc@i!T"܀ D!z @]D@Z Dz`4@UDbTlz L`@^`!@v"$Ɛ ` uc=-*%! &+? $- , !"8R ?@^ ~|pc$p , !"D~Z$ , !"T29!! $ r, !"dkd$ `, !"p+ !"CO$+ K, !"|? 2Y:|:$? 6, !" Ld4x  (8<@㿘!$"\!$#,@"X?@`D!", `;@@@ z`t @@&`f``z`|@@ "l` 7`@`!$"`@@!T!LB@`@=!T!T 8`D`%z@ `@ߒ  z`! @ِ`@ђ@` ` @ǐ !T!J "!T!R`D!z @@Ӫ `D @ӥ!T!T z``@ӛ@`  ` h!T!V"?!z @Ӛ@Ә ,@Ӗ P#TaT za4@xJ 4aTza<@n  4aT:!T!L @ `!/``@  ` #za@@G@ `@@#zaH@9@ }` @2``@. @`!/` #`` $   c(`@㿘!T!L"#za``   @@`   `@`  *`@ߐzal` @ِ0@!@  zap@͐`   #zax@@”`   `@Һ`  `@үza` @ҩ`$#za@Ҡ@`$`@ҙ@za@Ғ㿘& $ "  @&!!  !! r c  s @㿘@@   $@ @㿘*#` $`@#` $`! @ !   ڒ@ $ג@㿠!$ !$ ƒ  #0 ,!  ! #`ޒ ,㿠!$ !$  #ƒ (㿐'ఢ`$'` '!#za@ѳ $!#za@ѫ㿠! @@?! @ !#za`! @ш& !$ !$ 㿠! @ !#za`! @m㿘!!X@ @@ @] " #aX" $aX㿘!X@@@aX "aX "  @㿐@` `!!\@@@@  @ z!`` @ @ " "   " #a\" $a\㿐!#zb@є@!)$ !!X@@@ @` $` ` !$!X @@ #c%z0@Пc@Л@@!"耤c@Б@!"쀤@!#zbp@Ѕ@!$!X㿐!#zb@s@!$ !!\@@@ @@ %'z@K!$ #0a(!$ @A@!-$ !!\@@@@` $` ` !$!\ @@`u #c%z@ @!"耤c@@!"쀤@!#zb@@!$!\@㿐 V`!"D@`@ zc`   @ϐ  `$'`@㽀@zc @϶`V`J#zc@ϧ@` `@Ϡ#zc@ϙ@` ٔ`@ϒ#zc @ϋ@` ˔`@τ#zc(@}@` `@v`$`@o#zc4@h@` `@a`$`@Z#zc@@S@` `@L`$`@E#zcL@>@` ~`@7`$w`@0#zcX@)@` i`@"`$b`@#zcd@@` T`@ `$M`@#zcp@@` ?`@`$8`@#zc|@@` *`@`$#`@ܐ#zc@Ւ@` `@ΐ`$`@ǐ#zc@@` `@ι`$`@β#zc@Ϋ@` `@Τ`$`@Ν#zc@Ζ@` ֔`@Ώ`$ϔ`@Έ#zc@΁@` `@z`$`@s#zcĐ@l@` `@e`$`@^#zcА@W@` `@P`$`@I#zcܐ@B@` `@;`${`@4#zc@-@` m`@&`$f`@#zc@@` X`@`$Q`@ {`` @` @@` @` 9 {`@` /`$@{` @0a,` `0a8` `0aD` `x0aP` `o0a\` `f@`'0l@?, '` T`$@`$@{`@͗` ` є`$ @0at` `.{`@v{`@p{`@j ` , ! P`$@`$@{` @Q` j` `$ @` {`$@9@`'0ဢ@?, ` ט`$@`$@{`(@` 3` T`$' @{`,@#{`0@@` ?` @#{`@@@` 1`@{`L@#{`P@ݒ@` ` @֐#{``@ϒ@` `@Ȑ` #{`h@̽@` `@̶`$#{`t@̭@`$ `@̥` @̢`$ $`@̚` ؔ{`@̐`$Д` @!` L/O,\`,O뀤 " ',O뀤  '!`!{`@]{`@W{`@R` @#{`@I@` `$@{`@=#{`@6@` v`@/0a`@֖@${`` @{`` @#{`Đ@ @` I`@{`@{`` @{`@{`@{`@{`@ܐ{a@֐{a@А{a@ʐ{a@Đ{a @˾{a(@˸`#a  W {a0@˪{a8@ˣ`zpD-*%!^&p+?R? $- , ! `@^R,[c(~| $p , ! lV~$ , ! |$ w, ! 2+ $ g, ! $+ ], ! ? 2:lL$? H, ! 08Ph ېۨ P4HHԜHؘ8XpHHHHܸܠ0؀,XҰ\и Ѵ`ӬXHHHͨ㿠 %4P !4!L@4P4!L㿀 !#{a<@ʕ!$"\!$#,!#ϔ@!#{a@@! !"쀤@B!#Ȁ!#{a\@k!#0a `@! !"쀤@& $@`  !/! `$ @    $@`  !/! `$@  %$$ #c'{l@ c@!#{a@ !#{a@! $$ ` `$@|j#c%{@c0a `@c@` `! ` ?@@:@`?!#{a@ДL#c%{@Ȓc0a `q@c@ɽ`   @ɲc@ɯ!  c$@ɦ!#` @`?'!#{a@ɖ!   `  ! !/`$ @%$$ @   ` $@H6>`    {a@Z  %4P#c` 暔@4Pc%{@L!  c@C!#{b@=!   `  ! !/`$ @%$$!#{b@ %4P' W@4P%{,@ #` $ $`@$  $@c@ @^@!#{bH@@O@{"X@ _  fc=-*%!>:&73+0? $- , !#PR ?@^|rc*s ~$ , !#\:++!$ }, !#"p$+ l, !#L $: _, !#UPxxX PPP㿘@5  @>! .@9! )'% ` .c$ , ! $ , !!@88LLLL㿘@@   $@ @㿠 @!  !#{bx@Lj@ @ $@㾘!# ! `@|#c%{W`@b!T"؀5 @kW`c@V$c@S8c@PLcT@LW`c@I` '{)# @8 ` #c!{#,@-c@* {cL@7W`` '{h)# @ ` ` #c!{#x@c@ c@ 8!#{c@!#{c@` @!#Hb ! `@'{W`@%@W```@ђ$.`+@@Ȕ$`@ŒX@’x` '|\)# @Ƴ @Ʈ ` !#|`@ƣ#|`@ƪ@!#@ƚ` ` '|)# @Ƌ ` #c%|@ƀ` c@x#c@s(` '|)# @d @` ` !#|a @U!#|a(@O` @j!#‒ 㿐 4 !4"  |a4@'    D`? !4"      $ }!ZR--*%!&+/-?~c R^|  ~$ , !"8?+!$+ , !"H$? , !"h#|a<@ŗ@ @œ` @TTTTTT㿘' $%p@ $pX, !$ ! -`@x%!$! $! @ )¨  `, $`$@㿈C ! , |!L@-0!`,  $`@%/ @ `@   `Ē@`@ 㿘!  /`@" `! @㿘  `!: `$`!/`   c r  `   @㿈   @@@ <(7 2`!.!+!(!%!""`!! !`! @  c r s ` ` ߝ' 㿐``  (` `  `l @㿘!!@ @@@#aa $aܐ '`%'`$ 㿘!!0!#aa $a%'`$㿈3?`+?` $??! / '$@?,@' $   @㿐! A @9@@/ 4`` (` c r s! `,  ``$ @`@ $! N @F`@` 8` c  r  s-! ؀ (@#! @,     @$ @$ `@ $㿈! 5@-.@  `D ` @  `'  `@$!#A! <@4.@ $  @.@$ %` `` ' $ @ `@$㿠  & & %& $㿘   '& & %& $㿠  $ & %& $$㿠! $ 㿘! @ @@$@@!#a @  (a $$a~ې ('`'`%'`$$#a$a@'㿘#a @ޔ a $a~ @$ '㿘ܐ@" ``" $`@ ` $`!# Ȑ" ` `" $`` @@㿘 @  L` _%|d@@I ` @B  ` @; .  @`@9 @` #cc $c~! `'`. '` $@@`  `$  㿘@` ` `$`  `$ݔ` @ ` Ӕ`$@` @ T`@` `$@ ` `$@` `$@` a   a/ ` R `$@` `$  }`$ $x@`  k@`$|!x`@]`0!}@`hpD-*%!PR&OK+HR? $- , !!@)^Rk%c| $p , !!~$ , !!2$! $ , !"+ !"r$+ n, !"0? 2M:]$? Y, !"D   t  <            㿘! 8T!"쀤@!"耤@&@  {@  `@?2 !# `@ݔ? @%6, ! @%` !  %|@*`` @$`#@`V@$`` ?$``,@!#@$@ܐ㿘#|a! |@@`@@! @6`@.%|b`@Ӑ@%`  0"{Œ   ! r! ` r!`,@#|b@@@! x(`@@`@@`<@@`H@@`t@@`@@`@@`@@a @@a0@@a4@@a@@|@㿈'DD ` ``%`` `$ `$2"` '` c` `!/ ` (`@ $@``@Z   `' 0`$ 0 z@?  ' ?' `0 ?' Y (@  ! .@@`C ' ?_``@D @`0X㿘! @@@ |#X@  @㾈t@ې @Ӑ@   ,@ @㿘! @` !!!Ԑ@`,@㿘R      @'#c@1 "c@E 0"$cz( !#Ԁ@ |c`!# @/@ |cl!#@& '|x@@/'%$ 耤N@@" -@@!@'$ 䀤A% @ .1, !#Ԁ@  @@@ @@ ..%|@')%! @Ð" ,@'%! |#@t= ! | #c |#c @ !%$ !! |cŔ @ۘ ! !   !$"! ! !#  #@0b<|#@0bHtj#c  !|#@m @jcf!T ! O! @ @@,@@} (! ! !T $@A@L! '$!T @` @R+` $`7#` $` $!  )!#  #@0bd !T  `  } L!@  } d! ! !T @$ #}`! @@`` !T $` @@! | !  } ! @ђ! !$  &!  % $+`I!  9)} ! ! 'Tଔ$@ ! ! " !T @ @T@ @! %``%Ť'}   @ $}!0@|k}!4! !@s @~%@ !$"\ !$#, !u''耢N! ! @G!  `   `=8!# 8  `!`  '#}aH@-@#@ ^@%`!  pA!  !qm ! |}!P@ '耤@`0@! 耤?''! $ @`` #`}@`$ ` j`$ ! ! @s!  `   `iKd!# 7@ ``!`  #}aT@@#@`ٔ@`!  !    '?'}!\` @}!p@!  o!  !p ! |}!t@i!   `$`}!x@Z@!   [!T 2! -  )`@%'``$`!#  l}a@@@Β@#}a@@@#@`J@` !! }aŔ @4 [}!!@ 㿐!! }a@ +a !}!@ݐ  @` (@@ z 㿐! ! $,! @ ' ` ` @㿘!!h@,#a$@ !!h@!!h(0"lvj'h, #a$$h $h/ #a$$㿘!!h@,#a$@2!!h@!!l@,#a$@!!l@!!l(0"v"#al $al/ #a$$ !$!p㿈!!lD!!h,#a$/`#a$!!h!!h!/`#a$!!D!!p}b,@۔@ }bH@0"u`!!l@!!h !!l/ #a$@,#a$!!l@ !!h!!h/ '$@%$@/`$ $h0"u` !!h!$!h!$!l㿘!h@*!$@ !$  $  !h@ 㿠#}bT@`@#@ 풔@Y` 0"u<@㿠.  s! 0bܐ  h p0bѐ0cː0c,Ő0cD  !!  @ c!!㿈`$F `   @`0` !@ݔ }bx@! !"耤@}b@}b@ }b@%}@ '$t``ѐ@$t }b@z%}@u '$t``Զ@k$t }b@_%}А@Z !$!t! !"耤@@M``ԑ}b@E!a$!t }b@8%}@3 !$!t! !"耤@@&` `i! !"耤@}c@}c@!.$!t` ! c  .= Rd r cs s!!0! 'X#0c\!$ `0#hsz`   @F`    ޚ@#}c @@``@}c@Ԯ ` 0  !#}c(@@` 0`@}c4@| %}D@t '$t`  Ӵ@i$t%}\@b '$t`  Ӣ@W$t%}t@P! !"耤@@F%}@A '$t`  Ӂ@6q$t%}@/! !"耤@@% %$t`` `d}c@S$t#}cȐ@@! `@ }c@@}c@:`  ! c  .\ Rw) r c!} s! !!*! !!:N!~ @ #`@@ ,`@ H`@ `@@!$ ``@6%& ` `  ~`@` $`!$!p !$"\ !$#,i`4 !!p@'H'L'TH@@ `v`$ !!p ~`@L`~`@C!$!p`@`$@` '   `0!!p@ 0@ @Ɣ?Ϛ '!~ @ @ #~` @@`@0#qo!!pj` `? '!~!@ߒ @ܐU!!pP`0@` @`'!~!<@ @c4S` '$xT%$|#~a\@@```@!$!p'T$|$x` !! .!eT`0 '`0  !!p!~!d@i@ @fc`$' '<~a`@c#a $a-#`$@` !@`0'   ʘ #a$ $a~a@+!$!p ' '!!p~a@#a$a'` ''~a@!$!pL@!!p  ~a @`0@㿘! t0#pВ!!@! t `@  0#`pw `@pÐ ! t" " #a" $a㿘@# ~a` @` @``$@ $~b@㿠!!ѐ㿘!!@` @a `@㿘!!@ `@E  ``@0#p7 㿈!"\!#,ې@t`!$"\`!$#,``1 o``` 1 o`!"0`   / 2  %~ @   `   / #bԠ $b @  `   /  @  `   @/  `4 $ 8$ <$    / ` 1 Don``$@!$"\!$#,㿀'L* #b\'', $b\ $,L@@`@` ~"8``@1 \o~` $  1 po,`!$"\!$#,C' .~"\@|i  $ !2 !0~"t@miؐ ` . @` @D  !$"\!$#,`'`$@ $1 o+ '㿐 @w@@. $   @ $1 n @`@`1 n```-f3`㿐'H'LHL5@@?  $    @0$1 nA '`@`1 n``` ,$ @`, `$`! %` 㿈 `, `/ ,' @`   1!`n] ` 8`$@$@㿘`  `$@ ` .` @ @@㿈'H'LHL/ @'`` `8' ` / & ''  @`$@$'㿐` @d` ,`mؑ, &  # 8  @%  .$@ @``$@ $ 㿐Lm (`2 `" `" `" `" @`   '`  $  ݖ'`$ m{ L`$   @ L`  @ #b< '$b<$ ``1!,mM@㿐#~b@@@@ *`$ `   `@'@ܖ`@``  `  %~` @  㽘  8 @` `@ `$@ $~b`   @@@l㽘 @%@@ $ `   ~b@Ő@~b`@@``  ` #~b!` @@@@@`   ` x~b`@`9@`  `  x~b`@w` . @` `xɒ`@xi`$@ $`'D'H'L'T'X\'\P`   ` x~bL@1`'tE`  `  x~bL@t t, '   DHxTX\#\ DHxTX\#\$$t 't@hJ .? @7@@`  ` @" ,~c@@` @@~c @@`Œ@̐`$@ $` `  `  ~c@@u@X@ -o @g`  Ē@D@~c@R@` @N@`@ƔK E`` @@~۔4!~#@<@ ` @3`~#(`@- ``  ` ~#0@ )~#8@#@`/ !`?~@  ` `$@$ v㿈'H'L'P'THPc @[`` L`8T @ '  .kM$`$& ??'4' .L@ & !/k/$  $ T, < 4 ?' ''` @`$@$'㿘1 1!@jY  ! $ .!$"\!$#,~#@@T 1!X j6  $ @㿐@ @'@@@@ $@㿈`  @ $@.` .*` @&`"  @@۔ 9  .jg%$'  $T@@  8!"DE!~#L@ː#@@Đ 1!p i   8'" , ,j3@   8  ~#\@1! i  `  .j' $'` &@㿘 $` ,1!i^`$`$'`$'㿘!!@  `@B  1! h `@i?  " #a" $a㿘!!@` @ `@㿘@'` @ `4  @`?`  $ @㿠@@5`D `~#x@~#@#~c`@Ԑ@`  $  @` $  ̔㿠 @`  `  @x@`   `$ ߒ@㿐W`"!!$    ' ` ,`  ' ` ,` c!!$ @`@ `@"` @#cc $ch4 '`'`%$ '` $$  㿘K ` `  ` $` ` $`@z@u  @ ` Β `$@ Œ`  $@ ` ``$@ `  $@` a @a/``$@ `  $@` `! @@`$@ ` $  |@ $ $x@ @ ` o``$@ f  zpD-*%!SY&VR+OR? $- , !! @^R,c(~| $p , !!~$ , !!($ , !!82+ $ z, !!X$+ p, !!? 2:_$? [, !!`bP`bHbH``_bb4bPbPbPbP`x___bHbPbPbHbPbPbPbPbPbPbPbPbPbPbPbH____bH`P``````````bPbPbP_㿐!!( @`@O ` '$`?` @ft " " #a( " a($  㿐/!  @H@   @@`  `$'`@ @ז$@Җ㿐!!,@!` @ `  `@ $`@㿐!"4@/`& D"  @ ` ` @`4 !2 fa'@"  4= `@㿈Đ * @"@` ,@` [ @e '" #a0" $a0!$!(  t`$@ $㿠5 @  $ 㿐 $@ `$@'㿐 $@ `@  @$@㿐@F @@< `@0 `DD@&@@    $@ `$`   @㿘!!0@` !$!(` @dѐ " #a0" $a0!$!(㿈 e@]`U_ @L` G`8`  $=!!4( `$ @ 5 ` 0@   ~#` @ 1!d `  r!: `@$㿐!!0\#~c@S@  ^ @M` @F` @~#@@@I #~c@6@` @0`` ~#@(` ~#@ `!1!@?,  '#~c@@@`` @ ` ` @~#@ ~#@㿘V` #a8 $a8!!<@4 4!  !#~c@@Ӓ#@` ` @ʒ@Ő`$  Д  (@`@!@@`` !   %,@@`  @`@`` @㿐![`@W+` @`?@` C`1  1@@~41!!0,` !  2  1@@W  ` @㿐ː @`?!   #`@ @@ & @`!!@@@T` 1"$@s`@!!D@@T` 1"0@^`@!!,=   #``@ǒ@ /   @` '   @`  @@T`     @&`@$ 㿈!!@D5T` ,`@(` ``D @m !   #`|@@x`  @r`( ` @!!@'!!D@? '㿘!!H%!!,@`   @, `` $``@@1"8 b  㿘!!H@ ` @ `@b " #aH" $aH㿘!!,@`  @ ` `@1"Pa㿘@`! ` `  $ @㿐!!,@U`  #`@@ `  @` `  @`  `  @~` `` *$``  `` $``  T` ` $`` $``@!!,@'` p  1t`  U $`@㿘 ` `$  @! ` ?`  ;1b|#a`@@ @@` #@`:@`$㿘@` @ p `  $ @㿘`@`  `T` 4`!  X !,@$!4@W`!<@W`!D@W`!L@ W` , !##aP``@@` #@ غ@` `#ad@w@   `@p  !p@hC@T`>`:``  !/"@,* rcs $ , !  :`@U}}}}8888㿘! .`` $`/ @ ``@㿘 @ )¨ '` `, $`$@!   !t   @   㿐 <4`+ ' s#`@L` @`` `_ '  " `" #a4" $a4` @ $㿘!!0@`0 @` @㿈!!0%!$!(@`'    ` ` @ !$!(㿐  @!$!$`` ''` '`` `@ $!$!$㿠!!@` `!!@   4@@#c $c@:@㿘!#`] `  $` `  @ `  `  Ւ` В`  $@ ` ɒ@`$@ ` $  @ $ $@@ ` $`{  @ ` ``$@ `  $@ ` ``$@ `  $@% $` w`$ $`$@ @ ` g``$@ ^   X`  !@   zpD-*%!IB&?;+8R? $- , !""S@^R8c(~| $p , !""~$ , !""$ , !""2+ $ v, !""$+ l, !"#8? 2:[$? W, !"#PXXdhDdxDDDDTXXXXXXXXXXdH!  !@,!!L@#b@#@` . @``@H !!L@  ` $ `@!"45 `+`!`4 !/" `a$ @P @ " @"8@P @㿀!"4)  ` `    !@  !"<@@ "x@P] !!, @c`[@S O`M`KQ`` !r .@s$ , !$ $ , !$ `$@@'`!1"@?,? '"|  @   "  @   u!"@@ 8!#4@@ 8#@lllllttllll㿐!!P#T``!!L@  ` `@@%L' $L!$!P㿘!!P@`X W`@`@[ " 2 2 #aP" $aP㿘!!P@ 7`!  #c@n@` y ` `@d@5``@㿐! .`@O@T` I `1 -` !!<7``T` 4`0 ! !!$! , !% ` !!<7``T` 4` `@㿘! .` @C@T` 9`+ ' `!!<7``T` 4`! !!$! , !%! `Ð!!<7``T` 4``@㿘!!L@`N `@!!P@`< `@ 㿘  @   $ @㿘    @ ` ` @㿘! .` @G`< 8`/` 2@#c@@#@` /@`,! !!$! , !&!(``@444㿐! .``/ $`$ @(@T` ` ' !  #` W`@@#@` Ҕ@``@ 㿐!   8  @  Q` G`@C`; 7!!<7``T` 4`!  #`D@W@#@` ш@O` ! r c s`@ $  )¨   , $'  $ 6 M, @(`T`? 4!   T@`  #@( `@`@ $ u @=`+ @' `~ `! !!$! , !'#, `[ `@. @*!!<7``T` 4`!   d@`  #@д t@y``@ $  @@T` =`@ $,,,㿘!!,@"`  #`x@&@ `  @`  `  @` @`@㿐!!,@A`  #`@@ 3`  @` +`  @` #``   !`T` 4` $`@㿠 %$8 !$!   @` 6!"4@1`( D$   @ ` `!`4 @ !0V " 4`@ 㿐!\@t!!@G3`*T`!1"@?,  !!p@X @UW  @#ax@M@` X `@F`` @!@> !@6!!@&!!D@? !@&㿠%T!$!@$TT!$!D$T㿘`@ `: `$!  !@@ !  !@ ` ?$` @@! `, @`@㿘@ ``$@'¦`, @`@㿘 @@@@`@Tl " "  `" $`㿘 @%!  !``@W `O`!  !``@F ```@㿈'D'L! L, @`4 '` '!  ,`@ , @ !`@, @ ,D`㿈'DD f`]` @+ª```,  `@I  D @B@` -,@ ,4 '`. ,! @+ª```,  `@ `D@i@`D @ $㿘 @'``$@ p㿘 @<`4 01 ! `, & !!!!$! , !,#`@㿐 @;! @,  -) @% &  `! !!$! , !- `@$$$㿀!  "  @  @u@`` f`8! , V & @"5@ `! r c s!  @N@@` $`!   "@f@`$@㿈 @b`Z RD, `$` @ 4   ,/ E$  ?`/ $      ` , $ -< &   ! ,  4 `/  ,< & `$@㿀% @$Qّ, !$!  'ᘨ?/`$` @` $!  ,  -/`@'` %`` @ `4 ` '!!/`'` ,%` ``/`@'@`$` @'㿘 @@ @t`$@!  , e㿐!!< !!,@'``)¨ `` $`  , $'  $`! .`!!X$``@ 4 $ !  #b,  @@` `! p` `@ l@@@` ` $`$ ' $ $``!   $`b@֐@n@`  ` $`$ $'``@!!,@M`)¨   , $ ` $` $`! .`!!X$``@`  ` $`$ $@`  ` $`$ $`@㿘!! %'p@Z`@㿠"t@F"@@"@:  $! , !0 % $  @ $ $"@d|L㿐 @@k'"@ @! #b@@`  @``   @`$^v"@#a $aj"@#a $a !!`$%'$ M$ $@ @ #a$ 9$a"@#a$ .$a"@ ` !!M!!!+@@ .= @:!7`a"@b#@`   5] "`c  !#b@L@#@`  4 @C`  #@`s#@8@ @`0@%㿠+  #@#c  @@  @ `#@ <#c4@@ @`㿠! 㿘@K!! )1"@ @!$!!@#!$!'`@7@@!$!@T`!! ! `T !x` !@! @@m@!$!@T`! b! @@\@!$!@T`! !L! `T ! D@T`! ` ! @_! @[@4!@X#!.$!!@R#!($!!!!!  (s!!!  $!  , !1#@1"@h@' DŽƼ㿐;` T!  !`T`!) @@7! T`!  `@)  ` $` T`!  `T ! @` T! `T`!  `@Ɛ! ! @”` T! ! `T`!  @@ `T ! ` T`! ` $ T`! `T ! !@&  ` $` @ ! @x !@r@ @l!@@ @ ! @[@ @ !@P@@v@ !@G@ !@@@!@:@@`@'!@1@@W@Y T`!  ` @aK T`!  ` @S =  T`!  ` @E/ T`!  ` @7 ! ` T! `T`!  @$`     @ې!  @֐! ` T! `T`! @`    @!! @` T! `T`!  `@!! @а @  ` U``Ta  a   a   @`   T`!  ` @  T`!  ` @ ` T! `T`! @`    @B!! @>k @y  ` U``Ta X  aP a  @X`     @!  @ ! 7` T! `T`!  ` @: $ "V !! !!b! !f! '㿐 /$ +a. -- @%a. / ސ& @@  @1"@@㿘@!$! '㿘!!Ԁ !#<@z@@@v @? 1"@#a̠ $á@@㿘!,#@ * : @%/ <`/@@Ѻ`* : @#c@/@x@@@ !$!cL@@Q@㿘@I''㿘@@,`<  }&,`< ?!g/ <#c/@@u`* <  {1#@/ <  }?g#c/@㿘@Q#c,`,`  ;@!$# ; {! @!$#@@#$ ! }1#@@#a  2\a6#c\%@@r  ! @n!$#! `@d  !@`!$#!! @X!$#@#$ ! <.@@`> !@B!$#!`-@11#(@}@ > !@+!$#z!@1#@@i0 \! /e /! \_ &! &Y |! |S ]! [M >! -GE!C! A! ?! =@ X# / & ! - U / V | [ X \@@!$#ĸ@㿐8͐* #a@`@ @`@@ @@ '``@.#a'`$@㿘@ ' $'㿘!Ȁ@ '`"!J@`"ĺ?@㿘!!Ȁ#aO`(``)'` !!Ȁ` #a̠ $a1#P@m㿠!#cl@㿠aĀ " "aā㿠#cp!!@@`!@!@@㿘! !$!! |  !$!؀ b`L -]< !L$!ܰ& ``L `L  "  `,``L@#a`@@@@!&$!#aԠ !$aԢ !$!#`@L &`L  n  d f v& `  L -!!Ȁ  !#@@~ $@| @@J !!̀ !!Ԁ]!!̰㿠#c%@@ c@; c@6 #c%,@. c@) c@$ #c%<@ c@ c@#c%H@  c@ c@#c%T@c@ c@#c%`@c@ c@!#`l@!#`t@!#`| @ !#`@ @@/V V !!?u!$! , !8!hߘ(㿠\ @ @ @ @ @ @z @t @n @h @b @\ @V @P @J @D! ;$! , !8#L$4|d 㿘 @@@@ #a?   ! @`a@ !a@!!Ā %' @`@!$@#@@#a̠ $á㿠@ 㿠@@ 㿘!(@ @ #a0I@@@`@!4@ @ #a<7@@@`@!@@ @ #aH%@@@`@!L@z @ #aX@@p@`@!\@h㿘+%$$!!Ԁ!`@L  @ #ap`@C@`@#a $a#a쀤$a㿘a@ "aa" "a@'㿐#a`$a''!!ax@@'㿈(@  @ 1@  @ V!!`@@Ԑ@'@ `@㿐@!!@!@`!@`' `/ 4,`!!@, d#a $a`@T`! ` 㿐@!!@,@`#@n` ?1#l`' `/ 4,`)!@, $#a $a!!$"`@㿠, #a $a   T!  !!$! , !; L㿐!!  @ !"@`@В  ``@!|@ے㿘ϐ@ ?'``" $`㿘#     V !!! @㿐@@@@@U @!#a@TnL@!#a@D#c%@> @Ĕ c@3  c@) F @ y  !#a@!#a@ !#a@!  !@J@ @@T`! `@t@ @o@@㿈@"@8  d@  ी`  $@  ऀ `"@'㿘!! ' a@"@@a@`@@@@a@yaؔ@r@'` !@J1|@@ t @<R`@@1`x@@xa`@<xa@!!Ԁ#a!"x@@@*`(  d @$ $ x@ :`@X!"H!!@=@`4 ` b8@!" #!"` !"@@В @ǒ bP@ؔ` @͐@@k@`@ !"@ U㿈 `@ `@@'"  '㿈!@@`@l   @ 1$  `@@@`$```'`㿐1#@y'#a" " " $a`  ` S @ א'``@㿐@$'@@!@@ @@ @ ;㿈@@'$ @@@`@'㿘@ ݐ @$ '`@'`'`'`'` 8@㿠U! @| !bX@t!b\@l!b`@d!bd@\  !bh@P!bl@H!bp@@!bt@8!bx@0V $! , !>#xxXxL8h㿘@T`!  `!!, |@J@㿀  & $&  ׮$`!!Ԁ2@!!Ԁ  51"|@Ԓ!!Ԁ  51"@Ò!!!!Ԁ" @ !!Ԁ  51"@!!Ԁ" @ !!Ԁ  51"@  @@ !!Ԁ"@sd!!Ԁ"@h @ Ґ@'   @ @@`@@ @b `" $`@ [ '  " " #b" $b @ ` @@ @ ` @@ @ ` @@J  O!!܀ !$!!!Ԁ" @  @!!Ԁ@!!Ԁ#@`@!!Ԁ# !@"!!܀!$!#b $b%& $@㿈`[!!Ԁ#`@ !!Ԁ !!Ԁ#(@ 4!!Ԁ#8@ !!Ԁ!!!Ԁ#D@w !!Ԁ#H@j  !!Ԁ"#L`@V   #c`@M@#h@E!!Ԁ T `T`!+``   &    &@ &  $@$T! ` @@    ' $ @ @~@ @ @t@` +T`1#@` T`1#@`  T`1#@` T`1#@  ' @@  &`@ ` $` `$ x& )  @`  T`2 @` T`2 @`@@@ \@ &`  ;&@`T`2 (@ b` `" $`@@ @ߐ@`  T`2 <m@` T`2 Pa` `  & '   T& @ @ ݒ@W`$! , !B |8㿘@@ &  %&  !& T`! !!!$! , !B"T!'T`! "`T ! T`! `T !!@     @ !! @ }-T!'T`! "`T !  T`! `T ! ! @ ^    @ W!! @ S@ 㿘@!!̀`@!!Ԁ!! #c!#t@%ِc@  !!F@ G2 dn`!!䀧@ %`$Y@@!!܀#Ȑ!!Ԁ#c@@`!@"`(!@"`P!@" @`d㿘  `@  @ `@㿘T<T `$  ` @  F` ` $  `@ } 86@ `$  ` )` ` $  `@T! !! $! , !C" @ F@ T \ T T TP!"@` @C1@`@!#@5$ @: N _` @ @2 lq` @)ǐ㿘  ,  @   @ @`` #a ` `4@~  $a`@㿐#@!!Ԁ @@~Ӕ@!"@ ` @~ /` `  @~'  `@㿘7L &   $``! @ {64 &   $ @ @V !  !! $! , !D#@㿐@!!Ԁ! T@~?ސ@~; ڐ@~7 @! @ !@ @!!Ԁ ! p@~@@~ @'㿈/@ T!@oT`!  ! !cT!  ! !U` @L@` `@T`!;`T`! 6`1@)` `@T`! ` @} !!Ԁ ! @}@<@} !@   ` @㿘!"' @` l @`$  T !  @` '``@ 㿘 @` 92 #`@@}?```` @}8``@㿈!"o `f`@b@`Y`U`L` `@| D!!Ԁ#` ` @|@@|`(`@|`8 @|`@`@  @ ! @Δ   @@! @@@@@'  '  '` `@'㿈 ` @V@%``` @@  '  3`@`@*@`` ` @@  `@ `@'``@'㿈 @J`B`:`1`@ O`+` `@|    @{   ' `  @{ ` `@{   '  Z`@`@Q@``B :`1`@`+`  @{   `@{   ' `  @{ ` `@{   '  `@ `@'``@'@!"@q@ `h ` d`` `W ` S@(@M !!Ԁ  `  @{Q `  ` ` a@{* @ / @@ `P  #a@@{ !"  `  @{` 6 `@ &'H!!Ԁp!"@b`W@ ` R`N C ` >@@8!!Ԁ#a(`   @@zg@@z` c`   ` #aL@@z !"  ``  @z   `@ &@㿠*  !!Ԁ#c%\@zP @֔ c@zF!#ah @z? #a $a㿠@ !!Ԁ `. %'x  @z!!Ԁ @z  @z   #a@@z   !"  !#ؒ`  @y %'@y#$a a@y!#a@y#b  $b 㿘@ &' @' !!Ԁ#a@@yђ@p@y͐`l `  @y  @Ԑ@ ' !"@` @y@`' $`@@Ð @'`'`'`aА@@y  /` %'`$㿘"@/``@"!㿐!!؀2 @@ !"  ,` a2 #c!!@y8c@y3 '@H @!!Ԁ!@y3@  @@  !#b@y@!" !#b@xŐ@!"@@`@!!!#b(@x!#b<@xx'DD$ 4   P#b $b!!Ԁ"@@xΒ5/`'У/`$Y- #ahD#b'  '$% /`#b$/`#a'`$`^5, /`#ah%+aР^, %a&\,  %h/`' '/`#b'` $`#ah` $`#@@'   .' 'D@xx'㿐& `#? !@@2 ~@#?,'$'P#`( $`(,#`('` $`#ah$$㿐"`@x@,#a#b#`(@ "|@@@w``P㿘+T !!`T T` `` $`$@`T U`@ &  & @㿘@'  &  & @%@㿘V !2 ˒!!Ԁ"@w @O& !6 !!Ԁ"@wq @?& ! z6 !!Ԁ"@wa ` `@,& @(e@!!Ԁ"@wL! 86 !!Ԁ"@w@! ,6 !!Ԁ"@w4! 6 ! 4 :& !!Ԁ"@w!! 6 !!Ԁ#@w!6  ` `$ !@@s& ! 4 k@&  T $! , !L 9'/00.0./0.L/P/ /㿀@yT@  `@ِ@%$@T @9T`1` - '耤@@v}`9@ !"@o$"`  T@  Z`' @vT `@M'``@F'`㿠@T@ @&` ?6`x'D'D@'T`@!!w'#$bDR@D@ ab@1@T`!`@W !  !@! @'䀤! !"@ϐ !@4$"@T`!` !"@S!"B@@ T`?T?'!T`!`@@!k !@!_T`!` @T`!` a!"@1@T`!`@W ! !/@!@e'䀤!  !"@B ! @X$"@T`!` !"@S!"B@@ T`?T?'!T`!`@@^!ޒ !@`!ҒT`!` @T`!` !"@@'@U ?6 @̒耤#b $b& $  T!!T 4 $ $  $@' @!"@ 䀤2 1''㿐!"@#`@Β#c $c@` `@ @` ` '@㿐,ɐ'$#c $c @~'`'`$ `@   '``@& `'`%'` $@f`㿠#c(!#@t>@`!@t:#㿠@@ ` &``  &` Ԑ@㿘1 '4 $ $ '㿘 'V 2  "  "  " @㿘 ߐ '` '` @㿘@@&  @@b T@@  ؒ@@㿘@ T@` @㿘@Ք̔@@㿘@o @eTT@^@  @s$` N@J  `2 0  `@s  `?5 `0 `( `   V @#`@rV 2 / V $! , !P @@X@p@p?@p?@X??@@?㿘@G @@ V`! 5 T`! - +TT@$@  @r`  `  `  +@@㿘@2 @(TT@!@  @rD`  `  `  @㿘@@T`!``  @M@㿘@T`!`  @ @@㿘@@T`!``  @@㿘&@@ʒ@u! !2!.@㿠 㿠<K&*S22mqr2yxok|Lkkkk9H*okkkkkkkkkkkkkkkkkkkkkkb|<kxk;\k8Fnn|||$kkkL \L \;kVY 2 =kkk ,0kQ <$%2&)^ 35QDXYOM_N`P^aZ[C\B]T  !"#$%&'()*+,-./0123456789:;<=>?@AEFGHIJKLRSUVW'IizIW/7:XIZ_ 7 q3/Z3'();0w33P6"#<=671Z4F1^04a335EZQZN^L]?]P_RX^_`aYX7@AN7TXXZZjk^%&z"#Y  Z35^0E3@A<>?\03'();<=>RS*`^3a 7OPQn37  [\[[0"#\_ ,-./0;X3500;<=>??367GHIJKLMNOPQN]ERSXTXXLX3YPZRMNOPQKLMNOPQXX"#X\\XXjkX3!/0[Z37`X[{_YXZYZYYYYYY I]IA_]Y`] "#gX0'()\n,-./0Y23356[[YJ]]YJ?+YY_] NZYTX\{ #"#'(),-./02356? NTX\ "#'(),-./02356? NTX\ "#,-./0356? NTX\ "#,-./0356 ?DEFGHIJKLMNOPQN"#TX\035?NTX@ABCDEFGHIJKLMNOPQY@ABCDEFGHIJKLMNOPQY $%&'()14 89:$%&'()1489:@ABCDEFGHIJKLMNOPQX_@ABCDEFGHIJKLMNOPQEFGHIJKLMNOPQ_@ABCDEFGHIJKLMNOPQ^@ABCDEFGHIJKLMNOPQ[@ABCDEFGHIJKLMNOPQ[@ABCDEFGHIJKLMNOPQY@ABCDEFGHIJKLMNOPQY@ABCDEFGHIJKLMNOPQY@ABCDEFGHIJKLMNOPQY@ABCDEFGHIJKLMNOPQ@ABCDEFGHIJKLMNOPQABCDEFGHIJKLMNOPQABCDEFGHIJKLMNOPQBCDEFGHIJKLMNOPQCDEFGHIJKLMNOPQ8oI{F{{BKj$YTkUVW XQ<Y[ =J"\#YZ^_)f.[/\!]RM%KNi{^lmL0_1&(*,`G3a~+,<UU>?E45bRcd6R\ f9w[T;\UVWCX<Dr  EGHJYZ%')+OMPMstuv[Q\3]5^MM_`MzMMfSSMM\f .-/60=7:;@AijkTBCUVWPXHRX`lmnotpefqfrYZ|gh pfstuv[qwxs]yuvxyz}^ijkTUVW_X*[D`lmnzop{qrVYZ8 stuv[wx]y^ijkTUVW_X`lmnzop{qrYZ stuv[]y^ijkTUVW_X`lmnzop{qrYZstuv[]y^ijkTUVW_X`nz{qrYZstuv[\]yTUVWX^_YZ`z{[\]^_`a   n]4Z12*+ 9:; %$  !<&'"-M=>GI?()88A,QTPav_Q}{l026XYu8NHKJ8V#kbwy3E88.8mZs\feDO@BUg8^885Q4c˻1d7ˣWji`F/n[t]S~|hxzrpйLoʸ bcddeeeeeeeeeeghfiijjjjlknmporqssutvvwwwwxxy{|z}}~~~~~~{l}k@ NzSLW-(&'2$F|b7I}~>S?@Acde #9!"  {:gaThNO $'()89:cdefjkmoqtvwx77336sZnple%&i1477rX03\zz*33;77\u[[{0zgZ^\_; "#035?NTXy ,-./236X\x}~X003Z]35XXXZ^a<=@ABCDEFGHIJKLMNOPQ_YXX3\\XXXX^;<=>?RS!@A@A[3]_0Z3Y`70_23XY}|~Y[XYYY[ZZYY}}}YYYY^]0NXIIh[^a^_Y]X0X_X\Y3[[Y]]YJJ+14YYYYXz_]=YB??ٙ@?əCDeletingError: discardingError: poppingCleanup: discarding lookaheadCleanup: poppingstruct { char *c; char *t; } code_lookup[] = { { "%s", "\"%%\n..." }, { (char *) 0, "" } }; "Matched""UnMatched""unMatched""StackOnly"void globinit(void) { Global Global now.%s = %s; Hidden Hidden %s = %s; } void locinit%d(int h) { Local Local Local uchar *this = pptr(h); ((P%d *)this)->%s = %s; } Global Global Hidden Hidden Local Local Global Global %s; Global Global Hidden Hidden Local Local uchar c_state[ Global Global Hidden Hidden Local Local%ssizeof(%s)%s%s4]; %s%sWS uchar c_stack[StackSize]; "Hidden""Hidden"%s; /* Hidden */ Local Local Local %s; #if defined(C_States) && defined(HAS_TRACK) Global Global Hidden Hidden Local Localextern %s %s; #endif int cpu_printf(const char *, ...); void c_stack(uchar *p_t_r) { #ifdef VERBOSE cpu_printf("c_stack %%u\n", p_t_r); #endif if(%s) memcpy(p_t_r, %s, %s); else memset(p_t_r, 0, %s); p_t_r += %s; } void c_update(uchar *p_t_r) { #ifdef VERBOSE printf("c_update %%u\n", p_t_r); #endif Global Global Hidden Hidden Local Local memcpy(p_t_r, &%s, sizeof(%s)); p_t_r += sizeof(%s); if(%s) memcpy(p_t_r, %s, %s); else memset(p_t_r, 0, %s); p_t_r += %s; } void c_unstack(uchar *p_t_r) { #ifdef VERBOSE cpu_printf("c_unstack %%u\n", p_t_r); #endif if(%s) memcpy(%s, p_t_r, %s); p_t_r += %s; } void c_revert(uchar *p_t_r) { #ifdef VERBOSE printf("c_revert %%u\n", p_t_r); #endif Global Global Hidden Hidden Local Local memcpy(&%s, p_t_r, sizeof(%s)); p_t_r += sizeof(%s); if(%s) memcpy(%s, p_t_r, %s); p_t_r += %s; } #endif /* start of %s */ \#\#%s /* end of %s */ #define C_States 1 #undef C_States P%s->spin: in proctype %s, ref to object in proctype %s %sif (!(%s)) { if (!readtrail) { depth++; trpt++; trpt->pr = II; trpt->o_t = t;trpt->st = tt; uerror("%s"); continue; } else { printf("pan: precondition false: %s\n"); _m = 3; goto P999; } } now.{ if (!(%s)) { if (!readtrail) { uerror("%s"); continue; } else { printf("pan: precondition false: %s\n"); _m = 3; goto P999; } } sv_save();%s } ++--#ident"c_codec_code%dspin: saw char '%c' /* line %d %s */ #line %d %s {%3d: %s, warning: empty inline definition (%s) "_lastspin: line %d replacement value: %s ,()'%c'%d::;--++<<>><=<>=>===!=???!!!&&||proctype %s, '%s %s' could be declared '%s %s' :hide::show::local:error: x[rs] claims from %s and %s spin: line %d %s warning: xs tag not compatible with -m (message loss)unsigned bit byte chan short int mtype structproctypelabel value %s %s.%s[%d] %d %s %d <:struct-field:> <:global:> <%s> %d struct %s chan %s-%s.%s[%d] %s by: %s to %s par %d, %s spin: warning, %s, proctype %sglobal, '%s%s' variable is never used __last_p_pid_nr_prfindlab through getglobal on %s %d->%d (%d)#ifndef XUSAFE , %d, "%s"); #endif %s[%d] = ~G%s = %s = %s MSC: ~G %s %s %3d: proc %3d (TRACK) line 1 "var" (state 0) [printf('MSC: globvar\\n')] %s[%d] = %s %s(%d):%s[%d] = ~G%s(%d):%s = %s(%d):%s = %s MSC: ~G %s(%d):%s %s %3d: proc %3d (TRACK) line 1 "var" (state 0) [printf('MSC: locvar\\n')] %s(%d):%s[%d] = %s seed used: %d spin: %d error(s) - aborting Exit-Status 0 spin: too many -D args, aborting %s %s > %sspin: preprocessing failed rwspin: cannot cp %s to %s %suse: spin [-option] ... [-option] file Note: file must always be the last argument -A apply slicing algorithm -a generate a verifier in pan.c -B no final state details in simulations -b don't execute printfs in simulation -C print channel access info (combine with -g etc.) -c columnated -s -r simulation output -d produce symbol-table information -Dyyy pass -Dyyy to the preprocessor -Eyyy pass yyy to the preprocessor -f "..formula.." translate LTL into never claim -F file like -f, but with the LTL formula stored in a 1-line file -g print all global variables -h at end of run, print value of seed for random nr generator used -i interactive (random simulation) -I show result of inlining and preprocessing -J reverse eval order of nested unlesses -jN skip the first N steps in simulation trail -k fname use the trailfile stored in fname, see also -t -l print all local variables -M print msc-flow in Postscript -m lose msgs sent to full queues -N file use never claim stored in file -nN seed for random nr generator -o1 turn off dataflow-optimizations in verifier -o2 don't hide write-only variables in verifier -o3 turn off statement merging in verifier -o4 turn on rendezvous optiomizations in verifier -o5 turn on case caching (reduces size of pan.m, but affects reachability reports) -Pxxx use xxx for preprocessing -p print all statements -qN suppress io for queue N in printouts -r print receive events -S1 and -S2 separate pan source for claim and model -s print send events -T do not indent printf output -t[N] follow [Nth] simulation trail, see also -k -Uyyy pass -Uyyy to the preprocessor -uN stop a simulation run after N steps -v verbose, more warnings -w very verbose (when combined with -l or -g) -[XYZ] reserved for use by xspin interface -V print version number and exit spin: dataflow optimizations turned %s spin: dead variable elimination turned %s spin: statement merging turned %s spin: rendezvous optimization turned %s spin: case caching turned %s spin: bad or missing parameter on -o %s spin: warning -o[123] option ignored in simulations rspin: cannot open %s pan.prepan.___rspin: cannot open %s %srspin: cannot open %s progressaccept_%sspin: missing argument to -f %s reading input from stdin: spin: -c precludes all flags except -t spin: line %3d %s, Error: saw '' near '%s' spin: Warning, never claim has side-effect spin: warning, make sure that the S1 model also polls channel '%s' in its claim spin: never, saw spin: Warning, using %s outside never claim '%c' = '%d'\b\t\f\n\rconditionsendrecvrecv poll %s@(x->y:z)%sactive%s&&%s=%sassert%satomic%sbreak%sc_code%sc_decl%sc_expr%sc_state%sc_track%snevera constant%s--%sd_step%sd_proctype%sdo.%selse%sempty%senabled%s==%seval%sfi%sfull%s>=%sgoto%s>%shidden%sif%s++inline name%sinline%sinit%slocala label-name%s<=%slen%s<<%s<%smtypean identifier%s!=%s! (not)%snempty%snfullsub-sequence%snp_%sod%sof%s||%s!!%spc_valueprocess name%sprintf%sprintm%spriority%sproctype%sprovided%s?%s??%s>>%sruntoken: ::;%sshow%s!a string%strace%stimeoutdata typename%stypedef%sx[rs]%s- (unary minus)a typename%sunlessgsave /Courier-Bold findfont 8 scalefont ISOEncode setfont 0.000 0.000 0.000 setrgbcolor AdjustColor %d %d [ (%s -- %s -- MSC -- %d) ] 10 -0.5 0.5 0 false DrawText grestore %%%%Page: %d %d save 10 %d moveto %d %d lineto %d %d lineto 10 %d lineto closepath clip newpath %f %f translate %f %f scale %s.psw%%!PS-Adobe-2.0 %%%%Creator: %s %%%%Title: MSC %s %%%%BoundingBox: 119 154 494 638 %s%d.trail%s.trailrr%%%%Trailer end %%%%Pages: %d %%%%EOF spin: wrote %d pages into '%s.ps' gsave %d %d moveto %d %d lineto %d setlinewidth 0 setlinecap 1 setlinejoin %f %f %f setrgbcolor AdjustColor stroke grestore %d %d moveto %d %d lineto %d %d lineto %d %d lineto %d %d lineto %f %f %f setrgbcolor AdjustColor closepath fill gsave /Courier-Bold findfont 6 scalefont ISOEncode setfont 0.000 0.000 0.000 setrgbcolor AdjustColor %d %d [ (%d) ] 10 -0.5 0.5 0 false DrawText grestore %d %d moveto %d %d lineto 1 setlinewidth 0 setlinecap 1 setlinejoin 0.92 0.92 0.92 setrgbcolor AdjustColor stroke %d:%250sgsave /Courier-Bold findfont 8 scalefont ISOEncode setfont 0.000 0.000 0.000 setrgbcolor AdjustColor %d %d [ (%s) ] 10 -0.5 0.5 0 false DrawText grestore %f %f scale showpage restore showpage restore max length of %d steps exceeded - ps file truncated max nr of %d steps exceeded MSC: %sError: sending to an uninitialized chan STDINError: receiving from an uninitialized chan %s type-clash in %s, (%s<-> %s)%3d: warning: missing params in send %3d: warning: too many params in send %3d: warning: missing params in next recv %3d: warning: too many params in next recv %3d: warning: missing params in rv-send %3d: warning: too many params in rv-send _*?*%s-[%d]Sen,[]q\p %3d %3d . %s%cSen,[] (state -) [values: %d(state -) [%dSen!?line %3d %s %s,] %s queue %d (%s) %s%d queue %d (%s(%d):%s[%d]): %s): [,] [][]1%d..????_nr_pr_nr_pr_p_pspin: line %d %s, redundant skip error: (%s:%d) label %s placed incorrectly =====> stmnt unless Label: stmnt sorry, cannot jump to the guard of an escape (it is not a unique state) =====> instead of "Label: stmnt unless stmnt" =====> always use "Label: { stmnt unless stmnt }" =====> instead of "atomic { Label: statement ... }" =====> always use "Label: atomic { statement ... }" =====> instead of "d_step { Label: statement ... }" =====> always use "Label: d_step { statement ... }" =====> instead of "{ Label: statement ... }" =====> always use "Label: { statement ... }" =====>instead of do (or if) :: ... :: Label: statement od (of fi) =====>always use Label: do (or if) :: ... :: statement od (or fi) cannot happen - labels link %d, {%d .. %d} -> %d (ntyp=%d) was %d acceptendprogressspin: label '%s' (proctype %s) spin: cannot remote ref a label inside the same proctype :b%dspin: warning, line %3d %s, atomic inside %s (ignored) spin: warning, line %3d %s, d_step inside d_step (ignored) atomic spin: error, line %3d %s, unless in d_step (ignored) label %s %d <%s> Starting %s with pid %d spin: bad value for det (cannot happen) %d:%sproc %d = %s 0: proc - (%s) creates proc %2d (%s) priority %d spin: too many processes (%d max) spin: saw %d parameters, expected %d :never:spin: couldn't find claim (ignored) :never:%d:%sspin: remote ref to proctype %s, has more than one match: %d and %d ------------- final state: ------------- #processes: %d %d process%s created Select a statement choice %d: unexecutable, [ + Escape] choice %d: unexecutable, [] choice %d: [else] choice %d: unexecutable, [else] Make Selection %d no executable choices Select [1-%d]: %d %64s choice is outside range spin: error, cannot use 'enabled()' in models with synchronous channels. warning: never claim not used in random simulation warning: trace assertion not used in random simulation ------------- depth-limit (-u%d steps) reached <> [] [] [] type-clash in params of %s(..), (%s<-> %s)spin: indexing %s[%d] - size is %d %3d: proc -%2d (%s) MSC: ~G line %d line %3d %s (state %d) spin: error, type: %d spin: remote reference error on '%s[%d]' _premote ref: %s[%d] have only: %d %s Select stmnt () choice 0: other process choice %d: unexecutable, choice %d: (else) Make Selection %d Select [0-%d]: %64s choice outside range unexecutable Stmnt [] has escape(s): [] Escape taken Escape taken %s:%d %s: %s: spin: text of failed assertion: assert() spin: bad node type %d (run) spin: trail file doesn't match spec? %%c%d%o%u%x "%s", #define SYNC %d #define ASYNC %d #ifndef NCORE #ifdef DUAL_CORE #define NCORE 2 #elif QUAD_CORE #define NCORE 4 #else #define NCORE 1 #endif #endif short Air[] = { %s (short) Air%d, (short) Air%d }; char *procname[] = { ":np_:", }; #define WS %d /* word size in bytes */ #define StackSize () uchar sv[VECTORSZ]; } State #ifdef GCC __attribute__ ((aligned(8))) #endif ; #define HAS_TRACK %d int addproc(int n, int par%d int provided(int II, unsigned char ot, int tt, Trans *t) { switch(ot) { default: return 1; /* e.g., a claim */ } return 0; } if (state_tables) ini_claim(%d, 0); iniglobals(); } void iniglobals(void) { #ifdef VAR_RANGES #endif Maxbody = max(Maxbody, sizeof(State)-VECTORSZ); } %s[%d][%d] = 1; %s label inside d_step%s label inside atomicspin: %3d:%s, warning, %s - is invisible visstate[%d][%d] = 1; spin: warning, line %3d %s, proctype %s:global '%s %s' could be declared 'bit %s' proctype %s:global '%s %s' could be declared 'byte %s' ((P%d *)pptr(h))->%s%s:", ((P%d *)pptr(h))->); ((P%d *)pptr(h))->:never:error: %s defines local %s void c_chandump(int unused) { unused++; /* avoid complaints */ } void c_chandump(int from) { uchar *z; int slot; from--; if (from >= (int) now._nr_qs || from < 0) { printf("pan: bad qid %%d\n", from+1); return; } z = qptr(from); switch (((Q0 *)z)->_t) { case %d: ((Q%d *)z)->for (slot = 0; slot < %sQlen; slot++) { printf(" ["); printm(%scontents[slot].fld%d); printf("%%d,", %scontents[slot].fld%d); printf("],"); } break; } printf("\n"); } printf(" (struct %s)\n"); %s%s. printf(" %s %s: %%d\n", %s%s); { int l_in; for (l_in = 0; l_in < %d; l_in++) { printf(" %s %s[%%d]: %%d\n", l_in, %s%s[l_in]); } } printf(" chan %s (=%%d): len %%d:\t", %s%s, q_len(%s%s)); c_chandump(%s%s); printf(" chan %s[%d] (=%%d): len %%d:\t", %s%s[%d], q_len(%s%s[%d])); c_chandump(%s%s[%d]); :never::trace::notrace::never::trace::notrace:((P%d *)pptr(pid))->void c_globals(void) { /* int i; */ printf("global vars:\n"); } void c_locals(int pid, int tp) { /* int i; */ switch(tp) { case %d: printf("local vars proc %%d (%s):\n", pid); /* none */ break; } } void printm(int x) { switch (x) { case %d: Printf("%s"); break; default: Printf("%%d", x); } } /* hidden variable: */int _; /* a predefined write-only variable */ %s%s%s%s%s%s%s %s%s%s[%d]%s%s%s[%d]%s { int l_in; for (l_in = 0; l_in < %d; l_in++) { %s%s%s[l_in]%s%s%s[l_in]%s } } addqueue(%d, %d)%d:init:#define Pinit ((P%d *)this) :never::trace::notrace::init:_:never_template:_np_#define P%s ((P%d *)this) typedef struct P%d { /* %s */ unsigned _pid : 8; /* 0..255 */ unsigned _t : %d; /* proctype */ unsigned _p : %d; /* state */ } P%d; #define Air%d 0 #define Air%d (sizeof(P%d) - %dOffsetof(P%d, %s) - %d*sizeof(%d%duchar)short)int)) #define _NP_ %d uchar reached%d[3]; /* np_ */ uchar *loopstate%d; /* np_ */ #define nstates%d 3 /* np_ */ #define endstate%d 2 /* np_ */ #define start%d 0 /* np_ */ case %d: /* np_ */ ini_claim(%d, h); ((P%d *)pptr(h))->_t = %d; ((P%d *)pptr(h))->_p = 0; reached%d[0] = 1; accpstate[%d][1] = 1; break; case %d: /* %s */ ini_claim(%d, h); break; #define start%d %d #define start_claim %d #define start_event %d case %d: /* %s */ ((P%d *)pptr(h))->_t = %d; ((P%d *)pptr(h))->_p = %d; reached%d[%d]=1; case %d: /* %s */ if () return 1; break; /* params: */ ((P%d *)pptr(h))->%s = par%d; /* locals: */ #ifdef VAR_RANGES #endif #ifdef HAS_CODE locinit%d(h); #endif break; uchar %s; unsigned %s : %d unsigned %s : 1spin: warning: bit-array %s[%d] mapped to byte-array uchar %s short %s int %s struct %s %s[%d]; ucharushortuint Qlen; /* q_size */ #define NQS 1 /* nqs=%d, but has_io */ #define NQS %d short q_flds[%d]; short q_max[%d]; case %d: j = sizeof(Q%d); q_flds[%d] = %d; q_max[%d] = %d; break; typedef struct Q%d { uchar _t; /* q_type */ struct { unsigned fld%d : 1; uchar fld%d; short fld%d; int fld%d; } contents[%d]; } Q%d; typedef struct Q0 { /* generic q */ uchar _t; } Q0; int Q_has(int, int, int); int Q_has(int into, int want%d, int fld%d) { int i; if (!into--) uerror("ref to unknown chan (recv-poll)"); if (into >= now._nr_qs || into < 0) Uerror("qrecv bad queue#"); for (i = 0; i < ((Q0 *)qptr(into))->Qlen; i++) { if (want%d && qrecv(into+1, i, %d, 0) != fld%d) continue; return i+1; } return 0; } #if NQS>0 void qsend(int into, int sorted, int fld%d, int args_given) ((Q%d *)z)-> case %d:%s (trpt+2)->o_m = 0; if (!sorted) goto append%d; for (j = 0; j < %sQlen; j++) { /* find insertion point */ ((Q%d *)z)->contents[j].fld if (fld%d > %s%d) continue; if (fld%d < %s%d) goto found%d; } found%d: ((Q%d *)z)-> for (k = %sQlen - 1; k >= j; k--) { /* shift up */ %scontents[k+1].fld%d = %scontents[k].fld%d; } append%d: /* insert in slot j */ #ifdef HAS_SORTED (trpt+1)->ipt = j; #endif %sQlen = %sQlen + 1; ((Q%d *)z)->contents[j].fld %s%d = fld%d; if (args_given != %d) { if (args_given > %d) uerror("too many parameters in send stmnt"); else uerror("too few parameters in send stmnt"); } break; case %d: return %d; case %d: return (q_sz(from) == %d); ((Q%d *)z)-> case %d:%s if (fld == 0) r = %scontents[slot].fld0; switch (fld) { default: Uerror("too many fields in recv"); } if (done) { j = %sQlen - 1; %sQlen = 0; ((Q%d *)z)->contents { j = %sQlen; %sQlen = --j; for (k=slot; kcontents %s[k].fld%d = %s[k+1].fld%d; } %s[j].fld%d = 0; if (fld+1 != %d) uerror("missing pars in receive"); } break; case %d: j = sizeof(Q%d); break; void qsend(int, int, int, int); #define Addproc(x) addproc(x, 0) Addproc(%d); Addproc(%d); #define _T5 %d #define _T2 %d #define T_ID unsigned char #define T_ID unsigned short #define T_ID unsigned int case _T5: /* np_ */ if (!((!(o_pm&4) && !(tau&128)))) if (!((!(trpt->o_pm&4) && !(trpt->tau&128)))) continue; /* else fall through */ case _T2: /* true */ _m = 3; goto P999; /* np_ demon: */ trans[_NP_] = (Trans **) emalloc(2*sizeof(Trans *)); T = trans[_NP_][0] = settr(9997,0,1,_T5,0,"(np_)", 1,2,0); T->nxt = settr(9998,0,0,_T2,0,"(1)", 0,2,0); T = trans[_NP_][1] = settr(9999,0,1,_T5,0,"(np_)", 1,2,0); wwwwwspin: cannot create pan.[chtmfb] #define SpinVersion "%s" #define PanSource "%s" #ifdef WIN64 #define ONE_L ((unsigned long) 1) #define long long long #else #define ONE_L (1L) #endif char *TrailFile = PanSource; /* default */ char *trailfilename; #if defined(BFS) #ifndef SAFETY #define SAFETY #endif #ifndef XUSAFE #define XUSAFE #endif #endif #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif #if !defined(HASH32) && !defined(HASH64) #define HASH64 #endif spin: warning, make sure that the S1 model includes the same remote references #ifndef NFAIR #define NFAIR 2 /* must be >= 2 */ #endif #define HAS_LAST %d #define DELTA %d #ifdef MA #if NCORE>1 && !defined(SEP_STATE) #define SEP_STATE #endif #if MA==1 #undef MA #define MA 100 #endif #endif #ifdef W_XPT #if W_XPT==1 #undef W_XPT #define W_XPT 1000000 #endif #endif #ifndef NFAIR #define NFAIR 2 /* must be >= 2 */ #endif #define NTIM %d #define ETIM %d #define REM_VARS 1 #define REM_REFS %d #define HAS_HIDDEN %d #define HAS_LAST %d #define HAS_SORTED %d #define M_LOSS #define HAS_RANDOM %d #define HAS_CODE #define HAS_STACK %d #define HAS_ENABLED 1 #define HAS_UNLESS %d #define HAS_PROVIDED %d #define HAS_PCVALUE %d #define HAS_BADELSE %d #ifndef NOREDUCE #define NOREDUCE 1 #endif #define HAS_NP %d #define MERGED 1 #if !defined(HAS_LAST) && defined(BCS) #define HAS_LAST 1 /* use it, but */ #ifndef STORE_LAST #define NO_LAST 1 /* dont store it */ #endif #endif #if defined(BCS) && defined(BITSTATE) #ifndef NO_CTX #define STORE_CTX 1 #endif #endif #ifdef NP /* includes np_ demon */ #define HAS_NP 2 #define VERI %d #define endclaim 3 /* none */ #endif #if !defined(NOCLAIM) && !defined NP #define VERI %d #define endclaim endstate%d #endif #define EVENT_TRACE %d #define endevent endstate%d #define NEGATED_TRACE 1 typedef struct S_F_MAP { char *fnm; int from; int upto; } S_F_MAP; /*** Generated by %s ***/ /*** From source: %s ***/ #include "pan.h" #include "pan_s.h" #include "pan_t.h" #ifdef LOOPSTATE double cnt_loops; #endif State A_Root; /* seed-state for cycles */ State now; /* the full state-vector */ extern int verbose; extern long depth; #ifndef NOBOUNDCHECK #define Index(x, y) Boundcheck(x, y, II, tt, t) #else #define Index(x, y) x #endif #ifdef PEG struct T_SRC { char *fl; int ln; } T_SRC[NTRANS]; void tr_2_src(int m, char *file, int ln) { T_SRC[m].fl = file; T_SRC[m].ln = ln; } void putpeg(int n, int m) { printf("%%5d trans %%4d ", m, n); printf("file %%s line %%3d\n", T_SRC[n].fl, T_SRC[n].ln); } #else #define tr_2_src(m,f,l) #endif void settable(void) { Trans *T; Trans *settr(int, int, int, int, int, char *, int, int, int); trans = (Trans ***) emalloc(%d*sizeof(Trans **)); if (II == 0) { _m = step_claim(trpt->o_pm, trpt->tau, tt, ot, t); if (_m) goto P999; else continue; } else #define rand pan_rand #if defined(HAS_CODE) && defined(VERBOSE) cpu_printf("Pr: %%d Tr: %%d\n", II, t->forw); #endif switch (t->forw) { #ifndef PEG #define tr_2_src(m,f,l) #endif void set_claim(void) { Trans *T; extern Trans ***trans; extern Trans *settr(int, int, int, int, int, char *, int, int, int); #define rand pan_rand #if defined(HAS_CODE) && defined(VERBOSE) cpu_printf("Pr: %%d Tr: %%d\n", II, forw); #endif switch (forw) { default: Uerror("bad forward move"); case 0: /* if without executable clauses */ continue; case 1: /* generic 'goto' or 'skip' */ IfNotBlocked _m = 3; goto P999; case 2: /* generic 'else' */ if (o_pm&1) continue; IfNotBlocked if (trpt->o_pm&1) continue; _m = 3; goto P999; if (II == 0) goto R999; switch (t->back) { default: Uerror("bad return move"); case 0: goto R999; /* nothing to undo */ struct { int tp; short *src; } src_all[] = { { %d, &src_ln%d[0] }, { 0, (short *) 0 } }; short *frm_st0; extern short *frm_st0; } #undef rand } } #define FORWARD_MOVES "pan_s.m" #define REVERSE_MOVES "pan_s.b" #define SEPARATE #define TRANSITIONS "pan_s.t" extern void ini_claim(int, int); #define FORWARD_MOVES "pan.m" #define REVERSE_MOVES "pan.b" #define TRANSITIONS "pan.t" void active_procs(void) { if (!permuted) { } else { } } #define NTRANS %d #ifdef PEG long peg[NTRANS]; #endif #define FORWARD_MOVES "pan_t.m" #define REVERSE_MOVES "pan_t.b" #define TRANSITIONS "pan_t.t" extern int Maxbody; #if VECTORSZ>32000 extern int proc_offset[]; #else extern short proc_offset[]; #endif extern uchar proc_skip[]; extern uchar *reached[]; extern uchar *accpstate[]; extern uchar *progstate[]; extern uchar *stopstate[]; extern uchar *visstate[]; extern short *mapstate[]; void ini_claim(int n, int h) { extern State now; extern void set_claim(void); #ifdef PROV #include PROV #endif set_claim(); switch (n) { } } int step_claim(int o_pm, int tau, int tt, int ot, Trans *t) { int forw = t->forw; int _m = 0; extern char *noptr; int II=0; extern State now; #define continue return 0 #include "pan_t.m" P999: return _m; } #undef continue int rev_claim(int backw) { return 0; } #include TRANSITIONS || %s((int) ( ((P%d *)this)->(int) ( now.%s[%d]) )%s%s%s%s case %d: if ( (t->ty[i] == && ( || (%s%s[%d]))) || ) return 0; break; case %d: if ( (t->ty[i] == && ()) || ) return 0; break; #define LOCAL 1 #define Q_FULL_F 2 #define Q_EMPT_F 3 #define Q_EMPT_T 4 #define Q_FULL_T 5 #define TIMEOUT_F 6 #define GLOBAL 7 #define BAD 8 #define ALPHA_F 9 int q_cond(short II, Trans *t) { int i = 0; for (i = 0; i < 6; i++) { if (t->ty[i] == TIMEOUT_F) return %s; if (t->ty[i] == ALPHA_F) #ifdef GLOB_ALPHA return 0; #else return (II+1 == (short) now._nr_pr && II+1 < MAXPROC); #endif switch (t->qu[i]) { case 0: break; ((P%d *)this)->now. default: Uerror("unknown qid - q_cond"); return 0; } } return 1; } extern uchar reached%d[]; #define nstates%d %d /* %s */ extern short src_ln%d[]; extern uchar *loopstate%d; extern S_F_MAP src_file%d[]; #define endstate%d %d #define src_claim src_ln%d extern short src_ln%d[]; extern uchar *loopstate%d; #define nstates%d %d /* %s */ #define nstates_claim nstates%d #define nstates_event nstates%d #define endstate%d %d /* PROC %s */ /* PROC %s */ /* proctype %d: %s */ trans[%d] = (Trans **) emalloc(%d*sizeof(Trans *)); #define in_s_scope(x_y3_) 0 #define in_r_scope(x_y3_) 0 trans[%d][%d]->escp[%d] = %d; reached%d[%d] = 1; /* escape #%d: %d */ /* end-escapes */ put_sub %d -> %d -> %d case %d: /* STATE %d - line %d %s - [] */ #if defined(C_States) && (HAS_TRACK==1) c_update((uchar *) &(now.c_state[0])); #endif _m = %d+delta_m; delta_m = 0; goto P999; case %d: /* STATE %d */ sv_restor(); goto R999; tr_2_src(%d, %s, %d); /*->*/ trans[%d][%d] = settr(%d,%d,%d,%d,%d,"", %d, %d, %d); T = trans[ %d][%d] = settr(%d,%d,0,0,0,"", %d, %d, %d); /* %s:%d */ T->nxt = settr(%d,%d,%d,0,0,"", %d, %d, %d); /* %s:%d */ %d, %d); /* %s:%d */ bad hop %s:%d -- at %d, <> looking for %d -- merge %d:%d:%d (trpt+1)->bup.ovals = grab_ints(%d); ; if (trpt->o_pm&1) uerror("non-determinism in D_proctype"); /* dead %d: %s */ #ifdef HAS_CODE if (!readtrail) #endif (trpt+1)->bup.ovals[%d] = (trpt+1)->bup.oval = #ifdef HAS_CODE if (!readtrail) #endif ; case %d: /* STATE %d */ ; /* %d */ s[%d]; %s%d trans[%d][%d] = settr(0,0,0,0,0,"",0,0,0); trans[%d][%d] = trans[%d][%d] = /* STATE %d - line %d %s - [] (%d:%d - %d) same as %d (%d:%d - %d) */ case %d: /* STATE %d - line %d %s - [] (%d:%d:%d - %d) */ IfNotBlocked #if defined(VERI) && !defined(NP) { static int reported%d = 0; if (verbose && !reported%d) { printf("depth %%d: Claim reached state %%d (line %%d)\n", (int) depth, frm_st0[t->forw], src_claim[%d]); reported%d = 1; fflush(stdout); } } #endif reached[%d][%d] = 1; /* stop at bad hop %d, %d */ /* merge: (%d, %d, %d) */ reached[%d][%d] = 1; _m = %d+delta_m; delta_m = 0; goto P999; /* %d */ ; case %d: /* STATE %d */;; ungrab_ints(trpt->bup.ovals, %d); goto R999; %ssettr(%d,%d,%d,%d,%d," trans[%d][%d] = settr(%d,%d,%d,%d,0,"", %d, %d, %d);%d, %d); /* m: %d -> %d,%d */ reached%d[%d] = 1; tr_2_src(%d, %s, %d); error: (%s:%d) saw 'unless' on a guard: =====>instead of do (or if) :: ... :: stmnt1 unless stmnt2 od (of fi) =====>use do (or if) :: ... :: stmnt1 od (or fi) unless stmnt2 =====>or rewrite put_seq %d step %d done before an unless has sub T = trans[%d][%d] = settr(%d,%d,0,0,0,"", %d, %d, %d); /* %s:%d */ #if 0 /* dead link: */ spin: line %3d %s, Warning: condition is always false settr %d %d T = T->nxt = T->nxt = settr(%d,%d,%d,0,0,"", %d, %d, %d); /* %s:%d */ #endif [non]atomic %d put_el %d put_seq done /* mark-down line %d status %d = %d */ _pid_continue%s%s%sUerror("block in d_step seq")%s0%d !() -() ~()(/)(*)(-)(+)(%%)(&)(^)(|)(<)(>)(<=)(>=)(!=)(==)(||)(&&)(<<)(>>)((tau)&1)((trpt->tau)&1)spin: line %3d, warning: 'timeout' in d_step sequence addproc(%d, , 0)enabled(II, )(!(o_pm&4) && !(tau&128))(!(trpt->o_pm&4) && !(trpt->tau&128))((P0 *) Pptr(+BASE))->_p #ifndef XUSAFE , II)) && #endif #ifndef XUSAFE , II)) && #endif #ifndef XUSAFE , II)) && #endif #ifndef XUSAFE #endif #ifndef XUSAFE #endif if ((II == -EVENT_TRACE && _tp != 's') \ || qrecv(%d, 0) != ) continue1 #if !defined(XUSAFE) && !defined(NOREDUCE) } { uerror("sorted send on xr channel violates po reduction"); } #endif if (q_%s { nlost++; delta_m = 1; } else { if (TstOnly) return 1; if (no_recvs(II)) continue; #ifdef HAS_CODE if (readtrail && gui) { char simtmp[32]; sprintf(simtmp, "%%d", ); strcat(simvals, simtmp); strcat(simvals, ","); } #endif , %d, %d msg parameters sent, %d expected , 0, %d); ; Uerror("rv-attempt in d_step"); }; } if ((II == -EVENT_TRACE && _tp != 'r') \ || qrecv(0, %d, 0) != ) continue(((boq == -1 && ) && ( == 0, %d, 0)) && ( == 0, %d, 0)) && Q_has(, 1, , 1, , 0, 0, 0, 0)) #if !defined(XUSAFE) && !defined(NOREDUCE) uerror("rand receive on xr channel violates po reduction"); } #endif if ( { uerror("polling rv chan"); continue; } IfNotBlocked if ( { if (boq != { if (boq != -1) } ; XX=1; if ( != 0, %d, 0)) ; if ( != 0, %d, 0)) ; if (!(XX = Q_has(, 1, , 1, , 0, 0, 0, 0))) ; (trpt+1)->bup.ovals[%d] = (trpt+1)->bup.oval = XX; if (TstOnly) return 1; ; if (q_flds[((Q0 *)qptr( != %d) Uerror("wrong nr of msg fields in rcv"); (trpt+1)->bup.ovals[%d] = (trpt+1)->bup.oval = _, XX-1, %d, 0); ; _; _ = XX-1, %d, %d)_; #ifdef VAR_RANGES logval("", ); #endif ; #ifdef HAS_CODE if (readtrail && gui) { char simtmp[32]; sprintf(simtmp, "%%d", ); strcat(simvals, simtmp); sprintf(simtmp, "%%d", ); strcat(simvals, simtmp); strcat(simvals, ","); } #endif { boq = -1; #ifndef NOFAIR if (fairness && !(trpt->o_pm&32) && (now._a_t&2) && now._cnt[now._a_t&1] == II+2) { now._cnt[now._a_t&1] -= 1; #ifdef VERI if (II == 1) now._cnt[now._a_t&1] = 1; #endif #ifdef DEBUG printf("%%3d: proc %%d fairness ", depth, II); printf("Rule 2: --cnt to %%d (%%d)\n", now._cnt[now._a_t&1], now._a_t); #endif trpt->o_pm |= (32|64); } #endif } #ifndef XUSAFE q_R_check( #endif \ && qrecv(0, %d, 0) == ), 1, , 1, , 0, 0, 0, 0)if (!()) if (o_pm&1) if (trpt->o_pm&1) /* else */( () ? () : () )if (TstOnly) return 1; (trpt+1)->bup.ovals[%d] = ; (trpt+1)->bup.oval = ; = ; #ifdef VAR_RANGES logval("", ); #endif if (TstOnly) return 1; Printf(%s, )if (TstOnly) return 1; printm(%d)%s%d()/* %s */ if (TstOnly) return 1; #if defined(C_States) && (HAS_TRACK==1) c_update((uchar *) &(now.c_state[0])); #endif if (TstOnly) return 1; assert(, "", II, tt, t)Uerror("cannot get here")return 0if (TstOnly) return (II+1 == now._nr_pr); if (!delproc(1, II)) spin: bad node type %d (.m) - line %d %s%s%s._p_pid((P%d *)this)->_now..%s:%s hint: instead of, e.g., x[rs] qu[3], use chan nm_3 = qu[3]; x[rs] nm_3; and use nm_3 in sends/recvs instead of qu[3] [%%d], [][ Index(, %d) ]%s[].%s((int)((P%d *)Pptr(BASE+f_pid(%d)))->%s[]) %3d, { %s, %d, %d }, { %s, %d, %d } putsrc mismatch seqno %d, line %d - %d, file %s uchar reached%d [] = { }; uchar *loopstate%d; #define reached_claim reached%d #define reached_event reached%d short src_ln%d [] = { }; S_F_MAP src_file%d [] = { }; #define src_claim src_ln%d #define src_event src_ln%d %s0!()-()~()(/)(*)(-)(+)(%%)(&)(^)(|)(<=)(>=)(>)(<)(!=)(==)(||)(&&)(<<)(>>)run %s(,),?<?<,>,]enabled()eval()np_pc_value()()( () -> () : () ) = printfannotate(%s,)printm()%s{%s}assert().(goto)goto %sbreakelse-end-D_STEPATOMICsub-sequenceIFDOunlesstimeout'%c'%d0delproc(0, now._nr_pr-1)if (_m == 2) XX = trpt->bup.ovals[%d]; XX = 1; unrecv%d, , %d); unrecv%d, _trpt->bup.ovals[%d], %d); _ = trpt->bup.ovals[%d]; p_restor(II); = trpt->bup.ovals[%d]sv_restor(); spin: bad node type %d (.b) ; case %d: ((Q%d *)z)->contents#ifdef HAS_SORTED j = trpt->ipt; #endif for (k = j; k < ((Q%d *)z)->Qlen; k++) { %s[k].fld%d = %s[k+1].fld%d; } j = ((Q0 *)z)->Qlen; ((Q%d *)z)->contents[j].fld %s%d = 0; _m = (trpt+1)->o_m; if (_m) (trpt-1)->o_pm |= 1; UnBlock; _m = trpt->o_m; break; ((Q%d *)z)->contents case %d: if (strt) boq = from+1; if (strt && slot<%d) { for (j--; j>=slot; j--) { %s[j+1].fld%d = %s[j].fld%d; } } [slot].fld if (strt) { %s%d = 0; } if (fld == 0) %s0 = fldvar; switch (fld) { case %d: %s%d = fldvar; break; } break; _pidspin: saw cannot find state %d __pid_lastspin: bad node type %d line %d (ana_stmnt) unreachable code: %s, line %3d: unsigned char Is_Recv[%d]; void set_recvs(void) { Is_Recv[%d] = 1; } int no_recvs(int me) { int h; uchar ot; short tt; Trans *t; for (h = BASE; h < (int) now._nr_pr; h++) { if (h == me) continue; tt = (short) ((P0 *)pptr(h))->_p; ot = (uchar) ((P0 *)pptr(h))->_t; for (t = trans[ot][tt]; t; t = t->nxt) if (Is_Recv[t->t_id]) return 0; } return 1; } (%s) %s%d.trail%s.trailrr%s%d.trail%s.trailrrspin: cannot find trail file spin: warning, "%s" is newer than %s %d:%d:%d ------------- depth-limit (-u%d steps) reached %3d: proc %d, no matching stmnt %d %3d: claim terminates %3d: proc %d terminates %3d: stop error, proc %d (i=%d) trans %d, %c i=%d pno %d %3d: no process %d (step %d) max %d (%d - %d + %d) claim %dactive processes: pid %d proctype %s %3d: proc %d (?) [] [] transition failed #%dNever claim moves to line %d [] %d:%d:%d spin: trail ends after %d steps %d:%d:%d:%d step %d: proc %d (state %d) - d %d %d:%d:%d:%d S_%.3d_0: /* break-dest */ S_%.3d_0illegal operator in 'd_step:' '' || (boq == -1 /* else */)(1 /* else */) || () || () || ((boq == -1) && ) || ((boq == -1 && ))if (!(1)) continue;if (!(1)) continue;if (!()) continue;if (!()) continue;if ((boq != -1) || !()) continue;if (!(boq == -1 && )) continue;if (boq != -1 || (trpt->o_pm&1)) continue;IfNotBlocked sv_save(); reached[%d][%d] = 1; reached[%d][t->st] = 1; reached[%d][tt] = 1; Uerror("block in d_step seq, line %d")S_%.3d_0: /* 1 */ goto S_%.3d_0; S_%.3d_0: /* 2 */ goto S_%.3d_0; /* 'break' */ goto S_%.3d_0; /* NEXT */ goto S_%.3d_0; /* 'goto' */ goto S_%.3d_0; /* '.' */ ; goto S_%.3d_0; /* ';' */ goto S_%.3d_%d%s: /* 3 */ Uerror("blocking sel in d_step (nr.%d, near line %d)"); goto S_%.3d_0; struct %s { /* user defined type */ }; :hide::show::local:spin: indexing %s[%d] - size is %d bad subfield type %d bad subfield entry %d %s..%s[%d]no field '%s' defined in structure '%s' ..%s[%d]%s%s.%s%s[%d].%s%s.%s%s[%d].[ %d ]..%s[%d]. %s(%d):%s.%s[%d] = ntyp %d spin: saw '' cannot retrieve field %d :%s:L:G:%s:type = %d possible aliases of no valid name <RUN ASGN RCV [%s]>, DR %s [[ ]] fully relevant %s due to uses(%d): <> :never::trace::notrace:proctype %s relevant, due to symbol :never::trace::notrace::init:spin: redundant in proctype %s (for given property): line %3d %s (state %d) [] *%3d +%3d #%3d ? %d -> %d Unless <:%d> AST_START %s from %d spin: error: DEF and USE of same var in rcv stmnt: -- %d AST_track, NOT EXPECTED ntyp: %d Relevant variables: spin: redundant vars (for given property): spin: consider using predicate abstraction to replace: spin: proctype %s defines a %s process spin: proctype %s mimics a buffer to reduce complexity, consider merging the code of each source process into the code of its target to reduce complexity, consider merging the code of each sink process into the code of its source to reduce complexity, avoid buffer processes spin: slice criterion type=%d spin: possibly redundant parameters in: critical(%d) CTL -- %s premark nomark liftmark :never::trace::notrace::never::trace::notrace: ROUND %d -- changes %d spin: no redundancies found (for given property) :never::trace::notrace::never::trace::notrace::init::never::trace::notrace: Explicit List: %s%3d <:%d>, == End X[%d:%d:%d] bad scratch: %d inspect pair %d %d subgraph: %d .. %d possible pair %d %d -- %d Curtail %s: scratch %d -- %d %d %d %d %s (%d): states=%d (max %d), words = %d, bpw %d, overflow %d d_step { atomic { { }; %s: /* normal */ { } unless { }; /* end unless */ do if :: od; fi; c_code c_expr { } -> ; Dproctype %s() provided { } formula: expected '%c'truefalse%stotal memory used: %9ld largest stack sze: %9d spin -f: saw '-%c' usage: spin [-v] [-n] -f formula -v verbose translation -n normalize tl formula and exit ( || )( && )( U )( V )X ()! ()falsetrue(%s) D Unknown token: []<>-><->predicate||&&!UVXtruefalseend of formula%ctl_spin: , saw '' tl_spin: %s ----------^ new: , old: , nxt: , other: , Push %s, from %s, S%dwarning: node %s not found && && (() || (1))10))acceptT0acceptT%d%s_%saccept_allmaxred=%d, count=%d, curnm=%s, nwnm=%s (greencnt=%d,%d, redcnt=%d,%d) initinitaccept_T%d_UV|&X!TF? formula-old: [%s] formula-nxt: [%s] compare old to: %s [%s] compare nxt to: %s [%s] => different => match New Node %s [, ] nr %d Done with %s Is Not New Has Next [, ] Expand %s, from %s, handle: /* Normlzd: */ /* * %d states in Streett automaton * %d Streett acceptance conditions * %d Buchi states */ accept_allacceptaccept%s/* redundant state %s */ accept_allreplace %s with %s nonxtA: nonxtB: combo: BINGO %s: %s %d %d %d === state %s, trans to %s redundant conditions <-> accept_allaccept_all%s bucky match %s T0_initacceptT0%s%d: state %s equals state %s == acceptT0%s :: (1) -> goto %s %s: /* */ acceptT0%s: if :: false fi; %s << >> %s acceptnever { /* */ /* >>%d,%d<< */ accept_init: 0 /* false */; accept_all: skip } tl_spin: memalloc %ld bytes size pool allocs frees %5d %6ld %6ld %6ld !true => false !false => true !!p => p !(p V q) => (!p U !q) !(p U q) => (!p V !q) !X -> X! !(p && q) => !p || !q !(p || q) => !p && !q cache stores : %9ld cache hits : %9ld type: %d  H00<0H0T0`0l0x00000000000000 0,080D0P0\0h0t00000000 F F-  oao> o>`>< oo p 8#000 (0 8%DH0@PX,` h p/x|+&90  (0.7-8" 0 (0)<$H*T X`h0p/x!8/' 011AFLVPR4SXrxsoperator: keyword: function-name: X ?H\t$4DXhx 0@Hhtx $<Tl,Tx$Xh(4T`p X _T _x _ _ _ _ _ _ _ _ ` `0 `h ` ` ` a a8 aH a| a a a b b, bX bl bx b b c c, c@ c| c c c c c c c c c c d d d$ d, d< dL d\ dd d d d d d d d e e e e( e< eD eL e\ el e| e e e e e f f8 fL fT f` fl fx f f f f f f f f f f f g g g g, g4 gD gh g g g g g g g g h4 hH hX hh hx h h h h h h h h h i i i$ i8 iL iX i i i i i i j, j4 j@ jP jX jh j j j j j k k0 kL k` kh k k k k k l l lH lP l l l l l m m( m\ md mt m| m m m m m m n n nH n| n n n n n n n n n o o o( o0 oH oX o| o o o o p p p( pH pX  px p p p p p p q q< q\ qd q q q q q r, rX r r r s s sX s s s s s s t t` t t t t t u uP ul u u u u u u u u v v( vL vl vt v v v w$ w< w@ w` wt w w w w 8 < L \ t $ P |  , @ `  8 D P p  D ` 0 `  T d x  8 L p P  8 @ x 0 H \ d x  ( 4 @ H P p $ 8 P h $4<H\dh <@Hl|$H`hxDX`P 4<h| (8d 4X`t@TX`dx $`| (@Th0\dp8x(@Xh|,8<DHh8\ ,08HXp 8Ph  L  @ L P d h p       0 P d |          \ d l        , 0 @ \ l p x            8 @ L P ` h      <l8`0<D`x|$0<@h| (L`hl$<`@`8Pt(0Tt48HT\lpx<PXl0P`h(D\|$<Tt(DXt0PTp4@HX  < L l      !!@!P!!!!!!!"0"D"H"|""""#### #,#0#4#X#\#d#t#######$<$P$|$$$$%% %$%0%H%x%%%%%& &P&`&x&&&''D'h'''(( ((4(T(h(|((())`)))))*4*X*****++<+L+p++++,,(,P,p,,,,,,- --(-X-\-----..<.T.t...//8/d/t/|///0 040\000001114181H1L1T1X1h1t1|111112222(20242`2l222222333333334 444<4@4P4T4444555 5H5\5l555555555666(6D6\6p6666666666677L7d7|777778880888H8L8p8888888899,9@9H9L9\9x9999999:: ::8:<:@:T:`:l:::::::;;D;;;;;;<<>,>4>8>t>>>>>>>>>>???<?H?\?p?????????@@@ @,@8@D@P@`@x@@@@@@@AA AA0A@ADApAtAAAAAAABBBDBhBBBBBC C$C<C`CCCCCCCCDD D8DdDxDDDDDDDEEE$E(E@EDEHETEEEEEFFLFxFFFFGGDG`GGGGHHDHLHlHpHHHHHHII III0I@IhIlIIIIJJ,JJJK4KKKL<LHLTLLLLLLM$M(M@MxMMNN`NhNNNOOOPOOOP0P8PtPPPPPPPQQQQQ$Q8Q<QTQQQQQQQQQRRRR RR,R<R@RPRdRRRRRS SSS S(SDSTSXSpSSSSSTTLTdTlT|TTTTTTUUUUU U0U@UDUXUpUtUUUUVV<VDVHV\VlVpVVVVVWW0W\W|WWWWXXDXlXXXXY$Y(Y8YTY|YYYYYZZ Z4ZZZZ[<[@[X[l[[\\ \p\t\\\\\]$],]@]D]H]P]]]]]]]^ ^^ ^@^H^p^t^x^^^^__ _4_D_L_______````8`p``````aa0a@a\adalaaaaaabbbTb`bdblbpbbbbbbccc$cTcdcxccccd d d`dddddddeee4eDexeeeeeef<fTffffgg(gpggggggghhh0h8hDhLh\hth|hhhhhhhhhi4iHiLixiiiiiij4jpjjjjjjk,k@kHkXk\kpk|kkkkkkll(l0lHlPldllllllm m<mDmLmPmhmmmmmmnnn n0nDnhnnnnnnooo(oLo\o`otoooopp8pXpppppppppqq,qdqqqqqqqqrr r,rHrXr\rhrxrrrrss$sLs|sssssttt,tXt`ttttttttuuuu0u4uDuHulu|uuuuuuvv4vPvxvvvvvw,w4w\wwwwwxx\xxxxxyyyDyXyyyyyzz0zPzXz\zzzz{{{P{t{|{{{||8|X|x|||||||}}$},}@}x}}}~~D~L~l~~~~~~~~DpxDl$Hp@Hhl$8@Dx(LT\`dl8`t (,DPx(<` <LPT ( 8 D L d h x ( , < T \ t | 8 p t  ( 8 L T d x 0 l t    ( d | $ , t |  $ < D H  X   < d ( <  @ d 4 < @ D ( , X \ $ \ L  d  ( D H  X 0 h ¨   P Ô ø  D Đ  < X t Ő Ŭ  0 L d | Ɣ Ƭ 8 h Lj 4 l Ȭ Ȱ L P ɔ  H L x ʬ ʰ   \ ˜ d ̀ ̄ ̼ < D ` | ̈́ ͈ ͐ ͬ ͸ ( T X l t Έ ά δ  , 4 P l p ό Ϩ  0 H ` x Д а  0 d ќ $ ( , 0 H L T t Ҁ Ҙ Ҝ  @ | Ӏ ӈ Ө   , 4 D H h l Ԉ Ԥ  0 H ` Ո դ ը  0 l p ֤ $ ( < p ט ״ D T X \ ` ؈ ؔ ذ ؼ  ` ٨ ٰ , 4 H \ ڈ ڌ ڔ ڨ H ۄ ۜ   $ T | ܔ ܰ ܴ ܼ  H l t ݀ ݔ  d ި 0 4 @ ߀ ߄ ߰  4 l $ , h , H $ ( H h l p   D d t | ( 8 < H L    H @ H  X  T  d 0 8 < D \ x , l T  l 0 `  < P D ( <  8 |  8 < P h p t $ < @ l  4 D X   4 h $ D |   T x  @ H X \ $ 8 @ D H P h l  L p 0 D L X ` d |   @ H t       $ @ d       4 ` |          H P         P d p     $ ( d       < \    0 8     ( , D < `  @ ` $ ( , < ( H P 4 d        8 x       ( P T       < |      , l |             0 |      , x     $ ` p t |        $ 8 \ t    , t |       < T        ,          8 L ` t        , 0 8 H     t    h p    @ L P       8 X \      , D d ! !$ !D !p ! ! ! ! ! " "8 "@ "D "X " " " " " " " " # #d # $ $ $ $d $l $ $ % % % %( %p % % % % % & &, &0 &\ & & & ' ' ' '( 'D '` 'x ' ' ' ' ' ' ( (` (t ( ( ( ( ( ) ) )L )T )p ) ) ) ) ) ) ) ) *4 *h *l * * * * * + +$ +< +` +x + + + + , ,0 ,P ,p , , , , - -4 -` -x - - - - ., .h .p .t . . . . . . /0 /P /T /x / / / 0 0` 0 0 0 0 0 1 1 1$ 1H 1d 1l 1p 1 1 2 2 2 2( 2` 2l 2p 2 2 2 2 2 2 3 3 3L 3T 3x 3 3 3 3 3 4 4 4 4 48 4@ 4h 4x 4 4 4 4 4 4 4 5( 50 5X 5h 5 5 5 5 5 5 5 6 6$ 6, 6P 6` 6| 6 6 6 6 6 6 6 78 7@ 7D 7L 7d 7 7 7 7 7 8 8 8 80 84 8T 8 8 8 8 8 9 9 9 9, 9P 9 9 9 9 9 9 :$ :, :4 :H :d : : : : ;, ;L ;T ;X ;| ; ; ; < <$ > > >< >| > > > > > ? ? ?D ?H ?h ? ? ? ? ? @@ @| @ @ @ A A$ A< AX A` A A A B B< BD Bl Bp B B B B C C( CD C C C C C D DD D\ D D D E E$ E@ ED E E E E F8 F< Fl Fx F F F F G G@ GT G G G G G G H H H0 H\ Hp H H H H H I, I4 I8 I@ Id I I I J J J JH JL J\ J J J J J J K K K K K K( KL KT KX Kh K| K K K K K L L( LL L L L L L L L M M M$ M( M0 M4 MH Mp Mt Mx M N NX N N N N O OH OP OX O` O O O O O P P PX P` P P P Q Q4 QX Q Q Q Q Q Q R R4 RX R` Rp R R R R S S S0 S4 ST S\ S S S S S S S S S T TL T\ Th Tx T T T U UP U U U U V V$ VP Vp V V V V V V W W W0 W< Wx W W W W W X XH Xd X X X X X X X X Y Y YT YX Yx Y Y Y Y Z Z ZD ZX Z Z Z Z [ [0 [D [L [` [ [ [ [ \ \ \4 \8 \D \H \L \X \\ \t \ \ \ \ ] ] ]L ] ] ] ] ^ ^H ^ ^ _ _ _L _t _ _ _ _ _ _ _ _ _ ` ` `4 `8 `P `h `| ` ` ` ` ` a( aX a a a b bX b\ bt b c$ c( c8 cT c c c d d d d, d0 dH d d d d d e( e, eL eT e| e e e e e e e f f( f, f@ fP f f f f f g0 gP gT g\ gd gh g| g g g g g g h hH hL hT hX h h h h h h h i i0 i4 i< i@ iD iX ih i i i i i j j j j j jL jx j j k k k k k$ k( k0 kX kd kh k k k l l l( l` l l l l l l m m< m m m m m m m n0 nD nP nX n\ n n n o o o o o o o0 o< oH o\ op o o o o o o p p< ph p p p p p q q0 qP q| q q q q r r r r4 rL r| r r r r s, sX sh sx s| s s s t t t< t\ tt t t t u u4 uX u u u u u u u u v v v v v, vT vl vt vx v v v v v w$ w( w@ wx w| w w x x x x x, x8 xL x\ x` xh x x x x x x x x x y y y, yD yH yh yl yx y y y z$ z\ zt z z z z { { {$ {` { { { | |\ | | | } }D }L }l } } ~ ~@ ~T ~\ ~ ~ ~ ~ ~ ~  D x       l  , ` h  L `  , P d , h  4 @ t    < P  H d p  \  0 T h p x 8 H l |  8 l  < D p t x  4 8 \ |   ( < D $ < T d   @ t x ( X ` D   8 8 < , h D ` d $ , P l \ l p t  < `   8  H ` h l p x  $ ( L d  D ( d |   ( < `    ` x |  X p t x ( X h T X p   P  4 H ` d $ L p , \ 8 l p , 0 @ P T \ ` d x | 0 h p  , \   4 < X  ( < X h x $ D d t x   $ @ L P X h x   D X d x |   T , P ( H | 0 D P T d  H \ h l p $ D d l p  L \ p  \ |  < |   8 t  X \ t x 0 X ` (  $ ( 8 T x | @ P T \ ` @ H h p x ¸ ¼ $ < t Ä È H ` p t Č Đ Ĕ Ĝ $ , t x Ō Ŝ Ŭ T Ƭ ƴ  h ǐ Ǥ 0 H X Ƞ Ȭ Ȱ $ ( P p t ɘ  8 P p ʈ ʨ @ ` ˀ ˠ  0 H L ` ̌ ̴ ̼   8 P X \ | D Μ ΰ H \ ϐ ϔ Ϙ ϸ  \ l а м  8 < d ф ш Ѭ  , D d | Ҝ Ҵ  4 T t Ӕ Ӵ  4 8 L x Ԝ Ԥ ( , 0 D d Ռ Ք ՘  8 h ք ֨    $ x   \ d h p ؈ ؔ ج ذ   $ 4 8 X و ٌ ِ ٰ  4 X x ڀ ڔ ڬ  P | ۀ ۘ ۴ 4 L T \ ܜ ܬ     ( < L P x ݬ ݴ  4 < x ޴ ޸ 0 4 < ߀   H  $ X  d h  H X , l 4 L l t  0 8 p L x   < l |  , 0 @ |  8 H L T X\p|0HPpx|((4`48Xpx(`$@lpx|0 ,LX`4Xp,0<@h (LPX\dx<H`  ,Xlpx D`dt(LtX8`hxLx ,4\l (HX|HPl|$48LTp|0Td4PX`x(0<DLp0T\`x$0DLTX`d4`l,8<L\lpxt|,X\l8DLX\`hx|<D\(HPT`h|(@tx ,<@L  Lpt Dhlt|H8L|  (<\ (HLh$<(T\| (<L`hx (8x $8L`p@T\lHPt,0@dht$4LPXdhtHPx$,Tx (LTx <@| ,dx 04<d$<tˆ°<HP|ÌHdlĀĈĔļ$,8`tŀňŠŨŰ <xƨư 4<ǀLj,<hpȄȌȔ$@Xhxɨɰɸ (8pxʈʴʼ HTxˀˠ˨ (0DT̐DXt̀͐͘͠8T`΄ΠΨδ \pόϔϜϨϸ 08@PXdДФ$<PdѤ (P҄Ұ $<HӐӨ t|Ը @pՌՠըհո 4dx֤֬$,DXdx׀׸(Pt؀ذش  @Xh٘٬ٴٸ@lڌڐڠڰ$,8\dxېۤ۰ۼ(\dܔܜܤܬܸ$,4<x݄ݨݰݴDtތޔި(@l|ߘ߼4Ht0Dd$,`p 08<PX HPd4L\ 8XpDt (`dDLTdt04@P,`p 0dl  Hx dl| PX$hp@4D|$4H`x0T\4T`,PXtx(0Phx$,<TdHdhp@Hd0@XHlt<L8@HPdp $HPX|  , 4 < H \ d D p      < D L \           $ , @ \ p         h t |      $ , \         L h t         0 @ X `         , H ` l       $ 0 H P t  ( 0 8 ` d t   8 T $ 8 H x , X x    , 8 P d        H P X l      , < T \ p       ( L      ( @ \ l       , D ` h |         $ , P        8 T \ p        8 H            4 L d l x      ( X |           8 @ X h       0 8 l t x        ( |     , 4 T h l p      < D H P `        0 @ p        ( 4 ` h         , @ x !( !D !P !d !l ! ! ! ! " "( "0 "@ "D "L "| " " " " " # #0 #8 #< #P #d # # # # # # $ $ $ $, $@ $x $ $ $ %$ %L %T %t % % % % & &8 &H &P &` &d &l & & ' ' '$ '` ' ' ' ' ' ' ( ( (4 (@ (L (h (p ( ( ( ( ( ( ( ), )4 )< )D )P )l ) ) ) ) ) ) * *8 *\ *h * * * * * + + + + +T +X +h + + + + + , , ,L , , , , , - -0 -P -p - - - - . . .( ., .8 .l .p .| . . . . . . / / /D /L /` /h /p / / / 0 0 08 0H 0P 0x 0 0 0 0 0 0 0 0 1 10 18 1L 1\ 1d 1h 1p 1| 1 1 1 1 2 2 2L 2T 2h 2l 2t 2x 2 2 2 2 2 3 3 3( 3` 3x 3 3 3 3 3 3 3 3 4 4 4< 4H 4X 4 4 4 4 4 4 4 4 5 58 5d 5l 5t 5 5 5 5 5 5 5 6 6 6 6( 6, 6< 6` 6h 6| 6 6 6 6 6 6 6 7 7 74 7\ 7p 7 7 7 7 8 8 8$ 88 8@ 8P 8 8 8 8 8 8 9 9 90 9D 9H 9P 9T 9d 9h 9 9 9 9 9 9 9 9 9 : : : : :P :T :l : : : : ; ; ;, ;< ;@ ;D ;\ ;` ; ; ; ; ; ; ; ; < < <$ >$ >, >4 >d >t > > > > ? ? ?D ?X ? ? ? ? ? @ @4 @X @ @ @ @ A A AL AT A` A A A B B@ B B B B B C C0 Cd Cl Ct C C D D8 Dp D D D D D D D D D E4 EH EP El Et E| E E E E E F F F FD Fp Ft F F F F F G G$ G\ Gh G G G G G G H8 H< HD HP H| H H H H H I I I, I\ Id It I I I I I J J< JD JT Jt J| J J J K K K K, K@ Kd Kp K K K K K K L L L@ LH Lt L| L L L L L M M M M$ ML Mp M M M M M M N, N4 Nl Nt N N N N N N O O O4 O< O` Oh Ox O O O O P P( P4 PX Pt P P P P P P Q Q0 Q8 QL QT Q Q Q Q Q Q R R R( RH Rh R R R R R R R S SX Sl S S S S T T T TD Th Tp Tt T| T T T T T U$ U, U@ Uh U U U U U U V V V< VD VX V V V V W W W@ WH Wh W W W W X X( X` X X X Y, Yl Y Y Y Z Z Z Z$ Z4 ZD Z Z Z Z [ [ [H [\ [ [ [ [ [ \ \ \D \l \ \ \ \ \ ] ]0 ]h ] ] ] ] ] ^4 ^P ^d ^l ^t ^ ^ ^ ^ ^ ^ _4 _l _ _ _ ` `8 `\ `d `t ` ` ` ` a a$ aX ap a a a a a a a b b b$ b0 b\ bt b| b b b c c$ cD cX c\ cd c c c c d d( d0 d8 dL d\ dd dt d d d d d d e e e, e@ eH eX e\ ed ex e e e e e e e e e e f( fX f\ fp f f g gH gP gT gh g g g g h h$ h@ hL hP h` hl hp h h h h i i( i, i< iX ih i i i i i i i j j j$ j0 j4 jD jT jd jt j j j j j j j j j k k< k@ kX k| k k k l l0 lT lx l l l m m m m4 m` md m m m m n n( nP nx n n n n n n o o0 oL oh o o o o o o o o p p0 p8 pP pp px p p p p p q q qD ql q q q q q r r( r8 rH rX rh rt r r r r r r r r s s s( sD sT sd st s s s s s s s s s t t t t( t\ t t t t t t t t u u u< uD uT ul u u u u u u u u u v v v$ v0 vT v v v v v v v w w w w$ w, wH wL wl w w w w w x x$ x, x< xD x\ x x x x x x x y4 y@ yh y y y y y y y z4 z@ zt z| z z z z z { {8 {H {x { { { { { { { { | |( |, |0 |L |P | | | | | } } }H }l }p } } } } } } } ~ ~ ~0 ~\ ~h ~ ~ ~ ~ ~ ~ ~ ~ ~  $ ( L `           D `  4 T p t  4 P ` l  4 D p x , 8 ` $ , \ , < l t  4 < P h   @ H x ( @ | T t  H X < ` l t  ( l  ( 0 T P p $ \ ( l ( 0 < p x    D X $ h l t T | ( , 4 H 4 < L \ < H L T h 0 4 < T d  T X \ d $ l D p t  H P l  < D X   $ 0 @ l t   $ L x   D x  ( 8 L  8 D L T  4 l 4 < h x ( 0 D h p 0 @ D X h   L T h ( T \ d 4 p  T \  0 \ d  4 H X l $ ` h p < D P X ` p ( \ ` p 4 l x   H x  4 D L T d t | H X d  H P T   X `  P `   T \  D L T 4 p  \  $ 4 `  ` < | D  H P X t € ˆ 0 l ð ø   D T | İ , 8 | ń ż   X d ƨ ư ( 0 8 D X ǜ Ǥ Ǹ 8 @ H T X p Ȁ Ȅ Ȉ Ȩ Ȭ ȴ   4 l ɤ  4 L P ` t ʈ ʜ ʬ ʰ ʸ  , 0 T X h ˔ ˤ ˬ ˴  0 4 @ \ d t ̔   < h t ̀ ͜ ͤ Ͱ ͸   < t Έ Ψ δ μ  0 8 ` | Ϥ ϴ  @ d t М  $ H h p | ш Ѥ Ѭ Ѹ  ( , 8 \ | ҄ Ҥ Ҩ Ұ ( 8 t ӄ Ӡ Ӭ Ӱ Ӹ    @ d p ԰ Ը  ( 0 X x Մ Ք $ < T X | ֌ ֠ ִ $ , 8 T d ׀ ׈ ט נ , X \ d p ؔ   ( P l  ( 0 T X d ڀ ڈ ڔ ژ ڬ ڰ ڴ ( < d ی ۬ ۰  0 X d l ܈ ܨ ܸ  0 @ ` d t x ݀ ݼ  < X p ތ ޴ $ H d h | ߄ ߴ  \ 4 T    $ , 0 8 H T x   ( P , @ ` 0 8 T p 0 P d  , 4 8 @ x  @ P |  $ 0 H P $ , < d l p x   @ T  ( @ P p x |   4 < L  4 < L   8 P d   0 @ P X  @ \ l 0 8 @ \ l t  $ D d l ( 4 h   T l  8 @ l  , H ` ( 0 \ d t  8 X x   $ @ l |  4 P \ ` x   @ H `   ( 0 @ d   4 ` | 8 h t x  , X `  8 d l       8 H d l         0 H P p         $ , 0 8 d     $ 4 H h       8 L \ l |           $ < t x         8 d        8 d $ ( 4 8 @ H P ` p  T \ t  $ ( 8 H X `  ( L ` l t    0 8 h |        0 H P d l p t x      8 \ x         ( 0 @ T |         0 H ` d x            H \         , D H \ t         ( < T l p            , L t        ( 0 8 H \ p       @ P x          $ ( 0 L X h     < h           8 < t x         < D H P          @ H \ x        4 L d |       $ < T X      @ l ! ! !@ !P !x ! ! ! ! ! ! " "0 "4 "@ "H "T "x " " " " " " # #$ #, #L #T #X #` #h # # # # # $ $ $$ $@ $\ $d $l $t $ $ $ $ $ %8 %X %h %p %t % % % % % & & &L &T &l &x & & & & & & ', 'P '` 'p ' ' ' ' ' ' ' (( (\ (l (p (x ( ( ( ( ( ( ( ( )( )< )D )h ) ) ) ) ) * * *0 *8 *H *L *\ *l *| * * * * * * + + + +$ +D + + + + + + , ,H ,P ,` , , , , , , - - -( -, -0 -D -X -x - - - . . . .( .P .l . . . . . . . / / /P /h /p / / / / 0 0$ 0, 08 0t 0 0 0 0 0 0 0 0 0 0 0 1 1 1, 10 18 1d 1 1 1 1 1 1 1 1 2 2 24 2T 2 2 2 2 2 3 3 3 3@ 3P 3X 3 3 3 3 3 3 4 4 4( 48 4< 4D 4T 4d 4| 4 4 4 4 5$ 54 5< 5@ 5H 5T 5X 5 5 5 5 5 5 5 6 6 6$ 68 6@ 6P 6 6 6 6 6 7 7 7( 7< 7@ 7X 7h 7l 7 7 7 7 7 7 8 8< 8 8 8 8 8 8 9 9( 9@ 9l 9| 9 9 9 9 9 : : : :0 :L :T :d :h :| : : : : : ; ;, ;P ;` ;| ; ; ; ; ; ; ; ; ; < < <$ <<  >H >X >\ >d >h > > > > ? ? ? ?0 ?X ?p ? ? ? ? ? ? ? ? ? @ @$ @8 @H @P @l @x @ @ @ @ @ @ @ A A, A4 A@ AD AL AT A A A A B B B4 B@ B\ Bh Bx B B C0 C` C| C C C C C C D DD DT Dh D D D D D D D E E E( E< ED ET Ed Ep E E E E F F FL Fx F F F G G4 G< G\ G G G G G G H H H( HX H` Hd Hl Ht H H H H H H I I I, ID I\ Id Ip I I I I I J J JH Jd Jl J| J J J J J J K K KD KL K K K K K K K L L0 LX L L L L L M M M M$ M, M< MH Mh Mp M M M M M N4 NP NX N| N N N N N N N N O O O( OT O\ O O O O O O O O P P PL PT Pd P P P P P Q QT Qd Qt Q Q Q Q Q R, RH RT R` R R S S, S< S\ Sh S S S S T T T, T0 T< TD TT Tl T T T T T U U U UT Up Ux U U U U U U V( VD VL Vt V V V V V V W( WD WL W| W W W W W W W W X X( XL X\ Xd Xl X X X X X Y Y Y8 Y@ YH Y\ Yh Yt Yx Y Y Y Y Y Y Z$ Z, ZX Z` Zh Z| Z Z [ [ [ [8 [L [T [d [t [ [ [ [ [ [ \$ \8 \T \x \ \ \ \ \ \ \ \ \ ] ], ]@ ]d ]t ] ] ] ] ] ] ] ^ ^, ^4 ^< ^h ^t ^ ^ ^ ^ ^ _ _ _ _ _ _8 _@ _P L T h   8 @ T t |   0 \ p x   , X l t   4 < L h p  $ , < X ` h t  ( 4 L T ` x   0 8 H d l   , H P \ x   0 8 H `   , H P \  , D H P \ p   ( < p ` d p | @ w w x x x, x4 x< xL xl x| x x x x x x y y y y4 y< yh y| y y y y y y z z z$ z< zl zx z z z z z z z { { { {P {| { { { { |( |P |T |h | | | | | | | | | } }( }, }P } } } } } } } } ~ ~D ~t ~x ~ ~ ~ ~ ~ ~ ~  8 ` t          4 @ T t  ( T  < T @ X | L `  L P \ ` h l |  < `  0 4 < H L |  0 D X |  , 0 8 L \ d |  8 l    < p t | 8 < X x  8 L h t  $ < T  0 P l  ( @ T l  0 D t  D \ x  ( D    ( X l  @ T d  0 4      , @ h | 8 D p x  L $ X h p  @ H x $ , 4 L ` h   , D  < P X d |  H T t | 4 < D T h |  ( @ ` | 8 h  < p     L x      ( ` p x         $ , 4 @ L \ l |      @ t |        X       ( 4 < H T d l x         0 D X ` p           $ 4 H L h  < X \ | ( D ` |  $ @ \ x  < X t   8 T p       4 P l         ( < D X x     $ 4 < d x        < X      @ T d t |        ( T h        4 L T X h     < D H X |      ( 8 h p      ( D T ` x    L |        , 4 \         0 L d |       < p     $ 8 L ` t          < `         L h         H ! !8 !` ! ! ! ! ! ! ! " "( "L "\ " " " " " " " " " # # #8 #L #\ #h #l #t # # # # # # $ $( $, $H $h $ $ $ $ $ $ % %$ %8 %D %L %X %\ %d %l % % & & &4 &H &P &d &l &t & & & & ' '( '4 '8 '@ 'd '| ' ' ( ($ (0 (8 (@ (L ( ( ( ( ( ( ( ) )( )H )X )` )x ) ) ) ) ) ) ) * * *D *X *t * * * * * + +< +D +p + + + + + , ,0 ,H ,d , , , , , , - -H -p - - - - - - . ., .X .t . . . . . . / /L /x / / / / 0 00 0\ 0 0 0 0 0 0 1 10 1L 1x 1 1 1 2 2$ 28 2T 2l 2 2 2 2 2 2 2 2 2 3 3 3 38 3L 3 3 3 3 3 4 40 48 4d 4x 4 4 4 4 4 5 5, 5T 5 5 5 5 5 5 6 6< 6d 6x 6 6 6 6 6 6 7 7< 7\ 7 7 7 7 7 8 8 84 8P 8h 8t 8 8 8 8 8 9 9( 9L 9` 9h 9l 9 9 9 9 :, :T : : : : ; ;( ;@ ;p ; ; ; ; ; < <@  > >4 >L >t > > > > > ? ? ?0 ?@ ?l ? ? ? @ @ @D @X @ @ @ @ @ A A A A( AT Ah A A A A B B B< Bh B B B B C C, C0 CD CX C` C C C D D< Dp D D D E, E0 Ed E E E F F F$ F, F| F F G G< G\ G G G G H( H@ H` Ht H H H H H H I I$ I@ IL I` I| I I I J Jd J J J K K K$ KX K` K K K K L L L L( L, L4 Lx L L L M M M$ Md Mt M M M M M N N( NP NT Nh Nt N| N N N N O O4 O8 O@ OD OH OP O O O O P PP Pd P P P P Q Q Q4 Q\ Q` Qt Q Q Q Q Q R R$ RT RX R` Rd R R R R R S S< SX S\ Sd S S S S T T4 T` Tt T T T T U U0 U4 U< UL Ux U U U U V V V< VT Vh Vp V V V V V V W W W$ W4 WH WL WP Wd W W W W W W W X X X( X@ XP XT Xt X X X X Y Y Y, Y4 YX Y\ Y` Yh Y Y Y Y Y Y Z Z Z, Z< ZD ZP Zp Z Z Z Z Z Z [ [ [ [4 [H [L [P [X [l [| [ [ [ \ \8 \H \L \P \X \d \h \| \ \ \ \ \ \ ] ]\ ]` ] ] ] ^ ^8 ^< ^T ^ ^ ^ ^ ^ ^ ^ _< _| _ _ `4 `@ `D `` ` ` ` a, at a a a b bH bL bX bp bt b b b b b b b b c c c c4 cL ct c c c c c c c c c d d d$ dH d\ dl dp dt d d d d d d e e e( e0 e\ e` ep e| e e e e e e e e f f$ f8 fH fL fP f\ f| f f f f f g g g g( g\ g g g g g h h$ h@ ht h h h h i i i i, i0 i4 i@ id ip i i i i i j j j$ j( j, j8 j\ jh j j j j j k k k k0 kX kx k| k k k l l8 lP ll l l l l l l l m m4 m8 m< mL mx m m m m n n, nP nd nx n n n n n n n n o o o o0 ol o o o o p p8 pd p| p p p p p p q q q0 qL q q q q q r r r8 rL rX r r r r s s s$ s( sT st s s s s s s t t( t8 tH tT th tt t t t t t u u8 u` u u u u u u v v v4 v@ vX vt v v v v v v v v w w0 wL wp w w w w w w w x x$ xD xX x x x x x x x x y y4 yL yT y` yh y| y y y y y y y z z z z( z@ zT zX zh z z z z z { { {4 {T {p {t { { { { { { | | | |$ |X |t |x | | | | } }T } } } } } } } } ~ ~ ~( ~, ~H ~\ ~ ~ ~   , `      , H l  T  ( @ D x < h  T \ ` h  < H d  8 d  ( L h | H L p ( P 0 L P ` | $ D \   $ 0 D d x  , 8 D H L \ x  4 H ` t  $ 8 P d p  ( < H L P \ x   $ ( < P \ t  8 l |   0 D x  8 L l |  4 X t ( < @ D x   $ @ T X x    ( D X l p  H P h t  0 ` t  < P \ ` < X  ( , 0 < H L \ x  < P x  ( \ ` l  4 T h  D h x $ T  D H h @ L x  0 < @ D P h    $ @ L d  , L  ( D \ l    4 ` | D H p  < P l t   ( , 0 @ ` |  , 0 4 < T d p  < T t    4 H L ` d  ( @ D H T p , T p   0 < @ d 8 < P T d  ( T ` d h  $ @ L P l D H \ ` |  ( 8 H p t x  $ 4 D \ l 8 < h , 0 d h t x | $ P T $ T X x 4 x  8 T X l 4 8 X | , < H L D p t xQ_FULL_F q_e_fQ_FULL_T!q_fullQ_EMPT_F q_e_fQ_EMPT_T q_lenQ_FULL_F q_fullQ_FULL_T!q_fullQ_EMPT_F !q_lenQ_EMPT_T q_len  initializer in parameter list:root:max nr of processes is 255 undeclared variable %sneed constant initializer for %s :root:claim %s redefinedtrace %s redefinedtypedef %s must be globalinvalid use of '%s'label preceding declaration,label predecing xr/xs claim,malformed declarationcannot %s mtype (ignored)mtype declaration must be globalwidth-field %s too largeundeclared variable: %snot an eventbad label-name %sbad label-name %sarithmetic on chanarithmetic on chan id'sused 'run' outside proctypeinvalid PROVIDED clauseusage: provided ( ..expr.. )unsigned cannot be used as mesg typesyntax errormemory exhaustedprocedure name %s redefinedcannot happen, missing inline def %sexpecting '[Un]Matched', saw %sc_state format (%s)array initialization error, c_state (%s)+++dereferencing state object: %sinvalid variable ref in '%s'c_expr %s has side-effectsinline fcts too deeply nestedwrong nr of params on call of '%s'cyclic inline attempt on: %smalformed preprocessor directive - # .malformed preprocessor directive - # .linenomalformed preprocessor directive - .fnamemalformed preprocessor directive - .fnamemalformed preprocessor directive - fname.cannot happenbad param to inline %s--bad inline: %sinline text too longstring not terminatedcharacter quote missing: %sformal par of %s contains replacement valueactiveassertatomicbitboolbreakbytec_codec_declc_exprc_statec_trackD_proctypedochanelseemptyenabledevalfalsefifullgotohidden:hide:ifinit:init:intlenlocal:local:mtypenemptynever:never:nfullnotrace:notrace:np_odofpc_valuepidprintfprintmpriorityproctypeprovidedrund_stepinlineshortskiptimeouttrace:trace:trueshow:show:typedefunlessunsignedxrxsbitbyteredeclaration of '%s'(%s) has invalid width-fieldunsigned without width-field(%s) only an unsigned can have width-fieldbit variable (%s) cannot be hiddenchan initializer for non-channel %sbad array size for '%s'conflicting claims on chan '%s'stdinnon-local x[rs] assertionxr or xs of non-chan '%s'bad mtype definitionname %s appears twice in mtype declarationtoo many mtype elements (>255) never used under this nameexported as run parameterimported as proctype parameterused as l-value in asgnmntused as r-value in asgnmntpolled in receive stmntused as parameter in receive stmntused as parameter in send stmntreceived fromsent toattempt to read value of '_'self-reference initializing '%s'undecl var %s (assuming int)cannot happen, cast_valvalue (%s) truncated in assignment setq_claim("", h, onoffonoffonoffonoffonoffSpin Version 5.2.5 -- 17 April 2010Spin Version 5.2.5 -- 17 April 2010__p_pid_last_nr_prnofilenamenot enough memorynever claim contains i/o stmntsincompatible with separate compilationenabled()pc_value()spin: Error, using np_ outside never claim _p/usr/ccs/lib/cppSpin Version 5.2.5 -- 17 April 2010msccannot create file '%s'Spin Version 5.2.5 -- 17 April 2010--mscmsccannot open trail filemscaborting%%%%Pages: (atend)%%%%PageOrder: Ascend%%%%DocumentData: Clean7Bit%%%%Orientation: Portrait%%%%DocumentNeededResources: font Courier-Bold%%%%EndComments%%%%BeginProlog50 dict begin/baseline 0 def/height 0 def/justify 0 def/lineLength 0 def/spacing 0 def/stipple 0 def/strings 0 def/xoffset 0 def/yoffset 0 def/ISOEncode { dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Temporary exch definefont} bind def/AdjustColor { CL 2 lt { currentgray CL 0 eq { .5 lt {0} {1} ifelse } if setgray } if} bind def/DrawText { /stipple exch def /justify exch def /yoffset exch def /xoffset exch def /spacing exch def /strings exch def /lineLength 0 def strings { stringwidth pop dup lineLength gt {/lineLength exch def} {pop} ifelse newpath } forall 0 0 moveto (TXygqPZ) false charpath pathbbox dup /baseline exch def exch pop exch sub /height exch def pop newpath translate lineLength xoffset mul strings length 1 sub spacing mul height add yoffset mul translate justify lineLength mul baseline neg translate strings { dup stringwidth pop justify neg mul 0 moveto stipple { gsave /char (X) def { char 0 3 -1 roll put currentpoint gsave char true charpath clip StippleText grestore char stringwidth translate moveto } forall grestore } {show} ifelse 0 spacing neg translate } forall} bind def%%%%EndProlog%%%%BeginSetup/CL 2 def%%%%IncludeResource: font Courier-Bold%%%%EndSetuptoo many queues (%s)too many channel typesinvalid use of STDIN%sSend ->sendSend ->Recv [Recv] <-recvRecv [Recv] <-rv-sendSent ->Sent ->cannot happen, s_sndRecv <-Recv <-?!mtype name %s too longinvalid asgn to chaninvalid use of chan namedo not index an array with itself (%s)attempt to assign value to system variable %sjump into d_step sequence-non_local jump in d_step sequencesequence must have at least one statementunexpected: loose endsduplicate `else'cannot happen - if_seqdubious use of 'else' combined with i/o,unexpected unless structurelabel %s redeclaredundefined label %scannot happen - mov_lab %sunknown label '%s'fix_dest error (%s)cannot reference label inside atomic or d_step (%s)misplaced break statementd_stepatomic--parsing error, no sequence %s--wrong number of parameters0::never:escannot happen - weightsstmnt in d_step blocksterminates timeout rv-attempt in d_step sequencesaw preinitialized struct %ssetlocals: cannot happen '%s'missing actual parameters: '%s'array in parameter list, %s%sindexing array '%s'-not a labelname: '%s'remote ref to label '%s' inside d_stepunknown labelname: %srefers to wrong proctype '%s'%s not foundassignmentassertion violatedabortingtoo few print args %sbad print cmd: '%s'printf string too longused: enabled(pid=thisproc) [%s],np_logval("- = ; = ; now.", now.); now. = ; cannot hide non-globals (%s)cannot hide channels (%s)cannot happen Air %sarray in parameter list, %shidden array in parameter %slogval("confusing control structureconfusing control structureundeclared structure element %svariable %s undeclaredbad channel spec /* =rv= */ /* =rv= */#if defined(VERI) && !defined(NOREDUCE) && !defined(NP) if (!state_tables#ifdef HAS_CODE && !readtrail#endif#if NCORE>1 && core_id == 0#endif ) { printf("warning: for p.o. reduction to be valid "); printf("the never claim must be stutter-invariant\n"); printf("(never claims generated from LTL "); printf("formulae are stutter-invariant)\n"); }#endif UnBlock; /* disable rendez-vous */#ifdef BITSTATE if (udmem) { udmem *= 1024L*1024L; #if NCORE>1 if (!readtrail) { void init_SS(unsigned long); init_SS((unsigned long) udmem); } else #endif SS = (uchar *) emalloc(udmem); bstore = bstore_mod; } else #if NCORE>1 { void init_SS(unsigned long); init_SS(ONE_L<<(ssize-3)); } #else SS = (uchar *) emalloc(ONE_L<<(ssize-3)); #endif#else hinit();#endif#if defined(FULLSTACK) && defined(BITSTATE) onstack_init();#endif#if defined(CNTRSTACK) && !defined(BFS) LL = (uchar *) emalloc(ONE_L<<(ssize-3));#endif stack = ( Stack *) emalloc(sizeof(Stack)); svtack = (Svtack *) emalloc(sizeof(Svtack)); /* a place to point for Pptr of non-running procs: */ noptr = (uchar *) emalloc(Maxbody * sizeof(char));#if defined(SVDUMP) && defined(VERBOSE) if (vprefix > 0) (void) write(svfd, (uchar *) &vprefix, sizeof(int));#endif#ifdef VERI Addproc(VERI); /* never - pid = 0 */#endif active_procs(); /* started after never */#ifdef EVENT_TRACE now._event = start_event; reached[EVENT_TRACE][start_event] = 1;#endif#ifdef HAS_CODE globinit();#endif#ifdef BITSTATEgo_again:#endif do_the_search();#ifdef BITSTATE if (--Nrun > 0 && HASH_CONST[++HASH_NR]) { printf("Run %%d:\n", HASH_NR); wrap_stats(); printf("\n"); if (udmem) /* Dillinger 3/2/09 */ { memset(SS, 0, udmem); } else { memset(SS, 0, ONE_L<<(ssize-3)); }#ifdef CNTRSTACK memset(LL, 0, ONE_L<<(ssize-3));#endif#ifdef FULLSTACK memset((uchar *) S_Tab, 0, maxdepth*sizeof(struct H_el *));#endif nstates=nlinks=truncs=truncs2=ngrabs = 0; nlost=nShadow=hcmp = 0; Fa=Fh=Zh=Zn = 0; PUT=PROBE=ZAPS=Ccheck=Cholds = 0; goto go_again; }#endif}#ifdef HAS_PROVIDEDint provided(int, uchar, int, Trans *);#endif#if NCORE>1#define GLOBAL_LOCK (0)#ifndef CS_N#define CS_N (256*NCORE)#endif#ifdef NGQ#define NR_QS (NCORE)#define CS_NR (CS_N+1) /* 2^N + 1, nr critical sections */#define GQ_RD GLOBAL_LOCK#define GQ_WR GLOBAL_LOCK#define CS_ID (1 + (int) (j1_spin & (CS_N-1))) /* mask: 2^N - 1, zero reserved */#define QLOCK(n) (1+n)#else#define NR_QS (NCORE+1)#define CS_NR (CS_N+3)#define GQ_RD (1)#define GQ_WR (2)#define CS_ID (3 + (int) (j1_spin & (CS_N-1)))#define QLOCK(n) (3+n)#endifvoid e_critical(int);void x_critical(int);#ifndef SEP_STATE #define enter_critical(w) e_critical(w) #define leave_critical(w) x_critical(w)#else #ifdef NGQ #define enter_critical(w) { if (w < 1+NCORE) e_critical(w); } #define leave_critical(w) { if (w < 1+NCORE) x_critical(w); } #else #define enter_critical(w) { if (w < 3+NCORE) e_critical(w); } #define leave_critical(w) { if (w < 3+NCORE) x_critical(w); } #endif#endifintcpu_printf(const char *fmt, ...){ va_list args; enter_critical(GLOBAL_LOCK); /* printing */ printf("cpu%%d: ", core_id); fflush(stdout); va_start(args, fmt); vprintf(fmt, args); va_end(args); fflush(stdout); leave_critical(GLOBAL_LOCK); return 1;}#elseintcpu_printf(const char *fmt, ...){ va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); return 1;}#endifintPrintf(const char *fmt, ...){ /* Make sure the args to Printf * are always evaluated (e.g., they * could contain a run stmnt) * but do not generate the output * during verification runs * unless explicitly wanted * If this fails on your system * compile SPIN itself -DPRINTF * and this code is not generated */#ifdef HAS_CODE if (readtrail) { va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); return 1; }#endif#ifdef PRINTF va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args);#endif return 1;}extern void printm(int);#ifndef SC#define getframe(i) &trail[i];#elsestatic long HHH, DDD, hiwater;static long CNT1, CNT2;static int stackwrite;static int stackread;static Trail frameptr;Trail *getframe(int d){ if (CNT1 == CNT2) return &trail[d]; if (d >= (CNT1-CNT2)*DDD) return &trail[d - (CNT1-CNT2)*DDD]; if (!stackread && (stackread = open(stackfile, 0)) < 0) { printf("getframe: cannot open %%s\n", stackfile); wrapup(); } if (lseek(stackread, d* (off_t) sizeof(Trail), SEEK_SET) == -1 || read(stackread, &frameptr, sizeof(Trail)) != sizeof(Trail)) { printf("getframe: frame read error\n"); wrapup(); } return &frameptr;}#endif#if !defined(SAFETY) && !defined(BITSTATE)#if !defined(FULLSTACK) || defined(MA)#define depth_of(x) A_depth /* an estimate */#elseintdepth_of(struct H_el *s){ Trail *t; int d; for (d = 0; d <= A_depth; d++) { t = getframe(d); if (s == t->ostate) return d; } printf("pan: cannot happen, depth_of\n"); return depthfound;}#endif#endif#if NCORE>1extern void cleanup_shm(int);volatile unsigned int *search_terminated; /* to signal early termination */#endifvoidpan_exit(int val){ void stop_timer(void); if (signoff) { printf("--end of output--\n"); }#if NCORE>1 if (search_terminated != NULL) { *search_terminated |= 1; /* pan_exit */ }#ifdef USE_DISK { void dsk_stats(void); dsk_stats(); }#endif if (!state_tables && !readtrail) { cleanup_shm(1); }#endif if (val == 2) { val = 0; } else { stop_timer(); }#ifdef C_EXIT C_EXIT; /* trust that it defines a fct */#endif exit(val);}#ifdef HAS_CODEchar *transmognify(char *s){ char *v, *w; static char buf[2][2048]; int i, toggle = 0; if (!s || strlen(s) > 2047) return s; memset(buf[0], 0, 2048); memset(buf[1], 0, 2048); strcpy(buf[toggle], s); while ((v = strstr(buf[toggle], "{c_code"))) { *v = '\0'; v++; strcpy(buf[1-toggle], buf[toggle]); for (w = v; *w != '}' && *w != '\0'; w++) /* skip */; if (*w != '}') return s; *w = '\0'; w++; for (i = 0; code_lookup[i].c; i++) if (strcmp(v, code_lookup[i].c) == 0 && strlen(v) == strlen(code_lookup[i].c)) { if (strlen(buf[1-toggle]) + strlen(code_lookup[i].t) + strlen(w) > 2047) return s; strcat(buf[1-toggle], code_lookup[i].t); break; } strcat(buf[1-toggle], w); toggle = 1 - toggle; } buf[toggle][2047] = '\0'; return buf[toggle];}#elsechar * transmognify(char *s) { return s; }#endif#ifdef HAS_CODEvoidadd_src_txt(int ot, int tt){ Trans *t; char *q; for (t = trans[ot][tt]; t; t = t->nxt) { printf("\t\t"); q = transmognify(t->tp); for ( ; q && *q; q++) if (*q == '\n') printf("\\n"); else putchar(*q); printf("\n"); }}voidwrap_trail(void){ static int wrap_in_progress = 0; int i; short II; P0 *z; if (wrap_in_progress++) return; printf("spin: trail ends after %%ld steps\n", depth); if (onlyproc >= 0) { if (onlyproc >= now._nr_pr) { pan_exit(0); } II = onlyproc; z = (P0 *)pptr(II); printf("%%3ld: proc %%d (%%s) ", depth, II, procname[z->_t]); for (i = 0; src_all[i].src; i++) if (src_all[i].tp == (int) z->_t) { printf(" line %%3d", src_all[i].src[z->_p]); break; } printf(" (state %%2d)", z->_p); if (!stopstate[z->_t][z->_p]) printf(" (invalid end state)"); printf("\n"); add_src_txt(z->_t, z->_p); pan_exit(0); } printf("#processes %%d:\n", now._nr_pr); if (depth < 0) depth = 0; for (II = 0; II < now._nr_pr; II++) { z = (P0 *)pptr(II); printf("%%3ld: proc %%d (%%s) ", depth, II, procname[z->_t]); for (i = 0; src_all[i].src; i++) if (src_all[i].tp == (int) z->_t) { printf(" line %%3d", src_all[i].src[z->_p]); break; } printf(" (state %%2d)", z->_p); if (!stopstate[z->_t][z->_p]) printf(" (invalid end state)"); printf("\n"); add_src_txt(z->_t, z->_p); } c_globals(); for (II = 0; II < now._nr_pr; II++) { z = (P0 *)pptr(II); c_locals(II, z->_t); }#ifdef ON_EXIT ON_EXIT;#endif pan_exit(0);}FILE *findtrail(void){ FILE *fd; char fnm[512], *q; char MyFile[512]; char MySuffix[16]; int try_core; int candidate_files; if (trailfilename != NULL) { fd = fopen(trailfilename, "r"); if (fd == NULL) { printf("pan: cannot find %%s\n", trailfilename); pan_exit(1); } /* else */ goto success; }talk: try_core = 1; candidate_files = 0; tprefix = "trail"; strcpy(MyFile, TrailFile); do { /* see if there's more than one possible trailfile */ if (whichtrail) { sprintf(fnm, "%%s%%d.%%s", MyFile, whichtrail, tprefix); fd = fopen(fnm, "r"); if (fd != NULL) { candidate_files++; if (verbose==100) printf("trail%%d: %%s\n", candidate_files, fnm); fclose(fd); } if ((q = strchr(MyFile, '.')) != NULL) { *q = '\0'; sprintf(fnm, "%%s%%d.%%s", MyFile, whichtrail, tprefix); *q = '.'; fd = fopen(fnm, "r"); if (fd != NULL) { candidate_files++; if (verbose==100) printf("trail%%d: %%s\n", candidate_files, fnm); fclose(fd); } } } else { sprintf(fnm, "%%s.%%s", MyFile, tprefix); fd = fopen(fnm, "r"); if (fd != NULL) { candidate_files++; if (verbose==100) printf("trail%%d: %%s\n", candidate_files, fnm); fclose(fd); } if ((q = strchr(MyFile, '.')) != NULL) { *q = '\0'; sprintf(fnm, "%%s.%%s", MyFile, tprefix); *q = '.'; fd = fopen(fnm, "r"); if (fd != NULL) { candidate_files++; if (verbose==100) printf("trail%%d: %%s\n", candidate_files, fnm); fclose(fd); } } } tprefix = MySuffix; sprintf(tprefix, "cpu%%d_trail", try_core++); } while (try_core <= NCORE); if (candidate_files != 1) { if (verbose != 100) { printf("error: there are %%d trail files:\n", candidate_files); verbose = 100; goto talk; } else { printf("pan: rm or mv all except one\n"); exit(1); } } try_core = 1; strcpy(MyFile, TrailFile); /* restore */ tprefix = "trail";try_again: if (whichtrail) { sprintf(fnm, "%%s%%d.%%s", MyFile, whichtrail, tprefix); fd = fopen(fnm, "r"); if (fd == NULL && (q = strchr(MyFile, '.'))) { *q = '\0'; sprintf(fnm, "%%s%%d.%%s", MyFile, whichtrail, tprefix); *q = '.'; fd = fopen(fnm, "r"); } } else { sprintf(fnm, "%%s.%%s", MyFile, tprefix); fd = fopen(fnm, "r"); if (fd == NULL && (q = strchr(MyFile, '.'))) { *q = '\0'; sprintf(fnm, "%%s.%%s", MyFile, tprefix); *q = '.'; fd = fopen(fnm, "r"); } } if (fd == NULL) { if (try_core < NCORE) { tprefix = MySuffix; sprintf(tprefix, "cpu%%d_trail", try_core++); goto try_again; } printf("pan: cannot find trailfile %%s\n", fnm); pan_exit(1); }success:#if NCORE>1 && defined(SEP_STATE) { void set_root(void); /* for partial traces from local root */ set_root(); }#endif return fd;}uchar do_transit(Trans *, short);voidgetrail(void){ FILE *fd; char *q; int i, t_id, lastnever=-1; short II; Trans *t; P0 *z; fd = findtrail(); /* exits if unsuccessful */ while (fscanf(fd, "%%ld:%%d:%%d\n", &depth, &i, &t_id) == 3) { if (depth == -1) printf("<<<<>>>>\n"); if (depth < 0) continue; if (i > now._nr_pr) { printf("pan: Error, proc %%d invalid pid ", i); printf("transition %%d\n", t_id); break; } II = i; z = (P0 *)pptr(II); for (t = trans[z->_t][z->_p]; t; t = t->nxt) if (t->t_id == (T_ID) t_id) break; if (!t) { for (i = 0; i < NrStates[z->_t]; i++) { t = trans[z->_t][i]; if (t && t->t_id == (T_ID) t_id) { printf("\tRecovered at state %%d\n", i); z->_p = i; goto recovered; } } printf("pan: Error, proc %%d type %%d state %%d: ", II, z->_t, z->_p); printf("transition %%d not found\n", t_id); printf("pan: list of possible transitions in this process:\n"); if (z->_t >= 0 && z->_t <= _NP_) for (t = trans[z->_t][z->_p]; t; t = t->nxt) printf(" t_id %%d -- case %%d, [%%s]\n", t->t_id, t->forw, t->tp); break; /* pan_exit(1); */ }recovered: q = transmognify(t->tp); if (gui) simvals[0] = '\0'; this = pptr(II); trpt->tau |= 1; if (!do_transit(t, II)) { if (onlyproc >= 0 && II != onlyproc) goto moveon; printf("pan: error, next transition UNEXECUTABLE on replay\n"); printf(" most likely causes: missing c_track statements\n"); printf(" or illegal side-effects in c_expr statements\n"); } if (onlyproc >= 0 && II != onlyproc) goto moveon; if (verbose) { printf("%%3ld: proc %%2d (%%s) ", depth, II, procname[z->_t]); for (i = 0; src_all[i].src; i++) if (src_all[i].tp == (int) z->_t) { printf(" line %%3d \"%%s\" ", src_all[i].src[z->_p], PanSource); break; } printf("(state %%d) trans {%%d,%%d} [%%s]\n", z->_p, t_id, t->forw, q?q:""); c_globals(); for (i = 0; i < now._nr_pr; i++) { c_locals(i, ((P0 *)pptr(i))->_t); } } else if (strcmp(procname[z->_t], ":never:") == 0) { if (lastnever != (int) z->_p) { for (i = 0; src_all[i].src; i++) if (src_all[i].tp == (int) z->_t) { printf("MSC: ~G %%d\n", src_all[i].src[z->_p]); break; } if (!src_all[i].src) printf("MSC: ~R %%d\n", z->_p); } lastnever = z->_p; goto sameas; } else if (strcmp(procname[z->_t], ":np_:") != 0) {sameas: if (no_rck) goto moveon; if (coltrace) { printf("%%ld: ", depth); for (i = 0; i < II; i++) printf("\t\t"); printf("%%s(%%d):", procname[z->_t], II); printf("[%%s]\n", q?q:""); } else if (!silent) { if (strlen(simvals) > 0) { printf("%%3ld: proc %%2d (%%s)", depth, II, procname[z->_t]); for (i = 0; src_all[i].src; i++) if (src_all[i].tp == (int) z->_t) { printf(" line %%3d \"%%s\" ", src_all[i].src[z->_p], PanSource); break; } printf("(state %%d) [values: %%s]\n", z->_p, simvals); } printf("%%3ld: proc %%2d (%%s)", depth, II, procname[z->_t]); for (i = 0; src_all[i].src; i++) if (src_all[i].tp == (int) z->_t) { printf(" line %%3d \"%%s\" ", src_all[i].src[z->_p], PanSource); break; } printf("(state %%d) [%%s]\n", z->_p, q?q:""); /* printf("\n"); */ } }moveon: z->_p = t->st; } wrap_trail();}#endifintf_pid(int pt){ int i; P0 *z; for (i = 0; i < now._nr_pr; i++) { z = (P0 *)pptr(i); if (z->_t == (unsigned) pt) return BASE+z->_pid; } return -1;}#ifdef VERIvoid check_claim(int);#endif#if !defined(HASH64) && !defined(HASH32) #if WS>4 #define HASH64 #else #define HASH32 #endif#endif#if defined(HASH32) && defined(SAFETY) && !defined(SFH) && !defined(SPACE) #define SFH#endif#if defined(SFH) && (defined(BITSTATE) || defined(COLLAPSE) || defined(HC) || defined(HASH64) || defined(MA)) #undef SFH#endif#if defined(SFH) && !defined(NOCOMP) #define NOCOMP /* go for speed */#endif#if NCORE>1 && !defined(GLOB_HEAP) #define SEP_HEAP /* version 5.1.2 */#endif#ifdef BITSTATEintbstore_mod(char *v, int n) /* hasharray size not a power of two */{ unsigned long x, y; unsigned int i = 1; d_hash((uchar *) v, n); /* sets j3, j4, K1, K2 */ x = K1; y = j3; for (;;) { if (!(SS[x%%udmem]&(1< RANDSTOR) return 0;#endif for (;;) { SS[x%%udmem] |= (1< RANDSTOR) return 0;#endif for (;;) { SS[x] |= (1< 0) { sprintf(fnm, "%%s%%d.%%s", MyFile, Nr_Trails-1, tprefix); } else {#ifdef PUTPID sprintf(fnm, "%%s_%%s_%%d.%%s", MyFile, progname, getpid(), tprefix);#else sprintf(fnm, "%%s.%%s", MyFile, tprefix);#endif } if ((fd = open(fnm, w_flags, TMODE)) < 0) { if ((q = strchr(MyFile, '.'))) { *q = '\0'; if (iterative == 0 && Nr_Trails-1 > 0) sprintf(fnm, "%%s%%d.%%s", MyFile, Nr_Trails-1, tprefix); else sprintf(fnm, "%%s.%%s", MyFile, tprefix); *q = '.'; fd = open(fnm, w_flags, TMODE); } } if (fd < 0) { printf("pan: cannot create %%s\n", fnm); perror("cause"); } else {#if NCORE>1 && (defined(SEP_STATE) || !defined(FULL_TRAIL)) void write_root(void); write_root();#else printf("pan: wrote %%s\n", fnm);#endif } return fd;}#ifndef FREQ#define FREQ (1000000)#endifdouble freq = (double) FREQ;#ifdef BFS#define Q_PROVISO#ifndef INLINE_REV#define INLINE_REV#endiftypedef struct SV_Hold { State *sv; int sz; struct SV_Hold *nxt;} SV_Hold;typedef struct EV_Hold { char *sv; int sz; int nrpr; int nrqs; char *po; char *qo; char *ps, *qs; struct EV_Hold *nxt;} EV_Hold;typedef struct BFS_Trail { Trail *frame; SV_Hold *onow; EV_Hold *omask;#ifdef Q_PROVISO struct H_el *lstate;#endif short boq; struct BFS_Trail *nxt;} BFS_Trail;BFS_Trail *bfs_trail, *bfs_bot, *bfs_free;SV_Hold *svhold, *svfree;#ifdef BFS_DISK#ifndef BFS_LIMIT #define BFS_LIMIT 100000#endif#ifndef BFS_DSK_LIMIT #define BFS_DSK_LIMIT 1000000#endif#if defined(WIN32) || defined(WIN64) #define RFLAGS (O_RDONLY|O_BINARY) #define WFLAGS (O_CREAT|O_WRONLY|O_TRUNC|O_BINARY)#else #define RFLAGS (O_RDONLY) #define WFLAGS (O_CREAT|O_WRONLY|O_TRUNC)#endiflong bfs_size_limit;int bfs_dsk_write = -1;int bfs_dsk_read = -1;long bfs_dsk_writes, bfs_dsk_reads;int bfs_dsk_seqno_w, bfs_dsk_seqno_r;#endifuchar do_reverse(Trans *, short, uchar);void snapshot(void);SV_Hold *getsv(int n){ SV_Hold *h = (SV_Hold *) 0, *oh; oh = (SV_Hold *) 0; for (h = svfree; h; oh = h, h = h->nxt) { if (n == h->sz) { if (!oh) svfree = h->nxt; else oh->nxt = h->nxt; h->nxt = (SV_Hold *) 0; break; } if (n < h->sz) { h = (SV_Hold *) 0; break; } /* else continue */ } if (!h) { h = (SV_Hold *) emalloc(sizeof(SV_Hold)); h->sz = n;#ifdef BFS_DISK if (bfs_size_limit >= BFS_LIMIT) { h->sv = (State *) 0; /* means: read disk */ bfs_dsk_writes++; /* count */ if (bfs_dsk_write < 0 /* file descriptor */ || bfs_dsk_writes%%BFS_DSK_LIMIT == 0) { char dsk_nm[32]; if (bfs_dsk_write >= 0) { (void) close(bfs_dsk_write); } sprintf(dsk_nm, "pan_bfs_%%d.tmp", bfs_dsk_seqno_w++); bfs_dsk_write = open(dsk_nm, WFLAGS, 0644); if (bfs_dsk_write < 0) { Uerror("could not create tmp disk file"); } printf("pan: created disk file %%s\n", dsk_nm); } if (write(bfs_dsk_write, (char *) &now, n) != n) { Uerror("aborting -- disk write failed (disk full?)"); } return h; /* no memcpy */ } bfs_size_limit++;#endif h->sv = (State *) emalloc(sizeof(State) - VECTORSZ + n); } memcpy((char *)h->sv, (char *)&now, n); return h;}EV_Hold *getsv_mask(int n){ EV_Hold *h; static EV_Hold *kept = (EV_Hold *) 0; for (h = kept; h; h = h->nxt) if (n == h->sz && (memcmp((char *) Mask, (char *) h->sv, n) == 0) && (now._nr_pr == h->nrpr) && (now._nr_qs == h->nrqs)#if VECTORSZ>32000 && (memcmp((char *) proc_offset, (char *) h->po, now._nr_pr * sizeof(int)) == 0) && (memcmp((char *) q_offset, (char *) h->qo, now._nr_qs * sizeof(int)) == 0)#else && (memcmp((char *) proc_offset, (char *) h->po, now._nr_pr * sizeof(short)) == 0) && (memcmp((char *) q_offset, (char *) h->qo, now._nr_qs * sizeof(short)) == 0)#endif && (memcmp((char *) proc_skip, (char *) h->ps, now._nr_pr * sizeof(uchar)) == 0) && (memcmp((char *) q_skip, (char *) h->qs, now._nr_qs * sizeof(uchar)) == 0)) break; if (!h) { h = (EV_Hold *) emalloc(sizeof(EV_Hold)); h->sz = n; h->nrpr = now._nr_pr; h->nrqs = now._nr_qs; h->sv = (char *) emalloc(n * sizeof(char)); memcpy((char *) h->sv, (char *) Mask, n); if (now._nr_pr > 0) { h->ps = (char *) emalloc(now._nr_pr * sizeof(int)); memcpy((char *) h->ps, (char *) proc_skip, now._nr_pr * sizeof(uchar));#if VECTORSZ>32000 h->po = (char *) emalloc(now._nr_pr * sizeof(int)); memcpy((char *) h->po, (char *) proc_offset, now._nr_pr * sizeof(int));#else h->po = (char *) emalloc(now._nr_pr * sizeof(short)); memcpy((char *) h->po, (char *) proc_offset, now._nr_pr * sizeof(short));#endif } if (now._nr_qs > 0) { h->qs = (char *) emalloc(now._nr_qs * sizeof(int)); memcpy((char *) h->qs, (char *) q_skip, now._nr_qs * sizeof(uchar));#if VECTORSZ>32000 h->qo = (char *) emalloc(now._nr_qs * sizeof(int)); memcpy((char *) h->qo, (char *) q_offset, now._nr_qs * sizeof(int));#else h->qo = (char *) emalloc(now._nr_qs * sizeof(short)); memcpy((char *) h->qo, (char *) q_offset, now._nr_qs * sizeof(short));#endif } h->nxt = kept; kept = h; } return h;}voidfreesv(SV_Hold *p){ SV_Hold *h, *oh; oh = (SV_Hold *) 0; for (h = svfree; h; oh = h, h = h->nxt) if (h->sz >= p->sz) break; if (!oh) { p->nxt = svfree; svfree = p; } else { p->nxt = h; oh->nxt = p; }}BFS_Trail *get_bfs_frame(void){ BFS_Trail *t; if (bfs_free) { t = bfs_free; bfs_free = bfs_free->nxt; t->nxt = (BFS_Trail *) 0; } else { t = (BFS_Trail *) emalloc(sizeof(BFS_Trail)); } t->frame = (Trail *) emalloc(sizeof(Trail)); return t;}voidpush_bfs(Trail *f, int d){ BFS_Trail *t; t = get_bfs_frame(); memcpy((char *)t->frame, (char *)f, sizeof(Trail)); t->frame->o_tt = d; /* depth */ t->boq = boq; t->onow = getsv(vsize); t->omask = getsv_mask(vsize);#if defined(FULLSTACK) && defined(Q_PROVISO) t->lstate = Lstate;#endif if (!bfs_bot) { bfs_bot = bfs_trail = t; } else { bfs_bot->nxt = t; bfs_bot = t; }#ifdef CHECK printf("PUSH %%u (%%d)\n", t->frame, d);#endif}Trail *pop_bfs(void){ BFS_Trail *t; if (!bfs_trail) return (Trail *) 0; t = bfs_trail; bfs_trail = t->nxt; if (!bfs_trail) bfs_bot = (BFS_Trail *) 0;#if defined(Q_PROVISO) && !defined(BITSTATE) && !defined(NOREDUCE) if (t->lstate) t->lstate->tagged = 0;#endif t->nxt = bfs_free; bfs_free = t; vsize = t->onow->sz; boq = t->boq;#ifdef BFS_DISK if (t->onow->sv == (State *) 0) { char dsk_nm[32]; bfs_dsk_reads++; /* count */ if (bfs_dsk_read >= 0 /* file descriptor */ && bfs_dsk_reads%%BFS_DSK_LIMIT == 0) { (void) close(bfs_dsk_read); sprintf(dsk_nm, "pan_bfs_%%d.tmp", bfs_dsk_seqno_r-1); (void) unlink(dsk_nm); bfs_dsk_read = -1; } if (bfs_dsk_read < 0) { sprintf(dsk_nm, "pan_bfs_%%d.tmp", bfs_dsk_seqno_r++); bfs_dsk_read = open(dsk_nm, RFLAGS); if (bfs_dsk_read < 0) { Uerror("could not open temp disk file"); } } if (read(bfs_dsk_read, (char *) &now, vsize) != vsize) { Uerror("bad bfs disk file read"); }#ifndef NOVSZ if (now._vsz != vsize) { Uerror("disk read vsz mismatch"); }#endif } else#endif memcpy((uchar *) &now, (uchar *) t->onow->sv, vsize); memcpy((uchar *) Mask, (uchar *) t->omask->sv, vsize); if (now._nr_pr > 0)#if VECTORSZ>32000 { memcpy((char *)proc_offset, (char *)t->omask->po, now._nr_pr * sizeof(int));#else { memcpy((char *)proc_offset, (char *)t->omask->po, now._nr_pr * sizeof(short));#endif memcpy((char *)proc_skip, (char *)t->omask->ps, now._nr_pr * sizeof(uchar)); } if (now._nr_qs > 0)#if VECTORSZ>32000 { memcpy((uchar *)q_offset, (uchar *)t->omask->qo, now._nr_qs * sizeof(int));#else { memcpy((uchar *)q_offset, (uchar *)t->omask->qo, now._nr_qs * sizeof(short));#endif memcpy((uchar *)q_skip, (uchar *)t->omask->qs, now._nr_qs * sizeof(uchar)); }#ifdef BFS_DISK if (t->onow->sv != (State *) 0)#endif freesv(t->onow); /* omask not freed */#ifdef CHECK printf("POP %%u (%%d)\n", t->frame, t->frame->o_tt);#endif return t->frame;}voidstore_state(Trail *ntrpt, int shortcut, short oboq){#ifdef VERI Trans *t2 = (Trans *) 0; uchar ot; int tt, E_state; uchar o_opm = trpt->o_pm, *othis = this; if (shortcut) {#ifdef VERBOSE printf("claim: shortcut\n");#endif goto store_it; /* no claim move */ } this = (((uchar *)&now)+proc_offset[0]); /* 0 = never claim */ trpt->o_pm = 0; tt = (int) ((P0 *)this)->_p; ot = (uchar) ((P0 *)this)->_t;#ifdef HAS_UNLESS E_state = 0;#endif for (t2 = trans[ot][tt]; t2; t2 = t2?t2->nxt:(Trans *)0) {#ifdef HAS_UNLESS if (E_state > 0 && E_state != t2->e_trans) break;#endif if (do_transit(t2, 0)) {#ifdef VERBOSE if (!reached[ot][t2->st]) printf("depth: %%d -- claim move from %%d -> %%d\n", trpt->o_tt, ((P0 *)this)->_p, t2->st);#endif#ifdef HAS_UNLESS E_state = t2->e_trans;#endif if (t2->st > 0) { ((P0 *)this)->_p = t2->st; reached[ot][t2->st] = 1;#ifndef NOCLAIM check_claim(t2->st);#endif } if (now._nr_pr == 0) /* claim terminated */ uerror("end state in claim reached");#ifdef PEG peg[t2->forw]++;#endif trpt->o_pm |= 1; if (t2->atom&2) Uerror("atomic in claim not supported in BFS mode");store_it:#endif#ifdef BITSTATE if (!bstore((char *)&now, vsize))#else#ifdef MA if (!gstore((char *)&now, vsize, 0))#else if (!hstore((char *)&now, vsize))#endif#endif { static long sdone = (long) 0; long ndone; nstates++;#ifndef NOREDUCE trpt->tau |= 64;#endif ndone = (unsigned long) (nstates/(freq)); if (ndone != sdone && mreached%%10 != 0) { snapshot(); sdone = ndone;#if defined(AUTO_RESIZE) && !defined(BITSTATE) && !defined(MA) if (nstates > ((double)(1<<(ssize+1)))) { void resize_hashtable(void); resize_hashtable(); }#endif }#if SYNC if (boq != -1) midrv++; else if (oboq != -1) { Trail *x; x = (Trail *) trpt->ostate; /* pre-rv state */ if (x) x->o_pm |= 4; /* mark success */ }#endif push_bfs(ntrpt, trpt->o_tt+1); } else { truncs++;#if !defined(NOREDUCE) && defined(FULLSTACK) && defined(Q_PROVISO)#if !defined(BITSTATE) if (Lstate && Lstate->tagged) trpt->tau |= 64;#else if (trpt->tau&32) { BFS_Trail *tprov; for (tprov = bfs_trail; tprov; tprov = tprov->nxt) if (tprov->onow->sv != (State *) 0 && memcmp((uchar *)&now, (uchar *)tprov->onow->sv, vsize) == 0) { trpt->tau |= 64; break; /* state is in queue */ } }#endif#endif }#ifdef VERI ((P0 *)this)->_p = tt; /* reset claim */ if (t2) do_reverse(t2, 0, 0); else break; } } this = othis; trpt->o_pm = o_opm;#endif}Trail *ntrpt;voidbfs(void){ Trans *t; Trail *otrpt, *x; uchar _n, _m, ot, nps = 0; int tt, E_state; short II, From = (short) (now._nr_pr-1), To = BASE; short oboq = boq; ntrpt = (Trail *) emalloc(sizeof(Trail)); trpt->ostate = (struct H_el *) 0; trpt->tau = 0; trpt->o_tt = -1; store_state(ntrpt, 0, oboq); /* initial state */ while ((otrpt = pop_bfs())) /* also restores now */ { memcpy((char *) trpt, (char *) otrpt, sizeof(Trail));#if defined(C_States) && (HAS_TRACK==1) c_revert((uchar *) &(now.c_state[0]));#endif if (trpt->o_pm & 4) {#ifdef VERBOSE printf("Revisit of atomic not needed (%%d)\n", trpt->o_pm);#endif continue; }#ifndef NOREDUCE nps = 0;#endif if (trpt->o_pm == 8) { revrv++; if (trpt->tau&8) {#ifdef VERBOSE printf("Break atomic (pm:%%d,tau:%%d)\n", trpt->o_pm, trpt->tau);#endif trpt->tau &= ~8; }#ifndef NOREDUCE else if (trpt->tau&32) {#ifdef VERBOSE printf("Void preselection (pm:%%d,tau:%%d)\n", trpt->o_pm, trpt->tau);#endif trpt->tau &= ~32; nps = 1; /* no preselection in repeat */ }#endif } trpt->o_pm &= ~(4|8); if (trpt->o_tt > mreached) { mreached = trpt->o_tt; if (mreached%%10 == 0) { snapshot(); } } depth = trpt->o_tt; if (depth >= maxdepth) {#if SYNC Trail *x; if (boq != -1) { x = (Trail *) trpt->ostate; if (x) x->o_pm |= 4; /* not failing */ }#endif truncs++; if (!warned) { warned = 1; printf("error: max search depth too small\n"); } if (bounded) uerror("depth limit reached"); continue; }#ifndef NOREDUCE if (boq == -1 && !(trpt->tau&8) && nps == 0) for (II = now._nr_pr-1; II >= BASE; II -= 1) {Pickup: this = pptr(II); tt = (int) ((P0 *)this)->_p; ot = (uchar) ((P0 *)this)->_t; if (trans[ot][tt]->atom & 8) { t = trans[ot][tt]; if (t->qu[0] != 0) { Ccheck++; if (!q_cond(II, t)) continue; Cholds++; } From = To = II; trpt->tau |= 32; /* preselect marker */#ifdef DEBUG printf("%%3ld: proc %%d PreSelected (tau=%%d)\n", depth, II, trpt->tau);#endif goto MainLoop; } } trpt->tau &= ~32;#endifRepeat: if (trpt->tau&8) /* atomic */ { From = To = (short ) trpt->pr; nlinks++; } else { From = now._nr_pr-1; To = BASE; }MainLoop: _n = _m = 0; for (II = From; II >= To; II -= 1) { this = (((uchar *)&now)+proc_offset[II]); tt = (int) ((P0 *)this)->_p; ot = (uchar) ((P0 *)this)->_t;#if SYNC /* no rendezvous with same proc */ if (boq != -1 && trpt->pr == II) continue;#endif ntrpt->pr = (uchar) II; ntrpt->st = tt; trpt->o_pm &= ~1; /* no move yet */#ifdef EVENT_TRACE trpt->o_event = now._event;#endif#ifdef HAS_PROVIDED if (!provided(II, ot, tt, t)) continue;#endif#ifdef HAS_UNLESS E_state = 0;#endif for (t = trans[ot][tt]; t; t = t->nxt) {#ifdef HAS_UNLESS if (E_state > 0 && E_state != t->e_trans) break;#endif ntrpt->o_t = t; oboq = boq; if (!(_m = do_transit(t, II))) continue; trpt->o_pm |= 1; /* we moved */ (trpt+1)->o_m = _m; /* for unsend */#ifdef PEG peg[t->forw]++;#endif#ifdef CHECK printf("%%3ld: proc %%d exec %%d, ", depth, II, t->forw); printf("%%d to %%d, %%s %%s %%s", tt, t->st, t->tp, (t->atom&2)?"atomic":"", (boq != -1)?"rendez-vous":"");#ifdef HAS_UNLESS if (t->e_trans) printf(" (escapes to state %%d)", t->st);#endif printf(" %%saccepting [tau=%%d]\n", (trpt->o_pm&2)?"":"non-", trpt->tau);#endif#ifdef HAS_UNLESS E_state = t->e_trans;#if SYNC>0 if (t->e_trans > 0 && (boq != -1 /* || oboq != -1 */)) { fprintf(efd, "error: the use of rendezvous stmnt in the escape clause\n"); fprintf(efd, " of an unless stmnt is not compatible with -DBFS\n"); pan_exit(1); }#endif#endif if (t->st > 0) ((P0 *)this)->_p = t->st; /* ptr to pred: */ ntrpt->ostate = (struct H_el *) otrpt; ntrpt->st = tt; if (boq == -1 && (t->atom&2)) /* atomic */ ntrpt->tau = 8; /* record for next move */ else ntrpt->tau = 0; store_state(ntrpt, (boq != -1 || (t->atom&2)), oboq);#ifdef EVENT_TRACE now._event = trpt->o_event;#endif /* undo move and continue */ trpt++; /* this is where ovals and ipt are set */ do_reverse(t, II, _m); /* restore now. */ trpt--;#ifdef CHECK #if NCORE>1 enter_critical(GLOBAL_LOCK); /* in verbose mode only */ printf("cpu%%d: ", core_id); #endif printf("%%3d: proc %%d ", depth, II); printf("reverses %%d, %%d to %%d,", t->forw, tt, t->st); printf(" %%s [abit=%%d,adepth=%%d,", t->tp, now._a_t, A_depth); printf("tau=%%d,%%d]\n", trpt->tau, (trpt-1)->tau); #if NCORE>1 leave_critical(GLOBAL_LOCK); #endif#endif reached[ot][t->st] = 1; reached[ot][tt] = 1; ((P0 *)this)->_p = tt; _n |= _m; } }#ifndef NOREDUCE /* preselected - no succ definitely outside stack */ if ((trpt->tau&32) && !(trpt->tau&64)) { From = now._nr_pr-1; To = BASE;#ifdef DEBUG cpu_printf("%%3ld: proc %%d UnSelected (_n=%%d, tau=%%d)\n", depth, II+1, (int) _n, trpt->tau);#endif _n = 0; trpt->tau &= ~32; if (II >= BASE) goto Pickup; goto MainLoop; } trpt->tau &= ~(32|64);#endif if (_n != 0) continue;#ifdef DEBUG printf("%%3ld: no move [II=%%d, tau=%%d, boq=%%d, _nr_pr=%%d]\n", depth, II, trpt->tau, boq, now._nr_pr);#endif if (boq != -1) { failedrv++; x = (Trail *) trpt->ostate; /* pre-rv state */ if (!x) continue; /* root state */ if ((x->tau&8) || (x->tau&32)) /* break atomic or preselect at parent */ { x->o_pm |= 8; /* mark failure */ this = (((uchar *)&now)+proc_offset[otrpt->pr]);#ifdef VERBOSE printf("\treset state of %%d from %%d to %%d\n", otrpt->pr, ((P0 *)this)->_p, otrpt->st);#endif ((P0 *)this)->_p = otrpt->st; unsend(boq); /* retract rv offer */ boq = -1; push_bfs(x, x->o_tt);#ifdef VERBOSE printf("failed rv, repush with %%d\n", x->o_pm);#endif }#ifdef VERBOSE else printf("failed rv, tau at parent: %%d\n", x->tau);#endif } else if (now._nr_pr > 0) { if ((trpt->tau&8)) /* atomic */ { trpt->tau &= ~(1|8); /* 1=timeout, 8=atomic */#ifdef DEBUG printf("%%3ld: atomic step proc %%d blocks\n", depth, II+1);#endif goto Repeat; } if (!(trpt->tau&1)) /* didn't try timeout yet */ { trpt->tau |= 1;#ifdef DEBUG printf("%%d: timeout\n", depth);#endif goto MainLoop; }#ifndef VERI if (!noends && !a_cycles && !endstate()) uerror("invalid end state");#endif } }}voidputter(Trail *trpt, int fd){ long j; if (!trpt) return; if (trpt != (Trail *) trpt->ostate) putter((Trail *) trpt->ostate, fd); if (trpt->o_t) { sprintf(snap, "%%d:%%d:%%d\n", trcnt++, trpt->pr, trpt->o_t->t_id); j = strlen(snap); if (write(fd, snap, j) != j) { printf("pan: error writing %%s\n", fnm); pan_exit(1); } }}voidnuerror(char *str){ int fd = make_trail(); int j; if (fd < 0) return;#ifdef VERI sprintf(snap, "-2:%%d:-2\n", VERI); (void) write(fd, snap, strlen(snap));#endif#ifdef MERGED sprintf(snap, "-4:-4:-4\n"); (void) write(fd, snap, strlen(snap));#endif trcnt = 1; putter(trpt, fd); if (ntrpt->o_t) { sprintf(snap, "%%d:%%d:%%d\n", trcnt++, ntrpt->pr, ntrpt->o_t->t_id); j = strlen(snap); if (write(fd, snap, j) != j) { printf("pan: error writing %%s\n", fnm); pan_exit(1); } } close(fd); if (errors >= upto && upto != 0) { wrapup(); }}#endifclock_t start_time;#if NCORE>1clock_t crash_stamp;#endif#if !defined(WIN32) && !defined(WIN64)struct tms start_tm;#endifvoidstart_timer(void){#if defined(WIN32) || defined(WIN64) start_time = clock();#else start_time = times(&start_tm);#endif}voidstop_timer(void){ clock_t stop_time; double delta_time;#if !defined(WIN32) && !defined(WIN64) struct tms stop_tm; stop_time = times(&stop_tm); delta_time = ((double) (stop_time - start_time)) / ((double) sysconf(_SC_CLK_TCK));#else stop_time = clock(); delta_time = ((double) (stop_time - start_time)) / ((double) CLOCKS_PER_SEC);#endif if (readtrail || delta_time < 0.00) return;#if NCORE>1 if (core_id == 0 && nstates > (double) 0) { printf("\ncpu%%d: elapsed time %%.3g seconds (%%g states visited)\n", core_id, delta_time, nstates); if (delta_time > 0.01) { printf("cpu%%d: rate %%g states/second\n", core_id, nstates/delta_time); } { void check_overkill(void); check_overkill(); } }#else printf("\npan: elapsed time %%.3g seconds\n", delta_time); if (delta_time > 0.01) { printf("pan: rate %%9.8g states/second\n", nstates/delta_time); if (verbose) { printf("pan: avg transition delay %%.5g usec\n", delta_time/(nstates+truncs)); } }#endif}#if NCORE>1#ifdef T_ALERTdouble t_alerts[17];voidcrash_report(void){ int i; printf("crash alert intervals:\n"); for (i = 0; i < 17; i++) { printf("%%d\t%%g\n", i, t_alerts[i]);} }#endifvoidcrash_reset(void){ /* false alarm */ if (crash_stamp != (clock_t) 0) {#ifdef T_ALERT double delta_time; int i;#if defined(WIN32) || defined(WIN64) delta_time = ((double) (clock() - crash_stamp)) / ((double) CLOCKS_PER_SEC);#else delta_time = ((double) (times(&start_tm) - crash_stamp)) / ((double) sysconf(_SC_CLK_TCK));#endif for (i = 0; i < 16; i++) { if (delta_time <= (i*30)) { t_alerts[i] = delta_time; break; } } if (i == 16) t_alerts[i] = delta_time;#endif if (verbose) printf("cpu%%d: crash alert off\n", core_id); } crash_stamp = (clock_t) 0;}intcrash_test(double maxtime){ double delta_time; if (crash_stamp == (clock_t) 0) { /* start timing */#if defined(WIN32) || defined(WIN64) crash_stamp = clock();#else crash_stamp = times(&start_tm);#endif if (verbose) { printf("cpu%%d: crash detection\n", core_id); } return 0; }#if defined(WIN32) || defined(WIN64) delta_time = ((double) (clock() - crash_stamp)) / ((double) CLOCKS_PER_SEC);#else delta_time = ((double) (times(&start_tm) - crash_stamp)) / ((double) sysconf(_SC_CLK_TCK));#endif return (delta_time >= maxtime);}#endifvoiddo_the_search(void){ int i; depth = mreached = 0; trpt = &trail[0];#ifdef VERI trpt->tau |= 4; /* the claim moves first */#endif for (i = 0; i < (int) now._nr_pr; i++) { P0 *ptr = (P0 *) pptr(i);#ifndef NP if (!(trpt->o_pm&2) && accpstate[ptr->_t][ptr->_p]) { trpt->o_pm |= 2; }#else if (!(trpt->o_pm&4) && progstate[ptr->_t][ptr->_p]) { trpt->o_pm |= 4; }#endif }#ifdef EVENT_TRACE#ifndef NP if (accpstate[EVENT_TRACE][now._event]) { trpt->o_pm |= 2; }#else if (progstate[EVENT_TRACE][now._event]) { trpt->o_pm |= 4; }#endif#endif#ifndef NOCOMP Mask[0] = Mask[1] = 1; /* _nr_pr, _nr_qs */ if (!a_cycles) { i = &(now._a_t) - (uchar *) &now; Mask[i] = 1; /* _a_t */ }#ifndef NOFAIR if (!fairness) { int j = 0; i = &(now._cnt[0]) - (uchar *) &now; while (j++ < NFAIR) Mask[i++] = 1; /* _cnt[] */ }#endif#endif#ifndef NOFAIR if (fairness && (a_cycles && (trpt->o_pm&2))) { now._a_t = 2; /* set the A-bit */ now._cnt[0] = now._nr_pr + 1;#ifdef VERBOSE printf("%%3ld: fairness Rule 1, cnt=%%d, _a_t=%%d\n", depth, now._cnt[now._a_t&1], now._a_t);#endif }#endif c_stack_start = (char *) &i; /* meant to be read-only */#if defined(HAS_CODE) && defined (C_INIT) C_INIT; /* initialization of data that must precede fork() */ c_init_done++;#endif#if defined(C_States) && (HAS_TRACK==1) /* capture initial state of tracked C objects */ c_update((uchar *) &(now.c_state[0]));#endif#ifdef HAS_CODE if (readtrail) getrail(); /* no return */#endif start_timer();#ifdef BFS bfs();#else#if defined(C_States) && defined(HAS_STACK) && (HAS_TRACK==1) /* initial state of tracked & unmatched objects */ c_stack((uchar *) &(svtack->c_stack[0]));#endif#if defined(P_RAND) || defined(T_RAND) srand(s_rand);#endif#if NCORE>1 mem_get();#else new_state(); /* start 1st DFS */#endif#endif}#ifdef INLINE_REVuchardo_reverse(Trans *t, short II, uchar M){ uchar _m = M; int tt = (int) ((P0 *)this)->_p;#include REVERSE_MOVESR999: return _m;}#endif#ifndef INLINE#ifdef EVENT_TRACEstatic char _tp = 'n'; static int _qid = 0;#endifuchardo_transit(Trans *t, short II){ uchar _m = 0; int tt = (int) ((P0 *)this)->_p;#ifdef M_LOSS uchar delta_m = 0;#endif#ifdef EVENT_TRACE short oboq = boq; uchar ot = (uchar) ((P0 *)this)->_t; if (II == -EVENT_TRACE) boq = -1;#define continue { boq = oboq; return 0; }#else#define continue return 0#ifdef SEPARATE uchar ot = (uchar) ((P0 *)this)->_t;#endif#endif#include FORWARD_MOVESP999:#ifdef EVENT_TRACE if (II == -EVENT_TRACE) boq = oboq;#endif return _m;#undef continue}#ifdef EVENT_TRACEvoidrequire(char tp, int qid){ Trans *t; _tp = tp; _qid = qid; if (now._event != endevent) for (t = trans[EVENT_TRACE][now._event]; t; t = t->nxt) { if (do_transit(t, -EVENT_TRACE)) { now._event = t->st; reached[EVENT_TRACE][t->st] = 1;#ifdef VERBOSE printf(" event_trace move to -> %%d\n", t->st);#endif#ifndef BFS#ifndef NP if (accpstate[EVENT_TRACE][now._event]) (trpt+1)->o_pm |= 2;#else if (progstate[EVENT_TRACE][now._event]) (trpt+1)->o_pm |= 4;#endif#endif#ifdef NEGATED_TRACE if (now._event == endevent) {#ifndef BFS depth++; trpt++;#endif uerror("event_trace error (all events matched)");#ifndef BFS trpt--; depth--;#endif break; }#endif for (t = t->nxt; t; t = t->nxt) { if (do_transit(t, -EVENT_TRACE)) Uerror("non-determinism in event-trace"); } return; }#ifdef VERBOSE else printf(" event_trace miss '%%c' -- %%d, %%d, %%d\n", tp, qid, now._event, t->forw);#endif }#ifdef NEGATED_TRACE now._event = endevent; /* only 1st try will count -- fixed 4.2.6 */#else#ifndef BFS depth++; trpt++;#endif uerror("event_trace error (no matching event)");#ifndef BFS trpt--; depth--;#endif#endif}#endifintenabled(int iam, int pid){ Trans *t; uchar *othis = this; int res = 0; int tt; uchar ot;#ifdef VERI /* if (pid > 0) */ pid++;#endif if (pid == iam) Uerror("used: enabled(pid=thisproc)"); if (pid < 0 || pid >= (int) now._nr_pr) return 0; this = pptr(pid); TstOnly = 1; tt = (int) ((P0 *)this)->_p; ot = (uchar) ((P0 *)this)->_t; for (t = trans[ot][tt]; t; t = t->nxt) if (do_transit(t, (short) pid)) { res = 1; break; } TstOnly = 0; this = othis; return res;}#endifvoidsnap_time(void){ clock_t stop_time; double delta_time;#if !defined(WIN32) && !defined(WIN64) struct tms stop_tm; stop_time = times(&stop_tm); delta_time = ((double) (stop_time - start_time)) / ((double) sysconf(_SC_CLK_TCK));#else stop_time = clock(); delta_time = ((double) (stop_time - start_time)) / ((double) CLOCKS_PER_SEC);#endif if (delta_time > 0.01) { printf("t= %%6.3g ", delta_time); printf("R= %%7.0g", nstates/delta_time); } printf("\n"); if (quota > 0.1 && delta_time > quota) { printf("Time limit of %%6.3g minutes exceeded\n", quota/60.0);#if NCORE>1 fflush(stdout); leave_critical(GLOBAL_LOCK); sudden_stop("time-limit"); exit(1);#endif wrapup(); }}voidsnapshot(void){#if NCORE>1 enter_critical(GLOBAL_LOCK); /* snapshot */ printf("cpu%%d: ", core_id);#endif printf("Depth= %%7ld States= %%8.3g ",#if NCORE>1 (long) (nr_handoffs * z_handoff) +#endif mreached, nstates); printf("Transitions= %%8.3g ", nstates+truncs);#ifdef MA printf("Nodes= %%7d ", nr_states);#endif printf("Memory= %%9.3f\t", memcnt/1048576.); snap_time(); fflush(stdout);#if NCORE>1 leave_critical(GLOBAL_LOCK);#endif}#ifdef SCvoidstack2disk(void){ if (!stackwrite && (stackwrite = creat(stackfile, TMODE)) < 0) Uerror("cannot create stackfile"); if (write(stackwrite, trail, DDD*sizeof(Trail)) != DDD*sizeof(Trail)) Uerror("stackfile write error -- disk is full?"); memmove(trail, &trail[DDD], (HHH-DDD+2)*sizeof(Trail)); memset(&trail[HHH-DDD+2], 0, (omaxdepth - HHH + DDD - 2)*sizeof(Trail)); CNT1++;}voiddisk2stack(void){ long have; CNT2++; memmove(&trail[DDD], trail, (HHH-DDD+2)*sizeof(Trail)); if (!stackwrite || lseek(stackwrite, -DDD* (off_t) sizeof(Trail), SEEK_CUR) == -1) Uerror("disk2stack lseek error"); if (!stackread && (stackread = open(stackfile, 0)) < 0) Uerror("cannot open stackfile"); if (lseek(stackread, (CNT1-CNT2)*DDD* (off_t) sizeof(Trail), SEEK_SET) == -1) Uerror("disk2stack lseek error"); have = read(stackread, trail, DDD*sizeof(Trail)); if (have != DDD*sizeof(Trail)) Uerror("stackfile read error");}#endifuchar *Pptr(int x){ if (x < 0 || x >= MAXPROC || !proc_offset[x]) return noptr; else return (uchar *) pptr(x);}int qs_empty(void);/* * new_state() is the main DFS search routine in the verifier * it has a lot of code ifdef-ed together to support * different search modes, which makes it quite unreadable. * if you are studying the code, first use the C preprocessor * to generate a specific version from the pan.c source, * e.g. by saying: * gcc -E -DNOREDUCE -DBITSTATE pan.c > ppan.c * and then study the resulting file, rather than this one */#if !defined(BFS) && (!defined(BITSTATE) || !defined(MA))#ifdef NSUCCint N_succ[512];voidtally_succ(int cnt){ if (cnt < 512) N_succ[cnt]++; else printf("tally_succ: cnt %%d exceeds range\n", cnt);}voiddump_succ(void){ int i; double sum = 0.0; double w_avg = 0.0; printf("Successor counts:\n"); for (i = 0; i < 512; i++) { sum += (double) N_succ[i]; } for (i = 0; i < 512; i++) { if (N_succ[i] > 0) { printf("%%3d %%10d (%%.4g %%%% of total)\n", i, N_succ[i], (100.0 * (double) N_succ[i])/sum); w_avg += (double) i * (double) N_succ[i]; } } if (sum > N_succ[0]) printf("mean %%.4g (without 0: %%.4g)\n", w_avg / sum, w_avg / (sum - (double) N_succ[0]));}#endif#ifdef REVERSE #define FROM_P (BASE) #define UPTO_P (now._nr_pr-1) #define MORE_P (II <= To) #define INI_P (From-1) #define ALL_P (II = From; II <= To; II++)#else #define FROM_P (now._nr_pr-1) #define UPTO_P (BASE) #define MORE_P (II >= BASE) #define INI_P (From+1) #define ALL_P (II = From; II >= To; II--)#endifvoidnew_state(void){ Trans *t; uchar _n, _m, ot;#ifdef T_RAND short ooi, eoi;#endif#ifdef M_LOSS uchar delta_m = 0;#endif short II, JJ = 0, kk; int tt; short From = FROM_P, To = UPTO_P;#ifdef BCS trpt->sched_limit = 0; /* at depth=0 only */#endifDown:#ifdef CHECK cpu_printf("%%d: Down - %%s %%saccepting [pids %%d-%%d]\n", depth, (trpt->tau&4)?"claim":"program", (trpt->o_pm&2)?"":"non-", From, To);#endif#ifdef P_RAND trpt->p_skip = -1;#endif#ifdef SC if (depth > hiwater) { stack2disk(); maxdepth += DDD; hiwater += DDD; trpt -= DDD; if(verbose) printf("zap %%d: %%d (maxdepth now %%d)\n", CNT1, hiwater, maxdepth); }#endif trpt->tau &= ~(16|32|64); /* make sure these are off */#if defined(FULLSTACK) && defined(MA) trpt->proviso = 0;#endif#ifdef NSUCC trpt->n_succ = 0;#endif#if NCORE>1 if (mem_hand_off()) {#if SYNC (trpt+1)->o_n = 1; /* not a deadlock: as below */#endif#ifndef LOOPSTATE (trpt-1)->tau |= 16; /* worstcase guess: as below */#endif#if NCORE>1 && defined(FULL_TRAIL) if (upto > 0) { Pop_Stack_Tree(); }#endif goto Up; }#endif if (depth >= maxdepth) { if (!warned) { warned = 1; printf("error: max search depth too small\n"); } if (bounded) { uerror("depth limit reached"); } truncs++;#if SYNC (trpt+1)->o_n = 1; /* not a deadlock */#endif#ifndef LOOPSTATE (trpt-1)->tau |= 16; /* worstcase guess */#endif#if NCORE>1 && defined(FULL_TRAIL) if (upto > 0) { Pop_Stack_Tree(); }#endif goto Up; }AllOver:#if (defined(FULLSTACK) && !defined(MA)) || NCORE>1 /* if atomic or rv move, carry forward previous state */ trpt->ostate = (trpt-1)->ostate;#endif#ifdef VERI if ((trpt->tau&4) || ((trpt-1)->tau&128))#endif if (boq == -1) { /* if not mid-rv */#ifndef SAFETY /* this check should now be redundant * because the seed state also appears * on the 1st dfs stack and would be * matched in hstore below */ if ((now._a_t&1) && depth > A_depth) { if (!memcmp((char *)&A_Root, (char *)&now, vsize)) { depthfound = A_depth;#ifdef CHECK printf("matches seed\n");#endif#ifdef NP uerror("non-progress cycle");#else uerror("acceptance cycle");#endif#if NCORE>1 && defined(FULL_TRAIL) if (upto > 0) { Pop_Stack_Tree(); }#endif goto Up; }#ifdef CHECK printf("not seed\n");#endif }#endif if (!(trpt->tau&8)) /* if no atomic move */ {#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST) uchar was_last = now._last; now._last = 0; /* value not stored */#endif#ifdef BITSTATE#ifdef CNTRSTACK #if defined(BCS) && defined(STORE_CTX) { int xj; for (xj = trpt->sched_limit; xj <= sched_max; xj++) { now._ctx = xj; II = bstore((char *)&now, vsize); trpt->j6 = j1_spin; trpt->j7 = j2; JJ = LL[j1_spin] && LL[j2]; if (II != 0) { break; } } now._ctx = 0; /* just in case */ } #else II = bstore((char *)&now, vsize); trpt->j6 = j1_spin; trpt->j7 = j2; JJ = LL[j1_spin] && LL[j2]; #endif#else #ifdef FULLSTACK #if defined(BCS) && defined(STORE_CTX) { int xj; now._ctx = 0; JJ = onstack_now(); for (xj = trpt->sched_limit; xj <= sched_max; xj++) { now._ctx = xj; II = bstore((char *)&now, vsize); if (II != 0) { break; } } now._ctx = 0; } #else JJ = onstack_now(); II = bstore((char *)&now, vsize); #endif #else #if defined(BCS) && defined(STORE_CTX) { int xj; for (xj = trpt->sched_limit; xj <= sched_max; xj++) { now._ctx = xj; II = bstore((char *)&now, vsize); JJ = II; /* worstcase guess for p.o. - order corrected in 5.2.1 */ if (II != 0) { break; } } now._ctx = 0; } #else II = bstore((char *)&now, vsize); JJ = II; /* worstcase guess for p.o. - order corrected in 5.2.1 */ #endif #endif#endif#else#ifdef MA II = gstore((char *)&now, vsize, 0);#ifndef FULLSTACK JJ = II;#else JJ = (II == 2)?1:0;#endif#else II = hstore((char *)&now, vsize);#ifdef FULLSTACK JJ = (II == 2)?1:0;#endif#endif#endif kk = (II == 1 || II == 2);#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST) now._last = was_last; /* restore value */#endif#ifndef SAFETY#if NCORE==1 || defined (SEP_STATE) if (II == 2 && ((trpt->o_pm&2) || ((trpt-1)->o_pm&2))) #ifndef NOFAIR#if 0 if (!fairness || ((now._a_t&1) && now._cnt[1] == 1)) /* 5.1.4 */#else if (a_cycles && !fairness) /* 5.1.6 -- example by Hirofumi Watanabe */#endif #endif { II = 3; /* Schwoon & Esparza 2005, Gastin&Moro 2004 */#ifdef VERBOSE printf("state match on dfs stack\n");#endif goto same_case; }#endif#if defined(FULLSTACK) && defined(BITSTATE) if (!JJ && (now._a_t&1) && depth > A_depth) { int oj1 = j1_spin; uchar o_a_t = now._a_t; now._a_t &= ~(1|16|32); if (onstack_now()) { II = 3;#ifdef VERBOSE printf("state match on 1st dfs stack\n");#endif } now._a_t = o_a_t; j1_spin = oj1; }#endif if (II == 3 && a_cycles && (now._a_t&1)) {#ifndef NOFAIR if (fairness && now._cnt[1] > 1) /* was != 0 */ {#ifdef VERBOSE printf(" fairness count non-zero\n");#endif II = 0; } else#endif {#ifndef BITSTATE nShadow--;#endifsame_case: if (Lstate) depthfound = Lstate->D;#ifdef NP uerror("non-progress cycle");#else uerror("acceptance cycle");#endif#if NCORE>1 && defined(FULL_TRAIL) if (upto > 0) { Pop_Stack_Tree(); }#endif goto Up; } }#endif#ifndef NOREDUCE #ifndef SAFETY #if NCORE>1 && !defined(SEP_STATE) && defined(V_PROVISO) if (II != 0 && (!Lstate || Lstate->cpu_id < core_id)) { (trpt-1)->tau |= 16; } #endif if ((II && JJ) || (II == 3)) { /* marker for liveness proviso */ #ifndef LOOPSTATE (trpt-1)->tau |= 16; #endif truncs2++; }#else #if NCORE>1 && !defined(SEP_STATE) && defined(V_PROVISO) if (!(II != 0 && (!Lstate || Lstate->cpu_id < core_id))) { /* treat as stack state */ (trpt-1)->tau |= 16; } else { /* treat as non-stack state */ (trpt-1)->tau |= 64; } #endif if (!II || !JJ) { /* successor outside stack */ (trpt-1)->tau |= 64; } #endif#endif#if defined(BCS) && (defined(NOREDUCE) || !defined(SAFETY)) if (!II || !JJ) { (trpt-1)->tau |= 64; }#endif if (II) { truncs++;#if NCORE>1 && defined(FULL_TRAIL) if (upto > 0) { Pop_Stack_Tree(); if (depth == 0) { return; } }#endif goto Up; } if (!kk) { static long sdone = (long) 0; long ndone; nstates++;#if defined(ZAPH) && defined(BITSTATE) zstates += (double) hfns;#endif ndone = (unsigned long) (nstates/(freq)); if (ndone != sdone) { snapshot(); sdone = ndone;#if defined(AUTO_RESIZE) && !defined(BITSTATE) && !defined(MA) if (nstates > ((double)(ONE_L<<(ssize+1)))) { void resize_hashtable(void); resize_hashtable(); }#endif#if defined(ZAPH) && defined(BITSTATE) if (zstates > ((double)(ONE_L<<(ssize-2)))) { /* more than half the bits set */ void zap_hashtable(void); zap_hashtable(); zstates = 0; }#endif }#ifdef SVDUMP if (vprefix > 0) #ifdef SHO /* always use the same hashfunction, for consistency across runs */ if (HASH_NR != 0) { int oh = HASH_NR; HASH_NR = 0; d_hash((char *) &now, vsize); /* set K1 */ HASH_NR = oh; } if (write(svfd, (uchar *) &K1, sizeof(unsigned long)) != sizeof(unsigned long)) #else if (write(svfd, (uchar *) &now, vprefix) != vprefix) #endif { fprintf(efd, "writing %%s.svd failed\n", PanSource); wrapup(); }#endif#if defined(MA) && defined(W_XPT) if ((unsigned long) nstates%%W_XPT == 0) { void w_xpoint(void); w_xpoint(); }#endif }#if defined(FULLSTACK) || defined(CNTRSTACK) onstack_put();#ifdef DEBUG2#if defined(FULLSTACK) && !defined(MA) printf("%%d: putting %%u (%%d)\n", depth, trpt->ostate, (trpt->ostate)?trpt->ostate->tagged:0);#else printf("%%d: putting\n", depth);#endif#endif#else #if NCORE>1 trpt->ostate = Lstate; #endif#endif } } if (depth > mreached) mreached = depth;#ifdef VERI if (trpt->tau&4)#endif trpt->tau &= ~(1|2); /* timeout and -request off */ _n = 0;#if SYNC (trpt+1)->o_n = 0;#endif#ifdef VERI if (now._nr_pr == 0) /* claim terminated */ uerror("end state in claim reached"); check_claim(((P0 *)pptr(0))->_p);Stutter: if (trpt->tau&4) /* must make a claimmove */ {#ifndef NOFAIR if ((now._a_t&2) /* A-bit set */ && now._cnt[now._a_t&1] == 1) { now._a_t &= ~2; now._cnt[now._a_t&1] = 0; trpt->o_pm |= 16;#ifdef DEBUG printf("%%3d: fairness Rule 3.: _a_t = %%d\n", depth, now._a_t);#endif }#endif II = 0; /* never */ goto Veri0; }#endif#ifndef NOREDUCE /* Look for a process with only safe transitions */ /* (special rules apply in the 2nd dfs) */ if (boq == -1 && From != To#ifdef SAFETY #if NCORE>1 && (depth < z_handoff) #endif )#else #if NCORE>1 && ((a_cycles) || (!a_cycles && depth < z_handoff)) #endif #ifdef BCS && (sched_max > 0 || depth > BASE) #endif && (!(now._a_t&1) || (a_cycles && #ifndef BITSTATE#ifdef MA#ifdef VERI !((trpt-1)->proviso))#else !(trpt->proviso))#endif#else#ifdef VERI (trpt-1)->ostate && !(((char *)&((trpt-1)->ostate->state))[0] & 128))#else !(((char *)&(trpt->ostate->state))[0] & 128))#endif#endif #else#ifdef VERI (trpt-1)->ostate && (trpt-1)->ostate->proviso == 0)#else trpt->ostate->proviso == 0)#endif #endif ))#endif /* attempt Partial Order Reduction as preselect moves */#ifdef BCS if (trpt->sched_limit < sched_max)#endif {#if defined(BCS) && defined(BCS_STICK) if (depth > BASE) /* there is a prior move */ { II = now._last + BASE; /* check last process */ if (II >= now._nr_pr) /* process is gone */ { goto CheckAllPO; } this = pptr(II); tt = (int) ((P0 *)this)->_p; ot = (uchar) ((P0 *)this)->_t; if (trans[ot][tt] && trans[ot][tt]->atom & 8) /* safe */ { t = trans[ot][tt]; if (t->qu[0] != 0) /* conditional */ { Ccheck++; if (!q_cond(II, t)) { /* try other safe moves */ goto CheckAllPO; } Cholds++; } /* else: BCS would also select it, but not as a po move */ goto SelectIt; /* if it fails, we continue at Resume, so we don't always try all safe moves in this case -- which is still sound */ } }#endifCheckAllPO: for ALL_P {Resume: /* pick up here if preselect fails */ this = pptr(II); tt = (int) ((P0 *)this)->_p; ot = (uchar) ((P0 *)this)->_t; if (trans[ot][tt]->atom & 8) { t = trans[ot][tt]; if (t->qu[0] != 0) { Ccheck++; if (!q_cond(II, t)) continue; Cholds++; }SelectIt: From = To = II; /* preselect process */#ifdef NIBIS t->om = 0;#endif trpt->tau |= 32; /* preselect marker */#ifdef DEBUG printf("%%3ld: proc %%d PreSelected (tau=%%d)\n", depth, II, trpt->tau);#endif goto Again; } } } trpt->tau &= ~32;#endif#if !defined(NOREDUCE) || (defined(ETIM) && !defined(VERI))Again:#endif trpt->o_pm &= ~(8|16|32|64); /* clear fairness-marks */#ifndef NOFAIR if (fairness && boq == -1#ifdef VERI && (!(trpt->tau&4) && !((trpt-1)->tau&128))#endif && !(trpt->tau&8)) { /* A_bit = 1; Cnt = N in acc states with A_bit 0 */ if (!(now._a_t&2)) { if (a_cycles && (trpt->o_pm&2)) { /* Accepting state */ now._a_t |= 2; now._cnt[now._a_t&1] = now._nr_pr + 1; trpt->o_pm |= 8;#ifdef DEBUG printf("%%3ld: fairness Rule 1: cnt=%%d, _a_t=%%d\n", depth, now._cnt[now._a_t&1], now._a_t);#endif } } else { /* A_bit = 0 when Cnt 0 */ if (now._cnt[now._a_t&1] == 1) { now._a_t &= ~2; now._cnt[now._a_t&1] = 0; trpt->o_pm |= 16;#ifdef DEBUG printf("%%3ld: fairness Rule 3: _a_t = %%d\n", depth, now._a_t);#endif } } }#endif#ifdef BCS trpt->bcs = trpt->b_pno = 0; /* initial */ if (From != To /* not a PO or atomic move */ && depth > BASE) /* there is a prior move */ { trpt->b_pno = now._last + BASE; trpt->bcs = B_PHASE1; #ifdef VERBOSE printf("%%3ld: BCS phase 1 proc %%d limit %%d\n", depth, trpt->b_pno, trpt->sched_limit); #endif /* allow only process b_pno to move in this phase */ }c_switch: /* jumps here with bcs == B_PHASE2 with or wo B_FORCED added */ #ifdef VERBOSE printf("%%3ld: BCS c_switch phase=%%d pno=%%d [forced %%d]\n", depth, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0); #endif#endif#ifdef P_RAND #ifdef REVERSE trpt->p_left = 1 + (To - From); #else trpt->p_left = 1 + (From - To); #endif if (trpt->p_left > 1) { trpt->p_skip = rand() %% (trpt->p_left); } else { trpt->p_skip = -1; }r_switch: #ifdef VERBOSE printf("%%3ld: P_RAND r_switch p_skip=%%d p_left=%%d\n", depth, trpt->p_skip, trpt->p_left); #endif#endif /* Main Expansion Loop over Processes */ for ALL_P {#ifdef P_RAND if (trpt->p_skip >= 0) { trpt->p_skip--; /* skip random nr of procs */ #ifdef VERBOSE printf("%%3ld: P_RAND skipping %%d [new p_skip=%%d p_left=%%d]\n", depth, II, trpt->p_skip, trpt->p_left); #endif continue; } if (trpt->p_left == 0) { #ifdef VERBOSE printf("%%3ld: P_RAND done at %%d\n", depth, II); #endif break; /* done */ } #ifdef VERBOSE printf("%%3ld: P_RAND explore %%d [p_left=%%d]\n", depth, II, trpt->p_left); #endif trpt->p_left--;#endif#if SYNC /* no rendezvous with same proc */ if (boq != -1 && trpt->pr == II) continue;#endif#ifdef BCS if ((trpt->bcs & B_PHASE1) && trpt->b_pno != II) { #ifdef VERBOSE printf("%%3ld: BCS NotPre II=%%d bcs=%%d pno=%%d [forced %%d]\n", depth, II, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0); #endif continue; } #ifdef VERBOSE else if ((trpt->bcs & B_PHASE1) && trpt->b_pno == II) printf("%%3ld: BCS IsPre II=%%d bcs=%%d pno=%%d [forced %%d]\n", depth, II, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0); #endif if (trpt->bcs & B_PHASE2) /* 2nd phase */ { if (trpt->b_pno == II) /* was already done in phase 1 */ { #ifdef VERBOSE printf("%%3ld: BCS NoRepeat II=%%d bcs=%%d pno=%%d [forced %%d]\n", depth, II, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0); #endif continue; } if (!(trpt->bcs & B_FORCED) /* unless forced */ && trpt->sched_limit >= sched_max) { #ifdef VERBOSE printf("%%3ld: BCS Bound II=%%d bcs=%%d pno=%%d [forced %%d]\n", depth, II, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0); #endif continue; /* enforce bound */ } }#endif#ifdef VERIVeri0:#endif this = pptr(II); tt = (int) ((P0 *)this)->_p; ot = (uchar) ((P0 *)this)->_t;#ifdef NIBIS /* don't repeat a previous preselected expansion */ /* could hit this if reduction proviso was false */ t = trans[ot][tt]; if (!(trpt->tau&4) && !(trpt->tau&1) && !(trpt->tau&32) && (t->atom & 8) && boq == -1 && From != To) { if (t->qu[0] == 0 || q_cond(II, t)) { _m = t->om; if (_m>_n||(_n>3&&_m!=0)) _n=_m; continue; /* did it before */ } }#endif trpt->o_pm &= ~1; /* no move in this pid yet */#ifdef EVENT_TRACE (trpt+1)->o_event = now._event;#endif /* Fairness: Cnt++ when Cnt == II */#ifndef NOFAIR trpt->o_pm &= ~64; /* didn't apply rule 2 */ if (fairness && boq == -1 && !(trpt->o_pm&32) && (now._a_t&2) && now._cnt[now._a_t&1] == II+2) { now._cnt[now._a_t&1] -= 1;#ifdef VERI /* claim need not participate */ if (II == 1) now._cnt[now._a_t&1] = 1;#endif#ifdef DEBUG printf("%%3ld: proc %%d fairness ", depth, II); printf("Rule 2: --cnt to %%d (%%d)\n", now._cnt[now._a_t&1], now._a_t);#endif trpt->o_pm |= (32|64); }#endif#ifdef HAS_PROVIDED if (!provided(II, ot, tt, t)) continue;#endif /* check all trans of proc II - escapes first */#ifdef HAS_UNLESS trpt->e_state = 0;#endif (trpt+1)->pr = (uchar) II; (trpt+1)->st = tt;#ifdef T_RAND for (ooi = eoi = 0, t = trans[ot][tt]; t; t = t->nxt, ooi++) { if (strcmp(t->tp, "else") == 0#ifdef HAS_UNLESS || t->e_trans != 0#endif ) { eoi++; } } if (eoi > 0) { t = trans[ot][tt]; #ifdef VERBOSE printf("randomizer: suppressed, saw else or escape\n"); #endif } else { eoi = rand()%%ooi; #ifdef VERBOSE printf("randomizer: skip %%d in %%d\n", eoi, ooi); #endif for (t = trans[ot][tt]; t; t = t->nxt) if (eoi-- <= 0) break; }domore: for ( ; t && ooi > 0; t = t->nxt, ooi--)#else for (t = trans[ot][tt]; t; t = t->nxt)#endif {#ifdef HAS_UNLESS /* exploring all transitions from * a single escape state suffices */ if (trpt->e_state > 0 && trpt->e_state != t->e_trans) {#ifdef DEBUG printf("skip 2nd escape %%d (did %%d before)\n", t->e_trans, trpt->e_state);#endif break; }#endif (trpt+1)->o_t = t;#ifdef INLINE#include FORWARD_MOVESP999: /* jumps here when move succeeds */#else if (!(_m = do_transit(t, II))) continue;#endif#ifdef BCS if (depth > BASE && II >= BASE && From != To #ifndef BCS_NOFIX /* added 5.2.5: prior move was not po */ && !((trpt-(BASE+1))->tau & 32) #endif && boq == -1 && (trpt->bcs & B_PHASE2) && trpt->b_pno != II /* context switch */ && !(trpt->bcs & B_FORCED)) /* unless forced */ { (trpt+1)->sched_limit = 1 + trpt->sched_limit; #ifdef VERBOSE printf("%%3ld: up sched count to %%d\n", depth, (trpt+1)->sched_limit); #endif } else { (trpt+1)->sched_limit = trpt->sched_limit; #ifdef VERBOSE printf("%%3ld: keep sched count at %%d\n", depth, (trpt+1)->sched_limit); #endif }#endif if (boq == -1)#ifdef CTL /* for branching-time, can accept reduction only if */ /* the persistent set contains just 1 transition */ { if ((trpt->tau&32) && (trpt->o_pm&1)) trpt->tau |= 16; trpt->o_pm |= 1; /* we moved */ }#else trpt->o_pm |= 1; /* we moved */#endif#ifdef LOOPSTATE if (loopstate[ot][tt]) {#ifdef VERBOSE printf("exiting from loopstate:\n");#endif trpt->tau |= 16; cnt_loops++; }#endif#ifdef PEG peg[t->forw]++;#endif#if defined(VERBOSE) || defined(CHECK)#if defined(SVDUMP) cpu_printf("%%3ld: proc %%d exec %%d \n", depth, II, t->t_id);#else cpu_printf("%%3ld: proc %%d exec %%d, %%d to %%d, %%s %%s %%s %%saccepting [tau=%%d]\n", depth, II, t->forw, tt, t->st, t->tp, (t->atom&2)?"atomic":"", (boq != -1)?"rendez-vous":"", (trpt->o_pm&2)?"":"non-", trpt->tau);#ifdef HAS_UNLESS if (t->e_trans) cpu_printf("\t(escape to state %%d)\n", t->st);#endif#endif#ifdef T_RAND cpu_printf("\t(randomizer %%d)\n", ooi);#endif#endif#ifdef HAS_LAST#ifdef VERI if (II != 0)#endif now._last = II - BASE;#endif#ifdef HAS_UNLESS trpt->e_state = t->e_trans;#endif depth++; trpt++; trpt->pr = (uchar) II; trpt->st = tt; trpt->o_pm &= ~(2|4); if (t->st > 0) { ((P0 *)this)->_p = t->st;/* moved down reached[ot][t->st] = 1; */ }#ifndef SAFETY if (a_cycles) {#if (ACCEPT_LAB>0 && !defined(NP)) || (PROG_LAB>0 && defined(HAS_NP)) int ii;#endif#define P__Q ((P0 *)pptr(ii))#if ACCEPT_LAB>0#ifdef NP /* state 1 of np_ claim is accepting */ if (((P0 *)pptr(0))->_p == 1) trpt->o_pm |= 2;#else for (ii = 0; ii < (int) now._nr_pr; ii++) { if (accpstate[P__Q->_t][P__Q->_p]) { trpt->o_pm |= 2; break; } }#endif#endif#if defined(HAS_NP) && PROG_LAB>0 for (ii = 0; ii < (int) now._nr_pr; ii++) { if (progstate[P__Q->_t][P__Q->_p]) { trpt->o_pm |= 4; break; } }#endif#undef P__Q }#endif trpt->o_t = t; trpt->o_n = _n; trpt->o_ot = ot; trpt->o_tt = tt; trpt->o_To = To; trpt->o_m = _m; trpt->tau = 0;#ifdef T_RAND trpt->oo_i = ooi;#endif if (boq != -1 || (t->atom&2)) { trpt->tau |= 8;#ifdef VERI /* atomic sequence in claim */ if((trpt-1)->tau&4) trpt->tau |= 4; else trpt->tau &= ~4; } else { if ((trpt-1)->tau&4) trpt->tau &= ~4; else trpt->tau |= 4; } /* if claim allowed timeout, so */ /* does the next program-step: */ if (((trpt-1)->tau&1) && !(trpt->tau&4)) trpt->tau |= 1;#else } else trpt->tau &= ~8;#endif if (boq == -1 && (t->atom&2)) { From = To = II; nlinks++; } else { From = FROM_P; To = UPTO_P; }#if NCORE>1 && defined(FULL_TRAIL) if (upto > 0) { Push_Stack_Tree(II, t->t_id); }#endif goto Down; /* pseudo-recursion */Up:#ifdef CHECK cpu_printf("%%d: Up - %%s\n", depth, (trpt->tau&4)?"claim":"program");#endif#if NCORE>1 iam_alive(); #ifdef USE_DISK mem_drain(); #endif#endif#if defined(MA) || NCORE>1 if (depth <= 0) return; /* e.g., if first state is old, after a restart */#endif#ifdef SC if (CNT1 > CNT2 && depth < hiwater - (HHH-DDD) - 2) { trpt += DDD; disk2stack(); maxdepth -= DDD; hiwater -= DDD; if(verbose) printf("unzap %%d: %%d\n", CNT2, hiwater); }#endif#ifndef SAFETY if ((now._a_t&1) && depth <= A_depth) return; /* to checkcycles() */#endif#ifndef NOFAIR if (trpt->o_pm&128) /* fairness alg */ { now._cnt[now._a_t&1] = trpt->bup.oval; _n = 1; trpt->o_pm &= ~128; depth--; trpt--;#if defined(VERBOSE) || defined(CHECK) printf("%%3ld: reversed fairness default move\n", depth);#endif goto Q999; }#endif#ifdef HAS_LAST#ifdef VERI { int d; Trail *trl; now._last = 0; for (d = 1; d < depth; d++) { trl = getframe(depth-d); /* was (trpt-d) */ if (trl->pr != 0) { now._last = trl->pr - BASE; break; } } }#else now._last = (depth<1)?0:(trpt-1)->pr;#endif#endif#ifdef EVENT_TRACE now._event = trpt->o_event;#endif t = trpt->o_t; _n = trpt->o_n; ot = trpt->o_ot; II = trpt->pr; tt = trpt->o_tt; this = pptr(II); To = trpt->o_To; _m = trpt->o_m;#ifdef T_RAND ooi = trpt->oo_i;#endif#ifdef INLINE_REV _m = do_reverse(t, II, _m);#else#include REVERSE_MOVESR999: /* jumps here when done */#endif#ifdef VERBOSE cpu_printf("%%3ld: proc %%d reverses %%d, %%d to %%d\n", depth, II, t->forw, tt, t->st); cpu_printf("\t%%s [abit=%%d,adepth=%%d,tau=%%d,%%d]\n", t->tp, now._a_t, A_depth, trpt->tau, (trpt-1)->tau);#endif#ifndef NOREDUCE /* pass the proviso tags */ if ((trpt->tau&8) /* rv or atomic */ && (trpt->tau&16)) (trpt-1)->tau |= 16; #ifdef SAFETY if ((trpt->tau&8) /* rv or atomic */ && (trpt->tau&64)) (trpt-1)->tau |= 64; #endif#endif#if defined(BCS) && (defined(NOREDUCE) || !defined(SAFETY)) if ((trpt->tau&8) && (trpt->tau&64)) (trpt-1)->tau |= 64;#endif depth--; trpt--;#ifdef NSUCC trpt->n_succ++;#endif#ifdef NIBIS (trans[ot][tt])->om = _m; /* head of list */#endif /* i.e., not set if rv fails */ if (_m) {#if defined(VERI) && !defined(NP) if (II == 0 && verbose && !reached[ot][t->st]) { printf("depth %%ld: Claim reached state %%d (line %%d)\n", depth, t->st, src_claim [t->st]); fflush(stdout); }#endif reached[ot][t->st] = 1; reached[ot][tt] = 1; }#ifdef HAS_UNLESS else trpt->e_state = 0; /* undo */#endif if (_m>_n||(_n>3&&_m!=0)) _n=_m; ((P0 *)this)->_p = tt; } /* all options */#ifdef T_RAND if (!t && ooi > 0) { t = trans[ot][tt]; #ifdef VERBOSE printf("randomizer: continue for %%d more\n", ooi); #endif goto domore; } #ifdef VERBOSE else printf("randomizer: done\n"); #endif#endif#ifndef NOFAIR /* Fairness: undo Rule 2 */ if ((trpt->o_pm&32) && (trpt->o_pm&64)) { if (trpt->o_pm&1) {#ifdef VERI if (now._cnt[now._a_t&1] == 1) now._cnt[now._a_t&1] = 2;#endif now._cnt[now._a_t&1] += 1;#ifdef VERBOSE printf("%%3ld: proc %%d fairness ", depth, II); printf("undo Rule 2, cnt=%%d, _a_t=%%d\n", now._cnt[now._a_t&1], now._a_t);#endif trpt->o_pm &= ~(32|64); } else { if (_n > 0) { trpt->o_pm &= ~64; II = INI_P; } } }#endif#ifdef VERI if (II == 0) break; /* never claim */#endif } /* all processes */#ifdef NSUCC tally_succ(trpt->n_succ);#endif#ifdef P_RAND if (trpt->p_left > 0) { trpt->p_skip = -1; /* probably rendundant */ #ifdef VERBOSE printf("%%3ld: P_RAND -- explore remainder\n", depth); #endif goto r_switch; /* explore the remaining procs */ } else { #ifdef VERBOSE printf("%%3ld: P_RAND -- none left\n", depth); #endif }#endif#ifdef BCS if (trpt->bcs & B_PHASE1) { trpt->bcs = B_PHASE2; /* start 2nd phase */ if (_n == 0 || !(trpt->tau&64)) /* pre-move unexecutable or led to stackstate */ { trpt->bcs |= B_FORCED; /* forced switch */ } #ifdef VERBOSE printf("%%3ld: BCS move to phase 2, _n=%%d %%s\n", depth, _n, (trpt->bcs & B_FORCED)?"forced":"free"); #endif From = FROM_P; To = UPTO_P; goto c_switch; } if (_n == 0 /* no process could move */ && II >= BASE /* not the never claim */ && trpt->sched_limit >= sched_max) { _n = 1; #ifdef VERBOSE printf("%%3ld: BCS not a deadlock\n", depth); #endif }#endif#ifndef NOFAIR /* Fairness: undo Rule 2 */ if (trpt->o_pm&32) /* remains if proc blocked */ {#ifdef VERI if (now._cnt[now._a_t&1] == 1) now._cnt[now._a_t&1] = 2;#endif now._cnt[now._a_t&1] += 1;#ifdef VERBOSE printf("%%3ld: proc -- fairness ", depth); printf("undo Rule 2, cnt=%%d, _a_t=%%d\n", now._cnt[now._a_t&1], now._a_t);#endif trpt->o_pm &= ~32; }#ifndef NP if (fairness && _n == 0 /* nobody moved */#ifdef VERI && !(trpt->tau&4) /* in program move */#endif && !(trpt->tau&8) /* not an atomic one */#ifdef OTIM && ((trpt->tau&1) || endstate())#else#ifdef ETIM && (trpt->tau&1) /* already tried timeout */#endif#endif#ifndef NOREDUCE /* see below */ && !((trpt->tau&32) && (_n == 0 || (trpt->tau&16)))#endif && now._cnt[now._a_t&1] > 0) /* needed more procs */ { depth++; trpt++; trpt->o_pm |= 128 | ((trpt-1)->o_pm&(2|4)); trpt->bup.oval = now._cnt[now._a_t&1]; now._cnt[now._a_t&1] = 1;#ifdef VERI trpt->tau = 4;#else trpt->tau = 0;#endif From = FROM_P; To = UPTO_P;#if defined(VERBOSE) || defined(CHECK) printf("%%3ld: fairness default move ", depth); printf("(all procs block)\n");#endif goto Down; }#endifQ999: /* returns here with _n>0 when done */; if (trpt->o_pm&8) { now._a_t &= ~2; now._cnt[now._a_t&1] = 0; trpt->o_pm &= ~8;#ifdef VERBOSE printf("%%3ld: fairness undo Rule 1, _a_t=%%d\n", depth, now._a_t);#endif } if (trpt->o_pm&16) { now._a_t |= 2; now._cnt[now._a_t&1] = 1; trpt->o_pm &= ~16;#ifdef VERBOSE printf("%%3ld: fairness undo Rule 3, _a_t=%%d\n", depth, now._a_t);#endif }#endif#ifndef NOREDUCE#ifdef SAFETY#ifdef LOOPSTATE /* at least one move that was preselected at this */ /* level, blocked or was a loop control flow point */ if ((trpt->tau&32) && (_n == 0 || (trpt->tau&16)))#else /* preselected move - no successors outside stack */ if ((trpt->tau&32) && !(trpt->tau&64))#endif { From = FROM_P; To = UPTO_P;#ifdef DEBUG printf("%%3ld: proc %%d UnSelected (_n=%%d, tau=%%d)\n", depth, II+1, _n, trpt->tau);#endif _n = 0; trpt->tau &= ~(16|32|64); if (MORE_P) /* II already decremented */ goto Resume; else goto Again; }#else /* at least one move that was preselected at this */ /* level, blocked or truncated at the next level */ if ((trpt->tau&32) && (_n == 0 || (trpt->tau&16))) {#ifdef DEBUG printf("%%3ld: proc %%d UnSelected (_n=%%d, tau=%%d)\n", depth, II+1, (int) _n, trpt->tau);#endif if (a_cycles && (trpt->tau&16)) { if (!(now._a_t&1)) {#ifdef DEBUG printf("%%3ld: setting proviso bit\n", depth);#endif#ifndef BITSTATE#ifdef MA#ifdef VERI (trpt-1)->proviso = 1;#else trpt->proviso = 1;#endif#else#ifdef VERI if ((trpt-1)->ostate) ((char *)&((trpt-1)->ostate->state))[0] |= 128;#else ((char *)&(trpt->ostate->state))[0] |= 128;#endif#endif#else#ifdef VERI if ((trpt-1)->ostate) (trpt-1)->ostate->proviso = 1;#else trpt->ostate->proviso = 1;#endif#endif From = FROM_P; To = UPTO_P; _n = 0; trpt->tau &= ~(16|32|64); goto Again; /* do full search */ } /* else accept reduction */ } else { From = FROM_P; To = UPTO_P; _n = 0; trpt->tau &= ~(16|32|64); if (MORE_P) /* II already decremented */ goto Resume; else goto Again; } }#endif#endif if (_n == 0 || ((trpt->tau&4) && (trpt->tau&2))) {#ifdef DEBUG cpu_printf("%%3ld: no move [II=%%d, tau=%%d, boq=%%d]\n", depth, II, trpt->tau, boq);#endif#if SYNC /* ok if a rendez-vous fails: */ if (boq != -1) goto Done;#endif /* ok if no procs or we're at maxdepth */ if ((now._nr_pr == 0 && (!strict || qs_empty()))#ifdef OTIM || endstate()#endif || depth >= maxdepth-1) goto Done; /* undo change from 5.2.3 */ if ((trpt->tau&8) && !(trpt->tau&4)) { trpt->tau &= ~(1|8); /* 1=timeout, 8=atomic */ From = FROM_P; To = UPTO_P;#ifdef DEBUG cpu_printf("%%3ld: atomic step proc %%d unexecutable\n", depth, II+1);#endif#ifdef VERI trpt->tau |= 4; /* switch to claim */#endif goto AllOver; }#ifdef ETIM if (!(trpt->tau&1)) /* didn't try timeout yet */ {#ifdef VERI if (trpt->tau&4) {#ifndef NTIM if (trpt->tau&2) /* requested */#endif { trpt->tau |= 1; trpt->tau &= ~2;#ifdef DEBUG cpu_printf("%%d: timeout\n", depth);#endif goto Stutter; } } else { /* only claim can enable timeout */ if ((trpt->tau&8) && !((trpt-1)->tau&4))/* blocks inside an atomic */ goto BreakOut;#ifdef DEBUG cpu_printf("%%d: req timeout\n", depth);#endif (trpt-1)->tau |= 2; /* request */#if NCORE>1 && defined(FULL_TRAIL) if (upto > 0) { Pop_Stack_Tree(); }#endif goto Up; }#else#ifdef DEBUG cpu_printf("%%d: timeout\n", depth);#endif trpt->tau |= 1; goto Again;#endif }#endif#ifdef VERIBreakOut:#ifndef NOSTUTTER if (!(trpt->tau&4)) { trpt->tau |= 4; /* claim stuttering */ trpt->tau |= 128; /* stutter mark */#ifdef DEBUG cpu_printf("%%d: claim stutter\n", depth);#endif goto Stutter; }#else ;#endif#else if (!noends && !a_cycles && !endstate()) { depth--; trpt--; /* new 4.2.3 */ uerror("invalid end state"); depth++; trpt++; }#ifndef NOSTUTTER else if (a_cycles && (trpt->o_pm&2)) /* new 4.2.4 */ { depth--; trpt--; uerror("accept stutter"); depth++; trpt++; }#endif#endif }Done: if (!(trpt->tau&8)) /* not in atomic seqs */ {#ifndef MA#if defined(FULLSTACK) || defined(CNTRSTACK)#ifdef VERI if (boq == -1 && (((trpt->tau&4) && !(trpt->tau&128)) || ( (trpt-1)->tau&128)))#else if (boq == -1)#endif {#ifdef DEBUG2#if defined(FULLSTACK) printf("%%d: zapping %%u (%%d)\n", depth, trpt->ostate, (trpt->ostate)?trpt->ostate->tagged:0);#endif#endif onstack_zap(); }#endif#else#ifdef VERI if (boq == -1 && (((trpt->tau&4) && !(trpt->tau&128)) || ( (trpt-1)->tau&128)))#else if (boq == -1)#endif {#ifdef DEBUG printf("%%d: zapping\n", depth);#endif onstack_zap();#ifndef NOREDUCE if (trpt->proviso) gstore((char *) &now, vsize, 1);#endif }#endif#ifndef SAFETY if (_n != 0#ifdef VERI /* --after-- a program-step, i.e., */ /* after backtracking a claim-step */ && (trpt->tau&4) /* with at least one running process */ /* unless in a stuttered accept state */ && ((now._nr_pr > 1) || (trpt->o_pm&2))#endif && !(now._a_t&1)) {#ifndef NOFAIR if (fairness) {#ifdef VERBOSE cpu_printf("Consider check %%d %%d...\n", now._a_t, now._cnt[0]);#endif if ((now._a_t&2) /* A-bit */ && (now._cnt[0] == 1)) checkcycles(); } else#endif if (a_cycles && (trpt->o_pm&2)) checkcycles(); }#endif } if (depth > 0) {#if NCORE>1 && defined(FULL_TRAIL) if (upto > 0) { Pop_Stack_Tree(); }#endif goto Up; }} #elsevoid new_state(void) { /* place holder */ }#endifvoidassert(int a, char *s, int ii, int tt, Trans *t){ if (!a && !noasserts) { char bad[1024]; strcpy(bad, "assertion violated "); if (strlen(s) > 1000) { strncpy(&bad[19], (const char *) s, 1000); bad[1019] = '\0'; } else strcpy(&bad[19], s); uerror(bad); }}#ifndef NOBOUNDCHECKintBoundcheck(int x, int y, int a1, int a2, Trans *a3){ assert((x >= 0 && x < y), "- invalid array index", a1, a2, a3); return x;}#endifvoidwrap_stats(void){ if (nShadow>0) printf("%%9.8g states, stored (%%g visited)\n", nstates - nShadow, nstates); else printf("%%9.8g states, stored\n", nstates);#ifdef BFS#if SYNC printf(" %%8g nominal states (- rv and atomic)\n", nstates-midrv-nlinks+revrv); printf(" %%8g rvs succeeded\n", midrv-failedrv);#else printf(" %%8g nominal states (stored-atomic)\n", nstates-nlinks);#endif#ifdef DEBUG printf(" %%8g midrv\n", midrv); printf(" %%8g failedrv\n", failedrv); printf(" %%8g revrv\n", revrv);#endif#endif printf("%%9.8g states, matched\n", truncs);#ifdef CHECK printf("%%9.8g matches within stack\n",truncs2);#endif if (nShadow>0) printf("%%9.8g transitions (= visited+matched)\n", nstates+truncs); else printf("%%9.8g transitions (= stored+matched)\n", nstates+truncs); printf("%%9.8g atomic steps\n", nlinks); if (nlost) printf("%%g lost messages\n", (double) nlost);#ifndef BITSTATE #ifndef MA printf("hash conflicts: %%9.8g (resolved)\n", hcmp); #ifndef AUTO_RESIZE if (hcmp > (double) (1< 100.)\n\n", (double)(((double) udmem) * 8.0) / (double) nstates); else printf("\nhash factor: %%4g (best if > 100.)\n\n", (double)(1<<(ssize-8)) / (double) nstates * 256.0); printf("bits set per state: %%u (-k%%u)\n", hfns, hfns); #if 0 if (udmem) { printf("total bits available: %%8g (-M%%ld)\n", ((double) udmem) * 8.0, udmem/(1024L*1024L)); } else printf("total bits available: %%8g (-w%%d)\n", ((double) (ONE_L << (ssize-4)) * 16.0), ssize); #endif#endif#ifdef BFS_DISK printf("bfs disk reads: %%ld writes %%ld -- diff %%ld\n", bfs_dsk_reads, bfs_dsk_writes, bfs_dsk_writes-bfs_dsk_reads); if (bfs_dsk_read >= 0) (void) close(bfs_dsk_read); if (bfs_dsk_write >= 0) (void) close(bfs_dsk_write); (void) unlink("pan_bfs_dsk.tmp");#endif}voidwrapup(void){#if 1 double nr1, nr2, nr3 = 0.0, nr4, nr5 = 0.0; #if !defined(MA) && (defined(MEMCNT) || defined(MEMLIM)) int mverbose = 1; #else int mverbose = verbose; #endif#endif#if NCORE>1 if (verbose) cpu_printf("wrapup -- %%d error(s)\n", errors); if (core_id != 0) {#ifdef USE_DISK void dsk_stats(void); dsk_stats();#endif if (search_terminated != NULL) { *search_terminated |= 2; /* wrapup */ } exit(0); /* normal termination, not an error */ }#endif#if !defined(WIN32) && !defined(WIN64) signal(SIGINT, SIG_DFL);#endif printf("\n(%%s)\n", SpinVersion); if (!done) printf("Warning: Search not completed\n");#ifdef SC (void) unlink((const char *)stackfile);#endif#if NCORE>1 if (a_cycles) { printf(" + Multi-Core (NCORE=%%d)\n", NCORE); } else { printf(" + Multi-Core (NCORE=%%d -z%%d)\n", NCORE, z_handoff); }#endif#ifdef BFS printf(" + Using Breadth-First Search\n");#endif#ifndef NOREDUCE printf(" + Partial Order Reduction\n");#endif#ifdef REVERSE printf(" + Reverse Depth-First Search Order\n");#endif#ifdef T_REVERSE printf(" + Reverse Transition Ordering\n");#endif#ifdef T_RAND printf(" + Randomized Transition Ordering\n");#endif#ifdef P_RAND printf(" + Randomized Process Ordering\n");#endif#ifdef BCS printf(" + Scheduling Restriction (-L%%d)\n", sched_max);#endif#ifdef COLLAPSE printf(" + Compression\n");#endif#ifdef MA printf(" + Graph Encoding (-DMA=%%d)\n", MA); #ifdef R_XPT printf(" Restarted from checkpoint %%s.xpt\n", PanSource); #endif#endif#ifdef CHECK #ifdef FULLSTACK printf(" + FullStack Matching\n"); #endif #ifdef CNTRSTACK printf(" + CntrStack Matching\n"); #endif#endif#ifdef BITSTATE printf("\nBit statespace search for:\n");#else#ifdef HC printf("\nHash-Compact %%d search for:\n", HC);#else printf("\nFull statespace search for:\n");#endif#endif#ifdef EVENT_TRACE#ifdef NEGATED_TRACE printf(" notrace assertion +\n");#else printf(" trace assertion +\n");#endif#endif#ifdef VERI printf(" never claim +\n"); printf(" assertion violations "); if (noasserts) printf("- (disabled by -A flag)\n"); else printf("+ (if within scope of claim)\n");#else#ifdef NOCLAIM printf(" never claim - (not selected)\n");#else printf(" never claim - (none specified)\n");#endif printf(" assertion violations "); if (noasserts) printf("- (disabled by -A flag)\n"); else printf("+\n");#endif#ifndef SAFETY#ifdef NP printf(" non-progress cycles ");#else printf(" acceptance cycles ");#endif if (a_cycles) printf("+ (fairness %%sabled)\n", fairness?"en":"dis"); else printf("- (not selected)\n");#else printf(" cycle checks - (disabled by -DSAFETY)\n");#endif#ifdef VERI printf(" invalid end states - "); printf("(disabled by "); if (noends) printf("-E flag)\n\n"); else printf("never claim)\n\n");#else printf(" invalid end states "); if (noends) printf("- (disabled by -E flag)\n\n"); else printf("+\n\n");#endif printf("State-vector %%d byte, depth reached %%ld", hmax,#if NCORE>1 (nr_handoffs * z_handoff) +#endif mreached); printf(", errors: %%d\n", errors); fflush(stdout);#ifdef MA if (done) { extern void dfa_stats(void); if (maxgs+a_cycles+2 < MA) printf("MA stats: -DMA=%%d is sufficient\n", maxgs+a_cycles+2); dfa_stats(); }#endif wrap_stats();#ifdef CHECK printf("stackframes: %%d/%%d\n\n", smax, svmax); printf("stats: fa %%ld, fh %%ld, zh %%ld, zn %%ld - ", Fa, Fh, Zh, Zn); printf("check %%ld holds %%ld\n", Ccheck, Cholds); printf("stack stats: puts %%ld, probes %%ld, zaps %%ld\n", PUT, PROBE, ZAPS);#else printf("\n");#endif#if !defined(BITSTATE) && defined(NOCOMP) if (!verbose) { goto jump_here; }#endif#if 1 nr1 = (nstates-nShadow)* (double)(hmax+sizeof(struct H_el)-sizeof(unsigned)); #ifdef BFS nr2 = 0.0; #else nr2 = (double) ((maxdepth+3)*sizeof(Trail)); #endif #ifndef BITSTATE#if !defined(MA) || defined(COLLAPSE) nr3 = (double) (ONE_L<1 && !defined(SEP_STATE) tmp_nr -= ((double) NCORE * LWQ_SIZE) + GWQ_SIZE; #endif if (tmp_nr < 0.0) tmp_nr = 0.; printf("Stats on memory usage (in Megabytes):\n"); printf("%%9.3f equivalent memory usage for states", nr1/1048576.); /* 1024*1024=1048576 */ printf(" (stored*(State-vector + overhead))\n"); #if NCORE>1 && !defined(WIN32) && !defined(WIN64) printf("%%9.3f shared memory reserved for state storage\n", mem_reserved/1048576.); #ifdef SEP_HEAP printf(" in %%d local heaps of %%7.3f MB each\n", NCORE, mem_reserved/(NCORE*1048576.)); #endif printf("\n"); #endif#ifdef BITSTATE if (udmem) printf("%%9.3f memory used for hash array (-M%%ld)\n", nr3/1048576., udmem/(1024L*1024L)); else printf("%%9.3f memory used for hash array (-w%%d)\n", nr3/1048576., ssize); if (nr5 > 0.0) printf("%%9.3f memory used for bit stack\n", nr5/1048576.); remainder = remainder - nr3 - nr5;#else printf("%%9.3f actual memory usage for states", tmp_nr/1048576.); remainder -= tmp_nr; printf(" ("); if (tmp_nr > 0.) { if (tmp_nr > nr1) printf("unsuccessful "); printf("compression: %%.2f%%%%)\n", (100.0*tmp_nr)/nr1); } else printf("less than 1k)\n");#ifndef MA if (tmp_nr > 0.) { printf(" state-vector as stored = %%.0f byte", (tmp_nr)/(nstates-nShadow) - (double) (sizeof(struct H_el) - sizeof(unsigned))); printf(" + %%ld byte overhead\n", (long int) sizeof(struct H_el)-sizeof(unsigned)); }#endif#if !defined(MA) || defined(COLLAPSE) printf("%%9.3f memory used for hash table (-w%%d)\n", nr3/1048576., ssize); remainder -= nr3;#endif#endif#ifndef BFS printf("%%9.3f memory used for DFS stack (-m%%ld)\n", nr2/1048576., maxdepth); remainder -= nr2;#endif#if NCORE>1 remainder -= ((double) NCORE * LWQ_SIZE) + GWQ_SIZE; printf("%%9.3f shared memory used for work-queues\n", (GWQ_SIZE + (double) NCORE * LWQ_SIZE) /1048576.); printf(" in %%d queues of %%7.3f MB each", NCORE, (double) LWQ_SIZE /1048576.); #ifndef NGQ printf(" + a global q of %%7.3f MB\n", (double) GWQ_SIZE / 1048576.); #else printf("\n"); #endif #endif if (remainder - fragment > 1048576.) printf("%%9.3f other (proc and chan stacks)\n", (remainder-fragment)/1048576.); if (fragment > 1048576.) printf("%%9.3f memory lost to fragmentation\n", fragment/1048576.); printf("%%9.3f total actual memory usage\n\n", memcnt/1048576.); } #ifndef MA else #endif#endif#if !defined(BITSTATE) && defined(NOCOMP)jump_here:#endif#ifndef MA printf("%%9.3f memory usage (Mbyte)\n\n", memcnt/1048576.);#endif#ifdef COLLAPSE printf("nr of templates: [ globals chans procs ]\n"); printf("collapse counts: [ "); { int i; for (i = 0; i < 256+2; i++) if (ncomps[i] != 0) printf("%%d ", ncomps[i]); printf("]\n"); }#endif if ((done || verbose) && !no_rck) do_reach();#ifdef PEG { int i; printf("\nPeg Counts (transitions executed):\n"); for (i = 1; i < NTRANS; i++) { if (peg[i]) putpeg(i, peg[i]); } }#endif#ifdef VAR_RANGES dumpranges();#endif#ifdef SVDUMP if (vprefix > 0) close(svfd);#endif#ifdef LOOPSTATE printf("%%g loopstates hit\n", cnt_loops);#endif#ifdef NSUCC dump_succ();#endif#if NCORE>1 && defined(T_ALERT) crash_report();#endif pan_exit(0);} voidstopped(int arg){ printf("Interrupted\n");#if NCORE>1 was_interrupted = 1;#endif wrapup(); pan_exit(0);}#ifdef SFH/* * super fast hash, based on Paul Hsieh's function * http://www.azillionmonkeys.com/qed/hash.html */#include #undef get16bits #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) #define get16bits(d) (*((const uint16_t *) (d))) #endif #ifndef get16bits #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ +(uint32_t)(((const uint8_t *)(d))[0]) ) #endifvoidd_sfh(const char *s, int len){ uint32_t h = len, tmp; int rem; rem = len & 3; len >>= 2; for ( ; len > 0; len--) { h += get16bits(s); tmp = (get16bits(s+2) << 11) ^ h; h = (h << 16) ^ tmp; s += 2*sizeof(uint16_t); h += h >> 11; } switch (rem) { case 3: h += get16bits(s); h ^= h << 16; h ^= s[sizeof(uint16_t)] << 18; h += h >> 11; break; case 2: h += get16bits(s); h ^= h << 11; h += h >> 17; break; case 1: h += *s; h ^= h << 10; h += h >> 1; break; } h ^= h << 3; h += h >> 5; h ^= h << 4; h += h >> 17; h ^= h << 25; h += h >> 6; K1 = h;}#endif#include #if defined(HASH64) || defined(WIN64)/* 64-bit Jenkins hash, 1997 * http://burtleburtle.net/bob/c/lookup8.c */#define mix(a,b,c) \{ a -= b; a -= c; a ^= (c>>43); \ b -= c; b -= a; b ^= (a<<9); \ c -= a; c -= b; c ^= (b>>8); \ a -= b; a -= c; a ^= (c>>38); \ b -= c; b -= a; b ^= (a<<23); \ c -= a; c -= b; c ^= (b>>5); \ a -= b; a -= c; a ^= (c>>35); \ b -= c; b -= a; b ^= (a<<49); \ c -= a; c -= b; c ^= (b>>11); \ a -= b; a -= c; a ^= (c>>12); \ b -= c; b -= a; b ^= (a<<18); \ c -= a; c -= b; c ^= (b>>22); \}#else/* 32-bit Jenkins hash, 2006 * http://burtleburtle.net/bob/c/lookup3.c */#define rot(x,k) (((x)<<(k))|((x)>>(32-(k))))#define mix(a,b,c) \{ a -= c; a ^= rot(c, 4); c += b; \ b -= a; b ^= rot(a, 6); a += c; \ c -= b; c ^= rot(b, 8); b += a; \ a -= c; a ^= rot(c,16); c += b; \ b -= a; b ^= rot(a,19); a += c; \ c -= b; c ^= rot(b, 4); b += a; \}#define final(a,b,c) \{ c ^= b; c -= rot(b,14); \ a ^= c; a -= rot(c,11); \ b ^= a; b -= rot(a,25); \ c ^= b; c -= rot(b,16); \ a ^= c; a -= rot(c,4); \ b ^= a; b -= rot(a,14); \ c ^= b; c -= rot(b,24); \}#endifvoidd_hash(uchar *kb, int nbytes){ uint8_t *bp;#if defined(HASH64) || defined(WIN64) uint64_t a = 0, b, c, n; uint64_t *k = (uint64_t *) kb;#else uint32_t a, b, c, n; uint32_t *k = (uint32_t *) kb;#endif /* extend to multiple of words, if needed */ n = nbytes/WS; /* nr of words */ a = nbytes - (n*WS); if (a > 0) { n++; bp = kb + nbytes; switch (a) { case 3: *bp++ = 0; /* fall thru */ case 2: *bp++ = 0; /* fall thru */ case 1: *bp = 0; case 0: break; } }#if defined(HASH64) || defined(WIN64) b = HASH_CONST[HASH_NR]; c = 0x9e3779b97f4a7c13LL; /* arbitrary value */ while (n >= 3) { a += k[0]; b += k[1]; c += k[2]; mix(a,b,c); n -= 3; k += 3; } c += (((uint64_t) nbytes)<<3); switch (n) { case 2: b += k[1]; case 1: a += k[0]; case 0: break; } mix(a,b,c);#else a = c = 0xdeadbeef + (n<<2); b = HASH_CONST[HASH_NR]; while (n > 3) { a += k[0]; b += k[1]; c += k[2]; mix(a,b,c); n -= 3; k += 3; } switch (n) { case 3: c += k[2]; case 2: b += k[1]; case 1: a += k[0]; case 0: break; } final(a,b,c);#endif j1_spin = c&nmask; j3 = a&7; /* 1st bit */ j2 = b&nmask; j4 = (a>>3)&7; /* 2nd bit */ K1 = c; K2 = b;}voids_hash(uchar *cp, int om){#if defined(SFH) d_sfh((const char *) cp, om); /* sets K1 */#else d_hash(cp, om); /* sets K1 etc */#endif#ifdef BITSTATE if (S_Tab == H_tab) j1_spin = K1 %% omaxdepth; else#endif if (ssize < 8*WS) j1_spin = K1&mask; else j1_spin = K1;}#ifndef RANDSTORint *prerand;voidinirand(void){ int i; srand(123); /* fixed startpoint */ prerand = (int *) emalloc((omaxdepth+3)*sizeof(int)); for (i = 0; i < omaxdepth+3; i++) prerand[i] = rand();}intpan_rand(void){ if (!prerand) inirand(); return prerand[depth];}#endifvoidset_masks(void) /* 4.2.5 */{ if (WS == 4 && ssize >= 32) { mask = 0xffffffff;#ifdef BITSTATE switch (ssize) { case 34: nmask = (mask>>1); break; case 33: nmask = (mask>>2); break; default: nmask = (mask>>3); break; }#else nmask = mask;#endif } else if (WS == 8) { mask = ((ONE_L<>3;#else nmask = mask;#endif } else if (WS != 4) { fprintf(stderr, "pan: wordsize %%ld not supported\n", (long int) WS); exit(1); } else /* WS == 4 and ssize < 32 */ { mask = ((ONE_L<>3); }}static long reclaim_size;static char *reclaim_mem;#if defined(AUTO_RESIZE) && !defined(BITSTATE) && !defined(MA)#if NCORE>1 #error cannot combine AUTO_RESIZE with NCORE>1 yet#endifstatic struct H_el **N_tab;voidreverse_capture(struct H_el *p){ if (!p) return; reverse_capture(p->nxt); /* last element of list moves first */ /* to preserve list-order */ j2 = p->m_K1; if (ssize < 8*WS) /* probably always true */ { j2 &= mask; } p->nxt = N_tab[j2]; N_tab[j2] = p;}voidresize_hashtable(void){ if (WS == 4 && ssize >= 27 - 1) { return; /* canot increase further */ } ssize += 2; /* 4x size */ printf("pan: resizing hashtable to -w%%d.. ", ssize); N_tab = (struct H_el **) emalloc((ONE_L<0) s_rand = T_RAND;#elif defined(P_RAND) && (P_RAND>0) s_rand = P_RAND;#endif#ifdef PUTPID { char *ptr = strrchr(argv[0], '/'); if (ptr == NULL) { ptr = argv[0]; } else { ptr++; } progname = emalloc(strlen(ptr)); strcpy(progname, ptr); /* printf("progname: %%s\n", progname); */ }#endif#ifdef BITSTATE bstore = bstore_reg; /* default */#endif#if NCORE>1 { int i, j; strcpy(o_cmdline, ""); for (j = 1; j < argc; j++) { strcat(o_cmdline, argv[j]); strcat(o_cmdline, " "); } /* printf("Command Line: %%s\n", o_cmdline); */ if (strlen(o_cmdline) >= sizeof(o_cmdline)) { Uerror("option list too long"); } }#endif while (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) {#ifndef SAFETY#ifdef NP case 'a': fprintf(efd, "error: -a disabled"); usage(efd); break;#else case 'a': a_cycles = 1; break;#endif#endif case 'A': noasserts = 1; break; case 'b': bounded = 1; break;#ifdef HAS_CODE case 'C': coltrace = 1; goto samething;#endif case 'c': upto = atoi(&argv[1][2]); break; case 'd': state_tables++; break; case 'e': every_error = 1; upto = 0; Nr_Trails = 1; break; case 'E': noends = 1; break;#ifdef SC case 'F': if (strlen(argv[1]) > 2) stackfile = &argv[1][2]; break;#endif#if !defined(SAFETY) && !defined(NOFAIR) case 'f': fairness = 1; break;#endif#ifdef HAS_CODE case 'g': gui = 1; goto samething;#endif case 'h': if (!argv[1][2]) usage(efd); else HASH_NR = atoi(&argv[1][2])%%100; break; case 'I': iterative = 2; every_error = 1; break; case 'i': iterative = 1; every_error = 1; break; case 'J': like_java = 1; break; /* Klaus Havelund */#ifdef BITSTATE case 'k': hfns = atoi(&argv[1][2]); break;#endif#ifdef BCS case 'L': sched_max = atoi(&argv[1][2]); if (sched_max > 255) /* stored as one byte */ { fprintf(efd, "warning: using max bound (255)\n"); sched_max = 255; } #ifndef NOREDUCE if (sched_max == 0) { fprintf(efd, "warning: with (default) bound -L0, "); fprintf(efd, "using -DNOREDUCE performs better\n"); } #endif break;#endif#ifndef SAFETY#ifdef NP case 'l': a_cycles = 1; break;#else case 'l': fprintf(efd, "error: -l disabled"); usage(efd); break;#endif#endif#ifdef BITSTATE case 'M': udmem = atoi(&argv[1][2]); break; case 'G': udmem = atoi(&argv[1][2]); udmem *= 1024; break;#else case 'M': case 'G': fprintf(stderr, "-M and -G affect only -DBITSTATE\n"); break;#endif case 'm': maxdepth = atoi(&argv[1][2]); break; case 'n': no_rck = 1; break; case 'P': readtrail = 1; onlyproc = atoi(&argv[1][2]); if (argv[2][0] != '-') /* check next arg */ { trailfilename = argv[2]; argc--; argv++; /* skip next arg */ } break;#ifdef SVDUMP case 'p': vprefix = atoi(&argv[1][2]); break;#endif#if NCORE==1 case 'Q': quota = (double) 60.0 * (double) atoi(&argv[1][2]); #ifndef FREQ freq /= 10.; /* for better resolution */ #endif break;#endif case 'q': strict = 1; break; case 'R':#if defined(T_RAND) || defined(P_RAND) || defined(RANDSTOR) if (argv[1][2] == 'S') /* e.g., -RS76842 */ { s_rand = atoi(&argv[1][3]); } else#endif { Nrun = atoi(&argv[1][2]); } break;#ifdef HAS_CODE case 'r':samething: readtrail = 1; if (isdigit(argv[1][2])) whichtrail = atoi(&argv[1][2]); else if (argc > 2 && argv[2][0] != '-') /* check next arg */ { trailfilename = argv[2]; argc--; argv++; /* skip next arg */ } break; case 'S': silent = 1; goto samething;#endif#ifdef BITSTATE case 's': hfns = 1; break;#endif case 'T': TMODE = 0444; break; case 't': if (argv[1][2]) tprefix = &argv[1][2]; break; case 'V': start_timer(); printf("Generated by %%s\n", SpinVersion); to_compile(); pan_exit(2); break; case 'v': verbose++; break; case 'w': ssize = atoi(&argv[1][2]); break; case 'Y': signoff = 1; break; case 'X': efd = stdout; break; case 'x': exclusive = 1; break;#if NCORE>1 /* -B ip is passthru to proxy of remote ip address: */ case 'B': argc--; argv++; break; case 'Q': worker_pids[0] = atoi(&argv[1][2]); break; /* -Un means that the nth worker should be instantiated as a proxy */ case 'U': proxy_pid = atoi(&argv[1][2]); break; /* -W means that this copy is started by a cluster-server as a remote */ /* this flag is passed to ./pan_proxy, which interprets it */ case 'W': remote_party++; break; case 'Z': core_id = atoi(&argv[1][2]); if (verbose) { printf("cpu%%d: pid %%d parent %%d\n", core_id, getpid(), worker_pids[0]); } break; case 'z': z_handoff = atoi(&argv[1][2]); break;#else case 'z': break; /* ignored for single-core */#endif default : fprintf(efd, "saw option -%%c\n", argv[1][1]); usage(efd); break; } argc--; argv++; } if (iterative && TMODE != 0666) { TMODE = 0666; fprintf(efd, "warning: -T ignored when -i or -I is used\n"); }#if defined(HASH32) && !defined(SFH) if (WS > 4) { fprintf(efd, "strong warning: compiling -DHASH32 on a 64-bit machine\n"); fprintf(efd, " without -DSFH can slow down performance a lot\n"); }#endif#if defined(WIN32) || defined(WIN64) if (TMODE == 0666) TMODE = _S_IWRITE | _S_IREAD; else TMODE = _S_IREAD;#endif#if NCORE>1 store_proxy_pid = proxy_pid; /* for checks in mem_file() and someone_crashed() */ if (core_id != 0) { proxy_pid = 0; } #ifndef SEP_STATE if (core_id == 0 && a_cycles) { fprintf(efd, "hint: this search may be more efficient "); fprintf(efd, "if pan.c is compiled -DSEP_STATE\n"); } #endif if (z_handoff < 0) { z_handoff = 20; /* conservative default - for non-liveness checks */ }#if defined(NGQ) || defined(LWQ_FIXED) LWQ_SIZE = (double) (128.*1048576.);#else LWQ_SIZE = (double) ( z_handoff + 2.) * (double) sizeof(SM_frame);#endif #if NCORE>2 if (a_cycles) { fprintf(efd, "warning: the intended nr of cores to be used in liveness mode is 2\n"); #ifndef SEP_STATE fprintf(efd, "warning: without -DSEP_STATE there is no guarantee that all liveness violations are found\n"); #endif } #endif #ifdef HAS_HIDDEN #error cannot use hidden variables when compiling multi-core #endif#endif#ifdef BITSTATE if (hfns <= 0) { hfns = 1; fprintf(efd, "warning: using -k%%d as minimal usable value\n", hfns); }#endif omaxdepth = maxdepth;#ifdef BITSTATE if (WS == 4 && ssize > 34) { ssize = 34; fprintf(efd, "warning: using -w%%d as max usable value\n", ssize);/* * -w35 would not work: 35-3 = 32 but 1^31 is the largest * power of 2 that can be represented in an unsigned long */ }#else if (WS == 4 && ssize > 27) { ssize = 27; fprintf(efd, "warning: using -w%%d as max usable value\n", ssize);/* * for emalloc, the lookup table size multiplies by 4 for the pointers * the largest power of 2 that can be represented in a ulong is 1^31 * hence the largest number of lookup table slots is 31-4 = 27 */ }#endif#ifdef SC hiwater = HHH = maxdepth-10; DDD = HHH/2; if (!stackfile) { stackfile = (char *) emalloc(strlen(PanSource)+4+1); sprintf(stackfile, "%%s._s_", PanSource); } if (iterative) { fprintf(efd, "error: cannot use -i or -I with -DSC\n"); pan_exit(1); }#endif#if (defined(R_XPT) || defined(W_XPT)) && !defined(MA) #warning -DR_XPT and -DW_XPT assume -DMA (ignored)#endif if (iterative && a_cycles) fprintf(efd, "warning: -i or -I work for safety properties only\n");#ifdef BFS #ifdef SC #error -DBFS not compatible with -DSC #endif #ifdef HAS_LAST #error -DBFS not compatible with _last #endif #ifdef HAS_STACK #error cannot use c_track UnMatched with BFS #endif #ifdef BCS #error -DBFS not compatible with -DBCS #endif #ifdef REACH #warning -DREACH is redundant when -DBFS is used #endif#endif#ifdef BCS #ifdef P_RAND #error cannot combine -DBCS and -DP_RAND #endif #ifdef BFS #error cannot combine -DBCS and -DBFS #endif#endif#if defined(MERGED) && defined(PEG) #error to use -DPEG use: spin -o3 -a#endif#ifdef HC #ifdef SFH #error cannot combine -DHC and -DSFH /* use of NOCOMP is the real reason */ #else #ifdef NOCOMP #error cannot combine -DHC and -DNOCOMP #endif #endif #ifdef BITSTATE #error cannot combine -DHC and -DBITSTATE #endif#endif#if defined(SAFETY) && defined(NP) #error cannot combine -DNP and -DBFS or -DSAFETY#endif#ifdef MA #ifdef BITSTATE #error cannot combine -DMA and -DBITSTATE #endif #if MA <= 0 #error usage: -DMA=N with N > 0 and N < VECTORSZ #endif#endif#ifdef COLLAPSE #ifdef BITSTATE #error cannot combine -DBITSTATE and -DCOLLAPSE #endif #ifdef SFH #error cannot combine -DCOLLAPSE and -DSFH /* use of NOCOMP is the real reason */ #else #ifdef NOCOMP #error cannot combine -DCOLLAPSE and -DNOCOMP #endif #endif#endif if (maxdepth <= 0 || ssize <= 1) usage(efd);#if SYNC>0 && !defined(NOREDUCE) if (a_cycles && fairness) { fprintf(efd, "error: p.o. reduction not compatible with "); fprintf(efd, "fairness (-f) in models\n"); fprintf(efd, " with rendezvous operations: "); fprintf(efd, "recompile with -DNOREDUCE\n"); pan_exit(1); }#endif#if defined(REM_VARS) && !defined(NOREDUCE) #warning p.o. reduction not compatible with remote varrefs (use -DNOREDUCE)#endif#if defined(NOCOMP) && !defined(BITSTATE) if (a_cycles) { fprintf(efd, "error: use of -DNOCOMP voids -l and -a\n"); pan_exit(1); }#endif#ifdef MEMLIM memlim = ((double) MEMLIM) * (double) (1<<20); /* size in Mbyte */#endif#ifndef BITSTATE if (Nrun > 1) HASH_NR = Nrun - 1;#endif if (Nrun < 1 || Nrun > 32) { fprintf(efd, "error: invalid arg for -R\n"); usage(efd); }#ifndef SAFETY if (fairness && !a_cycles) { fprintf(efd, "error: -f requires -a or -l\n"); usage(efd); } #if ACCEPT_LAB==0 if (a_cycles) { fprintf(efd, "error: no accept labels defined "); fprintf(efd, "in model (for option -a)\n"); usage(efd); } #endif#endif#ifndef NOREDUCE #ifdef HAS_ENABLED #error use of enabled() requires -DNOREDUCE #endif #ifdef HAS_PCVALUE #error use of pcvalue() requires -DNOREDUCE #endif #ifdef HAS_BADELSE #error use of 'else' combined with i/o stmnts requires -DNOREDUCE #endif #if defined(HAS_LAST) && !defined(BCS) #error use of _last requires -DNOREDUCE #endif#endif#if SYNC>0 && !defined(NOREDUCE) #ifdef HAS_UNLESS fprintf(efd, "warning: use of a rendezvous stmnts in the escape\n"); fprintf(efd, " of an unless clause, if present, could make p.o. reduction\n"); fprintf(efd, " invalid (use -DNOREDUCE to avoid this)\n"); #ifdef BFS fprintf(efd, " (this type of rv is also not compatible with -DBFS)\n"); #endif #endif#endif#if SYNC>0 && defined(BFS) #warning use of rendezvous with BFS does not preserve all invalid endstates#endif#if !defined(REACH) && !defined(BITSTATE) if (iterative != 0 && a_cycles == 0) { fprintf(efd, "warning: -i and -I need -DREACH to work accurately\n"); }#endif#if defined(BITSTATE) && defined(REACH) #warning -DREACH is voided by -DBITSTATE#endif#if defined(MA) && defined(REACH) #warning -DREACH is voided by -DMA#endif#if defined(FULLSTACK) && defined(CNTRSTACK) #error cannot combine -DFULLSTACK and -DCNTRSTACK#endif#if defined(VERI) #if ACCEPT_LAB>0 #ifndef BFS if (!a_cycles #ifdef HAS_CODE && !readtrail #endif #if NCORE>1 && core_id == 0 #endif && !state_tables) { fprintf(efd, "warning: never claim + accept labels "); fprintf(efd, "requires -a flag to fully verify\n"); } #else if (!state_tables #ifdef HAS_CODE && !readtrail #endif ) { fprintf(efd, "warning: verification in BFS mode "); fprintf(efd, "is restricted to safety properties\n"); } #endif #endif#endif#ifndef SAFETY if (!a_cycles #ifdef HAS_CODE && !readtrail #endif #if NCORE>1 && core_id == 0 #endif && !state_tables) { fprintf(efd, "hint: this search is more efficient "); fprintf(efd, "if pan.c is compiled -DSAFETY\n"); } #ifndef NOCOMP if (!a_cycles) { S_A = 0; } else { if (!fairness) { S_A = 1; /* _a_t */ #ifndef NOFAIR } else /* _a_t and _cnt[NFAIR] */ { S_A = (&(now._cnt[0]) - (uchar *) &now) + NFAIR - 2; /* -2 because first two uchars in now are masked */ #endif } } #endif#endif signal(SIGINT, stopped); set_masks();#ifdef BFS trail = (Trail *) emalloc(6*sizeof(Trail)); trail += 3;#else trail = (Trail *) emalloc((maxdepth+3)*sizeof(Trail)); trail++; /* protect trpt-1 refs at depth 0 */#endif#ifdef SVDUMP if (vprefix > 0) { char nm[64]; sprintf(nm, "%%s.svd", PanSource); if ((svfd = creat(nm, TMODE)) < 0) { fprintf(efd, "couldn't create %%s\n", nm); vprefix = 0; } }#endif#ifdef RANDSTOR srand(s_rand);#endif#if SYNC>0 && ASYNC==0 set_recvs();#endif run(); done = 1; wrapup(); return 0;}voidusage(FILE *fd){ fprintf(fd, "%%s\n", SpinVersion); fprintf(fd, "Valid Options are:\n");#ifndef SAFETY#ifdef NP fprintf(fd, " -a -> is disabled by -DNP "); fprintf(fd, "(-DNP compiles for -l only)\n");#else fprintf(fd, " -a find acceptance cycles\n");#endif#else fprintf(fd, " -a,-l,-f -> are disabled by -DSAFETY\n");#endif fprintf(fd, " -A ignore assert() violations\n"); fprintf(fd, " -b consider it an error to exceed the depth-limit\n"); fprintf(fd, " -cN stop at Nth error "); fprintf(fd, "(defaults to -c1)\n"); fprintf(fd, " -d print state tables and stop\n"); fprintf(fd, " -e create trails for all errors\n"); fprintf(fd, " -E ignore invalid end states\n");#ifdef SC fprintf(fd, " -Ffile use 'file' to store disk-stack\n");#endif#ifndef NOFAIR fprintf(fd, " -f add weak fairness (to -a or -l)\n");#endif fprintf(fd, " -hN use different hash-seed N:1..32\n"); fprintf(fd, " -i search for shortest path to error\n"); fprintf(fd, " -I like -i, but approximate and faster\n"); fprintf(fd, " -J reverse eval order of nested unlesses\n");#ifdef BITSTATE fprintf(fd, " -kN set N bits per state (defaults to 3)\n");#endif#ifdef BCS fprintf(fd, " -LN set scheduling restriction to N (default 10)\n");#endif#ifndef SAFETY#ifdef NP fprintf(fd, " -l find non-progress cycles\n");#else fprintf(fd, " -l find non-progress cycles -> "); fprintf(fd, "disabled, requires "); fprintf(fd, "compilation with -DNP\n");#endif#endif#ifdef BITSTATE fprintf(fd, " -MN use N Megabytes for bitstate hash array\n"); fprintf(fd, " -GN use N Gigabytes for bitstate hash array\n");#endif fprintf(fd, " -mN max depth N steps (default=10k)\n"); fprintf(fd, " -n no listing of unreached states\n");#ifdef SVDUMP fprintf(fd, " -pN create svfile (save N bytes per state)\n");#endif fprintf(fd, " -QN set time-limit on execution of N minutes\n"); fprintf(fd, " -q require empty chans in valid end states\n");#ifdef HAS_CODE fprintf(fd, " -r read and execute trail - can add -v,-n,-PN,-g,-C\n"); fprintf(fd, " -rN read and execute N-th error trail\n"); fprintf(fd, " -C read and execute trail - columnated output (can add -v,-n)\n"); fprintf(fd, " -PN read and execute trail - restrict trail output to proc N\n"); fprintf(fd, " -g read and execute trail + msc gui support\n"); fprintf(fd, " -S silent replay: only user defined printfs show\n");#endif#if defined(T_RAND) || defined(P_RAND) || defined(RANDSTOR) fprintf(fd, " -RSN use randomization seed N\n");#endif#ifdef BITSTATE fprintf(fd, " -RN repeat run Nx with N "); fprintf(fd, "[1..32] independent hash functions\n"); fprintf(fd, " -s same as -k1 (single bit per state)\n");#endif fprintf(fd, " -T create trail files in read-only mode\n"); fprintf(fd, " -tsuf replace .trail with .suf on trailfiles\n"); fprintf(fd, " -V print SPIN version number\n"); fprintf(fd, " -v verbose -- filenames in unreached state listing\n"); fprintf(fd, " -wN hashtable of 2^N entries "); fprintf(fd, "(defaults to -w%%d)\n", ssize); fprintf(fd, " -x do not overwrite an existing trail file\n");#if NCORE>1 fprintf(fd, " -zN handoff states below depth N to 2nd cpu (multi_core)\n");#endif#ifdef HAS_CODE fprintf(fd, "\n options -r, -C, -PN, -g, and -S can optionally be followed by\n"); fprintf(fd, " a filename argument, as in '-r filename', naming the trailfile\n");#endif#if NCORE>1 multi_usage(fd);#endif exit(1);}char *Malloc(unsigned long n){ char *tmp;#ifdef MEMLIM if (memcnt+ (double) n > memlim) goto err;#endif#if 1 tmp = (char *) malloc(n); if (!tmp)#else /* on linux machines, a large amount of memory is set aside * for malloc, whether it is used or not * using sbrk would make this memory arena inaccessible * the reason for using sbrk was originally to provide a * small additional speedup (since this memory is never released) */ tmp = (char *) sbrk(n); if (tmp == (char *) -ONE_L)#endif {#ifdef MEMLIMerr:#endif printf("pan: out of memory\n");#ifdef MEMLIM printf(" %%g bytes used\n", memcnt); printf(" %%g bytes more needed\n", (double) n); printf(" %%g bytes limit\n", memlim);#endif#ifdef COLLAPSE printf("hint: to reduce memory, recompile with\n");#ifndef MA printf(" -DMA=%%d # better/slower compression, or\n", hmax);#endif printf(" -DBITSTATE # supertrace, approximation\n");#else#ifndef BITSTATE printf("hint: to reduce memory, recompile with\n");#ifndef HC printf(" -DCOLLAPSE # good, fast compression, or\n");#ifndef MA printf(" -DMA=%%d # better/slower compression, or\n", hmax);#endif printf(" -DHC # hash-compaction, approximation\n");#endif printf(" -DBITSTATE # supertrace, approximation\n");#endif#endif#if NCORE>1 #ifdef FULL_TRAIL printf(" omit -DFULL_TRAIL or use pan -c0 to reduce memory\n"); #endif #ifdef SEP_STATE printf("hint: to reduce memory, recompile without\n"); printf(" -DSEP_STATE # may be faster, but uses more memory\n"); #endif#endif wrapup(); } memcnt += (double) n; return tmp;}#define CHUNK (100*VECTORSZ)char *emalloc(unsigned long n) /* never released or reallocated */{ char *tmp; if (n == 0) return (char *) NULL; if (n&(sizeof(void *)-1)) /* for proper alignment */ n += sizeof(void *)-(n&(sizeof(void *)-1)); if ((unsigned long) left < n) { grow = (n < CHUNK) ? CHUNK : n; have = Malloc(grow); fragment += (double) left; left = grow; } tmp = have; have += (long) n; left -= (long) n; memset(tmp, 0, n); return tmp;}voidUerror(char *str){ /* always fatal */ uerror(str);#if NCORE>1 sudden_stop("Uerror");#endif wrapup();} #if defined(MA) && !defined(SAFETY)intUnwind(void){ Trans *t; uchar ot, _m; int tt; short II;#ifdef VERBOSE int i;#endif uchar oat = now._a_t; now._a_t &= ~(1|16|32); memcpy((char *) &comp_now, (char *) &now, vsize); now._a_t = oat;Up:#ifdef SC trpt = getframe(depth);#endif#ifdef VERBOSE printf("%%d State: ", depth); for (i = 0; i < vsize; i++) printf("%%d%%s,", ((char *)&now)[i], Mask[i]?"*":""); printf("\n");#endif#ifndef NOFAIR if (trpt->o_pm&128) /* fairness alg */ { now._cnt[now._a_t&1] = trpt->bup.oval; depth--;#ifdef SC trpt = getframe(depth);#else trpt--;#endif goto Q999; }#endif#ifdef HAS_LAST#ifdef VERI { int d; Trail *trl; now._last = 0; for (d = 1; d < depth; d++) { trl = getframe(depth-d); /* was trl = (trpt-d); */ if (trl->pr != 0) { now._last = trl->pr - BASE; break; } } }#else now._last = (depth<1)?0:(trpt-1)->pr;#endif#endif#ifdef EVENT_TRACE now._event = trpt->o_event;#endif if ((now._a_t&1) && depth <= A_depth) { now._a_t &= ~(1|16|32); if (fairness) now._a_t |= 2; /* ? */ A_depth = 0; goto CameFromHere; /* checkcycles() */ } t = trpt->o_t; ot = trpt->o_ot; II = trpt->pr; tt = trpt->o_tt; this = pptr(II); _m = do_reverse(t, II, trpt->o_m);#ifdef VERBOSE printf("%%3ld: proc %%d ", depth, II); printf("reverses %%d, %%d to %%d,", t->forw, tt, t->st); printf(" %%s [abit=%%d,adepth=%%d,", t->tp, now._a_t, A_depth); printf("tau=%%d,%%d] \n", trpt->tau, (trpt-1)->tau);#endif depth--;#ifdef SC trpt = getframe(depth);#else trpt--;#endif /* reached[ot][t->st] = 1; 3.4.13 */ ((P0 *)this)->_p = tt;#ifndef NOFAIR if ((trpt->o_pm&32)) {#ifdef VERI if (now._cnt[now._a_t&1] == 0) now._cnt[now._a_t&1] = 1;#endif now._cnt[now._a_t&1] += 1; }Q999: if (trpt->o_pm&8) { now._a_t &= ~2; now._cnt[now._a_t&1] = 0; } if (trpt->o_pm&16) now._a_t |= 2;#endifCameFromHere: if (memcmp((char *) &now, (char *) &comp_now, vsize) == 0) return depth; if (depth > 0) goto Up; return 0;}#endifstatic char unwinding;voiduerror(char *str){ static char laststr[256]; int is_cycle; if (unwinding) return; /* 1.4.2 */ if (strncmp(str, laststr, 254))#if NCORE>1 cpu_printf("pan:%%d: %%s (at depth %%ld)\n", errors+1, str,#else printf("pan:%%d: %%s (at depth %%ld)\n", errors+1, str,#endif#if NCORE>1 (nr_handoffs * z_handoff) + #endif ((depthfound==-1)?depth:depthfound)); strncpy(laststr, str, 254); errors++;#ifdef HAS_CODE if (readtrail) { wrap_trail(); return; }#endif is_cycle = (strstr(str, " cycle") != (char *) 0); if (!is_cycle) { depth++; trpt++; } if ((every_error != 0) || errors == upto) {#if defined(MA) && !defined(SAFETY) if (is_cycle) { int od = depth; unwinding = 1; depthfound = Unwind(); unwinding = 0; depth = od; }#endif#if NCORE>1 writing_trail = 1;#endif#ifdef BFS if (depth > 1) trpt--; nuerror(str); if (depth > 1) trpt++;#else putrail();#endif#if defined(MA) && !defined(SAFETY) if (strstr(str, " cycle")) { if (every_error) printf("sorry: MA writes 1 trail max\n"); wrapup(); /* no recovery from unwind */ }#endif#if NCORE>1 if (search_terminated != NULL) { *search_terminated |= 4; /* uerror */ } writing_trail = 0;#endif } if (!is_cycle) { depth--; trpt--; /* undo */ }#ifndef BFS if (iterative != 0 && maxdepth > 0) { if (maxdepth > depth) { maxdepth = (iterative == 1)?(depth+1):(depth/2); /* was ...?(depth-1):... GH 5.2.3 */ } warned = 1; printf("pan: reducing search depth to %%ld\n", maxdepth); } else#endif if (errors >= upto && upto != 0) {#if NCORE>1 sudden_stop("uerror");#endif wrapup(); } depthfound = -1;} intxrefsrc(int lno, S_F_MAP *mp, int M, int i){ Trans *T; int j, retval=1; for (T = trans[M][i]; T; T = T->nxt) if (T && T->tp) { if (strcmp(T->tp, ".(goto)") == 0 || strncmp(T->tp, "goto :", 6) == 0) return 1; /* not reported */ printf("\tline %%d", lno); if (verbose) for (j = 0; j < sizeof(mp); j++) if (i >= mp[j].from && i <= mp[j].upto) { printf(", \"%%s\"", mp[j].fnm); break; } printf(", state %%d", i); if (strcmp(T->tp, "") != 0) { char *q; q = transmognify(T->tp); printf(", \"%%s\"", q?q:""); } else if (stopstate[M][i]) printf(", -end state-"); printf("\n"); retval = 0; /* reported */ } return retval;} voidr_ck(uchar *which, int N, int M, short *src, S_F_MAP *mp){ int i, m=0; #ifdef VERI if (M == VERI && !verbose) return;#endif printf("unreached in proctype %%s\n", procname[M]); for (i = 1; i < N; i++) if (which[i] == 0 && (mapstate[M][i] == 0 || which[mapstate[M][i]] == 0)) m += xrefsrc((int) src[i], mp, M, i); else m++; printf(" (%%d of %%d states)\n", N-1-m, N-1);}#if NCORE>1 && !defined(SEP_STATE)static long rev_trail_cnt;#ifdef FULL_TRAILvoidrev_trail(int fd, volatile Stack_Tree *st_tr){ long j; char snap[64]; if (!st_tr) { return; } rev_trail(fd, st_tr->prv);#ifdef VERBOSE printf("%%d (%%d) LRT [%%d,%%d] -- %%9u (root %%9u)\n", depth, rev_trail_cnt, st_tr->pr, st_tr->t_id, st_tr, stack_last[core_id]);#endif if (st_tr->pr != 255) { sprintf(snap, "%%ld:%%d:%%d\n", rev_trail_cnt++, st_tr->pr, st_tr->t_id); j = strlen(snap); if (write(fd, snap, j) != j) { printf("pan: error writing trailfile\n"); close(fd); wrapup(); return; } } else /* handoff point */ { if (a_cycles) { (void) write(fd, "-1:-1:-1\n", 9); } }}#endif#endifvoidputrail(void){ int fd;#if defined VERI || defined(MERGED) char snap[64];#endif#if NCORE==1 || defined(SEP_STATE) || !defined(FULL_TRAIL) long i, j; Trail *trl;#endif fd = make_trail(); if (fd < 0) return;#ifdef VERI sprintf(snap, "-2:%%d:-2\n", VERI); if (write(fd, snap, strlen(snap)) < 0) return;#endif#ifdef MERGED sprintf(snap, "-4:-4:-4\n"); if (write(fd, snap, strlen(snap)) < 0) return;#endif#if NCORE>1 && !defined(SEP_STATE) && defined(FULL_TRAIL) rev_trail_cnt = 1; enter_critical(GLOBAL_LOCK); rev_trail(fd, stack_last[core_id]); leave_critical(GLOBAL_LOCK);#else i = 1; /* trail starts at position 1 */ #if NCORE>1 && defined(SEP_STATE) if (cur_Root.m_vsize > 0) { i++; depth++; } #endif for ( ; i <= depth; i++) { if (i == depthfound+1) { if (write(fd, "-1:-1:-1\n", 9) != 9) { goto notgood; } } trl = getframe(i); if (!trl->o_t) continue; if (trl->o_pm&128) continue; sprintf(snap, "%%ld:%%d:%%d\n", i, trl->pr, trl->o_t->t_id); j = strlen(snap); if (write(fd, snap, j) != j) {notgood: printf("pan: error writing trailfile\n"); close(fd); wrapup(); } }#endif close(fd);#if NCORE>1 cpu_printf("pan: wrote trailfile\n");#endif} voidsv_save(void) /* push state vector onto save stack */{ if (!svtack->nxt) { svtack->nxt = (Svtack *) emalloc(sizeof(Svtack)); svtack->nxt->body = emalloc(vsize*sizeof(char)); svtack->nxt->lst = svtack; svtack->nxt->m_delta = vsize; svmax++; } else if (vsize > svtack->nxt->m_delta) { svtack->nxt->body = emalloc(vsize*sizeof(char)); svtack->nxt->lst = svtack; svtack->nxt->m_delta = vsize; svmax++; } svtack = svtack->nxt;#if SYNC svtack->o_boq = boq;#endif svtack->o_delta = vsize; /* don't compress */ memcpy((char *)(svtack->body), (char *) &now, vsize);#if defined(C_States) && defined(HAS_STACK) && (HAS_TRACK==1) c_stack((uchar *) &(svtack->c_stack[0]));#endif#ifdef DEBUG cpu_printf("%%d: sv_save\n", depth);#endif} voidsv_restor(void) /* pop state vector from save stack */{ memcpy((char *)&now, svtack->body, svtack->o_delta);#if SYNC boq = svtack->o_boq;#endif#if defined(C_States) && (HAS_TRACK==1)#ifdef HAS_STACK c_unstack((uchar *) &(svtack->c_stack[0]));#endif c_revert((uchar *) &(now.c_state[0]));#endif if (vsize != svtack->o_delta) Uerror("sv_restor"); if (!svtack->lst) Uerror("error: v_restor"); svtack = svtack->lst;#ifdef DEBUG cpu_printf(" sv_restor\n");#endif} voidp_restor(int h){ int i; char *z = (char *) &now; proc_offset[h] = stack->o_offset; proc_skip[h] = (uchar) stack->o_skip;#ifndef XUSAFE p_name[h] = stack->o_name;#endif#ifndef NOCOMP for (i = vsize + stack->o_skip; i > vsize; i--) Mask[i-1] = 1; /* align */#endif vsize += stack->o_skip; memcpy(z+vsize, stack->body, stack->o_delta); vsize += stack->o_delta;#ifndef NOVSZ now._vsz = vsize;#endif#ifndef NOCOMP for (i = 1; i <= Air[((P0 *)pptr(h))->_t]; i++) Mask[vsize - i] = 1; /* pad */ Mask[proc_offset[h]] = 1; /* _pid */#endif if (BASE > 0 && h > 0) ((P0 *)pptr(h))->_pid = h-BASE; else ((P0 *)pptr(h))->_pid = h; i = stack->o_delqs; now._nr_pr += 1; if (!stack->lst) /* debugging */ Uerror("error: p_restor"); stack = stack->lst; this = pptr(h); while (i-- > 0) q_restor();} voidq_restor(void){ char *z = (char *) &now;#ifndef NOCOMP int k, k_end;#endif q_offset[now._nr_qs] = stack->o_offset; q_skip[now._nr_qs] = (uchar) stack->o_skip;#ifndef XUSAFE q_name[now._nr_qs] = stack->o_name;#endif vsize += stack->o_skip; memcpy(z+vsize, stack->body, stack->o_delta); vsize += stack->o_delta;#ifndef NOVSZ now._vsz = vsize;#endif now._nr_qs += 1;#ifndef NOCOMP k_end = stack->o_offset; k = k_end - stack->o_skip;#if SYNC#ifndef BFS if (q_zero(now._nr_qs)) k_end += stack->o_delta;#endif#endif for ( ; k < k_end; k++) Mask[k] = 1;#endif if (!stack->lst) /* debugging */ Uerror("error: q_restor"); stack = stack->lst;}typedef struct IntChunks { int *ptr; struct IntChunks *nxt;} IntChunks;IntChunks *filled_chunks[512];IntChunks *empty_chunks[512];int *grab_ints(int nr){ IntChunks *z; if (nr >= 512) Uerror("cannot happen grab_int"); if (filled_chunks[nr]) { z = filled_chunks[nr]; filled_chunks[nr] = filled_chunks[nr]->nxt; } else { z = (IntChunks *) emalloc(sizeof(IntChunks)); z->ptr = (int *) emalloc(nr * sizeof(int)); } z->nxt = empty_chunks[nr]; empty_chunks[nr] = z; return z->ptr;}voidungrab_ints(int *p, int nr){ IntChunks *z; if (!empty_chunks[nr]) Uerror("cannot happen ungrab_int"); z = empty_chunks[nr]; empty_chunks[nr] = empty_chunks[nr]->nxt; z->ptr = p; z->nxt = filled_chunks[nr]; filled_chunks[nr] = z;}intdelproc(int sav, int h){ int d, i=0;#ifndef NOCOMP int o_vsize = vsize;#endif if (h+1 != (int) now._nr_pr) return 0; while (now._nr_qs && q_offset[now._nr_qs-1] > proc_offset[h]) { delq(sav); i++; } d = vsize - proc_offset[h]; if (sav) { if (!stack->nxt) { stack->nxt = (Stack *) emalloc(sizeof(Stack)); stack->nxt->body = emalloc(Maxbody*sizeof(char)); stack->nxt->lst = stack; smax++; } stack = stack->nxt; stack->o_offset = proc_offset[h];#if VECTORSZ>32000 stack->o_skip = (int) proc_skip[h];#else stack->o_skip = (short) proc_skip[h];#endif#ifndef XUSAFE stack->o_name = p_name[h];#endif stack->o_delta = d; stack->o_delqs = i; memcpy(stack->body, (char *)pptr(h), d); } vsize = proc_offset[h]; now._nr_pr = now._nr_pr - 1; memset((char *)pptr(h), 0, d); vsize -= (int) proc_skip[h];#ifndef NOVSZ now._vsz = vsize;#endif#ifndef NOCOMP for (i = vsize; i < o_vsize; i++) Mask[i] = 0; /* reset */#endif return 1;} voiddelq(int sav){ int h = now._nr_qs - 1; int d = vsize - q_offset[now._nr_qs - 1];#ifndef NOCOMP int k, o_vsize = vsize;#endif if (sav) { if (!stack->nxt) { stack->nxt = (Stack *) emalloc(sizeof(Stack)); stack->nxt->body = emalloc(Maxbody*sizeof(char)); stack->nxt->lst = stack; smax++; } stack = stack->nxt; stack->o_offset = q_offset[h];#if VECTORSZ>32000 stack->o_skip = (int) q_skip[h];#else stack->o_skip = (short) q_skip[h];#endif#ifndef XUSAFE stack->o_name = q_name[h];#endif stack->o_delta = d; memcpy(stack->body, (char *)qptr(h), d); } vsize = q_offset[h]; now._nr_qs = now._nr_qs - 1; memset((char *)qptr(h), 0, d); vsize -= (int) q_skip[h];#ifndef NOVSZ now._vsz = vsize;#endif#ifndef NOCOMP for (k = vsize; k < o_vsize; k++) Mask[k] = 0; /* reset */#endif} intqs_empty(void){ int i; for (i = 0; i < (int) now._nr_qs; i++) { if (q_sz(i) > 0) return 0; } return 1;} intendstate(void){ int i; P0 *ptr; for (i = BASE; i < (int) now._nr_pr; i++) { ptr = (P0 *) pptr(i); if (!stopstate[ptr->_t][ptr->_p]) return 0; } if (strict) return qs_empty();#if defined(EVENT_TRACE) && !defined(OTIM) if (!stopstate[EVENT_TRACE][now._event] && !a_