From be514ae29430861c4c2384d706573166f1607571 Mon Sep 17 00:00:00 2001
From: ZerlGray <32713309+ZerlGray@users.noreply.github.com>
Date: Fri, 22 Dec 2017 21:07:24 +0700
Subject: [PATCH 1/8] Add files via upload
---
code/game/gamemodes/changeling/HelpCode.dm | 7 +
code/game/gamemodes/changeling/Infecting.dm | 88 +
.../game/gamemodes/changeling/absorbed_dna.dm | 24 +-
code/game/gamemodes/changeling/changeling.dm | 36 +-
.../gamemodes/changeling/changeling_powers.dm | 1614 +++++++++--------
.../changeling/generic_equip_procs.dm | 280 +++
.../gamemodes/changeling/modularchangling.dm | 1326 +++++++++-----
7 files changed, 2057 insertions(+), 1318 deletions(-)
create mode 100644 code/game/gamemodes/changeling/HelpCode.dm
create mode 100644 code/game/gamemodes/changeling/Infecting.dm
create mode 100644 code/game/gamemodes/changeling/generic_equip_procs.dm
diff --git a/code/game/gamemodes/changeling/HelpCode.dm b/code/game/gamemodes/changeling/HelpCode.dm
new file mode 100644
index 0000000..10d1c03
--- /dev/null
+++ b/code/game/gamemodes/changeling/HelpCode.dm
@@ -0,0 +1,7 @@
+/mob/living/proc/set_m_intent(var/intent)
+ if (intent != "walk" && intent != "run")
+ return 0
+ m_intent = intent
+ if(hud_used)
+ if (hud_used.move_intent)
+ hud_used.move_intent.icon_state = intent == "walk" ? "walking" : "running"
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/Infecting.dm b/code/game/gamemodes/changeling/Infecting.dm
new file mode 100644
index 0000000..575d9e6
--- /dev/null
+++ b/code/game/gamemodes/changeling/Infecting.dm
@@ -0,0 +1,88 @@
+// Checks whether or not the target can be affected by a vampire's abilities.
+/mob/proc/vampire_can_affect_target(var/mob/living/carbon/human/T, var/notify = 1, var/account_loyalty_implant = 0)
+ if (!T || !istype(T))
+ return 0
+
+ if (T.isSynthetic())
+ if (notify)
+ to_chat(src, "You lack the power interact with mechanical constructs.")
+ return 0
+
+ return 1
+
+
+/mob/living/carbon/human/proc/finish_chang_timeout(chang_flags = 0)
+ if (!usr.mind || !usr.mind.changeling)
+ return FALSE
+
+ if (chang_flags && !(usr.mind.changeling & chang_flags))
+ return FALSE
+
+ return TRUE
+/////////////////
+/////////////////
+///////Helpcode deadphil//////////
+
+/proc/infect_mob(var/mob/living/carbon/M, var/datum/disease2/disease/D)
+ infect_virus2(M,D,1)
+ M.hud_updateflag |= 1 << STATUS_HUD
+
+
+
+
+/////////////////////////////////////////////////////////////////
+
+// Gives a lethal disease to the target.
+/datum/power/changeling/Infection
+ name = "Infection"
+ desc = "We can produce dangerous viral diseases in our bodies."
+ helptext = "Touch the victim and it will be infected."
+ enhancedtext = "We produce a powerful virus, capable of killing the victim in the shortest possible time."
+// ability_icon_state = "ling_camoflage"
+ genomecost = 6
+ verbpath = /mob/proc/Infection
+
+
+/mob/proc/Infection()
+ set category = "Changeling"
+ set name = "Infection (30)"
+ set desc = "Infects the victim with a dangerous virus that causes organ failure."
+
+ var/datum/changeling/changeling = changeling_power(30,0,100,CONSCIOUS)
+ if (!changeling)
+ return 0
+
+ var/list/victims = list()
+ for (var/mob/living/carbon/human/H in view(1))
+ if (H == src)
+ continue
+ victims += H
+
+ if (!victims.len)
+ to_chat(src, "No suitable targets.")
+ return
+
+ var/mob/living/carbon/human/T = input(src, "Select Victim") as null|mob in victims
+
+ if (!vampire_can_affect_target(T))
+ return
+
+ to_chat(src, "You infect [T] with a deadly disease. They will soon fade away.")
+
+ T.help_shake_act(src)
+
+ var/datum/disease2/disease/lethal = new
+ lethal.makerandom(4)
+ lethal.infectionchance = 1
+ lethal.stage = lethal.max_stage
+ lethal.spreadtype = "None"
+
+ infect_mob(T, lethal)
+
+ admin_attack_log(src, T, "used diseased touch on [key_name(T)]", "was given a lethal disease by [key_name(src)]", "used diseased touch (virus info) on")
+
+ changeling.chem_charges -= 30
+
+// verbs -= /mob/proc/Infection
+
+// ADD_VERB_IN_IF(src, 1800, /mob/proc/Infection, CALLBACK(src, .proc/finish_chang_timeout))
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/absorbed_dna.dm b/code/game/gamemodes/changeling/absorbed_dna.dm
index 2527f90..dc479d4 100644
--- a/code/game/gamemodes/changeling/absorbed_dna.dm
+++ b/code/game/gamemodes/changeling/absorbed_dna.dm
@@ -1,12 +1,12 @@
-/datum/absorbed_dna
- var/name
- var/datum/dna/dna
- var/speciesName
- var/list/languages
-
-/datum/absorbed_dna/New(var/newName, var/newDNA, var/newSpecies, var/newLanguages)
- ..()
- name = newName
- dna = newDNA
- speciesName = newSpecies
- languages = newLanguages
+/datum/absorbed_dna
+ var/name
+ var/datum/dna/dna
+ var/speciesName
+ var/list/languages
+
+/datum/absorbed_dna/New(var/newName, var/newDNA, var/newSpecies, var/newLanguages)
+ ..()
+ name = newName
+ dna = newDNA
+ speciesName = newSpecies
+ languages = newLanguages
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index b201294..3e1f9a6 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -1,18 +1,18 @@
-/datum/game_mode/changeling
- name = "Changeling"
- round_description = "There are alien changelings onboard. Do not let the changelings succeed!"
- extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. \
- Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet \
- something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, \
- however, is that this something is someone. An unknown alien specimen has incorporated itself into \
- the crew. Its unique biology allows it to manipulate its own or anyone else's DNA. \
- With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, \
- its existence is a threat to not only your personal safety but the lives of everyone on board. \
- No one knows where it came from. No one knows who it is or what it wants. One thing is for \
- certain though... there is never just one of them. Good luck."
- config_tag = "changeling"
- required_players = 2
- required_enemies = 1
- end_on_antag_death = 0
- antag_scaling_coeff = 10
- antag_tags = list(MODE_CHANGELING)
+/datum/game_mode/changeling
+ name = "Changeling"
+ round_description = "There are alien changelings onboard. Do not let the changelings succeed!"
+ extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. \
+ Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet \
+ something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, \
+ however, is that this something is someone. An unknown alien specimen has incorporated itself into \
+ the crew. Its unique biology allows it to manipulate its own or anyone else's DNA. \
+ With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, \
+ its existence is a threat to not only your personal safety but the lives of everyone on board. \
+ No one knows where it came from. No one knows who it is or what it wants. One thing is for \
+ certain though... there is never just one of them. Good luck."
+ config_tag = "changeling"
+ required_players = 2
+ required_enemies = 1
+ end_on_antag_death = 0
+ antag_scaling_coeff = 10
+ antag_tags = list(MODE_CHANGELING)
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index eed5824..d49af8e 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -1,804 +1,810 @@
-var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")
-
-/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
- var/list/datum/absorbed_dna/absorbed_dna = list()
- var/list/absorbed_languages = list()
- var/absorbedcount = 0
- var/chem_charges = 20
- var/chem_recharge_rate = 0.5
- var/chem_storage = 50
- var/sting_range = 1
- var/changelingID = "Changeling"
- var/geneticdamage = 0
- var/isabsorbing = 0
- var/geneticpoints = 25
- var/purchasedpowers = list()
- var/mimicing = ""
-
-
-/datum/changeling/New()
- ..()
- if(possible_changeling_IDs.len)
- changelingID = pick(possible_changeling_IDs)
- possible_changeling_IDs -= changelingID
- changelingID = "[changelingID]"
- else
- changelingID = "[rand(1,999)]"
-
-/datum/changeling/proc/regenerate()
- chem_charges = min(max(0, chem_charges+chem_recharge_rate), chem_storage)
- geneticdamage = max(0, geneticdamage-1)
-
-/datum/changeling/proc/GetDNA(var/dna_owner)
- for(var/datum/absorbed_dna/DNA in absorbed_dna)
- if(dna_owner == DNA.name)
- return DNA
-
-/mob/proc/absorbDNA(var/datum/absorbed_dna/newDNA)
- var/datum/changeling/changeling = null
- if(src.mind && src.mind.changeling)
- changeling = src.mind.changeling
- if(!changeling)
- return
-
- for(var/language in newDNA.languages)
- changeling.absorbed_languages |= language
-
- changeling_update_languages(changeling.absorbed_languages)
-
- if(!changeling.GetDNA(newDNA.name)) // Don't duplicate - I wonder if it's possible for it to still be a different DNA? DNA code could use a rewrite
- changeling.absorbed_dna += newDNA
-
-//Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human
-/mob/proc/make_changeling()
-
- if(!mind) return
- if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
-
- verbs += /datum/changeling/proc/EvolutionMenu
- add_language("Changeling")
-
- var/lesser_form = !ishuman(src)
-
- if(!powerinstances.len)
- for(var/P in powers)
- powerinstances += new P()
-
- // Code to auto-purchase free powers.
- for(var/datum/power/changeling/P in powerinstances)
- if(!P.genomecost) // Is it free?
- if(!(P in mind.changeling.purchasedpowers)) // Do we not have it already?
- mind.changeling.purchasePower(mind, P.name, 0)// Purchase it. Don't remake our verbs, we're doing it after this.
-
- for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
- if(P.isVerb)
- if(lesser_form && !P.allowduringlesserform) continue
- if(!(P in src.verbs))
- src.verbs += P.verbpath
-
- for(var/language in languages)
- mind.changeling.absorbed_languages |= language
-
- var/mob/living/carbon/human/H = src
- if(istype(H))
- var/datum/absorbed_dna/newDNA = new(H.real_name, H.dna, H.species.name, H.languages)
- absorbDNA(newDNA)
-
- return 1
-
-//removes our changeling verbs
-/mob/proc/remove_changeling_powers()
- if(!mind || !mind.changeling) return
- for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
- if(P.isVerb)
- verbs -= P.verbpath
-
-
-//Helper proc. Does all the checks and stuff for us to avoid copypasta
-/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0)
-
- if(!src.mind) return
- if(!iscarbon(src)) return
-
- var/datum/changeling/changeling = src.mind.changeling
- if(!changeling)
- world.log << "[src] has the changeling_transform() verb but is not a changeling."
- return
-
- if(src.stat > max_stat)
- to_chat(src, "We are incapacitated.")
- return
-
- if(changeling.absorbed_dna.len < required_dna)
- to_chat(src, "We require at least [required_dna] samples of compatible DNA.")
- return
-
- if(changeling.chem_charges < required_chems)
- to_chat(src, "We require at least [required_chems] units of chemicals to do that!")
- return
-
- if(changeling.geneticdamage > max_genetic_damage)
- to_chat(src, "Our genomes are still reassembling. We need time to recover first.")
- return
-
- return changeling
-
-
-//Used to dump the languages from the changeling datum into the actual mob.
-/mob/proc/changeling_update_languages(var/updated_languages)
-
- languages = list()
- for(var/language in updated_languages)
- languages += language
-
- //This isn't strictly necessary but just to be safe...
- add_language("Changeling")
-
- return
-
-//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
-//Doesn't cost anything as it's the most basic ability.
-/mob/proc/changeling_absorb_dna()
- set category = "Changeling"
- set name = "Absorb DNA"
-
- var/datum/changeling/changeling = changeling_power(0,0,100)
- if(!changeling) return
-
- var/obj/item/grab/G = src.get_active_hand()
- if(!istype(G))
- to_chat(src, "We must be grabbing a creature in our active hand to absorb them.")
- return
-
- var/mob/living/carbon/human/T = G.affecting
- if(!istype(T))
- to_chat(src, "[T] is not compatible with our biology.")
- return
-
- if(T.species.flags & NO_SCAN)
- to_chat(src, "We cannot extract DNA from this creature!")
- return
-
- if(HUSK in T.mutations)
- to_chat(src, "This creature's DNA is ruined beyond useability!")
- return
-
- if(!G.can_absorb())
- to_chat(src, "We must have a tighter grip to absorb this creature.")
- return
-
- if(changeling.isabsorbing)
- to_chat(src, "We are already absorbing!")
- return
-
- var/obj/item/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
- if(!affecting)
- to_chat(src, "They are missing that body part!")
-
- changeling.isabsorbing = 1
- for(var/stage = 1, stage<=3, stage++)
- switch(stage)
- if(1)
- to_chat(src, "This creature is compatible. We must hold still...")
- if(2)
- to_chat(src, "We extend a proboscis.")
- src.visible_message("[src] extends a proboscis!")
- if(3)
- to_chat(src, "We stab [T] with the proboscis.")
- src.visible_message("[src] stabs [T] with the proboscis!")
- to_chat(T, "You feel a sharp stabbing pain!")
- affecting.take_damage(39, 0, DAM_SHARP, "large organic needle")
-
- feedback_add_details("changeling_powers","A[stage]")
- if(!do_mob(src, T, 150))
- to_chat(src, "Our absorption of [T] has been interrupted!")
- changeling.isabsorbing = 0
- return
-
- to_chat(src, "We have absorbed [T]!")
- src.visible_message("[src] sucks the fluids from [T]!")
- to_chat(T, "You have been absorbed by the changeling!")
- changeling.chem_charges += 10
- changeling.geneticpoints += 2
-
- //Steal all of their languages!
- for(var/language in T.languages)
- if(!(language in changeling.absorbed_languages))
- changeling.absorbed_languages += language
-
- changeling_update_languages(changeling.absorbed_languages)
-
- var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages)
- absorbDNA(newDNA)
- if(mind && T.mind)
- mind.store_memory("[T.real_name]'s memories:")
- mind.store_memory(T.mind.memory)
- mind.store_memory("
")
-
- if(T.mind && T.mind.changeling)
- if(T.mind.changeling.absorbed_dna)
- for(var/datum/absorbed_dna/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
- if(changeling.GetDNA(dna_data.name))
- continue
- absorbDNA(dna_data)
- changeling.absorbedcount++
- T.mind.changeling.absorbed_dna.len = 1
-
- if(T.mind.changeling.purchasedpowers)
- for(var/datum/power/changeling/Tp in T.mind.changeling.purchasedpowers)
- if(Tp in changeling.purchasedpowers)
- continue
- else
- changeling.purchasedpowers += Tp
-
- if(!Tp.isVerb)
- call(Tp.verbpath)()
- else
- src.make_changeling()
-
- changeling.chem_charges += T.mind.changeling.chem_charges
- changeling.geneticpoints += T.mind.changeling.geneticpoints
- T.mind.changeling.chem_charges = 0
- T.mind.changeling.geneticpoints = 0
- T.mind.changeling.absorbedcount = 0
-
- changeling.absorbedcount++
- changeling.isabsorbing = 0
-
- T.death(0)
- T.Drain()
- return 1
-
-
-//Change our DNA to that of somebody we've absorbed.
-/mob/proc/changeling_transform()
- set category = "Changeling"
- set name = "Transform (5)"
-
- var/datum/changeling/changeling = changeling_power(5,1,0)
- if(!changeling) return
-
- var/list/names = list()
- for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
- names += "[DNA.name]"
-
- var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
- if(!S) return
-
- var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S)
- if(!chosen_dna)
- return
-
- changeling.chem_charges -= 5
- changeling.geneticdamage = 30
-
- var/S_name = chosen_dna.speciesName
- var/datum/species/S_dat = all_species[S_name]
- var/changeTime = 2 SECONDS
- if(mob_size != S_dat.mob_size)
- src.visible_message("[src]'s body begins to twist, their mass changing rapidly!")
- changeTime = 8 SECONDS
- else
- src.visible_message("[src]'s body begins to twist, changing rapidly!")
-
- if(!do_after(src, changeTime))
- to_chat(src, "You fail to change shape.")
- return
- handle_changeling_transform(chosen_dna)
-
- src.verbs -= /mob/proc/changeling_transform
- spawn(10)
- src.verbs += /mob/proc/changeling_transform
-
- changeling_update_languages(changeling.absorbed_languages)
-
- feedback_add_details("changeling_powers","TR")
- return 1
-
-/mob/proc/handle_changeling_transform(var/datum/absorbed_dna/chosen_dna)
- src.visible_message("[src] transforms!")
-
- src.dna = chosen_dna.dna
- src.real_name = chosen_dna.name
- src.flavor_text = ""
-
- if(ishuman(src))
- var/mob/living/carbon/human/H = src
- var/newSpecies = chosen_dna.speciesName
- H.set_species(newSpecies,1)
- H.b_type = chosen_dna.dna.b_type
- H.sync_organ_dna()
-
- domutcheck(src, null)
- src.UpdateAppearance()
-
-
-//Transform into a monkey.
-/mob/proc/changeling_lesser_form()
- set category = "Changeling"
- set name = "Lesser Form (1)"
-
- var/datum/changeling/changeling = changeling_power(1,0,0)
- if(!changeling) return
-
- if(src.has_brain_worms())
- to_chat(src, "We cannot perform this ability at the present time!")
- return
-
- var/mob/living/carbon/human/H = src
-
- if(!istype(H) || !H.species.primitive_form)
- to_chat(src, "We cannot perform this ability in this form!")
- return
-
- changeling.chem_charges--
- H.visible_message("[H] transforms!")
- changeling.geneticdamage = 30
- to_chat(H, "Our genes cry out!")
- H = H.monkeyize()
- feedback_add_details("changeling_powers","LF")
- return 1
-
-//Transform into a human
-/mob/proc/changeling_lesser_transform()
- set category = "Changeling"
- set name = "Transform (1)"
-
- var/datum/changeling/changeling = changeling_power(1,1,0)
- if(!changeling) return
-
- var/list/names = list()
- for(var/datum/dna/DNA in changeling.absorbed_dna)
- names += "[DNA.real_name]"
-
- var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
- if(!S) return
-
- var/datum/dna/chosen_dna = changeling.GetDNA(S)
- if(!chosen_dna)
- return
-
- var/mob/living/carbon/human/C = src
-
- changeling.chem_charges--
- C.remove_changeling_powers()
- C.visible_message("[C] transforms!")
- C.dna = chosen_dna.Clone()
-
- var/list/implants = list()
- for (var/obj/item/weapon/implant/I in C) //Still preserving implants
- implants += I
-
- C.transforming = 1
- C.canmove = 0
- C.icon = null
- C.overlays.Cut()
- C.set_invisibility(101)
- var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc )
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
- flick("monkey2h", animation)
- sleep(48)
- qdel(animation)
-
- for(var/obj/item/W in src)
- C.drop_from_inventory(W)
-
- var/mob/living/carbon/human/O = new /mob/living/carbon/human( src )
- if (C.dna.GetUIState(DNA_UI_GENDER))
- O.gender = FEMALE
- else
- O.gender = MALE
- O.dna = C.dna.Clone()
- C.dna = null
- O.real_name = chosen_dna.real_name
-
- for(var/obj/T in C)
- qdel(T)
-
- O.loc = C.loc
-
- O.UpdateAppearance()
- domutcheck(O, null)
- O.setToxLoss(C.getToxLoss())
- O.adjustBruteLoss(C.getBruteLoss())
- O.setOxyLoss(C.getOxyLoss())
- O.adjustFireLoss(C.getFireLoss())
- O.set_stat(C.stat)
- for (var/obj/item/weapon/implant/I in implants)
- I.forceMove(O)
- I.implanted = O
-
- C.mind.transfer_to(O)
- O.make_changeling()
- O.changeling_update_languages(changeling.absorbed_languages)
-
- feedback_add_details("changeling_powers","LFT")
- qdel(C)
- return 1
-
-
-//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
-/mob/proc/changeling_fakedeath()
- set category = "Changeling"
- set name = "Regenerative Stasis (20)"
-
- var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
- if(!changeling) return
-
- var/mob/living/carbon/C = src
- if(!C.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death
- return
- to_chat(C, "We will attempt to regenerate our form.")
- C.status_flags |= FAKEDEATH //play dead
- C.update_canmove()
- C.remove_changeling_powers()
-
- C.emote("gasp")
-
- spawn(rand(800,2000))
- if(changeling_power(20,1,100,DEAD))
- // charge the changeling chemical cost for stasis
- changeling.chem_charges -= 20
-
- to_chat(C, "We are ready to rise. Use the Revive verb when you are ready.")
- C.verbs += /mob/proc/changeling_revive
-
- feedback_add_details("changeling_powers","FD")
- return 1
-
-/mob/proc/changeling_revive()
- set category = "Changeling"
- set name = "Revive"
-
- var/mob/living/carbon/C = src
- // restore us to health
- C.revive()
- // remove our fake death flag
- C.status_flags &= ~(FAKEDEATH)
- // let us move again
- C.update_canmove()
- // re-add out changeling powers
- C.make_changeling()
- // sending display messages
- to_chat(C, "We have regenerated.")
- C.verbs -= /mob/proc/changeling_revive
-
-
-//Boosts the range of your next sting attack by 1
-/mob/proc/changeling_boost_range()
- set category = "Changeling"
- set name = "Ranged Sting (10)"
- set desc="Your next sting ability can be used against targets 2 squares away."
-
- var/datum/changeling/changeling = changeling_power(10,0,100)
- if(!changeling) return 0
- changeling.chem_charges -= 10
- to_chat(src, "Your throat adjusts to launch the sting.")
- changeling.sting_range = 2
- src.verbs -= /mob/proc/changeling_boost_range
- spawn(5) src.verbs += /mob/proc/changeling_boost_range
- feedback_add_details("changeling_powers","RS")
- return 1
-
-
-//Recover from stuns.
-/mob/proc/changeling_unstun()
- set category = "Changeling"
- set name = "Epinephrine Sacs (45)"
- set desc = "Removes all stuns"
-
- var/datum/changeling/changeling = changeling_power(45,0,100,UNCONSCIOUS)
- if(!changeling) return 0
- changeling.chem_charges -= 45
-
- var/mob/living/carbon/human/C = src
- C.set_stat(CONSCIOUS)
- C.SetParalysis(0)
- C.SetStunned(0)
- C.SetWeakened(0)
- C.lying = 0
- C.update_canmove()
-
- src.verbs -= /mob/proc/changeling_unstun
- spawn(5) src.verbs += /mob/proc/changeling_unstun
- feedback_add_details("changeling_powers","UNS")
- return 1
-
-
-//Speeds up chemical regeneration
-/mob/proc/changeling_fastchemical()
- src.mind.changeling.chem_recharge_rate *= 2
- return 1
-
-//Increases macimum chemical storage
-/mob/proc/changeling_engorgedglands()
- src.mind.changeling.chem_storage += 25
- return 1
-
-
-//Prevents AIs tracking you but makes you easily detectable to the human-eye.
-/mob/proc/changeling_digitalcamo()
- set category = "Changeling"
- set name = "Toggle Digital Camoflague"
- set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active."
-
- var/datum/changeling/changeling = changeling_power()
- if(!changeling) return 0
-
- var/mob/living/carbon/human/C = src
- if(C.digitalcamo) to_chat(C, "We return to normal.")
- else to_chat(C, "We distort our form to prevent AI-tracking.")
- C.digitalcamo = !C.digitalcamo
-
- spawn(0)
- while(C && C.digitalcamo && C.mind && C.mind.changeling)
- C.mind.changeling.chem_charges = max(C.mind.changeling.chem_charges - 1, 0)
- sleep(40)
-
- src.verbs -= /mob/proc/changeling_digitalcamo
- spawn(5) src.verbs += /mob/proc/changeling_digitalcamo
- feedback_add_details("changeling_powers","CAM")
- return 1
-
-
-//Starts healing you every second for 10 seconds. Can be used whilst unconscious.
-/mob/proc/changeling_rapidregen()
- set category = "Changeling"
- set name = "Rapid Regeneration (30)"
- set desc = "Begins rapidly regenerating. Does not effect stuns or chemicals."
-
- var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
- if(!changeling) return 0
- src.mind.changeling.chem_charges -= 30
-
- var/mob/living/carbon/human/C = src
- spawn(0)
- for(var/i = 0, i<10,i++)
- if(C)
- C.adjustBruteLoss(-10)
- C.adjustToxLoss(-10)
- C.adjustOxyLoss(-10)
- C.adjustFireLoss(-10)
- sleep(10)
-
- src.verbs -= /mob/proc/changeling_rapidregen
- spawn(5) src.verbs += /mob/proc/changeling_rapidregen
- feedback_add_details("changeling_powers","RR")
- return 1
-
-// HIVE MIND UPLOAD/DOWNLOAD DNA
-
-var/list/datum/absorbed_dna/hivemind_bank = list()
-
-/mob/proc/changeling_hiveupload()
- set category = "Changeling"
- set name = "Hive Channel (10)"
- set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
-
- var/datum/changeling/changeling = changeling_power(10,1)
- if(!changeling) return
-
- var/list/names = list()
- for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
- var/valid = 1
- for(var/datum/absorbed_dna/DNB in hivemind_bank)
- if(DNA.name == DNB.name)
- valid = 0
- break
- if(valid)
- names += DNA.name
-
- if(names.len <= 0)
- to_chat(src, "The airwaves already have all of our DNA.")
- return
-
- var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
- if(!S) return
-
- var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S)
- if(!chosen_dna)
- return
-
- changeling.chem_charges -= 10
- hivemind_bank += chosen_dna
- to_chat(src, "We channel the DNA of [S] to the air.")
- feedback_add_details("changeling_powers","HU")
- return 1
-
-/mob/proc/changeling_hivedownload()
- set category = "Changeling"
- set name = "Hive Absorb (20)"
- set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
-
- var/datum/changeling/changeling = changeling_power(20,1)
- if(!changeling) return
-
- var/list/names = list()
- for(var/datum/absorbed_dna/DNA in hivemind_bank)
- if(!(changeling.GetDNA(DNA.name)))
- names[DNA.name] = DNA
-
- if(names.len <= 0)
- to_chat(src, "There's no new DNA to absorb from the air.")
- return
-
- var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
- if(!S) return
- var/datum/dna/chosen_dna = names[S]
- if(!chosen_dna)
- return
-
- changeling.chem_charges -= 20
- absorbDNA(chosen_dna)
- to_chat(src, "We absorb the DNA of [S] from the air.")
- feedback_add_details("changeling_powers","HD")
- return 1
-
-// Fake Voice
-
-/mob/proc/changeling_mimicvoice()
- set category = "Changeling"
- set name = "Mimic Voice"
- set desc = "Shape our vocal glands to form a voice of someone we choose. We cannot regenerate chemicals when mimicing."
-
-
- var/datum/changeling/changeling = changeling_power()
- if(!changeling) return
-
- if(changeling.mimicing)
- changeling.mimicing = ""
- to_chat(src, "We return our vocal glands to their original location.")
- return
-
- var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
- if(!mimic_voice)
- return
-
- changeling.mimicing = mimic_voice
-
- to_chat(src, "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active.")
- to_chat(src, "Use this power again to return to our original voice and reproduce chemicals again.")
- feedback_add_details("changeling_powers","MV")
-
- spawn(0)
- while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
- src.mind.changeling.chem_charges = max(src.mind.changeling.chem_charges - 1, 0)
- sleep(40)
- if(src && src.mind && src.mind.changeling)
- src.mind.changeling.mimicing = ""
- //////////
- //STINGS// //They get a pretty header because there's just so fucking many of them ;_;
- //////////
-
-/mob/proc/sting_can_reach(mob/M as mob, sting_range = 1)
- if(M.loc == src.loc)
- return 1 //target and source are in the same thing
- if(!isturf(src.loc) || !isturf(M.loc))
- to_chat(src, "We cannot reach \the [M] with a sting!")
- return 0 //One is inside, the other is outside something.
- // Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
- if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
- to_chat(src, "We cannot find a path to sting \the [M] by!")
- return 0
- return 1
-
-//Handles the general sting code to reduce on copypasta (seeming as somebody decided to make SO MANY dumb abilities)
-/mob/proc/changeling_sting(var/required_chems=0, var/verb_path, var/loud)
- var/datum/changeling/changeling = changeling_power(required_chems)
- if(!changeling) return
-
- var/list/victims = list()
- for(var/mob/living/carbon/human/C in oview(changeling.sting_range))
- victims += C
- var/mob/living/carbon/human/T = input(src, "Who will we sting?") as null|anything in victims
-
- if(!T) return
- if(!(T in view(changeling.sting_range))) return
- if(!sting_can_reach(T, changeling.sting_range)) return
- if(!changeling_power(required_chems)) return
- if(T.isSynthetic())
- to_chat(src, "[T] is not compatible with our biology.")
- return
-
- changeling.chem_charges -= required_chems
- changeling.sting_range = 1
- src.verbs -= verb_path
- spawn(10) src.verbs += verb_path
- if(!loud)
- to_chat(src, "We stealthily sting [T].")
- else
- visible_message("[src] fires an organic shard into [T]'s chest, puncturing the stinger into their skin!")
- if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
- to_chat(T, "You feel a tiny prick.")
- return
-
-
-/mob/proc/changeling_lsdsting()
- set category = "Changeling"
- set name = "Hallucination Sting (15)"
- set desc = "Causes terror in the target."
-
- var/mob/living/carbon/human/T = changeling_sting(15,/mob/proc/changeling_lsdsting)
- if(!T) return 0
- spawn(rand(300,600))
- if(T) T.hallucination(400, 80)
- feedback_add_details("changeling_powers","HS")
- return 1
-
-/mob/proc/changeling_silence_sting()
- set category = "Changeling"
- set name = "Silence sting (10)"
- set desc="Sting target"
-
- var/mob/living/carbon/human/T = changeling_sting(10,/mob/proc/changeling_silence_sting)
- if(!T) return 0
- T.silent += 30
- feedback_add_details("changeling_powers","SS")
- return 1
-
-/mob/proc/changeling_blind_sting()
- set category = "Changeling"
- set name = "Blind sting (20)"
- set desc="Sting target"
-
- var/mob/living/carbon/human/T = changeling_sting(20,/mob/proc/changeling_blind_sting)
- if(!T) return 0
- to_chat(T, "Your eyes burn horrificly!")
- T.disabilities |= NEARSIGHTED
- spawn(300) T.disabilities &= ~NEARSIGHTED
- T.eye_blind = 10
- T.eye_blurry = 20
- feedback_add_details("changeling_powers","BS")
- return 1
-
-/mob/proc/changeling_deaf_sting()
- set category = "Changeling"
- set name = "Deaf sting (5)"
- set desc="Sting target:"
-
- var/mob/living/carbon/human/T = changeling_sting(5,/mob/proc/changeling_deaf_sting)
- if(!T) return 0
- to_chat(T, "Your ears pop and begin ringing loudly!")
- T.sdisabilities |= DEAF
- spawn(300) T.sdisabilities &= ~DEAF
- feedback_add_details("changeling_powers","DS")
- return 1
-
-/mob/proc/changeling_DEATHsting()
- set category = "Changeling"
- set name = "Death Sting (40)"
- set desc = "Causes spasms onto death."
- var/loud = 1
-
- var/mob/living/carbon/human/T = changeling_sting(40,/mob/proc/changeling_DEATHsting,loud)
- if(!T) return 0
- to_chat(T, "You feel a small prick and your chest becomes tight.")
- T.make_jittery(400)
- if(T.reagents) T.reagents.add_reagent(/datum/reagent/lexorin, 40)
- feedback_add_details("changeling_powers","DTHS")
- return 1
-
-/mob/proc/changeling_extract_dna_sting()
- set category = "Changeling"
- set name = "Extract DNA Sting (40)"
- set desc="Stealthily sting a target to extract their DNA."
-
- var/datum/changeling/changeling = null
- if(src.mind && src.mind.changeling)
- changeling = src.mind.changeling
- if(!changeling)
- return 0
-
- var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
- if(!T) return 0
- if((HUSK in T.mutations) || (T.species.flags & NO_SCAN))
- to_chat(src, "We cannot extract DNA from this creature!")
- return 0
-
- var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages)
- absorbDNA(newDNA)
-
- feedback_add_details("changeling_powers","ED")
- return 1
+var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")
+
+/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
+ var/list/datum/absorbed_dna/absorbed_dna = list()
+ var/list/absorbed_languages = list()
+ var/absorbedcount = 0
+ var/chem_charges = 20
+ var/chem_recharge_rate = 0.5
+ var/chem_storage = 50
+ var/sting_range = 1
+ var/changelingID = "Changeling"
+ var/geneticdamage = 0
+ var/isabsorbing = 0
+ var/geneticpoints = 25
+ var/purchasedpowers = list()
+ var/mimicing = ""
+ var/cloaked = 0
+ var/armor_deployed = 0 //This is only used for changeling_generic_equip_all_slots() at the moment.
+ var/recursive_enhancement = 0 //Used to power up other abilities from the ling power with the same name.
+ var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too.
+ var/last_shriek = null // world.time when the ling last used a shriek.
+ var/next_escape = 0 // world.time when the ling can next use Escape Restraints
+
+
+/datum/changeling/New()
+ ..()
+ if(possible_changeling_IDs.len)
+ changelingID = pick(possible_changeling_IDs)
+ possible_changeling_IDs -= changelingID
+ changelingID = "[changelingID]"
+ else
+ changelingID = "[rand(1,999)]"
+
+/datum/changeling/proc/regenerate()
+ chem_charges = min(max(0, chem_charges+chem_recharge_rate), chem_storage)
+ geneticdamage = max(0, geneticdamage-1)
+
+/datum/changeling/proc/GetDNA(var/dna_owner)
+ for(var/datum/absorbed_dna/DNA in absorbed_dna)
+ if(dna_owner == DNA.name)
+ return DNA
+
+/mob/proc/absorbDNA(var/datum/absorbed_dna/newDNA)
+ var/datum/changeling/changeling = null
+ if(src.mind && src.mind.changeling)
+ changeling = src.mind.changeling
+ if(!changeling)
+ return
+
+ for(var/language in newDNA.languages)
+ changeling.absorbed_languages |= language
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ if(!changeling.GetDNA(newDNA.name)) // Don't duplicate - I wonder if it's possible for it to still be a different DNA? DNA code could use a rewrite
+ changeling.absorbed_dna += newDNA
+
+//Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human
+/mob/proc/make_changeling()
+
+ if(!mind) return
+ if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
+
+ verbs += /datum/changeling/proc/EvolutionMenu
+ add_language("Changeling")
+
+ var/lesser_form = !ishuman(src)
+
+ if(!powerinstances.len)
+ for(var/P in powers)
+ powerinstances += new P()
+
+ // Code to auto-purchase free powers.
+ for(var/datum/power/changeling/P in powerinstances)
+ if(!P.genomecost) // Is it free?
+ if(!(P in mind.changeling.purchasedpowers)) // Do we not have it already?
+ mind.changeling.purchasePower(mind, P.name, 0)// Purchase it. Don't remake our verbs, we're doing it after this.
+
+ for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
+ if(P.isVerb)
+ if(lesser_form && !P.allowduringlesserform) continue
+ if(!(P in src.verbs))
+ src.verbs += P.verbpath
+
+ for(var/language in languages)
+ mind.changeling.absorbed_languages |= language
+
+ var/mob/living/carbon/human/H = src
+ if(istype(H))
+ var/datum/absorbed_dna/newDNA = new(H.real_name, H.dna, H.species.name, H.languages)
+ absorbDNA(newDNA)
+
+ return 1
+
+//removes our changeling verbs
+/mob/proc/remove_changeling_powers()
+ if(!mind || !mind.changeling) return
+ for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
+ if(P.isVerb)
+ verbs -= P.verbpath
+
+
+//Helper proc. Does all the checks and stuff for us to avoid copypasta
+/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0)
+
+ if(!src.mind) return
+ if(!iscarbon(src)) return
+
+ var/datum/changeling/changeling = src.mind.changeling
+ if(!changeling)
+ world.log << "[src] has the changeling_transform() verb but is not a changeling."
+ return
+
+ if(src.stat > max_stat)
+ to_chat(src, "We are incapacitated.")
+ return
+
+ if(changeling.absorbed_dna.len < required_dna)
+ to_chat(src, "We require at least [required_dna] samples of compatible DNA.")
+ return
+
+ if(changeling.chem_charges < required_chems)
+ to_chat(src, "We require at least [required_chems] units of chemicals to do that!")
+ return
+
+ if(changeling.geneticdamage > max_genetic_damage)
+ to_chat(src, "Our genomes are still reassembling. We need time to recover first.")
+ return
+
+ return changeling
+
+
+//Used to dump the languages from the changeling datum into the actual mob.
+/mob/proc/changeling_update_languages(var/updated_languages)
+
+ languages = list()
+ for(var/language in updated_languages)
+ languages += language
+
+ //This isn't strictly necessary but just to be safe...
+ add_language("Changeling")
+
+ return
+
+//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
+//Doesn't cost anything as it's the most basic ability.
+/mob/proc/changeling_absorb_dna()
+ set category = "Changeling"
+ set name = "Absorb DNA"
+
+ var/datum/changeling/changeling = changeling_power(0,0,100)
+ if(!changeling) return
+
+ var/obj/item/grab/G = src.get_active_hand()
+ if(!istype(G))
+ to_chat(src, "We must be grabbing a creature in our active hand to absorb them.")
+ return
+
+ var/mob/living/carbon/human/T = G.affecting
+ if(!istype(T))
+ to_chat(src, "[T] is not compatible with our biology.")
+ return
+
+ if(T.species.flags & NO_SCAN)
+ to_chat(src, "We cannot extract DNA from this creature!")
+ return
+
+ if(HUSK in T.mutations)
+ to_chat(src, "This creature's DNA is ruined beyond useability!")
+ return
+
+ if(!G.can_absorb())
+ to_chat(src, "We must have a tighter grip to absorb this creature.")
+ return
+
+ if(changeling.isabsorbing)
+ to_chat(src, "We are already absorbing!")
+ return
+
+ var/obj/item/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
+ if(!affecting)
+ to_chat(src, "They are missing that body part!")
+
+ changeling.isabsorbing = 1
+ for(var/stage = 1, stage<=3, stage++)
+ switch(stage)
+ if(1)
+ to_chat(src, "This creature is compatible. We must hold still...")
+ if(2)
+ to_chat(src, "We extend a proboscis.")
+ src.visible_message("[src] extends a proboscis!")
+ if(3)
+ to_chat(src, "We stab [T] with the proboscis.")
+ src.visible_message("[src] stabs [T] with the proboscis!")
+ to_chat(T, "You feel a sharp stabbing pain!")
+ affecting.take_damage(39, 0, DAM_SHARP, "large organic needle")
+
+ feedback_add_details("changeling_powers","A[stage]")
+ if(!do_mob(src, T, 150))
+ to_chat(src, "Our absorption of [T] has been interrupted!")
+ changeling.isabsorbing = 0
+ return
+
+ to_chat(src, "We have absorbed [T]!")
+ src.visible_message("[src] sucks the fluids from [T]!")
+ to_chat(T, "You have been absorbed by the changeling!")
+ changeling.chem_charges += 10
+ changeling.geneticpoints += 2
+
+ //Steal all of their languages!
+ for(var/language in T.languages)
+ if(!(language in changeling.absorbed_languages))
+ changeling.absorbed_languages += language
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages)
+ absorbDNA(newDNA)
+ if(mind && T.mind)
+ mind.store_memory("[T.real_name]'s memories:")
+ mind.store_memory(T.mind.memory)
+ mind.store_memory("
")
+
+ if(T.mind && T.mind.changeling)
+ if(T.mind.changeling.absorbed_dna)
+ for(var/datum/absorbed_dna/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
+ if(changeling.GetDNA(dna_data.name))
+ continue
+ absorbDNA(dna_data)
+ changeling.absorbedcount++
+ T.mind.changeling.absorbed_dna.len = 1
+
+ if(T.mind.changeling.purchasedpowers)
+ for(var/datum/power/changeling/Tp in T.mind.changeling.purchasedpowers)
+ if(Tp in changeling.purchasedpowers)
+ continue
+ else
+ changeling.purchasedpowers += Tp
+
+ if(!Tp.isVerb)
+ call(Tp.verbpath)()
+ else
+ src.make_changeling()
+
+ changeling.chem_charges += T.mind.changeling.chem_charges
+ changeling.geneticpoints += T.mind.changeling.geneticpoints
+ T.mind.changeling.chem_charges = 0
+ T.mind.changeling.geneticpoints = 0
+ T.mind.changeling.absorbedcount = 0
+
+ changeling.absorbedcount++
+ changeling.isabsorbing = 0
+
+ T.death(0)
+ T.Drain()
+ return 1
+
+
+//Change our DNA to that of somebody we've absorbed.
+/mob/proc/changeling_transform()
+ set category = "Changeling"
+ set name = "Transform (5)"
+
+ var/datum/changeling/changeling = changeling_power(5,1,0)
+ if(!changeling) return
+
+ var/list/names = list()
+ for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
+ names += "[DNA.name]"
+
+ var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
+ if(!S) return
+
+ var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S)
+ if(!chosen_dna)
+ return
+
+ changeling.chem_charges -= 5
+ changeling.geneticdamage = 30
+
+ var/S_name = chosen_dna.speciesName
+ var/datum/species/S_dat = all_species[S_name]
+ var/changeTime = 2 SECONDS
+ if(mob_size != S_dat.mob_size)
+ src.visible_message("[src]'s body begins to twist, their mass changing rapidly!")
+ changeTime = 8 SECONDS
+ else
+ src.visible_message("[src]'s body begins to twist, changing rapidly!")
+
+ if(!do_after(src, changeTime))
+ to_chat(src, "You fail to change shape.")
+ return
+ handle_changeling_transform(chosen_dna)
+
+ src.verbs -= /mob/proc/changeling_transform
+ spawn(10)
+ src.verbs += /mob/proc/changeling_transform
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ feedback_add_details("changeling_powers","TR")
+ return 1
+
+/mob/proc/handle_changeling_transform(var/datum/absorbed_dna/chosen_dna)
+ src.visible_message("[src] transforms!")
+
+ src.dna = chosen_dna.dna
+ src.real_name = chosen_dna.name
+ src.flavor_text = ""
+
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ var/newSpecies = chosen_dna.speciesName
+ H.set_species(newSpecies,1)
+ H.b_type = chosen_dna.dna.b_type
+ H.sync_organ_dna()
+
+ domutcheck(src, null)
+ src.UpdateAppearance()
+
+
+//Transform into a monkey.
+/mob/proc/changeling_lesser_form()
+ set category = "Changeling"
+ set name = "Lesser Form (1)"
+
+ var/datum/changeling/changeling = changeling_power(1,0,0)
+ if(!changeling) return
+
+ if(src.has_brain_worms())
+ to_chat(src, "We cannot perform this ability at the present time!")
+ return
+
+ var/mob/living/carbon/human/H = src
+
+ if(!istype(H) || !H.species.primitive_form)
+ to_chat(src, "We cannot perform this ability in this form!")
+ return
+
+ changeling.chem_charges--
+ H.visible_message("[H] transforms!")
+ changeling.geneticdamage = 30
+ to_chat(H, "Our genes cry out!")
+ H = H.monkeyize()
+ feedback_add_details("changeling_powers","LF")
+ return 1
+
+//Transform into a human
+/mob/proc/changeling_lesser_transform()
+ set category = "Changeling"
+ set name = "Transform (1)"
+
+ var/datum/changeling/changeling = changeling_power(1,1,0)
+ if(!changeling) return
+
+ var/list/names = list()
+ for(var/datum/dna/DNA in changeling.absorbed_dna)
+ names += "[DNA.real_name]"
+
+ var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
+ if(!S) return
+
+ var/datum/dna/chosen_dna = changeling.GetDNA(S)
+ if(!chosen_dna)
+ return
+
+ var/mob/living/carbon/human/C = src
+
+ changeling.chem_charges--
+ C.remove_changeling_powers()
+ C.visible_message("[C] transforms!")
+ C.dna = chosen_dna.Clone()
+
+ var/list/implants = list()
+ for (var/obj/item/weapon/implant/I in C) //Still preserving implants
+ implants += I
+
+ C.transforming = 1
+ C.canmove = 0
+ C.icon = null
+ C.overlays.Cut()
+ C.set_invisibility(101)
+ var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc )
+ animation.icon_state = "blank"
+ animation.icon = 'icons/mob/mob.dmi'
+ animation.master = src
+ flick("monkey2h", animation)
+ sleep(48)
+ qdel(animation)
+
+ for(var/obj/item/W in src)
+ C.drop_from_inventory(W)
+
+ var/mob/living/carbon/human/O = new /mob/living/carbon/human( src )
+ if (C.dna.GetUIState(DNA_UI_GENDER))
+ O.gender = FEMALE
+ else
+ O.gender = MALE
+ O.dna = C.dna.Clone()
+ C.dna = null
+ O.real_name = chosen_dna.real_name
+
+ for(var/obj/T in C)
+ qdel(T)
+
+ O.loc = C.loc
+
+ O.UpdateAppearance()
+ domutcheck(O, null)
+ O.setToxLoss(C.getToxLoss())
+ O.adjustBruteLoss(C.getBruteLoss())
+ O.setOxyLoss(C.getOxyLoss())
+ O.adjustFireLoss(C.getFireLoss())
+ O.set_stat(C.stat)
+ for (var/obj/item/weapon/implant/I in implants)
+ I.forceMove(O)
+ I.implanted = O
+
+ C.mind.transfer_to(O)
+ O.make_changeling()
+ O.changeling_update_languages(changeling.absorbed_languages)
+
+ feedback_add_details("changeling_powers","LFT")
+ qdel(C)
+ return 1
+
+
+//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
+/mob/proc/changeling_fakedeath()
+ set category = "Changeling"
+ set name = "Regenerative Stasis (20)"
+
+ var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
+ if(!changeling) return
+
+ var/mob/living/carbon/C = src
+ if(!C.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death
+ return
+ to_chat(C, "We will attempt to regenerate our form.")
+ C.status_flags |= FAKEDEATH //play dead
+ C.update_canmove()
+ C.remove_changeling_powers()
+
+ C.emote("gasp")
+
+ spawn(rand(800,2000))
+ if(changeling_power(20,1,100,DEAD))
+ // charge the changeling chemical cost for stasis
+ changeling.chem_charges -= 20
+
+ to_chat(C, "We are ready to rise. Use the Revive verb when you are ready.")
+ C.verbs += /mob/proc/changeling_revive
+
+ feedback_add_details("changeling_powers","FD")
+ return 1
+
+/mob/proc/changeling_revive()
+ set category = "Changeling"
+ set name = "Revive"
+
+ var/mob/living/carbon/C = src
+ // restore us to health
+ C.revive()
+ // remove our fake death flag
+ C.status_flags &= ~(FAKEDEATH)
+ // let us move again
+ C.update_canmove()
+ // re-add out changeling powers
+ C.make_changeling()
+ // sending display messages
+ to_chat(C, "We have regenerated.")
+ C.verbs -= /mob/proc/changeling_revive
+
+
+//Boosts the range of your next sting attack by 1
+/mob/proc/changeling_boost_range()
+ set category = "Changeling"
+ set name = "Ranged Sting (10)"
+ set desc="Your next sting ability can be used against targets 2 squares away."
+
+ var/datum/changeling/changeling = changeling_power(10,0,100)
+ if(!changeling) return 0
+ changeling.chem_charges -= 10
+ to_chat(src, "Your throat adjusts to launch the sting.")
+ changeling.sting_range = 2
+ src.verbs -= /mob/proc/changeling_boost_range
+ spawn(5) src.verbs += /mob/proc/changeling_boost_range
+ feedback_add_details("changeling_powers","RS")
+ return 1
+
+
+//Recover from stuns.
+/mob/proc/changeling_unstun()
+ set category = "Changeling"
+ set name = "Epinephrine Sacs (45)"
+ set desc = "Removes all stuns"
+
+ var/datum/changeling/changeling = changeling_power(45,0,100,UNCONSCIOUS)
+ if(!changeling) return 0
+ changeling.chem_charges -= 45
+
+ var/mob/living/carbon/human/C = src
+ C.set_stat(CONSCIOUS)
+ C.SetParalysis(0)
+ C.SetStunned(0)
+ C.SetWeakened(0)
+ C.lying = 0
+ C.update_canmove()
+
+ src.verbs -= /mob/proc/changeling_unstun
+ spawn(5) src.verbs += /mob/proc/changeling_unstun
+ feedback_add_details("changeling_powers","UNS")
+ return 1
+
+
+//Speeds up chemical regeneration
+/mob/proc/changeling_fastchemical()
+ src.mind.changeling.chem_recharge_rate *= 2
+ return 1
+
+//Increases macimum chemical storage
+/mob/proc/changeling_engorgedglands()
+ src.mind.changeling.chem_storage += 25
+ return 1
+
+
+//Prevents AIs tracking you but makes you easily detectable to the human-eye.
+/mob/proc/changeling_digitalcamo()
+ set category = "Changeling"
+ set name = "Toggle Digital Camoflague"
+ set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active."
+
+ var/datum/changeling/changeling = changeling_power()
+ if(!changeling) return 0
+
+ var/mob/living/carbon/human/C = src
+ if(C.digitalcamo) to_chat(C, "We return to normal.")
+ else to_chat(C, "We distort our form to prevent AI-tracking.")
+ C.digitalcamo = !C.digitalcamo
+
+ spawn(0)
+ while(C && C.digitalcamo && C.mind && C.mind.changeling)
+ C.mind.changeling.chem_charges = max(C.mind.changeling.chem_charges - 1, 0)
+ sleep(40)
+
+ src.verbs -= /mob/proc/changeling_digitalcamo
+ spawn(5) src.verbs += /mob/proc/changeling_digitalcamo
+ feedback_add_details("changeling_powers","CAM")
+ return 1
+
+
+//Starts healing you every second for 10 seconds. Can be used whilst unconscious.
+/mob/proc/changeling_rapidregen()
+ set category = "Changeling"
+ set name = "Rapid Regeneration (30)"
+ set desc = "Begins rapidly regenerating. Does not effect stuns or chemicals."
+
+ var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
+ if(!changeling) return 0
+ src.mind.changeling.chem_charges -= 30
+
+ var/mob/living/carbon/human/C = src
+ spawn(0)
+ for(var/i = 0, i<10,i++)
+ if(C)
+ C.adjustBruteLoss(-10)
+ C.adjustToxLoss(-10)
+ C.adjustOxyLoss(-10)
+ C.adjustFireLoss(-10)
+ sleep(10)
+
+ src.verbs -= /mob/proc/changeling_rapidregen
+ spawn(5) src.verbs += /mob/proc/changeling_rapidregen
+ feedback_add_details("changeling_powers","RR")
+ return 1
+
+// HIVE MIND UPLOAD/DOWNLOAD DNA
+
+var/list/datum/absorbed_dna/hivemind_bank = list()
+
+/mob/proc/changeling_hiveupload()
+ set category = "Changeling"
+ set name = "Hive Channel (10)"
+ set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
+
+ var/datum/changeling/changeling = changeling_power(10,1)
+ if(!changeling) return
+
+ var/list/names = list()
+ for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
+ var/valid = 1
+ for(var/datum/absorbed_dna/DNB in hivemind_bank)
+ if(DNA.name == DNB.name)
+ valid = 0
+ break
+ if(valid)
+ names += DNA.name
+
+ if(names.len <= 0)
+ to_chat(src, "The airwaves already have all of our DNA.")
+ return
+
+ var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
+ if(!S) return
+
+ var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S)
+ if(!chosen_dna)
+ return
+
+ changeling.chem_charges -= 10
+ hivemind_bank += chosen_dna
+ to_chat(src, "We channel the DNA of [S] to the air.")
+ feedback_add_details("changeling_powers","HU")
+ return 1
+
+/mob/proc/changeling_hivedownload()
+ set category = "Changeling"
+ set name = "Hive Absorb (20)"
+ set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
+
+ var/datum/changeling/changeling = changeling_power(20,1)
+ if(!changeling) return
+
+ var/list/names = list()
+ for(var/datum/absorbed_dna/DNA in hivemind_bank)
+ if(!(changeling.GetDNA(DNA.name)))
+ names[DNA.name] = DNA
+
+ if(names.len <= 0)
+ to_chat(src, "There's no new DNA to absorb from the air.")
+ return
+
+ var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
+ if(!S) return
+ var/datum/dna/chosen_dna = names[S]
+ if(!chosen_dna)
+ return
+
+ changeling.chem_charges -= 20
+ absorbDNA(chosen_dna)
+ to_chat(src, "We absorb the DNA of [S] from the air.")
+ feedback_add_details("changeling_powers","HD")
+ return 1
+
+// Fake Voice
+
+/mob/proc/changeling_mimicvoice()
+ set category = "Changeling"
+ set name = "Mimic Voice"
+ set desc = "Shape our vocal glands to form a voice of someone we choose. We cannot regenerate chemicals when mimicing."
+
+
+ var/datum/changeling/changeling = changeling_power()
+ if(!changeling) return
+
+ if(changeling.mimicing)
+ changeling.mimicing = ""
+ to_chat(src, "We return our vocal glands to their original location.")
+ return
+
+ var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
+ if(!mimic_voice)
+ return
+
+ changeling.mimicing = mimic_voice
+
+ to_chat(src, "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active.")
+ to_chat(src, "Use this power again to return to our original voice and reproduce chemicals again.")
+ feedback_add_details("changeling_powers","MV")
+
+ spawn(0)
+ while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
+ src.mind.changeling.chem_charges = max(src.mind.changeling.chem_charges - 1, 0)
+ sleep(40)
+ if(src && src.mind && src.mind.changeling)
+ src.mind.changeling.mimicing = ""
+ //////////
+ //STINGS// //They get a pretty header because there's just so fucking many of them ;_;
+ //////////
+
+/mob/proc/sting_can_reach(mob/M as mob, sting_range = 1)
+ if(M.loc == src.loc)
+ return 1 //target and source are in the same thing
+ if(!isturf(src.loc) || !isturf(M.loc))
+ to_chat(src, "We cannot reach \the [M] with a sting!")
+ return 0 //One is inside, the other is outside something.
+ // Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
+ if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
+ to_chat(src, "We cannot find a path to sting \the [M] by!")
+ return 0
+ return 1
+
+//Handles the general sting code to reduce on copypasta (seeming as somebody decided to make SO MANY dumb abilities)
+/mob/proc/changeling_sting(var/required_chems=0, var/verb_path, var/loud)
+ var/datum/changeling/changeling = changeling_power(required_chems)
+ if(!changeling) return
+
+ var/list/victims = list()
+ for(var/mob/living/carbon/human/C in oview(changeling.sting_range))
+ victims += C
+ var/mob/living/carbon/human/T = input(src, "Who will we sting?") as null|anything in victims
+
+ if(!T) return
+ if(!(T in view(changeling.sting_range))) return
+ if(!sting_can_reach(T, changeling.sting_range)) return
+ if(!changeling_power(required_chems)) return
+ if(T.isSynthetic())
+ to_chat(src, "[T] is not compatible with our biology.")
+ return
+
+ changeling.chem_charges -= required_chems
+ changeling.sting_range = 1
+ src.verbs -= verb_path
+ spawn(10) src.verbs += verb_path
+ if(!loud)
+ to_chat(src, "We stealthily sting [T].")
+ else
+ visible_message("[src] fires an organic shard into [T]'s chest, puncturing the stinger into their skin!")
+ if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
+ to_chat(T, "You feel a tiny prick.")
+ return
+
+
+/mob/proc/changeling_lsdsting()
+ set category = "Changeling"
+ set name = "Hallucination Sting (15)"
+ set desc = "Causes terror in the target."
+
+ var/mob/living/carbon/human/T = changeling_sting(15,/mob/proc/changeling_lsdsting)
+ if(!T) return 0
+ spawn(rand(300,600))
+ if(T) T.hallucination(400, 80)
+ feedback_add_details("changeling_powers","HS")
+ return 1
+
+/mob/proc/changeling_silence_sting()
+ set category = "Changeling"
+ set name = "Silence sting (10)"
+ set desc="Sting target"
+
+ var/mob/living/carbon/human/T = changeling_sting(10,/mob/proc/changeling_silence_sting)
+ if(!T) return 0
+ T.silent += 30
+ feedback_add_details("changeling_powers","SS")
+ return 1
+
+/mob/proc/changeling_blind_sting()
+ set category = "Changeling"
+ set name = "Blind sting (20)"
+ set desc="Sting target"
+
+ var/mob/living/carbon/human/T = changeling_sting(20,/mob/proc/changeling_blind_sting)
+ if(!T) return 0
+ to_chat(T, "Your eyes burn horrificly!")
+ T.disabilities |= NEARSIGHTED
+ spawn(300) T.disabilities &= ~NEARSIGHTED
+ T.eye_blind = 10
+ T.eye_blurry = 20
+ feedback_add_details("changeling_powers","BS")
+ return 1
+
+/mob/proc/changeling_deaf_sting()
+ set category = "Changeling"
+ set name = "Deaf sting (5)"
+ set desc="Sting target:"
+
+ var/mob/living/carbon/human/T = changeling_sting(5,/mob/proc/changeling_deaf_sting)
+ if(!T) return 0
+ to_chat(T, "Your ears pop and begin ringing loudly!")
+ T.sdisabilities |= DEAF
+ spawn(300) T.sdisabilities &= ~DEAF
+ feedback_add_details("changeling_powers","DS")
+ return 1
+
+/mob/proc/changeling_DEATHsting()
+ set category = "Changeling"
+ set name = "Death Sting (40)"
+ set desc = "Causes spasms onto death."
+ var/loud = 1
+
+ var/mob/living/carbon/human/T = changeling_sting(40,/mob/proc/changeling_DEATHsting,loud)
+ if(!T) return 0
+ to_chat(T, "You feel a small prick and your chest becomes tight.")
+ T.make_jittery(400)
+ if(T.reagents) T.reagents.add_reagent(/datum/reagent/lexorin, 40)
+ feedback_add_details("changeling_powers","DTHS")
+ return 1
+
+/mob/proc/changeling_extract_dna_sting()
+ set category = "Changeling"
+ set name = "Extract DNA Sting (40)"
+ set desc="Stealthily sting a target to extract their DNA."
+
+ var/datum/changeling/changeling = null
+ if(src.mind && src.mind.changeling)
+ changeling = src.mind.changeling
+ if(!changeling)
+ return 0
+
+ var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
+ if(!T) return 0
+ if((HUSK in T.mutations) || (T.species.flags & NO_SCAN))
+ to_chat(src, "We cannot extract DNA from this creature!")
+ return 0
+
+ var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages)
+ absorbDNA(newDNA)
+
+ feedback_add_details("changeling_powers","ED")
+ return 1
diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm
new file mode 100644
index 0000000..d4b4b2e
--- /dev/null
+++ b/code/game/gamemodes/changeling/generic_equip_procs.dm
@@ -0,0 +1,280 @@
+//This is a generic proc that should be called by other ling armor procs to equip them.
+/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type, var/boot_type, var/chem_cost)
+
+ if(!ishuman(src))
+ return 0
+
+ var/mob/living/carbon/human/M = src
+
+ if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type))
+ chem_cost = 0
+
+ var/datum/changeling/changeling = changeling_power(chem_cost, 1, 100, CONSCIOUS)
+
+ if(!changeling)
+ return
+
+ //First, check if we're already wearing the armor, and if so, take it off.
+ if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type))
+ M.visible_message("[M] casts off their [M.wear_suit.name]!",
+ "We cast off our [M.wear_suit.name]",
+ "You hear the organic matter ripping and tearing!")
+ if(istype(M.wear_suit, armor_type))
+ qdel(M.wear_suit)
+ if(istype(M.head, helmet_type))
+ qdel(M.head)
+ if(istype(M.shoes, boot_type))
+ qdel(M.shoes)
+ M.update_inv_wear_suit()
+ M.update_inv_head()
+ M.update_hair()
+ M.update_inv_shoes()
+ return 1
+
+ if(M.head || M.wear_suit) //Make sure our slots aren't full
+ src << "We require nothing to be on our head, and we cannot wear any external suits, or shoes."
+ return 0
+
+ var/obj/item/clothing/suit/A = new armor_type(src)
+ src.equip_to_slot_or_del(A, slot_wear_suit)
+
+ var/obj/item/clothing/suit/H = new helmet_type(src)
+ src.equip_to_slot_or_del(H, slot_head)
+
+ var/obj/item/clothing/shoes/B = new boot_type(src)
+ src.equip_to_slot_or_del(B, slot_shoes)
+
+ src.mind.changeling.chem_charges -= chem_cost
+ playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
+ M.update_inv_wear_suit()
+ M.update_inv_head()
+ M.update_hair()
+ M.update_inv_shoes()
+ return 1
+
+/mob/proc/changeling_generic_equip_all_slots(var/list/stuff_to_equip, var/cost)
+ var/datum/changeling/changeling = changeling_power(cost,1,100,CONSCIOUS)
+ if(!changeling)
+ return
+
+ if(!ishuman(src))
+ return 0
+
+ var/mob/living/carbon/human/M = src
+
+ var/success = 0
+
+ //First, check if we're already wearing the armor, and if so, take it off.
+
+ if(M.mind.changeling.armor_deployed)
+ if(M.head && stuff_to_equip["head"])
+ if(istype(M.head, stuff_to_equip["head"]))
+ qdel(M.head)
+ success = 1
+
+ if(M.wear_id && stuff_to_equip["wear_id"])
+ if(istype(M.wear_id, stuff_to_equip["wear_id"]))
+ qdel(M.wear_id)
+ success = 1
+
+ if(M.wear_suit && stuff_to_equip["wear_suit"])
+ if(istype(M.wear_suit, stuff_to_equip["wear_suit"]))
+ qdel(M.wear_suit)
+ success = 1
+
+ if(M.gloves && stuff_to_equip["gloves"])
+ if(istype(M.gloves, stuff_to_equip["gloves"]))
+ qdel(M.gloves)
+ success = 1
+ if(M.shoes && stuff_to_equip["shoes"])
+ if(istype(M.shoes, stuff_to_equip["shoes"]))
+ qdel(M.shoes)
+ success = 1
+
+ if(M.belt && stuff_to_equip["belt"])
+ if(istype(M.belt, stuff_to_equip["belt"]))
+ qdel(M.belt)
+ success = 1
+
+ if(M.glasses && stuff_to_equip["glasses"])
+ if(istype(M.glasses, stuff_to_equip["glasses"]))
+ qdel(M.glasses)
+ success = 1
+
+ if(M.wear_mask && stuff_to_equip["wear_mask"])
+ if(istype(M.wear_mask, stuff_to_equip["wear_mask"]))
+ qdel(M.wear_mask)
+ success = 1
+
+ if(M.back && stuff_to_equip["back"])
+ if(istype(M.back, stuff_to_equip["back"]))
+ for(var/atom/movable/AM in M.back.contents) //Dump whatever's in the bag before deleting.
+ AM.forceMove(src.loc)
+ qdel(M.back)
+ success = 1
+
+ if(M.w_uniform && stuff_to_equip["w_uniform"])
+ if(istype(M.w_uniform, stuff_to_equip["w_uniform"]))
+ qdel(M.w_uniform)
+ success = 1
+
+ if(success)
+ playsound(src, 'sound/effects/splat.ogg', 30, 1)
+ visible_message("[src] pulls on their clothes, peeling it off along with parts of their skin attached!",
+ "We remove and deform our equipment.")
+ M.update_icons()
+ M.mind.changeling.armor_deployed = 0
+ return success
+
+ else
+
+ M << "We begin growing our new equipment..."
+
+ var/list/grown_items_list = list()
+
+ var/t = stuff_to_equip["head"]
+ if(!M.head && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_head)
+ grown_items_list.Add("a helmet")
+ playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["w_uniform"]
+ if(!M.w_uniform && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_w_uniform)
+ grown_items_list.Add("a uniform")
+ playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["gloves"]
+ if(!M.gloves && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_gloves)
+ grown_items_list.Add("some gloves")
+ playsound(src, 'sound/effects/splat.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["shoes"]
+ if(!M.shoes && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_shoes)
+ grown_items_list.Add("shoes")
+ playsound(src, 'sound/effects/splat.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["belt"]
+ if(!M.belt && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_belt)
+ grown_items_list.Add("a belt")
+ playsound(src, 'sound/effects/splat.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["glasses"]
+ if(!M.glasses && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_glasses)
+ grown_items_list.Add("some glasses")
+ playsound(src, 'sound/effects/splat.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["wear_mask"]
+ if(!M.wear_mask && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_wear_mask)
+ grown_items_list.Add("a mask")
+ playsound(src, 'sound/effects/splat.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["back"]
+ if(!M.back && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_back)
+ grown_items_list.Add("a backpack")
+ playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["wear_suit"]
+ if(!M.wear_suit && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_wear_suit)
+ grown_items_list.Add("an exosuit")
+ playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ t = stuff_to_equip["wear_id"]
+ if(!M.wear_id && t)
+ var/I = new t
+ M.equip_to_slot_or_del(I, slot_wear_id)
+ grown_items_list.Add("an ID card")
+ playsound(src, 'sound/effects/splat.ogg', 30, 1)
+ M.update_icons()
+ success = 1
+ sleep(1 SECOND)
+
+ var/feedback = english_list(grown_items_list, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
+
+ M << "We have grown [feedback]."
+ /*
+ for(var/I in stuff_to_equip)
+ world << I
+ world << stuff_to_equip
+ world << "Proc ended."
+ */
+ M.update_icons()
+ if(success)
+ M.mind.changeling.armor_deployed = 1
+ M.mind.changeling.chem_charges -= 10
+ return success
+
+//This is a generic proc that should be called by other ling weapon procs to equip them.
+/mob/proc/changeling_generic_weapon(var/weapon_type, var/make_sound = 1, var/cost = 20)
+ var/datum/changeling/changeling = changeling_power(cost,1,100,CONSCIOUS)
+ if(!changeling)
+ return
+
+ if(!ishuman(src))
+ return 0
+
+/* var/mob/living/M = holder.wearer
+
+ if(M.l_hand && M.r_hand)
+ to_chat(M, "Your hands are full.")
+ return 0
+*/
+ ..()
+
+ var/mob/living/M = src
+
+ if(M.l_hand && M.r_hand)
+ to_chat(M, "Your hands are full.")
+ return
+
+
+ var/obj/item/weapon/W = new weapon_type(src)
+ src.put_in_hands(W)
+
+ src.mind.changeling.chem_charges -= cost
+ if(make_sound)
+ playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 73a6ceb..33ec3d7 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -1,484 +1,842 @@
-// READ: Don't use the apostrophe in name or desc. Causes script errors.
-
-var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
-var/list/datum/power/changeling/powerinstances = list()
-
-/datum/power //Could be used by other antags too
- var/name = "Power"
- var/desc = "Placeholder"
- var/helptext = ""
- var/isVerb = 1 // Is it an active power, or passive?
- var/verbpath // Path to a verb that contains the effects.
-
-/datum/power/changeling
- var/allowduringlesserform = 0
- var/genomecost = 500000 // Cost for the changling to evolve this power.
-
-/datum/power/changeling/absorb_dna
- name = "Absorb DNA"
- desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger."
- genomecost = 0
- verbpath = /mob/proc/changeling_absorb_dna
-
-/datum/power/changeling/transform
- name = "Transform"
- desc = "We take on the apperance and voice of one we have absorbed."
- genomecost = 0
- verbpath = /mob/proc/changeling_transform
-
-/datum/power/changeling/fakedeath
- name = "Regenerative Stasis"
- desc = "We become weakened to a death-like state, where we will rise again from death."
- helptext = "Can be used before or after death. Duration varies greatly."
- genomecost = 0
- allowduringlesserform = 1
- verbpath = /mob/proc/changeling_fakedeath
-
-// Hivemind
-
-/datum/power/changeling/hive_upload
- name = "Hive Channel"
- desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
- helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
- genomecost = 0
- verbpath = /mob/proc/changeling_hiveupload
-
-/datum/power/changeling/hive_download
- name = "Hive Absorb"
- desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
- helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
- genomecost = 0
- verbpath = /mob/proc/changeling_hivedownload
-
-/datum/power/changeling/lesser_form
- name = "Lesser Form"
- desc = "We debase ourselves and become lesser. We become a monkey."
- genomecost = 4
- verbpath = /mob/proc/changeling_lesser_form
-
-/datum/power/changeling/deaf_sting
- name = "Deaf Sting"
- desc = "We silently sting a human, completely deafening them for a short time."
- genomecost = 1
- allowduringlesserform = 1
- verbpath = /mob/proc/changeling_deaf_sting
-
-/datum/power/changeling/blind_sting
- name = "Blind Sting"
- desc = "We silently sting a human, completely blinding them for a short time."
- genomecost = 2
- allowduringlesserform = 1
- verbpath = /mob/proc/changeling_blind_sting
-
-/datum/power/changeling/silence_sting
- name = "Silence Sting"
- desc = "We silently sting a human, completely silencing them for a short time."
- helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
- genomecost = 3
- allowduringlesserform = 1
- verbpath = /mob/proc/changeling_silence_sting
-
-/datum/power/changeling/mimicvoice
- name = "Mimic Voice"
- desc = "We shape our vocal glands to sound like a desired voice."
- helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
- genomecost = 1
- verbpath = /mob/proc/changeling_mimicvoice
-
-/datum/power/changeling/extractdna
- name = "Extract DNA"
- desc = "We stealthily sting a target and extract the DNA from them."
- helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
- genomecost = 2
- allowduringlesserform = 1
- verbpath = /mob/proc/changeling_extract_dna_sting
-
-/datum/power/changeling/LSDSting
- name = "Hallucination Sting"
- desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical."
- helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
- genomecost = 3
- verbpath = /mob/proc/changeling_lsdsting
-
-/datum/power/changeling/DeathSting
- name = "Death Sting"
- desc = "We sting a human, filling them with potent chemicals. Their rapid death is all but assured, but our crime will be obvious."
- helptext = "It will be clear to any surrounding witnesses if you use this power."
- genomecost = 10
- verbpath = /mob/proc/changeling_DEATHsting
-
-
-/datum/power/changeling/boost_range
- name = "Boost Range"
- desc = "We evolve the ability to shoot our stingers at humans, with some preperation."
- genomecost = 2
- allowduringlesserform = 1
- verbpath = /mob/proc/changeling_boost_range
-
-/datum/power/changeling/Epinephrine
- name = "Epinephrine sacs"
- desc = "We evolve additional sacs of adrenaline throughout our body."
- helptext = "Gives the ability to instantly recover from stuns. High chemical cost."
- genomecost = 3
- verbpath = /mob/proc/changeling_unstun
-
-/datum/power/changeling/ChemicalSynth
- name = "Rapid Chemical-Synthesis"
- desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster."
- helptext = "Doubles the rate at which we naturally recharge chemicals."
- genomecost = 4
- isVerb = 0
- verbpath = /mob/proc/changeling_fastchemical
-/*
-/datum/power/changeling/AdvChemicalSynth
- name = "Advanced Chemical-Synthesis"
- desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster."
- helptext = "Doubles the rate at which we naturally recharge chemicals."
- genomecost = 8
- isVerb = 0
- verbpath = /mob/proc/changeling_fastchemical
-*/
-/datum/power/changeling/EngorgedGlands
- name = "Engorged Chemical Glands"
- desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
- helptext = "Allows us to store an extra 25 units of chemicals."
- genomecost = 4
- isVerb = 0
- verbpath = /mob/proc/changeling_engorgedglands
-
-/datum/power/changeling/DigitalCamoflague
- name = "Digital Camoflauge"
- desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
- helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
- genomecost = 1
- allowduringlesserform = 1
- verbpath = /mob/proc/changeling_digitalcamo
-
-/datum/power/changeling/rapidregeneration
- name = "Rapid Regeneration"
- desc = "We evolve the ability to rapidly regenerate, negating the need for stasis."
- helptext = "Heals a moderate amount of damage every tick."
- genomecost = 7
- verbpath = /mob/proc/changeling_rapidregen
-
-
-
-// Modularchangling, totally stolen from the new player panel. YAYY
-/datum/changeling/proc/EvolutionMenu()//The new one
- set category = "Changeling"
- set desc = "Level up!"
-
- if(!usr || !usr.mind || !usr.mind.changeling) return
- src = usr.mind.changeling
-
- if(!powerinstances.len)
- for(var/P in powers)
- powerinstances += new P()
-
- var/dat = "Changling Evolution Menu"
-
- //javascript, the part that does most of the work~
- dat += {"
-
-
-
-
-
-
- "}
-
- //body tag start + onload and onkeypress (onkeyup) javascript event calls
- dat += ""
-
- //title + search bar
- dat += {"
-
-
-
- "}
-
- //player table header
- dat += {"
-
- "}
-
- var/i = 1
- for(var/datum/power/changeling/P in powerinstances)
- var/ownsthis = 0
-
- if(P in purchasedpowers)
- ownsthis = 1
-
-
- var/color = "#e6e6e6"
- if(i%2 == 0)
- color = "#f2f2f2"
-
-
- dat += {"
-
-
-
-
-
- Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost]
-
-
- |
-
-
- "}
-
- i++
-
-
- //player table ending
- dat += {"
-
-
-
-
-
- "}
-
- usr << browse(dat, "window=powers;size=900x480")
-
-
-/datum/changeling/Topic(href, href_list)
- ..()
- if(!ismob(usr))
- return
-
- if(href_list["P"])
- var/datum/mind/M = usr.mind
- if(!istype(M))
- return
- purchasePower(M, href_list["P"])
- call(/datum/changeling/proc/EvolutionMenu)()
-
-
-
-/datum/changeling/proc/purchasePower(var/datum/mind/M, var/Pname, var/remake_verbs = 1)
- if(!M || !M.changeling)
- return
-
- var/datum/power/changeling/Thepower = Pname
-
-
- for (var/datum/power/changeling/P in powerinstances)
-// log_debug("[P] - [Pname] = [P.name == Pname ? "True" : "False"]")
-
- if(P.name == Pname)
- Thepower = P
- break
-
-
- if(Thepower == null)
- to_chat(M.current, "This is awkward. Changeling power purchase failed, please report this bug to a coder!")
- return
-
- if(Thepower in purchasedpowers)
- to_chat(M.current, "We have already evolved this ability!")
- return
-
-
- if(geneticpoints < Thepower.genomecost)
- to_chat(M.current, "We cannot evolve this... yet. We must acquire more DNA.")
- return
-
- geneticpoints -= Thepower.genomecost
-
- purchasedpowers += Thepower
-
- if(!Thepower.isVerb && Thepower.verbpath)
- call(M.current, Thepower.verbpath)()
- else if(remake_verbs)
- M.current.make_changeling()
-
+// READ: Don't use the apostrophe in name or desc. Causes script errors.
+
+var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
+var/list/datum/power/changeling/powerinstances = list()
+
+/datum/power //Could be used by other antags too
+ var/name = "Power"
+ var/desc = "Placeholder"
+ var/helptext = ""
+ var/enhancedtext = ""
+ var/isVerb = 1 // Is it an active power, or passive?
+ var/verbpath // Path to a verb that contains the effects.
+
+/datum/power/changeling
+ var/allowduringlesserform = 0
+ var/genomecost = 500000 // Cost for the changling to evolve this power.
+
+/datum/power/changeling/absorb_dna
+ name = "Absorb DNA"
+ desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_absorb_dna
+
+/datum/power/changeling/transform
+ name = "Transform"
+ desc = "We take on the apperance and voice of one we have absorbed."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_transform
+
+/datum/power/changeling/fakedeath
+ name = "Regenerative Stasis"
+ desc = "We become weakened to a death-like state, where we will rise again from death."
+ helptext = "Can be used before or after death. Duration varies greatly."
+ genomecost = 0
+ allowduringlesserform = 1
+ verbpath = /mob/proc/changeling_fakedeath
+
+// Hivemind
+
+/datum/power/changeling/hive_upload
+ name = "Hive Channel"
+ desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
+ helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_hiveupload
+
+/datum/power/changeling/hive_download
+ name = "Hive Absorb"
+ desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
+ helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_hivedownload
+
+/datum/power/changeling/lesser_form
+ name = "Lesser Form"
+ desc = "We debase ourselves and become lesser. We become a monkey."
+ genomecost = 4
+ verbpath = /mob/proc/changeling_lesser_form
+
+/datum/power/changeling/deaf_sting
+ name = "Deaf Sting"
+ desc = "We silently sting a human, completely deafening them for a short time."
+ genomecost = 1
+ allowduringlesserform = 1
+ verbpath = /mob/proc/changeling_deaf_sting
+
+/datum/power/changeling/blind_sting
+ name = "Blind Sting"
+ desc = "We silently sting a human, completely blinding them for a short time."
+ genomecost = 2
+ allowduringlesserform = 1
+ verbpath = /mob/proc/changeling_blind_sting
+
+/datum/power/changeling/silence_sting
+ name = "Silence Sting"
+ desc = "We silently sting a human, completely silencing them for a short time."
+ helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
+ genomecost = 3
+ allowduringlesserform = 1
+ verbpath = /mob/proc/changeling_silence_sting
+
+/datum/power/changeling/mimicvoice
+ name = "Mimic Voice"
+ desc = "We shape our vocal glands to sound like a desired voice."
+ helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
+ genomecost = 1
+ verbpath = /mob/proc/changeling_mimicvoice
+
+/datum/power/changeling/extractdna
+ name = "Extract DNA"
+ desc = "We stealthily sting a target and extract the DNA from them."
+ helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
+ genomecost = 2
+ allowduringlesserform = 1
+ verbpath = /mob/proc/changeling_extract_dna_sting
+
+/datum/power/changeling/LSDSting
+ name = "Hallucination Sting"
+ desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical."
+ helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
+ genomecost = 3
+ verbpath = /mob/proc/changeling_lsdsting
+
+/datum/power/changeling/DeathSting
+ name = "Death Sting"
+ desc = "We sting a human, filling them with potent chemicals. Their rapid death is all but assured, but our crime will be obvious."
+ helptext = "It will be clear to any surrounding witnesses if you use this power."
+ genomecost = 10
+ verbpath = /mob/proc/changeling_DEATHsting
+
+
+/datum/power/changeling/boost_range
+ name = "Boost Range"
+ desc = "We evolve the ability to shoot our stingers at humans, with some preperation."
+ genomecost = 2
+ allowduringlesserform = 1
+ verbpath = /mob/proc/changeling_boost_range
+
+/datum/power/changeling/Epinephrine
+ name = "Epinephrine sacs"
+ desc = "We evolve additional sacs of adrenaline throughout our body."
+ helptext = "Gives the ability to instantly recover from stuns. High chemical cost."
+ genomecost = 3
+ verbpath = /mob/proc/changeling_unstun
+
+/datum/power/changeling/ChemicalSynth
+ name = "Rapid Chemical-Synthesis"
+ desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster."
+ helptext = "Doubles the rate at which we naturally recharge chemicals."
+ genomecost = 4
+ isVerb = 0
+ verbpath = /mob/proc/changeling_fastchemical
+/*
+/datum/power/changeling/AdvChemicalSynth
+ name = "Advanced Chemical-Synthesis"
+ desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster."
+ helptext = "Doubles the rate at which we naturally recharge chemicals."
+ genomecost = 8
+ isVerb = 0
+ verbpath = /mob/proc/changeling_fastchemical
+*/
+/datum/power/changeling/EngorgedGlands
+ name = "Engorged Chemical Glands"
+ desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
+ helptext = "Allows us to store an extra 25 units of chemicals."
+ genomecost = 4
+ isVerb = 0
+ verbpath = /mob/proc/changeling_engorgedglands
+
+/datum/power/changeling/DigitalCamoflague
+ name = "Digital Camoflauge"
+ desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
+ helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
+ genomecost = 1
+ allowduringlesserform = 1
+ verbpath = /mob/proc/changeling_digitalcamo
+
+/datum/power/changeling/rapidregeneration
+ name = "Rapid Regeneration"
+ desc = "We evolve the ability to rapidly regenerate, negating the need for stasis."
+ helptext = "Heals a moderate amount of damage every tick."
+ genomecost = 7
+ verbpath = /mob/proc/changeling_rapidregen
+
+
+
+//////////////////////////////////////////////////////
+//DeadPhil Polaris Ability///////////////
+///////////////////////
+//////////////////////////////////////////////////////
+
+
+
+
+/datum/power/changeling/recursive_enhancement
+ name = "Recursive Enhancement"
+ desc = "We cause our abilities to have increased or additional effects."
+ helptext = "To check the effects for each ability, check the blue text underneath the ability in the evolution menu."
+// ability_icon_state = "ling_recursive_enhancement"
+ genomecost = 3
+ verbpath = /mob/proc/changeling_recursive_enhancement
+
+//Increases macimum chemical storage
+/mob/proc/changeling_recursive_enhancement()
+ set category = "Changeling"
+ set name = "Recursive Enhancement"
+ set desc = "Empowers our abilities."
+ var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS)
+ if(!changeling)
+ return 0
+ if(src.mind.changeling.recursive_enhancement)
+ to_chat(src, "We will no longer empower our abilities.")
+ src.mind.changeling.recursive_enhancement = 0
+ return 0
+ to_chat(src, "We empower ourselves. Our abilities will now be extra potent.")
+ src.mind.changeling.recursive_enhancement = 1
+ feedback_add_details("changeling_powers","RE")
+ return 1
+
+/datum/power/changeling/arm_blade
+ name = "Arm Blade"
+ desc = "We reform one of our arms into a deadly blade."
+ helptext = "We may retract our armblade by dropping it. It can deflect projectiles."
+ enhancedtext = "The blade will have armor peneratration."
+// ability_icon_state = "ling_armblade"
+ genomecost = 2
+ verbpath = /mob/proc/changeling_arm_blade
+
+//Grows a scary, and powerful arm blade.
+/mob/proc/changeling_arm_blade()
+ set category = "Changeling"
+ set name = "Arm Blade (20)"
+
+ if(src.mind.changeling.recursive_enhancement)
+ if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater))
+ to_chat(src, "We prepare an extra sharp blade.")
+
+ return 1
+
+ else
+ if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade))
+ return 1
+ return 0
+
+//Claws
+/datum/power/changeling/claw
+ name = "Claw"
+ desc = "We reform one of our arms into a deadly claw."
+ helptext = "We may retract our claw by dropping it."
+ enhancedtext = "The claw will have armor peneratration."
+// ability_icon_state = "ling_claw"
+ genomecost = 1
+ verbpath = /mob/proc/changeling_claw
+
+//Grows a scary, and powerful arm blade.
+/mob/proc/changeling_claw()
+ set category = "Changeling"
+ set name = "Claw (15)"
+
+ if(src.mind.changeling.recursive_enhancement)
+ if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15))
+ to_chat(src, "We prepare an extra sharp claw.")
+ return 1
+
+ else
+ if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw, 1, 15))
+ return 1
+ return 0
+
+/obj/item/weapon/melee/changeling
+ name = "arm weapon"
+ desc = "A grotesque weapon made out of bone and flesh that cleaves through people as a hot knife through butter."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "arm_blade"
+ w_class = ITEM_SIZE_HUGE
+ force = 5
+ anchored = 1
+ throwforce = 0 //Just to be on the safe side
+ throw_range = 0
+ throw_speed = 0
+ var/mob/living/creator //This is just like ninja swords, needed to make sure dumb shit that removes the sword doesn't make it stay around.
+ var/weapType = "weapon"
+ var/weapLocation = "arm"
+
+/obj/item/weapon/melee/changeling/New(location)
+ ..()
+ if(ismob(loc))
+ visible_message("A grotesque weapon forms around [loc.name]\'s arm!",
+ "Our arm twists and mutates, transforming it into a deadly weapon.",
+ "You hear organic matter ripping and tearing!")
+ src.creator = loc
+
+/obj/item/weapon/melee/changeling/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/weapon/melee/changeling/dropped(mob/user)
+ visible_message("With a sickening crunch, [creator] reforms their arm!",
+ "We assimilate the weapon back into our body.",
+ "You hear organic matter ripping and tearing!")
+ playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
+ spawn(1)
+ if(src)
+ qdel(src)
+
+/obj/item/weapon/melee/changeling/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/* /obj/item/weapon/melee/changeling/suicide_act(mob/user)
+ viewers(user) << "[user] is impaling \himself the [src.name]! It looks like \he's trying to commit suicide."
+ return
+*/
+
+/obj/item/weapon/melee/changeling/Process() //Stolen from ninja swords.
+ if(!creator || loc != creator ||(creator.l_hand != src && creator.r_hand != src))
+ // Tidy up a bit.
+ if(istype(loc,/mob/living))
+ var/mob/living/carbon/human/host = loc
+ if(istype(host))
+ for(var/obj/item/organ/external/organ in host.organs)
+ for(var/obj/item/O in organ.implants)
+ if(O == src)
+ organ.implants -= src
+ host.pinned -= src
+ host.embedded -= src
+ host.drop_from_inventory(src)
+ spawn(1)
+ if(src)
+ qdel(src)
+
+/obj/item/weapon/melee/changeling/arm_blade
+ name = "arm blade"
+ desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
+ icon_state = "arm_blade"
+ force = 40
+ armor_penetration = 15
+ sharp = 1
+ edge = 1
+ anchored = 1
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+
+/obj/item/weapon/melee/changeling/arm_blade/greater
+ name = "arm greatblade"
+ desc = "A grotesque blade made out of bone and flesh that cleaves through people and armor as a hot knife through butter."
+ armor_penetration = 30
+
+/obj/item/weapon/melee/changeling/claw
+ name = "hand claw"
+ desc = "A grotesque claw made out of bone and flesh that cleaves through people as a hot knife through butter."
+ icon_state = "ling_claw"
+ force = 15
+ sharp = 1
+ edge = 1
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+
+/obj/item/weapon/melee/changeling/claw/greater
+ name = "hand greatclaw"
+ force = 20
+ armor_penetration = 20
+ anchored = 1
+
+
+/datum/power/changeling/electric_lockpick
+ name = "Electric Lockpick"
+ desc = "We discreetly evolve a finger to be able to send a small electric charge. \
+ We can open most electrical locks, but it will be obvious when we do so."
+ helptext = "Use the ability, then touch something that utilizes an electrical locking system, to open it. Each use costs 10 chemicals."
+// ability_icon_state = "ling_electric_lockpick"
+ genomecost = 3
+ verbpath = /mob/proc/changeling_electric_lockpick
+
+//Emag-lite
+/mob/proc/changeling_electric_lockpick()
+ set category = "Changeling"
+ set name = "Electric Lockpick (5 + 10/use)"
+ set desc = "Bruteforces open most electrical locking systems, at 10 chemicals per use."
+
+ var/datum/changeling/changeling = changeling_power(5,0,100,CONSCIOUS)
+
+ var/obj/held_item = get_active_hand()
+
+ if(!changeling)
+ return 0
+
+ if(held_item == null)
+ if(changeling_generic_weapon(/obj/item/weapon/finger_lockpick,0,5)) //Chemical cost is handled in the equip proc.
+ return 1
+ return 0
+
+/obj/item/weapon/finger_lockpick
+ name = "finger lockpick"
+ desc = "This finger appears to be an organic datajack."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "electric_hand"
+
+/obj/item/weapon/finger_lockpick/New()
+ if(ismob(loc))
+ loc << "We shape our finger to fit inside electronics, and are ready to force them open."
+
+/obj/item/weapon/finger_lockpick/dropped(mob/user)
+ to_chat(user, "We discreetly shape our finger back to a less suspicious form.")
+ spawn(1)
+ if(src)
+ qdel(src)
+
+/obj/item/weapon/finger_lockpick/afterattack(var/atom/target, var/mob/living/user, proximity)
+ if(!target)
+ return
+ if(!proximity)
+ return
+ if(!user.mind.changeling)
+ return
+
+ var/datum/changeling/ling_datum = user.mind.changeling
+
+ if(ling_datum.chem_charges < 10)
+ to_chat(user, "We require more chemicals to do that.")
+ return
+
+ //Airlocks require an ugly block of code, but we don't want to just call emag_act(), since we don't want to break airlocks forever.
+ if(istype(target,/obj/machinery/door))
+ var/obj/machinery/door/door = target
+ to_chat(user, "We send an electrical pulse up our finger, and into \the [target], attempting to open it.")
+
+ if(door.density && door.operable())
+ door.do_animate("spark")
+ sleep(6)
+ //More typechecks, because windoors can't be locked. Fun.
+ if(istype(target,/obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/airlock = target
+
+ if(airlock.locked) //Check if we're bolted.
+ airlock.unlock()
+ to_chat(user, "We've unlocked \the [airlock]. Another pulse is requried to open it.")
+ else //We're not bolted, so open the door already.
+ airlock.open()
+ to_chat(user, "We've opened \the [airlock].")
+ else
+ door.open() //If we're a windoor, open the windoor.
+ to_chat(user, "We've opened \the [door].")
+ else //Probably broken or no power.
+ to_chat(user, "The door does not respond to the pulse.")
+ door.add_fingerprint(user)
+ log_and_message_admins("finger-lockpicked \an [door].")
+ ling_datum.chem_charges -= 10
+ return 1
+
+ else if(istype(target,/obj/)) //This should catch everything else we might miss, without a million typechecks.
+ var/obj/O = target
+ to_chat(user, "We send an electrical pulse up our finger, and into \the [O].")
+ O.add_fingerprint(user)
+ O.emag_act(1,user,src)
+ log_and_message_admins("finger-lockpicked \an [O].")
+ ling_datum.chem_charges -= 10
+
+ return 1
+ return 0
+
+////////////////////////////////////////////
+//////////////////Invisible deadphil polaris////////////////
+////////////////////////////////////////////
+
+/datum/power/changeling/visible_camouflage
+ name = "Camouflage"
+ desc = "We rapidly shape the color of our skin and secrete easily reversible dye on our clothes, to blend in with our surroundings. \
+ We are undetectable, so long as we move slowly.(Toggle)"
+ helptext = "Running, and performing most acts will reveal us. Our chemical regeneration is halted while we are hidden."
+ enhancedtext = "Can run while hidden."
+// ability_icon_state = "ling_camoflage"
+ genomecost = 3
+ verbpath = /mob/proc/changeling_visible_camouflage
+
+//Hide us from anyone who would do us harm.
+/mob/proc/changeling_visible_camouflage()
+ set category = "Changeling"
+ set name = "Visible Camouflage (10)"
+ set desc = "Turns yourself almost invisible, as long as you move slowly."
+
+
+ if(istype(src,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = src
+
+ if(H.mind.changeling.cloaked)
+ H.mind.changeling.cloaked = 0
+ return 1
+
+ //We delay the check, so that people can uncloak without needing 10 chemicals to do so.
+ var/datum/changeling/changeling = changeling_power(10,0,100,CONSCIOUS)
+
+ if(!changeling)
+ return 0
+ changeling.chem_charges -= 10
+ var/old_regen_rate = H.mind.changeling.chem_recharge_rate
+
+ to_chat(H, "We vanish from sight, and will remain hidden, so long as we move carefully.")
+ H.mind.changeling.cloaked = 1
+ H.mind.changeling.chem_recharge_rate = 0
+ animate(src,alpha = 255, alpha = 10, time = 10)
+
+ var/must_walk = TRUE
+ if(src.mind.changeling.recursive_enhancement)
+ must_walk = FALSE
+ to_chat(src, "We may move at our normal speed while hidden.")
+
+ if(must_walk)
+ H.set_m_intent("walk")
+
+ var/remain_cloaked = TRUE
+ while(remain_cloaked) //This loop will keep going until the player uncloaks.
+ sleep(1 SECOND) // Sleep at the start so that if something invalidates a cloak, it will drop immediately after the check and not in one second.
+
+ if(H.m_intent != "walk" && must_walk) // Moving too fast uncloaks you.
+ remain_cloaked = 0
+ if(!H.mind.changeling.cloaked)
+ remain_cloaked = 0
+ if(H.stat) // Dead or unconscious lings can't stay cloaked.
+ remain_cloaked = 0
+ if(H.incapacitated(INCAPACITATION_DISABLED)) // Stunned lings also can't stay cloaked.
+ remain_cloaked = 0
+
+ if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.
+ old_regen_rate += mind.changeling.chem_recharge_rate //Unfortunately, it has to occupy this part of the proc. This fixes it while at the same time
+ mind.changeling.chem_recharge_rate = 0 //making sure nobody loses out on their bonus regeneration after they're done hiding.
+
+
+
+ H.invisibility = initial(invisibility)
+ visible_message("[src] suddenly fades in, seemingly from nowhere!",
+ "We revert our camouflage, revealing ourselves.")
+ H.set_m_intent("run")
+ H.mind.changeling.cloaked = 0
+ H.mind.changeling.chem_recharge_rate = old_regen_rate
+
+ animate(src,alpha = 10, alpha = 255, time = 10)
+
+////////////////////////////////////////////////////////
+////////////////////end invisible///////////////////
+////////////////////////////////////////////////////////
+
+
+
+
+// Modularchangling, totally stolen from the new player panel. YAYY
+/datum/changeling/proc/EvolutionMenu()//The new one
+ set category = "Changeling"
+ set desc = "Level up!"
+
+ if(!usr || !usr.mind || !usr.mind.changeling) return
+ src = usr.mind.changeling
+
+ if(!powerinstances.len)
+ for(var/P in powers)
+ powerinstances += new P()
+
+ var/dat = "Changling Evolution Menu"
+
+ //javascript, the part that does most of the work~
+ dat += {"
+
+
+
+
+
+
+ "}
+
+ //body tag start + onload and onkeypress (onkeyup) javascript event calls
+ dat += ""
+
+ //title + search bar
+ dat += {"
+
+
+
+ "}
+
+ //player table header
+ dat += {"
+
+ "}
+
+ var/i = 1
+ for(var/datum/power/changeling/P in powerinstances)
+ var/ownsthis = 0
+
+ if(P in purchasedpowers)
+ ownsthis = 1
+
+
+ var/color = "#e6e6e6"
+ if(i%2 == 0)
+ color = "#f2f2f2"
+
+
+ dat += {"
+
+
+
+
+
+ Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost]
+
+
+ |
+
+
+ "}
+
+ i++
+
+
+ //player table ending
+ dat += {"
+
+
+
+
+
+ "}
+
+ usr << browse(dat, "window=powers;size=900x480")
+
+
+/datum/changeling/Topic(href, href_list)
+ ..()
+ if(!ismob(usr))
+ return
+
+ if(href_list["P"])
+ var/datum/mind/M = usr.mind
+ if(!istype(M))
+ return
+ purchasePower(M, href_list["P"])
+ call(/datum/changeling/proc/EvolutionMenu)()
+
+
+
+/datum/changeling/proc/purchasePower(var/datum/mind/M, var/Pname, var/remake_verbs = 1)
+ if(!M || !M.changeling)
+ return
+
+ var/datum/power/changeling/Thepower = Pname
+
+
+ for (var/datum/power/changeling/P in powerinstances)
+// log_debug("[P] - [Pname] = [P.name == Pname ? "True" : "False"]")
+
+ if(P.name == Pname)
+ Thepower = P
+ break
+
+
+ if(Thepower == null)
+ to_chat(M.current, "This is awkward. Changeling power purchase failed, please report this bug to a coder!")
+ return
+
+ if(Thepower in purchasedpowers)
+ to_chat(M.current, "We have already evolved this ability!")
+ return
+
+
+ if(geneticpoints < Thepower.genomecost)
+ to_chat(M.current, "We cannot evolve this... yet. We must acquire more DNA.")
+ return
+
+ geneticpoints -= Thepower.genomecost
+
+ purchasedpowers += Thepower
+
+ if(!Thepower.isVerb && Thepower.verbpath)
+ call(M.current, Thepower.verbpath)()
+ else if(remake_verbs)
+ M.current.make_changeling()
+
From 97c972b112c161a6655cd31e322bc74d544a65a6 Mon Sep 17 00:00:00 2001
From: ZerlGray <32713309+ZerlGray@users.noreply.github.com>
Date: Fri, 22 Dec 2017 21:15:12 +0700
Subject: [PATCH 2/8] =?UTF-8?q?=D0=90=D0=B1=D0=B8=D0=BB=D0=BA=D0=B8=20?=
=?UTF-8?q?=D0=B3=D0=B5=D0=BD=D0=BE=D0=BA=D1=80=D0=B0=D0=B4=D0=BE=D0=B2=20?=
=?UTF-8?q?=D1=81=20=D0=BF=D0=BE=D0=BB=D1=8F=D1=80=D0=B8=D1=81=D0=B0.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Со всеми правками. Работает. Проверено на локалке на чистом блюадмиралторче.
---
code/game/gamemodes/changeling/modularchangling.dm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 33ec3d7..9c04f60 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -203,7 +203,7 @@ var/list/datum/power/changeling/powerinstances = list()
helptext = "We may retract our armblade by dropping it. It can deflect projectiles."
enhancedtext = "The blade will have armor peneratration."
// ability_icon_state = "ling_armblade"
- genomecost = 2
+ genomecost = 8
verbpath = /mob/proc/changeling_arm_blade
//Grows a scary, and powerful arm blade.
@@ -229,7 +229,7 @@ var/list/datum/power/changeling/powerinstances = list()
helptext = "We may retract our claw by dropping it."
enhancedtext = "The claw will have armor peneratration."
// ability_icon_state = "ling_claw"
- genomecost = 1
+ genomecost = 6
verbpath = /mob/proc/changeling_claw
//Grows a scary, and powerful arm blade.
@@ -347,7 +347,7 @@ var/list/datum/power/changeling/powerinstances = list()
We can open most electrical locks, but it will be obvious when we do so."
helptext = "Use the ability, then touch something that utilizes an electrical locking system, to open it. Each use costs 10 chemicals."
// ability_icon_state = "ling_electric_lockpick"
- genomecost = 3
+ genomecost = 10
verbpath = /mob/proc/changeling_electric_lockpick
//Emag-lite
@@ -448,7 +448,7 @@ var/list/datum/power/changeling/powerinstances = list()
helptext = "Running, and performing most acts will reveal us. Our chemical regeneration is halted while we are hidden."
enhancedtext = "Can run while hidden."
// ability_icon_state = "ling_camoflage"
- genomecost = 3
+ genomecost = 10
verbpath = /mob/proc/changeling_visible_camouflage
//Hide us from anyone who would do us harm.
From 12837a2871c7244f202e501ae21c93d729055ceb Mon Sep 17 00:00:00 2001
From: ZerlGray <32713309+ZerlGray@users.noreply.github.com>
Date: Fri, 22 Dec 2017 21:18:50 +0700
Subject: [PATCH 3/8] =?UTF-8?q?=D0=98=20=D1=81=D0=BF=D1=80=D0=B0=D0=B9?=
=?UTF-8?q?=D1=82=D1=8B=20=D0=BA=20=D0=B0=D0=BC=D1=80=D0=B1=D0=BB=D0=B5?=
=?UTF-8?q?=D0=B9=D0=B4=D0=B0=D0=BC=20=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD?=
=?UTF-8?q?=D0=BE=20=D0=B6=D0=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
lefthand.dmi | Bin 0 -> 120811 bytes
righthand.dmi | Bin 0 -> 120769 bytes
weapons.dmi | Bin 0 -> 30549 bytes
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 lefthand.dmi
create mode 100644 righthand.dmi
create mode 100644 weapons.dmi
diff --git a/lefthand.dmi b/lefthand.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..4a92577a3c319c233ed0497b70895c0615818cbf
GIT binary patch
literal 120811
zcmcG#cUV);_BR?t#D>_AUK9is0YQ2dQHmf)N2*Bgy@n(d1*Hm7q$|Dm-U1>Zy@yV~
z0D%MuEd&UGcjNb*bARXF=RWTr@4Y)uc4qe8Q`VX_YtLssE1%z}Do|Z!xC{b;sFW06
zXn;Tz{%7Bd7l11Z>VJ4api61KT6*p;EZodoZJgb0oE$+Q@04tV*G?R@H>8x|@86jS
z1>7%18M|%CYL<)kpHG
zVz)ZkwL$kTn^yN>E!y+dIg0_a*UHI8g~VR{er~X=@_U7GAG_jtV+wzRfQA!?o$PNy
z;;*jfOkE{4Hu(RT3^t0nbm&oRuPM16qata&(jww4=U@i2Rp=%(H)L{TpKJ7rl@)T0
zRp#va!sr@nr#zx|n<)|b3MnTlAXCtP@%kmDNPU{~U2<%@lQ}*YnTQB1-KP(cnjZe#
z&V~YFof$z_IBf2cL0Nxohz3-?+N5OSs#LvoUc&A1sW&^#q4ZrB0joFZ>~Z%TTQ%rt
z*UIw9_URLEzV}w&$usxIC>V`izc>|Baw+^&HTQGC#)FKx79|_CcMj3^TyT5SH
zA6LxY>n*lg_;^3TuDU|DH_zTe)H%Gtb1`kQl8nFSX@4~FN7vKwC!$7oUKy8*Z#VLP
zf#X$#ID%hU4$`Cu-Z0b$zb;M_`-L+lxzAX+Ncf)Lf8YKXb#Xz^s+EE$Uq193p*veT
zbVWO%J6`xTWNx{>)I@R+@?%$$@N!`H`02SLe}Cv&(7i_6(50ZkH@{`Ke+s*~lH3ot
zUALyc+&h^8saArvX1h3Q4xf16@^3`l{E&&`UU^zpN_(rna(}M%MU6&e@t$&qQaB~F
zC}xH8KInqT=YY=`j?U`=gsbQG`8vP$kv$CMEZ4ZC_(-*t=TPcCRHf}3rhUCR772_y4<;2nwGvYy6wol^%?g^N--Td~J^IeT%He2E7DrM`Y
zrJ%*PhsS;~3ubU8o3uvma1!rInwOQ)W*rpmphruu&0N3)f|)
zgblZX&;VIai3fq7|Ezs^eLY7cZ}VA+Did{_jq{ic*IR+)Dhs{a7ync&DdsBYSxfi%t1hd@f%2I`3
z#@eMBw$KQqdiI!1S!x#jV?}<*+?t*z)w}Cnw*Ida818PrIOjU6sGJr-RwJRY+!g))
ze3O}ZLBOIOozHMpM8%#3eOog8LA})!}T@Ov@BaQ=6O=F3JZjj&nRqUZoZ(Lw^h1pIf7JqEU^~2)U{0
z>iOUr3JvLx8XFQV&+Sele~5ZtK0V2@)MhATO)HE`Q1lX|cYj_xp}l9vK_%N+Zv&$lIPT$tEOd$DY~@{hJ9RbgyR=;QzoHzl6J}j$
z*)I(WIBfJN-rZJ~p1Hk!xx+p7!FQNRIZ5NsCyLN-fh&d-8NtfJ;%slV^3OjR$sQ40
zTRQimFFv$PIy+|L{5uQ&YZe@gm$eErAFwCNy*$hu$@(eiWuu{<)L8Yw_(NpZ`76P=
zYmze~9-d=&+vwfIzGWo_G)~>R>1@umMDcasKvMM$Q$2ZX`3N2T;{puW>Xb9cgap3d
znM^)!vjDy_s2r(9O#5-6yeB0%uMrxdL!mhHXv|Sl8*Fq4gD8tX+ysVtbe?xRhH-r{-)FuGlOIFNUH4*E988|3MJs}jAE_M#eb7!*2@ttoC`q$)
z4Jy<_-nm)QdC6O6_qWoO_-{-@jpEk{9AX5>#@D4?n;m*cW)AcWLP!B;BdF`9NN2_p-W>_N*gW%+E1H^LLu&y;}py#R=sqBa(HBR?5k&
zBIzdwb%zH;H1?GIX7|>T<$0Dc5Qq(=^g>q4J7s;&$4`5_`Sg^a`kd_q0FNoOGprCOGigp*U(8vxZb`+b7{?-PUacPWMU6@ZkP3yiO#PB>8Mi6
zPFhrL!Zz92qg
zzRTL3P6{ZI%I9(0GlK{JJR+GAzYmI}q9f^j?m4hwfPa+oHzSvq(a8{iCUrWQQZG#U
z4@br2g{S9iPm$A|mGS>==RvXMmz&qIRla?BtVUYx0*WYkBBvU*XojN6bASvS++{NP
zAGt+F*1v7NkQ*_0CMb-2SU}BOD#AV5VjI5=VL82yD}WNd*F(Z>%v-$
zoZTcb|5NaMLN!S5=-!7tY)3C061^Q2`~}+VO@G$v@b!_>t?2*j$*<#}Nh(&7Z-782
z!RI)0G1G+aO(!5cOwe!7j!4!?@bdfHm+LBsa|@GkxzG<^&Kl+CRwG@!OApj-rjvGb
z^M#98g!ArlX~*N=3l?kAz#DQI6v%(0}Z&fb=!HIHWM)4PDrFQ)yC_=t)v1cBMS@1
z8q5o32w+XmB$KH8=h(`tpKbeAR&?WcQ#0xuC+_^!itKy4fIs+&M9zspSl${|Nytm0
zlltI5A?O$4TnE-7$xz0mKOEV&K_@ebBHwOUSgIBmT#$#Hb~e<~kMb^s^~;%Fnk8(^
z(B_G&E2IPcy&h#r{!T>Ep7%{G=6T1VYV?Z4ORAq8ow8=@8#mkjs{cPXsl}2`zl^dO
z+A|4u&PQ&`37!nImDfL0FStU3?j80M`*%4y8A+gVUoQdA1Ylic#9IJ(!x{{`lwe
z0_EmYzBC(4W64oWN>d&^jV!kRQ{auX{*K;hQ<|!@+bLSt^A2AylP-Wb+IMLKlr1S9
zp%ko-Idr}YKtBK)0J4?m=+?GLVs7p|VAyWfep3MR!95*ca>9%LChr`d!!}C%La#wF
z0*vc5mP*o5(_kiQ-Ngk2$WugLQhN|MZH)-m3fpr_!X`DOs~iOR)GakD%(
zCNP4o8@=tGeK=2(U0&;^n>pPIsDKq6Ix;y^U#Lzma}L#2pCP#KxoNA_Nqu_YkFBRQ
zakk8Jq`^GIkzViCu+*Hq6n1(?Ia;b2Z?)*E=R;qYyOeB~JxDoS91=gZ=@o-0F~Ej@
zA<^W2fcNhfAiMQzp{bhAZUOZgqeT;*?E`_ySNa<8*aKPl`F+Mu6Wz7P9roVK^y80V
zJ-fKxqESAfcCP*rN_btJkql*4CHhmz9bJ&fyfNF{+5BR3;A=hDus@ccx$*=`WMJ*)
ze)QN@mwMKXuVul{gEV4Us_d~`!g!J~aCYVRD1Z{vZo+qtpaqeTQND6g(c05==hz}(
zcf*h66fwE(RRDC?&V$AAUnOFLm$$jkZ-2@P5u{X#
z34Z&<^{Q6h^Q#;Nx4OBC30DBWUxn`PP_VuuQ*I>M7vuL4&32`v3I$H=+`
zhKledVe&B(50xGJ*-E@UcpyHXeSj-T2fs5u42sY@md>Ts1%Smn9lQI&tQh!oGJUm0
z){i&C8mTvkI5?kIa`!Ys>Zy
zVBD^?mUY;b`lIpoD8-n8`#wpvJa2johy4tEsju^KpV#tf~C0N{#DEhK~Gr{qiR5rK%f&k#Ho;
z$ka7$`aGK5ns{)Caf^nmzo_|pg?qTUUCgl#Iib^h@15bq@X
zF<)Wx)jN^n*TIY@*8pD#jExrS$%WK^a!B}gXO^yX7q{nlHRDN+-Fmz?jr`3M;XzzW
zkx?zerTzCj{Ge~&aKj+p|0KA%6SLAr!aHh7VCZX9x
zU%%ixjyz@kkn?94H23}7k;j0M$l!RuM=XaD(x^&>M8u1neRYj}vKx%GzW;pfln;ZS
zTzNY;-GqKXRfWvr9C)H=d{yR?%l)5
zLKw{JeWcR;J=OS#R%XSHX%D+pz;=iHGYdV4)O2s)uC-NFT7U^F)mf%XL$vhuZ9USA
zT~E39_cvy~iX&fCA#m>D$VtFAr>raBCL)a*@s0T=8VPpLBJhe#Q5OqXMb`vU?YTLd
zs5M7x;#Uq`E|rKZ7Mt-zjIHJ1zW6mC{0U2oTGobZ#w8~g_9XBkN{kx!eoq=7Ev~fd
zU_3X{a$mw^ie_F(yv;{{jOL0GG)@64H(@*~Y~y8?ixSOCN1KDGYW16JTtV6EeIjF3G2xjS%XHx?FC7aok2tjZj-aGk9-`vI_$kWW&BDBTe&SM?IxYQ_UFg5*>CWdcY@l7T*&)?*9&-KolD!
z8wxuwJX7ns>KmnT>8|FbFQh-{l=ex!7hPwjcB5dXp=}>CC#S8AK{Pk^^!65ySMkiX
z*`c6L$QG$$lt_&uN!)5R(}Qn%|IbT`BLeKyYt9P^VGud=E7m(Ae8ARo!$N2yM+f?o
z1s$dZNo&(!!M$N(1S@f-#sct|4923W8gsK=jx|KMKSSl56XX2p0>mmyK8YaXjl`gy
zu1Av(024MTMr{L8-CgKL-Qx|);L4_Hbx6eBzRxTz0Dac!WI*$F)k9H9#dEv&w(_aear&PF%MF~vipX%eIZiVhek2@?y3rb
zseR}csBPR9#Kg!XeC?)#lThmc8IugBs67+M^t`SAHn}KN#d%UxQKc(XkA+@It^r2A(gPs4*}?>uG+H8aoci|EnS6g
z=#lB$CdNCikhYAU_rBVL0IeZ)?v(DWlSRIY0=-Bt1_}HQa594q2w6ia0Fyd=iDcNd
zD>22~0I`Wq&yr8Z+4_G|x!8TS9-pIy{Z80UY2j!o+?D
z^cOe*2;_G8xxauBxN$EO^naRs)Z6>VOd*PYvkO;jyzC8uvu$ITevUD+oQg}HNS?@+
zUIE$xfiime1ssr%E}cCJJXl3W~uSjBR$5*BZ6<8V8UBtK6bTj3fQiPfh@1syb}0ivFqKSqI;_byAFmgA)s_qFC_URxo@kc_@`uAaAsr
zld>N8)=ZE#O4p`GQ6Z=xevK68gi)Y49f?&>WN2yPon&Y+wCu@KA>}QY_`;Tx8MLZZ
z0C|8~f_wqBEzQo{M9lx%XR{l4WW=S^F(TKYQI7dJ6cTwMnVLQkizz|Kb$GBEdhJ0q
zoCnMAe@+1#=pTvGdkx-HTEtTQ?fh0quE8_K0%~sfVX@P=31Rh=1b?jq5@|8kfYjZn
zIbBKlU0-{@sM!TvW_$by0BwF);oUveo!wm;inBj)3f+;0(J6>0jV_o2pnth
z{I3BQgi~PzM=@`oqcDgWP?@_+HOIJ9^!4EXbb`|}a-gSyE9sEu{P#1}LyzBHlPi+to8gl^lIfJ
z^8G)Tz^Ux$2884F_uWlf21Vv4)_)6w-VA!XtH2k|-O3VQlN=F3vk`*3WW-SiVzq4P
znMk*5W=^92eT=}ockVg=QyAnA+PbG*(=5QF!aX-4HNmzI6mCEr^5?RpnY~$I$eDNk
z=XgQ*CgD|rPgeqfe9kWQ=)uNe-4l3Y{S!ENnuv>JB(8Yz0nG$LvK*-2oz*?OgQ}Nt
z+zB1=Lb`dqB2IwSN4cSc-jY7^#!EK^;=Q3I>eW7VS
z(9yK2Js6M@s{z;4Y!oA!D}!zAeB#pl3boc!$o;SHNCd1b{O7ocRIkO9m313DD!kGB
zuio|dw|7p~U_Wjgw+l;$40BJU+4DYJO^nyBqh0Y5Nw~cySZWBaIBYvOv7Dk-NS5GY
zwM%QU|K_vSa8Bo(o3nG3cNygqP;1hAcDKQdj@LTu_fcst!(Nw1$LXuTi~__v#&1QRn-}kR~
zNt4_Hz)N?j*oAx%$&(GM*_Ew>+H{v>)CKt092NC~yIWFWcaoJfa|H9kf&&qm5(AzX
z^j6%hl-QM9;M2*5yxn4#`keYG(k~Qsl?kBV+Fexr*P;p1_N-FC+!1@cE}Audd!|wZ
zE;VwTUV2p+e2oP$2{jrK-UQB7=mk?F(W2avrN-Y75p{-7
zZJdi)QpczK>?;8PlrQC{jsoetiddHV5nKZRO;u&43ZUMSKH4?bR5d2eQ)
zTs_i(6C+AN!T8n2Y+onc?0ww{%%YcPmcwiaa_R?Zy!z}S3#3+y8eVRMt;Ole2dfj-
z!>cyr)-6Ev!P?oz!Rf^=1bfz!lZpD7^l;ec4zYEvMKuiL0`9COj|7h|yo
zb9<9za|;0W>>W$GZ9IhZQv;S_*7M0!2$bg1Cb&DR%;&rF;p|6TR(}ogEdg*r-}i#M
z(t(c*DG-rdubC^V8^!ZV>`Rq4R}V0l+$Bvv=>aVr)m4qWYK~Io7TQbda_@-KJ^$x8
za3wBA<@L!4?%ZfP%+Edr7XKRqs3NAJLFe+%r{#CEHb6s`uS*Z4bm3iI9WB@2ezDCC
zL%Qvo9q+S%q+MKE*1pB%dq_}Y!e#5lbKH(<{6%xzC{y_#=wdxtw7QB^Qa${<=KM~!
zF{#PL1I$gZ%Uiw_*7l_DM^j4yonc#*Jfpk2Dylj;y!11=a=y!X>+d4wXRCD4Gw3ac#f;`@}v<-`G8T{xJdfyXsA3KjUgP=ps#<}Rf1|4O|o#yv7!;%5Ftbr$r58UA=*kzuhuIah7
z!8R<-chgIt=8H0@Wi-o>1U2GYZbAYEm=$)%Ws*iBKj6Gf2+f)rSsSJ&lyMU?CRLnq
zGz-^CnaM$A9aQWNA6kX&UTVJq-)21Kys5znhVS2dO!`a(y>-duYcuOHp#viaCX1yN
zYW_noB(bn=gfR{=i@qt0kl+^dG3O(#6{jZgS0u3bnKeGLv(>zOmvQ1WD%*hkP-srn
z{%vh$#b^#BHwZtOkq(^P_j9?!jQ4-ck^3`TzJxzbjVr?%&=x8@0J4wAnzBfy3
z6axF1@IYX-!T61g5~HX1g;PHShUp?;FFI2f?*}p1U$`W7?mCCZ-K@E-;eWpzqV|J8
zWe_{2p{Z-K?KeTjUbZG?635|Pz>KUc%#eQ@nR&O_Z7e@1lU*UaqLK-}npA9&Ot4ww
z0!t;IP21hL8_j}l?oQ47vWYr=IzMV(?c3}uI8K)p3M|KMMUbzA%umt(?m7+FrDU8L
zglvBU+;!w2HfxU34u9D4h^l8JPm|JPxQ`D%zS+axV9{pTyl3hY=JtEX)fMEw--W0-
ze?HkEQvnqCGi-}rB_QX_Rryu1Dx6-ad-@$*(@EW{IqXu8CtJ`}UCmM37kv9INdrQf
z8~J7WlCXZ2i@n{Nv`^A+wlE=Gena@U?Ul_RsX5H+}y~+d8{(}
zr^ig(YiMg;Okcl34MpiST4&a1i%Iwob?8eXcl0QTEiKFjvcx!
zNe6!M(%DSTW>C3lUlYMX2J&}j2iYSTDBWx1hRV+Sb4$-TNdW_~o4hZ2<~P<^h6=G{|kLoJxnEAXq8CV?b`I;{_CMk_)Z^}MV)qmu{z-Ct1_r+M+J-AK&Y7Z
zoU3@gd=8X%?IO&`ICA+y--pdYU6B+d*CcyUCNyUf`#k}$f@JQci&Dy
z)<9{q3|iMtxB2bR_b?DBx;!sKhx%>F;m~k{_3to%R`XwF2VGdmuag^^{POf%(MNd6
zCp;zSIu&gM_Faki@NhLX3*se8T&58Tk2T$0}J=sOnxc9)6C`7r+?PA&=o)Ahw1`
zM)#D%JytM^`dK>vfC>R>AYFYc<%n%@H&XY-QP8T3PJ!%o)6m$RiCkKt%)ogzYhJ(O
z?*eMQKsXy%=&4$-#>NaKzH3`-KUChIw)q0+!!y(9hdSk#!+3a}Ja05}px6SO%jiMB
zjss}%>np{>wRp8u)CFeR9`qOY50$d(YWs=EBs763@Lg+GFS@#`+znAW*7JO=R;ai5
zV|0$MVQ^^yCU!J)5V-JdeE
z&@lVhP>$rYp2)eBSDgf@`etZG;!aoCQ;N>Fo=rex$<)!}l9>mt=toSJS)*0hb-Imc
z6BB~$5qo&Vb-_<}tqex$1w<4{K3i>+UXVRB(b388u=E6bGS`hzhUlCeq=#&_NKNgk
zzHpOzH8IKaw%o72MdHN0(Bu@!3~Q)-f9RTgpS?W{N}m7L<`6sV+5F$QE+%>A>v%
z=&8^|U*jRyij3ot*Y2(X?ENxY1E5Fd2AztrA;?{8RhJ)TT6*SIjvrs<)P0$dw6Pzc
za_j3y@5gcQ;HJmXQ*1>V*ZgzQ=tNwKTlfI?>JJf-4ehBm2CB6<)zR=W5a^#+fK27i
zeQi}8&bv>hnPpB6_@!h9nP#L6V%!0-&%__E1$KWwl+y$TJ0u6W4^H4t`s%FZ6J#Wh
ze=klUzs(hT)vj|+sOgD(N0+LSbo$q419?9qDy82>X|c>A7r>7z*Wdj_r+z~CF5xE~
z=)I2CeiSfz?or6@{G>^h(-!FqoctR2^|Iul&uC$TDQ#>^tgf~v1V)l?hVM%?SFVsl
zYTT^8V}s|cB)l-GLaYZ;5u9nOv1SO^kW$B^8jUFJlGpw9rjb+4jgApr%i3`R``zf2bZxgf9ffPh+HuK)dFfrbSY?%BesP}({>0P@@d4#3
zA93m5yMPN|)o*tG%XM!}?K8ER8~xr4L*OyniM;FbsIV
z&%S1?{)@VSziHj8qNlg#wHqtZh?`m1angE3YLE?Yy%^d)z$&w6c^P&*R5mVqwRS?*
zm#hv@u8OK^B>v6FnSQfc%q_f1HsW?1kv^q0Y>ak^NgXM-HW|qBSHk&c*5{iI8hiI`x?^4j
z5DCtQy(UG7mcy?6;@QY%n7z?h`EYtH`9dnCUEgT0GJe9VR|u+?b_SMcuVM40D5>r2
z;bXLH817oMA&yBgS@=DKKVb=`Xo_hK9&iW$ZF2U9)NMHBv{7I9mYIZM*Vr-eIG>HiiKv
zfRK-QeDGe+aCmg{-U8!{Cd=t6D_siNT;?HCy1roxj_f*CNct5%r7f<{
zMa~w}4ydS&iI-QTCyTFy;K%Cj*7smy^WiN9B^%(v>fLv*^`X|PU02e5-pZ^WuSSV!
z6i%zbvVxc=^27_11q34cZYV5=DCDmXv1qg8k3{cYP*Te^E{&?qjfokVpk%15wHraF
zUYwDlw13FMqn$48fy_UnSAo6sqVdZDUU-KBbjpKd(uJ7i;7Tzuv7LLd?z#;n2Jpyq
zvSkST*7y&(V(Ix2g+c^gr@KZPGvWd}^FNCi(xWMziG--yJ&llSZNA;%_m%I6q0=PB
z6-U;c`h=T(@fx`KW{)n|{O}(FZbPPdZhg91xzP(3@5wzRo6CB#x0jv*kll}mU?Af1
zTxb2;$it+p6FJRN!l8o4j~zao>gc1IFG|%i4@*Itvu*0QS^G0|DULnZ#QYZ$#T2qJ
zPEbFRF#!z@@_?G=&vEQig8+0s_cOeCdy8@AUr649#40l)ej*`J1#i&7Z4``U;^Hxj
zA~klv0=eh+6HHoa+gC2hXrt<-w4Ep!&BI70<_EZ<9#X27c64TQ$lzEsdq`a3T^o0p
zQiI62uWUTVhwG>3Aeq5?-L{;Dd*hZorH4X;Pw*Fq(IsQmZ=WgxF0eBU%GK4~42Z5CwglMI0uz^KG+nQ663Ho8K3k
z-Kwh0(>tj*b6mRIhu?A$#sbG1$Lh%k)3-X?D#gY{^tAn}JF`F0k0iy5KUi3LDy}u%GHpcrzjl0J
zWA@V4zL>4jXTX$!(bcE8c)E(8cS1S8*t$=u%WjolW
zjk3{W^UEgQ0915P^&CJq*yV`jm5ssu+@|S9v9D1$#}>h?8hlF>43!$H_tQ4?~TGi#2p6B&4c67&$b0gNU>sR#LafBSvDo-rP$ZhyQF`3GE(3*v
z`55u?;jGM)r6?n(Z~@@~i5oTGYgxd8@aAZ-LG96#3V^C+mhc=~Kv8lXLuL$%fnX1c
zeIg7M9Kkv6rW)H1B?rA5tw*a0b)S##o~M3xTtv~jF&B!9;uq4c#uu7crOhf|5m{F?
z05$z@0CVCQs{Vfh=Jz^n;+?Ok15YUZJ7J*m!>%arB`@q``F9i5ugeJ84cZJVL@diL
z=W9vAerQs8Pv7Qu-2^za%k4^fvQ^=Hlw%^}Wa%=JbbQkc``2cGV0`I^{2|wvZOin%
zkS!1;%GL-w{OS~Y8S-?KrB!3+AAbjsQ^aQ=`)-fieIa0eM4a{Rt3%42TF^n4zEjZZ
zBuxXfB#;6GTGQQ8QmT|u;ba8Ogs!gX1M_Ta}WlajN#%P5HT)>MuZ>@
zK;F$1|HK7?{D0j583;EhaG|;|x;1~X5^x&Qi$~u2l!O9%#c0(Y38kVOr@dCc?0+t!
z{pX2iQab-3&tCi&t#-DR@%LcM`2Rfl%$E*bts@gvVLnhT1t1~-Q(B!hvS!Bg^oUk7
zf+OOjLyH|n2hWWa=0~$c{oczp{p4dA)MX-G`Ell@+?BuAxGd*0Vf@u?1XvLC1O8Zl
z^k;n+dnm~Uza3Q<%L)K8|JyeJ;YQx?@#Qe&4qHTGf=U$aHfK>cKA(uLJQg{2+};+6
zj5ZtCG4oBcU7kfXG~OFZ&)j7ph2>lJ_lGeWRG$2*N&6w
zO{}9tvu}#Kb4+SWlm%8ib-*25(HC2&SQjy?CTfUZ>6cbWMAh0+v+ZAhx&tJr-vc
ziRb@PANRaDuKRzKUV61SixPW2#maJ8_pj=XN{YK=++ho4&YRmzrZ_bXp501!pzsfjnlhQU@~$w?
z-XoQ}UKMB-lm4N7uFb8Z)y4-OQ*?renYfHG)<|n+zNYtmS4!!yCh5lG%RoEUr6IUm
zf7|=CazoeJ)Ti3~%{9A#*Pn=ASN+;Op=;6!Z}45e==FVXd^>{t0&i}QUp9g1PakDu
z@2c(X%StziCOp80uvdgIj!j>+YtBn7Vc~d6h~H#&n$zk8h!Sg=|1>ZkZLddD@TE7z
z?V=w{W0oK|b~ogsl*x?v&k@#^)0s5_9LxksSVyt0`p;y#MWH{vfQjDosxvkFu}<0Q
z*#G21;-(=ZTy4eA3@OsmN2;sdZXXl5b}e#`1#x-Kxt(gIg}7l9U;QY
z!b#b*90^(cbfWIsL5LvU`Q@uFZokJVcc%})TlC`YdGb*##kpyIJ->_z)uoWvZjRr~
z^c$R%@h$t+r9yS<`CRD&nF>*ep&xR$N@#^@h*Tiq;(DKQd6H|W4zl8RK75GZs@gaA
z8&(&{(c^m`>bvc}$8oMjXAMZP+{Hw(Lx#z_L&4q+qqG-N5qf~
zU-g?+^L^m#O`gXd%}<w9(=DWAhjCGw^lyJYfb4kpk;TE-h3
z`_)S8%8mA`#cF(0U4b|W`AB-9f^NK-e8j5DT_vGBr|!hkHYn`&QKelhwBU9J!Eg%&Fv0S+MML~vC$0}VSfIXEH4{czc+ow_`-M7C%Cw8t-_q2Qibz3
z;1iwmoz1u=rESWFml|KYWQ^K;+}f-vO!NBnp>*m`e(u&^s8$%jz$qJyW3#3ixw-xM
zS`PkLwkvvh*t$(rcQ!*%m_2}d?p<|MHT@iLWd
zKcou|aSKOvqn5Odl8;l&-W;`~kSCpy9e>Z`<}BU8=@FZ>vAcE=)oxKvWvv9O<26*j
zK`+vEUjHQimeZ5OKFIZymU`3d{#FFADII21o}vO`1S2mjI%PKSwd}lHApYSN=$|tV
z~bh$mlJ-RY-|Jqo66)bhec`;t}6=rQC48RCXie_lDA$
zG%4NNWnPIo#htDdD4lXDT>>Io0R?O%*_8~7iFfU-jVio+G;*DaKUrozWs7$8%dOyV
z85#GCG~7P}0ApNe!jQcg)Am8`Q6A~x!-vCSRx_|;
zh7R&vBrR^Efe%69`kCTdSWi0vwdlNZ+m`6N`c(_;5XLw*0Pav-6?KSVYQ8t>O=JHh
z+jqWu9*O-@%Yzi%i`k1xaL4^(O;qUg(>?W?rD@ovlo|RI82G`CbeL#W^(QA;@cjUx
zZ@dtid+TIa3HfEO<-$yQ-Ak^$^(=a;y)lR6Ce~g{xI-DuQBI-bw<*l$IGWbY&{1tW
zgkaq)Npgy&wFdL@^%tTWK%$9G7`jCOK}*GBZteX5)fUJVV0pe+2GGNLY;3F^woYz`mct5f+W70Q#VM>{?kCVt`K$!2COoEws&HTybQ<<+(HZ3ieuA+
zl_F{H7VCOMH{76L?*m%z@y$rDNL!s)Xpr#(XUj)2(Rg;K#yH2?WZcTHsSVD0;%4AJ_lS83A(pRnmXRLwE7hM&Air8uin)H
z!koMd1S0u+&At;zyq>Tn!k@p#ps1}JfEI%Djrfz1@0}2FT}F1T{$vd+gqKGqA{{c3
z$X8ytlGD1C9cJI9=tccT$6_mFm@qM7znA~DiJ-v4Gyi?&x^4RM)Q@TlOGZwKDAsD*
zeg+c06!!X2c$E>K?dsVUxIdec&=-!OaMtF)^s~PP6qe5ODfw=iSTr~cX*XE)+$NPH
zMXL9cNjERcodwylv&{V{^pq^952M8n@W6_YC#HMs^=TIhyBWOKpRp^!A3dJvJE36M
zE)7Z>7`22CL$jOC)s+J#x%%Ojs&$2o!yC*?D$?0va6yDIfTK_!B^P!5{M+Q&jf*{1
zPK(ct;Lbm?n3RYZ@{!`1nwkR-%)C4?tCqKC*r1_hGxX==G^JD$#Fn>tPoqCcO!G8F
zLUt-lH`k(1i%6wsK<0<#sZE-128&FBJy(Z*Ojp|_Y#wzOU4q@12HsnHXNyB1ti-@G
z#GYNrE7h1=Nqjd=WUnuf!gnn@f#cyKO>2yM8wKrHNI{G{c1J}?1HXuAU1p3R%;J41
zO8TLhq>6vXhp`|(1kb56<#0b7<=8l(a#>RdqcC%ulGL
zGm_;I4>#BOzwAk?08qJq?$O@*50CV?THj>gT&On4Vw0qPG&wsR=pgX7w(c|D#rvlb
z$)KW=_jn^^{CH!wSJ^XO!Iq|s7JVb`pHQEX5P;WN$OqcWbBnJkEI7n^X^($w4I;{0
zQ8-H)m~i~3x-;&^JEN+|(I8}`!qs8cY^+gpw-!66G+oyvSO>ZNs}le6UPc2D6$l)y
z24|wEF%^j&&97wz7%`IwJItzXwM5*qL<*2)b{7|_Gtuj4{GVmOf6H9mG^jo2X=amc
zD;`_zJCk(HVp>l>ACOVOlKWFlO^f1-+qK<)CCs7(IF;60>DrD61i8l*?Q|obx~XwE
zFX5<|GF-ZFHYIql-x_0gF|
zxe()#x-U1&eMyg*zMK1E1QH&19sT
z(%4#N$j1y$|NZ`-10O(aMuH_lZ|gGf+G(;S)Qv0szl9;S^rYS9Uo4egNbtm=uR7&Z
zC;6I0f}zI)RwplP7|_!rLRqawtz&XHi@4s~>_D^0%jW>VR_gMO*qQ9av9~+(ag;yYiX~kye(;Yp^Q6wVpPzw6*@DRTb)PPRxX1^eG^cW2WJC8H&
zT{S(}Z$6nvs(BcgEGgN7v0*PH8+Xc{x>%c3;{DYLU!1;@0j{*z#hF`48@!MGnMRvb
zQBhGBxNs%c$eL5_sN&kXR2~$Jc*Iv57V>mob*_ov{pM*Mlh_Kb7AhAbxEZWm{ijxK
z+z6Ur7DIKnId6^TZ*0Ovt{Q*PyZ)$6<3}^58)rNf>s<4gWw)X;k?EJS-+Z`zCDC6=
z{MgTP+0=?amg)1fg51k-ThSfp;R}mofK0q@?C31f;#_pJ@wRZW`aY)CsR^CD5Mbi5ZO>Rg*|~{MUspX8Pr~j
z4A~d?VSi@X`gVk!1#eyC0|p(D;<9p{$B@6%w*Mn{=W6&wHG-Hn4kI*srMATNK4<&_@N?D=*7fyIUAnDI{3N%>)Eykno}Ag!l9CBxYx?H$
zvgdFbiH54=R7OPQO8=nP=4@D4nC4|?^qlnIZCYB9JbJ-mifWBH+p!mNinS|sjJyup
z!m^iyn?+BbL_|3Qe$s3cWqf6FEwrwTR%ONzk^BsoUYMPf_pGD8{^R12CpbnN6`UT=4q`C(2c
zH(+eke2NSkERkIAg9)YZ#e|IYOM|~1u8A<7Xh;#)O@ADjT>`PCybm()io@9Gk_@q_
zKk$YAyRMCSn#PWW9zcM7Ad;N2kV6S8Ge5m>G2A#VK)H|
zvN{C@&i%wlt=A|HW6To!?31_?e0JXCEXIrcSf6n5HE|VuOOM0dZ)Eb~mLupG^A8S75vW6s{
z+E$y{;qCO~2A&LvX$zAp1@8ST
zADz{``;#CQX#I)G5fJhLFh`&ytch}rxFy#K!!88uQEDQ_Wa(%UsMBlbcwh~tDBJj#
zEPUe>wZK1SdIkq|E67SB7}TvY`O+@5!VX+*Wxi$k!hmo&7`!W_R(xYNhe+G}M{&gM
zzC>!2^p@k`u=neY7#pcPBY+frTCJSZAM*npym2vYpW$TsGKWFIM{!5k(f;r8PBmpl
z!~ezHdq*|ZybGgIcoCFl7pV$}ih}eegrZad=>h^G(t8P=fTCFFy@S#_NbgY)0@6ze
zJ!0s+B|z%k(f4=GS>OHV-nG6z&R*=zWcJ>(XP$Xx=IJxvpi;4OqpBQq*d6P)oCWw4
zZX^+WJqm9HwY$H{swCf@WaOQbb}$VyyX3DQS7dJ-
zmq0K9C*3vvm`DkfTM2g4NX^I-$m=_{a}Uy|c}3g=PfGxErK3X3hK^fGSF
znw9EmT(;0&M8b0XI&tPA%pW1yn7FR^Yf?7AXEE|=SJv6Ky=B&NC=-k{c>PY{dvV7q
zo;7W7TQw;I3Ly&~o6vG`qeab~rzL$Kk}C?WFOfMt{%Z!@MLLt+P1T3Oolc!9)!H6Y
z;ye1ZmHB@8OUds~FIN3;=*6B(K
zdOT>xccJCg@ySa+p#Aj@U$jsh5d59)uq}Zj;UjUVoj}TyZb~cjmW`TeQcnm^O}f`S
zcjar6TY?V4BcJZaRSpTmTAXqXVJ2Vl5001W#DMm%@HNbre15y=a_yuNNnYY%eUc@#
zM}I&`|CmssaAbES8iQ|Aa>|cxqASY1I
z_r5fpR6TX0Lcf#{)GL!5?MS3$M0HFR#rBEfPJky
z%n=0^f(ZO+&yTa5qzA%LBD<^P;}3M)dUTwT5$IV&k&Qf+rr;p>37R|OAzetNU(I&-
zc5TSGngncRYvowQ!SPi@?1057z>3%VeQ9Yz>`0&rqmj`Fe_kf?)T6zTW0olb+H7Var*29t1B#9
zu>9>do+C6vX+byf*>uqe2X(P_eW>Ya)b8F*Cwje*wLeCB3!P_QJTnLoEo1N>sFKk&
zEuBugZfzq*ydtM-y3rXiJnwh%+ZGyDYWZ7*@_ncBD|z6y=8@F$=5o=rjp%@>jZ*Oq
z?Mj!$02+A{1~%#T?<=NY|GwnwTMEOtM{egp3-TcP(x~wX6DB}h$Krh%kNtVA*M0$B
zKDd_2I9&11jn7ys#=i(Zm~B3{+KA_sU_{LI(FUJ7wj^i0Tw1<75xi*>i4BoEMVqFX
zF8)uB@_7C<_vshUmT2P5PMeEtw$uJdCuM0rW8^Y(qKPX}O*%O}{&nO{W2peRlz#*$W5wl)MAi(`@UVuoPpCQ%s$c~wW;!SP;e-}N97e+2
zhsPc})k$AkaO$|X`>wuWb@zL@Q=qtoYhRl$U>m>Z4S+_&(?B2@n{3%K(iu95GUx5;
zSB^IxRcNGH=T!g;&!-;uNsGVwx;M3gQ_-C6F8ie|X9Mv!_eYpT?=BP=
zEmZQ~4N}~%5cE2Ynbgh{M$F!T1Ak9|)X&*Jj{chizxh2izwcV!y(af0ys}@@Ppf_d
zptNg!fc8zc9nH`DI=KBFHhOhsDa*Eu>)p4%cI1*;7{M;)j{;SG!uQnD8W+%11FbFfJ@AxGO
zP^Q_zXhUMF0OxCVpLh1-ofbwKH{8$G
zUENa+OEJq=)8%EcZ7XW9q&X=fuoTG-*>tV$=AepwF@l0?sptAI{qL6if%HEW=F)jq
zeV@2o!YxH&4!L{i#rJlMLxxMp(b_6*lShpawa8gZ-n!&R%wZab`bupo8cDZDntK5wt
z?eja>H#H(25&W>xcIO*H<2|pZ2Sg8rd^l76axbxIxuCt$zBgm`7IMxPt=az2Vw(Ox
z)Ysu!Zt37qF^n)~ov8`<*N$?W-XT;y2`3>mmK;$I9%d)g4YjKlZM6rT)d_!qZfecO
zJ+``1w=AGxlv#A{MRq|Tq02B>zzp~Y2ucrhw;Jj|$K#}^)PS_ZX&;~iG{inf
zw2>WA#ictwt1OoQEMS42iCA0Cs$_*qG*(pIb|$($G-NikW?Dl`&0-KF%t7-;DRH2#
z5TYUZmTk1OrU_f?;_$q0=Rw{5`ay6RT7yBUM_*}}D=b~Xz}Mjmo#HbWPscZ0E}qP<
zphs)oEGh>N@5=4i1&trnqOL5yvZZOx;>&`KtL_K3e8S;W;PLB*|5VOY>8zQvH~|Y&
zIcBZ8IomWN-gci5JYLu*o$jjDu953MpiAbq)rh;Lm10LZd5X!gHDV>mdqJN2W*FkZ
zbkcp^!9gv2ZQ-UBLspwt+v%y
z*`AU3Epl?zCn>*4ba&c^?O;k=&9%^cqxc-VXaCn?%Q3hn#@Gk
zN>M1yflp8!%(%J!c?r4U&Ys0=QpNqsfZ*pUB7TpU0^&8OSXVeF_QFwjyq(_1D$q%U
z-n&gqwQ$PVSW4+oT=SQ@HDyqOygGrnEx>zcOz?rMvn&KzP(C+<7
z3->cIE)T<>RI(Th9^J)pnw7_QYgV+7IHT{df9(B*rddg>oZmUb?YrMC9XadQ~#j!Zq;_**ynh)!8e%ip=s&Ju@<)~~_@l3FXsqT@_jt^ej
zWo$jWOyp}aYVSa1>xuB`Svj%o2F@Ul&K?U!BGcNCu=d0Kw@zi$QRM*#2=LgYDGN(B
z<$9d+eGqiT6PU%x_|tRoH|C%e~5jE=O6Zyu?k
zZy_zR1zd(x+<*C6AMF&aNFd+UO|i?|MSt64aEVth?{2WKbi&Srr6!x%xU^bE0iMv~
zxhg}rK9%TeUl5MSlGfHI67vsKL?EfgyNmJnNzX@h*^OEuIfGkzRxU8!{5I`ya{Xj#
z&Yk7u(%@UB3zf-`&Ot+qvh7oZ!Ikc&73UVqyuaqVs^U9xtAV;B5Auk4H}%qe8d}#o
z`=r;Fk6Hn*3%3D5aV__+`p;4(C#c`Tde5z&>pZ1%wAWoX-Rd1#??ie^MZ=)e&?)1U
zS1=v_HELYHbY_A5`UATUlzZvOiV-*~(g8WBYoO1r6Ba-3N(Ruyf%qvOqu_c^A|^s2
z0iXe2ZldO$w2_t1?rx#BJKyG&eKK1gZwmKznJUXP6))9W5%^g$X-E6xu-HgJ?OH9<$~
zkyWwTwKpufemyT8b$|^B{FZ1(`{X!X8b_07;gYSeKGKpcTqAQAulmm6?opq68QGs#
z%_D;zp}%c}jXi5^>&BU#Gf+G$3b*)YOtm+z=m?|;bt`O`F`2OGQw@Yt7R@nBQAT*nTWgn=Lfy@pE*CYYUh9kDu<
zhwL&*1M=17CPf#utJ1N%Mx%Qd3yU2GphW0n3Cam6pQ=Rj-8y>tVF011B#zJg^pCdO
z8okNkGvdnj*>U8&ZyTvvA)G_cbmqLM5j;pEPiuT?T>>D{L7<1{hbE|a>XgX9a+{TfL3)j&jd-)6c3!9pdE?pGrO-
z-S&Qbw^aoe`>)(yO=g>lkqL`Xoe(5=u8c6O`A0_+?_6x2He#xb
z47YNgW7z%ihA-R8W?gt}7T!ByAJ~+csvHV5nCKDFdU6A>=K(y?cY2GL-5_-(4P{2j
zGxh%a;m3s%?5_TpA|34K`0*PurX|I?5Q9WU0|WIl*pfhGZ0(tq!CsL_p2UZ(&)`AD
z+jVE;%qFJjfeAkEN4>Y3Bd5@P>)cK4oZ?)=YK=e7*M;6?0>7|c9y
zg+m&PCqra1C32oVf=J#w(hT{aI+^(RigCi@+i@?>87P!eR|!Ct9Op`3n4M2H8JU2Z
z4rfDDbaKYa4Qg{PU#2dX$An*|yQw3uL;v}W{Ih@PRR?#Xdl}+oMLf4>Wqi!FIs9HN
zYi+M&;hS!xwt9Lj*RjyOk2N2sKj%*c+Re7&K}*I7T|m8mr~(6se`XmQP+?In&7lbA
zeRGqAkL2C+eAm_dJtt<`iSiGux+91__abgK&leYFrTKo3`8wwc`Y!G`{fb*nTbA5x
z?h7f6#o9=-9^76J9%;c8t7X3W@8g+@txT4LFR6)_4!a@kH7^R1~otc;fqzQg_xi
zONL*U#14;d7}R6d=QL134d367Y#Qn7=K)Ie-mjNbq&ssTBNminqH(Q>$=<)Q4#aDnEcjsV|KC>r-Qs_8&WjlV?BdnGd#9xr!0
zukB(Kcwq@0CF^45qP4Bfdq;v#f?I;`D6Q4fujOTNyu>|MBjAQulT;InH3aHE`xRa;
zvv7RT9Q$&%eo~sOFWb)JOiH&BC*R-4@Zst$AcUCyJ(^-|O1r|;uitf4*y=YHVQ(m4
z^}gAm3@fMkroymlv=r}p{NZAxj0mFA#8No$$H!$HYlTqU;mGgkp8+_vW~4V-i5Jg|Ch`6qMvw}#h|Sv&;Mxc6z>8Hv5$
zKj))4krFPb1Eg1_;+97>1QU6Po3`MwrrbeDO5}R^XAB+yiTf=>;)2NhgX(5t#>c1|
zvk4rN_r$XJiwhT@H^MjvAHhYlSp6QR3be1j^z;M69|pceIC}0qz6yu5mCWocTx6%@
z{xB7JGMi;Izik_AQtvd?W;>MS%u7^@!*0*bEPf7UY%W!a=7_W^9s|sKy3eqC4VwiV
zZ9D7MuW8E$V4Y^Ft^2m?;ZE`82igda>>`
zTSQ`=k>}DM;jF|!^-}y|MIz5b^UP-IasC4)2NM|${W>b_2JLM|JLYmxXV*$zWLceE
zHXtmcT}oTqDz1wmzDmvO+vcLgeTBFo8%aA)zT+!B+j9HU#HZM1o8kqoLp-v0U-GlPv7-}g@}
ze-T#d`Nc}KWK%16ZE1{q#@ug8Xx*YdNWbgFq=sMT{u6i1UHX|QgfMRM$fx{jq-1;0EVc^S4S#-3c|l{$Vtr*~xV#END)tXV
ziVP`t^w?%GC}+Ofw`wh(1COV`j{f-T6+3!(0u6TJp`w!MTp@pG&@YNY7OHM`mSV!vsj#7VFEV72{L3=AS#IIdV$7
zBaz%knzzY~J}Py$Tk3d=(E$ftDg)m$r45?M%i+;!3oC^Bc?($Sj9`|urA;aFBdsDR
zRqM^<&KYqHrbh#+VndH?@+2>^=QhQOYaGG#Tyv~u#auGavFB!4i&$8dT~*iM!6Xk#
z%HuHY78?;%Bpu6u>I`AKDDwadhY6pQv*%V+r#T;qZ^%4xL{=EMBp33^UiKUSrVkrz
z##B^fnq}O~lKuU=%|)#%F0`9i+l7vI($>Rl_FDV!q}bRm5fKqdfJ*^4tC&L`;HCli
zew1#r=f1MGwm;gQ8w8>;NqG%r$+~DpD?24eQbtE`v*9|zTzcjC+5ywe9T@8J6ts*9
z61Vl9ENP>80nS=0m+IH;zBnStvGRC5Kv(AR)M^8!vP9fAU%0cbM8dXhYc_a?r?7yd
zKV8P+2qn`CyZZXzb{;RG+?*LNOiWd_!HGon6ObBWWXx!zLnFSq?jDnnzSE%$hk3th
z`SY>zt~i?5t3d(lCrAi_E_=Or#R5s`50&lo&y^F@R_Pa4$KZtM_
z)f_#$w#1n?2Un@zk(2YV;OEig$4f@b5>(*Ni8A&CUe9qLu$L-VlY21pRE3$0nKZ%P
zjM&lx@75D>eU^1%+(KM%1xD46t)cwR?24}|Xu(vpMlcPV*e_xb9%~N(7a(kb$;iOo
zz8DBTR!9P`k==qE4#{fd_dx8{W&I%Usf@(yKUgXhYFvo^<)*N90_h0F=Undd
zS-H@ns-c5;-}EJ!p*HgRTE~#NpAdIlK^kr%H(vF;V5{_))KP70fkyK7W&g1PgZhf=
z66WL#Qki&}d9FaDhSwO%9C@zt*3o6pXrh{SF5Rf(!E$MloBav4-nnICUk5hwHv6I7
zJkj@Yrd728U;pa)(_O$c6#@YECIHwBK)%p@DsEXF9*lQ>Wpj86C}jC4>^>-DbI
zWlp-z5vc`Gocg56X2?cuZJM&ub8CePmp
z@>E$Iq+bhBj%~0KY*R`{HFK{);?`kNQu6BSzIxT#w3qlrLYxQH8F2JSt`p*M`e8qq
zWJpRH6v;h*k0GNc9VIsUjUkHM0spfe7I8x^T
zOJ%^03K*?4_F<09?2z%mAo23@Tjg8%!Gv631==h<7y|31OSl@&EcHRgi%v!fi&4Fq
zu{fEPJH#Ubna}#}LTV8}*g!zU;sYdYK&^itK)iu?~omM8LQZgN_ET=SIuvs;TvAMTfb(1IPvdQuWE=fH2>L
zv!U!aRr%mZ0r@a#T7w01d`=FaI4kaXMYiuO`RdgJC2~Jnpe+TkRt$r47>e0p&=q^Lge?
zj)%%a`;g9FT>G)9nb_RbUZ2>8e1MnM^szC
z%J~w2Pf+mm!eqbX3uIpOG94XDi@m_q;Psqf;=E}#v28`hN$VKTo;JPc^K1*g2NOt|Zit>0u!xe6
zeXx%=8*S*)4Vw5|WxzKDos6H|D{#nWzV}~a?XoKSKL^-Ksl`FLa+h?Z*y!UJ|D~>o
z@t-4yFri80U*k7L7U-3d3e7mHh~^pJS6U%t_tb672CLJIbH|
zAOoba(HOG7bE%fFLBo6n60O-KcjFm_ho*D4h}i;`WkC!0(Qop{))z*t8WQ>y_Rdwi
zv+06zCZr!XW93H;Gauxt?52xM3ON*f648~oyUkMkM@huh;SY#jR0aPo_t+GGbp#mp
ztN+b<>#{)qS`q^J|HJT*_Re449?1RQkfdXYN2jD~fxnGo+$A!hA;8b^6Za~L&EcOz
zeztp2@)n;8ZUY8&TgOcTF=@{5@$pq_3wP7}S3}%AI#DAh1%tatF=-U@X}RVJ(acj*Qx2V)<0yzlLk^#rB?Pld~E7%q4tiI
z3(?c!GT}f(kSYE`9OA(Dl~2FABq8zUDGzV>Jys<}hU>?&e=7i@Mors;r3pY2{+gm+VC$bSTUDu
zB8SFhYc#Hw}RGX)H@?x03vz0%oN98;9z^9I2~6CkML`+xFMMU*}I*{>K*JO)wEN
zXZ)R&wG~b#A9f!F59N0tgR{s1e0D=*e^I;%`by^S-e=wSrMnL8uyt4S_0p1MRgS;X
z{0q_bd~^}b@&x!Ok*9ptyNKjBbdO&IA`|8CVzAx)?d-14@2z+JAOW<&P^{d4Bt=hM
zx6jq8RpV|tZ%a2Q1dfQn{1BdbXa1}EXz%Py0H&jVkK_LiuBiCGAz3niYPVM6Y(H>D
zB!_G_%J(^B`TLrD&P(&tZ&*t9K8g+J5B>X%3zt1X
z_s(l|-<_Xo{jUda{yrPR+tG_t_quZi2gqP42bZ}}<*DZ^j);kV8&}=@A)kymW4S>Y
z^O@vbNq`?`#R0|vz!5V2LzZf?iypB)#ptA0Jmf>D7Tv#cS*zP%CE*ErLUF(e!}{kz
zAY{ib{R^X#{->HWf&sB-gWAyvPpmw}OSb$il>jd|%JDRwrv7XsrJ+IV$X
zL<5TSD?r42p-kZ?8{M(4YU$oGhV7hwIwJRguwquy)+s<`Ch9SPJk13>_m9&ycB=OX
zL(}vxkQ<(0A=J)Yy63l3@44LGfIMX%-#to$XFUjlKQHLGqir{OIhpsN0I-yYk$^yU
zSBO;h+uxo$qQb8PHTI}}KfWQMItyJ{URIAq_9N&9`RvlM=2EUsK^N~laiON
zb}p#!L#sHVQ@uQ>4tjAx>xZGDBt0^CC=?J(T{Nd^lvX&$8*e|*=BFlW7=sHOu+mQP
zwlymliDEOgT+HJa@Kl!Zn9hU%it0_eiN?s^j{<hvb1>WVrtqrQ>toY&W_iMzDSd
zW$$BEdL?I82F99&telcG{eaN!=gr^7+C*eHk^qJLE@0Eduf|)x^&S@IHNXm%R;eG*
zS944^(94d5nlgnr3*uuOT%fk`@e$0Db_V$}l%5gmYRmHD~jSl5BCN
ztXC260|kgu&@F1
zncbxU_WtjYM}m{JK>PwAr2%n6kNTf!bcqaQO?H5D&Lr+!1Vkb)a*^g5qJV!ynQ4r_
zsDHnmEr5kt<2EPnOMu87gd7+XFHW}Cro8H`VKm!P`nn4c#iI-eWyf;I5U5JA;BvQk
zl(*Ai!7*b}a8dsl6mCf<>|Q$zm8df&eYwj@tZ%1rgKW!vsr$%R72yN(y8ITJ88CK#
zDf_7)0aNi7{<6h0&Fv9%$Z@6A
zcom4R%fS%m9^vu?aUjb%pkc
zR9wUORYN~rZA@-w4uC1nOxUHdAWf3`tlIF{-sra%SX|a%<*@BGx_dsIy>K5Kb~u0
zyI)(A<@RiZn{pfT9jFuN#k(zQ+Gi7=T@EQu-1276{%&^zq!mB0d;|Vb4rbl|K`#DZ
zO)?NTfb!+9$qq}oVzK?QR6J5~=Et2SO-3iOw)J1^pUDl6xL&1~8{fNp6`0-lK;su1$WbScG(nT++kN&~HOnnv
z^BmfiYI(h;0_aR<&L+Xb<0VRrPsJP)Mxk+i3p}_?j8jezPIsW5+3wivIM(|1e908I
zzW40nCyu7qcGi~kl7MR+dHx_DZBDMj0Nwf4OrO@ojB(v^c&)PNK;ZU=prbdZhy4G7
zLC2KqdVR>44KNQ{84V4d(};FB`>6Ap+w|FBGt13Cl~KQ82azgzuTU6#H}fbZu&X|y
z^QMZ`zU)S%)ulMVfH34+kv5luj3{P|>@5q;y}A;+E?e?9Cp>v2_N?r6?n1)*Pj`gf
zqlKEaa_Tzz4S_YLs{I*T0o1`@~yYwq`}Ha&TdVb#q3qhPXUxsR&@b
zZBzQJoKCPr`rGwlCq2KE7hIyJDSHGkC6#^|5)&ui`=8(Ow)nxQD~QtM?Wqa8a8MT
zpRQ=04N`Oz!ME9D{Zm6h0Aj9sbatJKfl`BtAKYmSpi<7h%KlBqAIj!7(bYyWkCtgx
zQD`EKST4e+rsDFlolqQ}w^`Up%E(w+$=rWy#QLnjpLTQUcx$4*nP&GLnsZF4^4|EH
zy8MZbo}-Bb>2niF>tBqntpA?jtkDq`6=0svC|k>&DFXHMws`K{*da(-qAvW0!5
zV#D00ZS2o1o6%}j-&<ExB-o?0FGd}SyD=CeS&or~P|KPOp^zsp5btYu+?wy{*2zE
zEUUmJ#XCC&aEcQ@Jafup{Z8R^_~^y+Dp69H
z1U9?Di%Cc0Cu#>WeaDA>^B8b2uJ{11+Cn}zr1GTY;C@iM>JW|GEhrRC{M9sL+;
zk=w*{r-QE9yUtE-ln1&40cZPxRT^m?pjnvV@#zA?Yj&w+z_M@zP?y*^+NoLc6Do$>
z0RRN5oyu{560WFpCUy3@%1TiDSx~;d=A$9;F>qySx-kNHjGW;hpP8!^@b}Y)pHxZfMLm;$;kW`
zg8#un0cw^j5O8)~2lh}n!RkT%KCuYBeDp4QPj7+momP&BL^OwQ?HxkigQuvK=i-Bv
za&Klsr!PTuSJ{X^E`9=2n=Mij>UEyl1fYktT+3*_<-#MpuLznu)x2uz3cu=jm@;w)
z^YNFMAU^YhyH%yc(OfWWdC0Ht2dh>TYd~8nc;&t)ig%EunPiqRbJ%)AkD(#$KU%@F)h?vf$c2x`RUja}CO6u^-q4keAZhQ7q5ATk1K~M&GMLqoV*+DAc$Nn6s|JnSNe#xPaZT
zi06vn&l0MlrUngNW8s^KxtkUAhR1)?yq{VtpOlBj_}I#8toabz=vQgUZ=yGt^0I%v
z&f~$Xj&N^J6$571`KA(pLF(N4v$oygP^Q#JgA!Nj12T)UlH|I*%d1Q**Q{E9L1>qK
zdX|s&LWRT9-V$+09$NG#TY7+qco=J^dU-siRBrZbfFGm64iggGRtW}i$=(A%5GM+R
z?Ajlmn7dNBb*Fl{ru?8>P|*KR|HgC<+Q62pxF@ZS^H!7LHCaA%qaz-A
zvXpGV;nQ&Pl|U6Tt_aWx952Fb{Lug-Jld6Nn`I1b0W{twfakR$M%S9gEt*5NEW`Dl
z(~&d>;NR6Tfb-MpmU8ub)wbxvFYCRzzhvJcCmb@#4C=f%6aMM+AB7E2vpDCm0!?>W
z!x_0L&9tJTB30WgzXHJpo7Ue_7N(dsId2HyT<|vi>l!SuNjz!J1-+pP%DWD@AvEBa
zax(_gY-VSm0B#-90cAn`Rx*9o>&n{=f&CsXYDwPU?Xd8P`1q$*(^t}8^DNu~`ND8K&bO}2m
z0rc@m{uzTk%58QAJ-zs^1m>wLrLmfzT}lMfzsFnsFw|dR0r1;5^gq%#fO!0WC7El`
z%1i#ZgFGbWVq)3eKW$9F?t$pXzy2+WEALqI=D+E;m;U<$|NoM1)tbE$YE%FE2gpw!
z@PR7s4ATb;OYx#^^YLMc9v&U2KSGNy`dsiQ@m4(cX>58=y=BZEWyAQ{@xX4B+WS<$
zrWJ=DoXOnwyL#zIyQ_jiV*sU%TwVpe_PlER+&-*{&Mvjpqi9Qm&XbnW0wxfM%qsz^
z;HPGA9A*icw^Ei7+5y|tUYwq%G>A5zW3*tyL`)=3RNcn)5Kl?U=4nEsh8z)@F#b#&
z@X>6mguI7e|BEonuEJ2{T=KWgkR_=s`mJWUuN(+X)@f`9&{8MaXRY_Wz%%131T)KR
zDq!c7I1wtzq+h~MYRsI^)LX7I0B?pobw@VckI}2#^-PEmDe`SOn=^4nt6Q?|!p2EU
z$HWvMkShW7!q;c5_}eX53t%(N1mad;?)SDKEpP
z8GBW}N;W3e(m!Di3Mep_B?fiP1U(G7;Qg){`L-t38gc#!h&|t;tPhlWtpoK+d3Y{_
zvH+>wrY^ta#UZ=9ns7{$vg?Ob`GlpBZ~XJM1FV6~zzi~Nbyx^TOlznVFK67~X=Pl9f|emyTP-;P|4_7N
z-;Rq=^xUM8MD`f(lK+S|L9M%;@3c^A@fXf1^t~AbhzNUtn9zGE%fr87#(8Iw6|@kCsLfYrwbhu~
z8n5;QLpa2zV)aSwkfZMo!v*iXx2JOp-g`wB8+v8x>rP9W8f%*R>$WsQRbXACu7cKV
z;_8(HB>9hTzwmLA61U}GX6i(F&jS=vYG;TTJ)h}cQHYj1*{wXB-egK}pS&%|L^WQ#
za$Z&wm}U^Iex3%5yy@c3*FA5qO@xa-@cC>%-|F`q)6wk>YjcavQ|Ow3qGhrzt%1=
zzstTPtpeVAq$m~z{Y`fns+*#FBP8;mBAV;ymPM0c`vZzHL}63s`z0AviW7oP1PpB9
zps%G|Fzvlr&goNGxqm!wwz0H1RW^rm)h`ggrO$65$&%`!zpm*VPQ>c28I5@zg+Cs2
ztN{}1Re>Oz5z
zpELGMGrsF);bE!0cpsnB;)mF*!2A0pE+q#of+Lo%03~fA+={_Dcf%klHI>D)tqL%c
ztGpNIuAJD0@L4Y9=W{?k7TRXL^btUTL>vH0{;9z3pTzr^B9jkfgubn@6^V$~&Bg`HW6k
zK0(x9C0wpanS^IN3hfPCN*gg*e1v@bSYacURe3o=NGs?2tM8ZKixD3m?(x!AWT9m5
zPBm%XPuoP`tjQBt23CDPsW;B3iqWk5tchO(-q%ALxR*_~trU#U=7^WBJhz`9;7!JI
zdd(9zXP0}09M*Ln60xImf>)$`vQdMLH+B=ghHkXElIlVi!(iL=zx31S0*_9%`Uiq7
zR{BqnsKnqcuF|@~2zDS$83gZ$0nuHPdYNaRm1(vB&B4sh4Aj&FG0B7i$b`PkuB?2f
zq4OY&RiZYsaDKOS;g)}TEtp!%wjS@?2PscWji8Af81H`~qN&BtDpuHQFD523_Da;w
zslpL)Z8t{FOyj8Tn}*z9TPkI|pB5sj+x6_pe;8M=(voY3c^xm&+d<
zke}MRtCP7`Dsn-Z!~&Ddr3Y4PojjF
zNO!THtI0QFi8+n~unwWO9r&qr9jX~B8GzU6F5UG6hAz9{24BaH`#<>-F1s6HapHh4
zkg~#BEGwb;OCAHT0ZOcetZ=@v>BLS|wZ4*b9l`u;jvU+v+}&5zT)=TMm%ZLt%rm<@r2zpIXR4n+>D
zMv4M9lM#LyF0w0Abk^i#-1@>wH5y>G>H*RlFvwi%6NKp}3z#LOrWU_$qS7oij3tx;
zBm_X_hPO~aUeMV1tXvpfNqNJ$6H;D15ZX19dFDQnoma0c$OFo))`gF@I(a~Muud>@
z;e2?Pvmx!Ynwqpeo=WY=s&D|`+U;3X3ZOSs`TbVK5YlP<`~5USI&{4Ker|lG2()g#
zm5^@a6*l-l5Vr5ppWR?fSdZu-=>_K}b27|(&ZITIF5`y#ULKV8i16!_Wb)IQeM5RL
zY18Y|?dOr1(1YyUFpo`2Kpd=ZIFxAAs!UM5sH9SbQ4OY1TRvB~77E}?R)C9-EPmkY
z^4!sUq~CKmhi92ot&-2$yBE~y04vGS1nlLqlTlh3t@aBC^Q>^;A(ZPd`@a(LrGNQ>
zg-LLT`<|@gaoI7!)85(egt(Mlu2D3-aPTHtJL{wBIRi8+YsW
zxQ}v65kyZ`St=<;2LP&PfPH)Qu3CXUIR94^KMO#N)gcrgc@>$@z>n9KjLf|Uhgob8
zC4#@FgMsVK1y{BOcjjv>@NnkIz86zryyQdpWb@=4r#vw+tdtfw^4&q$^xp6+p+4Tdb4SPB
z-Tj?&S63I1rhC*@^#x4(3HLS7~}vgXcp&uE*=}
z^*dpDgkBm`2#z1F-*l*cWrVVOrQA?I=+n0)_qAQ7eFn7
zlFRLqQvk=>huWDuPv>PASf4YGuKr^Y`{w2NaOZ#!c+G@Ebl_2Ic`82K;vN3UXXKo8h
zQJr0c0c7sJXXPg5I|D1z&UnF3tL=Im1(QyLCas8n>0RHxon50iX|L7Kh*Bd*AZ&2l
zO~-MUnR-ojX|EVVoCRPVtW6+^IO`OntY}XI1marwA9`B8e|a$7G>Den_L@B)<{#$F
zyO<ihp_B`tZEq>m>tSu~8emZa
z*l%Qx5;<^#uKW*AVPuXseO7w*_l_^qv{<=C@Azo90uqd&;PtPHz1duoO~c014ag7e
z+r-t4?6L>q{`A{>bZ-FX2u(k3el0kCN*RMQyHUO1hg)=mI
zYzHkPC0y{0wAWVRn2th6V2-K3Rc!;->IaX$)Go?cErAuuN^G9S7HjJbTjS^AUtqe0
zO0&d_eE<&qHEm13EK>pXX8S6D91V^}{JT%+psWt(1jiiRAsUUK20?6c|6Nd~NS
z3Ko+p5Zf&$p$HQkKJ^Zw@TW$=B14~uSZ2%B*$0izGxZZT?{4j%wyUp%$s~Oi@MG@Y
zV0vbGHX?z$Sl&=c^?z31Bk#@WUK`pq1G5L;
zCif=~6<)OB^W#5bS3fGQRk!N~^UBFd{0hu@+B`i0l6@sZsL*5%7;8d0##I~^3ETzt
zKL6xc6S#?%7m^PSO_dcP#m9bQxc!7Sz(ujfy*cn$1R~3$#R=*mc
zQ!MhafNlQx@6djS=yZpL%DlU>#`R9AN%u`}*^>q3XRm?|e;;!S;D%%KUOS(;e$+TZ
zVVAby!7wEU
zShTAQLG&LF4^Q0{9G+blFHY4+z7b{YvCKNU7#n-)xzyNdZ0tH};^Q6Wjo=SfNo5kF
z1|t09>tNzy9<^gJ*Q%^XXRiUV0vU8PcNOW|9m#6jEYN1rdsg511EX~tns758GKRW`T+eek9n*Nlxa2~TgrP@vMm4=q|TE8$a%}&%xC+CJ~$fMiYFFgiv_a4
zOq{@gA6RBGG@3F$(cYEem>#JGa6z#LS?_GxbwT`=>C#l8IV>ejMn*5LS@xhWk6i+H
z%xhb()0gdCaU>M)PTVj#-NBz&2?OGJn6tMOZ0um%bE9|6gTWI|D+EFSpT}Bb{<70k
z+({uX=xCEdXwAqQ;k;a5j1$q`x9>&n(Pq|H%jg!W-C*njg5>4J6b-W?ylLBr!{tl?1$&N=`=R6rlZOWstHiD06Py
zEq?0uoo~06fwwCe-OjEdzHb)xGWHvVI223m|+YNrK2FBge_dK3*{n^*A
z{8DCfH=z+XJOE92bjIUY?XpKy>VS>u{gK_4_Wy^u_YP}n``<)47ElrJh=@{EKoCSk
zq&GVtO?nd$Y0{;H5=vAAL@ClcsB}W;gc_otAiahbLZm}NkrGNEVOBin`IKLxflPfy8ysk{49F6?Vb
zheSr4Wan7)j3M(I)aln^j$<7*iHXA(R4s-o5@K@lrP)XJWQ|AKEXEr{#*$)mK$wti
zCC#jDqez!{c;;VEGrBvf06v>GxYM>*(*Ku@>i^$f=gw28*P7Lvr@c
z9BxIV<9EvblkHEF8~L+o4|#8F@W)$hOt->8G?&29P`J-}
z&tJ6X*b!wTe**6I#BG^{3)5A=$7K;9R+lRfa1QaDI`O#P=7am@Z+*8!TM=L9LrV-b4{v8prHb<>vuT14cLS4CQZU|T4+{~O6
z_hxExBNFvBrZvI;K(x
zA2;6fC1CD`9sSGOV*A{s;jDs&zPyI6bnPiIKsNi$Yv^jhD6!D|9IH~)=6rd-|?k@0paE?)hW9(#|xERUx=uMzpVkD!X|T>
z$8uGqMqX_?D%O>qcn)JGdL+vhcUl>?+Ef}|I9{&&^ldnZqn?m)Ax5Uhxy_Z
z!_2s@bjiW+lC)EeJf-Y`NUQ!=*E)1w3s!sTe|mWIjU*Q1X0a{Lv$_cZ`i-@){tdRy
z3=(m~2_S%)qJvP0rN)_6p4EQN@V|azjf%at56Z^v+CBV(j92{2OxVSGmD!^3-o4)W
zQ`m=@L$15tF>BxK%o`OB<7KEH&*rxqW%=ngfbTsX=iwino7y2W+AzO*iRJeq3WbW`
z`v{vC{p%!()`L0rH}51ry`L0&_m|O`V+|^K%c3uUtBx<=l{)BtUCj3A?lLfq_`Mm*
zN~yGy!!;Zl#1@zQbzKeYNj|Z%*Nhdn5F@y6kunDFSaZ_26vdQAyFwS20rS+jM8iAcno
zQQi{RMjxO}Q}`b`oBzi{Xb=2f*eCvXrWU=9yb>%1`=zOt=Cq%DJUUvj_YuyQz>oda
z$?JRL;*7?yJMFE&mUFf3C%^u)-*YUDR~&rcE#%={@gJ6KkKcOrm8%A^&8Njjary+`Hzoc5K{2_$CS^ZMN>1MNjgkbX9%@9Y`UNti%;pn_agM768%
zTXacNzBy+R?JCs)NkJbe`3>z`acPp$3sO$mo@v#WKSp@WArVp7r1tLAH10jY6eq1!
zt`TQO8W|j&*);R3&P4lyGXuyqpMV5uqrm&W2!uS{UB;ZWBoFSv0;}xr)Ob45BlKUp
z4$}@{#IZD`p}OvI)mV#BWdFk7$D^@v;355$(t!ox`P@84-2dM8)GG!{>eoZH@u#u}
z2|0~g4W0NeHR_PCuhp32XB5Qdz7qkuC|v*6^#ukuc(VE)x^x>Q566HoE=
zdO<1QmMt%R>e;XT90ZH;np%l@xe<-x(hgGfyEc+mUwGAoLjUST4TWmxiCuG(T-6u?
zWZQWP$=6qhf=llwobw@AP5j>JaBGS=m%_BXU5*T-5Fp0)A8{^7)|q&E4mIg=$3tF4
zUOrB(1x+v=Nbmz%SbyCp#Gn~JiO4u~#|wvjT~#U{ikugcY>onX$Lv%&5mEE*#q>ZX
zo`Kp8$i|vimfOp?nMSkc>E{n)$0vm{Fzr-viw;N^r$E@KSo)jTemA;;9s%@TB!6N3
zGY=K2+O_qA>leLev-DkdMON0V%wusxT9KB8MljfNpV?d{5~>sm!s!Fiic1n@6uBF~
zPL)-AWp`92=cv|NI_awrzSdWOD
zrB0Fw3vAGt&|25E35((Hr4}{dRaRnOe_ZsV?Dqyn@=GdyDo0uT^!HP1gE8`(W9t19B{7*~
z-m~cfI;#g?J_|w)>%GzhA$l1`6#D0o119sX%PO~Z;({~{WaAZP-(3|Ci*-f4$llmb
zzDh}LH4t-l-jP2KtMmLai13$QXfM=*XZ#@0$1N4r|2BHRwE_|_;E(*0F?9bvKYYZs
zz_`9tzs(J2>hiO0BlB+FhLXtIMVmz2Fs`-+4&VPhmSIf}2-scj8NSy8JFF{}4I&yQ
ztcr;8YAZm-VP$5D-YdF>4tYEob>;U0#g2|G&O9Cv&^}Ly6=baDJLHe+x>PR(vg?p4
zK0aV7lRl~MhqERNjChGl!1p}kw16~9;3AwZ!nq9
zDrb8UeQ!$9f5-P0D+Zx{=4p%(1vxc_=5io;_5n@adZjY(&stT2!xea(UT~V1R^S2+
z+n)ZBokev>GUoWFr7uX&Qn%lnok2*bIS;=*;ASfcP87pg%vtlK?jsB*B?=UlQ6x++
zsc*uKw5Z}w+A@p5CNM#NnFS(6kmUhLk%}y)&Lmf(EN||d2-URdlU*YvCQgrdM>X1Z
zma=~k4T-rsBS||4{VAM^j5Z>?MzI!97;1B1pO~SZdA<0|g9a*Pp-G%!HT)ejpM-=2
zTmcyAHk0qG)m$wCzOPalp2K5#$o=+`nJ}A3$#;s=WKW7yL)NlfkZLZGckT4AtH5Lm
zHw+_TYSb4V7hO2g;MPC22KGB}f{FFk7Gk0-ZF`x`Fb=V;Ekp$PW9XM}z8hqS~ECpHQ-Jmu>AH?{6>hTx^T6jv$~7%lFqo@uEAs;xlod
z1(-Mqt*EFv!BDw&Z}T?`=9YJfy>}UGoG{!bjy@{k-a94;(79@~9y%xTBO3VBDK~y5
zRwmWx)BrA(KnQF7sDuD7K$-;BJ
z?zr6VWY(&{!JX9VU);FuMMU1l@{E4{dD@68L9B6e-2cTo#Gf70V|kECJ!nSFZ>PDw
zTjFv>FVQa`yK6YqOvTsSVvBCLErgcaU%TZnMfe_OIaNzaQM8afqm`&Up{V=tp=FVJ
z(ha~sH}rMlbsk_)kELOcP^MO6Vw)o1c77+GI{Ob5Ivr&A2@4AsmE&jDy5jWXx7;CX
z{r6iQMf9b9!CY-Hk#NByHCt}qgAW&n!=w0JP*(8pnke2I4a>LGHUf$h`~%03vs^V&
z85Wr$kQbj0iIZdJ@bYR1*V;$I*RVV)8P_72C0D4jCd8g5-EKDj3>&9|mrZi%fw^Aq
zcB~N-+06FJDe*JI^Ho`g>S4Tzmk}OaVQJ?bpAoYmyNQqFRu&FpEglDD*bqsTz*D(P
zalEbp*oMrfmyBIVLM0c!GV<`s-_dQDEQb!9uf;Qh2oUAW=ww>B4
z96-7(>Km}^XE9{?dv|p6lx3jMM~biiSmMTSsh^U1xY)IbnI0;zDuFJbYPR7Qy^X4N
z-u2Un-Zm&(Ds%-A8d;QXd7V}zmV12|(Q1nzRz5^im}Eb|3D58a21Q3&G22JyRX%_Q
z?rTcRtVRrqZcYxxtMEqpx4-|i+nK?daV=V@h?Ynje)Yr}3yfRvi>6>Sd!ArYlVBh%
zA^rENy9;KsIh2X>EOcU6Y3WOC?e^`)k~Y*pwVt4wu6Ly!nS?(t)L>G13JVltDM;5b
z$5`3nOWTXTLQUjui>Ra6uMftHaTM&lv85d{NO!%5_sCkp@~&Cl?gPK)jWTS;E3ER>
z=8c0#vomoy!=l?SoIZ%w&)_1*$De;Nt)ZnJ6vkWfP_DcL68A68Nla)N?{F(A`0b;A1tJ1>P_*L57fqXM_4mB54E*42=V-8AlAQT<
z9IUAUXhhTB)GGx9PE&f(361!b&6AEWZY3CvGF
zI#1T>_}#3VPa6%o>;R%l1^kQeuIQ|z;=HJpo0vv-zKp}=05-h*wRw*22tAh!yKeym
z5j8blrziefQ+Xk5N`lH0Red9J?PnE-nUp6BR^*#@4w9vy=X~g{tI=wjhAt7*G$-@N
z&F0&mOMXia*V|5;w;thn*JtjHKVq}-WZ5QlTv^s+maaEDrmK$6hXcizg2@nq}
zcEv%(D8Mj{EUvMi?jOeaZ|yLKK1h81yZqn(UVtVh5}?KG99UHfi4}krGf3A8UTdrB
z&whL4nVKnRC#(XH>(rt$H85{C0n0JFb1;K~ikb)@fJ%PJLWi+1W1``vyEsNOwAqOF
z6vq8|b&+q;w*B0;z$25MyU#^ta_4&?g&oKoeW&L@cF}ZEHdv$<
zbT8puhS&)O8R~q>5vxz@?`x7JF(B>qA8Rw+n=e)XfRW!BS6_V)xH;e5S%WPIr!+45
zd;wHT*|L>(2F9VE^un0M(Kl)SGF#tSwd3(xt+YnSet(YZIzP8~jC=6UBL`?C-z5tPivO^U1Acmh;G^oiw?7D+jir3ji=PGc*h5I$|nHJ{Xcgph6|s`s6Alez;4F=
z3`uulKsoX+aUy!P3bpk2gP;B95nqc~kAGRU-60q3l6sUAsVRr@f(dduD=cpw{xQUZ
zo58ity{k{c5wkBHjvQLsl1k5YQ!n`f8|0s@Y~JQ|f&T=`yncW4gSJ|1E6;9T0#t{{
z@+B6GM@*ymziV`gHo^rSBKMJ2`29Vb;Mt!_z#vE9`DqbdWZ
zyow*HGAIf{P$8HqYV(ah*X002j-Hx&;U54^a8Gj5i^xd#$xam_e@r=e$Sb}Cp7S>k
zO`2a>k9Vlc6g-|+IuT}(2oox&>0TqHivyQNYO)-%aFZQ){Px(2Cc23-Fkk((cYS`?+X%Yc5n5pRR^=*&+tz)L(^oXy^_C-493X0u}Wgj!iBlbC8wEB+Hongw5he)Zf
z;q!W=y`{`OJUXIE_kM#RB-$0nueLdVSUJFs=+C|(Zh$k49d?-zs#zs75${uui;e9W
z37SJ$*JcjCcBOOx`%tVqf7>~>^8|anJbgd2Yfn8DQgS7j;hT{e8YAgFv3wV;qq^G*
zRBBc|xKv>2dmmFz*Bfho0Q1+R*kZ0q|Mh#6fQ}(+h|DIt_B(Zvn+VXih
z66g&E-oI^=R1--z>5$OPT*~-PnNrS&nR!mWu@r*M@($^ciZR`XguslNU+f-_kdpJ3
zS#POzzev6)LZzsE1|;$Q`}g|B`ioV)u5PD3oMK&l?T;=ouTQP)kyBsV(l)1XltwBY
zMMgHwn%PY%A5PiW+opY)zS5S$&!<-BHb+2V;99#}D;SB9;`(O^{Ow)3V-y^;>GWi*
z??U=JFG4iC|6m2)rF%-LCYVQM2sGQW=af)V6eqRrZYDpaxKl7The0V`OLp#@TCUX;
zkRta^FN9N?(C7RmMHeVy=+qwE)&G2d&Xq{$N2HM_jZN|BG5-9uNYVJ82XJ_TD=K_v
zy%z|YT$3}%PciFILZF5rg!uD7&`r`qIwM*cRnV2NSn*q}iwpMhw_5vyd4mdQJ)9;z
zi(c>%z6_l}1pVhg#Kzcd9v&-r&K6hy6`Rf
z#=T!#p46q4>ZiJZ;J)e_2@2}q_!eg07NFXeu8*%)in=N8Ah$AyNbKgtn5Qqzn}*Z}
zOoksrL68%)-~N(;>jl3~*u?X#oqC@3LELyO;wB5Lj4DO;mU&%v)(m##Vd10Z2<zPRKeAIOQzar7#b$-wQMb2t+DT|
zZB4{h=Knbo5$SvpD-KR!>Q0}gsCxB;2R!(!+#aNnsW3JXw7(*0*W|Eo)tqqu0fcIQ
z+bMm+4`353tYY!vDq)E0KFf<`2^>2sYy4YgH_adi+bhbDn>B}IshKuok?o(Qn}%&m
z=Ff&2eD;D-{z*J6pQ7;TYPbHU6YRGN)HRkZ5FrmkwECk;J4<|&OKW2XQBT*A<%c=t
zp7}kkxKo#lV>4iofkNq%-G>f(a@73DI4#fO9^0e<_`m_94_ABy|3x-eu?&1@Bxm}g
zN@ckv&rki!(dkT_(lW78xDnMy!V~Ugx^6cbX3ajYGC77unLV!IFRNpC>5MDebZSKI
zJDZK%Fh@jm8gip|6(`F`3tuxMI|#~H8&Z}F^YU0hVqH7RPp@;rA@4b&tWtdK!P`0&
z-tGM-IE%GBP`?(YRCqBvS2f-dgYaoL@3JV93*Nu~knURQGZ;ouQrOG5*POyXh;ovS
zTTEyDdz(rdh*EC(y%+4Iq_FgQjWX_jZyrd}$|yMvJ@Hx&j#IVlv9=B=$B16?t`54Z
zIixj0tqiN%`l$#l-$o1!56rX=T|Detnr~Ri?8hrN>FRdACGM{5cOMp@*LLiS+5ETq
z+av;H-5^kS%_)A_=*}*uy)TboL52EHpbGtuW8QstEQ
z6glz}F|r0Dy_QBLS|jOP2wd6SB=ZeX3F!xir_V_CwrX;6r6aT|!H!(_N>7*Al?_WgXL-luw1^*{T&=V~4myq8dGod}5Y
z%y!i+&8(Xb#_-B%DTiDcdT;c_Q|p1;R$Fu+bd0gK;#ypOa)jc=yDTlNE8|EBUf71a
zkj3D%yD6%*DN`)pI%=%8kh~Ko`!`(V6=#NyrKV{{p7NHTd9+(mHtm;o{K$StyQqf`
zk1cMK#`J^VbbW5+l^bI&2V71<{zDC0=vem#(r%ud@Wq;jW#fCcQMiQ!eA2Mr+)ge;
z_{J$_)}3`RPI%h_F>o1{0G(a;)3%vBfXRUZD+&m%bfb_&7R+E2;S%-&RvfaPZ1v2E
ziaF`&=187V-pM+AS?|@+KT$M)I3%}Vrj1aitSjHmsM|a=fx0$Z()|S`uGFMsoDAii
zMiA8-rd8fJQ+rY>rpL?;op8R?B`9*lJIiIS%Gbr@1jl?T(iXInH(b`E(D;4B5-6!l
zvfS;Jcg3aK+vFX?QV&`J7!jee8t~W@&nwN7Sr>PDZvrU0fvzxn=yvLN;a^1$>%>x0
zQtq-`t^h%gv0h6t{^(nGUD^&E$@ob{mYpB#~?4lk_eDb#G!F3ofyi^_LR$uS^hRY)s-@
zD43IF7wI=B%POrObnxr>QG}OigMaoD2DE}#mKC9HBw<0R6HG;+SqD6BqvV-|j;Dry
z8AUb?DKK$LX^@)?YhHcKVRyn8$+B9G>HV*??^_F^dM~n4l|eF&0Nw*
zQTRdYBI>4EIRhy2XTHnMu-RCC%q%XYn?#ZDf7WCiYl)S+wCI~lZ&=L;TkqyS@_+gO5gDyes{GmgVn^nG0IO+DPgTd
zgAf3OUdE;nDmjbjNiQr!x9eSL9?fPu?%`Z~M>3JH>k#szn>wR&ek0E$>rWO{>Gzq9
zL^E37|1!q^$FN;yOPk{FES!JQN|9KmNNlqvgT=)rb>dB5DK+6>h4IZ!yM2fnKIuQ<
za-S2&l+8LbO=tJ~5*4de!9qh(Ia)M`lq<}@!c%1`mVtz+O8;lYbV5?uXg05fU}^Nx
z+69;mp5!whM=#(nH+T;0RFkj1{PS91CGq>&@qgEHbPxV}Jl+3)ySlg3{jP5JmSH}e
z1yI%??EcT1@sdMjy!};&5Y~PBWWvLfC{Sc~ZgKH7xdHI)I~&6EaaM44fi2n+m&S_(
z(sa|+az&o-Wq%3r?W*BN>&c{>$hHH1Jp9WS2?cTnh2irs({0L{pKL>8U*E4Hvj=ngqlLfwy)D=
zdhg%%Trl^M3lGh@vD36ve+qfE8*eg|oE;aLF3l~wH+R1s>=vC8hFjmbtrD#zWxM0P
z!L5RY4EYWA$F#S)8_K9SM=Ejydy8f?&I}mZ{SDaZo_)LSBR0;~!;g5W%Os#_;lS+>
zvN@xcOLEr;u~5G}dN}fP0=4)_&@z9`!mIC{^mW;u7K?nx@4x>x{G*Y0i%@1^foPPT
z-wvW*!ZeGsurRIKr`}{#ce`a~o7!cVGM{!I?I6sfjkH*vb7Q9Dx%b9&$e^D4Q+TP|mdW=!bPoqsPGaHBEtd-5V&)=+i3
zB(GUvK6|~rsZ{gWB}DE0c2jXuhqKqLvj^>umDs2)Ls9z>JwBr&*ne|+x~VTM%=UMP
z%E{O8Gsw&cF7bi5bzcK%TnIwUBElX7eO-0lJpG|;>qnRARPCXGLZ&mymoW0cYUKy+
z1B>H)MXp?pPp13P4p09D0n&j2?chEh9HgXlCK6VEFu1VDx{NJXYx0Fg-`o?MGYhns
zN5`+d6`eiJC`QgGQZ9`tS<&Ip$}@!?wCm2n3d30_CFJ102EK?pfo8FEX(
zEJ{K?=J{F~XPGbKpyf)tzmC=|oG?4#{6|)4BD&T@gDStx`5eN-_OcIQDN2E4)!2%P
zijI4~!j+R>fIWUS5ELEW@F#M{usE;fv2meYkFr#;qTJr@&F-E7vA1*06Tb12lj8E~
zM&mF}42`c+bUgygB>9qgO7RfJ0kmxyikPF|3q|58W!6r)1$`MhTVKtg$H*^lOK
z_z~gLXFCV*Sjx@|^9sXdhqW~It9;lL!krqRMOI2N%>2(+j?+xG%7Twl4WodAk
zO{>W|DpL?)DFkUU_PCW}DyF6qmP8-3x^CJjATd2_S>X6%i0DUCaD&V$&h%@1N;-mWD`R~+3I*DJ>Wn5p~!tCtsX7l#J;L1U{h;Hrxod?kT
zI)cbF6QOHror$7@os5=BOM8Im{ED=V&pvRSma2Zye^1xJlK%&evloAix!=gCZV1x0
z-kCSH-rKM$gi^A26zf@>sYgENtx-7x4{YE!7JE-4zsWivysKR7HXVn3#U{m37##nm
zwgOpanjXFoGCTs-O1V&{ky0@uH(V%F;v)_w5FBT%K(5MJ
zR_2^BX$V4XtgYmU2%<~>#+%t$#rIDEWE8RQoT_K3c{kqi(AxP^DW6)>%>j7*(hY91
z$C@HcLoO#>+&WZmcb-_klc@|9zpag`>6Qsmgq3WwZ>u{T-wJW^~MwQPw)`0izxUd^U~A^HdldXNA@>3jvuS9PQC5w
z?D^B7`vdUyshD^&@Imoa3x@~&wXQ(fGPD=tTYbZV`W=WF041fJ5aY?^mWQvys~ob>TQe#`iY9E
zzMk96JvGU#Bz92VgW5rm?|vH9-3ivwAzzDJbWaMLglS(dMqMNCT8o-isRlE!fCzzt
zlX|f8vtloM_72i3cvTIX8g9)k*!)P9>G_k*##4MP7d%4mUf7=wjU{PoQtUsH^Enp2
z2DNdGu3g|H9X#VZh*B|z4*nX_gZ%3I?9t{Ov>uXL?QG&5c#8zUj&oPCU>4VoX;o#8
zIQJ^!dJZ?5lQL*ij*yTLM?7^mjZUEQiX_qkgz(k5@J_ImN-7?#Bw#y-u;$v_^4{??
zGGyuwx-^85ov<~iJp%B3F(Nfder_0lchWn$3)hGqwoB|;rV`xQd9j|M`c6?fXO|Yw
z&7{ZNL8K_(RvA&A8LD5?lid*={JX|t#hMfaB)M(R)utgXDRr)F%ndtn#`tmIL&Cc0
z)Jd6^OT~Z+OO^7QLAj3=wx{0lI(`MJ!`e#q6%W1H1>oP9=q_CcbYx3s4<38BfI_a8
zc70)X7!Sf9(EjN6Q*QOD5b9D;(6u_YLa8-gTg}wlIv>u9R(UPy(jZQBmomSCq<-MD
zJYCX~_VuqjsqQtSC)9U2iRo_X*3R^LNa90a83Qw>ta=}!D^P;zt!n-RpvLg4nyIR>
z%sdJOEJ_ELR@bx}XnzkQMAXJn{xuwuj{2*bznFQI(w``nj%C8?Gtfq^VtS<(igR;w
zg&>xz9xx47znr=kNZng7Eq@-;L?t`@Xt;v;0M!`+;*=!~>0t_V_%fh`!f`YVO?x6`
ze@AeL(~$1yoz#=ozljyxkIuRpMgu2py06-xnHTBh2gDB*=ww&0rSI>oX%|dVDf^uS
zNynjrfjZioG{0E+Q^V0VZV!u$!0=#5*K_I_xEyTXa|6BoJ%4?DEnJGNfT%ZH8Q8(Q
zgo6voBqF@5;HDQN&!4*D=0v;liR6)If35;yZw01z!36i8?SFvn{ol#HxjQ{)*5u?o
z$^6e#zqSJ=Q_t|w`nO*NAG!UL_VL7#XTGa52uok+e%Xd_vB0r^OjLIoPrRBcOmf>R
zN!c2DE*P_~0d*{oTfLm0G!y;!&c8QY1NYNw4^3F&@qo%w%Z|_HOS_#(Eq@!5r1%+6
zyZ@^)!dQ0x(pa{AwQ^0XXPVb@ev9sa^E;h2EknF7h=eJ%m0FAU!!T
zC38ZR-%L0ZUVN%g9;iq}SRX{Dvg(5tYi
zp)2w#%WwW-Y1sUS2MfF+jv&jG4ue-M*VyTUB5=d9fOXwm)0`rb5LywGDOT`_vNO2m
zL%+rONy;V4?P1yaie^s_LjLGQZDZ#Ef4#98e4ZvJ)1vepbXE|oqxU44=~CCgUe?OP
zzbFi6&PQ<#qWpaXDv#6x3WZ!^W&05LyC(VbBO@q#6JB~+$+AK|a|x7HR8$VhBw
zptauCWSiuz-O`Ryw+7tOAUdl$sLzeg>NY5qJfBjF*c|fVUTyiG2JZsug9ha=U_w
znpR?VFXz_6gHgFK5}ohpj}`^L4L<|vQ_aI^sr6)OA*<69HQg8Ol=kGYth)l&DLeq8
zfh0~_0{QBIvqqD2_*6`|0VS;ts~4>GsZy)L?yunbd`smFGgS6^N!n8wO(ib6aXne_KSK$Gd9>b%*Xyc-oSio30w<;}y#U~&rO2Qen?kMT_
z1pajJ?uDZ}4OtfX(6BUzjskB5SEUp8(JEl6l6o8T{}qv`*}!Y7;BP)J44cu$)AwLf
z=VE+wE$cIwPT$>bW4bKwHl9NXrdNxVisC9HmZB}BCQtf-^6dgq3q?o?yPx8xer(EL
z&xB3+EdU6Ik=7VK0kwSwCfxS}c
zrN7VGiqfsRdq-DX+L#LwGh@nmPTZDhP+7D%cnSh%J2M44;g|xer*j-vtr&mW_Z*Ja
z?Jq%6WwS(29h~t(<34Sts6c;?xktNuPgsM6UW_gPi%HMQDs49crbL!3mw%>tW}MhX
zb$&Hv@>KP;$R8-Q8H+(BX3b`66{9Z8cwRMD%e>K;DDORla~bczF*k=^z90Hx2f!GF
zEM!(1N(e)D2)PZ|DhxS_8$y@{{u$}V8H=}-EdVV9G<)~cEx^7*`%E6}ex!W>?cX%B
z01&GU*qfakL69D;-?g=|@l_0|dJgEGB%S&nBNCOr`1e4%6c^;KZf2+??Db?j4u3J2
z_&i%%Zmm&y9znYfR7C&~aN6G5cR*}!G9snidNJ>x2FMq!a7C^D*Bi#$
z5Q4s%uDee89{KCYqgWomP*H0H7K;1eFt4^?RCNH%K_K6bvkUb@b@a;@N=5y;8^0eZxqq1)LaTkUnf&{aFp?0d)zcD0KK6_28*lz?Bt0*CzfHR}U
zjI$G7+EfIJrQq3~hnWE1%&