Jump to content

Devious Devices Framework Development/Beta


Kimy

Recommended Posts

Posted
26 minutes ago, Kimy said:

 

Just to confirm, this archive includes ALL your previous patches, or do I need to add anything else? And also just to confirm, the archive is a drop-in replacement for the existing CBBE, UUNP and Core folders, yes? Just to make sure not to wreck anything when merging it! :)

 

It doesn't include the working Wooden Yoke from this post, I forgot to add it. It also doesn't include:

 

However these are straight replacements for the MEGA archive, the collar just needs to go in the "00 Core" folder. So you can drop those files in after you've set-up up the MEGA archive files.

 

As for the MEGA archive being a drop-in replacement, it's not. It is not mergeable with the current BodySlide folders. Do Not use any of the current CBBE or UUNP BodySlide folders (same for the BodySlide folders in Core). Most, if not everything, will not be overridden if you just drop the MEGA archive on top of the existing files. You'll just be left with a lot of extra files and bloat.

 

The MEGA archive has all new BodySlide folders that have been extensively cleaned-up. It's rather daunting, I know. That's why I suggested anyone wanting to test the new files do a clean install of the framework but not select either the CBBE or UUNP options and just install the MEGA archive.

 

 

For "00 Core" the only ShapeData, SliderGroup and SliderSet folders you need are:

  • CalienteTools\BodySlide\ShapeData\DeviousDevices - Heretical\
  • CalienteTools\BodySlide\SliderSets\DeviousDevices\DD - Heretical.osp

For "01 CBBE" you should only have:

  • CalienteTools\BodySlide\ShapeData\DeviousDevices - CBBE\
  • CalienteTools\BodySlide\ShapeData\DeviousDevices - CBBE\1stperson\
  • CalienteTools\BodySlide\ShapeData\DeviousDevices - CBBE\FTRope\
  • CalienteTools\BodySlide\SliderGroups\DD Framework CBBE.xml
  • CalienteTools\BodySlide\SliderSets\DD - CBBE.osp
  • CalienteTools\BodySlide\SliderSets\DD - FTRope - CBBE.osp

For "01 UUNP" you should only have:

  • CalienteTools\BodySlide\ShapeData\DeviousDevices - UUNP\
  • CalienteTools\BodySlide\ShapeData\DeviousDevices - UUNP\1stperson\
  • CalienteTools\BodySlide\ShapeData\DeviousDevices - UUNP\FTRope\
  • CalienteTools\BodySlide\SliderGroups\DD Framework UUNP.xml
  • CalienteTools\BodySlide\SliderSets\DeviousDevices\DD - UUNP.osp
  • CalienteTools\BodySlide\SliderSets\DeviousDevices\DD - FTRope - UUNP.osp

 

It's okay for the SliderSet .osp files to not be in the "DeviousDevices" folder. Seems every time a project is saved Outfit Studio will place a new copy of the .osp in the SliderSet folder. So you don't really need the "DeviousDevices" folder inside the SliderSets folder, it'll just get messed up later if new devices are added or any device is altered.

 

Just make sure the .osp files are in their appropriate SliderSets folders, of course.

 

Posted
3 hours ago, Kimy said:

SexLab.AnimSlots.GetCacheSlot(i) does not seem to be a valid function call. Just out of curiosity - was this code written based on new SE-exclusive SexLab version? If yes, we can't use that function, as the code needs to work with the most recent SexLab version on LE as well, and as far as I know, Ashal has no intent to make another SexLab release for LE. I can't verify this theory right now, though. I don't have a SE installation.

 

You are right. The GetCacheSlot function is from the SE version and even if someday the LE version be made, the CACHE related functions are not for public use. The only CACHE functions made for public access are the ones to force the cache cleaning.

 

 

By other side the SexLab on development comes with few new and old but updated functions that can be used to enhance the DDi Logic function. Of course the new ones are not part of the LE version yet, but not everything is lost and a new SexLab Framework for LE is possible.

Posted (edited)
14 hours ago, Kimy said:

 

Super late response, I know. but I just tried to integrate your code snippet, and it wouldn't compile.

 

