Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// EJERCICIO 2
- #include <stdio.h>
- #include <stdlib.h>
- #include "slist.h"
- ///Solo hice el test de las últimas 3, las otras doy por sentado que funcan.
- static void imprimir_entero(int dato) {
- printf("%d ", dato);
- }
- int mayor (int a, int b){
- return a>b;}
- SList slist_crear() {
- return NULL;
- }
- void slist_destruir(SList lista) {
- SNodo *nodoAEliminar;
- while (lista != NULL) {
- nodoAEliminar = lista;
- lista = lista->sig;
- free(nodoAEliminar);
- }
- }
- int slist_vacia(SList lista) {
- return lista == NULL;
- }
- SList slist_agregar_final(SList lista, int dato) {
- SNodo *nuevoNodo = malloc(sizeof(SNodo));
- nuevoNodo->dato = dato;
- nuevoNodo->sig = NULL;
- if (lista == NULL)
- return nuevoNodo;
- SList nodo = lista;
- for (;nodo->sig != NULL;nodo = nodo->sig);
- /* ahora 'nodo' apunta al ultimo elemento en la lista */
- nodo->sig = nuevoNodo;
- return lista;
- }
- SList slist_agregar_inicio(SList lista, int dato) {
- SNodo *nuevoNodo = malloc(sizeof(SNodo));
- nuevoNodo->dato = dato;
- nuevoNodo->sig = lista;
- return nuevoNodo;
- }
- void slist_recorrer(SList lista, FuncionVisitante visit) {
- for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
- visit(nodo->dato);
- }
- int slist_longitud (SList lista){
- int contador = 0;
- for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
- contador++;
- return contador;
- }
- SList slist_concatenar (SList lista1, SList lista2) {
- for (; lista2 != NULL; lista2 = lista2->sig)
- lista1 = slist_agregar_final(lista1, lista2->dato);
- return lista1;
- }
- SList slist_insertar (SList lista, int dato, int posicion){
- if(slist_longitud(lista) < posicion || posicion < 0)
- return lista;
- if (lista == NULL)
- return slist_agregar_inicio(lista, dato);
- int bandera = 1;
- SList backup = lista;
- for (;bandera<posicion; bandera++ , lista = lista->sig);
- SNodo *nuevoNodo = malloc(sizeof(SNodo));
- nuevoNodo->dato = dato;
- nuevoNodo->sig = lista->sig;
- lista->sig = nuevoNodo;
- return backup;
- }
- SList slist_eliminar(SList lista, int posicion) {
- if (lista == NULL || slist_longitud(lista) < posicion || posicion < 0)
- return lista;
- SNodo* pepe;
- if (posicion == 0){
- pepe = lista;
- lista = lista->sig;
- free(pepe);
- return lista;
- }
- int indice = 1;
- SList back = lista;
- for (; indice < posicion; indice++, lista = lista->sig);
- pepe = lista->sig;
- lista->sig = lista->sig->sig;
- free(pepe);
- return back;
- }
- int slist_contiene(SList lista, int dato) {
- for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
- if (nodo->dato == dato) return 1;
- return 0;
- }
- int slist_indice (SList lista, int dato) {
- for (int indice = 0; lista != NULL; lista = lista->sig, indice++)
- if (lista->dato == dato)
- return indice;
- return -1;
- }
- SList slist_intersecar (SList lista1, SList lista2) {
- SList nuevo = slist_crear();
- if(lista1 == NULL || lista2 == NULL)
- return nuevo;
- for(;lista1 != NULL;lista1 = lista1->sig)
- if(! (slist_contiene(nuevo, lista1->dato)) && slist_contiene(lista2, lista1->dato))
- nuevo = slist_agregar_final(nuevo, lista1->dato);
- return nuevo;
- }
- int slist_contiene_custom (SList lista, int dato, int (*comparador) (int, int)) {
- for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
- if (comparador(nodo->dato, dato)) return 1;
- return 0;
- }
- SList slist_intersecar_custom (SList lista1, SList lista2, int (*comparador) (int, int)) {
- SList nuevo = slist_crear();
- if(lista1 == NULL || lista2 == NULL)
- return nuevo;
- for(;lista1 != NULL;lista1 = lista1->sig)
- if (! (slist_contiene(nuevo, lista1->dato)) && slist_contiene_custom(lista2, lista1->dato, comparador))
- nuevo = slist_agregar_final (nuevo, lista1->dato);
- return nuevo;
- }
- void slist_ordenar (SList lista, int (*comparador) (int, int)){
- int largo = slist_longitud(lista), aux;
- SList puntero;
- for(int i=largo-1; i>0; i--){
- puntero=lista;
- for(int j=0; j<i; puntero = puntero->sig, j++)
- if(comparador(puntero->dato, puntero->sig->dato)){
- aux = puntero->dato;
- puntero->dato = puntero->sig->dato;
- puntero->sig->dato = aux;
- }
- }
- }
- SList slist_reverso (SList lista) {
- SList nuevo = slist_crear();
- for(;lista != NULL;lista = lista->sig)
- nuevo = slist_agregar_inicio(nuevo, lista->dato);
- return nuevo;
- }
- SList slist_intercalar (SList lista1, SList lista2){
- int oscilador = 0;
- SList nueva = slist_crear();
- for(;lista1 != NULL && lista2!= NULL; oscilador++){
- if(oscilador % 2){
- nueva = slist_agregar_final(nueva, lista2->dato);
- lista2 = lista2->sig;
- }
- else{
- nueva = slist_agregar_final(nueva, lista1->dato);
- lista1 = lista1->sig;
- }
- }
- for(;lista1 != NULL; lista1 = lista1->sig)
- nueva = slist_agregar_final(nueva, lista1->dato);
- for(;lista2 != NULL; lista2 = lista2->sig)
- nueva = slist_agregar_final(nueva, lista2->dato);
- return nueva;
- }
- int main(int argc, char *argv[]) {
- SList lista = slist_crear(), reversa;
- lista = slist_agregar_inicio(lista, 17);
- lista = slist_agregar_inicio(lista, -2);
- lista = slist_agregar_inicio(lista, 4);
- lista = slist_agregar_final(lista, 3);
- slist_recorrer(lista, imprimir_entero);
- printf("\n");
- slist_ordenar(lista, mayor);
- slist_recorrer(lista, imprimir_entero);
- printf("\n");
- reversa = slist_reverso(lista);
- slist_recorrer(reversa, imprimir_entero);
- printf("\n");printf("\n");
- lista = slist_agregar_final(lista, 69);
- lista = slist_agregar_final(lista, 74);
- lista = slist_agregar_final(lista, 7);
- slist_recorrer(lista, imprimir_entero);
- printf("\n");
- slist_recorrer(reversa, imprimir_entero);
- printf("\n");
- lista = slist_intercalar(lista, reversa);
- slist_recorrer(lista, imprimir_entero);
- printf("\n");
- slist_destruir(lista);
- slist_destruir(reversa);
- return 0;
- }
- ///EJERCICIO 6
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- typedef struct _lista{
- int dato;
- uintptr_t puntero;
- }DNodo;
- typedef DNodo *DList;
- void mostrar (DList lista){
- DList anterior = NULL, auxiliar = lista;
- for(;lista!=NULL;lista = lista->puntero ^ (uintptr_t) anterior, anterior = auxiliar, auxiliar = lista)
- printf("%d ",lista->dato);
- printf("\n\n");
- }
- DList agregar_final(DList lista, int dato) {
- DList nuevoNodo = (DList) malloc(sizeof(DNodo));
- nuevoNodo->dato = dato;
- if (lista == NULL){
- nuevoNodo -> puntero = 0;
- return nuevoNodo;
- }
- DList nodo = lista, anterior = NULL, auxiliar = lista;
- for (;nodo != NULL; nodo = nodo->puntero ^ (uintptr_t)anterior, anterior = auxiliar, auxiliar = nodo);
- anterior -> puntero = anterior->puntero ^ (uintptr_t)nuevoNodo;
- nuevoNodo -> puntero = (uintptr_t) anterior ^ 0;
- return lista;
- }
- DList agregar_inicio(DList lista, int dato) {
- DList nuevoNodo = (DList) malloc(sizeof(DNodo));
- nuevoNodo->dato = dato;
- if(lista == NULL)
- nuevoNodo->puntero = 0;
- else{
- nuevoNodo->puntero = (uintptr_t)lista;
- lista->puntero = (uintptr_t) lista->puntero ^ (uintptr_t) nuevoNodo;
- }
- return nuevoNodo;
- }
- int main() {
- DList inicio = NULL;
- printf("Anduvo\n");
- inicio = agregar_inicio(inicio, 3);
- mostrar(inicio);
- inicio = agregar_inicio(inicio, 2);
- mostrar(inicio);
- inicio = agregar_inicio(inicio, 1);
- mostrar(inicio);
- printf("Anduvo\n");
- inicio = agregar_final(inicio, 4);
- inicio = agregar_final(inicio, 5);
- mostrar(inicio);
- return 0;
- }
- ///EJERCICIO 9
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "slist.h"
- #define CANT_COMANDOS 14
- typedef struct Lista{
- char nombre[15];
- SList nodos;
- }Lista;
- char *lista_comandos[CANT_COMANDOS];
- Lista ** Matriz = NULL;
- int cantidad_listas = 0;
- static void imprimir_entero(int dato) {
- printf("%d ", dato);
- }
- int mayor (int a, int b){
- return a>b;}
- SList slist_crear() {
- return NULL;
- }
- void slist_destruir(SList lista) {
- SNodo *nodoAEliminar;
- while (lista != NULL) {
- nodoAEliminar = lista;
- lista = lista->sig;
- free(nodoAEliminar);
- }
- }
- int slist_vacia(SList lista) {
- return lista == NULL;
- }
- SList slist_agregar_final(SList lista, int dato) {
- SNodo *nuevoNodo = (SNodo *) malloc(sizeof(SNodo));
- nuevoNodo->dato = dato;
- nuevoNodo->sig = NULL;
- if (lista == NULL)
- return nuevoNodo;
- SList nodo = lista;
- for (;nodo->sig != NULL;nodo = nodo->sig);
- /* ahora 'nodo' apunta al ultimo elemento en la lista */
- nodo->sig = nuevoNodo;
- return lista;
- }
- SList slist_agregar_inicio(SList lista, int dato) {
- SNodo *nuevoNodo = (SNodo *) malloc(sizeof(SNodo));
- nuevoNodo->dato = dato;
- nuevoNodo->sig = lista;
- return nuevoNodo;
- }
- void slist_recorrer(SList lista, FuncionVisitante visit) {
- for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
- visit(nodo->dato);
- }
- int slist_longitud (SList lista){
- int contador = 0;
- for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
- contador++;
- return contador;
- }
- SList slist_concatenar (SList lista1, SList lista2) {
- for (; lista2 != NULL; lista2 = lista2->sig)
- lista1 = slist_agregar_final(lista1, lista2->dato);
- return lista1;
- }
- SList slist_insertar (SList lista, int dato, int posicion){
- if(slist_longitud(lista) < posicion || posicion < 0)
- return lista;
- if (lista == NULL)
- return slist_agregar_inicio(lista, dato);
- int bandera = 1;
- SList backup = lista;
- for (;bandera<posicion; bandera++ , lista = lista->sig);
- SNodo *nuevoNodo = (SNodo *) malloc(sizeof(SNodo));
- nuevoNodo->dato = dato;
- nuevoNodo->sig = lista->sig;
- lista->sig = nuevoNodo;
- return backup;
- }
- SList slist_eliminar(SList lista, int posicion) {
- if (lista == NULL || slist_longitud(lista) < posicion || posicion < 0)
- return lista;
- SNodo* pepe;
- if (posicion == 0){
- pepe = lista;
- lista = lista->sig;
- free(pepe);
- return lista;
- }
- int indice = 1;
- SList back = lista;
- for (; indice < posicion; indice++, lista = lista->sig);
- pepe = lista->sig;
- lista->sig = lista->sig->sig;
- free(pepe);
- return back;
- }
- int slist_contiene(SList lista, int dato) {
- for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
- if (nodo->dato == dato) return 1;
- return 0;
- }
- void slist_indice (SList lista, int dato) {
- int flag = 0;
- for (int indice = 0; lista != NULL; lista = lista->sig, indice++)
- if (lista->dato == dato){
- printf("%d ",indice);
- flag = 1;
- }
- if (flag)
- printf("\n");
- else
- printf("El elemento buscado no existe en la lista.\n");
- }
- SList slist_intersecar (SList lista1, SList lista2) {
- SList nuevo = slist_crear();
- if(lista1 == NULL || lista2 == NULL)
- return nuevo;
- for(;lista1 != NULL;lista1 = lista1->sig)
- if(! (slist_contiene(nuevo, lista1->dato)) && slist_contiene(lista2, lista1->dato))
- nuevo = slist_agregar_final(nuevo, lista1->dato);
- return nuevo;
- }
- int slist_contiene_custom (SList lista, int dato, int (*comparador) (int, int)) {
- for (SNodo *nodo = lista; nodo != NULL; nodo = nodo->sig)
- if (comparador(nodo->dato, dato)) return 1;
- return 0;
- }
- SList slist_intersecar_custom (SList lista1, SList lista2, int (*comparador) (int, int)) {
- SList nuevo = slist_crear();
- if(lista1 == NULL || lista2 == NULL)
- return nuevo;
- for(;lista1 != NULL;lista1 = lista1->sig)
- if (! (slist_contiene(nuevo, lista1->dato)) && slist_contiene_custom(lista2, lista1->dato, comparador))
- nuevo = slist_agregar_final (nuevo, lista1->dato);
- return nuevo;
- }
- void slist_ordenar (SList lista, int (*comparador) (int, int)){
- int largo = slist_longitud(lista), aux;
- SList puntero;
- for(int i=largo-1; i>0; i--){
- puntero=lista;
- for(int j=0; j<i; puntero = puntero->sig, j++)
- if(comparador(puntero->dato, puntero->sig->dato)){
- aux = puntero->dato;
- puntero->dato = puntero->sig->dato;
- puntero->sig->dato = aux;
- }
- }
- }
- SList slist_reverso (SList lista) {
- SList nuevo = slist_crear();
- for(;lista != NULL;lista = lista->sig)
- nuevo = slist_agregar_inicio(nuevo, lista->dato);
- return nuevo;
- }
- SList slist_intercalar (SList lista1, SList lista2){
- int oscilador = 0;
- SList nueva = slist_crear();
- for(;lista1 != NULL && lista2!= NULL; oscilador++){
- if(oscilador % 2){
- nueva = slist_agregar_final(nueva, lista2->dato);
- lista2 = lista2->sig;
- }
- else{
- nueva = slist_agregar_final(nueva, lista1->dato);
- lista1 = lista1->sig;
- }
- }
- for(;lista1 != NULL; lista1 = lista1->sig)
- nueva = slist_agregar_final(nueva, lista1->dato);
- for(;lista2 != NULL; lista2 = lista2->sig)
- nueva = slist_agregar_final(nueva, lista2->dato);
- return nueva;
- }
- int char_a_int (char * cadena){
- int resultado=0, i=0;
- if(cadena[0]=='-') i++;
- for(; cadena[i]!='\0';i++){
- resultado*=10;
- resultado += (cadena[i] - '0');
- }
- if(cadena[0] == '-')
- return -1 * resultado;
- return resultado;
- }
- void inicializar_comandos(){
- lista_comandos[0]="salir";
- lista_comandos[1]="crear";
- lista_comandos[2]="destruir";
- lista_comandos[3]="imprimir";
- lista_comandos[4]="agregar_final";
- lista_comandos[5]="agregar_inicio";
- lista_comandos[6]="agregar_pos";
- lista_comandos[7]="longitud";
- lista_comandos[8]="concatenar";
- lista_comandos[9]="eliminar";
- lista_comandos[10]="contiene";
- lista_comandos[11]="indice";
- lista_comandos[12]="intersecar";
- lista_comandos[13]="ordenar";
- }
- void copiar_nombre (char * buffer, char * nombre, int inicio){
- int i;
- for(i=0; buffer[i+inicio]!=' ' && buffer[i+inicio] != '\0'; i++)
- nombre[i] = buffer[i+inicio];
- nombre[i] = '\0';
- }
- int existe_lista (char * nombre){
- int i;
- for(i=0; i < cantidad_listas; i++)
- if(!strcmp(nombre, Matriz[i]->nombre))
- return i;
- return -1;
- }
- void ingresar_comando (char * buffer){
- int i=0;
- char caracter;
- while((caracter=getchar()) != '\n')
- buffer[i++] = caracter;
- buffer[i]= '\0';
- }
- int leer_comando (char * buffer){
- int i=0, j=0, flag=0;
- for(i=0;i<CANT_COMANDOS;i++){
- flag=1;
- for(j=0;lista_comandos[i][j]!='\0';j++)
- if(buffer[j]!=lista_comandos[i][j]){
- flag = 0;
- break;}
- if(flag) return i;
- }
- return -1;}
- int interpretar_comando (char * buffer){
- int resultado = leer_comando(buffer), existe, existe2, existe3, flag;
- char posible_nombre[15], posible_nombre2[15], posible_nombre3[15], posible_numero[15], posible_posicion[15];
- int dato, posicion;
- switch(resultado){
- case 0:
- printf("Bye bye! \n");
- break;
- case 1:
- copiar_nombre(buffer, posible_nombre, 6);
- existe = existe_lista(posible_nombre);
- if(existe != -1)
- return -1;
- cantidad_listas++;
- Matriz = (Lista **) realloc (Matriz, (sizeof(Lista *) * cantidad_listas));
- Matriz[cantidad_listas-1] = (Lista *) malloc (sizeof(Lista));
- strcpy(Matriz[cantidad_listas-1]->nombre,posible_nombre);
- Matriz[cantidad_listas-1]->nodos = slist_crear();
- break;
- case 2:
- copiar_nombre(buffer, posible_nombre, 9);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- slist_destruir(Matriz[existe]->nodos);
- free(Matriz[existe]);
- for(; existe < cantidad_listas - 1 ; existe++)
- Matriz[existe] = Matriz[existe+1];
- Matriz = (Lista **) realloc (Matriz, sizeof(Lista *) * (cantidad_listas-1) );
- cantidad_listas--;
- break;
- case 3:
- copiar_nombre(buffer, posible_nombre, 9);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- slist_recorrer(Matriz[existe]->nodos, imprimir_entero);
- printf("\n");
- break;
- case 4:
- copiar_nombre(buffer, posible_nombre, 14);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- copiar_nombre(buffer, posible_numero, 14 + strlen(posible_nombre) + 1);
- dato = char_a_int(posible_numero);
- Matriz[existe]->nodos = slist_agregar_final(Matriz[existe]->nodos, dato);
- break;
- case 5:
- copiar_nombre(buffer, posible_nombre, 15);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- copiar_nombre(buffer, posible_numero, 15 + strlen(posible_nombre) + 1);
- dato = char_a_int(posible_numero);
- Matriz[existe]->nodos = slist_agregar_inicio(Matriz[existe]->nodos, dato);
- break;
- case 6:
- copiar_nombre(buffer, posible_nombre, 12);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- copiar_nombre(buffer, posible_numero, 12 + strlen(posible_nombre) + 1);
- dato = char_a_int(posible_numero);
- copiar_nombre(buffer, posible_posicion, 12 + strlen(posible_nombre) + 1 + strlen(posible_numero) + 1);
- posicion = char_a_int(posible_posicion);
- Matriz[existe]->nodos = slist_insertar(Matriz[existe]->nodos, dato, posicion);
- break;
- case 7:
- copiar_nombre(buffer, posible_nombre, 9);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- printf("%d \n", slist_longitud(Matriz[existe]->nodos));
- break;
- case 8:
- copiar_nombre(buffer, posible_nombre, 11);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- copiar_nombre(buffer, posible_nombre2, 11 + strlen(posible_nombre) + 1);
- existe2 = existe_lista(posible_nombre2);
- if(existe2 == -1)
- return -1;
- copiar_nombre(buffer, posible_nombre3, 11 + strlen(posible_nombre) + 1 + strlen(posible_nombre2) + 1);
- existe3 = existe_lista(posible_nombre3);
- if(existe3 != -1)
- return -1;
- cantidad_listas++;
- Matriz = (Lista **) realloc (Matriz, (sizeof(Lista *) * cantidad_listas));
- Matriz[cantidad_listas-1] = (Lista *) malloc (sizeof(Lista));
- strcpy(Matriz[cantidad_listas-1]->nombre,posible_nombre3);
- Matriz[cantidad_listas-1]->nodos = slist_crear();
- Matriz[cantidad_listas-1]->nodos = slist_concatenar(Matriz[existe]->nodos, Matriz[existe2]->nodos);
- break;
- case 9:
- copiar_nombre(buffer, posible_nombre, 9);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- copiar_nombre(buffer, posible_numero, 9 + strlen(posible_nombre) + 1);
- dato = char_a_int(posible_numero);
- Matriz[existe]->nodos = slist_eliminar(Matriz[existe]->nodos, dato);
- break;
- case 10:
- copiar_nombre(buffer, posible_nombre, 9);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- copiar_nombre(buffer, posible_numero, 9 + strlen(posible_nombre) + 1);
- dato = char_a_int(posible_numero);
- flag = slist_contiene(Matriz[existe]->nodos, dato);
- if (flag)
- printf("SI\n");
- else
- printf("NO\n");
- break;
- case 11:
- copiar_nombre(buffer, posible_nombre, 7);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- copiar_nombre(buffer, posible_numero, 7 + strlen(posible_nombre) + 1);
- dato = char_a_int(posible_numero);
- slist_indice(Matriz[existe]->nodos, dato);
- break;
- case 12:
- copiar_nombre(buffer, posible_nombre, 11);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- copiar_nombre(buffer, posible_nombre2, 11 + strlen(posible_nombre) + 1);
- existe2 = existe_lista(posible_nombre2);
- if(existe2 == -1)
- return -1;
- copiar_nombre(buffer, posible_nombre3, 11 + strlen(posible_nombre) + 1 + strlen(posible_nombre2) + 1);
- existe3 = existe_lista(posible_nombre3);
- if(existe3 != -1)
- return -1;
- cantidad_listas++;
- Matriz = (Lista **) realloc (Matriz, (sizeof(Lista *) * cantidad_listas));
- Matriz[cantidad_listas-1] = (Lista *) malloc (sizeof(Lista));
- strcpy(Matriz[cantidad_listas-1]->nombre,posible_nombre3);
- Matriz[cantidad_listas-1]->nodos = slist_crear();
- Matriz[cantidad_listas-1]->nodos = slist_intersecar(Matriz[existe]->nodos, Matriz[existe2]->nodos);
- break;
- case 13:
- copiar_nombre(buffer, posible_nombre, 8);
- existe = existe_lista(posible_nombre);
- if(existe == -1)
- return -1;
- slist_ordenar(Matriz[existe]->nodos, mayor);
- break;
- }
- return resultado;
- }
- int main() {
- char buffer[50];
- int condicion = 1;
- inicializar_comandos();
- printf("Welcome to the house of fun\n\n");
- while(condicion){
- ingresar_comando(buffer);
- condicion = interpretar_comando(buffer);
- if (condicion == -1)
- printf("ERROR \n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement