From 65432404fa444563a9d0fe4e0861ff759346017e Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sun, 10 Apr 2016 20:38:10 -0400 Subject: [PATCH] Ports vg's library machinery, also flagging books --- SQL/paradise_schema.sql | 1 + SQL/paradise_schema_prefixed.sql | 1 + .../MetaStation/MetaStation.v41A.II.dmm | 6 +- _maps/map_files/cyberiad/cyberiad.dmm | 4 +- _maps/map_files/cyberiad/z2.dmm | 2 +- code/modules/admin/admin_verbs.dm | 2 + code/modules/library/admin.dm | 41 ++ code/modules/library/computers/base.dm | 93 +++ code/modules/library/computers/checkout.dm | 465 +++++++++++++++ code/modules/library/computers/public.dm | 122 ++++ code/modules/library/lib_items.dm | 130 +++-- code/modules/library/lib_machines.dm | 545 +++++------------- icons/obj/library.dmi | Bin 35820 -> 37960 bytes paradise.dme | 4 + 14 files changed, 945 insertions(+), 471 deletions(-) create mode 100644 code/modules/library/admin.dm create mode 100644 code/modules/library/computers/base.dm create mode 100644 code/modules/library/computers/checkout.dm create mode 100644 code/modules/library/computers/public.dm diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 9af8a0e261d..36381013065 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -401,6 +401,7 @@ CREATE TABLE `library` ( `content` text NOT NULL, `category` text NOT NULL, `ckey` varchar(45) NOT NULL, + `flagged` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=929 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index e2ea56d7582..e599326ba8e 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -401,6 +401,7 @@ CREATE TABLE `SS13_library` ( `content` text NOT NULL, `category` text NOT NULL, `ckey` varchar(45) NOT NULL, + `flagged` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=929 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 6324c5fb02d..79e904ed62f 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -152,7 +152,7 @@ "acV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) "acW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/flora/kirbyplants{tag = "icon-plant-13"; icon_state = "plant-13"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acX" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/paper/hydroponics,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"acY" = (/obj/structure/table,/obj/machinery/librarypubliccomp,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"acY" = (/obj/structure/table,/obj/machinery/computer/library/public,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acZ" = (/obj/machinery/computer/arcade,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "ada" = (/obj/machinery/camera{c_tag = "Prison Chamber"; network = list("SS13","Prison")},/obj/item/device/radio/intercom/locked/prison{dir = 2; name = "Prison Intercom (General)"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/security/prison) "adb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) @@ -4147,7 +4147,7 @@ "bBM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bBN" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bBO" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/library) -"bBP" = (/obj/structure/table/woodentable,/obj/machinery/librarypubliccomp,/turf/simulated/floor/wood,/area/library) +"bBP" = (/obj/structure/table/woodentable,/obj/machinery/computer/library/public,/turf/simulated/floor/wood,/area/library) "bBQ" = (/turf/simulated/floor/carpet,/area/library) "bBR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/carpet,/area/library) "bBS" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/wood,/area/library) @@ -4886,7 +4886,7 @@ "bPX" = (/turf/simulated/floor/wood{tag = "icon-wood-broken5"; icon_state = "wood-broken5"},/area/library) "bPY" = (/obj/machinery/door/window/northright{base_state = "left"; dir = 8; icon_state = "left"; name = "Library Desk Door"; pixel_x = 3; req_access_txt = "37"},/turf/simulated/floor/wood,/area/library) "bPZ" = (/obj/effect/landmark/start{name = "Librarian"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/wood,/area/library) -"bQa" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 32; pixel_y = 0},/obj/machinery/librarycomp,/turf/simulated/floor/wood,/area/library) +"bQa" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 32; pixel_y = 0},/obj/machinery/computer/library/checkout,/turf/simulated/floor/wood,/area/library) "bQb" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/library) "bQc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) "bQd" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 1ed7089ef1b..ee8e6682456 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -3040,7 +3040,7 @@ "bgx" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bgy" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 8; icon_state = "right"; name = "Library Desk Door"; req_access_txt = "37"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/library) "bgz" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/library) -"bgA" = (/obj/structure/table/woodentable,/obj/machinery/librarycomp{pixel_y = 0},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/library) +"bgA" = (/obj/structure/table/woodentable,/obj/machinery/computer/library/checkout{pixel_y = 0},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/library) "bgB" = (/obj/machinery/power/apc{dir = 8; name = "Chapel APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "bgC" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main) "bgD" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) @@ -3111,7 +3111,7 @@ "bhQ" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bhR" = (/obj/structure/bookcase{name = "bookcase (Adult)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/library) "bhS" = (/obj/structure/bookcase{name = "bookcase (Adult)"},/turf/simulated/floor/wood,/area/library) -"bhT" = (/obj/machinery/librarypubliccomp,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library) +"bhT" = (/obj/machinery/computer/library/public,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library) "bhU" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/library) "bhV" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/wood,/area/library) "bhW" = (/obj/effect/landmark/start{name = "Librarian"},/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/wood,/area/library) diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index d1aa08e97d4..a473111071f 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -425,7 +425,7 @@ "ii" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "ij" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "ik" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"il" = (/obj/machinery/librarycomp,/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"il" = (/obj/machinery/computer/library/checkout,/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "im" = (/obj/machinery/vending/magivend,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "in" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "io" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/wizard_station) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a2d62b29c8a..a16a419d35b 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -62,6 +62,7 @@ var/list/admin_verbs_admin = list( /client/proc/man_up, /client/proc/global_man_up, /client/proc/delbook, + /client/proc/view_flagged_books, /client/proc/empty_ai_core_toggle_latejoin, /client/proc/aooc, /client/proc/freeze, @@ -125,6 +126,7 @@ var/list/admin_verbs_server = list( /client/proc/cmd_debug_del_all, /datum/admins/proc/toggle_aliens, /client/proc/delbook, + /client/proc/view_flagged_books, /client/proc/toggle_antagHUD_use, /client/proc/toggle_antagHUD_restrictions, /client/proc/set_ooc, diff --git a/code/modules/library/admin.dm b/code/modules/library/admin.dm new file mode 100644 index 00000000000..7e3abd91db9 --- /dev/null +++ b/code/modules/library/admin.dm @@ -0,0 +1,41 @@ +/client/proc/delbook() + set name = "Delete Book" + set desc = "Permamently deletes a book from the database." + set category = "Admin" + + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/isbn = input("ISBN number?", "Delete Book") as num | null + if(!isbn) + return + + var/DBQuery/query_delbook = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[isbn]") + if(!query_delbook.Execute()) + var/err = query_delbook.ErrorMsg() + log_game("SQL ERROR deleting book. Error : \[[err]\]\n") + return + + log_admin("[key_name(usr)] has deleted the book [isbn].") + message_admins("[key_name_admin(usr)] has deleted the book [isbn].") + +/client/proc/view_flagged_books() + set name = "View Flagged Books" + set desc = "View books flagged for content." + set category = "Admin" + + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/DBQuery/query = dbcon.NewQuery("SELECT id, title, flagged FROM [format_table_name("library")] WHERE flagged > 0 ORDER BY flagged DESC") + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR getting flagged books. Error : \[[err]\]\n") + return + + var/i + for(i = 0, query.NextRow(), i++) + to_chat(usr, "[add_zero(query.item[1], 4)] ([query.item[2]]) - flagged [query.item[3]] times.") + to_chat(usr, "[i] flagged books total.") \ No newline at end of file diff --git a/code/modules/library/computers/base.dm b/code/modules/library/computers/base.dm new file mode 100644 index 00000000000..fa0a4186191 --- /dev/null +++ b/code/modules/library/computers/base.dm @@ -0,0 +1,93 @@ +#define MAX_BOOK_FLAGS 3 // maximum number of times a book can be flagged before being removed from results + +/obj/machinery/computer/library + name = "visitor computer" + anchored = 1 + density = 1 + icon_keyboard = "" + icon_screen = "computer_on" + var/screenstate = 0 + var/page_num = 1 + var/num_pages = 0 + var/num_results = 0 + var/datum/library_query/query = new() + + icon = 'icons/obj/library.dmi' + icon_state = "computer" + +/obj/machinery/computer/library/proc/interact_check(var/mob/user) + if(stat & (BROKEN | NOPOWER)) + return 1 + + if (!Adjacent(user)) + if (!issilicon(user) && !isobserver(user)) + user.unset_machine() + user << browse(null, "window=library") + return 1 + + user.set_machine(src) + return 0 + +/obj/machinery/computer/library/proc/get_page(var/page_num) + var/searchquery = "" + var/where = 0 + if(query) + if(query.title && query.title != "") + searchquery += " WHERE title LIKE '%[query.title]%'" + where = 1 + if(query.author && query.author != "") + searchquery += " [!where ? "WHERE" : "AND"] author LIKE '%[query.author]%'" + where = 1 + if(query.category && query.category != "") + searchquery += " [!where ? "WHERE" : "AND"] category LIKE '%[query.category]%'" + if(query.category == "Fiction") + searchquery += " AND category NOT LIKE '%Non-Fiction%'" + where = 1 + searchquery += " [!where ? "WHERE" : "AND"] flagged < [MAX_BOOK_FLAGS]" + var/sql = "SELECT id, author, title, category, ckey, flagged FROM [format_table_name("library")] [searchquery] LIMIT [(page_num - 1) * LIBRARY_BOOKS_PER_PAGE], [LIBRARY_BOOKS_PER_PAGE]" + + // Pagination + var/DBQuery/_query = dbcon.NewQuery(sql) + _query.Execute() + if(_query.ErrorMsg()) + log_to_dd(_query.ErrorMsg()) + + var/list/results = list() + while(_query.NextRow()) + var/datum/cachedbook/CB = new() + CB.LoadFromRow(list( + "id" =_query.item[1], + "author" =_query.item[2], + "title" =_query.item[3], + "category"=_query.item[4], + "ckey" =_query.item[5], + "flagged" =text2num(_query.item[6]) + )) + results += CB + return results + +/obj/machinery/computer/library/proc/get_num_results() + var/sql = "SELECT COUNT(*) FROM [format_table_name("library")]" + + var/DBQuery/_query = dbcon.NewQuery(sql) + _query.Execute() + while(_query.NextRow()) + return text2num(_query.item[1]) + return 0 + +/obj/machinery/computer/library/proc/get_pagelist() + var/pagelist = "
" + var/start = max(1, page_num - 3) + var/end = min(num_pages, page_num + 3) + for(var/i = start to end) + var/dat = "[i]" + if(i == page_num) + dat = "[dat]" + if(i != end) + dat += " " + pagelist += dat + pagelist += "
" + return pagelist + +/obj/machinery/computer/library/proc/getBookByID(var/id as text) + return library_catalog.getBookByID(id) \ No newline at end of file diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm new file mode 100644 index 00000000000..2746aed857e --- /dev/null +++ b/code/modules/library/computers/checkout.dm @@ -0,0 +1,465 @@ +/* + * Library Computer + */ +/obj/machinery/computer/library/checkout + name = "Check-In/Out Computer" + icon = 'icons/obj/library.dmi' + icon_state = "computer" + anchored = 1 + density = 1 + var/arcanecheckout = 0 + //var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book + var/buffer_book + var/buffer_mob + var/upload_category = "Fiction" + var/list/checkouts = list() + var/list/inventory = list() + var/checkoutperiod = 5 // In minutes + var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive + + var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl + var/booklist + +/obj/machinery/computer/library/checkout/attack_hand(var/mob/user as mob) + if(..()) + return + interact(user) + +/obj/machinery/computer/library/checkout/interact(var/mob/user) + if(interact_check(user)) + return + + var/dat = "" + switch(screenstate) + if(0) + // Main Menu + + dat += {"
    +
  1. View General Inventory
  2. +
  3. View Checked Out Inventory
  4. +
  5. Check out a Book
  6. +
  7. Connect to External Archive
  8. +
  9. Upload New Title to Archive
  10. +
  11. Print a Bible
  12. +
  13. Print a Manual
  14. "} + if(src.emagged) + dat += "
  15. Access the Forbidden Lore Vault
  16. " + dat += "
" + + if(src.arcanecheckout) + new /obj/item/weapon/tome(src.loc) + to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.") + user.visible_message("[user] stares at the blank screen for a few moments, his expression frozen in fear. When he finally awakens from it, he looks a lot older.", 2) + src.arcanecheckout = 0 + if(1) + // Inventory + dat += "

Inventory

" + for(var/obj/item/weapon/book/b in inventory) + dat += "[b.name] (Delete)
" + dat += "(Return to main menu)
" + if(2) + // Checked Out + dat += "

Checked Out Books


" + for(var/datum/borrowbook/b in checkouts) + var/timetaken = world.time - b.getdate + //timetaken *= 10 + timetaken /= 600 + timetaken = round(timetaken) + var/timedue = b.duedate - world.time + //timedue *= 10 + timedue /= 600 + if(timedue <= 0) + timedue = "(OVERDUE) [timedue]" + else + timedue = round(timedue) + + dat += {"\"[b.bookname]\", Checked out to: [b.mobname]
--- Taken: [timetaken] minutes ago, Due: in [timedue] minutes
+ (Check In)

"} + dat += "(Return to main menu)
" + if(3) + // Check Out a Book + + dat += {"

Check Out a Book


+ Book: [src.buffer_book] + \[Edit\]
+ Recipient: [src.buffer_mob] + \[Edit\]
+ Checkout Date : [world.time/600]
+ Due Date: [(world.time + checkoutperiod)/600]
+ (Checkout Period: [checkoutperiod] minutes) (+/-) + (Commit Entry)
+ (Return to main menu)
"} + if(4) + dat += "

External Archive

" + if(!dbcon.IsConnected()) + dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance." + else + num_results = src.get_num_results() + num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) + dat += {""} + var/pagelist = get_pagelist() + + dat += {"

Search Settings


+ Filter by Title: [query.title]
+ Filter by Category: [query.category]
+ Filter by Author: [query.author]
+ \[Start Search\]
"} + dat += pagelist + + dat += {"
+ + + +
"} + + dat += {" + + + + + + "} + + for(var/datum/cachedbook/CB in get_page(page_num)) + var/author = CB.author + var/controls = "\[Order\]" + controls += {" \[Flag[CB.flagged ? "ged" : ""]\]"} + if(check_rights(R_ADMIN, user = user)) + controls += " \[Delete\]" + author += " ([ckey(CB.ckey)]))" + dat += {" + + + + + "} + + dat += "
AuthorTitleCategoryControls
[author][CB.title][CB.category][controls]

[pagelist]" + + dat += "
(Return to main menu)
" + if(5) + dat += "

Upload a New Title

" + if(!scanner) + for(var/obj/machinery/libraryscanner/S in range(9)) + scanner = S + break + if(!scanner) + dat += "No scanner found within wireless network range.
" + else if(!scanner.cache) + dat += "No data found in scanner memory.
" + else + + dat += {"Data marked for upload...
+ Title: [scanner.cache.name]
"} + if(!scanner.cache.author) + scanner.cache.author = "Anonymous" + + dat += {"Author: [scanner.cache.author]
+ Category: [upload_category]
+ \[Upload\]
"} + dat += "(Return to main menu)
" + if(7) + dat += "

Print a Manual

" + dat += "" + + var/list/forbidden = list( + /obj/item/weapon/book/manual + ) + + if(!emagged) + forbidden |= /obj/item/weapon/book/manual/nuclear + + var/manualcount = 1 + var/obj/item/weapon/book/manual/M = null + + for(var/manual_type in (typesof(/obj/item/weapon/book/manual) - forbidden)) + M = new manual_type() + dat += "" + manualcount++ + qdel(M) + M = null + dat += "
[M.title]
" + dat += "
(Return to main menu)
" + + if(8) + + dat += {"

