Jump to content

[WIN/MAC/LINUX] KSP Trajectory Optimization Tool v1.6.7 [LVD / kOS Integration!]


Recommended Posts

7 hours ago, Drew Kerman said:

so how would you go about enforcing a TWR lock in LVD anyways? It's definitely a thing I've seen actual rockets do, maintaining a constant TWR.

Rockets usually are full thrust. Throttling, when it happens (not all can be throttled), is for specific events or payloads (events such as Max-Q and payloads such as humans, which don't like being subjected to six gee of thrust for nine minutes).

Rockets such as the Delta IV Heavy or the Falcon Heavy throttle down their core stage so that it conserves fuel while the side boosters handle the heavy work.

Link to post
Share on other sites
1 hour ago, Starwaster said:

Rockets usually are full thrust. Throttling, when it happens (not all can be throttled), is for specific events or payloads (events such as Max-Q and payloads such as humans, which don't like being subjected to six gee of thrust for nine minutes).

right, those are some of the situations I was thinking of. I didn't mean to imply all rockets do this

1 hour ago, Starwaster said:

Rockets such as the Delta IV Heavy or the Falcon Heavy throttle down their core stage so that it conserves fuel while the side boosters handle the heavy work

this actually made me realize you can't set a throttle model per engine if more than one is active that you'd like to be set differently from the rest. Adding a drop-down list of active engines to the throttle model dialog would be nice - if it was left empty of a selection then that throttle model would apply to all active engines

Edited by Drew Kerman
Link to post
Share on other sites

Also! Does LVD have the necessary information to determine the dynamic pressure on the vehicle? That's another important launch milestone that can affect rocket ascent in how the throttle is applied. As with my TWR suggestion, not all rockets can or have to throttle back through Max Q or otherwise change their ascent through Max Q but there are situations where some do. On the other hand, given that Arrowstar knows very well about all this, if it was so important I figure it would already be in there. But still, just asking :)Every launch commentator loves to point out Max Q so for me as an outside observer it may have been made to seem more important than it is

Link to post
Share on other sites
19 hours ago, Drew Kerman said:

so how would you go about enforcing a TWR lock in LVD anyways? It's definitely a thing I've seen actual rockets do, maintaining a constant TWR. This is what I thought the TWR event was doing and IMO it makes more sense that way. It would be similar in function to the option to preserve angle continuity in the steering control. So at the end of the TWR event for the action when you select the throttle model you click a checkbox to maintain current TWR from that point forward until the throttle model is modified. This would also apply to throttle events in general. So like, even if you don't use the TWR event and you just set the throttle to 70% at launch, if you click the "maintain TWR" option whatever the vehicle's TWR at 70% throttle would be maintained.

Tried to model the last launch I did but ended up with a different trajectory than the actual one. I wasn't expecting to match it up perfectly but didn't expect such a large discrepancy. I really think though that it's due to being unable to change the Cd during flight. The Magenta line is using a Cd of 0.15, which is about average for all but the upper atmosphere where it gets really high. The green line is with the default Cd of 2.2. If I could vary the Cd properly at certain stages of the flight I think I could closely match the actual trajectory. I know that's coming in the next pre-release. No rush, but if I could play with it tomorrow I would :D

<snip>

So... there's no reason why I couldn't have a throttle model that does what you're talking about, but at the moment I haven't coded one up like that.  It would involve some UI changes, too, so it's not super trivial, but I think it's doable if you think it'll be useful to you?

9 hours ago, Drew Kerman said:

right, those are some of the situations I was thinking of. I didn't mean to imply all rockets do this

this actually made me realize you can't set a throttle model per engine if more than one is active that you'd like to be set differently from the rest. Adding a drop-down list of active engines to the throttle model dialog would be nice - if it was left empty of a selection then that throttle model would apply to all active engines

Yes, this is intentional.  I realize in KSP that you can set the thrust limiter on engines, but in general there's only one throttle for the whole craft, so I chose to make LVD work the same way.  I don't have an event action to change the min and max thrust on an engine, but I could, and that would sort of be similar.  Thoughts?

Link to post
Share on other sites
21 hours ago, Drew Kerman said:

But now here's something else weird for you to look at next chance you get - download file. Here's the problem, starting with the file marked #2:

  1. right-click on the second event and get the End UT time
  2. Open the graphical analysis, paste the End UT time
  3. Select throttle
  4. Plot

It'll show that it only reaches 65.76584. Now, if I got back to the first MAT file I sent you and do the same thing, it tells me 71.1191. I spent several minutes going back and forth between the two files, and I couldn't figure out what was different about them. I built the newer file directly off the old one, I didn't re-create the mission :confused:

So this has to do with the nature of double precision and rounding.  You'll notice if you grab the final end time from Step 1, add 0.000001 second or so, and then paste into the box in Step 2, it will do what you expect.  It's because, under the hood, the string value of the number isn't quite the double precision numerical representation in memory, but it's close.

------

Anyway!  I have a new pre-release build for you.  This adds to LVD:

  • Actions to change drag and lift properties during a mission;
  • Escape and enter key bindings for (hopefully all) LVD UI dialog boxes; and
  • Dynamic pressure termination conditions, optimization variable, and graphical analysis task (which also shows up in MA because I'm cool like that).

Here's the link to KSPTOT v1.6.1 pre-release 2.  Go ahead and take a look and tell me what you think.  By the way, did I miss anything from all the posts over the past day or so?  There have been more than a few of them.

Link to post
Share on other sites
22 minutes ago, Arrowstar said:

So... there's no reason why I couldn't have a throttle model that does what you're talking about, but at the moment I haven't coded one up like that.  It would involve some UI changes, too, so it's not super trivial, but I think it's doable if you think it'll be useful to you?

Yep I would definitely use it, mainly for crewed launches and also if the payload is light I don't want a rocket accelerating so fast it causes excess heating on ascent. Also longer burn times can sometimes help in general

25 minutes ago, Arrowstar said:

Yes, this is intentional.  I realize in KSP that you can set the thrust limiter on engines, but in general there's only one throttle for the whole craft, so I chose to make LVD work the same way.  I don't have an event action to change the min and max thrust on an engine, but I could, and that would sort of be similar.  Thoughts?

Ooh, thrust limiters is even another angle I hadn't considered. Yea thrust limiting would be great - but actually the situation I was most concerned with would be where you have strap-on solid boosters firing with the main engine also active. You'd want the main engine throttled down while the boosters are active and at full throttle. But there's also support in the game for SRB thrust curves so being able to set thrust limits for engines would also allow LVD to model SRB thrust curves

9 minutes ago, Arrowstar said:

So this has to do with the nature of double precision and rounding.  You'll notice if you grab the final end time from Step 1, add 0.000001 second or so, and then paste into the box in Step 2, it will do what you expect.  It's because, under the hood, the string value of the number isn't quite the double precision numerical representation in memory, but it's close.

Ahhh, yes I recall now I had a similar situation in MA. Thanks for clearing that up

10 minutes ago, Arrowstar said:

AnywayI have a new pre-release build for you. This adds to LVD:

  • ALL THE COOL THINGS

Wheee! As promised, I will play with this tonight - right after I eat dinner and watch the latest Mars episode :)

11 minutes ago, Arrowstar said:

By the way, did I miss anything from all the posts over the past day or so?

Thanks for asking but nope, you are on top of things!

Link to post
Share on other sites
19 minutes ago, Drew Kerman said:

Yep I would definitely use it, mainly for crewed launches and also if the payload is light I don't want a rocket accelerating so fast it causes excess heating on ascent. Also longer burn times can sometimes help in general

Okay I'll see what I can do!

Quote

Ooh, thrust limiters is even another angle I hadn't considered. Yea thrust limiting would be great - but actually the situation I was most concerned with would be where you have strap-on solid boosters firing with the main engine also active. You'd want the main engine throttled down while the boosters are active and at full throttle. But there's also support in the game for SRB thrust curves so being able to set thrust limits for engines would also allow LVD to model SRB thrust curves

Okay, so if this is what you're after, then it already exists in LVD!  For each engine you create, you can set the minimum and maximum throttle.  For SRBs, set the minimum throttle to 100%.  This will do what you want.  The minimum and maximum allowable throttle setting for each engine overrides the throttle model setting.

Quote

Wheee! As promised, I will play with this tonight - right after I eat dinner and watch the latest Mars episode :)

Sounds good. :)

