Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [] = Earth_Orbit (TLE, t_step)
- %% INIT
- global mu RE
- mu = 398600.4418; %Mu km^3s^-2
- RE = 6378.1; %km
- %% Inital State Determination
- %read in TLE
- [year,day,inc,RAAN,ecc,omega,M,n]=TLE_read(TLE);
- %convert date to Julian
- JD=(juliandate(year,1,1,0,0,0))+day;
- %Determine Inital Sate Vector
- COE_i=[JD,inc,RAAN,ecc,omega,M,n];
- [COE_i(8),COE_i(9),COE_i(10),COE_i(11)]=theta2Tah(COE_i(7), COE_i(4));
- [RVEC_i,VVEC_i]=COES2RV(COE_i(4),COE_i(2),COE_i(3),COE_i(5),COE_i(11),COE_i(9));
- [r_ECEF_i v_ECEF_i] = ECItoECEF(RVEC_i',VVEC_i',((JD-2451545)/36525),JD,-0.4399619,-0.140682,-0.33309,0,0,0);
- State = [RVEC_i(1),RVEC_i(2),RVEC_i(3),VVEC_i(1),VVEC_i(2),VVEC_i(3)];
- %% Propagate Orbit
- options = odeset('RelTol',1e-8,'AbsTol',1e-8);
- [T,Y] = ode45(@CP,[0,t_step],State,options);
- RVEC=Y(:,1:3);
- VVEC=Y(:,4:6);
- rmag = norm(RVEC(length(RVEC),1:3));
- vmag = norm(VVEC(length(VVEC),1:3));
- %% 3D plot
- earth_sphere
- hold on
- plot3(RVEC(:,1),RVEC(:,2),RVEC(:,3),'r')
- end
- %% Orbit Propagator
- function [dr] = CP(t,r)
- rmag=norm(r(1:3));
- %Define mu km^3s^-2
- global mu
- dr(1,1)=r(4);
- dr(2,1)=r(5);
- dr(3,1)=r(6);
- dr(4,1)=(-(mu./rmag^3).*r(1));
- dr(5,1)=(-(mu./rmag^3).*r(2));
- dr(6,1)=(-(mu./rmag^3).*r(3));
- end
- %%
- function[year,day,inc,RAAN,ecc,omega,M,n]=TLE_read(TLE_file)
- TLE=fopen(TLE_file, 'r');
- line1=fgets(TLE);
- line2=fgets(TLE);
- year=strcat('2','0',line1(19:20));
- year=str2double(year);
- day=strcat(line1(21:32));
- day=str2double(day);
- inc=strcat(line2(9:16));
- inc=str2double(inc);
- RAAN=strcat(line2(18:25));
- RAAN=str2double(RAAN);
- ecc=strcat('.',line2(27:33));
- ecc=str2double(ecc);
- omega=strcat(line2(35:42));
- omega=str2double(omega);
- M=strcat(line2(44:51));
- M=str2double(M);
- n=strcat(line2(53:63));
- n=str2double(n);
- end
- function [T, a, h, theta] = theta2Tah(n, ecc)
- global mu
- T = 1/n;
- T = T*24*3600;
- a = (T*sqrt(mu)/2/pi)^(2/3);
- h = sqrt(a*(1 - ecc^2)*mu);
- E=fzero(@(E) E-ecc*sin(E)-n,3);
- theta=2*atand(sqrt((1+ecc)/(1-ecc))*tan(E/2));
- end
- function [RVEC, VVEC] = COES2RV(ecc, inc, RAAN, omega, theta, a)
- global mu
- %% RVEC VVEC PQW
- p=a*(1-ecc^2);
- RVEC_pqw = [(p*cosd(theta))/(1+ecc*cosd(theta));(p*sind(theta))/(1+ecc*cosd(theta));0];
- VVEC_pqw = [-sqrt(mu/p)*sind(theta);sqrt(mu/p)*(ecc+cosd(theta));0];
- %% QxX Matrix (3x3)
- QXx = PeriToECIMatrix(RAAN, omega, inc);
- %% RVEC_pqw VVEC_pqw => RVEC VVEC
- RVEC = (QXx * RVEC_pqw)';
- VVEC = (QXx * VVEC_pqw)';
- end
- function QXx = PeriToECIMatrix(RAAN, omega, inc)
- QXx = [cosd(RAAN)*cosd(omega) - sind(RAAN)*sind(omega)*cosd(inc), ...
- - cosd(RAAN)*sind(omega) - sind(RAAN)*cosd(omega)*cosd(inc), ...
- sind(RAAN)*sind(inc); ...
- sind(RAAN)*cosd(omega) + cosd(RAAN)*sind(omega)*cosd(inc), ...
- -sind(RAAN)*sind(omega) + cosd(RAAN)*cosd(omega)*cosd(inc), ...
- -cosd(RAAN)*sind(inc);...
- sind(omega)*sind(inc), ...
- cosd(omega)*sind(inc), ...
- cosd(inc)];
- end
- %% ECI to ECEF Function (Credit David Vallado)
- function [recef,vecef] = ECItoECEF ( reci,veci,ttt,jdut1,lod,xp,yp,eqeterms,ddpsi,ddeps);
- % function eci2ecef
- %
- % this function trsnforms a vector from the mean equator mean equniox frame
- % (j2000), to an earth fixed (ITRF) frame. the results take into account
- % the effects of precession, nutation, sidereal time, and polar motion.
- %
- % author : david vallado 719-573-2600 27 jun
- % 2002
- %[prec,psia,wa,ea,xa] = precess ( ttt, '80' );
- [deltapsi,trueeps,meaneps,omega,nut] = nutation(ttt,ddpsi,ddeps);
- [st,stdot] = sidereal(jdut1,deltapsi,meaneps,omega,lod,eqeterms );
- %[pm] = polarm(xp,yp,ttt,'80');
- thetasa= 7.29211514670698e-05 * (1.0 - lod/86400.0 );
- omegaearth = [0; 0; thetasa;];
- rpef = st'*reci;
- recef = rpef;
- vpef = st'*nut'*veci - cross( omegaearth,rpef );
- vecef = vpef;
- function [st,stdot] = sidereal (jdut1,deltapsi,meaneps,omega,lod,eqeterms );
- %
- % ----------------------------------------------------------------------------
- %
- % function sidereal
- %
- % this function calulates the transformation matrix that accounts for the
- % effects of sidereal time. Notice that deltaspi should not be moded to a
- % positive number because it is multiplied rather than used in a
- % trigonometric argument.
- %
- % author : david vallado 719-573-2600 25 jun
- % 2002-
- % ------------------------ find gmst --------------------------
- gmst= gstime( jdut1 );
- % ------------------------ find mean ast ----------------------
- if (jdut1 > 2450449.5 ) & (eqeterms > 0)
- ast= gmst + deltapsi* cos(meaneps) ...
- + 0.00264*pi /(3600*180)*sin(omega) ...
- + 0.000063*pi /(3600*180)*sin(2.0 *omega);
- else
- ast= gmst + deltapsi* cos(meaneps);
- end
- ast = rem (ast,2*pi);
- thetasa = 7.29211514670698e-05 * (1.0 - lod/86400.0 );
- omegaearth = thetasa;
- %fprintf(1,'st gmst %11.7f ast %11.7f ome %11.7f \n',gmst*180/pi,ast*180/pi,omegaearth*180/pi );
- st(1,1) = cos(ast);
- st(1,2) = -sin(ast);
- st(1,3) = 0.0;
- st(2,1) = sin(ast);
- st(2,2) = cos(ast);
- st(2,3) = 0.0;
- st(3,1) = 0.0;
- st(3,2) = 0.0;
- st(3,3) = 1.0;
- % compute sidereal time rate matrix
- stdot(1,1) = -omegaearth * sin(ast);
- stdot(1,2) = -omegaearth * cos(ast);
- stdot(1,3) = 0.0;
- stdot(2,1) = omegaearth * cos(ast);
- stdot(2,2) = -omegaearth * sin(ast);
- stdot(2,3) = 0.0;
- stdot(3,1) = 0.0;
- stdot(3,2) = 0.0;
- stdot(3,3) = 0.0;
- end
- function [deltapsi, trueeps, meaneps, omega,nut] = nutation (ttt,ddpsi,ddeps );
- deg2rad = pi/180.0;
- [iar80,rar80] = iau80in; % coeff in deg
- % ---- determine coefficients for iau 1980 nutation theory ----
- ttt2= ttt*ttt;
- ttt3= ttt2*ttt;
- meaneps = -46.8150 *ttt - 0.00059 *ttt2 + 0.001813 *ttt3 + 84381.448;
- meaneps = rem( meaneps/3600.0 ,360.0 );
- meaneps = meaneps * deg2rad;
- [ l, l1, f, d, omega, ...
- lonmer, lonven, lonear, lonmar, lonjup, lonsat, lonurn, lonnep, precrate ...
- ] = fundarg( ttt, '80' );
- %fprintf(1,'nut del arg %11.7f %11.7f %11.7f %11.7f %11.7f \n',l*180/pi,l1*180/pi,f*180/pi,d*180/pi,omega*180/pi );
- deltapsi= 0.0;
- deltaeps= 0.0;
- for i= 106:-1: 1
- tempval= iar80(i,1)*l + iar80(i,2)*l1 + iar80(i,3)*f + ...
- iar80(i,4)*d + iar80(i,5)*omega;
- deltapsi= deltapsi + (rar80(i,1)+rar80(i,2)*ttt) * sin( tempval );
- deltaeps= deltaeps + (rar80(i,3)+rar80(i,4)*ttt) * cos( tempval );
- end
- % --------------- find nutation parameters --------------------
- deltapsi = rem( deltapsi + ddpsi, 2.0 * pi );
- deltaeps = rem( deltaeps + ddeps, 2.0 * pi );
- trueeps = meaneps + deltaeps;
- %fprintf(1,'meaneps %11.7f dp %11.7f de %11.7f te %11.7f ttt %11.7f \n',meaneps*180/pi,deltapsi*180/pi,deltaeps*180/pi,trueeps*180/pi, ttt );
- cospsi = cos(deltapsi);
- sinpsi = sin(deltapsi);
- coseps = cos(meaneps);
- sineps = sin(meaneps);
- costrueeps = cos(trueeps);
- sintrueeps = sin(trueeps);
- nut(1,1) = cospsi;
- nut(1,2) = costrueeps * sinpsi;
- nut(1,3) = sintrueeps * sinpsi;
- nut(2,1) = -coseps * sinpsi;
- nut(2,2) = costrueeps * coseps * cospsi + sintrueeps * sineps;
- nut(2,3) = sintrueeps * coseps * cospsi - sineps * costrueeps;
- nut(3,1) = -sineps * sinpsi;
- nut(3,2) = costrueeps * sineps * cospsi - sintrueeps * coseps;
- nut(3,3) = sintrueeps * sineps * cospsi + costrueeps * coseps;
- % n1 = rot1mat( trueeps );
- % n2 = rot3mat( deltapsi );
- % n3 = rot1mat( -meaneps );
- % nut = n3*n2*n1
- end
- function [iar80,rar80] = iau80in()
- % ----------------------------------------------------------------------------
- %
- % function iau80in
- %
- % this function initializes the nutation matricies needed for reduction
- % calculations. the routine needs the filename of the files as input.
- %
- % author : david vallado 719-573-2600 27 may
- % 2002
- % ------------------------ implementation -------------------
- % 0.0001" to rad
- convrt= 0.0001 * pi / (180*3600.0);
- load nut80.dat;
- iar80 = nut80(:,1:5);
- rar80 = nut80(:,6:9);
- for i=1:106
- for j=1:4
- rar80(i,j)= rar80(i,j) * convrt;
- end
- end
- end
- function [ l, l1, f, d, omega, ...
- lonmer, lonven, lonear, lonmar, lonjup, lonsat, lonurn, lonnep, precrate ...
- ] = fundarg( ttt, opt )
- %
- % ----------------------------------------------------------------------------
- %
- % function fundarg
- %
- % this function calulates the delauany variables and planetary values for
- % several theories.
- %
- % author : david vallado 719-573-2600 16 jul 2004
- iauhelp = 'n';
- iaupnhelp = 'y';
- show = 'n';
- deg2rad = pi/180.0;
- % ---- determine coefficients for iau 2000 nutation theory ----
- ttt2 = ttt*ttt;
- ttt3 = ttt2*ttt;
- ttt4 = ttt2*ttt2;
- % ---- iau 2010 theory
- if opt == '10'
- % ------ form the delaunay fundamental arguments in deg
- l = 134.96340251 + ( 1717915923.2178 *ttt + ...
- 31.8792 *ttt2 + 0.051635 *ttt3 - 0.00024470 *ttt4 ) / 3600.0;
- l1 = 357.52910918 + ( 129596581.0481 *ttt - ...
- 0.5532 *ttt2 - 0.000136 *ttt3 - 0.00001149*ttt4 ) / 3600.0;
- f = 93.27209062 + ( 1739527262.8478 *ttt - ...
- 12.7512 *ttt2 + 0.001037 *ttt3 + 0.00000417*ttt4 ) / 3600.0;
- d = 297.85019547 + ( 1602961601.2090 *ttt - ...
- 6.3706 *ttt2 + 0.006593 *ttt3 - 0.00003169*ttt4 ) / 3600.0;
- omega= 125.04455501 + ( -6962890.5431 *ttt + ...
- 7.4722 *ttt2 + 0.007702 *ttt3 - 0.00005939*ttt4 ) / 3600.0;
- % ------ form the planetary arguments in deg
- lonmer = 252.250905494 + 149472.6746358 *ttt;
- lonven = 181.979800853 + 58517.8156748 *ttt;
- lonear = 100.466448494 + 35999.3728521 *ttt;
- lonmar = 355.433274605 + 19140.299314 *ttt;
- lonjup = 34.351483900 + 3034.90567464 *ttt;
- lonsat = 50.0774713998 + 1222.11379404 *ttt;
- lonurn = 314.055005137 + 428.466998313*ttt;
- lonnep = 304.348665499 + 218.486200208*ttt;
- precrate= 1.39697137214*ttt + 0.0003086*ttt2;
- end;
- % ---- iau 2000b theory
- if opt == '02'
- % ------ form the delaunay fundamental arguments in deg
- l = 134.96340251 + ( 1717915923.2178 *ttt ) / 3600.0;
- l1 = 357.52910918 + ( 129596581.0481 *ttt ) / 3600.0;
- f = 93.27209062 + ( 1739527262.8478 *ttt ) / 3600.0;
- d = 297.85019547 + ( 1602961601.2090 *ttt ) / 3600.0;
- omega= 125.04455501 + ( -6962890.5431 *ttt ) / 3600.0;
- % ------ form the planetary arguments in deg
- lonmer = 0.0;
- lonven = 0.0;
- lonear = 0.0;
- lonmar = 0.0;
- lonjup = 0.0;
- lonsat = 0.0;
- lonurn = 0.0;
- lonnep = 0.0;
- precrate= 0.0;
- end;
- % ---- iau 1996 theory
- if opt == '96'
- l = 134.96340251 + ( 1717915923.2178 *ttt + ...
- 31.8792 *ttt2 + 0.051635 *ttt3 - 0.00024470 *ttt4 ) / 3600.0;
- l1 = 357.52910918 + ( 129596581.0481 *ttt - ...
- 0.5532 *ttt2 - 0.000136 *ttt3 - 0.00001149*ttt4 ) / 3600.0;
- f = 93.27209062 + ( 1739527262.8478 *ttt - ...
- 12.7512 *ttt2 + 0.001037 *ttt3 + 0.00000417*ttt4 ) / 3600.0;
- d = 297.85019547 + ( 1602961601.2090 *ttt - ...
- 6.3706 *ttt2 + 0.006593 *ttt3 - 0.00003169*ttt4 ) / 3600.0;
- omega= 125.04455501 + ( -6962890.2665 *ttt + ...
- 7.4722 *ttt2 + 0.007702 *ttt3 - 0.00005939*ttt4 ) / 3600.0;
- % ------ form the planetary arguments in deg
- lonmer = 0.0;
- lonven = 181.979800853 + 58517.8156748 *ttt; % deg
- lonear = 100.466448494 + 35999.3728521 *ttt;
- lonmar = 355.433274605 + 19140.299314 *ttt;
- lonjup = 34.351483900 + 3034.90567464 *ttt;
- lonsat = 50.0774713998 + 1222.11379404 *ttt;
- lonurn = 0.0;
- lonnep = 0.0;
- precrate= 1.39697137214*ttt + 0.0003086*ttt2;
- end;
- % ---- iau 1980 theory
- if opt == '80'
- l = 134.96298139 + ( 1717915922.6330 *ttt + ...
- 31.310 *ttt2 + 0.064 *ttt3 ) / 3600.0;
- l1 = 357.52772333 + ( 129596581.2240 *ttt - ...
- 0.577 *ttt2 - 0.012 *ttt3 ) / 3600.0;
- f = 93.27191028 + ( 1739527263.1370 *ttt - ...
- 13.257 *ttt2 + 0.011 *ttt3 ) / 3600.0;
- d = 297.85036306 + ( 1602961601.3280 *ttt - ...
- 6.891 *ttt2 + 0.019 *ttt3 ) / 3600.0;
- omega= 125.04452222 + ( -6962890.5390 *ttt + ...
- 7.455 *ttt2 + 0.008 *ttt3 ) / 3600.0;
- % ------ form the planetary arguments in deg
- lonmer = 252.3 + 149472.0 *ttt;
- lonven = 179.9 + 58517.8 *ttt; % deg
- lonear = 98.4 + 35999.4 *ttt;
- lonmar = 353.3 + 19140.3 *ttt;
- lonjup = 32.3 + 3034.9 *ttt;
- lonsat = 48.0 + 1222.1 *ttt;
- lonurn = 0.0;
- lonnep = 0.0;
- precrate= 0.0;
- end;
- % ---- convert units to rad
- l = rem( l,360.0 ) * deg2rad; % rad
- l1 = rem( l1,360.0 ) * deg2rad;
- f = rem( f,360.0 ) * deg2rad;
- d = rem( d,360.0 ) * deg2rad;
- omega= rem( omega,360.0 ) * deg2rad;
- lonmer= rem( lonmer,360.0 ) * deg2rad; % rad
- lonven= rem( lonven,360.0 ) * deg2rad;
- lonear= rem( lonear,360.0 ) * deg2rad;
- lonmar= rem( lonmar,360.0 ) * deg2rad;
- lonjup= rem( lonjup,360.0 ) * deg2rad;
- lonsat= rem( lonsat,360.0 ) * deg2rad;
- lonurn= rem( lonurn,360.0 ) * deg2rad;
- lonnep= rem( lonnep,360.0 ) * deg2rad;
- precrate= rem( precrate,360.0 ) * deg2rad;
- %iauhelp='y';
- if iauhelp == 'y'
- fprintf(1,'fa %11.7f %11.7f %11.7f %11.7f %11.7f deg \n',l*180/pi,l1*180/pi,f*180/pi,d*180/pi,omega*180/pi );
- fprintf(1,'fa %11.7f %11.7f %11.7f %11.7f deg \n',lonmer*180/pi,lonven*180/pi,lonear*180/pi,lonmar*180/pi );
- fprintf(1,'fa %11.7f %11.7f %11.7f %11.7f deg \n',lonjup*180/pi,lonsat*180/pi,lonurn*180/pi,lonnep*180/pi );
- fprintf(1,'fa %11.7f \n',precrate*180/pi );
- end;
- end
- function gst = gstime(jdut1);
- twopi = 2.0*pi;
- deg2rad = pi/180.0;
- % ------------------------ implementation ------------------
- tut1= ( jdut1 - 2451545.0 ) / 36525.0;
- temp = - 6.2e-6 * tut1 * tut1 * tut1 + 0.093104 * tut1 * tut1 ...
- + (876600.0 * 3600.0 + 8640184.812866) * tut1 + 67310.54841;
- % 360/86400 = 1/240, to deg, to rad
- temp = rem( temp*deg2rad/240.0,twopi );
- % ------------------------ check quadrants --------------------
- if ( temp < 0.0 )
- temp = temp + twopi;
- end
- gst = temp;
- end
- end
- %% Earth Sphere (Credit Will Campbell)
- %http://www.mathworks.com/matlabcentral/fileexchange/27123-earth-sized-sphe
- %re-with-topography
- function [xx,yy,zz] = earth_sphere(varargin)
- %EARTH_SPHERE Generate an earth-sized sphere.
- % [X,Y,Z] = EARTH_SPHERE(N) generates three (N+1)-by-(N+1)
- % matrices so that SURFACE(X,Y,Z) produces a sphere equal to
- % the radius of the earth in kilometers. The continents will be
- % displayed.
- %
- % [X,Y,Z] = EARTH_SPHERE uses N = 50.
- %
- % EARTH_SPHERE(N) and just EARTH_SPHERE graph the earth as a
- % SURFACE and do not return anything.
- %
- % EARTH_SPHERE(N,'mile') graphs the earth with miles as the unit rather
- % than kilometers. Other valid inputs are 'ft' 'm' 'nm' 'miles' and 'AU'
- % for feet, meters, nautical miles, miles, and astronomical units
- % respectively.
- %
- % EARTH_SPHERE(AX,...) plots into AX instead of GCA.
- %
- % Examples:
- % earth_sphere('nm') produces an earth-sized sphere in nautical miles
- %
- % earth_sphere(10,'AU') produces 10 point mesh of the Earth in
- % astronomical units
- %
- % h1 = gca;
- % earth_sphere(h1,'mile')
- % hold on
- % plot3(x,y,z)
- % produces the Earth in miles on axis h1 and plots a trajectory from
- % variables x, y, and z
- % Clay M. Thompson 4-24-1991, CBM 8-21-92.
- % Will Campbell, 3-30-2010
- % Copyright 1984-2010 The MathWorks, Inc.
- %% Input Handling
- [cax,args,nargs] = axescheck(varargin{:}); % Parse possible Axes input
- error(nargchk(0,2,nargs)); % Ensure there are a valid number of inputs
- % Handle remaining inputs.
- % Should have 0 or 1 string input, 0 or 1 numeric input
- j = 0;
- k = 0;
- n = 50; % default value
- units = 'km'; % default value
- for i = 1:nargs
- if ischar(args{i})
- units = args{i};
- j = j+1;
- elseif isnumeric(args{i})
- n = args{i};
- k = k+1;
- end
- end
- if j > 1 || k > 1
- error('Invalid input types')
- end
- %% Calculations
- % Scale factors
- Scale = {'km' 'm' 'mile' 'miles' 'nm' 'au' 'ft';
- 1 1000 0.621371192237334 0.621371192237334 0.539956803455724 6.6845871226706e-009 3280.839895};
- % Identify which scale to use
- try
- myscale = 6378.1363*Scale{2,strcmpi(Scale(1,:),units)};
- catch %#ok<*CTCH>
- error('Invalid units requested. Please use m, km, ft, mile, miles, nm, or AU')
- end
- % -pi <= theta <= pi is a row vector.
- % -pi/2 <= phi <= pi/2 is a column vector.
- theta = (-n:2:n)/n*pi;
- phi = (-n:2:n)'/n*pi/2;
- cosphi = cos(phi); cosphi(1) = 0; cosphi(n+1) = 0;
- sintheta = sin(theta); sintheta(1) = 0; sintheta(n+1) = 0;
- x = myscale*cosphi*cos(theta);
- y = myscale*cosphi*sintheta;
- z = myscale*sin(phi)*ones(1,n+1);
- %% Plotting
- if nargout == 0
- cax = newplot(cax);
- % Load and define topographic data
- load('topo.mat','topo','topomap1');
- % Rotate data to be consistent with the Earth-Centered-Earth-Fixed
- % coordinate conventions. X axis goes through the prime meridian.
- % http://en.wikipedia.org/wiki/Geodetic_system#Earth_Centred_Earth_Fixed_.28ECEF_or_ECF.29_coordinates
- %
- % Note that if you plot orbit trajectories in the Earth-Centered-
- % Inertial, the orientation of the contintents will be misleading.
- topo2 = [topo(:,181:360) topo(:,1:180)]; %#ok<NODEF>
- % Define surface settings
- props.FaceColor= 'texture';
- props.EdgeColor = 'none';
- props.FaceLighting = 'phong';
- props.Cdata = topo2;
- % Create the sphere with Earth topography and adjust colormap
- surface(x,y,z,props,'parent',cax)
- colormap(topomap1)
- % Replace the calls to surface and colormap with these lines if you do
- % not want the Earth's topography displayed.
- % surf(x,y,z,'parent',cax)
- % shading flat
- % colormap gray
- % Refine figure
- axis equal
- xlabel(['X [' units ']'])
- ylabel(['Y [' units ']'])
- zlabel(['Z [' units ']'])
- view(127.5,30)
- else
- xx = x; yy = y; zz = z;
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement