MSFN Forum: Need batch to create and read thru' Arrays. - MSFN Forum

Jump to content


  • 2 Pages +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

Need batch to create and read thru' Arrays. Rate Topic: -----

#1 User is offline   Marcos 

  • Group: Members
  • Posts: 5
  • Joined: 02-February 12
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 01:43 AM

I have .txt file with contents similar to below eg.
============================
Bus 1 Enclosure 1 Disk 12
Capacity: 274845
State: Unbound

Bus 1 Enclosure 1 Disk 13
Capacity: 274845
State: Unbound

Bus 1 Enclosure 2 Disk 0
Capacity: 274845
State: Enabled

Bus 1 Enclosure 2 Disk 1
Capacity: 274845
State: Enabled

Bus 2 Enclosure 3 Disk 0
Capacity: 1878379
State: Unbound

Bus 2 Enclosure 3 Disk 1
Capacity: 1878379
State: Enabled

Bus 2 Enclosure 3 Disk 2
Capacity: 1878379
State: Unbound

Bus 2 Enclosure 3 Disk 9
State: Empty

Bus 2 Enclosure 3 Disk 10
State: Empty
==================================

I need a batch file to do the below:
1. Read thru' the file and search only unbound disks and associated capacity.
2. Unique value of capacity and count of each value.
For eg.
The above data has two unique values of capacity for Unbound Disks -- '274845' & '1878379'.
Disk with capacity > 274845 has count 4 & disk with capacity > 1878379 has count 3

Note: I may be able to run .vbs as well, but prefer to have a .bat or .cmd

Thanks

This post has been edited by Marcos: 02 February 2012 - 01:45 AM



#2 User is offline   Yzöwl 

  • Wise Owl
  • Group: Super Moderator
  • Posts: 4,364
  • Joined: 13-October 04
  • OS:Windows 7 x64

Posted 02 February 2012 - 02:31 AM

Could you please provide a better explanation, it appears to me as if your count includes disks which are not Unbound.

Also it would help if you could provide an example of the output file you're expecting.

#3 User is offline   Marcos 

  • Group: Members
  • Posts: 5
  • Joined: 02-February 12
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 03:44 AM

Sorry, I seem to have confused self and others with my earlier statements. :}

I need the below:
1. No. of Unbound disks and their capacity.
2. No. of disks with similar capacity.

Output will be something like this for the above example.

No. of Unbound disks: 4
Count of Unbound disks with size 274845 = 2
Count of Unbound disks with size 1878379 = 2

This post has been edited by Marcos: 02 February 2012 - 03:45 AM


#4 User is offline   jaclaz 

  • The Finder
  • Group: Developers
  • Posts: 11,436
  • Joined: 23-July 04
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 09:06 AM

This should do:
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
SET Unbound_274845=0
SET Unbound_1878379=0

FOR /F "tokens=1,2 delims=:" %%A IN ('TYPE "%~dpnx1"') DO (
IF "%%A"=="Capacity" SET /A Current=%%B
IF "%%B"==" Unbound" SET /A Unbound_!Current!+=1
)

SET /A Unbound=%Unbound_274845%+%Unbound_1878379%
ECHO No. of Unbound disks: %Unbound%
ECHO Count of Unbound disks with size 274845 = %Unbound_274845%
ECHO Count of Unbound disks with size 1878379 = %Unbound_1878379%


jaclaz

#5 User is offline   Yzöwl 

  • Wise Owl
  • Group: Super Moderator
  • Posts: 4,364
  • Joined: 13-October 04
  • OS:Windows 7 x64

Posted 02 February 2012 - 10:51 AM

View Postjaclaz, on 02 February 2012 - 09:06 AM, said:

This should do:<snip />

I'm not sure that the intention was to have pre-known the disk capacities.

#6 User is offline   5eraph 

  • Update Packrat
  • Group: Supreme Sponsor
  • Posts: 954
  • Joined: 04-July 05
  • OS:XP Pro x64
  • Country: Country Flag

Posted 02 February 2012 - 11:47 AM

I agree with Yzöwl.