SexLab.AnimSlots.GetCacheSlot(i) does not seem to be a valid function call. Just out of curiosity - was this code written based on new SE-exclusive SexLab version? If yes, we can't use that function, as the code needs to work with the most recent SexLab version on LE as well, and as far as I know, Ashal has no intent to make another SexLab release for LE. I can't verify this theory right now, though. I don't have a SE installation.

 

I used the latest official SexLab release for SE: SexLab Framework SE Beta 8. I checked the latest LE version (1.62), and you are correct: the animation cache code was apparently added to sslAnimationSlots between the two versions. So my implementation won't work for the LE version.

 

However, I looked at this some more and there is another way, a much simpler way actually. Since SexLab does store the array of animations requested by the original function call as a property on the thread controller, we can just use the DD suppress tags to further filter that list, even using built-in SexLab functions to do so. However, this method is less powerful, in that it is more likely to fail to return any animations, since it can't add consensual animations to scenes that initially requested exclusively aggressive animations, and vice versa. In that case, it will just default back to the original DD implementation of a blind search for animations fitting the bondage conditions. Here's that implementation:

 

Spoiler
; filter version of the animation selector
sslBaseAnimation[] function SelectValidAnimations(sslThreadController Controller, int count, sslBaseAnimation previousAnim, bool usingArmbinder, bool usingYoke,  bool HasBoundActors,  bool forceaggressive, bool permitOral, bool permitVaginal, bool permitAnal, bool permitBoobs)
	bool aggr = false				
	string includetag = ""
	sslBaseAnimation[] Sanims
	If previousAnim != none && previousAnim.HasTag("foreplay") 		
		; ok, this is causing trouble, as we don't really have a lot of bound foreplay animations. We...just don't pass on the tag for now, which will result in regular anims.
		; includetag = "foreplay"
		; libs.Log("Using only foreplay animations.")					
	Elseif forceaggressive || (previousAnim != none && previousAnim.HasTag("Aggressive") && libs.config.PreserveAggro)
		libs.Log("Using only aggressive animations.")					
		aggr = true		
	Endif  
	Bool IsCreatureAnim = previousAnim.HasTag("Creature")
	If IsCreatureAnim && HasBoundActors
		; it's a creature anim and some participants are bound, we can abort here, as there are no bound animations for creatures.
		return None
	Endif
	; Bound Animations need to be processed separately, since they are not registered in SexLab.
	if count > 1 && HasBoundActors
		libs.Log("Actor(s) are bound. Trying to set up bound animation.")
		Sanims = New sslBaseAnimation[1]
		; we have bound anims only for two actors, so we pick an animation only if we have two actors, otherwise we let the filter split the scene later on.
		If count == 2
			Sanims[0] = GetBoundAnim(Controller.Positions[0], Controller.Positions[1], permitOral, permitVaginal, permitAnal, permitBoobs)						
		Endif
		If Sanims[0] == None
			libs.log("Error: SelectValidAnimations could find no valid bound animations.")
			return None
		Else
			return Sanims
		Endif
	Endif
	string tagString = getTagString(aggr, includetag)
	string suppressString = getSuppressString(aggr, usingArmbinder, usingYoke, permitOral, permitVaginal, permitAnal, permitBoobs)	
	; ok, we need to process private animations and masturbation as a special case as the tag system would otherwise be unable to call DDI or ZAP armbinder and yoke animations and also not exclude opposite gender masturbation/
	if count == 1 		
		libs.Log("Selecting masturbation animation.")
		If usingArmbinder ; she is wearing an armbinder
			Sanims = New sslBaseAnimation[1]
			Sanims[0] = SexLab.GetAnimationObject("DDArmbinderSolo")
			return Sanims
		Endif
		If usingYoke ; she is wearing a yoke
			Sanims = New sslBaseAnimation[1]
			Sanims[0] = SexLab.GetAnimationObject("DDYokeSolo")
			return Sanims
		Endif
		If !permitVaginal ;she is belted
			Sanims = New sslBaseAnimation[1]
			Sanims[0] = SexLab.GetAnimationObject("DDBeltedSolo")
			return Sanims
		Endif
		; if she is not wearing chastity, we need to filter the wrong gender
		tagString = "Solo," + tagString
		If Controller.Positions[0].GetLeveledActorBase().GetSex() == 1		
			suppressString = "M," + suppressString
		Elseif Controller.Positions[0].GetLeveledActorBase().GetSex() == 0
			suppressString = "F," + suppressString
		EndIf
	EndIf		
	If IsCreatureAnim
		; determine what creature it was and append its tag to the selection if it was a humanoid one, otherwise return an empty array.
		string crString = GetCreatureType(previousAnim)
		if crString != ""
			tagString += "," + crString
		Else
			libs.log("Creature animation with non-humanoid creatures in use. Cannot replace. Filtering aborted.")
			return None
		Endif
	Endif
	
	;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;;;;; begin modified code
	;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
	; first, try just filtering the problematic animations out of the original SexLab filtered list
	; NOTE: the forceaggressive bool parameter does not appear to be used anywhere in DD for this function. handling for this can be added if necessary.
	Sanims = SexLab.RemoveTagged(Controller.Animations, suppressString)
	
	If Sanims.Length > 0
		libs.log("Suppressed SexLab animations with tags: " + suppressString)
	Else
		; just try to find any SexLab animation that fits our conditions
		Sanims = SexLab.GetAnimationsByTags(count, tagString, suppressString, true)
		libs.log("Selecting SexLab animations with number of actors: " + count)
		libs.log("Selecting SexLab animations with tag string: " + tagString)
		libs.log("Selecting SexLab animations with suppress string: " + suppressString)
	EndIf
	
	;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;;;;; end modified code
	;;;;;;;;;;;;;;;;;;;;;;;;;;;
			
	return Sanims