Accessing Forbidden Lore Vault v 1.3

+ Are you absolutely sure you want to proceed? EldritchTomes Inc. takes no responsibilities for loss of sanity resulting from this action.

+ Yes.
+ No.
"} + + var/datum/browser/B = new /datum/browser(user, "library", "Book Inventory Management") + B.set_content(dat) + B.open() + +/obj/machinery/computer/library/checkout/emag_act(mob/user) + if(density && !emagged) + emagged = 1 + to_chat(user, "You override the library computer's printing restrictions.") + +/obj/machinery/computer/library/checkout/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/barcodescanner)) + var/obj/item/weapon/barcodescanner/scanner = W + scanner.computer = src + to_chat(user, "[scanner]'s associated machine has been set to [src].") + audible_message("[src] lets out a low, short blip.", 2) + return 1 + else + return ..() + +/obj/machinery/computer/library/checkout/Topic(href, href_list) + if(..()) + usr << browse(null, "window=library") + onclose(usr, "library") + return 1 + + if(href_list["pagenum"]) + if(!num_pages) + page_num = 1 + else + var/pn = text2num(href_list["pagenum"]) + if(!isnull(pn)) + page_num = Clamp(pn, 1, num_pages) + + if(href_list["page"]) + if(num_pages == 0) + page_num = 1 + else + page_num = Clamp(text2num(href_list["page"]), 1, num_pages) + if(href_list["settitle"]) + var/newtitle = input("Enter a title to search for:") as text|null + if(newtitle) + query.title = sanitize(newtitle) + else + query.title = null + if(href_list["setcategory"]) + var/newcategory = input("Choose a category to search for:") in (list("Any") + library_section_names) + if(newcategory == "Any") + query.category = null + else if(newcategory) + query.category = sanitize(newcategory) + if(href_list["setauthor"]) + var/newauthor = input("Enter an author to search for:") as text|null + if(newauthor) + query.author = sanitize(newauthor) + else + query.author = null + + if(href_list["search"]) + num_results = src.get_num_results() + num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) + page_num = 1 + + screenstate = 4 + if(href_list["del"]) + if(!check_rights(R_ADMIN)) + to_chat(usr, "You aren't an admin, piss off.") + return + var/datum/cachedbook/target = getBookByID(href_list["del"]) // Sanitized in getBookByID + var/ans = alert(usr, "Are you sure you wish to delete \"[target.title]\", by [target.author]? This cannot be undone.", "Library System", "Yes", "No") + if(ans=="Yes") + var/DBQuery/query = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[target.id]") + var/response = query.Execute() + if(!response) + to_chat(usr, query.ErrorMsg()) + return + log_admin("LIBRARY: [usr.name]/[usr.key] has deleted \"[target.title]\", by [target.author] ([target.ckey])!") + message_admins("[key_name_admin(usr)] has deleted \"[target.title]\", by [target.author] ([target.ckey])!") + src.updateUsrDialog() + return + + if(href_list["delbyckey"]) + if(!check_rights(R_ADMIN)) + to_chat(usr, "You aren't an admin, piss off.") + return + var/tckey = ckey(href_list["delbyckey"]) + var/ans = alert(usr,"Are you sure you wish to delete all books by [tckey]? This cannot be undone.", "Library System", "Yes", "No") + if(ans=="Yes") + var/DBQuery/query = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE ckey='[sanitizeSQL(tckey)]'") + var/response = query.Execute() + if(!response) + to_chat(usr, query.ErrorMsg()) + return + var/affected=query.RowsAffected() + if(affected==0) + to_chat(usr, "Unable to find any matching rows.") + return + log_admin("LIBRARY: [usr.name]/[usr.key] has deleted [affected] books written by [tckey]!") + message_admins("[key_name_admin(usr)] has deleted [affected] books written by [tckey]!") + src.updateUsrDialog() + return + + if(href_list["flag"]) + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + return + var/id = href_list["flag"] + if(id) + var/datum/cachedbook/B = getBookByID(id) + if(B) + if((input(usr, "Are you sure you want to flag [B.title] as having inappropriate content?", "Flag Book #[B.id]") in list("Yes", "No")) == "Yes") + library_catalog.flag_book_by_id(usr, id) + + if(href_list["switchscreen"]) + switch(href_list["switchscreen"]) + if("0") + screenstate = 0 + if("1") + screenstate = 1 + if("2") + screenstate = 2 + if("3") + screenstate = 3 + if("4") + screenstate = 4 + if("5") + screenstate = 5 + if("6") + if(!bibledelay) + + var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(src.loc) + if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) ) + B.icon_state = ticker.Bible_icon_state + B.item_state = ticker.Bible_item_state + B.name = ticker.Bible_name + B.deity_name = ticker.Bible_deity_name + + bibledelay = 1 + spawn(60) + bibledelay = 0 + + else + visible_message("[src]'s monitor flashes, \"Bible printer currently unavailable, please wait a moment.\"") + + if("7") + screenstate = 7 + if("8") + screenstate = 8 + if(href_list["arccheckout"]) + if(src.emagged) + src.arcanecheckout = 1 + src.screenstate = 0 + if(href_list["increasetime"]) + checkoutperiod += 1 + if(href_list["decreasetime"]) + checkoutperiod -= 1 + if(checkoutperiod < 1) + checkoutperiod = 1 + if(href_list["editbook"]) + buffer_book = copytext(sanitize(input("Enter the book's title:") as text|null),1,MAX_MESSAGE_LEN) + if(href_list["editmob"]) + buffer_mob = copytext(sanitize(input("Enter the recipient's name:") as text|null),1,MAX_NAME_LEN) + if(href_list["checkout"]) + var/datum/borrowbook/b = new /datum/borrowbook + b.bookname = sanitize(buffer_book) + b.mobname = sanitize(buffer_mob) + b.getdate = world.time + b.duedate = world.time + (checkoutperiod * 600) + checkouts.Add(b) + if(href_list["checkin"]) + var/datum/borrowbook/b = locate(href_list["checkin"]) + checkouts.Remove(b) + if(href_list["delbook"]) + var/obj/item/weapon/book/b = locate(href_list["delbook"]) + inventory.Remove(b) + if(href_list["uploadauthor"]) + var/newauthor = copytext(sanitize(input("Enter the author's name: ") as text|null),1,MAX_MESSAGE_LEN) + if(newauthor && scanner) + scanner.cache.author = newauthor + if(href_list["uploadcategory"]) + var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion") + if(newcategory) + upload_category = newcategory + if(href_list["upload"]) + if(scanner) + if(scanner.cache) + var/choice = input("Are you certain you wish to upload this title to the Archive?") in list("Confirm", "Abort") + if(choice == "Confirm") + establish_db_connection() + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + else + var/sqltitle = sanitizeSQL(scanner.cache.name) + var/sqlauthor = sanitizeSQL(scanner.cache.author) + var/sqlcontent = sanitizeSQL(scanner.cache.dat) + var/sqlcategory = sanitizeSQL(upload_category) + var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, flagged) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[ckey(usr.key)]', 0)") + var/response = query.Execute() + if(!response) + to_chat(usr, query.ErrorMsg()) + else + log_admin("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] characters in length") + message_admins("[key_name_admin(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] characters in length") + + if(href_list["id"]) + if(href_list["id"]=="-1") + href_list["id"] = input("Enter your order:") as null|num + if(!href_list["id"]) + return + + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + return + + var/datum/cachedbook/newbook = getBookByID(href_list["id"]) // Sanitized in getBookByID + if(!newbook) + alert("No book found") + return + if((newbook.forbidden == 2 && !emagged) || newbook.forbidden == 1) + alert("This book is forbidden and cannot be printed.") + return + + if(bibledelay) + audible_message("[src]'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"") + else + bibledelay = 1 + spawn(60) + bibledelay = 0 + make_external_book(newbook) + if(href_list["manual"]) + if(!href_list["manual"]) return + var/bookid = href_list["manual"] + + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + return + + var/datum/cachedbook/newbook = getBookByID("M[bookid]") + if(!newbook) + alert("No book found") + return + if((newbook.forbidden == 2 && !emagged) || newbook.forbidden == 1) + alert("This book is forbidden and cannot be printed.") + return + + if(bibledelay) + for (var/mob/V in hearers(src)) + V.show_message("[src]'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"") + else + bibledelay = 1 + spawn(60) + bibledelay = 0 + make_external_book(newbook) + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + +/* + * Library Scanner + */ + +/obj/machinery/computer/library/checkout/proc/make_external_book(var/datum/cachedbook/newbook) + if(!newbook || !newbook.id) + return + var/obj/item/weapon/book/B = new newbook.path(loc) + + if (!newbook.programmatic) + B.name = "Book: [newbook.title]" + B.title = newbook.title + B.author = newbook.author + B.dat = newbook.content + B.icon_state = "book[rand(1,9)]" + visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") diff --git a/code/modules/library/computers/public.dm b/code/modules/library/computers/public.dm new file mode 100644 index 00000000000..d2b06e08baf --- /dev/null +++ b/code/modules/library/computers/public.dm @@ -0,0 +1,122 @@ +/obj/machinery/computer/library/public + name = "visitor computer" + +/obj/machinery/computer/library/public/attack_hand(var/mob/user as mob) + if(..()) + return + interact(user) + +/obj/machinery/computer/library/public/interact(var/mob/user) + if(interact_check(user)) + return + + var/dat = "" + switch(screenstate) + if(0) + + dat += {"

Search Settings


+ Filter by Title: [query.title]
+ Filter by Category: [query.category]
+ Filter by Author: [query.author]
+ \[Start Search\]
"} + if(1) + establish_db_connection() + if(!dbcon.IsConnected()) + dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance.
" + else if(num_results == 0) + dat += "No results found." + else + var/pagelist = get_pagelist() + + dat += pagelist + dat += {"
+ + + +
"} + dat += {" + + + + + + + "} + for(var/datum/cachedbook/CB in get_page(page_num)) + dat += {" + + + + + + "} + + dat += "
AuthorTitleCategorySS13BNControls
[CB.author][CB.title][CB.category][CB.id]\[Flag[CB.flagged ? "ged" : ""]\]