Link to post
Share on other sites
3 hours ago, Arrowstar said:

For SRBs, set the minimum throttle to 100%.  This will do what you want.  The minimum and maximum allowable throttle setting for each engine overrides the throttle model setting. 

Nice! But it would still be good to have the ability for LVD to support SRB thrust curves, especially since now that has actually been a stock feature of KSP for a while.

So I spent more time playing around tonight and didn't come across any troubles. There are some minor issues with the Enter usage of the dialogs - sometimes the enter key opens what button/list item is selected sometimes it decides that you want to save & close. I just click the Save/Close button. Having the Esc key is the real handy part simply because a lot of times I mis-click on the wrong event and just want to close the dialog quick and still have the cursor near where it should be, other times I'm just doing a check of values and can close the dialogs faster - it really does make a difference over a long work session. So thanks for that.

I put some more effort into trying to model my last launch with LVD, you can see what I did with these files. The Ascension Mk1 #2 Actual.mat file is the LVD attempt to recreate the launch, Ascension Mk1 B1 #2.mat has the actual trajectory from the game with the LVD plotted trajectory as an Other Spacecraft, Mk1 Drag Cutout.png is how I calculated the drag profile - the box in the upper-left is 1m^2, and Ascension Mk1 B1 #2.xlsx contains some of the telemetry data I referenced, although most of it came from the launch video. I didn't have much success, so what I'm going to do now is design a trajectory in LVD and task my next launch to fly it and see how close it turns out. Will report back later this week