endfunction

 

 

This should compile under LE; the functions exist in 1.62, at least.

 

For me, when I tested this, it works well for scenes that allow consensual animations, but not as well as my original implementation for scenes that request aggressive animations, due to the scarcity of those animations (at least, in my setup). For example, I apparently don't have an aggressive MMF animation without the "Anal" tag. But it should at least be better than before, most of the time.

 

10 hours ago, OsmelMC said:

 

You are right. The GetCacheSlot function is from the SE version and even if someday the LE version be made, the CACHE related functions are not for public use. The only CACHE functions made for public access are the ones to force the cache cleaning.

 

 

By other side the SexLab on development comes with few new and old but updated functions that can be used to enhance the DDi Logic function. Of course the new ones are not part of the LE version yet, but not everything is lost and a new SexLab Framework for LE is possible.

 

Certainly it is best to use functions as they were originally intended, but in situations like this, hopefully it's acceptable to push the envelope a bit. If indeed things were to update in the future, I think the best thing to do would be to store any tags used to request a set of animations for a scene as a property on the thread controller, so other mods can retrieve them easily.

Edited by anyway ayway
Posted
On 6/24/2021 at 4:44 AM, UnEvenSteven said:

SNIP

ChainBreastCollar, ChainHarnessArms and ChainHarnessCuffs have some minor issues with the textures set. producing a noticeable glow/shine, which is not there in any of the other chain pieces. changing the texture paths from textures\devious\Heretic\Helmets\LockMetalBlackRust01_d.dds  To  textures\devious\zaz\001metal\metalblackrust01.dds And textures\devious\Heretic\Helmets\LockMetalBlackRust01_n.dds  To  textures\devious\zaz\001metal\metalblackrust01_n.dds

fixes this.

 

Untitled.png

Posted

@Kimy

 

Like you already noticed. Many users what to contribute with the Device and the scripts.

 

A GitHub with the updated Scripts is really necessary at this point don't have to include the meshes or textures because will be to heavy. But the Scripts and ESP files will allow contribute taking in consideration the contribution of others.

Posted
2 hours ago, OsmelMC said:

@Kimy

 

Like you already noticed. Many users what to contribute with the Device and the scripts.

 

A GitHub with the updated Scripts is really necessary at this point don't have to include the meshes or textures because will be to heavy. But the Scripts and ESP files will allow contribute taking in consideration the contribution of others.

 

