From ba0e5809d786a9fe3c02ecb70acf007fb6c0cfb1 Mon Sep 17 00:00:00 2001 From: Ren Erthilo Date: Thu, 26 Apr 2012 00:34:41 +0100 Subject: [PATCH] TG: Fixed issue 286 . DNA machines now have to recharge the injector when they're first built. Fixed issue 388 . Fixed issue 403 . Fixed spaceheaters appearing to be off when they are both off and the hatch is open. Fixed being able to waste rods out of existence by building them where lattice already exists. Revision: r3268 Author: petethegoat --- baystation12.dme | 1 + code/defines/obj/machinery.dm | 39 -- code/game/dna.dm | 18 +- code/game/machinery/cloning.dm | 386 --------------- code/game/machinery/computer/cloning.dm | 464 ++++++++++++++++++ code/game/machinery/spaceheater.dm | 6 +- .../objects/items/weapons/implants/implant.dm | 7 +- code/game/turf.dm | 3 + icons/obj/atmos.dmi | Bin 22013 -> 21984 bytes 9 files changed, 483 insertions(+), 441 deletions(-) create mode 100644 code/game/machinery/computer/cloning.dm diff --git a/baystation12.dme b/baystation12.dme index 7c8a965b1fc..19d8c6101ce 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -529,6 +529,7 @@ #include "code\game\machinery\computer\atmos.dm" #include "code\game\machinery\computer\buildandrepair.dm" #include "code\game\machinery\computer\camera_monitor.dm" +#include "code\game\machinery\computer\cloning.dm" #include "code\game\machinery\computer\communications.dm" #include "code\game\machinery\computer\computer.dm" #include "code\game\machinery\computer\crew.dm" diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm index f7bae4ad200..a0870edcc53 100644 --- a/code/defines/obj/machinery.dm +++ b/code/defines/obj/machinery.dm @@ -224,45 +224,6 @@ idle_power_usage = 10 active_power_usage = 400 -/obj/machinery/scan_consolenew - name = "DNA Modifier Access Console" - desc = "Scans DNA." - icon = 'computer.dmi' - icon_state = "scanner" - density = 1 - var/uniblock = 1.0 - var/strucblock = 1.0 - var/subblock = 1.0 - var/status = null - var/radduration = 2.0 - var/radstrength = 1.0 - var/radacc = 1.0 - var/buffer1 = null - var/buffer2 = null - var/buffer3 = null - var/buffer1owner = null - var/buffer2owner = null - var/buffer3owner = null - var/buffer1label = null - var/buffer2label = null - var/buffer3label = null - var/buffer1type = null - var/buffer2type = null - var/buffer3type = null - var/buffer1iue = 0 - var/buffer2iue = 0 - var/buffer3iue = 0 - var/delete = 0 - var/injectorready = 1 - var/temphtml = null - var/obj/machinery/dna_scanner/connected = null - var/obj/item/weapon/disk/data/diskette = null - var/list/message = list() - anchored = 1.0 - use_power = 1 - idle_power_usage = 10 - active_power_usage = 400 - /obj/machinery/door_control name = "remote door-control" desc = "It controls doors, remotely." diff --git a/code/game/dna.dm b/code/game/dna.dm index 00756a6ed66..86830134bb3 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -841,14 +841,16 @@ src.icon_state = "c_unpowered" stat |= NOPOWER -/obj/machinery/scan_consolenew/New() +/obj/machinery/computer/scan_consolenew/New() ..() - spawn( 5 ) + spawn(5) src.connected = locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) + spawn(250) + src.injectorready = 1 return return -/obj/machinery/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob) +/obj/machinery/computer/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob) if ((istype(W, /obj/item/weapon/disk/data)) && (!src.diskette)) user.drop_item() W.loc = src @@ -856,7 +858,7 @@ user << "You insert [W]." src.updateUsrDialog() -/obj/machinery/scan_consolenew/process() //not really used right now +/obj/machinery/computer/scan_consolenew/process() //not really used right now processing_objects.Remove(src) //Lets not have it waste CPU if(stat & (NOPOWER|BROKEN)) return @@ -864,13 +866,13 @@ return return -/obj/machinery/scan_consolenew/attack_paw(user as mob) +/obj/machinery/computer/scan_consolenew/attack_paw(user as mob) return src.attack_hand(user) -/obj/machinery/scan_consolenew/attack_ai(user as mob) +/obj/machinery/computer/scan_consolenew/attack_ai(user as mob) return src.attack_hand(user) -/obj/machinery/scan_consolenew/attack_hand(user as mob) +/obj/machinery/computer/scan_consolenew/attack_hand(user as mob) if(..()) return if(!(user in message)) @@ -931,7 +933,7 @@ onclose(user, "scannernew") return -/obj/machinery/scan_consolenew/Topic(href, href_list) +/obj/machinery/computer/scan_consolenew/Topic(href, href_list) if(..()) return if(!istype(usr.loc, /turf)) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 726bc8a9899..038e89d5568 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -20,23 +20,6 @@ var/attempting = 0 //One clone attempt at a time thanks var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk -/obj/machinery/computer/cloning - name = "Cloning console" - icon = 'computer.dmi' - icon_state = "dna" - circuit = "/obj/item/weapon/circuitboard/cloning" - req_access = list(access_heads) //Only used for record deletion right now. - var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. - var/obj/machinery/clonepod/pod1 = null //Linked cloning pod. - var/temp = "Initializing System..." - var/menu = 1 //Which menu screen to display - var/list/records = list() - var/datum/data/record/active_record = null - var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything. - var/wantsscan = 1 - var/wantspod = 1 - var/list/message = list() - //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. /obj/item/weapon/disk/data @@ -64,375 +47,6 @@ data = "0983E840344C39F4B059D5145FC5785DC6406A4FFF" read_only = 1 -/obj/machinery/computer/cloning/New() - ..() - spawn(5) - updatemodules() - /*src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir)) - src.pod1 = locate(/obj/machinery/clonepod, get_step(src, poddir)) - - src.temp = "" - if (isnull(src.scanner) && wantsscan) - src.temp += " SCNR-ERROR" - if (isnull(src.pod1) && wantspod) - src.temp += " POD1-ERROR" - else if (wantspod) - src.pod1.connected = src - - if (src.temp == "") - src.temp = "System ready."*/ - return - return - -/obj/machinery/computer/cloning/proc/updatemodules() - //world << "UPDATING MODULES" - src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) - src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST)) - //world << "SEARCHING FOR MACHEIN" - //src.temp = "" - //if (isnull(src.scanner)) - // src.temp += " SCNR-ERROR" - if (!isnull(src.pod1) && !wantspod) - src.pod1.connected = src - // src.temp += " POD1-ERROR" - //else - - //if (src.temp == "") - // src.temp = "System ready." - -/obj/machinery/computer/cloning/proc/findscanner() - //..() - //world << "SEARCHING FOR SCANNER" - var/obj/machinery/dna_scannernew/scannerf = null - for(dir in list(1,2,4,8,5,6,9,10)) - //world << "SEARCHING IN [dir]" - scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) - if (!isnull(scannerf)) - //world << "FOUND" - break - if(isnull(scannerf) && wantsscan) - src.temp += " SCNR-ERROR" - return scannerf - -/obj/machinery/computer/cloning/proc/findcloner() - //..() - //world << "SEARCHING FOR POD" - var/obj/machinery/clonepod/podf = null - for(dir in list(1,2,4,8,5,6,9,10)) - //world << "SEARCHING IN [dir]" - podf = locate(/obj/machinery/clonepod, get_step(src, dir)) - if (!isnull(podf)) - //world << "FOUND" - break - if(isnull(podf) && wantspod) - src.temp += " POD1-ERROR" - return podf - -/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES - if (!src.diskette) - user.drop_item() - W.loc = src - src.diskette = W - user << "You insert [W]." - src.updateUsrDialog() - return - else - ..() - return - -/obj/machinery/computer/cloning/attack_paw(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/cloning/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/cloning/attack_hand(mob/user as mob) - if(!(user in message)) - user << "\blue This machine looks extremely complex. You'd probably need a decent knowledge of Genetics to understand it." - message += user - user.machine = src - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) - return - - updatemodules() - var/dat = "

Cloning System Control

" - dat += "Refresh" - - dat += "
[temp]
" - - switch(src.menu) - if(1) - if(wantsscan) - dat += "

Scanner Functions

" - - if (isnull(src.scanner)) - dat += "No scanner connected!" - else - if (src.scanner.occupant) - dat += "Scan - [src.scanner.occupant]" - else - dat += "Scanner unoccupied" - - dat += "
Lock status: [src.scanner.locked ? "Locked" : "Unlocked"]" - - dat += "

