Change 28.120 -Variable QBACPID, Buffer Pool ID, is removed from dataset
VMACDB2 DB2ACCTP where it never belonged; packages can use many
Jun 3, 2010 buffer pools. The other QBACxxxx variables exist, but are
only non-missing (i.e., populated) if DB2 Accounting
Class 10 is enabled.
-DB2ACCTB - QLACCNVR didn't belong in KEEP list.
-DB2ACCTG - QLACCNVR didn't belong in KEEP list.
Thanks to Chuck Hopf, Independent Consultant, USA.
Change 28.119 Support for Performance Sentry NTSMF Version 3.1.4.4.
EXNTGENE -Existing objects were modified:
EXNTIPA4 Dataset - Object Name
EXNTIPA6 IPSECDRI - IPsec Driver - fields removed
EXNTIPK4 VMGUESTA - VMWARE.Guest.Aggregate - fields added
EXNTIPK6 VMGUUCPU - VMWARE.Guest.CPU - field added
IMACNTSM VMGUUMEM - VMWARE.Guest.Memory - fields added
VMACNTSM VMHOSTAG - VMWARE.Host.Aggregate - fields added
VMXGINIT VMWHOCPU - VMWARE.Host.CPU fields added
JUN 7, 2010 VMWHOMEM - VMWARE.Host.Memory fields added
VMWHONET - VMWARE.Host.Net fields added
VMWHOSYS - VMWARE.Host.SYS fields added
-New objects supported:
dddddd Dataset Object Name
NTGENE GENERIKE GENERIC IKE AND AUTHIP
NTIPA4 IPAUTHV4 IPSEC AUTHIPV4
NTIPA6 IPAUTHV6 IPSEC AUTHIPV6
NTIPK4 IPSECIK4 IPSEC IKEV4
NTIPK6 IPSECIK6 IPSEC IKEV6
-These xxxxINST variables were increased to $64:
MLLOINST QLWGINST SAALINST VWHCINST VWHDINST
Change 28.118 Support for BMC Mainview Auto Operator data creates nine
EXMVAOAC datasets:
EXMVAOAL
EXMVAOEV dddddd Dataset Description
EXMVAOEX MVAOAC MVAOACTN MV AUTO OPERATOR ACTN
EXMVAORE MVAOAL MVAOALRT MV AUTO OPERATOR ALRT
EXMVAORU MVAOEV MVAOEVNT MV AUTO OPERATOR EVNT
EXMVAORA MVAOEX MVAOEXEC MV AUTO OPERATOR EXEC
EXMVAORS MVAORE MVAORES MV AUTO OPERATOR RES
EXMVAOTA MVAORU MVAORULE MV AUTO OPERATOR RULE
IMACMVAO MVAORA MVAORUAU MV AUTO OPERATOR RULESET AUTO
TYPEMVAO MVAORS MVAORUSE MV AUTO OPERATOR RULESET SET
TYPSMVAO MVAOTA MVAOTAPE MV AUTO OPERATOR TAPE
VMACMVAO Aug 5: TAKETOTL removed from KEEP=, second "HANDLED" was
VMXGINIT removed from LABEL, and all %VMXGDEL(DDDDDD= corrected.
May 31, 2010
Aug 5, 2010
Thanks to Christa Neven, KBC Global Services, BELGIUM.
Change 28.117 Change 28.039 changed R7451RID to be the first byte due
VMAC74 to values observed in SMF 74 Subtype 5 records from IBM
Jun 1, 2010 sites, but those observed values are not consistent in
other records from other sites, which have the RID in the
second byte and a zero in the first byte so this change
sets R7451RID to the second byte of that 2-byte field, if
if the first byte is zero. Additionally, fields listed in
notes 2 and 3 of the SMF manual are set missing based on
the value in R7451FLG.
Thanks to Melanie Hitchings, BT, ENGLAND.
Change 28.116 Support for SMF 102 IFCID 263 now decodes the unique data
VMAC102 fields; previously, only Header variables were output
May 27, 2010
Jun 11, 2010
Thanks to Christa Neven, KBC Global Services, BELGIUM.
Change 28.115 ANAL42DS failed with Data Set _NULL_ Not Found, because
ANAL42DS an _NULL_ is needed after the DATA statement.
May 26, 2010
Thanks to Sam Bass, McLane Co., USA.
====== Changes thru 28.114 were in MXG 28.03 dated May 25, 2010========
Change 28.114 Additional diagnostics to show which service classes and
UTILRMFI which reporting classes have missing data using SMFINTRV
May 25, 2010 dataset.
Change 28.113 New analysis of each DB2 Buffer Pool in DB2ACCTB dataset
ANALDB2B including a buffer hit ratio calculation.
May 25, 2010
Thanks to Santosh Kandi, JC Penney, USA.
Change 28.112 UTILRMFI failed because macro variable VWDUPES has been
VMXGINIT truncated to WDUPES in the %GLOBAL statement in VMXGINIT.
May 25, 2010
Thanks to David Young, University of California Office of Pres, USA.
Change 28.111 ThruPut Manager field REGIONSZ and $JXDBSPR/WW/UU fields
VMACTPMX were reported as UNKNOWN due to typo's in text tests,
May 24, 2010 and $JXDBSUN is now created.
Thanks to Paul Volpi, UHC, USA.
Change 28.110 The last "response" bucket created by VMXGRESP utility
ASUMDB2 (number specified plus 1) was never right, because every
VMXGRESP count that was GT was already put in the last bucket.
May 22, 2010 -Enhancement to include bucket values in labels, and a new
UNITS parameter describes the units (seconds/jobs/mounts)
that are being measured.
-ASUMDB2 implements the new UNITS= parameter.
Thanks to Wayne Bell, UniGroup, Inc, USA.
Change 28.109 -WPS %MACRO Language Compiler Error in READDB2, the error
ANALINIT cites a problem with %INCLUDE, but the statement that is
EMAIL flagged is the percent sign in %STR(MACRO _Edddddd ....
READDB2 (The _Edddddd generates %%INCLUDE SOURCLIB(EXDDDDDD);.)
UTILCONT A guess, to replace %STR() with %QUOTE() in statements
VFMT102 with that syntax DID circumvent the WPS compiler error!
May 21, 2010 -This same error can occur with ANALDB2R if (PDB=SMF,...)
is used, since ANALDB2R calls READDB2 to "READ" DB2 SMF.
-But, since READDB2 generates MACRO _Edddddd references
only when one of the optional/rare dataset sub-tokens is
used to select the observations, for example /DB2ACCT in
%READDB2(IFCIDS=ACCOUNT,DB2ACCT=YES/IF QWHSSSID='XYZ';);
so it was safer to replace %%INCLUDE SOURCLIB(EXDDDDDD);
statements with OUTPUT _WDDDDDD; to both circumvent
the Compiler error, and because the EXDDDDDD should not
have been created in READDB2 in the first place.
-An unrelated error when the dataset sub-token was used is
also corrected.
-The WANTONLY subarguments were further validated.
-In validating this READDB2 change, additional exposures
were corrected:
-VFMT102: If T102S105 and T102S107 did not exist, logic
to build OBIDS/DBIDS dataset failed: the &VGETOBS NE 0
test was changed to VGETDSN=datasetname, as it is the
existence of, and not the number of observations in,
that is the needed conditional test.
But this caused investigation of other &VGETOBS NE 0:
-ANALINIT: VGETOBS test changed to VGETDSN.
-EMAIL: VGETOBS NE 0 changed to GE 0.
-UTILCONT: VGETOBS NE 0 change to GT 0
Change 28.108 Support for CleverView for TCP/IP TN3270 Performance Data
EXCTCPTN in new SUBTYPE=21 SMF User Record, creates new CTCPTN32
IMACCTCP dataset with the existing TYPECTCP/TYPSCTCP programs.
VMACCTCP
VMXGINIT
May 20, 2010
Thanks to John Howard, Florida Northwood Shared Center, USA.
Change 28.107 -RACF INPUT STATEMENT EXCEEDED with RACFEVNT=21 LDAPHOST
VMAC80A in TOKDANAM; MXG coded for only a 32-byte LDAP Host Name,
May 19, 2010 but length was 35. Now protected for any length.
-In records with LDAPHOST, new TOKDANAM BINDDN and BINDPW
were found and decoded into variables TOKBINDD TOKBINPW.
Yes, "PW" is a Password, but, no, it doesn't appear to be
an exposure, as the value is populated with asterisks.
-TOKDANAM='APPLNAM ' text is now decoded into TOKAPLNM.
-TOKDANAM='UTYPE', 'JPNUM', numerics in TOKUTYPE/TOKJPNUM.
Thanks to Phil Grasser, Norfolk Southern, USA.
Change 28.106 The offset SMF92MPF to the Path name length SMF92PPL was
VMAC92 incorrect, causing SMF92PPN, Path Name to be blank and
May 19, 2010 SMF92PPL contained a large and wrong value.
Thanks to David Young, University of California Office of Pres, USA.
Change 28.105 -Optional TRENDing enhancement lets you tell VMXGSUM how
VMXGSUM many KEEPWEEK=/KEEPMNTH=/KEEPYEAR=/KEEPDAYS='s you want
May 19, 2010 kept in TREND output, or KEEPAFTR=01JAN2010 can be used
to output only observations GE that DATE.
-The KEEPxxxx options are only valid when DATETIME= is
used, and the value of the DATETIME= variable is tested
for each observation if it is to be output.
-A KEEPxxxx argument forces an INCODE= to be created if
one was not present; all MXG TRNDxxxx members already
have an INCODE= argument, and INCODE normally VIEWs, so
this should have minimal impact.
-Messages are not written that obs were not output.
Thanks to Diane Eppestine, IBM Global Services, USA.
Change 28.104 Support for field inserted at start of NDM-CD record.
VMACNDM New MACRO _NDMADD defaults to 0, but you can use MACKEEP
May 17, 2010 to change _NDMADD to 8 to skip 8 bytes after SYSTEM (and
to set the SMF TYPE of your NDM-CD record in _NDMID):
%LET MACKEEP=
MACRO _NDMADD 8 %
MACRO _NDMID 0FAX %
;
%INCLUDE SOURCLIB(TYPSNDM/BUILDPDB);
Eight bytes can't just be added to OFFSMF in MACFILE for
NDM-CD SMF because VMACSMF RETAINs OFFSMF, so new OFFNDM
replaced OFFSMF in VMACSMF after the first INPUT.
Thanks to Fred Buerger, Visa, Inc, USA.
Change 28.103 Support for TOKDANAM='SHARED' token, output in TYPE80TK.
VMAC80A
May 12, 2010
Thanks to Jacky Kwoka, SNCF, FRANCE.
Change 28.102 Support for user-created ECPAUDIT optional CICS variable.
IMACAAAA
IMACICUK
UTILEXCL
VMAC110
May 12, 2010
Thanks to Matt Feeney, DoD, AUSTRALIA.
Change 28.101 -IMS56xx datasets were not output because the variable for
VMACIMS subtype test should have been TPCPSSTY, and not TPCPSBCD,
VMACIMSA and the subtype test is for only one byte.
May 11, 2010 -Subtype 56x SSTY 11x INPUT STATEMENT EXCEEDED exposed MXG
May 18, 2010 mis-alignment; the +(-16) before TPIMSID does not exist,
and the +36 segment after the "NID" is conditionally read
as it doesn't exist in SSTY=0FAx records.
-In validating the printed output, the SYNCTIME in TYPE59x
datasets was not converted to local time.
-Multiple separate code stubs to calculate IMSSTCK were
replaced with LINK IMSSTCK; statements.
Thanks to Lars-Olof Thellenberg, Handelsbanken, SWEDEN.
Change 28.100 MXG 27.07 removed 13 duplicates in TYPE30_1 for an STC
BUILDPDB that were (correctly!) NOT removed by MXG 28.02. Variable
May 10, 2010 ASID has been added to TYPE30_1, and 'pseudo' duplicates
had different ASIDs and thus were not duplicates.
Oct 2010: See MXG Newsletter 57, DUPLICATE JESNR.
Thanks to Paul Volpi, UHC, USA.
Change 28.099 Variable CPULHKTM, CPU Time When Promoted due to Lock
VMAC7072 HOLD, is now INPUT and kept in TYPE72GO; it was added by
May 10, 2010 z/OS 1.11 as IBM field R723LPDP.
Thanks to Bruce Widlund, Merrill Consultants, USA.
Change 28.098 The %VMXGSET macro is enhanced with DSETOPT= argument so
VMXGSET SAS Data Set Options (DROP/KEEP/RENAME/etc) can be added
May 4, 2010 to each data set that will be "SET". This example syntax
%VMXGSET(DATASET=JOBS,DSETOPT=KEEP=JOB READTIME JESNR CPUTM);
will keep only those four variables when xxx.JOBS dataset
is read. Surprisingly, using a KEEP= on a SET statement
has minimal impact on CPU time, saving 7 out of 86 secs.
But using DSETOPT to RENAME variables could be useful.
Thanks to George Pandzik, USAA, USA.
Thanks to Brian A. Harvey, HCL America, USA.
Change 28.097 Type 74 subtype 8 R748LERT,R748LEWT,R748LPST variables
VMAC74 are correct in MXG; they are documented as accumulated
May 4, 2010 values in the SMF manual, but actual data values are not.
Variable R748LAID, the Interface ID is added at the end
of the _BTY748 BY list to ensure NODUP works when sorted.
To verify non-accumulation, it was necessary to insert
R748LAID before STARTIME, to group the observations to
see if the values were always-increasing, and that is
where it really belongs in the BY list, but inserting a
variable in an existing BY list is LETHAL for someone,
somewhere, who's already (accidentally?) combining days
and weeks PDBs, so it is added at the end for NODUP, as
that doesn't create a not-sorted exposure.
Thanks to Chuck Hopf, Independent Consultant, USA.
Change 28.096 When the LIB is in sequential or xport format, that type
VGETOBS was identified, but only now is the dataset name printed.
Apr 30, 2010
Thanks to Chuck Hopf, Independent Consultant, USA.
Change 28.095 Elegant logic using the FINDW() function to parse the
VMACAIX AIX record's changed format for the HOSTNAME field
May 21, 2010 UPCRECRD=UPCASE(RECORD);
LOCHOST=FINDW(UPCRECRD,'HOSTNAME:',' ','E') +1 ;
HOSTNAME=SCAN(RECORD,LOCHOST,' ');
HOSTNAME=TRANSLATE(HOSTNAME,' ','"');
cannot be used with SAS 9.1.3 nor with WPS 2.4.0.1,
because the FINDW() function only exists in SAS V9.2.
The old SCAN() function was used with less elegance.
Change 28.094 XAMSYS variables CALAVGM1 CALTOTM1 CALAVGM2 CALTOTM2
VMACXAM record units are 16 microseconds, so they are now INPUT
Apr 29, 2010 by &RB4.6 and multiplied by 16, so they are seconds and
fractions of a second, and are FORMATed with TIME16.6, an
MXG convention so you know these are duration variables,
and so full resolution is printed, so 416 microseconds is
printed as 0:00:00.000416.
Variable SRMTSLIC is in TOD duration record units, so it
is now INPUT by &PIB.8.6 and divided by 4096 into seconds
and fractions and also FORMATed with TIME16.6.
Variable SRBABSDL is a percentage, but scaled by 65536,
so it is now divided by 65535.
Thanks to Dave Sadler, United Health Group, USA.
Thanks to Rob van der Heij, Velocity Software, THE NETHERLANDS.
Change 28.093 Circumvention for SMF 42 Subtype 15 INVALID OFFSETS. The
VMAC42 record has OFF42S3=216 and OFF42S4=4056, but the data are
Apr 28, 2010 at 108 and 3948. MXG forces S3=108 and calculates S4.
Thanks to Michael Friske, FMR, USA.
Change 28.092 This ancient program to create a z/OS PDS from the MXG
IEBUPDTE IEBUPDTE-format source file had defined values for the
Apr 28, 2010 input and output, which required you to EDIT and SAVE
and then %INCLUDE SOURCLIB(IEBUDTE); to execute, but
those three macro variables are no longer set to any
value, so you can set them to your choice and then run.
Thanks to Bernhard Babblok, Allianz ASIC SE, GERMANY.
Change 28.091 -MXG 28.02. IMS record 55x subtype 01x from IMS 9.1 caused
VMACIMS INPUT STATEMENT EXCEEDED RECORD LENGTH; support for 55x
Apr 26, 2010 was added, but only tested with IMS 10 and 11. The 55x
record is for External Subsystems. The 01x record isn't
described in the DSECT, so it is now deleted.
-The 35X record with ENQFLAG=2F and FLAG2=00X or 08X is
now output in IMS35P dataset.
Thanks to David Schumann, Blue Cross Blue Shield of Minnesota, USA.
Change 28.090 Variable FIXEDSTO was incorrectly input as &RB.4. It is
VMACXAM a &PIB.4. INFORMAT now. Variable MONEVNTS is an address
Apr 25, 2010 so it is now formatted HEX8.
Thanks to Paul Volpi, UHC, USA.
Change 28.089 The PDB.SMFRECNT dataset and its report only counted SMF
BUIL3001 records; this enhancement provides both the record count
BUILD001 and the byte count for each SMF record and Subtype for
BUILDPD3 each SYSTEM, in both PDB.SMFRECNT and the report.
BUILDPDB If you want to revert to the count-only report, use
TYPSID %LET MACKEEP= MACRO _RPDBID _RPDBIDO % ;
VMACID Variable SMFBYTES was added to the TYPEID dataset and is
Apr 24, 2010 the bytes variable in PDB.SMFRECNT summary dataset.
Thanks to Diane Eppestine, IBM Global Services, USA.
Change 28.088 MXG 28.01-28.02, z/OS 1.9 and 1.10, INPUT EXCEEDED ERROR.
VMACRMFV Change 28.048 inserted temp skip of +192 for z/OS 1.11 to
Apr 25, 2010 align, but should have been skipped only if CPUHOLEN=672;
earlier z/OS have CPUHOLEN=480. Now, SKIP=CPUHOLEN-480.
Thanks to Stephen Hoar, Lloyds TSB, ENGLAND.
Change 28.087 -Cosmetic. Spurious message for STID=110 "SKIPPED FIELDS"
VMAC110 because SKIP=SKIP-580 should have been SKIP=SKIP-612. No
Apr 23, 2010 fields were skipped and dataset CICRLR was just fine.
-Use of internal SAS decompression code on z/OS instead of
the ASM code in the INFILE exit in member EXITCICS caused
CPU time to increase from .5 to 6 HOURS with 45 GB of SMF
records, so the "MXGNOTE" that the SAS code was used is
now elevated to a repeated "ERROR:" message under z/OS.
Under ASCII, a single note that compressed data was found
is printed. Change 27.260 documented a smaller increase!
Thanks to Joachim Sarkoschits, DATAEV eG, GERMANY.
Change 28.086 Support for Windows Performance Monitor PERFMON csv/tab
ADOCWPMO log file creates 123 new datasets, each named WPMOddd, to
EXWPMddd correspond with the DDDDDD=WPMddd token for each dataset.
IMACWPMO The DataSet Label is the Object Name, and member IMACWPMO
MAKEWPMO has the full list of DDDDDD, DATASET, and Object Name and
TYPEWPMO will be updated as new Objects are supported.
TYPSWPMO The PERFMON data files can be concatenated, and can have
VMACWPMO different sets of fields. The ADOCWPMO member documents
VMXGINIT how Glenn has set up his PERFMON data management.
May 22, 2010
With all possible objects were enabled, with all threads
and instances captured, on a Small Business Server, the
PERFMON descriptor record was 861,481 bytes long, way too
long to be read on z/OS with its 32760 maximum LRECL, so
MXG PERFMON support may require execution on ASCII, where
SAS V9.1.3 allows LRECL=1024000, and SAS V9.2, LRECL=4GB.
This design is also another significant MXG enhancement:
The new MXG code that you execute to process PERFMON data
was generated by MXG's MAKEWPMO program, which reads the
header record field descriptions, parses/translates them
to create open-systems-friendly, 32-byte variable names,
with underscore-connectors, builds variable labels from
those variable names, changing underscores to asterisks,
uses the Object Name for the Dataset Label, and writes
out the dozen text files that are then manually cut/paste
into VMACWPMO or the other MXG code members.
While still a two-step process, this automation makes it
easy for MXG to support new objects. MAKExxxx programs
have been used for some time to create chunks of MXG code
for product XXXX, but only for the static statements that
defined or referenced the XXXX product suffix, the DDDDDD
dataset suffix token, or that contained the DATASET name.
Programmatically creating variable names, labels, and the
INPUT code is a BIG step forward in minimizing MY effort
to support future "open systems" data or sources that
have similar data structures. Since these data don't
have a construct of a short field name, but only the long
description, using the descriptions as variable name does
make sense for this audience, and REALLY saves me TIME!!
Each "item" in the header description has this format:
"\\SERVER\OBJECT(INSTANCE)\METRIC"
and there can be tens of thousands of items. SERVER is
variable SERVER, the server name, OBJECT maps to the MXG
dataset, and the Object Name (PROCESS) is the Label of
the MXG Dataset Name (WPMOPRO), INSTANCE is the instance
(e.g., process EXPLORER.EXE), and each separate METRIC
item (e.g. HANDLE_COUNT) is a variable in the WPMOOBJ
dataset.
While ASCII's max LRECL is 4GB, records cannot be stored
in a character variable, with SAS's 32K limit, so the
record is brute-force read, byte-by-byte, and parsed for
the delimiters to create each "item".
Microsoft claims to create comma-delimited data, but a
single comma cannot be safely used to parse because
the "items" can contain embedded commas!
And, while each item is bounded by double quotes, the
double quote also cannot be used as a delimiter, as
"items" can also contain embedded double quotes!
So the MXG default "comma-separated-value" delimiter is
the three-character-string "," set in VMXGINIT with
%LET DLMWPMO='","';
If you have "tab-delimited" PERFMON files, then you
need to use %LET DLMWPMO='09'x; before your %INCLUDE.
Once an "item" is parsed, normal SAS character functions
are used to create the SERVER, OBJECT, INSTANCE and the
METRIC values, and output the WINPERFMON dataset that is
subsequently read to output all of the WPMOddd datasets.
If there are obs in OBJUNKNOWN or METUNKNOWN datasets,
please send the PERFMON file to support@mxg.com,
so MXG can be updated to support the new data.
Some characters in the descriptions have to be converted
because blanks, back-slashes, dashes, parens, periods,
pound-signs, etc., can't be used in SAS variable names;
underscores are used in the variable name to connect the
pieces.
Thanks to Glenn Bowman, Wakefern, USA.
Change 28.085 Obscure. VMXGSUM is protected if you had parenthesis in
VMXGSUM the OUTDATA= argument (for a LABEL= or SORTEDBY=). If a
Apr 20, 2010 last data step wasn't needed, parens caused an even more
obscure ABEND. While now protected, using the DSNLABEL=
or SORTEDBY= argument in the VMXGSUM invocation is safer.
Thanks to Chuck Hopf, Independent Consultant, USA.
Change 28.084 BMC IMF product's INPUTCLS and LASTCLAS variables are now
VMACCIMS restored to one-byte length with $HEX2. format, and new
Apr 20, 2010 variables INPUTCL2 and LASTCLA2 are two-bytes with $HEX4.
While IMS 9.1 and later define Input Class as two bytes,
it appears that no one is using that length, and MXG's
changes (27.230,26.058) that expanded the length of those
original INPUTCLS/LASTCLAS variables caused existing
reports to be incorrect.
Thanks to Jim Dammeyer, State Farm Mutual Insurance, USA.
Thanks to Mike Stogsdill, State Farm Mutual Insurance, USA.
Change 28.083 MXG 28.02-03. READB2/ANALDB2R didn't honor %LET MACDB2H
ANALDB2R nor %LET MACKEEP tailoring: Change 28.055 added %CLEARDB2
READDB2 (to reset old-style macros for multiple executions, used
Apr 17, 2010 previously only in the MXG QA), but CLEARDB2 also clears
Apr 21, 2010 both MACDB2H and MACKEEP. The %CLEARDB2; statement was
Apr 22, 2010 removed from both members by this change.
Apr 24, 2010 Circumvention with 28.02: Create a member named CLEARDB2
Apr 25, 2010 in your "USERID.SOURCLIB" with a blank line.
Apr 26, 2010 No one has asked to execute READDB2/ANALDB2R twice,
Jun 17, 2010 but it can still be done, by invoking %CLEARDB2;
externally, between the multiple executions:
%READDB2 ( WHATEVER );
%LET MYKEEP=%BQUOTE(&MACKEEP);
%LET MYDB2H=%BQUOTE(&MACDB2H);
%CLEARDB2;
%LET MACKEEP=%BQUOTE(&MYKEEP);
%LET MACDB2H=%BQUOTE(&MACDB2H);
%READDB2 (WHATEVER DIFF);
-MXG 28.01-28.02 only. Short Trace report failed with
Dostları ilə paylaş: |