|
RSS Feed - WebSphere MQ Support
|
RSS Feed - Message Broker Support
|
 |
|
MtiImbParser Internal Error |
« View previous topic :: View next topic » |
Author |
Message
|
djeripo |
Posted: Wed May 26, 2004 2:27 pm Post subject: MtiImbParser Internal Error |
|
|
 Master
Joined: 25 Jan 2004 Posts: 225
|
What could be the reason for the following exception .
ExceptionList
(
(0x1000000)RecoverableException = (
(0x3000000)File = '/build/S210_P/src/DataFlowEngine/ImbDataFlowNode.cpp'
(0x3000000)Line = 536
(0x3000000)Function = 'ImbDataFlowNode::createExceptionList'
(0x3000000)Type = 'ComIbmMQOutputNode'
(0x3000000)Name = '93db3d9f-fc00-0000-0080-edf4a4526066'
(0x3000000)Label = 'HMB.PERSISTENCY.V001.HMB.MQSIOUT.PERSISTENCY.QR'
(0x3000000)Text = 'Node throwing exception'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 2230
(0x1000000)ParserException = (
(0x3000000)File = '/build/S210_P/src/MTI/MTIforBroker/MtiImbParser2/MtiImbParser.cpp'
(0x3000000)Line = 463
(0x3000000)Function = 'MtiImbParser::parseRightSibling'
(0x3000000)Type = 'ComIbmMQInputNode'
(0x3000000)Name = 'a2b93d9f-fc00-0000-0080-edf4a4526066'
(0x3000000)Label = 'HMB.PERSISTENCY.V001.CTP.MQSIIN.PERSISTENCY.QL'
(0x3000000)Text = 'MtiImbParser Internal Error'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 5354
(0x1000000)Insert = (
(0x3000000)Type = 5
(0x3000000)Text = 'parseRightSibling called before RefreshElementFromBitstream'
)
)
)
When I check in the manual , Its saying
BIP5354E MTI internal error: diagnostic
information ’&1’.
Explanation: An internal software error has occurred
in the Message Translation Interface Parser. The
diagnostic information associated with this message is:
’&1’.
User Response: Shutdown and restart the message
broker. If the problem continues to occur, then restart
the system. If the problem still continues to occur
contact your IBM support center.
Even after refreshing the broker , its giving same thing
Thanks |
|
Back to top |
|
 |
jefflowrey |
Posted: Wed May 26, 2004 6:25 pm Post subject: |
|
|
Grand Poobah
Joined: 16 Oct 2002 Posts: 19981
|
I think you either need to supply us with a lot more information...
Or call IBM support, as recommended. _________________ I am *not* the model of the modern major general. |
|
Back to top |
|
 |
djeripo |
Posted: Sun May 30, 2004 1:12 am Post subject: |
|
|
 Master
Joined: 25 Jan 2004 Posts: 225
|
I apologize for providing little information. I was doing a transformation from TDS to CWF .I built a message set with 'All Elements Delimited' delimiter as <CR><LF> and the repeating element <CR><LF> .
In the ESQL I was using Copy message headers . In that situation it was throwing the follwing exception,
ExceptionList
(
(0x1000000)RecoverableException = (
(0x3000000)File = '/build/S210_P/src/DataFlowEngine/ImbDataFlowNode.cpp'
(0x3000000)Line = 536
(0x3000000)Function = 'ImbDataFlowNode::createExceptionList'
(0x3000000)Type = 'ComIbmMQOutputNode'
(0x3000000)Name = '93db3d9f-fc00-0000-0080-edf4a4526066'
(0x3000000)Label = 'HMB.PERSISTENCY.V001.HMB.MQSIOUT.PERSISTENCY.QR'
(0x3000000)Text = 'Node throwing exception'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 2230
(0x1000000)ParserException = (
(0x3000000)File = '/build/S210_P/src/MTI/MTIforBroker/MtiImbParser2/MtiImbParser.cpp'
(0x3000000)Line = 463
(0x3000000)Function = 'MtiImbParser::parseRightSibling'
(0x3000000)Type = 'ComIbmMQInputNode'
(0x3000000)Name = 'a2b93d9f-fc00-0000-0080-edf4a4526066'
(0x3000000)Label = 'HMB.PERSISTENCY.V001.CTP.MQSIIN.PERSISTENCY.QL'
(0x3000000)Text = 'MtiImbParser Internal Error'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 5354
(0x1000000)Insert = (
(0x3000000)Type = 5
(0x3000000)Text = 'parseRightSibling called before RefreshElementFromBitstream'
)
)
)
.In my ESQL I included the following code,
SET OutputRoot = InputRoot;
SET OutputRoot.MRM = NULL;just before mapping Input Root Elements to Output Root Elements. With that change I could resolve my problem.
Sample,
DECLARE C INTEGER;
SET C = CARDINALITY(InputRoot.*[]);
DECLARE I INTEGER;
SET I = 1;
WHILE I < C DO
SET OutputRoot.* = InputRoot.*[I];
SET I=I+1;
END WHILE;
SET OutputRoot.Properties.MessageSet = 'DR563VG0RI001';
SET OutputRoot.Properties.MessageType = 'HMB.OUTPUT.PERSISTENCY.MESSAGE.V001';
-- Enter SQL below this line. SQL above this line might be regenerated, causing any modifications to be lost.
DECLARE J INTEGER;
SET J = 1 ;
WHILE J <= CARDINALITY("InputBody"."CTP.PERSISTENCY.RECORD_MAIN.ELEMENT.V001"[])
DO
[i]SET OutputRoot = InputRoot; SET OutputRoot.MQMD.Encoding = 785;
SET OutputRoot.MQMD.CodedCharSetId = 37;
SET OutputRoot.MRM = NULL;
SET OutputRoot.Properties.MessageSet = 'DR563VG0RI001';
SET OutputRoot.Properties.MessageType = 'HMB.OUTPUT.PERSISTENCY.MESSAGE.V001';
SET OutputRoot.Properties.MessageFormat = 'CWF';
IF "InputBody"."CTP.PERSISTENCY.RECORD_MAIN.ELEMENT.V001"[J] IS NOT NULL
THEN
....................................... |
|
Back to top |
|
 |
jefflowrey |
Posted: Mon May 31, 2004 8:37 am Post subject: |
|
|
Grand Poobah
Joined: 16 Oct 2002 Posts: 19981
|
I guess I still don't see what was causing the problem, but I'm glad you were able to find something that fixed it.
Are you, in the loop of code you left unfinished, using propagate?
If so, then I can see that causing the error listed and being "fixed" by what you did. When you propagate the message, the OutputRoot tree is returned completely empty. So as you found, you had to recopy the message headers each time after propagate. And if you tried to do something like "Set OutputRoot.MRM.Child.Child", you were trying to set the value for a child node of a non-existant childnode. Which caused the parser to complain.
By setting OutputRoot.MRM = NULL, you created an empty node - so the parser could then call NEXTCHILD to get to children nodes to populate them.
Rather than setting it to NULL, though, you might want to use the CREATE FIELD ... DOMAIN command instead. That will help the parser to build the OutputRoot tree properly.
Also, when using the Cardinality function like you are, it is going to be more efficient (and can prevent problems) to assign the results of the Cardinality function to a local variable before the loop. That will keep the system from recalculating Cardinality every time. _________________ I am *not* the model of the modern major general. |
|
Back to top |
|
 |
djeripo |
Posted: Mon May 31, 2004 12:20 pm Post subject: |
|
|
 Master
Joined: 25 Jan 2004 Posts: 225
|
May be its high time I learn how to phrase a question .
Jeff, Whatever you assumed regarding my MessageFlow is correct .
In my Input data I will get fixed length data which is delimited by <CR><LF> . and my Repeating Element Delimiter is <CR><LF> .
I am using PROPAGATE to propagate every message as an independent record
The thing I did not understand is,
Quote: |
And if you tried to do something like "Set OutputRoot.MRM.Child.Child", you were trying to set the value for a child node of a non-existant childnode. Which caused the parser to complain. |
By this,did you mean to say, after every propagate ,
OutputRoot.MRM.Child.Child ceases to exist ?
Did you mean ,SET OutputRoot.MRM = NULL is going to reset that?
My understanding is ,
SET OutputRoot = InputRoot; is going to copy everything from the InputRoot to OutputRoot like MQMD,Properties, and MRM.
I want everything except MRM. Because , I dont want to send Input data as it comes from the InputRoot(I dont think anybody would do this) .Because , My requirement says that for some of the output fields should have the values from the Database using the input data .Some of the input data needs to be casted as the output tree would expect data in particular data type(Like Decimal,Integer etc etc) .After manipulating with the inputdata I would build an output tree by manually assigning each and every input element to output element ,
For that reason I would want to nullify all the MRM that has been copied from the InputRoot by doing,
Set OutputRoot.MRM = NULL;
Please clarify ! |
|
Back to top |
|
 |
jefflowrey |
Posted: Mon May 31, 2004 12:58 pm Post subject: |
|
|
Grand Poobah
Joined: 16 Oct 2002 Posts: 19981
|
djeripo wrote: |
By this,did you mean to say, after every propagate ,
OutputRoot.MRM.Child.Child ceases to exist ? |
Yes, that should be the case.
djeripo wrote: |
Did you mean ,SET OutputRoot.MRM = NULL is going to reset that? |
Yes, in that it assigns something to OutputRoot at all, and causes the parser to create a node of somesort at OutputRoot.
djeripo wrote: |
My understanding is ,
SET OutputRoot = InputRoot; is going to copy everything from the InputRoot to OutputRoot like MQMD,Properties, and MRM. |
Yes, it should do that. I missed seeing that line in your code. Sorry.
djeripo wrote: |
I want everything except MRM. Because , I dont want to send Input data as it comes from the InputRoot(I dont think anybody would do this) .Because , My requirement says that for some of the output fields should have the values from the Database using the input data .Some of the input data needs to be casted as the output tree would expect data in particular data type(Like Decimal,Integer etc etc) .After manipulating with the inputdata I would build an output tree by manually assigning each and every input element to output element ,
For that reason I would want to nullify all the MRM that has been copied from the InputRoot by doing,
Set OutputRoot.MRM = NULL;
Please clarify ! |
Right, you can do that the way you think you are doing so. It's inefficient, since you're copying everything from Input to Output and then throwing stuff away.
Except, somehow, you're getting an error.
The way I've done this and had it work is to - set the ComputeNode to Copy Message Headers (as you've done)
- created a loop that walked through each relevant input record - as you've done
- Inside that loop, created my Output message as necessary
- called PROPAGATE
- still inside the loop, copied the code "above the line" to copy the message headers from the input to the output tree.
- ended the loop
- return false; to make sure that I don't propagate an empty message out of the Compute Node when I'm done.
I can think of a couple of other reasons, now that I actually do *think* about it, that you may seen the error you saw. The first is that you don't return false at the end of your compute node. This causes an empty tree to be propagated to the next node - and the parser is then blowing up trying to handle an empty InputRoot.
The second is that your Input tree has blank records or something in it -like perhaps an XML file that has line endings in it will generate a tree that has fields that hold the line endings. So when you check
Code: |
IF "InputBody"."CTP.PERSISTENCY.RECORD_MAIN.ELEMENT.V001"[J] IS NOT NULL |
It returns true because the element isn't NULL, but it doesn't have child fields.
It would be helpful, if possible, to see a complete trace of the message body before your compute node. _________________ I am *not* the model of the modern major general. |
|
Back to top |
|
 |
djeripo |
Posted: Mon May 31, 2004 5:39 pm Post subject: |
|
|
 Master
Joined: 25 Jan 2004 Posts: 225
|
Thank you very much Jeff .That cleared all of my doubts .
Quote: |
The way I've done this and had it work is to
set the ComputeNode to Copy Message Headers (as you've done)
created a loop that walked through each relevant input record - as you've done
Inside that loop, created my Output message as necessary
called PROPAGATE
still inside the loop, copied the code "above the line" to copy the message headers from the input to the output tree.
ended the loop
return false; to make sure that I don't propagate an empty message out of the Compute Node when I'm done. |
Does that mean you would have done in the following way,
SET OutputRoot.MRM = NULL;
SET OutputRoot.MQMD = InputRoot.MQMD;
SET OutputRoot.Properties = InputRoot.Properties;
(Efficient Way)
The same I am acheiving by doing,
SET OutputRoot = InputRoot;
SET OutputRoot.MRM = NULL;
(Inefficient Way)
The remaining I am doing the same way what you would have done.
Quote: |
The second is that your Input tree has blank records or something in it -like perhaps an XML file that has line endings in it will generate a tree that has fields that hold the line endings |
I am doing a TDS to CWF conversion.
Despite simulating same environment, I could not reproduce the same error. I am getting an altogether a diffrent exception,
Exception:
(
(0x1000000)RecoverableException = (
(0x3000000)File = 'F:\build\S210_P\src\DataFlowEngine\ImbDataFlowNode.cpp'
(0x3000000)Line = 536
(0x3000000)Function = 'ImbDataFlowNode::createExceptionList'
(0x3000000)Type = 'ComIbmComputeNode'
(0x3000000)Name = 'b2638977-fc00-0000-0080-f378d48ec2cb'
(0x3000000)Label = 'HMD.PERSISTENCY.MESSAGEFLOW.Compute1'
(0x3000000)Text = 'Node throwing exception'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 2230
(0x1000000)RecoverableException = (
(0x3000000)File = 'F:\build\S210_P\src\DataFlowEngine\ImbMqOutputNode.cpp'
(0x3000000)Line = 727
(0x3000000)Function = 'ImbMqOutputNode::evaluate'
(0x3000000)Type = 'ComIbmMQOutputNode'
(0x3000000)Name = 'ec908977-fc00-0000-0080-f378d48ec2cb'
(0x3000000)Label = 'HMD.PERSISTENCY.MESSAGEFLOW.HMB.MQSIOUTPUT.PERSISTENCY.QL'
(0x3000000)Text = 'Caught exception and rethrowing'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 2230
(0x1000000)ParserException = (
(0x3000000)File = 'F:\build\S210_P\src\MTI\MTIforBroker\MtiImbParser2\MtiImbParser.cpp'
(0x3000000)Line = 1112
(0x3000000)Function = 'MtiImbParser::refreshBitStreamFromElements - 9 par'
(0x3000000)Type = 'ComIbmMQInputNode'
(0x3000000)Name = 'ba098977-fc00-0000-0080-f378d48ec2cb'
(0x3000000)Label = 'HMD.PERSISTENCY.MESSAGEFLOW.HMB.MQSIINPUT.PERSISTENCY.QL'
(0x3000000)Text = 'ImbRecoverableException caught from worker when attempting to write out the bitstream.'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 5286
(0x1000000)Insert = (
(0x3000000)Type = 5
(0x3000000)Text = 'HMD.PERSISTENCY.OUTPUT'
)
(0x1000000)Insert = (
(0x3000000)Type = 2
(0x3000000)Text = '1'
)
(0x1000000)Insert = (
(0x3000000)Type = 5
(0x3000000)Text = 'TDS'
)
(0x1000000)Insert = (
(0x3000000)Type = 5
(0x3000000)Text = 'HMB.OUTPUT.PERSISTENCY.MESSAGE.V001'
)
(0x1000000)ParserException = (
(0x3000000)File = 'F:\build\S210_P\src\cpi\pwf\tds\tdsworker.cpp'
(0x3000000)Line = 73
(0x3000000)Function = 'CTDSWorker::initializeWrite'
(0x3000000)Type = ''
(0x3000000)Name = ''
(0x3000000)Label = ''
(0x3000000)Text = 'An attempt was made to parse/write but no descriptor was loaded for the TDS worker'
(0x3000000)Catalog = 'WMQIv210'
(0x3000000)Severity = 3
(0x3000000)Number = 5431
(0x1000000)Insert = (
(0x3000000)Type = 5
(0x3000000)Text = 'TDS'
)
)
)
)
)
The only difference in simulation is
I was getting 'MtiImbParser Internal Error' on my office computer and for the same I am getting 'An attempt was made to parse/write but no descriptor was loaded for the TDS worker' on my home computer.I feel that should not make any difference ,reason At Work & Home computer I am on WMQI2.1 CSD06 .But I dont understand why I could not reproduce same Exception.
It does not have any blank records .
I am appending complete trace of my message body before my compute node
Root:
(
(0x1000000)Properties = (
(0x3000000)MessageSet = 'E0VONB8084001'
(0x3000000)MessageType = 'RECORD_MAIN_MESSAGE'
(0x3000000)MessageFormat = 'TDS'
(0x3000000)Encoding = 546
(0x3000000)CodedCharSetId = 437
(0x3000000)Transactional = TRUE
(0x3000000)Persistence = FALSE
(0x3000000)CreationTime = GMTTIMESTAMP '2004-06-01 00:45:50.640'
(0x3000000)ExpirationTime = -1
(0x3000000)Priority = 0
(0x3000000)ReplyIdentifier = X'000000000000000000000000000000000000000000000000'
(0x3000000)ReplyProtocol = 'MQ'
(0x3000000)Topic = NULL
)
(0x1000000)MQMD = (
(0x3000000)SourceQueue = 'HMB.MQSIINPUT.PERSISTENCY.QL'
(0x3000000)Transactional = TRUE
(0x3000000)Encoding = 546
(0x3000000)CodedCharSetId = 437
(0x3000000)Format = ' '
(0x3000000)Version = 2
(0x3000000)Report = 0
(0x3000000)MsgType = 8
(0x3000000)Expiry = -1
(0x3000000)Feedback = 0
(0x3000000)Priority = 0
(0x3000000)Persistence = 0
(0x3000000)MsgId = X'414d51204d5153495f53414d504c455f2f3db94020002010'
(0x3000000)CorrelId = X'000000000000000000000000000000000000000000000000'
(0x3000000)BackoutCount = 0
(0x3000000)ReplyToQ = ' '
(0x3000000)ReplyToQMgr = 'MQSI_SAMPLE_QM '
(0x3000000)UserIdentifier = 'Durga '
(0x3000000)AccountingToken = X'16010515000000f53645498aa7323f43170a32ec03000000000000000000000b'
(0x3000000)ApplIdentityData = ' '
(0x3000000)PutApplType = 11
(0x3000000)PutApplName = 'C:\Installables\rfhutil.exe '
(0x3000000)PutDate = DATE '2004-06-01'
(0x3000000)PutTime = GMTTIME '00:45:50.640'
(0x3000000)ApplOriginData = ' '
(0x3000000)GroupId = X'000000000000000000000000000000000000000000000000'
(0x3000000)MsgSeqNumber = 1
(0x3000000)Offset = 0
(0x3000000)MsgFlags = 0
(0x3000000)OriginalLength = -1
)
(0x1000021)MRM = (
(0x1000013)RECORD_MAIN_ELEMENT = (
(0x300000B)CREATE_DATE = '040525'
(0x300000B)COMPANY_CODE = '02'
(0x300000B)POLICY_NUMBER = '8014985 '
(0x300000B)RIDER_ID = '01'
(0x300000B)STATUS = ' '
(0x300000B)ISSUE_DATE = ' 980430'
(0x300000B)PAID_TO_DATE = ' 040503'
(0x300000B)LAST_MAINT_DATE = ' 010101'
(0x300000B)INFORCE_DATE = ' 010101'
(0x300000B)ISSUE_STATE = 'NE'
(0x300000B)ACCOUNTING_CODE = 1
(0x300000B)TOWN_CODE = ' '
(0x300000B)PT_KIND = ' '
(0x300000B)PT_GROUP_NUMBER = ' '
(0x300000B)MODX = ' '
(0x300000B)METHOD = ' '
(0x300000B)TERM_BSP_INDICATOR = 'Y'
(0x300000B)BL_TYPE_CODE = ' '
(0x300000B)PAYMENT_MODE = '12'
(0x300000B)CONS_MARK = ' '
(0x300000B)COVERAGE_STATUS = '0'
(0x300000B)TERMINATION_CODE = 'A'
(0x300000B)STATUS_CHANGE_DATE = ' '
(0x300000B)RIDER_ISSUE_DATE = ' 010101'
(0x300000B)PREM_CHANGE_DATE = ' 010101'
(0x300000B)PLAN_CODE = 'RPVUL'
(0x300000B)RATE_SCALE = ' '
(0x300000B)VAL_FORM = ' '
(0x300000B)PLAN_CDE = ' '
(0x300000B)DIST_METHOD_CODE = 1
(0x300000B)PLAN_TYPE = '01'
(0x300000B)RATE_AGE = '000'
(0x300000B)UL_INDICATOR = 'Y'
(0x300000B)LF_BILL_PREM = '00000000051'
(0x300000B)WP_BILL_PREM = '000000000'
(0x300000B)ADB_BILL_PREM = '000000000'
(0x300000B)COV_BAS_PREM = '0000000000'
(0x300000B)EXTRA_BAS_PREM = '0000000000'
(0x300000B)WP_BAS_PREM = '00000000'
(0x300000B)COV_BENE_AMOUNT = '00000000000'
(0x300000B)ADB_AMOUNT = '00000000000'
(0x300000B)AGENT_NUMBER = '014603'
(0x300000B)AGENT_NUMBER_2 = ' '
(0x300000B)AGENT_NUMBER_3 = ' '
(0x300000B)OTC = ' '
(0x300000B)MAC = ' '
(0x300000B)INSURED_NUMBER = '0000000000'
(0x300000B)NAME = 'SHERRI WEHRS '
(0x300000B)SEX = 'F'
(0x300000B)DATE_OF_BIRTH = ' 641014'
(0x300000B)ADDRESS_1 = ' '
(0x300000B)ADDRESS_2 = ' '
(0x300000B)ADDRESS_3 = ' '
(0x300000B)CITY = ' '
(0x300000B)LOCATION = ' '
(0x300000B)STATE = 'NE'
(0x300000B)ZIP = '68405 '
(0x300000B)CONVERSION_CODE = ' '
(0x300000B)OLD_COMPANY_CODE = ' '
(0x300000B)OLD_POLICY_NUMBER = ' '
(0x300000B)UL_LINE_OF_BUSINESS = ' '
(0x300000B)UL_STATUS_CODE = '00'
(0x300000B)UL_RDR_TERM_CODE = '01'
(0x300000B)UL_CASE_NO = ' '
(0x300000B)UL_MONIES_IN = '00000000000'
(0x300000B)UL_ACCUM_WD = '00000000000'
(0x300000B)UL_MA_DUMPIN = '000000000'
(0x300000B)UL_ACCUM_NET = '0000000000000'
(0x300000B)UL_BNCHMRK_PREM = '00000000607'
(0x300000B)UL_LNCR_BNCHMRK = '0000000'
(0x300000B)UL_OLD_ANN_PREM = '000000000'
(0x300000B)UL_OLD_FACE_CASH = '00000000000'
(0x300000B)UL_CASH_REL = '000000000'
(0x300000B)UL_OLD_TERM_FACE = '000000000'
(0x300000B)UL_OLD_POL_ANN_PREM = '0000000'
(0x300000B)LAST_TRANSACTION_DATE = ' 040521'
(0x300000B)FILLER = ' '
)
The above trace corresponds to only one record.
Once again thanks Jeff , Memorial day has taught me some lessons. |
|
Back to top |
|
 |
djeripo |
Posted: Mon May 31, 2004 9:10 pm Post subject: |
|
|
 Master
Joined: 25 Jan 2004 Posts: 225
|
Quote: |
Does that mean you would have done in the following way,
SET OutputRoot.MRM = NULL;
SET OutputRoot.MQMD = InputRoot.MQMD;
SET OutputRoot.Properties = InputRoot.Properties;
(Efficient Way) |
To be more precise,
SET OutputRoot.Properties = NULL;
SET OutputRoot.Properties = InputRoot.Properties;
SET OutputRoot.MQMD = NULL;
SET OutputRoot.MQMD = InputRoot.MQMD;
SET OutputRoot.MRM = NULL;
It works only if this order is maintained may be because tree is built in that order . Properties followed by MQMD followed by MRM |
|
Back to top |
|
 |
|
|
 |
|
Page 1 of 1 |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|
|
|