Introduction
This document is dedicated to explain the existing XML API of GuardPoint Pro
The API and relevant docs can be taken from here
It allows an easy integration with Sensor Access control and alarm monitoring software called GuardPoint Pro. This means that an external application could:
- Receive many information from GuardPoint Pro such as online events of access control systems (Access granted, Access denied, Start of Alarm)
Act on Access control systems by:
- Creating cardholders
- Manages doors status, and relays status (Open a door for a while, open constantly, close constantly, or return to default status)
- Manage alarm status (disarm a zone / input group)
- Executing existing actions and processes of GuardPoint Pro
- Login / Logoff
- User interface (messages on screen)
- Download configuration to controllers (may be updated directly in DB by an external application)
GuardPoint Pro has also other integration gateway such as:
- OPC
- ModbusTCP
- Wizcon
GuardPoint Pro has existing integration with:
- Visitor management application (Telemaque www.safeware.fr )
- Windows account management (ISLOG www.islog.eu )
- LPR (Zamir)
- Outdoor Perimeter Security Systems (www.magal.co.il)
- Integration with RFID Readers on Pocket PC/PDA (External Events)
- Reception of ONSSI Video Systems alarms (External Events)
The document is based on GuardPoint Pro Version 1.8.003 (June 2008)
Most of the commands are supported in previous versions, but in order to simplify we will only work on the basis of the actual version.
The communication with GuardPoint Pro is done by a communication engine called “Spread”. For more information about Spread, see www.spread.org
How to send commands
SpreadCmd (for command without answer only)
Target : D:\DEV\GuardPoint Pro\SpreadCmd.exe DANIEL <perform><cmd>DisplayMessage</cmd><param><query><Param1> Hi, How are you? </Param1></query></param></perform>
Where DANIEL is the PC Name
And GuardPoint Pro should be running (XMLAPISample)
See the project source code in VB.NET to see how to connect to Spread and send and receive XML message. Note: GuardPoint Pro should already be running
The example uses a DLL (libtspd.dll) compiled for Windows plateform.
For other platforms, please visit www.spread.org or specifically the page on supported platforms www.spread.org/SpreadPlatforms.html (Linux, Mac ...).
Note: the spread version used by GuardPoint Pro is version 3.17.
GuardPoint Pro build the conf file and start the spread daemon on its computer, from the definitions of PCs in GuardPoint Pro software.
If you need to work from another PC, there are 2 solutions:
• Run a local daemon and connect to you local daemon (4803@localhost)
• Do not run any local daemon and connect to GuardPoint Pro PC daemon by connecting to 4803@<PCName or IP of GuardPoint Pro PC>
How to receive events / messages
In previous versions of GuardPoint Pro, it was enough to listen to group “gui” to receive all type of events from any sites. From version 1.8.206, we add an optimization that separate the unique listen group in many groups.
Now each client should listen to the followings groups names:
ag_<Site ID> for Access granted
ot_<Site ID> for other type of events
dp_<Site ID> for debug info
where Site ID is the site ID (from table SOC)
io_<ServerID> for IO dynamic status
Where Server ID is the ID of the server (from table PC).
XML Structure
All XML Sent to and from GuardPoint Pro has the following structure:
<perform>
<cmd>Name of the Command</cmd>
<param>
<query>
<Argument1>Value1</Argument1>
<Argument2>Value2</Argument2>
<Argument3>Value3</Argument3>
...
<ArgumentN>ValueN</ArgumentN>
</query>
</param>
</perform>
The Cmd define the command name
The param contains a list of arguments
Methods
ChangeUserLogin - send a request to change the user logged in by another one with the user name and password.
Syntax
Cmd: ChangeUserLogin
Parameters:
CmdLine=/us=UserName /pw=password
Where username and password are the credential used in Login screen of GuardPoint Pro.
Example:
<perform><cmd>ChangeUserLogin</cmd><param><query><CmdLine>/us=1000/pw=2000</CmdLine></query></param></perform>
OpenScreen
Send a request to open a screen. The command supports selecting:
• on which record
• on which tab
• and the screen size (normal, minimise, or maximise).
Syntax
Cmd: OpenScreen
Parameters:
Param1 ScreenID (Cf Appendix A)
Param3= MinMax (0= Normal, 1=Minimized, 2 Maximized)
Param4= Only for Display Photo screen
onRecordID= on which record ID
onTabNumber= on which tab number (starting from 0)
Example:
<perform><cmd>OpenScreen</cmd><param><query><Param1>ID_Cardholders</Param1><Param3>0</Param3><Param4>0</Param4><onRecordID>0</onRecordID><onTabNumber>0</onTabNumber></query></param></perform>
Cf Appendix A (Screens ID) to get all the parameter according to the screen you want to open.
PreviewVideo
Send a request to preview a camera live video with the db_CameraID (cf Appendix B).
Syntax
Cmd: PreviewVideo
Parameters:
Param1 = db_CameraID (cf Appendix B)
Note: this command should be sent to the PC name (in uppercase) where we want the display video to be open.
Example:
<perform><cmd>PreviewVideo</cmd><param><query><Param1>1</Param1></query></param></perform>
PreviewReport
Send a request to preview an existing report with the report full name.
Syntax
Cmd: PreviewReport
Parameters:
Param1 = report full name with path
Example:
<perform><cmd>PreviewReport</cmd><param><query><Param1>D:\DEV\GuardPoint ProAPI\Reports\Last report.rpx</Param1></query></param></perform>
DisplayMessage
Send a request to display a message box with the text.
Syntax
Cmd: DisplayMessage
Parameters:
Param1 = message text
Example:
<perform><cmd>DisplayMessage</cmd><param><query><Param1> Hi, How are you? </Param1></query></param></perform>
MenuPrint (InsertTextinLog)
Send a request to insert message in the Log windows of GuardPoint Pro.
Syntax:
Cmd: MenuPrint
Parameters:
st = message text
Soc = 1 by default. Use to filter information on Multi site / Multi company installation only
mStyle = Event Type. Will be display with the same color as defined for the event specified
JustinLog (Not used)
inViewPhotoAlso (Not used)
Example:
<perform><cmd>MenuPrint</cmd><param><query><st>Hi, How are you ? </st><Soc>1</Soc><mStyle>0</mStyle><JustinLog>0</JustinLog><inViewPhotoAlso>0</inViewPhotoAlso></query></param></perform>
FloodUpdateText (InsertTextinStatusBar)
Send a request to insert message in the status bar and set the percent of the progress bar.
Syntax:
Cmd: FloodUpdateText
Parameters:
pb = percentage number (0-100)
st = message text
srv (Not used)
Example:
<perform><cmd>FloodUpdateText</cmd><param><query><srv></srv><pb>50</pb><st>Hi, How are you? </st></query></param></perform>
PlaySound
Send a request to play a sound file with the full path of the sound file.
Syntax:
Cmd: PlaySound
Parameters:
Param1= sound file full name with path
Example:
<perform><cmd>PlaySound</cmd><param><query><Param1>C:\Windows\Media\Windows Notify.wav</Param1></query></param></perform>
ExecuteAction
Send a request to execute an existing action with db_ActionID (cf Appendix B).
Syntax:
Cmd: ExecuteAction
Parameters:
pID = db_ActionID (cf Appendix B)
Example:
<perform><cmd>ExecuteAction</cmd><param><query><pID>1</pID></query></param></perform>
ExecuteProcess
Send a request to preview an existing process with db_ProcessID (cf Appendix B)
Syntax:
Cmd: ExecuteProcess
Parameters:
pID = db_ProcessID (cf Appendix B)
Example:
<perform><cmd>ExecuteProcess</cmd><param><query><pID>1</pID></query></param></perform>
CC_RecreateMemoryTables (RecreateMemoryTables)
Send a request to initialize an existing controller db_ControllerID (cf Appendix B) with recreation of memory tables.
Syntax:
Cmd: CC_RecreateMemoryTables
Parameters:
CtrID = db_ControllerID (cf Appendix B)
ReStartPolling =
WantClearMemory =
Example:
<perform><cmd>CC_RecreateMemoryTables</cmd><param><query><CtrID>db_ControllerID</CtrID><ReStartPolling>0</ReStartPolling><WantClearMemory>1</WantClearMemory></query></param></perform>
ActivateRelay (SetRelayState)
Send a request to modify the relay state with the db_OutputID (cf Appendix B). Activate relay is only to activate a relay few seconds
Syntax:
Cmd: ActivateRelay
Parameters:
OutputID = db_OutputID (cf Appendix B)
Delay = x seconds (1 to 120 seconds)
Example: to activate relay ID 1 during 3 sec:
<perform><cmd>ActivateRelay</cmd><param><query><OutputID>1</OutputID><Delay>3</Delay></query></param></perform>
OutputAction (SetRelayState)
Send a request to modify the relay state with the db_OutputID (cf Appendix B). OutputAction is used to set a relay state that remain permanently (until next change).
Syntax:
Cmd: OutputAction
Parameters:
OutputID = db_OutputID (cf Appendix B)
Action = action code
1 for normal mode
6 for constant on
7 for constant off
Example: to activate relay ID 1 constant on:
<perform><cmd>OutputAction</cmd><param><query><OutputID>1</OutputID><Action>6</Action></query></param></perform>
Note this command update also the latest state of the relay in GuardPoint Pro.
This command allows to control doors relays and other output (e.g. alarm siren)
ActivateInput (SetInputState)
Send a request to modify the Input state with the db_InputID (cf Appendix B). ActivateInput is used to pulse the input few seconds.
Syntax:
Cmd: ActivateInput
Parameters:
InputID = db_InputID (cf Appendix B)
Delay = multiple x 200ms (1 to 255 x 200 ms)
Example: to pulse input ID 1 during delay of 200 ms:
<perform><cmd>ActivateInput</cmd><param><query><InputID>1</InputID><Delay>1</Delay></query></param></perform>
ActivateDeactiveInput (SetInputState)
Send a request to modify the Input state with the db_InputID (cf Appendix B). ActivateDeactiveInput is used to is used to set a input state that remain permanently (until next change).
Syntax:
Cmd: ActivateDeactiveInput
Parameters:
InputID = db_InputID (cf Appendix B)
CodeAction = action code
0 for Normal mode
8 for Deactivated
9 for Activated
Example: to deactivate input ID 1:
<perform><cmd>ActivateDeactiveInput</cmd><param><query><InputID>1</InputID><CodeAction>8</CodeAction></query></param></perform>
This command allows to control alarms sensors to be arm or not.
ActiveDeactiveInputGroup (SetInputGroupState)
Send a request to modify the Input group state (Deactivate / Force activate the input group) with the db_InputGroupID (cf Appendix B).
Syntax:
Cmd: ActiveDeactiveInputGroup
Parameters:
InputGroupID = db_InputGroupID (cf Appendix B)
InputGroupMode = action code
9 for Disarm during x seconds
10 for Disarm during x minutes
11 for Constant deactivated
12 for Return to normal mode (Cancel previous delay)
13 for Disarm until next time zone
14 for Activate during x seconds
15 for Activate during x minutes
16 for Constant activated
17 for Normal to normal mode (Cancel previous delay)
18 for Arm until next time zone
Delay = x seconds (1 to 60 seconds, 1-191 minutes)
Example: To disarm the input group 1 during 30 seconds
<perform><cmd>ActiveDeactiveInputGroup</cmd><param><query><InputGroupID>1</InputGroupID><InputGroupMode>9</InputGroupMode><Delay>30/Delay></query></param></perform>
Example: To arm the input group 1 during 15 minutes
<perform><cmd>ActiveDeactiveInputGroup</cmd><param><query><InputGroupID>1</InputGroupID><InputGroupMode>15</InputGroupMode><Delay>10</Delay></query></param></perform>
This command allows to control alarm zones (defined as group of inputs) to be arm or not.
Methods with answer
GetTimeDate
Send a request to get the time and date of a controller db_ControllerID (cf Appendix B).
Syntax:
Cmd: GetTimeDate
Parameters:
CtrID = db_ControllerID (cf Appendix B)
SyncID = as the answer is return asynchronously, we define an number in the question that is returned in the answer to know the link between the answer and the question.
AnswerID contains in myID the group to whom the GuardPoint Pro server should answer. (We recommend to make such a group per PC)
Example:
Sent to GuardPoint Pro:
<perform><cmd>GetTimeDate</cmd><param><query><CtrID>1</CtrID><SyncID>8</SyncID><AnswerID myID="API_DANIEL" /></query></param></perform>
Response from GuardPoint Pro:
<perform><cmd>syncGetResult</cmd><param><query><SyncID>8</SyncID><Answer>16/12/2008 15:53:50</Answer></query></param></perform>
GetDigitalInputStatus
Send a request to get the input and output status of a controller db_ControllerID (cf Appendix B).
It returns the logical state of the input (physical state according to NO/NC) and the Syntax:
Cmd: GetDigitalInputStatus
Parameters:
CtrID = db_ControllerID (cf Appendix B)
SyncID = see GetTimeDate explanation
AnswerID = see GetTimeDate explanation
The returned string is build of 0/1 in the following order:
• Inputs (1-16)
• Relays (1-64)
• Inputs (17-24)
• Mega specific indication R1, R2, R3, R4, PSF, MS, 0, 0
for Reader1 to 4 (R1-R4 : 1 if connected, 0 if not connected)
PSF = Power Supply Failure input on board
MS = MS input on board to indicate if box open or not.
and two last values not used always 0
Example:
Sent to GuardPoint Pro:
<perform><cmd>GetDigitalInputStatus</cmd><param><query><CtrID>1</CtrID><SyncID>3</SyncID><AnswerID myID="API_DANIEL" /></query></param></perform>
Response from GuardPoint Pro:
<perform><cmd>syncGetResult</cmd><param><query><SyncID>3</SyncID><Answer>0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 11001100</Answer></query></param></perform>
GetHardwareVersion
Send a request to get the hardware version of a controller db_ControllerID (cf Appendix B).
It returns a string. For more information, consult the TPL User Manual.
Syntax:
Cmd: GetHardwareVersion
Parameters:
CtrID = db_ControllerID (cf Appendix B)
SyncID = see GetTimeDate explanation
AnswerID = see GetTimeDate explanation
To understand the string return, please consult the TPL user manual.
Example:
Sent to GuardPoint Pro:
<perform><cmd>GetHardwareVersion</cmd><param><query><CtrID>1</CtrID><SyncID>5</SyncID><AnswerID myID="API_DANIEL" /></query></param></perform>
Response from GuardPoint Pro:
<perform><cmd>syncGetResult</cmd><param><query><SyncID>5</SyncID><Answer>09 00 61 61 00 00 01 10 C7 07 </Answer></query></param></perform>
GetFirmareVersion
Send a request to get the firmware version of a controller db_ControllerID (cf Appendix B).
It returns the Eprom date and checksum.
Syntax:
Cmd: GetFirmareVersion
Parameters:
CtrID = db_ControllerID (cf Appendix B)
SyncID = see GetTimeDate explanation
AnswerID = see GetTimeDate explanation
The returned string is the date and check sum of the firmware.
Example:
Sent to GuardPoint Pro:
<perform><cmd>GetFirmareVersion</cmd><param><query><CtrID>1</CtrID><SyncID>4</SyncID><AnswerID myID="API_DANIEL" /></query></param></perform>
Response from GuardPoint Pro:
<perform><cmd>syncGetResult</cmd><param><query><SyncID>4</SyncID><Answer>10/07/08 3782</Answer></query></param></perform>
GetMemoryOccupation
Send a request to get the memory occupation of a controller db_ControllerID (cf Appendix B).
It returns the number of cardholders stored in the controller memory.
Syntax:
Cmd: GetMemoryOccupation
Parameters:
CtrID = db_ControllerID (cf Appendix B)
SyncID = see GetTimeDate explanation
AnswerID = see GetTimeDate explanation
Example:
Sent to GuardPoint Pro:
<perform><cmd>GetMemoryOccupation</cmd><param><query><CtrID>1</CtrID><SyncID>6</SyncID><AnswerID myID="API_DANIEL" /></query></param></perform>
Response from GuardPoint Pro:
<perform><cmd>syncGetResult</cmd><param><query><SyncID>6</SyncID><Answer> 9</Answer></query></param></perform>
isPollingNow
Send a request to know if currently we are polling or not the controllers. It returns True/False.
Syntax:
Cmd: GetMemoryOccupation
Parameters:
CtrID = db_ControllerID (cf Appendix B)
SyncID = see GetTimeDate explanation
AnswerID = see GetTimeDate explanation
Example:
Sent to GuardPoint Pro:
<perform><cmd>isPollingNow</cmd><param><query><SyncID>7</SyncID><AnswerID myID="API_DANIEL" /></query></param></perform>
Response from GuardPoint Pro:
<perform><cmd>syncGetResult</cmd><param><query><SyncID>7</SyncID><Answer>1</Answer></query></param></perform>
StartPolling
Send a request to Start Polling the controllers.
This command update the polling queues, it adds new controllers or remove controllers have been set as not active. You can specify a specific controller or network. Without defining any controller (CtrID = 0), it starts the communication polling with all the controllers.
Syntax:
Cmd: StartPolling
Parameters:
CtrID = db_ControllerID (cf Appendix B)
NetID = db_NetwokID (cf Appendix B)
SyncID = see GetTimeDate explanation
AnswerID = see GetTimeDate explanation
Example:
<perform><cmd>StartPolling</cmd><param><query><CtrID>0</CtrID><NetID>0</NetID><SyncID>2</SyncID><AnswerID myID="API_DANIEL" /></query></param></perform>
Note that we send a SyncID even if we do not require a answer in order to force GuardPoint Pro to finish this request before processing another request.
StopPolling
Send a request to Stop Polling the controllers.
You can specify a specific controller. Without defining any controller (CtrID = 0), it stops all the communication polling with the controllers.
Syntax:
Cmd: StopPolling
Parameters:
CtrID = db_ControllerID (cf Appendix B)
SyncID = see GetTimeDate explanation
AnswerID = see GetTimeDate explanation
Example:
<perform><cmd>StopPolling</cmd><param><query><CtrID>0</CtrID><SyncID>3</SyncID><AnswerID myID="API_DANIEL" /></query></param></perform>
Note: that we send a SyncID even if we do not require a answer in order to force GuardPoint Pro to finish this request before processing another request.
ImportCardholder
Send a request to import a cardholder in the database and inform the controllers. This allows adding, updating or deleting cardholders.
Syntax:
Cmd: ImportOneCardHolderXML
Parameters:
Eye_Color = This field is an example of Customised Fields. They should be added in the XML in order to import them.
Response from GuardPoint Pro:
<perform><cmd>syncGetResult</cmd><param><query><SyncID>17</SyncID><Answer>0</Answer></query></param></perform>
Events
TreatEvent
Wake up the application when information to be displayed in Log windows arrives.
Syntax:
Cmd: TreatEvent
Parameters:
SyncID = see GetTimeDate explanation
AnswerID = see GetTimeDate explanation
Trn_Type = Transaction type (see Appendix C)
Examples:
<perform><cmd>TreatEvent</cmd><param><query><ID>0</ID><mDate>16/12/2008 14:40:57</mDate><Trn_Type>1</Trn_Type><From_Name>Rdr01 / Mega</From_Name><Desc1>0</Desc1><Desc2>0</Desc2><Desc3>Smith John 00000003</Desc3><Reader>1</Reader><mInput>0</mInput><Controller>1</Controller><Cardholder>4</Cardholder><User>0</User><Soc>1</Soc><Soc2>1</Soc2><CH_Trans>1</CH_Trans><Acknowledged>0</Acknowledged><Confirmed>0</Confirmed><tmpStyle>0</tmpStyle><NoLogHistory>0</NoLogHistory><EmpPhoto></EmpPhoto><isDoorContact>0</isDoorContact><isRTX>0</isRTX><DoorName></DoorName><CameraID>0</CameraID></query></param></perform>
16/12/08 14:40:57 Access Granted 'Smith John 00000003' From reader 'Rdr01 / IC4000'
<perform><cmd>TreatEvent</cmd><param><query><ID>0</ID><mDate>16/12/2008 14:41:47</mDate><Trn_Type>3</Trn_Type><From_Name>Rdr02 / Mega</From_Name><Desc1>0</Desc1><Desc2>8</Desc2><Desc3>Smith John 00000003</Desc3><Reader>2</Reader><mInput>0</mInput><Controller>1</Controller><Cardholder>4</Cardholder><User>0</User><Soc>1</Soc><Soc2>1</Soc2><CH_Trans>1</CH_Trans><Acknowledged>0</Acknowledged><Confirmed>0</Confirmed><tmpStyle>0</tmpStyle><NoLogHistory>0</NoLogHistory><EmpPhoto></EmpPhoto><isDoorContact>0</isDoorContact><isRTX>0</isRTX><DoorName></DoorName><CameraID>0</CameraID></query></param></perform>
16/12/08 14:41:47 Access Denied 'Smith John 00000003' From reader 'Rdr02 / IC4000' - Not Authorized at this time
<perform><cmd>TreatEvent</cmd><param><query><ID>0</ID><mDate>16/12/2008 14:53:02</mDate><Trn_Type>11</Trn_Type><From_Name>i05 / Mega</From_Name><Desc1>2</Desc1><Desc2></Desc2><Desc3></Desc3><Reader>0</Reader><mInput>5</mInput><Controller>1</Controller><Cardholder>0</Cardholder><User>0</User><Soc>1</Soc><Soc2>0</Soc2><CH_Trans>0</CH_Trans><Acknowledged>0</Acknowledged><Confirmed>0</Confirmed><tmpStyle>0</tmpStyle><NoLogHistory>0</NoLogHistory><EmpPhoto></EmpPhoto><isDoorContact>0</isDoorContact><isRTX>0</isRTX><DoorName></DoorName><CameraID>0</CameraID></query></param></perform>
16/12/08 14:53:02 End of alarm From input 'i05 / IC4000'
<perform><cmd>TreatEvent</cmd><param><query><ID>0</ID><mDate>16/12/2008 14:53:03</mDate><Trn_Type>10</Trn_Type><From_Name>i01 / Mega</From_Name><Desc1>0</Desc1><Desc2></Desc2><Desc3></Desc3><Reader>0</Reader><mInput>1</mInput><Controller>1</Controller><Cardholder>0</Cardholder><User>0</User><Soc>1</Soc><Soc2>0</Soc2><CH_Trans>0</CH_Trans><Acknowledged>0</Acknowledged><Confirmed>0</Confirmed><tmpStyle>0</tmpStyle><NoLogHistory>0</NoLogHistory><EmpPhoto></EmpPhoto><isDoorContact>1</isDoorContact><isRTX>0</isRTX><DoorName>Rdr01 / Mega</DoorName><CameraID>0</CameraID></query></param></perform>
16/12/08 14:53:03 Start of Alarm From input 'i01 / Mega'- Immediate. Door forced 'Rdr01 / IC4000'
ControllerCommunicationError
Wake up the application when a controller starts to be in Communication error.
It returns the text to be displayed in Log windows.
Example:
<perform><cmd>PollingError</cmd><param><query><Text>16/12/2008 15:32:38 263 - Communication error Mega - Error 263. Timeout</Text><CtrSoc>1</CtrSoc></query></param></perform>
ControllerCommunicationOK
Wake up the application when a controller returns to be in Communication OK.
It returns the text to be displayed in Log windows.
Example:
<perform><cmd>ComOK</cmd><param><query><Text>16/12/2008 15:33:58 Communication OK Mega</Text><CtrSoc>1</CtrSoc></query></param></perform>
Refresh_ioXML
Wake up the application when changes on input output status logical status arrives.
It returns the states of all input outputs of all the controllers.
Cf GetDigitalInputStatus methods for the format of the io string.
Example:
<perform><cmd>Refresh_ioXML</cmd><param><io server="DANIEL"><ctr1 io="0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 11001100" server="DANIEL"/><ctr2 io="1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 11001100" server="DANIEL"/></io></param></perform>
Appendix A: Screens ID
Appendix B: Database Fields
The database fields
Appendix C: Transaction Type
The TRN_TYPE is describe in Param database in table Log_Events:
Appendix D: Denied Reasons
The denied reasons is decimal value that indicate a combination of 8 reasons
If the value = 250 means Supervisor
If the value = 255 means Access Group
For other values, the value should be change in binary.
1 - wrong finger
2 - Wrong Keypad Code
4 - Full / Lock / No answer from Door
8 - Not Authorized at this time
16 - Anti-Pass Back
32 - Reader not allowed
64 - Site Code not ok
128 - Inhibited Cardholder
If escort
1 - Card Unknown
2 - Wrong Keypad Code
4 - No card after 10 sec
8 - Not Authorized at this time
16 - Anti-Pass Back
32 - Inhibited Cardholder
64 - Site Code not ok
128 - Escort not authorized
Comments
0 comments
Please sign in to leave a comment.