Files
titlebot-ng-ng/__pycache__/room.cpython-314.pyc
T

295 lines
42 KiB
Plaintext
Raw Normal View History

2026-08-06 21:34:52 -05:00
+
2026-08-12 17:14:01 -05:00
Bzj,ƒãóšRt^RIt^RIt^RIt^RIt^RIt^RIt^RIH t H
2026-08-06 21:34:52 -05:00
t
H t H t H
t
^RIHt^RIt.ROt!RR4t!RR4tR#) zè
This is an instance of connecting to a room and maintaining suggestions.
2026-08-12 17:14:01 -05:00
I've been re-writing the original functions of methods for this class, so
2026-08-06 21:34:52 -05:00
there's some elements that need to be cleaned up and only make sense in that light.
N)Ú AsyncClientÚ
LoginResponseÚRoomMessageTextÚ SyncResponseÚRoomSendResponse)ÚPostcó4a]tRt^toRRltRRltRtVtR#)ÚConfigcó(VPV4R#©N)Ú load_config)ÚselfÚ config_paths&&Ú&/home/nolan/dev/titlebot-ng-ng/room.pyÚ__init__ÚConfig.__init__sØ ×јÖcóŽ\VR4;_uu_4p\P!V4pVPRR4VnVPRR4VnVPRR4VnVPRR4VnVPRR4VnVPR ^d4Vn VPR
R 4Vn
VPR R
4Vn VPRR4Vn VPR^H4Vn
VPRR4VnRRR4R# +'giR#;i)ÚusernameÚmagbotÚpasswordÚÚroom_idÚlookback_limitÚdbNamezsuggestions.dbÚ
batch_sizeÚuser_lookback_limitiˆÚ
homeserverzhttps://matrix.orgÚ vote_hostÚ localhostÚvote_activity_hoursÚ vote_pathNi )ÚopenÚyamlÚ safe_loadÚgetrrrrÚdb_namerrrrr!r")r
ÚpathÚfileÚconfigs&& rr ÚConfig.load_configÜ
$˜_Œ_ Ü—^^ )ˆ"ŸJ™J z°8Ó<ˆDŒMØ"ŸJ™J z°2Ó6ˆDŒMØ!Ÿ:™: Ó4ˆDŒLØ"(§*¡*Ð-=¸xÓ"Hˆ Ø!Ÿ:™: hÐ0@ÓAˆDŒLØ$Ÿj™j¨°sÓ;ˆDŒOØ'-§z¡zÐ2GÈÓ'Nˆ $Ÿj™j¨Ð7KÓLˆDŒOØ#ŸZ™Z¨ °[ÓAˆDŒNØ'-§z¡zÐ2GÈÓ'Lˆ #ŸZ™Z¨ °RÓ8ˆDŒN÷__Š_ús •DD3Ä3 E ) rr'rrrrrrr!rr"N)úconfigs/config.yaml)Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__rr Ú__static_attributes__Ú__classdictcell__©Ú
__classdict__s@rr r sø‡ô

