diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 4e5b6d6dfb..7ad84b4a79 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -52,4 +52,4 @@ #define INNATE 64 // All mobs can be assumed to speak and understand this language. (audible emotes) #define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message #define NO_STUTTER 256 // No stuttering, slurring, or other speech problems -#define ALT_TRANSMIT 512 // Language is not based on vision or sound (Todo: add this into the say code and use it for the rootspeak languages) \ No newline at end of file +#define ALT_TRANSMIT 512 // Language is not based on vision or sound (Todo: add this into the say code and use it for the rootspeak languages) diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm index 0bb26b32bc..90fb43724e 100644 --- a/code/game/objects/items/devices/translator.dm +++ b/code/game/objects/items/devices/translator.dm @@ -16,7 +16,8 @@ if(!listening) //Turning ON langset = input(user,"Translate to which of your languages?","Language Selection") as null|anything in user.languages if(langset) - if(langset && ((langset.flags & NONVERBAL) || (langset.flags & HIVEMIND))) + if(langset && ((langset.flags & NONVERBAL) || (langset.flags & HIVEMIND) || (!langset.machine_understands))) + //Nonverbal means no spoken words to translate, so I didn't see the need to remove it. to_chat(user, "\The [src] cannot output that language.") return else @@ -49,6 +50,9 @@ if (language && (language.flags & NONVERBAL)) return //Not gonna translate sign language + if (!language.machine_understands) + return //Any other languages that it can't translate. + if (visual && ((L.sdisabilities & BLIND) || L.eye_blind)) return //Can't see the screen, don't get the message diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index fc4a8c2ba3..cee27175ad 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -6,7 +6,7 @@ icon_state = "tube" origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) amount = 10 - + w_class = ITEMSIZE_SMALL /obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob) if (!istype(M) || !istype(user)) diff --git a/code/modules/mob/language/monkey.dm b/code/modules/mob/language/monkey.dm index ce276a358a..c6024d346b 100644 --- a/code/modules/mob/language/monkey.dm +++ b/code/modules/mob/language/monkey.dm @@ -5,18 +5,70 @@ ask_verb = "chimpers" exclaim_verb = "screeches" key = "6" + machine_understands = 0 /datum/language/skrell/monkey name = "Neaera" desc = "Squik squik squik." key = "8" + machine_understands = 0 /datum/language/unathi/monkey name = "Stok" desc = "Hiss hiss hiss." key = "7" + machine_understands = 0 /datum/language/tajaran/monkey name = "Farwa" desc = "Meow meow meow." key = "9" + machine_understands = 0 + +/datum/language/corgi + name = "Dog" + desc = "Woof woof woof." + speech_verb = "barks" + ask_verb = "woofs" + exclaim_verb = "howls" + key = "n" + flags = RESTRICTED + machine_understands = 0 + space_chance = 100 + syllables = list("bark", "woof", "bowwow", "yap", "arf") + +/datum/language/cat + name = "Cat" + desc = "Meow meow meow." + speech_verb = "meows" + ask_verb = "mrowls" + exclaim_verb = "yowls" + key = "c" + flags = RESTRICTED + machine_understands = 0 + space_chance = 100 + syllables = list("meow", "mrowl", "purr", "meow", "meow", "meow") + +/datum/language/mouse + name = "Mouse" + desc = "Squeak squeak. *Nibbles on cheese*" + speech_verb = "squeaks" + ask_verb = "squeaks" + exclaim_verb = "squeaks" + key = "m" + flags = RESTRICTED + machine_understands = 0 + space_chance = 100 + syllables = list("squeak") // , "gripes", "oi", "meow") + +/datum/language/bird + name = "Bird" + desc = "Chirp chirp, give me food" + speech_verb = "chirps" + ask_verb = "tweets" + exclaim_verb = "squawks" + key = "m" + flags = RESTRICTED + machine_understands = 0 + space_chance = 100 + syllables = list("chirp", "squawk", "tweet") \ No newline at end of file diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index 8c174a2ff7..3e85f4efec 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -4,6 +4,7 @@ speech_verb = "says" colour = "changeling" key = "g" + machine_understands = 0 flags = RESTRICTED | HIVEMIND /datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) @@ -21,6 +22,7 @@ exclaim_verb = "sings" colour = "alien" key = "x" + machine_understands = 0 flags = RESTRICTED | HIVEMIND /datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) @@ -80,4 +82,5 @@ exclaim_verb = "chants" colour = "cult" key = "y" + machine_understands = 0 flags = RESTRICTED | HIVEMIND diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 8e2f2987c9..85942fcb4e 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -6,6 +6,7 @@ exclaim_verb = "rustles" colour = "soghun" key = "q" + machine_understands = 0 flags = RESTRICTED syllables = list("hs","zt","kr","st","sh") @@ -18,6 +19,7 @@ name = LANGUAGE_ROOTGLOBAL desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses low frequency waves for slow communication at long ranges." key = "w" + machine_understands = 0 flags = RESTRICTED | HIVEMIND /datum/language/unathi diff --git a/code/modules/mob/language/synthetic.dm b/code/modules/mob/language/synthetic.dm index 2a2ddb0ff9..36dd57bc69 100644 --- a/code/modules/mob/language/synthetic.dm +++ b/code/modules/mob/language/synthetic.dm @@ -6,6 +6,7 @@ ask_verb = "queries" exclaim_verb = "declares" key = "b" + machine_understands = 0 flags = RESTRICTED | HIVEMIND var/drone_only @@ -64,5 +65,6 @@ exclaim_verb = "transmits" colour = "say_quote" key = "d" + machine_understands = 0 flags = RESTRICTED | HIVEMIND drone_only = 1 diff --git a/code/modules/mob/living/simple_animal/animals/bat.dm b/code/modules/mob/living/simple_animal/animals/bat.dm index d7ed8e5f40..1d722c0b8a 100644 --- a/code/modules/mob/living/simple_animal/animals/bat.dm +++ b/code/modules/mob/living/simple_animal/animals/bat.dm @@ -36,6 +36,8 @@ max_n2 = 0 minbodytemp = 0 + has_langs = list("Mouse") + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat var/mob/living/owner diff --git a/code/modules/mob/living/simple_animal/animals/cat.dm b/code/modules/mob/living/simple_animal/animals/cat.dm index d35a557bc8..1654f8032c 100644 --- a/code/modules/mob/living/simple_animal/animals/cat.dm +++ b/code/modules/mob/living/simple_animal/animals/cat.dm @@ -27,6 +27,7 @@ holder_type = /obj/item/weapon/holder/cat mob_size = MOB_SMALL + has_langs = list("Cat") speak_chance = 1 speak = list("Meow!","Esp!","Purr!","HSSSSS") speak_emote = list("purrs", "meows") diff --git a/code/modules/mob/living/simple_animal/animals/corgi.dm b/code/modules/mob/living/simple_animal/animals/corgi.dm index 8f4adf8e54..11b2302aaa 100644 --- a/code/modules/mob/living/simple_animal/animals/corgi.dm +++ b/code/modules/mob/living/simple_animal/animals/corgi.dm @@ -17,6 +17,7 @@ see_in_dark = 5 mob_size = 8 + has_langs = list("Dog") speak_chance = 1 speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") speak_emote = list("barks", "woofs") diff --git a/code/modules/mob/living/simple_animal/animals/farm_animals.dm b/code/modules/mob/living/simple_animal/animals/farm_animals.dm index fc21fbddfd..e65654cdad 100644 --- a/code/modules/mob/living/simple_animal/animals/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/animals/farm_animals.dm @@ -167,6 +167,7 @@ response_harm = "kicks" attacktext = "kicked" + has_langs = list("Bird") speak_chance = 2 speak = list("Cherp.","Cherp?","Chirrup.","Cheep!") speak_emote = list("cheeps") @@ -213,6 +214,7 @@ var/global/chicken_count = 0 response_harm = "kicks" attacktext = "kicked" + has_langs = list("Bird") speak_chance = 2 speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.") speak_emote = list("clucks","croons") diff --git a/code/modules/mob/living/simple_animal/animals/goose.dm b/code/modules/mob/living/simple_animal/animals/goose.dm index 217ea0b024..ded7c5214a 100644 --- a/code/modules/mob/living/simple_animal/animals/goose.dm +++ b/code/modules/mob/living/simple_animal/animals/goose.dm @@ -35,6 +35,7 @@ max_n2 = 0 minbodytemp = 0 + has_langs = list("Bird") speak_chance = 10 speak = list("HONK!") emote_hear = list("honks loudly!") diff --git a/code/modules/mob/living/simple_animal/animals/mouse.dm b/code/modules/mob/living/simple_animal/animals/mouse.dm index 43b12961bd..cb06aecb7e 100644 --- a/code/modules/mob/living/simple_animal/animals/mouse.dm +++ b/code/modules/mob/living/simple_animal/animals/mouse.dm @@ -29,6 +29,7 @@ minbodytemp = 223 //Below -50 Degrees Celcius maxbodytemp = 323 //Above 50 Degrees Celcius + has_langs = list("Mouse") speak_chance = 1 speak = list("Squeek!","SQUEEK!","Squeek?") speak_emote = list("squeeks","squeeks","squiks") diff --git a/code/modules/mob/living/simple_animal/animals/parrot.dm b/code/modules/mob/living/simple_animal/animals/parrot.dm index a2adba345b..876b92cb5b 100644 --- a/code/modules/mob/living/simple_animal/animals/parrot.dm +++ b/code/modules/mob/living/simple_animal/animals/parrot.dm @@ -46,6 +46,7 @@ stop_automated_movement = 1 universal_speak = 1 + has_langs = list("Bird") speak_chance = 2 speak = list("Hi","Hello!","Cracker?","BAWWWWK george mellons griffing me") speak_emote = list("squawks","says","yells") diff --git a/code/modules/mob/living/simple_animal/animals/penguin.dm b/code/modules/mob/living/simple_animal/animals/penguin.dm index 40c085a72f..90074edef5 100644 --- a/code/modules/mob/living/simple_animal/animals/penguin.dm +++ b/code/modules/mob/living/simple_animal/animals/penguin.dm @@ -20,6 +20,7 @@ melee_damage_upper = 15 attacktext = "pecked" + has_langs = list("Bird") speak_chance = 0 meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index a0a6a89cb2..41ad4cb5c6 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -164,7 +164,7 @@ name = "Carthatoline" id = "carthatoline" result = "carthatoline" - required_reagents = list("dylovene" = 1, "carbon" = 2, "phoron" = 0.1) + required_reagents = list("anti_toxin" = 1, "carbon" = 2, "phoron" = 0.1) catalysts = list("phoron" = 1) result_amount = 2 @@ -1840,4 +1840,4 @@ id = "berrytea" result = "berrytea" required_reagents = list("tea" = 5, "berryjuice" = 1) - result_amount = 6 \ No newline at end of file + result_amount = 6 diff --git a/html/changelogs/Atermonera - Translators.yml b/html/changelogs/Atermonera - Translators.yml new file mode 100644 index 0000000000..278506535c --- /dev/null +++ b/html/changelogs/Atermonera - Translators.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Atermonera + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Common simple animals now have their own language, and as such are no longer understandable by humans." + - bugfix: "Translators can't understand the same languages that recorders can't, including the new animal languages." diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index 332a4ce4fe..3bc731120e 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -10011,7 +10011,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhawxbvjbvkbkPbkPbkQbkQbkSbkPbkPdELdELahyahyahyahybtHbtHbYedoobsBaahbtTdIWdIVdIYdIXdIZdIJbvlbvmbvnbMNbykbvpbvqbvrbMKbvsbvtbvubvvbvwbvxbvybvzbvAbvBbDKbllahyahybaiaZzbMObhrbaiahyahyahyaahaahaahaahaahaahbjWbjWbrwbpMckQbZfclHcqpbrMbjWbjWaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbRLaUwbvNahyahybvObFrbuqbvQbGZbvSbvTcqsbsXanvbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbQwbwibwjbwkbwlbwmbwnbwoboObwpbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbyUbwybwzbkJbkJbGRbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLdJadELahyahyahyahydELdELahyahyahyahyahyahybtHbYebsBbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbHDbwRbKGbwTbMNbwUbuabsCbucbwVbwWbwXbllbwYbKJbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahbjWbjWbjWcuwcuvbZgcuHcvCbjWbjWbjWaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbKKbxebvSbLZbxgbxhbxibsXanAbxkbxlbxmbvYbvYbxnbqhbxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbvRboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPbxQbtLaahaahaahahyahyahyahyahyahyahyahyaahaahbtHbEUbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbMHbyjbNtbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaToaYGbynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbyScbIbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsawybtLaahaahaahaahahyahyahyahyahyahyaahaahaahbtHbEUbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbNUbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahbjWbxabjWbjWaZdaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbaRaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbBEbuCbApbAqbArbAsbAtbAubuCdopbAwbqmbAxbAxbAybtfbAzbwibAAbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmdkRbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsawybtLaahaahaahaahahyahyahyahyahyahyaahaahaahbtHbEUbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbNUbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahbjWbxabjWbjWbCbaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbaRaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbBEbuCbApbAqbArbAsbAtbAubuCdopbAwbqmbAxbAxbAybtfbAzbwibAAbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmdkRbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaabkfbBabBabBbbBcbBdbBebBfbBgbBhbBibtLbBjbBkbBlbBmbztbtLaahaahaahaahaahahyahyahyahyaahaahaahaahbtHbEUbwMbBnbzwbBobBpbBqbBrbBsbBrbBtbBubBvbBwbBxbjJbBybjJbBzbjJbjJbBAbBBbBCbBDcMebBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBUbBUbBUbBVbBUbBWaZdaZdaZdaZdbBXaZdaZdaZdbBYbBZbBZbBZbBZbBZbCabCbbCcbCdbCdbCdbCdbCdbCdbCdbaSbaTbaTbaTbaTbaTbaVbaWbaWbaWbaXbaYbaWbaZbaWbbSbbabbTbClbCmbbRbCnbCobCpbCqbCrbvQbCsbvSbCtbCubwabCvbCwbCxbCzbyDbCybwabCBbCCbCDbCEbCEbCFbCGbwhbxtbCHbCIbCJbCKbIcbySbySbCMbCNbCObCPbyWbAJbySbAKaZmaahaahaahaahaahaahbgmbgmbgmbJJbCRbgmbgmbgmbgmbgmbgmbCSbCTbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbCUbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbCVdiNbAZbDabCZbDcbDdbDebDfbDgbDhbDibDjbtLbtLbDkbtLbtLbDlbtLaahaahaahaahaahaahaahahyahyaahaahaahaahbtHbEUbwMbDmbDnbDobDpbDqbDrbDsbDtbwMbDubDvbDwbDxbDybDzbDAbDBbDCbDDbDEbDFbyhbDGbDHbDIbDJbObbDLbzVbzWbzXbzYbecbecbDMbDNbDOaZdbDPbDQbDRbDSbDTbDUbDVbDWbDXbDYbDZbEabEbbBUbBUbBUbEcaZdaZdaZdaZdaZGbEdbEebEfaZGbEjbEjbEjbEjbEjbEjbbUaZGbbVbbXbbWaZGbEgbEgbEgbEgbEgbbYbEkbiDbjYaZdbElaUvbetbEmaVlbEnbEobEpbEqbErbEsbEtbEubEvbEwbsXbsYbsZbExbsYbEybsZbsXbEzbtbbyFbyGbyHbEAbtfbEBbuKbECbEDbuKbySbySbySdBabEFbEGbEHbEIbyWbAJbySbAKaZmaahaahaahaahaahaahaahbgmbEJbEKbELbgmaahaahaahaahbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaabkfbBabBabENbEObEPbEQbznbERbESbETbEUbEUbEVbEWbtHbEXbtHaahaahaahaahaahaahaahaahaahaahaahaahaahbtHbEUbwMbEYbEZbFabFbbFcbFdbFebFfbwMbFgbfubFhbFibFjbFkbFlbFmbFibFnbFobFnbyhbyhbyhbyhbyhbPNbFqbRGbyhbfzbeebFsbecbcnbFtbboaZdbFubFubFubFubFubFubFvdoyaZdbFxbFybFxaZdbFzbFAbFBdoCaZdaahaahaZdaZdaZGaZHaZGbEjbEjbcabbZbcHbcGbEjbcIbFQbEjbEgbEgbEgbEgbIQbIQbcJbEgbcKbFDbEgaZdaZdaTobcLbgJaUvbFSaTobypbyqbFTbAlbFUbFVbFWbFXbEqbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGjbGkbGlbtbbGmbGnbGobGpbySdoSbGrbGsbGtbGubGvbGwbyWbAJbySaZWaZmaZmaahaahaahaahaahaahbgmbxzbGydpKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa