0Hh÷ØØ NJN…L0 ÷hhuqaHh÷° …•¡ Ø Òª™mÂÊØØ÷÷÷ –ÿÿÿÿÿÿÿÿdwwF"!P3"‡˜2Tv˜ºÜş2Tv˜ºÜşÿÿÿÿÿÿÿÿ!Ce‡©ËíïÍ«‰gE#S¨ÜîÿÿïzE#""Cu¹ş@à™™™™™™™™™™’™™’™™™’’™™ ™™™™ ™™™™)™ ™)™ ))™™™™àîîîîàîàîàîîîîîîàîàîàîáîîîááîîáîáîáîááîááîáîîîîîîîáîîîîf`fff`fffff`öÿf`ÿÿofÿÿoföÿÿÿÿöÿfffffffffÿf™™"’™™™™™)""""")"™"™ )"™™™™™™"’™ """"™"™™ ’™™ ™™™™™™™™""™™™™™™™™™ """"™™™™ ™™™ ™""™™™™™™™™™""""™™ àîàîàîàîàîîîîàîàîàîàîàîàîîîîîîáîîáîîáîîîáîîáîîááîîáîîîîîîîîáîîîîîîîîfÿÿoföÿfffff`ÿofffffff`fffÿofföoffffföÿfffffffPUUUUUUUUUUUUUUUU»°»°»»»»»»»»»»»°» °»»°»»» »»»»°»»» »»»»°»»»»»»ÿğÿğÿÿÿÿÿÿÿÿÿÿÿğÿğÿÿğÿÿÿÿÿÿÿğÿÿÿÿÿÿÿğÿÿÿÿÿÿPUPUUUPUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQUUQQQQUQUUQUUUUUUUUUUUUUUUUUUUUUU°»»»°»»°»»°»»»»»»»»»»»°»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ° » »» »» »»»»»»»»»»»»»»» ğÿÿÿğÿÿğÿÿğÿÿÿÿÿÿÿÿÿÿÿğÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿğÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°» »°°»°°»°»»°»»»»°»»» »»»»»»»»» »ÿÿğÿğÿÿÿğÿÿÿÿÿÿÿÿğÿÿÿÿÿÿÿÿÿğÿÿğÿÿÿÿğÿÿÿÿÿğÿÿğÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿğ™™™™™™™™™™™™™™™™™™™™™™™™™™™™ÿÿÿÿÿÿÿÿğÿÿ¿ÿÿ¿ğÿ¿ÿ¿ğ¿ ÿÿÿ¿»»ûûû»¿ÿû¿¿»¿¿»¿»»»»¿ ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ÿğ¿»ÿÿÿÿ¿ÿÿÿğÿÿ¿ÿÿğÿ¿ÿğ¿ ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™‘™™™‘™™™™‘™™™‘‘™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ °° °° °° °° ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘‘™‘™‘™™‘‘™‘™™™‘‘™™‘™™™‘™™™‘™™™‘™™™‘™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™UUUUµ»»»UUU»µ»U»µ»U»µ»U»µ»U»µ»U»UUUU»»»»»»UU»»µ[»»µ[»»µ[»»µ[»»µ[UUUU»»»»UUUUUUUUUUUUUUUUUUUUUUUUUUUU»»»[UUUU[[»[µµ»[[[»[µµ»[[[»[!"""""""!"""""""!!""""!!""""""""""""!!"!!"‘™™™‘™™™™™™™™‘‘™‘™™‘‘™‘™™™™™‘™™‘™™‘™™‘‘™™™‘™™™‘™™™‘™™™‘™™™‘‘™™‘™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™µ»U»µ»U»µ»U»µ»U»µ»U»µ»U»UUUUUUU»»µ[»»µ[»»µ[»»µ[»»µ[»»µ[UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµµ»[[[»[µµ»[[[»[µµ»[[[»[UUUUUUU""!!""""!!""""""!!"!!""!!™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™‘™™™‘‘™™‘™™™‘™™™‘™™™‘™™™‘™™™™™™™™™™™™™™™™™™™™™™™µ»µ»µ»µ»µ»µ»µ»µ»»» »»» »»» »»» »»» »»» »»» »»» »UUUUUUµUUUUUUµUUUUUUµUUUUUUµ »[°»[ »[°»[ »[°»[ »[°»[‘™™™‘™™™‘™™™‘™™™‘™™™‘‘™™‘™™™™™™™™™™™™™™™™™™™™™™™îîàîàààààààààààààîîî ™™™™ )™™’)™™’™™ ’"" )™ ‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ff`fööoöoöoffffÿf`fÿ``™™ "™™"™™™™""™ ™_ff`ff`fÿööÿöfÿfÿÿÿÿ`ffffööÿoÿffÿff`ff`fÿööÿöfÿfÿÿÿÿffööÿoÿffÿff`ff`fÿööÿöfÿfÿÿÿÿ`ffffööÿoÿffÿ`ffffö`oÿ`oö`öÿğÿffffffooÿÿöÿofÿÿf`ffffooÿÿÿğoöofÿÿğoffffffffföoÿöoÿÿöffÿof`f`föööffÿÿğÿffğÿfffÿÿö`fÿöofÿoÿoÿffÿÿofğ`fğÿööğoööğofÿ`fööföÿffooÿooöÿföoffoÿofff`fffğoöfğÿffğoff`ff`fffffoöfÿföf`f`f`ffoffğoff`fff`ffffff`f`föÿöffffffföfffföÿ`öofffffffffffffÿfffÿföÿff`fffff`ff`ffffÿfföf`ffffff`ffffffff`ffffff`fÿoÿffffffff`fff`ffff`fffÿfffÿffğ`fffff`fff`ffffff`ff`öfoffffffffff`fÿffffffffofff`ffÿffffffföffffffffff`ff`ff`fÿöoÿöoö`öoöfföffföÿfÿÿÿÿÿÿöÿ``ffffffö`ÿöffföfÿfffoÿoöÿfff`ff`ff`fÿöoÿöoöfföffföÿfÿÿÿÿÿfff`ff`ff`fÿöoÿöoö`öoöfföffföÿfÿÿÿÿÿÿöÿ`ffğofoffff`öoÿğfÿğÿÿoÿÿöÿfffffföoööoÿÿöoÿÿÿooÿÿfööfff`ff`ff`fÿöoÿÿğoÿföoöföÿÿfffffffföÿfföÿÿf`öÿÿ`fÿÿ`öÿöÿff`fffff`ffffffoffÿÿÿffffffffff`ÿffÿffÿÿ`öÿ`ÿff`ff`ffÿÿÿÿÿoÿÿoffÿffÿÿÿÿff`öoö`öÿÿfÿÿ`öÿff`ffffffffÿöÿfffoffÿÿÿffff`öÿÿfÿÿ`öÿ`fff`fffff`ffffffoffÿÿÿfffğÿfföÿfföÿÿofö`föÿÿÿo`fff`ffö`fföffföffföoffÿoffffÿofÿÿfÿÿfÿÿooföoööoö`öÿÿ`föÿ`öÿff`fffffffÿÿÿoÿöÿofffoföÿÿofffffff``ffffffö`ÿöffföfÿfffoÿoöÿ`ffffffffffffföfÿÿffÿÿffğÿffğoffffffffffffffoffffÿÿffÿÿffÿfföfffffffff`ff`ff`ff`ff`ffffffÿÿffÿÿfföÿfföÿfffffffffffffffffffffffffff`fffföoÿÿÿÿÿÿfÿoffffff`fff`fffffffffffÿÿofÿÿofÿÿffğÿfffffoffföfoffffff`fffffffffffffffffff`fff`fff`ffffffföÿffffffffffffföÿoÿÿofffffÿfföÿofÿÿofÿÿofÿffğoff`fffffffföfffff`fffffff`ÿofÿÿföÿffÿ`fff`ffffffffföfÿoÿÿoffÿffÿÿÿÿofffffffffffffff`ff`ff`fffffffffffffff`ffffffffffffffffffffffffffffffffffffffffff`f`f`f`ff`ffffff`f`f`ffffffffffffffff`ffffffffffffffff`f`ffffffffffffff`ff`ÿf``ffff`fffffffffffff`f`f`fffffffffffffffffffffffffffffffffffffffffffffföÿffÿÿföÿof`ÿffffffffffffffÿoffÿÿföÿo`ÿffff`fffffffööööoÿğÿf`ffooo`f`fffffffööööoÿğÿf`ffooof`fffffffööööoÿğÿf`ffooof``fffffffööööoÿğÿf`ffooofffffffğoofÿöoo`fÿfoff`f`fffffffööööoÿğÿf`ffooof`ğffofföÿöoÿoÿÿö`fffffffoöf`ff`ffffffööoooÿÿöğff`ffooöö`ffğÿÿÿÿÿÿÿÿÿÿÿÿÿğÿ`ffffffffffÿÿÿÿğÿÿ`ffoffö``ğof`fffföffffà&'()%&'()&'('(6789&'('('(&'('()56789678789&'()FGHI&'()67878789678789EFGHIFGHGHI67896789„…„…„…„…„…„…„…„…„…„…„…FGHGHGHI FGHGHIFGHIFGHI”•”•”•”•”•”•”•”•”•”•”•†‡ˆ‰†‡ˆ‰„… „…„…–—˜™–—˜™”•”•”•†‡ˆ‰¦§¨©¦§¨©„„ „…„…„…„…–—˜™¦§¨©¦§¨©”””•”•”•”•†‡ˆ‰¦§¨©¦§¨©*+,-./¦§¨©+,-.–—˜™¦§¨©¦§¨©+,,,,.¦§¨©+,,,,.*+,-./!"#"#"#*+,-./!"#$¦§¨©¦§¨©!"#"#¦§¨©*+,-,,,-.¦§¨©!"#"#"#+,-.!"#$+,-,,-,.+,,,,.12323234+,,,,.1234¦§¨©¦§¨©123234¦§¨©+,,,,,,,,.¦§¨©12323234+,,,,.1234+,,,,,,,,.€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘&'()ÿ&'('(&'('('(6789@ABÿ678789&'()67878789FGHIPQRÿ&'()„…„…„…FGHGHI6789FGHGHGHI`abÿ6789”•”•”•„…„…FGHIqrÿFGHI”•”•ЋЋqrNONONOÿš›š›qr~~~~~~ÿЋЋЋЋЋЋЋЋqr~j~~j~ÿš›š›š›š›š›š›š›š›qr~j~~j~ÿ„…„…„…ЋЋЋЋЋЋЋЋЋЋЋЋЋqrNOdededeNOÿ”•”•”•š›š›š›š›š›š›š›š›š›š›š›š›š›qrnnnnnnnnnnÿЋЋЋЋЋЋ+,-.ЋЋЋЋЋЋЋ†‡ˆ‰Š‹Š‹Š‹Š‹Š‹+,-.qrnnnnlmnnnnÿš›š›š›š›š›š›+,,,,.š›š›š›š›š›š›š›+,-.–—˜™š›š›š›š›š›+,,,,.qrnnnnjjnnnnÿ!"#$ЋЋЋЋ"#"#ЋЋЋЋ+,-,,-,ЋЋЋЋЋЋЋЋЋ+,,,,.¦§¨©Š‹Š‹Š‹Š‹Š‹Š‹+,-,,-,.Š‹nnnnjjnnnnÿ1234š›š›š›š›2323š›š›š›š›+,,,,,,,š›š›š›š›š›š›š›š›š›4+,,,,,,.¦§¨©š›š›š›š›š›š›+,,,,,,,,.š›nnnnjjnnnn4ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ K         €€€€€€€€€‚ƒ„ … † † ‡ˆ‰Š‹@ĞĞ 0 àĞàğ 7P7@7P7P7P7`7P7P7P7P7@7@7@7@7@7@7@7P7P7P7P7P7P7@7@7@7@7@7@7@@@@P@P@P@P@P@@@@@@@@@@@@@@@@@P@P@P@P@P@P@P@P@P@@@@@@@@@@@@@@X@XPXPXPXPX@X@X@X@X@X@X@X@XPXPXPXPXPX@XPX@XPXPXPXPXPX@X@X@X@@@@BFKNOOOOOOOOOOOOOOOOOOOOOOO00026;>???????????????????????³*D*D*D*D*D/D+D(E.E(d(d(d(d$d(d+d$e&E&E&E&E&E&E+e+E+E.%'F'F'F'F'F'F'F'F'F%F%10 À?øÿˆøÿˆÿÿøøˆˆˆøˆøˆÿøÿøˆøÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿˆøøÿøˆˆˆøøøøøøøøˆøøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆˆÿˆøøÿÿˆˆˆøÿÿøøøøøˆøøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿˆøøÿˆˆˆøÿÿøøøÿøˆøøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿˆøÿˆÿÿøøˆˆˆøÿˆÿøøøÿÿøÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿˆøÿˆˆˆˆˆˆˆˆˆˆÿˆˆˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿøÿøˆˆˆˆˆˆˆˆøÿˆˆˆÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿˆˆˆˆˆˆˆˆˆÿˆÿøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿˆˆˆˆˆˆˆˆˆˆÿˆˆˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿˆøÿˆˆˆˆˆˆˆˆˆøÿˆˆÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿøÿøÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿøÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿÿÿÿÿÿÿÿøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿøÿÿÿøÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆøÿˆˆÿÿøÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿˆˆˆˆˆÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿÿˆÿÿˆøÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿÿÿÿÿøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿˆˆÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿÿˆÿÿˆÿÿÿÿˆˆˆÿÿˆøÿˆÿøˆˆøÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿˆÿˆÿˆˆÿˆˆˆÿˆÿˆÿøˆˆˆÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿˆÿˆÿˆÿÿˆÿˆˆˆÿÿˆÿˆÿÿˆˆˆÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿˆÿÿˆÿˆˆÿÿˆˆˆÿˆÿˆøˆˆˆÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿˆøÿˆÿˆˆÿÿÿˆˆˆÿÿˆøÿˆøˆˆøÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿˆÿˆøÿÿˆˆˆøÿˆˆˆÿÿˆÿˆˆˆÿÿøÿøÿˆÿÿˆÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿˆÿˆÿˆˆˆÿˆˆˆøøøˆˆøÿˆˆÿˆÿˆÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿˆøÿˆÿÿˆˆÿˆˆˆøøøˆˆˆÿˆÿˆÿˆÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿˆÿˆˆÿÿˆˆˆÿÿˆˆøøøˆˆˆøÿˆÿˆÿÿÿÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆˆøÿˆÿÿˆÿˆˆˆÿˆˆˆøˆÿˆˆøÿˆÿˆÿˆÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøˆÿøˆˆˆøˆÿˆÿˆÿˆˆøÿÿøÿÿøÿøÿÿˆøÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøøˆˆˆÿøøøøøøˆˆˆøøˆøÿÿˆÿˆÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøˆˆˆˆøˆÿÿˆÿˆÿÿˆˆˆÿˆøÿøÿÿˆÿˆÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøøˆˆˆøˆˆøøøˆˆøˆˆøˆøˆøøøˆÿˆÿøÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøˆÿøˆˆˆÿÿˆÿˆÿˆÿˆˆøÿÿøÿÿøˆøøÿÿˆÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøˆÿøˆˆˆÿÿˆøÿˆÿÿˆÿÿˆˆÿˆÿøøˆøÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøøˆˆˆˆøÿøˆøˆøˆˆÿøˆÿøøˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøˆˆˆˆøÿˆÿøÿˆˆÿˆˆˆÿˆÿÿøˆøÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆááîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøøˆˆˆÿˆˆÿˆÿˆˆøˆˆÿøˆøøˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøˆÿøˆˆˆÿÿøÿˆÿÿøÿˆˆˆÿˆøøÿÿøÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîáˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîáˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîáˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîáˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîáîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿˆÿÿˆÿÿˆÿÿøÿÿˆøÿˆÿˆˆˆˆÿÿˆÿøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿˆøøˆˆÿˆÿÿˆÿˆˆˆˆÿˆÿøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆááîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿˆøøÿˆÿˆÿÿÿˆÿˆˆˆˆÿÿˆÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆáîîîîîˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆÿÿˆøøøˆÿˆÿøÿÿÿˆˆˆˆÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆøÿˆÿˆÿÿˆÿÿøÿÿˆÿˆÿÿˆˆÿÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆˆÿÿÿøøÿˆÿˆˆˆøøÿˆÿˆÿˆøÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆˆÿˆˆÿÿÿˆÿˆˆˆˆÿøÿøÿˆÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆˆÿÿˆÿÿÿˆÿÿˆˆˆÿøÿøˆÿˆøÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿˆˆÿˆˆÿˆÿøˆˆøˆøøˆÿˆÿˆøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿˆøÿˆÿˆˆˆøøÿÿˆÿøÿøÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUUUˆˆff†ˆˆˆˆˆˆXUUUUUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»ˆˆˆˆˆˆ»»ˆˆˆˆˆˆ»»ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXUUUUUUUˆhffffˆˆˆˆˆUUUUUUUQUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»»‹ˆˆˆˆ¸»»‹ˆˆˆˆ¸»»‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUUQˆhfÿöˆˆˆˆˆXUUUUUUUQU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»»»»ˆˆˆ¸»»»»ˆˆˆ¸»»»»ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆXUUUUUUUQˆööÿöÿˆˆˆˆUUUUUUQQUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»¸ˆˆ»»»»»¸ˆˆ»»»»»¸ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUQQˆöfÿoÿˆˆXUUUUUUQUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»»‹ˆ»»»»»»‹ˆ»»»»»»‹ˆˆˆˆˆˆˆˆˆˆˆˆˆXUUUUUUQUˆfÿÿffˆˆˆUUUUUUUQUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»‹»»»ˆ»»»‹»»»ˆ»»»‹»»»ˆˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUUQUUˆˆÿÿÿˆˆXUUUUUUUQUUUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»‹¸»¸»»¸»‹¸»¸»»¸»‹¸»¸»»ˆˆˆˆˆˆˆˆˆˆˆˆXUUUUUUUQUUˆhff†ˆˆˆUUUUUUUUUUUUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»¸»»»»»»»¸»»»»»»»¸»»»»»ˆˆˆˆˆˆˆˆˆˆˆˆUUUUUUUUUUUUˆfffffˆXUUUUUUUUUUUUUUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»»»»»»»»»»»»»»»»»»»»»»»»»‹¸ˆˆˆˆˆˆˆˆˆXUUUUUUUUUUUUhfffff†UUUUUUUUUUUUUUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»»»»»»»»»»»»»»»»»»»»»»‹»‹ˆˆˆˆˆˆˆˆUUUUUUUUUUUUUøoöfoö_UUUUUUUUUUUUUUUUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»»»»»»»»»»»»»»»»»»»»»»»»»»»»‹ˆˆˆˆˆˆˆXUUUUUUUUUUUUUøÿfffÿ_UUUUUUUUUUUUUUUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»»»»»»»»»»»»»»»»»»»»»»»»»»»»‹‹ˆˆˆˆˆˆUUUUUUUUUUUUUUøofffö_UUUUUUUUUUUUUUUUUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ˆˆˆˆˆXUUUUUUUUUUUUUUˆhfˆfVUUUUUUUUUUUUUUUUUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ˆˆˆˆˆUUUUUUUUUUUUUUUˆf†ˆhfUUUUUUUUUUUUUUUUUUUUU…ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ˆˆˆˆXUUUUUUUUUUUUUUUhf†ˆefVUUUUUUUUUUUUUUUUUUUUUˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¸»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»‹ˆˆˆˆUUUUUUUUUUUUUUUU‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™™‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™‘™™™‘™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘™™‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘¸]-- title: Super Boy I Bootleg Improvement -- author: kylesubhan1 -- desc: It's a pirated game but its improvement. -- script: lua --Select the character with normal size and mini size --warning: this code is a mess! --here are some pointers: -- `m`: mario (player) table (CTRL-F MARIO) -- `c`: camera table (CTRL-F CAMERA) -- `objs`: objects that are currently loaded (CTRL-F OBJECT) -- `obj_table`: table with propierties of objects (CTRL-F GANG) -- objects are loaded when a level is loaded by checking all tiles and indexing them in the obj_table -- each entry in the object table has an id (tile number that will trigger the object spawning), name, update and draw functions -- most of the code for the object handling is copy-pasted from my previous game (titlescreen) --good luck! sfx(2) function TIC() print("Switch character: Tiny and Normal",0,130,15,0,1,1) if btn(6) then reset() end if btn(4) then cls(1) print("COIN",0,0) print(("00"),0,6) print("WORLD",29,0) print("1-1",29,6) print("WORLD 1-1\n\n\n x INF",90,40) spr(256,90,50,0,1,0,0,2,2) W,H = 30*8,17*8 log = "";function logs(x) log = x end flr = math.floor abs = math.abs function sgn(n) return n>0 and 1 or n<1 and -1 or 0 end function lerp(v0, v1, t) return (1 - t) * v0 + t * v1 end --level data lvldat = { --i had to split 1-1 into two parts so it would fit in the map --there's probably a better approach {bg=8,x1=0,y1=0,x2=31*8,y2=17}, --1-1a {bg=8,x1=0,y1=17,x2=31*8,y2=2*17} --1-1b } lvl = 1 --current level function loadlevel(n) lvl = n dat = lvldat[n] objs = {} map_findspawnobjs(dat.x1,dat.y1,dat.x2,dat.y2) m.x = dat.x1*8 m.y = dat.y1*8+H-32 m.vx = 0.01 m.onground = true c.update() end --CAMERA c = {x=0,y=0,xbound=80} function c.spr(i,x,y,...) spr(i,x-16*c.x//16,y-c.y,...) end function c.map() --local tx,ty = c.x/8,c.y/8 map(0,0,31*8,18*8,-c.x,-c.y,0) end function c.update() if m.x-c.x > c.xbound then --c.x = lerp(c.x,m.x-c.xbound,0.1) c.x = m.x-c.xbound elseif m.x < c.x then --m.x = c.x m.vx = m.vx*0.9 c.x = m.x end --c.y = H*((m.y-8)//H) --c.y = c.y < 0 and 0 or c.y c.y = 8*lvldat[lvl].y1 if c.x > W*7 then c.x = W*7 end end function solids(t) return t and t >= 128 end function is_solid(x,y) return solids(mget(x//8,y//8)) end function can_move8x8(x,y) if x < 0 or is_solid(x,y) or is_solid(x+7,y) or is_solid(x,y+7) or is_solid(x+7,y+7) then return false end return true end function can_move(x,y) if y < lvldat[lvl].y1*8 then return true end return can_move8x8(x,y) and can_move8x8(x+7,y) and can_move8x8(x,y+7) and can_move8x8(x+7,y+7) end G = 0.2 --gravity --OBJECT list objs = {} function obj_spawn(o,x,y) if not o then return false end local t = { update = o.update, draw = o.draw, name = o.name, id = o.id, x=x,y=y } table.insert(objs,t) return t end function obj_update() --updates all objs local tokill = {} for n,o in ipairs(objs) do if o.kill then table.insert(tokill,n) elseif o.update and (o.x-c.x+17 > 0 and o.x-c.x < W) then o:update() end end for _,n in ipairs(tokill) do if objs[n] then table.remove(objs,n) end end end function obj_draw() --draws all objs for _,o in ipairs(objs) do if o.draw and (o.x-c.x+17 > 0 and o.x-c.x < W) then o:draw() end end end --OBJECT attribute table obj_table = {} function obj_spawnid(id,x,y) --looks up id in obj_table and spawns object return obj_spawn(obj_table[id],x,y) end function aabb(x1,y1,w1,h1,x2,y2,w2,h2) if x1 and y1 and w1 and h1 and x2 and y2 and w2 and h2 then return x1 < x2+w2 and x2 < x1+w1 and y1 < y2+h2 and y2 < y1+h1 end end do --TABLE-- local function o(mapid,name,updt,drw,rplc) obj_table[mapid] = { id = mapid, name = name, update = updt, draw = drw, --flag to tell if spawner tile --should be removed or let be replace = rplc == nil and true or rplc } end local function o_mcollision(o,w,h) --collisioin with mario w,h = w or 16, h or 16 local h = aabb(o.x,o.y,w,h,m.x+2,m.y+2-(m.big and 16 or 0),12,12*(m.big and 2 or 1)) return { hit = h, stomp = h and m.y < o.y and m.vy > 0 } end local function o_enemyproto(self,hp,w,h,ondeath) if not self.hp then self.hp = hp self.max_hp = hp else if self.hp <= 0 then if ondeath then ondeath() else self.kill = true end end end end local function o_persistrplc(o,id) --permanent replace mset(o.x//8,o.y//8,id or 0) end local function o_tmprplc(o,id) --temporary replace table.insert(overwritten,{x=o.x//8,y=o.y//8,t=mget(o.x//8,o.y//8)}) mset(o.x//8,o.y//8,id or 0) end local function o_tmprplc2(o,id) --temporary replace 2x2 tiles o_tmprplc(o,id) o.x=o.x+8 o_tmprplc(o,id+1) o.y=o.y+8 o_tmprplc(o,id+17) o.x=o.x-8 o_tmprplc(o,id+16) o.y=o.y-8 end local oG = G*0.9 local function o_gravity(o) o.vy = o.vy + oG if not o.onground then o.vy = o.vy+oG if o.vy > o.maxvy then o.vy = o.maxvy end if o.vy < 0 and not btn(5) then o.vy = o.vy*0.9 end end end local function o_collision(o) local newx,newy = o.x+o.vx,o.y+o.vy if can_move(newx,newy) then if o.vy > 0 and o.onground then --fall o.onground = false end o.x,o.y = newx,newy elseif can_move(o.x,newy) then o.y = newy o.vx = 0 elseif can_move(newx,o.y) then if o.vy > 0 then --hit ground o.onground = true end o.vy = 0 o.x = newx end end local function o_spr(o) c.spr(o.id,o.x,o.y,0,1,0,0,2,2) end --THE GANG o(2,"GOOMBER", function(self) if self.deathtimer then self.deathtimer = self.deathtimer-1 if self.deathtimer <= 0 then m.getcoin() self.kill = true end else self.vx = self.vx or -0.7 self.vy = self.vy or 0 self.maxvy = 2 o_gravity(self) local oldx = self.x o_collision(self) if self.x == oldx then --hit wall self.vx = -self.vx end local c = o_mcollision(self) if c.hit and not c.stomp then m.damage() elseif c.stomp then m.vy = -5 sfx(1,nil,-1,1,6) self.deathtimer = 20 end end end, function(self) if not self.deathtimer then c.spr(2,self.x,self.y,0,1,(t/16)%2,0,2,2) else --stomped c.spr(4,self.x,self.y,0,1,0,0,2,2) end end ) o(6, "COIN", function(self) if o_mcollision(self).hit then m.getcoin() self.kill = true end end, o_spr ) local function qmark_update(self,effect) --if self.pkill then return end if not self.init then o_tmprplc({x=self.x+8,y=self.y},130) self.init = true end if self.timer then if self.timer > -3 then self.y = self.y-2*sgn(self.timer) self.timer = self.timer-1 else self.kill = true o_tmprplc2(self,130) _ = effect and effect() end else if o_mcollision(self,16,22).hit and m.vy < 0 then m.vy = 0 self.timer = 3 end end end local function qmark_draw(self,h) if not self.timer then o_spr({id=8,x=self.x,y=self.y}) else c.spr(130,self.x,self.y,0,1,0,0,2,2) _=h and h() end end o(8, "QMARK COIN", function(self) qmark_update(self, function() m.getcoin() end) end, function(self) qmark_draw(self,function() c.spr(6,self.x,self.y-18,0,1,0,0,2,2) end) end,false ) o(9, "QMARK MUSHROOM", function(self) qmark_update(self, function() local s = obj_spawnid(10,self.x,self.y-16) s.vx = 0.7*sgn(m.vx) s.vx = s.vx == 0 and 0.7 or s.vx s.vy = -3 end) end, qmark_draw,false ) o(10,"MUSHROOM", function(self) self.vx = self.vx or -0.7 self.vy = self.vy or 0 self.maxvy = 2 o_gravity(self) local oldx = self.x o_collision(self) if self.x == oldx then --hit wall self.vx = -self.vx end if o_mcollision(self).hit then self.kill = true m.big = true end end, o_spr ) o(1, "WARP", function(self) if o_mcollision(self,16,32).hit then --[[m.x = 16 m.y = H+16 c.update()--]] loadlevel(lvl+1) end end, function()end,false ) end --finds objects in map and spawns them --also loads back objs that were --previously overwritten when loading overwritten = {} function map_findspawnobjs(sx,sy,ex,ey) for _,t in ipairs(overwritten) do mset(t.x,t.y,t.t) end overwritten = {} sx = sx or 0 sy = sy or 0 ex = ex or 31 ey = ey or 17 for tx=sx,ex do for ty=sy,ey do local t = mget(tx,ty) if obj_table[t] then if obj_table[t].replace then table.insert(overwritten,{ x=tx,y=ty,t=t }) mset(tx,ty,0) end obj_spawnid(t,tx*8,ty*8) end end end end --MARIO table m = {} function m.init() m.x,m.y,m.vx,m.vy=0,0,0,0 m.coins = 0 m.dir = 0 m.accel = 0.1 m.maxvx = 1.7 m.maxvx2 = 2.3 m.maxvy = 10 m.jumpvy = -6 m.big = false m.duck = false m.invframes = 0 m.onground = false end function m.groundbelow() return not can_move(m.x,m.y+4) end function m.can_move(x,y) if m.big and not m.duck then return can_move(x,y) and can_move(x,y-16) end return can_move(x,y) end function m.update() if m.deathtimer then if m.deathtimer == 40 then m.vy = -10 elseif m.y-c.y > H then m.deathtimer = nil -- m.x = 0 -- m.y = 0 loadlevel(lvl) m.coins = 0 return end if m.deathtimer <= 40 then m.vy = m.vy+G m.vy = m.vy < 0 and m.vy*0.9 or m.vy end m.y = m.y+m.vy m.deathtimer = m.deathtimer - 1 return end if m.onground then m.duck = m.big and btn(1) end if not m.duck or not m.onground then if btn(2) then m.vx=m.vx-m.accel end if btn(3) then m.vx=m.vx+m.accel end if (not btn(3) and not btn(2)) or (btn(3) and btn(2)) then m.vx = m.vx*(m.onground and 0.8 or 0.999) end else m.vx = m.vx*0.95 end local max = btn(4) and m.maxvx2 or m.maxvx if abs(m.vx) > max then m.vx = max*sgn(m.vx) end --margin of error for jump if btn(5) then m.jmpbutt = m.jmpbutt-1 else m.jmpbutt = 5 end --[[if btnp(2) then m.dir = 1 elseif btnp(3) then m.dir = 0 end--]] if not m.onground then m.vy = m.vy+G if m.vy>m.maxvy then m.vy = m.maxvy end if m.vy<0 and not btn(5) then m.vy = m.vy*0.9 end else m.dir = (-sgn(m.vx)+1)/2 if btn(5) and m.jmpbutt>0 then sfx(0,nil,-1,nil,6) --jump m.vy = m.jumpvy m.x=m.x//4*4+1 m.onground = false m.dir = btn(2) and 1 or (btn(3) and 0) or m.dir end m.y = flr(m.y) if not m.groundbelow() then m.onground = false end end local newx = m.x+m.vx local newy = m.y+m.vy if m.can_move(newx,newy) then if m.vy > 0 and m.onground then --fall m.onground = false end m.x,m.y = newx,newy elseif m.can_move(m.x,newy) then m.y = newy m.vx = 0 elseif m.can_move(newx,m.y) then if m.vy > 0 then --hit ground m.onground = true m.y = flr((m.y+4)/8)*8 end m.vy = 0 m.x = newx elseif not m.can_move(m.x,m.y) then --mario is stuck m.x = m.x+1 end if m.y > c.y+H then --die m.big = false m.y = c.y+H m.damage() end if m.x > W*8-16 then m.x = W*8-16 end if m.invframes > 0 then m.invframes = m.invframes - 1 end end function m.draw() if m.deathtimer then c.spr(268,m.x,m.y,0,1,0,0,2,2) return end if m.invframes%2 == 1 then return end local ofst = m.big and 1 or 0 if m.duck then c.spr(300,m.x,m.y-16,0,1,m.dir,0,2,4) elseif not m.onground then --jmup c.spr(266+ofst*32,m.x,m.y-ofst*16,0,1,m.dir,0,2,2+ofst*2) elseif abs(m.vx) < 0.05 then --idle c.spr(256+ofst*32,m.x,m.y-ofst*16,0,1,m.dir,0,2,2+ofst*2) elseif (btn(2) and m.vx>0) or (btn(3) and m.vx<0) then --skid c.spr(264+ofst*32,m.x,m.y-ofst*16,0,1,m.dir,0,2,2+ofst*2) else --walk c.spr(258+ofst*32+2*flr((t/6)%3),m.x,m.y-ofst*16,0,1,m.dir,0,2,2+ofst*2) end end function m.damage() if m.deathtimer or m.invframes > 0 then return end if m.big then m.invframes = 50 m.big = false else sfx(3,nil,-1,nil,6) m.deathtimer = 70 m.onground = false m.vx,m.vy = 0,0 end end function m.getcoin() m.coins = m.coins+1 sfx(2,nil,-1,2,4) end function TIC() if btn(6) then reset() music(-1) end if not ninit then t = 0 m.init() loadlevel(1) ninit = true music(0,-1,-1,false) end --[[ if btn(0) then y=y-1 end if btn(1) then y=y+1 end if btn(2) then x=x-1 end if btn(3) then x=x+1 end --]] --UPDATE obj_update() m.update() c.update() --DRAW local dat = lvldat[lvl] or {} cls(dat.bg or 0) c.map() obj_draw() print("COIN",0,0) print(("%.2i"):format(m.coins),0,6) print("WORLD",29,0) print("1-1",29,6) m.draw() --GUI print(log) t=t+1 end end if btn(1) then W,H = 30*8,17*8 log = "";function logs(x) log = x end flr = math.floor abs = math.abs function sgn(n) return n>0 and 1 or n<1 and -1 or 0 end function lerp(v0, v1, t) return (1 - t) * v0 + t * v1 end --level data lvldat = { --i had to split 1-1 into two parts so it would fit in the map --there's probably a better approach {bg=8,x1=0,y1=0,x2=31*8,y2=17}, --1-1a {bg=8,x1=0,y1=17,x2=31*8,y2=2*17} --1-1b } lvl = 1 --current level function loadlevel(n) lvl = n dat = lvldat[n] objs = {} map_findspawnobjs(dat.x1,dat.y1,dat.x2,dat.y2) m.x = dat.x1*8 m.y = dat.y1*8+H-32 m.vx = 0.01 m.onground = true c.update() end --CAMERA c = {x=0,y=0,xbound=80} function c.spr(i,x,y,...) spr(i,x-16*c.x//16,y-c.y,...) end function c.map() --local tx,ty = c.x/8,c.y/8 map(0,0,31*8,18*8,-c.x,-c.y,0) end function c.update() if m.x-c.x > c.xbound then --c.x = lerp(c.x,m.x-c.xbound,0.1) c.x = m.x-c.xbound elseif m.x < c.x then --m.x = c.x m.vx = m.vx*0.9 c.x = m.x end --c.y = H*((m.y-8)//H) --c.y = c.y < 0 and 0 or c.y c.y = 8*lvldat[lvl].y1 if c.x > W*7 then c.x = W*7 end end function solids(t) return t and t >= 128 end function is_solid(x,y) return solids(mget(x//8,y//8)) end function can_move8x8(x,y) if x < 0 or is_solid(x,y) or is_solid(x+7,y) or is_solid(x,y+7) or is_solid(x+7,y+7) then return false end return true end function can_move(x,y) if y < lvldat[lvl].y1*8 then return true end return can_move8x8(x,y) and can_move8x8(x+7,y) and can_move8x8(x,y+7) and can_move8x8(x+7,y+7) end G = 0.2 --gravity --OBJECT list objs = {} function obj_spawn(o,x,y) if not o then return false end local t = { update = o.update, draw = o.draw, name = o.name, id = o.id, x=x,y=y } table.insert(objs,t) return t end function obj_update() --updates all objs local tokill = {} for n,o in ipairs(objs) do if o.kill then table.insert(tokill,n) elseif o.update and (o.x-c.x+17 > 0 and o.x-c.x < W) then o:update() end end for _,n in ipairs(tokill) do if objs[n] then table.remove(objs,n) end end end function obj_draw() --draws all objs for _,o in ipairs(objs) do if o.draw and (o.x-c.x+17 > 0 and o.x-c.x < W) then o:draw() end end end --OBJECT attribute table obj_table = {} function obj_spawnid(id,x,y) --looks up id in obj_table and spawns object return obj_spawn(obj_table[id],x,y) end function aabb(x1,y1,w1,h1,x2,y2,w2,h2) if x1 and y1 and w1 and h1 and x2 and y2 and w2 and h2 then return x1 < x2+w2 and x2 < x1+w1 and y1 < y2+h2 and y2 < y1+h1 end end do --TABLE-- local function o(mapid,name,updt,drw,rplc) obj_table[mapid] = { id = mapid, name = name, update = updt, draw = drw, --flag to tell if spawner tile --should be removed or let be replace = rplc == nil and true or rplc } end local function o_mcollision(o,w,h) --collisioin with mario w,h = w or 16, h or 16 local h = aabb(o.x,o.y,w,h,m.x+2,m.y+2-(m.big and 16 or 0),12,12*(m.big and 2 or 1)) return { hit = h, stomp = h and m.y < o.y and m.vy > 0 } end local function o_enemyproto(self,hp,w,h,ondeath) if not self.hp then self.hp = hp self.max_hp = hp else if self.hp <= 0 then if ondeath then ondeath() else self.kill = true end end end end local function o_persistrplc(o,id) --permanent replace mset(o.x//8,o.y//8,id or 0) end local function o_tmprplc(o,id) --temporary replace table.insert(overwritten,{x=o.x//8,y=o.y//8,t=mget(o.x//8,o.y//8)}) mset(o.x//8,o.y//8,id or 0) end local function o_tmprplc2(o,id) --temporary replace 2x2 tiles o_tmprplc(o,id) o.x=o.x+8 o_tmprplc(o,id+1) o.y=o.y+8 o_tmprplc(o,id+17) o.x=o.x-8 o_tmprplc(o,id+16) o.y=o.y-8 end local oG = G*0.9 local function o_gravity(o) o.vy = o.vy + oG if not o.onground then o.vy = o.vy+oG if o.vy > o.maxvy then o.vy = o.maxvy end if o.vy < 0 and not btn(5) then o.vy = o.vy*0.9 end end end local function o_collision(o) local newx,newy = o.x+o.vx,o.y+o.vy if can_move(newx,newy) then if o.vy > 0 and o.onground then --fall o.onground = false end o.x,o.y = newx,newy elseif can_move(o.x,newy) then o.y = newy o.vx = 0 elseif can_move(newx,o.y) then if o.vy > 0 then --hit ground o.onground = true end o.vy = 0 o.x = newx end end local function o_spr(o) c.spr(o.id,o.x,o.y,0,1,0,0,2,2) end --THE GANG o(2,"GOOMBER", function(self) if self.deathtimer then self.deathtimer = self.deathtimer-1 if self.deathtimer <= 0 then m.getcoin() self.kill = true end else self.vx = self.vx or -0.7 self.vy = self.vy or 0 self.maxvy = 2 o_gravity(self) local oldx = self.x o_collision(self) if self.x == oldx then --hit wall self.vx = -self.vx end local c = o_mcollision(self) if c.hit and not c.stomp then m.damage() elseif c.stomp then m.vy = -5 sfx(1,nil,-1,1,6) self.deathtimer = 20 end end end, function(self) if not self.deathtimer then c.spr(2,self.x,self.y,0,1,(t/16)%2,0,2,2) else --stomped c.spr(4,self.x,self.y,0,1,0,0,2,2) end end ) o(6, "COIN", function(self) if o_mcollision(self).hit then m.getcoin() self.kill = true end end, o_spr ) local function qmark_update(self,effect) --if self.pkill then return end if not self.init then o_tmprplc({x=self.x+8,y=self.y},130) self.init = true end if self.timer then if self.timer > -3 then self.y = self.y-2*sgn(self.timer) self.timer = self.timer-1 else self.kill = true o_tmprplc2(self,130) _ = effect and effect() end else if o_mcollision(self,16,22).hit and m.vy < 0 then m.vy = 0 self.timer = 3 end end end local function qmark_draw(self,h) if not self.timer then o_spr({id=8,x=self.x,y=self.y}) else c.spr(130,self.x,self.y,0,1,0,0,2,2) _=h and h() end end o(8, "QMARK COIN", function(self) qmark_update(self, function() m.getcoin() end) end, function(self) qmark_draw(self,function() c.spr(180,self.x,self.y-18,0,1,0,0,2,2) end) end,false ) o(9, "QMARK MUSHROOM", function(self) qmark_update(self, function() local s = obj_spawnid(212,self.x,self.y-16) s.vx = 0.7*sgn(m.vx) s.vx = s.vx == 0 and 0.7 or s.vx s.vy = -3 end) end, qmark_draw,false ) o(212,"MUSHROOM", function(self) self.vx = self.vx or -0.7 self.vy = self.vy or 0 self.maxvy = 2 o_gravity(self) local oldx = self.x o_collision(self) if self.x == oldx then --hit wall self.vx = -self.vx end if o_mcollision(self).hit then self.kill = true m.big = true end end, o_spr ) o(1, "WARP", function(self) if o_mcollision(self,16,32).hit then --[[m.x = 16 m.y = H+16 c.update()--]] loadlevel(lvl+1) end end, function()end,false ) end --finds objects in map and spawns them --also loads back objs that were --previously overwritten when loading overwritten = {} function map_findspawnobjs(sx,sy,ex,ey) for _,t in ipairs(overwritten) do mset(t.x,t.y,t.t) end overwritten = {} sx = sx or 0 sy = sy or 0 ex = ex or 31 ey = ey or 17 for tx=sx,ex do for ty=sy,ey do local t = mget(tx,ty) if obj_table[t] then if obj_table[t].replace then table.insert(overwritten,{ x=tx,y=ty,t=t }) mset(tx,ty,0) end obj_spawnid(t,tx*8,ty*8) end end end end --MARIO table m = {} function m.init() m.x,m.y,m.vx,m.vy=0,0,0,0 m.coins = 0 m.dir = 0 m.accel = 0.1 m.maxvx = 1.7 m.maxvx2 = 2.3 m.maxvy = 10 m.jumpvy = -6 m.big = false m.duck = false m.invframes = 0 m.onground = false end function m.groundbelow() return not can_move(m.x,m.y+4) end function m.can_move(x,y) if m.big and not m.duck then return can_move(x,y) and can_move(x,y-16) end return can_move(x,y) end function m.update() if m.deathtimer then if m.deathtimer == 40 then m.vy = -10 elseif m.y-c.y > H then m.deathtimer = nil -- m.x = 0 -- m.y = 0 loadlevel(lvl) m.coins = 0 return end if m.deathtimer <= 40 then m.vy = m.vy+G m.vy = m.vy < 0 and m.vy*0.9 or m.vy end m.y = m.y+m.vy m.deathtimer = m.deathtimer - 1 return end if m.onground then m.duck = m.big and btn(1) end if not m.duck or not m.onground then if btn(2) then m.vx=m.vx-m.accel end if btn(3) then m.vx=m.vx+m.accel end if (not btn(3) and not btn(2)) or (btn(3) and btn(2)) then m.vx = m.vx*(m.onground and 0.8 or 0.999) end else m.vx = m.vx*0.95 end local max = btn(4) and m.maxvx2 or m.maxvx if abs(m.vx) > max then m.vx = max*sgn(m.vx) end --margin of error for jump if btn(5) then m.jmpbutt = m.jmpbutt-1 else m.jmpbutt = 5 end --[[if btnp(2) then m.dir = 1 elseif btnp(3) then m.dir = 0 end--]] if not m.onground then m.vy = m.vy+G if m.vy>m.maxvy then m.vy = m.maxvy end if m.vy<0 and not btn(5) then m.vy = m.vy*0.9 end else m.dir = (-sgn(m.vx)+1)/2 if btn(5) and m.jmpbutt>0 then sfx(0,nil,-1,nil,6) --jump m.vy = m.jumpvy m.x=m.x//4*4+1 m.onground = false m.dir = btn(2) and 1 or (btn(3) and 0) or m.dir end m.y = flr(m.y) if not m.groundbelow() then m.onground = false end end local newx = m.x+m.vx local newy = m.y+m.vy if m.can_move(newx,newy) then if m.vy > 0 and m.onground then --fall m.onground = false end m.x,m.y = newx,newy elseif m.can_move(m.x,newy) then m.y = newy m.vx = 0 elseif m.can_move(newx,m.y) then if m.vy > 0 then --hit ground m.onground = true m.y = flr((m.y+4)/8)*8 end m.vy = 0 m.x = newx elseif not m.can_move(m.x,m.y) then --mario is stuck m.x = m.x+1 end if m.y > c.y+H then --die m.big = false m.y = c.y+H m.damage() end if m.x > W*9-16 then m.x = W*9-16 end if m.invframes > 0 then m.invframes = m.invframes - 1 end end function m.draw() if m.deathtimer then c.spr(412,m.x,m.y,0,1,0,0,1,1) return end if m.invframes%2 == 1 then return end local ofst = m.big and 1 or 1 if m.duck then exit() trace("\nSorry, the game has crashed unexceptedly closed a cart.",2) elseif not m.onground then --jmup c.spr(362+ofst*32,m.x,m.y-ofst*1,0,1,m.dir,0,2,2+ofst*1) elseif abs(m.vx) < 0.05 then --idle c.spr(352+ofst*32,m.x,m.y-ofst*1,0,1,m.dir,0,2,2+ofst*1) elseif (btn(2) and m.vx>0) or (btn(3) and m.vx<0) then --skid c.spr(360+ofst*32,m.x,m.y-ofst*1,0,1,m.dir,0,2,2+ofst*1) else --walk c.spr(354+ofst*32+2*flr((t/6)%3),m.x,m.y-ofst*1,0,1,m.dir,0,2,2+ofst*1) end end function m.damage() if m.deathtimer or m.invframes > 0 then return end if m.big then m.invframes = 50 m.big = false else sfx(3,nil,-1,nil,6) m.deathtimer = 70 m.onground = false m.vx,m.vy = 0,0 end end function m.getcoin() m.coins = m.coins+1 sfx(2,nil,-1,2,4) end function TIC() if btn(6) then reset() music(-1) end if not ninit then t = 0 m.init() loadlevel(1) ninit = true music(0,-1,-1,false) end --[[ if btn(0) then y=y-1 end if btn(1) then y=y+1 end if btn(2) then x=x-1 end if btn(3) then x=x+1 end --]] --UPDATE obj_update() m.update() c.update() --DRAW local dat = lvldat[lvl] or {} cls(dat.bg or 0) c.map() obj_draw() print("MINI\nCOIN",0,0) print(("%.2i"):format(m.coins),0,12) print("WORLD",29,0) print("1-1",29,6) m.draw() --GUI print(log) t=t+1 end end end