Since batch scripts have no built in functions for creating or manipulating arrays we need to write them ourselves. The following tested script does what you ask, Marcos. In the following example the text file should be named "Disks.txt".

@ECHO OFF
SETLOCAL EnableDelayedExpansion

::Initialize array
SET "aCapacity="
SET "aUniqueCapacities="
SET /A nArrayDepth_Capacity=0
SET /A nArrayDepth_UniqueCapacities=0

::Create array of Unbound capacities
FOR /F "usebackq tokens=1-2" %%G IN ("Disks.txt") DO (
  IF /I NOT "%%G %%H"=="State: Unbound" (SET sCapacity=%%H) ELSE (
    SET "aCapacity=!aCapacity!!sCapacity! "
    SET /A nArrayDepth_Capacity+=1
) )
ECHO No. of Unbound disks: !nArrayDepth_Capacity!

::Find unique capacity values (searching an array destroys the array, make a copy)
SET "aArrayToSearch=!aCapacity!"
FOR /L %%G IN (1,1,!nArrayDepth_Capacity!) DO (
  FOR /F "tokens=1" %%H IN ("!aArrayToSearch!") DO (
    IF !nArrayDepth_UniqueCapacities! EQU 0 (SET bElementSearch_FuncResult=False) ELSE (
      CALL :Func_ElementSearch "%%H" "!aUniqueCapacities!" !nArrayDepth_UniqueCapacities!
    )
    IF /I "!bElementSearch_FuncResult!"=="False" (
      SET "aUniqueCapacities=!aUniqueCapacities!%%H "
      SET /A nArrayDepth_UniqueCapacities+=1
    )
    CALL :Func_FindStringLength "%%H"
    SET /A nFindStringLength_FuncResult+=1
    FOR /L %%I IN (1,1,!nFindStringLength_FuncResult!) DO (SET aArrayToSearch=!aArrayToSearch:~1!)
) )

::Count instances of unique capacity values
FOR /L %%G IN (1,1,!nArrayDepth_UniqueCapacities!) DO (
  FOR /F "tokens=1" %%H IN ("!aUniqueCapacities!") DO (
    CALL :Func_ElementSearch "%%H" "!aCapacity!" !nArrayDepth_Capacity!
    ECHO Count of Unbound disks with size %%H = !nElementSearch_FuncResult!
    CALL :Func_FindStringLength "%%H"
    SET /A nFindStringLength_FuncResult+=1
    FOR /L %%I IN (1,1,!nFindStringLength_FuncResult!) DO (SET aUniqueCapacities=!aUniqueCapacities:~1!)
) )
PAUSE
GOTO :eof

:Func_FindStringLength
:: %1=String of unknown length
SET sTestString_FindStringLength=%~1
SET /A nFindStringLength_FuncResult=0
:StringLengthUnknown_FindStringLength
IF NOT "!sTestString_FindStringLength!"=="" (
  SET sTestString_FindStringLength=!sTestString_FindStringLength:~1!
  SET /A nFindStringLength_FuncResult+=1
  GOTO :StringLengthUnknown_FindStringLength
)
GOTO :eof

:Func_ElementSearch
:: %1=Element to find, %2=String array, %3=Depth of array
SET "aStringArray_ElementSearch=%~2"
SET "bElementSearch_FuncResult=False"
SET /A nElementSearch_FuncResult=0
FOR /L %%Q IN (1,1,%3) DO (
  FOR /F "tokens=1" %%R IN ("!aStringArray_ElementSearch!") DO (
    IF "%%R"=="%~1" (
      SET bElementSearch_FuncResult=True
      SET /A nElementSearch_FuncResult+=1
    )
    CALL :Func_FindStringLength "%%R"
    SET /A nFindStringLength_FuncResult+=1
    FOR /L %%S IN (1,1,!nFindStringLength_FuncResult!) DO (SET aStringArray_ElementSearch=!aStringArray_ElementSearch:~1!)
) )
GOTO :eof


This post has been edited by 5eraph: 02 February 2012 - 11:58 AM


#7 User is offline   jaclaz 

  • The Finder
  • Group: Developers
  • Posts: 11,436
  • Joined: 23-July 04
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 12:37 PM