DD was hosted on a public Github for the longest time, but the times somebody outsides the DD team contributed there, I can count on one hand. It was just not worth the effort. And yes, I wouldn't be able to host the models there anyway (for that would FAR exceed Github's maximum project size for free projects), adding even more complexity. Merging code is not all that hard for me to do, even manually. The models are a different thing. It's ok if people prepare them in a way so I just have to throw them in the DD directory and add them to the ESM, but sometimes I get models with different naming schematics or file path conventions, or updates for existing models that don't overwrite the original, or people let me guess which armor slot their models are using etc. These I find a pain to work with, for I have no clue about Outfit Studio and barely know NIF Studio well enough to edit faulty texture paths or find out which slot the model needs. If a public repository could help me with THAT, I'd consider it, but it can't.

Posted
On 7/16/2021 at 3:38 PM, iprollyneedhelp said:

ChainBreastCollar, ChainHarnessArms and ChainHarnessCuffs have some minor issues with the textures set. producing a noticeable glow/shine, which is not there in any of the other chain pieces. changing the texture paths from textures\devious\Heretic\Helmets\LockMetalBlackRust01_d.dds  To  textures\devious\zaz\001metal\metalblackrust01.dds And textures\devious\Heretic\Helmets\LockMetalBlackRust01_n.dds  To  textures\devious\zaz\001metal\metalblackrust01_n.dds

fixes this.

 

Untitled.png

That would be the changes proposed by @iprollyneedhelp, convenient in a zip file.

meshes.7z

Posted (edited)

 

IDEA : NEW leg bindings

 

I like DD's leg bindings like hobble Dress but not enough.

 

How about adding new leg bindings focus on Humiliation?

 

 

 

Here is explanation picture from Pixiv:https://www.pixiv.net/artworks/91097674 

 

Using rope or metal things, force wearer spread their legs. 

 

 

 

 

 

I'll thank if someone comment about my idea. 

 

Spoiler

91097674_p0_master1200.jpg

Edited by 912s4dd
update
Posted (edited)

I really hate the retextured vanilla execution hood used as the normal rubber hood, so I've taken one of the other hood models already in the mod files (old_leather_hood.nif) and I've tweaked it's texture paths to replace the execution hood. Please consider implementing this in the next version.

231.png.df3a0d9f0ae605d42f9c4c08ed4121f7.png

Old Rubber Hood Replacer.rar

Edited by Code Serpent
Posted
19 hours ago, Code Serpent said:

I really hate the retextured vanilla execution hood used as the normal rubber hood, so I've taken one of the other hood models already in the mod files (old_leather_hood.nif) and I've tweaked it's texture paths to replace the execution hood. Please consider implementing this in the next version.

231.png.df3a0d9f0ae605d42f9c4c08ed4121f7.png

Old Rubber Hood Replacer.rar 523.23 kB · 1 download

 

Looks great! Will be added! :)

Posted
On 7/22/2021 at 5:04 PM, Code Serpent said:

I really hate the retextured vanilla execution hood used as the normal rubber hood, so I've taken one of the other hood models already in the mod files (old_leather_hood.nif) and I've tweaked it's texture paths to replace the execution hood. Please consider implementing this in the next version.

231.png.df3a0d9f0ae605d42f9c4c08ed4121f7.png

Old Rubber Hood Replacer.rar 523.23 kB · 2 downloads

Just gotta say I love this, current rubber hood's little hat always bothered me

Posted

Sorry if there is a proper place to view this already or something, but I have been loosely following this thread and seeing many very cool things added already. So I am kinda wondering: is there a planned next release anytime soon?

Posted
On 7/24/2021 at 10:54 AM, thedarkone1234 said:

Sorry if there is a proper place to view this already or something, but I have been loosely following this thread and seeing many very cool things added already. So I am kinda wondering: is there a planned next release anytime soon?

 

Yes. I have been adding a few things already, but I need to rebase all of that on UnevenSteven's contribution now. :)

Posted
5 hours ago, Kimy said:

 

Yes. I have been adding a few things already, but I need to rebase all of that on UnevenSteven's contribution now. :)

 

Yeah sorry about that. The BodySlide folders were just a mess anymore and needed a clean-up, in my opinion. 

 

Hope all is going well on your end in regards to the new setup. Suppose we'll find out whenever the next test version of the framework rolls around.

 

I noticed something, though. I was checking the MEGA archive again and noticed I somehow forgot to include the texture for transparent catsuits. I don't seem to have a back-up anywhere either so I had to create a new one...

 

Transparent Texture.7z

Posted

Am I seeing this right?

 