[pagelist]" + dat += "\[Go Back\]
" + var/datum/browser/B = new /datum/browser(user, "library", "Library Visitor") + B.set_content(dat) + B.open() + +/obj/machinery/computer/library/public/Topic(href, href_list) + if(..()) + usr << browse(null, "window=publiclibrary") + onclose(usr, "publiclibrary") + return + + if(href_list["pagenum"]) + if(!num_pages) + page_num = 1 + else + var/pn = text2num(href_list["pagenum"]) + if(!isnull(pn)) + page_num = Clamp(pn, 1, num_pages) + + if(href_list["settitle"]) + var/newtitle = input("Enter a title to search for:") as text|null + if(newtitle) + query.title = sanitize(newtitle) + else + query.title = null + if(href_list["setcategory"]) + var/newcategory = input("Choose a category to search for:") in (list("Any") + library_section_names) + if(newcategory == "Any") + query.category = null + else if(newcategory) + query.category = sanitize(newcategory) + if(href_list["setauthor"]) + var/newauthor = input("Enter an author to search for:") as text|null + if(newauthor) + query.author = sanitize(newauthor) + else + query.author = null + + if(href_list["page"]) + if(num_pages == 0) + page_num = 1 + else + page_num = Clamp(text2num(href_list["page"]), 1, num_pages) + + if(href_list["search"]) + num_results = src.get_num_results() + num_pages = Ceiling(num_results/LIBRARY_BOOKS_PER_PAGE) + page_num = 1 + + screenstate = 1 + + if(href_list["back"]) + screenstate = 0 + + if(href_list["flag"]) + if(!dbcon.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") + return + var/id = href_list["flag"] + if(id) + var/datum/cachedbook/B = getBookByID(id) + if(B) + if((input(usr, "Are you sure you want to flag [B.title] as having inappropriate content?", "Flag Book #[B.id]") in list("Yes", "No")) == "Yes") + library_catalog.flag_book_by_id(usr, id) + + add_fingerprint(usr) + updateUsrDialog() + return \ No newline at end of file diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 498b7b62a37..f7729af3578 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -19,86 +19,103 @@ density = 1 opacity = 1 var/health = 50 + var/tmp/busy = 0 + var/list/valid_types = list(/obj/item/weapon/book, \ + /obj/item/weapon/tome, \ + /obj/item/weapon/spellbook, \ + /obj/item/weapon/storage/bible) /obj/structure/bookcase/initialize() for(var/obj/item/I in loc) - if(istype(I, /obj/item/weapon/book)) - I.loc = src + if(is_type_in_list(I, valid_types)) + I.forceMove(src) update_icon() /obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/weapon/book) || istype(O, /obj/item/weapon/spellbook)) + if(busy) //So that you can't mess with it while deconstructing + return 1 + if(is_type_in_list(O, valid_types)) user.drop_item() - O.loc = src + O.forceMove(src) update_icon() + return 1 else if(istype(O, /obj/item/weapon/wrench)) - to_chat(user, "\blue Now disassembling bookcase") + user.visible_message("[user] starts disassembling \the [src].", \ + "You start disassembling \the [src].") playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) + busy = 1 + if(do_after(user,50, target = src)) - new /obj/item/stack/sheet/wood(get_turf(src)) - new /obj/item/stack/sheet/wood(get_turf(src)) - new /obj/item/stack/sheet/wood(get_turf(src)) - new /obj/item/stack/sheet/wood(get_turf(src)) - new /obj/item/stack/sheet/wood(get_turf(src)) + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 75, 1) + user.visible_message("[user] disassembles \the [src].", \ + "You disassemble \the [src].") + busy = 0 + for(var/i = 1 to 5) + new /obj/item/stack/sheet/wood(get_turf(src)) density = 0 qdel(src) - return - else if(istype(O, /obj/item/weapon/pen)) - var/newname = stripped_input(usr, "What would you like to title this bookshelf?") - if(!newname) - return else + busy = 0 + return 1 + else if(istype(O, /obj/item/weapon/pen)) + var/newname = stripped_input(user, "What would you like to title this [name]?") + if(newname) name = ("bookcase ([sanitize(newname)])") + return 1 else switch(O.damtype) if("fire") - src.health -= O.force * 1 + health -= O.force * 1 if("brute") - src.health -= O.force * 0.75 + health -= O.force * 0.75 else - if (src.health <= 0) + if (health <= 0) visible_message("The bookcase is smashed apart!") new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) qdel(src) - ..() + return ..() /obj/structure/bookcase/attack_hand(var/mob/user as mob) if(contents.len) - var/obj/item/weapon/book/choice = input("Which book would you like to remove from the shelf?") in contents as obj|null + var/obj/item/weapon/book/choice = input("Which book would you like to remove from \the [src]?") in contents as obj|null if(choice) - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + if(user.incapacitated() || user.lying || !Adjacent(user)) return - if(ishuman(user)) - if(!user.get_active_hand()) - user.put_in_hands(choice) + if(!user.get_active_hand()) + user.put_in_hands(choice) else - choice.loc = get_turf(src) + choice.forceMove(get_turf(src)) update_icon() /obj/structure/bookcase/ex_act(severity) switch(severity) if(1.0) - for(var/obj/item/weapon/book/b in contents) - qdel(b) + for(var/obj/item/I in contents) + qdel(I) qdel(src) return if(2.0) - for(var/obj/item/weapon/book/b in contents) - if (prob(50)) b.loc = (get_turf(src)) - else qdel(b) + for(var/obj/item/I in contents) + if(prob(50)) + qdel(I) qdel(src) return if(3.0) - if (prob(50)) - for(var/obj/item/weapon/book/b in contents) - b.loc = (get_turf(src)) + if(prob(50)) qdel(src) return - else return +/obj/structure/bookcase/Destroy() + for(var/i = 1 to 3) + new /obj/item/stack/sheet/wood(get_turf(src)) + for(var/obj/item/I in contents) + if(is_type_in_list(I, valid_types)) + I.forceMove(get_turf(src)) + return ..() + /obj/structure/bookcase/update_icon() if(contents.len < 5) icon_state = "book-[contents.len]" @@ -155,13 +172,14 @@ var/unique = 0 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified var/title // The real name of the book. var/carved = 0 // Has the book been hollowed out for use as a secret storage item? - var/obj/item/store //What's in the book? + var/forbidden = 0 // Prevent ordering of this book. (0=no, 1=yes, 2=emag only) + var/obj/item/store // What's in the book? /obj/item/weapon/book/attack_self(var/mob/user as mob) if(carved) if(store) to_chat(user, "[store] falls out of [title]!") - store.loc = get_turf(src.loc) + store.forceMove(get_turf(loc)) store = null return else @@ -169,7 +187,8 @@ return if(src.dat) user << browse("Penned by [author].
" + "[dat]", "window=book") - user.visible_message("[user] opens a book titled \"[src.title]\" and begins reading intently.") + if(!isobserver(user)) + user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") onclose(user, "book") else to_chat(user, "This book is completely blank!") @@ -179,46 +198,45 @@ if(!store) if(W.w_class < 3) user.drop_item() - W.loc = src + W.forceMove(src) store = W to_chat(user, "You put [W] in [title].") - return + return 1 else to_chat(user, "[W] won't fit in [title].") - return + return 1 else to_chat(user, "There's already something in [title]!") - return + return 1 if(istype(W, /obj/item/weapon/pen)) if(unique) to_chat(user, "These pages don't seem to take the ink well. Looks like you can't modify it.") - return + return 1 var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel") switch(choice) if("Title") var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:")) if(!newtitle) to_chat(usr, "The title is invalid.") - return + return 1 else src.name = newtitle src.title = newtitle if("Contents") - var/content = strip_html(input(usr, "Write your book's contents (HTML NOT allowed):"),8192) as message|null + var/content = strip_html(input(usr, "Write your book's contents (HTML NOT allowed):"), MAX_BOOK_MESSAGE_LEN) as message|null if(!content) to_chat(usr, "The content is invalid.") - return + return 1 else src.dat += content if("Author") var/newauthor = stripped_input(usr, "Write the author's name:") if(!newauthor) to_chat(usr, "The name is invalid.") - return + return 1 else src.author = newauthor - else - return + return 1 else if(istype(W, /obj/item/weapon/barcodescanner)) var/obj/item/weapon/barcodescanner/scanner = W if(!scanner.computer) @@ -238,25 +256,27 @@ if(b.bookname == src.name) scanner.computer.checkouts.Remove(b) to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Book has been checked in.'") - return + return 1 to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'") if(3) scanner.book = src for(var/obj/item/weapon/book in scanner.computer.inventory) if(book == src) to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'") - return + return 1 scanner.computer.inventory.Add(src) to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'") - else if(istype(W, /obj/item/weapon/kitchen/knife) || istype(W, /obj/item/weapon/wirecutters)) - if(carved) return + return 1 + else if(istype(W, /obj/item/weapon/kitchen/knife) || iswirecutter(W)) + if(carved) + return 1 to_chat(user, "You begin to carve out [title].") if(do_after(user, 30, target = src)) to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.") carved = 1 - return + return 1 else - ..() + return ..() /* @@ -269,7 +289,7 @@ throw_speed = 1 throw_range = 5 w_class = 1.0 - var/obj/machinery/librarycomp/computer // Associated computer - Modes 1 to 3 use this + var/obj/machinery/computer/library/checkout/computer // Associated computer - Modes 1 to 3 use this var/obj/item/weapon/book/book // Currently scanned book var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 57f1b85b227..2974fcf0264 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -1,407 +1,146 @@ -/* Library Machines - * - * Contains: - * Borrowbook datum - * Library Public Computer - * Library Computer - * Library Scanner - * Book Binder - */ +#define LIBRARY_BOOKS_PER_PAGE 25 + +var/global/datum/library_catalog/library_catalog = new() +var/global/list/library_section_names = list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion") + + +/hook/startup/proc/load_manuals() + library_catalog.initialize() + return 1 /* * Borrowbook datum */ -datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long. +/datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long. var/bookname var/mobname var/getdate var/duedate /* - * Library Public Computer + * Cachedbook datum */ -/obj/machinery/librarypubliccomp - name = "visitor computer" - icon = 'icons/obj/library.dmi' - icon_state = "computer" - anchored = 1 - density = 1 - var/screenstate = 0 +/datum/cachedbook // Datum used to cache the SQL DB books locally in order to achieve a performance gain. + var/id var/title - var/category = "Any" var/author - var/SQLquery + var/ckey // ADDED 24/2/2015 - N3X + var/category + var/content + var/programmatic=0 // Is the book programmatically added to the catalog? + var/forbidden=0 + var/path = /obj/item/weapon/book // Type path of the book to generate + var/flagged = 0 -/obj/machinery/librarypubliccomp/attack_hand(var/mob/user as mob) - usr.set_machine(src) - var/dat = "Library Visitor\n" // - switch(screenstate) - if(0) - dat += {"

Search Settings


- Filter by Title: [title]
- Filter by Category: [category]
" - Filter by Author: [author]
- \[Start Search\]
"} - if(1) - if(!dbcon.IsConnected()) - dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance.
" - else if(!SQLquery) - dat += "ERROR: Malformed search request. Please contact your system administrator for assistance.
" - else - dat += "" - dat += "" +/datum/cachedbook/proc/LoadFromRow(var/list/row) + id = row["id"] + author = row["author"] + title = row["title"] + category = row["category"] + ckey = row["ckey"] + flagged = row["flagged"] + if("content" in row) + content = row["content"] + programmatic=0 - var/DBQuery/query = dbcon.NewQuery(SQLquery) - query.Execute() +// Builds a SQL statement +/datum/library_query + var/author + var/category + var/title - while(query.NextRow()) - var/author = query.item[1] - var/title = query.item[2] - var/category = query.item[3] - var/id = query.item[4] - dat += "" - dat += "
AUTHORTITLECATEGORYSS13BN
[author][title][category][id]

" - dat += "\[Go Back\]
" - user << browse(dat, "window=publiclibrary") - onclose(user, "publiclibrary") +/datum/library_query/proc/toSQL() + var/list/where = list() + if(author || title || category) + if(author) + where.Add("author LIKE '%[sanitizeSQL(author)]%'") + if(category) + where.Add("category = '[sanitizeSQL(category)]'") + if(title) + where.Add("title LIKE '%[sanitizeSQL(title)]%'") + return " WHERE " + jointext(where, " AND ") + return "" -/obj/machinery/librarypubliccomp/Topic(href, href_list) - if(..()) - usr << browse(null, "window=publiclibrary") - onclose(usr, "publiclibrary") +// So we can have catalogs of books that are programmatic, and ones that aren't. +/datum/library_catalog + var/list/cached_books = list() + +/datum/library_catalog/proc/initialize() + var/newid=1 + for(var/typepath in subtypesof(/obj/item/weapon/book/manual)) + var/obj/item/weapon/book/B = new typepath(null) + var/datum/cachedbook/CB = new() + CB.forbidden = B.forbidden + CB.title = B.name + CB.author = B.author + CB.programmatic=1 + CB.path=typepath + CB.id = "M[newid]" + newid++ + cached_books["[CB.id]"]=CB + +/datum/library_catalog/proc/flag_book_by_id(mob/user, id) + var/global/books_flagged_this_round[0] + + if("[id]" in cached_books) + var/datum/cachedbook/CB = cached_books["[id]"] + if(CB.programmatic) + to_chat(user, "That book cannot be flagged in the system, as it does not actually exist in the database.") + return + + if("[id]" in books_flagged_this_round) + to_chat(user, "This book has already been flagged this shift.") return - if(href_list["settitle"]) - var/newtitle = input("Enter a title to search for:") as text|null - if(newtitle) - title = sanitize(newtitle) - else - title = null - title = sanitizeSQL(title) - if(href_list["setcategory"]) - var/newcategory = input("Choose a category to search for:") in list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion") - if(newcategory) - category = sanitize(newcategory) - else - category = "Any" - category = sanitizeSQL(category) - if(href_list["setauthor"]) - var/newauthor = input("Enter an author to search for:") as text|null - if(newauthor) - author = sanitize(newauthor) - else - author = null - author = sanitizeSQL(author) - if(href_list["search"]) - SQLquery = "SELECT author, title, category, id FROM [format_table_name("library")] WHERE " - if(category == "Any") - SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%'" - else - SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%' AND category='[category]'" - screenstate = 1 + books_flagged_this_round["[id]"] = 1 + message_admins("[key_name_admin(user)] has flagged book #[id] as inappropriate.") - if(href_list["back"]) - screenstate = 0 - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - -/* - * Library Computer - */ -// TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such -// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. -/obj/machinery/librarycomp - name = "check-in/out computer" - icon = 'icons/obj/library.dmi' - icon_state = "computer" - anchored = 1 - density = 1 - var/arcanecheckout = 0 - var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book - var/buffer_book - var/buffer_mob - var/upload_category = "Fiction" - var/list/checkouts = list() - var/list/inventory = list() - var/checkoutperiod = 5 // In minutes - var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive - - var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl - -/obj/machinery/librarycomp/attack_hand(var/mob/user as mob) - usr.set_machine(src) - var/dat = "Book Inventory Management\n" // - switch(screenstate) - if(0) - // Main Menu - dat += {"1. View General Inventory
- 2. View Checked Out Inventory
- 3. Check out a Book
- 4. Connect to External Archive
- 5. Upload New Title to Archive
- 6. Print a Bible
"} - if(src.emagged) - dat += "7. Access the Forbidden Lore Vault
" - if(src.arcanecheckout) - new /obj/item/weapon/tome(src.loc) - to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.") - user.visible_message("[user] stares at the blank screen for a few moments, his expression frozen in fear. When he finally awakens from it, he looks a lot older.", 2) - src.arcanecheckout = 0 - if(1) - // Inventory - dat += "

Inventory


" - for(var/obj/item/weapon/book/b in inventory) - dat += "[b.name] (Delete)
" - dat += "(Return to main menu)
" - if(2) - // Checked Out - dat += "

Checked Out Books


" - for(var/datum/borrowbook/b in checkouts) - var/timetaken = world.time - b.getdate - //timetaken *= 10 - timetaken /= 600 - timetaken = round(timetaken) - var/timedue = b.duedate - world.time - //timedue *= 10 - timedue /= 600 - if(timedue <= 0) - timedue = "(OVERDUE) [timedue]" - else - timedue = round(timedue) - dat += "\"[b.bookname]\", Checked out to: [b.mobname]
--- Taken: [timetaken] minutes ago, Due: in [timedue] minutes
" - dat += "(Check In)

" - dat += "(Return to main menu)
" - if(3) - // Check Out a Book - dat += {"

Check Out a Book


- Book: [src.buffer_book] - \[Edit\]
- Recipient: [src.buffer_mob] - \[Edit\]
- Checkout Date : [world.time/600]
- Due Date: [(world.time + checkoutperiod)/600]
- (Checkout Period: [checkoutperiod] minutes) (+/-) - (Commit Entry)
- (Return to main menu)
"} - if(4) - dat += "

External Archive

" - if(!dbcon.IsConnected()) - dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance." - else - dat += "(Order book by SS13BN)

" - dat += "" - dat += "" - - var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category FROM [format_table_name("library")]") - if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR accessing book. Error : \[[err]\]\n") - return - - while(query.NextRow()) - var/id = query.item[1] - var/author = query.item[2] - var/title = query.item[3] - var/category = query.item[4] - dat += "" - dat += "
AUTHORTITLECATEGORYID
[author][title][category][id]\[Order\]
" - dat += "
(Return to main menu)
" - if(5) - dat += "

Upload a New Title

" - if(!scanner) - for(var/obj/machinery/libraryscanner/S in range(9)) - scanner = S - break - if(!scanner) - dat += "No scanner found within wireless network range.
" - else if(!scanner.cache) - dat += "No data found in scanner memory.
" - else - dat += "Data marked for upload...
" - dat += "Title: [scanner.cache.name]
" - if(!scanner.cache.author) - scanner.cache.author = "Anonymous" - dat += "Author: [scanner.cache.author]
" - dat += "Category: [upload_category]
" - dat += "\[Upload\]
" - dat += "OOC Upload Rules: No erotica, No real world literature. Only IC guides, stories and accounts." - dat += "Failure to follow these simple rules will lead to bans." - dat += "(Return to main menu)
" - if(7) - dat += "

Accessing Forbidden Lore Vault v 1.3

" - dat += "Are you absolutely sure you want to proceed? EldritchTomes Inc. takes no responsibilities for loss of sanity resulting from this action.

" - dat += "Yes.
" - dat += "No.
" - - //dat += "Close

