Skip to content

Commit

Permalink
Changing Syntax for 1.0 compatibility
Browse files Browse the repository at this point in the history
atmosphereScaleHeight to atmosphereDepth
maxAtmosphereAltitude to atmosphereDepth

velocityCurve got shortened to velCurve

atmosphereCurve got shortened to atmCurve

Some code from sswelm,
but was a little more rigorous.
  • Loading branch information
Neouni committed May 18, 2015
1 parent 649905d commit 5bf25dd
Show file tree
Hide file tree
Showing 28 changed files with 575 additions and 517 deletions.
919 changes: 460 additions & 459 deletions FNPlugin/AlcubierreDrive.cs

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion FNPlugin/ElectricEngineControllerFX.cs
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,8 @@ protected void updateISP()
{
FloatCurve newISP = new FloatCurve();
newISP.Add(0, (float)(baseISP * _current_propellant.IspMultiplier));
_attached_engine.atmosphereCurve = newISP;
//_attached_engine.atmosphereCurve = newISP;
_attached_engine.atmCurve = newISP;
}

protected void updatePropellantBar()
Expand Down
3 changes: 2 additions & 1 deletion FNPlugin/ElectricRCSController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ public void FixedUpdate() {
if (attachedRCS != null && HighLogic.LoadedSceneIsFlight && vessel.ActionGroups[KSPActionGroup.RCS]) {
double total_thrust = attachedRCS.thrustForces.Sum(frc => frc);
float curve_eval_point = (float)Math.Min(FlightGlobals.getStaticPressure(vessel.transform.position), 1.0);
double currentIsp = attachedRCS.atmosphereCurve.Evaluate(curve_eval_point);
//double currentIsp = attachedRCS.atmosphereCurve.Evaluate(curve_eval_point);
double currentIsp = attachedRCS.atmCurve.Evaluate(curve_eval_point);

double power_required = total_thrust * currentIsp * 9.82 * 0.5 / 1000.0;
double power_received = consumeFNResource(power_required * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_MEGAJOULES) / TimeWarp.fixedDeltaTime;
Expand Down
49 changes: 33 additions & 16 deletions FNPlugin/FNNozzleController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,8 @@ public void updateIspEngineParams() {
minISP = maxISP * 0.4f;
newISP.Add(0, Mathf.Min(maxISP, 2997.13f), 0, 0);
newISP.Add(1, Mathf.Min(minISP, 2997.13f), 0, 0);
myAttachedEngine.useVelocityCurve = false;
//myAttachedEngine.useVelocityCurve = false;
myAttachedEngine.useVelCurve = false;
myAttachedEngine.useEngineResponseTime = false;
} else {
if (myAttachedReactor.shouldScaleDownJetISP ()) {
Expand All @@ -332,13 +333,16 @@ public void updateIspEngineParams() {
vCurve.Add((float)(maxISP*g0*1.0/3.0), 1.0f);
vCurve.Add((float)(maxISP*g0), 1.0f);
vCurve.Add ((float)(maxISP*g0*4.0/3.0), 0);
myAttachedEngine.useVelocityCurve = true;
//myAttachedEngine.useVelocityCurve = true;
myAttachedEngine.useVelCurve = true;
myAttachedEngine.useEngineResponseTime = true;
myAttachedEngine.ignitionThreshold = 0.01f;
}

myAttachedEngine.atmosphereCurve = newISP;
myAttachedEngine.velocityCurve = vCurve;
//myAttachedEngine.atmosphereCurve = newISP;
myAttachedEngine.atmCurve = newISP;
//myAttachedEngine.velocityCurve = vCurve;
myAttachedEngine.velCurve = vCurve;
assThermalPower = myAttachedReactor.MaximumPower;
if (myAttachedReactor is InterstellarFusionReactor) {
assThermalPower = assThermalPower * 0.95f;
Expand Down Expand Up @@ -375,7 +379,8 @@ public bool hasStarted() {

public void estimateEditorPerformance() {
bool attached_reactor_upgraded = false;
FloatCurve atmospherecurve = new FloatCurve();
//FloatCurve atmospherecurve = new FloatCurve();
FloatCurve atmcurve = new FloatCurve();
float thrust = 0;
if (myAttachedReactor != null) {
if (myAttachedReactor is IUpgradeableModule) {
Expand All @@ -386,15 +391,20 @@ public void estimateEditorPerformance() {
}
maxISP = (float)(Math.Sqrt((double)myAttachedReactor.CoreTemperature) * isp_temp_rat * ispMultiplier);
minISP = maxISP * 0.4f;
atmospherecurve.Add(0, maxISP, 0, 0);
atmospherecurve.Add(1, minISP, 0, 0);
//atmospherecurve.Add(0, maxISP, 0, 0);
//atmospherecurve.Add(1, minISP, 0, 0);
atmcurve.Add(0, maxISP, 0, 0);
atmcurve.Add(1, minISP, 0, 0);
thrust = (float)(2 * myAttachedReactor.MaximumPower * 1000 / g0 / maxISP);
myAttachedEngine.maxThrust = thrust;
myAttachedEngine.atmosphereCurve = atmospherecurve;
//myAttachedEngine.atmosphereCurve = atmospherecurve;
myAttachedEngine.atmCurve = atmcurve;
} else {
atmospherecurve.Add(0, 0.00001f, 0, 0);
//atmospherecurve.Add(0, 0.00001f, 0, 0);
atmcurve.Add(0, 0.00001f, 0, 0);
myAttachedEngine.maxThrust = thrust;
myAttachedEngine.atmosphereCurve = atmospherecurve;
//myAttachedEngine.atmosphereCurve = atmospherecurve;
myAttachedEngine.atmCurve = atmcurve;
}
}

Expand All @@ -405,7 +415,8 @@ public override void OnFixedUpdate() {
}
updateIspEngineParams ();
float curve_eval_point = (float)Math.Min (FlightGlobals.getStaticPressure (vessel.transform.position), 1.0);
float currentIsp = myAttachedEngine.atmosphereCurve.Evaluate (curve_eval_point);
//float currentIsp = myAttachedEngine.atmosphereCurve.Evaluate (curve_eval_point);
float currentIsp = myAttachedEngine.atmCurve.Evaluate (curve_eval_point);
double ispratio = currentIsp / maxISP;
this.current_isp = currentIsp;
// scale down thrust if it's attached to the wrong sized reactor
Expand Down Expand Up @@ -460,7 +471,9 @@ public override void OnFixedUpdate() {
//double additional_thrust_compensator = myAttachedEngine.finalThrust / (myAttachedEngine.maxThrust * myAttachedEngine.currentThrottle)/ispratio;
double engine_thrust = engineMaxThrust/myAttachedEngine.thrustPercentage*100;
// engine thrust fixed
//print ("A: " + engine_thrust*myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude));
//print ("A: " + //engine_thrust*myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude));
if (!double.IsInfinity(engine_thrust) && !double.IsNaN(engine_thrust)) {
engine_thrust*myAttachedEngine.veloCurve.Evaluate((float)vessel.srf_velocity.magnitude));
if (!double.IsInfinity(engine_thrust) && !double.IsNaN(engine_thrust)) {
if (isLFO) {
myAttachedEngine.maxThrust = (float)(2.2222 * engine_thrust);
Expand All @@ -475,8 +488,10 @@ public override void OnFixedUpdate() {
if (current_isp > 0) {
double vcurve_at_current_velocity = 1;

if (myAttachedEngine.useVelocityCurve && myAttachedEngine.velocityCurve != null) {
vcurve_at_current_velocity = myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude);
//if (myAttachedEngine.useVelocityCurve && myAttachedEngine.velocityCurve != null) {
//vcurve_at_current_velocity = myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude);
if (myAttachedEngine.useVelCurve && myAttachedEngine.velCurve != null) {
vcurve_at_current_velocity = myAttachedEngine.velCurve.Evaluate((float)vessel.srf_velocity.magnitude);
}
//if (!double.IsNaN(additional_thrust_compensator) && !double.IsInfinity(additional_thrust_compensator)) {
//vcurve_at_current_velocity = additional_thrust_compensator;
Expand All @@ -495,8 +510,10 @@ public override void OnFixedUpdate() {
if (myAttachedEngine.realIsp > 0) {
atmospheric_limit = getAtmosphericLimit();
double vcurve_at_current_velocity = 1;
if (myAttachedEngine.useVelocityCurve) {
vcurve_at_current_velocity = myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude);
//if (myAttachedEngine.useVelocityCurve) {
//vcurve_at_current_velocity = myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude);
if (myAttachedEngine.useVelCurve) {
vcurve_at_current_velocity = myAttachedEngine.velCurve.Evaluate((float)vessel.srf_velocity.magnitude);
}
fuel_flow_rate = myAttachedEngine.maxThrust / myAttachedEngine.realIsp / g0 / 0.005 * TimeWarp.fixedDeltaTime;
if (vcurve_at_current_velocity > 0 && !double.IsInfinity(vcurve_at_current_velocity) && !double.IsNaN(vcurve_at_current_velocity)) {
Expand Down
27 changes: 18 additions & 9 deletions FNPlugin/FNNozzleControllerFX.cs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,8 @@ public void updateIspEngineParams() {
minISP = maxISP * 0.4f;
newISP.Add (0, Mathf.Min(maxISP, 2997.13f), 0, 0);
newISP.Add(1, Mathf.Min(minISP, 2997.13f), 0, 0);
myAttachedEngine.useVelocityCurve = false;
//myAttachedEngine.useVelocityCurve = false;
myAttachedEngine.useVelCurve = false;
myAttachedEngine.useEngineResponseTime = false;
} else {
if (myAttachedReactor.shouldScaleDownJetISP ()) {
Expand All @@ -297,13 +298,16 @@ public void updateIspEngineParams() {
vCurve.Add((float)(maxISP*g0*1.0/3.0), 0.9f);
vCurve.Add((float)(maxISP*g0), 1.0f);
vCurve.Add ((float)(maxISP*g0*4.0/3.0), 0);
myAttachedEngine.useVelocityCurve = true;
//myAttachedEngine.useVelocityCurve = true;
myAttachedEngine.useVelCurve = true;
myAttachedEngine.useEngineResponseTime = true;
myAttachedEngine.ignitionThreshold = 0.01f;
}

myAttachedEngine.atmosphereCurve = newISP;
myAttachedEngine.velocityCurve = vCurve;
//myAttachedEngine.atmosphereCurve = newISP;
myAttachedEngine.atmCurve = newISP;
//myAttachedEngine.velocityCurve = vCurve;
myAttachedEngine.velCurve = vCurve;
assThermalPower = myAttachedReactor.MaximumPower;
}

Expand Down Expand Up @@ -342,7 +346,8 @@ public override void OnFixedUpdate() {
}
updateIspEngineParams ();
float curve_eval_point = (float)Math.Min (FlightGlobals.getStaticPressure (vessel.transform.position), 1.0);
float currentIsp = myAttachedEngine.atmosphereCurve.Evaluate (curve_eval_point);
//float currentIsp = myAttachedEngine.atmosphereCurve.Evaluate (curve_eval_point);
float currentIsp = myAttachedEngine.atmCurve.Evaluate (curve_eval_point);
double ispratio = currentIsp / maxISP;
this.current_isp = currentIsp;
// scale down thrust if it's attached to the wrong sized reactor
Expand Down Expand Up @@ -404,8 +409,10 @@ public override void OnFixedUpdate() {
// amount of fuel being used at max throttle with no atmospheric limits
if (current_isp > 0) {
double vcurve_at_current_velocity = 1;
if (myAttachedEngine.useVelocityCurve) {
vcurve_at_current_velocity = myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude);
//if (myAttachedEngine.useVelocityCurve) {
if (myAttachedEngine.useVelCurve) {
//vcurve_at_current_velocity = myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude);
vcurve_at_current_velocity = myAttachedEngine.velCurve.Evaluate((float)vessel.srf_velocity.magnitude);
}
fuel_flow_rate = engine_thrust / current_isp / g0 / 0.005 * TimeWarp.fixedDeltaTime;
if (vcurve_at_current_velocity > 0) {
Expand All @@ -417,8 +424,10 @@ public override void OnFixedUpdate() {
if (myAttachedEngine.realIsp > 0) {
atmospheric_limit = getAtmosphericLimit();
double vcurve_at_current_velocity = 1;
if (myAttachedEngine.useVelocityCurve) {
vcurve_at_current_velocity = myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude);
//if (myAttachedEngine.useVelocityCurve) {
if (myAttachedEngine.useVelCurve) {
//vcurve_at_current_velocity = myAttachedEngine.velocityCurve.Evaluate((float)vessel.srf_velocity.magnitude);
vcurve_at_current_velocity = myAttachedEngine.velCurve.Evaluate((float)vessel.srf_velocity.magnitude);
}
fuel_flow_rate = myAttachedEngine.maxThrust / myAttachedEngine.realIsp / g0 / 0.005 * TimeWarp.fixedDeltaTime/vcurve_at_current_velocity;
}else {
Expand Down
7 changes: 4 additions & 3 deletions FNPlugin/FNRadiator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -293,14 +293,15 @@ public override void OnUpdate() {
}

public override void OnFixedUpdate() {
float atmosphere_height = vessel.mainBody.maxAtmosphereAltitude;
//float atmosphere_height = vessel.mainBody.maxAtmosphereAltitude;
float atmosphere_height = (float)vessel.mainBody.atmosphereDepth;
float vessel_height = (float) vessel.mainBody.GetAltitude (vessel.transform.position);
float conv_power_dissip = 0;
if (vessel.altitude <= PluginHelper.getMaxAtmosphericAltitude(vessel.mainBody)) {
float pressure = (float) FlightGlobals.getStaticPressure (vessel.transform.position);
float dynamic_pressure = (float) (0.5*pressure*1.2041*vessel.srf_velocity.sqrMagnitude);
pressure += dynamic_pressure;
float low_temp = FlightGlobals.getExternalTemperature (vessel.transform.position);
float low_temp = (float) FlightGlobals.getExternalTemperature (vessel.transform.position);

float delta_temp = Mathf.Max(0, (float)current_rad_temp - low_temp);
conv_power_dissip = pressure * delta_temp * radiatorArea * rad_const_h/1e6f * TimeWarp.fixedDeltaTime*convectiveBonus;
Expand Down Expand Up @@ -432,7 +433,7 @@ private void colorHeat()
{
const String KSPShader = "KSP/Emissive/Bumped Specular";
float currentTemperature = getRadiatorTemperature();
float maxTemperature = part.maxTemp;
float maxTemperature = (float) part.maxTemp;

double temperatureRatio = currentTemperature / maxTemperature;
Color emissiveColor = new Color((float)(Math.Pow(temperatureRatio, 3)), 0.0f, 0.0f, 1.0f);
Expand Down
3 changes: 2 additions & 1 deletion FNPlugin/InterstellarMagneticNozzleControllerFX.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ public void FixedUpdate() {
double isp = Math.Sqrt(joules_per_amu * 2.0 / GameConstants.ATOMIC_MASS_UNIT) / GameConstants.STANDARD_GRAVITY;
FloatCurve new_isp = new FloatCurve();
new_isp.Add(0, (float)isp, 0, 0);
_attached_engine.atmosphereCurve = new_isp;
//_attached_engine.atmosphereCurve = new_isp;
_attached_engine.atmCurve = new_isp;

double charged_power_received = consumeFNResource(max_power * TimeWarp.fixedDeltaTime * _attached_engine.currentThrottle, FNResourceManager.FNRESOURCE_CHARGED_PARTICLES) / TimeWarp.fixedDeltaTime;
consumeFNResource(charged_power_received * TimeWarp.fixedDeltaTime, FNResourceManager.FNRESOURCE_WASTEHEAT);
Expand Down
6 changes: 4 additions & 2 deletions FNPlugin/ModuleSabreHeating.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ public void FixedUpdate() {

if (rapier_engine != null)
{
if (rapier_engine.isOperational && rapier_engine.currentThrottle > 0 && rapier_engine.useVelocityCurve)
//if (rapier_engine.isOperational && rapier_engine.currentThrottle > 0 && rapier_engine.useVelocityCurve)
if (rapier_engine.isOperational && rapier_engine.currentThrottle > 0 && rapier_engine.useVelCurve)
{
float temp = (float)Math.Max((Math.Sqrt(vessel.srf_velocity.magnitude) * 20.0 / GameConstants.atmospheric_non_precooled_limit) * part.maxTemp * proportion, 1);
if (temp >= (part.maxTemp - 10.0f))
Expand All @@ -71,7 +72,8 @@ public void FixedUpdate() {

if (rapier_engine2 != null)
{
if (rapier_engine2.isOperational && rapier_engine2.currentThrottle > 0 && rapier_engine2.useVelocityCurve)
//if (rapier_engine2.isOperational && rapier_engine2.currentThrottle > 0 && rapier_engine2.useVelocityCurve)
if (rapier_engine2.isOperational && rapier_engine2.currentThrottle > 0 && rapier_engine2.useVelCurve)
{
float temp = (float)Math.Max((Math.Sqrt(vessel.srf_velocity.magnitude) * 20.0 / GameConstants.atmospheric_non_precooled_limit) * part.maxTemp * proportion, 1);
if (temp >= (part.maxTemp - 10.0f))
Expand Down
3 changes: 2 additions & 1 deletion FNPlugin/PluginHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ public static float getMaxAtmosphericAltitude(CelestialBody body)
{
return 0;
}
return (float)-body.atmosphereScaleHeight * 1000.0f * Mathf.Log(1e-6f);
//return (float)-body.atmosphereScaleHeight * 1000.0f * Mathf.Log(1e-6f);
return (float)-body.atmosphereDepth * 1000.0f * Mathf.Log(1e-6f);
}

public static float getScienceMultiplier(int refbody, bool landed)
Expand Down
6 changes: 4 additions & 2 deletions FNPlugin/VistaEngineController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ public override void OnStart(PartModule.StartState state) {
if (state == StartState.Editor) {return;}

ModuleEngines curEngineT = (ModuleEngines)this.part.Modules ["ModuleEngines"];
minISP = curEngineT.atmosphereCurve.Evaluate(0);
//minISP = curEngineT.atmosphereCurve.Evaluate(0);
minISP = curEngineT.atmCurve.Evaluate(0);

standard_deut_rate = curEngineT.propellants.FirstOrDefault(pr => pr.name == InterstellarResourcesConfiguration.Instance.Deuterium).ratio;
standard_lith_rate = curEngineT.propellants.FirstOrDefault(pr => pr.name == InterstellarResourcesConfiguration.Instance.Tritium).ratio;
Expand Down Expand Up @@ -140,7 +141,8 @@ public override void OnFixedUpdate() {
//curEngineT.propellants[2].ratio = (float)(standard_lith_rate / throttle / throttle);
FloatCurve newISP = new FloatCurve();
newISP.Add(0, (float)(minISP / throttle));
curEngineT.atmosphereCurve = newISP;
//curEngineT.atmosphereCurve = newISP;
curEngineT.atmCurve = newISP;
if (power >= 2500 * TimeWarp.fixedDeltaTime) {
curEngineT.maxThrust = 1100;
} else {
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/AluminiumHybrid/part.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ MODULE
name = Oxidizer
ratio = 4.05
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 286
key = 1 250
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/AugmentedArcjet/part0.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ MODULE
name = LiquidFuel
ratio = 1
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 2854
}
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/AugmentedArcjet/part1.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ MODULE
name = LiquidFuel
ratio = 1
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 2854
}
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/MPD/part0.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ MODULE
name = LiquidFuel
ratio = 1
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 11213
}
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/MPD/part1.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ MODULE
name = LiquidFuel
ratio = 1
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 11213
}
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/MPD/part2.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ MODULE
name = LiquidFuel
ratio = 1
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 11213
}
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/MagneticNozzle/part1.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ MODULE
ratio = 1.0
DrawGauge = True
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 36000
key = 1 32000
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/MagneticNozzle/part2.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ MODULE
ratio = 1.0
DrawGauge = True
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 36000
key = 1 32000
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/MagneticNozzle/part3.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ MODULE
ratio = 1.0
DrawGauge = True
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 36000
key = 1 32000
Expand Down
3 changes: 2 additions & 1 deletion GameData/WarpPlugin/Parts/Engines/MethaneEngine/part.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ MODULE
name = Oxidizer
ratio = 1
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 368
key = 1 309
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ MODULE
name = Oxidizer
ratio = 1.1
}
atmosphereCurve
//atmosphereCurve
atmCurve
{
key = 0 1000
key = 1 400
Expand Down
Loading

0 comments on commit 5bf25dd

Please sign in to comment.