There is no longer a debug option to force clear all devices including quest ones in DD5.x?

I can see the option to clear DD quest devices, but it doesn't do anything for other mods devices (as the new name indicates).

 

That was super helpful as a last resort option when things got messed up between multiple mods.

Posted
15 hours ago, DeepBlueFrog said:

Am I seeing this right?

 

There is no longer a debug option to force clear all devices including quest ones in DD5.x?

I can see the option to clear DD quest devices, but it doesn't do anything for other mods devices (as the new name indicates).

 

That was super helpful as a last resort option when things got messed up between multiple mods.

Not sure if this is intended or not, but can confirm the function does not work (anymore) with quest keyword tagged devices.

Posted
21 hours ago, naaitsab said:

Not sure if this is intended or not, but can confirm the function does not work (anymore) with quest keyword tagged devices.

 

Definitely not intended. I will check this!

Posted
On 7/31/2021 at 1:40 AM, UnEvenSteven said:

 

Yeah sorry about that. The BodySlide folders were just a mess anymore and needed a clean-up, in my opinion. 

 

Hope all is going well on your end in regards to the new setup. Suppose we'll find out whenever the next test version of the framework rolls around.

 

I noticed something, though. I was checking the MEGA archive again and noticed I somehow forgot to include the texture for transparent catsuits. I don't seem to have a back-up anywhere either so I had to create a new one...

 

Transparent Texture.7z 38.63 kB · 7 downloads

So can/should I kinda scour this thread for any uploads since January 19th and "patch" them into DD manually, or will they eventually be put together in a single download? (I know this question sounds stupid, but it justs seems like there are so many finished and working new features/textures/fixes since the last downloadable version XD)

Posted
4 hours ago, thedarkone1234 said:

So can/should I kinda scour this thread for any uploads since January 19th and "patch" them into DD manually, or will they eventually be put together in a single download? (I know this question sounds stupid, but it justs seems like there are so many finished and working new features/textures/fixes since the last downloadable version XD)

 

I'd lean more towards you shouldn't patch anything.

 

I simply contribute some things in hopes they're added to framework at some point. It's always possible something I contribute doesn't get added to the framework, nothing is remotely official until Kimy uploads a development/beta version with any of the additions I have added.

Posted

So I was dressing Lydia up and suddenly this happend:

 

 

431817770_ElderScrollsVSkyrimScreenshot2021_08_08-02_36_09_42.png.24182de666f7d6ffb862e67ddfec69f6.png 

The corset being above the dress I mean. I actually really really like how it looks, and wondered if there could be a way to control it and make it always happen (or have it as an option when choosing to wear it, or having it depend on which item was put first). I am mainly wondering this about the Player character that always seems to hide corset with any suit/dress she gets.

 

In this specific time I actually had the corset placed several hours before the dress. So it is not like the order of placement seems to control the layering.

Posted (edited)
6 hours ago, thedarkone1234 said:

So I was dressing Lydia up and suddenly this happend:

 

 

 

The corset being above the dress I mean. I actually really really like how it looks, and wondered if there could be a way to control it and make it always happen (or have it as an option when choosing to wear it, or having it depend on which item was put first). I am mainly wondering this about the Player character that always seems to hide corset with any suit/dress she gets.

 

In this specific time I actually had the corset placed several hours before the dress. So it is not like the order of placement seems to control the layering.

 

You can play with the 'Device Hider' in the Devious Devices MCM. It does just what it says. I don't mess much with it but if you deselect the slot it should not hide that slot. In this case the corset.

 

And yeah, it does look good on her :P 

Edited by naaitsab
Posted

Hi Kimy & Co.

 

Thank you for this fantastic mod.

 

I posted a question and some humble suggestions in the support thread, and was informed that maybe I should post it here.

 

Quote

Greetings Kimy & Co.,

 

First post here.

 

Many thanks for fantastic mod.

 

I just would like to ask, in the mod description, I found this line for bondage furniture

 

  Quote

- Alternate poses can be set to accommodate DD wrist restraints (e.g. for wearing armbinders while sitting on a wooden horse)

 

I was really eager to try it with an elbow armbinder, but after poking around a bit I realised it might not have been implemented --

 

  Quote

