furuseth Posted November 17, 2010 Share Posted November 17, 2010 Hallo, i want to make a GUI with an inputfield to fill with different values separated by komma. I found this CodeSnippet here in this forum but it doesn't work and it does not eliminate the duplicates: Local $arString=StringSplit("19,28,3,17,7",",") ;sorting the array For $i=2 To UBound($arString)-1 If Int($arString[$i-1])>Int($arString[$i]) Then _ArraySwap($arString[$i-1],$arString[$i]) Next Thx furuseth Link to comment Share on other sites More sharing options...
water Posted November 17, 2010 Share Posted November 17, 2010 (edited) Use _ArrayUnique to get an array that only contains unique elements. I'm not sure but I think the array has to be sorted in advance. As an example: #include <array.au3> Global $aSource[7] = [1,2,4,3,5,3,6] Global $aTarget[7] _ArraySort($aSource) $aTarget = _ArrayUnique($aSource) _ArrayDisplay($aTarget) Edited November 17, 2010 by water My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted November 17, 2010 Moderators Share Posted November 17, 2010 furuseth, Welcome to the AutoIt forum. One way to do it: expandcollapse popup#include <GUIConstantsEx.au3> #include <Array.au3> $hGUI = GUICreate("Test", 500, 500) $hInput = GUICtrlCreateInput("19,28,3,17,7", 10, 10, 400, 20) $hButton = GUICtrlCreateButton("Go!", 10, 50, 80, 30) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $hButton _Sort_Input() EndSwitch WEnd Func _Sort_Input() ; Read the input $sInputString = GUICtrlRead($hInput) ; Convert to an array and get unique elements $aOutArray = _ArrayUnique(StringSplit($sInputString, ","), 1, 1) ; Convert to numbers For $i = 1 To $aOutArray[0] $aOutArray[$i] = Number($aOutArray[$i]) Next ; Sort the elements _ArraySort($aOutArray, 0, 1) ; Display array _ArrayDisplay($aOutArray) EndFunc Note that you have to convert the elements to numbers before sorting - otherwise you get an ASCII not a numeric sort. Please ask if you have any questions. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
furuseth Posted November 17, 2010 Author Share Posted November 17, 2010 Wow, thank you. They are working like a charme. The one of Melba23was exactly the snippet I need. One more question, how to get a sorted output string? For Example if the input was 19,28,3,17,7 the result should be 1 variable containing the sorted numbers: 3,7,17,19,28 Sorry for my stupid questions, I'm really newbie. Thx furuseth @Melba23 I'm honored; read so many of your threads in this forum. Link to comment Share on other sites More sharing options...
water Posted November 17, 2010 Share Posted November 17, 2010 (edited) One more question, how to get a sorted output string?$sString = _ArrayToString($aOutArray, ",", 1) Edited November 17, 2010 by water My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted November 17, 2010 Moderators Share Posted November 17, 2010 furuseth, Change the end of the function to read: ; Sort the elements _ArraySort($aOutArray, 0, 1) ; Return it to string format $sOutputString = _ArrayToString($aOutArray, ",", 1) ; Display it MsgBox(0, "Result", $sOutputString) M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
UEZ Posted November 17, 2010 Share Posted November 17, 2010 (edited) It seems to be that _ArrayUnique() has a bug and it is very slow: expandcollapse popup#include <Array.au3> ;~ Dim $aNames[10][2] = [["Anton", ""], ["Berta", 15]] Dim $aNames[10] = ["Antonia", "Anton", "Cäsar", "Dora", "Emil", "Friedrich", "Gustav", "Heinrich", "Ida", "Julius"] Dim $aUnique[10000] For $I = 0 To Ubound($aUnique) - 1 $r = Random(0, 9, 1) $aUnique[$I] = $aNames[$r] Next ;Standard _ArrayUnique() $ts = TimerInit() $test = _ArrayUnique($aUnique) $te = TimerDiff($ts) ConsoleWrite(Round($te, 2) & " ms." & @CRLF) _ArrayDisplay($test) $ts = TimerInit() $test = ArrayUnique($aUnique) $te = TimerDiff($ts) ConsoleWrite(Round($te, 2) & " ms." & @CRLF) _ArrayDisplay($test) Dim $aNames[10][2] = [["Antonia", ""], ["Anton", ""], ["Cäsar", 300], ["Dora", 24], ["Emil", 33], ["Friedrich", 57], ["Gustav", 53], ["Heinrich", 34], ["Ida", 13], ["Julius", 77]] Dim $aUnique[100000][2] For $I = 0 To Ubound($aUnique) - 1 $r = Random(0, 9, 1) $aUnique[$I][0] = $aNames[$r][0] $aUnique[$I][1] = $aNames[$r][1] Next $ts = TimerInit() $test = ArrayUnique($aUnique) $te = TimerDiff($ts) ConsoleWrite(Round($te, 2) & " ms." & @CRLF) _ArrayDisplay($test) Exit ; #FUNCTION# ============================================================================ ; Name.............: ArrayUnique ; Description ...: Returns the Unique Elements of a 1-dimensional or 2-dimensional array. ; Syntax...........: _ArrayUnique($aArray[, $iBase = 0, oBase = 0]) ; Parameters ...: $aArray - The Array to use ; $iBase - [optional] Is the input Array 0-base or 1-base index. 0-base by default ; $oBase - [optional] Is the output Array 0-base or 1-base index. 0-base by default ; Return values: Success - Returns a 1-dimensional or 2-dimensional array containing only the unique elements ; Failure - Returns 0 and Sets @Error: ; 0 - No error. ; 1 - Returns 0 if parameter is not an array. ; 2 - Array has more than 2 dimensions ; 3 - Array is already unique ; 4 - when source array is selected as one base but UBound(array) - 1 <> array[0] / array[0][0] ; 5 - Scripting.Dictionary cannot be created for 1D array unique code ; Author .........: UEZ 2010 for 2D-array, Yashied for 1D-array (modified by UEZ) ; Version ........: 0.96 Build 2010-11-20 Beta ; ======================================================================================= Func ArrayUnique($aArray, $iBase = 0, $oBase = 0) If Not IsArray($aArray) Then Return SetError(1, 0, 0) ;not an array If UBound($aArray, 0) > 2 Then Return SetError(2, 0, 0) ;array is greater than a 2D array If UBound($aArray) = $iBase + 1 Then Return SetError(3, 0, $aArray) ;array is already unique because of only 1 element Local $dim = UBound($aArray, 2), $i If $dim Then ;2D array If $iBase And UBound($aArray) - 1 <> $aArray[0][0] Then Return SetError(4, 0, 0) Local $oD = ObjCreate('Scripting.Dictionary') If @error Then Return SetError(5, 0, 0) Local $i, $j, $k = $oBase, $l, $s, $aTmp, $flag, $sSep = Chr(01) Local $aUnique[UBound($aArray)][$dim] If Not $oBase Then $flag = 2 For $i = $iBase To UBound($aArray) - 1 For $j = 0 To $dim - 1 $s &= $aArray[$i][$j] & $sSep Next If Not $oD.Exists($s) And StringLen($s) > 3 Then $oD.Add($s, $i) $aTmp = StringSplit(StringTrimRight($s, 1), $sSep, 2) For $l = 0 To $dim - 1 $aUnique[$k][$l] = $aTmp[$l] Next $k += 1 EndIf $s = "" Next $oD.RemoveAll $oD = "" If $k > 0 Then If $oBase Then $aUnique[0][0] = $k - 1 ReDim $aUnique[$k][$dim] Else ReDim $aUnique[1][$dim] EndIf Else ;1D array If $iBase And UBound($aArray) - 1 <> $aArray[0] Then Return SetError(4, 0, 0) Local $sData = '', $sSep = ChrW(160), $flag For $i = $iBase To UBound($aArray) - 1 If Not IsDeclared($aArray[$i] & '$') Then Assign($aArray[$i] & '$', 0, 1) $sData &= $aArray[$i] & $sSep EndIf Next If Not $oBase Then $flag = 2 Local $aUnique = StringSplit(StringTrimRight($sData, 1), $sSep, $flag) EndIf Return SetError(0, 0, $aUnique)EndFunc ;==>ArrayUnique It might be that my version has a bug, too! Br, UEZ Edited November 21, 2010 by UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
UEZ Posted November 18, 2010 Share Posted November 18, 2010 (edited) This might be a way: expandcollapse popup#include <Array.au3> Dim $aNumbers[10] = [19, 22, 3, 9, 27, 22, 19, 99, 88, 3] $aUnique = ArrayUnique($aNumbers) _ArrayDisplay($aUnique) _ArraySort($aUnique) ;standard sort not natural! Look here for natural order sorting: http://www.autoitscript.com/forum/topic/83626-natural-order-string-comparison/page__p__598311 _ArrayDisplay($aUnique) Exit ; #FUNCTION# ============================================================================ ; Name.............: ArrayUnique ; Description ...: Returns the Unique Elements of a 1-dimensional or 2-dimensional array. ; Syntax...........: _ArrayUnique($aArray[, $iBase = 0, oBase = 0]) ; Parameters ...: $aArray - The Array to use ; $iBase - [optional] Is the input Array 0-base or 1-base index. 0-base by default ; $oBase - [optional] Is the output Array 0-base or 1-base index. 0-base by default ; Return values: Success - Returns a 1-dimensional or 2-dimensional array containing only the unique elements ; Failure - Returns 0 and Sets @Error: ; 0 - No error. ; 1 - Returns 0 if parameter is not an array. ; 2 - Array has more than 2 dimensions ; 3 - Array is already unique ; 4 - when source array is selected as one base but UBound(array) - 1 <> array[0] / array[0][0] ; 5 - Scripting.Dictionary cannot be created for 1D array unique code ; Author .........: UEZ 2010 for 2D-array, Yashied for 1D-array (modified by UEZ) ; Version ........: 0.96 Build 2010-11-20 Beta ; ======================================================================================= Func ArrayUnique($aArray, $iBase = 0, $oBase = 0) If Not IsArray($aArray) Then Return SetError(1, 0, 0) ;not an array If UBound($aArray, 0) > 2 Then Return SetError(2, 0, 0) ;array is greater than a 2D array If UBound($aArray) = $iBase + 1 Then Return SetError(3, 0, $aArray) ;array is already unique because of only 1 element Local $dim = UBound($aArray, 2), $i If $dim Then ;2D array If $iBase And UBound($aArray) - 1 <> $aArray[0][0] Then Return SetError(4, 0, 0) Local $oD = ObjCreate('Scripting.Dictionary') If @error Then Return SetError(5, 0, 0) Local $i, $j, $k = $oBase, $l, $s, $aTmp, $flag, $sSep = Chr(01) Local $aUnique[UBound($aArray)][$dim] If Not $oBase Then $flag = 2 For $i = $iBase To UBound($aArray) - 1 For $j = 0 To $dim - 1 $s &= $aArray[$i][$j] & $sSep Next If Not $oD.Exists($s) And StringLen($s) > 3 Then $oD.Add($s, $i) $aTmp = StringSplit(StringTrimRight($s, 1), $sSep, 2) For $l = 0 To $dim - 1 $aUnique[$k][$l] = $aTmp[$l] Next $k += 1 EndIf $s = "" Next $oD.RemoveAll $oD = "" If $k > 0 Then If $oBase Then $aUnique[0][0] = $k - 1 ReDim $aUnique[$k][$dim] Else ReDim $aUnique[1][$dim] EndIf Else ;1D array If $iBase And UBound($aArray) - 1 <> $aArray[0] Then Return SetError(4, 0, 0) Local $sData = '', $sSep = ChrW(160), $flag For $i = $iBase To UBound($aArray) - 1 If Not IsDeclared($aArray[$i] & '$') Then Assign($aArray[$i] & '$', 0, 1) $sData &= $aArray[$i] & $sSep EndIf Next If Not $oBase Then $flag = 2 Local $aUnique = StringSplit(StringTrimRight($sData, 1), $sSep, $flag) EndIf Return SetError(0, 0, $aUnique)EndFunc ;==>ArrayUnique Br, UEZ PS: where is the post between post#7 and post#8? Edited November 21, 2010 by UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
Spiff59 Posted November 19, 2010 Share Posted November 19, 2010 [it might be that my version has a bug, too! Br, UEZ A very minor contribution on your faster version... Shouldn't: If UBound($aArray) + $iBase = $iBase + 1 Then Return SetError(3, 0, $aArray) ;array is already unique be: If UBound($aArray) = $iBase + 1 Then Return SetError(3, 0, $aArray) ;array only has one element Link to comment Share on other sites More sharing options...
UEZ Posted November 19, 2010 Share Posted November 19, 2010 @Spiff59: indeed, it was a logical error. I corrected it! I'm happy that somebody tested it!Thank you very much Spiff59!Br,UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
Spiff59 Posted November 19, 2010 Share Posted November 19, 2010 (edited) I'm happy that somebody tested it! Br, UEZ You're welcome. Just an idea, but considering that the Scripting.Dictionary is so blazing fast, couldn't it be implemented for your 2D routine as well? Like: Func ArrayUnique2($aArray, $iBase = 0, $oBase = 0, $iCase = 0) If Not IsArray($aArray) Then Return SetError(1, 0, 0) ;not an array If UBound($aArray, 0) > 2 Then Return SetError(2, 0, 0) ;array is greater than a 2D array Local $oD = ObjCreate('Scripting.Dictionary') If @error Then Return SetError(4, 0, 0) Local $dim2 = UBound($aArray, 2), $i If $dim2 Then ;2D array Local $dim1 = UBound($aArray, 1), $aUnique[$dim1][$dim2], $j For $i = 0 to $dim1 - 1 If Not $oD.Exists($aArray[$i][0]) Then $oD.Add($aArray[$i][0], 0) $aUnique[$j][0] = $aArray[$i][0] $aUnique[$j][1] = $aArray[$i][1] $j += 1 EndIf Next ReDim $aUnique[$j][2] Else ;1D array For $i In $aArray If Not $oD.Exists($i) Then $oD.Add($i, 0) Next Local $aUnique = $oD.Keys() EndIf $oD.RemoveAll $oD = "" Return SetError(0, 0, $aUnique) EndFunc (I didn't add any of the handling for $IBase and $OBase, that were already missing from the 1D section). Edit: Pardon me, OP, for potential thread-jacking Edited November 19, 2010 by Spiff59 Link to comment Share on other sites More sharing options...
UEZ Posted November 19, 2010 Share Posted November 19, 2010 (edited) You're welcome. Just an idea, but considering that the Scripting.Dictionary is so blazing fast, couldn't it be implemented for your 2D routine as well? Like: Func ArrayUnique2($aArray, $iBase = 0, $oBase = 0, $iCase = 0) If Not IsArray($aArray) Then Return SetError(1, 0, 0) ;not an array If UBound($aArray, 0) > 2 Then Return SetError(2, 0, 0) ;array is greater than a 2D array Local $oD = ObjCreate('Scripting.Dictionary') If @error Then Return SetError(4, 0, 0) Local $dim2 = UBound($aArray, 2), $i If $dim2 Then ;2D array Local $dim1 = UBound($aArray, 1), $aUnique[$dim1][$dim2], $j For $i = 0 to $dim1 - 1 If Not $oD.Exists($aArray[$i][0]) Then $oD.Add($aArray[$i][0], 0) $aUnique[$j][0] = $aArray[$i][0] $aUnique[$j][1] = $aArray[$i][1] $j += 1 EndIf Next ReDim $aUnique[$j][2] Else ;1D array For $i In $aArray If Not $oD.Exists($i) Then $oD.Add($i, 0) Next Local $aUnique = $oD.Keys() EndIf $oD.RemoveAll $oD = "" Return SetError(0, 0, $aUnique) EndFunc (I didn't add any of the handling for $IBase and $OBase, that were already missing from the 1D section). Edit: Pardon me, OP, for potential thread-jacking Well, I updated my version with some more checks but after having it bug free I wanted to implement the 2D part also with Scripting.Dictionary because I started first with 2D arrays and found the Scripting.Dictionary method afterwards which is very fast. I mixed up both versions as a start but you did already my next step! I will do some more checks with your version and then let's see... Thanks again Spiff59! Br, UEZ Edited November 19, 2010 by UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
Yashied Posted November 20, 2010 Share Posted November 20, 2010 (edited) @UEZ You do not need to use COM, simply Assign()... #Include <Array.au3> Global $aUnique Dim $aNames[10] = ['Antonia', 'Anton', 'Casar', 'Dora', 'Emil', 'Friedrich', 'Gustav', 'Heinrich', 'Ida', 'Julius'] Dim $aArray[10000] For $i = 0 To UBound($aArray) - 1 $aArray[$i] = $aNames[Random(0, 9, 1)] Next _ArrayUniqueFast($aArray, $aUnique) _ArrayDisplay($aUnique) Func _ArrayUniqueFast(Const ByRef $aArray, ByRef $aUnique) Local $sData = '', $sSep = ChrW(160) For $i = 0 To UBound($aArray) - 1 If Not IsDeclared($aArray[$i] & '$') Then Assign($aArray[$i] & '$', 0, 1) $sData &= $aArray[$i] & $sSep EndIf Next $aUnique = StringSplit(StringTrimRight($sData, 1), $sSep) EndFunc ;==>_ArrayUniqueFast Edited November 20, 2010 by Yashied My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More... Link to comment Share on other sites More sharing options...
UEZ Posted November 20, 2010 Share Posted November 20, 2010 (edited) Great idea Yashied! I thought that COM is the fastest for 1D array but you have beaten it to the factor ~3!Well done! I updated my codes above.Br,UEZ Edited November 22, 2010 by UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now