evenements
parent
f6ef3626c1
commit
2be9ba66f2
@ -0,0 +1,32 @@
|
|||||||
|
// change la possibilité d'entrer une ville pour l'offre
|
||||||
|
// cas où l'offre est à pourvoir en full remote
|
||||||
|
document.getElementById("fullRemote").addEventListener("change", function () {
|
||||||
|
var villeInput = document.getElementById("ville");
|
||||||
|
villeInput.disabled = this.checked;
|
||||||
|
//var ville = document.getElementById('')
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
|
const form = document.querySelector("form");
|
||||||
|
const submitButton = document.querySelector('input[type="submit"]');
|
||||||
|
|
||||||
|
// Fonction pour vérifier si tous les champs du formulaire sont remplis
|
||||||
|
function checkFormFields() {
|
||||||
|
const inputs = form.querySelectorAll('input, textarea, select');
|
||||||
|
let allFieldsFilled = true;
|
||||||
|
|
||||||
|
inputs.forEach(function(input) {
|
||||||
|
if (!input.value) {
|
||||||
|
allFieldsFilled = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
submitButton.disabled = !allFieldsFilled;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Écoute les événements de saisie dans les champs du formulaire
|
||||||
|
form.addEventListener("input", checkFormFields);
|
||||||
|
|
||||||
|
// Appelle la fonction initiale pour la première vérification
|
||||||
|
checkFormFields();
|
||||||
|
});
|
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App;
|
||||||
|
|
||||||
|
use Twig\Extension\AbstractExtension;
|
||||||
|
use Twig\TwigFilter;
|
||||||
|
|
||||||
|
class TwigExtensions extends AbstractExtension
|
||||||
|
{
|
||||||
|
public function getFilters()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
new TwigFilter('base64', [$this, 'twig_base64_filter']),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function twig_base64_filter($source)
|
||||||
|
{
|
||||||
|
if ($source !== null) {
|
||||||
|
return base64_encode($source);
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\gateway;
|
||||||
|
|
||||||
|
use App\metier\Image;
|
||||||
|
use PDO;
|
||||||
|
|
||||||
|
class ImageGateway
|
||||||
|
{
|
||||||
|
private Connection $con;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $con
|
||||||
|
*/
|
||||||
|
public function __construct(Connection $con)
|
||||||
|
{
|
||||||
|
$this->con = $con;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function insertImage(Image $img)
|
||||||
|
{
|
||||||
|
$query = "INSERT INTO Image (`nom`, `taille`, `type`, `blob`) VALUES ( :n, :t, :ty, :b)";
|
||||||
|
$this->con->executeQuery($query, array(
|
||||||
|
':n' => array($img->getName(), PDO::PARAM_STR),
|
||||||
|
':t' => array($img->getTaille(), PDO::PARAM_STR),
|
||||||
|
':ty' => array($img->getType(), PDO::PARAM_STR),
|
||||||
|
':b' => array($img->getBlob(), PDO::PARAM_STR)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete(int $id)
|
||||||
|
{
|
||||||
|
$query = 'DELETE FROM Image WHERE id=:i';
|
||||||
|
$this->con->executeQuery($query, array(
|
||||||
|
':i' => array($id, PDO::PARAM_INT)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function obtenirParId(int $id) : array
|
||||||
|
{
|
||||||
|
$query = 'SELECT * FROM Image WHERE id=:i';
|
||||||
|
$this->con->executeQuery($query, array(
|
||||||
|
':i' => array($id, PDO::PARAM_INT)
|
||||||
|
));
|
||||||
|
return $this->con->getResults();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function trouverParNom(string $nom)
|
||||||
|
{
|
||||||
|
$query = 'SELECT * FROM Image WHERE nom=:n';
|
||||||
|
$this->con->executeQuery($query, array(
|
||||||
|
':n' => array($nom, PDO::PARAM_STR)
|
||||||
|
));
|
||||||
|
return $this->con->getResults();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNewId() : int
|
||||||
|
{
|
||||||
|
$query = 'SELECT MAX(id) FROM Image';
|
||||||
|
$this->con->executeQuery($query);
|
||||||
|
$res = $this->con->getResults();
|
||||||
|
if ($res[0]['MAX(id)'] === null) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return intval($res[0]['MAX(id)'])+1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function obtenirToutesImages()
|
||||||
|
{
|
||||||
|
$query = 'SELECT * FROM Image';
|
||||||
|
$this->con->executeQuery($query);
|
||||||
|
$res = $this->con->getResults();
|
||||||
|
$array = [];
|
||||||
|
foreach ($res as $r) {
|
||||||
|
$array[] = new Image($this->getNewId(),$r['nom'], $r['taille'], $r['type'], $r['blob']);
|
||||||
|
}
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -0,0 +1,118 @@
|
|||||||
|
<?php
|
||||||
|
namespace App\metier;
|
||||||
|
use App\metier\Alumni;
|
||||||
|
|
||||||
|
class Evenement
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var int Identifiant
|
||||||
|
*/
|
||||||
|
private int $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Alumni Organisateur
|
||||||
|
*/
|
||||||
|
private Alumni $organisateur;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string Titre Evenement
|
||||||
|
*/
|
||||||
|
private string $titre;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string Description de l'evenement
|
||||||
|
*/
|
||||||
|
private string $description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string Date de l'evenement
|
||||||
|
*/
|
||||||
|
private string $date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int Nombre maximal d'inscrits
|
||||||
|
*/
|
||||||
|
private int $nbPlaceMax;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Image Image de l'evenement
|
||||||
|
*/
|
||||||
|
private Image $image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $id
|
||||||
|
* @param Alumni $organisateur
|
||||||
|
* @param string $titre
|
||||||
|
* @param string $description
|
||||||
|
* @param string $date
|
||||||
|
* @param int $nbPlaceMax
|
||||||
|
* @param Image $image
|
||||||
|
*/
|
||||||
|
public function __construct(int $id, Alumni $organisateur, string $titre, string $description, string $date, int $nbPlaceMax, Image $image)
|
||||||
|
{
|
||||||
|
$this->id = $id;
|
||||||
|
$this->organisateur = $organisateur;
|
||||||
|
$this->titre = $titre;
|
||||||
|
$this->description = $description;
|
||||||
|
$this->date = $date;
|
||||||
|
$this->nbPlaceMax = $nbPlaceMax;
|
||||||
|
$this->image = $image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getId(): int
|
||||||
|
{
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Alumni
|
||||||
|
*/
|
||||||
|
public function getOrganisateur(): Alumni
|
||||||
|
{
|
||||||
|
return $this->organisateur;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTitre(): string
|
||||||
|
{
|
||||||
|
return $this->titre;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return $this->description;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDate(): string
|
||||||
|
{
|
||||||
|
return $this->date;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getNbPlaceMax(): int
|
||||||
|
{
|
||||||
|
return $this->nbPlaceMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Image
|
||||||
|
*/
|
||||||
|
public function getImage(): Image
|
||||||
|
{
|
||||||
|
return $this->image;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\metier;
|
||||||
|
|
||||||
|
class Image
|
||||||
|
{
|
||||||
|
private int $id;
|
||||||
|
private string $name;
|
||||||
|
|
||||||
|
private string $taille;
|
||||||
|
|
||||||
|
private string $type;
|
||||||
|
|
||||||
|
private string $blob;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $id
|
||||||
|
* @param string $name
|
||||||
|
* @param string $taille
|
||||||
|
* @param string $type
|
||||||
|
* @param string $blob
|
||||||
|
*/
|
||||||
|
public function __construct(int $id, string $name, string $taille, string $type, string $blob)
|
||||||
|
{
|
||||||
|
$this->id = $id;
|
||||||
|
$this->name = $name;
|
||||||
|
$this->taille = $taille;
|
||||||
|
$this->type = $type;
|
||||||
|
$this->blob = $blob;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getName(): string
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getTaille(): string
|
||||||
|
{
|
||||||
|
return $this->taille;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getType(): string
|
||||||
|
{
|
||||||
|
return $this->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBlob(): string
|
||||||
|
{
|
||||||
|
return $this->blob;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getId() : string
|
||||||
|
{
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function toString() : string {
|
||||||
|
return "Image : " . $this->name . " " . $this->taille . " " . $this->type . " blob " . $this->blob;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace App\modele;
|
namespace App\metier;
|
||||||
enum Role
|
enum Role
|
||||||
{
|
{
|
||||||
case Admin;
|
case Admin;
|
@ -1,95 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace App\modele;
|
|
||||||
|
|
||||||
class Evenement
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var int Identifiant
|
|
||||||
*/
|
|
||||||
private int $id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Nom Evenement
|
|
||||||
*/
|
|
||||||
private string $nom;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Date de l'evenement
|
|
||||||
*/
|
|
||||||
private string $date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Alumni Organisateur
|
|
||||||
*/
|
|
||||||
private Alumni $organisateur;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array Liste des Participants
|
|
||||||
*/
|
|
||||||
private array $participants;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int Nombre maximal d'inscrits
|
|
||||||
*/
|
|
||||||
private int $nbInscriptionMax;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Url de l'image
|
|
||||||
*/
|
|
||||||
private string $imageUrl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $id
|
|
||||||
* @param string $nom
|
|
||||||
* @param string $date
|
|
||||||
* @param Alumni $organisateur
|
|
||||||
* @param array $participants
|
|
||||||
* @param int $nbInscriptionMax
|
|
||||||
* @param string $imageUrl
|
|
||||||
*/
|
|
||||||
public function __construct(int $id, string $nom, string $date, Alumni $organisateur, array $participants, int $nbInscriptionMax, string $imageUrl)
|
|
||||||
{
|
|
||||||
$this->id = $id;
|
|
||||||
$this->nom = $nom;
|
|
||||||
$this->date = $date;
|
|
||||||
$this->organisateur = $organisateur;
|
|
||||||
$this->participants = $participants;
|
|
||||||
$this->nbInscriptionMax = $nbInscriptionMax;
|
|
||||||
$this->imageUrl = $imageUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getId(): int
|
|
||||||
{
|
|
||||||
return $this->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getNom() : string
|
|
||||||
{
|
|
||||||
return $this->nom;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getDate() : string
|
|
||||||
{
|
|
||||||
return $this->date;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getParticipants() : array
|
|
||||||
{
|
|
||||||
return $this->participants;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getOrganisateur(): Alumni
|
|
||||||
{
|
|
||||||
return $this->organisateur;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getNbInscriptionMax(): int
|
|
||||||
{
|
|
||||||
return $this->nbInscriptionMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getImageUrl(): string
|
|
||||||
{
|
|
||||||
return $this->imageUrl;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\modele;
|
||||||
|
|
||||||
|
use App\gateway\Connection;
|
||||||
|
use App\metier\Image;
|
||||||
|
use App\gateway\ImageGateway;
|
||||||
|
class ImageModele
|
||||||
|
{
|
||||||
|
private ImageGateway $gw;
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->gw = new ImageGateway(new Connection("mysql:host=localhost;dbname=dbAlica","test","test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function publierImage() : Image
|
||||||
|
{
|
||||||
|
$img = new Image($this->gw->getNewId(),
|
||||||
|
$_FILES["image"]["name"],
|
||||||
|
$_FILES["image"]["size"],
|
||||||
|
$_FILES["image"]["type"],
|
||||||
|
file_get_contents($_FILES["image"]["tmp_name"]));
|
||||||
|
|
||||||
|
$this->gw->insertImage($img);
|
||||||
|
|
||||||
|
return $img;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function insertImage(Image $img)
|
||||||
|
{
|
||||||
|
$this->gw->insertImage($img);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function obtenirParId(int $id)
|
||||||
|
{
|
||||||
|
$this->gw->obtenirParId($id);
|
||||||
|
$res = $this->gw->obtenirToutesImages();
|
||||||
|
return new Image($this->gw->getNewId(),$res[0]['nom'], $res[0]['taille'], $res[0]['type'], $res[0]['blob']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function obtenirToutesImages() : array
|
||||||
|
{
|
||||||
|
$this->gw->obtenirToutesImages();
|
||||||
|
$res = $this->gw->obtenirToutesImages();
|
||||||
|
|
||||||
|
foreach ($res as $r) {
|
||||||
|
$array[] = new Image($this->gw->getNewId(),$r['nom'], $r['taille'], $r['type'], $r['blob']);
|
||||||
|
}
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\modele;
|
||||||
|
|
||||||
|
use App\gateway\AlumniGateway;
|
||||||
|
use App\gateway\Connection;
|
||||||
|
use App\gateway\ImageGateway;
|
||||||
|
use App\gateway\OffreGateway;
|
||||||
|
use App\metier\Alumni;
|
||||||
|
use App\metier\Offre;
|
||||||
|
use App\metier\Image;
|
||||||
|
|
||||||
|
class OffreModele
|
||||||
|
{
|
||||||
|
|
||||||
|
private OffreGateway $offreGw;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->offreGw = new OffreGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function publierOffre(Image $img)
|
||||||
|
{
|
||||||
|
|
||||||
|
$desc = $_POST["description"];
|
||||||
|
$descposte = $_POST["descriptPoste"];
|
||||||
|
$nom = $_POST["name"];
|
||||||
|
$ville = $_POST["ville"];
|
||||||
|
$entreprise = $_POST["entreprise"];
|
||||||
|
$profilRecherche = $_POST["profilRecherche"];
|
||||||
|
$mail = $_POST["mail"];
|
||||||
|
$num = $_POST["num"];
|
||||||
|
$site = $_POST["site"];
|
||||||
|
$exp = $_POST["choixExp"];
|
||||||
|
|
||||||
|
$typeContrat = $_POST["typeContrat"];
|
||||||
|
/* $typeContrat = match ($_POST["typeContrat"]) {
|
||||||
|
"Stage" => TypeContrat::Stage,
|
||||||
|
"CDI" => TypeContrat::CDI,
|
||||||
|
"CDD" => TypeContrat::CDD,
|
||||||
|
"Alternance" => TypeContrat::Alternance,
|
||||||
|
default => TypeContrat::CDD,
|
||||||
|
};*/
|
||||||
|
|
||||||
|
$niveauEtudes = $_POST["education"];
|
||||||
|
/* $niveauEtudes = match ($_POST["education"]) {
|
||||||
|
"Bac+2" => NiveauEtudes::Bac2,
|
||||||
|
"Bac+3" => NiveauEtudes::Bac3,
|
||||||
|
"Bac+5" => NiveauEtudes::Bac5,
|
||||||
|
default => NiveauEtudes::Indifferent,
|
||||||
|
};*/
|
||||||
|
|
||||||
|
if(isset($_POST["fullRemote"]))
|
||||||
|
{
|
||||||
|
$remote = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$remote = false;
|
||||||
|
}
|
||||||
|
// à la place de NULL passer id utilisateur créateur offre
|
||||||
|
$offre = new Offre($this->offreGw->getMaxid(),
|
||||||
|
new Alumni(12,"test.mail@icloud.fr","password","admin"),
|
||||||
|
$nom,
|
||||||
|
$desc,
|
||||||
|
$img,
|
||||||
|
$typeContrat,
|
||||||
|
$ville,
|
||||||
|
$entreprise,
|
||||||
|
$descposte,
|
||||||
|
$profilRecherche,
|
||||||
|
$exp,
|
||||||
|
$niveauEtudes,
|
||||||
|
$mail,
|
||||||
|
$num,
|
||||||
|
$site,
|
||||||
|
$remote);
|
||||||
|
$this->offreGw->ajouterOffre($offre);
|
||||||
|
|
||||||
|
}
|
||||||
|
public function obtenirOffres() : array
|
||||||
|
{
|
||||||
|
$alGw = new AlumniGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test"));
|
||||||
|
$imgGw = new ImageGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test"));
|
||||||
|
$res = $this->offreGw->obtenirOffres();
|
||||||
|
$offres=[];
|
||||||
|
|
||||||
|
foreach ($res as $row)
|
||||||
|
{
|
||||||
|
$res = $imgGw->obtenirParId($row['image']);
|
||||||
|
$img = new Image(intval($res[0]["id"]),$res[0]['nom'], $res[0]['taille'], $res[0]['type'], $res[0]['blob']);
|
||||||
|
|
||||||
|
$resal = $alGw->findById($row['offreur']);
|
||||||
|
$alumni = new Alumni($resal[0]['id'],$resal[0]['mail'],$resal[0]['mdp'],$resal[0]['role']);
|
||||||
|
|
||||||
|
$offres[]= new Offre($row['id'],
|
||||||
|
$alumni,
|
||||||
|
$row['titre'],
|
||||||
|
$row['description'],
|
||||||
|
$img,
|
||||||
|
$row['typeContrat'],
|
||||||
|
$row['ville'],
|
||||||
|
$row["entreprise"],
|
||||||
|
$row['descriptifPoste'],
|
||||||
|
$row['profil'],
|
||||||
|
$row['experience'],
|
||||||
|
$row['niveauEtudes'],
|
||||||
|
$row['mailContact'],
|
||||||
|
$row['numero'],
|
||||||
|
$row['websiteURL'],
|
||||||
|
$row['remote']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $offres;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Liste des Événements</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Liste des Événements</h1>
|
||||||
|
<ul>
|
||||||
|
{% for evenement in evenements %}
|
||||||
|
<li>
|
||||||
|
<h2>{{ evenement.titre }}</h2>
|
||||||
|
<p><strong>Organisateur:</strong> {{ evenement.organisateur.nom }}</p>
|
||||||
|
<p><strong>Date:</strong> {{ evenement.date }}</p>
|
||||||
|
<p><strong>Description:</strong> {{ evenement.description }}</p>
|
||||||
|
<img src="data:image/png;base64,{{ evenement.getImage().getBlob() | base64 }}" width="250px">
|
||||||
|
<p><strong>Places disponibles:</strong> {{ evenement.nbPlaceMax }}</p>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in new issue