Edited by Drew Kerman
Link to post
Share on other sites

So I realized I should probably graph the pitch values in the XLSX telemetry data against the pitch values output from the LVD graphical analysis to see how close I really got with the ascent control, but looking at the tabular data from the LVD I see this for the UT in seconds column:

58109100
58109100.75
58109101.5
58109102.25
58109103
58109103
58109103

58109103.23
58109103.45
58109103.68
58109103.91
58109103.96
58109104.01
58109104.06
58109104.11
58109104.11
58109104.11

58109104.58
58109105.05
58109105.53
58109106
58109106
58109106
58109106

Very strange! I do know why it's splitting things into fractions of a second but not sure what is going on here with all the exactly repeated values. I get a similar result if I use MET as well. I expanded the similar numbers to many many decimal places in Excel but it was just zeroes all the way through so they aren't fractions of a second, just three or four outputs from the same exact second

Which also brings to mind the fact that in LVD I can't specify a step size for the log entries, or I guess the events in the case of LVD, like I can for MA (Set Num State Log Entries Per Coast). This means for LVD I can't export a spreadsheet of 1s interval (or close to 1s anyways) values - in this case to compare them to the 1s intervals of my telemetry data. Really tho I just think the GA tool itself should let you state - hey I want only 1s between values or 5s or 30min or 2hrs... at least for the tabular export option, since I can import these spreadsheet values into my Ops Tracker to use them as lookup tables. For example for satellites in orbit I want to track their comm visibility - rather than have to calculate it in the web app I can just export a list of tabular values at 1min intervals to lookup at which point along the satellites orbit it can see ground stations

Edited by Drew Kerman
Link to post
Share on other sites

Another item for your attention is that I am referring to you as an external company developing this software that the KSA is using. Right now I'm calling you ArrowstarTech - but this won't be used until next week for the first time. If you'd like me to change it to something else, let me know!

Link to post
Share on other sites
18 hours ago, Drew Kerman said:

Nice! But it would still be good to have the ability for LVD to support SRB thrust curves, especially since now that has actually been a stock feature of KSP for a while.

So the curves you want are thrust vs. propellant remaining?  It's do-able from a technical sense, but it does involve changing the way engines work. non-trivially.  I wish I had known about these curves when I writing the engine code for the first time lol.  I'll see what I can do but it won't be right away.

Quote

So I spent more time playing around tonight and didn't come across any troubles. There are some minor issues with the Enter usage of the dialogs - sometimes the enter key opens what button/list item is selected sometimes it decides that you want to save & close. I just click the Save/Close button. Having the Esc key is the real handy part simply because a lot of times I mis-click on the wrong event and just want to close the dialog quick and still have the cursor near where it should be, other times I'm just doing a check of values and can close the dialogs faster - it really does make a difference over a long work session. So thanks for that.