Database Functions

" - dat += "View Records
" - if (src.diskette) - dat += "Eject Disk" - - - if(2) - dat += "

Current records

" - dat += "Back

" - for(var/datum/data/record/R in geneticsrecords) - dat += "[R.fields["id"]]-[R.fields["name"]]
" - - if(3) - dat += "

Selected Record

" - dat += "Back
" - - if (!src.active_record) - dat += "ERROR: Record not found." - else - dat += "
Delete Record
" - dat += "Name: [src.active_record.fields["name"]]
" - - var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"]) - - if ((H) && (istype(H))) - dat += "Health: [H.sensehealth()] | OXY-BURN-TOX-BRUTE
" - else - dat += "Unable to locate implant.
" - - if (!isnull(src.diskette)) - dat += "Load from disk." - - dat += " | Save: UI + UE" - dat += " | Save: UI" - dat += " | Save: SE" - dat += "
" - else - dat += "
" //Keeping a line empty for appearances I guess. - - dat += {"UI: [src.active_record.fields["UI"]]
- SE: [src.active_record.fields["SE"]]

"} - if(wantspod) - dat += "Clone
" - - if(4) - if (!src.active_record) - src.menu = 2 - dat = "[src.temp]
" - dat += "

Confirm Record Deletion

" - - dat += "Scan card to confirm.
" - dat += "No" - - - user << browse(dat, "window=cloning") - onclose(user, "cloning") - return - -/obj/machinery/computer/cloning/Topic(href, href_list) - if(..()) - return - - if ((href_list["scan"]) && (!isnull(src.scanner))) - src.scan_mob(src.scanner.occupant) - - //No locking an open scanner. - else if ((href_list["lock"]) && (!isnull(src.scanner))) - if ((!src.scanner.locked) && (src.scanner.occupant)) - src.scanner.locked = 1 - else - src.scanner.locked = 0 - - else if (href_list["view_rec"]) - src.active_record = locate(href_list["view_rec"]) - if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == "")) - del(src.active_record) - src.temp = "ERROR: Record Corrupt" - else - src.menu = 3 - - else if (href_list["del_rec"]) - if ((!src.active_record) || (src.menu < 3)) - return - if (src.menu == 3) //If we are viewing a record, confirm deletion - src.temp = "Delete record?" - src.menu = 4 - - else if (src.menu == 4) - var/obj/item/weapon/card/id/C = usr.equipped() - if (istype(C)||istype(C, /obj/item/device/pda)) - if(src.check_access(C)) - geneticsrecords.Remove(src.active_record) - del(src.active_record) - src.temp = "Record deleted." - src.menu = 2 - else - src.temp = "Access Denied." - - else if (href_list["disk"]) //Load or eject. - switch(href_list["disk"]) - if("load") - if ((isnull(src.diskette)) || (src.diskette.data == "")) - src.temp = "Load error." - src.updateUsrDialog() - return - if (isnull(src.active_record)) - src.temp = "Record error." - src.menu = 1 - src.updateUsrDialog() - return - - if (src.diskette.data_type == "ui") - src.active_record.fields["UI"] = src.diskette.data - if (src.diskette.ue) - src.active_record.fields["name"] = src.diskette.owner - else if (src.diskette.data_type == "se") - src.active_record.fields["SE"] = src.diskette.data - - src.temp = "Load successful." - if("eject") - if (!isnull(src.diskette)) - src.diskette.loc = src.loc - src.diskette = null - - else if (href_list["save_disk"]) //Save to disk! - if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record))) - src.temp = "Save error." - src.updateUsrDialog() - return - - switch(href_list["save_disk"]) //Save as Ui/Ui+Ue/Se - if("ui") - src.diskette.data = src.active_record.fields["UI"] - src.diskette.ue = 0 - src.diskette.data_type = "ui" - if("ue") - src.diskette.data = src.active_record.fields["UI"] - src.diskette.ue = 1 - src.diskette.data_type = "ui" - if("se") - src.diskette.data = src.active_record.fields["SE"] - src.diskette.ue = 0 - src.diskette.data_type = "se" - src.diskette.owner = src.active_record.fields["name"] - src.diskette.name = "data disk - '[src.diskette.owner]'" - src.temp = "Save \[[href_list["save_disk"]]\] successful." - - else if (href_list["refresh"]) - src.updateUsrDialog() - - else if (href_list["clone"]) - var/datum/data/record/C = locate(href_list["clone"]) - //Look for that player! They better be dead! - if(C) - var/mob/selected = find_dead_player("[C.fields["ckey"]]") - var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") - if(answer == "No") - selected = null -//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. - if ((!selected) || (!src.pod1) || (src.pod1.occupant) || (src.pod1.mess) || !config.revival_cloning) - src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD - else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"],C.fields["original"])) - src.temp = "Cloning cycle activated." - geneticsrecords.Remove(C) - del(C) - src.menu = 1 - - else if (href_list["menu"]) - src.menu = text2num(href_list["menu"]) - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob) - if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna)) - src.temp = "Error: Unable to locate valid genetic data." - return - if (subject.brain_op_stage == 4.0) - src.temp = "Error: No signs of intelligence detected." - return -// if (subject.suiciding == 1) -// src.temp = "Error: Subject's brain is not responding to scanning stimuli." -// return -// if ((!subject.ckey) || (!subject.client)) -// src.temp = "Error: Mental interface failure." -// return - if (subject.mutations & HUSK) - src.temp = "Error: Mental interface failure." - return - if (!isnull(find_record(subject.ckey))) - src.temp = "Subject already in database." - return - - subject.dna.check_integrity() - - var/ckey = subject.ckey - if(!ckey && subject && subject.mind) - ckey = subject.mind.key - - var/datum/data/record/R = new /datum/data/record( ) - R.fields["mrace"] = subject.mutantrace - R.fields["ckey"] = ckey - R.fields["name"] = subject.real_name - R.fields["id"] = copytext(md5(subject.real_name), 2, 6) - R.fields["UI"] = subject.dna.uni_identity - R.fields["SE"] = subject.dna.struc_enzymes - R.fields["changeling"] = subject.changeling - R.fields["original"] = subject.original_name - - // Preferences stuff - R.fields["interface"] = subject.UI - - - - //Add an implant if needed - var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) - if (isnull(imp)) - var/datum/organ/external/O = subject.organs[pick(subject.organs)] - imp = new /obj/item/weapon/implant/health(O) - O.implant += imp - imp.implanted = subject - R.fields["imp"] = "\ref[imp]" - //Update it if needed - else - R.fields["imp"] = "\ref[imp]" - - if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning. - R.fields["mind"] = "\ref[subject.mind]" - - geneticsrecords += R //Save it to the global scan list. - src.temp = "Subject successfully scanned." - -//Find a specific record by key. -/obj/machinery/computer/cloning/proc/find_record(var/find_key) - var/selected_record = null - for(var/datum/data/record/R in geneticsrecords) - if (R.fields["ckey"] == find_key) - selected_record = R - break - return selected_record - -/obj/machinery/computer/cloning/power_change() - - if(stat & BROKEN) - icon_state = "commb" - else - if( powered() ) - icon_state = initial(icon_state) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "c_unpowered" - stat |= NOPOWER - - //Find a dead mob with a brain and client. /proc/find_dead_player(var/find_key) if (isnull(find_key)) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm new file mode 100644 index 00000000000..84a9ed1356a --- /dev/null +++ b/code/game/machinery/computer/cloning.dm @@ -0,0 +1,464 @@ +/obj/machinery/computer/scan_consolenew + name = "DNA Modifier Access Console" + desc = "Scans DNA." + icon = 'computer.dmi' + icon_state = "scanner" + density = 1 + var/uniblock = 1.0 + var/strucblock = 1.0 + var/subblock = 1.0 + var/status = null + var/radduration = 2.0 + var/radstrength = 1.0 + var/radacc = 1.0 + var/buffer1 = null + var/buffer2 = null + var/buffer3 = null + var/buffer1owner = null + var/buffer2owner = null + var/buffer3owner = null + var/buffer1label = null + var/buffer2label = null + var/buffer3label = null + var/buffer1type = null + var/buffer2type = null + var/buffer3type = null + var/buffer1iue = 0 + var/buffer2iue = 0 + var/buffer3iue = 0 + var/delete = 0 + var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete + var/temphtml = null + var/obj/machinery/dna_scanner/connected = null + var/obj/item/weapon/disk/data/diskette = null + var/list/message = list() + anchored = 1.0 + use_power = 1 + idle_power_usage = 10 + active_power_usage = 400 + +/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if (src.stat & BROKEN) + user << "\blue The broken glass falls out." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + new /obj/item/weapon/shard( src.loc ) + var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 3 + A.icon_state = "3" + A.anchored = 1 + del(src) + else + user << "\blue You disconnect the monitor." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 4 + A.icon_state = "4" + A.anchored = 1 + del(src) + if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES + if (!src.diskette) + user.drop_item() + I.loc = src + src.diskette = I + user << "You insert [I]." + src.updateUsrDialog() + return + else + src.attack_hand(user) + return + +/obj/machinery/computer/cloning + name = "Cloning console" + icon = 'computer.dmi' + icon_state = "dna" + circuit = "/obj/item/weapon/circuitboard/cloning" + req_access = list(access_heads) //Only used for record deletion right now. + var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. + var/obj/machinery/clonepod/pod1 = null //Linked cloning pod. + var/temp = "Initializing System..." + var/menu = 1 //Which menu screen to display + var/list/records = list() + var/datum/data/record/active_record = null + var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything. + var/wantsscan = 1 + var/wantspod = 1 + var/list/message = list() + +/obj/machinery/computer/cloning/New() + ..() + spawn(5) + updatemodules() + /*src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir)) + src.pod1 = locate(/obj/machinery/clonepod, get_step(src, poddir)) + + src.temp = "" + if (isnull(src.scanner) && wantsscan) + src.temp += " SCNR-ERROR" + if (isnull(src.pod1) && wantspod) + src.temp += " POD1-ERROR" + else if (wantspod) + src.pod1.connected = src + + if (src.temp == "") + src.temp = "System ready."*/ + return + return + +/obj/machinery/computer/cloning/proc/updatemodules() + //world << "UPDATING MODULES" + src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) + src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST)) + //world << "SEARCHING FOR MACHEIN" + //src.temp = "" + //if (isnull(src.scanner)) + // src.temp += " SCNR-ERROR" + if (!isnull(src.pod1) && !wantspod) + src.pod1.connected = src + // src.temp += " POD1-ERROR" + //else + + //if (src.temp == "") + // src.temp = "System ready." + +/obj/machinery/computer/cloning/proc/findscanner() + //..() + //world << "SEARCHING FOR SCANNER" + var/obj/machinery/dna_scannernew/scannerf = null + for(dir in list(1,2,4,8,5,6,9,10)) + //world << "SEARCHING IN [dir]" + scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) + if (!isnull(scannerf)) + //world << "FOUND" + break + if(isnull(scannerf) && wantsscan) + src.temp += " SCNR-ERROR" + return scannerf + +/obj/machinery/computer/cloning/proc/findcloner() + //..() + //world << "SEARCHING FOR POD" + var/obj/machinery/clonepod/podf = null + for(dir in list(1,2,4,8,5,6,9,10)) + //world << "SEARCHING IN [dir]" + podf = locate(/obj/machinery/clonepod, get_step(src, dir)) + if (!isnull(podf)) + //world << "FOUND" + break + if(isnull(podf) && wantspod) + src.temp += " POD1-ERROR" + return podf + +/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES + if (!src.diskette) + user.drop_item() + W.loc = src + src.diskette = W + user << "You insert [W]." + src.updateUsrDialog() + return + else + ..() + return + +/obj/machinery/computer/cloning/attack_paw(mob/user as mob) + return attack_hand(user) + +/obj/machinery/computer/cloning/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/computer/cloning/attack_hand(mob/user as mob) + if(!(user in message)) + user << "\blue This machine looks extremely complex. You'd probably need a decent knowledge of Genetics to understand it." + message += user + user.machine = src + add_fingerprint(user) + + if(stat & (BROKEN|NOPOWER)) + return + + updatemodules() + + var/dat = "