View PostYzöwl, on 02 February 2012 - 10:51 AM, said:

I'm not sure that the intention was to have pre-known the disk capacities.

Neither am I. :ph34r:

The posted example was the simplest possible covering OP requests as they were explicited (or at least as I understood them).

If you have n different disk sizes, the example can be easily made "self-learning".

New example:
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F "tokens=1,2 delims=:" %%A IN ('TYPE "%~dpnx1"') DO (
IF "%%A"=="Capacity" SET /A Current=%%B
IF "%%B"==" Unbound" SET /A Unbound_!Current!+=1
)

FOR /F "tokens=2 delims==" %%A IN ('SET Unbound_') DO SET /A Unbound_=!Unbound_!+%%A

ECHO No. of Unbound disks: %Unbound_%

FOR /F "Skip=1 tokens=1,2,3 delims=_=" %%A IN ('SET Unbound_') DO ECHO Count of Unbound disks with size %%B = !Unbound_%%B!


The batch does not check existance of any previous "Unbound_*" variable in the environment, but this can be added as a "safety/sanity" check.

SET Unbound_=
FOR /F "tokens=2 delims=_=" %%A IN ('SET Unbound_') DO SET  Unbound_%%A=


jaclaz

#8 User is offline   5eraph 

  • Update Packrat
  • Group: Supreme Sponsor
  • Posts: 954
  • Joined: 04-July 05
  • OS:XP Pro x64
  • Country: Country Flag

Posted 02 February 2012 - 12:54 PM

I hadn't thought of using variables that way, jaclaz, and didn't know it could be done (setting a variable name using another variable). I mainly repurposed code I've been working with recently.

#9 User is offline   jaclaz 

  • The Finder
  • Group: Developers
  • Posts: 11,436
  • Joined: 23-July 04
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 01:06 PM

View Post5eraph, on 02 February 2012 - 12:54 PM, said:

I hadn't thought of using variables that way, jaclaz, and didn't know it could be done (setting a variable name using another variable).

Yep :) that was supposed to be the clever part ;).

View Post5eraph, on 02 February 2012 - 12:54 PM, said:

I mainly repurposed code I've been working with recently.

Yes, and definitely your snippet is a much better solution for "generic" arrays, but within the limits of OP needs, I find that the fun in the game is to find the simplest possible answer:
http://en.wikipedia.org/wiki/Occam's_razor

jaclaz

#10 User is offline   Marcos 

  • Group: Members
  • Posts: 5
  • Joined: 02-February 12
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 01:08 PM

Thanks a lot Guys !!!

Never knew it's such an AWESOME Forum !!!

Let me try the codes and see if it does the trick ! Will get back if I have any problems !

I suppose I can't 'challenge-enough' U guys with any 'This-is-too-hard-to-batch' problems :w00t: !

:thumbup

This post has been edited by Marcos: 02 February 2012 - 01:09 PM


#11 User is offline   Marcos 

  • Group: Members
  • Posts: 5
  • Joined: 02-February 12
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 01:32 PM

This one's for Jaclaz...

What does this do ('TYPE "%~dpnx1"') in the batch example ? Read from a file ? Do I need to replace something ?

:blushing: Sorry if it's a stupid question !

#12 User is offline   Yzöwl 

  • Wise Owl
  • Group: Super Moderator
  • Posts: 4,364
  • Joined: 13-October 04
  • OS:Windows 7 x64

Posted 02 February 2012 - 02:38 PM

The command is typing the content of a given parameter, the parameter is intended to be your .txt file. drive:\path\name.extension

The following are two methods of running the batch file with the given parameter:
  • drag and drop the .txt file onto the batch file
  • enter the following into a command prompt X:\pathto\batchfile.cmd M:\pathto\textfile.txt


