úÎL÷I-8      !"#$%&'()*+,-./01234567None8CEncodes a strict bytestring to its hexadecimal representation. See 9.9EDecodes a strict bytestring from its hexadecimal representation. See 8.:<Encodes a lazy bytestring to its hexadecimal representation.;>Decodes a lazy bytestring from its hexadecimal representation.8<9:;89:;8<9:;(c) Pierre-Étienne Meunier 2014GPL-3&pierre-etienne.meunier@lif.univ-mrs.fr experimentalAllNone0cThe type of messages sent by the server, exposed here for full disclosure of the protocol's proof.cThe type of messages sent by the client, exposed here for full disclosure of the protocol's proof.         (c) Pierre-Étienne Meunier 2014GPL-3&pierre-etienne.meunier@lif.univ-mrs.fr experimentalAllNone Client configuration<The server's host name (either a DNS name or an IP address).The port number (for instance = 5129).!The private key to sign messages.HThe public key, that the server must know of before the clients connect.MFor a job to be usable by Parry's clients, it must be a member of this class.MThis function is used by the client to distinguish results from regular jobs.0A default configuration, matching the server's q. Note that, like in the server, you must provide your own private key for signing the protocol messages. See / for an example method to generate these keys.>3A wrapper around signAndSend, to force the type of j&, which is needed for the protocol's Alive messages.?Sign a message and send it. config work calls its argument function work on a boolean s9 (if the server asked to share jobs) and the actual job j that must be done. workF must return a list of resulting jobs, that may include results (see ).¸Workers asked to share their input job should share it as early as possible: this usually means that the job already got killed in a previous attempt, probably because of its length. >?@  >?@(c) Pierre-Étienne Meunier 2014GPL-3&pierre-etienne.meunier@lif.univ-mrs.fr experimentalAllNone06Server configuration;The network port the synchronization server will listen on.@The maximal number of simultaneous threads that can be launched.Log file ·This type is exposed mostly for writing alternative user interfaces. Other operations must be done using the functions in this module, or the correction of the protocol can be lost."Available jobs#mMap from the machine id to its hostname, its current job, its starting time, the last time we heard from it.$Set of unemployed machines% The results.&nThe smallest available machine id. In a run of the server, it is guaranteed that are never assigned the same.'KTotal number of jobs killed from the beginning (for benchmarking purposes).(4Number of jobs finished (for benchmarking purposes).)'The list of authorized RSA public keys.*BThe class of results, and how to combine them in the server state.+ÃA function to tell how to combine job results. That function will be called on the hostname of the reporting client, with the finished job it sent, and the current result from the server state.,”The class of jobs and job results that Parry can deal with. For efficiency and to keep types simple, jobs and results are stored in a single type.-†Indication of the depth of a job in the explored tree. The server sends the least deep jobs first, as an optimization of network use..¼Number of times a job has been killed. When a job is killed, either because it must be reshared, or because the client itself was killed, it is scheduled to be re-executed by the server./\Called each time a job needs to be killed. For better resharing, this function must verify killed (kill j) >= killed j.0"Starts the synchronization server.1|Default server configuration, matching the client. Note that you must provide your own public key for signing the messages.21Creates a valid server state from an initial job.3*Reads initial state from a file, or calls 2 if the file does not exist.4ƒSaves state to the given file with the given periodicity, in microseconds. This function does not return, so calling it inside a A" is probably the best thing to do. !"#$%&'()*+,-./BCD01234E !"#$%&'()*+,-./01234,-./*+234 !"#$%&'()10  !"#$%&'()*+,-./BCD01234E(c) Pierre-Étienne Meunier 2014GPL-3&pierre-etienne.meunier@lif.univ-mrs.fr experimentalAllNone67Starts the default web server.56FGHI756775656FGHI7J      !""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLM Parry-0.1.0.0Parry.Protocol Parry.Client Parry.Server Parry.WebUI Parry.Util defaultConfigClient ServerMessageDieAckFinishedJob ClientMessageAliveNewJobsnextJobnewJobsJobDoneclientId jobResults currentJobGetJob$fBinaryServerMessage$fBinaryClientMessageConfigserverport privateKey publicKeyisResultclient maxThreadslogFileStatejobsongoing unemployedresultsnewIdkillingssolvedauthorizedKeysResult addResult Exhaustivedepthkilledkill initState stateFromFile saveThreadHtmltoHtmlwebUIencode16decode16 encode16l decode16latomHexnetwork-2.6.0.2Network.Socket.Types PortNumber signAndSend_ signAndSendworkbase GHC.Conc.SyncforkIOanswerreply cleanupThread $fBinaryStateGraphsmakeSvg webserverblankSvg