This is an issue of focus.  The enter key only closes the window with the save/close button if the window itself has focus.  If you're in a textbox or some other UI widget, that widget will intercept the enter key push and do with it what it normally does.  Not much I can do about that as it's how Windows (or at least MATLAB's UI system) works.

Quote

I put some more effort into trying to model my last launch with LVD, you can see what I did with these files. The Ascension Mk1 #2 Actual.mat file is the LVD attempt to recreate the launch, Ascension Mk1 B1 #2.mat has the actual trajectory from the game with the LVD plotted trajectory as an Other Spacecraft, Mk1 Drag Cutout.png is how I calculated the drag profile - the box in the upper-left is 1m^2, and Ascension Mk1 B1 #2.xlsx contains some of the telemetry data I referenced, although most of it came from the launch video. I didn't have much success, so what I'm going to do now is design a trajectory in LVD and task my next launch to fly it and see how close it turns out. Will report back later this week

I'll take a look!  I did notice that the pitch profile in the Excel file was all out of wack (lots of up and down), so that'll be something to look into.

5 hours ago, Drew Kerman said:

So I realized I should probably graph the pitch values in the XLSX telemetry data against the pitch values output from the LVD graphical analysis to see how close I really got with the ascent control, but looking at the tabular data from the LVD I see this for the UT in seconds column:

58109100
58109100.75
58109101.5
58109102.25
58109103
58109103
58109103

58109103.23
58109103.45
58109103.68
58109103.91
58109103.96
58109104.01
58109104.06
58109104.11
58109104.11
58109104.11

58109104.58
58109105.05
58109105.53
58109106
58109106
58109106
58109106

Very strange! I do know why it's splitting things into fractions of a second but not sure what is going on here with all the exactly repeated values. I get a similar result if I use MET as well. I expanded the similar numbers to many many decimal places in Excel but it was just zeroes all the way through so they aren't fractions of a second, just three or four outputs from the same exact second

Check if the repeated values are occurring at the end of events.  If they are, then those are the actions being executed.  Each action creates a new state log entry in memory so that it can be tracked ("this action created this state log entry").  MA actually does this too (duplicate time entries) for impulsive delta-v events, but it's not as evident there because there's only going to be one duplicate entry.  Anyway, you can use your favorite spreadsheet program to filter out duplicate entries if you're outputting Graphical Analysis data to CSV.

Quote

Which also brings to mind the fact that in LVD I can't specify a step size for the log entries, or I guess the events in the case of LVD, like I can for MA (Set Num State Log Entries Per Coast). This means for LVD I can't export a spreadsheet of 1s interval (or close to 1s anyways) values - in this case to compare them to the 1s intervals of my telemetry data. Really tho I just think the GA tool itself should let you state - hey I want only 1s between values or 5s or 30min or 2hrs... at least for the tabular export option, since I can import these spreadsheet values into my Ops Tracker to use them as lookup tables. For example for satellites in orbit I want to track their comm visibility - rather than have to calculate it in the web app I can just export a list of tabular values at 1min intervals to lookup at which point along the satellites orbit it can see ground stations

As of the next pre-release, which will come when I get enough new features to justify it (or if you really need it, next time I can compile it), it does have this ability now. :D  Each event has an entry for integrator output step size.  Set to a positive number, this will give you a data point every N seconds.  Set to a negative number or zero, the current behavior of only providing the integrator's native output will be retained.  As I said, you can set this output step size independently for each event.

4 hours ago, Drew Kerman said:

Another item for your attention is that I am referring to you as an external company developing this software that the KSA is using. Right now I'm calling you ArrowstarTech - but this won't be used until next week for the first time. If you'd like me to change it to something else, let me know!

That's fine, no worries.  If you could, though, please note somewhere (even if it's just an asterisk somewhere) that it's a fictional company.  I know it seems obvious, but with the donations thing, I want to make sure that there's no confusion if the IRS were to ever see anything that that is not business income (and therefore I don't owe self-employment taxes lol).  Thanks!

Link to post
Share on other sites
3 minutes ago, Arrowstar said:

I'll see what I can do but it won't be right away.

cool. It's a feature I would want, but not one I need - at least, not yet! I will def be launching with SRBs using this mod in the future

5 minutes ago, Arrowstar said:

Not much I can do about that as it's how Windows (or at least MATLAB's UI system) works.

