home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************/
- /**** ****/
- /**** ****/
- /**** Program : Ableitung.c ****/
- /**** ****/
- /**** Version : 03.70 ****/
- /**** ****/
- /**** Erstversion : 09.03.1990 ****/
- /**** ****/
- /**** Letzte Änderung : 03.08.1990 ****/
- /**** ****/
- /**** Compiliert mit : siehe MAKEFILE ****/
- /**** ****/
- /**** Gelinkt mit : siehe MAKEFILE ****/
- /**** ****/
- /********************************************************************/
- /**** ****/
- /**** ****/
- /**** Copyright by Rüdiger Dreier ****/
- /**** ****/
- /**** ****/
- /********************************************************************/
-
- #ifdef DEBUG
- #include "Plotter.h"
- #include <proto/tool.h>
- #endif
- #include <string.h>
- #include <exec/memory.h>
- #include <proto/exec.h>
-
- #ifndef LAENGE
- #define LAENGE 500
- #endif
-
- char * __asm Ableiten(register __a0 char *string)
- {
- char Ergebnis[MAXCHARS];
- char *EString;
-
- StartBlock=Init_Mem(string);
- MatheFehler=Init_Block(StartBlock);
- MatheFehler|=PreCalc(StartBlock,Konstantenstart);
- EString=Ableitung(StartBlock);
- strcpy(Ergebnis,EString);
- Free_Block(StartBlock);
- FreeMem(EString,LAENGE);
-
- return(Ergebnis);
- }
-
- VOID __asm Umklammern(register __a0 char *string)
- {
- char *HILFE;
- HILFE=AllocMem(LAENGE,MEMF_CLEAR);
- if(HILFE==NULL)return;
-
- if(check('+','-',0L,(LONG)strlen(string),string)!=-1L)
- {
- HILFE[0]='(';
- strcat(HILFE,string);
- strcat(HILFE,")");
- strcpy(string,HILFE);
- }
- FreeMem(HILFE,LAENGE);
- }
-
- VOID __asm Umklammern_2(register __a0 char *string)
- {
- char *HILFE;
-
- Umklammern(string);
- HILFE=AllocMem(LAENGE,MEMF_CLEAR);
- if(HILFE==NULL)return;
-
- if(check('*','/',0L,(LONG)strlen(string),string)!=-1L)
- {
- HILFE[0]='(';
- strcat(HILFE,string);
- strcat(HILFE,")");
- strcpy(string,HILFE);
- }
- FreeMem(HILFE,LAENGE);
- }
-
- VOID Zusammensetzen(char *string,LONG Anzahl,char *ABL,struct Block *Start)
- {
- char *abgeleitet;
- SHORT *a;
- LONG Anz;
-
- abgeleitet=Ableitung(Start->Right);
- strcpy(string,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(string);
-
- a=(SHORT *)string;
- /* if(strcmp(string,"0")) */
- if((0x3000!=*a))
- {
- /* if(strcmp(string,"1")==NULL) */
- if(0x3100==*a)
- {
- string[0]=0;
- }
- else
- {
- strcat(string,"*");
- }
- strcat(string,ABL);
- Anz=Start->Rechts-Start->Links-Anzahl;
- mid(&string[strlen(string)],Start->String,Start->Links+Anzahl+1,Anz);
- }
- }
-
- LONG __asm Mit_X(register __a0 struct Block *block)
- {
- LONG i,Flag=0;
- i=block->Links;
- while(i<=block->Rechts)
- {
- if(block->String[i]=='x')Flag++;
- i++;
- }
- return(Flag);
- }
-
- char * __asm Ableitung(register __a0 struct Block *Start)
- {
- LONG Anz;
- char *links,*rechts,*abgeleitet,*HILFE;
-
- /* Speicher reservieren */
- rechts=AllocMem(LAENGE,MEMF_CLEAR);
- if(!rechts)return(0);
- HILFE=AllocMem(LAENGE,MEMF_CLEAR);
- if(!HILFE)return(0);
-
- switch(Start->RechenArt)
- {
- case ADDI:
- {
- SHORT *a;
- /* u+v --> u' + v' */
- /* Speicher reservieren */
- links=AllocMem(LAENGE,MEMF_CLEAR);
- if(!links)return(0);
-
- /* Ableitung von links */
- abgeleitet=Ableitung(Start->Left);
- strcpy(links ,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(links);
-
- /* Ableitung von rechts */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
-
- /* Zusammenfügen */
- /* 0+ wird nicht gebraucht */
- a=(SHORT *)links;
- /*if(strcmp(links,"0"))*/
- if(0x3000!=*a)
- {
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- /* +0 wird auch nicht gebraucht */
- strcat(links,"+");
- strcat(links,rechts);
- }
- }
- else
- {
- /* Nur rechts nehmen */
- strcpy(links,rechts);
- }
-
- strcpy(rechts,links);
- /* Wenn links und rechts 0 sind ... */
- if(rechts[0]==0)
- {
- SHORT *a;
- a=(SHORT *)rechts;
- *a=0x3000;
- /* rechts[0]='0';rechts[1]=0; */
- }
- FreeMem(links,LAENGE);
- break;
- }
-
- case SUBT:
- {
- SHORT *a;
- /* u-v --> u' - v' */
- /* Speicher reservieren */
- links=AllocMem(LAENGE,MEMF_CLEAR);
- if(!links)return(0);
-
- abgeleitet=Ableitung(Start->Left);
- strcpy(links ,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(links);
-
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
-
- /*if(strcmp(links,"0"))*/
- a=(SHORT *)links;
- if(0x3000!=*a)
- {
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- strcat(links,"-");
- strcat(links,rechts);
- }
- }
- else
- {
- SHORT *a;
- a=(SHORT *)links;
- *a=0x2d00;
- /* links[0]='-';
- links[1]=0; */
- strcat(links,rechts);
- }
-
- strcpy(rechts,links);
- /*if(!strcmp(rechts,""))*/
- if(0==rechts[0])
- {
- SHORT *a;
- a=(SHORT *)rechts;
- *a=0x3000;
- /* rechts[0]='0';rechts[1]=0; */
- }
- FreeMem(links,LAENGE);
- break;
- }
-
- case MULT:
- {
- SHORT *a;
- /* u*v --> u*v' + u'*v */
- /* Speicher reservieren */
- links=AllocMem(LAENGE,MEMF_CLEAR);
- if(!links)return(0);
-
- abgeleitet=Ableitung(Start->Left);
- strcpy(links ,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(links);
-
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
-
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- Anz=Start->Left->Rechts-Start->Left->Links+1;
- mid(HILFE,Start->String,Start->Left->Links,Anz);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"1"))*/
- if(0x3100!=*a)
- {
- Umklammern(HILFE);
- if(Vereinfachung(rechts,HILFE))
- {
- rechts[0]=0;
- }
- else
- {
- strcat(rechts,"*");
- }
- }
- else
- {
- rechts[0]=0;
- }
- strcat(rechts,HILFE);
- }
-
- a=(SHORT *)links;
- /*if(strcmp(links,"0"))*/
- if(0x3000!=*a)
- {
- SHORT *a,*b;
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- a=(SHORT *)links;
- /*if(strcmp(links,"1"))*/
- if(0x3100!=*a)
- {
- Umklammern(HILFE);
- if(Vereinfachung(links,HILFE))
- {
- links[0]=0;
- }
- else
- {
- strcat(links,"*");
- }
- }
- else
- {
- links[0]=0;
- }
- strcat(links,HILFE);
- a=(SHORT *)links;
- b=(SHORT *)rechts;
- /*if(strcmp(links,"0") && strcmp(rechts,"0")) */
- if((0x3000!=*a) && (0x3000!=*b))
- {
- strcat(links,"+");
- strcat(links,rechts);
- }
- strcpy(rechts,links);
- }
- FreeMem(links,LAENGE);
- break;
- }
-
- case DIVI:
- {
- SHORT *a;
- /* u/v --> (u'*v - u*v')/v^2 */
- /* Speicher reservieren */
- links=AllocMem(LAENGE,MEMF_CLEAR);
- if(!links)return(0);
-
- abgeleitet=Ableitung(Start->Left);
- strcpy(links ,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(links);
-
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
-
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- Anz=Start->Left->Rechts-Start->Left->Links+1;
- mid(HILFE,Start->String,Start->Left->Links,Anz);
- /*if(strcmp(rechts,"1"))*/
- if(0x3100!=*a)
- {
- Umklammern(HILFE);
- strcat(rechts,"*");
- }
- else
- {
- rechts[0]=0;
- }
- strcat(rechts,HILFE);
- }
-
- a=(SHORT *)links;
- /*if(strcmp(links,"0"))*/
- if(0x3000!=*a)
- {
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- /*if(strcmp(links,"1"))*/
- if(0x3100!=*a)
- {
- Umklammern(HILFE);
- strcat(links,"*");
- }
- else
- {
- links[0]=0;
- }
- strcat(links,HILFE);
- }
-
- if(strcmp(links,rechts))
- {
- SHORT *a;
- Umklammern(rechts);
- a=(SHORT *)links;
- /*if(strcmp(links,"0"))*/
- if(0x3000!=*a)
- {
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- strcat(links,"-");
- strcat(links,rechts);
- }
- }
- else
- {
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- SHORT *a;
- a=(SHORT *)links;
- *a=0x2d00;
- /* links[0]='-';
- links[1]=0; */
- strcat(links,rechts);
- }
- }
- strcpy(rechts,links);
- }
- else
- {
- SHORT *a;
- a=(SHORT *)rechts;
- *a=0x3000;
-
- /* rechts[0]='0';rechts[1]=0; */
- }
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- Umklammern(rechts);
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- Umklammern(HILFE);
- strcat(HILFE,"^2");
- strcat(rechts,"/");
- strcat(rechts,HILFE);
- }
- FreeMem(links,LAENGE);
- break;
- }
-
- case POWE:
- {
- /* Speicher reservieren */
- links=AllocMem(LAENGE,MEMF_CLEAR);
- if(!links)return(0);
- Anz=0;
- if(Mit_X(Start->Right))Anz=1;
- if(Mit_X(Start->Left ))Anz+=2;
- switch(Anz)
- {
- case 0:
- {
- /* Von X nicht abhängig */
- /* rechts[0]='0';rechts[1]=0; */
- SHORT *a;
- a=(SHORT *)rechts;
- *a=0x3000;
- break;
- }
- case 2:
- {
- SHORT *a;
- /* Basis von X abhängig */
- /* x^a --> a*x^(a-1) */
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- Umklammern(HILFE);
- abgeleitet=Ableitung(Start->Left);
- strcat(links ,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(links);
- a=(SHORT *)links;
- /*if(strcmp(links,"1"))*/
- if(0x3100!=*a)
- {
- strcat(links,"*");
- }
- else
- {
- links[0]=0;
- }
- strcat(links,HILFE);
- strcat(links,"*");
- Anz=Start->Left->Rechts-Start->Left->Links+1;
- mid(HILFE,Start->String,Start->Left->Links,Anz);
- Umklammern_2(HILFE);
- strcat(links,HILFE);
- strcat(links,"^(");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(rechts,Start->String,Start->Right->Links,Anz);
- strcat(rechts,"-1)");
- strcat(links,rechts);
- strcpy(rechts,links);
- break;
- }
- case 1:
- {
- SHORT *a;
- /* a^x --> a^x*ln(a) */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"1"))*/
- if(0x3100!=*a)
- {
- strcat(rechts,"*");
- }
- else
- {
- rechts[0]=0;
- }
- /* Die Originalfunktion wieder zusammenstellen */
- Anz=Start->Left->Rechts-Start->Left->Links+1;
- mid(links,Start->String,Start->Left->Links,Anz);
- Umklammern_2(links);
- strcat(rechts,links);
- strcat(rechts,"^");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- Umklammern_2(HILFE);
- strcat(rechts,HILFE);
- strcat(rechts,"*ln(");
- strcat(rechts,links);
- strcat(rechts,")");
- break;
- }
- case 3:
- {
- struct Block *New_START;
- char *NewFunc;
- /* 15.07.90: Fehler beseitigt. f(x) und g(x) waren vertauscht */
- /* f(x)^g(x) <=> e^(ln(f(x)^g(x))) */
- /* <=> e^g(x)*ln(f(x)) */
- /* Abgeleitet => */
- /* (g(x)*ln(f(x)))'*e^g(x)*ln(f(x)) */
- /* <=> (g(x)*ln(f(x)))'*f(x)^g(x) */
- /* Die Ableitung wird rekur. gebildet */
-
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- Umklammern_2(HILFE);
- strcpy(links,HILFE);
- strcat(links,"*ln(");
- Anz=Start->Left->Rechts-Start->Left->Links+1;
- mid(HILFE,Start->String,Start->Left->Links,Anz);
- strcat(links,HILFE);
- strcat(links,")");
-
- New_START=Init_Mem(links);
-
- if(!New_START)return(0);
- Anz=Init_Block(New_START);
-
- NewFunc=Ableitung(New_START);
-
- strcpy(rechts,NewFunc);
- FreeMem(NewFunc,LAENGE);
- Free_Block(New_START);
-
- Umklammern(rechts);
- strcat(rechts,"*");
-
- /* Die Originalfunktion wieder zusammenstellen */
- Anz=Start->Left->Rechts-Start->Left->Links+1;
- mid(links,Start->String,Start->Left->Links,Anz);
- Umklammern_2(links);
-
- strcat(rechts,links);
- strcat(rechts,"^");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- Umklammern_2(HILFE);
-
- strcat(rechts,HILFE);
- }
- }
- FreeMem(links,LAENGE);
- break;
- }
-
- case SINU:
- {
- /* sin(x) --> cos(x) */
- Zusammensetzen(rechts,3,"cos(",Start);
- break;
- }
-
- case COSI:
- {
- SHORT *a;
- /* cos(x) --> -sin(x) */
- Zusammensetzen(rechts,3,"sin(",Start);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- SHORT *a;
- a=(SHORT *)HILFE; /* Hilfe = '-'; */
- *a=0x2d00;
-
- strcat(HILFE,rechts);
- strcpy(rechts,HILFE);
- }
- break;
- }
-
- case TANG:
- {
- SHORT *a;
- /* tan(x) --> 1/cos^2(x) */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- strcat(rechts,"/cos(");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(&rechts[strlen(rechts)],Start->String,Start->Right->Links,Anz);
- strcat(rechts,")^2");
- }
- break;
- }
-
- case ASIN:
- {
- SHORT *a;
- /* asin --> 1/sqr(1-x^2) */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- strcat(rechts,"/sqr(1-");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(&rechts[strlen(rechts)],Start->String,Start->Right->Links,Anz);
- strcat(rechts,"^2)");
- }
- break;
- }
-
- case ACOS:
- {
- SHORT *a;
- /* acos(x) --> -1/sqr(1-x^2) */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- strcat(rechts,"/sqr(1-");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(&rechts[strlen(rechts)],Start->String,Start->Right->Links,Anz);
- strcat(rechts,"^2)");
- }
- if(0x3000!=*a)
- /*if(strcmp(rechts,"0"))*/
- {
- /*strcpy(HILFE,"-");*/
- SHORT *a;
- a=(SHORT *)HILFE;
- *a=0x2d00;
-
- strcat(HILFE,rechts);
- strcpy(rechts,HILFE);
- }
- break;
- }
-
- case ATAN:
- {
- SHORT *a;
- /* atan(x) --> 1/(1+x^2) */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- strcat(rechts,"/(1+");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(&rechts[strlen(rechts)],Start->String,Start->Right->Links,Anz);
- strcat(rechts,"^2)");
- }
- break;
- }
-
- case LOG1:
- {
- SHORT *a;
- /* log(x) --> 1/(x*ln10) */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x300!=*a)
- {
- strcat(rechts,"/(");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(&rechts[strlen(rechts)],Start->String,Start->Right->Links,Anz);
- strcat(rechts,"*");
- strcat(rechts,"ln(10))");
- }
- break;
- }
-
- case LNAT:
- {
- SHORT *a;
- /* ln(x) --> 1/x */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- strcat(rechts,"/");
- Umklammern_2(HILFE);
-
- strcat(rechts,HILFE);
- }
- break;
- }
-
- case ABSO:
- {
- /* Kann man drüber diskutieren.... */
- /* abs(x) --> sgn(x) */
- Zusammensetzen(rechts,3,"sgn(",Start);
- break;
- }
-
- case SQRT:
- {
- SHORT *a;
- /* sqr(x) --> 1/2*x^-1/2 */
- abgeleitet=Ableitung(Start->Right);
- strcpy(rechts,abgeleitet);
- FreeMem(abgeleitet,LAENGE);
- Umklammern(rechts);
- a=(SHORT *)rechts;
- /*if(strcmp(rechts,"0"))*/
- if(0x3000!=*a)
- {
- /*if(!strcmp(rechts,"1"))*/
- if(0x3100==*a)
- {
- SHORT *a;
- a=(SHORT *)rechts;
- *a=0x3100;
-
- /* rechts[0]='1';rechts[1]=0; */
- }
- strcat(rechts,"/2*");
- Anz=Start->Right->Rechts-Start->Right->Links+1;
- mid(HILFE,Start->String,Start->Right->Links,Anz);
- Umklammern_2(HILFE);
- strcat(rechts,HILFE);
- strcat(rechts,"^(-1/2)");
- }
- break;
- }
-
- case FLOO:
- case ZIFF:
- case UKON:
- case MKON:
- case SIGU:
- {
- SHORT *a;
- a=(SHORT *)rechts;
- *a=0x3000;
-
- /* rechts[0]='0';rechts[1]=0; */
- break;
- }
-
- case X:
- {
- SHORT *a;
- a=(SHORT *)rechts;
- *a=0x3100;
-
- /* rechts[0]='1';rechts[1]=0; */
- break;
- }
- default:
- {
- /* FEHLER, es sollten alle Fälle abgedeckt sein */
- }
- }
- FreeMem(HILFE,LAENGE);
- return(rechts);
- }
-
-
- /* Funktion, die den Term a/b*b auf a vereinfacht */
- /* Wenn b von x abhängig ist, dann stimmt das so eigentlich nur für b<>0 */
- LONG __asm Vereinfachung(register __a0 char *a,
- register __a1 char *b)
- {
- char *HILFE;
- LONG Pos,Flag=0;
-
- Umklammern(a);
- Umklammern(b);
-
- HILFE=AllocMem(LAENGE,MEMF_CLEAR);
- if(!HILFE)return(0);
-
- if(Pos=check('/','/',0L,(LONG)strlen(a),a)!=-1L)
- {
- strcpy(HILFE,&a[Pos+1]);
- if(!strcmp(HILFE,b))
- {
- left(HILFE,a,Pos);
- Flag=1;
- }
- }
-
- if(Pos=check('/','/',0L,(LONG)strlen(b),b)!=-1L)
- {
- strcpy(HILFE,&b[Pos+1]);
- if(!strcmp(HILFE,a))
- {
- left(HILFE,b,Pos);
- Flag=1;
- }
- }
- if(Flag)strcpy(b,HILFE);
-
- FreeMem(HILFE,LAENGE);
- return(Flag);
- }
-
-
-
-