This commit was generated by cvs2svn to compensate for changes in r12269,
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 28 Oct 2005 07:33:58 +0000 (07:33 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 28 Oct 2005 07:33:58 +0000 (07:33 +0000)
which included commits to RCS files with non-trunk default branches.

40 files changed:
SHUTTLE/AliCDBPreProcessor.cxx [new file with mode: 0644]
SHUTTLE/AliCDBPreProcessor.h [new file with mode: 0644]
SHUTTLE/AliDCSClient.cxx [new file with mode: 0644]
SHUTTLE/AliDCSClient.h [new file with mode: 0644]
SHUTTLE/AliDCSMessage.cxx [new file with mode: 0644]
SHUTTLE/AliDCSMessage.h [new file with mode: 0644]
SHUTTLE/AliDCSValue.cxx [new file with mode: 0644]
SHUTTLE/AliDCSValue.h [new file with mode: 0644]
SHUTTLE/AliShuttle.cxx [new file with mode: 0644]
SHUTTLE/AliShuttle.h [new file with mode: 0644]
SHUTTLE/AliShuttleConfig.cxx [new file with mode: 0644]
SHUTTLE/AliShuttleConfig.h [new file with mode: 0644]
SHUTTLE/AliSimpleValue.cxx [new file with mode: 0644]
SHUTTLE/AliSimpleValue.h [new file with mode: 0644]
SHUTTLE/SHUTTLELinkDef.h [new file with mode: 0644]
SHUTTLE/doc/Makefile [new file with mode: 0644]
SHUTTLE/doc/doc.tex [new file with mode: 0644]
SHUTTLE/doc/pics/Protocol.eps [new file with mode: 0644]
SHUTTLE/doc/pics/ShuttleConfig.eps [new file with mode: 0644]
SHUTTLE/doc/pics/ShuttleSchema.eps [new file with mode: 0644]
SHUTTLE/libSHUTTLE.pkg [new file with mode: 0644]
SHUTTLE/schema/ITS.ldif [new file with mode: 0644]
SHUTTLE/schema/PHOS.ldif [new file with mode: 0644]
SHUTTLE/schema/README [new file with mode: 0644]
SHUTTLE/schema/TPC.ldif [new file with mode: 0644]
SHUTTLE/schema/shuttle.schema [new file with mode: 0644]
SHUTTLE/schema/slapd.conf [new file with mode: 0644]
SHUTTLE/test/LinkDef.h [new file with mode: 0644]
SHUTTLE/test/Makefile [new file with mode: 0644]
SHUTTLE/test/README [new file with mode: 0644]
SHUTTLE/test/TestAliSimpleValue.C [new file with mode: 0644]
SHUTTLE/test/TestClient.C [new file with mode: 0644]
SHUTTLE/test/TestITSPreProcessor.cxx [new file with mode: 0644]
SHUTTLE/test/TestITSPreProcessor.h [new file with mode: 0644]
SHUTTLE/test/TestMessage.C [new file with mode: 0644]
SHUTTLE/test/TestServer.C [new file with mode: 0644]
SHUTTLE/test/TestServer.cxx [new file with mode: 0644]
SHUTTLE/test/TestServer.h [new file with mode: 0644]
SHUTTLE/test/TestShuttle.C [new file with mode: 0644]
SHUTTLE/test/TestShuttleConfig.C [new file with mode: 0644]

diff --git a/SHUTTLE/AliCDBPreProcessor.cxx b/SHUTTLE/AliCDBPreProcessor.cxx
new file mode 100644 (file)
index 0000000..599b35b
--- /dev/null
@@ -0,0 +1,128 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1.1.1  2005/09/12 22:11:40  byordano
+SHUTTLE package
+
+Revision 1.2  2005/08/29 21:15:47  byordano
+some docs added
+
+*/
+
+// Description:
+// This class is the CDBPreProcessor interface,
+// supposed to be implemented by any detector
+// interested in immediate processing of data 
+// which is retrieved from DCS.
+// For every particular run set of aliases and
+// their corespoding value sets are returned.
+// Usage schema:
+//     1) virtual void Initialize(Int_t run, UInt_t startTime, UInt_t endTime) 
+//     This method is called at the begining of data retrieval.
+//     run: run number
+//     startTime: when the run started
+//     endTime: when the run finished  
+//
+//     2) virtual void Process(const char* alias, TList& valueSet,
+//                       Bool_t hasError)      
+//     
+//     This method is called for every particular alias which the detector
+//     is registered in the configuration (see AliShuttleConfig).
+//     alias: alias name
+//     valueSet: collection of AliDCSValue
+//     hasError: flag indicating if some error has happened during
+//             the retrieaval of the data for this alias.
+//
+//     3) virtual void Finalize()
+//     This method is called after the last alias has been processed.
+//
+
+
+#include "AliCDBPreProcessor.h"
+
+#include "AliShuttle.h"
+#include "AliLog.h"
+
+ClassImp(AliCDBPreProcessor)
+
+AliCDBPreProcessor::AliCDBPreProcessor(const char* detector):
+       TNamed(detector, "")
+{
+       SetTitle(Form("AliCDBPreProcessor for %s subdetector.", detector));
+}
+
+AliCDBPreProcessor::~AliCDBPreProcessor() {
+
+}
+
+Int_t AliCDBPreProcessor::GetRun() const {
+       //
+       // Returns current run number.
+       //
+
+       if (!fShuttle) {
+               AliError(Form("Not registered AliCDBPreProcessor: %s",
+                               GetName()));
+               return -1;
+       }
+
+       return fShuttle->GetCurrentRun();
+}
+
+UInt_t AliCDBPreProcessor::GetStartTime() const {
+       //
+       // Returns currernt run start time.
+       //
+       if (!fShuttle) {
+                AliError(Form("Not registered AliCDBPreProcessor: %s",
+                                GetName()));
+                return 0;
+        }
+
+        return fShuttle->GetCurrentStartTime();
+}
+
+UInt_t AliCDBPreProcessor::GetEndTime() const {
+       //
+       // Returns current run end time.
+       //
+        if (!fShuttle) {
+                AliError(Form("Not registered AliCDBPreProcessor: %s",
+                                GetName()));
+                return 0;
+        }
+
+        return fShuttle->GetCurrentEndTime();
+}
+
+Bool_t AliCDBPreProcessor::Store(const char* specType, TObject* object,
+               AliCDBMetaData* metaData)
+{
+       //
+       // Store object and metaData into the default AliCDBStorage.
+       // Storage path: <detector>/DCS/<specType>
+       //
+
+       if (!fShuttle) {
+                AliError(Form("Not registered AliCDBPreProcessor: %s",
+                                GetName()));
+                return kFALSE;
+        }
+
+       return fShuttle->Store(GetName(), specType, object, metaData);
+}
+
diff --git a/SHUTTLE/AliCDBPreProcessor.h b/SHUTTLE/AliCDBPreProcessor.h
new file mode 100644 (file)
index 0000000..91ff7f0
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef ALI_CDB_PRE_PROCESSOR_H
+#define ALI_CDB_PRE_PROCESSOR_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//
+// This class is the CDBPreProcessor interface,
+// supposed to be implemented by any detector
+// interested in immediate processing of data 
+// which is retrieved from DCS.
+//
+
+#include <TNamed.h>
+
+class AliShuttle;
+class AliCDBMetaData;
+
+class AliCDBPreProcessor: public TNamed {
+
+       friend class AliShuttle;
+
+public:
+       AliCDBPreProcessor(const char* detector);
+       virtual ~AliCDBPreProcessor();
+
+       Int_t GetRun() const;
+       UInt_t GetStartTime() const;
+       UInt_t GetEndTime() const;
+
+       Bool_t Store(const char* specType, TObject* object, 
+               AliCDBMetaData* metaData);
+
+       void SetShuttle(AliShuttle* shuttle) {fShuttle = shuttle;};
+       AliShuttle* GetShuttle() const {return fShuttle;};
+
+protected:
+
+       virtual void Initialize(Int_t /*run*/, UInt_t /*startTime*/, 
+                       UInt_t /*endTime*/) {};
+
+       virtual void Finalize() {};
+
+       virtual void Process(const char* alias, TList& valueSet, 
+                       Bool_t hasError) = 0;
+
+private:
+
+       AliShuttle* fShuttle;
+
+       ClassDef(AliCDBPreProcessor, 0);
+};
+
+#endif
diff --git a/SHUTTLE/AliDCSClient.cxx b/SHUTTLE/AliDCSClient.cxx
new file mode 100644 (file)
index 0000000..f71520a
--- /dev/null
@@ -0,0 +1,534 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1.1.1  2005/09/12 22:11:40  byordano
+SHUTTLE package
+
+Revision 1.3  2005/08/30 10:53:23  byordano
+some more descriptions added
+
+*/
+
+//
+// This class represents the AliDCSClient.
+// The client used for data retrieval from DCS server.
+// There are two way for retrieving data from the server.
+//     1) asking for DP (DataPoint) - usually changed frequently.
+//     2) asking for Alias (Alias) - alias should be the same through whole
+//             experimnet.
+//             
+// There are two type of read operations:
+//     Asking for single alias/dp or asking for set of aliases/dp
+//
+// In case of ServerError the coresponding error code and 
+// error string (description) could be got by GetServerErrorCode() and
+// GetServerErrorString()
+//
+
+#include "AliDCSClient.h"
+
+#include "AliDCSValue.h"
+#include "AliLog.h"
+
+#include <TList.h>
+#include <TMap.h>
+#include <TObjString.h>
+#include <TSystem.h>
+
+ClassImp(AliDCSClient)
+
+const Int_t AliDCSClient::fgkBadState;
+
+const Int_t AliDCSClient::fgkInvalidParameter;
+
+const Int_t AliDCSClient::fgkTimeout;
+
+const Int_t AliDCSClient::fgkBadMessage;
+
+const Int_t AliDCSClient::fgkCommError;
+
+const Int_t AliDCSClient::fgkServerError;
+
+const char* AliDCSClient::fgkBadStateString = "BadState";
+
+const char* AliDCSClient::fgkInvalidParameterString = "InvalidParameter";
+
+const char* AliDCSClient::fgkTimeoutString = "Timeout";
+
+const char* AliDCSClient::fgkBadMessageString = "BadMessage";
+
+const char* AliDCSClient::fgkCommErrorString = "CommunicationError";
+
+const char* AliDCSClient::fgkServerErrorString = "ServerError";
+
+AliDCSClient::AliDCSClient(const char* host, Int_t port, UInt_t timeout,
+       Int_t retries):
+       fSocket(NULL), fTimeout(timeout), fRetries(retries),
+       fServerErrorCode(AliDCSMessage::kNoneError), fServerError("")
+{
+       // 
+       // host: DCS server host
+       // port: DCS server port
+       // timeout: in case of communication error or socket read/write this 
+       //              timeout will be used before the next try is made. 
+       // retries: the number of retries after which the connection is 
+       //              is considered as invalid and error is returned.
+       //
+
+       Int_t tries = 0;        
+       
+       while (tries < fRetries) {
+               fSocket = new TSocket(host, port);
+               if (fSocket->IsValid()) {
+                       AliDebug(1, Form("Connected to %s:%d", host, port));
+                       fSocket->SetOption(kNoBlock, 1);
+                       break;
+               }
+               
+               AliDebug(1, Form("Connection timeout! tries <%d> ...", tries));
+
+               delete fSocket;
+               fSocket = NULL;
+
+               gSystem->Sleep(fTimeout);
+               tries ++;
+       }
+}
+
+AliDCSClient::~AliDCSClient() {
+       if (fSocket) {
+               Close();
+               delete fSocket;
+       }
+}
+
+Int_t AliDCSClient::SendBuffer(const char* buffer, Int_t size) {
+
+       Int_t sentSize = 0;
+        Int_t tries = 0;
+
+        while (sentSize < size && tries < fRetries) {
+
+                Int_t sResult = fSocket->Select(TSocket::kWrite, fTimeout);
+
+                if (sResult == 0) {
+                       AliDebug(1, Form("Timeout! tries <%d> ...", tries));
+                        tries ++;
+                        continue;
+
+                } else if (sResult < 0) {
+                       AliDebug(1, Form("Communication error <%d>!", 
+                                       fSocket->GetErrorCode()));
+                        return AliDCSClient::fgkCommError;
+                }
+
+                sResult = fSocket->SendRaw(buffer + sentSize, size - sentSize,
+                                       kDontBlock);
+
+                if (sResult > 0) {
+                        sentSize += sResult;
+                } else {
+                       AliDebug(1, Form("Communication error <%d>!",
+                                        fSocket->GetErrorCode()));
+                        return AliDCSClient::fgkCommError;
+                }
+        }
+
+       if (tries == fRetries) {
+               return AliDCSClient::fgkTimeout;
+       }
+
+        return sentSize;
+}
+
+Int_t AliDCSClient::ReceiveBuffer(char* buffer, Int_t size) {
+
+       Int_t receivedSize = 0;
+        Int_t tries = 0;
+
+        while (receivedSize < size && tries < fRetries) {
+
+                Int_t sResult = fSocket->Select(TSocket::kRead, fTimeout);
+
+                if (sResult == 0) {
+                        AliDebug(1, Form("Timeout! tries <%d> ...", tries));
+                        tries ++;
+                        continue;
+
+                } else if (sResult < 0) {
+                        AliDebug(1, Form("Communication error <%d>",
+                                        fSocket->GetErrorCode()));
+                        return AliDCSClient::fgkCommError;
+                }
+
+                sResult = fSocket->RecvRaw(buffer + receivedSize, 
+                       size - receivedSize, kDontBlock);
+
+                if (sResult > 0) {
+                        receivedSize += sResult;
+                } else {
+                        AliDebug(1, Form("Communication error <%d>",
+                                        fSocket->GetErrorCode()));
+                        return AliDCSClient::fgkCommError;
+                }
+        }
+
+        if (tries == fRetries) {
+                return AliDCSClient::fgkTimeout;
+        }
+
+        return receivedSize;
+}
+
+Int_t AliDCSClient::SendMessage(AliDCSMessage& message) {
+
+       message.StoreToBuffer();
+
+       AliDebug(2, "Sending message.\n"); 
+       message.Print();
+
+       return SendBuffer(message.GetMessage(), message.GetMessageSize());
+}
+
+Int_t AliDCSClient::ReceiveMessage(AliDCSMessage& message) {
+       
+       char header[HEADER_SIZE];
+
+       Int_t sResult;
+
+       if ((sResult = ReceiveBuffer(header, HEADER_SIZE)) < 0) {
+               AliDebug(1, Form("Can't receive message header! Reason: %s", 
+                       GetErrorString(sResult)));
+               return sResult;
+       }
+
+       if (!message.SetRawHeader(header)) {
+               return AliDCSClient::fgkBadMessage;
+       }
+
+       if ((sResult = ReceiveBuffer(message.GetBody(), 
+                       message.GetBodySize())) < 0) {
+               
+               AliDebug(1, Form("Can't receive message body! Reason: %s", 
+                       GetErrorString(sResult)));
+               return sResult;
+       }
+
+       message.LoadFromBuffer();
+
+       AliDebug(2, "Message received.");
+       message.Print();
+
+       return HEADER_SIZE + sResult;
+}
+
+Int_t AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
+       const char* reqString, UInt_t startTime, UInt_t endTime, TList& result) 
+{
+       if (!IsConnected()) {
+               AliError("Not connected!");
+               return AliDCSClient::fgkBadState;
+       }
+
+       Int_t sResult;
+       AliDCSMessage requestMessage;
+       requestMessage.CreateRequestMessage(reqType, startTime, endTime, 
+                       reqString);
+
+       if ((sResult = SendMessage(requestMessage)) < 0) {
+               AliError(Form("Can't send request message! Reason: %s",
+                       GetErrorString(sResult)));
+               Close();
+               return sResult;
+       }       
+       
+       sResult = ReceiveValueSet(result);
+       
+       Close();
+
+       return sResult;
+}
+
+Int_t AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
+       UInt_t startTime, UInt_t endTime, TMap& result) 
+{
+       if (!IsConnected()) {
+               AliError("Not connected!");
+               return AliDCSClient::fgkBadState;
+       }       
+
+       AliDCSMessage multiRequestMessage;
+       multiRequestMessage.CreateMultiRequestMessage(reqType, 
+                       startTime, endTime);
+
+       TList requests;
+       
+       TIter iter(&result);
+       TObjString* aRequest;
+       
+       // copy request strings to temporary TList because
+       // TMap doesn't guarantee the order of elements!!!
+       while ((aRequest = (TObjString*) iter.Next())) {
+               requests.Add(aRequest);
+               if (!multiRequestMessage.AddRequestString(aRequest->String()))
+               {
+                       return AliDCSClient::fgkInvalidParameter;
+               }
+       }
+
+       Int_t sResult;
+       if ((sResult = SendMessage(multiRequestMessage)) < 0) {
+                AliError(Form("Can't send request message! Reason: %s",
+                        GetErrorString(sResult)));
+                Close();
+                return sResult;
+        }
+
+       result.SetOwner(0);
+       result.Clear();
+
+       TIter reqIter(&requests);
+       while ((aRequest = (TObjString*) reqIter.Next())) {
+               TList* resultSet = new TList();
+               resultSet->SetOwner(1);
+
+               if ((sResult = ReceiveValueSet(*resultSet)) < 0) {
+                       AliError(Form("Can't get values for %s!" ,
+                               aRequest->String().Data()));
+
+                       delete resultSet;
+                       break;
+               }
+
+               result.Add(aRequest, resultSet);
+       }
+
+       if (sResult < 0) {
+               result.DeleteValues();
+               result.Clear();
+
+               requests.Delete();
+       } else {
+               result.SetOwner(1);
+       }
+
+       Close();
+
+       return sResult;
+}
+       
+Int_t AliDCSClient::ReceiveValueSet(TList& result) {
+
+       Int_t sResult;
+
+       AliDCSMessage responseMessage;
+       if ((sResult = ReceiveMessage(responseMessage)) < 0) {
+               AliError(Form("Can't receive response message! Reason: %s",
+                       GetErrorString(sResult)));
+               return sResult;
+       }       
+
+       UInt_t valueCount;
+
+       if (responseMessage.GetType() == AliDCSMessage::kCount) {
+               valueCount = responseMessage.GetCount();
+
+       } else if (responseMessage.GetType() == AliDCSMessage::kError) {
+               fServerErrorCode = responseMessage.GetErrorCode();
+               fServerError = responseMessage.GetErrorString();
+
+               return AliDCSClient::fgkServerError;
+
+       } else {
+               AliError("Bad message type received!"); 
+               return AliDCSClient::fgkBadMessage;
+       }
+
+       UInt_t receivedValues = 0;
+
+       AliSimpleValue::Type valueType = AliSimpleValue::kInvalid;
+
+       while (receivedValues < valueCount) {
+
+                AliDCSMessage message;
+
+                if ((sResult = ReceiveMessage(message)) < 0) {
+                        AliError(Form("Can't receive message! Reason: %s",
+                               GetErrorString(sResult)));
+                        return sResult;
+                }
+
+                if (message.GetType() == AliDCSMessage::kResultSet) {
+
+                       if (valueType == AliSimpleValue::kInvalid) {
+                               valueType = message.GetSimpleValueType();
+                       } else {
+                               if (valueType != message.GetSimpleValueType()) {
+                                       AliError("Unexpected value type!");
+                                       return AliDCSClient::fgkBadMessage;
+                               }
+                       }
+                       
+                       receivedValues += message.GetValues(result);
+
+                       if (receivedValues > valueCount) {
+                               AliError("Message contains more values than expected!");
+                               return AliDCSClient::fgkBadMessage;
+                       }
+
+               } else if (message.GetType() == AliDCSMessage::kError) {
+                               fServerErrorCode = 
+                                       responseMessage.GetErrorCode();
+                               fServerError = responseMessage.GetErrorString();
+
+                               return AliDCSClient::fgkServerError;
+               } else {
+                        AliError("Bad message type received!");
+                        return AliDCSClient::fgkBadMessage;
+                }       
+        }       
+       
+       return receivedValues;
+}
+               
+Int_t AliDCSClient::GetDPValues(const char* dpName, UInt_t startTime,
+                               UInt_t endTime, TList& result)
+{
+       //
+       // Reads a values from the server which correspond to this
+       // DataPoint (dpName) in time interval (startTime - endTime).
+       // result: Collection of AliDCSValue which contains the read values.
+       //
+       // Returns:
+       //      If >= 0 , the number of values read.
+       //      if < 0, the error code which has occured during the read.
+       //
+
+       return GetValues(AliDCSMessage::kDPName, 
+                       dpName, startTime, endTime, result);
+}
+
+Int_t AliDCSClient::GetAliasValues(const char* alias, UInt_t startTime,
+                               UInt_t endTime, TList& result)
+{
+       //
+        // Reads a values from the server which correspond to this
+        // alias (alias) in time interval (startTime - endTime).
+        // result: Collection of AliDCSValue which contains the read values.
+       //
+        // Returns:
+        //      If >= 0 , the number of values read.
+        //      if < 0, the error code which has occured during the read.
+        //
+
+       return GetValues(AliDCSMessage::kAlias, 
+                       alias, startTime, endTime, result);
+}
+
+Int_t AliDCSClient::GetDPValues(UInt_t startTime, UInt_t endTime, 
+                               TMap& result) 
+{
+       //
+        // For every key of 'result' (which must be TObjString) 
+       // reads a valueSet. The key represents particular DataPoint to be read.
+        // For all DataPoints time interval (startTime - endTime) is used.
+        // After the read, the correspoding value for every key is a 
+       // TList - collection of AliDCSValue, or result is an empty map in
+       // case of error.
+       // 
+        // Returns:
+        //      If >= 0 , the number of values read.
+        //      if < 0, the error code which has occured during the read.
+        //
+
+       return GetValues(AliDCSMessage::kDPName, startTime, endTime, result);
+}
+
+Int_t AliDCSClient::GetAliasValues(UInt_t startTime, UInt_t endTime,
+                               TMap& result) 
+{
+       //
+        // For every key of 'result' (which must be TObjString) 
+        // reads a valueSet. The key represents particular Alias to be read.
+        // For all aliases time interval (startTime - endTime) is used.
+        // After the read, the correspoding value for every key is a 
+        // TList - collection of AliDCSValue, or result is an empty map in
+        // case of error.
+        // 
+        // Returns:
+        //      If >= 0 , the number of values read.
+        //      if < 0, the error code which has occured during the read.
+        //
+
+       return GetValues(AliDCSMessage::kAlias, startTime, endTime, result);
+}
+
+Bool_t AliDCSClient::IsConnected() {
+       //
+       // Returns kTRUE if there is a valid connection to the server.
+       //
+
+       if (fSocket) {
+               return fSocket->IsValid();
+       }
+
+       return kFALSE;
+}
+
+void AliDCSClient::Close() {
+       //
+       // Close the connection.
+       //
+
+       if (fSocket) {
+               fSocket->Close();
+       }
+}
+
+const char* AliDCSClient::GetErrorString(Int_t code) {
+       //
+       // Returns a short string describing the error code.
+       // code: the error code.
+       //
+       
+
+       switch (code) {
+               case AliDCSClient::fgkBadState:
+                       return AliDCSClient::fgkBadStateString;
+
+               case AliDCSClient::fgkInvalidParameter:
+                       return AliDCSClient::fgkInvalidParameterString;
+
+               case AliDCSClient::fgkTimeout:
+                       return AliDCSClient::fgkTimeoutString;
+
+               case AliDCSClient::fgkBadMessage:
+                       return AliDCSClient::fgkBadMessageString;
+       
+               case AliDCSClient::fgkCommError:
+                       return AliDCSClient::fgkCommErrorString;
+
+               case AliDCSClient::fgkServerError:
+                       return AliDCSClient::fgkServerErrorString;
+
+               default:
+                       AliErrorGeneral("AliDCSClient::GetErrorString",
+                               "Unknown error code!");
+                       return "UnknownCode";
+       }
+}
+
diff --git a/SHUTTLE/AliDCSClient.h b/SHUTTLE/AliDCSClient.h
new file mode 100644 (file)
index 0000000..91bfe25
--- /dev/null
@@ -0,0 +1,113 @@
+#ifndef ALI_DCS_CLIENT_H
+#define ALI_DCS_CLIENT_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//
+// This class represents the AliDCSClient.
+// The client used for data retrieval from DCS server.
+//
+
+#include "AliDCSMessage.h"
+
+#include <TSocket.h>
+
+
+class TList;
+class TMap;
+
+class AliDCSClient: public TObject {
+public:
+       
+       static const Int_t fgkBadState = -1;
+
+       static const Int_t fgkInvalidParameter = -2;
+
+       static const Int_t fgkTimeout = -3;
+
+       static const Int_t fgkBadMessage = -4;
+
+       static const Int_t fgkCommError = -5;
+
+       static const Int_t fgkServerError = -6;
+
+       static const char* fgkBadStateString;
+
+       static const char* fgkInvalidParameterString;
+
+       static const char* fgkTimeoutString;
+
+       static const char* fgkBadMessageString; 
+
+       static const char* fgkCommErrorString;
+
+       static const char* fgkServerErrorString;
+
+
+       AliDCSClient(const char* host, Int_t port, UInt_t timeout = 5000,
+                        Int_t retries = 5);
+        virtual ~AliDCSClient();
+
+
+        Int_t GetDPValues(const char* dpName, UInt_t startTime, UInt_t endTime,
+                                TList& result);
+
+        Int_t GetAliasValues(const char* alias, UInt_t startTime,
+                                UInt_t endTime, TList& result);
+
+        Int_t GetDPValues(UInt_t startTime, UInt_t endTime, TMap& result);
+
+        Int_t GetAliasValues(UInt_t startTime, UInt_t endTime, TMap& result);
+
+
+        AliDCSMessage::ErrorCode GetServerErrorCode()
+                { return fServerErrorCode;};
+
+        const TString& GetServerError() {return fServerError;};
+
+
+        Bool_t IsConnected();
+
+        void Close();
+
+
+        static const char* GetErrorString(Int_t code);
+
+private:
+
+       TSocket* fSocket;
+       
+       UInt_t fTimeout;
+
+       Int_t fRetries;
+       
+       AliDCSMessage::ErrorCode fServerErrorCode;
+       
+       TString fServerError;
+
+
+       Int_t SendBuffer(const char* buffer, Int_t size);
+
+       Int_t ReceiveBuffer(char* buffer, Int_t size);
+
+       Int_t SendMessage(AliDCSMessage& message);
+
+       Int_t ReceiveMessage(AliDCSMessage& message);   
+
+       Int_t GetValues(AliDCSMessage::RequestType requestType,
+               const char* requestString, UInt_t startTime, UInt_t endTime,
+               TList& result);
+       
+       Int_t GetValues(AliDCSMessage::RequestType requestType,
+               UInt_t startTime, UInt_t endTime, TMap& result);
+
+       Int_t ReceiveValueSet(TList& result);
+
+
+       ClassDef(AliDCSClient, 0);
+};
+
+#endif
diff --git a/SHUTTLE/AliDCSMessage.cxx b/SHUTTLE/AliDCSMessage.cxx
new file mode 100644 (file)
index 0000000..7368891
--- /dev/null
@@ -0,0 +1,1256 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1.1.1  2005/09/12 22:11:40  byordano
+SHUTTLE package
+
+Revision 1.2  2005/08/30 10:53:23  byordano
+some more descriptions added
+
+*/
+
+
+//
+// This class is a wrapper of AliDCSMessage.
+// These are the messages which form AliDCSProtocol.
+// Every message has header and body. The body size is written in the header.
+// There are five message types:
+//     1) Request - used by the client to form a single request to DCS server
+//     2) Count - returned by the server to inidicate the total number of 
+//             values which would be sent to the client.
+//     3) ResultSet - returned by the server and contains part of values set
+//             which forms the server resposen. 
+//     4) Error - returned by the server in case of error
+//     5) MultiRequest - used by the client to form multi request.
+//             This is a request which serves many aliases/dp at the same time
+//             For all aliases/dp the same time interval is used.      
+// Short description of the schema:
+//     The client sends a request (Request or MultiRequest) and the server 
+//     returns:
+//             1) Count - the total number of values that the client should 
+//                     expect.
+//             2) ResultSet* - every ResultSet message contains a part
+//                     of valueSet (some values) which the client should expect
+//                     The client can wait for ResultMessage until it gets
+//                     all values (total number) which was returned by the
+//                     Count message at the beginning of the ResutlSet sereie.
+//     In case of error:
+//             1) Error - contains the error code and error description
+//
+
+#include "AliDCSMessage.h"
+
+#include "AliLog.h"
+
+#include <Bytes.h>
+#include <TObjString.h>
+
+#include <ctype.h>
+#include <assert.h>
+
+ClassImp(AliDCSMessage)
+
+AliDCSMessage::AliDCSMessage():
+       fMessage(NULL), fMessageSize(0), fType(kInvalid)
+{
+
+}
+
+AliDCSMessage::AliDCSMessage(const char* message, UInt_t size):
+        fMessageSize(size), fType(kInvalid)
+{
+        fMessage = new char[size];
+
+        memcpy(fMessage, message, size);
+}
+
+AliDCSMessage::~AliDCSMessage() {
+       DestroyMessage();
+        DestroyBuffer();
+}
+
+void AliDCSMessage::CreateRequestMessage(RequestType type, 
+       UInt_t startTime, UInt_t endTime, const char* request)
+{
+       DestroyMessage();
+
+       fType = AliDCSMessage::kRequest;
+       fRequestType = type;
+       fStartTime = startTime;
+       fEndTime = endTime;
+       fRequestString = request;
+}
+
+void AliDCSMessage::CreateMultiRequestMessage(RequestType type, 
+       UInt_t startTime, UInt_t endTime)
+{
+       DestroyMessage();
+
+        fType = AliDCSMessage::kMultiRequest;
+       fRequestType = type;
+        fStartTime = startTime;
+       fEndTime = endTime;
+}
+       
+void AliDCSMessage::CreateCountMessage(UInt_t count) {
+       DestroyMessage();
+
+       fType = AliDCSMessage::kCount;
+       fCount = count;
+}
+
+void AliDCSMessage::CreateResultSetMessage(AliSimpleValue::Type type) {
+       DestroyMessage();
+
+       fType = AliDCSMessage::kResultSet;
+       fSimpleValueType = type; 
+}
+
+void AliDCSMessage::CreateErrorMessage(ErrorCode errorCode, 
+       const char* errorString)
+{
+       DestroyMessage();
+
+       fType = AliDCSMessage::kError;
+       fErrorCode = errorCode;
+       fErrorString = errorString;
+}
+
+/*
+void AliDCSMessage::CreateNextMessage() {
+       DestroyMessage();
+
+       fType = AliDCSMessage::kNext;
+} */
+
+void AliDCSMessage::DestroyMessage() {
+       fType = kInvalid;
+        ClearValues();
+        ClearRequestStrings();
+}
+
+void AliDCSMessage::SetBool(char* buf, Bool_t val) {
+       tobuf(buf, val);
+}
+
+void AliDCSMessage::SetByte(char* buf, Char_t val) {
+       tobuf(buf, val);
+}
+
+void AliDCSMessage::SetUByte(char* buf, UChar_t val) {
+       tobuf(buf, val);
+}
+
+void AliDCSMessage::SetInt(char* buf, Int_t val) {
+       tobuf(buf, val);
+}
+
+void AliDCSMessage::SetUInt(char* buf, UInt_t val) {
+       tobuf(buf, val);
+}
+
+void AliDCSMessage::SetFloat(char* buf, Float_t val) {
+       tobuf(buf, val);
+}
+
+Bool_t AliDCSMessage::GetBool(const char* buf) {
+       Bool_t val;
+       char* aBuffer = (char*) buf;
+
+       frombuf(aBuffer, &val);
+
+       return val;
+}
+
+Char_t AliDCSMessage::GetByte(const char* buf) {
+       Char_t val;
+       char* aBuffer = (char*) buf;
+
+       frombuf(aBuffer, &val);
+
+       return val;
+}
+
+UChar_t AliDCSMessage::GetUByte(const char* buf) {
+       UChar_t val;
+       char* aBuffer = (char*) buf;
+
+        frombuf(aBuffer, &val);
+
+       return val;
+}
+
+Int_t AliDCSMessage::GetInt(const char* buf) {
+       Int_t val;
+       char* aBuffer = (char*) buf;
+
+        frombuf(aBuffer, &val);
+
+       return val;
+}
+
+UInt_t AliDCSMessage::GetUInt(const char* buf) {
+       UInt_t val;
+       char* aBuffer = (char*) buf;
+
+        frombuf(aBuffer, &val);
+
+       return val;
+}
+
+Float_t AliDCSMessage::GetFloat(const char* buf) {
+       Float_t val;
+       char* aBuffer = (char*) buf;
+
+        frombuf(aBuffer, &val);
+
+       return val;
+}
+
+TString AliDCSMessage::GetString(const char* buf, Int_t maxLen) {
+
+       for (Int_t k = 0; k < maxLen; k ++) {
+               if (buf[k] == 0) {
+                       return TString(buf);
+               }
+       }
+
+       return TString(buf, maxLen);
+}
+
+void AliDCSMessage::StoreHeader() {
+       
+       SetUByte(fMessage + ID_OFFSET, 'A');
+       SetUByte(fMessage + ID_OFFSET + 1, 'D');
+
+       SetUByte(fMessage + VERSION_OFFSET, 1);
+
+       SetUByte(fMessage + TYPE_OFFSET, fType);
+
+       SetUInt(fMessage + BODY_SIZE_OFFSET, fMessageSize - HEADER_SIZE);
+}
+
+void AliDCSMessage::StoreRequestMessage() {
+       
+       fMessageSize = REQUEST_STRING_OFFSET +
+               fRequestString.Length() + 1;
+       
+       fMessage = new char[fMessageSize];
+
+       StoreHeader();
+
+       SetUByte(fMessage + REQUEST_TYPE_OFFSET, fRequestType);
+       SetUInt(fMessage + START_TIME_OFFSET, fStartTime);
+       SetUInt(fMessage + END_TIME_OFFSET, fEndTime);
+       strcpy(fMessage + REQUEST_STRING_OFFSET, fRequestString.Data());
+}
+
+void AliDCSMessage::StoreCountMessage() {
+
+       fMessageSize = COUNT_OFFSET + sizeof(UInt_t);
+
+       fMessage = new char[fMessageSize];
+
+       StoreHeader();
+
+       SetUInt(fMessage + COUNT_OFFSET, fCount);
+}
+
+void AliDCSMessage::StoreResultSetMessage() {
+
+       TIter iter(&fValues);
+       AliDCSValue* aValue;
+
+       UInt_t valueDataSize = 0;
+       while ((aValue = (AliDCSValue*) iter.Next())) {
+               if (AliSimpleValue::IsDynamic(fSimpleValueType)) {
+                       valueDataSize +=  1;
+               }       
+       
+               valueDataSize += aValue->GetSize();
+       }
+       
+       fMessageSize = VALUES_OFFSET + valueDataSize;
+       
+       fMessage = new char[fMessageSize];
+
+       StoreHeader();
+
+       SetUByte(fMessage + SVT_OFFSET, fSimpleValueType);
+       SetUInt(fMessage + VALUE_COUNT_OFFSET, GetValueCount());
+
+       UInt_t cursor = VALUES_OFFSET;
+       
+       iter.Reset();
+
+       if (fSimpleValueType == AliSimpleValue::kBool) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                       SetBool(fMessage + cursor, aValue->
+                               GetSimpleValue().GetBool());
+                       cursor += 1;
+                       SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                       cursor += sizeof(UInt_t);
+               }
+       } else if (fSimpleValueType == AliSimpleValue::kByte) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                       SetByte(fMessage + cursor, aValue->
+                               GetSimpleValue().GetByte());
+                       cursor += sizeof(Char_t);
+                       SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                       cursor += sizeof(UInt_t);
+               }
+       } else if (fSimpleValueType == AliSimpleValue::kInt) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                        SetInt(fMessage + cursor, aValue->
+                                GetSimpleValue().GetInt());
+                        cursor += sizeof(Int_t);
+                        SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                        cursor += sizeof(UInt_t);
+                }
+       } else if (fSimpleValueType == AliSimpleValue::kUInt) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                        SetUInt(fMessage + cursor, aValue->
+                                GetSimpleValue().GetUInt());
+                        cursor += sizeof(UInt_t);
+                        SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                        cursor += sizeof(UInt_t);
+                }
+       } else if (fSimpleValueType == AliSimpleValue::kFloat) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                        SetFloat(fMessage + cursor, aValue->
+                                GetSimpleValue().GetFloat());
+                        cursor += sizeof(Float_t);
+                        SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                        cursor += sizeof(UInt_t);
+                }
+/*     } else if (fSimpleValueType == AliSimpleValue::kDynBool) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                       Int_t dynSize = aValue->GetSimpleValue().
+                               GetDynamicSize();
+                       SetUByte(fMessage + cursor, dynSize);
+                       cursor += 1;
+                       for (Int_t k = 0; k < dynSize; k ++) {
+                               SetBool(fMessage + cursor, aValue->
+                                       GetSimpleValue().GetDynBool(k));
+                               cursor += 1;
+                       }
+                        SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                        cursor += sizeof(UInt_t);
+                }
+       } else if (fSimpleValueType == AliSimpleValue::kDynByte) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                        Int_t dynSize = aValue->GetSimpleValue().
+                                GetDynamicSize();
+                        SetUByte(fMessage + cursor, dynSize);
+                       cursor += 1;    
+                        for (Int_t k = 0; k < dynSize; k ++) {
+                                SetByte(fMessage + cursor, aValue->
+                                        GetSimpleValue().GetDynByte(k));
+                                cursor += sizeof(Char_t);
+                        }
+                        SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                        cursor += sizeof(UInt_t);
+                }
+       } else if (fSimpleValueType == AliSimpleValue::kDynInt) {
+                while ((aValue = (AliDCSValue*) iter.Next())) {
+                        Int_t dynSize = aValue->GetSimpleValue().
+                                GetDynamicSize();
+                        SetUByte(fMessage + cursor, dynSize);
+                        cursor += 1;
+                        for (Int_t k = 0; k < dynSize; k ++) {
+                                SetInt(fMessage + cursor, aValue->
+                                        GetSimpleValue().GetDynInt(k));
+                                cursor += sizeof(Int_t);
+                        }
+                        SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                        cursor += sizeof(UInt_t);
+                }
+       } else if (fSimpleValueType == AliSimpleValue::kDynUInt) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                        Int_t dynSize = aValue->GetSimpleValue().
+                                GetDynamicSize();
+                        SetUByte(fMessage + cursor, dynSize);
+                        cursor += 1;
+                        for (Int_t k = 0; k < dynSize; k ++) {
+                                SetUInt(fMessage + cursor, aValue->
+                                        GetSimpleValue().GetDynUInt(k));
+                                cursor += sizeof(UInt_t);
+                        }
+                        SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                        cursor += sizeof(UInt_t);
+                }
+       } else if (fSimpleValueType == AliSimpleValue::kDynFloat) {
+               while ((aValue = (AliDCSValue*) iter.Next())) {
+                        Int_t dynSize = aValue->GetSimpleValue().
+                                GetDynamicSize();
+                        SetUByte(fMessage + cursor, dynSize);
+                        cursor += 1;
+                        for (Int_t k = 0; k < dynSize; k ++) {
+                                SetFloat(fMessage + cursor, aValue->
+                                        GetSimpleValue().GetDynFloat(k));
+                                cursor += sizeof(Float_t);
+                        }
+                        SetUInt(fMessage + cursor, aValue->GetTimeStamp());
+                        cursor += sizeof(UInt_t);
+                } */
+       } else {
+               AliError("Invalid or unknown SimpleValueType!");
+               return;
+       }       
+
+}
+
+void AliDCSMessage::StoreErrorMessage() {
+
+       fMessageSize = ERROR_STRING_OFFSET + fErrorString.Length() + 1;
+
+       fMessage = new char[fMessageSize];
+
+       StoreHeader();
+
+       SetUByte(fMessage + ERROR_CODE_OFFSET, fErrorCode);
+       strcpy(fMessage + ERROR_STRING_OFFSET, fErrorString.Data());
+}
+
+void AliDCSMessage::StoreMultiRequestMessage() {
+       
+       UInt_t requestDataSize = 0;
+
+       TIter iter(&fRequestStrings);
+       TObjString* anObjString;
+
+       while ((anObjString = (TObjString*) iter.Next())) {
+               assert(anObjString->String().Length() <= 255);
+               requestDataSize += anObjString->String().Length() + 1;
+       }
+
+       fMessageSize = REQUEST_STRINGS_OFFSET + requestDataSize;
+
+       fMessage = new char[fMessageSize];
+       
+       StoreHeader();
+
+       SetUByte(fMessage + REQUEST_TYPE_OFFSET, fRequestType);
+        SetUInt(fMessage + START_TIME_OFFSET, fStartTime);
+        SetUInt(fMessage + END_TIME_OFFSET, fEndTime);
+       
+       iter.Reset();
+
+       UInt_t cursor = REQUEST_STRINGS_OFFSET;
+
+       while ((anObjString = (TObjString*) iter.Next())) {
+               UChar_t strLength = anObjString->String().Length();
+               SetUByte(fMessage + cursor, strLength);
+               cursor += 1;
+               strncpy(fMessage + cursor, anObjString->String().Data(), 
+                       strLength);
+               cursor += strLength;
+       }
+}
+
+/*
+void AliDCSMessage::StoreNextMessage() {
+
+        fMessageSize = HEADER_SIZE;
+
+        fMessage = new char[fMessageSize];
+
+        StoreHeader(); 
+} */
+
+Bool_t AliDCSMessage::ValidateHeader(const char* buf) {
+
+       if (!(buf[ID_OFFSET] == 'A' && buf[ID_OFFSET + 1] == 'D')) {
+               AliError("Bad message ID!");
+               return kFALSE;
+       }
+
+       if (buf[VERSION_OFFSET] != 1) {
+               AliError("Bad message version!");
+               return kFALSE;
+       }
+
+       Type type = (Type) GetUByte(buf + TYPE_OFFSET); 
+       switch (type) {
+               case kRequest:
+               case kCount:
+               case kResultSet:
+               case kError:
+               case kMultiRequest:
+                       break;
+               default:
+                       AliError("Unknown message type!");
+                       return kFALSE;
+       }
+
+       UInt_t bodySize = GetInt(buf + BODY_SIZE_OFFSET);
+       if (bodySize > MAX_BODY_SIZE) {
+               AliError("Too big message body size!");
+               return kFALSE;
+       } 
+
+       return kTRUE;
+}
+
+void AliDCSMessage::LoadRequestMessage() {
+
+       if (fMessageSize < REQUEST_STRING_OFFSET) {
+               AliError("Body size is too small for request message!");
+               return;
+       }
+
+       fRequestType = (RequestType) GetUByte(fMessage + REQUEST_TYPE_OFFSET);
+
+       fStartTime = GetUInt(fMessage + START_TIME_OFFSET);
+       fEndTime = GetUInt(fMessage + END_TIME_OFFSET);
+       fRequestString = GetString(fMessage + REQUEST_STRING_OFFSET,
+               fMessageSize - REQUEST_STRING_OFFSET);
+
+       switch (fRequestType) {
+               case kAlias:
+               case kDPName:
+                       fType = kRequest;
+                       break;
+               default:
+                       AliError("Invalid request type!");
+       }
+}
+
+void AliDCSMessage::LoadCountMessage() {
+
+       if (fMessageSize < HEADER_SIZE + sizeof(UInt_t)) {
+               AliError("Body size is too small for count message!");
+               return;
+       }
+
+       fCount = GetUInt(fMessage + COUNT_OFFSET);
+
+       fType = kCount;
+}
+
+void AliDCSMessage::LoadResultSetMessage() {
+
+       if (fMessageSize < VALUES_OFFSET) {
+               AliError("Body size is too small for result set message!");
+               return;
+       }       
+
+       fSimpleValueType = (AliSimpleValue::Type) GetUByte(
+                               fMessage + SVT_OFFSET);
+       UInt_t count = GetUInt(fMessage + VALUE_COUNT_OFFSET);
+
+       UInt_t cursor = VALUES_OFFSET;
+
+       if (fSimpleValueType == AliSimpleValue::kBool) {
+               if (VALUES_OFFSET + count + count * sizeof(UInt_t) > 
+                       fMessageSize) {
+                       AliError("Too many bool values for this buffer size!");
+                       return;
+               }       
+       
+               for (UInt_t k = 0; k < count; k ++) {
+                       Bool_t aBool = GetBool(fMessage + cursor);
+                       cursor += 1;
+                       UInt_t timeStamp = GetUInt(fMessage + cursor);
+                       cursor += sizeof(UInt_t);
+                       fValues.Add(new AliDCSValue(aBool, timeStamp));
+               }
+       } else if (fSimpleValueType == AliSimpleValue::kByte) {
+               if (VALUES_OFFSET + count + count * sizeof(UInt_t) > 
+                        fMessageSize) {
+                        AliError("Too many byte values for this buffer size!");
+                        return;
+                }       
+        
+                for (UInt_t k = 0; k < count; k ++) {
+                        Char_t aByte = GetByte(fMessage + cursor);
+                        cursor += sizeof(Char_t);
+                        UInt_t timeStamp = GetUInt(fMessage + cursor);
+                        cursor += sizeof(UInt_t);
+                        fValues.Add(new AliDCSValue(aByte, timeStamp));
+                }
+       } else if (fSimpleValueType == AliSimpleValue::kInt) {
+               if (VALUES_OFFSET + count * sizeof(Int_t) + 
+                       count * sizeof(UInt_t) > fMessageSize) {
+                        AliError("Too many int values for this buffer size!");
+                        return;
+                }
+
+                for (UInt_t k = 0; k < count; k ++) {
+                        Int_t aInt = GetInt(fMessage + cursor);
+                        cursor += sizeof(Int_t);
+                        UInt_t timeStamp = GetUInt(fMessage + cursor);
+                        cursor += sizeof(UInt_t);
+                        fValues.Add(new AliDCSValue(aInt, timeStamp));
+                }
+
+       } else if (fSimpleValueType == AliSimpleValue::kUInt) {
+               if (VALUES_OFFSET + count * sizeof(UInt_t) +  
+                        count * sizeof(UInt_t) > fMessageSize) {
+                        AliError("Too many uint values for this buffer size!");
+                        return;
+                }
+
+                for (UInt_t k = 0; k < count; k ++) {
+                        UInt_t aUInt = GetUInt(fMessage + cursor);
+                        cursor += sizeof(UInt_t);
+                        UInt_t timeStamp = GetUInt(fMessage + cursor);
+                        cursor += sizeof(UInt_t);
+                        fValues.Add(new AliDCSValue(aUInt, timeStamp));
+                }
+       } else if (fSimpleValueType == AliSimpleValue::kFloat) {
+               if (VALUES_OFFSET + count * sizeof(Float_t) +
+                        count * sizeof(UInt_t) > fMessageSize) {
+                        AliError("Too many float values for this buffer size!");
+                        return;
+                }
+
+                for (UInt_t k = 0; k < count; k ++) {
+                        Float_t aFloat = GetFloat(fMessage + cursor);
+                        cursor += sizeof(Float_t);
+                        UInt_t timeStamp = GetUInt(fMessage + cursor);
+                        cursor += sizeof(UInt_t);
+                        fValues.Add(new AliDCSValue(aFloat, timeStamp));
+                }
+
+       } else {
+               AliError("Unknown or invalid simple value type!");
+       }
+
+       fType = kResultSet;
+}
+
+void AliDCSMessage::LoadErrorMessage() {
+       
+       if (fMessageSize < ERROR_STRING_OFFSET) {
+               AliError("Body size is too small for error message!");
+               return;
+       }
+
+       fErrorCode = (ErrorCode) GetUByte(fMessage + ERROR_CODE_OFFSET);
+       fErrorString = GetString(fMessage + ERROR_STRING_OFFSET,
+               fMessageSize - ERROR_STRING_OFFSET);
+
+       switch (fErrorCode) {
+               case kUnknownAliasDPName:
+                case kInvalidTimeRange:
+                case kInvalidBufferSize:
+                case kInvalidRequest:
+                case kUnsupportedType:
+                case kUnknownError:
+                       fType = kError;
+                       break;
+               default:
+                       AliError("Invalid error code!");
+       }
+}
+
+void AliDCSMessage::LoadMultiRequestMessage() {
+       
+       if (fMessageSize - HEADER_SIZE < REQUEST_STRINGS_OFFSET) {
+               AliError("Body size is too small for multi request message!");
+               return;
+       }
+
+       fRequestType = (RequestType) GetUByte(fMessage + REQUEST_TYPE_OFFSET);
+
+        fStartTime = GetUInt(fMessage + START_TIME_OFFSET);
+        fEndTime = GetUInt(fMessage + END_TIME_OFFSET);
+
+        switch (fRequestType) { 
+                case kAlias:
+                case kDPName:
+                        fType = kRequest;
+                        break; 
+                default:
+                        AliError("Invalid request type!");
+                       return;
+        }
+
+       UInt_t cursor = REQUEST_STRINGS_OFFSET;
+       
+       while ((cursor < fMessageSize)) {
+               UChar_t strSize = GetUByte(fMessage + cursor);
+               cursor += 1;
+
+               if (cursor + strSize > fMessageSize) {
+                       AliError("Invalid multi request message!");
+                       return;
+               }               
+
+               TObjString* anObjString = new TObjString(
+                       GetString(fMessage + cursor, strSize));
+               fRequestStrings.Add(anObjString);
+
+               cursor += strSize;
+       }       
+
+       fType = kMultiRequest;
+}
+
+/*
+void AliDCSMessage::LoadNextMessage() {
+       
+       fType = kNext;
+} */
+
+void AliDCSMessage::StoreToBuffer() {
+       //
+       // Creates an underlying message buffer which can be sent to the
+       // socket.
+       //
+
+       DestroyBuffer();
+       
+       switch (fType) {
+               case kRequest: 
+                       StoreRequestMessage();
+                       break;
+               case kCount:
+                       StoreCountMessage();
+                       break;
+               case kResultSet:
+                       StoreResultSetMessage();
+                       break;
+               case kError:
+                       StoreErrorMessage();
+                       break;
+               case kMultiRequest:
+                       StoreMultiRequestMessage();
+                       break;
+/*             case kNext:
+                       StoreNextMessage();
+                       break; */
+               default:
+                       AliError("Can't store to buffer invalid message!");
+       }
+}
+
+void AliDCSMessage::LoadFromBuffer() {
+       //
+       // Reads the underlying message buffer and if it's valid message
+       // creates the corresponding message.  
+       // If not set the message type kInvalid.
+       // This buffer is read from the socket.
+       //
+       
+       DestroyMessage();
+
+       if (!fMessage) {
+               AliError("Message buffer is empty! Can't load it.");
+               return;
+       }
+       
+       if (fMessageSize < HEADER_SIZE) {
+               AliError("Invalid message buffer. Too small for the header!");
+               return;
+       }
+
+       if (!ValidateHeader(fMessage)) {
+               AliError("Invalid message header!");
+               return;
+       }
+
+       UInt_t bodySize = GetUInt(fMessage + BODY_SIZE_OFFSET);
+       if (bodySize > fMessageSize - HEADER_SIZE) {
+               AliError("Message size is to small for the message body!");
+               return;
+       }
+
+       fMessageSize = HEADER_SIZE + bodySize;
+
+       Type aType = (Type) GetUByte(fMessage + TYPE_OFFSET);
+       
+       switch (aType) {
+               case kRequest:
+                       LoadRequestMessage();
+                       break;
+               case kCount:
+                       LoadCountMessage();
+                       break;
+               case kResultSet:
+                       LoadResultSetMessage();
+                       break;
+               case kError:
+                       LoadErrorMessage();
+                       break;
+               case kMultiRequest:
+                       LoadMultiRequestMessage();
+                       break;
+/*             case kNext:
+                       LoadNextMessage();
+                       break; */
+               default:
+                       AliError("Invalid message type!");
+       }       
+}
+
+AliDCSMessage::RequestType AliDCSMessage::GetRequestType() const {
+       //
+       // Request and MultiRequest.
+       // Returns the request type: alias or dp (Data Point)
+       //
+
+       if (!(fType == kRequest || fType == kMultiRequest)) {
+               AliError("Invalid AliDCSMessage type!");
+               return kNoneType;
+       }
+
+       return fRequestType;
+}
+
+UInt_t AliDCSMessage::GetStartTime() const {
+       //
+       // Request and MultiRequest.
+       // Returns the request start time. (begining of the time interval).
+       //
+
+        if (!(fType == kRequest || fType == kMultiRequest)) {
+                AliError("Invalid AliDCSMessage type!");
+               return 0;
+        }
+
+       return fStartTime;
+}
+
+UInt_t AliDCSMessage::GetEndTime() const {
+       //
+        // Request and MultiRequest.
+        // Returns the request start time. (end of the time interval).
+        //
+
+       
+        if (!(fType == kRequest || fType == kMultiRequest)) {
+                AliError("Invalid AliDCSMessage type!");
+                return 0;
+        }
+
+        return  fEndTime;
+}
+
+TString AliDCSMessage::GetRequestString() const {
+       //
+        // Request.
+        // Returns the request string. (alias or dp)
+        //
+
+        if (fType != kRequest) {
+                AliError("Invalid AliDCSMessage type!");
+               return TString("");
+        }
+
+       return fRequestString;
+}
+
+Bool_t AliDCSMessage::AddRequestString(const char* request) {
+       //
+        // MultRequest.
+        // Add a request to the request set.
+       // Returns kFALSE in case of invalid request (too long request string).
+       // Otherwise returns kTRUE.
+        //
+
+       
+       if (fType != kMultiRequest) {
+               AliError("Invalid AliDCSMessage type!");
+               return kFALSE;
+       }
+
+       if (strlen(request) > 255) {
+               AliError("Alias/dpName is too long! Max size 255.");
+               return kFALSE;  
+       }
+
+       fRequestStrings.Add(new TObjString(request));
+       return kTRUE;
+}
+
+void AliDCSMessage::ClearRequestStrings() {
+       //
+        // MultRequest.
+       // Clears the request set.
+        //
+
+       fRequestStrings.Delete();
+}
+
+void AliDCSMessage::GetRequestStrings(TList& result) const {
+       //
+        // MultRequest.
+        // Returns all request strings in this message.
+       // result: container where the requests are returned. Collection of
+       // TObjString.
+        //
+
+
+       if (fType != kMultiRequest) {
+               AliError("Invalid AliDCSMessage type!");
+               return;
+       }
+
+       TIter iter(&fRequestStrings);
+       TObjString* anObjString;
+       
+       while ((anObjString = (TObjString*) iter.Next())) {
+               result.Add(new TObjString(*anObjString));
+       }
+}
+
+UInt_t AliDCSMessage::GetCount() const {
+       //
+        // Count.
+        // Returns the total number of values.
+        //
+
+
+        if (fType != kCount) {
+                AliError("Invalid AliDCSMessage type!");
+                return 0;
+        }
+
+       return fCount;
+}
+
+AliSimpleValue::Type AliDCSMessage::GetSimpleValueType() const {
+       //
+        // ResultSet.
+        // Returns simple value type (see AliSimpleValue) for the values
+       // in this ResultSet.
+        //
+
+
+        if (fType != kResultSet) {
+                AliError("Invalid AliDCSMessage type!");
+                return AliSimpleValue::kInvalid;
+        }
+
+       return fSimpleValueType;
+}
+
+UInt_t AliDCSMessage::GetValueCount() const {
+       //
+        // ResultSet.
+        // Returns the count of values in this ResultSet.
+        //
+
+
+        if (fType != kResultSet) {
+                AliError("Invalid AliDCSMessage type!");
+                return 0;
+        }
+
+       return fValues.GetSize();
+}
+
+UInt_t AliDCSMessage::GetValues(TList& result) const {
+       //
+        // ResultSet.
+        // Returns the number of values got from the message.
+       // result: used to return the values. Collection of AliDCSValue.
+        //
+
+
+       if (fType != kResultSet) {
+                AliError("Invalid AliDCSMessage type!");
+                return 0;
+        }
+
+       TIter iter(&fValues);
+       AliDCSValue* aValue;
+       
+       while ((aValue = (AliDCSValue*) iter.Next())) {
+               result.Add(new AliDCSValue(*aValue));
+       }
+
+       return fValues.GetSize();
+}
+
+Bool_t AliDCSMessage::AddValue(const AliDCSValue& value) {
+       //
+       // ResultSet.
+        // Adds value to the ResultSet value list.
+       // Returns kFALSE in case of error.
+       // Otherwise returns kTRUE;
+       //
+
+       if (fType != kResultSet) {
+                AliError("Invalid AliDCSMessage type!");
+                return kFALSE;
+        }
+       
+       if (value.GetSimpleValue().GetType() != fSimpleValueType) {
+               AliError(Form("Can't add value with type %s to this message!",
+                       AliSimpleValue::GetTypeString(
+                               value.GetSimpleValue().GetType())));
+               return kFALSE;
+       }
+
+       fValues.Add(new AliDCSValue(value));
+
+       return kTRUE;
+}
+
+void AliDCSMessage::ClearValues() {
+       fValues.Delete();
+}
+
+AliDCSMessage::ErrorCode AliDCSMessage::GetErrorCode() const {
+       //
+       // Error.
+       // Returns the error code which has this error message.
+       //
+
+        if (fType != kError) {
+                AliError("Invalid AliDCSMessage type!");
+                return kNoneError;
+        }
+
+       return fErrorCode;
+}
+
+TString AliDCSMessage::GetErrorString() const {
+       //
+       // Error.
+       // Returns the error string (error description) which has this 
+       // error message.
+       //
+
+        if (GetType() != kError) {
+                AliError("Invalid AliDCSMessage type!");
+                return TString("");
+        }
+
+       return fErrorString;
+}
+
+
+void AliDCSMessage::Print(Option_t* /*option*/) const {
+
+       if (AliLog::GetGlobalDebugLevel() < 2) {
+               return;
+       }
+
+       TString printString;
+       printString += "\n <<AliDCSMessage>>\n";
+
+       printString += " Size: ";
+       printString += fMessageSize;
+       printString += '\n';
+
+       printString += " Type: ";
+       switch (GetType()) {
+               case kRequest: {
+                       printString += "Request\n";
+
+                       printString += " RequestType: ";
+                       if (GetRequestType() == kDPName) {
+                               printString += "DPName";
+                       } else {
+                               printString += "Alias";
+                       }
+                       printString += '\n';
+
+                       printString += " RequestString: ";
+                       printString += GetRequestString();
+                       printString += '\n';
+                       printString += " StartTime: ";
+                       printString += GetStartTime();
+                       printString += '\n';
+                       printString += " EndTime: ";
+                       printString += GetEndTime();
+                       printString += '\n';
+                       break;
+               }
+
+               case kCount: {
+                       printString += "Count\n";
+                       printString += " Count: ";
+                       printString += GetCount();
+                       printString += '\n';    
+                       break;
+               } 
+
+               case kResultSet: {
+                       printString += "ResultSet\n";
+                       printString += " SimpleValueType: ";
+                       printString += AliSimpleValue::GetTypeString(
+                               fSimpleValueType);
+                       printString += '\n';
+                       printString += " ValueCount: ";
+                       printString += GetValueCount();
+                       printString += '\n';
+                       break;
+               }
+
+               case kError: {
+                       printString += "Error\n";
+                       printString += " ErrorCode: ";
+                       switch (GetErrorCode()) {
+                               case AliDCSMessage::kNoneError:
+                                       printString += "NoneError";
+                                       break;
+                               case AliDCSMessage::kUnknownAliasDPName:
+                                       printString += "UnknownAliasDPName";
+                                       break;
+                               case AliDCSMessage::kInvalidTimeRange:
+                                       printString += "InvalidTimeRange";
+                                       break;
+                               case AliDCSMessage::kInvalidBufferSize:
+                                       printString += "InvalidBufferSize";
+                                       break;
+                               case AliDCSMessage::kInvalidRequest:
+                                       printString += "InvalidRequest";
+                                       break;
+                               case AliDCSMessage::kUnsupportedType:
+                                       printString += "UnsupportedType";
+                                       break;
+                               case AliDCSMessage::kUnknownError:
+                                       printString += "UnknownError";
+                                       break;
+                               default:
+                                       printString += "Invalid";
+                       }
+
+                       printString += '\n';
+                       printString += " ErrorString: ";
+                       printString += GetErrorString();
+                       printString += '\n';
+                       break;
+               }
+
+               case kMultiRequest: {
+                       printString += "MultiRequest\n";
+
+                        printString += " RequestType: ";
+                        if (GetRequestType() == kDPName) {
+                                printString += "DPName";
+                        } else {
+                                printString += "Alias";
+                        }
+                        printString += '\n';
+
+                        printString += " RequestStrings: ";
+                       TIter iter(&fRequestStrings);
+                       TObjString* anObjString;
+                       while ((anObjString = (TObjString*) iter.Next())) {
+                               printString += anObjString->String();
+                               printString += ' ';
+                       }
+                        printString += '\n';
+
+                        printString += " StartTime: ";
+                        printString += GetStartTime();
+                        printString += '\n';
+                        printString += " EndTime: ";
+                        printString += GetEndTime();
+                        printString += '\n';
+                       break;
+               }       
+
+/*             case kNext: {
+                       printString += "Next\n";
+                       break;
+               } */
+
+               default:
+                       printString += "Invalid\n";
+       }
+
+       if (AliLog::GetGlobalDebugLevel() >= 3 && fMessage) {
+               PrintBuffer(fMessage, fMessageSize, printString);
+       }
+
+       AliDebug(2, printString);
+} 
+
+Bool_t AliDCSMessage::SetRawHeader(const char* header) {
+       //
+       // Checks if the header buffer represents a valid header message.
+       // If so it creates a message buffer with the appropriate body size
+       // and returns true.
+       // If not returns false.
+       // header: header buffer
+       //
+
+       if (!ValidateHeader(header)) {
+               AliError("Invalid message header!");
+               return kFALSE;
+       }
+       
+       DestroyBuffer();
+
+       UInt_t bodySize = GetUInt(header + BODY_SIZE_OFFSET);
+       fMessageSize = HEADER_SIZE + bodySize;
+       
+       fMessage = new char[fMessageSize];
+       
+       memcpy(fMessage, header, HEADER_SIZE);
+
+       return kTRUE;
+}
+
+
+void AliDCSMessage::DestroyBuffer() {
+       //
+       // Destroy the underlying message buffer.
+       //
+       
+       if (fMessage) {
+               delete[] fMessage;
+               fMessage = NULL;
+       }
+
+       fMessageSize = 0;
+}
+
+void AliDCSMessage::PrintBuffer(const char* buffer, UInt_t size, 
+               TString& output)
+{
+
+       UInt_t index = 0;
+
+       while (index < size) {
+               if (!(index % 16)) {
+                       output += Form("\n %.4x:", index); 
+               }       
+
+               if (!(index % 8)) {
+                       output += ' ';
+               }
+
+               output += Form(" %.2x", (UChar_t) buffer[index]);
+
+               if (!((index + 1) % 16) || index + 1 == size) {
+                       if (index + 1 == size) {
+                               output.Append(' ',3 * (15 - index % 16));
+                               if (index % 16 < 8) {
+                                       output.Append(' ');
+                               }
+                       }
+
+                       output.Append(' ', 2);
+                       for (Int_t k = index % 16; k >= 0; k --) {
+                               Char_t aChar = buffer[index - k];
+                               output += isgraph(aChar) ? aChar: '.';
+                       }
+               } 
+
+               index ++;
+       }
+
+       output += '\n';
+}
diff --git a/SHUTTLE/AliDCSMessage.h b/SHUTTLE/AliDCSMessage.h
new file mode 100644 (file)
index 0000000..ef60053
--- /dev/null
@@ -0,0 +1,256 @@
+#ifndef ALI_DCS_MESSAGE_H
+#define ALI_DCS_MESSAGE_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//
+// This class is a wrapper of AliDCSMessage.
+// These are the messages which form AliDCSProtocol.
+//
+
+
+#include "AliDCSValue.h"
+
+#include <TString.h>
+#include <TList.h>
+
+#define HEADER_SIZE 8
+#define ID_OFFSET 0
+#define VERSION_OFFSET 2
+#define TYPE_OFFSET 3
+#define BODY_SIZE_OFFSET 4
+
+#define MAX_BODY_SIZE 40000
+
+#define REQUEST_TYPE_OFFSET HEADER_SIZE
+#define START_TIME_OFFSET (HEADER_SIZE + 1)
+#define END_TIME_OFFSET (HEADER_SIZE + 5)
+#define REQUEST_STRING_OFFSET (HEADER_SIZE + 9)
+
+#define REQUEST_STRINGS_OFFSET REQUEST_STRING_OFFSET
+
+#define COUNT_OFFSET HEADER_SIZE
+
+#define SVT_OFFSET HEADER_SIZE
+#define VALUE_COUNT_OFFSET (HEADER_SIZE + 1)
+#define VALUES_OFFSET (HEADER_SIZE + 5)
+
+#define ERROR_CODE_OFFSET HEADER_SIZE
+#define ERROR_STRING_OFFSET (HEADER_SIZE + 1)
+
+
+
+class AliDCSMessage: public TObject {
+public:
+       enum Type {
+               kInvalid = 0,
+               kRequest = 1,
+               kCount = 2,
+               kResultSet = 3,
+               kError = 4,
+               kMultiRequest = 5
+//             kNext = 6
+       };
+
+       enum RequestType {
+               kNoneType = 0,
+               kAlias = 1,
+               kDPName = 2     
+       };
+
+       enum ErrorCode {
+               kNoneError = 0,
+               kUnknownAliasDPName = 1,
+               kInvalidTimeRange = 2,
+               kInvalidBufferSize = 3,
+               kInvalidRequest = 4,
+               kUnsupportedType = 5,
+               kUnknownError = 255
+       };
+
+
+       AliDCSMessage();
+
+        AliDCSMessage(const char* buffer, UInt_t size);
+
+        ~AliDCSMessage();
+
+
+        void CreateRequestMessage(RequestType type, 
+               UInt_t startTime, UInt_t endTime, const char* request);
+
+        void CreateMultiRequestMessage(RequestType type, 
+               UInt_t startTime, UInt_t endTime);
+
+        void CreateCountMessage(UInt_t count);
+
+        void CreateResultSetMessage(AliSimpleValue::Type type); 
+
+        void CreateErrorMessage(ErrorCode code, const char* errorString);
+       
+       //void CreateNextMessage();
+
+       void DestroyMessage();
+
+
+        Bool_t SetRawHeader(const char* header);
+
+        void StoreToBuffer();
+
+        void LoadFromBuffer();
+
+        void DestroyBuffer();
+
+
+        Bool_t IsValid() const {return fType != kInvalid;};
+
+        UInt_t GetMessageSize() const {return fMessageSize;};
+
+        char* GetMessage() const {return fMessage;};
+
+        UInt_t GetBodySize() const {return fMessageSize - HEADER_SIZE;};
+
+        char* GetBody() const {return fMessage + HEADER_SIZE;};
+
+        Type GetType() const {return fType;};
+
+        // RequestType and MultiReuqestType Message getters
+        RequestType GetRequestType() const;
+
+        UInt_t GetStartTime() const;
+
+        UInt_t GetEndTime() const;
+
+        TString GetRequestString() const;
+
+        // MultiRequestType Message getters and setters
+        void GetRequestStrings(TList& result) const;
+
+        Bool_t AddRequestString(const char* request);
+
+        void ClearRequestStrings();
+
+        // CountType Message getters            
+        UInt_t GetCount() const;
+
+        // ResultSetType Message getters ans setters       
+        AliSimpleValue::Type GetSimpleValueType() const;
+
+        UInt_t GetValueCount() const;
+
+        UInt_t GetValues(TList& result) const;
+
+        Bool_t AddValue(const AliDCSValue& value);
+
+        void ClearValues();
+
+        // ErrorType Message getters    
+        ErrorCode GetErrorCode() const;
+
+        TString GetErrorString() const;
+
+
+        virtual void Print(Option_t* option = NULL) const;
+
+        static void PrintBuffer(const char* buf, UInt_t size, TString& output);
+
+private:
+
+       char* fMessage;
+
+       UInt_t fMessageSize;
+
+
+       Type fType;
+       
+       //Request message fields
+       RequestType fRequestType;
+       
+       UInt_t fStartTime;
+
+       UInt_t fEndTime;
+
+       TString fRequestString;
+       
+       //Count message fields
+       UInt_t fCount;
+
+       //ResultSet message fields
+       AliSimpleValue::Type fSimpleValueType;
+
+       TList fValues;
+       
+       //Error message fields
+       ErrorCode fErrorCode;
+       
+       TString fErrorString;
+
+       //MultiRequest message fields
+       TList fRequestStrings; 
+
+       
+       // Message setter helpers
+       void StoreHeader();
+
+       void StoreRequestMessage();
+
+       void StoreCountMessage();
+
+       void StoreResultSetMessage();
+
+       void StoreErrorMessage();
+
+       void StoreMultiRequestMessage();
+
+       //void StoreNextMessage();
+
+
+       Bool_t ValidateHeader(const char* buf);
+
+       void LoadRequestMessage();
+
+       void LoadCountMessage();
+
+       void LoadResultSetMessage();
+
+       void LoadErrorMessage();
+
+       void LoadMultiRequestMessage();
+
+       //void LoadNextMessage();
+
+       // Buffer helpers
+       static void SetBool(char* buf, Bool_t val);
+       
+       static void SetByte(char* buf, Char_t val);
+
+       static void SetUByte(char* buf, UChar_t val);
+
+       static void SetInt(char* buf, Int_t val);
+               
+       static void SetUInt(char* buf, UInt_t val);
+
+       static void SetFloat(char* buf, Float_t val);
+
+       static Bool_t GetBool(const char* buf);
+
+       static Char_t GetByte(const char* buf);
+
+       static UChar_t GetUByte(const char* buf);
+
+       static Int_t GetInt(const char* buf);
+
+       static UInt_t GetUInt(const char* buf);
+
+       static Float_t GetFloat(const char* buf);
+
+       static TString GetString(const char* buf, Int_t maxLen);
+
+       
+       ClassDef(AliDCSMessage, 0);
+};
+
+#endif
diff --git a/SHUTTLE/AliDCSValue.cxx b/SHUTTLE/AliDCSValue.cxx
new file mode 100644 (file)
index 0000000..10ae676
--- /dev/null
@@ -0,0 +1,59 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1.1.1  2005/09/12 22:11:40  byordano
+SHUTTLE package
+
+Revision 1.2  2005/08/30 10:53:23  byordano
+some more descriptions added
+
+*/
+
+//
+// This class represents the main value structure
+// which forms so called 'historical data' in any SCADA system.
+// When a value (which represent a parameter of some real world object)
+// is measured in the time, a value serie (called value set) is formed.
+// Each element of this value series has two fields:
+// fValue - primitive value which represents the real measured value
+// fTimestamp - timestamp when the measurement was made
+//
+
+#include "AliDCSValue.h"
+
+#include "TTimeStamp.h"
+
+ClassImp(AliDCSValue)
+
+AliDCSValue::AliDCSValue() {
+
+}
+
+AliDCSValue::AliDCSValue(const AliSimpleValue& value, UInt_t timeStamp):
+       fValue(value), fTimeStamp(timeStamp)
+{
+
+}
+
+
+TString AliDCSValue::ToString() const {
+
+       return fValue.ToString() + ", Timestmap: " +
+                TTimeStamp(fTimeStamp).AsString();
+}
+
+
diff --git a/SHUTTLE/AliDCSValue.h b/SHUTTLE/AliDCSValue.h
new file mode 100644 (file)
index 0000000..016647d
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef ALI_DCS_VALUE_H
+#define ALI_DCS_VALUE_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//
+// This class represents the main value structure
+// which forms so called 'historical data' in any SCADA system.
+//
+
+#include "AliSimpleValue.h"
+
+class AliDCSValue: public TObject {
+public:
+
+       AliDCSValue();
+       AliDCSValue(const AliSimpleValue& value, UInt_t timeStamp);
+
+       AliSimpleValue& GetSimpleValue() {return fValue;};
+       const AliSimpleValue& GetSimpleValue() const {return fValue;};  
+       void SetSimpleValue(const AliSimpleValue& value) {fValue = value;};
+
+       UInt_t GetTimeStamp() const {return fTimeStamp;};
+       void SetTimeStamp(UInt_t timeStamp) {fTimeStamp = timeStamp;};
+
+       Int_t GetSize() const {return fValue.GetSize() + sizeof(UInt_t);};
+
+       TString ToString() const;
+
+private:
+
+        AliSimpleValue fValue;
+
+        UInt_t fTimeStamp;
+
+
+       ClassDef(AliDCSValue, 1);
+};
+
+#endif
diff --git a/SHUTTLE/AliShuttle.cxx b/SHUTTLE/AliShuttle.cxx
new file mode 100644 (file)
index 0000000..c430d13
--- /dev/null
@@ -0,0 +1,246 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.2  2005/09/13 08:41:15  byordano
+default startTime endTime added
+
+Revision 1.4  2005/08/30 09:13:02  byordano
+some docs added
+
+Revision 1.3  2005/08/29 21:15:47  byordano
+some docs added
+
+*/
+
+//
+// This class is the main manager for AliShuttle. 
+// It organizes the data retrieval from DCS and call the 
+// interface methods of AliCDBPreProcessor.
+// For every detector in AliShuttleConfgi (see AliShuttleConfig),
+// data for its set of aliases is retrieved. If there is registered
+// AliCDBPreProcessor for this detector than it will be used
+// accroding to the schema (see AliCDBPreProcessor).
+// If there isn't registered AliCDBPreProcessor than the retrieved
+// data is stored automatically to the undelying AliCDBStorage.
+// For detSpec is used the alias name.
+//
+
+#include "AliShuttle.h"
+
+#include "AliCDBManager.h"
+#include "AliCDBStorage.h"
+#include "AliCDBId.h"
+#include "AliCDBPreProcessor.h"
+#include "AliShuttleConfig.h"
+#include "AliDCSClient.h"
+#include "AliLog.h"
+
+#include <TObjString.h>
+
+ClassImp(AliShuttle)
+
+AliShuttle::AliShuttle(const AliShuttleConfig* config, 
+               const char* cdbStorageURI, UInt_t timeout, Int_t retries):
+       fConfig(config), fStorage(NULL), fTimeout(timeout), fRetries(retries),
+       fCurrentRun(-1), fCurrentStartTime(0), fCurrentEndTime(0)
+{
+       //
+       // config: AliShuttleConfig used
+       // cdbStorageURI: uri of the underlying AliCDBStorage
+       // timeout: timeout used for AliDCSClient connection
+       // retries: the number of retries in case of connection error.
+       //
+
+       fStorage = AliCDBManager::Instance()->GetStorage(cdbStorageURI);
+       if (!fStorage) {
+               AliError(Form("Can't get valid storage object for %s!", 
+                       cdbStorageURI));
+       }
+}
+
+AliShuttle::AliShuttle(const AliShuttleConfig* config,
+               const AliCDBParam*  param, UInt_t timeout, Int_t retries):
+       fConfig(config), fStorage(NULL), fTimeout(timeout), fRetries(retries),
+       fCurrentRun(-1), fCurrentStartTime(0), fCurrentEndTime(0)
+{
+       //
+        // config: AliShuttleConfig used
+        // param: param of the underlying AliCDBStorage
+        // timeout: timeout used for AliDCSClient connection
+        // retries: the number of retries in case of connection error.
+        //
+
+       fStorage = AliCDBManager::Instance()->GetStorage(param);
+        if (!fStorage) {
+                AliError(Form("Can't get valid storage object for %s!", 
+                        param->GetURI().Data()));
+        }
+}
+
+AliShuttle::~AliShuttle() {
+       fPreProcessorMap.DeleteAll();
+}
+
+void AliShuttle::RegisterCDBPreProcessor(AliCDBPreProcessor* processor) {
+       //
+       // Registers new AliCDBPreProcessor.
+       // It uses GetName() for indentificator of the pre processor.
+       // The pre processor is registered it there isn't any other
+       // with the same identificator (GetName()).
+       //
+
+       if (fPreProcessorMap.GetValue(processor->GetName())) {
+               AliWarning(Form("AliCDBPreProcessor %s is already registered!",
+                       processor->GetName()));
+               return;
+       }
+
+       fPreProcessorMap.Add(new TObjString(processor->GetName()), processor);
+       processor->SetShuttle(this);
+}
+
+Bool_t AliShuttle::Store(const char* detector, const char* specType,
+               TObject* object, AliCDBMetaData* metaData)
+{
+       if (!fStorage) {
+               AliError("Invalid storage object!");
+               return kFALSE;
+       }
+
+       AliCDBId id(AliCDBPath(detector, "DCS", specType), 
+               GetCurrentRun(), GetCurrentRun());
+       return fStorage->Put(object, id, metaData);
+}
+
+void AliShuttle::Process(Int_t run, UInt_t startTime, UInt_t endTime) {
+       //
+       // Makes data retrieval for all detectors in the configuration. 
+       // run: is the run number used
+       // startTime: is the run start time
+       // endTime: is the run end time
+       //
+
+       TIter iter(fConfig->GetDetectors());    
+       TObjString* aDetector;
+       while ((aDetector = (TObjString*) iter.Next())) {
+               Process(run, startTime, endTime, aDetector->String());
+       }
+}
+
+void AliShuttle::Process(Int_t run, UInt_t startTime, UInt_t endTime,
+               const char* detector)
+{
+       //
+        // Makes data retrieval just for one specific detector. 
+       // Threre should be a configuration for this detector.
+        // run: is the run number used
+        // startTime: is the run start time
+        // endTime: is the run end time
+        // detector: detector for which the retrieval will be made
+       //
+
+       AliInfo(Form("Retrieving values for %s, run %d", detector, run));
+
+       if (!fConfig->HasDetector(detector)) {
+               AliError(Form("There isn't any configuration for %s",
+                               detector));
+               return;
+       }
+
+       fCurrentRun = run;
+       fCurrentStartTime = startTime;
+       fCurrentEndTime = endTime;
+
+       TString host(fConfig->GetHost(detector));
+       Int_t port = fConfig->GetPort(detector);
+
+       AliCDBPreProcessor* aPreProcessor = 
+               (AliCDBPreProcessor*) fPreProcessorMap.GetValue(detector);
+
+       TIter iter(fConfig->GetAliases(detector));
+       TObjString* anAlias;
+
+       if (aPreProcessor) {
+               aPreProcessor->Initialize(run, startTime, endTime);
+
+               TList valueSet;
+               while ((anAlias = (TObjString*) iter.Next())) {
+                       Bool_t result = GetValueSet(host, port, 
+                                       anAlias->String(), valueSet);
+                       
+                       aPreProcessor->Process(anAlias->String(), valueSet, 
+                                       !result);
+
+                        valueSet.Delete();
+                }
+
+               aPreProcessor->Finalize();      
+
+       } else {
+               AliCDBMetaData metaData;
+               metaData.SetProperty("StartTime", 
+                               new AliSimpleValue(startTime));
+               metaData.SetProperty("EndTime",
+                               new AliSimpleValue(endTime));
+               metaData.SetComment("Automatically stored by AliShuttle!");
+
+               TList valueSet;
+               while ((anAlias = (TObjString*) iter.Next())) {
+                       if (GetValueSet(host, port, anAlias->String(), 
+                               valueSet)) {
+                               if (!Store(detector, anAlias->String(),
+                                       &valueSet, &metaData)) {
+                                       AliError(Form("Can't store %s for %s!",
+                                               anAlias->String().Data(),
+                                               detector));
+                               }               
+                       }
+
+                       valueSet.Delete();
+               }
+       }
+       
+       fCurrentRun = -1;
+       fCurrentStartTime = 0;
+       fCurrentEndTime = 0;
+}
+
+Bool_t AliShuttle::GetValueSet(const char* host, Int_t port, const char* alias,
+                               TList& valueSet)
+{
+       AliDCSClient client(host, port, fTimeout, fRetries);
+       if (!client.IsConnected()) {
+               return kFALSE;  
+       }
+
+       Int_t result = client.GetAliasValues(alias, 
+               GetCurrentStartTime(), GetCurrentEndTime(), valueSet);
+
+       if (result < 0) {
+               AliError(Form("Can't get '%s'! Reason: %s",
+                       alias, AliDCSClient::GetErrorString(result)));
+
+               if (result == AliDCSClient::fgkServerError) {
+                       AliError(Form("Server error: %s",
+                               client.GetServerError().Data()));
+               }
+
+               return kFALSE;
+       }
+
+       return kTRUE;
+}
diff --git a/SHUTTLE/AliShuttle.h b/SHUTTLE/AliShuttle.h
new file mode 100644 (file)
index 0000000..b7c71ea
--- /dev/null
@@ -0,0 +1,65 @@
+#ifndef ALI_SHUTTLE_H
+#define ALI_SHUTTLE_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+
+//
+// This class is the main manager for 
+// AliShuttle. It organizes the data retrieval
+// from DCS and call the interface methods of
+// AliCDBPreProcessor.
+//
+
+#include <TObject.h>
+#include <TMap.h>
+
+class AliShuttleConfig;
+class AliCDBStorage;
+class AliCDBMetaData;
+class AliCDBParam;
+class AliCDBPreProcessor;
+
+class AliShuttle: public TObject {
+public:
+       AliShuttle(const AliShuttleConfig* config, const char* cdbStorageURI,
+               UInt_t timeout = 5000, Int_t retries = 5);
+       AliShuttle(const AliShuttleConfig* config, const AliCDBParam* param,
+               UInt_t timeout = 5000, Int_t retries = 5);
+       virtual ~AliShuttle();
+
+       void RegisterCDBPreProcessor(AliCDBPreProcessor* processor);
+       
+       void Process(Int_t run, UInt_t startTime, UInt_t endTime);
+       void Process(Int_t run, UInt_t startTime, UInt_t endTime,
+               const char* detector);
+
+       Int_t GetCurrentRun() const {return fCurrentRun;};
+       UInt_t GetCurrentStartTime() const {return fCurrentStartTime;};
+       UInt_t GetCurrentEndTime() const {return fCurrentEndTime;};
+
+       Bool_t Store(const char* detector, const char* detSpec,
+                       TObject* object, AliCDBMetaData* metaData);
+
+private:
+       const AliShuttleConfig* fConfig;
+       AliCDBStorage* fStorage;
+       UInt_t fTimeout;
+       Int_t fRetries;
+       
+       TMap fPreProcessorMap;  
+
+       Int_t fCurrentRun;
+       UInt_t fCurrentStartTime;
+       UInt_t fCurrentEndTime;
+
+       Bool_t GetValueSet(const char* host, Int_t port, const char* alias,
+                       TList& result);
+       
+       ClassDef(AliShuttle, 0);
+};
+
+#endif
diff --git a/SHUTTLE/AliShuttleConfig.cxx b/SHUTTLE/AliShuttleConfig.cxx
new file mode 100644 (file)
index 0000000..dd3e453
--- /dev/null
@@ -0,0 +1,255 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1.1.1  2005/09/12 22:11:40  byordano
+SHUTTLE package
+
+Revision 1.3  2005/08/30 09:13:02  byordano
+some docs added
+
+*/
+
+
+//
+// This class keeps the AliShuttle configuration.
+// It reads the configuration for LDAP server.
+// For every child entry in basedn which has schema type 'shuttleConfig'
+// it creates a detector configuration. This configuration includes:
+// DCS server host and port and the set of aliases for which data from
+// will be retrieved (used by AliShuttle).
+//
+
+
+#include "AliShuttleConfig.h"
+
+#include "AliLog.h"
+
+#include <TObjString.h>
+#include <TLDAPResult.h>
+#include <TLDAPEntry.h>
+#include <TLDAPAttribute.h>
+
+AliShuttleConfig::ConfigHolder::ConfigHolder(const TLDAPEntry* entry):
+       fIsValid(kFALSE)
+{
+       TLDAPAttribute* anAttribute;
+       
+       anAttribute = entry->GetAttribute("dt");
+       if (!anAttribute) {
+               AliError("Invalid configuration! Can't get detector name.");
+               return;
+       }
+       fDetector = anAttribute->GetValue();
+       if (!fDetector.Length()) {
+               AliError("Detector name can't be an empty string!")
+               return;
+       }
+
+       anAttribute = entry->GetAttribute("ipHost");
+       if (!anAttribute) {
+               AliError("Invalid configuration! Can't get ipHost.");
+               return;
+       }
+       fHost = anAttribute->GetValue();
+       if (!fHost.Length()) {
+               AliError("Host can't be an empty string!")
+               return;
+       }
+
+       anAttribute = entry->GetAttribute("ipServicePort");
+        if (!anAttribute) {
+               AliError("Invalid configuration! Can't get ipServicePort.");
+               return;
+        }
+       TString portStr = anAttribute->GetValue();
+       if (!portStr.Length()) {
+               AliError("ipServicePort can't be an empty string!")
+               return;
+       }
+       fPort = portStr.Atoi();
+
+       anAttribute = entry->GetAttribute("alias");
+        if (!anAttribute) {
+               AliError("Invalid configuration! Can't get alias attribute.");
+               return;
+       }
+       const char* anAlias;
+       while ((anAlias = anAttribute->GetValue())) {
+               fAliases.Add(new TObjString(anAlias));
+       }
+               
+       fIsValid = kTRUE;
+}
+
+AliShuttleConfig::ConfigHolder::~ConfigHolder() {
+       fAliases.Delete();
+}
+
+ClassImp(AliShuttleConfig)
+
+AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port, 
+       const char* binddn, const char* password, const char* basedn):
+       fIsValid(kFALSE)
+{
+       //
+       // host: ldap server host
+       // port: ldap server port
+       // binddn: binddn used for ldap binding (simple bind is used!).
+       // password: password for binddn
+       // basedn: this is basedn whose childeren entries which have 
+       // (objectClass=shuttleConfig) will be used as detector configurations.
+       //
+
+       TLDAPServer aServer(host, port, binddn, password);
+       
+       if (!aServer.IsConnected()) {
+               AliError(Form("Can't connect to ldap server %s:%d", 
+                               host, port));
+               return;
+       }
+
+       TLDAPResult* aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL,
+                       "(objectClass=shuttleConfig)");
+       if (!aResult) {
+               AliError(Form("Can't find configuration with base DN: %s",
+                               basedn));
+               return;
+       }
+       
+       TLDAPEntry* anEntry;
+       while ((anEntry = aResult->GetNext())) {
+               ConfigHolder* aHolder = new ConfigHolder(anEntry);
+               delete anEntry;
+
+               if (!aHolder->IsValid()) {
+                       AliError("This entry is going to be skipped!");
+                       delete aHolder;
+
+                       continue;
+               }
+
+               TObjString* detStr = new TObjString(aHolder->GetDetector());
+               fDetectorMap.Add(detStr, aHolder);
+               fDetectorList.Add(detStr);
+       }       
+       
+       delete aResult;
+
+       fIsValid = kTRUE;
+}
+
+AliShuttleConfig::~AliShuttleConfig() {
+       fDetectorMap.DeleteAll();
+}
+
+const TList* AliShuttleConfig::GetDetectors() const {
+       //
+       // returns collection of TObjString which contains the name
+       // of every detector which is in the configuration.
+       //
+
+       return &fDetectorList;
+}
+
+Bool_t AliShuttleConfig::HasDetector(const char* detector) const {
+       //
+       // checks for paricular detector in the configuration.
+       //
+       return fDetectorMap.GetValue(detector) != NULL;
+}
+
+const char* AliShuttleConfig::GetHost(const char* detector) const {
+       //
+       // returns DCS server host used by particular detector
+       //
+       
+       ConfigHolder* aHolder = (ConfigHolder*) fDetectorMap.GetValue(detector);
+       if (!aHolder) {
+               AliError(Form("There isn't configuration for detector: %s",
+                       detector));
+               return NULL;
+       }
+
+       return aHolder->GetHost();
+}
+
+Int_t AliShuttleConfig::GetPort(const char* detector) const {
+       //
+        // returns DCS server port used by particular detector
+        //
+
+
+       ConfigHolder* aHolder = (ConfigHolder*) fDetectorMap.GetValue(detector);
+        if (!aHolder) {
+                AliError(Form("There isn't configuration for detector: %s",
+                        detector));
+                return 0;
+        }
+
+       return aHolder->GetPort();
+}
+
+const TList* AliShuttleConfig::GetAliases(const char* detector) const {
+       //
+       // returns collection of TObjString which represents the set of aliases
+       // which used for data retrieval for particular detector
+       //
+
+       ConfigHolder* aHolder = (ConfigHolder*) fDetectorMap.GetValue(detector);
+        if (!aHolder) {
+                AliError(Form("There isn't configuration for detector: %s",
+                        detector));
+                return NULL;
+        }
+
+       return aHolder->GetAliases();
+}
+
+void AliShuttleConfig::Print(Option_t* /*option*/) const {
+       
+       TString result;
+       result += '\n';
+       
+       TIter iter(fDetectorMap.GetTable());
+       TPair* aPair;
+       while ((aPair = (TPair*) iter.Next())) {
+               ConfigHolder* aHolder = (ConfigHolder*) aPair->Value();
+               result += '\n';
+               result += " Detector: ";
+               result += aHolder->GetDetector();
+               result += '\n'; 
+               result += " Host: ";
+               result += aHolder->GetHost();
+               result += '\n';
+               result += " Port: ";
+               result += aHolder->GetPort();
+               result += '\n';
+
+               result += " Aliases: ";
+               const TList* aliases = aHolder->GetAliases();   
+               TIter it(aliases);              
+               TObjString* anAlias;    
+               while ((anAlias = (TObjString*) it.Next())) {
+                       result += anAlias->String();
+                       result += ' ';
+               }       
+               
+               result += '\n';
+       }
+
+       AliInfo(result);
+}
diff --git a/SHUTTLE/AliShuttleConfig.h b/SHUTTLE/AliShuttleConfig.h
new file mode 100644 (file)
index 0000000..cb53a8c
--- /dev/null
@@ -0,0 +1,71 @@
+#ifndef ALI_SHUTTLE_CONFIG_H
+#define ALI_SHUTTLE_CONFIG_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//
+// This class keeps the AliShuttle configuration.
+// It reads the configuration for LDAP server.
+//
+
+#include <TObject.h>
+#include <TString.h>
+#include <TList.h>
+#include <TMap.h>
+#include <TLDAPServer.h>
+
+class AliShuttleConfig: public TObject {
+public:
+       AliShuttleConfig(const char* host, Int_t port = LDAP_PORT, 
+                       const char* binddn = 0, const char* password = 0, 
+                       const char* basedn = "dc=alice,dc=cern,dc=ch"); 
+       virtual ~AliShuttleConfig();
+
+       Bool_t IsValid() const {return fIsValid;};
+
+       const TList* GetDetectors() const;
+
+       Bool_t HasDetector(const char* detector) const;
+       const char* GetHost(const char* detector) const;
+       Int_t GetPort(const char* detector) const;
+       const TList* GetAliases(const char* detector) const;
+
+       virtual void Print(Option_t* option = NULL) const;
+
+private:
+       
+       class ConfigHolder: public TObject {
+               TString fDetector;
+               TString fHost;
+               Int_t fPort;
+               TList fAliases;         
+               Bool_t fIsValid;
+
+       public:
+               ConfigHolder(const TLDAPEntry* entry);
+               ~ConfigHolder();
+
+               const char* GetDetector() const {return fDetector.Data();};
+               const char* GetHost() const {return fHost.Data();};
+               Int_t GetPort() const {return fPort;};
+               const TList* GetAliases() const {return &fAliases;};
+
+               Bool_t IsValid() const {return fIsValid;};
+
+               ClassDef(ConfigHolder, 0);
+       };
+
+
+       Bool_t fIsValid;
+
+       TMap fDetectorMap;
+       TList fDetectorList;    
+
+       ClassDef(AliShuttleConfig, 0);
+};
+
+#endif
+
diff --git a/SHUTTLE/AliSimpleValue.cxx b/SHUTTLE/AliSimpleValue.cxx
new file mode 100644 (file)
index 0000000..df8649e
--- /dev/null
@@ -0,0 +1,823 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1.1.1  2005/09/12 22:11:40  byordano
+SHUTTLE package
+
+Revision 1.2  2005/08/30 10:53:23  byordano
+some more descriptions added
+
+*/
+
+//
+// This class is a simple wrapper of
+// all primitive types used in PVSS SCADA system.
+//
+
+
+#include "AliSimpleValue.h"
+
+#include "AliLog.h"
+#include <TClass.h>
+
+TObject* AliSimpleValue::BoolHolder::Clone(const char* /*name*/) const {
+       return new BoolHolder(fValue);
+}
+
+Bool_t AliSimpleValue::BoolHolder::IsEqual(const TObject* obj) const {
+       
+       if (this == obj) {
+               return kTRUE;
+       }
+
+       if (BoolHolder::Class() != obj->IsA()) {
+               return kFALSE;
+       }
+
+       return fValue == ((const BoolHolder*) obj)->fValue;
+}
+
+TObject* AliSimpleValue::ByteHolder::Clone(const char* /*name*/) const {
+        return new ByteHolder(fValue);
+}
+
+Bool_t AliSimpleValue::ByteHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (ByteHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+        return fValue == ((const ByteHolder*) obj)->fValue;
+}
+
+TObject* AliSimpleValue::IntHolder::Clone(const char* /*name*/) const {
+       return new IntHolder(fValue);
+}
+
+Bool_t AliSimpleValue::IntHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (IntHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+        return fValue == ((const IntHolder*) obj)->fValue;
+}
+
+TObject* AliSimpleValue::UIntHolder::Clone(const char* /*name*/) const {
+        return new UIntHolder(fValue);
+}
+
+Bool_t AliSimpleValue::UIntHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (UIntHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+        return fValue == ((const UIntHolder*) obj)->fValue;
+}
+
+TObject* AliSimpleValue::FloatHolder::Clone(const char* /*name*/) const {
+        return new FloatHolder(fValue);
+}
+
+Bool_t AliSimpleValue::FloatHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (FloatHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+        return fValue == ((const FloatHolder*) obj)->fValue;
+}
+
+TObject* AliSimpleValue::DynBoolHolder::Clone(const char* /*name*/) const {
+        return new DynBoolHolder(fSize, fValues);
+}
+
+Bool_t AliSimpleValue::DynBoolHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (DynBoolHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+       const DynBoolHolder* other = ((const DynBoolHolder*) obj);
+       
+       if (fSize != other->fSize) {
+               return kFALSE;
+       }
+
+        return !memcmp(fValues, other->fValues, fSize * sizeof(Bool_t));
+}
+
+TObject* AliSimpleValue::DynByteHolder::Clone(const char* /*name*/) const {
+        return new DynByteHolder(fSize, fValues);
+}
+
+Bool_t AliSimpleValue::DynByteHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (DynByteHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+        const DynByteHolder* other = ((const DynByteHolder*) obj);
+
+        if (fSize != other->fSize) {
+                return kFALSE;
+        }
+
+        return !memcmp(fValues, other->fValues, fSize * sizeof(Char_t));
+}
+
+TObject* AliSimpleValue::DynIntHolder::Clone(const char* /*name*/) const {
+        return new DynIntHolder(fSize, fValues);
+}
+
+Bool_t AliSimpleValue::DynIntHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (DynIntHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+        const DynIntHolder* other = ((const DynIntHolder*) obj);
+
+        if (fSize != other->fSize) {
+                return kFALSE;
+        }
+
+        return !memcmp(fValues, other->fValues, fSize * sizeof(Int_t));
+}
+
+TObject* AliSimpleValue::DynUIntHolder::Clone(const char* /*name*/) const {
+        return new DynUIntHolder(fSize, fValues);
+}
+
+Bool_t AliSimpleValue::DynUIntHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (DynUIntHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+        const DynUIntHolder* other = ((const DynUIntHolder*) obj);
+
+        if (fSize != other->fSize) {
+                return kFALSE;
+        }
+
+        return !memcmp(fValues, other->fValues, fSize * sizeof(UInt_t));
+}
+
+TObject* AliSimpleValue::DynFloatHolder::Clone(const char* /*name*/) const {
+        return new DynFloatHolder(fSize, fValues);
+}
+
+Bool_t AliSimpleValue::DynFloatHolder::IsEqual(const TObject* obj) const {
+
+        if (this == obj) {
+                return kTRUE;
+        }
+
+        if (DynFloatHolder::Class() != obj->IsA()) {
+                return kFALSE;
+        }
+
+        const DynFloatHolder* other = ((const DynFloatHolder*) obj);
+
+        if (fSize != other->fSize) {
+                return kFALSE;
+        }
+
+        return !memcmp(fValues, other->fValues, fSize * sizeof(Float_t));
+}
+
+ClassImp(AliSimpleValue)
+
+AliSimpleValue::AliSimpleValue():
+       fHolder(NULL), fType(kInvalid)
+{
+
+}
+
+AliSimpleValue::AliSimpleValue(const AliSimpleValue& other):
+       TObject(other), fHolder(NULL), fType(other.fType)
+{
+       if (other.fHolder) {
+               fHolder = other.fHolder->Clone();
+       }
+}
+
+AliSimpleValue::AliSimpleValue(AliSimpleValue::Type type, Int_t size):
+       fHolder(NULL), fType(type)
+{
+       
+       switch (type) {
+               case kBool:
+                       fHolder = new BoolHolder();
+                       break;
+               case kByte:
+                       fHolder = new ByteHolder();
+                       break;
+               case kInt:
+                       fHolder = new IntHolder();
+                       break;
+               case kUInt:
+                       fHolder = new UIntHolder();
+                       break;
+               case kFloat:
+                       fHolder = new FloatHolder();
+                       break;
+               case kDynBool:
+                       fHolder = new DynBoolHolder(size);
+                       break;
+               case kDynByte:
+                       fHolder = new DynByteHolder(size);
+                       break;
+               case kDynInt:
+                       fHolder = new DynIntHolder(size);
+                       break;
+               case kDynUInt:
+                       fHolder = new DynUIntHolder(size);
+                       break;
+               case kDynFloat:
+                       fHolder = new DynFloatHolder(size);
+                       break;
+               default:        
+                       break;
+       }
+}
+
+AliSimpleValue::AliSimpleValue(Bool_t val) {
+
+       fType = kBool;
+       fHolder = new BoolHolder(val);
+}
+
+AliSimpleValue::AliSimpleValue(Char_t val) {
+       
+       fType = kByte;
+       fHolder = new ByteHolder(val);
+}
+
+AliSimpleValue::AliSimpleValue(Int_t val) {
+       
+       fType = kInt;
+       fHolder = new IntHolder(val);
+}
+
+AliSimpleValue::AliSimpleValue(UInt_t val) {
+       
+       fType = kUInt;
+       fHolder = new UIntHolder(val);
+}
+
+AliSimpleValue::AliSimpleValue(Float_t val) {
+
+       fType = kFloat;
+       fHolder = new FloatHolder(val);
+}
+
+AliSimpleValue::AliSimpleValue(Int_t size, const Bool_t* buf) {
+       
+       fType = kDynBool;
+       fHolder = new DynBoolHolder(size, buf);
+}
+
+AliSimpleValue::AliSimpleValue(Int_t size, const Char_t* buf) {
+
+        fType = kDynByte;
+        fHolder = new DynByteHolder(size, buf);
+}
+
+AliSimpleValue::AliSimpleValue(Int_t size, const Int_t* buf) {
+
+        fType = kDynInt;
+        fHolder = new DynIntHolder(size, buf);
+}
+
+AliSimpleValue::AliSimpleValue(Int_t size, const UInt_t* buf) {
+
+        fType = kDynUInt;
+        fHolder = new DynUIntHolder(size, buf);
+}
+
+AliSimpleValue::AliSimpleValue(Int_t size, const Float_t* buf) {
+
+        fType = kDynFloat;
+        fHolder = new DynFloatHolder(size, buf);
+}
+
+AliSimpleValue::~AliSimpleValue() {
+       
+       if (fHolder) {
+               delete fHolder;
+       }
+}
+
+AliSimpleValue& AliSimpleValue::operator=(const AliSimpleValue& other) {
+       
+       if (fHolder) {
+               delete fHolder;
+       }
+
+       fType = other.fType;
+       
+       if (other.fHolder) {
+               fHolder = other.fHolder->Clone();
+       } else {
+               fHolder = NULL;
+       }
+
+       return *this;
+}
+
+Bool_t AliSimpleValue::operator==(const AliSimpleValue& other) const {
+
+       if (fType != other.fType) {
+               return kFALSE;
+       }
+
+       if (!(fHolder && other.fHolder)) {
+               return kFALSE;
+       }
+
+       return fHolder->IsEqual(other.fHolder);
+}
+
+void AliSimpleValue::SetBool(Bool_t val) {
+
+       if (!TypeOk(kBool)) {
+               return;
+       }
+
+       ((BoolHolder*) fHolder)->fValue = val;
+}
+
+void AliSimpleValue::SetByte(Char_t val) {
+
+       if (!TypeOk(kByte)) {
+               return;
+       }
+
+       ((ByteHolder*) fHolder)->fValue = val;
+}
+
+void AliSimpleValue::SetInt(Int_t val) {
+
+       if (!TypeOk(kInt)) {
+               return;
+       }
+
+       ((IntHolder*) fHolder)->fValue = val;
+}
+
+void AliSimpleValue::SetUInt(UInt_t val) {
+
+       if (!TypeOk(kUInt)) {
+               return;
+       }
+       
+       ((UIntHolder*) fHolder)->fValue = val;
+}
+
+void AliSimpleValue::SetFloat(Float_t val) {
+
+       if (!TypeOk(kFloat)) {
+               return;
+       }
+
+       ((FloatHolder*) fHolder)->fValue = val;
+}
+
+Bool_t AliSimpleValue::GetBool() const {
+
+       if (!TypeOk(kBool)) {
+               return kFALSE;
+       }       
+
+       return ((BoolHolder*) fHolder)->fValue;
+}
+
+Char_t AliSimpleValue::GetByte() const {
+
+       if (!TypeOk(kByte)) {
+               return 0;
+       }
+       
+        return ((ByteHolder*) fHolder)->fValue;
+}
+
+Int_t AliSimpleValue::GetInt() const {
+
+       if (!TypeOk(kInt)) {
+               return 0;
+       }
+        return ((IntHolder*) fHolder)->fValue;
+}
+
+UInt_t AliSimpleValue::GetUInt() const {
+
+       if (!TypeOk(kUInt)) {
+               return 0;
+        }
+
+        return ((UIntHolder*) fHolder)->fValue;
+}
+
+Float_t AliSimpleValue::GetFloat() const {
+
+       if (!TypeOk(kFloat)) {
+               return 0;
+       }
+
+        return ((FloatHolder*) fHolder)->fValue;
+}
+
+void AliSimpleValue::SetDynBool(Int_t n, Bool_t val) {
+       
+       if (!TypeOk(kDynBool)) {
+               return;
+       }
+
+       if (!BoundsOk(n)) {
+               return;
+       }
+
+       ((DynBoolHolder*) fHolder)->fValues[n] = val;
+}
+
+void AliSimpleValue::SetDynByte(Int_t n, Char_t val) {
+
+       if (!TypeOk(kDynByte)) {
+                return;
+        }
+
+        if (!BoundsOk(n)) {
+                return;
+        }
+
+        ((DynByteHolder*) fHolder)->fValues[n] = val;
+}
+
+void AliSimpleValue::SetDynInt(Int_t n, Int_t val) {
+
+        if (!TypeOk(kDynInt)) {
+                return;
+        }
+
+        if (!BoundsOk(n)) {
+                return;
+        }
+
+        ((DynIntHolder*) fHolder)->fValues[n] = val;
+}
+
+void AliSimpleValue::SetDynUInt(Int_t n, UInt_t val) {
+
+        if (!TypeOk(kDynUInt)) {
+                return;
+        }
+
+        if (!BoundsOk(n)) {
+                return;
+        }
+
+        ((DynUIntHolder*) fHolder)->fValues[n] = val;
+}
+
+void AliSimpleValue::SetDynFloat(Int_t n, Float_t val) {
+
+        if (!TypeOk(kDynFloat)) {
+                return;
+        }
+
+        if (!BoundsOk(n)) {
+                return;
+        }
+
+        ((DynFloatHolder*) fHolder)->fValues[n] = val;
+}
+
+Bool_t AliSimpleValue::GetDynBool(Int_t n) const {
+
+       if (!TypeOk(kDynBool)) {
+                return kFALSE;
+        }
+
+        if (!BoundsOk(n)) {
+                return kFALSE;
+        }
+
+       return ((DynBoolHolder*) fHolder)->fValues[n];
+}
+
+Char_t AliSimpleValue::GetDynByte(Int_t n) const {
+
+        if (!TypeOk(kDynByte)) {
+                return 0;
+        }
+
+        if (!BoundsOk(n)) {
+                return 0;
+        }
+
+        return ((DynByteHolder*) fHolder)->fValues[n];
+}
+
+Int_t AliSimpleValue::GetDynInt(Int_t n) const {
+
+        if (!TypeOk(kDynInt)) {
+                return 0;
+        }
+
+        if (!BoundsOk(n)) {
+                return 0;
+        }
+
+        return ((DynIntHolder*) fHolder)->fValues[n];
+}
+
+UInt_t AliSimpleValue::GetDynUInt(Int_t n) const {
+
+        if (!TypeOk(kDynUInt)) {
+                return 0;
+        }
+
+        if (!BoundsOk(n)) {
+                return 0;
+        }
+
+        return ((DynUIntHolder*) fHolder)->fValues[n];
+}
+
+Float_t AliSimpleValue::GetDynFloat(Int_t n) const {
+
+        if (!TypeOk(kDynFloat)) {
+                return 0;
+        }
+
+        if (!BoundsOk(n)) {
+                return 0;
+        }
+
+        return ((DynFloatHolder*) fHolder)->fValues[n];
+}
+
+Bool_t AliSimpleValue::TypeOk(AliSimpleValue::Type type) const {
+
+       if (fType != type) {
+               AliError(Form("SimpleValue type is not %s!", 
+                       GetTypeString(type)));
+               return kFALSE;
+       }
+
+       return kTRUE;
+}
+
+Bool_t AliSimpleValue::BoundsOk(Int_t n) const {
+
+       switch (fType) {
+               case kDynBool:
+               case kDynByte:
+               case kDynInt:
+               case kDynUInt:
+               case kDynFloat: {
+                       Int_t size = ((DynHolder*) fHolder)->fSize;
+                       if (n < 0 || n >= size) {
+                               AliError(Form("Index %d out of bounds!", n));
+                               return kFALSE;
+                       }
+                       return kTRUE;
+               }
+               case kBool:
+               case kByte:
+               case kInt:
+               case kUInt:
+               case kFloat:
+                       AliError(Form("SimpleValue type %s is not dynamic!",
+                               GetTypeString(fType)));
+                       return kFALSE;
+               default:
+                       AliError("Invalid or unknown type!");
+                       return kFALSE;
+       }
+}
+
+Int_t AliSimpleValue::GetDynamicSize() const {
+       //
+       // returns the size of dynamic type or 0 in case of 
+       // none dynamic type.
+       //
+
+       if (!fHolder) {
+               return 0;
+       }
+
+       if (!fHolder->IsA()->InheritsFrom(DynHolder::Class())) {
+               return 0;
+       }
+
+       return ((DynHolder*) fHolder)->fSize;
+}
+
+TString AliSimpleValue::ToString() const {
+       
+       TString result;
+       
+       result += "Type: ";
+       result += GetTypeString(fType);
+       
+       result += ", Value: ";
+       switch (fType) {
+               case kBool:
+                       result += GetBool();
+                       break;
+               case kByte:
+                       result += (Int_t) GetByte();
+                       break;
+               case kInt:
+                       result += GetInt();
+                       break;
+               case kUInt:
+                       result += GetUInt();
+                       break;
+               case kFloat:
+                       result += GetFloat();
+                       break;
+               case kDynBool: {
+                               result += "[";
+                               Int_t size = GetDynamicSize();
+                               for (Int_t k = 0; k < size; k ++) {
+                                       result += GetDynBool(k);
+                                       if (k + 1 < size) {
+                                               result += ", ";
+                                       }
+                               }
+                               result += "]";
+                       }
+                       break;
+               case kDynByte: {
+                                result += "[";
+                                Int_t size = GetDynamicSize();
+                                for (Int_t k = 0; k < size; k ++) {
+                                        result += GetDynByte(k);
+                                        if (k + 1 < size) {
+                                                result += ", ";
+                                        }
+                                }
+                                result += "]";
+                        }
+                        break;
+               case kDynInt: {
+                                result += "[";
+                                Int_t size = GetDynamicSize();
+                                for (Int_t k = 0; k < size; k ++) {
+                                        result += GetDynInt(k);
+                                        if (k + 1 < size) {
+                                                result += ", ";
+                                        }
+                                }
+                                result += "]";
+                        }
+                        break;
+               case kDynUInt: {
+                                result += "[";
+                                Int_t size = GetDynamicSize();
+                                for (Int_t k = 0; k < size; k ++) {
+                                        result += GetDynUInt(k);
+                                        if (k + 1 < size) {
+                                                result += ", ";
+                                        }
+                                }
+                                result += "]";
+                        }
+                        break;
+               case kDynFloat: {
+                                result += "[";
+                                Int_t size = GetDynamicSize();
+                                for (Int_t k = 0; k < size; k ++) {
+                                        result += GetDynFloat(k);
+                                        if (k + 1 < size) {
+                                                result += ", ";
+                                        }
+                                }
+                                result += "]";
+                        }
+                        break;
+               default:
+                       result += "Unknown";            
+       }       
+
+       return result;
+}
+
+Bool_t AliSimpleValue::IsDynamic(AliSimpleValue::Type type) {
+
+        switch (type) {
+                case kDynBool:
+                case kDynByte:
+                case kDynInt:
+                case kDynUInt:
+                case kDynFloat:
+                       return kTRUE;
+               default:
+                       return kFALSE; 
+       }
+}
+
+Int_t AliSimpleValue::GetSize() const {
+       //
+       // return the number of bytes used by this value.
+       // In case of dynamic type it returns dynamic size multiplied
+       // by the size of corresponding primitive type.
+       //
+       
+       return IsDynamic(fType) ? 
+               GetDynamicSize() * AliSimpleValue::GetPrimitiveSize(fType): 
+               AliSimpleValue::GetPrimitiveSize(fType);
+} 
+
+Int_t AliSimpleValue::GetPrimitiveSize(AliSimpleValue::Type type) {
+       //
+       // returns the number of bytes used by particular primitive type
+       // or by the corresponding primitive type in case of dynamic type.
+       //
+
+
+       switch (type) {
+
+               case kBool: 
+               case kDynBool: return sizeof(Bool_t);
+               case kByte: 
+               case kDynByte: return sizeof(Char_t);
+               case kInt: 
+               case kDynInt: return sizeof(Int_t);
+               case kUInt: 
+               case kDynUInt: return sizeof(UInt_t);
+               case kFloat: 
+               case kDynFloat: return sizeof(Float_t);
+               default:
+                       return 0;
+       }
+} 
+
+const char* AliSimpleValue::GetTypeString(AliSimpleValue::Type type) {
+
+       switch (type) {
+               case kBool: return "Bool";
+               case kByte: return "Byte";
+               case kInt: return "Int";
+               case kUInt: return "UInt";
+               case kFloat: return "Float";
+               case kDynBool: return "DynBool";
+               case kDynByte: return "DynByte";
+               case kDynInt: return "DynInt";
+               case kDynUInt: return "DynUInt";
+               case kDynFloat: return "DynFloat";
+               default:
+                       return "Unknown";
+       }
+}
diff --git a/SHUTTLE/AliSimpleValue.h b/SHUTTLE/AliSimpleValue.h
new file mode 100644 (file)
index 0000000..4aa35b6
--- /dev/null
@@ -0,0 +1,332 @@
+#ifndef ALI_SIMPLE_VALUE_H
+#define ALI_SIMPLE_VALUE_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//
+// This class is a simple wrapper of
+// all primitive types used in PVSS SCADA system.
+//
+
+#include <TObject.h>
+#include <TString.h>
+
+class AliSimpleValue: public TObject {
+public:
+       enum Type {
+               kInvalid = 0,
+               kBool = 1,
+               kByte = 2,
+               kInt = 3,
+               kUInt = 4,
+               kFloat = 5,
+               kDynBool = 11,
+               kDynByte = 12,
+               kDynInt = 13,
+               kDynUInt = 14,
+               kDynFloat = 15
+       };      
+
+
+       AliSimpleValue();
+
+        AliSimpleValue(const AliSimpleValue& other);
+
+        AliSimpleValue(Type type, Int_t size = 0);
+
+        AliSimpleValue(Bool_t val);
+
+        AliSimpleValue(Char_t val);
+
+        AliSimpleValue(Int_t val);
+
+        AliSimpleValue(UInt_t val);
+
+        AliSimpleValue(Float_t val);
+
+        AliSimpleValue(Int_t size, const Bool_t* vals);
+
+        AliSimpleValue(Int_t size, const Char_t* vals);
+
+        AliSimpleValue(Int_t size, const Int_t* vals);
+
+        AliSimpleValue(Int_t size, const UInt_t* vals);
+
+        AliSimpleValue(Int_t size, const Float_t* vals);
+
+        ~AliSimpleValue();
+
+
+        AliSimpleValue& operator=(const AliSimpleValue& other);
+
+        Bool_t operator==(const AliSimpleValue& other) const;
+
+        void SetBool(Bool_t val);
+
+        void SetByte(Char_t val);
+
+        void SetInt(Int_t val);
+
+        void SetUInt(UInt_t val);
+
+        void SetFloat(Float_t val);
+
+
+        Bool_t GetBool() const;
+
+        Char_t GetByte() const;
+
+        Int_t GetInt() const;
+
+        UInt_t GetUInt() const;
+
+        Float_t GetFloat() const;
+
+
+       void SetDynBool(Int_t n, Bool_t val);
+
+        void SetDynByte(Int_t n, Char_t val);
+
+        void SetDynInt(Int_t n, Int_t val);
+
+        void SetDynUInt(Int_t n, UInt_t val);
+
+        void SetDynFloat(Int_t n, Float_t val);
+
+
+        Bool_t GetDynBool(Int_t n) const;
+
+        Char_t GetDynByte(Int_t n) const;
+
+        Int_t GetDynInt(Int_t n) const;
+
+        UInt_t GetDynUInt(Int_t n) const;
+
+        Float_t GetDynFloat(Int_t n) const;
+
+
+        Type GetType() const {return fType;};
+
+        Int_t GetSize() const;
+
+        Int_t GetDynamicSize() const;
+
+        TString ToString() const;
+
+
+        static Bool_t IsDynamic(Type type);
+
+        static Int_t GetPrimitiveSize(Type type);
+
+        static const char* GetTypeString(Type type);
+
+private:
+
+       class BoolHolder: public TObject {
+       public:
+               Bool_t fValue;
+
+               BoolHolder() {}
+
+               BoolHolder(Bool_t val):fValue(val) {}
+               
+               virtual TObject* Clone(const char* name) const; 
+       
+               virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(BoolHolder, 1);
+       };
+
+       class ByteHolder: public TObject {
+       public:
+               Char_t fValue;
+
+               ByteHolder() {};
+
+               ByteHolder(Char_t val):fValue(val) {}
+               
+               virtual TObject* Clone(const char* name) const;
+
+               virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(ByteHolder, 1);
+       };
+
+       class IntHolder: public TObject {
+       public:
+               Int_t fValue;
+
+               IntHolder() {}
+
+               IntHolder(Int_t val):fValue(val) {}
+               
+               virtual TObject* Clone(const char* name) const; 
+
+               virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(IntHolder, 1);
+       };
+
+       class UIntHolder: public TObject {
+       public:
+               UInt_t fValue;
+
+               UIntHolder() {}
+
+               UIntHolder(UInt_t val):fValue(val) {}
+               
+               virtual TObject* Clone(const char* name) const;
+
+               virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(UIntHolder, 1);
+       };
+
+       class FloatHolder: public TObject {
+       public:
+               Float_t fValue;
+
+               FloatHolder() {}
+       
+               FloatHolder(Float_t val):fValue(val) {}
+               
+               virtual TObject* Clone(const char* name) const;
+
+               virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(FloatHolder, 1);
+       };
+
+       class DynHolder: public TObject {
+       public:
+               Int_t fSize;
+
+               DynHolder(): fSize(0) {}
+               DynHolder(Int_t size): fSize(size){}
+
+               ClassDef(DynHolder, 0);
+       };
+
+       class DynBoolHolder: public DynHolder {
+       public:
+               Bool_t* fValues; //[fSize]
+
+               DynBoolHolder(): fValues(NULL) {}
+
+               DynBoolHolder(Int_t size, const Bool_t* buf = NULL):
+                       DynHolder(size) {
+                       fValues = new Bool_t[size];
+                       if (buf) memcpy(fValues, buf, size * sizeof(Bool_t));
+               }
+
+               virtual ~DynBoolHolder() {if (fValues) delete[] fValues;}
+
+               virtual TObject* Clone(const char* name) const;
+
+                virtual Bool_t IsEqual(const TObject* object) const; 
+
+               ClassDef(DynBoolHolder, 1);
+       };
+
+       class DynByteHolder: public DynHolder {
+       public:
+               Char_t* fValues; //[fSize]
+       
+               DynByteHolder(): fValues(NULL) {}
+
+               DynByteHolder(Int_t size, const Char_t* buf = NULL):
+                       DynHolder(size) {
+                       fValues = new Char_t[size];
+                       if (buf) memcpy(fValues, buf, size * sizeof(Char_t));
+               }
+
+               virtual ~DynByteHolder() {if (fValues) delete[] fValues;}
+
+               virtual TObject* Clone(const char* name) const;
+
+                virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(DynByteHolder, 1);
+       };
+
+       class DynIntHolder: public DynHolder {
+       public:
+               Int_t* fValues; //[fSize]
+
+               DynIntHolder(): fValues(NULL) {}
+
+               DynIntHolder(Int_t size, const Int_t* buf = NULL):
+                       DynHolder(size) {
+                       fValues = new Int_t[size];
+                       if (buf) memcpy(fValues, buf, size * sizeof(Int_t));
+               }
+
+               virtual ~DynIntHolder() {if (fValues) delete[] fValues;}
+
+               virtual TObject* Clone(const char* name) const;
+
+                virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(DynIntHolder, 1);
+       };
+
+       class DynUIntHolder: public DynHolder {
+       public:
+               UInt_t* fValues; //[fSize]
+
+               DynUIntHolder(): fValues(NULL) {}
+
+               DynUIntHolder(Int_t size, const UInt_t* buf = NULL):
+                       DynHolder(size) {
+                       fValues = new UInt_t[size];
+                       if (buf) memcpy(fValues, buf, size * sizeof(UInt_t));   
+               } 
+
+               virtual ~DynUIntHolder() {if (fValues) delete[] fValues;}
+
+               virtual TObject* Clone(const char* name) const;
+
+                virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(DynUIntHolder, 1);
+       };
+
+       class DynFloatHolder: public DynHolder {
+       public:
+               Float_t* fValues; //[fSize]
+
+               DynFloatHolder(): fValues(NULL) {}
+
+               DynFloatHolder(Int_t size, const Float_t* buf = NULL):
+                       DynHolder(size) {
+                       fValues = new Float_t[size];
+                       if (buf) memcpy(fValues, buf, size * sizeof(Float_t));
+               }
+
+               virtual ~DynFloatHolder() {if (fValues) delete[] fValues;}
+
+               virtual TObject* Clone(const char* name) const;
+
+                virtual Bool_t IsEqual(const TObject* object) const;
+
+               ClassDef(DynFloatHolder, 1);
+       };
+
+
+       TObject* fHolder;
+
+       Type fType;
+
+
+       Bool_t TypeOk(Type type) const;
+
+       Bool_t BoundsOk(Int_t n) const;
+
+
+       ClassDef(AliSimpleValue, 1);
+};
+
+#endif
diff --git a/SHUTTLE/SHUTTLELinkDef.h b/SHUTTLE/SHUTTLELinkDef.h
new file mode 100644 (file)
index 0000000..8adacd5
--- /dev/null
@@ -0,0 +1,38 @@
+#ifdef __CINT__
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+#pragma link off all globals;
+#pragma link off all classes;
+#pragma link off all functions;
+
+#pragma link C++ global gAlice;
+#pragma link C++ global gMC;
+// AliDCSClient classes ...
+#pragma link C++ class AliSimpleValue;
+#pragma link C++ class AliSimpleValue::BoolHolder;
+#pragma link C++ class AliSimpleValue::ByteHolder;
+#pragma link C++ class AliSimpleValue::IntHolder;
+#pragma link C++ class AliSimpleValue::UIntHolder;
+#pragma link C++ class AliSimpleValue::FloatHolder;
+#pragma link C++ class AliSimpleValue::DynHolder;
+#pragma link C++ class AliSimpleValue::DynBoolHolder;
+#pragma link C++ class AliSimpleValue::DynByteHolder;
+#pragma link C++ class AliSimpleValue::DynIntHolder;
+#pragma link C++ class AliSimpleValue::DynUIntHolder;
+#pragma link C++ class AliSimpleValue::DynFloatHolder;
+#pragma link C++ class AliDCSValue;
+
+#pragma link C++ class AliDCSMessage;
+#pragma link C++ class AliDCSClient;
+
+// Shuttle classes ...
+#pragma link C++ class  AliShuttleConfig;
+#pragma link C++ class  AliShuttleConfig::ConfigHolder;
+#pragma link C++ class  AliShuttle;
+#pragma link C++ class  AliCDBPreProcessor;
+
+#endif
diff --git a/SHUTTLE/doc/Makefile b/SHUTTLE/doc/Makefile
new file mode 100644 (file)
index 0000000..ddf5de9
--- /dev/null
@@ -0,0 +1,22 @@
+
+.PHONY: all
+
+all: doc.ps
+
+doc.ps: doc.dvi
+       dvips -o doc.ps doc.dvi
+
+doc.dvi: doc.tex
+       latex doc.tex
+       latex doc.tex
+
+clean:
+       rm -f doc.aux
+       rm -f doc.dvi
+       rm -f doc.ps
+       rm -f doc.toc
+       rm -f doc.lot
+       rm -f doc.lof
+#      rm -f doc.pdf
+       rm -f *.log
+       
diff --git a/SHUTTLE/doc/doc.tex b/SHUTTLE/doc/doc.tex
new file mode 100644 (file)
index 0000000..2c1c73f
--- /dev/null
@@ -0,0 +1,480 @@
+\documentclass[a4paper]{report}
+
+\usepackage{graphicx}
+
+\begin{document}
+
+\title{\Huge Shuttle\\\normalsize Program for automatic data retrieval from DCS}
+
+\maketitle
+
+\tableofcontents
+
+\listoftables
+
+\listoffigures
+
+\sloppy
+
+\chapter{Shuttle - Program for automatic data retrieval from DCS}
+
+\section{Overview}
+       \label{sec:Shuttle:Overview}
+       
+       In DCS data base is stored information for particular real world object (RWO)
+       (sensors, valves etc.) as temperature, voltage, state etc.  PVSS II is a SCADA 
+       (Supervisory Control and Data Acquisition) system used by DCS for control, monitoring 
+       and data acquisition. The abstract representation of any RWO is organized in
+       DataPoints (DP). Every DP has particular type which can be a composite (tree-like) structure
+       or primitive type as boolean, byte, integer, float. DP data is updated with certain refresh
+       rate (usally less than 1Hz) forming a time series. As the data points which represent
+       particular RWO are changed in time, additional attribute called 'alias' is assigned to them.
+       Every alias corresponds to the same RWO all the time.
+
+       When the value of some DP is changed, the new value and the timestamp is stored into the 
+       data base. These value/timestamp pairs form the value series for particular DP. As DCS
+       data is collected independently on the experimental runs, part of the value series 
+       corresponds to time intervals which don't belong to any run. 
+
+       Every sub-detector has a set of 'aliases' which represent some parameters (temperature, 
+       pressure, voltage etc.) relevant to its calibration.  The working schema of 
+       \emph{Shuttle} program is: collecting the data from DCS using AliDCSClient interface, 
+       running the appropriate sub-detector preprocessor (one per sub-detector, used for preliminary 
+       processing of the collected data) and storing the output of the preprocessor into the 
+       calibration data base.  
+
+\section{General schema}
+       
+       \begin{figure}
+               \begin{center}
+                       \includegraphics[width=0.9\textwidth]{pics/ShuttleSchema}
+               \end{center}
+               \caption{\emph{Shuttle} program general schema.}
+               \label{shuttle:schema}
+       \end{figure}
+
+       On figure \ref{shuttle:schema} is presented the \emph{Shuttle} program general schema:
+       \footnote{
+               All names which follow the pattern Ali$<$name$>$ are classes part of
+               AliRoot framework.
+       }
+       
+       \begin{description}
+               \item[AliShuttle] The \emph{Shuttle} program manager, holds one AliShuttleConfig and
+               one AliCDBStorage object instances. It is used to manage data retrieval from DCS 
+               \mbox{(through AliDCSClient)} and preliminary data processing. 
+
+               \item[AliShuttleConfig] Reads the configuration from LDAP server. 
+               
+               \item[AliCDBPreProcessor] The interface for every sub-detector preprocessor.
+
+               \item[AliCDBStorage] Interface to the calibration data base. Currently supports 
+               GRID and Local storage.
+
+               \item[AliShuttleTrigger] Waits for notification from DAQ when particular 
+               experimental run is finished and runs AliShuttle.
+
+               \item[AliDCSClient] Makes connection to AMANDA and communicates over AliDCSProtocol.
+
+               \item[AMANDA]\footnote {
+                       AMANDA is an abbreviation of Ali MANager for Data Access.
+               }
+               Communication layer for data access to the historical data base 
+               provided by DCS. Implements AliDCSProtocol. Communicates with PVSS DM through
+               the internal PVSS protocol.
+               \item[PVSS DM] It's a data manager, part of PVSS SCADA system used to organize the
+               interaction with the underlying data base (RDBMS, local files etc.).
+
+       \end{description}
+
+\section{AliShuttle and AliCDBPreProcessor}
+       \label{sec:shuttle:preprocessor}        
+
+       AliShuttle is the \emph{Shuttle} program manager, holds one AliShuttleConfig and
+       one AliCDBStorage object instances. It is used to manage data retrieval from DCS
+       \mbox{(through AliDCSClient)} and preliminary data processing. Only those sub-detectors 
+       for which there is a valid configuration are processed by AliShuttle.
+       Two methods are used for triggering data retrieval and preprocessing:
+       \begin{description}
+               \item \mbox{void Process(Int\_t run, UInt\_t startTime, UInt\_t endTime)}\\
+               Retrieves data for particular run which lasted in time interval
+               \mbox{startTime - endTime} for every sub-detector in the configuration.
+
+               \item \mbox{void Process(Int\_t run, UInt\_t startTime, UInt\_t endTime,
+                       const char* detector)}\\
+               Retrieves data for particular run which lasted in time interval
+               \mbox{startTime - endTime} for the specified detector.
+       \end{description}
+
+       Every subdetector can register to AliShuttle a specific preprocessor which implements 
+       \mbox{AliCDBPreProcessor} interface. The aim of this preprocessor is to process
+       (fit, average etc.) the data retrieved from DCS and create and store a specific for 
+       the sub-detector needs objects (histograms, functions etc.) which can be used during the
+       calibration process.\\
+       \mbox{AliCDBPreProcessor} is a subclass of TNamed and GetName() method is used by
+       \mbox{AliShuttle} to identify the sub-detector preprocessor.
+
+       It has one method which provides storage to the underlying AliCDBStorage object.
+       \begin{description}
+               \item \mbox{Bool\_t Store(const char* specType, TObject* object,
+                       AliCDBMetaData* metaData)}\\
+                       Stores \emph{object} with \emph{metaData} and identifier \emph{specType}.\\
+                       Returns kTRUE in case of success and kFALSE otherwise.
+       \end{description}
+
+       Following callback methods are used.
+       \begin{description}
+               \item \mbox{void Initialize(Int\_t run, UInt\_t startTime, UInt\_t endTime)}\\
+               This method is called at the beginning of data retrieval for the sub-detector. 
+               Parameters \emph{run}, \mbox{\emph{startTime}} and \mbox{\emph{endTime}}
+               specify current experimental run number and the time interval it lasted.
+               \item \mbox{void Finalize()}\\
+               This method is called at the end of data retrieval for the sub-detector.
+               \item \mbox{void Process(const char* alias, TList\& valueSet, Bool\_t hasError)}\\ 
+               This method is called for every \emph{alias} in the relative to the sub-detector 
+               set specified in the configuration.\\
+               \emph{alias} specifies the current alias being processed.\\
+               \emph{valueSet} is a collection of AliDCSValue (see. AliDCSClient) representing
+               the value series retrieved from DCS.\\
+               \emph{hasError} is an error flag indicating if some error (comunication error, 
+               data base error etc.) occurred during the data retrieval.
+
+       \end{description}
+
+       If there is a valid configuration for some sub-detector but there isn't corresponding
+       registered preprocessor, AliShuttle stores \emph{valueSet} to the calibration data base
+       by default. In this case two properties in meta data (AliCDBMetaData), contain the value
+       series time interval ("StartTime" and "EndTime" properties contian StartTime and EndTime 
+       respectively stored in AliSimpleValue object).
+
+\section{AliShuttleConfig}
+
+       AliShuttleConfig provides transparent API to the \emph{Shuttle} configuration. Currently,
+       only LDAP is used to keep the configuration. Configuration consists entries (one per 
+       sub-detector) which comprise AMANDA server host and port and set of aliases that the specific
+       sub-detector is interested in.  
+       
+\subsection{Configuration schema in LDAP}
+
+        \begin{figure}
+                \begin{center}
+                        \includegraphics[width=0.9\textwidth]{pics/ShuttleConfig}
+                \end{center}
+                \caption{\emph{Shuttle} configuration schema in LDAP.}
+                \label{shuttle:config}
+        \end{figure}
+
+       On figure \ref{shuttle:config} is presented the LDAP configuration schema.
+       Every leaf (TPC, ITS, PHOS etc.) represents the specific sub-detector configuration.
+       These entries have objectclass \emph{shuttleConfig} which imposes the attributes
+       \emph{ipHost}, \emph{ipServicePort} and \emph{alias} as compulsory. Only \emph{alias}
+       attribute is MULTI-VALUE attribute. All sub-detectors' entries belong to one base entry.
+       \footnote {
+               Default base entry distinguished name is 'dn: dc=alice,dc=cern,dc=ch'.
+       }
+       
+       LDAP access model is used to provide write access to particular sub-detector entry for
+       the relevant supporting group and annonymous read access to the whole configuration.
+
+       Here is an example of sub-detector entry in ldif format which can be written to LDAP server:
+
+       \begin{quote}
+               \#ITS config\\
+               dn: dt=ITS,dc=alice,dc=cern,dc=ch\\
+               objectClass: shuttleConfig\\
+               dt: ITS\\
+               ipHost: 192.168.39.23\\
+               ipServicePort: 4242\\
+               alias: HighVol01\\
+               alias: HighVol02\\
+       \end{quote}
+
+\subsection{Class overview}
+       AliShuttleConfig reads the configuration from LDAP server on the object creation.\\
+       Following methods are used to access the configuration:
+       \begin{description}
+               \item \mbox{\emph{Bool\_t IsValid() const}}\\
+               Returns true if the configuration is properly read from LDAP server and false
+               in otherwise.
+
+               \item \mbox{\emph{const TList* GetDetectors() const}}\\
+               Returns collection of TObjString objects which represent detectors' name for
+               which there is a valid configuration entry.
+
+               \item \mbox{\emph{Bool\_t HasDetector(const char* detector) const}}\\
+               Returns true if there is a valid entry configuration for the specified detector.                
+               \item \mbox{\emph{const char* GetHost(const char* detector) const}}\\
+               Returns AMANDA server host for the specified detector.
+
+               \item \mbox{\emph{const char* GetHost(const char* detector) const}}\\
+               Returns AMANDA server port number for the specified detector.
+
+               \item \mbox{\emph{const TList* GetAliases(const char* detector) const}}\\
+               Returns collection of TObjString which represents the aliases for the specified 
+               detector.
+               
+       \end{description}
+
+\chapter{AliDCSClient}
+
+\section{Overview}
+       
+       AliDCSClient provides API for historical data access to DCS data base. It's completely
+       based on ROOT framework and there isn't any external libraries. It communicates
+       with AMANDA server using AliDCSProtocol. AliDCSProtocol is a simple protocol which comprises
+       set of messages (AliDCSMessage). Protocol messages are transfered over TCP/IP.
+       
+       The main functionality of AliDCSClient is to provide value series (stored into DCS 
+       data base) for paticular \emph{alias}/\emph{DataPoint}\footnote {
+               It was described in \ref{sec:Shuttle:Overview} that every real object is represented
+               by one \emph{DataPoint} at time. As this \emph{DataPoint} can be changed in some
+               moment, additional attribute called \emph{alias} is assigned to it. \emph{Alias}
+               provides constant identifier for the underlying real object. If \emph{DataPoint}
+               is changed its \emph{alias} attribute will be set the same so it will provide a 
+               constant association \mbox{\emph{alias}-real object}.
+       } in given time interval.
+       This value series is represented by collection (TList) of AliDCSValue.
+
+\section{Basic types and AliDCSValue}
+
+       Every \emph{alias} which is used in the calibration has particular type.
+       On table \ref{client:types} are listed the whole set of types. There are five primitive
+       types and the corresponding dynamic types (arrays of primitive types with arbitrary number
+       of elements).
+
+       These types are wrapped by AliSimpleValue. Every instance of this class represents a value
+       which type is one of the described. AliSimpleValue is an ROOT class and it can be 
+       serialized by the standard ROOT persistent object mechanism.
+
+       \emph{Alias} value series is a collection of value/timestamp pairs. Every such pair is 
+       realized by AliDCSValue. AliDCSValue has two fields: AliDCSVlaue.value (AliSimpleValue) 
+       and AliDCSValue.timestamp (UInt\_t). The following simple rule could be used to understand
+       the meaning of value series:
+       
+       \emph{Every alias has value (AliDCSValue.value) from the moment this value
+       became valid (AliDCSValue.timestamp) to the moment next value becomes valid.}
+
+
+
+       \begin{table}
+               \begin{center}
+                       \begin{tabular}{|l|c|}
+                               \hline
+                               Type & size in bytes\\
+                               \hline
+                               Boolean & 1\\
+                               Byte & 1\\
+                               Integer & 4\\
+                               Unsigned Integer & 4\\
+                               Float & 4\\
+                               \hline
+                               Dynamic Boolean & n * 1\\
+                               Dynamic Byte & n * 1\\
+                               Dynamic Integer & n * 4\\
+                               Dynamic Unsigned Integer & n * 4\\
+                               Dynamic Float & n * 4 \\
+                               \hline
+                       \end{tabular}
+               \end{center}
+               \label{client:types}
+               \caption[Basic types]{
+                       Basic \emph{alias} types.  For dynamic types 'n' means the 
+                       number of the elements.  Every dynamic type can have arbitrary 
+                       number of elements.
+               }
+       \end{table}
+       
+\section {AliDCSProtocol}
+
+       AliDCSProtocol is a communication protocol which comprises set of messages (AliDCSMessage).
+       Every message is composed of two parts: \emph{header} and \emph{body}. Message \emph{header}
+       (table \ref{client:protocol:header}) has fixed size and describes message \emph{body} (size
+       and type).
+
+       There are four message types every one of each has different message \emph{body} structure.
+       Below is a detailed description of every message type:
+       
+       \begin{description}
+               \item[Request] Message sent by the client to make a data request for 
+               particular \emph{alias}/\emph{DataPoint} and given time interval (table 
+               \ref{client:protocol:body:request}).
+
+               \item[Count] If precedent request was valid and data could be retrieved from data
+               base, AMANDA server sends this message to indicated the total number of values
+               corresponding to it (table \ref{client:protocol:body:count}).
+
+               \item[ResultSet] Every such message contains part of the requested data. Server sends
+               series of these messages until it returns the total amount indicated by precedent
+               Count message (table \ref{client:protocol:body:resultset}).
+
+               \item[Error] Server sends this message if some error occurred. 
+               (table \ref{client:protocol:body:error}). 
+
+       \end{description}
+
+       On figure \ref{client:protocol:flowchart} is shown the protocol flowchart.
+
+       \begin{table}
+               \begin{center}
+                       \begin{tabular}{|c|l|}
+                               \hline
+                               Byte & Meaning\\
+                               \hline
+                               0 - 1 & Message signature ('A' and 'D').\\
+                               3 & Message version (ver: 1).\\
+                               4 & Message type. Describes message \emph{body} type.\\
+                               5 - 8 & Message \emph{body} size (unsigned interger).\\
+                               \hline
+                       \end{tabular}
+               \caption[Message header structure]{Message \emph{header} structure.}
+               \label{client:protocol:header}
+               \end{center}
+       \end{table}
+
+       \begin{table}
+               \begin{center}
+                       \begin{tabular}{|p{1cm}|p{9cm}|}
+                               \hline
+                               Byte & Meaning\\
+                               \hline
+                               0 & Request identifier (1 = \emph{alias}, 2 = \emph{DataPoint}).\\
+                               1 - 4 & Request StartTime - Beginning of the requested interval
+                                       (unsigned integer).\\
+                               5 - 8 & Request EndTime - End of the requested interval
+                                       (unsigned integer).\\
+                               8 - end & Request string - Zero terminated string representing
+                                        requested \emph{alias}/\emph{DataPoint}.\\
+                               \hline
+                       \end{tabular}
+               \caption[Request message structure]{Request message \emph{body} structure.}
+               \label{client:protocol:body:request}
+               \end{center}
+       \end{table}
+
+       \begin{table}
+               \begin{center}
+                       \begin{tabular}{|p{1cm}|p{9cm}|}
+                               \hline
+                               Byte & Meaning\\
+                               \hline
+                               0 - 3 & Total number of values (unsigned integer).\\
+                               \hline
+                       \end{tabular}
+               \caption[Count message structure]{Count message \emph{body} structure.}
+               \label{client:protocol:body:count}
+               \end{center}
+       \end{table}
+
+        \begin{table}
+                \begin{center}
+                        \begin{tabular}{|p{1cm}|p{9cm}|}
+                                \hline
+                                Byte & Meaning\\
+                                \hline
+                               0 & Value type identifier (On of the basic types on table: 
+                                       \ref{client:types}). 
+                                       Specifies the type of values contained in the message.\\
+                                1 - 4 & Number of values contained in the message (unsigned integer).\\
+                               5 - end & Sequence of value/timestamp pairs. Size depends on value type.
+                                       Timestmap size is always 4 bytes (unsigned integer). \\
+                                \hline
+                        \end{tabular}
+                \caption[ResultSet message structure]{ResultSet message \emph{body} structure.}
+                \label{client:protocol:body:resultset}
+                \end{center}
+        \end{table}
+
+       \begin{table}
+                \begin{center}
+                        \begin{tabular}{|p{1cm}|p{9cm}|}
+                                \hline
+                                Byte & Meaning\\
+                                \hline
+                                0 & Server error code.\\
+                                 & (UnknownAlisDPName = 1\\
+                                 &  InvalidTimeRange = 2\\
+                                 &  InvalidBufferSize = 3\\
+                                 &  InvalidRequest = 4\\
+                                 &  UnsupportedType = 5\\
+                                 &  UnknownError = 6)\\
+                               1 - end & Server error string - Zero terminated string describing the error.\\
+                                \hline
+                        \end{tabular}
+                \caption[Error message structure]{Error message \emph{body} structure.}
+                \label{client:protocol:body:error}
+                \end{center}
+        \end{table}
+
+       \begin{figure}
+                \begin{center}
+                        \includegraphics[width=1.1\textwidth,height=0.5\textheight]{pics/Protocol}
+                \end{center}
+                \caption{AliDCSProtocol flowchart.}
+                \label{client:protocol:flowchart}
+        \end{figure}
+
+\section{AliDCSClient}
+
+       AliDCSClient provides the client API. The following methods compose the most relevant part of
+       the interface:
+       
+       \begin{description}
+       
+               \item \emph{AliDCSClient(const char* host, Int\_t port, UInt\_t timeout, Int\_t retries)} - 
+                       Class constructor. \\
+                       \emph{host} - Amanda server host.\\
+                       \emph{prot} - Amanda server port.\\
+                       \emph{time} - Timeout (in milliseconds) which is used during the communication.
+                       \emph{retries} - Number of tries after which the client considers connection for
+                                       invalid and returns the corresponding error.
+               
+               \item \emph{Bool\_t IsConnected()} - Returns kTrue in case there is a valid connection with 
+                       AMANDA server.
+               
+               \item \emph{void Close()} - Close established connection.
+
+               \item \emph{Int\_t GetDPValues(const char* dpName, UInt\_t startTime, UInt\_t endTime,
+                                TList\& result)} - Makes synchronous request to AMANDA server for particular
+                               \emph{DataPoint} and time interval.\\
+                               \emph{dpName} - Requested \emph{DataPoint}.\\
+                               \emph{startTime} - Beginning of time interval (in absolute time).\\
+                               \emph{endTime} - End of time interval (in absolute time).\\
+                               \emph{result} - In this collection (TList) is returned the result of request
+                                       (Collection of AliDCSValue).\\
+                               In case of error returns negative (error code) value otherwise returns the number
+                               of retrieved values.    
+
+               \item \emph{Int\_t GetAliasValues(const char* alias, UInt\_t startTime, UInt\_t endTime,
+                                TList\& result)} - Makes synchronous request to AMANDA server for particular
+                                \emph{alias} and time interval.\\
+                                \emph{alias} - Requested \emph{alias}.\\
+                                \emph{startTime} - Beginning of time interval (in absolute time).\\
+                                \emph{endTime} - End of time interval (in absolute time).\\
+                                \emph{result} - In this collection (TList) is returned the result of request
+                                        (Collection of AliDCSValue).\\
+                                In case of error returns negative (error code) value otherwise returns the number
+                                of retrieved values.
+       
+               \item \emph{AliDCSMessage::ErrorCode GetServerErrorCode()} - In case of Error message returned
+                       by AMANDA server this method returns the corresponding server error code.                       
+               \item \emph{const TString\& GetServerError()} - In case of Error message returned
+                       by AMANDA server this method returns the corresponding server error description.                        
+       \end{description}
+
+       The following list contains the error codes which could be returned by \mbox{\emph{GetDPValues}} and 
+       \mbox{\emph{GetAliasValues}} methods in case of error occurred (negative value returned).
+       \begin{description}
+               \item[fgkBadState] - There was no valid connection to AMANDA server when the request was made.
+
+               \item[fgkTimeout] - Specified number of retries was made and for every one the timeout was 
+                               reached before AMANDA server sends a response message or accept the connection.
+
+               \item[fgkBadMessage] - Invalid message received.
+
+               \item[fgkCommError] - TPC/IP connection error occurred.
+
+               \item[fgkServerError] - AMANDA server sent Error message. The corresponding error information
+                       can be retrieved by \mbox{\emph{GetServerErrorCode()}} and \mbox{\emph{GetServerError()}}.
+       \end{description}
+
+\end{document}
diff --git a/SHUTTLE/doc/pics/Protocol.eps b/SHUTTLE/doc/pics/Protocol.eps
new file mode 100644 (file)
index 0000000..e73c53d
--- /dev/null
@@ -0,0 +1,630 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /home/byordano/work/report/pics/Protocol
+%%Creator: Dia v0.94
+%%CreationDate: Tue Sep  6 17:59:47 2005
+%%For: byordano
+%%Orientation: Portrait
+%%Magnification: 1.0000
+%%BoundingBox: 0 0 1832 1172
+%%BeginSetup
+%%EndSetup
+%%EndComments
+%%BeginProlog
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+   /endangle exch def
+   /startangle exch def
+   /yrad exch def
+   /xrad exch def
+   /y exch def
+   /x exch def   /savematrix mtrx currentmatrix def
+   x y tr xrad yrad sc
+   0 0 1 startangle endangle arc
+   savematrix setmatrix
+   end
+} def
+
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/Times-Roman-latin1
+    /Times-Roman findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Times-Italic-latin1
+    /Times-Italic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Times-Bold-latin1
+    /Times-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+    /Times-BoldItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/AvantGarde-Book-latin1
+    /AvantGarde-Book findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+    /AvantGarde-BookOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+    /AvantGarde-Demi findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+    /AvantGarde-DemiOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Bookman-Light-latin1
+    /Bookman-Light findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+    /Bookman-LightItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Bookman-Demi-latin1
+    /Bookman-Demi findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+    /Bookman-DemiItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Courier-latin1
+    /Courier findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Courier-Oblique-latin1
+    /Courier-Oblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Courier-Bold-latin1
+    /Courier-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+    /Courier-BoldOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-latin1
+    /Helvetica findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+    /Helvetica-Oblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+    /Helvetica-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+    /Helvetica-BoldOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+    /Helvetica-Narrow findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+    /Helvetica-Narrow-Oblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+    /Helvetica-Narrow-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+    /Helvetica-Narrow-BoldOblique findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/NewCenturySchoolbook-Roman-latin1
+    /NewCenturySchoolbook-Roman findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/NewCenturySchoolbook-Italic-latin1
+    /NewCenturySchoolbook-Italic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/NewCenturySchoolbook-Bold-latin1
+    /NewCenturySchoolbook-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/NewCenturySchoolbook-BoldItalic-latin1
+    /NewCenturySchoolbook-BoldItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Palatino-Roman-latin1
+    /Palatino-Roman findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Palatino-Italic-latin1
+    /Palatino-Italic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Palatino-Bold-latin1
+    /Palatino-Bold findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+    /Palatino-BoldItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/Symbol-latin1
+    /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+    /ZapfChancery-MediumItalic findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+/ZapfDingbats-latin1
+    /ZapfDingbats findfont
+    dup length dict begin
+       {1 index /FID ne {def} {pop pop} ifelse} forall
+       /Encoding isolatin1encoding def
+    currentdict end
+definefont pop
+28.346000 -28.346000 scale
+19.842591 -41.396936 translate
+%%EndProlog
+
+
+1.000000 1.000000 1.000000 srgb
+n 22.779412 0.114706 m 22.779412 2.014706 l 29.029412 2.014706 l 29.029412 0.114706 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 22.779412 0.114706 m 22.779412 2.014706 l 29.029412 2.014706 l 29.029412 0.114706 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(START) dup sw 2 div 25.904412 ex sub 1.314706 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n 22.254412 3.864706 m 22.254412 5.764706 l 29.604412 5.764706 l 29.604412 3.864706 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 22.254412 3.864706 m 22.254412 5.764706 l 29.604412 5.764706 l 29.604412 3.864706 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(SEND REQUEST MSG) dup sw 2 div 25.929412 ex sub 5.064706 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n 25.923477 11.128418 3.405935 3.286288 0 360 ellipse f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 25.923477 11.128418 3.405935 3.286288 0 360 ellipse cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(WAIT FOR ) dup sw 2 div 25.923477 ex sub 10.978418 m gs 1 -1 sc sh gr
+(RESPONSE MSG) dup sw 2 div 25.923477 ex sub 11.778418 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 25.904412 2.014706 m 25.922834 3.377947 l s
+[] 0 sd
+0 slj
+0 slc
+n 25.927901 3.752913 m 25.671168 3.256337 l 25.922834 3.377947 l 26.171122 3.249580 l ef
+n 25.927901 3.752913 m 25.671168 3.256337 l 25.922834 3.377947 l 26.171122 3.249580 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 25.929412 5.764706 m 25.924867 7.355328 l s
+[] 0 sd
+0 slj
+0 slc
+n 25.923796 7.730327 m 25.675226 7.229615 l 25.924867 7.355328 l 26.175224 7.231043 l ef
+n 25.923796 7.730327 m 25.675226 7.229615 l 25.924867 7.355328 l 26.175224 7.231043 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 25.923477 14.414706 m 25.920825 19.869089 l s
+[] 0 sd
+0 slj
+0 slc
+n 25.920643 20.244089 m 25.670886 19.743968 l 25.920825 19.869089 l 26.170886 19.744211 l ef
+n 25.920643 20.244089 m 25.670886 19.743968 l 25.920825 19.869089 l 26.170886 19.744211 l cp s
+1.000000 1.000000 1.000000 srgb
+n 12.523663 21.312892 3.350000 3.286288 0 360 ellipse f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 12.523663 21.312892 3.350000 3.286288 0 360 ellipse cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(WAIT FOR ) dup sw 2 div 12.523663 ex sub 21.162892 m gs 1 -1 sc sh gr
+(RESPONSE MSG) dup sw 2 div 12.523663 ex sub 21.962892 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n 21.820588 20.355893 m 21.820588 22.255893 l 30.020588 22.255893 l 30.020588 20.355893 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 21.820588 20.355893 m 21.820588 22.255893 l 30.020588 22.255893 l 30.020588 20.355893 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(SET SERVER ERROR) dup sw 2 div 25.920588 ex sub 21.555893 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+n 15.873663 21.312892 m 18.847125 21.312892 l 18.847125 21.305893 l 21.333785 21.305893 l s
+[] 0 sd
+0 slj
+0 slc
+n 21.708785 21.305893 m 21.208785 21.555893 l 21.333785 21.305893 l 21.208785 21.055893 l ef
+n 21.708785 21.305893 m 21.208785 21.555893 l 21.333785 21.305893 l 21.208785 21.055893 l cp s
+1.000000 1.000000 1.000000 srgb
+n 35.270588 30.532363 m 35.270588 32.432363 l 44.720588 32.432363 l 44.720588 30.532363 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 35.270588 30.532363 m 35.270588 32.432363 l 44.720588 32.432363 l 44.720588 30.532363 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(SET ERROR CODE) dup sw 2 div 39.995588 ex sub 31.732363 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n 35.836764 39.446936 m 35.836764 41.346936 l 44.105882 41.346936 l 44.105882 39.446936 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 35.836764 39.446936 m 35.836764 41.346936 l 44.105882 41.346936 l 44.105882 39.446936 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(END) dup sw 2 div 39.971323 ex sub 40.646936 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 9.173663 21.312892 m 2.321395 21.309218 l s
+[] 0 sd
+0 slj
+0 slc
+n 1.946395 21.309017 m 2.446529 21.059285 l 2.321395 21.309218 l 2.446261 21.559285 l ef
+n 1.946395 21.309017 m 2.446529 21.059285 l 2.321395 21.309218 l 2.446261 21.559285 l cp s
+1.000000 1.000000 1.000000 srgb
+n -13.217976 17.218289 m -7.697063 21.303020 l -13.217976 25.387750 l -18.738888 21.303020 l ef
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -13.217976 17.218289 m -7.697063 21.303020 l -13.217976 25.387750 l -18.738888 21.303020 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(RECEIVED < COUNT) dup sw 2 div -13.217976 ex sub 21.553020 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+n -14.764141 11.061519 m -19.792591 11.061519 l -19.792591 21.303020 l -19.225692 21.303020 l s
+[] 0 sd
+0 slj
+0 slc
+n -18.850692 21.303020 m -19.350692 21.553020 l -19.225692 21.303020 l -19.350692 21.053020 l ef
+n -18.850692 21.303020 m -19.350692 21.553020 l -19.225692 21.303020 l -19.350692 21.053020 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+n 29.329412 11.128418 m 39.995588 11.128418 l 39.995588 30.045560 l s
+[] 0 sd
+0 slj
+0 slc
+n 39.995588 30.420560 m 39.745588 29.920560 l 39.995588 30.045560 l 40.245588 29.920560 l ef
+n 39.995588 30.420560 m 39.745588 29.920560 l 39.995588 30.045560 l 40.245588 29.920560 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 39.995588 32.432363 m 39.973007 38.960135 l s
+[] 0 sd
+0 slj
+0 slc
+n 39.971710 39.335133 m 39.723441 38.834271 l 39.973007 38.960135 l 40.223438 38.836001 l ef
+n 39.971710 39.335133 m 39.723441 38.834271 l 39.973007 38.960135 l 40.223438 38.836001 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(Timeout or bad msg received.) 30.719117 10.690515 m gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(Timeout or bad msg received) 12.595588 26.167667 m gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(Error msg received) 26.130882 15.623550 m gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(Error msg received) 16.183824 20.728770 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n -14.764141 10.111519 m -14.764141 12.011519 l -8.999436 12.011519 l -8.999436 10.111519 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -14.764141 10.111519 m -14.764141 12.011519 l -8.999436 12.011519 l -8.999436 10.111519 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(SET COUNT) dup sw 2 div -11.881789 ex sub 11.311519 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+n -13.217976 17.218289 m -13.217976 13.976491 l 12.523663 13.976491 l 12.523663 17.539801 l s
+[] 0 sd
+0 slj
+0 slc
+n 12.523663 17.914801 m 12.273663 17.414801 l 12.523663 17.539801 l 12.773663 17.414801 l ef
+n 12.523663 17.914801 m 12.273663 17.414801 l 12.523663 17.539801 l 12.773663 17.414801 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 22.517541 11.128418 m -8.512633 11.062552 l s
+[] 0 sd
+0 slj
+0 slc
+n -8.887633 11.061756 m -8.387103 10.812818 l -8.512633 11.062552 l -8.388164 11.312817 l ef
+n -8.887633 11.061756 m -8.387103 10.812818 l -8.512633 11.062552 l -8.388164 11.312817 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+n 35.286764 40.396936 m -13.236225 40.396936 l -13.236225 35.586344 l -13.251562 35.586344 l s
+0 slj
+n 35.286764 40.646936 m 35.786764 40.396936 l 35.286764 40.146936 l ef
+/Helvetica-latin1 ff 0.560000 scf sf
+(ResutlSet msg received) 2.854240 20.920741 m gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(Count msg received) 16.417748 10.711765 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n -13.251562 27.223027 m -7.690486 31.404685 l -13.251562 35.586344 l -18.812639 31.404685 l ef
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -13.251562 27.223027 m -7.690486 31.404685 l -13.251562 35.586344 l -18.812639 31.404685 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(RECEIVED > COUNT ) dup sw 2 div -13.251562 ex sub 31.654685 m gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(YES) -12.887873 16.795449 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0 slc
+n 34.720588 31.482363 m 12.523663 31.482363 l 12.523663 24.599180 l s
+0 slj
+n 34.720588 31.732363 m 35.220588 31.482363 l 34.720588 31.232363 l ef
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n -13.217976 25.387750 m -13.241499 26.673119 l s
+0 slj
+n -13.491457 26.668545 m -13.250648 27.173035 l -12.991541 26.677694 l ef
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n -7.690486 31.404685 m 12.066279 31.417296 l s
+0 slj
+n 12.066119 31.667296 m 12.566279 31.417615 l 12.066438 31.167296 l ef
+/Helvetica-latin1 ff 0.560000 scf sf
+(YES) -7.330972 31.017780 m gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(NO) -12.741176 35.991158 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n 30.020588 21.305893 m 39.548268 21.298648 l s
+0 slj
+n 39.548458 21.548647 m 40.048268 21.298267 l 39.548078 21.048648 l ef
+1.000000 1.000000 1.000000 srgb
+n -6.315409 20.358957 m -6.315409 22.258957 l 1.834591 22.258957 l 1.834591 20.358957 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -6.315409 20.358957 m -6.315409 22.258957 l 1.834591 22.258957 l 1.834591 20.358957 l cp s
+/Helvetica-latin1 ff 0.560000 scf sf
+(RECEIVED += msg.Count) dup sw 2 div -2.240409 ex sub 21.558957 m gs 1 -1 sc sh gr
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+n -6.315409 21.308957 m -7.147068 21.305383 l s
+0 slj
+n -7.145994 21.055386 m -7.647064 21.303235 l -7.148143 21.555381 l ef
+/Helvetica-latin1 ff 0.560000 scf sf
+(NO) -12.529012 25.878003 m gs 1 -1 sc sh gr
+/Helvetica-latin1 ff 0.560000 scf sf
+(Bad msg received) -1.496479 30.969941 m gs 1 -1 sc sh gr
+showpage
diff --git a/SHUTTLE/doc/pics/ShuttleConfig.eps b/SHUTTLE/doc/pics/ShuttleConfig.eps
new file mode 100644 (file)
index 0000000..29be39b
--- /dev/null
@@ -0,0 +1,1176 @@
+%!PS-Adobe-3.0 EPSF-3.0 
+%%BoundingBox: 0 0 575 755
+%%Pages: 0
+%%Creator: Sun Microsystems, Inc.
+%%Title: none
+%%CreationDate: none
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+%%BeginResource: SDRes
+/b4_inc_state save def
+/dict_count countdictstack def
+/op_count count 1 sub def
+userdict begin
+0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath
+/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if
+/bdef {bind def} bind def
+/c {setrgbcolor} bdef
+/l {neg lineto} bdef
+/rl {neg rlineto} bdef
+/lc {setlinecap} bdef
+/lj {setlinejoin} bdef
+/lw {setlinewidth} bdef
+/ml {setmiterlimit} bdef
+/ld {setdash} bdef
+/m {neg moveto} bdef
+/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef
+/r {rotate} bdef
+/t {neg translate} bdef
+/s {scale} bdef
+/sw {show} bdef
+/gs {gsave} bdef
+/gr {grestore} bdef
+/f {findfont dup length dict begin
+{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def
+currentdict end /NFont exch definefont pop /NFont findfont} bdef
+/p {closepath} bdef
+/sf {scalefont setfont} bdef
+/ef {eofill}bdef
+/pc {closepath stroke}bdef
+/ps {stroke}bdef
+/pum {matrix currentmatrix}bdef
+/pom {setmatrix}bdef
+/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%EndPageSetup
+pum
+0.02833 0.02834 s 
+0 -26640 t
+/tm matrix currentmatrix def
+gs
+tm setmatrix
+-635 -635 t 
+1 1 s 
+635 635 m 20924 635 l 20924 27274 l 635 27274 l 635 635 l eoclip newpath
+0.003 0.722 1.000 c 3675 12165 m  3325 12165 3040 11880 3040 11530 ct 3040 11180 3325 10895 3675 10895 ct 
+4025 10895 4310 11180 4310 11530 ct 4310 11880 4025 12165 3675 12165 ct 3675 12165 l 
+p ef
+0 lw 1 lj 0.003 0.003 0.003 c 3675 12165 m  3325 12165 3040 11880 3040 11530 ct 
+3040 11180 3325 10895 3675 10895 ct 4025 10895 4310 11180 4310 11530 ct 4310 11880 4025 12165 3675 12165 ct 
+3675 12165 l  pc
+0.003 0.722 1.000 c 9860 12065 m  9510 12065 9225 11780 9225 11430 ct 9225 11080 9510 10795 9860 10795 ct 
+10210 10795 10495 11080 10495 11430 ct 10495 11780 10210 12065 9860 12065 ct 
+9860 12065 l  p ef
+0.003 0.003 0.003 c 9860 12065 m  9510 12065 9225 11780 9225 11430 ct 9225 11080 9510 10795 9860 10795 ct 
+10210 10795 10495 11080 10495 11430 ct 10495 11780 10210 12065 9860 12065 ct 
+9860 12065 l  pc
+0.003 0.722 1.000 c 15740 12165 m  15390 12165 15105 11880 15105 11530 ct 15105 11180 15390 10895 15740 10895 ct 
+16090 10895 16375 11180 16375 11530 ct 16375 11880 16090 12165 15740 12165 ct 
+15740 12165 l  p ef
+0.003 0.003 0.003 c 15740 12165 m  15390 12165 15105 11880 15105 11530 ct 15105 11180 15390 10895 15740 10895 ct 
+16090 10895 16375 11180 16375 11530 ct 16375 11880 16090 12165 15740 12165 ct 
+15740 12165 l  pc
+9855 8420 m  9505 8420 9220 8135 9220 7785 ct 9220 7435 9505 7150 9855 7150 ct 
+10205 7150 10490 7435 10490 7785 ct 10490 8135 10205 8420 9855 8420 ct 9855 8420 l 
+pc
+10455 5150 m  10105 5150 9820 4865 9820 4515 ct 9820 4165 10105 3880 10455 3880 ct 
+10805 3880 11090 4165 11090 4515 ct 11090 4865 10805 5150 10455 5150 ct 10455 5150 l 
+pc
+10455 5150 m  9855 7150 l  ps
+9855 8420 m  3675 10895 l  ps
+9855 8420 m  9860 10795 l  ps
+9855 8420 m  15740 10895 l  ps
+gs
+pum
+4577 11581 t
+194 5 m  276 -23 l  276 -32 l  266 -32 265 -32 263 -32 ct 243 -32 239 -38 239 -64 ct 
+239 -384 l  236 -385 l  209 -375 189 -369 153 -360 ct 153 -351 l  157 -351 161 -351 165 -351 ct 
+186 -351 191 -346 191 -323 ct 191 -235 l  170 -253 155 -259 132 -259 ct 67 -259 15 -195 15 -115 ct 
+15 -43 57 5 119 5 ct 151 5 172 -5 191 -32 ct 191 3 l  p
+191 -57 m  191 -53 187 -46 182 -40 ct 172 -29 157 -23 141 -23 ct 94 -23 63 -68 63 -138 ct 
+63 -201 91 -243 134 -243 ct 164 -243 191 -217 191 -187 ct p ef
+427 -253 m  370 -253 l  370 -319 l  370 -324 370 -326 366 -326 ct 362 -321 359 -316 355 -310 ct 
+334 -279 309 -252 300 -250 ct 294 -246 291 -242 291 -239 ct 291 -238 291 -236 293 -235 ct 
+323 -235 l  323 -65 l  323 -18 340 5 373 5 ct 401 5 422 -7 441 -37 ct 434 -43 l 
+422 -29 412 -23 400 -23 ct 379 -23 370 -38 370 -74 ct 370 -235 l  427 -235 l 
+p ef
+741 -217 m  456 -217 l  456 -180 l  741 -180 l  p
+741 -104 m  456 -104 l  456 -67 l  741 -67 l  p ef
+901 -349 m  901 -67 l  901 -19 895 -13 848 -10 ct 848 0 l  1012 0 l  1012 -10 l 
+966 -12 958 -20 958 -61 ct 958 -349 l  989 -349 l  1053 -349 1065 -339 1078 -277 ct 
+1092 -277 l  1089 -373 l  770 -373 l  767 -277 l  781 -277 l  794 -338 807 -349 870 -349 ct 
+p ef
+1214 -164 m  1229 -163 1239 -162 1253 -162 ct 1297 -162 1328 -168 1352 -181 ct 
+1386 -199 1406 -234 1406 -271 ct 1406 -294 1398 -316 1383 -332 ct 1361 -357 1311 -373 1258 -373 ct 
+1110 -373 l  1110 -362 l  1151 -358 1157 -352 1157 -311 ct 1157 -67 l  1157 -20 1152 -14 1110 -10 ct 
+1110 0 l  1267 0 l  1267 -10 l  1223 -12 1214 -20 1214 -61 ct p
+1214 -333 m  1214 -348 1218 -352 1234 -352 ct 1310 -352 1345 -325 1345 -267 ct 
+1345 -213 1311 -184 1247 -184 ct 1235 -184 1227 -185 1214 -186 ct p ef
+1763 -253 m  1758 -381 l  1746 -381 l  1743 -369 1734 -362 1723 -362 ct 1718 -362 1709 -364 1701 -367 ct 
+1673 -376 1645 -381 1618 -381 ct 1572 -381 1525 -363 1490 -332 ct 1451 -297 1429 -245 1429 -183 ct 
+1429 -130 1446 -82 1475 -50 ct 1509 -13 1561 7 1617 7 ct 1680 7 1736 -18 1771 -63 ct 
+1760 -73 l  1719 -33 1681 -16 1635 -16 ct 1599 -16 1567 -28 1543 -49 ct 1512 -77 1495 -128 1495 -190 ct 
+1495 -292 1547 -358 1629 -358 ct 1661 -358 1690 -346 1713 -324 ct 1731 -306 1739 -290 1750 -253 ct 
+p ef
+pom
+gr
+gs
+pum
+10795 11528 t
+194 5 m  276 -23 l  276 -32 l  266 -32 265 -32 263 -32 ct 243 -32 239 -38 239 -64 ct 
+239 -384 l  236 -385 l  209 -375 189 -369 153 -360 ct 153 -351 l  157 -351 161 -351 165 -351 ct 
+186 -351 191 -346 191 -323 ct 191 -235 l  170 -253 155 -259 132 -259 ct 67 -259 15 -195 15 -115 ct 
+15 -43 57 5 119 5 ct 151 5 172 -5 191 -32 ct 191 3 l  p
+191 -57 m  191 -53 187 -46 182 -40 ct 172 -29 157 -23 141 -23 ct 94 -23 63 -68 63 -138 ct 
+63 -201 91 -243 134 -243 ct 164 -243 191 -217 191 -187 ct p ef
+427 -253 m  370 -253 l  370 -319 l  370 -324 370 -326 366 -326 ct 362 -321 359 -316 355 -310 ct 
+334 -279 309 -252 300 -250 ct 294 -246 291 -242 291 -239 ct 291 -238 291 -236 293 -235 ct 
+323 -235 l  323 -65 l  323 -18 340 5 373 5 ct 401 5 422 -7 441 -37 ct 434 -43 l 
+422 -29 412 -23 400 -23 ct 379 -23 370 -38 370 -74 ct 370 -235 l  427 -235 l 
+p ef
+741 -217 m  456 -217 l  456 -180 l  741 -180 l  p
+741 -104 m  456 -104 l  456 -67 l  741 -67 l  p ef
+822 -61 m  822 -19 815 -12 768 -10 ct 768 0 l  935 0 l  935 -10 l  889 -12 880 -20 880 -61 ct 
+880 -311 l  880 -353 888 -360 935 -362 ct 935 -373 l  768 -373 l  768 -362 l 
+816 -359 822 -353 822 -311 ct p ef
+1087 -349 m  1087 -67 l  1087 -19 1081 -13 1034 -10 ct 1034 0 l  1198 0 l 
+1198 -10 l  1152 -12 1144 -20 1144 -61 ct 1144 -349 l  1175 -349 l  1239 -349 1251 -339 1264 -277 ct 
+1278 -277 l  1275 -373 l  956 -373 l  953 -277 l  967 -277 l  980 -338 993 -349 1056 -349 ct 
+p ef
+1539 -381 m  1527 -381 l  1525 -368 1518 -362 1509 -362 ct 1503 -362 1493 -364 1484 -368 ct 
+1463 -376 1442 -381 1424 -381 ct 1400 -381 1375 -371 1356 -355 ct 1337 -337 1327 -314 1327 -284 ct 
+1327 -239 1351 -208 1415 -174 ct 1455 -153 1484 -130 1499 -108 ct 1504 -101 1506 -89 1506 -76 ct 
+1506 -38 1478 -12 1437 -12 ct 1387 -12 1351 -43 1323 -112 ct 1310 -112 l  1327 7 l 
+1340 7 l  1340 -3 1347 -11 1355 -11 ct 1362 -11 1371 -9 1382 -5 ct 1403 3 1426 7 1448 7 ct 
+1513 7 1563 -36 1563 -94 ct 1563 -141 1532 -177 1458 -217 ct 1399 -250 1375 -275 1375 -305 ct 
+1375 -336 1399 -358 1434 -358 ct 1459 -358 1483 -347 1503 -327 ct 1520 -309 1528 -294 1537 -261 ct 
+1551 -261 l  p ef
+pom
+gr
+gs
+pum
+16722 11607 t
+194 5 m  276 -23 l  276 -32 l  266 -32 265 -32 263 -32 ct 243 -32 239 -38 239 -64 ct 
+239 -384 l  236 -385 l  209 -375 189 -369 153 -360 ct 153 -351 l  157 -351 161 -351 165 -351 ct 
+186 -351 191 -346 191 -323 ct 191 -235 l  170 -253 155 -259 132 -259 ct 67 -259 15 -195 15 -115 ct 
+15 -43 57 5 119 5 ct 151 5 172 -5 191 -32 ct 191 3 l  p
+191 -57 m  191 -53 187 -46 182 -40 ct 172 -29 157 -23 141 -23 ct 94 -23 63 -68 63 -138 ct 
+63 -201 91 -243 134 -243 ct 164 -243 191 -217 191 -187 ct p ef
+427 -253 m  370 -253 l  370 -319 l  370 -324 370 -326 366 -326 ct 362 -321 359 -316 355 -310 ct 
+334 -279 309 -252 300 -250 ct 294 -246 291 -242 291 -239 ct 291 -238 291 -236 293 -235 ct 
+323 -235 l  323 -65 l  323 -18 340 5 373 5 ct 401 5 422 -7 441 -37 ct 434 -43 l 
+422 -29 412 -23 400 -23 ct 379 -23 370 -38 370 -74 ct 370 -235 l  427 -235 l 
+p ef
+741 -217 m  456 -217 l  456 -180 l  741 -180 l  p
+741 -104 m  456 -104 l  456 -67 l  741 -67 l  p ef
+871 -164 m  886 -163 896 -162 910 -162 ct 954 -162 985 -168 1009 -181 ct 1043 -199 1063 -234 1063 -271 ct 
+1063 -294 1055 -316 1040 -332 ct 1018 -357 968 -373 915 -373 ct 767 -373 l  767 -362 l 
+808 -358 814 -352 814 -311 ct 814 -67 l  814 -20 809 -14 767 -10 ct 767 0 l 
+924 0 l  924 -10 l  880 -12 871 -20 871 -61 ct p
+871 -333 m  871 -348 875 -352 891 -352 ct 967 -352 1002 -325 1002 -267 ct 1002 -213 968 -184 904 -184 ct 
+892 -184 884 -185 871 -186 ct p ef
+1188 -202 m  1188 -311 l  1188 -352 1195 -358 1238 -362 ct 1238 -373 l  1081 -373 l 
+1081 -362 l  1125 -358 1131 -352 1131 -311 ct 1131 -67 l  1131 -20 1125 -13 1081 -10 ct 
+1081 0 l  1238 0 l  1238 -10 l  1196 -14 1188 -21 1188 -61 ct 1188 -177 l 
+1359 -177 l  1359 -67 l  1359 -20 1354 -13 1310 -10 ct 1310 0 l  1466 0 l 
+1466 -10 l  1424 -14 1417 -21 1417 -61 ct 1417 -311 l  1417 -352 1423 -358 1466 -362 ct 
+1466 -373 l  1310 -373 l  1310 -362 l  1353 -358 1359 -352 1359 -311 ct 1359 -202 l 
+p ef
+1680 -381 m  1572 -381 1496 -300 1496 -186 ct 1496 -133 1514 -82 1544 -49 ct 
+1577 -14 1627 7 1677 7 ct 1788 7 1865 -71 1865 -184 ct 1865 -240 1848 -288 1817 -322 ct 
+1782 -360 l  1734 -381 l  p
+1680 -360 m  1706 -360 1732 -350 1752 -332 ct 1783 -305 1800 -252 1800 -184 ct 
+1800 -151 1793 -112 1782 -83 ct 1777 -69 1767 -55 1754 -42 ct 1734 -22 1709 -12 1679 -12 ct 
+1653 -12 1628 -22 1608 -40 ct 1579 -65 1560 -122 1560 -185 ct 1560 -243 1576 -297 1599 -324 ct 
+1621 -348 l  1649 -360 l  p ef
+2136 -381 m  2124 -381 l  2122 -368 2115 -362 2106 -362 ct 2100 -362 2090 -364 2081 -368 ct 
+2060 -376 2039 -381 2021 -381 ct 1997 -381 1972 -371 1953 -355 ct 1934 -337 1924 -314 1924 -284 ct 
+1924 -239 1948 -208 2012 -174 ct 2052 -153 2081 -130 2096 -108 ct 2101 -101 2103 -89 2103 -76 ct 
+2103 -38 2075 -12 2034 -12 ct 1984 -12 1948 -43 1920 -112 ct 1907 -112 l  1924 7 l 
+1937 7 l  1937 -3 1944 -11 1952 -11 ct 1959 -11 1968 -9 1979 -5 ct 2000 3 2023 7 2045 7 ct 
+2110 7 2160 -36 2160 -94 ct 2160 -141 2129 -177 2055 -217 ct 1996 -250 1972 -275 1972 -305 ct 
+1972 -336 1996 -358 2031 -358 ct 2056 -358 2080 -347 2100 -327 ct 2117 -309 2125 -294 2134 -261 ct 
+2148 -261 l  p ef
+pom
+gr
+gs
+pum
+10901 8009 t
+194 5 m  276 -23 l  276 -32 l  266 -32 265 -32 263 -32 ct 243 -32 239 -38 239 -64 ct 
+239 -384 l  236 -385 l  209 -375 189 -369 153 -360 ct 153 -351 l  157 -351 161 -351 165 -351 ct 
+186 -351 191 -346 191 -323 ct 191 -235 l  170 -253 155 -259 132 -259 ct 67 -259 15 -195 15 -115 ct 
+15 -43 57 5 119 5 ct 151 5 172 -5 191 -32 ct 191 3 l  p
+191 -57 m  191 -53 187 -46 182 -40 ct 172 -29 157 -23 141 -23 ct 94 -23 63 -68 63 -138 ct 
+63 -201 91 -243 134 -243 ct 164 -243 191 -217 191 -187 ct p ef
+508 -87 m  481 -48 461 -34 428 -34 ct 377 -34 341 -80 341 -144 ct 341 -203 372 -243 418 -243 ct 
+438 -243 445 -236 451 -216 ct 454 -203 l  459 -187 469 -177 481 -177 ct 496 -177 508 -188 508 -201 ct 
+508 -232 468 -259 421 -259 ct 393 -259 365 -248 342 -227 ct 313 -203 298 -164 298 -120 ct 
+298 -46 342 5 405 5 ct 430 5 453 -3 473 -20 ct 488 -34 499 -49 516 -82 ct p ef
+834 -217 m  549 -217 l  549 -180 l  834 -180 l  p
+834 -104 m  549 -104 l  549 -67 l  834 -67 l  p ef
+1100 -37 m  1090 -29 1083 -26 1075 -26 ct 1062 -26 1058 -34 1058 -59 ct 1058 -169 l 
+1058 -198 1055 -214 1047 -228 ct 1034 -248 1010 -259 977 -259 ct 924 -259 882 -231 882 -196 ct 
+882 -183 893 -172 906 -172 ct 920 -172 932 -183 932 -195 ct 932 -197 931 -200 931 -204 ct 
+929 -209 929 -214 929 -218 ct 929 -233 947 -245 970 -245 ct 997 -245 1012 -229 1012 -199 ct 
+1012 -164 l  926 -129 916 -125 892 -103 ct 879 -92 871 -73 871 -54 ct 871 -19 896 5 931 5 ct 
+955 5 979 -6 1013 -35 ct 1016 -6 1026 5 1049 5 ct 1068 5 1080 -1 1100 -22 ct p
+1012 -69 m  1012 -51 1010 -46 998 -40 ct 984 -32 968 -27 957 -27 ct 937 -27 921 -46 921 -70 ct 
+921 -72 l  921 -106 944 -126 1012 -151 ct p ef
+1111 -351 m  1115 -351 l  1121 -351 1128 -352 1132 -352 ct 1150 -352 1156 -344 1156 -318 ct 
+1156 -49 l  1156 -18 1148 -11 1112 -8 ct 1112 0 l  1245 0 l  1245 -8 l  1210 -10 1203 -16 1203 -47 ct 
+1203 -384 l  1201 -385 l  1172 -375 1150 -369 1111 -360 ct p ef
+1355 -259 m  1268 -228 l  1268 -219 l  1272 -220 l  1279 -221 1286 -222 1291 -222 ct 
+1305 -222 1310 -213 1310 -188 ct 1310 -57 l  1310 -16 1304 -10 1266 -8 ct 1266 0 l 
+1399 0 l  1399 -8 l  1362 -11 1357 -16 1357 -57 ct 1357 -257 l  p
+1329 -385 m  1313 -385 1300 -372 1300 -356 ct 1300 -340 1313 -327 1329 -327 ct 
+1345 -327 1358 -340 1358 -356 ct 1358 -372 l  1345 -385 l  p ef
+1638 -87 m  1611 -48 1591 -34 1558 -34 ct 1507 -34 1471 -80 1471 -144 ct 1471 -203 1502 -243 1548 -243 ct 
+1568 -243 1575 -236 1581 -216 ct 1584 -203 l  1589 -187 1599 -177 1611 -177 ct 
+1626 -177 1638 -188 1638 -201 ct 1638 -232 1598 -259 1551 -259 ct 1523 -259 1495 -248 1472 -227 ct 
+1443 -203 1428 -164 1428 -120 ct 1428 -46 1472 5 1535 5 ct 1560 5 1583 -3 1603 -20 ct 
+1618 -34 1629 -49 1646 -82 ct p ef
+1894 -92 m  1867 -49 1842 -33 1806 -33 ct 1774 -33 1750 -49 1733 -81 ct 1723 -103 1719 -121 1718 -156 ct 
+1892 -156 l  1887 -192 1882 -209 1868 -227 ct 1851 -247 1825 -259 1795 -259 ct 
+1767 -259 1741 -249 1719 -230 ct 1693 -206 1678 -166 1678 -120 ct 1678 -42 1718 5 1783 5 ct 
+1837 5 1879 -27 1903 -88 ct p
+1719 -174 m  1726 -218 1745 -239 1779 -239 ct 1814 -239 1827 -223 1834 -174 ct 
+p ef
+pom
+gr
+gs
+pum
+11298 4569 t
+194 5 m  276 -23 l  276 -32 l  266 -32 265 -32 263 -32 ct 243 -32 239 -38 239 -64 ct 
+239 -384 l  236 -385 l  209 -375 189 -369 153 -360 ct 153 -351 l  157 -351 161 -351 165 -351 ct 
+186 -351 191 -346 191 -323 ct 191 -235 l  170 -253 155 -259 132 -259 ct 67 -259 15 -195 15 -115 ct 
+15 -43 57 5 119 5 ct 151 5 172 -5 191 -32 ct 191 3 l  p
+191 -57 m  191 -53 187 -46 182 -40 ct 172 -29 157 -23 141 -23 ct 94 -23 63 -68 63 -138 ct 
+63 -201 91 -243 134 -243 ct 164 -243 191 -217 191 -187 ct p ef
+508 -87 m  481 -48 461 -34 428 -34 ct 377 -34 341 -80 341 -144 ct 341 -203 372 -243 418 -243 ct 
+438 -243 445 -236 451 -216 ct 454 -203 l  459 -187 469 -177 481 -177 ct 496 -177 508 -188 508 -201 ct 
+508 -232 468 -259 421 -259 ct 393 -259 365 -248 342 -227 ct 313 -203 298 -164 298 -120 ct 
+298 -46 342 5 405 5 ct 430 5 453 -3 473 -20 ct 488 -34 499 -49 516 -82 ct p ef
+834 -217 m  549 -217 l  549 -180 l  834 -180 l  p
+834 -104 m  549 -104 l  549 -67 l  834 -67 l  p ef
+1075 -87 m  1048 -48 1028 -34 995 -34 ct 944 -34 908 -80 908 -144 ct 908 -203 939 -243 985 -243 ct 
+1005 -243 1012 -236 1018 -216 ct 1021 -203 l  1026 -187 1036 -177 1048 -177 ct 
+1063 -177 1075 -188 1075 -201 ct 1075 -232 1035 -259 988 -259 ct 960 -259 932 -248 909 -227 ct 
+880 -203 865 -164 865 -120 ct 865 -46 909 5 972 5 ct 997 5 1020 -3 1040 -20 ct 
+1055 -34 1066 -49 1083 -82 ct p ef
+1331 -92 m  1304 -49 1279 -33 1243 -33 ct 1211 -33 1187 -49 1170 -81 ct 1160 -103 1156 -121 1155 -156 ct 
+1329 -156 l  1324 -192 1319 -209 1305 -227 ct 1288 -247 1262 -259 1232 -259 ct 
+1204 -259 1178 -249 1156 -230 ct 1130 -206 1115 -166 1115 -120 ct 1115 -42 1155 5 1220 5 ct 
+1274 5 1316 -27 1340 -88 ct p
+1156 -174 m  1163 -218 1182 -239 1216 -239 ct 1251 -239 1264 -223 1271 -174 ct 
+p ef
+1353 -219 m  1361 -221 1366 -222 1373 -222 ct 1387 -222 1392 -213 1392 -188 ct 
+1392 -47 l  1392 -19 1388 -15 1352 -8 ct 1352 0 l  1488 0 l  1488 -8 l  1449 -10 1440 -18 1440 -50 ct 
+1440 -177 l  1440 -195 1464 -223 1479 -223 ct 1483 -223 1488 -221 1494 -215 ct 
+1503 -207 1509 -204 1516 -204 ct 1530 -204 1538 -213 1538 -229 ct 1538 -248 1527 -259 1507 -259 ct 
+1484 -259 1467 -246 1440 -206 ct 1440 -258 l  1437 -259 l  1407 -247 1387 -239 1353 -228 ct 
+p ef
+1546 -224 m  1549 -226 1555 -226 1561 -226 ct 1577 -226 1582 -218 1582 -190 ct 
+1582 -50 l  1582 -18 1575 -10 1547 -8 ct 1547 0 l  1666 0 l  1666 -8 l  1637 -10 1629 -17 1629 -37 ct 
+1629 -196 l  1656 -221 1668 -228 1687 -228 ct 1715 -228 1728 -210 1728 -173 ct 
+1728 -55 l  1728 -20 1721 -10 1693 -8 ct 1693 0 l  1810 0 l  1810 -8 l  1782 -11 1776 -18 1776 -45 ct 
+1776 -174 l  1776 -227 1751 -259 1709 -259 ct 1683 -259 1666 -249 1627 -213 ct 
+1627 -258 l  1623 -259 l  1596 -249 1577 -243 1546 -234 ct p ef
+1866 79 m  1904 60 1929 26 1929 -7 ct 1929 -35 1910 -57 1884 -57 ct 1865 -57 1851 -44 1851 -25 ct 
+1851 -7 1864 3 1884 3 ct 1888 3 1892 2 1895 2 ct 1899 1 1899 1 1900 1 ct 1904 1 1907 4 1907 9 ct 
+1907 27 1892 47 1861 68 ct p ef
+2154 5 m  2236 -23 l  2236 -32 l  2226 -32 2225 -32 2223 -32 ct 2203 -32 2199 -38 2199 -64 ct 
+2199 -384 l  2196 -385 l  2169 -375 2149 -369 2113 -360 ct 2113 -351 l  2117 -351 2121 -351 2125 -351 ct 
+2146 -351 2151 -346 2151 -323 ct 2151 -235 l  2130 -253 2115 -259 2092 -259 ct 
+2027 -259 1975 -195 1975 -115 ct 1975 -43 2017 5 2079 5 ct 2111 5 2132 -5 2151 -32 ct 
+2151 3 l  p
+2151 -57 m  2151 -53 2147 -46 2142 -40 ct 2132 -29 2117 -23 2101 -23 ct 2054 -23 2023 -68 2023 -138 ct 
+2023 -201 2051 -243 2094 -243 ct 2124 -243 2151 -217 2151 -187 ct p ef
+2468 -87 m  2441 -48 2421 -34 2388 -34 ct 2337 -34 2301 -80 2301 -144 ct 2301 -203 2332 -243 2378 -243 ct 
+2398 -243 2405 -236 2411 -216 ct 2414 -203 l  2419 -187 2429 -177 2441 -177 ct 
+2456 -177 2468 -188 2468 -201 ct 2468 -232 2428 -259 2381 -259 ct 2353 -259 2325 -248 2302 -227 ct 
+2273 -203 2258 -164 2258 -120 ct 2258 -46 2302 5 2365 5 ct 2390 5 2413 -3 2433 -20 ct 
+2448 -34 2459 -49 2476 -82 ct p ef
+2794 -217 m  2509 -217 l  2509 -180 l  2794 -180 l  p
+2794 -104 m  2509 -104 l  2509 -67 l  2794 -67 l  p ef
+3035 -87 m  3008 -48 2988 -34 2955 -34 ct 2904 -34 2868 -80 2868 -144 ct 2868 -203 2899 -243 2945 -243 ct 
+2965 -243 2972 -236 2978 -216 ct 2981 -203 l  2986 -187 2996 -177 3008 -177 ct 
+3023 -177 3035 -188 3035 -201 ct 3035 -232 2995 -259 2948 -259 ct 2920 -259 2892 -248 2869 -227 ct 
+2840 -203 2825 -164 2825 -120 ct 2825 -46 2869 5 2932 5 ct 2957 5 2980 -3 3000 -20 ct 
+3015 -34 3026 -49 3043 -82 ct p ef
+3149 -193 m  3173 -219 3190 -228 3212 -228 ct 3240 -228 3254 -208 3254 -169 ct 
+3254 -57 l  3254 -19 3248 -11 3216 -8 ct 3216 0 l  3335 0 l  3335 -8 l  3305 -14 3301 -18 3301 -57 ct 
+3301 -169 l  3301 -228 3278 -259 3232 -259 ct 3199 -259 3175 -245 3149 -212 ct 
+3149 -383 l  3146 -385 l  3127 -378 3113 -373 3081 -364 ct 3066 -360 l  3066 -351 l 
+3068 -351 3070 -351 3073 -351 ct 3097 -351 3102 -347 3102 -323 ct 3102 -57 l 
+3102 -18 3098 -12 3066 -8 ct 3066 0 l  3187 0 l  3187 -8 l  3155 -11 3149 -18 3149 -57 ct 
+p ef
+pom
+gr
+0.753 0.753 0.753 c 7085 21825 m  3275 21825 l  3275 14840 l  10895 14840 l 
+10895 21825 l  7085 21825 l  p ef
+51 lw 1.000 0.003 0.003 c 7085 21825 m  3275 21825 l  3275 14840 l  10895 14840 l 
+10895 21825 l  7085 21825 l  pc
+0.003 0.003 0.003 c 4045 12400 m  4197 12849 l  4436 12668 l  4045 12400 l 
+p ef
+1 lw 0 lj 5715 14605 m  4262 12686 l  ps
+gs
+pum
+3916 15787 t
+141 -259 m  67 -259 16 -205 16 -127 ct 16 -51 68 5 139 5 ct 210 5 265 -54 265 -131 ct 
+265 -205 l  213 -259 l  p
+133 -243 m  181 -243 214 -189 214 -112 ct 214 -48 188 -10 146 -10 ct 124 -10 103 -23 91 -46 ct 
+76 -75 67 -115 67 -155 ct 67 -208 l  93 -243 l  p ef
+370 -384 m  367 -385 l  343 -376 328 -372 302 -364 ct 285 -360 l  285 -351 l 
+289 -351 291 -351 295 -351 ct 317 -351 322 -346 322 -323 ct 322 -30 l  322 -12 370 5 415 5 ct 
+490 5 547 -56 547 -137 ct 547 -206 505 -259 448 -259 ct 414 -259 381 -239 370 -211 ct 
+p
+370 -181 m  370 -203 396 -223 426 -223 ct 470 -223 498 -179 498 -111 ct 498 -48 471 -12 425 -12 ct 
+395 -12 370 -25 370 -39 ct p ef
+675 -257 m  673 -259 l  639 -246 618 -239 585 -228 ct 585 -219 l  587 -220 l 
+596 -221 604 -222 610 -222 ct 623 -222 628 -212 628 -188 ct 628 25 l  628 68 626 82 620 93 ct 
+617 99 609 103 601 103 ct 592 103 587 99 577 87 ct 567 75 560 69 551 69 ct 538 69 528 79 528 91 ct 
+528 109 551 122 580 122 ct 642 122 675 80 675 0 ct p
+647 -385 m  631 -385 618 -372 618 -356 ct 618 -340 631 -327 647 -327 ct 663 -327 676 -340 676 -356 ct 
+676 -372 l  663 -385 l  p ef
+954 -92 m  927 -49 902 -33 866 -33 ct 834 -33 810 -49 793 -81 ct 783 -103 779 -121 778 -156 ct 
+952 -156 l  947 -192 942 -209 928 -227 ct 911 -247 885 -259 855 -259 ct 827 -259 801 -249 779 -230 ct 
+753 -206 738 -166 738 -120 ct 738 -42 778 5 843 5 ct 897 5 939 -27 963 -88 ct p
+779 -174 m  786 -218 805 -239 839 -239 ct 874 -239 887 -223 894 -174 ct p ef
+1198 -87 m  1171 -48 1151 -34 1118 -34 ct 1067 -34 1031 -80 1031 -144 ct 1031 -203 1062 -243 1108 -243 ct 
+1128 -243 1135 -236 1141 -216 ct 1144 -203 l  1149 -187 1159 -177 1171 -177 ct 
+1186 -177 1198 -188 1198 -201 ct 1198 -232 1158 -259 1111 -259 ct 1083 -259 1055 -248 1032 -227 ct 
+1003 -203 988 -164 988 -120 ct 988 -46 1032 5 1095 5 ct 1120 5 1143 -3 1163 -20 ct 
+1178 -34 1189 -49 1206 -82 ct p ef
+1366 -253 m  1309 -253 l  1309 -319 l  1309 -324 1309 -326 1305 -326 ct 1301 -321 1298 -316 1294 -310 ct 
+1273 -279 1248 -252 1239 -250 ct 1233 -246 1230 -242 1230 -239 ct 1230 -238 1230 -236 1232 -235 ct 
+1262 -235 l  1262 -65 l  1262 -18 1279 5 1312 5 ct 1340 5 1361 -7 1380 -37 ct 
+1373 -43 l  1361 -29 1351 -23 1339 -23 ct 1318 -23 1309 -38 1309 -74 ct 1309 -235 l 
+1366 -235 l  p ef
+1729 -253 m  1724 -381 l  1712 -381 l  1709 -369 1700 -362 1689 -362 ct 1684 -362 1675 -364 1667 -367 ct 
+1639 -376 1611 -381 1584 -381 ct 1538 -381 1491 -363 1456 -332 ct 1417 -297 1395 -245 1395 -183 ct 
+1395 -130 1412 -82 1441 -50 ct 1475 -13 1527 7 1583 7 ct 1646 7 1702 -18 1737 -63 ct 
+1726 -73 l  1685 -33 1647 -16 1601 -16 ct 1565 -16 1533 -28 1509 -49 ct 1478 -77 1461 -128 1461 -190 ct 
+1461 -292 1513 -358 1595 -358 ct 1627 -358 1656 -346 1679 -324 ct 1697 -306 1705 -290 1716 -253 ct 
+p ef
+1767 -351 m  1771 -351 l  1777 -351 1784 -352 1788 -352 ct 1806 -352 1812 -344 1812 -318 ct 
+1812 -49 l  1812 -18 1804 -11 1768 -8 ct 1768 0 l  1901 0 l  1901 -8 l  1866 -10 1859 -16 1859 -47 ct 
+1859 -384 l  1857 -385 l  1828 -375 1806 -369 1767 -360 ct p ef
+2162 -37 m  2152 -29 2145 -26 2137 -26 ct 2124 -26 2120 -34 2120 -59 ct 2120 -169 l 
+2120 -198 2117 -214 2109 -228 ct 2096 -248 2072 -259 2039 -259 ct 1986 -259 1944 -231 1944 -196 ct 
+1944 -183 1955 -172 1968 -172 ct 1982 -172 1994 -183 1994 -195 ct 1994 -197 1993 -200 1993 -204 ct 
+1991 -209 1991 -214 1991 -218 ct 1991 -233 2009 -245 2032 -245 ct 2059 -245 2074 -229 2074 -199 ct 
+2074 -164 l  1988 -129 1978 -125 1954 -103 ct 1941 -92 1933 -73 1933 -54 ct 
+1933 -19 1958 5 1993 5 ct 2017 5 2041 -6 2075 -35 ct 2078 -6 2088 5 2111 5 ct 2130 5 2142 -1 2162 -22 ct 
+p
+2074 -69 m  2074 -51 2072 -46 2060 -40 ct 2046 -32 2030 -27 2019 -27 ct 1999 -27 1983 -46 1983 -70 ct 
+1983 -72 l  1983 -106 2006 -126 2074 -151 ct p ef
+2340 -177 m  2338 -253 l  2332 -253 l  2331 -252 l  2326 -248 2325 -248 2323 -248 ct 
+2319 -248 2314 -249 2307 -252 ct 2295 -256 2283 -258 2268 -258 ct 2223 -258 2191 -230 2191 -189 ct 
+2191 -157 2209 -135 2257 -108 ct 2290 -89 l  2310 -78 2319 -64 2319 -47 ct 2319 -22 2301 -6 2272 -6 ct 
+2253 -6 2236 -14 2225 -26 ct 2213 -40 2208 -53 2201 -85 ct 2192 -85 l  2192 2 l 
+2199 2 l  2203 -3 2205 -4 2212 -4 ct 2217 -4 2225 -3 2238 0 ct 2254 3 2269 5 2279 5 ct 
+2323 5 2359 -27 2359 -66 ct 2359 -94 2345 -113 2311 -133 ct 2250 -169 l  2235 -178 2226 -192 2226 -208 ct 
+2226 -230 2244 -246 2270 -246 ct 2302 -246 2319 -227 2332 -177 ct p ef
+2560 -177 m  2558 -253 l  2552 -253 l  2551 -252 l  2546 -248 2545 -248 2543 -248 ct 
+2539 -248 2534 -249 2527 -252 ct 2515 -256 2503 -258 2488 -258 ct 2443 -258 2411 -230 2411 -189 ct 
+2411 -157 2429 -135 2477 -108 ct 2510 -89 l  2530 -78 2539 -64 2539 -47 ct 2539 -22 2521 -6 2492 -6 ct 
+2473 -6 2456 -14 2445 -26 ct 2433 -40 2428 -53 2421 -85 ct 2412 -85 l  2412 2 l 
+2419 2 l  2423 -3 2425 -4 2432 -4 ct 2437 -4 2445 -3 2458 0 ct 2474 3 2489 5 2499 5 ct 
+2543 5 2579 -27 2579 -66 ct 2579 -94 2565 -113 2531 -133 ct 2470 -169 l  2455 -178 2446 -192 2446 -208 ct 
+2446 -230 2464 -246 2490 -246 ct 2522 -246 2539 -227 2552 -177 ct p ef
+2680 -258 m  2663 -258 2649 -244 2649 -226 ct 2649 -210 2663 -196 2680 -196 ct 
+2697 -196 2712 -210 2712 -226 ct 2712 -244 l  2697 -258 l  p
+2680 -56 m  2663 -56 2649 -41 2649 -24 ct 2649 -7 2663 6 2680 6 ct 2697 6 2712 -7 2712 -24 ct 
+2712 -41 l  2697 -56 l  p ef
+3077 -177 m  3075 -253 l  3069 -253 l  3068 -252 l  3063 -248 3062 -248 3060 -248 ct 
+3056 -248 3051 -249 3044 -252 ct 3032 -256 3020 -258 3005 -258 ct 2960 -258 2928 -230 2928 -189 ct 
+2928 -157 2946 -135 2994 -108 ct 3027 -89 l  3047 -78 3056 -64 3056 -47 ct 3056 -22 3038 -6 3009 -6 ct 
+2990 -6 2973 -14 2962 -26 ct 2950 -40 2945 -53 2938 -85 ct 2929 -85 l  2929 2 l 
+2936 2 l  2940 -3 2942 -4 2949 -4 ct 2954 -4 2962 -3 2975 0 ct 2991 3 3006 5 3016 5 ct 
+3060 5 3096 -27 3096 -66 ct 3096 -94 3082 -113 3048 -133 ct 2987 -169 l  2972 -178 2963 -192 2963 -208 ct 
+2963 -230 2981 -246 3007 -246 ct 3039 -246 3056 -227 3069 -177 ct p ef
+3208 -193 m  3232 -219 3249 -228 3271 -228 ct 3299 -228 3313 -208 3313 -169 ct 
+3313 -57 l  3313 -19 3307 -11 3275 -8 ct 3275 0 l  3394 0 l  3394 -8 l  3364 -14 3360 -18 3360 -57 ct 
+3360 -169 l  3360 -228 3337 -259 3291 -259 ct 3258 -259 3234 -245 3208 -212 ct 
+3208 -383 l  3205 -385 l  3186 -378 3172 -373 3140 -364 ct 3125 -360 l  3125 -351 l 
+3127 -351 3129 -351 3132 -351 ct 3156 -351 3161 -347 3161 -323 ct 3161 -57 l 
+3161 -18 3157 -12 3125 -8 ct 3125 0 l  3246 0 l  3246 -8 l  3214 -11 3208 -18 3208 -57 ct 
+p ef
+3674 -28 m  3671 -28 l  3645 -28 3639 -34 3639 -60 ct 3639 -253 l  3550 -253 l 
+3550 -244 l  3585 -242 3591 -236 3591 -208 ct 3591 -76 l  3591 -60 3588 -52 3581 -46 ct 
+3565 -33 3548 -27 3531 -27 ct 3509 -27 3491 -46 3491 -69 ct 3491 -253 l  3409 -253 l 
+3409 -245 l  3436 -244 3444 -235 3444 -209 ct 3444 -67 l  3444 -23 3471 5 3512 5 ct 
+3533 5 3555 -3 3570 -18 ct 3594 -42 l  3594 3 l  3596 5 l  3625 -6 3645 -12 3674 -20 ct 
+p ef
+3830 -253 m  3773 -253 l  3773 -319 l  3773 -324 3773 -326 3769 -326 ct 3765 -321 3762 -316 3758 -310 ct 
+3737 -279 3712 -252 3703 -250 ct 3697 -246 3694 -242 3694 -239 ct 3694 -238 3694 -236 3696 -235 ct 
+3726 -235 l  3726 -65 l  3726 -18 3743 5 3776 5 ct 3804 5 3825 -7 3844 -37 ct 
+3837 -43 l  3825 -29 3815 -23 3803 -23 ct 3782 -23 3773 -38 3773 -74 ct 3773 -235 l 
+3830 -235 l  p ef
+3987 -253 m  3930 -253 l  3930 -319 l  3930 -324 3930 -326 3926 -326 ct 3922 -321 3919 -316 3915 -310 ct 
+3894 -279 3869 -252 3860 -250 ct 3854 -246 3851 -242 3851 -239 ct 3851 -238 3851 -236 3853 -235 ct 
+3883 -235 l  3883 -65 l  3883 -18 3900 5 3933 5 ct 3961 5 3982 -7 4001 -37 ct 
+3994 -43 l  3982 -29 3972 -23 3960 -23 ct 3939 -23 3930 -38 3930 -74 ct 3930 -235 l 
+3987 -235 l  p ef
+4011 -351 m  4015 -351 l  4021 -351 4028 -352 4032 -352 ct 4050 -352 4056 -344 4056 -318 ct 
+4056 -49 l  4056 -18 4048 -11 4012 -8 ct 4012 0 l  4145 0 l  4145 -8 l  4110 -10 4103 -16 4103 -47 ct 
+4103 -384 l  4101 -385 l  4072 -375 4050 -369 4011 -360 ct p ef
+4387 -92 m  4360 -49 4335 -33 4299 -33 ct 4267 -33 4243 -49 4226 -81 ct 4216 -103 4212 -121 4211 -156 ct 
+4385 -156 l  4380 -192 4375 -209 4361 -227 ct 4344 -247 4318 -259 4288 -259 ct 
+4260 -259 4234 -249 4212 -230 ct 4186 -206 4171 -166 4171 -120 ct 4171 -42 4211 5 4276 5 ct 
+4330 5 4372 -27 4396 -88 ct p
+4212 -174 m  4219 -218 4238 -239 4272 -239 ct 4307 -239 4320 -223 4327 -174 ct 
+p ef
+4756 -253 m  4751 -381 l  4739 -381 l  4736 -369 4727 -362 4716 -362 ct 4711 -362 4702 -364 4694 -367 ct 
+4666 -376 4638 -381 4611 -381 ct 4565 -381 4518 -363 4483 -332 ct 4444 -297 4422 -245 4422 -183 ct 
+4422 -130 4439 -82 4468 -50 ct 4502 -13 4554 7 4610 7 ct 4673 7 4729 -18 4764 -63 ct 
+4753 -73 l  4712 -33 4674 -16 4628 -16 ct 4592 -16 4560 -28 4536 -49 ct 4505 -77 4488 -128 4488 -190 ct 
+4488 -292 4540 -358 4622 -358 ct 4654 -358 4683 -346 4706 -324 ct 4724 -306 4732 -290 4743 -253 ct 
+p ef
+4925 -259 m  4851 -259 4800 -205 4800 -127 ct 4800 -51 4852 5 4923 5 ct 4994 5 5049 -54 5049 -131 ct 
+5049 -205 l  4997 -259 l  p
+4917 -243 m  4965 -243 4998 -189 4998 -112 ct 4998 -48 4972 -10 4930 -10 ct 
+4908 -10 4887 -23 4875 -46 ct 4860 -75 4851 -115 4851 -155 ct 4851 -208 l  4877 -243 l 
+p ef
+5076 -224 m  5079 -226 5085 -226 5091 -226 ct 5107 -226 5112 -218 5112 -190 ct 
+5112 -50 l  5112 -18 5105 -10 5077 -8 ct 5077 0 l  5196 0 l  5196 -8 l  5167 -10 5159 -17 5159 -37 ct 
+5159 -196 l  5186 -221 5198 -228 5217 -228 ct 5245 -228 5258 -210 5258 -173 ct 
+5258 -55 l  5258 -20 5251 -10 5223 -8 ct 5223 0 l  5340 0 l  5340 -8 l  5312 -11 5306 -18 5306 -45 ct 
+5306 -174 l  5306 -227 5281 -259 5239 -259 ct 5213 -259 5196 -249 5157 -213 ct 
+5157 -258 l  5153 -259 l  5126 -249 5107 -243 5076 -234 ct p ef
+5525 -253 m  5455 -253 l  5455 -319 l  5455 -351 5466 -369 5488 -369 ct 5499 -369 5507 -363 5517 -347 ct 
+5526 -332 5533 -327 5543 -327 ct 5556 -327 5567 -337 5567 -350 ct 5567 -370 5542 -385 5508 -385 ct 
+5473 -385 5443 -369 5428 -344 ct 5414 -319 5409 -298 5409 -253 ct 5362 -253 l 
+5362 -235 l  5409 -235 l  5409 -58 l  5409 -17 5402 -10 5362 -8 ct 5362 0 l 
+5508 0 l  5508 -8 l  5462 -10 5456 -16 5456 -58 ct 5456 -235 l  5525 -235 l 
+p ef
+5635 -259 m  5548 -228 l  5548 -219 l  5552 -220 l  5559 -221 5566 -222 5571 -222 ct 
+5585 -222 5590 -213 5590 -188 ct 5590 -57 l  5590 -16 5584 -10 5546 -8 ct 5546 0 l 
+5679 0 l  5679 -8 l  5642 -11 5637 -16 5637 -57 ct 5637 -257 l  p
+5609 -385 m  5593 -385 5580 -372 5580 -356 ct 5580 -340 5593 -327 5609 -327 ct 
+5625 -327 5638 -340 5638 -356 ct 5638 -372 l  5625 -385 l  p ef
+5959 -218 m  5959 -240 l  5915 -240 l  5904 -240 5895 -242 5884 -246 ct 5872 -250 l 
+5857 -256 5841 -259 5827 -259 ct 5774 -259 5732 -218 5732 -167 ct 5732 -131 5748 -110 5785 -91 ct 
+5774 -81 5764 -72 5761 -69 ct 5742 -53 5735 -41 5735 -30 ct 5735 -18 5741 -11 5765 0 ct 
+5725 28 5709 47 5709 68 ct 5709 98 5753 122 5807 122 ct 5849 122 5893 108 5922 84 ct 
+5944 67 5954 49 5954 27 ct 5954 -7 5927 -31 5885 -32 ct 5813 -36 l  5783 -37 5769 -42 5769 -51 ct 
+5769 -62 5787 -82 5802 -86 ct 5807 -86 5811 -85 5813 -85 ct 5824 -84 5831 -84 5835 -84 ct 
+5855 -84 5878 -92 5895 -107 ct 5914 -123 5922 -143 5922 -171 ct 5922 -187 5920 -200 5912 -218 ct 
+p
+5776 1 m  5795 5 5840 8 5868 8 ct 5919 8 5938 15 5938 36 ct 5938 68 5895 90 5831 90 ct 
+5781 90 5749 74 5749 49 ct 5749 36 l  5753 29 l  p
+5779 -190 m  5779 -223 5795 -243 5821 -243 ct 5838 -243 5853 -234 5862 -217 ct 
+5872 -197 5879 -171 5879 -149 ct 5879 -117 5863 -98 5837 -98 ct 5803 -98 5779 -134 5779 -188 ct 
+p ef
+pom
+pum
+3916 16469 t
+98 -259 m  11 -228 l  11 -219 l  15 -220 l  22 -221 29 -222 34 -222 ct 48 -222 53 -213 53 -188 ct 
+53 -57 l  53 -16 47 -10 9 -8 ct 9 0 l  142 0 l  142 -8 l  105 -11 100 -16 100 -57 ct 
+100 -257 l  p
+72 -385 m  56 -385 43 -372 43 -356 ct 43 -340 56 -327 72 -327 ct 88 -327 101 -340 101 -356 ct 
+101 -372 l  88 -385 l  p ef
+162 -221 m  167 -222 171 -222 176 -222 ct 195 -222 199 -216 199 -190 ct 199 73 l 
+199 103 193 109 159 112 ct 159 122 l  296 122 l  296 112 l  254 111 246 105 246 69 ct 
+246 -18 l  266 0 279 5 303 5 ct 370 5 422 -57 422 -139 ct 422 -209 382 -259 327 -259 ct 
+296 -259 271 -245 246 -214 ct 246 -258 l  243 -259 l  212 -247 193 -240 162 -230 ct 
+p
+246 -188 m  246 -205 278 -225 304 -225 ct 345 -225 373 -182 373 -117 ct 373 -54 345 -12 305 -12 ct 
+278 -12 246 -32 246 -49 ct p ef
+557 -202 m  557 -311 l  557 -352 564 -358 607 -362 ct 607 -373 l  450 -373 l 
+450 -362 l  494 -358 500 -352 500 -311 ct 500 -67 l  500 -20 494 -13 450 -10 ct 
+450 0 l  607 0 l  607 -10 l  565 -14 557 -21 557 -61 ct 557 -177 l  728 -177 l 
+728 -67 l  728 -20 723 -13 679 -10 ct 679 0 l  835 0 l  835 -10 l  793 -14 786 -21 786 -61 ct 
+786 -311 l  786 -352 792 -358 835 -362 ct 835 -373 l  679 -373 l  679 -362 l 
+722 -358 728 -352 728 -311 ct 728 -202 l  p ef
+988 -259 m  914 -259 863 -205 863 -127 ct 863 -51 915 5 986 5 ct 1057 5 1112 -54 1112 -131 ct 
+1112 -205 l  1060 -259 l  p
+980 -243 m  1028 -243 1061 -189 1061 -112 ct 1061 -48 1035 -10 993 -10 ct 971 -10 950 -23 938 -46 ct 
+923 -75 914 -115 914 -155 ct 914 -208 l  940 -243 l  p ef
+1307 -177 m  1305 -253 l  1299 -253 l  1298 -252 l  1293 -248 1292 -248 1290 -248 ct 
+1286 -248 1281 -249 1274 -252 ct 1262 -256 1250 -258 1235 -258 ct 1190 -258 1158 -230 1158 -189 ct 
+1158 -157 1176 -135 1224 -108 ct 1257 -89 l  1277 -78 1286 -64 1286 -47 ct 1286 -22 1268 -6 1239 -6 ct 
+1220 -6 1203 -14 1192 -26 ct 1180 -40 1175 -53 1168 -85 ct 1159 -85 l  1159 2 l 
+1166 2 l  1170 -3 1172 -4 1179 -4 ct 1184 -4 1192 -3 1205 0 ct 1221 3 1236 5 1246 5 ct 
+1290 5 1326 -27 1326 -66 ct 1326 -94 1312 -113 1278 -133 ct 1217 -169 l  1202 -178 1193 -192 1193 -208 ct 
+1193 -230 1211 -246 1237 -246 ct 1269 -246 1286 -227 1299 -177 ct p ef
+1493 -253 m  1436 -253 l  1436 -319 l  1436 -324 1436 -326 1432 -326 ct 1428 -321 1425 -316 1421 -310 ct 
+1400 -279 1375 -252 1366 -250 ct 1360 -246 1357 -242 1357 -239 ct 1357 -238 1357 -236 1359 -235 ct 
+1389 -235 l  1389 -65 l  1389 -18 1406 5 1439 5 ct 1467 5 1488 -7 1507 -37 ct 
+1500 -43 l  1488 -29 1478 -23 1466 -23 ct 1445 -23 1436 -38 1436 -74 ct 1436 -235 l 
+1493 -235 l  p ef
+1583 -258 m  1566 -258 1552 -244 1552 -226 ct 1552 -210 1566 -196 1583 -196 ct 
+1600 -196 1615 -210 1615 -226 ct 1615 -244 l  1600 -258 l  p
+1583 -56 m  1566 -56 1552 -41 1552 -24 ct 1552 -7 1566 6 1583 6 ct 1600 6 1615 -7 1615 -24 ct 
+1615 -41 l  1600 -56 l  p ef
+1967 -381 m  1865 -329 l  1865 -322 l  1872 -324 1878 -327 1880 -328 ct 1890 -332 1900 -334 1906 -334 ct 
+1918 -334 1923 -325 1923 -307 ct 1923 -52 l  1923 -33 1918 -20 1909 -15 ct 1901 -10 1893 -9 1869 -8 ct 
+1869 0 l  2025 0 l  2025 -8 l  1980 -9 1971 -14 1971 -41 ct 1971 -380 l  p ef
+2120 12 m  2183 5 2214 -5 2252 -33 ct 2311 -76 2345 -146 2345 -222 ct 2345 -315 2293 -381 2221 -381 ct 
+2154 -381 2103 -324 2103 -248 ct 2103 -179 2144 -133 2205 -133 ct 2236 -133 2260 -142 2290 -165 ct 
+2266 -73 2204 -13 2118 1 ct p
+2291 -200 m  2291 -188 2288 -183 2282 -178 ct 2266 -165 2246 -157 2225 -157 ct 
+2182 -157 2155 -200 2155 -267 ct 2155 -299 2164 -333 2176 -347 ct 2186 -359 2200 -365 2216 -365 ct 
+2265 -365 2291 -316 2291 -222 ct p ef
+2638 -77 m  2631 -80 l  2610 -47 2603 -42 2577 -42 ct 2443 -42 l  2537 -142 l 
+2588 -194 2610 -237 2610 -281 ct 2610 -337 2564 -381 2505 -381 ct 2474 -381 2445 -368 2424 -346 ct 
+2406 -327 2398 -309 2388 -269 ct 2400 -266 l  2422 -321 2443 -339 2482 -339 ct 
+2529 -339 2561 -307 2561 -260 ct 2561 -216 2535 -163 2488 -113 ct 2387 -6 l 
+2387 0 l  2607 0 l  p ef
+2724 -56 m  2707 -56 2693 -41 2693 -24 ct 2693 -7 2707 6 2723 6 ct 2741 6 2756 -7 2756 -24 ct 
+2756 -41 l  2741 -56 l  p ef
+2958 -381 m  2856 -329 l  2856 -322 l  2863 -324 2869 -327 2871 -328 ct 2881 -332 2891 -334 2897 -334 ct 
+2909 -334 2914 -325 2914 -307 ct 2914 -52 l  2914 -33 2909 -20 2900 -15 ct 2892 -10 2884 -9 2860 -8 ct 
+2860 0 l  3016 0 l  3016 -8 l  2971 -9 2962 -14 2962 -41 ct 2962 -380 l  p ef
+3329 -385 m  3265 -380 3232 -369 3191 -340 ct 3130 -297 3097 -232 3097 -157 ct 
+3097 -108 3112 -58 3136 -30 ct 3158 -5 3188 7 3223 7 ct 3293 7 3341 -45 3341 -123 ct 
+3341 -195 3300 -241 3235 -241 ct 3211 -241 3199 -237 3163 -216 ct 3178 -301 3242 -362 3330 -376 ct 
+p
+3214 -215 m  3262 -215 3291 -174 3291 -104 ct 3291 -42 3269 -7 3229 -7 ct 3180 -7 3149 -60 3149 -148 ct 
+3149 -177 3154 -192 3165 -201 ct 3177 -210 l  3194 -215 l  p ef
+3524 -209 m  3580 -239 3600 -262 3600 -301 ct 3600 -347 3559 -381 3503 -381 ct 
+3441 -381 3395 -343 3395 -292 ct 3395 -255 3406 -239 3465 -187 ct 3404 -141 3392 -123 3392 -85 ct 
+3392 -30 3437 7 3500 7 ct 3568 7 3611 -29 3611 -87 ct 3611 -130 l  3592 -158 l 
+p
+3514 -151 m  3555 -121 3569 -101 3569 -69 ct 3569 -33 3543 -7 3507 -7 ct 3464 -7 3435 -40 3435 -89 ct 
+3435 -125 3447 -149 3480 -175 ct p
+3508 -219 m  3458 -252 3437 -278 3437 -309 ct 3437 -342 3463 -365 3498 -365 ct 
+3536 -365 3561 -340 3561 -301 ct 3561 -269 3545 -244 3513 -222 ct 3510 -221 l 
+3510 -221 l  p ef
+3715 -56 m  3698 -56 3684 -41 3684 -24 ct 3684 -7 3698 6 3714 6 ct 3732 6 3747 -7 3747 -24 ct 
+3747 -41 l  3732 -56 l  p ef
+3871 -186 m  3904 -186 3917 -184 3931 -179 ct 3966 -167 3988 -135 3988 -96 ct 
+3988 -49 3955 -12 3914 -12 ct 3898 -12 3887 -16 3866 -29 ct 3849 -40 3840 -43 3830 -43 ct 
+3817 -43 3809 -36 3809 -24 ct 3809 -4 3833 7 3872 7 ct 3916 7 3960 -6 3987 -29 ct 
+4013 -53 4028 -85 4028 -123 ct 4028 -152 4019 -178 4003 -196 ct 3991 -208 3981 -215 3956 -226 ct 
+3995 -252 4009 -273 4009 -304 ct 4009 -349 3973 -381 3921 -381 ct 3893 -381 3868 -371 3848 -353 ct 
+3831 -338 3822 -323 3810 -289 ct 3818 -287 l  3841 -328 3867 -347 3902 -347 ct 
+3939 -347 3964 -322 3964 -287 ct 3964 -266 3956 -246 3942 -232 ct 3925 -215 3909 -206 3871 -193 ct 
+p ef
+4101 12 m  4164 5 4195 -5 4233 -33 ct 4292 -76 4326 -146 4326 -222 ct 4326 -315 4274 -381 4202 -381 ct 
+4135 -381 4084 -324 4084 -248 ct 4084 -179 4125 -133 4186 -133 ct 4217 -133 4241 -142 4271 -165 ct 
+4247 -73 4185 -13 4099 1 ct p
+4272 -200 m  4272 -188 4269 -183 4263 -178 ct 4247 -165 4227 -157 4206 -157 ct 
+4163 -157 4136 -200 4136 -267 ct 4136 -299 4145 -333 4157 -347 ct 4167 -359 4181 -365 4197 -365 ct 
+4246 -365 4272 -316 4272 -222 ct p ef
+4422 -56 m  4405 -56 4391 -41 4391 -24 ct 4391 -7 4405 6 4421 6 ct 4439 6 4454 -7 4454 -24 ct 
+4454 -41 l  4439 -56 l  p ef
+4759 -77 m  4752 -80 l  4731 -47 4724 -42 4698 -42 ct 4564 -42 l  4658 -142 l 
+4709 -194 4731 -237 4731 -281 ct 4731 -337 4685 -381 4626 -381 ct 4595 -381 4566 -368 4545 -346 ct 
+4527 -327 4519 -309 4509 -269 ct 4521 -266 l  4543 -321 4564 -339 4603 -339 ct 
+4650 -339 4682 -307 4682 -260 ct 4682 -216 4656 -163 4609 -113 ct 4508 -6 l 
+4508 0 l  4728 0 l  p ef
+4939 -381 m  4837 -329 l  4837 -322 l  4844 -324 4850 -327 4852 -328 ct 4862 -332 4872 -334 4878 -334 ct 
+4890 -334 4895 -325 4895 -307 ct 4895 -52 l  4895 -33 4890 -20 4881 -15 ct 4873 -10 4865 -9 4841 -8 ct 
+4841 0 l  4997 0 l  4997 -8 l  4952 -9 4943 -14 4943 -41 ct 4943 -380 l  p ef
+pom
+pum
+3916 17151 t
+98 -259 m  11 -228 l  11 -219 l  15 -220 l  22 -221 29 -222 34 -222 ct 48 -222 53 -213 53 -188 ct 
+53 -57 l  53 -16 47 -10 9 -8 ct 9 0 l  142 0 l  142 -8 l  105 -11 100 -16 100 -57 ct 
+100 -257 l  p
+72 -385 m  56 -385 43 -372 43 -356 ct 43 -340 56 -327 72 -327 ct 88 -327 101 -340 101 -356 ct 
+101 -372 l  88 -385 l  p ef
+162 -221 m  167 -222 171 -222 176 -222 ct 195 -222 199 -216 199 -190 ct 199 73 l 
+199 103 193 109 159 112 ct 159 122 l  296 122 l  296 112 l  254 111 246 105 246 69 ct 
+246 -18 l  266 0 279 5 303 5 ct 370 5 422 -57 422 -139 ct 422 -209 382 -259 327 -259 ct 
+296 -259 271 -245 246 -214 ct 246 -258 l  243 -259 l  212 -247 193 -240 162 -230 ct 
+p
+246 -188 m  246 -205 278 -225 304 -225 ct 345 -225 373 -182 373 -117 ct 373 -54 345 -12 305 -12 ct 
+278 -12 246 -32 246 -49 ct p ef
+553 -164 m  568 -163 578 -162 592 -162 ct 636 -162 667 -168 691 -181 ct 725 -199 745 -234 745 -271 ct 
+745 -294 737 -316 722 -332 ct 700 -357 650 -373 597 -373 ct 449 -373 l  449 -362 l 
+490 -358 496 -352 496 -311 ct 496 -67 l  496 -20 491 -14 449 -10 ct 449 0 l 
+606 0 l  606 -10 l  562 -12 553 -20 553 -61 ct p
+553 -333 m  553 -348 557 -352 573 -352 ct 649 -352 684 -325 684 -267 ct 684 -213 650 -184 586 -184 ct 
+574 -184 566 -185 553 -186 ct p ef
+895 -259 m  821 -259 770 -205 770 -127 ct 770 -51 822 5 893 5 ct 964 5 1019 -54 1019 -131 ct 
+1019 -205 l  967 -259 l  p
+887 -243 m  935 -243 968 -189 968 -112 ct 968 -48 942 -10 900 -10 ct 878 -10 857 -23 845 -46 ct 
+830 -75 821 -115 821 -155 ct 821 -208 l  847 -243 l  p ef
+1040 -219 m  1048 -221 1053 -222 1060 -222 ct 1074 -222 1079 -213 1079 -188 ct 
+1079 -47 l  1079 -19 1075 -15 1039 -8 ct 1039 0 l  1175 0 l  1175 -8 l  1136 -10 1127 -18 1127 -50 ct 
+1127 -177 l  1127 -195 1151 -223 1166 -223 ct 1170 -223 1175 -221 1181 -215 ct 
+1190 -207 1196 -204 1203 -204 ct 1217 -204 1225 -213 1225 -229 ct 1225 -248 1214 -259 1194 -259 ct 
+1171 -259 1154 -246 1127 -206 ct 1127 -258 l  1124 -259 l  1094 -247 1074 -239 1040 -228 ct 
+p ef
+1366 -253 m  1309 -253 l  1309 -319 l  1309 -324 1309 -326 1305 -326 ct 1301 -321 1298 -316 1294 -310 ct 
+1273 -279 1248 -252 1239 -250 ct 1233 -246 1230 -242 1230 -239 ct 1230 -238 1230 -236 1232 -235 ct 
+1262 -235 l  1262 -65 l  1262 -18 1279 5 1312 5 ct 1340 5 1361 -7 1380 -37 ct 
+1373 -43 l  1361 -29 1351 -23 1339 -23 ct 1318 -23 1309 -38 1309 -74 ct 1309 -235 l 
+1366 -235 l  p ef
+1456 -258 m  1439 -258 1425 -244 1425 -226 ct 1425 -210 1439 -196 1456 -196 ct 
+1473 -196 1488 -210 1488 -226 ct 1488 -244 l  1473 -258 l  p
+1456 -56 m  1439 -56 1425 -41 1425 -24 ct 1425 -7 1439 6 1456 6 ct 1473 6 1488 -7 1488 -24 ct 
+1488 -41 l  1473 -56 l  p ef
+1942 -130 m  1884 -130 l  1884 -381 l  1859 -381 l  1682 -130 l  1682 -94 l 
+1841 -94 l  1841 0 l  1884 0 l  1884 -94 l  1942 -94 l  p
+1840 -130 m  1705 -130 l  1840 -323 l  p ef
+2227 -77 m  2220 -80 l  2199 -47 2192 -42 2166 -42 ct 2032 -42 l  2126 -142 l 
+2177 -194 2199 -237 2199 -281 ct 2199 -337 2153 -381 2094 -381 ct 2063 -381 2034 -368 2013 -346 ct 
+1995 -327 1987 -309 1977 -269 ct 1989 -266 l  2011 -321 2032 -339 2071 -339 ct 
+2118 -339 2150 -307 2150 -260 ct 2150 -216 2124 -163 2077 -113 ct 1976 -6 l 
+1976 0 l  2196 0 l  p ef
+2510 -130 m  2452 -130 l  2452 -381 l  2427 -381 l  2250 -130 l  2250 -94 l 
+2409 -94 l  2409 0 l  2452 0 l  2452 -94 l  2510 -94 l  p
+2408 -130 m  2273 -130 l  2408 -323 l  p ef
+2794 -77 m  2787 -80 l  2766 -47 2759 -42 2733 -42 ct 2599 -42 l  2693 -142 l 
+2744 -194 2766 -237 2766 -281 ct 2766 -337 2720 -381 2661 -381 ct 2630 -381 2601 -368 2580 -346 ct 
+2562 -327 2554 -309 2544 -269 ct 2556 -266 l  2578 -321 2599 -339 2638 -339 ct 
+2685 -339 2717 -307 2717 -260 ct 2717 -216 2691 -163 2644 -113 ct 2543 -6 l 
+2543 0 l  2763 0 l  p ef
+pom
+pum
+3916 17833 t
+249 -37 m  239 -29 232 -26 224 -26 ct 211 -26 207 -34 207 -59 ct 207 -169 l 
+207 -198 204 -214 196 -228 ct 183 -248 159 -259 126 -259 ct 73 -259 31 -231 31 -196 ct 
+31 -183 42 -172 55 -172 ct 69 -172 81 -183 81 -195 ct 81 -197 80 -200 80 -204 ct 
+78 -209 78 -214 78 -218 ct 78 -233 96 -245 119 -245 ct 146 -245 161 -229 161 -199 ct 
+161 -164 l  75 -129 65 -125 41 -103 ct 28 -92 20 -73 20 -54 ct 20 -19 45 5 80 5 ct 
+104 5 128 -6 162 -35 ct 165 -6 175 5 198 5 ct 217 5 229 -1 249 -22 ct p
+161 -69 m  161 -51 159 -46 147 -40 ct 133 -32 117 -27 106 -27 ct 86 -27 70 -46 70 -70 ct 
+70 -72 l  70 -106 93 -126 161 -151 ct p ef
+260 -351 m  264 -351 l  270 -351 277 -352 281 -352 ct 299 -352 305 -344 305 -318 ct 
+305 -49 l  305 -18 297 -11 261 -8 ct 261 0 l  394 0 l  394 -8 l  359 -10 352 -16 352 -47 ct 
+352 -384 l  350 -385 l  321 -375 299 -369 260 -360 ct p ef
+504 -259 m  417 -228 l  417 -219 l  421 -220 l  428 -221 435 -222 440 -222 ct 
+454 -222 459 -213 459 -188 ct 459 -57 l  459 -16 453 -10 415 -8 ct 415 0 l  548 0 l 
+548 -8 l  511 -11 506 -16 506 -57 ct 506 -257 l  p
+478 -385 m  462 -385 449 -372 449 -356 ct 449 -340 462 -327 478 -327 ct 494 -327 507 -340 507 -356 ct 
+507 -372 l  494 -385 l  p ef
+812 -37 m  802 -29 795 -26 787 -26 ct 774 -26 770 -34 770 -59 ct 770 -169 l 
+770 -198 767 -214 759 -228 ct 746 -248 722 -259 689 -259 ct 636 -259 594 -231 594 -196 ct 
+594 -183 605 -172 618 -172 ct 632 -172 644 -183 644 -195 ct 644 -197 643 -200 643 -204 ct 
+641 -209 641 -214 641 -218 ct 641 -233 659 -245 682 -245 ct 709 -245 724 -229 724 -199 ct 
+724 -164 l  638 -129 628 -125 604 -103 ct 591 -92 583 -73 583 -54 ct 583 -19 608 5 643 5 ct 
+667 5 691 -6 725 -35 ct 728 -6 738 5 761 5 ct 780 5 792 -1 812 -22 ct p
+724 -69 m  724 -51 722 -46 710 -40 ct 696 -32 680 -27 669 -27 ct 649 -27 633 -46 633 -70 ct 
+633 -72 l  633 -106 656 -126 724 -151 ct p ef
+990 -177 m  988 -253 l  982 -253 l  981 -252 l  976 -248 975 -248 973 -248 ct 
+969 -248 964 -249 957 -252 ct 945 -256 933 -258 918 -258 ct 873 -258 841 -230 841 -189 ct 
+841 -157 859 -135 907 -108 ct 940 -89 l  960 -78 969 -64 969 -47 ct 969 -22 951 -6 922 -6 ct 
+903 -6 886 -14 875 -26 ct 863 -40 858 -53 851 -85 ct 842 -85 l  842 2 l  849 2 l 
+853 -3 855 -4 862 -4 ct 867 -4 875 -3 888 0 ct 904 3 919 5 929 5 ct 973 5 1009 -27 1009 -66 ct 
+1009 -94 995 -113 961 -133 ct 900 -169 l  885 -178 876 -192 876 -208 ct 876 -230 894 -246 920 -246 ct 
+952 -246 969 -227 982 -177 ct p ef
+1109 -258 m  1092 -258 1078 -244 1078 -226 ct 1078 -210 1092 -196 1109 -196 ct 
+1126 -196 1141 -210 1141 -226 ct 1141 -244 l  1126 -258 l  p
+1109 -56 m  1092 -56 1078 -41 1078 -24 ct 1078 -7 1092 6 1109 6 ct 1126 6 1141 -7 1141 -24 ct 
+1141 -41 l  1126 -56 l  p ef
+1446 -202 m  1446 -311 l  1446 -352 1453 -358 1496 -362 ct 1496 -373 l  1339 -373 l 
+1339 -362 l  1383 -358 1389 -352 1389 -311 ct 1389 -67 l  1389 -20 1383 -13 1339 -10 ct 
+1339 0 l  1496 0 l  1496 -10 l  1454 -14 1446 -21 1446 -61 ct 1446 -177 l 
+1617 -177 l  1617 -67 l  1617 -20 1612 -13 1568 -10 ct 1568 0 l  1724 0 l 
+1724 -10 l  1682 -14 1675 -21 1675 -61 ct 1675 -311 l  1675 -352 1681 -358 1724 -362 ct 
+1724 -373 l  1568 -373 l  1568 -362 l  1611 -358 1617 -352 1617 -311 ct 1617 -202 l 
+p ef
+1834 -259 m  1747 -228 l  1747 -219 l  1751 -220 l  1758 -221 1765 -222 1770 -222 ct 
+1784 -222 1789 -213 1789 -188 ct 1789 -57 l  1789 -16 1783 -10 1745 -8 ct 1745 0 l 
+1878 0 l  1878 -8 l  1841 -11 1836 -16 1836 -57 ct 1836 -257 l  p
+1808 -385 m  1792 -385 1779 -372 1779 -356 ct 1779 -340 1792 -327 1808 -327 ct 
+1824 -327 1837 -340 1837 -356 ct 1837 -372 l  1824 -385 l  p ef
+2157 -218 m  2157 -240 l  2113 -240 l  2102 -240 2093 -242 2082 -246 ct 2070 -250 l 
+2055 -256 2039 -259 2025 -259 ct 1972 -259 1930 -218 1930 -167 ct 1930 -131 1946 -110 1983 -91 ct 
+1972 -81 1962 -72 1959 -69 ct 1940 -53 1933 -41 1933 -30 ct 1933 -18 1939 -11 1963 0 ct 
+1923 28 1907 47 1907 68 ct 1907 98 1951 122 2005 122 ct 2047 122 2091 108 2120 84 ct 
+2142 67 2152 49 2152 27 ct 2152 -7 2125 -31 2083 -32 ct 2011 -36 l  1981 -37 1967 -42 1967 -51 ct 
+1967 -62 1985 -82 2000 -86 ct 2005 -86 2009 -85 2011 -85 ct 2022 -84 2029 -84 2033 -84 ct 
+2053 -84 2076 -92 2093 -107 ct 2112 -123 2120 -143 2120 -171 ct 2120 -187 2118 -200 2110 -218 ct 
+p
+1974 1 m  1993 5 2038 8 2066 8 ct 2117 8 2136 15 2136 36 ct 2136 68 2093 90 2029 90 ct 
+1979 90 1947 74 1947 49 ct 1947 36 l  1951 29 l  p
+1977 -190 m  1977 -223 1993 -243 2019 -243 ct 2036 -243 2051 -234 2060 -217 ct 
+2070 -197 2077 -171 2077 -149 ct 2077 -117 2061 -98 2035 -98 ct 2001 -98 1977 -134 1977 -188 ct 
+p ef
+2264 -193 m  2288 -219 2305 -228 2327 -228 ct 2355 -228 2369 -208 2369 -169 ct 
+2369 -57 l  2369 -19 2363 -11 2331 -8 ct 2331 0 l  2450 0 l  2450 -8 l  2420 -14 2416 -18 2416 -57 ct 
+2416 -169 l  2416 -228 2393 -259 2347 -259 ct 2314 -259 2290 -245 2264 -212 ct 
+2264 -383 l  2261 -385 l  2242 -378 2228 -373 2196 -364 ct 2181 -360 l  2181 -351 l 
+2183 -351 2185 -351 2188 -351 ct 2212 -351 2217 -347 2217 -323 ct 2217 -57 l 
+2217 -18 2213 -12 2181 -8 ct 2181 0 l  2302 0 l  2302 -8 l  2270 -11 2264 -18 2264 -57 ct 
+p ef
+2853 -373 m  2737 -373 l  2737 -362 l  2768 -360 2778 -354 2778 -338 ct 2778 -329 2774 -314 2767 -297 ct 
+2685 -90 l  2599 -281 l  2581 -322 2576 -335 2576 -344 ct 2576 -354 2584 -360 2602 -361 ct 
+2604 -361 2611 -362 2619 -362 ct 2619 -373 l  2469 -373 l  2469 -362 l  2496 -361 2504 -353 2528 -303 ct 
+2667 6 l  2676 6 l  2801 -310 l  2819 -354 2826 -360 2853 -362 ct p ef
+3007 -259 m  2933 -259 2882 -205 2882 -127 ct 2882 -51 2934 5 3005 5 ct 3076 5 3131 -54 3131 -131 ct 
+3131 -205 l  3079 -259 l  p
+2999 -243 m  3047 -243 3080 -189 3080 -112 ct 3080 -48 3054 -10 3012 -10 ct 
+2990 -10 2969 -23 2957 -46 ct 2942 -75 2933 -115 2933 -155 ct 2933 -208 l  2959 -243 l 
+p ef
+3160 -351 m  3164 -351 l  3170 -351 3177 -352 3181 -352 ct 3199 -352 3205 -344 3205 -318 ct 
+3205 -49 l  3205 -18 3197 -11 3161 -8 ct 3161 0 l  3294 0 l  3294 -8 l  3259 -10 3252 -16 3252 -47 ct 
+3252 -384 l  3250 -385 l  3221 -375 3199 -369 3160 -360 ct p ef
+3449 -381 m  3418 -381 3394 -371 3373 -351 ct 3340 -320 3319 -255 3319 -189 ct 
+3319 -128 3338 -62 3364 -30 ct 3385 -5 3414 7 3447 7 ct 3475 7 3500 -1 3520 -21 ct 
+3553 -52 3574 -117 3574 -186 ct 3574 -301 l  3523 -381 l  p
+3447 -366 m  3494 -366 3520 -302 3520 -184 ct 3520 -67 3495 -6 3447 -6 ct 3398 -6 3373 -67 3373 -184 ct 
+3373 -304 l  3399 -366 l  p ef
+3754 -381 m  3652 -329 l  3652 -322 l  3659 -324 3665 -327 3667 -328 ct 3677 -332 3687 -334 3693 -334 ct 
+3705 -334 3710 -325 3710 -307 ct 3710 -52 l  3710 -33 3705 -20 3696 -15 ct 3688 -10 3680 -9 3656 -8 ct 
+3656 0 l  3812 0 l  3812 -8 l  3767 -9 3758 -14 3758 -41 ct 3758 -380 l  p ef
+pom
+pum
+3916 18515 t
+70 -56 m  53 -56 39 -41 39 -24 ct 39 -7 53 6 69 6 ct 87 6 102 -7 102 -24 ct 102 -41 l 
+87 -56 l  p ef
+210 -56 m  193 -56 179 -41 179 -24 ct 179 -7 193 6 209 6 ct 227 6 242 -7 242 -24 ct 
+242 -41 l  227 -56 l  p ef
+349 -56 m  332 -56 318 -41 318 -24 ct 318 -7 332 6 348 6 ct 366 6 381 -7 381 -24 ct 
+381 -41 l  366 -56 l  p ef
+489 -56 m  472 -56 458 -41 458 -24 ct 458 -7 472 6 488 6 ct 506 6 521 -7 521 -24 ct 
+521 -41 l  506 -56 l  p ef
+629 -56 m  612 -56 598 -41 598 -24 ct 598 -7 612 6 628 6 ct 646 6 661 -7 661 -24 ct 
+661 -41 l  646 -56 l  p ef
+769 -56 m  752 -56 738 -41 738 -24 ct 738 -7 752 6 768 6 ct 786 6 801 -7 801 -24 ct 
+801 -41 l  786 -56 l  p ef
+908 -56 m  891 -56 877 -41 877 -24 ct 877 -7 891 6 907 6 ct 925 6 940 -7 940 -24 ct 
+940 -41 l  925 -56 l  p ef
+1048 -56 m  1031 -56 1017 -41 1017 -24 ct 1017 -7 1031 6 1047 6 ct 1065 6 1080 -7 1080 -24 ct 
+1080 -41 l  1065 -56 l  p ef
+1188 -56 m  1171 -56 1157 -41 1157 -24 ct 1157 -7 1171 6 1187 6 ct 1205 6 1220 -7 1220 -24 ct 
+1220 -41 l  1205 -56 l  p ef
+1327 -56 m  1310 -56 1296 -41 1296 -24 ct 1296 -7 1310 6 1326 6 ct 1344 6 1359 -7 1359 -24 ct 
+1359 -41 l  1344 -56 l  p ef
+1467 -56 m  1450 -56 1436 -41 1436 -24 ct 1436 -7 1450 6 1466 6 ct 1484 6 1499 -7 1499 -24 ct 
+1499 -41 l  1484 -56 l  p ef
+1607 -56 m  1590 -56 1576 -41 1576 -24 ct 1576 -7 1590 6 1606 6 ct 1624 6 1639 -7 1639 -24 ct 
+1639 -41 l  1624 -56 l  p ef
+1746 -56 m  1729 -56 1715 -41 1715 -24 ct 1715 -7 1729 6 1745 6 ct 1763 6 1778 -7 1778 -24 ct 
+1778 -41 l  1763 -56 l  p ef
+1886 -56 m  1869 -56 1855 -41 1855 -24 ct 1855 -7 1869 6 1885 6 ct 1903 6 1918 -7 1918 -24 ct 
+1918 -41 l  1903 -56 l  p ef
+2026 -56 m  2009 -56 1995 -41 1995 -24 ct 1995 -7 2009 6 2025 6 ct 2043 6 2058 -7 2058 -24 ct 
+2058 -41 l  2043 -56 l  p ef
+2166 -56 m  2149 -56 2135 -41 2135 -24 ct 2135 -7 2149 6 2165 6 ct 2183 6 2198 -7 2198 -24 ct 
+2198 -41 l  2183 -56 l  p ef
+2305 -56 m  2288 -56 2274 -41 2274 -24 ct 2274 -7 2288 6 2304 6 ct 2322 6 2337 -7 2337 -24 ct 
+2337 -41 l  2322 -56 l  p ef
+2445 -56 m  2428 -56 2414 -41 2414 -24 ct 2414 -7 2428 6 2444 6 ct 2462 6 2477 -7 2477 -24 ct 
+2477 -41 l  2462 -56 l  p ef
+2585 -56 m  2568 -56 2554 -41 2554 -24 ct 2554 -7 2568 6 2584 6 ct 2602 6 2617 -7 2617 -24 ct 
+2617 -41 l  2602 -56 l  p ef
+2724 -56 m  2707 -56 2693 -41 2693 -24 ct 2693 -7 2707 6 2723 6 ct 2741 6 2756 -7 2756 -24 ct 
+2756 -41 l  2741 -56 l  p ef
+2864 -56 m  2847 -56 2833 -41 2833 -24 ct 2833 -7 2847 6 2863 6 ct 2881 6 2896 -7 2896 -24 ct 
+2896 -41 l  2881 -56 l  p ef
+3004 -56 m  2987 -56 2973 -41 2973 -24 ct 2973 -7 2987 6 3003 6 ct 3021 6 3036 -7 3036 -24 ct 
+3036 -41 l  3021 -56 l  p ef
+3143 -56 m  3126 -56 3112 -41 3112 -24 ct 3112 -7 3126 6 3142 6 ct 3160 6 3175 -7 3175 -24 ct 
+3175 -41 l  3160 -56 l  p ef
+3283 -56 m  3266 -56 3252 -41 3252 -24 ct 3252 -7 3266 6 3282 6 ct 3300 6 3315 -7 3315 -24 ct 
+3315 -41 l  3300 -56 l  p ef
+3423 -56 m  3406 -56 3392 -41 3392 -24 ct 3392 -7 3406 6 3422 6 ct 3440 6 3455 -7 3455 -24 ct 
+3455 -41 l  3440 -56 l  p ef
+3563 -56 m  3546 -56 3532 -41 3532 -24 ct 3532 -7 3546 6 3562 6 ct 3580 6 3595 -7 3595 -24 ct 
+3595 -41 l  3580 -56 l  p ef
+3702 -56 m  3685 -56 3671 -41 3671 -24 ct 3671 -7 3685 6 3701 6 ct 3719 6 3734 -7 3734 -24 ct 
+3734 -41 l  3719 -56 l  p ef
+pom
+pum
+3916 19197 t
+249 -37 m  239 -29 232 -26 224 -26 ct 211 -26 207 -34 207 -59 ct 207 -169 l 
+207 -198 204 -214 196 -228 ct 183 -248 159 -259 126 -259 ct 73 -259 31 -231 31 -196 ct 
+31 -183 42 -172 55 -172 ct 69 -172 81 -183 81 -195 ct 81 -197 80 -200 80 -204 ct 
+78 -209 78 -214 78 -218 ct 78 -233 96 -245 119 -245 ct 146 -245 161 -229 161 -199 ct 
+161 -164 l  75 -129 65 -125 41 -103 ct 28 -92 20 -73 20 -54 ct 20 -19 45 5 80 5 ct 
+104 5 128 -6 162 -35 ct 165 -6 175 5 198 5 ct 217 5 229 -1 249 -22 ct p
+161 -69 m  161 -51 159 -46 147 -40 ct 133 -32 117 -27 106 -27 ct 86 -27 70 -46 70 -70 ct 
+70 -72 l  70 -106 93 -126 161 -151 ct p ef
+260 -351 m  264 -351 l  270 -351 277 -352 281 -352 ct 299 -352 305 -344 305 -318 ct 
+305 -49 l  305 -18 297 -11 261 -8 ct 261 0 l  394 0 l  394 -8 l  359 -10 352 -16 352 -47 ct 
+352 -384 l  350 -385 l  321 -375 299 -369 260 -360 ct p ef
+504 -259 m  417 -228 l  417 -219 l  421 -220 l  428 -221 435 -222 440 -222 ct 
+454 -222 459 -213 459 -188 ct 459 -57 l  459 -16 453 -10 415 -8 ct 415 0 l  548 0 l 
+548 -8 l  511 -11 506 -16 506 -57 ct 506 -257 l  p
+478 -385 m  462 -385 449 -372 449 -356 ct 449 -340 462 -327 478 -327 ct 494 -327 507 -340 507 -356 ct 
+507 -372 l  494 -385 l  p ef
+812 -37 m  802 -29 795 -26 787 -26 ct 774 -26 770 -34 770 -59 ct 770 -169 l 
+770 -198 767 -214 759 -228 ct 746 -248 722 -259 689 -259 ct 636 -259 594 -231 594 -196 ct 
+594 -183 605 -172 618 -172 ct 632 -172 644 -183 644 -195 ct 644 -197 643 -200 643 -204 ct 
+641 -209 641 -214 641 -218 ct 641 -233 659 -245 682 -245 ct 709 -245 724 -229 724 -199 ct 
+724 -164 l  638 -129 628 -125 604 -103 ct 591 -92 583 -73 583 -54 ct 583 -19 608 5 643 5 ct 
+667 5 691 -6 725 -35 ct 728 -6 738 5 761 5 ct 780 5 792 -1 812 -22 ct p
+724 -69 m  724 -51 722 -46 710 -40 ct 696 -32 680 -27 669 -27 ct 649 -27 633 -46 633 -70 ct 
+633 -72 l  633 -106 656 -126 724 -151 ct p ef
+990 -177 m  988 -253 l  982 -253 l  981 -252 l  976 -248 975 -248 973 -248 ct 
+969 -248 964 -249 957 -252 ct 945 -256 933 -258 918 -258 ct 873 -258 841 -230 841 -189 ct 
+841 -157 859 -135 907 -108 ct 940 -89 l  960 -78 969 -64 969 -47 ct 969 -22 951 -6 922 -6 ct 
+903 -6 886 -14 875 -26 ct 863 -40 858 -53 851 -85 ct 842 -85 l  842 2 l  849 2 l 
+853 -3 855 -4 862 -4 ct 867 -4 875 -3 888 0 ct 904 3 919 5 929 5 ct 973 5 1009 -27 1009 -66 ct 
+1009 -94 995 -113 961 -133 ct 900 -169 l  885 -178 876 -192 876 -208 ct 876 -230 894 -246 920 -246 ct 
+952 -246 969 -227 982 -177 ct p ef
+1109 -258 m  1092 -258 1078 -244 1078 -226 ct 1078 -210 1092 -196 1109 -196 ct 
+1126 -196 1141 -210 1141 -226 ct 1141 -244 l  1126 -258 l  p
+1109 -56 m  1092 -56 1078 -41 1078 -24 ct 1078 -7 1092 6 1109 6 ct 1126 6 1141 -7 1141 -24 ct 
+1141 -41 l  1126 -56 l  p ef
+1446 -202 m  1446 -311 l  1446 -352 1453 -358 1496 -362 ct 1496 -373 l  1339 -373 l 
+1339 -362 l  1383 -358 1389 -352 1389 -311 ct 1389 -67 l  1389 -20 1383 -13 1339 -10 ct 
+1339 0 l  1496 0 l  1496 -10 l  1454 -14 1446 -21 1446 -61 ct 1446 -177 l 
+1617 -177 l  1617 -67 l  1617 -20 1612 -13 1568 -10 ct 1568 0 l  1724 0 l 
+1724 -10 l  1682 -14 1675 -21 1675 -61 ct 1675 -311 l  1675 -352 1681 -358 1724 -362 ct 
+1724 -373 l  1568 -373 l  1568 -362 l  1611 -358 1617 -352 1617 -311 ct 1617 -202 l 
+p ef
+1834 -259 m  1747 -228 l  1747 -219 l  1751 -220 l  1758 -221 1765 -222 1770 -222 ct 
+1784 -222 1789 -213 1789 -188 ct 1789 -57 l  1789 -16 1783 -10 1745 -8 ct 1745 0 l 
+1878 0 l  1878 -8 l  1841 -11 1836 -16 1836 -57 ct 1836 -257 l  p
+1808 -385 m  1792 -385 1779 -372 1779 -356 ct 1779 -340 1792 -327 1808 -327 ct 
+1824 -327 1837 -340 1837 -356 ct 1837 -372 l  1824 -385 l  p ef
+2157 -218 m  2157 -240 l  2113 -240 l  2102 -240 2093 -242 2082 -246 ct 2070 -250 l 
+2055 -256 2039 -259 2025 -259 ct 1972 -259 1930 -218 1930 -167 ct 1930 -131 1946 -110 1983 -91 ct 
+1972 -81 1962 -72 1959 -69 ct 1940 -53 1933 -41 1933 -30 ct 1933 -18 1939 -11 1963 0 ct 
+1923 28 1907 47 1907 68 ct 1907 98 1951 122 2005 122 ct 2047 122 2091 108 2120 84 ct 
+2142 67 2152 49 2152 27 ct 2152 -7 2125 -31 2083 -32 ct 2011 -36 l  1981 -37 1967 -42 1967 -51 ct 
+1967 -62 1985 -82 2000 -86 ct 2005 -86 2009 -85 2011 -85 ct 2022 -84 2029 -84 2033 -84 ct 
+2053 -84 2076 -92 2093 -107 ct 2112 -123 2120 -143 2120 -171 ct 2120 -187 2118 -200 2110 -218 ct 
+p
+1974 1 m  1993 5 2038 8 2066 8 ct 2117 8 2136 15 2136 36 ct 2136 68 2093 90 2029 90 ct 
+1979 90 1947 74 1947 49 ct 1947 36 l  1951 29 l  p
+1977 -190 m  1977 -223 1993 -243 2019 -243 ct 2036 -243 2051 -234 2060 -217 ct 
+2070 -197 2077 -171 2077 -149 ct 2077 -117 2061 -98 2035 -98 ct 2001 -98 1977 -134 1977 -188 ct 
+p ef
+2264 -193 m  2288 -219 2305 -228 2327 -228 ct 2355 -228 2369 -208 2369 -169 ct 
+2369 -57 l  2369 -19 2363 -11 2331 -8 ct 2331 0 l  2450 0 l  2450 -8 l  2420 -14 2416 -18 2416 -57 ct 
+2416 -169 l  2416 -228 2393 -259 2347 -259 ct 2314 -259 2290 -245 2264 -212 ct 
+2264 -383 l  2261 -385 l  2242 -378 2228 -373 2196 -364 ct 2181 -360 l  2181 -351 l 
+2183 -351 2185 -351 2188 -351 ct 2212 -351 2217 -347 2217 -323 ct 2217 -57 l 
+2217 -18 2213 -12 2181 -8 ct 2181 0 l  2302 0 l  2302 -8 l  2270 -11 2264 -18 2264 -57 ct 
+p ef
+2853 -373 m  2737 -373 l  2737 -362 l  2768 -360 2778 -354 2778 -338 ct 2778 -329 2774 -314 2767 -297 ct 
+2685 -90 l  2599 -281 l  2581 -322 2576 -335 2576 -344 ct 2576 -354 2584 -360 2602 -361 ct 
+2604 -361 2611 -362 2619 -362 ct 2619 -373 l  2469 -373 l  2469 -362 l  2496 -361 2504 -353 2528 -303 ct 
+2667 6 l  2676 6 l  2801 -310 l  2819 -354 2826 -360 2853 -362 ct p ef
+3007 -259 m  2933 -259 2882 -205 2882 -127 ct 2882 -51 2934 5 3005 5 ct 3076 5 3131 -54 3131 -131 ct 
+3131 -205 l  3079 -259 l  p
+2999 -243 m  3047 -243 3080 -189 3080 -112 ct 3080 -48 3054 -10 3012 -10 ct 
+2990 -10 2969 -23 2957 -46 ct 2942 -75 2933 -115 2933 -155 ct 2933 -208 l  2959 -243 l 
+p ef
+3160 -351 m  3164 -351 l  3170 -351 3177 -352 3181 -352 ct 3199 -352 3205 -344 3205 -318 ct 
+3205 -49 l  3205 -18 3197 -11 3161 -8 ct 3161 0 l  3294 0 l  3294 -8 l  3259 -10 3252 -16 3252 -47 ct 
+3252 -384 l  3250 -385 l  3221 -375 3199 -369 3160 -360 ct p ef
+3449 -381 m  3418 -381 3394 -371 3373 -351 ct 3340 -320 3319 -255 3319 -189 ct 
+3319 -128 3338 -62 3364 -30 ct 3385 -5 3414 7 3447 7 ct 3475 7 3500 -1 3520 -21 ct 
+3553 -52 3574 -117 3574 -186 ct 3574 -301 l  3523 -381 l  p
+3447 -366 m  3494 -366 3520 -302 3520 -184 ct 3520 -67 3495 -6 3447 -6 ct 3398 -6 3373 -67 3373 -184 ct 
+3373 -304 l  3399 -366 l  p ef
+3843 -373 m  3634 -373 l  3601 -290 l  3610 -285 l  3635 -324 3645 -331 3676 -331 ct 
+3798 -331 l  3687 4 l  3723 4 l  3843 -364 l  p ef
+pom
+pum
+3916 19879 t
+249 -37 m  239 -29 232 -26 224 -26 ct 211 -26 207 -34 207 -59 ct 207 -169 l 
+207 -198 204 -214 196 -228 ct 183 -248 159 -259 126 -259 ct 73 -259 31 -231 31 -196 ct 
+31 -183 42 -172 55 -172 ct 69 -172 81 -183 81 -195 ct 81 -197 80 -200 80 -204 ct 
+78 -209 78 -214 78 -218 ct 78 -233 96 -245 119 -245 ct 146 -245 161 -229 161 -199 ct 
+161 -164 l  75 -129 65 -125 41 -103 ct 28 -92 20 -73 20 -54 ct 20 -19 45 5 80 5 ct 
+104 5 128 -6 162 -35 ct 165 -6 175 5 198 5 ct 217 5 229 -1 249 -22 ct p
+161 -69 m  161 -51 159 -46 147 -40 ct 133 -32 117 -27 106 -27 ct 86 -27 70 -46 70 -70 ct 
+70 -72 l  70 -106 93 -126 161 -151 ct p ef
+260 -351 m  264 -351 l  270 -351 277 -352 281 -352 ct 299 -352 305 -344 305 -318 ct 
+305 -49 l  305 -18 297 -11 261 -8 ct 261 0 l  394 0 l  394 -8 l  359 -10 352 -16 352 -47 ct 
+352 -384 l  350 -385 l  321 -375 299 -369 260 -360 ct p ef
+504 -259 m  417 -228 l  417 -219 l  421 -220 l  428 -221 435 -222 440 -222 ct 
+454 -222 459 -213 459 -188 ct 459 -57 l  459 -16 453 -10 415 -8 ct 415 0 l  548 0 l 
+548 -8 l  511 -11 506 -16 506 -57 ct 506 -257 l  p
+478 -385 m  462 -385 449 -372 449 -356 ct 449 -340 462 -327 478 -327 ct 494 -327 507 -340 507 -356 ct 
+507 -372 l  494 -385 l  p ef
+812 -37 m  802 -29 795 -26 787 -26 ct 774 -26 770 -34 770 -59 ct 770 -169 l 
+770 -198 767 -214 759 -228 ct 746 -248 722 -259 689 -259 ct 636 -259 594 -231 594 -196 ct 
+594 -183 605 -172 618 -172 ct 632 -172 644 -183 644 -195 ct 644 -197 643 -200 643 -204 ct 
+641 -209 641 -214 641 -218 ct 641 -233 659 -245 682 -245 ct 709 -245 724 -229 724 -199 ct 
+724 -164 l  638 -129 628 -125 604 -103 ct 591 -92 583 -73 583 -54 ct 583 -19 608 5 643 5 ct 
+667 5 691 -6 725 -35 ct 728 -6 738 5 761 5 ct 780 5 792 -1 812 -22 ct p
+724 -69 m  724 -51 722 -46 710 -40 ct 696 -32 680 -27 669 -27 ct 649 -27 633 -46 633 -70 ct 
+633 -72 l  633 -106 656 -126 724 -151 ct p ef
+990 -177 m  988 -253 l  982 -253 l  981 -252 l  976 -248 975 -248 973 -248 ct 
+969 -248 964 -249 957 -252 ct 945 -256 933 -258 918 -258 ct 873 -258 841 -230 841 -189 ct 
+841 -157 859 -135 907 -108 ct 940 -89 l  960 -78 969 -64 969 -47 ct 969 -22 951 -6 922 -6 ct 
+903 -6 886 -14 875 -26 ct 863 -40 858 -53 851 -85 ct 842 -85 l  842 2 l  849 2 l 
+853 -3 855 -4 862 -4 ct 867 -4 875 -3 888 0 ct 904 3 919 5 929 5 ct 973 5 1009 -27 1009 -66 ct 
+1009 -94 995 -113 961 -133 ct 900 -169 l  885 -178 876 -192 876 -208 ct 876 -230 894 -246 920 -246 ct 
+952 -246 969 -227 982 -177 ct p ef
+1109 -258 m  1092 -258 1078 -244 1078 -226 ct 1078 -210 1092 -196 1109 -196 ct 
+1126 -196 1141 -210 1141 -226 ct 1141 -244 l  1126 -258 l  p
+1109 -56 m  1092 -56 1078 -41 1078 -24 ct 1078 -7 1092 6 1109 6 ct 1126 6 1141 -7 1141 -24 ct 
+1141 -41 l  1126 -56 l  p ef
+1472 -349 m  1472 -67 l  1472 -19 1466 -13 1419 -10 ct 1419 0 l  1583 0 l 
+1583 -10 l  1537 -12 1529 -20 1529 -61 ct 1529 -349 l  1560 -349 l  1624 -349 1636 -339 1649 -277 ct 
+1663 -277 l  1660 -373 l  1341 -373 l  1338 -277 l  1352 -277 l  1365 -338 1378 -349 1441 -349 ct 
+p ef
+1677 -221 m  1682 -222 1686 -222 1691 -222 ct 1710 -222 1714 -216 1714 -190 ct 
+1714 73 l  1714 103 1708 109 1674 112 ct 1674 122 l  1811 122 l  1811 112 l 
+1769 111 1761 105 1761 69 ct 1761 -18 l  1781 0 1794 5 1818 5 ct 1885 5 1937 -57 1937 -139 ct 
+1937 -209 1897 -259 1842 -259 ct 1811 -259 1786 -245 1761 -214 ct 1761 -258 l 
+1758 -259 l  1727 -247 1708 -240 1677 -230 ct p
+1761 -188 m  1761 -205 1793 -225 1819 -225 ct 1860 -225 1888 -182 1888 -117 ct 
+1888 -54 1860 -12 1820 -12 ct 1793 -12 1761 -32 1761 -49 ct p ef
+2180 -87 m  2153 -48 2133 -34 2100 -34 ct 2049 -34 2013 -80 2013 -144 ct 2013 -203 2044 -243 2090 -243 ct 
+2110 -243 2117 -236 2123 -216 ct 2126 -203 l  2131 -187 2141 -177 2153 -177 ct 
+2168 -177 2180 -188 2180 -201 ct 2180 -232 2140 -259 2093 -259 ct 2065 -259 2037 -248 2014 -227 ct 
+1985 -203 1970 -164 1970 -120 ct 1970 -46 2014 5 2077 5 ct 2102 5 2125 -3 2145 -20 ct 
+2160 -34 2171 -49 2188 -82 ct p ef
+2349 -349 m  2349 -67 l  2349 -19 2343 -13 2296 -10 ct 2296 0 l  2460 0 l 
+2460 -10 l  2414 -12 2406 -20 2406 -61 ct 2406 -349 l  2437 -349 l  2501 -349 2513 -339 2526 -277 ct 
+2540 -277 l  2537 -373 l  2218 -373 l  2215 -277 l  2229 -277 l  2242 -338 2255 -349 2318 -349 ct 
+p ef
+2778 -92 m  2751 -49 2726 -33 2690 -33 ct 2658 -33 2634 -49 2617 -81 ct 2607 -103 2603 -121 2602 -156 ct 
+2776 -156 l  2771 -192 2766 -209 2752 -227 ct 2735 -247 2709 -259 2679 -259 ct 
+2651 -259 2625 -249 2603 -230 ct 2577 -206 2562 -166 2562 -120 ct 2562 -42 2602 5 2667 5 ct 
+2721 5 2763 -27 2787 -88 ct p
+2603 -174 m  2610 -218 2629 -239 2663 -239 ct 2698 -239 2711 -223 2718 -174 ct 
+p ef
+2808 -224 m  2816 -226 2820 -226 2826 -226 ct 2841 -226 2846 -217 2846 -190 ct 
+2846 -47 l  2846 -17 2838 -9 2807 -8 ct 2807 0 l  2932 0 l  2932 -8 l  2902 -9 2893 -15 2893 -37 ct 
+2893 -196 l  2893 -197 2898 -203 2902 -207 ct 2916 -220 2940 -230 2960 -230 ct 
+2985 -230 2997 -210 2997 -170 ct 2997 -48 l  2997 -16 2991 -10 2959 -8 ct 2959 0 l 
+3085 0 l  3085 -8 l  3053 -9 3045 -18 3045 -53 ct 3045 -195 l  3061 -219 3080 -230 3106 -230 ct 
+3138 -230 3148 -214 3148 -168 ct 3148 -49 l  3148 -16 3144 -12 3111 -8 ct 3111 0 l 
+3235 0 l  3235 -8 l  3220 -9 l  3203 -10 3196 -20 3196 -42 ct 3196 -159 l 
+3196 -225 3174 -259 3130 -259 ct 3098 -259 3069 -244 3038 -212 ct 3028 -244 3009 -259 2979 -259 ct 
+2954 -259 2938 -251 2891 -216 ct 2891 -258 l  2887 -259 l  2858 -248 2839 -242 2808 -234 ct 
+p ef
+3239 -221 m  3244 -222 3248 -222 3253 -222 ct 3272 -222 3276 -216 3276 -190 ct 
+3276 73 l  3276 103 3270 109 3236 112 ct 3236 122 l  3373 122 l  3373 112 l 
+3331 111 3323 105 3323 69 ct 3323 -18 l  3343 0 3356 5 3380 5 ct 3447 5 3499 -57 3499 -139 ct 
+3499 -209 3459 -259 3404 -259 ct 3373 -259 3348 -245 3323 -214 ct 3323 -258 l 
+3320 -259 l  3289 -247 3270 -240 3239 -230 ct p
+3323 -188 m  3323 -205 3355 -225 3381 -225 ct 3422 -225 3450 -182 3450 -117 ct 
+3450 -54 3422 -12 3382 -12 ct 3355 -12 3323 -32 3323 -49 ct p ef
+3770 -381 m  3758 -381 l  3756 -368 3749 -362 3740 -362 ct 3734 -362 3724 -364 3715 -368 ct 
+3694 -376 3673 -381 3655 -381 ct 3631 -381 3606 -371 3587 -355 ct 3568 -337 3558 -314 3558 -284 ct 
+3558 -239 3582 -208 3646 -174 ct 3686 -153 3715 -130 3730 -108 ct 3735 -101 3737 -89 3737 -76 ct 
+3737 -38 3709 -12 3668 -12 ct 3618 -12 3582 -43 3554 -112 ct 3541 -112 l  3558 7 l 
+3571 7 l  3571 -3 3578 -11 3586 -11 ct 3593 -11 3602 -9 3613 -5 ct 3634 3 3657 7 3679 7 ct 
+3744 7 3794 -36 3794 -94 ct 3794 -141 3763 -177 3689 -217 ct 3630 -250 3606 -275 3606 -305 ct 
+3606 -336 3630 -358 3665 -358 ct 3690 -358 3714 -347 3734 -327 ct 3751 -309 3759 -294 3768 -261 ct 
+3782 -261 l  p ef
+4061 -92 m  4034 -49 4009 -33 3973 -33 ct 3941 -33 3917 -49 3900 -81 ct 3890 -103 3886 -121 3885 -156 ct 
+4059 -156 l  4054 -192 4049 -209 4035 -227 ct 4018 -247 3992 -259 3962 -259 ct 
+3934 -259 3908 -249 3886 -230 ct 3860 -206 3845 -166 3845 -120 ct 3845 -42 3885 5 3950 5 ct 
+4004 5 4046 -27 4070 -88 ct p
+3886 -174 m  3893 -218 3912 -239 3946 -239 ct 3981 -239 3994 -223 4001 -174 ct 
+p ef
+4305 -87 m  4278 -48 4258 -34 4225 -34 ct 4174 -34 4138 -80 4138 -144 ct 4138 -203 4169 -243 4215 -243 ct 
+4235 -243 4242 -236 4248 -216 ct 4251 -203 l  4256 -187 4266 -177 4278 -177 ct 
+4293 -177 4305 -188 4305 -201 ct 4305 -232 4265 -259 4218 -259 ct 4190 -259 4162 -248 4139 -227 ct 
+4110 -203 4095 -164 4095 -120 ct 4095 -46 4139 5 4202 5 ct 4227 5 4250 -3 4270 -20 ct 
+4285 -34 4296 -49 4313 -82 ct p ef
+4474 -253 m  4417 -253 l  4417 -319 l  4417 -324 4417 -326 4413 -326 ct 4409 -321 4406 -316 4402 -310 ct 
+4381 -279 4356 -252 4347 -250 ct 4341 -246 4338 -242 4338 -239 ct 4338 -238 4338 -236 4340 -235 ct 
+4370 -235 l  4370 -65 l  4370 -18 4387 5 4420 5 ct 4448 5 4469 -7 4488 -37 ct 
+4481 -43 l  4469 -29 4459 -23 4447 -23 ct 4426 -23 4417 -38 4417 -74 ct 4417 -235 l 
+4474 -235 l  p ef
+4630 -381 m  4599 -381 4575 -371 4554 -351 ct 4521 -320 4500 -255 4500 -189 ct 
+4500 -128 4519 -62 4545 -30 ct 4566 -5 4595 7 4628 7 ct 4656 7 4681 -1 4701 -21 ct 
+4734 -52 4755 -117 4755 -186 ct 4755 -301 l  4704 -381 l  p
+4628 -366 m  4675 -366 4701 -302 4701 -184 ct 4701 -67 4676 -6 4628 -6 ct 4579 -6 4554 -67 4554 -184 ct 
+4554 -304 l  4580 -366 l  p ef
+4935 -381 m  4833 -329 l  4833 -322 l  4840 -324 4846 -327 4848 -328 ct 4858 -332 4868 -334 4874 -334 ct 
+4886 -334 4891 -325 4891 -307 ct 4891 -52 l  4891 -33 4886 -20 4877 -15 ct 4869 -10 4861 -9 4837 -8 ct 
+4837 0 l  4993 0 l  4993 -8 l  4948 -9 4939 -14 4939 -41 ct 4939 -380 l  p ef
+pom
+pum
+3916 20561 t
+70 -56 m  53 -56 39 -41 39 -24 ct 39 -7 53 6 69 6 ct 87 6 102 -7 102 -24 ct 102 -41 l 
+87 -56 l  p ef
+210 -56 m  193 -56 179 -41 179 -24 ct 179 -7 193 6 209 6 ct 227 6 242 -7 242 -24 ct 
+242 -41 l  227 -56 l  p ef
+349 -56 m  332 -56 318 -41 318 -24 ct 318 -7 332 6 348 6 ct 366 6 381 -7 381 -24 ct 
+381 -41 l  366 -56 l  p ef
+489 -56 m  472 -56 458 -41 458 -24 ct 458 -7 472 6 488 6 ct 506 6 521 -7 521 -24 ct 
+521 -41 l  506 -56 l  p ef
+629 -56 m  612 -56 598 -41 598 -24 ct 598 -7 612 6 628 6 ct 646 6 661 -7 661 -24 ct 
+661 -41 l  646 -56 l  p ef
+769 -56 m  752 -56 738 -41 738 -24 ct 738 -7 752 6 768 6 ct 786 6 801 -7 801 -24 ct 
+801 -41 l  786 -56 l  p ef
+908 -56 m  891 -56 877 -41 877 -24 ct 877 -7 891 6 907 6 ct 925 6 940 -7 940 -24 ct 
+940 -41 l  925 -56 l  p ef
+1048 -56 m  1031 -56 1017 -41 1017 -24 ct 1017 -7 1031 6 1047 6 ct 1065 6 1080 -7 1080 -24 ct 
+1080 -41 l  1065 -56 l  p ef
+1188 -56 m  1171 -56 1157 -41 1157 -24 ct 1157 -7 1171 6 1187 6 ct 1205 6 1220 -7 1220 -24 ct 
+1220 -41 l  1205 -56 l  p ef
+1327 -56 m  1310 -56 1296 -41 1296 -24 ct 1296 -7 1310 6 1326 6 ct 1344 6 1359 -7 1359 -24 ct 
+1359 -41 l  1344 -56 l  p ef
+1467 -56 m  1450 -56 1436 -41 1436 -24 ct 1436 -7 1450 6 1466 6 ct 1484 6 1499 -7 1499 -24 ct 
+1499 -41 l  1484 -56 l  p ef
+1607 -56 m  1590 -56 1576 -41 1576 -24 ct 1576 -7 1590 6 1606 6 ct 1624 6 1639 -7 1639 -24 ct 
+1639 -41 l  1624 -56 l  p ef
+1746 -56 m  1729 -56 1715 -41 1715 -24 ct 1715 -7 1729 6 1745 6 ct 1763 6 1778 -7 1778 -24 ct 
+1778 -41 l  1763 -56 l  p ef
+1886 -56 m  1869 -56 1855 -41 1855 -24 ct 1855 -7 1869 6 1885 6 ct 1903 6 1918 -7 1918 -24 ct 
+1918 -41 l  1903 -56 l  p ef
+2026 -56 m  2009 -56 1995 -41 1995 -24 ct 1995 -7 2009 6 2025 6 ct 2043 6 2058 -7 2058 -24 ct 
+2058 -41 l  2043 -56 l  p ef
+2166 -56 m  2149 -56 2135 -41 2135 -24 ct 2135 -7 2149 6 2165 6 ct 2183 6 2198 -7 2198 -24 ct 
+2198 -41 l  2183 -56 l  p ef
+2305 -56 m  2288 -56 2274 -41 2274 -24 ct 2274 -7 2288 6 2304 6 ct 2322 6 2337 -7 2337 -24 ct 
+2337 -41 l  2322 -56 l  p ef
+2445 -56 m  2428 -56 2414 -41 2414 -24 ct 2414 -7 2428 6 2444 6 ct 2462 6 2477 -7 2477 -24 ct 
+2477 -41 l  2462 -56 l  p ef
+2585 -56 m  2568 -56 2554 -41 2554 -24 ct 2554 -7 2568 6 2584 6 ct 2602 6 2617 -7 2617 -24 ct 
+2617 -41 l  2602 -56 l  p ef
+2724 -56 m  2707 -56 2693 -41 2693 -24 ct 2693 -7 2707 6 2723 6 ct 2741 6 2756 -7 2756 -24 ct 
+2756 -41 l  2741 -56 l  p ef
+2864 -56 m  2847 -56 2833 -41 2833 -24 ct 2833 -7 2847 6 2863 6 ct 2881 6 2896 -7 2896 -24 ct 
+2896 -41 l  2881 -56 l  p ef
+3004 -56 m  2987 -56 2973 -41 2973 -24 ct 2973 -7 2987 6 3003 6 ct 3021 6 3036 -7 3036 -24 ct 
+3036 -41 l  3021 -56 l  p ef
+3143 -56 m  3126 -56 3112 -41 3112 -24 ct 3112 -7 3126 6 3142 6 ct 3160 6 3175 -7 3175 -24 ct 
+3175 -41 l  3160 -56 l  p ef
+3283 -56 m  3266 -56 3252 -41 3252 -24 ct 3252 -7 3266 6 3282 6 ct 3300 6 3315 -7 3315 -24 ct 
+3315 -41 l  3300 -56 l  p ef
+3423 -56 m  3406 -56 3392 -41 3392 -24 ct 3392 -7 3406 6 3422 6 ct 3440 6 3455 -7 3455 -24 ct 
+3455 -41 l  3440 -56 l  p ef
+3563 -56 m  3546 -56 3532 -41 3532 -24 ct 3532 -7 3546 6 3562 6 ct 3580 6 3595 -7 3595 -24 ct 
+3595 -41 l  3580 -56 l  p ef
+3702 -56 m  3685 -56 3671 -41 3671 -24 ct 3671 -7 3685 6 3701 6 ct 3719 6 3734 -7 3734 -24 ct 
+3734 -41 l  3719 -56 l  p ef
+3842 -56 m  3825 -56 3811 -41 3811 -24 ct 3811 -7 3825 6 3841 6 ct 3859 6 3874 -7 3874 -24 ct 
+3874 -41 l  3859 -56 l  p ef
+3982 -56 m  3965 -56 3951 -41 3951 -24 ct 3951 -7 3965 6 3981 6 ct 3999 6 4014 -7 4014 -24 ct 
+4014 -41 l  3999 -56 l  p ef
+4121 -56 m  4104 -56 4090 -41 4090 -24 ct 4090 -7 4104 6 4120 6 ct 4138 6 4153 -7 4153 -24 ct 
+4153 -41 l  4138 -56 l  p ef
+4261 -56 m  4244 -56 4230 -41 4230 -24 ct 4230 -7 4244 6 4260 6 ct 4278 6 4293 -7 4293 -24 ct 
+4293 -41 l  4278 -56 l  p ef
+4401 -56 m  4384 -56 4370 -41 4370 -24 ct 4370 -7 4384 6 4400 6 ct 4418 6 4433 -7 4433 -24 ct 
+4433 -41 l  4418 -56 l  p ef
+4540 -56 m  4523 -56 4509 -41 4509 -24 ct 4509 -7 4523 6 4539 6 ct 4557 6 4572 -7 4572 -24 ct 
+4572 -41 l  4557 -56 l  p ef
+4680 -56 m  4663 -56 4649 -41 4649 -24 ct 4649 -7 4663 6 4679 6 ct 4697 6 4712 -7 4712 -24 ct 
+4712 -41 l  4697 -56 l  p ef
+4820 -56 m  4803 -56 4789 -41 4789 -24 ct 4789 -7 4803 6 4819 6 ct 4837 6 4852 -7 4852 -24 ct 
+4852 -41 l  4837 -56 l  p ef
+4960 -56 m  4943 -56 4929 -41 4929 -24 ct 4929 -7 4943 6 4959 6 ct 4977 6 4992 -7 4992 -24 ct 
+4992 -41 l  4977 -56 l  p ef
+pom
+pum
+3916 21243 t
+249 -37 m  239 -29 232 -26 224 -26 ct 211 -26 207 -34 207 -59 ct 207 -169 l 
+207 -198 204 -214 196 -228 ct 183 -248 159 -259 126 -259 ct 73 -259 31 -231 31 -196 ct 
+31 -183 42 -172 55 -172 ct 69 -172 81 -183 81 -195 ct 81 -197 80 -200 80 -204 ct 
+78 -209 78 -214 78 -218 ct 78 -233 96 -245 119 -245 ct 146 -245 161 -229 161 -199 ct 
+161 -164 l  75 -129 65 -125 41 -103 ct 28 -92 20 -73 20 -54 ct 20 -19 45 5 80 5 ct 
+104 5 128 -6 162 -35 ct 165 -6 175 5 198 5 ct 217 5 229 -1 249 -22 ct p
+161 -69 m  161 -51 159 -46 147 -40 ct 133 -32 117 -27 106 -27 ct 86 -27 70 -46 70 -70 ct 
+70 -72 l  70 -106 93 -126 161 -151 ct p ef
+260 -351 m  264 -351 l  270 -351 277 -352 281 -352 ct 299 -352 305 -344 305 -318 ct 
+305 -49 l  305 -18 297 -11 261 -8 ct 261 0 l  394 0 l  394 -8 l  359 -10 352 -16 352 -47 ct 
+352 -384 l  350 -385 l  321 -375 299 -369 260 -360 ct p ef
+504 -259 m  417 -228 l  417 -219 l  421 -220 l  428 -221 435 -222 440 -222 ct 
+454 -222 459 -213 459 -188 ct 459 -57 l  459 -16 453 -10 415 -8 ct 415 0 l  548 0 l 
+548 -8 l  511 -11 506 -16 506 -57 ct 506 -257 l  p
+478 -385 m  462 -385 449 -372 449 -356 ct 449 -340 462 -327 478 -327 ct 494 -327 507 -340 507 -356 ct 
+507 -372 l  494 -385 l  p ef
+812 -37 m  802 -29 795 -26 787 -26 ct 774 -26 770 -34 770 -59 ct 770 -169 l 
+770 -198 767 -214 759 -228 ct 746 -248 722 -259 689 -259 ct 636 -259 594 -231 594 -196 ct 
+594 -183 605 -172 618 -172 ct 632 -172 644 -183 644 -195 ct 644 -197 643 -200 643 -204 ct 
+641 -209 641 -214 641 -218 ct 641 -233 659 -245 682 -245 ct 709 -245 724 -229 724 -199 ct 
+724 -164 l  638 -129 628 -125 604 -103 ct 591 -92 583 -73 583 -54 ct 583 -19 608 5 643 5 ct 
+667 5 691 -6 725 -35 ct 728 -6 738 5 761 5 ct 780 5 792 -1 812 -22 ct p
+724 -69 m  724 -51 722 -46 710 -40 ct 696 -32 680 -27 669 -27 ct 649 -27 633 -46 633 -70 ct 
+633 -72 l  633 -106 656 -126 724 -151 ct p ef
+990 -177 m  988 -253 l  982 -253 l  981 -252 l  976 -248 975 -248 973 -248 ct 
+969 -248 964 -249 957 -252 ct 945 -256 933 -258 918 -258 ct 873 -258 841 -230 841 -189 ct 
+841 -157 859 -135 907 -108 ct 940 -89 l  960 -78 969 -64 969 -47 ct 969 -22 951 -6 922 -6 ct 
+903 -6 886 -14 875 -26 ct 863 -40 858 -53 851 -85 ct 842 -85 l  842 2 l  849 2 l 
+853 -3 855 -4 862 -4 ct 867 -4 875 -3 888 0 ct 904 3 919 5 929 5 ct 973 5 1009 -27 1009 -66 ct 
+1009 -94 995 -113 961 -133 ct 900 -169 l  885 -178 876 -192 876 -208 ct 876 -230 894 -246 920 -246 ct 
+952 -246 969 -227 982 -177 ct p ef
+1109 -258 m  1092 -258 1078 -244 1078 -226 ct 1078 -210 1092 -196 1109 -196 ct 
+1126 -196 1141 -210 1141 -226 ct 1141 -244 l  1126 -258 l  p
+1109 -56 m  1092 -56 1078 -41 1078 -24 ct 1078 -7 1092 6 1109 6 ct 1126 6 1141 -7 1141 -24 ct 
+1141 -41 l  1126 -56 l  p ef
+1472 -349 m  1472 -67 l  1472 -19 1466 -13 1419 -10 ct 1419 0 l  1583 0 l 
+1583 -10 l  1537 -12 1529 -20 1529 -61 ct 1529 -349 l  1560 -349 l  1624 -349 1636 -339 1649 -277 ct 
+1663 -277 l  1660 -373 l  1341 -373 l  1338 -277 l  1352 -277 l  1365 -338 1378 -349 1441 -349 ct 
+p ef
+1677 -221 m  1682 -222 1686 -222 1691 -222 ct 1710 -222 1714 -216 1714 -190 ct 
+1714 73 l  1714 103 1708 109 1674 112 ct 1674 122 l  1811 122 l  1811 112 l 
+1769 111 1761 105 1761 69 ct 1761 -18 l  1781 0 1794 5 1818 5 ct 1885 5 1937 -57 1937 -139 ct 
+1937 -209 1897 -259 1842 -259 ct 1811 -259 1786 -245 1761 -214 ct 1761 -258 l 
+1758 -259 l  1727 -247 1708 -240 1677 -230 ct p
+1761 -188 m  1761 -205 1793 -225 1819 -225 ct 1860 -225 1888 -182 1888 -117 ct 
+1888 -54 1860 -12 1820 -12 ct 1793 -12 1761 -32 1761 -49 ct p ef
+2180 -87 m  2153 -48 2133 -34 2100 -34 ct 2049 -34 2013 -80 2013 -144 ct 2013 -203 2044 -243 2090 -243 ct 
+2110 -243 2117 -236 2123 -216 ct 2126 -203 l  2131 -187 2141 -177 2153 -177 ct 
+2168 -177 2180 -188 2180 -201 ct 2180 -232 2140 -259 2093 -259 ct 2065 -259 2037 -248 2014 -227 ct 
+1985 -203 1970 -164 1970 -120 ct 1970 -46 2014 5 2077 5 ct 2102 5 2125 -3 2145 -20 ct 
+2160 -34 2171 -49 2188 -82 ct p ef
+2349 -349 m  2349 -67 l  2349 -19 2343 -13 2296 -10 ct 2296 0 l  2460 0 l 
+2460 -10 l  2414 -12 2406 -20 2406 -61 ct 2406 -349 l  2437 -349 l  2501 -349 2513 -339 2526 -277 ct 
+2540 -277 l  2537 -373 l  2218 -373 l  2215 -277 l  2229 -277 l  2242 -338 2255 -349 2318 -349 ct 
+p ef
+2778 -92 m  2751 -49 2726 -33 2690 -33 ct 2658 -33 2634 -49 2617 -81 ct 2607 -103 2603 -121 2602 -156 ct 
+2776 -156 l  2771 -192 2766 -209 2752 -227 ct 2735 -247 2709 -259 2679 -259 ct 
+2651 -259 2625 -249 2603 -230 ct 2577 -206 2562 -166 2562 -120 ct 2562 -42 2602 5 2667 5 ct 
+2721 5 2763 -27 2787 -88 ct p
+2603 -174 m  2610 -218 2629 -239 2663 -239 ct 2698 -239 2711 -223 2718 -174 ct 
+p ef
+2808 -224 m  2816 -226 2820 -226 2826 -226 ct 2841 -226 2846 -217 2846 -190 ct 
+2846 -47 l  2846 -17 2838 -9 2807 -8 ct 2807 0 l  2932 0 l  2932 -8 l  2902 -9 2893 -15 2893 -37 ct 
+2893 -196 l  2893 -197 2898 -203 2902 -207 ct 2916 -220 2940 -230 2960 -230 ct 
+2985 -230 2997 -210 2997 -170 ct 2997 -48 l  2997 -16 2991 -10 2959 -8 ct 2959 0 l 
+3085 0 l  3085 -8 l  3053 -9 3045 -18 3045 -53 ct 3045 -195 l  3061 -219 3080 -230 3106 -230 ct 
+3138 -230 3148 -214 3148 -168 ct 3148 -49 l  3148 -16 3144 -12 3111 -8 ct 3111 0 l 
+3235 0 l  3235 -8 l  3220 -9 l  3203 -10 3196 -20 3196 -42 ct 3196 -159 l 
+3196 -225 3174 -259 3130 -259 ct 3098 -259 3069 -244 3038 -212 ct 3028 -244 3009 -259 2979 -259 ct 
+2954 -259 2938 -251 2891 -216 ct 2891 -258 l  2887 -259 l  2858 -248 2839 -242 2808 -234 ct 
+p ef
+3239 -221 m  3244 -222 3248 -222 3253 -222 ct 3272 -222 3276 -216 3276 -190 ct 
+3276 73 l  3276 103 3270 109 3236 112 ct 3236 122 l  3373 122 l  3373 112 l 
+3331 111 3323 105 3323 69 ct 3323 -18 l  3343 0 3356 5 3380 5 ct 3447 5 3499 -57 3499 -139 ct 
+3499 -209 3459 -259 3404 -259 ct 3373 -259 3348 -245 3323 -214 ct 3323 -258 l 
+3320 -259 l  3289 -247 3270 -240 3239 -230 ct p
+3323 -188 m  3323 -205 3355 -225 3381 -225 ct 3422 -225 3450 -182 3450 -117 ct 
+3450 -54 3422 -12 3382 -12 ct 3355 -12 3323 -32 3323 -49 ct p ef
+3770 -381 m  3758 -381 l  3756 -368 3749 -362 3740 -362 ct 3734 -362 3724 -364 3715 -368 ct 
+3694 -376 3673 -381 3655 -381 ct 3631 -381 3606 -371 3587 -355 ct 3568 -337 3558 -314 3558 -284 ct 
+3558 -239 3582 -208 3646 -174 ct 3686 -153 3715 -130 3730 -108 ct 3735 -101 3737 -89 3737 -76 ct 
+3737 -38 3709 -12 3668 -12 ct 3618 -12 3582 -43 3554 -112 ct 3541 -112 l  3558 7 l 
+3571 7 l  3571 -3 3578 -11 3586 -11 ct 3593 -11 3602 -9 3613 -5 ct 3634 3 3657 7 3679 7 ct 
+3744 7 3794 -36 3794 -94 ct 3794 -141 3763 -177 3689 -217 ct 3630 -250 3606 -275 3606 -305 ct 
+3606 -336 3630 -358 3665 -358 ct 3690 -358 3714 -347 3734 -327 ct 3751 -309 3759 -294 3768 -261 ct 
+3782 -261 l  p ef
+4061 -92 m  4034 -49 4009 -33 3973 -33 ct 3941 -33 3917 -49 3900 -81 ct 3890 -103 3886 -121 3885 -156 ct 
+4059 -156 l  4054 -192 4049 -209 4035 -227 ct 4018 -247 3992 -259 3962 -259 ct 
+3934 -259 3908 -249 3886 -230 ct 3860 -206 3845 -166 3845 -120 ct 3845 -42 3885 5 3950 5 ct 
+4004 5 4046 -27 4070 -88 ct p
+3886 -174 m  3893 -218 3912 -239 3946 -239 ct 3981 -239 3994 -223 4001 -174 ct 
+p ef
+4305 -87 m  4278 -48 4258 -34 4225 -34 ct 4174 -34 4138 -80 4138 -144 ct 4138 -203 4169 -243 4215 -243 ct 
+4235 -243 4242 -236 4248 -216 ct 4251 -203 l  4256 -187 4266 -177 4278 -177 ct 
+4293 -177 4305 -188 4305 -201 ct 4305 -232 4265 -259 4218 -259 ct 4190 -259 4162 -248 4139 -227 ct 
+4110 -203 4095 -164 4095 -120 ct 4095 -46 4139 5 4202 5 ct 4227 5 4250 -3 4270 -20 ct 
+4285 -34 4296 -49 4313 -82 ct p ef
+4474 -253 m  4417 -253 l  4417 -319 l  4417 -324 4417 -326 4413 -326 ct 4409 -321 4406 -316 4402 -310 ct 
+4381 -279 4356 -252 4347 -250 ct 4341 -246 4338 -242 4338 -239 ct 4338 -238 4338 -236 4340 -235 ct 
+4370 -235 l  4370 -65 l  4370 -18 4387 5 4420 5 ct 4448 5 4469 -7 4488 -37 ct 
+4481 -43 l  4469 -29 4459 -23 4447 -23 ct 4426 -23 4417 -38 4417 -74 ct 4417 -235 l 
+4474 -235 l  p ef
+4630 -381 m  4599 -381 4575 -371 4554 -351 ct 4521 -320 4500 -255 4500 -189 ct 
+4500 -128 4519 -62 4545 -30 ct 4566 -5 4595 7 4628 7 ct 4656 7 4681 -1 4701 -21 ct 
+4734 -52 4755 -117 4755 -186 ct 4755 -301 l  4704 -381 l  p
+4628 -366 m  4675 -366 4701 -302 4701 -184 ct 4701 -67 4676 -6 4628 -6 ct 4579 -6 4554 -67 4554 -184 ct 
+4554 -304 l  4580 -366 l  p ef
+4804 12 m  4867 5 4898 -5 4936 -33 ct 4995 -76 5029 -146 5029 -222 ct 5029 -315 4977 -381 4905 -381 ct 
+4838 -381 4787 -324 4787 -248 ct 4787 -179 4828 -133 4889 -133 ct 4920 -133 4944 -142 4974 -165 ct 
+4950 -73 4888 -13 4802 1 ct p
+4975 -200 m  4975 -188 4972 -183 4966 -178 ct 4950 -165 4930 -157 4909 -157 ct 
+4866 -157 4839 -200 4839 -267 ct 4839 -299 4848 -333 4860 -347 ct 4870 -359 4884 -365 4900 -365 ct 
+4949 -365 4975 -316 4975 -222 ct p ef
+pom
+gr
+gr
+0 26640 t 
+pom
+count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore
+%%PageTrailer
+%%Trailer
+%%EOF
diff --git a/SHUTTLE/doc/pics/ShuttleSchema.eps b/SHUTTLE/doc/pics/ShuttleSchema.eps
new file mode 100644 (file)
index 0000000..cabd900
--- /dev/null
@@ -0,0 +1,936 @@
+%!PS-Adobe-3.0 EPSF-3.0 
+%%BoundingBox: 0 0 575 755
+%%Pages: 0
+%%Creator: Sun Microsystems, Inc.
+%%Title: none
+%%CreationDate: none
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+%%BeginResource: SDRes
+/b4_inc_state save def
+/dict_count countdictstack def
+/op_count count 1 sub def
+userdict begin
+0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath
+/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if
+/bdef {bind def} bind def
+/c {setrgbcolor} bdef
+/l {neg lineto} bdef
+/rl {neg rlineto} bdef
+/lc {setlinecap} bdef
+/lj {setlinejoin} bdef
+/lw {setlinewidth} bdef
+/ml {setmiterlimit} bdef
+/ld {setdash} bdef
+/m {neg moveto} bdef
+/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef
+/r {rotate} bdef
+/t {neg translate} bdef
+/s {scale} bdef
+/sw {show} bdef
+/gs {gsave} bdef
+/gr {grestore} bdef
+/f {findfont dup length dict begin
+{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def
+currentdict end /NFont exch definefont pop /NFont findfont} bdef
+/p {closepath} bdef
+/sf {scalefont setfont} bdef
+/ef {eofill}bdef
+/pc {closepath stroke}bdef
+/ps {stroke}bdef
+/pum {matrix currentmatrix}bdef
+/pom {setmatrix}bdef
+/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%EndPageSetup
+pum
+0.02833 0.02834 s 
+0 -26640 t
+/tm matrix currentmatrix def
+gs
+tm setmatrix
+-635 -635 t 
+1 1 s 
+635 635 m 20924 635 l 20924 27274 l 635 27274 l 635 635 l eoclip newpath
+0.003 0.722 1.000 c 7596 15845 m  5033 15845 l  5033 14605 l  10160 14605 l 
+10160 15845 l  7596 15845 l  p ef
+0 lw 1 lj 0.003 0.003 0.003 c 7596 15845 m  5033 15845 l  5033 14605 l  10160 14605 l 
+10160 15845 l  7596 15845 l  pc
+gs
+pum
+5847 15494 t
+597 -16 m  559 -18 550 -27 521 -89 ct 310 -570 l  293 -570 l  117 -154 l 
+63 -31 53 -17 12 -16 ct 12 0 l  180 0 l  180 -16 l  139 -16 122 -27 122 -50 ct 
+122 -60 125 -72 129 -83 ct 168 -182 l  390 -182 l  424 -101 l  434 -78 440 -56 440 -44 ct 
+440 -23 426 -16 381 -16 ct 381 0 l  597 0 l  p
+182 -217 m  280 -450 l  378 -217 l  p ef
+626 -527 m  631 -527 l  640 -527 650 -528 657 -528 ct 684 -528 692 -516 692 -477 ct 
+692 -73 l  692 -27 681 -16 627 -12 ct 627 0 l  827 0 l  827 -12 l  774 -16 763 -24 763 -71 ct 
+763 -576 l  760 -577 l  716 -563 684 -554 626 -540 ct p ef
+995 -389 m  863 -342 l  863 -329 l  870 -330 l  880 -332 891 -333 899 -333 ct 
+919 -333 927 -319 927 -282 ct 927 -86 l  927 -25 918 -16 860 -12 ct 860 0 l 
+1061 0 l  1061 -12 l  1005 -16 998 -25 998 -86 ct 998 -386 l  p
+955 -577 m  932 -577 912 -558 912 -534 ct 912 -510 931 -491 955 -491 ct 979 -491 999 -510 999 -534 ct 
+999 -558 l  979 -577 l  p ef
+1462 -571 m  1444 -571 l  1441 -552 1431 -543 1417 -543 ct 1408 -543 1394 -546 1380 -553 ct 
+1348 -565 1317 -571 1290 -571 ct 1254 -571 1216 -557 1188 -532 ct 1159 -506 1144 -471 1144 -427 ct 
+1144 -359 1181 -312 1276 -262 ct 1336 -230 1380 -195 1402 -163 ct 1409 -152 1413 -134 1413 -114 ct 
+1413 -57 1371 -18 1309 -18 ct 1234 -18 1181 -65 1138 -168 ct 1119 -168 l  1144 11 l 
+1163 11 l  1164 -5 1174 -16 1187 -16 ct 1196 -16 1210 -13 1226 -7 ct 1259 5 1292 11 1326 11 ct 
+1424 11 1499 -54 1499 -142 ct 1499 -211 1452 -266 1341 -326 ct 1252 -375 1216 -412 1216 -458 ct 
+1216 -505 1252 -537 1304 -537 ct 1342 -537 1378 -521 1408 -490 ct 1434 -463 1446 -441 1459 -391 ct 
+1480 -391 l  p ef
+1686 -290 m  1722 -329 1747 -343 1780 -343 ct 1823 -343 1844 -313 1844 -253 ct 
+1844 -86 l  1844 -28 1835 -17 1786 -12 ct 1786 0 l  1966 0 l  1966 -12 l 
+1920 -21 1915 -27 1915 -86 ct 1915 -254 l  1915 -343 1879 -389 1811 -389 ct 
+1761 -389 1725 -368 1686 -318 ct 1686 -575 l  1682 -577 l  1653 -567 1632 -560 1585 -547 ct 
+1562 -540 l  1562 -527 l  1565 -527 1568 -527 1572 -527 ct 1608 -527 1615 -521 1615 -484 ct 
+1615 -86 l  1615 -27 1610 -19 1561 -12 ct 1561 0 l  1744 0 l  1744 -12 l 
+1695 -17 1686 -27 1686 -86 ct p ef
+2382 -42 m  2378 -42 l  2339 -42 2329 -51 2329 -90 ct 2329 -380 l  2196 -380 l 
+2196 -366 l  2248 -363 2258 -355 2258 -313 ct 2258 -114 l  2258 -90 2254 -78 2242 -69 ct 
+2219 -50 2193 -40 2168 -40 ct 2135 -40 2108 -69 2108 -104 ct 2108 -380 l  1984 -380 l 
+1984 -368 l  2025 -366 2037 -353 2037 -314 ct 2037 -101 l  2037 -34 2077 8 2139 8 ct 
+2170 8 2203 -5 2226 -27 ct 2262 -64 l  2262 5 l  2266 7 l  2308 -9 2339 -18 2382 -30 ct 
+p ef
+2615 -380 m  2530 -380 l  2530 -478 l  2530 -487 2529 -489 2524 -489 ct 2518 -482 2513 -474 2507 -466 ct 
+2475 -419 2438 -379 2425 -375 ct 2416 -369 2411 -363 2411 -359 ct 2411 -357 2411 -355 2414 -353 ct 
+2459 -353 l  2459 -98 l  2459 -27 2484 8 2534 8 ct 2575 8 2608 -11 2636 -55 ct 
+2625 -65 l  2607 -43 2592 -35 2574 -35 ct 2542 -35 2530 -58 2530 -111 ct 2530 -353 l 
+2615 -353 l  p ef
+2852 -380 m  2767 -380 l  2767 -478 l  2767 -487 2766 -489 2761 -489 ct 2755 -482 2750 -474 2744 -466 ct 
+2712 -419 2675 -379 2662 -375 ct 2653 -369 2648 -363 2648 -359 ct 2648 -357 2648 -355 2651 -353 ct 
+2696 -353 l  2696 -98 l  2696 -27 2721 8 2771 8 ct 2812 8 2845 -11 2873 -55 ct 
+2862 -65 l  2844 -43 2829 -35 2811 -35 ct 2779 -35 2767 -58 2767 -111 ct 2767 -353 l 
+2852 -353 l  p ef
+2890 -527 m  2895 -527 l  2904 -527 2914 -528 2921 -528 ct 2948 -528 2956 -516 2956 -477 ct 
+2956 -73 l  2956 -27 2945 -16 2891 -12 ct 2891 0 l  3091 0 l  3091 -12 l 
+3038 -16 3027 -24 3027 -71 ct 3027 -576 l  3024 -577 l  2980 -563 2948 -554 2890 -540 ct 
+p ef
+3457 -138 m  3416 -74 3380 -49 3326 -49 ct 3277 -49 3241 -74 3216 -122 ct 3201 -154 3195 -182 3194 -234 ct 
+3454 -234 l  3447 -289 3439 -313 3418 -340 ct 3392 -371 3353 -389 3309 -389 ct 
+3267 -389 3227 -373 3195 -345 ct 3155 -310 3133 -250 3133 -181 ct 3133 -64 3194 8 3291 8 ct 
+3371 8 3435 -41 3470 -132 ct p
+3195 -261 m  3205 -327 3233 -358 3285 -358 ct 3337 -358 3357 -335 3368 -261 ct 
+p ef
+pom
+gr
+0.003 0.722 1.000 c 16777 15845 m  12829 15845 l  12829 14605 l  20725 14605 l 
+20725 15845 l  16777 15845 l  p ef
+0.003 0.003 0.003 c 16777 15845 m  12829 15845 l  12829 14605 l  20725 14605 l 
+20725 15845 l  16777 15845 l  pc
+gs
+pum
+13150 15494 t
+597 -16 m  559 -18 550 -27 521 -89 ct 310 -570 l  293 -570 l  117 -154 l 
+63 -31 53 -17 12 -16 ct 12 0 l  180 0 l  180 -16 l  139 -16 122 -27 122 -50 ct 
+122 -60 125 -72 129 -83 ct 168 -182 l  390 -182 l  424 -101 l  434 -78 440 -56 440 -44 ct 
+440 -23 426 -16 381 -16 ct 381 0 l  597 0 l  p
+182 -217 m  280 -450 l  378 -217 l  p ef
+626 -527 m  631 -527 l  640 -527 650 -528 657 -528 ct 684 -528 692 -516 692 -477 ct 
+692 -73 l  692 -27 681 -16 627 -12 ct 627 0 l  827 0 l  827 -12 l  774 -16 763 -24 763 -71 ct 
+763 -576 l  760 -577 l  716 -563 684 -554 626 -540 ct p ef
+995 -389 m  863 -342 l  863 -329 l  870 -330 l  880 -332 891 -333 899 -333 ct 
+919 -333 927 -319 927 -282 ct 927 -86 l  927 -25 918 -16 860 -12 ct 860 0 l 
+1061 0 l  1061 -12 l  1005 -16 998 -25 998 -86 ct 998 -386 l  p
+955 -577 m  932 -577 912 -558 912 -534 ct 912 -510 931 -491 955 -491 ct 979 -491 999 -510 999 -534 ct 
+999 -558 l  979 -577 l  p ef
+1608 -380 m  1600 -571 l  1583 -571 l  1578 -554 1564 -543 1547 -543 ct 1540 -543 1527 -546 1514 -551 ct 
+1473 -565 1430 -571 1391 -571 ct 1321 -571 1251 -545 1199 -499 ct 1139 -446 1107 -368 1107 -274 ct 
+1107 -196 1133 -123 1176 -75 ct 1226 -20 1304 11 1388 11 ct 1484 11 1567 -27 1619 -95 ct 
+1604 -110 l  1541 -50 1485 -25 1415 -25 ct 1362 -25 1314 -42 1278 -74 ct 1232 -115 1205 -192 1205 -285 ct 
+1205 -439 1284 -538 1407 -538 ct 1455 -538 1499 -520 1533 -486 ct 1560 -459 1572 -435 1589 -380 ct 
+p ef
+1734 -92 m  1734 -31 1724 -20 1660 -16 ct 1660 0 l  1900 0 l  1998 0 2087 -27 2140 -75 ct 
+2195 -125 2226 -200 2226 -282 ct 2226 -358 2201 -424 2154 -471 ct 2097 -529 2004 -560 1888 -560 ct 
+1660 -560 l  1660 -543 l  1727 -538 1734 -530 1734 -467 ct p
+1821 -495 m  1821 -521 1830 -528 1865 -528 ct 1938 -528 1993 -515 2033 -486 ct 
+2099 -440 2134 -368 2134 -276 ct 2134 -176 2099 -105 2031 -65 ct 1987 -41 1938 -31 1865 -31 ct 
+1831 -31 1821 -38 1821 -65 ct p ef
+2270 -560 m  2270 -543 l  2341 -539 2351 -530 2351 -467 ct 2351 -92 l  2351 -29 2340 -18 2270 -16 ct 
+2270 0 l  2552 0 l  2618 0 2679 -17 2710 -46 ct 2740 -73 2757 -111 2757 -152 ct 
+2757 -189 2742 -223 2716 -247 ct 2690 -270 2668 -280 2613 -294 ct 2657 -305 2674 -313 2695 -331 ct 
+2716 -350 2728 -381 2728 -416 ct 2728 -510 2653 -560 2507 -560 ct p
+2437 -275 m  2519 -275 2558 -271 2589 -258 ct 2637 -238 2660 -204 2660 -151 ct 
+2660 -105 2642 -72 2608 -53 ct 2581 -38 2547 -31 2491 -31 ct 2449 -31 2437 -38 2437 -65 ct 
+p
+2437 -309 m  2437 -503 l  2437 -521 2443 -528 2456 -528 ct 2493 -528 l  2591 -528 2642 -488 2642 -412 ct 
+2642 -346 2597 -309 2518 -309 ct p ef
+2989 -246 m  3011 -244 3026 -243 3048 -243 ct 3114 -243 3159 -252 3196 -272 ct 
+3247 -299 3277 -351 3277 -406 ct 3277 -442 3265 -474 3242 -499 ct 3209 -536 3135 -560 3055 -560 ct 
+2832 -560 l  2832 -543 l  2895 -537 2903 -528 2903 -467 ct 2903 -101 l  2903 -30 2896 -22 2832 -16 ct 
+2832 0 l  3069 0 l  3069 -16 l  3002 -18 2989 -30 2989 -92 ct p
+2989 -499 m  2989 -522 2995 -528 3018 -528 ct 3132 -528 3185 -488 3185 -401 ct 
+3185 -319 3135 -277 3038 -277 ct 3021 -277 3009 -278 2989 -280 ct p ef
+3294 -329 m  3306 -332 3314 -333 3324 -333 ct 3345 -333 3353 -319 3353 -282 ct 
+3353 -71 l  3353 -28 3347 -22 3293 -12 ct 3293 0 l  3496 0 l  3496 -12 l 
+3438 -15 3424 -27 3424 -76 ct 3424 -266 l  3424 -293 3460 -335 3483 -335 ct 
+3488 -335 3496 -331 3505 -323 ct 3519 -311 3528 -306 3539 -306 ct 3559 -306 3572 -320 3572 -344 ct 
+3572 -372 3554 -389 3525 -389 ct 3490 -389 3465 -369 3424 -309 ct 3424 -387 l 
+3420 -389 l  3375 -370 3344 -359 3294 -343 ct p ef
+3918 -138 m  3877 -74 3841 -49 3787 -49 ct 3738 -49 3702 -74 3677 -122 ct 3662 -154 3656 -182 3655 -234 ct 
+3915 -234 l  3908 -289 3900 -313 3879 -340 ct 3853 -371 3814 -389 3770 -389 ct 
+3728 -389 3688 -373 3656 -345 ct 3616 -310 3594 -250 3594 -181 ct 3594 -64 3655 8 3752 8 ct 
+3832 8 3896 -41 3931 -132 ct p
+3656 -261 m  3666 -327 3694 -358 3746 -358 ct 3798 -358 3818 -335 3829 -261 ct 
+p ef
+4120 -246 m  4142 -244 4157 -243 4179 -243 ct 4245 -243 4290 -252 4327 -272 ct 
+4378 -299 4408 -351 4408 -406 ct 4408 -442 4396 -474 4373 -499 ct 4340 -536 4266 -560 4186 -560 ct 
+3963 -560 l  3963 -543 l  4026 -537 4034 -528 4034 -467 ct 4034 -101 l  4034 -30 4027 -22 3963 -16 ct 
+3963 0 l  4200 0 l  4200 -16 l  4133 -18 4120 -30 4120 -92 ct p
+4120 -499 m  4120 -522 4126 -528 4149 -528 ct 4263 -528 4316 -488 4316 -401 ct 
+4316 -319 4266 -277 4169 -277 ct 4152 -277 4140 -278 4120 -280 ct p ef
+4425 -329 m  4437 -332 4445 -333 4455 -333 ct 4476 -333 4484 -319 4484 -282 ct 
+4484 -71 l  4484 -28 4478 -22 4424 -12 ct 4424 0 l  4627 0 l  4627 -12 l 
+4569 -15 4555 -27 4555 -76 ct 4555 -266 l  4555 -293 4591 -335 4614 -335 ct 
+4619 -335 4627 -331 4636 -323 ct 4650 -311 4659 -306 4670 -306 ct 4690 -306 4703 -320 4703 -344 ct 
+4703 -372 4685 -389 4656 -389 ct 4621 -389 4596 -369 4555 -309 ct 4555 -387 l 
+4551 -389 l  4506 -370 4475 -359 4425 -343 ct p ef
+4914 -389 m  4804 -389 4727 -307 4727 -191 ct 4727 -76 4806 8 4912 8 ct 5019 8 5100 -81 5100 -197 ct 
+5100 -308 l  5022 -389 l  p
+4903 -365 m  4974 -365 5024 -284 5024 -168 ct 5024 -72 4986 -15 4922 -15 ct 
+4889 -15 4858 -35 4840 -69 ct 4817 -113 4803 -172 4803 -232 ct 4803 -313 l  4843 -365 l 
+p ef
+5463 -131 m  5423 -72 5392 -52 5344 -52 ct 5267 -52 5213 -120 5213 -217 ct 5213 -304 5259 -364 5328 -364 ct 
+5358 -364 5369 -355 5378 -324 ct 5383 -305 l  5390 -281 5405 -266 5423 -266 ct 
+5445 -266 5463 -282 5463 -302 ct 5463 -349 5404 -389 5333 -389 ct 5291 -389 5248 -372 5214 -341 ct 
+5171 -304 5148 -247 5148 -180 ct 5148 -70 5214 8 5308 8 ct 5346 8 5380 -5 5411 -31 ct 
+5434 -51 5450 -74 5475 -124 ct p ef
+5848 -138 m  5807 -74 5771 -49 5717 -49 ct 5668 -49 5632 -74 5607 -122 ct 5592 -154 5586 -182 5585 -234 ct 
+5845 -234 l  5838 -289 5830 -313 5809 -340 ct 5783 -371 5744 -389 5700 -389 ct 
+5658 -389 5618 -373 5586 -345 ct 5546 -310 5524 -250 5524 -181 ct 5524 -64 5585 8 5682 8 ct 
+5762 8 5826 -41 5861 -132 ct p
+5586 -261 m  5596 -327 5624 -358 5676 -358 ct 5728 -358 5748 -335 5759 -261 ct 
+p ef
+6146 -265 m  6143 -380 l  6133 -380 l  6132 -379 l  6124 -373 6123 -372 6120 -372 ct 
+6115 -372 6106 -373 6097 -378 ct 6078 -384 6060 -388 6038 -388 ct 5971 -388 5923 -345 5923 -284 ct 
+5923 -236 5950 -203 6022 -162 ct 6071 -134 l  6100 -117 6115 -97 6115 -71 ct 
+6115 -33 6088 -10 6044 -10 ct 6016 -10 5989 -21 5973 -39 ct 5956 -60 5948 -80 5937 -128 ct 
+5923 -128 l  5923 3 l  5934 3 l  5940 -5 5944 -6 5954 -6 ct 5962 -6 5973 -5 5993 0 ct 
+6017 5 6039 8 6055 8 ct 6120 8 6174 -40 6174 -99 ct 6174 -142 6154 -170 6103 -200 ct 
+6011 -254 l  5988 -268 5975 -289 5975 -312 ct 5975 -346 6001 -369 6040 -369 ct 
+6088 -369 6114 -340 6133 -265 ct p ef
+6476 -265 m  6473 -380 l  6463 -380 l  6462 -379 l  6454 -373 6453 -372 6450 -372 ct 
+6445 -372 6436 -373 6427 -378 ct 6408 -384 6390 -388 6368 -388 ct 6301 -388 6253 -345 6253 -284 ct 
+6253 -236 6280 -203 6352 -162 ct 6401 -134 l  6430 -117 6445 -97 6445 -71 ct 
+6445 -33 6418 -10 6374 -10 ct 6346 -10 6319 -21 6303 -39 ct 6286 -60 6278 -80 6267 -128 ct 
+6253 -128 l  6253 3 l  6264 3 l  6270 -5 6274 -6 6284 -6 ct 6292 -6 6303 -5 6323 0 ct 
+6347 5 6369 8 6385 8 ct 6450 8 6504 -40 6504 -99 ct 6504 -142 6484 -170 6433 -200 ct 
+6341 -254 l  6318 -268 6305 -289 6305 -312 ct 6305 -346 6331 -369 6370 -369 ct 
+6418 -369 6444 -340 6463 -265 ct p ef
+6752 -389 m  6642 -389 6565 -307 6565 -191 ct 6565 -76 6644 8 6750 8 ct 6857 8 6938 -81 6938 -197 ct 
+6938 -308 l  6860 -389 l  p
+6741 -365 m  6812 -365 6862 -284 6862 -168 ct 6862 -72 6824 -15 6760 -15 ct 
+6727 -15 6696 -35 6678 -69 ct 6655 -113 6641 -172 6641 -232 ct 6641 -313 l  6681 -365 l 
+p ef
+6969 -329 m  6981 -332 6989 -333 6999 -333 ct 7020 -333 7028 -319 7028 -282 ct 
+7028 -71 l  7028 -28 7022 -22 6968 -12 ct 6968 0 l  7171 0 l  7171 -12 l 
+7113 -15 7099 -27 7099 -76 ct 7099 -266 l  7099 -293 7135 -335 7158 -335 ct 
+7163 -335 7171 -331 7180 -323 ct 7194 -311 7203 -306 7214 -306 ct 7234 -306 7247 -320 7247 -344 ct 
+7247 -372 7229 -389 7200 -389 ct 7165 -389 7140 -369 7099 -309 ct 7099 -387 l 
+7095 -389 l  7050 -370 7019 -359 6969 -343 ct p ef
+pom
+gr
+gs
+10230 10260 m 17957 10260 l 17957 11530 l 10230 11530 l 10230 10260 l eoclip newpath
+gs
+tm setmatrix
+9594.76585 9625.03305 t 
+0.85552 0.53179 s 
+gr
+gr
+1.000 1.000 0.003 c 16975 7620 m  13165 7620 l  13165 1905 l  20785 1905 l 
+20785 7620 l  16975 7620 l  p ef
+0.003 0.003 0.003 c 16975 7620 m  13165 7620 l  13165 1905 l  20785 1905 l 
+20785 7620 l  16975 7620 l  pc
+1.000 0.003 0.003 c 17092 7585 m  14235 7585 l  14235 6315 l  19950 6315 l 
+19950 7585 l  17092 7585 l  p ef
+0.003 0.003 0.003 c 17092 7585 m  14235 7585 l  14235 6315 l  19950 6315 l 
+19950 7585 l  17092 7585 l  pc
+gs
+pum
+15187 7212 t
+597 -16 m  559 -18 550 -27 521 -89 ct 310 -570 l  293 -570 l  117 -154 l 
+63 -31 53 -17 12 -16 ct 12 0 l  180 0 l  180 -16 l  139 -16 122 -27 122 -50 ct 
+122 -60 125 -72 129 -83 ct 168 -182 l  390 -182 l  424 -101 l  434 -78 440 -56 440 -44 ct 
+440 -23 426 -16 381 -16 ct 381 0 l  597 0 l  p
+182 -217 m  280 -450 l  378 -217 l  p ef
+1180 -484 m  1180 -101 l  1180 -31 1170 -20 1103 -16 ct 1103 0 l  1340 0 l 
+1340 -16 l  1278 -20 1266 -32 1266 -92 ct 1266 -467 l  1266 -527 1277 -538 1340 -543 ct 
+1340 -560 l  1171 -560 l  984 -132 l  789 -560 l  621 -560 l  621 -543 l 
+691 -539 702 -529 702 -467 ct 702 -124 l  702 -37 690 -21 620 -16 ct 620 0 l 
+818 0 l  818 -16 l  753 -19 739 -38 739 -124 ct 739 -465 l  951 0 l  963 0 l 
+p ef
+1960 -16 m  1922 -18 1913 -27 1884 -89 ct 1673 -570 l  1656 -570 l  1480 -154 l 
+1426 -31 1416 -17 1375 -16 ct 1375 0 l  1543 0 l  1543 -16 l  1502 -16 1485 -27 1485 -50 ct 
+1485 -60 1488 -72 1492 -83 ct 1531 -182 l  1753 -182 l  1787 -101 l  1797 -78 1803 -56 1803 -44 ct 
+1803 -23 1789 -16 1744 -16 ct 1744 0 l  1960 0 l  p
+1545 -217 m  1643 -450 l  1741 -217 l  p ef
+2490 9 m  2490 -435 l  2490 -486 2499 -517 2515 -528 ct 2527 -537 2538 -540 2571 -543 ct 
+2571 -560 l  2372 -560 l  2372 -543 l  2404 -541 2416 -538 2429 -530 ct 2445 -518 2453 -488 2453 -435 ct 
+2453 -150 l  2127 -560 l  1983 -560 l  1983 -543 l  2019 -543 2031 -537 2065 -497 ct 
+2065 -124 l  2065 -37 2053 -21 1983 -16 ct 1983 0 l  2181 0 l  2181 -16 l 
+2116 -19 2102 -38 2102 -124 ct 2102 -456 l  2476 9 l  p ef
+2669 -92 m  2669 -31 2659 -20 2595 -16 ct 2595 0 l  2835 0 l  2933 0 3022 -27 3075 -75 ct 
+3130 -125 3161 -200 3161 -282 ct 3161 -358 3136 -424 3089 -471 ct 3032 -529 2939 -560 2823 -560 ct 
+2595 -560 l  2595 -543 l  2662 -538 2669 -530 2669 -467 ct p
+2756 -495 m  2756 -521 2765 -528 2800 -528 ct 2873 -528 2928 -515 2968 -486 ct 
+3034 -440 3069 -368 3069 -276 ct 3069 -176 3034 -105 2966 -65 ct 2922 -41 2873 -31 2800 -31 ct 
+2766 -31 2756 -38 2756 -65 ct p ef
+3789 -16 m  3751 -18 3742 -27 3713 -89 ct 3502 -570 l  3485 -570 l  3309 -154 l 
+3255 -31 3245 -17 3204 -16 ct 3204 0 l  3372 0 l  3372 -16 l  3331 -16 3314 -27 3314 -50 ct 
+3314 -60 3317 -72 3321 -83 ct 3360 -182 l  3582 -182 l  3616 -101 l  3626 -78 3632 -56 3632 -44 ct 
+3632 -23 3618 -16 3573 -16 ct 3573 0 l  3789 0 l  p
+3374 -217 m  3472 -450 l  3570 -217 l  p ef
+pom
+gr
+0.242 0.921 0.242 c 16975 5615 m  15573 5615 14435 5046 14435 4345 ct 14435 3644 15573 3075 16975 3075 ct 
+18377 3075 19515 3644 19515 4345 ct 19515 5046 18377 5615 16975 5615 ct 16975 5615 l 
+p ef
+0.003 0.003 0.003 c 16975 5615 m  15573 5615 14435 5046 14435 4345 ct 14435 3644 15573 3075 16975 3075 ct 
+18377 3075 19515 3644 19515 4345 ct 19515 5046 18377 5615 16975 5615 ct 16975 5615 l 
+pc
+gs
+pum
+15954 4117 t
+170 -246 m  192 -244 207 -243 229 -243 ct 295 -243 340 -252 377 -272 ct 428 -299 458 -351 458 -406 ct 
+458 -442 446 -474 423 -499 ct 390 -536 316 -560 236 -560 ct 13 -560 l  13 -543 l 
+76 -537 84 -528 84 -467 ct 84 -101 l  84 -30 77 -22 13 -16 ct 13 0 l  250 0 l 
+250 -16 l  183 -18 170 -30 170 -92 ct p
+170 -499 m  170 -522 176 -528 199 -528 ct 313 -528 366 -488 366 -401 ct 366 -319 316 -277 219 -277 ct 
+202 -277 190 -278 170 -280 ct p ef
+1059 -560 m  886 -560 l  886 -543 l  932 -541 947 -532 947 -508 ct 947 -494 942 -472 931 -446 ct 
+807 -136 l  679 -422 l  651 -483 645 -503 645 -516 ct 645 -532 656 -540 684 -542 ct 
+687 -542 696 -543 708 -543 ct 708 -560 l  483 -560 l  483 -543 l  524 -542 536 -530 573 -455 ct 
+781 9 l  794 9 l  981 -465 l  1009 -532 1019 -541 1059 -543 ct p ef
+1458 -571 m  1440 -571 l  1437 -552 1427 -543 1413 -543 ct 1404 -543 1390 -546 1376 -553 ct 
+1344 -565 1313 -571 1286 -571 ct 1250 -571 1212 -557 1184 -532 ct 1155 -506 1140 -471 1140 -427 ct 
+1140 -359 1177 -312 1272 -262 ct 1332 -230 1376 -195 1398 -163 ct 1405 -152 1409 -134 1409 -114 ct 
+1409 -57 1367 -18 1305 -18 ct 1230 -18 1177 -65 1134 -168 ct 1115 -168 l  1140 11 l 
+1159 11 l  1160 -5 1170 -16 1183 -16 ct 1192 -16 1206 -13 1222 -7 ct 1255 5 1288 11 1322 11 ct 
+1420 11 1495 -54 1495 -142 ct 1495 -211 1448 -266 1337 -326 ct 1248 -375 1212 -412 1212 -458 ct 
+1212 -505 1248 -537 1300 -537 ct 1338 -537 1374 -521 1404 -490 ct 1430 -463 1442 -441 1455 -391 ct 
+1476 -391 l  p ef
+1927 -571 m  1909 -571 l  1906 -552 1896 -543 1882 -543 ct 1873 -543 1859 -546 1845 -553 ct 
+1813 -565 1782 -571 1755 -571 ct 1719 -571 1681 -557 1653 -532 ct 1624 -506 1609 -471 1609 -427 ct 
+1609 -359 1646 -312 1741 -262 ct 1801 -230 1845 -195 1867 -163 ct 1874 -152 1878 -134 1878 -114 ct 
+1878 -57 1836 -18 1774 -18 ct 1699 -18 1646 -65 1603 -168 ct 1584 -168 l  1609 11 l 
+1628 11 l  1629 -5 1639 -16 1652 -16 ct 1661 -16 1675 -13 1691 -7 ct 1724 5 1757 11 1791 11 ct 
+1889 11 1964 -54 1964 -142 ct 1964 -211 1917 -266 1806 -326 ct 1717 -375 1681 -412 1681 -458 ct 
+1681 -505 1717 -537 1769 -537 ct 1807 -537 1843 -521 1873 -490 ct 1899 -463 1911 -441 1924 -391 ct 
+1945 -391 l  p ef
+pom
+pum
+16282 5141 t
+87 -92 m  87 -31 77 -20 13 -16 ct 13 0 l  253 0 l  351 0 440 -27 493 -75 ct 
+548 -125 579 -200 579 -282 ct 579 -358 554 -424 507 -471 ct 450 -529 357 -560 241 -560 ct 
+13 -560 l  13 -543 l  80 -538 87 -530 87 -467 ct p
+174 -495 m  174 -521 183 -528 218 -528 ct 291 -528 346 -515 386 -486 ct 452 -440 487 -368 487 -276 ct 
+487 -176 452 -105 384 -65 ct 340 -41 291 -31 218 -31 ct 184 -31 174 -38 174 -65 ct 
+p ef
+1180 -484 m  1180 -101 l  1180 -31 1170 -20 1103 -16 ct 1103 0 l  1340 0 l 
+1340 -16 l  1278 -20 1266 -32 1266 -92 ct 1266 -467 l  1266 -527 1277 -538 1340 -543 ct 
+1340 -560 l  1171 -560 l  984 -132 l  789 -560 l  621 -560 l  621 -543 l 
+691 -539 702 -529 702 -467 ct 702 -124 l  702 -37 690 -21 620 -16 ct 620 0 l 
+818 0 l  818 -16 l  753 -19 739 -38 739 -124 ct 739 -465 l  951 0 l  963 0 l 
+p ef
+pom
+gr
+gs
+pum
+13414 2820 t
+87 -92 m  87 -31 77 -20 13 -16 ct 13 0 l  253 0 l  351 0 440 -27 493 -75 ct 
+548 -125 579 -200 579 -282 ct 579 -358 554 -424 507 -471 ct 450 -529 357 -560 241 -560 ct 
+13 -560 l  13 -543 l  80 -538 87 -530 87 -467 ct p
+174 -495 m  174 -521 183 -528 218 -528 ct 291 -528 346 -515 386 -486 ct 452 -440 487 -368 487 -276 ct 
+487 -176 452 -105 384 -65 ct 340 -41 291 -31 218 -31 ct 184 -31 174 -38 174 -65 ct 
+p ef
+1134 -380 m  1126 -571 l  1109 -571 l  1104 -554 1090 -543 1073 -543 ct 1066 -543 1053 -546 1040 -551 ct 
+999 -565 956 -571 917 -571 ct 847 -571 777 -545 725 -499 ct 665 -446 633 -368 633 -274 ct 
+633 -196 659 -123 702 -75 ct 752 -20 830 11 914 11 ct 1010 11 1093 -27 1145 -95 ct 
+1130 -110 l  1067 -50 1011 -25 941 -25 ct 888 -25 840 -42 804 -74 ct 758 -115 731 -192 731 -285 ct 
+731 -439 810 -538 933 -538 ct 981 -538 1025 -520 1059 -486 ct 1086 -459 1098 -435 1115 -380 ct 
+p ef
+1551 -571 m  1533 -571 l  1530 -552 1520 -543 1506 -543 ct 1497 -543 1483 -546 1469 -553 ct 
+1437 -565 1406 -571 1379 -571 ct 1343 -571 1305 -557 1277 -532 ct 1248 -506 1233 -471 1233 -427 ct 
+1233 -359 1270 -312 1365 -262 ct 1425 -230 1469 -195 1491 -163 ct 1498 -152 1502 -134 1502 -114 ct 
+1502 -57 1460 -18 1398 -18 ct 1323 -18 1270 -65 1227 -168 ct 1208 -168 l  1233 11 l 
+1252 11 l  1253 -5 1263 -16 1276 -16 ct 1285 -16 1299 -13 1315 -7 ct 1348 5 1381 11 1415 11 ct 
+1513 11 1588 -54 1588 -142 ct 1588 -211 1541 -266 1430 -326 ct 1341 -375 1305 -412 1305 -458 ct 
+1305 -505 1341 -537 1393 -537 ct 1431 -537 1467 -521 1497 -490 ct 1523 -463 1535 -441 1548 -391 ct 
+1569 -391 l  p ef
+pom
+gr
+0.003 0.722 1.000 c 14430 11465 m  11171 11465 l  11171 10195 l  17690 10195 l 
+17690 11465 l  14430 11465 l  p ef
+0.003 0.003 0.003 c 14430 11465 m  11171 11465 l  11171 10195 l  17690 10195 l 
+17690 11465 l  14430 11465 l  pc
+gs
+pum
+12039 11102 t
+597 -16 m  559 -18 550 -27 521 -89 ct 310 -570 l  293 -570 l  117 -154 l 
+63 -31 53 -17 12 -16 ct 12 0 l  180 0 l  180 -16 l  139 -16 122 -27 122 -50 ct 
+122 -60 125 -72 129 -83 ct 168 -182 l  390 -182 l  424 -101 l  434 -78 440 -56 440 -44 ct 
+440 -23 426 -16 381 -16 ct 381 0 l  597 0 l  p
+182 -217 m  280 -450 l  378 -217 l  p ef
+626 -527 m  631 -527 l  640 -527 650 -528 657 -528 ct 684 -528 692 -516 692 -477 ct 
+692 -73 l  692 -27 681 -16 627 -12 ct 627 0 l  827 0 l  827 -12 l  774 -16 763 -24 763 -71 ct 
+763 -576 l  760 -577 l  716 -563 684 -554 626 -540 ct p ef
+995 -389 m  863 -342 l  863 -329 l  870 -330 l  880 -332 891 -333 899 -333 ct 
+919 -333 927 -319 927 -282 ct 927 -86 l  927 -25 918 -16 860 -12 ct 860 0 l 
+1061 0 l  1061 -12 l  1005 -16 998 -25 998 -86 ct 998 -386 l  p
+955 -577 m  932 -577 912 -558 912 -534 ct 912 -510 931 -491 955 -491 ct 979 -491 999 -510 999 -534 ct 
+999 -558 l  979 -577 l  p ef
+1171 -92 m  1171 -31 1161 -20 1097 -16 ct 1097 0 l  1337 0 l  1435 0 1524 -27 1577 -75 ct 
+1632 -125 1663 -200 1663 -282 ct 1663 -358 1638 -424 1591 -471 ct 1534 -529 1441 -560 1325 -560 ct 
+1097 -560 l  1097 -543 l  1164 -538 1171 -530 1171 -467 ct p
+1258 -495 m  1258 -521 1267 -528 1302 -528 ct 1375 -528 1430 -515 1470 -486 ct 
+1536 -440 1571 -368 1571 -276 ct 1571 -176 1536 -105 1468 -65 ct 1424 -41 1375 -31 1302 -31 ct 
+1268 -31 1258 -38 1258 -65 ct p ef
+2217 -380 m  2209 -571 l  2192 -571 l  2187 -554 2173 -543 2156 -543 ct 2149 -543 2136 -546 2123 -551 ct 
+2082 -565 2039 -571 2000 -571 ct 1930 -571 1860 -545 1808 -499 ct 1748 -446 1716 -368 1716 -274 ct 
+1716 -196 1742 -123 1785 -75 ct 1835 -20 1913 11 1997 11 ct 2093 11 2176 -27 2228 -95 ct 
+2213 -110 l  2150 -50 2094 -25 2024 -25 ct 1971 -25 1923 -42 1887 -74 ct 1841 -115 1814 -192 1814 -285 ct 
+1814 -439 1893 -538 2016 -538 ct 2064 -538 2108 -520 2142 -486 ct 2169 -459 2181 -435 2198 -380 ct 
+p ef
+2634 -571 m  2616 -571 l  2613 -552 2603 -543 2589 -543 ct 2580 -543 2566 -546 2552 -553 ct 
+2520 -565 2489 -571 2462 -571 ct 2426 -571 2388 -557 2360 -532 ct 2331 -506 2316 -471 2316 -427 ct 
+2316 -359 2353 -312 2448 -262 ct 2508 -230 2552 -195 2574 -163 ct 2581 -152 2585 -134 2585 -114 ct 
+2585 -57 2543 -18 2481 -18 ct 2406 -18 2353 -65 2310 -168 ct 2291 -168 l  2316 11 l 
+2335 11 l  2336 -5 2346 -16 2359 -16 ct 2368 -16 2382 -13 2398 -7 ct 2431 5 2464 11 2498 11 ct 
+2596 11 2671 -54 2671 -142 ct 2671 -211 2624 -266 2513 -326 ct 2424 -375 2388 -412 2388 -458 ct 
+2388 -505 2424 -537 2476 -537 ct 2514 -537 2550 -521 2580 -490 ct 2606 -463 2618 -441 2631 -391 ct 
+2652 -391 l  p ef
+3250 -380 m  3242 -571 l  3225 -571 l  3220 -554 3206 -543 3189 -543 ct 3182 -543 3169 -546 3156 -551 ct 
+3115 -565 3072 -571 3033 -571 ct 2963 -571 2893 -545 2841 -499 ct 2781 -446 2749 -368 2749 -274 ct 
+2749 -196 2775 -123 2818 -75 ct 2868 -20 2946 11 3030 11 ct 3126 11 3209 -27 3261 -95 ct 
+3246 -110 l  3183 -50 3127 -25 3057 -25 ct 3004 -25 2956 -42 2920 -74 ct 2874 -115 2847 -192 2847 -285 ct 
+2847 -439 2926 -538 3049 -538 ct 3097 -538 3141 -520 3175 -486 ct 3202 -459 3214 -435 3231 -380 ct 
+p ef
+3305 -527 m  3310 -527 l  3319 -527 3329 -528 3336 -528 ct 3363 -528 3371 -516 3371 -477 ct 
+3371 -73 l  3371 -27 3360 -16 3306 -12 ct 3306 0 l  3506 0 l  3506 -12 l 
+3453 -16 3442 -24 3442 -71 ct 3442 -576 l  3439 -577 l  3395 -563 3363 -554 3305 -540 ct 
+p ef
+3674 -389 m  3542 -342 l  3542 -329 l  3549 -330 l  3559 -332 3570 -333 3578 -333 ct 
+3598 -333 3606 -319 3606 -282 ct 3606 -86 l  3606 -25 3597 -16 3539 -12 ct 3539 0 l 
+3740 0 l  3740 -12 l  3684 -16 3677 -25 3677 -86 ct 3677 -386 l  p
+3634 -577 m  3611 -577 3591 -558 3591 -534 ct 3591 -510 3610 -491 3634 -491 ct 
+3658 -491 3678 -510 3678 -534 ct 3678 -558 l  3658 -577 l  p ef
+4108 -138 m  4067 -74 4031 -49 3977 -49 ct 3928 -49 3892 -74 3867 -122 ct 3852 -154 3846 -182 3845 -234 ct 
+4105 -234 l  4098 -289 4090 -313 4069 -340 ct 4043 -371 4004 -389 3960 -389 ct 
+3918 -389 3878 -373 3846 -345 ct 3806 -310 3784 -250 3784 -181 ct 3784 -64 3845 8 3942 8 ct 
+4022 8 4086 -41 4121 -132 ct p
+3846 -261 m  3856 -327 3884 -358 3936 -358 ct 3988 -358 4008 -335 4019 -261 ct 
+p ef
+4153 -336 m  4158 -339 4167 -340 4176 -340 ct 4200 -340 4207 -327 4207 -285 ct 
+4207 -76 l  4207 -27 4198 -16 4155 -12 ct 4155 0 l  4334 0 l  4334 -12 l 
+4291 -16 4278 -26 4278 -56 ct 4278 -294 l  4319 -332 4337 -342 4365 -342 ct 
+4407 -342 4427 -316 4427 -260 ct 4427 -83 l  4427 -30 4416 -16 4374 -12 ct 4374 0 l 
+4550 0 l  4550 -12 l  4508 -16 4498 -27 4498 -68 ct 4498 -262 l  4498 -341 4461 -389 4398 -389 ct 
+4359 -389 4333 -374 4276 -320 ct 4276 -387 l  4270 -389 l  4228 -373 4200 -364 4153 -351 ct 
+p ef
+4779 -380 m  4694 -380 l  4694 -478 l  4694 -487 4693 -489 4688 -489 ct 4682 -482 4677 -474 4671 -466 ct 
+4639 -419 4602 -379 4589 -375 ct 4580 -369 4575 -363 4575 -359 ct 4575 -357 4575 -355 4578 -353 ct 
+4623 -353 l  4623 -98 l  4623 -27 4648 8 4698 8 ct 4739 8 4772 -11 4800 -55 ct 
+4789 -65 l  4771 -43 4756 -35 4738 -35 ct 4706 -35 4694 -58 4694 -111 ct 4694 -353 l 
+4779 -353 l  p ef
+pom
+gr
+17092 7585 m  16665 7792 l  16875 8007 l  17092 7585 l  p ef
+1 lw 0 lj 16834 7837 m  14430 10195 l  ps
+16975 5715 m  16825 6165 l  17125 6164 l  16975 5715 l  p ef
+16975 6350 m  16975 6075 l  ps
+14430 11465 m  13958 11516 l  14083 11789 l  14430 11465 l  p ef
+14102 11615 m  7596 14605 l  ps
+12829 15225 m  12378 15075 l  12379 15375 l  12829 15225 l  p ef
+12469 15225 m  10160 15225 l  ps
+gs
+pum
+12039 15388 t
+203 -379 m  204 -365 l  206 -347 201 -323 190 -294 ct 184 -279 181 -264 181 -255 ct 
+181 -238 194 -224 210 -224 ct 228 -224 243 -240 243 -258 ct 243 -263 241 -274 236 -285 ct 
+225 -314 219 -346 219 -379 ct 219 -385 l  225 -383 l  244 -375 262 -360 285 -332 ct 
+306 -306 320 -296 335 -296 ct 353 -296 365 -308 365 -327 ct 365 -349 352 -358 315 -364 ct 
+282 -369 255 -379 233 -393 ct 226 -397 l  268 -421 284 -427 321 -433 ct 353 -438 364 -447 364 -468 ct 
+364 -488 351 -501 334 -501 ct 321 -501 307 -490 286 -466 ct 265 -441 244 -423 225 -412 ct 
+219 -409 l  219 -431 l  219 -451 225 -475 234 -501 ct 239 -517 242 -531 242 -540 ct 
+242 -558 229 -571 212 -571 ct 195 -571 182 -559 182 -542 ct 182 -532 186 -516 191 -499 ct 
+199 -471 203 -445 203 -422 ct 203 -411 l  171 -428 155 -442 127 -472 ct 110 -493 100 -499 87 -499 ct 
+71 -499 58 -486 58 -469 ct 58 -449 75 -437 115 -429 ct 147 -423 172 -415 188 -404 ct 
+197 -398 l  163 -377 149 -372 110 -364 ct 72 -357 58 -347 58 -326 ct 58 -307 70 -296 88 -296 ct 
+102 -296 109 -301 124 -317 ct 148 -345 153 -349 159 -355 ct 168 -362 174 -367 203 -385 ct 
+p ef
+pom
+gr
+0.800 0.402 0.203 c 15590 26065 m  13100 26065 l  13100 24160 l  18080 24160 l 
+18080 26065 l  15590 26065 l  p ef
+0 lw 1 lj 0.003 0.003 0.003 c 15590 26065 m  13100 26065 l  13100 24160 l 
+18080 24160 l  18080 26065 l  15590 26065 l  pc
+gs
+pum
+14499 25389 t
+484 -147 m  470 -115 458 -95 445 -81 ct 416 -48 369 -33 299 -33 ct 242 -33 l 
+181 -33 170 -38 170 -67 ct 170 -467 l  170 -527 181 -539 248 -543 ct 248 -560 l 
+10 -560 l  10 -543 l  72 -538 83 -527 83 -467 ct 83 -92 l  83 -33 71 -20 10 -16 ct 
+10 0 l  465 0 l  505 -147 l  p ef
+603 -92 m  603 -31 593 -20 529 -16 ct 529 0 l  769 0 l  867 0 956 -27 1009 -75 ct 
+1064 -125 1095 -200 1095 -282 ct 1095 -358 1070 -424 1023 -471 ct 966 -529 873 -560 757 -560 ct 
+529 -560 l  529 -543 l  596 -538 603 -530 603 -467 ct p
+690 -495 m  690 -521 699 -528 734 -528 ct 807 -528 862 -515 902 -486 ct 968 -440 1003 -368 1003 -276 ct 
+1003 -176 968 -105 900 -65 ct 856 -41 807 -31 734 -31 ct 700 -31 690 -38 690 -65 ct 
+p ef
+1723 -16 m  1685 -18 1676 -27 1647 -89 ct 1436 -570 l  1419 -570 l  1243 -154 l 
+1189 -31 1179 -17 1138 -16 ct 1138 0 l  1306 0 l  1306 -16 l  1265 -16 1248 -27 1248 -50 ct 
+1248 -60 1251 -72 1255 -83 ct 1294 -182 l  1516 -182 l  1550 -101 l  1560 -78 1566 -56 1566 -44 ct 
+1566 -23 1552 -16 1507 -16 ct 1507 0 l  1723 0 l  p
+1308 -217 m  1406 -450 l  1504 -217 l  p ef
+1906 -246 m  1928 -244 1943 -243 1965 -243 ct 2031 -243 2076 -252 2113 -272 ct 
+2164 -299 2194 -351 2194 -406 ct 2194 -442 2182 -474 2159 -499 ct 2126 -536 2052 -560 1972 -560 ct 
+1749 -560 l  1749 -543 l  1812 -537 1820 -528 1820 -467 ct 1820 -101 l  1820 -30 1813 -22 1749 -16 ct 
+1749 0 l  1986 0 l  1986 -16 l  1919 -18 1906 -30 1906 -92 ct p
+1906 -499 m  1906 -522 1912 -528 1935 -528 ct 2049 -528 2102 -488 2102 -401 ct 
+2102 -319 2052 -277 1955 -277 ct 1938 -277 1926 -278 1906 -280 ct p ef
+pom
+gr
+0.003 0.722 1.000 c 15610 22425 m  11800 22425 l  11800 21155 l  19420 21155 l 
+19420 22425 l  15610 22425 l  p ef
+0.003 0.003 0.003 c 15610 22425 m  11800 22425 l  11800 21155 l  19420 21155 l 
+19420 22425 l  15610 22425 l  pc
+gs
+pum
+12700 22056 t
+597 -16 m  559 -18 550 -27 521 -89 ct 310 -570 l  293 -570 l  117 -154 l 
+63 -31 53 -17 12 -16 ct 12 0 l  180 0 l  180 -16 l  139 -16 122 -27 122 -50 ct 
+122 -60 125 -72 129 -83 ct 168 -182 l  390 -182 l  424 -101 l  434 -78 440 -56 440 -44 ct 
+440 -23 426 -16 381 -16 ct 381 0 l  597 0 l  p
+182 -217 m  280 -450 l  378 -217 l  p ef
+626 -527 m  631 -527 l  640 -527 650 -528 657 -528 ct 684 -528 692 -516 692 -477 ct 
+692 -73 l  692 -27 681 -16 627 -12 ct 627 0 l  827 0 l  827 -12 l  774 -16 763 -24 763 -71 ct 
+763 -576 l  760 -577 l  716 -563 684 -554 626 -540 ct p ef
+995 -389 m  863 -342 l  863 -329 l  870 -330 l  880 -332 891 -333 899 -333 ct 
+919 -333 927 -319 927 -282 ct 927 -86 l  927 -25 918 -16 860 -12 ct 860 0 l 
+1061 0 l  1061 -12 l  1005 -16 998 -25 998 -86 ct 998 -386 l  p
+955 -577 m  932 -577 912 -558 912 -534 ct 912 -510 931 -491 955 -491 ct 979 -491 999 -510 999 -534 ct 
+999 -558 l  979 -577 l  p ef
+1462 -571 m  1444 -571 l  1441 -552 1431 -543 1417 -543 ct 1408 -543 1394 -546 1380 -553 ct 
+1348 -565 1317 -571 1290 -571 ct 1254 -571 1216 -557 1188 -532 ct 1159 -506 1144 -471 1144 -427 ct 
+1144 -359 1181 -312 1276 -262 ct 1336 -230 1380 -195 1402 -163 ct 1409 -152 1413 -134 1413 -114 ct 
+1413 -57 1371 -18 1309 -18 ct 1234 -18 1181 -65 1138 -168 ct 1119 -168 l  1144 11 l 
+1163 11 l  1164 -5 1174 -16 1187 -16 ct 1196 -16 1210 -13 1226 -7 ct 1259 5 1292 11 1326 11 ct 
+1424 11 1499 -54 1499 -142 ct 1499 -211 1452 -266 1341 -326 ct 1252 -375 1216 -412 1216 -458 ct 
+1216 -505 1252 -537 1304 -537 ct 1342 -537 1378 -521 1408 -490 ct 1434 -463 1446 -441 1459 -391 ct 
+1480 -391 l  p ef
+1686 -290 m  1722 -329 1747 -343 1780 -343 ct 1823 -343 1844 -313 1844 -253 ct 
+1844 -86 l  1844 -28 1835 -17 1786 -12 ct 1786 0 l  1966 0 l  1966 -12 l 
+1920 -21 1915 -27 1915 -86 ct 1915 -254 l  1915 -343 1879 -389 1811 -389 ct 
+1761 -389 1725 -368 1686 -318 ct 1686 -575 l  1682 -577 l  1653 -567 1632 -560 1585 -547 ct 
+1562 -540 l  1562 -527 l  1565 -527 1568 -527 1572 -527 ct 1608 -527 1615 -521 1615 -484 ct 
+1615 -86 l  1615 -27 1610 -19 1561 -12 ct 1561 0 l  1744 0 l  1744 -12 l 
+1695 -17 1686 -27 1686 -86 ct p ef
+2382 -42 m  2378 -42 l  2339 -42 2329 -51 2329 -90 ct 2329 -380 l  2196 -380 l 
+2196 -366 l  2248 -363 2258 -355 2258 -313 ct 2258 -114 l  2258 -90 2254 -78 2242 -69 ct 
+2219 -50 2193 -40 2168 -40 ct 2135 -40 2108 -69 2108 -104 ct 2108 -380 l  1984 -380 l 
+1984 -368 l  2025 -366 2037 -353 2037 -314 ct 2037 -101 l  2037 -34 2077 8 2139 8 ct 
+2170 8 2203 -5 2226 -27 ct 2262 -64 l  2262 5 l  2266 7 l  2308 -9 2339 -18 2382 -30 ct 
+p ef
+2615 -380 m  2530 -380 l  2530 -478 l  2530 -487 2529 -489 2524 -489 ct 2518 -482 2513 -474 2507 -466 ct 
+2475 -419 2438 -379 2425 -375 ct 2416 -369 2411 -363 2411 -359 ct 2411 -357 2411 -355 2414 -353 ct 
+2459 -353 l  2459 -98 l  2459 -27 2484 8 2534 8 ct 2575 8 2608 -11 2636 -55 ct 
+2625 -65 l  2607 -43 2592 -35 2574 -35 ct 2542 -35 2530 -58 2530 -111 ct 2530 -353 l 
+2615 -353 l  p ef
+2852 -380 m  2767 -380 l  2767 -478 l  2767 -487 2766 -489 2761 -489 ct 2755 -482 2750 -474 2744 -466 ct 
+2712 -419 2675 -379 2662 -375 ct 2653 -369 2648 -363 2648 -359 ct 2648 -357 2648 -355 2651 -353 ct 
+2696 -353 l  2696 -98 l  2696 -27 2721 8 2771 8 ct 2812 8 2845 -11 2873 -55 ct 
+2862 -65 l  2844 -43 2829 -35 2811 -35 ct 2779 -35 2767 -58 2767 -111 ct 2767 -353 l 
+2852 -353 l  p ef
+2890 -527 m  2895 -527 l  2904 -527 2914 -528 2921 -528 ct 2948 -528 2956 -516 2956 -477 ct 
+2956 -73 l  2956 -27 2945 -16 2891 -12 ct 2891 0 l  3091 0 l  3091 -12 l 
+3038 -16 3027 -24 3027 -71 ct 3027 -576 l  3024 -577 l  2980 -563 2948 -554 2890 -540 ct 
+p ef
+3457 -138 m  3416 -74 3380 -49 3326 -49 ct 3277 -49 3241 -74 3216 -122 ct 3201 -154 3195 -182 3194 -234 ct 
+3454 -234 l  3447 -289 3439 -313 3418 -340 ct 3392 -371 3353 -389 3309 -389 ct 
+3267 -389 3227 -373 3195 -345 ct 3155 -310 3133 -250 3133 -181 ct 3133 -64 3194 8 3291 8 ct 
+3371 8 3435 -41 3470 -132 ct p
+3195 -261 m  3205 -327 3233 -358 3285 -358 ct 3337 -358 3357 -335 3368 -261 ct 
+p ef
+4012 -380 m  4004 -571 l  3987 -571 l  3982 -554 3968 -543 3951 -543 ct 3944 -543 3931 -546 3918 -551 ct 
+3877 -565 3834 -571 3795 -571 ct 3725 -571 3655 -545 3603 -499 ct 3543 -446 3511 -368 3511 -274 ct 
+3511 -196 3537 -123 3580 -75 ct 3630 -20 3708 11 3792 11 ct 3888 11 3971 -27 4023 -95 ct 
+4008 -110 l  3945 -50 3889 -25 3819 -25 ct 3766 -25 3718 -42 3682 -74 ct 3636 -115 3609 -192 3609 -285 ct 
+3609 -439 3688 -538 3811 -538 ct 3859 -538 3903 -520 3937 -486 ct 3964 -459 3976 -435 3993 -380 ct 
+p ef
+4262 -389 m  4152 -389 4075 -307 4075 -191 ct 4075 -76 4154 8 4260 8 ct 4367 8 4448 -81 4448 -197 ct 
+4448 -308 l  4370 -389 l  p
+4251 -365 m  4322 -365 4372 -284 4372 -168 ct 4372 -72 4334 -15 4270 -15 ct 
+4237 -15 4206 -35 4188 -69 ct 4165 -113 4151 -172 4151 -232 ct 4151 -313 l  4191 -365 l 
+p ef
+4488 -336 m  4493 -339 4502 -340 4511 -340 ct 4535 -340 4542 -327 4542 -285 ct 
+4542 -76 l  4542 -27 4533 -16 4490 -12 ct 4490 0 l  4669 0 l  4669 -12 l 
+4626 -16 4613 -26 4613 -56 ct 4613 -294 l  4654 -332 4672 -342 4700 -342 ct 
+4742 -342 4762 -316 4762 -260 ct 4762 -83 l  4762 -30 4751 -16 4709 -12 ct 4709 0 l 
+4885 0 l  4885 -12 l  4843 -16 4833 -27 4833 -68 ct 4833 -262 l  4833 -341 4796 -389 4733 -389 ct 
+4694 -389 4668 -374 4611 -320 ct 4611 -387 l  4605 -389 l  4563 -373 4535 -364 4488 -351 ct 
+p ef
+5159 -380 m  5055 -380 l  5055 -478 l  5055 -527 5071 -554 5103 -554 ct 5121 -554 5133 -545 5148 -521 ct 
+5161 -499 5172 -490 5186 -490 ct 5205 -490 5222 -505 5222 -525 ct 5222 -555 5184 -577 5134 -577 ct 
+5081 -577 5036 -554 5014 -516 ct 4992 -478 4985 -448 4985 -380 ct 4915 -380 l 
+4915 -353 l  4985 -353 l  4985 -87 l  4985 -26 4975 -16 4914 -12 ct 4914 0 l 
+5134 0 l  5134 -12 l  5065 -15 5056 -24 5056 -87 ct 5056 -353 l  5159 -353 l 
+p ef
+5330 -389 m  5198 -342 l  5198 -329 l  5205 -330 l  5215 -332 5226 -333 5234 -333 ct 
+5254 -333 5262 -319 5262 -282 ct 5262 -86 l  5262 -25 5253 -16 5195 -12 ct 5195 0 l 
+5396 0 l  5396 -12 l  5340 -16 5333 -25 5333 -86 ct 5333 -386 l  p
+5290 -577 m  5267 -577 5247 -558 5247 -534 ct 5247 -510 5266 -491 5290 -491 ct 
+5314 -491 5334 -510 5334 -534 ct 5334 -558 l  5314 -577 l  p ef
+5816 -328 m  5816 -361 l  5751 -361 l  5734 -361 5721 -363 5704 -369 ct 5686 -376 l 
+5663 -384 5640 -389 5618 -389 ct 5539 -389 5477 -328 5477 -251 ct 5477 -197 5500 -165 5556 -137 ct 
+5539 -122 5524 -108 5519 -104 ct 5491 -79 5480 -62 5480 -45 ct 5480 -27 5490 -17 5525 0 ct 
+5465 43 5442 71 5442 102 ct 5442 147 5508 184 5589 184 ct 5652 184 5718 162 5762 126 ct 
+5794 100 5809 73 5809 41 ct 5809 -11 5769 -46 5706 -49 ct 5597 -54 l  5552 -55 5531 -63 5531 -76 ct 
+5531 -93 5559 -123 5582 -130 ct 5589 -129 5595 -128 5598 -128 ct 5614 -126 5625 -126 5630 -126 ct 
+5661 -126 5695 -138 5721 -161 ct 5749 -185 5762 -214 5762 -257 ct 5762 -281 5758 -301 5746 -328 ct 
+p
+5543 1 m  5571 7 5638 12 5680 12 ct 5757 12 5785 23 5785 54 ct 5785 103 5721 136 5625 136 ct 
+5550 136 5501 111 5501 74 ct 5501 54 l  5507 43 l  p
+5547 -285 m  5547 -335 5571 -365 5610 -365 ct 5636 -365 5658 -351 5671 -325 ct 
+5687 -296 5697 -257 5697 -224 ct 5697 -176 5672 -147 5633 -147 ct 5583 -147 5547 -202 5547 -283 ct 
+p ef
+pom
+gr
+15610 21155 m  15317 20781 l  15152 21031 l  15610 21155 l  p ef
+1 lw 0 lj 15309 20956 m  7596 15845 l  ps
+15590 24160 m  15745 23711 l  15445 23708 l  15590 24160 l  p ef
+15594 23800 m  15610 22425 l  ps
+0.003 0.722 1.000 c 4397 9725 m  905 9725 l  905 8455 l  7890 8455 l  7890 9725 l 
+4397 9725 l  p ef
+0 lw 1 lj 0.003 0.003 0.003 c 4397 9725 m  905 9725 l  905 8455 l  7890 8455 l 
+7890 9725 l  4397 9725 l  pc
+gs
+pum
+1693 9356 t
+597 -16 m  559 -18 550 -27 521 -89 ct 310 -570 l  293 -570 l  117 -154 l 
+63 -31 53 -17 12 -16 ct 12 0 l  180 0 l  180 -16 l  139 -16 122 -27 122 -50 ct 
+122 -60 125 -72 129 -83 ct 168 -182 l  390 -182 l  424 -101 l  434 -78 440 -56 440 -44 ct 
+440 -23 426 -16 381 -16 ct 381 0 l  597 0 l  p
+182 -217 m  280 -450 l  378 -217 l  p ef
+626 -527 m  631 -527 l  640 -527 650 -528 657 -528 ct 684 -528 692 -516 692 -477 ct 
+692 -73 l  692 -27 681 -16 627 -12 ct 627 0 l  827 0 l  827 -12 l  774 -16 763 -24 763 -71 ct 
+763 -576 l  760 -577 l  716 -563 684 -554 626 -540 ct p ef
+995 -389 m  863 -342 l  863 -329 l  870 -330 l  880 -332 891 -333 899 -333 ct 
+919 -333 927 -319 927 -282 ct 927 -86 l  927 -25 918 -16 860 -12 ct 860 0 l 
+1061 0 l  1061 -12 l  1005 -16 998 -25 998 -86 ct 998 -386 l  p
+955 -577 m  932 -577 912 -558 912 -534 ct 912 -510 931 -491 955 -491 ct 979 -491 999 -510 999 -534 ct 
+999 -558 l  979 -577 l  p ef
+1608 -380 m  1600 -571 l  1583 -571 l  1578 -554 1564 -543 1547 -543 ct 1540 -543 1527 -546 1514 -551 ct 
+1473 -565 1430 -571 1391 -571 ct 1321 -571 1251 -545 1199 -499 ct 1139 -446 1107 -368 1107 -274 ct 
+1107 -196 1133 -123 1176 -75 ct 1226 -20 1304 11 1388 11 ct 1484 11 1567 -27 1619 -95 ct 
+1604 -110 l  1541 -50 1485 -25 1415 -25 ct 1362 -25 1314 -42 1278 -74 ct 1232 -115 1205 -192 1205 -285 ct 
+1205 -439 1284 -538 1407 -538 ct 1455 -538 1499 -520 1533 -486 ct 1560 -459 1572 -435 1589 -380 ct 
+p ef
+1734 -92 m  1734 -31 1724 -20 1660 -16 ct 1660 0 l  1900 0 l  1998 0 2087 -27 2140 -75 ct 
+2195 -125 2226 -200 2226 -282 ct 2226 -358 2201 -424 2154 -471 ct 2097 -529 2004 -560 1888 -560 ct 
+1660 -560 l  1660 -543 l  1727 -538 1734 -530 1734 -467 ct p
+1821 -495 m  1821 -521 1830 -528 1865 -528 ct 1938 -528 1993 -515 2033 -486 ct 
+2099 -440 2134 -368 2134 -276 ct 2134 -176 2099 -105 2031 -65 ct 1987 -41 1938 -31 1865 -31 ct 
+1831 -31 1821 -38 1821 -65 ct p ef
+2270 -560 m  2270 -543 l  2341 -539 2351 -530 2351 -467 ct 2351 -92 l  2351 -29 2340 -18 2270 -16 ct 
+2270 0 l  2552 0 l  2618 0 2679 -17 2710 -46 ct 2740 -73 2757 -111 2757 -152 ct 
+2757 -189 2742 -223 2716 -247 ct 2690 -270 2668 -280 2613 -294 ct 2657 -305 2674 -313 2695 -331 ct 
+2716 -350 2728 -381 2728 -416 ct 2728 -510 2653 -560 2507 -560 ct p
+2437 -275 m  2519 -275 2558 -271 2589 -258 ct 2637 -238 2660 -204 2660 -151 ct 
+2660 -105 2642 -72 2608 -53 ct 2581 -38 2547 -31 2491 -31 ct 2449 -31 2437 -38 2437 -65 ct 
+p
+2437 -309 m  2437 -503 l  2437 -521 2443 -528 2456 -528 ct 2493 -528 l  2591 -528 2642 -488 2642 -412 ct 
+2642 -346 2597 -309 2518 -309 ct p ef
+3197 -571 m  3179 -571 l  3176 -552 3166 -543 3152 -543 ct 3143 -543 3129 -546 3115 -553 ct 
+3083 -565 3052 -571 3025 -571 ct 2989 -571 2951 -557 2923 -532 ct 2894 -506 2879 -471 2879 -427 ct 
+2879 -359 2916 -312 3011 -262 ct 3071 -230 3115 -195 3137 -163 ct 3144 -152 3148 -134 3148 -114 ct 
+3148 -57 3106 -18 3044 -18 ct 2969 -18 2916 -65 2873 -168 ct 2854 -168 l  2879 11 l 
+2898 11 l  2899 -5 2909 -16 2922 -16 ct 2931 -16 2945 -13 2961 -7 ct 2994 5 3027 11 3061 11 ct 
+3159 11 3234 -54 3234 -142 ct 3234 -211 3187 -266 3076 -326 ct 2987 -375 2951 -412 2951 -458 ct 
+2951 -505 2987 -537 3039 -537 ct 3077 -537 3113 -521 3143 -490 ct 3169 -463 3181 -441 3194 -391 ct 
+3215 -391 l  p ef
+3504 -380 m  3419 -380 l  3419 -478 l  3419 -487 3418 -489 3413 -489 ct 3407 -482 3402 -474 3396 -466 ct 
+3364 -419 3327 -379 3314 -375 ct 3305 -369 3300 -363 3300 -359 ct 3300 -357 3300 -355 3303 -353 ct 
+3348 -353 l  3348 -98 l  3348 -27 3373 8 3423 8 ct 3464 8 3497 -11 3525 -55 ct 
+3514 -65 l  3496 -43 3481 -35 3463 -35 ct 3431 -35 3419 -58 3419 -111 ct 3419 -353 l 
+3504 -353 l  p ef
+3737 -389 m  3627 -389 3550 -307 3550 -191 ct 3550 -76 3629 8 3735 8 ct 3842 8 3923 -81 3923 -197 ct 
+3923 -308 l  3845 -389 l  p
+3726 -365 m  3797 -365 3847 -284 3847 -168 ct 3847 -72 3809 -15 3745 -15 ct 
+3712 -15 3681 -35 3663 -69 ct 3640 -113 3626 -172 3626 -232 ct 3626 -313 l  3666 -365 l 
+p ef
+3955 -329 m  3967 -332 3975 -333 3985 -333 ct 4006 -333 4014 -319 4014 -282 ct 
+4014 -71 l  4014 -28 4008 -22 3954 -12 ct 3954 0 l  4157 0 l  4157 -12 l 
+4099 -15 4085 -27 4085 -76 ct 4085 -266 l  4085 -293 4121 -335 4144 -335 ct 
+4149 -335 4157 -331 4166 -323 ct 4180 -311 4189 -306 4200 -306 ct 4220 -306 4233 -320 4233 -344 ct 
+4233 -372 4215 -389 4186 -389 ct 4151 -389 4126 -369 4085 -309 ct 4085 -387 l 
+4081 -389 l  4036 -370 4005 -359 3955 -343 ct p ef
+4606 -55 m  4592 -43 4582 -39 4569 -39 ct 4550 -39 4544 -51 4544 -88 ct 4544 -253 l 
+4544 -297 4540 -322 4527 -342 ct 4508 -373 4472 -389 4422 -389 ct 4342 -389 4280 -347 4280 -294 ct 
+4280 -274 4297 -258 4316 -258 ct 4337 -258 4354 -274 4354 -293 ct 4354 -296 4353 -301 4353 -307 ct 
+4351 -314 4350 -321 4350 -327 ct 4350 -350 4377 -368 4411 -368 ct 4452 -368 4475 -344 4475 -298 ct 
+4475 -247 l  4345 -194 4331 -187 4294 -155 ct 4276 -138 4264 -109 4264 -82 ct 
+4264 -28 4301 8 4353 8 ct 4390 8 4425 -9 4476 -53 ct 4480 -9 4496 8 4530 8 ct 4559 8 4577 -1 4606 -33 ct 
+p
+4475 -104 m  4475 -77 4471 -70 4453 -60 ct 4433 -48 4409 -40 4392 -40 ct 4362 -40 4338 -69 4338 -105 ct 
+4338 -109 l  4338 -159 4373 -189 4475 -226 ct p ef
+5007 -328 m  5007 -361 l  4942 -361 l  4925 -361 4912 -363 4895 -369 ct 4877 -376 l 
+4854 -384 4831 -389 4809 -389 ct 4730 -389 4668 -328 4668 -251 ct 4668 -197 4691 -165 4747 -137 ct 
+4730 -122 4715 -108 4710 -104 ct 4682 -79 4671 -62 4671 -45 ct 4671 -27 4681 -17 4716 0 ct 
+4656 43 4633 71 4633 102 ct 4633 147 4699 184 4780 184 ct 4843 184 4909 162 4953 126 ct 
+4985 100 5000 73 5000 41 ct 5000 -11 4960 -46 4897 -49 ct 4788 -54 l  4743 -55 4722 -63 4722 -76 ct 
+4722 -93 4750 -123 4773 -130 ct 4780 -129 4786 -128 4789 -128 ct 4805 -126 4816 -126 4821 -126 ct 
+4852 -126 4886 -138 4912 -161 ct 4940 -185 4953 -214 4953 -257 ct 4953 -281 4949 -301 4937 -328 ct 
+p
+4734 1 m  4762 7 4829 12 4871 12 ct 4948 12 4976 23 4976 54 ct 4976 103 4912 136 4816 136 ct 
+4741 136 4692 111 4692 74 ct 4692 54 l  4698 43 l  p
+4738 -285 m  4738 -335 4762 -365 4801 -365 ct 4827 -365 4849 -351 4862 -325 ct 
+4878 -296 4888 -257 4888 -224 ct 4888 -176 4863 -147 4824 -147 ct 4774 -147 4738 -202 4738 -283 ct 
+p ef
+5378 -138 m  5337 -74 5301 -49 5247 -49 ct 5198 -49 5162 -74 5137 -122 ct 5122 -154 5116 -182 5115 -234 ct 
+5375 -234 l  5368 -289 5360 -313 5339 -340 ct 5313 -371 5274 -389 5230 -389 ct 
+5188 -389 5148 -373 5116 -345 ct 5076 -310 5054 -250 5054 -181 ct 5054 -64 5115 8 5212 8 ct 
+5292 8 5356 -41 5391 -132 ct p
+5116 -261 m  5126 -327 5154 -358 5206 -358 ct 5258 -358 5278 -335 5289 -261 ct 
+p ef
+pom
+gr
+4397 9725 m  4247 10175 l  4547 10174 l  4397 9725 l  p ef
+1 lw 0 lj 4397 10085 m  4397 15225 l  5033 15225 l  ps
+0.242 0.921 0.242 c 2357 5385 m  1480 5385 769 4958 769 4432 ct 769 3906 1480 3479 2357 3479 ct 
+3234 3479 3945 3906 3945 4432 ct 3945 4958 3234 5385 2357 5385 ct 2357 5385 l 
+p ef
+0 lw 1 lj 0.003 0.003 0.003 c 2357 5385 m  1480 5385 769 4958 769 4432 ct 769 3906 1480 3479 2357 3479 ct 
+3234 3479 3945 3906 3945 4432 ct 3945 4958 3234 5385 2357 5385 ct 2357 5385 l 
+pc
+gs
+pum
+1323 4699 t
+599 -299 m  384 -299 l  384 -284 l  420 -281 430 -279 440 -272 ct 453 -264 458 -245 458 -208 ct 
+458 -71 l  458 -44 406 -22 346 -22 ct 208 -22 123 -118 123 -275 ct 123 -355 147 -432 184 -473 ct 
+221 -515 274 -538 331 -538 ct 379 -538 420 -521 453 -491 ct 478 -467 492 -445 513 -393 ct 
+532 -393 l  526 -571 l  507 -571 l  502 -555 487 -543 469 -543 ct 461 -543 447 -546 432 -552 ct 
+394 -565 355 -571 317 -571 ct 148 -571 27 -447 27 -274 ct 27 -192 49 -128 97 -78 ct 
+153 -20 235 11 328 11 ct 401 11 506 -17 540 -47 ct 540 -219 l  540 -269 550 -280 599 -284 ct 
+p ef
+1167 -16 m  1135 -18 1118 -27 1093 -55 ct 919 -269 l  976 -280 1001 -291 1029 -313 ct 
+1056 -335 1072 -371 1072 -411 ct 1072 -447 1061 -478 1039 -503 ct 1007 -538 937 -560 857 -560 ct 
+624 -560 l  624 -543 l  687 -537 696 -527 696 -467 ct 696 -101 l  696 -31 687 -21 624 -16 ct 
+624 0 l  858 0 l  858 -16 l  793 -20 782 -31 782 -92 ct 782 -258 l  829 -260 l 
+1031 0 l  1167 0 l  p
+782 -498 m  782 -521 791 -528 825 -528 ct 931 -528 980 -492 980 -412 ct 980 -370 962 -335 932 -318 ct 
+893 -296 863 -291 782 -290 ct p ef
+1270 -92 m  1270 -28 1259 -18 1188 -16 ct 1188 0 l  1439 0 l  1439 -16 l 
+1370 -18 1356 -30 1356 -92 ct 1356 -467 l  1356 -529 1368 -540 1439 -543 ct 
+1439 -560 l  1188 -560 l  1188 -543 l  1260 -539 1270 -530 1270 -467 ct p ef
+1543 -92 m  1543 -31 1533 -20 1469 -16 ct 1469 0 l  1709 0 l  1807 0 1896 -27 1949 -75 ct 
+2004 -125 2035 -200 2035 -282 ct 2035 -358 2010 -424 1963 -471 ct 1906 -529 1813 -560 1697 -560 ct 
+1469 -560 l  1469 -543 l  1536 -538 1543 -530 1543 -467 ct p
+1630 -495 m  1630 -521 1639 -528 1674 -528 ct 1747 -528 1802 -515 1842 -486 ct 
+1908 -440 1943 -368 1943 -276 ct 1943 -176 1908 -105 1840 -65 ct 1796 -41 1747 -31 1674 -31 ct 
+1640 -31 1630 -38 1630 -65 ct p ef
+pom
+gr
+0.242 0.921 0.242 c 7167 5385 m  6290 5385 5579 4958 5579 4432 ct 5579 3906 6290 3479 7167 3479 ct 
+8044 3479 8755 3906 8755 4432 ct 8755 4958 8044 5385 7167 5385 ct 7167 5385 l 
+p ef
+0.003 0.003 0.003 c 7167 5385 m  6290 5385 5579 4958 5579 4432 ct 5579 3906 6290 3479 7167 3479 ct 
+8044 3479 8755 3906 8755 4432 ct 8755 4958 8044 5385 7167 5385 ct 7167 5385 l 
+pc
+gs
+pum
+6191 4699 t
+484 -147 m  470 -115 458 -95 445 -81 ct 416 -48 369 -33 299 -33 ct 242 -33 l 
+181 -33 170 -38 170 -67 ct 170 -467 l  170 -527 181 -539 248 -543 ct 248 -560 l 
+10 -560 l  10 -543 l  72 -538 83 -527 83 -467 ct 83 -92 l  83 -33 71 -20 10 -16 ct 
+10 0 l  465 0 l  505 -147 l  p ef
+727 -389 m  617 -389 540 -307 540 -191 ct 540 -76 619 8 725 8 ct 832 8 913 -81 913 -197 ct 
+913 -308 l  835 -389 l  p
+716 -365 m  787 -365 837 -284 837 -168 ct 837 -72 799 -15 735 -15 ct 702 -15 671 -35 653 -69 ct 
+630 -113 616 -172 616 -232 ct 616 -313 l  656 -365 l  p ef
+1276 -131 m  1236 -72 1205 -52 1157 -52 ct 1080 -52 1026 -120 1026 -217 ct 1026 -304 1072 -364 1141 -364 ct 
+1171 -364 1182 -355 1191 -324 ct 1196 -305 l  1203 -281 1218 -266 1236 -266 ct 
+1258 -266 1276 -282 1276 -302 ct 1276 -349 1217 -389 1146 -389 ct 1104 -389 1061 -372 1027 -341 ct 
+984 -304 961 -247 961 -180 ct 961 -70 1027 8 1121 8 ct 1159 8 1193 -5 1224 -31 ct 
+1247 -51 1263 -74 1288 -124 ct p ef
+1690 -55 m  1676 -43 1666 -39 1653 -39 ct 1634 -39 1628 -51 1628 -88 ct 1628 -253 l 
+1628 -297 1624 -322 1611 -342 ct 1592 -373 1556 -389 1506 -389 ct 1426 -389 1364 -347 1364 -294 ct 
+1364 -274 1381 -258 1400 -258 ct 1421 -258 1438 -274 1438 -293 ct 1438 -296 1437 -301 1437 -307 ct 
+1435 -314 1434 -321 1434 -327 ct 1434 -350 1461 -368 1495 -368 ct 1536 -368 1559 -344 1559 -298 ct 
+1559 -247 l  1429 -194 1415 -187 1378 -155 ct 1360 -138 1348 -109 1348 -82 ct 
+1348 -28 1385 8 1437 8 ct 1474 8 1509 -9 1560 -53 ct 1564 -9 1580 8 1614 8 ct 1643 8 1661 -1 1690 -33 ct 
+p
+1559 -104 m  1559 -77 1555 -70 1537 -60 ct 1517 -48 1493 -40 1476 -40 ct 1446 -40 1422 -69 1422 -105 ct 
+1422 -109 l  1422 -159 1457 -189 1559 -226 ct p ef
+1709 -527 m  1714 -527 l  1723 -527 1733 -528 1740 -528 ct 1767 -528 1775 -516 1775 -477 ct 
+1775 -73 l  1775 -27 1764 -16 1710 -12 ct 1710 0 l  1910 0 l  1910 -12 l 
+1857 -16 1846 -24 1846 -71 ct 1846 -576 l  1843 -577 l  1799 -563 1767 -554 1709 -540 ct 
+p ef
+pom
+gr
+2357 5385 m  2207 5835 l  2507 5834 l  2357 5385 l  p ef
+1 lw 0 lj 2357 5745 m  2357 6920 l  4397 6920 l  4397 8455 l  ps
+7167 5385 m  7017 5835 l  7317 5834 l  7167 5385 l  p ef
+7167 5745 m  7167 6920 l  4397 6920 l  4397 8455 l  ps
+0.003 0.722 1.000 c 4897 22225 m  1405 22225 l  1405 20955 l  8390 20955 l 
+8390 22225 l  4897 22225 l  p ef
+0 lw 1 lj 0.003 0.003 0.003 c 4897 22225 m  1405 22225 l  1405 20955 l  8390 20955 l 
+8390 22225 l  4897 22225 l  pc
+gs
+pum
+1879 21870 t
+597 -16 m  559 -18 550 -27 521 -89 ct 310 -570 l  293 -570 l  117 -154 l 
+63 -31 53 -17 12 -16 ct 12 0 l  180 0 l  180 -16 l  139 -16 122 -27 122 -50 ct 
+122 -60 125 -72 129 -83 ct 168 -182 l  390 -182 l  424 -101 l  434 -78 440 -56 440 -44 ct 
+440 -23 426 -16 381 -16 ct 381 0 l  597 0 l  p
+182 -217 m  280 -450 l  378 -217 l  p ef
+626 -527 m  631 -527 l  640 -527 650 -528 657 -528 ct 684 -528 692 -516 692 -477 ct 
+692 -73 l  692 -27 681 -16 627 -12 ct 627 0 l  827 0 l  827 -12 l  774 -16 763 -24 763 -71 ct 
+763 -576 l  760 -577 l  716 -563 684 -554 626 -540 ct p ef
+995 -389 m  863 -342 l  863 -329 l  870 -330 l  880 -332 891 -333 899 -333 ct 
+919 -333 927 -319 927 -282 ct 927 -86 l  927 -25 918 -16 860 -12 ct 860 0 l 
+1061 0 l  1061 -12 l  1005 -16 998 -25 998 -86 ct 998 -386 l  p
+955 -577 m  932 -577 912 -558 912 -534 ct 912 -510 931 -491 955 -491 ct 979 -491 999 -510 999 -534 ct 
+999 -558 l  979 -577 l  p ef
+1462 -571 m  1444 -571 l  1441 -552 1431 -543 1417 -543 ct 1408 -543 1394 -546 1380 -553 ct 
+1348 -565 1317 -571 1290 -571 ct 1254 -571 1216 -557 1188 -532 ct 1159 -506 1144 -471 1144 -427 ct 
+1144 -359 1181 -312 1276 -262 ct 1336 -230 1380 -195 1402 -163 ct 1409 -152 1413 -134 1413 -114 ct 
+1413 -57 1371 -18 1309 -18 ct 1234 -18 1181 -65 1138 -168 ct 1119 -168 l  1144 11 l 
+1163 11 l  1164 -5 1174 -16 1187 -16 ct 1196 -16 1210 -13 1226 -7 ct 1259 5 1292 11 1326 11 ct 
+1424 11 1499 -54 1499 -142 ct 1499 -211 1452 -266 1341 -326 ct 1252 -375 1216 -412 1216 -458 ct 
+1216 -505 1252 -537 1304 -537 ct 1342 -537 1378 -521 1408 -490 ct 1434 -463 1446 -441 1459 -391 ct 
+1480 -391 l  p ef
+1686 -290 m  1722 -329 1747 -343 1780 -343 ct 1823 -343 1844 -313 1844 -253 ct 
+1844 -86 l  1844 -28 1835 -17 1786 -12 ct 1786 0 l  1966 0 l  1966 -12 l 
+1920 -21 1915 -27 1915 -86 ct 1915 -254 l  1915 -343 1879 -389 1811 -389 ct 
+1761 -389 1725 -368 1686 -318 ct 1686 -575 l  1682 -577 l  1653 -567 1632 -560 1585 -547 ct 
+1562 -540 l  1562 -527 l  1565 -527 1568 -527 1572 -527 ct 1608 -527 1615 -521 1615 -484 ct 
+1615 -86 l  1615 -27 1610 -19 1561 -12 ct 1561 0 l  1744 0 l  1744 -12 l 
+1695 -17 1686 -27 1686 -86 ct p ef
+2382 -42 m  2378 -42 l  2339 -42 2329 -51 2329 -90 ct 2329 -380 l  2196 -380 l 
+2196 -366 l  2248 -363 2258 -355 2258 -313 ct 2258 -114 l  2258 -90 2254 -78 2242 -69 ct 
+2219 -50 2193 -40 2168 -40 ct 2135 -40 2108 -69 2108 -104 ct 2108 -380 l  1984 -380 l 
+1984 -368 l  2025 -366 2037 -353 2037 -314 ct 2037 -101 l  2037 -34 2077 8 2139 8 ct 
+2170 8 2203 -5 2226 -27 ct 2262 -64 l  2262 5 l  2266 7 l  2308 -9 2339 -18 2382 -30 ct 
+p ef
+2615 -380 m  2530 -380 l  2530 -478 l  2530 -487 2529 -489 2524 -489 ct 2518 -482 2513 -474 2507 -466 ct 
+2475 -419 2438 -379 2425 -375 ct 2416 -369 2411 -363 2411 -359 ct 2411 -357 2411 -355 2414 -353 ct 
+2459 -353 l  2459 -98 l  2459 -27 2484 8 2534 8 ct 2575 8 2608 -11 2636 -55 ct 
+2625 -65 l  2607 -43 2592 -35 2574 -35 ct 2542 -35 2530 -58 2530 -111 ct 2530 -353 l 
+2615 -353 l  p ef
+2852 -380 m  2767 -380 l  2767 -478 l  2767 -487 2766 -489 2761 -489 ct 2755 -482 2750 -474 2744 -466 ct 
+2712 -419 2675 -379 2662 -375 ct 2653 -369 2648 -363 2648 -359 ct 2648 -357 2648 -355 2651 -353 ct 
+2696 -353 l  2696 -98 l  2696 -27 2721 8 2771 8 ct 2812 8 2845 -11 2873 -55 ct 
+2862 -65 l  2844 -43 2829 -35 2811 -35 ct 2779 -35 2767 -58 2767 -111 ct 2767 -353 l 
+2852 -353 l  p ef
+2890 -527 m  2895 -527 l  2904 -527 2914 -528 2921 -528 ct 2948 -528 2956 -516 2956 -477 ct 
+2956 -73 l  2956 -27 2945 -16 2891 -12 ct 2891 0 l  3091 0 l  3091 -12 l 
+3038 -16 3027 -24 3027 -71 ct 3027 -576 l  3024 -577 l  2980 -563 2948 -554 2890 -540 ct 
+p ef
+3457 -138 m  3416 -74 3380 -49 3326 -49 ct 3277 -49 3241 -74 3216 -122 ct 3201 -154 3195 -182 3194 -234 ct 
+3454 -234 l  3447 -289 3439 -313 3418 -340 ct 3392 -371 3353 -389 3309 -389 ct 
+3267 -389 3227 -373 3195 -345 ct 3155 -310 3133 -250 3133 -181 ct 3133 -64 3194 8 3291 8 ct 
+3371 8 3435 -41 3470 -132 ct p
+3195 -261 m  3205 -327 3233 -358 3285 -358 ct 3337 -358 3357 -335 3368 -261 ct 
+p ef
+3702 -524 m  3702 -101 l  3702 -29 3693 -20 3623 -16 ct 3623 0 l  3870 0 l 
+3870 -16 l  3801 -19 3789 -30 3789 -92 ct 3789 -524 l  3834 -524 l  3931 -524 3949 -509 3969 -416 ct 
+3989 -416 l  3984 -560 l  3507 -560 l  3502 -416 l  3522 -416 l  3542 -508 3562 -524 3657 -524 ct 
+p ef
+4010 -329 m  4022 -332 4030 -333 4040 -333 ct 4061 -333 4069 -319 4069 -282 ct 
+4069 -71 l  4069 -28 4063 -22 4009 -12 ct 4009 0 l  4212 0 l  4212 -12 l 
+4154 -15 4140 -27 4140 -76 ct 4140 -266 l  4140 -293 4176 -335 4199 -335 ct 
+4204 -335 4212 -331 4221 -323 ct 4235 -311 4244 -306 4255 -306 ct 4275 -306 4288 -320 4288 -344 ct 
+4288 -372 4270 -389 4241 -389 ct 4206 -389 4181 -369 4140 -309 ct 4140 -387 l 
+4136 -389 l  4091 -370 4060 -359 4010 -343 ct p ef
+4436 -389 m  4304 -342 l  4304 -329 l  4311 -330 l  4321 -332 4332 -333 4340 -333 ct 
+4360 -333 4368 -319 4368 -282 ct 4368 -86 l  4368 -25 4359 -16 4301 -12 ct 4301 0 l 
+4502 0 l  4502 -12 l  4446 -16 4439 -25 4439 -86 ct 4439 -386 l  p
+4396 -577 m  4373 -577 4353 -558 4353 -534 ct 4353 -510 4372 -491 4396 -491 ct 
+4420 -491 4440 -510 4440 -534 ct 4440 -558 l  4420 -577 l  p ef
+4922 -328 m  4922 -361 l  4857 -361 l  4840 -361 4827 -363 4810 -369 ct 4792 -376 l 
+4769 -384 4746 -389 4724 -389 ct 4645 -389 4583 -328 4583 -251 ct 4583 -197 4606 -165 4662 -137 ct 
+4645 -122 4630 -108 4625 -104 ct 4597 -79 4586 -62 4586 -45 ct 4586 -27 4596 -17 4631 0 ct 
+4571 43 4548 71 4548 102 ct 4548 147 4614 184 4695 184 ct 4758 184 4824 162 4868 126 ct 
+4900 100 4915 73 4915 41 ct 4915 -11 4875 -46 4812 -49 ct 4703 -54 l  4658 -55 4637 -63 4637 -76 ct 
+4637 -93 4665 -123 4688 -130 ct 4695 -129 4701 -128 4704 -128 ct 4720 -126 4731 -126 4736 -126 ct 
+4767 -126 4801 -138 4827 -161 ct 4855 -185 4868 -214 4868 -257 ct 4868 -281 4864 -301 4852 -328 ct 
+p
+4649 1 m  4677 7 4744 12 4786 12 ct 4863 12 4891 23 4891 54 ct 4891 103 4827 136 4731 136 ct 
+4656 136 4607 111 4607 74 ct 4607 54 l  4613 43 l  p
+4653 -285 m  4653 -335 4677 -365 4716 -365 ct 4742 -365 4764 -351 4777 -325 ct 
+4793 -296 4803 -257 4803 -224 ct 4803 -176 4778 -147 4739 -147 ct 4689 -147 4653 -202 4653 -283 ct 
+p ef
+5346 -328 m  5346 -361 l  5281 -361 l  5264 -361 5251 -363 5234 -369 ct 5216 -376 l 
+5193 -384 5170 -389 5148 -389 ct 5069 -389 5007 -328 5007 -251 ct 5007 -197 5030 -165 5086 -137 ct 
+5069 -122 5054 -108 5049 -104 ct 5021 -79 5010 -62 5010 -45 ct 5010 -27 5020 -17 5055 0 ct 
+4995 43 4972 71 4972 102 ct 4972 147 5038 184 5119 184 ct 5182 184 5248 162 5292 126 ct 
+5324 100 5339 73 5339 41 ct 5339 -11 5299 -46 5236 -49 ct 5127 -54 l  5082 -55 5061 -63 5061 -76 ct 
+5061 -93 5089 -123 5112 -130 ct 5119 -129 5125 -128 5128 -128 ct 5144 -126 5155 -126 5160 -126 ct 
+5191 -126 5225 -138 5251 -161 ct 5279 -185 5292 -214 5292 -257 ct 5292 -281 5288 -301 5276 -328 ct 
+p
+5073 1 m  5101 7 5168 12 5210 12 ct 5287 12 5315 23 5315 54 ct 5315 103 5251 136 5155 136 ct 
+5080 136 5031 111 5031 74 ct 5031 54 l  5037 43 l  p
+5077 -285 m  5077 -335 5101 -365 5140 -365 ct 5166 -365 5188 -351 5201 -325 ct 
+5217 -296 5227 -257 5227 -224 ct 5227 -176 5202 -147 5163 -147 ct 5113 -147 5077 -202 5077 -283 ct 
+p ef
+5717 -138 m  5676 -74 5640 -49 5586 -49 ct 5537 -49 5501 -74 5476 -122 ct 5461 -154 5455 -182 5454 -234 ct 
+5714 -234 l  5707 -289 5699 -313 5678 -340 ct 5652 -371 5613 -389 5569 -389 ct 
+5527 -389 5487 -373 5455 -345 ct 5415 -310 5393 -250 5393 -181 ct 5393 -64 5454 8 5551 8 ct 
+5631 8 5695 -41 5730 -132 ct p
+5455 -261 m  5465 -327 5493 -358 5545 -358 ct 5597 -358 5617 -335 5628 -261 ct 
+p ef
+5754 -329 m  5766 -332 5774 -333 5784 -333 ct 5805 -333 5813 -319 5813 -282 ct 
+5813 -71 l  5813 -28 5807 -22 5753 -12 ct 5753 0 l  5956 0 l  5956 -12 l 
+5898 -15 5884 -27 5884 -76 ct 5884 -266 l  5884 -293 5920 -335 5943 -335 ct 
+5948 -335 5956 -331 5965 -323 ct 5979 -311 5988 -306 5999 -306 ct 6019 -306 6032 -320 6032 -344 ct 
+6032 -372 6014 -389 5985 -389 ct 5950 -389 5925 -369 5884 -309 ct 5884 -387 l 
+5880 -389 l  5835 -370 5804 -359 5754 -343 ct p ef
+pom
+gr
+1.000 1.000 0.003 c 4827 26370 m  2605 26370 l  2605 23830 l  7050 23830 l 
+7050 26370 l  4827 26370 l  p ef
+0.003 0.003 0.003 c 4827 26370 m  2605 26370 l  2605 23830 l  7050 23830 l 
+7050 26370 l  4827 26370 l  pc
+gs
+pum
+3916 25363 t
+87 -92 m  87 -31 77 -20 13 -16 ct 13 0 l  253 0 l  351 0 440 -27 493 -75 ct 
+548 -125 579 -200 579 -282 ct 579 -358 554 -424 507 -471 ct 450 -529 357 -560 241 -560 ct 
+13 -560 l  13 -543 l  80 -538 87 -530 87 -467 ct p
+174 -495 m  174 -521 183 -528 218 -528 ct 291 -528 346 -515 386 -486 ct 452 -440 487 -368 487 -276 ct 
+487 -176 452 -105 384 -65 ct 340 -41 291 -31 218 -31 ct 184 -31 174 -38 174 -65 ct 
+p ef
+1207 -16 m  1169 -18 1160 -27 1131 -89 ct 920 -570 l  903 -570 l  727 -154 l 
+673 -31 663 -17 622 -16 ct 622 0 l  790 0 l  790 -16 l  749 -16 732 -27 732 -50 ct 
+732 -60 735 -72 739 -83 ct 778 -182 l  1000 -182 l  1034 -101 l  1044 -78 1050 -56 1050 -44 ct 
+1050 -23 1036 -16 991 -16 ct 991 0 l  1207 0 l  p
+792 -217 m  890 -450 l  988 -217 l  p ef
+1812 134 m  1715 131 1647 94 1579 5 ct 1636 -5 1667 -19 1706 -53 ct 1768 -109 1801 -186 1801 -280 ct 
+1801 -450 1685 -571 1524 -571 ct 1362 -571 1247 -450 1247 -278 ct 1247 -195 1273 -126 1323 -71 ct 
+1356 -36 1383 -19 1443 0 ct 1482 47 l  1540 114 1642 150 1777 150 ct 1790 150 1797 150 1806 149 ct 
+1812 149 l  p
+1526 -541 m  1563 -541 1602 -525 1631 -499 ct 1677 -458 1704 -377 1704 -281 ct 
+1704 -197 1680 -111 1646 -72 ct 1614 -38 1570 -18 1524 -18 ct 1483 -18 1446 -33 1416 -60 ct 
+1371 -99 1344 -184 1344 -283 ct 1344 -364 1368 -447 1403 -486 ct 1438 -523 l 
+1477 -541 l  p ef
+pom
+gr
+4827 23830 m  4976 23379 l  4676 23380 l  4827 23830 l  p ef
+1 lw 0 lj 4827 23470 m  4827 23028 l  4897 23028 l  4897 22225 l  ps
+7596 15845 m  7446 16295 l  7746 16294 l  7596 15845 l  p ef
+7596 16205 m  7596 18400 l  4897 18400 l  4897 20955 l  ps
+gr
+0 26640 t 
+pom
+count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore
+%%PageTrailer
+%%Trailer
+%%EOF
diff --git a/SHUTTLE/libSHUTTLE.pkg b/SHUTTLE/libSHUTTLE.pkg
new file mode 100644 (file)
index 0000000..1302323
--- /dev/null
@@ -0,0 +1,12 @@
+SRCS = AliSimpleValue.cxx AliDCSValue.cxx AliDCSMessage.cxx\
+       AliDCSClient.cxx AliShuttle.cxx AliShuttleConfig.cxx\
+       AliCDBPreProcessor.cxx
+
+HDRS:= $(SRCS:.cxx=.h) 
+
+DHDR= SHUTTLELinkDef.h
+
+
+EXPORT:= AliSimpleValue.h AliDCSValue.h AliDCSClient.h\
+       AliShuttle.h AliShuttleConfig.h AliCDBPreProcessor.h
+
diff --git a/SHUTTLE/schema/ITS.ldif b/SHUTTLE/schema/ITS.ldif
new file mode 100644 (file)
index 0000000..5aabcd3
--- /dev/null
@@ -0,0 +1,9 @@
+#ITS config
+dn: dt=ITS,dc=alice,dc=cern,dc=ch
+objectClass: shuttleConfig
+dt: ITS
+ipHost: 192.168.39.23
+ipServicePort: 4242
+alias: HighVol01
+alias: HighVol07
+
diff --git a/SHUTTLE/schema/PHOS.ldif b/SHUTTLE/schema/PHOS.ldif
new file mode 100644 (file)
index 0000000..464e60b
--- /dev/null
@@ -0,0 +1,9 @@
+#PHOS config
+dn: dt=PHOS,dc=alice,dc=cern,dc=ch
+objectClass: shuttleConfig
+dt: PHOS
+ipHost: 192.168.39.23
+ipServicePort: 4242
+alias: temperature
+alias: pressure
+
diff --git a/SHUTTLE/schema/README b/SHUTTLE/schema/README
new file mode 100644 (file)
index 0000000..3a7cc5b
--- /dev/null
@@ -0,0 +1,30 @@
+This directory contians LDAP schema for Shuttle configuration.
+
+shuttle.schema - schmea definition. All detectors entries have the
+objectClass defined in shuttle.schema (shuttleConfig).
+
+TPC.ldif, ITS.ldif PHOS.ldif - contains examples for detector configuration.
+
+AliShuttleConfig uses ROOT ldap package to access the ldap server.
+Following manual interventions are needed for ROOT LDAP package:
+
+1) ROOT LDAP package uses deprecated functions as: ldap_simple_bind_s etc.
+To compile ROOT with LDAP support properly, LDAP_DEPRECATED has to be defined.
+
+
+2) As all contemporary LDAP servers use LDAP V3 protocol and the dafault
+protocol is LDAP V2 some lines have to be added to file TLDAPServer.cxx
+
+in method: Int_t TLDAPServer::Bind()
+
+add before ldap_simple_bind_s
+
+ Int_t protVersion = 3;
+ if((result = ldap_set_option(fLd, LDAP_OPT_PROTOCOL_VERSION, &protVersion)
+                        != LDAP_OPT_SUCCESS )) {
+                Error("Bind", "Could not set protocol version 3!");
+                return result;
+ }
+
+
+
diff --git a/SHUTTLE/schema/TPC.ldif b/SHUTTLE/schema/TPC.ldif
new file mode 100644 (file)
index 0000000..b574a2a
--- /dev/null
@@ -0,0 +1,9 @@
+#TPC config
+dn: dt=TPC,dc=alice,dc=cern,dc=ch
+objectClass: shuttleConfig
+dt: TPC
+ipHost: 192.168.39.23
+ipServicePort: 4242
+alias: HighVol01
+alias: HighVol07
+
diff --git a/SHUTTLE/schema/shuttle.schema b/SHUTTLE/schema/shuttle.schema
new file mode 100644 (file)
index 0000000..4ae1fb7
--- /dev/null
@@ -0,0