Alternatively replace:
FOR /F "tokens=1,2 delims=:" %%A IN ('TYPE "%~dpnx1"') DO (
with
FOR /F "usebackq tokens=1-2 delims=:" %%A IN ("M:\pathto\textfile.txt") DO (


#13 User is offline   jaclaz 

  • The Finder
  • Group: Developers
  • Posts: 11,436
  • Joined: 23-July 04
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 02:48 PM

View PostMarcos, on 02 February 2012 - 01:32 PM, said:

This one's for Jaclaz...

What does this do ('TYPE "%~dpnx1"') in the batch example ? Read from a file ? Do I need to replace something ?

:blushing: Sorry if it's a stupid question !


No, that is parameter %1 to the batch, normally the filename you wish to process.
Example:
You have saved the batch as countunbound.cmd and you have the list in a file that is called mylist.txt, this latter in C:\mylists\


You then invoke the batch like:
countunbound.cmd mylist.txt

provided that you open a command prompt in the same directory where BOTH files are (C:\mylists\).
Or:
C:\mybatches\countunbound.cmd mylist.txt

if the prompt is in the same directory where mylist.txt and it is not the same as the one countunbound.cmd is (C:\mybatches\)

Or:
countunbound.cmd C:\mylists\mylist.txt

if the prompt is in the directory where countunbound.cmd is and mylist.txt is in directory C:\mylists\.

"%~dpnx1"
will expand in all cases to "C:\mylists\mylist.txt"
see here also:
http://www.msfn.org/...ile/page__st__1

With this approach you should also be able to use drag 'n drop, just add a PAUSE at the end of the batch.

jaclaz

#14 User is offline   Yzöwl 

  • Wise Owl
  • Group: Super Moderator
  • Posts: 4,364
  • Joined: 13-October 04
  • OS:Windows 7 x64

Posted 02 February 2012 - 03:35 PM

I know that the question has been well and truly answered, but I had a few minutes to spare and decided to play around.

Here is the resulting script, it uses ideas from that which I've seen above.
@echo off & setlocal enableextensions enabledelayedexpansion
(set _t=m:\pathto\textfile.txt) & (set _s=unbound)
set "_u=!_s!_disks" & set "_z=!_u!_with_size" & set "!_u!=0"
for /f "delims=:" %%f in ('findstr/nil "!_s!" "%_t%"') do (
	set "_=%%f" & set/a "!_u!+=1" & set/a "_-=1"
	for /f "tokens=3 delims=: " %%c in (
		'findstr/n .* "%_t%"^|findstr "^^!_!:"') do (
		if not defined !_z!_%%c (set "!_z!_%%c=1") else (set/a "!_z!_%%c+=1"))
	set "_=")
for /f %%a in ('set %_u%') do set "_=%%a" & echo=!_:_= !
The end user needs only to set the two variables on line two, i.e. the text file (M:\PathTo\TextFile.txt), the drive state (unbound | enabled)

Please bear in mind that this script is not intended as a better solution than what has gone before, it was done purely for the purpose of interest and because I'm back on a Windows PC today.

#15 User is offline   jaclaz 

  • The Finder
  • Group: Developers
  • Posts: 11,436
  • Joined: 23-July 04
  • OS:none specified
  • Country: Country Flag

Posted 02 February 2012 - 06:01 PM

And, at the ONLY scope of showing what the idea behind Occam's Razor is, I tried the various batches timing them on the sample file posted, which I saved as "unbound.txt".

Results (in a x10 loop):
  • the second one posted by me (with "unbound.txt" hardcoded) takes around 30/100th in a x10 loop.
  • the one by 5eraph is not working :ph34r: ( it just shows the total number of unbound disks, than hangs) @5eraph, can you check it? :blink: (maybe is one of those pesky copy/paste from board) updated, see below, it runs in around 80/100
  • the one posted by Yzöwl takes around 1 seconds and 80/100 :w00t:
  • the following one (in which I took the liberty of inverting the order of the output in order to remove a FOR loop) takes around 16/100th


@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

FOR /F "tokens=1,2 delims=:" %%A IN (unbound.txt) DO (
IF "%%A"=="Capacity" SET /A Current=%%B
IF "%%B"==" Unbound" SET /A Unbound_!Current!+=1
)
FOR /F "tokens=1,2,3 delims=_=" %%A IN ('SET Unbound_') DO (
ECHO Count of Unbound disks with size %%B = !Unbound_%%B!
SET /A Unbound_=!Unbound_!+%%C
)

ECHO No. of Unbound disks: %Unbound_%


jaclaz

This post has been edited by jaclaz: 03 February 2012 - 04:13 AM


#16 User is offline   5eraph 

  • Update Packrat
  • Group: Supreme Sponsor
  • Posts: 954
  • Joined: 04-July 05
  • OS:XP Pro x64
  • Country: Country Flag

Posted 02 February 2012 - 10:17 PM

I've attached the CMD that works for me in XPx64. The only change made from the script I posted above was to replace the reference from Disks.txt to %~dpnx1, so it takes the input file as a parameter.

Attached File(s)



#17 User is offline   Marcos 

  • Group: Members
  • Posts: 5
  • Joined: 02-February 12
  • OS:none specified
  • Country: Country Flag

Posted 03 February 2012 - 01:38 AM

I tried to reply to this forum and then I saw 'you cannot reply to this Thread' :wacko: !! I looked around and realized -- I wasn't logged in :lol: !!

So now I'm logged in! ( Obviously !!)

I tried 5eraph's script and it worked like a charm (tested on a x64 machine with 64 bit OS).... so it seems it might not work properly on a 32 bit OS (good to know).

Anyways, enough of chatter ! I will put all ur scripts to test ! I will be running them on some servers to see how it goes...


Thanks again for the Posts !! U GUYZ R AWESOME :thumbup !!!

#18 User is offline   5eraph 

  • Update Packrat
  • Group: Supreme Sponsor
  • Posts: 954
  • Joined: 04-July 05
  • OS:XP Pro x64
  • Country: Country Flag

Posted 03 February 2012 - 02:06 AM

You're welcome, Marcos. And thanks for testing my script yourself. :)

View Post5eraph, on 02 February 2012 - 11:47 AM, said:

In the following example the text file should be named "Disks.txt".

View Postjaclaz, on 02 February 2012 - 06:01 PM, said:

I tried the various batches timing them on the sample file posted, which I saved as "unbound.txt".

This is why jaclaz's copy of my script failed. It depended upon the file being named Disks.txt.

Updated, copy/paste problem was to blame.

A 10x run of my script takes 1.1 seconds on my machine, when PAUSE is removed.

My speedtest script:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
CALL :Func_TimeStamp
SET /A nStartTime=!nTimeStamp_FuncResult!
FOR /L %%G IN (1,1,10) DO (CALL Unbound.cmd Unbound.txt)
CALL :Func_TimeStamp
CALL :Func_ElapsedTime !nStartTime! !nTimeStamp_FuncResult!
PAUSE
GOTO :eof

:Func_TimeStamp
:: Set TimeStamp as the number of hundredths of seconds so far today
FOR /F "tokens=1-3 delims=:" %%Q IN ("!TIME!") DO (
  SET "H_TimeStamp=%%Q"
  SET "M_TimeStamp=%%R"
  IF "!H_TimeStamp:~0,1!"=="0" (SET "H_TimeStamp=!H_TimeStamp:~1!")
  IF "!M_TimeStamp:~0,1!"=="0" (SET "M_TimeStamp=!M_TimeStamp:~1!")
  FOR /F "tokens=1-2 delims=." %%T IN ("%%S") DO (
    SET "S_TimeStamp=%%T"
    SET "SS_TimeStamp=%%U"
    IF "!S_TimeStamp:~0,1!"=="0" (SET "S_TimeStamp=!S_TimeStamp:~1!")
    IF "!SS_TimeStamp:~0,1!"=="0" (SET "SS_TimeStamp=!SS_TimeStamp:~1!")
    SET /A "nTimeStamp_FuncResult=!H_TimeStamp! * 360000 + !M_TimeStamp! * 6000 + !S_TimeStamp! * 100 + !SS_TimeStamp!"
) )
GOTO :eof

:Func_ElapsedTime
:: Work out the elapsed time to the hundredth of a second.  Do the correct calculation to
:: account for roll-over (assumes the whole elapsed time is always less than 24 hours).
IF %2 GEQ %1 (SET /A "Local_ElapsedTime=%2 - %1") ELSE (SET /A "Local_ElapsedTime=%2 + 8640000 - %1")
SET "LocalMessage_ElapsedTime=Total time elapsed: "

:: Split elapsed time into hours, minutes and seconds
SET /A "Hours_ElapsedTime=!Local_ElapsedTime! / 360000"
SET /A "Minutes_ElapsedTime=(!Local_ElapsedTime! - !Hours_ElapsedTime! * 360000) / 6000"
SET /A "Seconds_ElapsedTime=(!Local_ElapsedTime! - !Hours_ElapsedTime! * 360000 - !Minutes_ElapsedTime! * 6000) / 100"
SET "Hundredths_ElapsedTime=!Local_ElapsedTime:~-2!"
IF "!Hundredths_ElapsedTime!"=="!Hundredths_ElapsedTime:~0,1!0" (SET "Hundredths_ElapsedTime=!Hundredths_ElapsedTime:~0,1!")

:: If a field is zero then do not display that field in the formatted result
IF "!Hours_ElapsedTime!"=="0" (SET "Hours_ElapsedTime=") ELSE (SET "Hours_ElapsedTime= !Hours_ElapsedTime!h")
IF "!Minutes_ElapsedTime!"=="0" (SET "Minutes_ElapsedTime=") ELSE (SET "Minutes_ElapsedTime= !Minutes_ElapsedTime!m")
IF NOT "!Hundredths_ElapsedTime!"=="0" (SET "Seconds_ElapsedTime= !Seconds_ElapsedTime!.!Hundredths_ElapsedTime!s") ELSE (
  IF "!Seconds_ElapsedTime!"=="0" (SET "Seconds_ElapsedTime=") ELSE (SET "Seconds_ElapsedTime= !Seconds_ElapsedTime!s"))

:: If no time elapsed then set time as zero seconds.
IF "!Hours_ElapsedTime!!Minutes_ElapsedTime!!Seconds_ElapsedTime!"=="" (SET "Seconds_ElapsedTime= 0s")

ECHO !LocalMessage_ElapsedTime!!Hours_ElapsedTime!!Minutes_ElapsedTime!!Seconds_ElapsedTime!
GOTO :eof


This post has been edited by 5eraph: 03 February 2012 - 04:24 AM


#19 User is offline   jaclaz 

  • The Finder
  • Group: Developers
  • Posts: 11,436
  • Joined: 23-July 04
  • OS:none specified
  • Country: Country Flag

Posted 03 February 2012 - 04:12 AM

View Post5eraph, on 03 February 2012 - 02:06 AM, said:

This is why jaclaz's copy of my script failed. It depended upon the file being named Disks.txt.

A 10x run of my script takes 1.1 seconds on my machine, when PAUSE is removed.

Well, I did change the name in the batch from disks.txt to unbound.txt, obviously.

Now that I can do a binary compare of the copy/paste with your original attachment, it is clear that the issue is "trailing spaces", replacing 200D0A with 0D0A solves the issue.

Opera browser, copy -> Paste in notepad, Win XP 32 bit.

On my machine it runs in a x10 loop in around 80/100th

Cross posting on:
http://www.msfn.org/...ith-code-boxes/

jaclaz

This post has been edited by jaclaz: 03 February 2012 - 04:16 AM


#20 User is offline   5eraph 

  • Update Packrat
  • Group: Supreme Sponsor
  • Posts: 954
  • Joined: 04-July 05
  • OS:XP Pro x64
  • Country: Country Flag

Posted 03 February 2012 - 04:34 AM

My speedtest script introduces some error because it takes time to create the timestamp. It was written to measure time for operations taking hours, not fractions of a second.

View Postjaclaz, on 03 February 2012 - 04:12 AM, said:


That topic seems to have been moved to a place I cannot access, I can't read it.

The copy/paste works fine in Firefox, which is the reason I discounted that possibility. Thanks for checking. :)

Share this topic:


  • 2 Pages +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

2 User(s) are reading this topic
0 members, 2 guests, 0 anonymous users



All trademarks mentioned on this page are the property of their respective owners
Copyright © 2001 - 2013 msfn.org
Privacy Policy