9rr có a]tRt^&toR"RltRtRtRtRt] R4t
Rt R t R
t
R#R ltR tR
tRtRtR#RltR#RltR#RltR#RltRtR#RltR$RltRtRtR%RltRtRtRtRt R#Rlt!Rt"R t#R!t$Vt%R#)&ÚRoomNcór\V4VnT;'g\VnRVn.Vn.VnRVnRVnRVn RVn
RVn ^Vn V'dW0Pn
VPVPP4VnVP#4R#)rN)r r*Údefault_search_termsÚ search_termsÚformatted_sugsÚpostsÚnewly_inserted_postsÚclientÚroomÚuser_idÚmemberÚ display_nameÚlast_runrÚ safe_db_namerÚdb_pathÚinit_db)r
rr9rs&&&&rrÚ
Room.__init__'s“ܘŒ Ø@Ô,@ˆÔØ ˆÔ؈Œ
Ø$&ˆÔˆŒ ؈Œ ؈Œ ؈Œ Ø ˆÔ؈Œ
ç Ø%/K‰KÔ ×¯©×)<Ñ)<Ó=ˆŒ Ø Žrcó>\P!RRV4pRV R2#)z[^a-zA-Z0-9_-]Ú suggestions_z.db)ÚreÚsub)r
rÚsafes&& rrCÚRoom.safe_db_name;s$ÜvŠvШgÓ6ˆØ˜d˜V 'rcóH\P!VP4pVP4pVP R4VP R4VP 4Uu.uF q3^,NK
ppRV9dVP R4RV9dVP R4VP R4VP R4VP R4VP R 4VP R
4VP
4VP4R #uupi) a
CREATE TABLE IF NOT EXISTS suggestions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user TEXT,
display_name TEXT,
message TEXT,
timestamp INTEGER,
age INTEGER,
is_posted INTEGER DEFAULT 0,
event_id TEXT,
UNIQUE(user, message, timestamp)
)
zPRAGMA table_info(suggestions)Ú is_postedz>ALTER TABLE suggestions ADD COLUMN is_posted INTEGER DEFAULT 0Úevent_idz0ALTER TABLE suggestions ADD COLUMN event_id TEXTzSCREATE UNIQUE INDEX IF NOT EXISTS idx_suggestions_event_id ON suggestions(event_id)aJ
CREATE TABLE IF NOT EXISTS gettitles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id TEXT,
sender TEXT,
timestamp INTEGER,
datetime TEXT,
UNIQUE(event_id),
UNIQUE(sender, timestamp)
)
aG
CREATE TABLE IF NOT EXISTS mayhem (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id TEXT,
sender TEXT,
timestamp INTEGER,
datetime TEXT,
UNIQUE(event_id),
UNIQUE(sender, timestamp)
)
aK
CREATE TABLE IF NOT EXISTS countvotes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id TEXT,
sender TEXT,
timestamp INTEGER,
datetime TEXT,
UNIQUE(event_id),
UNIQUE(sender, timestamp)
)
aH
CREATE TABLE IF NOT EXISTS voteurl (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_id TEXT,
sender TEXT,
timestamp INTEGER,
datetime TEXT,
UNIQUE(event_id),
UNIQUE(sender, timestamp)
)
N)Úsqlite3ÚconnectrDÚcursorÚexecuteÚfetchallÚcommitÚclose©r
ÚconnÚrowÚcolss& rrEÚ Room.init_db?ÜŠ˜tŸ|™|ÓØ K‰K‹MˆØ ‰ ð  ô
ð
‰ Ð3Ø"#§*¡*¤,Ó/¡,˜3A—¡,ˆÐ ˜
I‰IÐ ˜TÔ
I‰IÐ  ‰ Ð
‰ ð
 ô
ð
‰ ð
 ô
ð
‰ ð
 ô
ð
‰ ð
 ô