Ok yea, just pointing it out it doesn't really bother me

6 minutes ago, Arrowstar said:

I did notice that the pitch profile in the Excel file was all out of wack (lots of up and down)

Yea you'll see why in the video. I still don't know why the rocket rolled like that, it didn't do it the first launch and the kOS steering lock should have prevented it

7 minutes ago, Arrowstar said:

Anyway, you can use your favorite spreadsheet program to filter out duplicate entries if you're outputting Graphical Analysis data to CSV. 

Cool, just wanted to make sure it wasn't a bug

7 minutes ago, Arrowstar said:

As of the next pre-release, which will come when I get enough new features to justify it (or if you really need it, next time I can compile it), it does have this ability now. :D 

YAAASSSSSSSSS. No I don't need it now but great to know it's coming

8 minutes ago, Arrowstar said:

If you could, though, please note somewhere (even if it's just an asterisk somewhere) that it's a fictional company.  I know it seems obvious, but with the donations thing, I want to make sure that there's no confusion if the IRS were to ever see anything that that is not business income (and therefore I don't owe self-employment taxes lol).  Thanks!

Good thought. Tho I don't know how I'd do that with a tweet... Really the only reason I'm making up a company for you is because I don't want to post images and tweets about my using KSPTOT and have people think it was made by me for myself! I mean I could just say "external developer" but I do want to give you a shout out as well but keeping with the fiction I'd just rather it be a company rather than an individual you know what I mean?

Link to post
Share on other sites
2 minutes ago, Drew Kerman said:

Good thought. Tho I don't know how I'd do that with a tweet... Really the only reason I'm making up a company for you is because I don't want to post images and tweets about my using KSPTOT and have people think it was made by me for myself! I mean I could just say "external developer" but I do want to give you a shout out as well but keeping with the fiction I'd just rather it be a company rather than an individual you know what I mean?

How about just one tweet right before or after your first reference to "ArrowstarTech" stating that, and then it'll be on Twitter for all time and citable in the very unlikely event it's needed.  You can not worry about it after that I think. :)

Link to post
Share on other sites
Just now, Arrowstar said:

How about just one tweet right before or after your first reference to "ArrowstarTech" stating that, and then it'll be on Twitter for all time and citable in the very unlikely event it's needed.  You can not worry about it after that I think. :)

yup that sounds good. Will do

Link to post
Share on other sites

welp I figured out why my rocket was rolling on the last launch. I must have fiddled with the control surfaces or something because when I attached them they were just slightly off vertical. I don't know how I attached them back then but I didn't use 90° angle snap because when I did that just now in testing the roll was completely gone. Just a normal surface attach without angle snap puts them on so close to properly vertical I didn't notice the slight angle. This means this next launch should be much better controlled and I can follow the ascent profile properly. Still aiming for a flight later this week - I think the most wanted feature right now would be the TWR hold. I really don't like my rockets going so fast they produce heat effects. In the meantime I can just graph out my speed as I design the ascent and if I see it's traveling too fast I can adjust the throttle accordingly

Link to post
Share on other sites

interesting, with a gradual pitch over of any kind I keep seeing a double-hump in the Dynamic Pressure graph for peak pressure, the second right after the first and about the same size, but data I have from both previous launches shows pressure only peaking once. Any idea why this would be happening?

oF892IP.png

Link to post
Share on other sites
4 minutes ago, Drew Kerman said:

interesting, with a gradual pitch over of any kind I keep seeing a double-hump in the Dynamic Pressure graph for peak pressure, the second right after the first and about the same size, but data I have from both previous launches shows pressure only peaking once. Any idea why this would be happening?

<snip>

I would need to see altitude, body relative velocity, and dynamic pressure all on top of each other to fanthom a guess.  If I was going to speculate though, I would say it's probably due to the vehicle either losing a bit of altitude or the altitude rate decreasing for a short while.

Link to post
Share on other sites
3 minutes ago, Arrowstar said:

I would need to see altitude, body relative velocity, and dynamic pressure all on top of each other to fanthom a guess.  If I was going to speculate though, I would say it's probably due to the vehicle either losing a bit of altitude or the altitude rate decreasing for a short while.