Cloning System Control

" + dat += "Refresh" + + dat += "
[temp]
" + + switch(src.menu) + if(1) + if(wantsscan) + dat += "

Scanner Functions

" + + if (isnull(src.scanner)) + dat += "No scanner connected!" + else + if (src.scanner.occupant) + dat += "Scan - [src.scanner.occupant]" + else + dat += "Scanner unoccupied" + + dat += "
Lock status: [src.scanner.locked ? "Locked" : "Unlocked"]" + + dat += "

Database Functions

" + dat += "View Records
" + if (src.diskette) + dat += "Eject Disk" + + + if(2) + dat += "

Current records

" + dat += "Back

" + for(var/datum/data/record/R in geneticsrecords) + dat += "[R.fields["id"]]-[R.fields["name"]]
" + + if(3) + dat += "

Selected Record

" + dat += "Back
" + + if (!src.active_record) + dat += "ERROR: Record not found." + else + dat += "
Delete Record
" + dat += "Name: [src.active_record.fields["name"]]
" + + var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"]) + + if ((H) && (istype(H))) + dat += "Health: [H.sensehealth()] | OXY-BURN-TOX-BRUTE
" + else + dat += "Unable to locate implant.
" + + if (!isnull(src.diskette)) + dat += "Load from disk." + + dat += " | Save: UI + UE" + dat += " | Save: UI" + dat += " | Save: SE" + dat += "
" + else + dat += "
" //Keeping a line empty for appearances I guess. + + dat += {"UI: [src.active_record.fields["UI"]]
+ SE: [src.active_record.fields["SE"]]

"} + if(wantspod) + dat += "Clone
" + + if(4) + if (!src.active_record) + src.menu = 2 + dat = "[src.temp]
" + dat += "

Confirm Record Deletion