ð
Œ
Ø
Ž ùòy0sÁ%Dcƒó0"VPf:\VPPVPP4Vn\ VPRR4'd)\
R4VPPVnR#VPPVPP4GRjxL
p\V\4'd)\
R4VPPVnR#\
RV 24R#LR5i) access_tokenzReusing existing login.Tz
Logged in!zFailed to log in: F) r=rr*rrÚgetattrÚprintr?ÚloginrÚ
isinstancer)r
Úresps& rÚlogin_to_matrixÚRoom.login_to_matrixéà ;‰;Ò Ü% d§k¡k×&<Ñ&<¸d¿k¹k×>RÑ>RÓSˆDŒKä 4—;; °× Ð Ÿ;™;×.ˆDŒLÙà—[[×& t§{¡{×';Ñ';Ó<×<ˆÜ dœM×  ØŸ;™;×.ˆDŒLÙä Ð& t  ñ=ùsB?DÃDÃADcƒóà"VPPPVPP4pV'dTWP
9dDVP
V,p\
VR4'dVP'd
VP#VPPV4GRjxL
p\
VR4'dVP'd
VP#V#L65i)rA displayname)
r=Úroomsr&r*rÚusersÚhasattrrAÚget_displaynamerh)r
r?r>r@rds&& rÚget_display_nameÚRoom.get_display_name¢éØ{‰{× Ñ ×$ T§[¡[×%8Ñ%8Ó9ˆß GŸz™zÔ—Z‘Z Õ(ˆv˜~×.°6×3F×3FÐ3FØ×—[‘[×Ó9ˆÜ 4˜× '¨D×,<×,<Ð,<Ø× ˆñ:ùsBC. *C.Â5C,Â6'C.ÃC.có‚\P!RR\V4P44P R4pV#)z
[^a-z0-9]+Ú-)rJrKÚstrÚlowerÚstrip)Útexts&rÚslugifyÚ Room.slugify­s/ävŠvm S¬#¨d«)¯/©/Ó*;Ó<×BÀ3ÓGˆØˆ rc óüVPP'dVPP#RpVP'ddVPPP VPP
4pV'd#\
VRR4;'g\
VRR4pV'gVPP
pVPV4VPnVPP#)zTResolve a URL-safe slug for this room (config override, then room name, then alias).NÚnameÚcanonical_alias)r*r"r=rir&rr`ru)r
Úslugr>s& rÚ
get_room_slugÚRoom.get_room_slug²à ;‰;× × Ð Ø—;‘;× ˆØ ;;ˆ;Ø—;‘;×$ׯ©×)<Ñ)<Ó=ˆÜ˜t V¨TÓ2×\´g¸dÐDUÐW[Ó6\ߨ—;;×&ˆDØ $§ ¡ ¨TÓ 2ˆ ÔØ{‰{×$rc  óü^RIp^RIpVP4pRp/pVPP V4'd0\ VR4;_uu_4pVP
V4pRRR4W5VPP&\ VR4;_uu_4pVPWV^RR7RRR4R# +'giL[;i TP\3d/pLyi;i +'giR#;i)zFPersist the resolved slug so the Go voting services can route by path.Nzroom_slugs.jsonrÚwT)ÚindentÚ sort_keys) ÚjsonÚosr{r(Úexistsr#ÚloadÚJSONDecodeErrorÚOSErrorr*rÚdump)r
rrrzr(ÚdataÚfs& rÚwrite_room_slugsÚRoom.write_room_slugsÀãÛØ×Ø ˆØˆØ
7‰7>‰>˜$× Ò ð
ܘ$ —_”_¨ØŸ9™9 Q<%)ˆT[‰[×
Ñ
Ñ
$˜_Œ_ Ø I‰Id a°4ˆ ‰_÷ %—_ûà×(¬'Ð
Øð
ú÷_ˆ_ús;¿C ÁB8Á%C ÂC*Â8 C ÃC ÃC Ã C'Ã&C'Ã* C; c óVRVPP RVP4 2#)z(Build the full voting URL for this room.zhttp://z:9081/)r*rr{©r
s&rÚvote_urlÚ
Room.vote_urlÑs*à˜Ÿ×/¨v°d×6HÑ6HÓ6JÐ5KÐLrcƒób"VfVPPp.VnVPPpRp^pWA8E\ W!V,
4pVP
P
VPPVVRR7GRjxL
p\VR4'dVP'gR#VPEFp\V\4'gKVPpVPp VPV 4'gKV\V 4RP!4p
VP#VP$4GRjxL
p \'VP(R,4p \'\*P,!44V ,
p
\/VP$V V
V V
\1VRR4R7pVPP3V4EK EK V\VP4,
p\5RV R2R R
R 7\1VR R4pV'dER#R#ELLÞ5i)
ÚstartÚlimitÚ directionÚchunkéèrP)ÚposterrAÚcontentÚtimeÚagerPzLooked back on z messages...Ú
T)ÚendÚflushr)r*rr;rÚminr=Ú
room_messagesrrkrrcrÚbodyr9Ú
startswithÚlenÚlstriprmÚsenderÚintÚserver_timestampÚ_timeršrr`Úappendra)r
r”rÚ
next_batchÚfetchedÚ fetch_amountÚresponseÚeventÚmsgÚtermÚ clean_msgrAÚevent_ts_secondsÚ age_secondsÚposts&& rÚ
get_convosÚRoom.get_convosÕéØ Š=Ø—K‘K×.ˆEàˆŒ
Ø—[[×+ˆ
؈
؈à˜z°7­?Ó;ˆLØ!Ÿ[™[× × Øð ÷ˆHô˜8 W×-°X·^·^°^Ùàܘe¤_ן*™*Cà $× 1Ô 1˜ØŸ>™>¨$×/Ø(+¬C°«I¨J¨×(>Ñ(>Ó(@˜IØ15×1FÑ1FÀuÇ|Á|Ó1T×+T˜Lä/2°5×3IÑ3IÈTÕ3QÓ/RÐ,Ü*-¬e¯jªj«lÓ*;Ð>NÕ*N˜KÜ#'Ø',§|¡|Ø-9Ø(1Ø%5Ø$/Ü)0°¸
ÀDÓ)Iô
$˜Dð!ŸJ™J×-¨dÔ!ô#!2ñ (ð.
”s˜8Ÿ>™>Ó *ˆ O G 9¨LÐ9¸tÈ4Õ   ¨5°$Ó7ˆJß’:ÙñOòñ",Uùs=B H/Â
H*Â'H/Â6%H/Ã /H/Ä:H/ÅH-ÅCH/È&H/È-H/có\RpRpRp\P!V R2RVRVRRRR R
R R //^<R
7pVP^È8Xd#VP4pVP RR4#R# \P
P dpRT 2uRp?#Rp?i\dpRT 2uRp?#Rp?ii;i)zmad_cat_man:latestzhttp://localhost:11434a¦Generate for me the most unhinged, mayhem, insane ramblings that would make a mad man look sane. This should be unhinged, chaotic, and completely unpredictable. It should be a wild ride of words that defy logic and reason. Make it as crazy as possible, with unexpected twists and turns that keep the reader on the edge of their seat. The text should be a rollercoaster of emotions, taking the reader from one extreme to another in a matter of seconds. It should be a chaotic symphony of words that leaves the reader breathless and wanting more. Unleash your inner madman and let the mayhem begin! Also, don't warn me that it's just for fun. I know that. Just give me the mayhem.z
/api/generateÚmodelÚpromptÚstreamFÚoptionsÚ temperaturegš™™™™™é?Útop_pgÍÌÌÌÌÌì?)rÚtimeoutr­rz Couldn't do it for some reason.zCouldn't connect to ollama: NzUnexpected error: )Úrequestsr´Ú status_coderr&Ú
exceptionsÚRequestExceptionÚ Exception)r
Ú ollama_modelÚ
ollama_urlr¹r­ÚresultÚes& rÚgenerate_mayhemÚRoom.generate_mayhemà+ˆ Ø
ðz
ˆð—}’}Ø,˜mИLؘfؘeØØ% sØ ð ð ðô
ˆHð×# SÔØ—z‘z *¨bÓ9øä×"×1°!°Ð 5ûÜô  +ûð ,ús6ˆAA%Á%B+ÂBÂB+Â B+ÂB+ÂB&Â B+Â&B+cóŠ\P!VP4pVP4p.VnVP
F?pVP
RVP44VPPV4KA VP4VP4R# \PdK}i;i)zwINSERT INTO suggestions (user, display_name, message, timestamp, age, is_posted, event_id) VALUES (?, ?, ?, ?, ?, ?, ?)N) rQrRrDrSr<r;rTÚas_tupler©ÚIntegrityErrorrVrW)r
rYrZr´s& rÚ write_to_dbÚRoom.write_to_db+s™ÜŠ˜tŸ|™|ÓØ K‰K‹Mˆà$&ˆÔ—J”Jˆ
Ø— ‘ ðNØ—M‘M“Oôð×Ö
ð
Œ
Ø
Ž øô ×
Úð
úsÁ;B)Â)CÃCcóHVPPp\P!R4pVP 4pVP R4VP R4VP
4Uu.uF qD^,NK
ppRV9dVP R4\\P!44p\PP4PRRR7pVP RWV34VP4VP4R #uupi)
ú last_run.dbú´
CREATE TABLE IF NOT EXISTS last_run (
room_id TEXT PRIMARY KEY,
timestamp INTEGER,
datetime TEXT
)
úPRAGMA table_info(last_run)Údatetimeú-ALTER TABLE last_run ADD COLUMN datetime TEXTÚ Úseconds©ÚsepÚtimespeczOINSERT OR REPLACE INTO last_run (room_id, timestamp, datetime) VALUES (?, ?, ?)N)r*rrQrRrSrTrUÚnowÚ isoformatrVrW)r
rrYrZr[r\Únow_strs& rÚupdate_last_runÚRoom.update_last_run=Ø—+‘+×ÜŠ˜}ÓØ K‰K‹MˆØ ‰ ð ô
ð
‰ Ð0Ø"#§*¡*¤,Ó/¡,˜3A—¡,ˆÐ ˜TÔ
I‰IÐ ”%—*’*“,ÓˆÜ×#×)×3¸ÀiÐPˆØ ‰ ÐcÐfmÐt{Ðe|Ô Œ
Ø
Ž ùò0sÁ1DcóêVPPp\P!R4pVP 4pVP R4VP R4VP
4Uu.uF qD^,NK
ppRV9dVP R4VP RV34VP4pVP4V'dV^,Vn R#^Vn R#uupi)z0SELECT timestamp FROM last_run WHERE room_id = ?N)
r*rrQrRrSrTrUÚfetchonerWrB)r
rrYrZr[r\s& rÚ get_last_runÚRoom.get_last_runSØ—+‘+×ÜŠ˜}ÓØ K‰K‹MˆØ ‰ ð ô
ð
‰ Ð0Ø"#§*¡*¤,Ó/¡,˜3A—¡,ˆÐ ˜TÔ
I‰IÐ  ‰ ÐDÀwÀjÔj‰j‹lˆØ
Œ ß Ø FˆDŽMàˆDŽMùò0sÁ1C0cór\P!VP4pVP4p\PP \
V44PRRR7pVPRW1\
V4V34VP^8HpVP4VP4V#)r×z}
INSERT OR IGNORE INTO gettitles (event_id, sender, timestamp, datetime)
VALUES (?, ?, ?, ?)
© rQrRrDrSÚ
fromtimestampr¦rTÚrowcountrVrW©r
Ú timestamprPrYrZÚdt_strÚinserteds&&&& rÚrecord_gettitlesÚRoom.record_gettitleslsÜŠ˜tŸ|™|ÓØ K‰KMˆÜ×"×0´°Y³Ó@×JÈsÐ]fÐØ ‰ ð ð¤ I£°Ð
—:‘: ‘?ˆØ Œ
Ø
Œ ؈rc ór\P!VP4pVP4p\PP \
V44PRRR7pVPRW1\
V4V34VP^8HpVP4VP4V#)zJRecord a !mayhem detection; returns True if newly recorded (not duplicate)rÕr×zz
INSERT OR IGNORE INTO mayhem (event_id, sender, timestamp, datetime)
VALUES (?, ?, ?, ?)
s&&&& rÚ
record_mayhemÚRoom.record_mayhemzó‘䊘tŸ|™|ÓØ K‰KMˆÜ×"×0´°Y³Ó@×JÈsÐ]fÐØ ‰ ð ð¤ I£°Ð
—:‘: ‘?ˆØ Œ
Ø
Œ ؈rc ór\P!VP4pVP4p\PP \
V44PRRR7pVPRW1\
V4V34VP^8HpVP4VP4V#)zNRecord a !countvotes detection; returns True if newly recorded (not duplicate)rÕr×z~
INSERT OR IGNORE INTO countvotes (event_id, sender, timestamp, datetime)
VALUES (?, ?, ?, ?)
s&&&& rÚrecord_countvotesÚRoom.record_countvotes‰rc ór\P!VP4pVP4p\PP \
V44PRRR7pVPRW1\
V4V34VP^8HpVP4VP4V#)zKRecord a !voteurl detection; returns True if newly recorded (not duplicate)rÕr×z{
INSERT OR IGNORE INTO voteurl (event_id, sender, timestamp, datetime)
VALUES (?, ?, ?, ?)
s&&&& rÚrecord_voteurlÚRoom.record_voteurl˜rc
ƒ óž"VPPpRp/p.p\^4FpVPP VPP
VVRR7GRjxL
p\
VR4'dVP'gM6VPVP4\VRR4pV'dKM VEFp\V\4'gKVPpVPR4'gKARV9gKJVPVP8XgKgVP!R^4p \#V 4^d}V ^,P%RR4P'4p
RP)V R ,4P'4p \VR
R4p V 'dR V R
V R ^R
\+4/W:&EKEKEK V'gR#VEF;p\
VR 4'gK\VP0\24'gK:VP0P5R/4pVP5R4R8XgKnVP5R4R8XgK†VP5R
4p\VRR4pVP74wp
pVR
2026-08-12 17:14:01 -05:00
,V8XgKV'gK VVR
,9gK0VVP8wgKCVR
2026-08-06 21:34:52 -05:00
,P9V4VR ;;,^,
uu&\/RV RV
24EK9 EK> \:;QJd*RVP=44F 'gK RM RM!RVP=444'gR#R.p\?VP74RRR7pVFvwp
pVR ,^8XdRMR pVPARV
R VR , R!V 24VR ,p \#V 4^P8”dV R",R#,p VPAR$V 24Kx R%P)V4#EL¿ \,dp
2026-08-12 17:14:01 -05:00
\/RT
24Rp
?
EKRp
?
ii;i5i)&z?Count upvotes for each suggestion and return formatted results.Nrrrrú Suggestion Ú:rNNrPr™ÚvotesÚvoterszError parsing suggestion: z-No suggestion posts found to count votes for.ú m.relates_toÚrel_typeú m.annotationÚkeyõðŸ‘zFound vote from z for suggestion c3ó8"TFqR,^8„xK R#5i))Ú.0rˆs& rÚ <genexpr>Ú#Room.count_votes.<locals>.<genexpr>òséÐKÑ1J¨˜•= 1Ö$Ó1JùsTFz#No votes found for any suggestions.zVote Count Results:có"V^,R,#)r)Úxs&rÚ<lambda>Ú"Room.count_votes.<locals>.<lambda>÷s °°!µ°W¶
r)rÚreverseÚvoteú: rÕ:NéM...u └─ Ú
)!r*rÚranger=r rrkrÚextendr`rcrr?Úsplitr£ÚreplacersÚjoinÚsetrÃrar™Údictr&ÚitemsÚaddÚanyÚvaluesÚsortedr©)r
rÚsuggestion_votesÚ
all_eventsrHr­ÚpartsÚsuggestion_numr™rPÚ
relates_toÚtarget_event_idr¥rˆÚlinesÚsorted_suggestionsÚ vote_texts& rÚ count_votesÚRoom.count_votes¦éð—[‘[×
؈
2026-08-06 21:34:52 -05:00
ØÐ؈
ôr–ˆAØ!Ÿ[™[× × Ø Øð ÷ˆHô˜8 W×-°X·^·^°^Ùà × Ñ ˜hŸn™nÔ   ¨5°$Ó7ˆJß‘:Ùñô" ˆEܘ%¤×—z‘zà—O‘O M×2°s¸d¶{Ø—LL D§L¡LÖ!à $§
2026-08-12 17:14:01 -05:00
¡
¨3°Ó 2˜Ü˜u›:¨œ?Ø-2°1­X×-=Ñ-=¸mÈRÓ-P×-VÑ-VÓ-X˜NØ&)§h¡h¨u°R­yÓ&9×&?Ñ&?Ó&A˜GÜ'.¨u°jÀ$Ó'G˜'à$-¨wØ$.°Ø$+¨QØ$,¬c«eð D"Ð 0Ô @ò  ÷2 Ù ˆEäu˜i×(¬Z¸¿
2026-08-06 21:34:52 -05:00
¹
Ät×-LÔ-LØ"Ÿ]™]×.¨~¸B
Ø—N‘N :Ó.°.Ö—NN )¨VÖ3à&0§n¡n°ZÓ&@$ U¨H°dÓ;1A×0FÑ0FÖ0HÑ,˜¨Ø  ÕÖ"™F v°T¸(µ^Ö'CØ" d§l¡lÖ  N×.¨vÔ  ŸM¨QÕ.!Ð$4°V°HÐ<LÈ^ÐL\Ð"]Ô1Iñ ÷*KÐ1A×1HÑ1HÔ1JÓKssŠsÑKÐ1A×1HÑ1HÔ1JÓK×(ˆÜ#Ð$4×$:Ñ$:Ó$<Ù&=Ø*.ôó%7Ñ ˆN˜DØ"& w¥-°1Ô"4™¸'ˆ L‰L˜; ~Ð&6°b¸¸¸ÀqÈÈ Ð ˜9•oˆGÜ7‹|˜bÔ Ø! #Õ.Ø L‰L˜9 W  %7ðy‰y˜ÓÐògøôJÐ :¸1¸#Ð ûð!üs¥A!Q
Á#P"Á$'Q
2026-08-12 17:14:01 -05:00
 /Q
2026-08-06 21:34:52 -05:00
ÃQ
Ã" Q
2026-08-12 17:14:01 -05:00
ÄQ
ÄQ
Ä.BP%ÇQ