" - user << browse(dat, "window=library") - onclose(user, "library") - -/obj/machinery/librarycomp/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/barcodescanner)) - var/obj/item/weapon/barcodescanner/scanner = W - scanner.computer = src - to_chat(user, "[scanner]'s associated machine has been set to [src].") - for (var/mob/V in hearers(src)) - V.show_message("[src] lets out a low, short blip.", 2) - else - ..() - -/obj/machinery/librarycomp/emag_act(user as mob) - if (src.density) - src.emagged = 1 - -/obj/machinery/librarycomp/Topic(href, href_list) - if(..()) - usr << browse(null, "window=library") - onclose(usr, "library") + var/sqlid = text2num(id) + if(!sqlid) return + var/DBQuery/query = dbcon.NewQuery("UPDATE [format_table_name("library")] SET flagged = flagged + 1 WHERE id=[sqlid]") + query.Execute() - if(href_list["switchscreen"]) - switch(href_list["switchscreen"]) - if("0") - screenstate = 0 - if("1") - screenstate = 1 - if("2") - screenstate = 2 - if("3") - screenstate = 3 - if("4") - screenstate = 4 - if("5") - screenstate = 5 - if("6") - if(!bibledelay) +/datum/library_catalog/proc/rmBookByID(mob/user, id) + if("[id]" in cached_books) + var/datum/cachedbook/CB = cached_books["[id]"] + if(CB.programmatic) + to_chat(user, "That book cannot be removed from the system, as it does not actually exist in the database.") + return - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) - var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(src.loc) - if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) ) - B.icon_state = ticker.Bible_icon_state - B.item_state = ticker.Bible_item_state - B.name = ticker.Bible_name - B.deity_name = ticker.Bible_deity_name + var/sqlid = text2num(id) + if(!sqlid) + return + var/DBQuery/query = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[sqlid]") + query.Execute() - bibledelay = 1 - spawn(60) - bibledelay = 0 +/datum/library_catalog/proc/getBookByID(id) + if("[id]" in cached_books) + return cached_books["[id]"] - else - for (var/mob/V in hearers(src)) - V.show_message("[src]'s monitor flashes, \"Bible printer currently unavailable, please wait a moment.\"") + var/sqlid = text2num(id) + if(!sqlid) + return + var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category, ckey, flagged FROM [format_table_name("library")] WHERE id=[sqlid]") + query.Execute() - if("7") - screenstate = 7 - if(href_list["arccheckout"]) - if(src.emagged) - src.arcanecheckout = 1 - src.screenstate = 0 - if(href_list["increasetime"]) - checkoutperiod += 1 - if(href_list["decreasetime"]) - checkoutperiod -= 1 - if(checkoutperiod < 1) - checkoutperiod = 1 - if(href_list["editbook"]) - buffer_book = sanitize(copytext(input("Enter the book's title:") as text|null,1,MAX_MESSAGE_LEN)) - if(href_list["editmob"]) - buffer_mob = sanitize(copytext(input("Enter the recipient's name:") as text|null,1,MAX_NAME_LEN)) - if(href_list["checkout"]) - var/datum/borrowbook/b = new /datum/borrowbook - b.bookname = sanitize(buffer_book) - b.mobname = sanitize(buffer_mob) - b.getdate = world.time - b.duedate = world.time + (checkoutperiod * 600) - checkouts.Add(b) - if(href_list["checkin"]) - var/datum/borrowbook/b = locate(href_list["checkin"]) - checkouts.Remove(b) - if(href_list["delbook"]) - var/obj/item/weapon/book/b = locate(href_list["delbook"]) - inventory.Remove(b) - if(href_list["setauthor"]) - var/newauthor = sanitize(copytext(input("Enter the author's name: ") as text|null,1,MAX_MESSAGE_LEN)) - if(newauthor) - scanner.cache.author = newauthor - if(href_list["setcategory"]) - var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion") - if(newcategory) - upload_category = newcategory - if(href_list["upload"]) - if(scanner) - if(scanner.cache) - var/choice = input("Are you certain you wish to upload this title to the Archive?") in list("Confirm", "Abort") - if(choice == "Confirm") - if(!dbcon.IsConnected()) - alert("Connection to Archive has been severed. Aborting.") - else - /* - var/sqltitle = dbcon.Quote(scanner.cache.name) - var/sqlauthor = dbcon.Quote(scanner.cache.author) - var/sqlcontent = dbcon.Quote(scanner.cache.dat) - var/sqlcategory = dbcon.Quote(upload_category) - */ - var/sqltitle = sanitizeSQL(scanner.cache.name) - var/sqlauthor = sanitizeSQL(scanner.cache.author) - var/sqlcontent = sanitizeSQL(scanner.cache.dat) - var/sqlcategory = sanitizeSQL(upload_category) - var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[usr.key]')") - if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR adding new book. Error : \[[err]\]\n") - return - else - log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") - message_admins("[key_name_admin(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") - alert("Upload Complete.") + var/list/results=list() + while(query.NextRow()) + var/datum/cachedbook/CB = new() + CB.LoadFromRow(list( + "id" =query.item[1], + "author" =query.item[2], + "title" =query.item[3], + "category"=query.item[4], + "ckey" =query.item[5], + "flagged" =query.item[6] + )) + results += CB + cached_books["[id]"]=CB + return CB + return results - if(href_list["targetid"]) - var/sqlid = sanitizeSQL(href_list["targetid"]) - if(!dbcon.IsConnected()) - alert("Connection to Archive has been severed. Aborting.") - -// reused working printing call from bible code.. needs testing ((Lazureus)) - - if(!bibledelay) - bibledelay = 1 - spawn(60) - bibledelay = 0 - var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE id=[sqlid]") - query.Execute() - - while(query.NextRow()) - var/author = query.item[2] - var/title = query.item[3] - var/content = query.item[4] - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) - var/obj/item/weapon/book/B = new(src.loc) - B.name = "Book: [title]" - B.title = title - B.author = author - B.dat = content - B.icon_state = "book[rand(1,7)]" - src.visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") - break - else - for (var/mob/V in hearers(src)) - V.show_message("[src]'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"") - - if(href_list["orderbyid"]) - var/orderid = input("Enter your order:") as num|null - if(orderid) - if(isnum(orderid)) - var/nhref = "src=\ref[src];targetid=[orderid]" - spawn() src.Topic(nhref, params2list(nhref), src) - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/* - * Library Scanner - */ +/** Scanner **/ /obj/machinery/libraryscanner name = "scanner" icon = 'icons/obj/library.dmi' @@ -410,12 +149,18 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f density = 1 var/obj/item/weapon/book/cache // Last scanned book -/obj/machinery/libraryscanner/attackby(var/obj/O as obj, var/mob/user as mob, params) - if(istype(O, /obj/item/weapon/book)) +/obj/machinery/libraryscanner/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/book)) user.drop_item() - O.loc = src + I.forceMove(src) + return 1 + else + return ..() -/obj/machinery/libraryscanner/attack_hand(var/mob/user as mob) +/obj/machinery/libraryscanner/attack_hand(mob/user) + if(istype(user,/mob/dead)) + to_chat(user, "Nope.") + return usr.set_machine(src) var/dat = "Scanner Control Interface\n" // if(cache) @@ -460,39 +205,19 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f anchored = 1 density = 1 -/obj/machinery/bookbinder/attackby(var/obj/O as obj, var/mob/user as mob, params) - if(istype(O, /obj/item/weapon/paper)) +/obj/machinery/bookbinder/attackby(obj/item/I, mob/user) + var/obj/item/weapon/paper/P = I + if(istype(P)) user.drop_item() - O.loc = src user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].") src.visible_message("[src] begins to hum as it warms up its printing drums.") sleep(rand(200,400)) src.visible_message("[src] whirs as it prints and binds a new book.") - var/obj/item/weapon/book/b = new(src.loc) - b.dat = O:info - b.name = "Print Job #" + "[rand(100, 999)]" + var/obj/item/weapon/book/b = new(loc) + b.dat = P.info + b.name = "Print Job #[rand(100, 999)]" b.icon_state = "book[rand(1,7)]" - qdel(O) + qdel(P) + return 1 else - ..() - -/client/proc/delbook() - set name = "Delete Book" - set desc = "Permamently deletes a book from the database." - set category = "Admin" - if(!src.holder) - to_chat(src, "Only administrators may use this command.") - return - - var/isbn = input("ISBN number?", "Delete Book") as num | null - if(!isbn) - return - - var/DBQuery/query_delbook = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[isbn]") - if(!query_delbook.Execute()) - var/err = query_delbook.ErrorMsg() - log_game("SQL ERROR deleting book. Error : \[[err]\]\n") - return - - log_admin("[key_name(usr)] has deleted the book [isbn].") - message_admins("[key_name_admin(usr)] has deleted the book [isbn].") + return ..() \ No newline at end of file diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 2501c48f23a0181f3aa9010be7721370096b75a4..5404c91b3b9e4953b7c46c15f42d7df69df72ec7 100644 GIT binary patch literal 37960 zcmb5Vbx>Tv67Y*dZ~_Dk?rs4RWYItfgy8NTAOr|5i@Uo^umHhb!s6}(cXwNYEG)Zk zbMO7WdR6bQS5v2I_Uz8tp6QuB-M^WR{QOA)51SGj2?+`BgQA=|5)yL2zY7Zkai@5w z350}%LguZh`(4h;)xyQ@+jl#suSiIqIjL#VUsw4E$zZr72qrAXnW>5!a1}#ZD1QyDc`}cnvz(rhd zBetV(2>VEBrEsvWMAQYe|C~7N0T{+TP%I0NWW%%wf)RL8~JwR6ea})Uk&-zXnXNv!>XL zA_>GdVqFv4-BG^ESQrvb{*n1+TReD%XEYZf`|5OTTl?{Owj;mPE=}^&99OO?pxHqs zm%Fod#@WQKQ=J0TjXqX65e1cCog`#@#!4A^?2y1Vv zjtXlO#?^yj4eEF*al_xa>rVp>2R)?;6AA+Xgn^hiV{@^OWa|r!gU^SbO$xgL`2O-! zGtf`n9^tjsH;`anf`98f>3q4Z{{TY?FiWPA+brTmLZUH0JvyI(X#~9#))wJQln|-34|K_fiUJ9^f+0*E^)7fU%BI#yUZ|gXRnDZs z#M;`DNfmYbUJ|Dv^^jAcVss8yav9V&-Dztbb^OYBa zrOF>_KrrwBbi?)VlRKAwKmT0m^)hEQlIiWq{IAn9aVBs}bMvf*hU|R|1-UwYg+kY< zTJ_WBpP4{H1}BMX*dh=e8g|)RWiWOJedGR}&h)dy%S_xB;PdJ7=?uIV=bt!EfJZz@ zA7~RJn2Z$T-65-M{icFCOlpHioqkyBVS97>dE2CLweN;htB`?znWwhp9q^(L?)?$x zD~Hy!$;BA(597C?L4(a%XjN5JBXY|x!;uQD%B5PHDf<1*Evy&sqZ6p{^kwi0%HnLjRI2E)Y8z>?yV~! zvk&sV{i1%lfKUp`S1)KgKP37D`Rwt@D1vI}Ypi#k&iHX)U8>t=7Bhq9U7MA{3Vs)T z#!sS*z8wCs5bnFk_HKLy|E%mG9^${`EWH3t$g3!3N5|!K-e$B7PhRRq>@OcHe==)4vCqPdk7_@US4?b za%tQJoOrV=5FPXmw@N{B-yrIg_OWBALZR(JHb$FZ$QcFZWDT+SIC=w()r^PS9J-EK zEY>|p$EyT_0e*+WP+|cjSAT)sZJo3OhO$m;59`LADGC#_R7aQTZRPkS|9`1UYu^PLMOnF1x0 z`wfui{_|e6`v@4+(zpnk_TB@N75OUc@D|fFJ7Pi?tsx2;T?1F~TJg=z!aRTjTF8ix z6LYg%{0M*^b?XW4hsuYTtYNX3dmW0Qbc?ac9o(DuzC#DA#`q+}Qq z&-t4kcsU|~y*vdDWAMxH%bOIA$IcS>nUqIgPF>`WuKv76JyBYm7^&>(I1UIM={e8i z!S2-%e`fTpjl2TN+6zROEZoQ6ttFuywEh`xrwcQG{-pR#E66xGUDi6TudlCp?#7}^ zpb`Q50a_1Z?=YrU=Wlf~zkZd!05x&yI?rS4iq%T=%Nd%Yn;q-xc6{$&-`@g)M>&_b z{5_|eiN`nVd!G3K&_=k#cVyBrc(sP=gg@}4?XZ3mbbDKK^DK6;)yA4fuIc}a>_ z-U4c{rfN9qs|))38)SR z@mQYEPNZ2?fiD&<>^e?f4oU>q+|Iv}tDX65o0n9WaTHQr8201Od-_EM zU@BF!&9=X>y>G&j|c|}3O z_cr1l>|Wz;t>sOGf=0SUGN1f@a^?zL9c23MktBdZY z-BV<(kola|n%0 zrUlsdeiT5oaeq7P%m&QLhICgOt%=x7wx);V9D$?x>X;w?`v3)u0wj_Sn#)pxs>7Q_ zW3laxIm;We4w|cy-@lo+;}LF{*MB`WWxdADTR>A$K`#kg$u;#*{##BdU4AASf4*!G zmTD_Wk)}UV3^TMjQHHVc&VoiLL!Cj0&8z?qS-(IW({6xJ=0_7lk&p<~9aYuIE8u)e zJoxZkYaGhC!ZjBCG+WB)PCJE^g~6*{K7JMADGj=w8xnoakOVAQh7h?G;bx=2*U@GJ z7MlH>|*UQbelh@I7);$GKL_RBBAvrpjqSOjufPZ|EiGl zfr-jmBK`ArS+uJ=n=F%+x~@WbX@tM_oE!@}OOWliMrcN1mrTo;{zU6_9`VF(L?cm* z{BA_}(rzi>{Z`}R+L|a+DBn&>XpyU? zt8tV9g{17H3UgyXuVe2Fi(jLn7bMQlD^?QG|1#Z(4PM~cD%2uGXOm$>vc*jOv~~N$ zUc~qx*IKR4Wxwh%3IqysGP-^`YaZ(oPS@xKa8y*Yn!FPbp z1FuPgySTH<|2Xbua(f(b%2ibqF9=8o{7|!cWZa&Y2lo?m4T}623kUNyK0mf}HaDiH zrDgiUT=OmFN>!-+{?0&$;P(>m#0Zp2*}P_QzhAq2?;M|jSI^p>Pg#w(cI6LaVGnmd zn^Oq*DC-)dzwf&hD&4;P8{|it#JmL!QegAJ1VvOhm z@h4;4Zavz{ZA=rtNUeAnD*SLwP|p`Ug7nAt%%bz}e2vR(!|76o4XaI_^A~Lh0P@#W zb6&Zq!kQAP#%V>=P5^H}!+^k=RQMt4U5J$;wbNhUcb`lpxMUNYpDzm&KkFygpl(AZ z>A!F)w?C4=?=QH!r5>qKfn42$S99=|7r7FXfWz1Dd(vM07u^YTc+!K{m=&^pKT-!L zwijh3=>?DwA=PkjDyP%@qVI7wbh~F0xpq60yNC6c_g~uj{pL=>*3ZVCW^()R(aP-l zeOj-hyuL5EQg%S8#RUK8jRX``JMofmcA#w3FBeP@nJGmZhQ*baw57p{EPaTRgMj|r ztZ9KP2VOIG{h%y1GKwK9AB!2=%eVQ`q#PE3JBw&x3J(|XoFCg{^o8dIWTAoY5wV^q zVj*b3Cq9&2iF{P0y00_Byt4t_vtsye$BTa_D9d%mpOSojXpQam06|pz9+z#BKa@nw z{~@fYevhYjB!?uU^z!%b#>nl8%I6L zY_)`B`I)}g1qI~c%(q?Z1Pp57ZXU4|Qi42*PXTE73tA;~o3~ER8pkBEA1Ji1FzQ&!LE`#PU$=JjV5BdHL&m=S9B@SMQA<@|{ne zH;Og_x^?8EZkRUIX)jq*e}HP@+aJ9TxOBUD{b4uTl|}IZkFAk9LDYk7Jo&ZPv|n+6 zi`p4~i;aM^{so_J#zlXx7uJpI#M7^mc%|QfeO?AiCotGhEpJGv7{zQ{kYo*`lOUp1 z@rPcrF1G)SU=1l;c-z&@!=vH2NhexTa=*PCk4m_o$GAD>Bn;z(lFB)}5mu7&*TZdQ zc}CjJih0wh3EM8NYGbEadOSr_Tldd^@&(Y1`uI~+x7A0Rx)xT6;Z#e-K*FHpIFo(? z{~O9`eAaZlZps}cY)W{5lU&%HZq62UVJu&0HW}vJtO3?M(JyVI6&zXCQ-jT10Hq-}oP!91u8QxnEpdd3{DjNI z=EY|RW|?cqRNUqMWH;Yusc2L#l_&l7DlpQW_u}P32$6j1`!ggM8BIs`>=nI&jkr3RAj#v zC+H(552e%(SHB7GlucB-zfviI>-@X7nGA)T(j%oX zv6bn+HK6tfkA-84;L^SpN23din=q$%xu~%WPHmP}01>BP3|;@MXlwwz@n=fF(PIXD zyXzK3&qo!*h(YRc4kOHXn2}{DGt??kS?uvgL#GVbA4@;Q;b{#(#QFQ{v|TCNrXdTI zB_#UxuXqd#wP;r9*saUUTb?(T6~p=NyCIIoAFb1(e}0&0AZKQ3=>-(SsXVHY9Yt735~ z^nIk~bJ1Va{-kKrYJ&8BT6S3eXFy+CE72c4_EdgZ?)hb@Yt$84O;$+PJRMA>9z7bEgEUadZ^$Tknt3| z%`oVbahpH=kk`!h6*w=ABn%40A#=I0*hGTL$3@!>#1G_ma6|10ta}kWW+VaBQ5u%F z<%IbCnQmhQH{z!g_n@gan{Y`j*8H44_(T$zV86<+U1*GI!RfR&RLZUfXm5WS(TVta zyg5MRm+b%O!$0ogdN^s;*@S3!58-46vcd1pSM5Yps-L$BZbl81U>6q`(!hAwmiEQ- zfzHvz#lZ^ga~>~TZ+d-wLe(FNYV32a<$k{M=BS~g!)NI&!UEIq?d+1$B31nSS1CfvCHvV5^Ma7QwxpmpNpl553$cuo`nf)YT79;o(k<;5Vs>}$pp~#x zBvQUW-0!0`sAWne#n2+faQ61SwD0N4g$m4zXi zOD}59{#h72D~dlDHPsuOuhdEQhgiKzi3I)b@+Z8sscB^xJH;^iTXcV6B^_A<)Ujg5 z{9=CthFRTTNDpz_*>f&G6Buk@TJWd+`4cm0fDfB~X!)jQ;{ zs2(R{fNFu;wu`Dy&}wVFK(*)T(%@gb*1?6YdyufuRf!oZ7;y%a6eqZI^Ae?CwGS{Q zK}~o9|K3P~v!H$#5~2&;3ZW2OYWJ6D2r)&FkU;QE=e2PJX`SS^Lg*8UJnm=2D2~&Q zg4Up+!w9O>Jy5bwV1V0@#zj#K6{HdoaM}?6>UH)m&R6&5(Z}rrB$mk2bu=W-dGMEz$!2R(@R3`m;53w5a(J7j?&3TFWZbq`9{@0VB-HG?S&-ZWo=s z9M3MnSx~e(`q0yJlrh!)NVWI_%bPq*iQiEfBupCkb~+Hq0eKG+?k$AJ&YtQTB@DLp zXXCg3m!QCy(H>z`+jCuF5g=7zS4#+1X;XS456Xkt^6F1jQo z?=x@exPkm+c3BzkThjs(8ME>Os@n%a&3?asv*GDiI^>E^_1!`TECn)!C|LUhf&PgV z6{5c*EfY`}RSD>*+4MWy&m+jr5xi^X|M0HOL(%^8B;J_nUr^ch-{Cnx^?i^nxCX9y zn16Oyg9YRD-HzS~qe?qHo^T!H5_=Vg@D}?Oi7TjJLa;+J5;mDrw6|pHEwdc#Bgxb=J`} zP$Q@U5q$3&)uMUra57iy?dWeLTe_J|)%F1Ct+hz)yoFzz>wS;w5=AtEMATvpS#hwK z{07WguAZ~BcRT#qCU7tftiCH1{e}_=RKgq5ed`PAqQ}E!zi#Z6!vA&sgS1**cecM# zr8tGHDkv|4E>p4IMpdMGHpgWL1<`()+pY29Xxs^D!|g<>>$oh>hv(_pzy$to6SRx} zk6%ge4|&sdbaXVNH4`ET7J>$PLFo@Bb8))M($=SdRc(A75<1u6R$=A>vBBC=7r~e~ zC&);})bUEI!}xpnj@#+j)`XBbo3Cuxtmy(PeKq-=MUd-3!+mpr zYytSzhIpZ~yoyd#WWttY*@;KsuaVuU0fc1v&*N`U!o{$2nYqb_kDZkGxk&p%N}Ue7 z=Yr>?Lkjctj~y0N$Ar9K6GA}$21i}V0`+|qeea;i({`9t{VW6z!DTvHA%j$Qt92IB zeIEPsI&%m>>KI5e3yv5t_mq7p5*v!(NAVA=@c=T}RM>RdGeUg|XXwhWgc6iW!kA;I z%DEm;e52aQo-L|P_w<<5b$`d>+pIG7G}Dqcj+YsIw0@xV_r`KcUS2l^Z0eUV**4F7f>24k^8l zkp<8Qvx03|^8XJdgqim-N`w&m{o_{%t|ksk{H&w%QC0Q6U^8?lc5y*XjfhIb#>7LU zPB|>?t?QNelqz1&Rhm2bJ+QVYm}Zq_W>M$c#S2xtq_}Wy^k(MpHvir{sjn!lpSQ#K z9|O}RslsVLVc<-qx?o($ALW829#91%3a@;n2KG=Gwvv$VBQUy~9Vsa(!yL2uE#AA& zdj;q>-_+~ zFMfKO(MRCRT2=PjBALlcwCya)(L8LFAmo(*G41XAmddjD$E>Vh;Kc`s4-;zG`z_9= zX?VU0?(kI_h%UqOl|y_a^6sDcxo~zobJ8MZG}QWKX4k|K%cGMM%9|et8+1d?QA*)d z|6BZIFGn;KGewLI6f7*}GP{#^t5Br`_E|GeRGDfyITSlCzM;~g9a|<@0zqa5+Tjb2 z`2pcWeY@W6XXSL}X@P{31+JwzF`$^DE8^BSha;FNrwmz&JaqKk&W47^@$q|akRUYT zSF~Mn3~JN3%UyH?3j75B7_0&`c?h^0D}r$Go;i!craP}!+WDu5(_W+iXMzU+&+|2u zgFJ7XGs4(>I3iMZ(T6ZmTLldJ*F~uL*}(^>99ledSgnnLDZ9Fa*5U*v5#|Oo2m^tD z_&h*)`52GfXUPqp$xM{3$qxT&Wc;&DH|xT~j0K^?k?H-LDL8b#?4tAZa6ofEL0W2A zL;9DO>w`Czk{8=zpBt%r=x{c{PtCRfL!Iq58i8r37oJpCC=dRAAKCu~?Qo}K^ZDKb z-2_J)DtrB($013&LRghZwN2EQ!p3=~)h{#&DO3rtIkm9GhospzJ#$0?45MCN;z2n)}h!g)vrL07%?ot%T#8w|2HU zVygFM8>~V96XI)76(VOufO!Vqj>hu(frHyCdW(BgT9q2A7}c~?@L@zCs{Ex?L;~s7{mFNcGpSpz@=d z5wmV%L1eQ#@H}q9z^I>B^0%fKHit5>H|S6lHZG0a8%2K|^mRbWGm#L50#{0xA*cQq zQBREU|A!~{PPrwjWl{Ne1eUdkci-9M^|-z^R0zBay=7H=SSMecK%!i&Ck%_U%ks~(l-g*D#9?@)r!#f90aI1Ryf5)gjn^& zG3cVD(iw@pe9E;JievrPYtpEM{{hP}v7E6&xF=MUKl8QY+0m3bCTJnkd_?mg4C8DA>hv?L1hKLJm-8Yl2288^cC*PZ=|YnXpTpKE7_SQi7DwSZ3%(ESObB z-LjQ*$Z1%#C{kiSzoXP_s%BD+&>{-JZ9o5n4}P_W6D*8t1o@c|QSbLn_)g?}YGP3pW1SiPtF=-n z{CUYjW94NAY^U3Qma*j7kUS5}DvkRa5=OF|jpNVRE#N|%5m*nCWq#k-D1%1K*;rcA zBSj!5Y_`hqbfriy6>y41kPKYeVnQ84(i{w;s(C>pzTE+Li3&3b326?d`8Sw}Pz@be zIlkaI8wV#-DWUFL55D+q8jKPlauoJ~+H>_sGpjbNu@}&Vfu4|jl5*!PX_lfF3qpf8 zjrni`+%?guD+1iUaiJa${;d`gG!YZK5R&DuCTW{j4QC&Y0hW%K694PZzgf7f_zS@} z!^x{0q=(PJp@V?6SFq|TzT*!aFiEIX;6bLdcSm1fk?$>ey^3_#z5_H(?n)|TBtB?C zeu?sDdGyR`F6A0&++IAQ&>FR(Txq8QD|%yAG59sq^~}`B1l!>Aepbw#4#!+~cg2`) z%(14g48k)8dm*eywT@31p8#$YrFK_)`LyP9m9K**iOGT8z=*Jo@x+CG=$U-)Y5rsT@=Qu=UAwZ7oPZ2D(Unnt&7 zsxM#0ObpOTh5H?re$zJlFeCvZ{&kl|Y7K0X$~QAZ6rH8Vcj<`Kc;T6;q576;E=Bx# zjnQGl*K{dThBIHR0D)CAUlWefr=oBkVq~NR+L2=!T*uwSU%$Qdjbv2K9wQQb1^#Ov zpYEVC9@hS4+3Z6VZe8Iw!vMh7A)S_jYsQ!%ml!A?AnH>bftPn0pR;WfdNkQ8X5_GQX!JUdmCW-hPhSW|tqv?_gU?!2+GeUr z8~B95G-~~8UQPSM5SI>T5YuN;(N*t$WF40PQoW(0R92Ge({O^oG3CJKPznBUY;g#3A zErOb`?ROcdji^e57_aR3u8T0`KDAXSWmgA3qpD&4r-L1^p~ZyKk+Jwq75L<$5)a&{ z29AP@v{Ja}>k|58RT zNU;Bv_D~uFUWk>s&Oijcpz%*$MNI_w@4<)3AVTP3ynnIHc+Ll|SF)5C?&6;YudO16 z%$Ju()Rh|5i(kILcXtN|#sfQo!SBwI1m=pa zU_ll7#?p6F?HL2VBFlr9tj>=E7hH(I1nYpyBVti=ZN?hF4WFM?f{B$-{h$ z2+ns~4Ii9k4>*wGIzF8 z7hL1NONC@h|I_IUM~*EM*A3uq%}>N<(0NI$3%bugmQfhrF8p zt0y)pp696Fq4A+7IEs;y6Vc1JfB6p{hnnt47n0;@$Y>g91D;Io9+rA@bz@((NFWK8 z;jO8$N0|`MjfgH|5*Fw}YzUTtFnNFbqaI7%Rc{OCboklwI<=3SNab#neCqFJ2)LQVX{Lvyf|^jQ;B*HibNA~9&cib2c0^I_$Dzx5K++=tSkDrwZXT|E+t z0>0_!8IaaEinSs5cKvMaZ=>XC4% zSB&t5bMI-`JjkCw>o&HtZJ$3b#)-2HI(0jLJxj&%eEi&*6w$Cf;jM1q;XJx(L#quQ z>HvMzQN<`OsOw>|rdkSP%Z57Q*n6t!DxaQ>w0HOFR9ltum+Ysj2b2Y`ePKuf#6v^7 zYq|6f#*qsuJH(tQc$3YZ(zyRDEX*#<^u&&(-z1Ll?B?3!Y9;XpaAE6#td<1|YMY`b zI97{ih3jF^Z)$sFKI-4ay$F%cWxOqT9l|y9OG~PQ-rioTsfy437;c+>_f5ky;nUlt z=7Ua%#9wQ)RfmZrJN8#9m%C(f<_l|?%zDHcb}H}o3&is~bRnx@XP0YDsTY17&bdN3 zr9+uoWSr$t8E~8NI z6LV|5J%Ik-t2^`{pAL;+lBv8qA=VtvzbR>(ZbF`vb}v%O>Nw??;DivIz}N9}`AXa9 z!CggW+d=4>OTw{&Hm|;4xX4giD7?$W27WH>{Yxwx8qEMS+~bN87qd}%5Mym-1H+6# z1~d&!zwLN+eV6kg>7UsAVJ2N7V!4D4p1u3Gl#0cs%gdMJU}Z~{@&8gWKJ<-zRrMI? zUmN%quxfKCy{>EY}d;Qt=7zxlUf zYyO$^&z_oiS*|-cB@I3U@Nl^=@^LnrI6EMBjdzOMqh$cn*B19j4IEJnAdxr6rjOM6 z_hBGal&SKb?OBD46N?Ixlw$kdZBOvr{}^sKH78e3aCr`W-H6dgf`!ak^Yp#@ji-ci zBTK5%jyLvdW5&Xt0LNw9s&9trk74@ML$c_uBbAkvwcJ!lLn8^Ftd<&Day|E1a1p0P zrplW@;AsPG7$*bd_2R&YTw_AJuUa`Z2Zf+M?wEd{O)?R27{A`AqW5G zF`tLAN9|YR_DImQE<%*Wo9C4}NIc(I-*CEsT+Z>_HD$1*JN|Cc1wvkv#kxV{! z-*-7C*jah#Xc{ut)fGWT4GNSm!Z7+PW4PWsjKoXpr8A#72mxwR+p553B zVm0Xne`1w~p#HtTjnx}OQ+!L4+MM`$c%tblT~o`9ZrGE?FRqVPqU8uXvu7BzdmNbg zd&P-fxAgdsOawhFB~Yv{zt;k5GoKl$u{Y^uF<^L?SC^hB4nus6E``g-c(q$d{%#Fc z_5t+C#sDc1IxuEpG$&_dgoF9c1J|D7Jy-z@BHg3KDc6i@?_SSwB5dud{<5m4iIO5kDz`rdV?gmdw+#XhBxFWl>h3#D|%7*#_79z@|8H3Q4UugO%A^F zsVPk$7=#54--3wDjjwM;)1%of7EL*~@n+Hpn=-QTkWJ4LD;qA}VkV^mC@jUnCNHU= zGU6pT_OF%YV5Otvlq#cYf2{?e^yk#V;32a7!SS>A9ydcA%d;I-YZOOj&DX z(P?cW{O6JsWr)%Fv^BvmZv!PrcI6JEaeTh}cNIMdJmskPxY(-C1>^bg!bc$mL`bea zo3FgnhC0Zr`N$_@nLya%8|Uf|Z8O-Xb5 zCAJdtM{KX3l06rFZRpk98aBWwff!d9g1Yc7o5o!n%$qyY|6yXzu9g#wU!NiiE7Grk zKuKLQwMYSHdm>fX*7>tByG#U`P{GPwYW|Ki-B5%90=TQ?2!8sqb;Ie`NthfILu{yDLgI}`4vTbh$K=yRw0f}%a>U?+IkxkmY zBCpNk*zqsTqbzXS#ocd7@Q2VL*Sn`F3{fWVJ!9MHt;tm|8C)=1@JNAo<4pxLw4kyq z9A=r6x3P^g;^F3DL z`rG}f2?fR(m|U5_Fkt0&*iVPW09Iz=Mfn^x^|HlsdB3I^Z{=nWmqQLV^I1zn#R%Y)_#*Rp95pm?73b*W;yoos-tP3=ynH7_~Ef z#@h*U%c>GKNwNgOEm59oYDrIn2&gP@abUcDjG*>B(b^mTtXpPUNQFiiocw8e!=G?k zNLxQ#4mP=-B|=llu={S@fyRWV*kyDxS&-_DHPv|2u2mwi@s!_UrMtg!Bn_x=h@bT( zODfng%>*_onv>3IGYwJ|!A=4)#gL+tm>)@2xv9|?mjv<9joT$4^WptlVl8+{6!EWp z?#xC}VZ(1pQZP{7e?m`m>FhSS(D|eUk}n8$TQyftaF%G-V8<_=Eq_OnX3##7CLuR()!-RBsxUQSG5AjzjKeWgVZU< z8n1+M#3v0E_fzt7mVaJje{d5Yj9H0F8bi#!hwR<5*TUcy_p=|rD__&2(TY~Loq;b` zcdy^)0B|#@)Fu`JbnDX;E^oMOno8&d}2Pm@$T4zdQNJ+VK zv;yR*L`UKYMI#3t+9HdCbZ-u>M#%mzh}|;fAZ-*75LI&S?`_iqJjuBtw^jGLN?7Iv zlwJ=5e~FwYjDQ--!izTs0yVRmHKQzSxFuuuHd7dZbM%RzDL3286Pco+T%7VwFl~M+ zeCYr@g6IKaH|$-^-sMChsQe6k|Gf-+fa~38{E7*#$X9}RGn0ug8nXnOtuk`JuY#D8 zEL8hBSYL*YqaxMfWf~O}u4(iL=CQQ=RNs30sky~tGP7andPVYX7`3%}Q%ig|Mx$Y_ zGSpP2Eg%GGO5>>81frb)mvW-bUH{!mfjM*|x}VabY6lTHTat}+WE9$+4E?)E_s>q{ zc;xe2?GGh+xndYSwvfegz;zMlr4eZ$<@UA(m3=1JYh#v2YoPpN6_r1W^M!$^PtTeQ zO|h}XkB>hcY`02JyGql6Pn$}MI9LLHuY$T{Y*1{(^~-wwa(5ILr~W<_D05RQ}{+{uC&<%Yq{N_;$#ZsQuGp@{6yn*TM*3EN3sl z7f~3L7NXvxLZH%u|5D!$u=Xh=SqV+a%X0SXv`b($kGxx|=}b`RuMQTu|DoAbAlJBq z9kS^dl@nq&g|w%=I~YSRREksnT_#iVCk-Plc{iiiaNqN$68mSe`d3o;6{jb<&DP)j z>#TEFWB-$427H~-DM$L>j5Kwk|34XNFUQp*2)ApfYPg>6f1vKg8{Eu)7(*wf@74X6 z&(?xgF;&f@|KeU^MyK&5ek#aq)l2A&2%|D_pAeBO3o?6^vmk}x5dEuo3%yqcyfEjw z#=fhA?6Igc_%P$5@)FiMWNxwPl_}eY_g|D3dk4@_mCbhE(uA=S<;i4FGUFB>7T{)2 z8Fqc^g_=CAEFzk1!W?(X$q`v`YC`b(H=Kw(F$b0Fd*DQU;w2Dq9GUtKD-|BinNQR5 z^6TT)*$ZbKBl9N{*nKo6YNdCtFp;NiUzM zu+sM-b`~oblmv6hp6YbP0WrZ~!`Tn=;xv6fL-L>RxrV&W>)CxJI477N#H=a z?qt7&X-6>5Rn?`hjp0yL`}5rkSJc{Z_>$}Wddy*@_fR^>kP^1|9ADY$ZWu1{ZF%V) zWQxkSY&88Zsn3_}NHG7cLx<_E=nz_a!I;u^c%I^qj1Skr9&TpJkcoSVr4fAhnVc1G+-h(au6Kb=*@L7)R z`+5iju`R~$Rg@OX8f=EFt1p#VJM@`{*%$aJZ2*TBDDFgI7t=&}`YROw)&F3z&=QQpM7h88XE3`5t(=LCm}qRvj_UZWVxN>(Q1Hdq zVmnh)I{A7zw<~_1yJ4Q+8lR32fKVeUT9^Sq#ar(JNPj7HHJ%;{{7Zje}sP zptKkOZCakM%iYronK5}Yh+63Z<~q4;4?hLYkcua7UYzZLZ%@Nr)64fezUFSu0(K%) zXXkGzZ*PYXhwf1SEYhM%=`7l#y0IlfXa5|cSjWLNwd!{3h)i zQLnV;t637yjlyez#XqfUzH`>Xjun(YJt!^!-GiPvZDfYsGd4MaW?7wgf9D!EJZOjR z?+H#$(xMT0WxXZ~9XHxXDDu$IKE9Zs1ySzCHM!cqd&!vW&xN4Eze=K-Fr?dwiSOsD zLvEW77@J-DX=d*WsKG5wRm=`ZP8(+}V6k@#_>bfABYPfidWDEG$TQgXcaX!H)zZ4> zv*gTKqYnp`)_F3PbF8O~iTmbFQ@Tj0Rdss(CpI?xinX$i>o6?mzJK{*=zdu~oW>bW z4u=rI=#+v_~y+m(r95w$K82RSAb0|C}2Kg zG**4YiTqWZ3z2$}5t)^)?RxO3+inSInuF!S_;HT+iUX|Gnwa)!HTvP=JbwE}E%;ZF z7!mcVJ2hwp!uhg2-uuh9Z_5iUp`&q1?oKu2DMg?^_nTT#%d`+I1sbotT0fjuTwBAc zzCq&z{sBfTuxo_m^>;`JK?@>4jTvX*l4K>?y{~g&-p!%pftJXpb)QJ|Ke}H^#*L18 zSY#Retn$MmZ-qVk`7vjn@-{|Sy`d;^{#LFz)zIYjI=zc`uQZSr+sItX@QY^ZdPyKq16s=BzI)2#+2)^VmD+S$SmZB1-fUh@(q@|@nfo;L*5u_N=# zL+6P%oBM^~{$pWyI{bd#WCh>W$rDhNSV84RA?#|OXnowP3+vtS^SfGUlL9c6a4I++ zGmU5B%ev!+q}s^S_=o9K(B>n*2v?*-UYYE>HD5DcY~yVd=YH~^=!1%E$_fViVcwgv zI&^-iDZYoB3Vc|($!Kxoj28!Efga~;M8U(1nZk~gh_l@i>Bipd+}Xl2_`@*&tcr?J zFceuiUCY;MQo(C=yd_cTJ~6K=WiU7XYPHMlh??;;7Emwyr&B1;=YA9F<}4NvHmo@- z++A|}pP3>-M#Fu=>w3w9$zuZYpEfz79K|Cz=e9=*C@4S1MQU~e#UIZRAVtaTaH*G* zE~}R$ZT6vY*UCq+nj9VcaJ5m_SjNkvg>Nnp?WUeL{bfc^vrG8EG+jD)Ynby=9{Jq) zjxRfty2l(gd_!Fjtv%VhtF%xTr~nbH3l>CD^!7ipW50yMvMA%8_E?u~$PK@3ctNk@ zfqVPuCI>SLvXl48&6IYRfA>Y4tJ#73G+TE4y; zPogE}8wLLlWA7c-MAy9wPayQ(qqK-r3!sQ}LKOt0D2Q|r5TrWNgrb6i zfD~y$0w_(YRH;Fb-g^nj8J_off9E>a`L6H#{+TP8OlD@!UVH5|_r3PL$|E;B$gU&) zn+uRW1n|%zoWG+MkE-7YyM|6vpK@t@6WGT z6ZDUdkDc8Vvo!Lu!>QiNE*HAKMxfw2`NrFHfAQLpsXFN5Ki_BR%ameNPavsDM1u}L z)Nsr>M2fqGwNpSoFw;LW9(m_+0Py&ip8a`7F}*96JU6g#3BBsNIXi%~5-|>Bg*DuZ8Qb!&krs??*o*Kr#bCxL^em1FIVna;O+{mf5*h zw#79iKu0QgjOY4N2z|@k>Ze)CmscaO#UAdpXM=WbJGv90aTsi5HhSx0o9H^fY$fF( zIP27|d}li%G)Drv-agkV=oPK361pXu^nSt z^6q3Y|Hw+d`*A^56myuu#y2*<6W{EH1M7Lm>pa|gP+ehGA#O66$ak$@9|*ifR)Ndh zsP71;s<eoF#+Tp6OZ)5zm#F&i=;okCRFi<|Szp|pbyewb-S63M8y1Aa}yWNk{ z+r+Wa5D61D{);RL3y=4G%)YyF_DKfcw6Z#vLy01>}eB`E_HSiq5Ek z=~6l&Jxr)W#`#{GF3??ewMdb+%m3t0h&a|w zrs`#bV*QurTvM{=4Z2$3t-33g!`Qm#4xeb<(K7+Cyc<5F?rZa_Zz_&Tr)-{5q+e(+ zOK|c;)}*^Dw#0dt-pt@EZF;gveogloss7jFd8?;1B9q>1i28N;Y_qD^B+#4P)d}(0 z>2_|L`DH_Tv-bJ(H~%)?u8*IuieX<-YTbFOY86QF_Q35&;P7lsq?Vnws#Y(=dU8vC z;26vd?6zxZ%o6PORwXz}1E|l+o1R@j1_# zlT`os5(%!CW!~M}Q>776g%Ah}GLrVKldxNLIot13Y;+U8!!KGYvKgMgz)*RYdPK#H z?B1cOsyQ9KJKA??-2i@BH;~~W-NUYr7+upqF6&bDJoz5mAg0gjW=(3akcsA&%Uf9_y6$d(WmnR z;Zt(r6@G1=XpIrUUh<4CasTf&0mO+zl4eO@J5}%nCwDYipJ|xns3gU%e;R5#JFq>| zi}C$UpkuCLbH^o< zVA1L-3K(^zSfqocv9SuT#v)`sdueH@B)go>@v~ky!$@(MRaTo5T)RGFTlfmL0y$;qp5b9k*VXp6$&QS^~Ci( z0>{pCKS;L0{t|J@2Y>;}eRzPt8A7k&cVKC5jTh2h6piu6#i^d;r z9{8)tKscG-p!A3lvlZ+5y9(hi&P8|qLGd5y!8d)kSE{8Uqee_`%CYYRj}m>4y|hbC z@29#bs6W=!ytM)$$6YZ9h&$@))HqKi#dhty*yqABhik&~hVbj>q?_5b!|16Tph6-r za`p?<)aZLGxSBC4M7xIe3nOdugd&t=OSwXshAZTIUS%Gc%%o?uj~`mBB-+T_DD+m` z6EZ;Mbw_{H)SSY3LI-EQjvVCOi-LclaSw zse$`xRI*N;YEYDBI?89j^D*U@MKh^^rdZ8MsoZPbZ_&5n2#-reo&P}f_E<6%<@V~6 zI#TVdSc*TiPTc5YX?rk_q463}(c-axiPBlb8Yg{OJ%+fAf9>9Fyy)Ht4}(8Uy-Nc( z)ilgvPgQxW87Z^^S$UTM?P71bdtpd0hg0>c852y!8&RAiwgB z6>7(@W-!?vPHTv_HDqU$gBf#=pTlKFGQ-u^y59F7TXOWbE{M92=Sbb?(}7UUTCVNj zAkjI)9hdc>T(8HZv>4TpoMG1>nU|?Wd4Ad)+qg}hTpA;8bG6@PzH11P%@Ngc)^VkX z6;w?j17t1rMKTuAEi>pVm(f6bIav>fq%it98H^2HV~MP##b3G-QBlZDq4`7fVD+_Pk{+nW!PqbAehwBO1_N z=8@E!V}_AC@q`JeN3g}lsZw9EwY4?x7AFs5WHG-}Dk=|{UVs*mtD4cCYzJc9s5A-( z3dMNBMDxl&(Y_pdiIk+&G%VmWs>u_flBA6ElGUKf6sPL!ynLa~(pC@3Ll2O%QAGUW z^oIi_?aVr{O@Al$UtBa6g)nO{it(D#-F}q=6_UjAQ^b<>z%+hPai%f9;6T#>>?+J~ zZB`tVI*$&Z3a3X>^1Z-uP+Y%% zfG^_uT)1Li`papFWS9;BO;(>8WmV39JV#$LPr1X;Iyx^C%oupH!8Typ!ENf;Pc~~A ziVPva8-3=#m5taOe2d#TZ}6o{%Yjk|2y4Hf6wd0P9?wO;Wph_n*0k+9rC?RIHvJkr z;*(8gUJif$T4_W|lpy%D_B7>o%|q|0sNBV~Q`D%HHk2)0MZQ*lsFKX#HujAn(+jDoBoeKTyNn{xMerEB z)Gsu=D0%Hq?dmVx0X~D{2|5V}p2ri_rv_uh`Jrk3MbbXPWw`6}5sa=%i<(7%w|)ujB}7sx3|`2!g* z3O1IR`V+&D`NJ97Xot<67!0sUnD4$#Qf8X+w;IEexcP%_%wkDNPbOY`B_a4N)4og} zRBsflNhlv3by0;W?Tp$J3dhXZIXTssHEUvHca`TgBO?RyU%;vHv1HiZ=#oUnD-Y6+ zey|-Sa1ste_RTum`25`FD>xoEk#MAmSKD7w8yn=8lxa=5y){)E^0_D|&1PP3@Np0{ zLzkL(4Rs;<{TY(Y(_FTm8AjN^3s(dgWjh4p+c4~JRGFl-0Gl0~Tc|>gfT{s{H)37sQ z$r~GVorGGsHyK zy?z?OS25#D7iG9W|sxQ+zEa)i%G(WqP;vdz|S*4Fscq?i?vOfA(k5%W7D z`3A(Fi3g2BGD~1L$zp$Y8XDiHG-9{A^7VQvp8tF^G5BP&!r}=8K(-pn*{SJ>WW{Ll z2j5tG*yl51mF{VHtZr{VM%;KOm&OBtX|9=-4cyau*57*4L>fuKPw0=6dp|cXJ$*eT zjK`mvZ(_dqx_1&0S1mKXn$i)O6gP{~8sZxLJjbRS zzIpzAc}%0{Tl+_uG(2En@rK$man5EH?J&8^l{`4qZBW;%#qWOSD7Z>tuWszFV)ZP5 zHl%^?TKtV7wMA)~e);};N5MyWlfqHb2#qz(GB;<3!R!y)QWJk%#Ew%ucMbm;<$23k z=vu@GpqXtYxyu)3hvKq79HC2UNspFq{#4#2u(qaMmo!`BDTeisC*apOj%P{oUYZl9 z#qT~T9(5^MHGI5E{`LkWMqfl&->3k-xW4qfHi?Hi$9=;(Ej@h}pM3Gbvy-*Mb;tA> zZl~=vd0!U4bd(0*r6g=A+KPiHF%9$NJ<9P36{qYGq zP_{mT?HT2!yIO|1$AOhyH)a3!D>uXlgC#sAo;qRPUs7RXmy5c_;S6#Q5DS;5db8 zLiW+Iw;tvugGjbRV~v~0BxecrzStm+`0+Vvi1V20J%rwy?|X8#`fZX))T_LT?K;3JxK^@xr`_k** zk+w1wr6wWotGU#k$w^AS@V2?SX))P$oB--gSp^*@oN6Wqrinjmy)&Zg5R1 z@LE)_Qob+?&zBl>YW&s*(JH)LnDB+4F?6ZH=Y|Yho)+9f72cYl1{V$eGP9n$ltU44 zbYk1i-&y$qNG1ag zX8K1`;+JWaCu-TI3BG?+C714k2#?=%Fc*JN&i+@~oh~WQ-{9B;5j9OGr-DWd++kBp z7x$9?POQH&;c%&ryfDg~wye{J)qJpZ=X-k8=h@9Ex|R|7jbARt_wR#(V&lJ7LS{QJ zA3YZmqJGLJ1EIgPd}=#4iM9Gxu~ur7RPma+5xd0 z5Sv_zsDVxDwf2RNFK*mDJl%>jNwOrq%^0t}GFzCR*jyyh;9wyLuK#MzRtf~=2l*5a zCcH#1T~Z4U4jxtZEw&5%tCiX}H5FR0!iWdkXOz@?;uU%|q?gSmuc3iF;f_}RmnG-Q zYCqel_d^+ekEO@P70Q-oW?bYiH$a3u?WXwyf&*>%<==PJUlVSD5nNqe?VnVqMqMtp za{Meg2s@v~Mip#d`qn{k{GeS$#gEQ#A%r{S?ut^1csLOrC8(L@A>Mt^7luVn`8O!R z-wq*?o0Kh@_zgF9FNUA)$OMx&2vvC|YU^!Vt3=gzn7!=HW%I*l2W}*cdEEc&H98dh z`Z(f?;kDju1!M*NgKvU=z|LwO@S)1%YYT9{GYR=g$QEhTupj6L5^pNrf3^{+-&OA& zMf7j2hW;$A*G&PUkB!9Qw`A60Sq{l#!yw$Oo8WTP4^)Arel?;K0e_yWnAH*qo5>en z)h9Hei07oxQc*UpOfPRC>V%{b3o2i92N!l|xNTB@FWq7sOjz>0PN_*5MNrKVP|u}d z@3}U|q?Vjt|LTn<9kFvoYfuot4~ev};c~j)_c@Gi9gz>ZZRNeavfRrAB;^* zW?XGf&d0{aBIjQ_JwzgzHyTgCguL*ZS7J*{NR`!E2e%W0x^=MkPxBiO`t3>|o2V|k zvboi+KXCRTC68KByfZmiB@(2%WN-0aAjEvW_41XIj(SpKUv+{7vvI2G=*qlN&eSQF z?BMg6%1iLeMGk7=etT_z;UasVjG(%0?vf}JqGa|!z3$yR>fpwvK6cnrgVxH%i6nPl zs>;g7j)%*VgdmHJ8>ki%vy`~&QJFH8=XY?c`jT@KKbklYBXCvB6arruT*Gxw|6WL@6+E_hslz>?*t(ghVsgZBt0rdE!+Hv&%g zMz)46JcK6NI`75|Gu*IF;)hueoDcoHxp6%1+a>=@oO4o9p;D+$>%}m4Vfo!PT9>~* zu1a!sf;1+K(bfx0g)|rL?-_`<2en%*JNuDdds9d=R>lrB+)Qbodr~}ar_xO65PHp+ zT@L90&*}M1j$3lbQ2aus87cnlP|Zs|{RL~23N!dkFZ)5L#J&*!Z|>*Acy2SY_FLRI zR8}onQsb#pgUE|(hlt~aRYuA zbW|FzdC6_7P{SQw_P*p*~()@=7_AQLA~*j)QgqDbEALt3N(~UKb8^qac0J*{($s zLU4w40n2OpdJVU6Qsdu_dmkWs+?OI#X??#!B0T6&CDN1@OESJk#^<=I+(94pDiC6u z-WzT9MFaL~X%JH}aUmaomb@TjmI~wr0ep620BxZOo^|B>qZ(s?D`vG&HXWCEAEn%{y z5O2kM%ffG`ym@!M@WXQ%xL%9Lz3XvTD1a{;#5E#8$R5;s{V=whDvXY$-E&t)ZNYWI zobcoYF{n59V-R1DJntGZ29|(tgZqgshyCT;Pvws*Mxqq#K8MQOH+k`eu5exk5&d3n z18LGH$-VxVLFsNA*@I`3A(~C^J_xS{EQ{5^T0Av112(4>WMhDZ4CIi>VxZu+b2s0* zLuzrc3MgCIC@MiAm)+897hnZ{Mv6k!5S3Ai6f?To*CT`jT972v?HSwLD4WDS_HN5b zVQR9l+%>fMn?BCy=b4Pn+Qnb!T0dT>ToMY)ZGF@_xWoRvt69Bdolqrc8>DQ0`whSo zhGwHo)RF{a{www_aCAeKIKf_%0uHo!@7sEaAoZM4s_daUl+!uEO0*$caW)xay%PbS z=C$85;B-hOSogNU*A?{nA+yzx2TMa4!6$37L8Q|RpVXrbH*{;hPD7Qc&%Ejdr)@&0^wZ{>PpGHHGL^=@FsfSdd}#2~ zmf#Sj9bwaPuv4R^K+(+HL%|lvXj>#N@Tj%L#5X~z*zM@|6zBA$2~Msb45a1+77OGD z3eKenqg63X;pF6ng`d>?3Ozo80sQQyUHn@~$V(0mJRr}+PYI+Y@iU=Nh}fb}Wy`~u zo$-x28K?JXbmUI6gzm46>BF&SC~=&Z6VnA|>KyoT*4_Nm)BL{C8;W)PvWz$|bZ|Z- zBFPD@RT%v4W#I<_lfWR6z=Vh=Yu(kzp&%+3GW_t}J(79Y#zXq}q6gf-FY|<}?)g2y zv*(57cSWZ=LkFwEtJbqS^eWB{Ix_E zxtHXhLgT&CUcFMYt+n!+TG;vclgTXp=6TtteDJj+tw8okn@6DrD^p|J1eP;r+@i#5 zXQIkI5)u|yf;l%|6+3KFWO(k)Zz-JIG2b)j`}o{m$sZm9PmM^Wc0U4euV1(+*(T%^ zFPbR62j9cPfb{SsT}@7TiiWFb)htDQ_6MVC5-G*{eIF>En$5sc*xPfLgb1n>itOrg z{MjqmGL_)z^{Ei!S1*^EFyx~2lS{78qf{C8kJ}w?PAKP|4m^T5QZrnqbC+;v>G)V* z&CjShIO+S(m2Llfd7K7WVOF93_Sb^}gBfJ4A+tG`Z1J1WYe>zeK0KUEU0w95m?{V` zKdB=I{6s-M7Sr@iPcvP62)C#MTZ~`a(+{eZEleVp4QMz{2&h{}^AW0oZ;*^Q{Wr`4 zU@{0ry0tYIybUoN3o&e?a`a;VUOjr&j@reyU>-2)0K2o10 zKGO94Q8>isoE9a!RMZ8zR8Yw!)p3gw5?&7U`BoZ zdwBNLazKC9fjtPTOav`t$(>RFE%#IkSP4$uZz7u#8QIP78_?Y*D{7?@%3T$vmX)kr z_bh;{scWUUs>w=41e|ZlgbgU~6Gu8&O8u6b_&J|Ri=)=%9$D_loWpQa&L;d2%USz= z;ksVYB{eH|u~0bi0EYwc&v&Mi~4O(2rXSEGX+cDJ>x(+Im;Iu(lK#iF=%!b!xT7`V|y$;$&i`6 z@d7>L)As9q;{`c}m>_*fjkDHFrgrkgaR0lQ*Hu7#+I?euG-ojtJ$>&M|Hd;#lrV_V zt9YC=MfBPSEOb|RgV|%80V2(IK+kJAz5;#=jyHL#lYB85g?DCnR9|a-CjG2EzNgDf zMy^AvaoP|^$FsSb$QSfp^g8?PC_ynKhh$nBbzup+e1J3DonaC^Q{vE{5)bRyA> zu^ECtj~{L+1(OGGL#fnlY!Hp|_{d_QQI+xbUAXS`2qTVXt>XEAdO;Q4_17;RGaID4 zU0K$j<4YG^q^tDz^}`oE!OCABH7sbZH816VkzXIDb3OWEp6+|Wq7#>d?+rwFZ053# zZL1ZBCU4D0QJ3w*`E#k82?P33KbOLOngC5RXmxgYR9HjZaRv|ydGF{#XNt1nPcsx# z(>2rWQGw%b+j^#gTa5&%9=Vsg`WN_)CQo}UeUDEMmbQ> z;~INZR}Zi6kB#3)s@-{Ro^Vl8<32lOc#1MV^8!z~K#L4sz1v8-@Y5wKHVy5&%#jq4 z%uvePDe#W#L8pK5_)Ui6+z6e^dJahW%);U;;R7aU2!=@kF_B=4bkO5fD>Nj7$MDRi zv$M-Wq3+o@dPAzH=PVZ!t3Kt2s`9@owT#OzNHlF@cdp*iDHO~V&CMyDtScHajBOrT z|DeZh+?peLolO01;T)N_-(}IOcCx<5(1yC$cBQV_t+`_!>M-!^Dr=iiRpw{3AhryT zQH*2-RGBrh)o9RgY5{|5Lv)KI#TwDIn>kIt`#wyU?89~O&s)~(}Nx*>Iv)OonN1)pB=z@}#Hf^=Q&f2ER)Kp5(Y-EJ5g~!+^-LYM=lK+HXDrhRK1%25+4@kJRg1 zVWe@csfZuCoU^E2CE-@1;am!0U7b9S{5x?r(|h;Ala!CCpHwRZ-nONRGNtJF_W3va zZ0l>A)T;b^@<~o{eS?tg)ad|}ISsyotB1;dWp5#KqgRJj+j{})-|?{6rkanTOn9ZW z8Ah-P-Ww_#0fmI(F6K(7x;s)0qCG5Gf=W)!6F|Z9w6rvQ3pfi0xF7E>0XZVKr0CLL zUcJ@SQshE-o&+8ZQhigSLKT$opLS>OLOz z@m|57KXDR?V_IdN-PkyZMwnJKL2IGiV8mbqF;PxuHWQZx(2Efke4>Rn!E{| z@+49uB0{c}zl@&>+)x5=a~-LBc>de>KcR0?7i0%qA`%a<_7gRp$GzGPzbBffmyRt+ zM88b=Cz(X4@sPTZI%0pw=~oj7?^iik$o@H?nCY}Dk<@T7)dHT$bFQ65X%w~fgUjyZ zhK!7TkWbax2$Q?jhHL`P_oUi=oKnR-W2_<2uZyxElnC}4hH!BdacLa*DltltNs8WF zFjHIkJL_A&here-dxNLQuc{g%vPn{&)V7;5!7qwr`wL_TZQlm^P-N6aC@2`KCH-TE z`yl)k5}aUuN)9(>sN_cwH#S{zPEQUBc7|_1`?4k$V`8U};)RliJ2i%_Bh9;r)EpWW2(k=BrRU;3Rl5etkwF-K!(1}bIq4DPz{YhogP zX`sL!lxGQG$}KJ@$N7#*ZG_WMQc@b;y~}za2eiksK7;*Z?Q;h8w2M_Ezm%>AH_EJC zvNhk`ccVfj%+EjSdMm?}m6eqtgOn91?<1|yu~_zEAj`k5)4gQg5GuM^<}?MZjx z^MJtp&E6zdM1Dxx_W2ypL6bvo0FA2RKn|l z8(W510SU~;BzM(S&ilnwnKZs7R6Hx>T+e$K$lcB}o()rk7wQ*O@>Q6>eEeT{HshFv z|08g*Nc011eeg$A#IcqMH;~NzsQa$SxUQpWEU2YqSC&t%d3GtSVhk%_cYZD0`PHvj zT0&pgo?!=g%JEqzz9f-UF9Fb*-x9mQ_>bStg{m+^lMBGvgF3AJo}LUDg0OjBoE8mG zpvl8k&tsVOSiX9}YkGPHYpduB%`1+xZk0KR}lWj^{#i_7w1O}TK54`{KlH)I*d z28QfNRgm<8bQXQWKjp}YmqYF)z4}FkAkPlo|6REeWS}??3pzYnklo6#|HT+KX9}jy z2IDjHtE**J_rO9Dr=E`=i*ccHRLq-4{X;U)FU8cMojQudzF@)_>f~JT z<^X&+t8}YGhHv~Uk%3;1DP*p?hqR@|AGx-Jubb&OYCQZyH#jn))zE8ifcTtF9rFcD z9p%0|242#W4cFjTI^ST$3tL_ehl?Q-N+a&g8$ub|m%FjR9*UMqBN?e2p8k#19hC=n}cj>e!8OM5d^L+DP;9|M4}UIscb zkx?|3Ow*`uWP}Rv-~a8jcPb&1$#(7LmcQb+sw(MaafPY<d=bS(kE@ zqkYU&JylEgG;#s{LGN`eNBxQYItk1zeWWn}jorX;qU;a~kK$qIl(ec&E^W-1SjVDwO1p!J(kSO4}EL)?0 zaz5bX#1mgsifanZArmI2m4&h4&XEsr@-jm=pCByj10`qpT|77QyO zV0Oh`J6R%mk2)`8o_2fSr+Ta{jjR$G3^pLl3cv;l@1F$mL; zpdWd(>Eh;ggJbk!l1!lGSAr3Z3SS!DTkhIn)%8_{Rf-iR6-FKA*MR0-90iyyf&zybkU|>NBSFjlqc}&xQ=*=sjOhu9?H#zP`|#DWqn|JXrrr2 zVS5@S>w8-JE|v6_=%0BgAV0T}Yq{Gr$~)#a7t*D0dS`ck|IdJg@9g1{l%cWlI}wV9 zyE9wwGAJ=it!L@9n9f)eC?N4PcmxX8ZAC6n?2- z;=@L@*K}Kkxg5(&M~>s01q07*k-O7?H1PmcU=@F0>D686N*W0B(AA{_`)BW z8N61%&(7X~8wsF8elv)`cPc_M_io#d@#Cr=1zaZr0q5 zEIx2MJbik4l!$EzmlMJ89gK#sU8ZvUV-Uqb)GKQ)eF;?7qt=`v4~wlC-Zecq#MEKI ztQiW5CFjq@GTnJDA*TUXtiL@#iDw!yfFkQU8$-jxAErMi38Eg5`EP~}eS23)#_>ZulRXptuqjme zN77d{ghK%^{{rVo!TfrRPTPniJaGY?E)PkkwieA}7DzmJX*+KyhG#`SfHjl*P4;-y zfr{uT>Z^yP2c>t8$Pe8&n!VHPocSAXyB6Kuuf9SEY$a-ZrzK)1DS;6YgK8C zfqQL;o{5B26iJbf=^&ut!J_Z%-}y&i3t?BUUOoFpKLd69z5PXKM4FXgN0U?S0fgLE z#V)GRWM&u{(>UeE4?#4P{j(eq@GwU z@~moNMD5{=(b!UnDLFxrN`d2tmQ3#qdkJG<2}=qLt8F2B3wtN`xQT%`igOpV9vpoe;F z0_nye_`#6ZrE8>;^+#Xd3nF2%;1xctXxMJD%InMA)*66*dD+Y2>d54zd&kM#pOcZk zJ^%pQ8?7{*M^82V-c%-+B!GV&hoM&Zy0k2eD^tpuzj@$crc zsW_Ig4?Sc_Opi1Au1W7nqZ#=FkGG`-S|L&(9x)dhq) zJ)pe9R-}xs-9Femn4N#G>pAj9`olhHhQri$d>A`Z{q`n4ucBvUnmi`Eud8bin%|8* z-2Uml^|O50rVP(;S~W0O-S*l^8Cu1BlL1lphxXgfexUz;71vhQ0G4Cl`m$-sT%M>} ziXe3uT4BBB;zxwpQ1aH^FqXhjU`f$MZ0!KhJ|jI8!d4l2$?}iRSE&n8hW`D!j7Z(U zc)m&UpQwCFAt@3t&EfeqNdub=gwcjCB6G^iS(T!x;BsM$iyNv4Zk6Z8@oGjYkWASr zn^-bobhI$}Lp?MOf@M|lz){)cFrBK0FY>KM(o+a%AlsRtESEQGA|s`tmUdMBCPmE)ciQm}lV2YE1@*nJ6E<79?Hl(O5TtVe5}d_X z#>M4Vf_Tm^H$QLVA?F7U{2KGI`~B;ahr0s?9Ui$hMrmdBdmEX=tKczY0O)J;3Ja;H z8?+m^Cy%z;M#0yUy9HN%B4xWuM?X=7BnTyW^gg2j36!7HQrjn7ae7$P*yK}pcX#tP zk!C%n9Jk{=gN$a5m@u}NFJEr@FsZUbkQ6C``F=>CfgWETrc+DL*ncf3UNj5>OA*>V z3ZjNa!zqOJ$aw4GQ#xyBQTqU+%S-e{<(llXQ!m3B)Vk%Nzma^f$UD@KnkVG_S*v+uWo5- z%J2+1FX8Ot$qjGPS@1BRufQ-~T{Ltpnu)))L@7}3Xh8KcB=hNz{I`>|{r6>ljCq)} z^x5P-=rh-auBJT&--rhBxtar;x@oNA&sSd_OkS$cym=aBLC+Xjl>A1)u{|YT?S9xF z8VY2s1~lwC81zaq!!$siKJ;U1(>2Ogn4no0dsG}HM-_1sOi%z2`DYjF~N<0DkqJbc%H zzOKAvECG}c$mP>=w+VS(XP@*#3lkh=D;d+=tmYPcUiY()lV@Z zJ55}^97=QR0$`(5R}y)hX_YWiPK?83cDGetIgS$^weOy6>;>enH#b;&{F?nUSz91~ zNtQcA2?FMX>e2=<9;hdCfSU8sf4C&y9m0RoTY{0lw<;u>4lUSG_*se8+Cu>c3kwAR z%1|2HD}%c2fPKH!+-hqH6FzM1=N`tKHO7P^?UPMW0THaGSN-QkOU)u-$H@F{N|`C` zk<`w?!9hM2Yg1acw7UBJ`*XJbk&yxeA*E;AbKdol!kVto;V=0Nz;YIea0LF#JeFw4 z{WFnQK@vp_A~+m8QDk)?hb<;4-Bq-3*gj42;acAd=%1L#+G>(B1_e3Vwzu3K{qrsG+OO}A^yESb>xaH z5l(h{*hXbYNA#-v8q?=hwpjn!m@t;LkYxI~^_Q+hlND);|Jc=|@kkiJPk8nINV#0n zS8V`8Sli?{{M=tFWYHjajH~K>f@K5lL5>`N?W}9*jE#701mWg!!OOHi61??BS3gaY z*Q)U{`)=Y@gMXBjHXe5lFXdM8si1=!(2u$@LPan^tWuA(v{crm#FK$nMEh`MtS91J(-+9Q|Zcy%Tnw zY7{+Iv*I1QctDk7%A|VrK1H}H=>GO4>hVZfFw!cdLYckFUoQv4QW&zgfyvw)>K}AF z^A?^tT$$g{?LEur4ZruN5x_QD@tPfvxA6^BSDn28-?1O= zdhH*$GF;|P6+nn;qk;g50+1mSleuafKeZ2bE^~JD@xZ255*0YQZB=PbPlFdXs4iVD z!euVE1^;??TlDJH1oJDc^edy5S7ydr_*^Fum`j=&G5Ngb%6F931V%MLi zIa+2%{=__hCOc$RtH!qJ^Wj*$ncYtBxY?hPFjO(F)J~J^I;H+q*vRm3^UB_>h7ayZ zicbVjS}t|?!_n*6e4?>o`}-}68+&$rr9{@M#;)=!sxv(C*XR#V4DU&SY?xJwpmqxT z4wJ;_u9<&O$0k;L^%!{ark>T@WWiFMEVh_ZX9&BJY5)L5>)%Fpd#kIT{IGaCO%sT@ z%@KKwMP=M%AxXLm0Jw#nnIERs&&MfJ2=j#MsQ?k#g_^amCWrZL0rL_O|$%4I-&*EPSXPd>?DE^`Fo>h^Af2*_=>6Od!UytP4?C}|~(^}MDOeF>L zV?$;ra7%*+D;1tRi2(~J^7!10jkjoAQF+6H04i+vN zYgj`j$x?o07OyH16-9=W)zD74e@8HC48mS@ko2R$vl53X=5_`(v26$3zQ3I>`5tK) zj#5K(*_;%=mVy9Ep~@59Z_PQ9R~K%%`x9rBzc0VND{U7>JPg(1yDbaE5;{(+C!UEI zwj)=ThZa*QH@96&A>u$Nz<9kXZ2}>QPWkijZ1snL@f!HD5c%oTr89747GODdC=Hr! zw>c{?=mV>~#vnzSS*amb^p*|xsduj51YUB)q(kqX5`Q$qf~qjR2+}v}wybWvM>OIR zWFll?ay4<>V@CfAz#J`A7%);g)&Em9F-I{%%{m@3A6|qzwI{~En#%xI5w~(9TVb6u=wO*d4K7g!8GbfC>{T0ns93mZE4&a@6ui4qk*l+4)p&=Z^ZYsj8l zQCisrQBhI!&%e!|OwJ_|6L4-cxDuwE*3R0?UxH4a`glLp*c>642qVy~c;vw+lYpq{ z-Q^;%`ZVnT0^v^z22=((Oz|JapGfg~w_|Ea$15f3KNU7|atf&t*cnQ~!=XzPPfym) z1@9+7l(&17hh5FzhFW#tO)H%2L2yxaA=3-Y6=THOxFeIQ+??L9&Aji3Exh_Mi1f$K z&$hP;G2dN_J4dFjx_fkd?K@Tf_;ise#Iwifo)jO)OB2zLqESEJPn}lup(RyLTNKoN zLd(;^KyRFnQ5YZW4awzv4$hkkmdu)x z!fHkiRV)u?Uc7^YF;uQ7Yoz&S|@zbmaZAkrdP`k>IV5~%mDO7!UoA%WXU@mO!+G%sy6NozpWh* z12cn|p;W-RJW&;+FltJ2yk+P;c25$y>snEDtXDN}TnP6qGFK^vu^BKs>mA*Z*GiJ+ zC%?n5Y1EZsIrpfEg&$RIQ7$_NZ<~5HY?L2{G@1cmU~2HB5pHhqmOTtH4}>ZWgBr{C z`aW#WybTlEq(ta8UR3>VJO0%jcu}^Hv`@H18m`%}7ZVdl+L#;Jbp+scPb-)n{V4bH zOi#Cxe%I@V$t zK=w|fNBbiK{2aJcKialD^e#!QxRrbjAXKXS;WB@1o=x zJ(%K22J8NPMm!*nc79_jY1?O?D^cfv`O-fasmbTDFMGxz%!yzdh!NyX;5#$srn`C9 z$QZa3?hL!}Ou{Gy-i&XnuBy85vRE6uI zs8r;?Z7D_AapQh=cRM>fdO;O)H!BFtysh?U?4T zV0kcJ`}OPa@{Z&X*%`2Z);w@GZTor?T?ZWOl{4JlpgGjmx>V*8-Lrt(!=5FL!mvVJ?ci%R^t@%1x23`2~&npIXg6~Yc%nB@u|GR6};PD;X zH3t`0*O|S5mMQP++9(`U$0ca;F+1 z=wjSH{GS~lJ-YMOn)SNb!NvNMk~5M8?C8&X1%uRj%uv;MUgtZu|2J9uf07R1DlCwq z6-zs_(`|Ne)f31u$1Ww~9*x#|Idy&1U0GSFC~yAPze~1 zpfiI6?Gi*rR(h*s68*wn|JNEuFl7vQ5Gw*JyW5@~@BMQ`q|~Q-oR5EtaJ2uYFZPe@ zg@L5DmImumajS3s*UZh$L7Qwn*Gyyh)%!yb*+-TCZ9@!jqsi1{&@2JKz>=WRyq5f1 z#EkbrE3rs@9MhGI60{_NtG)*IqTLHt3Rd_(j_}Js1gi?PKVgCY8Iu_axUrt9s;c{# z=#QMpe|Mh}Gu#1RCTnfV|9FAv5LQO$PC$c^S^LVKaPWZt>&ruQ7yqZ>Z-G}=Em{Q% zSoQ)MoS!_=4>e)ZK0;H?e6DgacU@hYWGg7fx#ioaDdaKfUZZv-n9m>E%0xT34 z4f3|jh|8TncUt+Ag0@_-q~lcm<{l>HcCfsIDbfGkvVkls4DI+I^G4O6Kx~)hV7kh6 zBxCRG>1L7-s(emr_;jnC3;d88i+D^H<8vKs&t^b_ok!iH?(-$?27+DC?S*R6-iVDs zMtpr;U2E~#=Y@_i1LZ?DAxzL_+eItv67zj+rwc2y+7A(gCC&Qbw@@)irfZ$5CVJidAdICJXHSkHJcvzaK+ zU{S>5)b7{nMCU6-WS@$PX2G&Fw}OL}q=*)k&dH8m%l{eCf~~)=`-N;m0s;adDx{;n z7N+r#110m*S1*B^Zlf=L`4*k|4GcB}C=`{@I=w9tsnjc+-|umoZ1X?dkBeHK|M=&B zE*NrraiKG*O6UI9^+v6H%=u87FxVb!BP7AEY0f~e)g3qrI#2~o6y-2+>gqGyD!*wt z*pPG+^@|nVHv9ZHdSG2mHTJ4)tXJT4yk^MhLhw z_3KwyR21bmkb;hUQcbiBob?yU5c}7^1)kE31J+NT+yV=C50}~`{d0tDzPw}dtKk1} z`WVEcvj$GA>@ENLUzJ^XIMiDo{~5zrvxm45#*`&nOtOraC^zP|p~yC6xzUg=5@u{6 zS5%4?mkMph8bY?N$WlsSEE5XDHO7!-j2YfDs{7vedEV!Jo_GG4XMVq#b7toGem|ej zIp5DY=T(aQgZz8}QR>;d+wMYOmbx94F7g9`xxqg};^N{EDdB7w<*ROcE8EgR&-mU{ ze!(NWdey`0T*G;fY&_;9af#zhn_KkAZX_;J8rJfYi!c&vYff&&PTP@i-L6}n<}s&I zRsU|)Kq;mo8>|u_TS^?!9r^d=rzHAT^J`*1a#2HBXaY>gl%@AgJFpAp44t3I+kVG@ zE|Ac?s^mV$FMlmY7@X-X%=_v%J5ZqwlFzWgWaX;K)FB+9*mC8NCF{#oi8bsHuwDe! zQt`dR8&e{nzFvqK-R}u`gXh45 z=(X*9KkW`8@h>5BPqoc9#_$g@#+;pqH2AV^ zX_+X+*`2#ZI+x9HCvt!5ylt$lrRYC6D zaBLglIb2qo54CTaj@Tq6qh=JjN<_~TRi{x6iUgEasE z0XS0V(XbU{Kesx__P2I5-PJtUcj~hwcEU&I!k_m|_vEL@>)C>u9VpiAw%N_se)DYx zPW5l%Uj1?t0@XYS5~VUqXs#J)i&3}Tf3^Pbv%{fQ+p{>->a97wx;+4?Jc!_$U(Ft3 zF=lvuZ6%ruR@I<5Tn~#q8~_PlD$IRj=it|jV}FR)WgsnkLyO4d3by&d3epCqV^(IC zTMJ=j7n#C|>>pd_d6v~;*VcIR1d09FiJ5{KX=0sV%RK5uT9)NBV6 zND~tid8m=lTBDuyKl)ijDGQ51S5a4YPHjH(qfr)c?7N_jxVnlK_bDwE0EihKSi-(M z_+7cW($IC9OqUno8~=KjZ^L7_zLVY`8}a6B5weFDV)ff^2uLAsx+h3O;89U<{cctHZ>sTchTIJtib7BQ0|Gi1cZ?Yyg>9HybaeUX zL)AtTAM<}uWc8v9+@PkU5Dtz)Yef@2{my1b_;9NH-m7&?Jkwl%&AZJm(cufAlx)kN zak5z(Vgo{paycw8_AL)S#$)GrIx}P%CFFhHI<=9fUF}=Is=~0Gv4^$9Sk-QIf4TGx zZleHh(<;GkjCs<;*7x6AC@k+j`yge-n_WH&JUY0Ic$Nz$>uB{AI}pR% z#LXwpZ89sdiDDAI25(RJawU44gp7_=c&bqd>yCZP8&ZK06E7c(Gjy|eBtNU|I;sj< zfS5hb0}rNyb2~V}5AVJ(IGx#ZJ}m5kW*^E+>W>!6u^1n}g;VY`nP)Iw5(YAW^hd#{ z1$+x0QU3?al5|}yD;M)#gC8shS{R(K579@_SI{T_vSZ=+4h$FEP=K45e7>?d5=AE4 zSIhR6F=roq!cpvoq^$t0LtrHL(^6!Lp>iZhGZe4CI7JoISZqFi{nF-;l7q zvVn8ML|V4FVbd`ur_T?=hP*oV&Hl66nktO(QVEtJ^}fzZk_&Na9zuUwI;tSPcE_m* znrNOYh7agRaNBsx3xT1CbS0~JP%aWDr5G<4mu`wsjpcHp;L470tYT~@(;<_88FAuc zh$LNcqMJ%hB~M?%bMKm(y|bX58jAQ+oKxh%{k2)vjINcCx*2ozZkDiBt!p8G12?|{ zgb0XCbliujgRGj9P0qoxRv9ADp*pdh`c{Q6KQeHQa(u_C0(zEjobJCF@-C|!k0`-L z4Sk@dp4qHdX(4>DDI;&yFN_|V@$%dZst`F*wW}{K@im5xAoR;cK2%u|dEqG(3q=OM z*`|DalXAu;{N$&tEHM3dJ2U70tl7I^LWk+3PV%P(>d!ly$mpT;8*R&)^W$C^_0p%Z zm3JGwf5p^t;(ybi3ykqD z>jgK>bWByW)lBROclS+JWOi`18;kWNEqLL*9e$$o7HbStH69^j!8XUxn{+vW|;Uk##!zXs?JS`oa*H& z1x9FvbmN_SPp$yZ@aOU_Oa5FJsXh_ z%M>bmFMd>XL7P&*oRP|h%$_#>9`LfMq%!6eU8VdlRCnu9*lXH|UG&JnnI5(JU{#9# z=qqBNs*4F@O^rWVqt0a6hFF{rj&|L`bpKftgqlz96OtN#os)D@^INTw{h=jDm;0H} zk}nmPXV(oBk>x-aC@#AfXTJ4esuP#EQ{G`rV}6?Xile{eaW4O(xIfA)gaV$6_#K(N z5H6Q~LcoWJQ?A>y{l4=rl^iTPs|aS_%YDZf;Stf1S4AUtL}IKOE0;|K*WF5E14TsH zSCMfbJk!D`-LP>r$wW zN_|vj0CkN{LpEu-`{_$ExA1NEnQ*CO02v-ijc~3>s7+^Rnu>Z$j7LkZis|OYw}-QO zCu`%2Q=YKfF6ER6+C%aFm-+y41w~<*dZdzo7{yiOgJ3*z zi@3S8eGJwcu($C0h_yUv4hkn&IVc&a-Ur)n3-*F?*Fh+1v-p>sV~}@5)Rc||VSNDM zAC#&U^^3IE*3to+BJC$0T2^r<*2%G@5==f6DAFInIx2EXHrqp3>u&MSMlJ62H;MzY zosZ$eJF;K|X1T#AiXI16EBr3q+4+i)_w4@5?#1vBfM~RJ{zdwQ8VbrV5dx0``y8=F I)}FEd0%k5B%>V!Z literal 35820 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