Package[] Property BoundPoseArmbinder Auto                ; Packages containing special poses for armbinders.

 

This package list is declared on line 35 of zadcFurnitureScript.psc, but doesn't seem to be used in the code. Further poking around in creation kit showed that there didn't seem to be a package accommodating wooden horse with armbinder either. So I'd like to kindly ask whether this feature has been implemented, or I'm probably missing something here?

 

A few kinky little suggestions if you don't mind. I found that there aren't many leg restraint varieties (maybe it's just me, as I'm completely leaning into male Khajiit paws and rope restraints). Basically my only two options in the department right now are some rope leg cuffs (which I've repurposed to give a speed debuff and disallow kick combat) and a rope hobble skirt. I would really love to see some leg restraints that completely immobilises the subject, e.g., in a sitting / kneeling / hogtie position. Also rope variants of the furniture pieces would be very neat too (as they heavily utilise chains and shackles at the moment). Some different armbinder positions could be very interesting too, e.g., reverse-prayer, stacked forearms, or crossed wrists. Sorry now I sound like a needy bastard, these are merely my humble suggestions. I don't even know if I can contribute to the project in any way. I have some coding experience so maybeeeee I can help with a bit of testing and debugging, but I can't promise anything really as I have no game development experience whatsoever. Once again thanks for a great mod (the best in my opinion).

 

Have a nice day!

 

Cheers.

 

Zarantha's response (in case it's relevant)

 

Quote

Eh, I think you're delving into stuff I just don't look at.

 

This maybe better off in the dev thread if you're looking to develop your own stuff or help out with testing when the next beta starts up again:

https://www.loverslab.com/topic/69936-devious-devices-framework-developmentbeta/page/162/

 

Pretty sure I've seen the armbinder (or some other behind the back wrist restraint) on a wooden horse used in DCL during the princess LAL quest, not sure if it it's used in the new in in Riverwood. Anyway, you might want to look at DCL's scripts too.

 

I've seen hogtie used for some DCL events too, but I don't think they were ropes. You could probably modify/duplicate that if you really need it to be rope.

I think more rope stuff has been requested, but I don't know if it will be done for the next versions of DD/DCL.

 

Adding more animations - kimy has said she can add them if someone makes them and gives permission for them to be included, but she can't make the animation stuff herself. It's one of the reasons why the animation filter is a bit limited in what animations are used.

 

My response (in case it's relevant)

 

Quote

Thank you very much for your reply.

 

I've downloaded DCL and looked through the content (in no way thoroughly), but unfortunately haven't found anything of note thus far. I think I'll politely ask the wooden horse question in the dev thread. I wish I could have solved the issue on my own, but I've tried everything I could to no avail -- I'm sort of a control freak who just wants to keep things between his character and himself (hence why I didn't download DCL in the first place), and I've been running my game without a female body replacer due to personal mental reasons (please don't be offended). So far all my attempts to observe a non-default wooden horse pose have resulted in crashes, and I dug up nothing relevant from xedit, CK, or the scripts.

 

Your help is much appreciated. Good day.

 

Cheers.

 

I'm wondering how I can use an elbow armbinder with a wooden horse, and probably didn't look in the right direction in my own search. Could you please tell me how it can be done (by any means -- xedit, CK, or script modification)?

 

By the way, I'm definitely eager to help with some testing when the next beta comes out ?

 

Cheers.

Posted
6 hours ago, sebakax173 said:

I'm wondering how I can use an elbow armbinder with a wooden horse, and probably didn't look in the right direction in my own search. Could you please tell me how it can be done (by any means -- xedit, CK, or script modification)?

 

You will need to add the elbowbinder to the allowed devices formlist in the wooden horse's script properties.

 

6 hours ago, sebakax173 said:

 

By the way, I'm definitely eager to help with some testing when the next beta comes out ?

 

This will be sooner rather than later! :)

Posted
7 hours ago, Kimy said:

This will be sooner rather than later!

 

Is this "Zara should get off her ass now and make sure all the SE bodyslide fixes are merged and waiting for the conversion" soon?

Or "Zara can continue procrastinating til the end of the year soon?" :D

 

Don't really need an answer, since I'm waiting for the release to see what outfit files from were actually added. Just idle curiosity. :)

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...