altitude charts a smooth curve and so does speed, no bumps in either of those graph outputs

I have to step away for the next hour or so

Edited by Drew Kerman
Link to post
Share on other sites
1 hour ago, Drew Kerman said:

altitude charts a smooth curve and so does speed, no bumps in either of those graph outputs

I have to step away for the next hour or so

Since dynamic pressure is a play between atmosphere relative speed (squared) and air density, you might investigate your altitude and speed independently to see if there's anything going on.  Also check to see if you see that same behavior in KSP somehow.  It's possible (though I would think unlikely) that there's an issue with the atmosphere model or the way dynamic pressure is computed in KSPTOT.

Link to post
Share on other sites
2 hours ago, Arrowstar said:

you might investigate your altitude and speed independently

I plotted them out in separate windows with the GA and maximized them but couldn't see anything but a smooth curve for both. Is that what you meant?

2 hours ago, Arrowstar said:

Also check to see if you see that same behavior in KSP somehow

I'll let you know after the flight if it happens, but so far have never seen it on previous flights

Link to post
Share on other sites

duuuur I just realized why my previous rocket flights never showed a double-hump in dynamic pressure - I reduce throttle and lock to 2.5 TWR as soon as I hit Max Q, so that dumps the throttle immediately down like 5% and then continually lowers as fuel burns off. When I put this behavior into LVD, the double hump mostly disappeared. It was still there, but hardly noticeable and the second spike was lower

anyways, I've put together a profile for my sub-orbital flight, I manually satisfied a few constraints such as fuel required, landing zone, apokee and burning to the edge of the atmosphere. I will launch it tomorrow hopefully - still have to get the flight profile programmed in kOS - and see how it goes.

Link to post
Share on other sites

if I set a model action that specifies a linear change, does that change take effect at that moment or in the next second? So if I set the throttle to 100% with -2.5%/s change, does the throttle remain at 100% for 1 second before beginning to fall or am I essentially setting the throttle to 97.5%?

Edited by Drew Kerman
Link to post
Share on other sites
31 minutes ago, Drew Kerman said:

if I set a model action that specifies a linear change, does that change take effect at that moment or in the next second? So if I set the throttle to 100% with -2.5%/s change, does the throttle remain at 100% for 1 second before beginning to fall or am I essentially setting the throttle to 97.5%?

If you set a rate via a model action at time t, that rate takes effect at time t.  However, because it's a rate, you won't see it on the actual value of the throttle until some time after t.

Example: 

T=0, throttle is 100, rate is 0

T=1, throttle is 100, rate gets set to -1

T=2, throttle is 99, rate is still -1

Does that make sense?

Link to post
Share on other sites
12 minutes ago, Arrowstar said:

Does that make sense?

yes, that is what I thought just wanted to be sure, because that's how I programmed the throttle to behave in my launch script. Also, was going to use the steering inputs derived by LVD to reach my pitch angles but the quadratic fit works very well here. In fact I've been meaning to ask if it might be possible to allow the optimizer to have a Pitch constraint. That way if I wanted a pitch profile like the one I have (70° @ 10km, 55° @ 20km, 43° @ 30km), I could set a pitch constraint for each altitude event, right?

Link to post
Share on other sites

I added in a Thrust to Weight throttle model tonight.  It'll be in the next pre-release.  Note that it's a bit CPU intensive, because it has to determine the throttle setting at every time step to maintain the desired thrust to weight, so use sparingly.

1AjyUEC.png

 

4 hours ago, Drew Kerman said:

yes, that is what I thought just wanted to be sure, because that's how I programmed the throttle to behave in my launch script. Also, was going to use the steering inputs derived by LVD to reach my pitch angles but the quadratic fit works very well here. In fact I've been meaning to ask if it might be possible to allow the optimizer to have a Pitch constraint. That way if I wanted a pitch profile like the one I have (70° @ 10km, 55° @ 20km, 43° @ 30km), I could set a pitch constraint for each altitude event, right?

Yeah these are coming in the next pre-release too.  I've had them on my TO DO list for a while, just haven't gotten around to all the awful UI work that they'll require.  But conceptually they are very straight forward. :)

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...