" + + dat += "Scan card to confirm.
" + dat += "No" + + + user << browse(dat, "window=cloning") + onclose(user, "cloning") + return + +/obj/machinery/computer/cloning/Topic(href, href_list) + if(..()) + return + + if ((href_list["scan"]) && (!isnull(src.scanner))) + src.scan_mob(src.scanner.occupant) + + //No locking an open scanner. + else if ((href_list["lock"]) && (!isnull(src.scanner))) + if ((!src.scanner.locked) && (src.scanner.occupant)) + src.scanner.locked = 1 + else + src.scanner.locked = 0 + + else if (href_list["view_rec"]) + src.active_record = locate(href_list["view_rec"]) + if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == "")) + del(src.active_record) + src.temp = "ERROR: Record Corrupt" + else + src.menu = 3 + + else if (href_list["del_rec"]) + if ((!src.active_record) || (src.menu < 3)) + return + if (src.menu == 3) //If we are viewing a record, confirm deletion + src.temp = "Delete record?" + src.menu = 4 + + else if (src.menu == 4) + var/obj/item/weapon/card/id/C = usr.equipped() + if (istype(C)||istype(C, /obj/item/device/pda)) + if(src.check_access(C)) + geneticsrecords.Remove(src.active_record) + del(src.active_record) + src.temp = "Record deleted." + src.menu = 2 + else + src.temp = "Access Denied." + + else if (href_list["disk"]) //Load or eject. + switch(href_list["disk"]) + if("load") + if ((isnull(src.diskette)) || (src.diskette.data == "")) + src.temp = "Load error." + src.updateUsrDialog() + return + if (isnull(src.active_record)) + src.temp = "Record error." + src.menu = 1 + src.updateUsrDialog() + return + + if (src.diskette.data_type == "ui") + src.active_record.fields["UI"] = src.diskette.data + if (src.diskette.ue) + src.active_record.fields["name"] = src.diskette.owner + else if (src.diskette.data_type == "se") + src.active_record.fields["SE"] = src.diskette.data + + src.temp = "Load successful." + if("eject") + if (!isnull(src.diskette)) + src.diskette.loc = src.loc + src.diskette = null + + else if (href_list["save_disk"]) //Save to disk! + if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record))) + src.temp = "Save error." + src.updateUsrDialog() + return + + switch(href_list["save_disk"]) //Save as Ui/Ui+Ue/Se + if("ui") + src.diskette.data = src.active_record.fields["UI"] + src.diskette.ue = 0 + src.diskette.data_type = "ui" + if("ue") + src.diskette.data = src.active_record.fields["UI"] + src.diskette.ue = 1 + src.diskette.data_type = "ui" + if("se") + src.diskette.data = src.active_record.fields["SE"] + src.diskette.ue = 0 + src.diskette.data_type = "se" + src.diskette.owner = src.active_record.fields["name"] + src.diskette.name = "data disk - '[src.diskette.owner]'" + src.temp = "Save \[[href_list["save_disk"]]\] successful." + + else if (href_list["refresh"]) + src.updateUsrDialog() + + else if (href_list["clone"]) + var/datum/data/record/C = locate(href_list["clone"]) + //Look for that player! They better be dead! + if(C) + var/mob/selected = find_dead_player("[C.fields["ckey"]]") + var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") + if(answer == "No") + selected = null +//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. + if ((!selected) || (!src.pod1) || (src.pod1.occupant) || (src.pod1.mess) || !config.revival_cloning) + src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD + else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"],C.fields["original"])) + src.temp = "Cloning cycle activated." + geneticsrecords.Remove(C) + del(C) + src.menu = 1 + + else if (href_list["menu"]) + src.menu = text2num(href_list["menu"]) + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + +/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob) + if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna)) + src.temp = "Error: Unable to locate valid genetic data." + return + if (subject.brain_op_stage == 4.0) + src.temp = "Error: No signs of intelligence detected." + return +// if (subject.suiciding == 1) +// src.temp = "Error: Subject's brain is not responding to scanning stimuli." +// return +// if ((!subject.ckey) || (!subject.client)) +// src.temp = "Error: Mental interface failure." +// return + if (subject.mutations & HUSK) + src.temp = "Error: Mental interface failure." + return + if (!isnull(find_record(subject.ckey))) + src.temp = "Subject already in database." + return + + subject.dna.check_integrity() + + var/ckey = subject.ckey + if(!ckey && subject && subject.mind) + ckey = subject.mind.key + + var/datum/data/record/R = new /datum/data/record( ) + R.fields["mrace"] = subject.mutantrace + R.fields["ckey"] = ckey + R.fields["name"] = subject.real_name + R.fields["id"] = copytext(md5(subject.real_name), 2, 6) + R.fields["UI"] = subject.dna.uni_identity + R.fields["SE"] = subject.dna.struc_enzymes + R.fields["changeling"] = subject.changeling + R.fields["original"] = subject.original_name + + // Preferences stuff + R.fields["interface"] = subject.UI + + + + //Add an implant if needed + var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) + if (isnull(imp)) + var/datum/organ/external/O = subject.organs[pick(subject.organs)] + imp = new /obj/item/weapon/implant/health(O) + O.implant += imp + imp.implanted = subject + R.fields["imp"] = "\ref[imp]" + //Update it if needed + else + R.fields["imp"] = "\ref[imp]" + + if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning. + R.fields["mind"] = "\ref[subject.mind]" + + geneticsrecords += R //Save it to the global scan list. + src.temp = "Subject successfully scanned." + +//Find a specific record by key. +/obj/machinery/computer/cloning/proc/find_record(var/find_key) + var/selected_record = null + for(var/datum/data/record/R in geneticsrecords) + if (R.fields["ckey"] == find_key) + selected_record = R + break + return selected_record + +/obj/machinery/computer/cloning/power_change() + + if(stat & BROKEN) + icon_state = "commb" + else + if( powered() ) + icon_state = initial(icon_state) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + src.icon_state = "c_unpowered" + stat |= NOPOWER \ No newline at end of file diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 629725132cc..128f4190576 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -23,10 +23,10 @@ return update_icon() + overlays = null + icon_state = "sheater[on]" if(open) - icon_state = "sheater-open" - else - icon_state = "sheater[on]" + overlays += "sheater-open" return examine() diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 340dcc3925d..510d2c76be4 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -211,11 +211,8 @@ the implant may become unstable and either pre-maturely inject the subject or si if(!istype(M, /mob/living/carbon/human)) return var/mob/living/carbon/human/H = M if(H.mind in ticker.mode.head_revolutionaries) - visible_message("\red [M] seems to resist the implant.", 1) - for(var/mob/O in (viewers(M) - M)) - O.show_message("\red [M] seems to resist the implant.", 1) - M << "\red You resist the implant." - return + H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of NanoTrasen try to invade your mind!") + return else if(H.mind in ticker.mode:revolutionaries) ticker.mode:remove_revolutionary(H.mind) H << "\blue You feel a surge of loyalty towards NanoTrasen." diff --git a/code/game/turf.dm b/code/game/turf.dm index 8e29a3befce..effb872f879 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -1247,6 +1247,9 @@ turf/simulated/floor/return_siding_icon_state() /turf/space/attackby(obj/item/C as obj, mob/user as mob) if (istype(C, /obj/item/stack/rods)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + return var/obj/item/stack/rods/R = C user << "\blue Constructing support lattice ..." playsound(src.loc, 'Genhit.ogg', 50, 1) diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index 32961b5a0ac0890b50f81ac71429cf3f862fe584..30bf825f1746ee6952c143686e29181b3b939592 100644 GIT binary patch literal 21984 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 E0fN7ub^rhX literal 22013 zcmZ_0WmFwa)HT>hfZzlO5ZsAi!QC~uTY%sW0fGg0*Ff+~a1HJrf(3Wy;_lAHrg`4) zT{CND%@0=7O;?wlIdT{S~rq zcVyGy^Yf(WKWT3tZ=VJahDkK`V}>xR4kgoLo8~Q~S1(N|{o9yqUc9BLM0r;_@UICn zEE^H~M^1(`#e~j3J0DX;D|{tkgP`f0@%4EHEtc+mR5ukvMI1sdc8I3POEmk>Vk$p( zy3e-y{Bn8S-u}rxZc&rrK1m(VHuL*u5%urQ8cpOq?$-=sUw7&$zs|%!gp$R$by=+o z(g40+by!DJq}?T(?WgpUoK~$`3vYS1c*dKBmiq)z+%LtGR--EH-sfn)j!w5w`c)&1 zCEm{<`-evE$TX5EV_#}YE#&2rS6w5)(z1OgX_u2KcL^bno)8hwBk93{eDvvE-ga3z zTw2eCT;%Ci;$&Q$_mR18%MXIocFQHbEQGMwt7bk>*^e z+u&po9ByiFQX~O@0+10GQFBW_$oQ^@xB1vB6hXn&_!2doD4d{l@(13h$syUU7E%$K zUk0hDVTnZ<3Hb%85A28A`1?wRsY$P?+|H6x=>ONxp{?KRKX_RQ|9Cy(QJZ?}xFMZ$HmFuYlqY8q zqcc<*&dD^wXT_28<7JWYG|SjP8^^~HHOaTQZ-l)0+1$@ea?bl$DZ$dn{wbE08dE;> zW5s9Edi+zxFg}+9mI3b~IAt;vN%&A?Y-Swwzr|B>AAr0=D|Lz!g<$6~E3k&xn(%Qh zRPJ{5DvP{m?XK7w*|p>2nDlg#{_H8Rfkg2dn3KK?Sm^3NlI&!+TFNb9WEq;u8{>Wd zA3d{86mJWkD`-PL!Sq!=IzpOo#~=wksbOz;SNf!YL{U%H_o2J?T-UEn83l#Jj%Ds7 z^Kei_Z=k>5uf1J}%zXnVV3*f<$58ES)En$gKO;4nu+BsC!BVJvHq%XUN{JOy8KI5C z-ANR|V6o51ib%jhfda=7q7p(jKeikq@r%n?X@bn8;EgzH{PG%ap4ccGQQGm=gg!~x za4C^o{oZYvfc{qmiV_!9_V_XW(yh@M85y0<;K+1r^e31~iTu|yT*`73GbVjZMEJZ{ zGISP5A0rI6MD1_}3GrAdE<=^kfn0K!%-FD^3OZS*2Fjz0^qhi$O5~`TIGIXA^;|%< zz3nUZ?uzCw2ixTtv)2R7ON}Uf>9MbwY`wM=JKS-VZd0{4Psgdql^=Ws>*EN=aK>a@ z2aBOj*LKPer?l&p?&oH5X`J#`Z8ms|7V!F zt2q7A>Yi`v0&yyP^WEJYg0BgV4YbWGnbY=-CNj;GeW)a8d1$+8ZZB=<{~p8L(~O}e z@jKG|;n+Ig?2D5W66-MsjRbrBmI;BIGRKJ$>Zu`t;KMEk*;hlUz#sj{OK>(s?=e?D zw8tgRiw|$Zc0ZKHMSFfSWPY~MAO8?+LCc=kja%X#L(eQm_aiAd2bG}fhK^>gYcBLr zv}!eFG;b)_)%#`XDZ@)>;Kq;SNO!x)XH)PajB7JW=F#l{h`L#v>U`ni|K~E^&0-8b z)IrSQHzX`Zc*k#iWEc91Ea&3ffC{|lz1IwyyTq7+TWbA2v-2>95;|_Q`=N?SL-js< zn+T`fwWg6V6t7d`#oq4;eS1u4oDYUN*~7d5;cti2PsA#SswGpr`@nj*0TAWOz?gpQ zK2Xx}MzN)t&s_XLR`w*JC(_%|wO3dlYscY*huHc1%=Q68jNqr5J3gY0?-69k9c|~| zg`af8mPf(*&UJBE7;)exUhzyc*6^gV<@j2L`IC*xUIcGx@^5c!2$yMym1#KTCuC+0 zr^M-$y}s~GnjlVngPkXVdwevU5<6>5C} ztLtl8@TGts&zBSN@?tc+N9ohUqg9+)r}-HldmtPi`I|#t0<$QEJK1!5 zMQXpLoIiigShk(-W>rBpVZb7P_EKb(eZBF?)oZt9q%YzvxhGcF7nL>idDz+62^X1O z-%d_X|C{IHpg_%QBx#zd;csu%rs40}#5$|BFwfJD?j*Fa-PA_oppcEAOVX_T!0|fv zS4%!seb~ct)fbEQn^41yS7nCx9+2mOE;QSrZ^FTBXUkSAx8yl_pLD4%I?!K&_3Ubg z#FriGGEG_gR8NO&!+o?%+G7N9$2rNz;iqkIsbane&u%cia3{%Wlt0bAX3J`SrGu_Q zKr@A>h!J|$ae|qe{ll*|WM>92`id<6N>H~%UBCB8M zZ67HbN*0p1yKihNZe-SvQwwTW1(v++Ao@Pi1*u*4)t8RjhzWem{K6QaqQA6oU<^p$ zKJ^B4fOz3ku}kRo2kEo2KLd=-hS_C>RtK1MH-B*8{R;^EfH0qRieQr zo1!#0m@?@1^f*(#{*i_;NYrwU@PQ$?@|%dPvCU^}@V*f&R1Iv|&H}Ds z^hOJAZifAzm^rQ+oSzGx#z;h*%o@iK$;}k0((CBuD3M`DM*AXtQj;`4STH~9?EBIm zPm5GG3Lvkigaq%nC1c2<5RfsG)t^LijC-Rk zY;43$OlZX9L&xKl?v>G<(qix?JyRRJ?l|qBZ9`sHXJ>2Kl&E>M6hv@g9L>Eqx0PrG zb6noFC#t&jj&wCre#@gqLq}hFW6%UgwiwT;vyxNTbidhKygGdDgTB6g{O%^Yt4MH@ zn{pW$;fIgJ9!|l3w92KR*F#)zK>Pg}n&9058$J-}CF11>+qcIYe!5Tw|mg09qF}-gn{q91s0-)o!jGK!SXz^Sj8H7%5Lr{$O+>Ds5!vl@7ST;Na|xG-4H1 zRow?_BAT_L^70UH3tx8rG-VYm6zy2mcdw&50@+RqfYYpG@3i8;wf}S6s$XWN!m-W} zLI+=Te>!O`)UA7EkDBk1@(4>Kg)4IgL_t)B_aA~1>tS84GDXw(x>V0#N5&%CND>eb zXzht6ecwc`D#yUdnWSA|2nQHm?oHjO4QRm`?oXEyayw9P+Rg`>4kXz|MMmD6!7g@p zrpp#+;(I33e)F1PbdgJ?eh3kmWA9)6!LmI2V@b+GB4SXiJUZncp|NPyo^KMFP;|D? zW5>L9bpwpNbz{qDGYHK$3gb-_;oo`e%F0T>_vXeeo%^fkM=vX@VyY&rkAL0tK7Xd2 zI2#JV2Jy}(fES(ucL;q(&8oL}YOvx!lXzY~cWJZ*RRH z7YEfNM!nIbE8Eo6aBuh=2%w%QY-WSPGrvEtZf?Hd;^G22goi?7Xj|q47u|EjdU|^i zVxihU3Gu-f!A%I>^-(z6Nvflf8lY%tN09dTCbXoC(=Q#_gPu-jDZE>4MyaN{q3vNLzjONP|chY^J8B9tD3G-@g}=mya^pP<7ivH~J)d z((0#8FIZM2(s^?V`0^aiQ*tw6K%1ML0y=w}n{!SEi84GDbMq)aS3_?uoD(f@7y~#m z0#f~;SZ7GSK6wp4_F72Sp)72q{8&1l$Di}S&fnGmYRY_N0oX8x)54DF4x$*&#)izKK+C@jQ9-J z)#am(vPDYmG>UL=F}e*n%N_U1_fBw{Fvh$7mhA9FwPU#lF%CC~cB8%5B73nbPPhP@ z$_NAT1oo^9KpJC4o1I8e)Q-uB-OK;x*t*_sQ*NiMOm|FPR@k4-eAvMhI#r_SBs5y1 zso%L}-_}{GT@88>q`;t{FI~YHgnTX^%tha8{-87W;6dcrnOmhn_M1so^l&1i7<7_QNJ7FGQOD=yrA$cs&wTGc_#KvwPOe1BLhoHp zY!>-XFu4G12+izQ7F-7rvK%9+pb~ z8Ot%X?Ck7@`6qLTmxlTGuU}dJ{Q0x8yBk(f!D9FDFY!GNK7P5(%Bz&c(}K*5qNgy*wD~G!N4HxEEE(Jq{r-RJlpV< znqbwsiv``$(Q)=1sFQ9m9e53l@{Bz>T{8&|4|EZQ5l3)>Ax2{umXz&lyLE!jBYlC8 zW=(?`KAyGm-srWIxF*IxBSLk=34$RDDbcO9p9bDzFWCh6`5RCeXlY+mn+<(TdkpYx zZS|@qYYg2^kyQ{w(D?Z?$IFfTcW$oX&j_>wQ^J9g1o`7jVY$teIz?*tg_**(5egO- zY^acK5L3Gzd%AYlyWmbu%zRP=pPrG63ukT~9+AA;VXJ^#eC3(vce*CY}$MGkTQ+AY63X8eFw&nRnhDf8i>2M5W|`sVVa)XpZ^k?iwB_ zy}xc>U0Lz{bnFVevGV1_M7d$mr5|Av3-Hr?GdAho#S+dRjo=PbfHoprVgJ+0E+&Q8~#hgcdk46uNPpXreVhX-J{0@*U0j*fN;3L5fN zij@8(JD`Ldt?nngshOF=0g`R}F9`1G;6jezM$2-&MHH8miHY&Uts-X>6&1Jj!JyH> z!J*?C>Vw71%slKFx*Li=g90K;eH7GcfcW_%tjY5b*+?gI zf2KSwy+GdyM<6nm&aH7jYIPgt!H+{0{k^}xqP{vHN;c>SpiBBep?SXinFea=>Z<4B z+G{{Y))NtJ5fdY5xyQ%(<$%z0RAJUxQBDeS%Z_eh;P&rARakDTo4^1OsIiASbJ6GL zjCl4$5r=$T@A(3PHM)J=;d777=BB3X++1-bsJ5P7X~Onk3fnA5#f@DG&2K;({7%Ni zVm((7J^R%LF*q7(8qf^4|F&^W?rfmlBp-HA7QnxW{UUtNOX`(4>Ufrl+ODEd`by^= zv+=)-hQv6U@$lC+)@X@ai&N7xIeuRpUUXa^9i2?H7~u3PW>a~M#SwZk@6MEy*WXVI zEsNcCOCefzr|#a~X0QbvJ2re>N2-?_ENE%jWo7mbQSe5jN%Dc13AcGkq7N37AHR7b z1Q9BltE+2nZf;g#A2?JfqQ48{bJ|ZwvYmU&`39nn+}^!0X^JutU&+kUKOe97Ue%#B%`< zn8Nw^_zcV0*xEL3U6q!8n4FsGghCCl;Z7$IIzUp1)vyETs}46bq8 z?K1C#zvqD;Ns%q^XAx?#$}(m@CpXJ z?To*0p86s%a&XD~UTkDk2>@iyGjph^NJvjJHOiqVQc|U_<`e^SsKNasPVIA)7Er0P z0F_nLWZY=%yTE;tbZ}rP{yf{fe=~x)8Ue@Fc=#SZP2Y1F4N>s*+oZTla`Os->{{}v zXTyC*PcKDJzB|SLbxoX|lhg5A_~YZ_Vnhtcvoaa9l~zOaTRm3KHU}C!Z>ucYZfyej((e0# zSADprz{>4k+=?lWHWWkhffbiRm9HcIt$c>U)#lPu-by3MI5@qLL;+yCH123x^g!NZ z&>`~|c6B3S2X03W0&=#jYC$Y=7MkxWRSaoq@oz~2YUh3@!{<2Ao&k*ws2^2IpX66t z94*34e{cU4D<8h&I~9h55t0eYV^^W4F-5TR)1wy{q5k^)8xsQq19Wn}85yLYwT(4a z9|h1GNt&T7cNKp3zF9^7y^hXG1D2AJkyDAj< zjs=O4+Woh=?!9N=VLy7k6r27Z5{Rot>Vi+ z2NF+Qox->JWxE3SA?>CRYO8J2n6em7{A)p`F?-Q`%w7>W25|1NiyA#%~;vXqtES z(SX9zLSgf==0kY^%C%lke<`+6vT3lyg(y&i&KyMl!;_S#j#)KWAeyn2k7G5R5x0lz#pedjzJS7tU*y0#r02q%6!YlwBu1 z{?=6z2MGBu_^$5=o9FwgUsysX^RZX1#yM{tAAM+9bZYHz5tG&El4%ccDB@;>XQf3a}s zwcO^#H|2wJ@s=@!_Wd#IHLBAnHHDUa>cJ-|oSQ+Ddv8Z_y~P&4m-EX>ZY^SgwJR(n-?W+aGV(f7k9K z*lakJvmn>i4fhQRzE9nHe2^XX3`Y9qpHPj4ii*1Y(U}AuA)aj!iO7mtwCs`gmD2vg zZ+6Y!TWeR=b3}~t-d^~!yDc{HT3M>^U}0H%p38W0THT}an^qa?m7GS^sd z2cB;aJK!$ISKnVBloIube|lVM{$)OrxdXG%)B^`&dpM)( z(t3ta+wi1((PvgcoABCs0O^=aZ8VTLpICq{J`)Er* zUu{3n9c7QxCMw@)%tLQwksVGf(fWQt2#*trsXqe%#=TM9 zM*;_vH0D0$^!`SKNFasEuH75!J=J7z}qaH;LHctoI|7 zbyZ&i4H?Y{n!lrj-Dc5}1qJXXwsW(=4(U@rC?zMoPpw~VJNg?m?|>6)o5snFMwo7A zewHgUTj@lP0OLiyR$;Ec~>EuL7F$d8|yAi~sTO`pw~ny10Ecw0$j7K0|FXR~I`=p=Tix2z$0_{@jE;gQ zHKkAYYBVcN&tI$ED~C#;5ro?%ln{}T{f74~xownVxwy7n#bxD1mqAu>*ft`|KlCK6 zo8mla=^Vyqx4K}scV3~_zT{kz1U@2S?_iE zc!9M@lUmTWbF69jzgmE#4E&##rO2aOu@+Pq{=8X)LPD(*Z+-Sx{fYvRjl1m+?u8fZ z7lk7s5=6Zfb0cufen9@l$e(WHFY_U&yA-iN#(RPCG+;Xmu6)?4~(VDd&g z=of4YT}Es;a>)je9OY~v$GGy_UM?yOUkP5F9f|4SiyePADK-f?=0RS zEDpi|fxC+Ruv>Qa=|7m5@psd^p?%E$-##fIbx887a^Qb4h$4M2J)xx?#@T{h>UF$K zNNzTHozM*-U|L(t`w%(rPWpt3$g9^J3|dp=Zb<>$U%(GNHV%ckymhBPZDw8%Rvd}$ zdD3~OW&ro_x!Hx1lT*W7kcpLTO^WBQ+uu5z8gnYzyG0OV{ORg~W0&`nlk=r;`4x}y z_qLAI!|ovRP65NA`H#MZ5l*O!D`J)6W6i)R#QWbpbZ_eQR1BDIpt~C4qNT35yS854 zI19BNLknfvQ&#UY>*N^D2sgK3SFJTg zCx^LsWQDBxdDVxTJO*9lvDP$lUYCPVU6BCR_4#i%ex1+$kmo?Lp+Qb;M(Qc3SuEV) zZkk0z&}mml;u3%2`t0ma;(N`}*6*%}b@2zZ3U4;4u1R$7u-$&?|GEbbI)5lH3hRhTU_dq49Th|_)46$I}+|dahC(E3% z+2TO$M4?+=@GKWpZF6ITC28`fv0#tGxd*4!d;9EPW5^iMl#3qr$9e&+l{^S*isk6O z+R3TKI(_dQKVx8RZv}3*mycGjFP45#%iuLVBcQUF5s{nq(Zq%O+&lZ#__Pzb4SU(I z-uS+u(yRo55}YqKH3Jc^!`IBVY~x#fbH;>^HxvGwFqntkMGZ40{J}PSQ zYPGSE8_eK=m%izKTmIJX*FC4W^l&>GSwyf>6P&=kG=rzXxoSdgLtkYtpBu}le%Gx7 zZS?VrHF^?3N5rlW47NS^%>oWO=qk08GZnV={(g|<--o-zkFWMPy9fLtd_l4(-M=xv zuOqZfS0vnUQ&HfBJu>nj8fK4WIvk7$hks6Y3~2E3yg**BF(WSs2pH?>LI7eb z?aApa08WuQreE$cJ;PGurbaG6kgILv>{0_)$G|*i|L`4xM#KQw9 z=$Jip_Vx{RmH|PHjl6W?XDY_O7(~?6@Qh2pGBn0Ke?MQpLH3|)9tNDum->LYV#}_l z@FOv+W;}n^UzbxOHpr5T$kF2PQAP{5O6R|n7#uB61IASueuNP4vc3C%$0bOhz9Gnn zgDly-^Fu$%C49diLCCmfT3Kz(p6bJNwjwnJ<3_rt@wl>AvEt>W7&QfJHfI&qF66%?*O)f9LXyIV<$me7YQKA&|@{cd1bTsqO%j7 zunkf8cTsbFn>V|!u!AcJ9Se498XQ3JLGGzz#;P{e@(AJ^_R{3CpOhZw^^_F4udr|b z=;H0G4>pRvLa-yoY5Rohk)m)u2vmY>AC9mSAiv0n*;3o?&#{WmC z1Y0w>7YpG1BArG294Ey;CF=fe(*u{3`o@v4HzGJ9MQz+wR1_))m9^i34PxN>+9uf_ zWMX^`H_Ra2pjYsZFpw$D8xcnqO-%m7xG&bMh!`MTsG`!)j67#&v(5NCrY>GG2r#f- zRZZQOnpiG1U3@Qs7C+v8;IvFp(NY(RbzQqm_wgdFB1D9LtNDURs*r$1^5JEn;FM3_ zB`rqZawn0x`nLvGUG8qD?+~2Ai+93}PX-SCyJ7Tv{N>CrLb#5V4HHIf185ilMS*=_ zQAYi9+0aW<{La2^A+9E5g-re++!V3~-7DO1X4+q#_HXqTmsZ&Blqc1oa9K8|5#>U; zKCJ%!NR&*h3-_=VOoMm%MGtY#;?xfmgoF)Ze=C}0Sn|#_-p|B@S&k2`1U= z=ti{V!c9$AIKgA=8lY>s8r0PCMKz8IRNSw8{b9f$@t}?M0}C4xowM535(nGd!9Az$ zjn{C2w!m7vvGk5Lmu0qKBDs3_TkDs)VQ@3Qe(Vvyhfo~2cI}#LNkZqL?X^4LlwqO1 z2^6zzW&wdM3IB<}0h-?G+EMTsT(`ql*8nehJ`osf{#BtGlcOthe}6&&HXeKEccHpV z#p*qK*E>F{SJbgTejoy1>hWiRAuZr7gtA}(KtpR7)&!=g|MuK6u{(RW2x8R8;Fv~ zg4j@qmqo-c*vCuLO9V%UBTQcozlOgyc1uI0SS#+gUl#?M!#{mudJL9y$L%J{A^({? zL=@L}nGheJC5jXuA3xjdi@LZZjDEIFPay2X3||Zh6d(GoqVnqFD>j|`Yh=PYQO-9O zzhBn8_UfmaeYmT2aC8^1DOxDHMh1L`Q(fU3Z>+6k;c9-yTg1UsWi^dtohf2_g40#A z5&Xszk94-@cYj@srl8p}S&lQ%ngau2IvvUVK?6Jnin8>#g_4O#CS6(R{) z+lJ;s4O}x!eS9`AlMKa&k2PhhDp15lfl3Aob+JBnTSt5?Sb6PBDl4O<0hwH}*2{=<;xxS= zNsOxdo&Fl*#bt^(<7XbyIlM_l>CtKgG%ue7Zy#FL&1+3;@E6=zPKtb->toG-vx&Or zG5LAB5g1YwLGe$j#ZN1{@7;gZ!Gp`#C>g0x&6dV>^1uD}6w`00GZhvbOg*~$(h8~Y zF(7Y*hF{_`N_^Z`Pmj-ctmYk0{W%h#rh&JU+x(RSLnaNX1lN%(lRyN_HabaFBU4w` zwFzEaA=YB6LH2~uVev?6`W~d+K|Zoap?deeRRnDuml$9>=5f`&JTL0m%RI=7_woS= zr2lPH`jh2DumWvl{;E`Oq*+;cZ&QYH_*i0`XmqJ8=S>RGyvu|QK;^RC8LMC^As<`r zqRjk8bhqebk+=0&!GBa5QbuYDs2ck}j9aLNC>J|BOIHY%6et$SnRPKRFh~RMa^%xE z%`CUJb|dVrFE1tDkJbOXEl~Opq<}a%I@$qZ>WIhFTkyig$ zt+pYel{Egc7KcLZ<>loTI8i?4pbV)}c~7C#>+}u=3(sGdq5~uOa0z%u@&9?9-Qy1K z7F^YY@8EY9^6}c*+K?iIVRZuHFb#pHz^LZ?RD4qoS1Y?>`_EoZT@u3g9>_dC4)Kyj zFck0Bh;+2{T;*cH{1>~roA(iwUw@K|NfNLmW_rO=J#n7NJ6(8@Q0D6qdmEj`zSf&4 z`8!}&_wxQ+d2Ix%qAMrak)QxJJynkv9)&FKUXjA*$^-)H^RtzSJTwwMMu`zYuT#+A zcIFDoW$tL)pPJmroFg_Tt*wwZBqvtjc4oa(|E8I?vNCmoism|IdeB7UFlC?}Ow2wQfez8Bm`(($&#K6eR z1%wYiloF{r=pX zZ9Vhb!No;VUq5q4aA+L2sitMIXQ(@<8CUmTpc`yarY+;AIV-M(2uw2LX(3ezna9jY z55)v>e=d5d8{9?`3Ti#8jGg8d7S_QGL~jP4D`GjAhOql?Ys(lO9v+*RnCIFaPNZb% z-iYz^xf-2|;HTs#anTLLb02;q#H3Jho#&B(7JMT3k@VB4w@rXU{nUthj(&_%LcQ4D z%j<0tqb?l_WPV=f9!yy7%vR>CaDbVSVK*QvJ6qIH@WqQ4_Lj%GmAn*(37oX-KfXGB zwWJ{k%t=erzAM`q+xAwI;$n-^UaGn@h4_fMLaWw3WxMMMz&o(*BRC&Dz+FEsCt|?? z%E$31IEB3kwK9+tcIs3};+=1-#rw?}w&k zBLed3T7O$bdG)x64!t)YFUu&Q@fWlsLhbNs8&yyAoS(H%_{PDpRM@9YZ(z94pb;B znwsWyc!KjD0J0b1R?=@`uhxN{D?Up*#M}q&z{&@^RARpxz$+r%M|Gdn@uR+&rR7_Y z4O$^@kU7rKl^O4DKDuSM;Lrn2 zt|l%J`R%T;A&hN4fgZqyH1sWO^U>!Suk4L@WO)j+{(E>5-K`uU=Y2S_|GE3tpX2HN zy7gP9q1QyAat^xfYb9;%FfdQ@6>_}Th``6kH#sx2KSW)Ea&?~P40JfbS@qX!`2C|) z6re4{V`OBO64xShTD#blG$zaX;F0}G(_nhg|1_gs&kNl>JcBCGfTwhfYY$GvdLJ3d zpN)bi+3`_e`l#oy9{~>Va@kqF1g+*`ud%W57YieS-AAexLB8RYY{`Q2d@<>va>>H- zoPL-7@o3?Lb_m77%n|(o%OqNoBM|cFhwvx!sjA)Ms;!DmC}47@Z`XmoK%2? z0CS7IVEY(2paWMV=#?|lensA1xWdlgnz!wKhJ`2j7q&;`7?TKd(C&}C%f@egJ8h=f|^C!s~=T-M(l9zu=coE@8oLu z)J7u*NqBeDMS!0kjM}03gelSY3FqWAE%JLkR_9a>Zt*|+ojJb9X$bKW0=;79pD;Nr zOkAEAH@VoZqH#-qb{z!Z|?YcMl(pXd!ao>BkoxI*|=~Zh5JIw7D6vg7g z)XOhm8?#f|YwV#0+baU{B<~&N#;AFd;EB%*ckE;7 zONJuF!5|VepQm^Euf$*kXya!wiZ8vKGJNC-$OEvQC~;zbjm(4Fx0k@ohvUP;R{if# zfBVPh9-gle^n3Fg>)%ry`Hz{&Nu!|JFa42vYDO;@-pD$cX3RhnO(TFsb+p__IBtTn z3mkJo*adx1P}g;woyNqqS1vJKP|(0s{mrcp;|x;T{hJr%yG7>T#)De${BWr0SCrTJci^7MSQx_}QA!mzg@!;`eh@{xMJ!XP-$lCl$=K6HC_&FVOhH7aEaS zy^IK#+8bwKxgBdA*G~Hmqi{10%RAj6j!FD4%ufygo1q39M!}Ic( z@G9Mk+UuT&d3dn7{~j7`4_o0j90#tg(N@;EQqUg2`!Tn6;RDn3ihAzD8^G> ztF4zFNhS%4uddWPZ8!>-Eo*57p3tKhk6*g<^zl+P_@M>NTF3kQ@7*lz*>WK_mLz+7 zbIoR3_U$@)5Q})@xFY+pbDz~NcVJeCK4;fi&BGH5lmh2tfGT=r4No$4br1kmt({lc z?jtVLDR|Ut{@_}|=oci?@6AUeAI^bkO#eg>`V)8FSXwHVbPMPNj3XRm+>|vsH6qT( z7~Q+A0QG}U=k=BolHHJLIu6{6#LC-^aJO(D$BU z@jf*>`(!Sq2?+^_NeUK)kudNb2m4tx(V0UCDq~mcPLEqQ;DJ<~SWvOp;3dFg=xZp@ zFLt&+@l<+ceWV;}2X$Y^xO=ixhf(V-;}DMiI#UOoRqsC9)kj*1MwR{x(Z~CI(aW*| z@>j3^04r3)Z>1&9A0O^atsRlrU9W7+hRh+mG&gQ@A3L|NU+-&}4EwBO{PlWlR3Ht+ zyGIj-JT@CJ;fPZ}2KDBPFRJT>=vlJJRJ}PP1cS0MSScEVjch!GtdAfAkf+S zdoXisx}(aFBxxuN+|hHIAsZ3Iy}d2;9vB6Km#}C!Wl%$q$1+e#2x<_hkpCm};x^VK zYL(RyykNNl@77eG6$nU;ZpuR~k4**2?rk@sL;s!11dpJ^Gq*8({O=eh1D;Gz6oT0> z;%g>$lBrUyUuH=k;D!g%hcln03vol?_&rlEWJI3j2+~y^94DJUeap+$J}a?rjTl7h zw{9H%{O>(^>Cn}ttcSa(1;`jF&PP%mxlN0y+8XuqX z{rdsJx6fbjMw>9G0MpZhgeJt;w`Us>3kwTQxQC}N$0GS`?CoPfe54 zNi*B$(cz52OQs=7e`Zp{SdtktlZAYErc2|5em8wU(5bT_ny9tb1P^(^8!mBCQ;V^@ z6zJe(p0l&JFF)S|H3-YEh>0M3s$O6uav9YL9(^<+#C{q8D@E`vJXc8PR*v0*UGDb{ z46yAPf`M)UjPa9CH!26)7k`JPcamD@3x9OCq=X5WWv_!dErg#@IB+!p$m8pQn&t@^ zUA4c#rl3}-u(TA<^A?1yI}NoY|9xg?=6Llu#-=QcWwXL4DE0R2Qys$E@6W;z!4Cfy z5=i@g&!ZO`yP3=acXRJ#cxBT?XEN$LoX+Y^^&Rj}DC1C`LjkJ9g#R0}^Na5&^t0@; zkdyTo`2jX_cwwCSqi%xQi4VwKAN*x&NzP3o-I=u!i8-u(93YgHmj10Y?rj)xJzDew z1xb7R`xqP9FfhLi-Bvs7#X1LmLjh_9vkbpJFXru?x}#_zM7RT^m(FM zHm{@3)}!e~C(etZ!905i}~jIIT)gmAh{P} zI^T?mAS>A2QG#(Z_A8 zgZOv)mOTXv;N}xks*#mG`KuTvv6F9^+WwDl<`sCbLn?+W(dRFq_AVfCIV5tP=$Si% z7Q;$3tLYFcE`{!{tK)|6ZzZ&Xkj=s#^O zye+M1ySk=sudi#%^Y+QM?}tKvpeV_Bss3(P6naoQNg<3WDJh}a5^MP9=E!VpsezbF zietgY!gG6ll(LNFcVO@V-d%zUURl;BZ_9|@^*&Jt2Yb#=;eo&%rcMPJDzhItE`PYw zfnCoKz@1UEIPImqf_nhRt$vV;3t zef^-FL-uqP4a&@rvyNx52tNiM#!9Dd%#`AkABTm#6*Z#juy~iFUc4!-$aVTPAVAGOFF*g?+C5krrL6)#<^9YNSlu}Asnh&BzYmP@> z)Wo(B`brVvbuIB~|2}?QGlM}GQACWa5ke>l zgY3Ix%N8^Y_e|Yrfx^ z^Ibmg*Xv{IRC}cb!a(l{cc(QKXJm{@Tw6)G%&2*%lY;?5YZ@S+1qstu6puWg_$%%k}5s*{rdzkt9gCxf&9 zVb-9klSi7g&+qZ^KXH4|ElPI!5yStX*Cfn|+)=?V{1TJ?Vyl5tZjYa~Bj~JUwLwC^~7l0?;IXTfgCqp1fB%>&Xi7 z_>022abKVkrCy@=SZ#l2wjO#g)B$qRa+{j8b22kkANbx0r(LhV=DG}LxVq=kdTWbb>}UG*VS2eH|3v}EgxB85S2N!0sYFsB^s`;SO5sC&9cA^^j=S9lheXl zG2n&Y;+Ns%x9!I1dz)lUuzXxa)AH_HmkQ1jM{JhTTP6!4y_MdG%e-~3A7xZSrN4F` z+aVhkX0RQ$t)H@z_C7ErqUR1X2n-{)2OU#;zr2fQnVX-dnT1YuCYoQm%a$9BM- zD~={ckWZ+(s$*!Fh*$UX9?Sy>;VKNpu48KA)+E%40CtA5Z-IqAaw-;O{*);xfSexT zlU%my-7<7CqM94x^RhIf-6-ZYD8s1Ax;M3f)v=sjXHFX zHu*cfvId$i62i~Dotg>xgq}R}JZq;K7L`vzBXy9~RaQ1<-~aWidQ5FmjNG%-R4%Jk zXNZ|0kBp!PO=9G4$m7NmH*F5+0jYw%v+3?TsIE&J%_dhA%_1djD=~@;9m3NXhH#UR zab7u+^s*#Ce&~b+$VPPjaozuhs{Ds`pjnTYVY^EZUIqK#bV8?vrXM&N;?mN+$N{AN z)2E1KtK$-_D#yEfl@Sp~8u-hH>`zRE6;Z7)Hmqh`lhVRT;>NP z-@NE1z%o za>72?ZR7T^I1Pkq@$Ky|pZ9-54;;}^rBAGMiLQfjI+UiXPNtV~!$;wx@`T$V=?UUz z>e-+xL`sjixNW7GobSfm^NlZE&!G)Gqn|o66AsO&O1C%WNQ{hpM*dr?a~77QE5scW6>%SmIeQK-iCvagUH!E)AcSoqk*0fb!vGU$uXz20)M@zcp4y4 zcQ+TkG)$ETM+8`;yV0DSNX#`lilOlNLe3t8>w=H5vL-QdvxJt&57&lM zXUDs-GWo5c^Yim3rbAD0aJ;*`{u8I)o2@s+g90#pvXs$xvGKgFGDH&T(gI0DKRM%a zd~Ch*!GYqA%C;b|+@!VoInE#^(1Uo{*tfHPG9tLgC{{#v7p~7rG>~9e~a;ZRu zbf!l2FG)I7XyLo=R^XRIXFc<1df8?RYuTUo^&-n@Vs*flXbw84Q zRD9t-bdgj>MU_lbN(q*gjV;To8dtYpb{o1Wwk+NJ3bo(aYGSS4-}ot^d6X5lDTOk` zxV{e)z2+H{)*}B6PTrXR5?-;rYNc*n;=-z?w&jxbDrD`><$%|C_TLfb!`Xd!TZWRk zXq1k1u&9nGJWj3^00adEn|AZjrE~>7Gm?6IF3Nro%p_t|mju68q4_soRGd>wCWLOI zzK*INV{mvy4P$L3)}{U2*q;0p75H0K3avXUC?*!}1|?NuVq!(!v*tZ7+`3*=(z_2; zTV>aemDt#^X{Wi@wkOH6g^WzIlf=M*k`Kkkyv&dr%IOrT{td4WeV%mhrG%m9LTd_eSSqa` zoRCv_Cef~jVDIntC!H?!AJ@2AJ-Yy(Cx8pm99C#qT|-j^O(4m&J<%qdv^ zMk=FkG5)8>$?1gt!FAF6;Pu;G!d_C&Kw~=-`O|0FtW{1mR`|?l7st&r-nm6FH-Q<{ zNtt6fags~13B!#l# z3SbUSor#s_CMz2E0xxRbQ&XSWY;lx|JEuOAlO7}}TiZ7ewW)}tNJ20WkWh!bQB^Bv z1&#a`APnQAE_g`g_mKmUMtZ^L6665D@`S|8I4Vyor*AkH0IWr-VMgx-yFK5$`<&8n z4b0GhrdT=`S>{Yt`eS#K`3V9sYY>m0J_{qJycjWB2#$DlQL0`KXYJ%RzvBnD6pGzw zX^IW!21I}S2&1jU-*A+g@8NZu!r6ES3PPjBjx1_`bR*Kq@=t!#2=Y2Ik&Ri&oKH3R zm0;uDPq!IFRjQk!2ujT%hq9|2f#Wy`R4lE#Izb*O~y755~U2n@^5ki|Z{g zvi#+H#r#nOtWwpSm5&xPp83Hg6re25&9G*10@^BT@xs5{BCdkLT16TqBg|G0&nB~` z@{gT)cI-g4%L4YlkfSofKgiJ>gyr)6sM!+)2-ga&T9wJY1wXWMkr{V@L{VB4TpM?b z*1=tTzeYy@fYv$TgrbI}s=2$ZTZ3Wvy6T@ic5pga%mSUD6=GMgBT=;0;wZA9?=9av zb!Ka*#K`_gXBq7E2!h14)2D5Xuh~Ymx3{N5Q&Cwm)J%!-&$a-e1TP2*!LAI9Z9g|9 zs)7A3`vBkvmrAaEi})s><(QK*V(2vs>cGj(so!K_OhUAyY4m2b!oN^_c}Pvk+QI{# z@R%fis0w^)(*vz`|KMaoV&a$9Rwkw0G&O^Dp3ib$k?L0iJRY#5UGZTMkx{x=J}1I% zudB8_Y)T?k)nhlZT>8+Rb)2fI!KkEUcN2WL_Zj??aXF%*dZkdz2*Xx(BT`>35K9eHg!Gg(>WM0R%e64&(eFQ0AL zY7?)79>g3pKv{^!jjFC>DEMh+;nmuHX4*|$$7~ZEOJ@I#PVw&~2*dd(vj(CQXBUeD z|8QcEgfoF;R4djI@fOLiYt6;%`HQAg>eDHSpuI{JfV`dmI7^Mc>kQvz>J4CY2G(WJ z%~7~}A?Ji~fNjQ{%hvy+4NNRFIzvF%7!-cI;8XzVSo~OaVHVH~W$oJCe$`q5w(>y3$jN>P}kB z4s3ZACh6`m^X9bD%nemfDih|Qfd$$MK4^2b|BJzT_u&+f_9OrRrat;yq=OcSc1{dU zKh_r*-7`msW6$sPyvjOiE|w&(CE!r;2XD=9j*HSYbpST75u}Bso)8PhPp(Y%|C7c5)ebtjPG0LlP6yP^c-~fOFh@t_EJ>8`j*oR<6 z>Z0_yM#T)COavA;L{S0=-0cIH4R|sVz^0qti_85SiJ^KYIvy`}OMYCq0A`ghI+oYS zf{W>nNh80h+lL!%oS(za9wXbMl5%-;8x*cpg+@dK&-Y#zHIaHCW{Hw{CTW^>_b>eq z>V_yfI#r~k6}yvN70Fplt&I7y#K3^5teD2uhib36yG%xF@?sj*zQM>7F~9eO;wz5t#MG#0 z^*>yp@o_^R+B^JmrP)DkA@?()`GM$5u=l5VJ?SKXeLb`|VWSbB(_8ifIU0YiAfnR< z)`AhOf*8W6RNsOgtIR~NdDF7p%@&C%T~$4*=-K1iuw>QK2Eeu(ZaIJiG#b1oc<2vP zruS(_q3s%Ypy&(l+wad`J#aq*FCuL*7Ih{1xt)(#1Pa2;k~fssIiFY1jGhc96dLXr^L8#via zt0HWkeR}ZzVkUZm#=i3{-tW>p+U*NcB4kUi> za<#d#CC~>(Vq9Qqs1-*wRa9HU6G|UkW4rl0>^S1)UF}USRa9dmJr-B%o}l+43To>L N=x7*TEl_g^`X40M?WzC(