From eaf332099fb0fc15a26309aac8184307724c6d4f Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action
__unloggedin_look_command [look, l] (cmdset: UnloggedinCmdSet, help-category: General)
__unloggedin_look_command [l, look] (cmdset: UnloggedinCmdSet, help-category: General)
about [version] (cmdset: CharacterCmdSet, help-category: System)
access [hierarchy, groups] (cmdset: CharacterCmdSet, help-category: General)
accounts [account, listaccounts] (cmdset: CharacterCmdSet, help-category: System)
access [groups, hierarchy] (cmdset: CharacterCmdSet, help-category: General)
accounts [listaccounts, account] (cmdset: CharacterCmdSet, help-category: System)
addcom [chanalias, aliaschan] (cmdset: AccountCmdSet, help-category: Comms)
alias [setobjalias] (cmdset: CharacterCmdSet, help-category: Building)
allcom (cmdset: AccountCmdSet, help-category: Comms)
batchcode [batchcodes] (cmdset: CharacterCmdSet, help-category: Building)
batchcommands [batchcmd, batchcommand] (cmdset: CharacterCmdSet, help-category: Building)
batchcommands [batchcommand, batchcmd] (cmdset: CharacterCmdSet, help-category: Building)
cboot (cmdset: AccountCmdSet, help-category: Comms)
ccreate [channelcreate] (cmdset: AccountCmdSet, help-category: Comms)
cdesc (cmdset: AccountCmdSet, help-category: Comms)
cdestroy (cmdset: AccountCmdSet, help-category: Comms)
cemit [cmsg] (cmdset: AccountCmdSet, help-category: Comms)
channels [all channels, channellist, chanlist, clist, comlist] (cmdset: AccountCmdSet, help-category: Comms)
channels [channellist, comlist, clist, chanlist, all channels] (cmdset: AccountCmdSet, help-category: Comms)
charcreate (cmdset: AccountCmdSet, help-category: General)
chardelete (cmdset: AccountCmdSet, help-category: General)
clock (cmdset: AccountCmdSet, help-category: Comms)
cpattr (cmdset: CharacterCmdSet, help-category: Building)
create (cmdset: CharacterCmdSet, help-category: Building)
create [cr, cre] (cmdset: UnloggedinCmdSet, help-category: General)
create [cre, cr] (cmdset: UnloggedinCmdSet, help-category: General)
cwho (cmdset: AccountCmdSet, help-category: Comms)
delcom [delaliaschan, delchanalias] (cmdset: AccountCmdSet, help-category: Comms)
delcom [delchanalias, delaliaschan] (cmdset: AccountCmdSet, help-category: Comms)
desc [describe] (cmdset: CharacterCmdSet, help-category: Building)
destroy [delete, del] (cmdset: CharacterCmdSet, help-category: Building)
destroy [del, delete] (cmdset: CharacterCmdSet, help-category: Building)
dig (cmdset: CharacterCmdSet, help-category: Building)
drop (cmdset: CharacterCmdSet, help-category: General)
encoding [encode] (cmdset: UnloggedinCmdSet, help-category: General)
examine [exam, ex] (cmdset: AccountCmdSet, help-category: Building)
find [locate, search] (cmdset: CharacterCmdSet, help-category: Building)
find [search, locate] (cmdset: CharacterCmdSet, help-category: Building)
get [grab] (cmdset: CharacterCmdSet, help-category: General)
give (cmdset: CharacterCmdSet, help-category: General)
grapevine2chan (cmdset: AccountCmdSet, help-category: Comms)
help [?] (cmdset: AccountCmdSet, help-category: General)
help [?, h] (cmdset: UnloggedinCmdSet, help-category: General)
help [h, ?] (cmdset: UnloggedinCmdSet, help-category: General)
home (cmdset: CharacterCmdSet, help-category: General)
ic [puppet] (cmdset: AccountCmdSet, help-category: General)
info (cmdset: UnloggedinCmdSet, help-category: General)
name [rename] (cmdset: CharacterCmdSet, help-category: Building)
nick [nickname, nicks] (cmdset: AccountCmdSet, help-category: General)
objects [db, listobjects, stats, listobjs] (cmdset: CharacterCmdSet, help-category: System)
objects [listobjs, listobjects, db, stats] (cmdset: CharacterCmdSet, help-category: System)
ooc [unpuppet] (cmdset: AccountCmdSet, help-category: General)
open (cmdset: CharacterCmdSet, help-category: Building)
option [options] (cmdset: AccountCmdSet, help-category: General)
script [addscript] (cmdset: CharacterCmdSet, help-category: Building)
scripts [listscripts, globalscript] (cmdset: CharacterCmdSet, help-category: System)
server [serverload, serverprocess] (cmdset: CharacterCmdSet, help-category: System)
server [serverprocess, serverload] (cmdset: CharacterCmdSet, help-category: System)
service [services] (cmdset: CharacterCmdSet, help-category: System)
sessions (cmdset: SessionCmdSet, help-category: General)
set (cmdset: CharacterCmdSet, help-category: Building)
time [uptime] (cmdset: CharacterCmdSet, help-category: System)
tunnel [tun] (cmdset: CharacterCmdSet, help-category: Building)
typeclass [parent, swap, type, update] (cmdset: CharacterCmdSet, help-category: Building)
typeclass [type, update, parent, swap] (cmdset: CharacterCmdSet, help-category: Building)
unlink (cmdset: CharacterCmdSet, help-category: Building)
whisper (cmdset: CharacterCmdSet, help-category: General)
who [doing] (cmdset: AccountCmdSet, help-category: General)
aliases = ['batchcmd', 'batchcommand']¶aliases = ['batchcommand', 'batchcmd']¶
aliases = ['delete', 'del']¶aliases = ['del', 'delete']¶
aliases = ['parent', 'swap', 'type', 'update']¶aliases = ['type', 'update', 'parent', 'swap']¶
aliases = ['locate', 'search']¶aliases = ['search', 'locate']¶
aliases = ['delaliaschan', 'delchanalias']¶aliases = ['delchanalias', 'delaliaschan']¶
aliases = ['all channels', 'channellist', 'chanlist', 'clist', 'comlist']¶aliases = ['channellist', 'comlist', 'clist', 'chanlist', 'all channels']¶
aliases = ['hierarchy', 'groups']¶aliases = ['groups', 'hierarchy']¶
aliases = ['db', 'listobjects', 'stats', 'listobjs']¶aliases = ['listobjs', 'listobjects', 'db', 'stats']¶
aliases = ['serverload', 'serverprocess']¶aliases = ['serverprocess', 'serverload']¶
aliases = ['account', 'listaccounts']¶aliases = ['listaccounts', 'account']¶
aliases = ['cr', 'cre']¶aliases = ['cre', 'cr']¶
aliases = ['look', 'l']¶aliases = ['l', 'look']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['deal', 'offers']¶aliases = ['offers', 'deal']¶
aliases = ['cr', 'cre']¶aliases = ['cre', 'cr']¶
aliases = ['look', 'l']¶aliases = ['l', 'look']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['@callbacks', '@calls', '@callback']¶aliases = ['@callback', '@callbacks', '@calls']¶
aliases = ['press', 'press button', 'push']¶
aliases = ['smash lid', 'break lid', 'smash']¶
aliases = ['open', 'open button']¶
aliases = ['examine', 'get', 'feel', 'listen', 'ex', 'l']¶
aliases = ['pull', 'shiftroot', 'move', 'push']¶aliases = ['move', 'push', 'shiftroot', 'pull']¶
aliases = ['push button', 'button', 'press button']¶aliases = ['button', 'push button', 'press button']¶
aliases = ['thrust', 'pierce', 'kill', 'parry', 'hit', 'slash', 'chop', 'stab', 'fight', 'defend', 'bash']¶aliases = ['defend', 'parry', 'fight', 'kill', 'thrust', 'chop', 'bash', 'stab', 'slash', 'hit', 'pierce']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['fiddle', 'search', 'feel around', 'l', 'feel']¶aliases = ['search', 'fiddle', 'feel', 'feel around', 'l']¶
aliases = [':A', ':echo', ':r', ':w', ':=', ':>', ':dd', ':y', ':fi', ':', ':h', ':x', ':s', ':::', ':uu', ':q', ':j', ':DD', ':UU', '::', ':i', ':I', ':f', ':p', ':fd', ':u', ':S', ':dw', ':!', ':q!', ':wq', ':<']¶aliases = [':w', ':u', ':i', ':q!', ':DD', ':y', '::', ':::', ':f', ':wq', ':I', ':fi', ':r', ':UU', ':x', ':!', ':=', ':echo', ':', ':dd', ':A', ':<', ':fd', ':S', ':q', ':s', ':p', ':h', ':>', ':uu', ':j', ':dw']¶
aliases = ['t', 'e', 'next', 'quit', 'b', 'back', 'abort', 'end', 'a', 'n', 'top', 'q']¶aliases = ['abort', 'quit', 'q', 'next', 'e', 'top', 'back', 'b', 'n', 'a', 'end', 't']¶
Add run_in_main_thread as a helper for those wanting to code server code
from a web view.
Update evennia.utils.logger to use Twisted’s new logging API. No change in Evennia API
+except more standard aliases logger.error/info/exception/debug etc can now be used.
Have type/force default to update-mode rather than resetmode and add more verbose
+warning when using reset mode.
Attribute storage support defaultdics (Hendher)
Add is_ooc lockfunc (meant for limiting commands at the OOC level)
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶
aliases = ['@delete', '@del']¶aliases = ['@del', '@delete']¶
search_index_entry = {'aliases': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶search_index_entry = {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
aliases = ['@swap', '@parent', '@typeclasses', '@update', '@type']¶aliases = ['@typeclasses', '@swap', '@update', '@type', '@parent']¶
search_index_entry = {'aliases': '@swap @parent @typeclasses @update @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap parent typeclasses update type', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶search_index_entry = {'aliases': '@typeclasses @swap @update @type @parent', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses swap update type parent', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
aliases = ['@chan', '@channels']¶aliases = ['@channels', '@chan']¶
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
aliases = ['@chan', '@channels']¶aliases = ['@channels', '@chan']¶
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
aliases = ['nicks', 'nickname']¶aliases = ['nickname', 'nicks']¶
search_index_entry = {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'no_prefix': ' nicks nickname', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶search_index_entry = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'no_prefix': ' nickname nicks', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶
aliases = ['i', 'inv']¶aliases = ['inv', 'i']¶
search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
aliases = ["'", '"']¶aliases = ['"', "'"]¶
search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
aliases = ['emote', ':']¶aliases = [':', 'emote']¶
search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
aliases = ['hierarchy', 'groups']¶aliases = ['groups', 'hierarchy']¶
search_index_entry = {'aliases': 'hierarchy groups', 'category': 'general', 'key': 'access', 'no_prefix': ' hierarchy groups', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}¶search_index_entry = {'aliases': 'groups hierarchy', 'category': 'general', 'key': 'access', 'no_prefix': ' groups hierarchy', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}¶
Test the batch processor.
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmprjjqyyjm/4473aab19d8efefacfd6598666fcaa09ef222ec5/evennia/contrib/tutorials/red_button/red_button.py'>¶
aliases = ['con', 'conn', 'co']¶aliases = ['conn', 'con', 'co']¶
search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'no_prefix': ' con conn co', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶search_index_entry = {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn con co', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
aliases = ['con', 'conn', 'co']¶aliases = ['conn', 'con', 'co']¶
search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'no_prefix': ' con conn co', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶search_index_entry = {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn con co', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
aliases = ['@callback', '@calls', '@callbacks']¶aliases = ['@callback', '@callbacks', '@calls']¶
search_index_entry = {'aliases': '@callback @calls @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback calls callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶search_index_entry = {'aliases': '@callback @callbacks @calls', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback callbacks calls', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
aliases = ['chicken out', 'q', 'quit', 'abort']¶aliases = ['q', 'quit', 'abort', 'chicken out']¶
search_index_entry = {'aliases': 'chicken out q quit abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out q quit abort', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶search_index_entry = {'aliases': 'q quit abort chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q quit abort chicken out', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
search_index_entry = {'aliases': 'ls l', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
aliases = [';', 'shout', 'whisper']¶aliases = ['whisper', 'shout', ';']¶
search_index_entry = {'aliases': '; shout whisper', 'category': 'general', 'key': 'say', 'no_prefix': ' ; shout whisper', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶search_index_entry = {'aliases': 'whisper shout ;', 'category': 'general', 'key': 'say', 'no_prefix': ' whisper shout ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶
aliases = ['unfocus', 'ex', 'examine', 'e']¶aliases = ['examine', 'ex', 'e', 'unfocus']¶
search_index_entry = {'aliases': 'unfocus ex examine e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus ex examine e', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶search_index_entry = {'aliases': 'examine ex e unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine ex e unfocus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
aliases = ['i', 'give', 'inventory', 'inv']¶aliases = ['inv', 'inventory', 'i', 'give']¶
search_index_entry = {'aliases': 'i give inventory inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i give inventory inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry = {'aliases': 'inv inventory i give', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv inventory i give', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
aliases = ['@open', '@dig']¶aliases = ['@dig', '@open']¶
search_index_entry = {'aliases': '@open @dig', 'category': 'general', 'key': 'open', 'no_prefix': ' open dig', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶search_index_entry = {'aliases': '@dig @open', 'category': 'general', 'key': 'open', 'no_prefix': ' dig open', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶
aliases = ['offers', 'deal']¶aliases = ['deal', 'offers']¶
search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
aliases = ['i', 'inv']¶aliases = ['inv', 'i']¶
search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
aliases = ['roll', '@dice']¶aliases = ['@dice', 'roll']¶
search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
aliases = ["'", '"']¶aliases = ['"', "'"]¶
search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
aliases = ['recognize', 'forget']¶aliases = ['forget', 'recognize']¶
search_index_entry = {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'no_prefix': ' recognize forget', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶search_index_entry = {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'no_prefix': ' forget recognize', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶
aliases = ['smash', 'break lid', 'smash lid']¶
search_index_entry = {'aliases': 'smash break lid smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash break lid smash lid', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
aliases = ['l', 'ex', 'listen', 'feel', 'examine', 'get']¶
search_index_entry = {'aliases': 'l ex listen feel examine get', 'category': 'general', 'key': 'look', 'no_prefix': ' l ex listen feel examine get', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶
aliases = ['burn', 'light']¶aliases = ['light', 'burn']¶
search_index_entry = {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' burn light', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶search_index_entry = {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' light burn', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶
aliases = ['button', 'push button', 'press button']¶aliases = ['press button', 'push button', 'button']¶
search_index_entry = {'aliases': 'button push button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button push button press button', 'tags': '', 'text': '\n Presses a button.\n '}¶search_index_entry = {'aliases': 'press button push button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button push button button', 'tags': '', 'text': '\n Presses a button.\n '}¶
aliases = ['bash', 'slash', 'pierce', 'parry', 'thrust', 'fight', 'stab', 'defend', 'kill', 'hit', 'chop']¶aliases = ['fight', 'bash', 'slash', 'stab', 'thrust', 'parry', 'pierce', 'chop', 'kill', 'defend', 'hit']¶
search_index_entry = {'aliases': 'bash slash pierce parry thrust fight stab defend kill hit chop', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' bash slash pierce parry thrust fight stab defend kill hit chop', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶search_index_entry = {'aliases': 'fight bash slash stab thrust parry pierce chop kill defend hit', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' fight bash slash stab thrust parry pierce chop kill defend hit', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
search_index_entry = {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶
aliases = ['fiddle', 'feel', 'feel around', 'l', 'search']¶aliases = ['l', 'feel around', 'feel', 'search', 'fiddle']¶
search_index_entry = {'aliases': 'fiddle feel feel around l search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' fiddle feel feel around l search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶search_index_entry = {'aliases': 'l feel around feel search fiddle', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l feel around feel search fiddle', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
evennia.locks.lockfuncs.is_ooc(accessing_obj, accessed_obj, *args, **kwargs)[source]¶is_ooc()
+This is normally used to lock a Command, so it can be used +only when out of character.
+evennia.locks.lockfuncs.objtag(accessing_obj, accessed_obj, *args, **kwargs)[source]¶stringReceived(string)[source]¶Overrides the base stringReceived of twisted in order to handle +the strange error reported in https://github.com/evennia/evennia/issues/2053, +which can lead to the amp connection locking up.
+string (str) – the data coming in.
+Notes
+To test, add the following code to the beginning of +evennia.server.amp_client.AMPServerClientProtocol.data_to_portal, then +run multiple commands until the error trigger:
+import random
+from twisted.protocols.amp import AmpBox
+always_fail = False
+if always_fail or random.random() < 0.05:
+ breaker = AmpBox()
+ breaker['_answer'.encode()]='13541'.encode()
+ self.transport.write(breaker.serialize())
+dataReceived(data)[source]¶aliases = [':wq', ':y', ':p', ':!', ':A', ':w', ':i', ':x', ':=', '::', ':::', ':<', ':q', ':echo', ':j', ':', ':dw', ':fi', ':r', ':I', ':f', ':>', ':dd', ':h', ':uu', ':DD', ':u', ':q!', ':UU', ':fd', ':s', ':S']¶aliases = [':x', '::', ':fi', ':>', ':::', ':j', ':dw', ':S', ':', ':u', ':<', ':f', ':w', ':=', ':r', ':!', ':DD', ':A', ':echo', ':s', ':UU', ':wq', ':h', ':fd', ':i', ':q', ':p', ':I', ':uu', ':y', ':q!', ':dd']¶
search_index_entry = {'aliases': ':wq :y :p :! :A :w :i :x := :: ::: :< :q :echo :j : :dw :fi :r :I :f :> :dd :h :uu :DD :u :q! :UU :fd :s :S', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :wq :y :p :! :A :w :i :x := :: ::: :< :q :echo :j : :dw :fi :r :I :f :> :dd :h :uu :DD :u :q! :UU :fd :s :S', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry = {'aliases': ':x :: :fi :> ::: :j :dw :S : :u :< :f :w := :r :! :DD :A :echo :s :UU :wq :h :fd :i :q :p :I :uu :y :q! :dd', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :x :: :fi :> ::: :j :dw :S : :u :< :f :w := :r :! :DD :A :echo :s :UU :wq :h :fd :i :q :p :I :uu :y :q! :dd', 'tags': '', 'text': '\n Commands for the editor\n '}¶
aliases = ['y', '__nomatch_command', 'no', 'yes', 'a', 'abort', 'n']¶
search_index_entry = {'aliases': 'y __nomatch_command no yes a abort n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' y __nomatch_command no yes a abort n', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
aliases = ['t', 'next', 'end', 'q', 'previous', 'top', 'quit', 'n', 'a', 'p', 'e', 'abort']¶aliases = ['previous', 'top', 'end', 'quit', 'a', 'e', 'q', 'next', 'abort', 'p', 't', 'n']¶
search_index_entry = {'aliases': 't next end q previous top quit n a p e abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' t next end q previous top quit n a p e abort', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry = {'aliases': 'previous top end quit a e q next abort p t n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' previous top end quit a e q next abort p t n', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
Note: All logging functions have two aliases, log_type() and log_typemsg(). This is for historical, back-compatible reasons.
+evennia.utils.logger.log_info(msg, **kwargs)[source]¶Logs any generic debugging/informative info that should appear in the log.
+msg – (string) The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.info(msg, **kwargs)¶Logs any generic debugging/informative info that should appear in the log.
+msg – (string) The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_infomsg(msg, **kwargs)¶Logs any generic debugging/informative info that should appear in the log.
+msg – (string) The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_msg(msg, **kwargs)¶Logs any generic debugging/informative info that should appear in the log.
+msg – (string) The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_warn(msg, **kwargs)[source]¶Logs warnings that aren’t critical but should be noted.
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.warn(msg, **kwargs)¶Logs warnings that aren’t critical but should be noted.
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.warning(msg, **kwargs)¶Logs warnings that aren’t critical but should be noted.
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_warnmsg(msg, **kwargs)¶Logs warnings that aren’t critical but should be noted.
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_err(msg, **kwargs)[source]¶Logs an error message to the server log.
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.error(msg, **kwargs)¶Logs an error message to the server log.
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.err(msg, **kwargs)¶Logs an error message to the server log.
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_errmsg(msg, **kwargs)¶Logs an error message to the server log.
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_trace(msg=None, **kwargs)[source]¶Log a traceback to the log. This should be called from within an +exception.
+msg (str, optional) – Adds an extra line with added info +at the end of the traceback in the log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_tracemsg(msg=None, **kwargs)¶Log a traceback to the log. This should be called from within an +exception.
+msg (str, optional) – Adds an extra line with added info +at the end of the traceback in the log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.exception(msg=None, **kwargs)¶Log a traceback to the log. This should be called from within an +exception.
+msg (str, optional) – Adds an extra line with added info +at the end of the traceback in the log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.critical(msg=None, **kwargs)¶Log a traceback to the log. This should be called from within an +exception.
+msg (str, optional) – Adds an extra line with added info +at the end of the traceback in the log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.trace(msg=None, **kwargs)¶Log a traceback to the log. This should be called from within an +exception.
+msg (str, optional) – Adds an extra line with added info +at the end of the traceback in the log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_dep(msg, **kwargs)[source]¶Prints a deprecation message.
+msg (str) – The deprecation message to log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.dep(msg, **kwargs)¶Prints a deprecation message.
+msg (str) – The deprecation message to log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.deprecated(msg, **kwargs)¶Prints a deprecation message.
+msg (str) – The deprecation message to log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_depmsg(msg, **kwargs)¶Prints a deprecation message.
+msg (str) – The deprecation message to log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_sec(msg, **kwargs)[source]¶Prints a security-related message.
+msg (str) – The security message to log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.sec(msg, **kwargs)¶Prints a security-related message.
+msg (str) – The security message to log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.security(msg, **kwargs)¶Prints a security-related message.
+msg (str) – The security message to log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_secmsg(msg, **kwargs)¶Prints a security-related message.
+msg (str) – The security message to log.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.log_server(msg, **kwargs)[source]¶This is for the Portal to log captured Server stdout messages (it’s +usually only used during startup, before Server log is open)
+msg (str) – The message to be logged.
**kwargs – If given, The msg is parsed as a format string with {..} +formatting markers that should match the keywords.
evennia.utils.logger.GetLogObserver[source]¶Bases: object
Sets up how the system logs are formatted.
+component_prefix = ''¶event_levels = {<LogLevel=debug>: '??', <LogLevel=info>: '..', <LogLevel=warn>: 'WW', <LogLevel=error>: 'EE', <LogLevel=critical>: '!!'}¶format_log_event(event)[source]¶By assigning log_system here, we skip the spammy display of namespace/level +in the default log output.
+[component_prefix] [date] [system/lvl] [msg]
+evennia.utils.logger.GetPortalLogObserver[source]¶Bases: evennia.utils.logger.GetLogObserver
component_prefix = '|Portal| '¶evennia.utils.logger.GetServerLogObserver[source]¶Bases: evennia.utils.logger.GetLogObserver
component_prefix = ''¶evennia.utils.logger.timeformat(when=None)[source]¶This helper function will format the current time in the same way as the twisted logger does, including time zone info. Only difference from official logger is that we only use two digits -for the year and don’t show timezone for CET times.
+for the year and don’t show timezone for GMT times.when (int, optional) – This is a time in POSIX seconds on the form @@ -130,188 +578,6 @@ server.log.2020_01_29__2
evennia.utils.logger.PortalLogObserver(f)[source]¶Bases: twisted.python.log.FileLogObserver
Reformat logging
-timeFormat: Optional[str] = None¶prefix = ' |Portal| '¶emit(eventDict)[source]¶Copied from Twisted parent, to change logging output
-evennia.utils.logger.ServerLogObserver(f)[source]¶Bases: evennia.utils.logger.PortalLogObserver
prefix = ' '¶evennia.utils.logger.log_msg(msg)[source]¶Wrapper around log.msg call to catch any exceptions that might -occur in logging. If an exception is raised, we’ll print to -stdout instead.
-msg – The message that was passed to log.msg
-evennia.utils.logger.log_trace(errmsg=None)[source]¶Log a traceback to the log. This should be called from within an -exception.
-errmsg (str, optional) – Adds an extra line with added info -at the end of the traceback in the log.
-evennia.utils.logger.log_tracemsg(errmsg=None)¶Log a traceback to the log. This should be called from within an -exception.
-errmsg (str, optional) – Adds an extra line with added info -at the end of the traceback in the log.
-evennia.utils.logger.log_err(errmsg)[source]¶Prints/logs an error message to the server log.
-errmsg (str) – The message to be logged.
-evennia.utils.logger.log_errmsg(errmsg)¶Prints/logs an error message to the server log.
-errmsg (str) – The message to be logged.
-evennia.utils.logger.log_server(servermsg)[source]¶This is for the Portal to log captured Server stdout messages (it’s -usually only used during startup, before Server log is open)
-evennia.utils.logger.log_warn(warnmsg)[source]¶Prints/logs any warnings that aren’t critical but should be noted.
-warnmsg (str) – The message to be logged.
-evennia.utils.logger.log_warnmsg(warnmsg)¶Prints/logs any warnings that aren’t critical but should be noted.
-warnmsg (str) – The message to be logged.
-evennia.utils.logger.log_info(infomsg)[source]¶Prints any generic debugging/informative info that should appear in the log.
-infomsg: (string) The message to be logged.
-evennia.utils.logger.log_infomsg(infomsg)¶Prints any generic debugging/informative info that should appear in the log.
-infomsg: (string) The message to be logged.
-evennia.utils.logger.log_dep(depmsg)[source]¶Prints a deprecation message.
-depmsg (str) – The deprecation message to log.
-evennia.utils.logger.log_depmsg(depmsg)¶Prints a deprecation message.
-depmsg (str) – The deprecation message to log.
-evennia.utils.logger.log_sec(secmsg)[source]¶Prints a security-related message.
-secmsg (str) – The security message to log.
-evennia.utils.logger.log_secmsg(secmsg)¶Prints a security-related message.
-secmsg (str) – The security message to log.
-evennia.utils.logger.EvenniaLogFile(name, directory, rotateLength=1000000, defaultMode=None, maxRotatedFiles=None)[source]¶re_invisiblespace = re.compile('( <.*?>)( )')¶re_url = re.compile('(?<!=")((?:ftp|www|https?)\\W+(?:(?!\\.(?:\\s|$)|&\\w+;)[^"\\\',;$*^\\\\(){}<>\\[\\]\\s])+)(\\.(?:\\s|$)|&\\w+;|)')¶re_invisible_space(text)[source]¶If two spaces are separated by an invisble html element, they act as a +hidden double-space and the last of them should be replaced by
+sub_mxp_links(match)[source]¶clean up double-spaces
sub_invisiblespace(match)[source]¶clean up invisible spaces
+parse(text, strip_ansi=False)[source]¶|)PUH>>M5fVAxU=EqKnNcG*cRN`;1e5U0r2xQ zj8F+m%<_2((cCa;3?=Q9?`u)_>jgxeyc-L~0^Zkz#>o*4BEpVkBis^50 zj9Yx!cg?4w`K!7u0+B?HuVT}Gh@o7XRV1rQTo!e`h8TeC3<;nTs%0d)XXcA5V1`{2 zUySiK;Ol-!QN1oe={K*B L;6S?qsqX KIp+qvR9thjTfG7fEQajQTsvJ%IQ1UW6MGK8<$Yjqvz)Y=qhc%`3#7;6|? z_~6RGN~u!^c<90S8lyP`8nQ$pIIm*_64S+(b13+t?W{R}2bTe_z7O -+`}V*cJ4sx`$|msJ$wz^b8bDVjN@cx>C@x(7 XoAFJV z|IeUQ$^8uSg(KuB%Dd#M~A1( zqPvJ&L8$%FQxdeMuqE1(9c8_@xS%;c3r6g7PLe!%C@|#uS1e`tib#SOk+vi;DI-jH zT*bwXs5?waQC5M`>JoPn+^R;lJd|EX3!hT@hzNfy_ko%{KxQe&wkyr2P?H9ecQAo5 zP3*=2<4FmBuJI`vF)qt@GvHI<>l@yn`3VQo@bU?Z2S1NHEZ^b5kLq&tkS@oM=W_gD z4sm* z|Eh -$nc(VGqB?XDmiJp=&*`@@&mQIdU!=T_-NXgYF zBu3=u9sPsBfjhCMNRVePj^!Q^8eLnnWa3cbnfMlqcO4n9rfwB{Atnohc7h74CgfsX z%#t#H+*&>h9ozMZ)xzp75Ts(loK62q U$`%`N+J$wY^NO%Sj3 z5DxeGqjxFI;LzCol8GbpVIzYDGg$a#)%Yyx@@X6rao;xUMW(Moob1NVes%>v*;x;N zj80y{W0Hw0MbuJeU;@1-92j=$J{4D772*J+b~l6rLpM*GwRUI(IAzn~>*a5F1bO(3 zQ3uUltL8N 2oHV*QJCOVTvtL-hQKu@0TEj?kHh19p)? z=jZ$FUAJZ@8uU{dD}3W2A233P;U6%6ZoXDR43JK*C go(`o=k>xW|7^I z;+Tj?{zFmF0!=xZEPZ&or3H?)op4NdbV1n!S03(1=6ON+IF()O3&7blxs06$uM~;+ z-?HUJS4(-hLEadFc^hWQBR6 as_49;tUh_!K5>4A4X#7>umHLH8to<0l26 z=T4Zi2rAnnxiNUsgs*|_g*qrSG>iio6M0~3;zMz#Wr0Z}T~S4YvO?qGofmwK>mBp0 z&Pn%0iq7NOjdEhDg+iza0c;L&j(zqDN+tZx$n7ELNliLEI_a;OS}i#def6LxFt=gF z)adM%jp-7xCs7vy@C5(p}1bgR9J92+#!`GXt`n#*x1>MCAd$d(tH)7b=a#NYzEy z&dQ@f2ch0y^a}d@)HOvX=}hsi@5SGf*AxxHTj0vOgJhzMosjt?(yL+9sJI=QMqFjj z?{(^^kPo7OX1Ynn;ZuW66HDgi)5wSkyP8xhrwdOW8=?0e@iAj)YA{oO9lr>spKRKp z$Yi>7CZ)S@Ea(L|;{jP$e24K@SE{L1oUXWL7eLHMpEx{z4uR1H5Hko&?`D`op(X$k zpp%Tb7S^M|g6DfHDz()Y0e@oQ+6-jVWot7iCKj#DL&meHoD?PVm;}uy6eMTXgk`UC z&Xqk5u~cX3zK1!`#`iscIFpPW?BfdRatXs6E|*IfT={V9tm~Iy#qD}zP-LU{-X3%8 z+QWIUC`O89mwm4bS{lvm2Tdmm#j|(ZI;i;S)&pGOPg)Jo44BOEn`37Q3tA5CI`WB* zSU0&rhpd zCCw=)^XUh5DgsQap%D>VjE2HXYtgWwI@*Q>UX2=P6cxI!M%Mhhq2Z~Hg!iE~k_l5~ zBm=m*NLWx+slxKnv_INOI~o6W(>}1@hCR_U3JYxWKIkle7Q=D;c^n2k+*t&C6Jfw# zV$)<1Ns&2H5@tNM; 3Y9L7m@q$mio=@|8T zW-%C!rq1Fp8rGb{@SxNR%iHsxemuTla`pO2{JkYpWHRnJ!1JvG53;Q&9=A3iiNCXC za&~4({MM3x%GISM@eh_v-W*%Qmc%ak`iCWx*}&ca(Kjwc9*WM@YbWvFEt%@fx$xdh zP|1G-qIdsZ*e_vMXi4-)jOWICsi(Ucz0?olugO;DoWT^@qQRL#Vif()z&F*@85BlC zk#h+2=0;2s(?08L1}|!5)wcwoF^OV8X!IfcKIja8dw=tZ@NLv~IRyZfS*K$@k9-&8 zl%|2ST!W#q8N7Fl2+>P$crPwO5Fz^q!GW*cf(E-45+q95!1PSaMP3e*#Oup(k$fE< zb0$!tm#vNfwJFUpuixF?-H2ZwS+`i7kUXgS!yIz9Q5q>`K#RhatW (M>zmWc1R?^F+n0g@N$rG-mkEVUd{?j}e3VGe|>*b(rq+pQfKGp|kWX zZuqQz8^++nl#X1+?J6v5KOB (g(WWb^-*5}>XSH JwImaNftoB*(o@I3AW#;h%$YAG{&`u-lK9c+`^GU~ z8LMRQXQP_WmuV_Kj~1yIiO=HnV1J6qm)SLRzN}3KbbO$W-<~=h(9LB!hDjFacPu*O zhi7C_LP}I>nx=dc1uNVnLM4(5mPM~DPFTRDCxws+OTvCs6BjALk;%>x>*c0@#0OvZ zUU@98n50227yMyS2-g^>8y{X-z?-Q<@lkbOKj02!{DO(uRO09>+%jYoBzwYS5Ir-0 z2K<=F ~*tuR=_& zDooNKrF#*Tqq@R@@mo(+{E!;ZQtV8hnXM8$`(SGB;rs(vqIrDRA7r|JpV<3P{Pj&E z#>g1kxD@m0jb}p81=0I`_Hoc1>seGL(MZd#2;t^k`jhBC>x5K4KRn#Md1JG{6<+}3 zm4I-f+$YC8C0~_Rd{w8_dMk-x`UNcKf*_IAI$Csb_)w<$Blai^)5UCmS1`XE`P7Xb z?GifC7eH*slz$m4o<$RXL&TJ85QFAErQk30vN@~JLVai-Tj&o@8?gIU5-U6C2?8O( z43mJDB{Q3b^C60`kWMWvT{PTO(8N)jBKR<9oljXuFY%N`^b?0wa7H!WQ5hhcWU-vg za-!&7rCH)|sDK->pjaGFD&tWTQ--{5@0lLgBb{ nm0=uA<<)bz$7#*i4GJT^Q9t17K(k?5iR22K++VPh0n6#7P&b4q^Ic6=u@|v zI{~AVc1ri~wx~|YM}j3WIB*%~L8{KV1P3k%A8|&3<|8O5z;%Wrb$bdoBx+gbT-Z|I zP6LTuF|P-WS!YOp79y$*p@5&s7QrP?UXa{NHWg+xH?GPZb2Qr}`>A_Z2MFwt`RLGY zDx#mnpSabvn`*KY)a6GVQKxc$>B^&vfaXU7J2SYP4(v>3aM9%)>?Rn1N1wPH&ly)0 z$EZ@ q?wJvP$0SotIVP1VJm!XYETuUn z--si8M!P%GaOcx0n=6g+NE{g9wxD4gh0}8qV2pNCAqcc4M>~Mg+RU_olB&@WFMOmZ zwqf+>jqeyflJ>DTTD><=$E@RL?*fyHdG3#j`Nk`=n6N=oVtxXL+&%U7z8Qps^R#F1 zR=b(zlUZzkWtvT9w~uKy9r0F*W^wgw8jI~q09 f#PCVOx>Op;C^h$aZ6Yc$6y#wxw7e66H#OWgFIq zLAg_ZU|K_5A9I5xN_L?9m Af(o7D*(8hS06xd>zf|TPWgxB<_pTrj*^AtRp(^%Zd{Ow- Stfy3#(3AE?lC$9u&q551$aofiLB=<4KX;G%_9sE-tQp_TG+%_cIYCA2 zNfHgjLIS9Ba6AZMdPtx($G!-2@|0x6Fd%Kx8^)t;`k(YKqhnfz=^S`$Ls0<6unL+z zR(=@mmJmV^+L|5!C(UkBS`wdxx1=n?y;sUFIq_JJq5%u*>cIX;qR~5-QK+Ls$h0Vb z^~~DYfa{U <@@|N|M-%q;rUAJ}Sf%z*D5m1ute !5Xbl`RYVyquUSQu#NrB8L@8MJ8au$5l%csQY)O8byJKx- zNs7p@-@#HE_BeRTPhW3-q=sFL2H6CE@;bEH#9|3;*KM!^?*v+AHf0BI*8#D_w(V=! z!SC8Y0i$I2P;Qn)kNT_$aQWHK;OpJz;KMKPzkK}V-R*~aR2s(c^~2rg|3V>2na}vD zdLbBoUhNh%-5s_cNenv82t1hVvvTdK!iNmE+=|nWE*9gLB(Jgf1 zv+egek+^m2oT%)3Zca3)&djCn V70#=2nyUzWzo z!IGLP2TyvdpbeCxK{kN2Rt_t0t{l2Zps~dTc+91XY3@3!&`9dMN{$2tK7%ix7h?r{ zG1fnp^7h44`(8|B qkx*#Od38|=WDLNrAJjh&G_WpOOOJT>`~AaQ`pZ*`oS)v0RgADbOiU3^1eTYYh% zkY_XRXb>mHA-xMvd8n(HK4%yd%>)X3O_VHrV!lcqE?-!wQvXvc#X9*^7U8{o_;V|Y zX;z0M0T97WJ+Xudvy6p*ND=FG8K3usEKqf_MA3Ze3Rf_@{yVlTEUXR0%s`y1qj>CQ z(>%yR>vhzX^;DoQaaLpUdy SakyfTpXHu<3t(0WaORmK=DWO!- zpnT1umB=OjECYUmR}ihq5^;;DC{4S=ETv&M%2R&5zqg$}YX~fVkZq$$Ck~r=1#^P0 zB#ccXa$8iqVo~^Z;f_7Lt&_KA5NmwMGZuWE$L1^Z4baQ-U}&Z+rJ )23yExX11aO$t&8#23d_?E?h)?n9mj`rzj{p4i6C#ON=WTaIg#!z^ z&lL+_KkLo&D0y&L-R#Pe7xb88ljyq@aVRPkpWG*Z0@sO-eAIx-LlI^re;qI ?=28P$ySVn6 zW5mF!kdfSf(9G=WR6B6?XR><@7y-YtF$np75>mj@)VWxu80 MlW_v-gg z?+h#Yl+BjLy546KJ|}4!oR+H>Vy1<-#1%<1xzfWxQDkC69Z`uN#6Nbvpvz-PV5=N+ zsKPu?`9UMhXy4mkwl|B}u9rE7%Bi~vLuk?OoI@CsewGe@8E#YZnMTGZ2m;W3B}ZBj zKYVs02y@6t=Cddzo41nWUGnn4V%Z?3nGZtCZtYwu%l_?bI;)QEY&MG??;Ng*?)NDP zGMcj}ndD*0Tr(c6!wCIc7VDw<*@TweT^qiD(ydhh$v?0PBE<(XS6{yTXj4Tkl^us$ z80pOB)Ka^Dvyq6#B-kH~H_E{f9?RGlA@!L%>M>^|^IUg|&|eNSpLLhv)}8t2TKj>W zXLK5CJ0-JaarBOMd~V}#PE=}Cjut^w5We8pd3?@>zN|`P fyo+lA9NuGvD)*NL4PxR1?8-weWgvN9$ia`|Av5r&bv8(De zCpc`sk?p<3eo9w#%mQmkDiRj&%{QLT;9+%RJ5)NG3) VMm=q=m^h(x;IXZF07lEn zEC5D3zXCyMJAVMc$v1MyS9({OKkkfXk;T!W0E~7QYJd>hU8n& p+j0H5X52@s>@ z3d?CJIk#K$nZq=t&m_JT zq@{z`0}#Qn37yZZ-nch#^F`nd-L|05?31!8mf`O ^)Q8VvQn4@<-a$>r^ImYk#pI^nFAEE>OO3IvO<>aXNWf=g- zS%)wQOS2O+a0TJ&GpVt-A{ 4iLCYRfMkE1mkE&DTyH(e~>|Eg&xgrnZ%|ABU`;h%-kHy8V4QA>w3TF2_z@!ef$= z1ts8}-{shoI9)RH&2asK^g%|M4lXK$>I5vsPahXlfg=gax*$OsE?5UgfBLkf83_6y zTUvkxOQ56?>%XW|%#cMml4G9I$~*{AADFlM`h(k+$tY0o5!o =8M;&6)@haGDfzPfokUgnl~i?+$$=XW?5rPBketOY=G~83WMxz&xl5 l#;N}6Z&bQvu$L0FcRdXP~I$%v_V_?9>p-* zxdlur_f-ybSQivR^;Q> #ZEh+s8E1Wc~F zh6`}>E=iCrNxo#xm*VdA!@To1qfuDQEZ)7d>5w@ysD0y|o+fOL5{6fV5wVB?^(Pi_ zVDm|j&p4*-GY(Ld&Cw%cc~JjMh^_wlAfHaua2IkC%XnJX4wZE(bIMO)5G(YIZu7Gy zXl|lR NGOf(#L*+7*aUT}5Pky_XqM2C<$?X-j?vAPf44w^MG z(smCfk&GL5!i|?yHE_|J-rjDB`bU~n X4w%(s|;&>3| G^y* zr5v4w%(&Sz+<^r|WY9AQVA|qykQWj$E#S6{PsZE(P~N=hhm3_StQ%smpc#lx?LIT; zMZ*y0b)J*TCl@~k(_0lL9(0nqd3+Ls(;MfLWS%{I=EFZR5*Aseeu%t8GMuRNL8RjH zT^jC7Z*1yi44@XWf)N{b2Mjv`I+Hw|8h^Yk;sq?uWP}D6y)?t! 4z3s=u;{oIxwc&3JkEXD!AC{?r;7{+XHylEOJ z7eHbiGnSqOQ0Yp$v358SvW(?AB7EC}N7{&IT^s_$XKZ|yxm_y-#%SJvfl%7EZGW(& zL07Stksz++-G*cdIpnOt0?KVTA_&H(e3pM*Q^bqt`5Cuo->LWuB1SLUX=>l>Vz=B< z{JIzCxw-7KmrKzb&%c2&>+;?e^k_c3hC^?5N+kljD*l`)e&Rn=JCR};_HtnjQ2Z9d z=2#LerG<*$bYLBhUikYhwH DXG-XNlS(r|4oKeZ9#>c8dL8~gAT!X38nc`hP zbbv>UqmOF>Xgu)b0397j^oW2f4rbC9pG}MfI=~xPsvBw$g{(*db(kD5et$tCS}^m- zQLy;}bOhjv*3kh0x6Uw&L(XW;23D=BzMyWzU9>5u97ZRlT7`GVoW(OMiht`j6E5VG z%Z k?;1nj9$$#Hphr6uMv88@~Pa-BXyP;WkN=>J_jGpUKv2rG1ldO7q%; z?|%=oJ^hVrztYKl6({iKxPQh9=FUKldG#7FGbUl2Q<~y2G3~uMB-6KH+At_R`bxws z`dvX^UcZu() tuw*cdpbq`;cruKRn#s$OZ1dCDq~o{YZ=Fu!u?ganc5%X!vB+ z&rAVXc1_R0w4we?qsMTYk_VyXcXaY9=y~8MRy#n$=ea&*@&PgxKYx`MlH#sNo>-%D zUxif?0ejFh?CUsTff7Hu@N-gD`jBs+ocwnG( VRbK;5!NGj8dARsyU z6>6z3va%|k!nF35Ie%n)oGK$PRj_>x1{4+7^2KJIf;=U(E`JvhAn{|3V*~79B&SA* z%hs45E)5k?i^ryK>Oey 1V;h?qhUPkir8lmL30`=*QqP8?bKVs+C#<)F?MpO|KWEY~@|S9z zOMu)Eyx;yz(|;JvGi!MCLTrc-y<@|nmSkb^e8L`1`_vm^8aqS=kO+BX>65>qrB8lG zdOmsS2z~O~6FQ+Q5nbFTPra^B{`v|n)sJEHNU|8+Q79gCKYq@L9)g}z$^*$yW>5Su z%ftA>ZUf+lnHdIIh?xemj-?0-5bu~ymxl$2)lnMD6o2}Hx<-RV)or 8dI`-mrHB6ZIjJ|R$!^J!)gXE==#&RPxH)6QjS^4kkb}hw zbpDIgcLP7kznJMP(cF*7;H}jkkzw(=z;7DInbBLwaeBmt@|Jh+J$bu9E_7En%<9R{ zO_2LCtbdDQ`0{WU1@PtGE()-06`(t|F Q4qSF=5C;~zG>CK9U7C#jE=Zn+5%EEXJ6q0~9{4R$%tL+3#9mIs)#K{AlH^Yk z@KOva#XNRZ=}gKzEXor$V6tPFg?mz%ZDY`hjej;VG>ISB!&olzzm?BS98sUkfkcn^ zSK;1B|K=0M+k)(Tas?#`i|F8qQVx11hJFf&&nn)6;oQD@&nBl_Ca2uD_+?}f&@mZ5 zo(YB5pC90a(msnY+xx80B=$(=S#=iC8^21^qzx)sg{dzOB$u-LD@IXFhrk^9`j%87GW>P8E&1kL<0bxcxM&fRLhYHy=6WK WfWX 6OfK*|#u4UdY1@AycP#bT2deH8YtX$w4HPaMVXK=B~w5P$?` zXii7 o>e5V8IEPwDF4s5eS*SC_uBU=pd*a2G|e`W{Ge%qYIX93O+ z#3xx*ydo)z`EgzrpvQ8LB(BThR@U$(0 oOa8HM@y7?~sTG0bsLgE$#q n#H6OT{`*Z@>FK*cQqDPzBpPQZ)_}A=IqIXYk+!c6`afRfc1t2wE2@im)6P zTwu9IzVYfHZj&D~l;i=E8GjtJ2%m$9b&*PN NHS3LdJA5>3{u+~Fs$|! zfUsu;3#YuTXWOFz!<$?KzT2Y#BTBtTE9^aLY46dBdk )VMJs=?KGOrXe4NT7+6ShJ+<@Q0TI}9 z7to%z09Njz%+mxG5Pw*^p#>C|T0%z=;F*37^C&DKRl6$KlXUFXZhK6SmY_f4bKx)q zLoDUC=7GrZ7Z`zhBTo=ee834(w6oC=XHYS{mlu?8aHGZ4tj Hz zPCpy(pANFQ&|LE#O+a2qG@ 0ynnTqShW$^H7+esiR-eAn!isz@4Zo~9mEcL-qn?ZaO6&hv&R;OVSVAUEXK~b|| zDiNha(tHu?Tz@h2>jW9aTEtraDK{+=O}S{9NS^>2HDk!5ElL-93R5l81;ym+IRmkv z6BPEy8c4OB4h)kvhlzke%2kjvA>(aHilm(*xvWQ>loQI-O?iSpD(M-+6g2Ckpn=mM zPol>Z1Gvs`pvAs39Ow$NIM`otQpwK5h{EY)6WZ1!yMH;xAH=U8)d CO@gOJqUSsjBsoIMZM1 1wXDMJal!4*S6m6CTFYN z;knU*gNwtiapX=i+)5RL#YnRMQ77;Mm(2RH1b-Ii_k?vtkqTQKDuN`vKC&c>DKs|s zx}*a3gc6jW=^7p5QlFJGy+F>D2(~3X0Y8$0d4Y*@66R4%9ROyD-ZZ12m3xAUSi7f8 zu+@8tj#0m-9Jm#Hofio$k_x1h_&U+a@nW86a j+jdT!2yoQVty^kF^Ao9zh9T|H;H|Sk2DF$46G^KZ zd{CWkP;oT6fydN35k~xHO-dcW%~!o1B!9gAoxt170=W n{ z2b$(fpAMk!639F(HHVB+e(g>Z3BrJO2g@q*QXxQRtf2&k7Dw|(Rj{Wl8Z=n@Z-dP- z0pWDPs{MAA!Dx^<__5prqVb9fw&E@+zG$!jH7$vbQ3zVUP{65JOIo5}%Y7D!j(_o> zP>Uqv2R3i({rKe-_RvM0L0g-K45|ak0$AHK8||`$a~bBcrGRUsd$3jmTejdC)eDVF zBzW?YR9M(_`#TD>={TP?uEhYKG4_X|kaM7yPNB9&{E6A~JJzC9x9!4i0C3R@0<-Q8 z8j^8$8Q^TYiwbSpU2J&EK0${x?0*wzK)dcD1DbUY7S^hJT_-Se89+rcn;|AR^BF>i zHlra9cyqeI0%=wkC;-iChyl>d2H|1NEi4~{S5mV6?&MYtBRp~8xb7Uxhf9;P5`A$P zIN5pOKZA-KbA67*d|-|CR*!VdgQNwSo;YKPrYFvLBBnXF3USnpHh@z|R)52x7N~lf z3>epJ@Y5X6e$3Mx+q9`LN3 3K^*fb{i@RC$;TFcRJG*=)4Yni}A)HHz)u5AJp zPvZnUrq;0*7S2^FFsDG%iU714HK<)!X$5T@BH5wZL`KudAD)0TK>}G!t{6kA$qGP3 zA!7V{nC)qhhx;T8^~PI3e1Gy(h1--s!|s^R0hg5@m4hKHE8NM`-mO9Zs7di!k_s9Z zwp@AEgKao+pPnNo$zo_oiy0I<;LK=l(GJsSJ-a1lMRQn4aF^0xD!+vSZE^so8*-T@ z5u|r9Ir7E`PfgQKb!4Z3v{wp_;Y(?9_Qn)y+j@-kk437<4zf(e4}YV4U>5mX5$dxj z#~S?(^kvKsPd7xK*#rb-9zocE?hTp?OFY(x=eKx(!}4p95uu-xc=9w?dt`Xjf*76T zZVM_7K{h#;%N&@d^)Z98009PX0}?ij _RrO(mh)kXeXN>)zy(&Ou2`uos zlBm3@qDHe|aStSn4S!-iYh0#Uu%LimTLMCBY9AG}!gfiT8pIGrSkFb6&&A^3=FP>5 zBQZ&va3U<}B>c#Jn%vrWifssLYNM|3e3eu^d04nBy2;5!v#?qBCkV4wB#NgnO~jVi zC`?nXVI?FHCrPrs;rbXW==NtLy1tNi)R1PA$jg)hetSW(dw=!7cc7|whRl-|9!O~R zd%ZWA@|;gq&>Wv7PM+{d2(war7H=Azl3nGG?O3N3K1&{Ya6NfJGg@cfh=TrYbhw;F zn8is}`5~f54?N;ZU~hU}unO~_gL3B67f-+!-*_O?ca 1-U8h^Rf$tL &rc)KCThq^?S-!;8h=9lqHPE&@K$Otc6VS zlzb5fewSZKRTmkFamZLlydXK5?BzRR%M->;7dg0)m@OP|LFNk`^sOsE==?`Oa%$kQ ztuVC>!64?eU=|+KIV>#Gft0l)tj`gbL7lOekl1`S34gvQ3N9xkU>O~V@N;m8q 9DI}P7-r$#991Q^M8Cd2gawIj$&nVXw=Lu4_GFmQjmcm< z*Pf2XYPG&msfpCag(g$?a>5^(mRN_(f#v#^$Vn J*$#jT)rVB@XM=n>zA8PgtLCd zX_1#c`4_5gd6Q4+(RG*w$zXK+z*Ap^X&$9RQBGeD {C0Gh z8`U6&DbW>mkQPl@Wl&(Wc+ZuAbri+z^Q_z0#D6;&M4h(Z14X~R!5~woDr2)%q^yiP z6C$x`UqU8+S5!%qnrd%{z!ceXEN>Q-^Pt`=R`Y#gAT)1%@vx4NCn|g }@o(4|mgW`SmvqZ76FiP& bpoq<{=wb{h`zOUIm}|AOki8598AQ!8ihnz? z9uB+)&R`Mi;a(7cXW `fkMm26JfBz _WBi9g%}M{G{2MiGRmqbj0jD z4uh+v=MfkzQJzWQr7osVcAbZ>&!fR6sWBKRO-YF0pCm4_y=f9OV^ahk@_?sAH#DUM zcm)eo-0D>nSd}Z`@yh)@L)H63L5p4k nKRNV5H6nF*mv99U@-hV|%SVXx$Q+W Oe6C)ZE)(i#m*>a?FSxqs^GK71lSw_H<7 z(4%tTup6kH&8804#V6Vu4lh{|$x$Dy+UcPq)=Qr!oIG@YHU)lN7>_1SP~=JUn37#W z(s;tqJ1Hm3yqoe){Ej~WjX-k0(&G40lU&xJGY&g&Qx%#^6X~%^L=F|C1Y(& NMtk}>%ik`S(k{ JGCXIR;FkA^gTc4l5p)dVJWn={z7|hGfClZy#*Ta|08_5ZGaK7If zp9k$WB=Yr<#7T%K`gK9F>6>q6G01w5ej=>GIEjGOI^LGyjxdvnOzwY+cLOIG1~|Wk zhF{OHOIe}R%mQiC%FU%|j|?A)%w(d8piCuFXM=}PL~DbyuDj5Nm_ZfpL2>z-kBp=k znBcOC8^4=Nt-)Yb_y>w p-)2HH29;$byyypNb5Zous!9rmM}m? z&2P3KI!-N-ooA1e=h`bFa{ylXxb=G_Y-3GyM&I6Bvif)7lGlH?AD68Dow?#QI9UXY zsm_Cv_2j0H_JComSO?}kefCEdGcv#KwP8gp*CUM{V}3HpXXbaNx9H8_Q0t4~;p>cV z(g;)!6^i1edduHU_I*{l$!@Ps$JZD=(4QY}Kj#KlC!gTk0AFwS{Az2yS1mVjICF@0 z`?3m)$_EWa&y0VUta!*snq-f-6hghWVdR5`k8PLOJlPW|Dsf8DmIY#u({6q~SzV-< zG&^5Tz>5p;;Q$Uvstz5&<4Abjm&ha;uk{p{!{nCxIrs$$xZB6ggdi#LIq)5_W|^K# zp36cf*KN#Xi1dy+Jc@XmHW&P&)=5n3-fhBoS=xEfV;_GGvf$UedGL`954y!LnxsrT zsX;^LN579RxfkEYcv!fEPUEBD _+Yc+j&WePRtM z>pcl0El~?ja*-6ZuTj?9UYm+YbMD{}$(Y;WeZt4m0}pa{kkeFZ>l_kA#c$HX?xgkH z4JHkOyAglbfgW6(7_6K?75|?Yqm=(2AD@)}|C}6IX5;(hPx7T;1x(`i$<%`O4!Rwz z=}L2V0(t%1e0Y94tXLarIK*rMSp{mbRzXU&h 5UKSRvk?oLL*T^foRGlqcsmow zZ4&d9__i&(P70@zBK*}-64x~sb* vdM#TqiTP>AaFC9haiyyQ@set!7Hc)D1WcK{J9nv zBut^|q6o8?Rf9AP=qf2#j}WHwQPf!wmaka^1(syNF=YR%4*Z5G2vo6cQ!fNzwZvmD zkd|E@xG&D#Pa+^ll (E-TaD(EsfCTVDNro07cz2B3P1AT*kpfO z6*OhF_D9{^69)rbXF}DIEU!Uq3wWG>ss8r0g2^ykKvrjP&ZuVHDY3PD3pDDZ&)^CO zKRh!C fDybla*>d#3UM`01m=4ek|Kt`?j_Vjr;%^71HVrneCpLk+W{Uq_W zJqCPK+98ff@MgITJapVSV;KRxb9R3)JUY>5;=)7knp0)ru~T*OD?D RX)Qfzq$@q4{*>}kxAog|-fWv9vYZ(_^SeCW(5Uxg7r z7P72D7AXbIWslP>;FLfPlJHSel9>#c!jt#v!83P~?f7Vm$;cc6IUiRotL1-~Wv3 MaQZC;!2)DPZG zdrHW2P7|kQwJ(Q(0OGcL+uVweY_lpq;`?mxq>#5^o~u!(%X1N9+%rh!hSa0{BX~}# zLm *jNz&c=Wc%lOWqb3@ie-DVV%gqm*`CPytl`bK!C`$q?akj;Db;tY zl t`j`!4uwUmr^We?M5{4Xcoo1lD7j>qYZ>C1`uHrOXCF2Qewc-d;@ z`+E=`S1a6iK}^@Id*26Pv0l|D;*D# zin^?p7O*!ny>JZB$P#~i!)L8mQ#8Swb&2zKUE+MZE^+?8E^)qFmpI?AOPn8qx8 OV;m-l8ulyyvTH`2UWl{9Zx zCC#_1lIHKLlIFWrNwbQ{?UhVXtY>~=J(CmbnVDG6w8VPmB-S$_v7Xt8^-M*qZysWu zlMur*5Nnfa9o@i{&O5Ae(qW}D4y&AQSkIXLss{8|HJX3Fs-gT 1l#BxFbDDunG^P=Lo`;RMATOjGi8Vb1lzgd+`)Z_U__gm;7BAACqkKYms6a z<67O|RvLeR>7*8@*YD(ycUs<|lS?i!SU|IPaj;8B+FX-($?bxX(c*~B<1IrzGQ;;G zYMw#sfgnjTepfhpd5JsY)NQFgx!T+5(HVD1sxF?xq&ku~2~jnI@_WKn`+=F0yv}n{ zkvNby*p;Z6;`fr#EPYij4?Axx#Lg*i{+Q!K%~yZPf>eGJ5lL}r {O0U$HEH0mee;E^JUJ_)XKI_1(z z@1^{hMW-QmR>B1EXm5lfepIbKe2umE*SDk!y^vgEyNy#mWYy@ 8*O3p^HN z#4lWA3%GO4!Xv@YU(ByoFSLRA$s?w_x?vFq@5>^Za)$xam``c&&H0QG+n~FIehjV4 z=*QH$jQ)(R%Zh1k58)m&&}rcPWCB~^TO#bR=8Ndt-HEOqN(G%0s7FGR622yXASN$W z5&Fp^=D_k09nSFb0Mj8X`5;x0lj4|^rM?~&x8gV{a}lH>etCT eKd?DKS{~@L z9y8+u?0#7JG$CakR!7Mm7;%Q`G>Xv_Vw2cp60uF(j9(c>KqoYI_@?pBd=k6pW*(nS zC^3)8K5&@FCwrXyb?_9XHNnq+p<7@wkJH%O&!Z{F)(Jte+>;91z8D35UX1&IGa0O6 z!?|1*(HaC*Nh(ildIf@FMAixq2I~-?&E;|#VVTS65Gg@Y26 ) zNJ*ySa{(Di4cA(AuuVa2`;AT%#@@#T-C_}v3%u3xBNqbug-3H)Y?d5 Gk_&}cxD+Dh z!D?lcGXc$lisp#9uwQuPMq|I^%85rBySx_?p2N16F$*5cH@e5F^N1V*RXaknktlmi z!_g;4;A=eFbDA-8ps*f)UUJ}Y8sKr@!7)0E VATPESjL*x~7rL?n44 z1wsX2baMLO2>p+i0Il!Qp~zyKlE>@Nv>a7fRD1~INXjzY69fu>`w3`s2GDR^;lYOD zUC?VBH9QHyaqzL?Z;g)`dutB(HVQuG?t)?pj1X)0;4$LtT|u)d*IsIT5~WFNFp<)x z6@LfMMVRN(rSIx2;sZSwg+Ae#B2e#wW-C7o!GWZ?$-w|DnL&AoWIwb2eaNcf)v#03 zVjF|nc5Iv|j5{}fF6dUh5Elabp2%Dlo8E{sm(4zNXA+lgj|-Wpmv+In>;AYfSjG3w z1U50g6N!DC??PiA%i6J+#k2O9hB2)p@HJksI}I;8P*{hz4jfJ)t^*IaKeC8&?J*I> zMbVjAA?_4Q_ZX4!P)?;Zh~{)kxi;J|n(M(E 6H5IJR>n@skzwY=~j_ZdN8N zZ4QmuX#Wg`x=0c8U=`3ia_|5 ;Ta5X+V|x%E zRl#PB1sbr)eFi4OfhwiJaG*|kFa9+g4(!1j ^vH0+CGmFXqV1+T9k~6w`40(-GKe z;M0M_V))(x-8vp|;BX2?9C%C}k^{8i`G7`$$PCl4!Lx$19XPWDHy$su!?kai9q?_I z;@H81s$7HW;JNJx?EAZ>_<%kf!F%KSZCsy@dwsr~)-Q$JG)L+AC{V`%@(6FjyTL zX-Z_;akj&=Ib7Bf8NPjSIXKo5+wPcHOK@l_v>%MHM0OZ}uw=k9%(;iTPVqDg(8s%f zO+1-Fw@KU{ZUQH688^fe+8kzakkT*?qGJ 9C`bzqdB#pFItm@TN#KeEz)(7phF-bjYw@#_2nA8Nf{;FPa}>8llOxcFv9_*&|r z;#E$c2DMJ)QZEd*e})X}^@rgxoc;wSc%Oexgr;HVRH#~Z*W4in?DkKAaeTj=!Nf3< zGh|pJ8HUF&k_$}mMsiMsW+dlSs7Aticf553wvZm`bvwWe)6DkKQH+oG#yIeQA2lgn zr@CM!!0m;G)7_{}+R3g|H|+=c?yh%t;#hs25m_@_-+ub#)9tUf!OhnX?;bt`cOSmq ze!9Q^^yL?m>Hy^b{OSI|KYMf_(Ie}!M~~&CdIQkKq^t`1+7f!mBEOVVZF)DoloO8F zFJqm@VMV-_u9#|qB`hedCS44FPc-RUM51?hpT4qxztY;EfoNgP@bq8*X2oDq00#J~ zj1}-aftxk924i2Hw37wfO{>O1J||^$-#nfY`;5$q#VG6pq_PMBAz6*XK}b@*NI$Sy zr9XooUvE6=jDLOct}E-%6A|B*L^LHq5>E#&_LMpgn96z1fux=nh)@-O^b#kciVje6 zMG=<)cb6f-stO-?L~j1hDR30!0uQF1T%yENlS_ jlaaTa6yVJ!0kc&~a+)oC33&2G|hmMlW~kTlsDBl4S7ZI6`(^9&GmF%%b;} z&(l1Lh1+}~C_#wi$60k@`X EF&eH`H{+OFh-F_%>Y=$X+Ni{u*DN;>NU&>Su z?Eh-A_3MZGhj((H!I;f;&~0F^qcmZ?@<2ix6o@O280+Q}@-g$zNjhEWu0+T1<$bc- zVdkYI)vq~P1}YL3@9A@fNKmp07YEGZa A>VOm6 S?+Z )kGS0mHvxL0lLyor1LPQ&4#8K4ZYJ z?g0`|>psKBHM%o8+!_Hlx-$k~Q~2 >K`*1>K0 zl)zgt0o(K=S4xkN_T0gPx8*K4h8_3uL2bATjcZq3CbZHAx2G;Ru!`%GM#w6ECbGf1 zzk|s7 m_tM@~+jN#9L4I(gMg7{+ls_Fx39 zzp&@%k&T?hF+z9BGdVRlIW0JS%;fX|lQM-k!%-hLJ%QGwwZUyR#q$U6@_fuX2Wc$v zS@X3E>$EaDL3=jgy&^%&5hq}O)|Ln2!VNF^k?Xq{<>cA{7&`tmIFJxFe_bCvq1QU8 zfm%07Z&;-FDPz$dlOuT|w|qh6kMiZTKJ*FQnXbdSI*_bNqNxQ7=Dd43?ko2ry;KIp zck+cnDV}~Yz&YY+M_A41#4)#fevmM0@Tw%+m(YyIB#u+^92O>SwM}e)P;{Nd_hPZ$ zXSz?a+aBMz@}1JT@t9qH0?K#{A6bpb6^bc;2Sz=;K(Uj~ppx44MQRr1rd90m${ATy zG!AXLu5T`lSRpm!BgX4tgpmCw7g>&0K$B{;_}f&IF;+jRA?ox}tdq1hxc!nCaYut3 z1K^Wkok}w$q(~!9(>FpC6DiFx^?I18`$-1ijd3Tpam)snlmE#Xf2MDUu!e7z%7EKR z4;kK4&f&3?cYrAkw mIxLuW z*P+3-iw+g2SxgT+fAmrsb*f}aF}%wA? Vp;NRF;e@5SC>JZ)<6 zG2PV}m(ZIe>uQcCQooe`wX;i(uASVi;_0SFU!W9QYV o9NEe=}wD|a{(&6%_DyO7=DgA3_mmEtw)u`NW zWDDL6>O)_Le{v41y#pFKFV~)`>x4Cuoj-rsjI_G=qvXds`(wj$W+yb$%YNoEsO!eO z6 $aLvkFvw6yk)nfA9&q%|$eP}et zcS3_;NGA+J;gt7_!stNo*`8FGjmCniUns-UU0`JKe`)kcVnic3B|tTmGcqKDIpdLs zEV8G;b5b3|NwGdznX_hYyLk1$iKdO8vY5Ppt6+nQC%9Ok4la0uiYhp*D-6jMES~6h zOx9;w#9s-saPS Q5}JwfUsCtjW$= z`?Rin*Zmtc%nKEWzPW?&g*8TD6 ;jrdNV6##K zj%_JzYxsG6=QOX=u<&2j*Lk=nL6uY~S%y5xxT0-e7hqpV%`MyI*;LnR)gzy2@tjLx zTip|*JlK_UL@=M!lP$^VTgzxfePkDp=#Ly14iA&hVRh?AfJ!jWYs{3xZmBIit8 ?h$gB_0p2BK{-bf2-8? zR4xcbrot<_gs 3ixyL+SDO*ULQy*p*x_>_n$vL3rJmuPjH!>@j&0&M`GG|R zst;7|Tqa1mlx|#ZVSy{J%Ou2nF5h{yk6-6=`OTwCS8_g=r#v>d%2>uFGl{Ny`x(JA zC;J*U{!D#g;n4IK@}M~vht}hCe B z><|WZL*pdd|BbKI+mn>;H)R$7E2h!r>dof#o%m|g{CW26^)db*VO}KZf7RP>-h3mF z#PP@%vAU_>@t+(1^IyZj_1+v-r+ruNry<{1K)%tCZ-ybGUO7%+wu#5fG@{32$Ztq9 z!PIGQ)Q<~@8P^y?M3weN{TM~OGAhj^emf2qlZY4h_a >lRrCFD)x=3Dt%MJN znZS0_zwi7ph^|cT>YIO 4W&aFf?Z}pE zt5JzJX+M%J*X-~9H3s>;1?2Y{^7~Q9A1ok$(2ze2L#n&TOb~Tae|4qVAY8%%=pqZb zLGlZcLsPRJ{O;4h!$H>H!;I(k? QONHtAivj; z7Yr*S&sTez#w5E+f5TT=S6BSzh4`wuD(
&?n={YtsHgpGGQACHvL_@>>mgq4H={85={B_6zG3Up53@aD@?` zNce^Se;DYA6g(imYC=FG4>0uE7yYbBJM10uf>t!5sS#0|fA~)Sx(v#Dn@S>c@ZLvv z`pHH;87H%2>A(-;7UYjQDa67eBjjHCubn>z(Myt7#!W_>_@4b5X*6`g?`%-NYf!%% zNBzMD^@j%ahfAo%lbPA5l=tGF5v-gRm02Vq(_g6%B=Fzv#9tTi)jh*T*edP4`Z0)D z6=7DUBBC%tf9<7z==?E^t|wH?jG~+Tq5VAwEw8RO0F?=U<^R77WZEx$GXlh#G!qb> zjJ0Q%AXGbN2BZ=<&EqA|m<4-#dR11e%N-W+l^l-Z*MMK~j^kq(QA5Tn6DTIn-` `reh7bPT4l#;-4!P=oU1tqb6ED8R|Jtr3QV(e~V4`#R#$-5Qup%>xu;#h3s 4&+Mr$O@9vGO74#n88B2AeAcz!{fcZ4gXAb{p4r=bHl#lFW7e*_1)h# z?T6Dj=8u!pBDTrS8GwDkvl=b0!h&2K2>V|}ulQmfUPN}nT!wki-fZ{{=KRg3q8qVl zmc5w}e~i53DJ|L>5k0Xm;u@P;R{S{B2l=+?-S^&32>E-RzgAL%$d=N_tFq2{>tQF~ zMU?-LFIea*Uu^E>iwUVx5*8V+1ilpRiZu}t*@hRpjhCdli1L}g;5Er#Y}ywSQXNGV zh{6u-wf*etTV7|K2NUdh%KFz^vg0sJ`L4J#f3TBa5aEtJ+{lMqr#JlJlq9d!!8Z5m zn>+E(1U_@|MRmoGtrQ-us+luNF2z5W2rq%$^XD7>T(~{`d_p7+aik^lvPThHv2JEg zlg!dgE}}dzN%)IR^I{`jOh{Fi xsY`WPg7ycB+35^N0U*OF}boUN>L zfAMak-kpf2yJnXgTAiZT$g=i)6En}2(wuiIgnPY!+-Y{$S67{{gu5QgbdP!zWS&^h z;j6tE{3A`vevi 8Rn3nDw>D}f(`GaP>#X_p6P132ttE;Pu zC5l+0E0IxmVJ{Gzz+)76#Mh*8b>^--FQ`~n;+~Hov>WwMG*5T(p@oEbLBxO!f1d;| z-9_ue+;#u55Js;>xnh2&&fTRs!Ff=Ba>rHYQ}PtyQ&L)3tw?`nvmHf~(SuB9L_T5^ zGC*lXG%cQ1NE76_`M8_`3!%rPb#lp~r;xC4ites1xdeJ~1b9S7BT&AtYD0IMXt-=e zqG|b`4 n@@lJUt03_WLxj|+#Q`8Q1eb2OY`U1 zx3Z}!#eP=S1q#K#b;&(n9uJRk^|8mkez%dYHtN+zyxOo=gL1IYm6cC GR05SHL?Ji#V9S) 7fHFfAHp`RtwY^ z!yp;2fF$GJJ%y}KwM~gpaSna 1P#`bAI)F!=4Y*Ghf6pN+u_*GZAo$6GNpJi;YTS z8sxJ~vFW7P$b(6RAB=~~f2OQRp35Avul5Jl^Jq5a8HhFZ`Mr9#QSVsyMZeRcun20G zq{9xZc_$rM^XJ*O!hvOB`ub<5rr4|Da_z%j`0$;6sw RiMf zE%w@@(kni&RgjeOfAL?+dJoMUJpWTnqfE^xb_Jh<{jvF$4?MGPH}YHl7yDMP1mJ&) zd7A2cy0XpWv95TVc-3y}5JOo^&60u#ei?~Wq$+$4-*v&)y-a4%757$tx9My%;lpR* zyG{EY&m8x5`n&UtsrA}dRb6DNm}9aF>$Fl^IHqzi3GhX2f0|PXxJd710{Lb@rYBMq ziD(X4LwF4LNpvMwy-#b**tcJrcf9!&?>6e)xe$M}W;@2Gl3lXj>cHpi<&?;g9JkE% zg W;?sk;Ow1)Tc+H?rM`_q+(@ z`%T6N=Hz=V(0x0id-uvuM>-Dp_VYy2&vyoX^~YjN;3Uc)_?!nssaiz(M0mi;{lhNV z*Ue}jUk8zhxF@B1-UKmcQeKtJxkZFqgV+l;R7w}5f1MySqI=gu@L+n=gV >FqcxF!kT3|9q`W3ubkG;3sPN(Dh*`41lJK) z^*2Oof7nT)CH^%_sw;ji({P`u`&v2?{$!(`41vheAHFo;ikay#eAHbb9%5gqKFTgE zFXj4-(HQL=U*N**HrvQ_a>kcm&ZXjTneLL%D*U=)VV^+njEFGpEr_AClQ1_bL}Upz zDnVlbJb{gT?b4t)DP{=R#~G5aT}{MNToRF&f3v6{-kTBxE&@)We3kEIpG^p9CtPRQ zl+dEGPAXz6+b~EY+M!*aBQ#LFz9d=A|E@YVI4wu-6BCo{esI-nXA?dys>_OnNMgTb z>A*h X^UJWJyP1f&0aaYO z_jXmXF8Oh|RlUGGfpn|iib8*{dzbg(?SzPYQIqV2NU$qKb!l0`MG41%#F8!9i%}xC zFURF8h;F2X>l*EmUlQ#S##jAZy1mohfAz3HwSL+xk>WF|%x|?#Q#`)S;gXnk$c-*G zOR{9@P74^H?UR_uQqwxP$=!Z#YbbTjv?1;`@G;3r7LzPWtV?ke>R0``DW~phE#<#S zQS!c#*n3RV0T*$SLiz{waHAexKx_7YH)X~;tMOnahggQby-|;(BJ)RM-1K-%e>(PX zah_wCedz0(=Ao3}rZcB8AOVXs9;fEk2FXu9{3!oE?K})n?s+Sl gk9i$!l z_@_?~8~#iV*okK&^eW!&bmj6oO|SUk5E0avN-}|SE5r3pPw uLGM+}4;p z`a8vc;&lf2^13|qRETv-F3vs wB+Npge!%`0;e_owK^2yiD zn|}%C)!RZMlMZYoxtxI{E31$>0J~~F|5nTNNj{sZZw~O5#rrfPvYMoc$=uVOy<;~< z6oS6}7wcKGl(P1f-Sd=usByY2P-HRLafZ4iVmd8Juk=nm(N(rD(jMg1B}|=z_aZHy z(JKBX(>5CfMOWOQ3chUye*^i9+L2Z^uKOZ_5b)c7@hC>V*{C-o;_$s7q9u@Hzs5qG zeD|RK+=xF%`Do1-w;U+F*w?>6*#GdM|Mv)G6XsU*BrrE;AHirs=8B#~@*^@iw@jxW znn$kBDg+aql)j7R252n71kP_NvJ<_VzLRHfn0&{aIe@Gx|MpJbe*)hN($8MY2wnd* z1R%y+yI`Gs48yg_r*IGSxieiQ9o%!K=d7* K6j?Sq?>%sw3r*c$$e1P zyr4NLszkQ8mL+oG A5-y>CbCK@xx13ps`JS-uy2BK_W|7?1o4 zu09ywm^;)py(rum#;tnSExRPs{Zu=lh6YG%g%TLULWy^mh03`zWo {; zn$${pUX2AQT_w=-9-T9Tr%2D&@K2Dj4-|=5rGEij>|_v4yk5U?6@}SVa#e;;;v59_ zM|%{gsRVYYe`2qMj78M)j}1$``LyAwx$9+rGz|Z%o0lK?lEo|TnXg#o@gq}daUmoa zN-Bc`@kSot(7c%<;YGI%%Oqm`w{U;CU@o%uzW$N_X0^qBn-TNpVjL^)<=R$)0T|c9 z5DQ_%^rM3$osY%BbTK<=#7g;I0#eCb6eNA+kt82df03D!OO#k(n~I-TdB}PQ4)VFs zyr JQ8MM zuX?lj(As9xT-#9S9E)!@;imaUW{rQtO!-wEP_R)erYE!7IcmdI!OkE)wGWJyElrL| zCFdb!e^AT3Q#jHXUKZyP(&zTM2#asza}(h*Dz-+|SrW;mdRtOG6Cy*}tL@-{kOq<( z!Tv%wy+j+8NUFU|WRiz6+>w!1{j!wm!+Y_M2~*#69T-ml9<)hcRBEx#-nfxEN!@R! z#LIE-eEL1_-tr$6iN&(6X;m1K;1uJX`ctd`e=7~;uxT|1g|KKi2kB*_CtsO2pBF?K z2Afw?*8Xl#HYb-iAdRcn8x#t_@ePP*Y0ZO@SsHZnbvbIuZL+Qjw@=4_`%5}St4lI@ zn8{S>pU_^0X%}yP G#zWhOhphVH~jxDA~YH{UycT zdL5WFcRe> z|G&Km>d^VCvU(lbk!vl?DV{paeseGXf3_F!_xiY{RdK%I#9Fi#=|A)@dvVG SF{<#CC> zHm8vfv;& q7>=* z^;V;>a-R6o7PJxklMm$~6newu7-LEJHAZ$7)qZoYe~nS_D_fnE{N%$2_NSS8bKP`f z?0@*cwf$EkMjEijN$!ZCf5G;(vZLh}7wE6A CPQ`v3Fzu2wwI&iDNgn>wfF{Wf zq)4hV5Ql@<^69U|5hRMZhiD)H*Ytq*{6qUn6jq|XmFyj~Q*JpHe|=A?%W+7XM8_d= zT7f^g1SaB;xH*3NNQ%AOGAxsnq#8586UIrTcX4x=_pN+yE~MG4)PPJErlNj1or*eT zbS#73XQsL9esm?<1@iwB_cqIMBT2gGex3qjbMLXLGmVmU_4F)iqh^tmL_4CyW>T%` z*~q}m$Rt`wAPYaFf7o^x^%&D;=WOqT)sx(C_xJ-4zsTg=g~UWe_~%~)0`VX2n}tfX zys2IEF>K?bfj13~c>i|!3lSP!8c=t@s7#ggqD?8NU2xsM^1tHAoNigBJs^|GVJQ30 zUC;KR&l?j>K5z_kLyl^gR^rW`Rx=e1Y7Mkd (R7Lid8U|o3>+NmFgaaES2z##7e=5qbRA%7$SvX6vIyO zxi0qQI=N7$e_|ID5H1o*S5(!rxMZ?fsM`*4p(Dlpl#OZN*~*E1BLg3Wgoz|Fm%F5p ztdKf=D!T+V9YQ;E0JnCu{mykiVBtJju1q;}cmUwCk1Adnh5krfY~X56yZh3z-P|R% zLqCb+B=WJ&l)O_%|G= ~K>p++btr~TUJFU8 z(iXuR45H 7hYe{k*0tGvrAvg9qUALjzX+MU+_{uP1cmZl&FUlP{$l zShdWte;sa Xwv9{@w6@_b(?Saj zEzy!J9Zh^r&qG33h0X(0%xN;|3k5^1jnqtn#_t#wY!|KS=Hfp6myeelFw5b{kc_5` z$R`^B4lf^>2D1?!!Rh2dT;b=X*#^#IPw=N=m%=Gbv(1L-QEXFRRSY#5*+ru#DS5Jr zf4-N2WEsVqS2PepNs=- i8MkcxxfI4^h%Oi|=D++0RmQ5_ z@^@&VQB-O^@`IS!(Ur?b*u!(yd5DxX9)8b7#R?HF@d)P;{skff)Gm0|eZ{3A;lF6M zIArRLS{fQ_j9eJfTFf&su!3VPojf1|0=CvTpk!55+9>}1qRM9p6$PFRY3Q(|LX zw9ip|0uX8?1EcXSXQrd=tk~mT)}oMhk=?| zgNbN26 i>tTo{VgtxSMj1SG(k=x5f!O;0|f<0EiAUryp>M^LO*a3vI@GaVh^ zM2*^gTZn!z{u}WkXin5Xs_1O*{-h+LxZRKUyXD0|`p}bzxnVRrVKD$Nhs*1Qn8r`> znRRso?_hsOtLx8TQAJ5A9)D%s7^@FWM!{ayNoAmN>d#Kcfnre0&F>Z9Pm}lPHx?^< z&UqbON2#02=;!RWU;hh&e*5(wlSJt_0rZo7=_5Vg`bZ7mz-0Y5N2?02laD{XP`mR~ z#EnjcRIa699;0wF@&oTs2fiA=KsDi? J zuC*SWfHDk4c131L-$;`=>NbC0Xz%GuIzwqmQXE!PusP!9VlPbNiu6B-6OAhU4`=6h zA8)^`?#@1(Uw%11d;k9I=l7SZ)ZFM_r_77-Ga@H%K7Ba9IlEn5-Y(CFIt6{oY$(u} zT&yn7ZqMIceRvy{i9qK&qbSl}&b!(%FqkHRMf*pX ~7gL7fK#SdQqK>5M~O{G)902Z#%t51i_8Bgk`KXEGw|f^3W> zOB@?D4VvkO-^<8F0-As8q3HC4r-P3Ke#cQ)`@smyz>kur9h(ugi(i Gfh>R|(45m=r*C7qlF3X}-TH3OW%qaP~ zMB9kVNVou26b_X Uyu<)B<5SLnq65(gHvk!-wnBMYVUc6DX2^@{X#2bu^5zq{9$6hSC&ENT?58Zuke0q#FKyG&_*4c$E#S+a^qx>bPt8b zKheEIEzEyAX=`oim}i+3kgMM?29hot$xLa3hNMZrniJ)vKx~zQp$(t0J%g}I^jtbN z5a&-sxLrLhkrit&g7?Mm=EGENiV2q Zgq2@=0*Z*ihgHz(se=kB*gJgq;wV z-u$hocTESb8}?;~?so#SFoTa*{$rh8U?f_(*725^w<09J^0D6#%yJALpSW~VH*z^r zVAZlx;eB(tN&X;BDe*o21%jNP<2AMT?>Mc>xs87?PDG9JILr-c^vMr~5?ekjYNnzo zTJ?112>nhFJrnY9>UORY?RKIVyWK gzXnPVCkfyp(X-n;t5v_ ztO|dG(Ia#$R+qju-cT|Z66TW70a@+LO|$|^I4hQqhWC|ufr?lv(vNeODl(qT%1Qfy zE;c5bnO>V7bYT1MLXKb^S0N2BhyOBR&&S^)k5t6~IsBlB5$3GbHfV<2;*6-s#Qs-g zUex0~nHrtIC!C}%2FSeK$Gb*7GUBa+pJspCH2X**l=K$ 3R1)nNi`r9Xil2|3i &?XGq%(-p{phk3B`Y8 z$fya2uSk?PxJ56;Dy^Kz#Z`+%icO(7HNOn3@>)lp=};1X7C$`bU9)H53D!)-SZu|g ztkbBevVmtGtdOK=(lRUc)1w2%!NyGMp=2$big=FK=tO`W4`Y(1B1UYQwlAvu42|XB zl~hMlG)*TOBn-~Z&|nS(d$F+=QXqd>-%$#!8MUgk0QgC?P2cFDg(YVy0cB}*D4uF@ zHCM;kAxE3ahp{GWmd3iQvg(fVAwv1S*$i+CfT!OqA>fj~Ho_x`wCIsSrIm);(1t)f z9Uls=hVY84VlyMwO%0L<8utkeEpa1%`QeG{SN5Ey!w^%^89c^l6DOe4^$CALt&sxU zIy?Fza^V#xwT?N&Q@=BLuVe{>xv0E>5>vOafmNjyt8^@dZLxfEtCD9_@o P(+PeM2`0lO3r9?tNQh)e_n+_~qy-AGsn&^lq?BGz`uP6bRJB^S z<-s}i7O|o`pa+YzSa66Kj+lRd6A^UHXd8+cO7x{n_5}Cv74@JltE9ff$({n)dnn;D z(1sP28i5l^&f3=JC}_kYi1H2+{KSc23L3=|LUxHM9Q4Hb2xaRg?L|1Huf)j=X%!~$ zddO6f$Wh43(TIUnl8hUP?2AB$W+7SheE~)zVM(N@2{bU>9?=NH2sVE*1+1%x6qXIR zIYF=;)OO%+8cov%_B(CdCJ5rDsN_Yl;IbNHU(L5gXPmke^ Wm;wqV%YXksoY$R`NvGiugkl@Bcmnh`Q%!q zu$;W@C@%P|v(b8rA7pySRtVcZbAuUrAeTs9Cx>G)bGd6HWaih ecH8U`{ofF z!NPMUNTJCCu48{OI@ XG3&pYK_Z~p zSZ%Q!vhVO>38kl5zE1zWEf4xW7})(0yIC|}DDqv&C#%3Cf_o&8a_E63h2-uT&OV9^ zlVv=ajcH_^!DOyFK~vS`FUT)XQ(s5vkLZ-^uPks_Wt4wLd|YOb6A$bDeKWuS9)dmj znyHuwp23q)+j$j|MCfFSMd4U5K8H^aXyK%n9{v^+@B@8*KqD!=bQ0($_ %i#L5w5rqV6nTu{@)^Gb%nOxN8SF8VW)5rSlRV(L4O2ms zHS8H}KMWrHFsZrBVo%65e4t-71$OffP4hLO9Ot4Rbx4LG9>u>5tbLZfRX_Q7qx3rw z{wyM}hwGz0^6sfPEUD`gxfOqms@ID$YzoD-UBiE2BQ30y9oZODZIE`k5KSNs?vqHB z$y7$`rc#-tKLB$;jK8z{{Osn+(QJ!YX=#IQM&Dkp?lK-~fw3(b6o=B8OB3HJI9(lZ ztCf2X-~uyV=S(UxlYSGRBNdeN)6~)@rUAd3zM_YCZS@0e7h{kW$GBG~2cR%v>-)C6 zAAFO5u_ix%hPYZMhpv2JaHb-itnP=h(kCAA)vAm~5ORtCEW&93jkUvDIN-^1#}J?| zd%6;mOvVp#j =uLV-1##X& zf{YS~qwR8u$Iq}TYdVy_UN?hu;2m)!bwV%%^Pb{=vojHoBM$rV)e*f#Z*VLW_pwK` zL0W;k6{2gA?pBE6sTBfJ=lE;|aaCqRg@dZ0#D`$3&TBs(*}`iSXy@rhw21p#7fUSy zEazyl6Vb&5T}k#G-m#W@;C~yhNsLL;2B5qxb*P3N@4e;U1isSps~rfrQW9yjJiDQ& z>^qTv=GFi7GTk-RhSgQ^+zin#cqH={AKv4GQwwoHt3CGxT;2 *+Lqcoh|vJ7G^mv^(LVGZZ+*&u|qL_Ebch zWo@!Fjr*c2*B~#piEwXZTQyIyMBD&BLyRs7+E{@YCz+>FAx9|J0?q<2d**p%JeFP< zdcuC95DSDD@JiEgu- sWepc z*-Hw&uYz-l$f7sWe*(jJ_|u7v%aT>mr+oM`Dca6@!vnG#@sZbScHnYn-E+Nv&TrZV zXRM=c%$9<>G7QQ@kOM2cZ|lSlZr{4~LBPStOr$zfEH-oI#10W2c%$A7{EIrUwy+s* zcQc5 l1wG>a3%Nl(R3&|{_g?Z4lVX9Eu(e%X!xn%8+y*fvqz;_G<+o14c(}? z;wglHR>p6Nr+Oj6JQT?wXpfeEc*{qRwQM&zHv}5ZHljvmvjyPKMP19+G5wZB9DT*& zVJ1m~b`3J;Y{ICdUbv>|W8p;7pXsj^&e#{^+G9{B62|@^f3)f-53$%H<<*T7t17o? zbjJek>B&R3hJG{>Tc!N~{jCeJ8}@rJaL OExHbo(Sh!w@d5Mvy# zyeUdlUKP5&Ee`qr$S)0pxU<@=(*55*{<};m>bi`|{)b`v){QSKEd{&G@CNl77!qO$ z6TH`@pwd}P gX!*^WKau~u16PQClOGe9N+C-_J#?u2I&XnCT vS4V%hc9k}cq((OPwlcAHV=mAP<*XkHXR*+>y zB=0=aQrj`4+(_~|HLcnu6&IfSh3m_34yjG%G!chy1s~zulF`%C{4u}g0|yw?15SR+ z)~uW@B1Q L;t7%+ zgPg%bwvv}wBYA8}&iw>brZ^YkIhl}gg|}YJW&|Ry{r+F@gclPdsqh>$JJDX#!bRIu z?7-V`_fRg(&5wEuvBDl2Erl4dDb(q(6>j|-H?g`SXuA+^bxda7>FVO?cJyK8>Z{A; zSC^}=4&JBw>Zsg*%ujtuo{m&|vbLfs*I)5GJZw_iyVyw@;iOsyX0ZF+IT3|LWD!&; zC6+R?sF{hn)zSi E)))}lc5G0CqMhJy2`|Z4O^Vsgwc2e zv`#G#dcrXM|M{O*WS#8*C?#~~AKNYea)OCBN{-FkYz0AoV}Ik5=KYU<{P%?Nor(O1 z2*4~%%9(yBckPZ^Fi9mVM9Wkn4<>b-p0zDIzLYszk5{y;_-iQBwTMYmGZszB6yqgL ztqon6YCWx*UAGnCQU;2vc umon(Zz&*K$CU#ZQkLtGzE8lad@6hg zrkV9~Ks79X{%`qrKC~<`(<4dPWS0+yM%tQ0YXj@1ax{^XMB>|^9ZVJK1~qmv#a8HH zq|cHen?@&w*wkF75sFy>ckqZ?1h;8DD*rR#v{yj=ySxOMq +2-W#DXp zwKJHUzG_l-KNGX1#B1mZXXgk%(A z2g3FcpR2}p3dRLJ7P9NPf;H^A5IgXH*V`pi; f*SF{ezFd*qG soKV6{f;7^Q_{JU5!oY$w zE)lK)grjU#Bvu56G_g=5!qsAgBd_5vDiH^N#)y%;lbcvN67#4+nt|Avg^P^(kcG9! zE==>F__{MjNi7zK^n^rWK`g90UW^f=__|}oJgSgpAa-WqBBNsjm`E<{ &9F%>%ia8V`YATza+V;>^VlZpO(YEq~3L0irFxQ5OSl{Nq$ix2F7 zDZl1Hj)}F777hm3Q%27=h}nT)Wn{G{3nkW^Omuh=MyG>iT!wKjLX(T&kpD{E6OE+g z$C%tG$5?g8)J03#2gFI+UcZ7c8>^@?Er?USz4sldJj7}=1j03-5lcL 2s;WxE)MC mGuC%6XF2 z>fKy)I2>pp5LkrP^fa79Y$d~y?_s{EC)D<=s#zb>B2wMq9|uOB@Am6M91 rr49vUBKvF|Px3Ji_Lv$*#>RX#i9m;DXoYB!af)NG8934lI<8)P^8pS>d21zy9 OFyq>9erT$4?YaTs<6y_RFat9R zjABJYzWwlxqB^r^5{bEgpn`=4wiMo&TfNhFVkXd*65h 4qr z`Z|__NW?jkx%P ~)BY9t48>zqp2El5Yy^R3H>{U Zd;29cx+tONjmTt)x0 zsU2S%#?WVmKPNKAjB{dI&hXxXliI&Go+~?AOB$M(fKE)+nQmoZ)=Y^l%>S;k?WIJ? zT-nE1@CfSf%cgjy1QmZ-o1GO{dcspJ@FPF_yjn?n@uRooN+zyCeqJdv^XeXhQv}x5 zo;qc%-hP|HtI#5UpG*Ngy73kkE<^Na^sh@KVM9PKa#@cTDta^)*ae9+^|svc@5lLO z12ksx=Q1SbMbi= @TbvZNHgqLmG%zDuhkIzi~4ENHf+j%evQ?h zNKTqyg^|34W-`i+tPU#Bnq*#>8a??jb^eRF>ZuVHG0|l&o3*HyI-#Rc@-d9rSiCwn zqkft*`?+X;``H~LTM~Jbn36ksACVNV6~nK%j?Yjqk&9MWZWx~%!DyyFtaAbhzhP6c z3*idFap?2m<~&p3UNZ4t>WD#ni?4O*rlqX6O@g+Gpl*=h(WlXBzR#m*Y{74quwOrj zqsvXG8k$LEb>v~0mNy(w`K7Uj@{n8wIelV Ieon;~>6EV`CTNFXzmkTl!`wnd6Y%pgTg<@$%z7cV#;mi7= z;Un39ygBsNyTV~cU}tTNp +(JobF#v`+PmKDl>9A5;}?NC*DH{4UJz(;2tI~05*%Uu2& z!gRxsZ+MDKrhtWYnZoee5F##HT52s8(3}Fi6%Dj_PN0DKT-*v;Q6w2Gp!k+h3~$p( zNI@|qj!;#z4vs@0Yn!j>u+AC62MnM*3&+zT7O(-kE!(bN*a%PLVgDN+W1C@FiD_1U z16~&^_HAiv NO~h9Jt=RaEw;gRNSR2y3nk)Mpi;^8QENDy+p=|e2#yOzx@_X&cr~127D0Xn zYw +8*RrbkxC?8W z#V3lF#Y}ib0htW2=%x$WV2>D%Q2IapaoUm50 gwX=wM^;)U_eP8a2vLbT?-q&uV z6As}p0Is5JvWmnVotP;Kt+5s)qX%(4>6CyQXEC#cYBXb$@G(!c#;osu&(s;K`?i<* z*sTlRfj7 E#atZh3$gmBu4r8Z$pUlvUF;hll4-9wy2x02dgN-KdZt2{y@T zf_hUlCEqEvWU4czmQ1zwZL=BH%d{G@SH?q7>%RCpGO}_+ar>aIF-}`-G2((0$-3as zvF!ji|NGv08a+VH4)PIy%@a~+CPRaSg!M%{k_*F$R4z058)57b&hkP)kb&BjPF1Z1 z)lRlW8JY>>jqYu*c`;Lp21W#Bj!$hQfsIVeQK7jaC3xXF88lPHWI#;qo+})Sr{ %)B=k(C<7S9Mr5N%>%*#ZM?7MjX&-Y LkL^0KEH1BI84m?>28pn(z%IJWR2>dC65e(#Y9?gt*Rnsphz7XJ@8K0SjiScvF zZ%S5ewx!sma5WApm1r1>?m2@;yz>q|UOd3~#c+XK3ZQ?OK-R|!ZSu(+w(!8;=$^OP zJ&V~TnUJsnyt%r6e1DPMU0&b3KfAlk{@3MSS3d=K(Ed@dy`LyoQXj>SkeZhLGL$Xb zq^VI-x8g@gP0aLWqQiS!=PlIuwj1uf^--k~_TJ>92TyDf8sKiiV|YU>R#C#RbD}F@ z&^gi=^ByLuyzk*1E2{nhj &O 51b_0voK9`k?L-d5V zNMJSB)>DL#@N5+A-b!b-c(GUpDu>O1*AT-vR@0f-KbD&>c%``zfhyU;yjD#OUSXwY z+S6of3VN1*QHXMYyNK*YzF>K8C^+_rqHBXaRb4{UA&^LB9Jk>+IDNxY^3M0EX*Vay zMWiP5Q~_VBdN;85FOp?4*|NOKz-{r%Nphs{_&4!OCR1f^emMK#&p$*{ysX%x^6r(` zz(`rKNuNE6Q-t8pjSnxFgvJYdsr5vG<9GNd&MXptbS|NDx(j$rZ69SKR?|!7Ra%}p z6yQ^;1fz4uHb9d+`ZXx?Ru~OmIIIFCH%(@q)MSQzE47n`Q{=^gtZarruyX6LjJq_u z1x*MnCD3(K0PgZ9me(ve{*KE@j2>m>3znWR5$-`^qU?!fkZ4gZp$70OTee0ES(4{$ zX0{L)M`kic4V(z0G`bZo$yv8dvp9=l?C`>uM+pHy8P8|8AFe*U&2BH>p50!+uhr%G zr`xN$zs8rK2?13CzF@ca2?3-50g9KL3jr$ui g z==;Fwcb!ah27JOI#8?=bF0yR+log(0^Eg&%14w5PdrfnyJnEL_3XOhln!p#UlL_mz z_ tS#B&iP_EA4;Axr$e52*zhIrb(SD@;9ohs(H#U;gG2JrN~s`o$$vD z9zA%eZ)Bt)?S+^sW9I%7U4F|2BlHd)m@KVm4O+}oa(6|A_t8Hb*4}qvq!Y^xJb;(Y zBSTZ>&QINxOM5p{jVbejiPm0nMRV+NP2Ehr9VE6G+M?|Jvp7m33KxHWyI{y7+fauu z{1})@;++2az+sV~OMs^IKj0r9F8g*U$W wJdR;nk3IjlwGMbLhD0>RwV%-%( zu&FbNQ2Mv B ~Z-%*5*kJv6w&F@G|>@7R<&RD);6 _Z7sHYC{QhcNQ6*nj48zcE@Le&SA1^TY7;0VGwFCgLtV ^TYaUWOxH_{2uzdRtX%C8J7 zB8flS#^a`BTDebkrWE=_>mb?6{hu7!rV?<$L>I 0h_BLP zoiQs#Q)S*gu`&FUdWze hp?$ z;hz+Z6Ul!IdW2ncR&PQ&=?s5S=ii>gJ=#?5MEF94z=g5@`0KT;`x+^aX$K}M16%9{ zyga}c^WBY R2zqv2~o}lDCP!8ClW^zXjT?E9#yPGdB!AyF7n-Jzzv;43tliu4Hru(XSvnJ9w50 zOp5Wn&zMns*W=I@JXJ8(xA`$eP0!kPIP~c)=2Y}*{2ZwkUc*AQBziS|_Ns*gt?3Q5 zAqA&kt8fDi63H3ULZIbCRA#z9!j0=pi;w~}w6`17)3-(4p>LXH`I^ad-LTdq0wZ$U z)GU90DxTA;=~(b1Jw 6W4pR ze2B){^cORdyEPuX+Im(oXu_9hoXOs)fb4x(Gw*Z%zHXW}sqrwR;3n69;!m%h;gI7Q z5OC9zo=0%zJ{JCT$nm(yg$nYjhb26<4TXP}s^wH6l7SuIGlkN^HQKulO(?!S|2 +drW5CX?FB6t=2cf?NjG#@i@o&cAZ;8pV9*1hj8|7bQVj=7yqC0%Aw zum?_ Ey^a&A^lYAOj@M-DJxu#=pE{xx~^~9;HZDt zNkGeM3Mwp;#JzSzpG-i=D&_PXt$5~wd;x(GhC##(k0mto(Vfm`1fl7e!Le+FFUT)p zCzeh&BX7c*jfot|CeF#Di-`92C^@WMZXX@$!QbDPD94CS4kM3 J^3La8Uo=Ulr>=h(j1*=p zi9^g@u9Je4)&vfYom{*6*sByS0*1Vzpu=KGRL#?u@VbYSgF5N2DM-Xf20a~j|5A&4 z0LdH#0343jEDY3G9uem*ofJq`Yqy`jbSY-+OQ#QIF3`@HI2LJAP^f>gJjUlE(`jgV z%|eAmlc1AYUm}j=xrvNU;~8X3>_|ex 2}Ng`^k z*Tp~zEA=8EPWQ5Gcd@Ic+o7tKt(t QEx$9kqwV zwG$BF{{pa)_9>^}TFifKk8-SN=*v_kB!d4-@IkF1jaT#s<=j1c*F0r+jgDa18E+Qe zvOasqs>28 HU2U )#G=xeN^E3tHa6 zx|}b}wAciH7J+E!Km-Q#Hg)xk8+LroT<5%U4Els-5)U7c;suFtBM=g0qeKCofXvf( ze3}c!1fSE$&7>70AOkU(h>4&v&mivEL512h>n@#H2yjGpUUIlQ2$gu_{798L@`6^A zgJfv!H)Wef*ouFk7?S%mip@l &~XYqKn3GAL6)4vpV> zKDOj(;~V&i$fbDnHT4gy*hJSCmH3_bVaHTw6Qe+NYIT2T(E(d07sy29sty-O$!EUh z`o3{Yo@N>_d5-C?@b{~q8$CH1W5*Mxl<(a%tFr53p&;dZ_}>n-e>Ur99OzW$`gwJy zE3`uq+^mX1$AobA%8rvVXpm`deM5t;+%VUs#1v4bUD00$U^BF92F{t8c03aYZ }8=>3YjBP!vA z{51pH4JF k9FisHcq3dPUpJn$Jel}qFtN)96IVlaWH z!n}WQPLiZr^+uew?k5Vz0`Dk vKR0YV=DdEMm~X^sk2h zD;Oz9zHqnTwRpF+8eh9!G8soGpvJ(pv6da0&gJUQQ0)>U^9n`w2E#KM{!fBN4s$wV z$;Jp4K682eYS{0=Gn*MH) Y~X4-S} zX$A}aruay~enfDNJWY=Ns`!{f9R!@ fD^52SgqQ_btTboz;m&AEO_q<2DqE~ zDY%*TM6e5yJcHyJCC|RYRtW-R`b?z%e#(7UHTQhf50$NAVB=1h6$#OF%e}>zOvQg> zGG?k8S2p--+?Kn5GBf3Mf!;OX_Y|;WMZ128e$TVyD-3YI=k9?|y4FJ<1Xk%*^4Ao~ z>AP+QW~RI|T+U4ZVR^WmUyYl=>2#muF9pRXeQmQD)~ausv@K@**bs*qV}&C}hjm`^ zVIZFmm3`hdd-n9erh|Q_E~of8Z<~LwG6)CPMJoKYlZW=tHOX!S39D>UDZsK_-RECx z-t+OV8XunEb|UWvHx2KCp5b=lt}XU^=ooUI=f4e|PSXxG?=8@ESS05}jc$Fgh* p%Jou(I!XBO?PKH7r7Hn(ujE`J5SmS #4{ p z^gb~!3BV#l`)B2H4kU1HFwGM>XYbuF=joy7!5|%a4hI#;h5v<{J~Vo?T5on|Cjs#@ zPYUMl&?7mp#cc7vXpIO5s?vXqvztF}AOL;aHv2rK5wb{r#{ao~2+FAG;eBA&$>Eh~ zMP(SZoViMaBeFGGE*!HM38*CE?^t}Z2iG3ubkS&npi}9eW1L IrRpC~23|3`wm(pzgFn*W=MJPh{%DM&$o# $jpGZFjX4) zV~j8y4$Mnfq@X_|Suua3Z2T|NNTq*{aBS`##~3mNxojNCiZ|gCmPzRENW3q0K2eC~ z|HdNa`m4Wf5h>`;SoW#xz|)~mSR@gD$KrDI?gdbZ)UOf9W7+mYQL*~bhhn7CKmX}n z^VB!ptFz69kLaGtuVv0Z3$!cy#O_t^A-bzzVzJDy+3>L(#AjdpC7~5s5g%4ZU6+@P z%3mBEAKVF;%H>sXybTNMODWE9&Ngag7Myo~x_#dzlfoptSBKvn>-+g$WjaACra=}< zlh4QDw~UV?PJ?i_1(isy7MP!L#BK(~F%s6-{*IR?9RXnh4VQ@>0Vx40m$MxKHUTr2 z>Ky@wfB%{BUZrNOviCa=p%o!ZlN~Kf?YN9o=7N(s(CKPv3>WsIt;LtdYl?WLtm?w! zLXP`kldr3C=B{BWLj&(DyZ&^M(Ze!!bq*&SoAxBs6xdmfCncM95vh9_CGQlRg4`VR zGxhmNA^!I3*2mYA