Sunday, January 31, 2016

t24 subroutine

Date Routines
CDD
Description
Calculates the difference, in days, between two supplied dates
Arguments
(REGION, DATE1, DATE2, DAYS)
Incoming
REGION
Region code
DATE1
Start date, YYYYMMDD
DATE2
End date, YYYYMMDD
DAYS
'W' to indicate working days
'C' to indicate calendar days
Returned
DAYS
The number of days difference, + or -
CDT
Description
Calculates forward or previous date from a start date using the number of days.
Arguments
(REGION, DATE, DAYS)
Incoming
REGION
Region code
DATE
Start date, YYYYMMDD
DAYS
The number of days forward in the format
+ or -, the number of days, working or calendar eg. +99C, -6W, +66W+3C
Returned
DATE
The calculated date
ETEXT
Error message if unsuccessful
TEMENOS T24 User Guide Page 6 of 60
Subroutine Guide
CFQ
Description:
Calculates the next date from today's date and a frequency code.
Arguments:
COMI from I COMMON
Incoming:
COMI
YYYYMMDDXXXXX where XXXXX is the frequency code.
Returned:
COMI
YYYYMMDDXXXXX the calculated date and the frequency code.
DIETER.DATE
Description:
This routine converts dates from the format used throughout GLOBUS (YYYMMDD) to the standard jBASE format (either internal or external. External dates formatted as per jBASE CONVERSIONs)
Arguments:
GLOBUS.DATE, jBASE.DATE, CONVERSION
Incoming:
GLOBUS.DATE
Date in Standard T24 Format (yyyymmdd)
JBASE.DATE
The date in internal jBASE date format, or formatted according to CONVERSION
Note that both GLOBUS.DATE and JBASE.DATE cannot be passed. One date is mandatory.
CONVERSION
Any valid jBASE Date conversion
Returned:
GLOBUS.DATE
Date in standard T24 format (yyyymmdd)
JBASE.DATE
The date in internal jBASE date format, or formatted according to CONVERSION
TEMENOS T24 User Guide Page 7 of 60
Subroutine Guide
JULDATE
Description:
Convert from Julian to Gregorian date format and vice versa
Arguments:
GREGORIAN.DATE,JULIAN.DATE
Incoming:
GREGORIAN.DATE
Standard T24 Date in the format yyyymmdd
JULIAN.DATE
Julian Date in the format yyyyjjj
One of the above dates must be passed to the subroutine; the other date must be null.
Returned:
GREGORIAN.DATE
Standard T24 Date in the format yyyymmdd if passed as null
JULIAN.DATE
Julian Date in the format yyyyjjj if passed as null
TEMENOS T24 User Guide Page 8 of 60
Subroutine Guide
Exchanges Rates
CALC.ERATE.LOCAL
Description:
This routine calculates an exchange rate given a foreign amount and local currency equivalent.
Arguments:
YLCL.AMT, YFOR.CCY, YFOR.AMT, YEXCH.RATE
Incoming:
YLCL.AMT
Local equivalent amount
YFOR.CCY
Foreign currency
YFOR.AMT
Foreign Currency amount
Returned:
YEXCH.RATE
The derived exchange rate TEMENOS T24 User Guide Page 9 of 60
Subroutine Guide
CUSTRATE
Description:
Perform all the tasks involved in foreign exchange of two currencies on a buy/sell basis
Arguments:
CCY.MARKETS, BUY.CCY,BUY.AMT,SELL.CCY,SELL.AMT,
BASE.CCY,TREASURY.RATE,CUST.RATE,CUST.SPREAD,
SPREAD.PCT,LOCAL.CCY.BUY,LOCAL.CCY.SELL,
RETURN.CODE
Incoming:
CCY.MARKETS
Is a multi-valued field containing the markets for the buy and sell side. This parameter needs be multi-valued only for Multi Market. For all cases where the buy and sell markets are the same, CCY.MARKETS should be a single value only. In case of two markets, the format should be: BUY.CCY.MKT:VM:SELL.CCY.MKT.
BUY.CCY and SELL.CCY
These are the currencies that will be involved in the transaction
BUY.AMT and SELL.AMT
These are the amounts that will be involved in the transaction. Only one is passed to the routine. The other is calculated from it and the customer rate
BASE.CCY
This is the currency in terms of which the RATES will be expressed
TREASURY.RATE
This is the rate at which the TREASURY will exchange the currencies
CUSTOMER.RATE
The rate at which the currencies will be exchanged for the customer
CUSTOMER.SPREAD
The difference between the TREASURY.RATE and the CUSTOMER.RATE
SPREAD.PCT
The percentage of the default CUSTOMER.SPREAD to be used in calculating the CUSTOMER.RATE
Of the above parameters, only CCY.MARKETS, BUY/SELL CCY and one amount are mandatory. The other amount must be blank and only 1 of the CUSTOMER fields may have a value. NOTE: Only one CURRENCY.MARKET is mandatory.
Returned:
LOCAL BUY/SELL AMTS
The local equivalents of the buy and sell amounts involved in this transaction.
RETURN.CODE
This holds the status of various test performed during the course of the routine. RETURN.CODE is a dynamic array composed of 4 fields, which are as follows:
1) Invalid input parameter - This is a fatal error and the routine will immediately terminate. In such a case, this field is set to one and an TEMENOS T24 User Guide Page 10 of 60
Subroutine Guide
explanation of the error returned in ETEXT
2) Negotiable amount exceeded - The field is set to the amount by which the amount entered exceeds the negotiable amount for the relevant currency
3) Fixing date error - This field indicates which of the currencies has a FIXING DATE rate and the current date does not match the date the rate was last fixed. If this field is set then 1 indicates BUY.CCY is in error, 2 that it is the SELL.CCY and 3 that both are in error
4) Suspended market - This indicates that one of the currencies has had quotes suspended whether it be the LOCAL, BUY or SELL CCY. If the LOCAL is suspended, this automatically terminates the routine. For BUY and SELL, the routine is terminated only if the suspension indicator is not set to 'BLOCKED'. If the routine is terminated, a relevant message is returned in ETEXT. If the indicator is set, then its value is returned in RETURN.CODE. Note: Suspension of currencies is not currently available.
TEMENOS T24 User Guide Page 11 of 60
Subroutine Guide
EXCHRATE
Description:
Performs all the tasks involved in foreign exchange of two currencies
Arguments:
CCY.MKT,BUY.CCY,BUY.AMT,SELL.CCY, SELL.AMT,BASE.CCY,EXCHANGE.RATE, DIFFERENCE,LCY.AMT,RETURN.CODE
Incoming:
CCY.MKT
The currency market in which the transaction will take place
BUY.CCY and SELL.CCY
The currencies that will be involved in the transaction
BUY.AMT and SELL.AMT
The amounts that will be involved in the transaction
BASE.CCY
The currency in terms of which the EXCHANGE.RATE will be expressed
EXCHANGE.RATE
The rate of exchange between the two currencies
If any of these fields, with exception of BUY/SELL CCY and CCY.MKT are left blank, then they will be filled in by the routine if at all possible
Returned:
DIFFERENCE
The difference between the figures given above and the internally generated BASE.CCY amount
LCY.AMT
The amount of the transactions in terms of the local currency
RETURN.CODE
The status of various tests performed during the course of the routine. RETURN.CODE is a dynamic array composed of six fields, which are as follows: -
1) Invalid input parameter - This is a fatal error and the routine will immediately terminate. In such a case, this field is set to 1 and an explanation of the error returned in ETEXT
2) Tolerance error - This is the signed percentage value by which the input rate differs from the calculated rate to 2 decimal places. This is only set if the error is greater than that permitted for the BASE.CCY.
3) Negotiable amount exceeded - The field is set to 1 if the BUY.AMT exceeds the NEGOTIABLE AMOUNT for the BUY.CCY. It is set to 2 if this is true for the SELL.CCY and 3 if true for both currencies TEMENOS T24 User Guide Page 12 of 60
Subroutine Guide
MIDDLE.RATE.CONV.CHECK
Description:
Performs the following functions:
Converts a foreign amount to a local amount when a foreign amount is passed but not a local.
Converts a local amount to a foreign amount when a local amount is passed but not a foreign.
Calculates an exchange rate when both a foreign and local amount is passed.
Recalculates foreign and local amounts and returns the difference.
Calculates a percentage exchange rate difference when a rate is passed.
Note: The middle rate is used for all calculations unless a rate is explicitly passed.
Arguments:
(FAMT, FCY, RATE, MARKET, LAMT, DIF.AMT, DIF.RATE)
Incoming:
FAMT
Foreign amount
FCY
Foreign currency code, USD etc
RATE
Exchange rate
MARKET
Currency market (default 1)
LAMT
Local amount
Returned:
FAMT
When calculated
LAMT
When calculated
RATE
When calculated
DIF.AMT
The amount difference when calculated
DIF.RATE
The percentage rate difference when calculated TEMENOS T24 User Guide Page 13 of 60
Subroutine Guide
Communications
OFS.GLOBUS.MANAGER
Use of this subroutine is no-longer supported.
Please use the OFS.MESSAGE.SERVICE and see OFS.POST.MESSAGE
OFS.POST.MESSAGE
Please see the OFS user guide for details of the application of this interface.
Description:
Posts a message to an OFS queue to be processed by the OFS message service.
To be used in place of the OFS.GLOBUS.MANAGER.
Arguments:
(OFS.REC, OFS.MSG.ID, OFS.SOURCE.ID, OPTIONS)
Incoming:
OFS.REC
A valid OFS message
(See the OFS user guide for details).
OFS.SOURCE.ID
A valid OFS.SOURCE for which the message should be posted.
OPTIONS
Not Currently Used
Returned:
OFS.MSG.ID
The OFS Message ID of the message in the OFS.MESSAGE.QUEUE
TEMENOS T24 User Guide Page 14 of 60
Subroutine Guide
File Handling
OPF
Description:
File open routine. Handles company modification of file name hence it must be called for all file opens.
Arguments:
(FILE.NAME, FILE.VAR)
Incoming:
FILE.NAME
Name of the file to be opened, this should not include any mnemonic as this will be determined by the program itself allowing for the file classification and multi-company or multi-book setup e.g F.CUSTOMER.
Returned:
FILE.NAME
The full file name including the company mnemonic if applicable e.g. FXXX.CUSTOMER.
FILE.VAR
File variable. TEMENOS T24 User Guide Page 15 of 60
Subroutine Guide
EB.CLEAR.FILE
Description:
Clear a file
This routine will clear a file or deleted selected records from the specified file.
The file name must include the correct prefix so an OPF should previously been used to determine this. The selection arguments should conform to those expected by jBASE, i.e. WITH CUSTOMER.NO = “10001”
Arguments:
(FILE.NAME, FILE.VAR)
Incoming:
FILE.NAME
Field 1 = File name, field 2 (optional) = selection arguments
FILE.VAR
Open file variable
Returned:
TEMENOS T24 User Guide Page 16 of 60
Subroutine Guide
File I/O
F.DELETE
Description:
Deletes a record from a file
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
Returned:
TEMENOS T24 User Guide Page 17 of 60
Subroutine Guide
F.MATREAD
Description:
Read a dimensioned array from a file
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID, MAT ARY, SIZE, F.FL, ER)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
ARY
Matrix for MATREAD/WRITE
SIZE
Size of array
F.FL
File variable
Returned:
ARY
Dimensioned array (data record)
ER
Error message TEMENOS T24 User Guide Page 18 of 60
Subroutine Guide
F.MATREADU
Description:
Read a dimensioned array record from a file with a lock
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID, MAT ARY, SIZE, F.FL, ER, RETRY)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
ARY
Matrix for MATREAD/WRITE
SIZE
Size of array
F.FL
File variable
RETRY
Retry arguments for lock. The format of this can be as follows;
P msg ; Prompt the user with 'msg' if the record is locked. The default if 'msg' is null is 'xxxxx FILE id RECORD LOCKED - RETRY Y/N'
R nn xx ; Retry xx times with a sleep interval of nn seconds. If xx is not specified the record is continually retried.
I ; Ignore the lock (REC or ARY is left as null)
E ; Return immediately with an error message
Null ; Retry continuously with a sleep interval of one second
Returned:
ARY
Dimensioned array (data record)
ER
Error message TEMENOS T24 User Guide Page 19 of 60
Subroutine Guide
F.MATWRITE
Description:
Writes a dimensioned array (record) to a file
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID,MAT ARY, SIZE)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
ARY
Dimensioned array (record)
SIZE
Size of array
Returned:
TEMENOS T24 User Guide Page 20 of 60
Subroutine Guide
F.LIVE.MATWRITE
Description:
Writes a dimensioned array (record) to a file as normal like the F.MATWRITE routine, but the difference being that Audit fields are updated on the LIVE file record and any History updates are done automatically on the $HIS file record. These updates are performed because this routine is wrapped around a CALL to an external subroutine called AUTH.AND.HIST.WRITE, which does the actual updating.
The other difference being that the INSERT for IO routine processing is no longer in this routine like it is in the F.MATWRITE routine. The INSERT for IO processing is in the routine F.MATWRITE which is called by AUTH.AND.HIST.WRITE and the later routine is called by F.LIVE.MATWRITE.
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines, buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID,MAT ARY, SIZE)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
ARY
Dimensioned array (record)
SIZE
Size of array
Returned:
TEMENOS T24 User Guide Page 21 of 60
Subroutine Guide
F.READ
Description:
Read a record from a file
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID, REC, F.FL, ER)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
REC
Record buffer
F.FL
File variable
Returned:
REC
Data record
ER
Error message TEMENOS T24 User Guide Page 22 of 60
Subroutine Guide
F.READU
Description:
Read a record with a lock
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID, REC, F.FL, ER, RETRY)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
REC
Record buffer
F.FL
File variable
RETRY
Retry arguments for lock. The format of this can be as follows;
P msg ; Prompt the user with 'msg' if the record is locked. The default if 'msg' is null is 'xxxxx FILE id RECORD LOCKED - RETRY Y/N'
R nn xx ; Retry xx times with a sleep interval of nn seconds. If xx is not specified the record is continually retried.
I ; Ignore the lock (REC or ARY is left as null)
E ; Return immediately with an error message
Null ; Retry continuously with a sleep interval of one second
Returned:
REC
Data record
ER
Error message TEMENOS T24 User Guide Page 23 of 60
Subroutine Guide
F.WRITE
Description:
Writes a record to a file
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID, REC)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
REC
Record buffer
Returned:
REC
Data record
TEMENOS T24 User Guide Page 24 of 60
Subroutine Guide
F.LIVE.WRITE
Description:
Writes a record to a file as normal like the F.WRITE routine, but the difference being that Audit fields are updated and any History updates are done automatically. These updates are performed because this routine is wrapped around a CALL to an external subroutine called AUTH.AND.HIST.WRITE, which does the actual updating.
The other difference being that the INSERT for IO routine processing is no longer in this routine like it is in the F.WRITE routine. The INSERT for IO processing is in the routine F.MATWRITE which is called by AUTH.AND.HIST.WRITE and the later routine is called by F.LIVE.WRITE.
Application software interacts with the journal processor through a series of IO routines, essentially replacing the standard Data/Basic verbs READ/READU/WRITE etc. These routines buffer the transactions IO until a 'flush' point at the end of the transaction, when the journal is updated and the file writes performed. They must be used in place of 'read and write' statements for all processing.
Arguments:
(FL, ID, REC)
Incoming:
FL
File name 'F.xxxx.xxxxx'
ID
Key
REC
Record buffer
Returned:
REC
Data record
TEMENOS T24 User Guide Page 25 of 60
Subroutine Guide
CACHE.READ
Description:
Read a record from a file
This routine is used to access static parameter type records in the database. The cache of these records is maintained for a period of time - default 60 seconds. Hence if a record is accessed and it's cached record is older than 60 seconds then it is read from disk. It can also store a list of file IDs.
Extreme care should be taken when using this routine, the cache size is limited and if the cache is filled with spurious data then it fails to serve it’s purpose as data is dropped from the cache to add a new record. Records such as CUSTOMER, ACCOUNT, SEC.ACC.MASTER & SECURITY.MASTER should, for example, never be read using this subroutine.
Arguments:
(C.FILENAME,C.ID,RECORD,ER)
Incoming:
C.FILENAME
Name of file - without the mnemonic (so just F.SC.DEL.INSTR for example).
C.ID
The key or 'SelectIDs' for a list of IDs in the file
Returned:
RECORD
Data record
ER
Error message
TEMENOS T24 User Guide Page 26 of 60
Subroutine Guide
CACHE.FILE
Description:
Read a record from a file
Routine to read records from sparsely populated files. This is used where an application has to read a file which more often than not empty.
Arguments:
(C.FILENAME,C.ID,RECORD,ER)
Incoming:
C.FILENAME
Name of file - without the mnemonic (so just F.SC.DIV.ACCRUAL for example).
C.ID
Record Id
Returned:
RECORD
Data record
ER
Error message
TEMENOS T24 User Guide Page 27 of 60
Subroutine Guide
EB.READ.PARAMETER
Description:
Read a system keyed parameter record from a file
This routine is used to read a parameter record that is keyed by the company id and will allow for multi-book setup where the parameter need only be setup in the lead company.
Arguments:
(FILEID,REC.LOCK,MAT DIM.PARAM.REC,DYN.PARAM.REC,PARAM.ID,F.FILEID,ER)
Incoming:
FILEID
Name of file - without the mnemonic (so just F.SC.PARAMETER for example).
REC.LOCK
Y/N field to indicate whether record to be read with lock or not
PARAM.ID
Parameter record ID
When calling this routine to read a PARAMETER file which has its ID set to COMPANY.ID, set PARAM.ID to '' (null) and this routine would return the appropriate PARAMETER file record by reading the record with either the CURRENT company's ID or with MASTER company's ID. On the other hand, if the PARAMETER file's ID is not COMPANY.ID but "SOME.STRING" then, call this routine with PARAM.ID set to "SOME.STRING", this routine would form the correct ID for the PARAMETER file and return the PARAMETER record.
F.FILEID
File variable. If this is passed as '', then the file would be opened in this routine.
Returned:
MAT DIM.PARAM.REC
Parameter record returned as Dimensioned array
DYN.PARAM.REC
Parameter record returned as Dynamic array
PARAM.ID
See Incoming description
F.FILEID
See incoming description
ER
Error message TEMENOS T24 User Guide Page 28 of 60
Subroutine Guide
Transaction Management
TRANSACTION.ABORT
Description:
Subroutine to cancel the current transaction and clear deferred writes and releases locks.
Arguments:
None
Incoming:
Standard common variables
Returned:
Cleared system write cache and lock table (except current transaction id)
Validation
DUP
Description:
Checks for duplicate occurrences of values in multi and sub-valued fields at cross-validation.
Arguments:
None
Incoming:
R.NEW(x )
The current record
AF
The field number (x) to be validated
F(x)
The array containing the field names and definition as multi and/or sub-valued fields
Returned:
END.ERROR
Error flag indicating cross-validation error
ETEXT, T.ETEXT
Error message: 'INPUT OR LINE-DELETION MISSING' or 'DUPLICATE' TEMENOS T24 User Guide Page 29 of 60
Subroutine Guide
FT.NULLS.CHK
Description:
This routine will check for a particular field, if the field has been expanded with extra multi- or sub-values, and if there are any null values.
Arguments:
None
Incoming:
R.NEW(x )
The current record
AF
The field number (x) to be validated
F(x)
The array containing the field names and definition as multi and/or sub valued fields
Returned:
END.ERROR
Error flag indicating cross-validation error
ETEXT, T.ETEXT
Set if null values- or sub-values are found
STORE.END.ERROR
Description:
Routine to store error messages by field, to be displayed at the end of validation processing.
Arguments:
AF – from I_COMMON
AV – from I_COMMON
AS – from I_COMMON
ETEXT – from I_COMMON
Incoming:
AF
Field number in error
AV
Value number in error
AS
Sub-value in error
ETEXT
Error message
ERR
Description:
Displays error message on the same line as the input field or on line 22 if
TEMENOS T24 User Guide Page 30 of 60
Subroutine Guide
running under a multi-line version. Can be used only within the confines of a template program.
Arguments:
E
From I_COMMON
ECOMI
From I_COMMON
Incoming:
E
Error message to be displayed (will be translated)
ECOMI
Should contain the user input if it is to be displayed with the error message.
TEMENOS T24 User Guide Page 31 of 60
Subroutine Guide
Overrides
STORE.OVERRIDE
Description:
Prompts for an override and stores the message in the main file record if the user replies 'Y'.
Arguments:
(CURR.NO)
AF – from I_COMMON
AV - from I_COMMON
AS - from I_COMMON
TEXT - from I_COMMON
Incoming:
CURR.NO
Current record number (0 clears all previous overrides)
AF
Field number to return to if user replies 'NO'
AV
Value number to return to if user replies 'NO'
AS
Sub-Value to return to if user replies 'NO'
TEXT
Override message
Returned:
TEXT
User's reply, 'Y' or 'NO'
TEMENOS T24 User Guide Page 32 of 60
Subroutine Guide
Translation
APP.STATIC.TEXT
Description:
Returns array of application messages from the static text translation file. The messages are defined by the application and their translations (entered by the user) are read in at run time.
Arguments:
(MAT ARRAY, KEY)
Incoming:
KEY
ID of F.STATIC.TEXT record.
Returned:
ARRAY
Array of translated messages.
TXT
Description:
Translates dynamic messages. The message can contain a variable portion e.g. RATE 99.9999 EXCEEDS TOLERANCE BY 10%.
Arguments:
(MESSAGE)
Incoming:
MESSAGE
Message to be translated. If it contains a variable portion then it should be a dynamic array in the following format:
<1> 'RATE & EXCEEDS TOLERANCE BY &'
<2> 99.9999 <vm> 10%
Returned:
MESSAGE
Translated message
Note, this should not be used with T24 Browser.

No comments:

Post a Comment