Add: backend dir and moved frontend to frontend dir
19
.gitignore
vendored
@@ -1,4 +1,15 @@
|
||||
.env
|
||||
node_modules/
|
||||
dist/
|
||||
package-lock.json
|
||||
frontend/.env
|
||||
frontend/node_modules/
|
||||
frontend/dist/
|
||||
frontend/package-lock.json
|
||||
|
||||
backend/target/
|
||||
backend/.mvn/wrapper/maven-wrapper.jar
|
||||
backend/!**/src/main/**/target/
|
||||
backend/!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
backend/.idea
|
||||
backend/*.iws
|
||||
backend/*.iml
|
||||
backend/*.ipr
|
||||
|
||||
3
backend/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
wrapperVersion=3.3.4
|
||||
distributionType=only-script
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip
|
||||
95
backend/pom.xml
Normal file
@@ -0,0 +1,95 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>4.0.2</version>
|
||||
<relativePath/>
|
||||
</parent>
|
||||
|
||||
<groupId>es.adeptusminiaturium</groupId>
|
||||
<artifactId>backend</artifactId>
|
||||
|
||||
<version>1.0.0</version>
|
||||
<name>backend</name>
|
||||
<description>Adeptus Miniaturium's online site</description>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>25</maven.compiler.source>
|
||||
<maven.compiler.target>25</maven.compiler.target>
|
||||
<java.version>25</java.version>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>gitea</id>
|
||||
<url>https://git.miarma.net/api/packages/Gallardo7761/maven</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<!-- Spring Boot -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mariadb.jdbc</groupId>
|
||||
<artifactId>mariadb-java-client</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<!-- JWT -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>0.11.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>0.11.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>0.11.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.miarma</groupId>
|
||||
<artifactId>backlib</artifactId>
|
||||
<version>1.1.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,12 @@
|
||||
package es.adeptusminiaturium.backend;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class BackendApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(BackendApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package es.adeptusminiaturium.backend.model;
|
||||
|
||||
public class Media {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package es.adeptusminiaturium.backend.model;
|
||||
|
||||
public class Post {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package es.adeptusminiaturium.backend.model;
|
||||
|
||||
public class Publication {
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package es.adeptusminiaturium.backend.model;
|
||||
|
||||
public class User {
|
||||
}
|
||||
16
backend/src/main/resources/application-dev.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
server:
|
||||
port: 8080
|
||||
servlet:
|
||||
context-path: /v1/
|
||||
|
||||
spring:
|
||||
datasource:
|
||||
url: jdbc:mariadb://localhost:3306/miniaturium
|
||||
username: admin
|
||||
password: ${DB_PASS}
|
||||
driver-class-name: org.mariadb.jdbc.Driver
|
||||
|
||||
logging:
|
||||
level:
|
||||
org.hibernate.SQL: DEBUG
|
||||
org.hibernate.orm.jdbc.bind: TRACE
|
||||
15
backend/src/main/resources/application-prod.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
server:
|
||||
port: 8080
|
||||
servlet:
|
||||
context-path: /v1/
|
||||
|
||||
spring:
|
||||
datasource:
|
||||
url: jdbc:mariadb://mariadb:3306/miniaturium
|
||||
username: ${DB_USER}
|
||||
password: ${DB_PASS}
|
||||
driver-class-name: org.mariadb.jdbc.Driver
|
||||
|
||||
logging:
|
||||
level:
|
||||
org.hibernate.SQL: WARN
|
||||
25
backend/src/main/resources/application.yaml
Normal file
@@ -0,0 +1,25 @@
|
||||
spring:
|
||||
application:
|
||||
name: backend
|
||||
|
||||
jpa:
|
||||
open-in-view: false
|
||||
hibernate:
|
||||
ddl-auto: validate
|
||||
properties:
|
||||
hibernate:
|
||||
jdbc:
|
||||
time_zone: UTC
|
||||
|
||||
jackson:
|
||||
default-property-inclusion: non_null
|
||||
time-zone: Europe/Madrid
|
||||
|
||||
jwt:
|
||||
expiration-ms: 3600000
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info
|
||||
|
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 237 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 233 KiB After Width: | Height: | Size: 233 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
415
index-orig.html
@@ -1,415 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="es">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Adeptus Miniaturium | Sanctus Painting</title>
|
||||
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: 'Share Tech Mono';
|
||||
src: url("https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700;900&family=Share+Tech+Mono&display=swap");
|
||||
}
|
||||
|
||||
:root {
|
||||
--void-black: #050505;
|
||||
--blood-god: #8a0b0b;
|
||||
--plasma-glow: #ff3333;
|
||||
--imperial-gold: #c6a34d;
|
||||
--dirty-gold: #8c7335;
|
||||
--plasteel: #2f353b;
|
||||
--mechanicus-green: #23382c;
|
||||
--parchment: #c2bbad;
|
||||
--crt-line: rgba(18, 16, 16, 0.5);
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Share Tech Mono', monospace; /* Rollo pantalla de datos */
|
||||
background-color: var(--void-black);
|
||||
color: var(--parchment);
|
||||
letter-spacing: 1px;
|
||||
overflow-x: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* EFECTO CRT / SCANLINES - Esto es bomba */
|
||||
body::after {
|
||||
content: " ";
|
||||
display: block;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06));
|
||||
z-index: 1000;
|
||||
background-size: 100% 2px, 3px 100%;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
header {
|
||||
background:
|
||||
linear-gradient(to bottom, rgba(0,0,0,0.9), rgba(0,0,0,0.5)),
|
||||
url('https://www.transparenttextures.com/patterns/dark-matter.png');
|
||||
border-bottom: 4px double var(--imperial-gold);
|
||||
padding: 40px 20px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,0.9);
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-family: 'Cinzel', serif;
|
||||
font-size: 3.5rem;
|
||||
font-weight: 900;
|
||||
color: var(--imperial-gold);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 5px;
|
||||
text-shadow: 0 0 15px rgba(198, 163, 77, 0.6);
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
header p {
|
||||
font-size: 1.2rem;
|
||||
color: var(--blood-god);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 3px;
|
||||
font-weight: bold;
|
||||
text-shadow: 0 0 5px var(--blood-god);
|
||||
}
|
||||
|
||||
/* NAVEGACION ESTILO PANEL DE CONTROL */
|
||||
nav {
|
||||
background-color: #0f1114;
|
||||
border-bottom: 1px solid var(--dirty-gold);
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 900;
|
||||
}
|
||||
|
||||
nav ul {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
list-style: none;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
nav li {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
nav a {
|
||||
display: block;
|
||||
padding: 15px 30px;
|
||||
text-decoration: none;
|
||||
color: #666;
|
||||
font-family: 'Cinzel', serif;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
transition: 0.3s;
|
||||
border-right: 1px solid #222;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
nav a:hover {
|
||||
color: var(--parchment);
|
||||
background-color: var(--blood-god);
|
||||
box-shadow: inset 0 0 10px #000;
|
||||
}
|
||||
|
||||
nav a::before {
|
||||
content: '[ ';
|
||||
opacity: 0;
|
||||
transition: 0.3s;
|
||||
color: var(--imperial-gold);
|
||||
}
|
||||
nav a::after {
|
||||
content: ' ]';
|
||||
opacity: 0;
|
||||
transition: 0.3s;
|
||||
color: var(--imperial-gold);
|
||||
}
|
||||
nav a:hover::before, nav a:hover::after {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
section {
|
||||
padding: 80px 20px;
|
||||
max-width: 1200px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
section h2 {
|
||||
font-family: 'Cinzel', serif;
|
||||
font-size: 2.5rem;
|
||||
margin-bottom: 40px;
|
||||
color: var(--parchment);
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
position: relative;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
/* Adornos a los lados del titulo */
|
||||
section h2::before, section h2::after {
|
||||
content: "+++";
|
||||
color: var(--dirty-gold);
|
||||
margin: 0 15px;
|
||||
font-size: 1.5rem;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* TARJETAS TECH-HERESY - Con esquinas recortadas */
|
||||
.card {
|
||||
background: #111;
|
||||
border: 1px solid var(--dirty-gold);
|
||||
padding: 40px;
|
||||
margin-bottom: 30px;
|
||||
position: relative;
|
||||
/* Recorte estilo Sci-Fi */
|
||||
clip-path: polygon(
|
||||
20px 0, 100% 0,
|
||||
100% calc(100% - 20px), calc(100% - 20px) 100%,
|
||||
0 100%, 0 20px
|
||||
);
|
||||
box-shadow: 0 0 15px rgba(0,0,0,0.8);
|
||||
}
|
||||
|
||||
/* Linea decorativa interior */
|
||||
.card::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 5px; left: 5px; right: 5px; bottom: 5px;
|
||||
border: 1px dashed #333;
|
||||
pointer-events: none;
|
||||
z-index: -1;
|
||||
clip-path: polygon(
|
||||
20px 0, 100% 0,
|
||||
100% calc(100% - 20px), calc(100% - 20px) 100%,
|
||||
0 100%, 0 20px
|
||||
);
|
||||
}
|
||||
|
||||
.card p {
|
||||
line-height: 1.6;
|
||||
margin-bottom: 20px;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
/* BOTONES PURITY SEAL */
|
||||
.btn-imperial {
|
||||
display: inline-block;
|
||||
padding: 15px 40px;
|
||||
background: #000;
|
||||
border: 1px solid var(--imperial-gold);
|
||||
color: var(--imperial-gold);
|
||||
font-family: 'Cinzel', serif;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2px;
|
||||
cursor: pointer;
|
||||
transition: 0.4s;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
|
||||
}
|
||||
|
||||
.btn-imperial:hover {
|
||||
background: var(--blood-god);
|
||||
color: #fff;
|
||||
border-color: var(--plasma-glow);
|
||||
box-shadow: 0 0 20px var(--blood-god);
|
||||
text-shadow: 0 0 5px #fff;
|
||||
}
|
||||
|
||||
/* GRID DE FOTOS */
|
||||
.grid-fotos {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||
gap: 30px;
|
||||
}
|
||||
|
||||
.foto-frame {
|
||||
position: relative;
|
||||
border: 2px solid var(--plasteel);
|
||||
padding: 5px;
|
||||
background: #000;
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
.foto-frame:hover {
|
||||
border-color: var(--imperial-gold);
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
.foto-placeholder {
|
||||
height: 300px;
|
||||
background: radial-gradient(circle, #222, #000);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
color: #444;
|
||||
border: 1px solid #222;
|
||||
}
|
||||
|
||||
.foto-placeholder span {
|
||||
font-size: 3rem;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.foto-caption {
|
||||
background: var(--plasteel);
|
||||
color: #aaa;
|
||||
padding: 10px;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
/* FORMULARIOS */
|
||||
form input, form textarea {
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
padding: 15px;
|
||||
background-color: rgba(0,0,0,0.7);
|
||||
border: 1px solid var(--plasteel);
|
||||
color: var(--imperial-gold);
|
||||
font-family: 'Share Tech Mono', monospace;
|
||||
font-size: 1rem;
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
form input:focus, form textarea:focus {
|
||||
outline: none;
|
||||
border-color: var(--blood-god);
|
||||
box-shadow: 0 0 10px rgba(138, 11, 11, 0.3);
|
||||
background-color: #000;
|
||||
}
|
||||
|
||||
/* FOOTER */
|
||||
footer {
|
||||
text-align: center;
|
||||
padding: 40px;
|
||||
background-color: #020202;
|
||||
border-top: 1px solid var(--dirty-gold);
|
||||
color: #555;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.skull-icon {
|
||||
font-size: 2rem;
|
||||
color: var(--parchment);
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
/* ANIMACIONES */
|
||||
@keyframes textFlicker {
|
||||
0% { opacity: 1; }
|
||||
95% { opacity: 1; }
|
||||
96% { opacity: 0.8; }
|
||||
97% { opacity: 1; }
|
||||
98% { opacity: 0.5; }
|
||||
99% { opacity: 1; }
|
||||
100% { opacity: 1; }
|
||||
}
|
||||
|
||||
h1, h2 {
|
||||
animation: textFlicker 5s infinite;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<header>
|
||||
<h1>Adeptus Miniaturium</h1>
|
||||
<p>Sanctificando Plástico para la Gloria del Imperio</p>
|
||||
</header>
|
||||
|
||||
<nav>
|
||||
<ul>
|
||||
<li><a href="#nexus">Nexus</a></li>
|
||||
<li><a href="#pict-capturas">Pict-Capturas</a></li>
|
||||
<li><a href="#vox-transmision">Vox-Comms</a></li>
|
||||
<li><a href="#datos-biologis">Magos Marcos</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<section id="nexus">
|
||||
<h2>+++ Inicializando Lógica +++</h2>
|
||||
<div class="card">
|
||||
<p style="color: var(--imperial-gold); font-size: 0.9rem;">// PENSAMIENTO DEL DÍA: LA ESPERANZA ES EL PRIMER PASO HACIA LA DECEPCIÓN.</p>
|
||||
<hr style="border: 0; border-top: 1px solid #333; margin: 20px 0;">
|
||||
<p>Bienvenido al manufactorum personal del <strong>Artífice Marcos</strong>. Aquí, las miniaturas grises son purgadas de su falta de color y bendecidas con pigmentos sagrados, lavados de Nuln Oil y pincel seco ritual.</p>
|
||||
<p>No pintamos juguetes. Forjamos veteranos de la Larga Guerra.</p>
|
||||
<br>
|
||||
<a href="#vox-transmision" class="btn-imperial">Iniciar Protocolo de Encargo</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="pict-capturas">
|
||||
<h2>+++ Archivos de Batalla +++</h2>
|
||||
<div class="grid-fotos">
|
||||
<div class="foto-frame">
|
||||
<div class="foto-placeholder">
|
||||
<span>☠</span>
|
||||
</div>
|
||||
<div class="foto-caption">Muestra A-1: Astartes Pattern</div>
|
||||
</div>
|
||||
<div class="foto-frame">
|
||||
<div class="foto-placeholder">
|
||||
<span>⚙</span>
|
||||
</div>
|
||||
<div class="foto-caption">Muestra B-2: Engine War</div>
|
||||
</div>
|
||||
<div class="foto-frame">
|
||||
<div class="foto-placeholder">
|
||||
<span>⚔</span>
|
||||
</div>
|
||||
<div class="foto-caption">Muestra C-3: Xenos Filth</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="vox-transmision">
|
||||
<h2>+++ Súplica al Manufactorum +++</h2>
|
||||
<div class="card">
|
||||
<p>Rellena los datos para solicitar la atención del Artífice. Sé preciso, el tiempo es un recurso limitado del Emperador.</p>
|
||||
<form>
|
||||
<input type="text" placeholder="Designación del Comandante (Nombre)">
|
||||
<input type="email" placeholder="Frecuencia Vox (Email)">
|
||||
<textarea rows="6" placeholder="Detalla los requerimientos de la misión: Esquema de color, Facción, Nivel de degradado..."></textarea>
|
||||
<button type="submit" class="btn-imperial">Transmitir a la Noosphere</button>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="datos-biologis">
|
||||
<h2>+++ Archivo: Magos Marcos +++</h2>
|
||||
<div class="card">
|
||||
<div style="display: flex; gap: 20px; flex-wrap: wrap;">
|
||||
<div style="flex: 1; min-width: 200px;">
|
||||
<p><strong>[ESTADO]</strong>: Operativo<br>
|
||||
<strong>[UBICACIÓN]</strong>: Sector Baeticus (Andalucía)<br>
|
||||
<strong>[ESPECIALIDAD]</strong>: Grimdark Realista, Weathering pesado, OSL.</p>
|
||||
<p>Marcos no pinta para que queden bonitos en la estantería. Pinta para que parezca que tus muñecos han sobrevivido a un bombardeo orbital en Istvaan V. Aquí hay barro, sangre y oscuridad.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||