Ë —7Új+ãóh—dZddlZddlZddlZddlZddlZddlZGd„de«Zd„Z Gd„d«Z y)u A room's half of the room protocol (docs/games.md §8.3), for any game's referee. SS_ROOM says who holds each seat; ask() gets a move from a bot child, from a person or agent over stdin, or from the game's own fallback (auto). room = Room(start) start(folder) -> host.Child, the game's way to run a bot (a route's or field/) move = room.ask(seat, obs, legal, auto=lambda: ..., bot=) move = room.ask(seat, obs, legal, auto, accept=lambda a: ...) # legal holds templates (free text): accept says # what an answer means, or None to keep waiting room.tell(seat, obs); room.event(data); room.end(result, scores); room.close() Lines to the platform start with '@shoal ' and are flushed one by one; the referee's own prints go to stderr, so a library printing as it loads cannot break a line. A person or agent who does not answer within the limit (SS_ROOM "limit", 30 s by default; ask(..., limit=s) sets one request's, e.g. a speech's) gets auto's move. {"control": ...} re-asks the seat with a new version, so a late answer from the old controller is dropped; {"stop": true} makes ask() raise Stop, and the referee writes what it has and ends. éNcó —eZdZy)ÚStopN)Ú__name__Ú __module__Ú __qualname__©óú_/private/var/folders/v3/mcwwdgb158s9czwmdjf2pvmh0000gn/T/scienceslack-job-43-Vd7Tmk/kit/room.pyrrs„Ør rcó@—tdg|¢­tjddœŽy)Nzroom:T)ÚfileÚflush)ÚprintÚsysÚstderr)Úas r Úlogrs€Ü ˆ'Ð3�AÑ3œCŸJ™J¨dÔ3r cóX—eZdZdd„Zd„Zd„Zd„Zd„Zd„Zd„Z dd „Z d „Z d „Z d „Z d „Zy)ÚRoomcó¬—tjtjj d«xsd«}|j di«j «D��cic]\}}t |«|“Œc}}|_t|j dd««|_ ||ic|_ |_ |_ d\|_ |_tj «t#j$«c|_|_t*j,t*j.c|_t*_t#j2|j4d¬«j«ycc}}w) NÚSS_ROOMz{}ÚseatsÚlimité)rFT)ÚtargetÚdaemon)ÚjsonÚloadsÚosÚenvironÚgetÚitemsÚstrrÚfloatrÚstartÚfieldÚbotsÚversionÚstoppedÚqueueÚQueueÚ threadingÚLockÚinboxÚlockrÚstdoutrÚoutÚThreadÚ_read)Úselfr$r%ÚconfÚkÚvs r Ú__init__z Room.__init__sí€Ü�z‰zœ"Ÿ*™*Ÿ.™.¨Ó3Ò;°tÓ<ˆØ,0¯H©H°W¸bÓ,A×,GÑ,GÔ,IÔJÑ,I¡D A q”c˜!“f˜a‘iÐ,IÒJˆŒ ܘ4Ÿ8™8 G¨RÓ0Ó1ˆŒ Ø,1°5¸"Ð)ˆŒ �D”J ¤ Ø%-Ñ"ˆŒ �d”lÜ %§ ¡ £ ¬y¯~©~Ó/?ЈŒ �D”IÜ"Ÿz™z¬3¯:©:ЈŒ”#”*Ü×Ñ § ¡ °4Ô8×>Ñ>Õ@ùó KsÁEcóæ—|j5|jjdtj|d¬«zdz«|jj «ddd«y#1swYyxYw)Nz@shoal )Ú,Ú:)Ú separatorsÚ )r.r0ÚwriterÚdumpsr ©r3Úmsgs r ÚsayzRoom.say&sG€Ø �Y‹YØ �H‰H�N‰N˜9¤t§z¡z°#À*Ô'MÑMÐPTÑTÔ UØ �H‰H�N‰NÔ ÷�Y‰Yús �AA'Á'A0có,—|j||dœ«y)N)ÚtoÚobs©rA)r3ÚseatrDs r Útellz Room.tell+s€Ø �‰˜ SÑ)Õ*r có*—|jd|i«y)NÚeventrE)r3Údatas r rIz Room.event.s€Ø �‰�'˜4�Õ!r có0—|jd||dœi«y)NÚend)ÚresultÚscoresrE)r3rMrNs r rLzRoom.end1s€Ø �‰�% F°fÑ=Ð>Õ?r cób—|jj|«xsi}|jd«xs~|jd«xsk|jd«xsXtjj |jd«xsdj d««xs|jd«xsdS) NÚnameÚrouter%ÚdirÚÚ/ÚkindÚauto)rr rÚpathÚbasenameÚrstrip)r3rFÚss r Úlabelz Room.label4sª€Ø �J‰J�N‰N˜4Ó Ò & BˆØ�u‰u�V‹}òR §¡ g£òR°!·%±%¸³.òRÄBÇGÁG×DTÑDTÐVW×V[ÑV[Ð\aÓVbÒVhÐfh×UpÑUpÐqtÓUuÓDvòRÐz{×zÑzðAGó{HòRðLRð Rr cóf—|jj|«xsijd«xsdS)NrUrV)rr )r3rFs r rUz Room.kind8s*€Ø— ‘ —‘˜tÓ$Ò*¨×/Ñ/°Ó7ÒA¸6ÐAr Ncó‡—|xsˆfd„} |jrt‚|jj|«xsi} | jd«} | dk(rD|j | «} | r| j |�|n|‰dœ«nd} | �|| «nd} | €|«S| S| dvr|«S|j «|jrt‚|xjdz c_|j} |j|| |‰dœ«tj«|xs |jz} |jjtd|tj«z «¬ «}|jd «rt‚|jd«}t#|t$«rt'|jd««|k(rn›|jd«}t#|t$«rLt'|jd««|k(r/|jd«| k(r||jd««} | �| S|�*t!dt)j*|«dd›d|›d| ›�«�Œ-�ŒD#tj$rt!d |›d | ›d �«|«cYSwxYw)Ncó•—|‰vr|SdS©Nr)rÚlegals €r ÚzRoom.ask..<sø€ q¨E¡z !Ð";°tÐ";r rUÚbot)rDr`)ÚhumanÚagenté)rCr'rDr`g)Útimeoutzseat z out of time at version z : auto playsÚstopÚcontrolrFÚactr'Úactionú ignored act éxz: asking seat z at version )r(rrr Ú_botÚaskÚ_drainr'rAÚtimeÚ monotonicrr-Úmaxr)ÚEmptyrÚ isinstanceÚdictr"rr>)r3rFrDr`rVrbÚacceptrÚokÚspecrUÚchildÚmover6Údeadliner@Úcrs ` r rnzRoom.ask;s;ø€Ø Ò <Ó;ˆØØ�|Š|Ü� Ø—:‘:—>‘> $Ó'Ò-¨2ˆDØ—8‘8˜FÓ#ˆDØ�uŠ}ØŸ ™  $›�Ù^c�u—y‘y¨¨¡ÀSÐSXÑ=YÔZÐim�Ø#'Ð#3‘r˜$”x¸�Ø!% ‘t“vÐ7°4Ð7ØÐ-Ñ-Ù“v� Ø �K‰KŒMØ�|Š|Ü� Ø �LŠL˜AÑ �LØ— ‘ ˆAØ �H‰H˜D¨Q°sÀUÑKÔ LÜ—~‘~Ó'¨5Ò+>°D·J±JÑ?ˆHØð"ØŸ*™*Ÿ.™.´°S¸(ÄTÇ^Á^ÓEUÑ:UÓ1V˜.ÓW�Cð—7‘7˜6”?Ü�JØ—G‘G˜IÓ&�ܘa¤Ô&¬3¨q¯u©u°V«}Ó+=ÀÒ+EØØ—G‘G˜E“N�ܘa¤Ô&¬3¨q¯u©u°V«}Ó+=ÀÒ+EÈ!Ï%É%ÐPYÓJZÐ^_ÒJ_Ù˜aŸe™e H›oÓ.�DØÐ'Ø#˜ Ø�=ܘ,¤t§z¡z°!£}°T°cÐ':Ð&;¸>È$ÈÈ|Ð\]Ð[^Ð_Ô`ñ#ñ'øô,—{‘{ò"ܘ% ˜vÐ%=¸a¸SÀ ÐMÔNÙ›6’Mð"úsÄ";IÉ,I?É>I?cóh—|jj«D]}|sŒ|j«Œyr_)r&ÚvaluesÚclose)r3r|s r rz Room.closecs%€Ø—‘×!Ñ!Ö#ˆAÚØ—‘• ñ$r c ó„—tjD]ú} tj|«}t|t«sŒ*|jd«rd|_ |jd«}t|t«r}d|vryt|d«}|j«D��cic]\}}|dk7sŒ ||“Œc}}|j|<|jd||j|«|j!|«dœ«|j"j%|«Œüy#t$r!t d|j «dd«Y�Œ'wxYwcc}}w)Nz not JSON:rlrgTrhrF)ÚtyperFrUrP)rÚstdinrrÚ ValueErrorrÚstriprtrur r(r"r!rrIrUr[r-Úput)r3Úliner@r|rFr5r6s r r2z Room._readhs €Ü—I”IˆDð Ü—j‘j Ó&�ô˜c¤4Ô(ØØ�w‰w�vŒØ#�” Ø—‘˜ Ó"ˆAܘ!œTÔ" v°¡{ܘ1˜V™9“~�Ø56·W±W´YÔ#N±Y©T¨Q°À!ÀvÃ+ A q¡D°YÒ#N�— ‘ ˜4Ñ Ø— ‘  I°tÀTÇYÁYÈtÃ_Ð^b×^hÑ^hÐimÓ^nÑoÔpØ �J‰J�N‰N˜3Õ ñøôò Ü�K §¡£¨d¨sÐ!3Ô4Úð üó$Os•D D<Â'D<Ä&D9Ä8D9cóà— |jj«}|j d«�(t dt j|d«dd›d�«ŒU#tj$rYywxYw)Nrirkrlz: stale)r-Ú get_nowaitr)rsr rrr>r?s r roz Room._drainzso€Øð Ø—j‘j×+Ñ+Ó-�ð�w‰w�u‹~Ð)Ü�l¤4§:¡:¨c°%©jÓ#9¸$¸3Ð#?Ð"@ÀÐHÔIð øô—;‘;ò Ùð úsƒAÁA-Á,A-có:—|jd«r.tjj|j|d«}ndtjjtj jdd«|jd«xs|jd«xsd«}||j vr |j|«|j |<|j |S#ttf$r+}td|›d|›d �«d |j |<Yd }~ŒDd }~wwxYw) zjThe child for a bot seat, one per folder (as the checks share one between seats); None if it cannot start.r%ÚSS_INPUTÚ.rRrQrSz no bot at z (z): auto plays that seatN) r rrWÚjoinr%rr&r$Ú ExceptionÚ SystemExitr)r3rxÚfolderÚes r rmz Room._botƒsã€à �8‰8�GÔ Ü—W‘W—\‘\ $§*¡*¨d°7©mÓ<‰Fä—W‘W—\‘\¤"§*¡*§.¡.°¸SÓ"AÀ4Ç8Á8ÈEÃ?ÒCmÐVZ×V^ÑV^Ð_fÓVgÒCmÐkmÓnˆFØ ˜Ÿ™Ñ "ð )Ø$(§J¡J¨vÓ$6�— ‘ ˜&Ñ!ð�y‰y˜Ñ Ð øôœzÐ*ò )Ü�j  ¨¨1¨#Ð-DÐEÔFØ$(�— ‘ ˜&Ö!ûð )úsÂ3C à DÃ/!DÄD)r%)NNN)rrrr7rArGrIrLr[rUrnrr2rormrr r rrsE„óAòò +ò"ò@òRòBó&aòPò  ò$Jó !r r) Ú__doc__rrr)rr+rpr�rrrrr r Úr’s2ðñ÷-×,×,ô ˆ9ô ò4÷t!òt!r