diff --git a/.forgejo/workflows/main.yaml b/.forgejo/workflows/main.yaml
index e816e02..0d10297 100644
--- a/.forgejo/workflows/main.yaml
+++ b/.forgejo/workflows/main.yaml
@@ -14,7 +14,7 @@ jobs:
SPCD_TXT_LOCALE: ${{vars.SPCD_TXT_LOCALE}}
run: ${{vars.SPCD}}
- #- run: spcd-check-project
+ - run: spcd-check-project
- run: spcd-build-project
- run: spcd-browse-workspace
- run: spcd-synchronize
diff --git a/.gitignore b/.gitignore
index 0f8b689..e2e7327 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1 @@
-__pycache__
/out
diff --git a/build.py b/build.py
index 033a761..3f13417 100755
--- a/build.py
+++ b/build.py
@@ -1,916 +1,36 @@
#! /usr/bin/env python3
+"""Build resume."""
-import datetime
-import os
-import shutil
-import subprocess
+from os import sep
+from pathlib import Path
+from rwx import fs
+from rwx.ps import run
-def run(*args):
- subprocess.call(args)
-
-
-def main():
- time = datetime.datetime.now()
- time_id = time.strftime('%Y%m%d%H%M%S')
- style = 'css'
- script = 'js'
- root = os.path.dirname(os.path.realpath(__file__))
- input_directory = os.path.join(root, 'in')
- out = os.path.join(root, 'out')
- web = os.path.join(out, 'web')
- if os.path.exists(web):
- shutil.rmtree(web)
- os.makedirs(web)
- gen = os.path.join(web, time_id)
- css = os.path.join(gen, style)
- js = os.path.join(gen, script)
- #
- run('rsync', '--archive', f'{input_directory}/', f'{web}/')
- for directory in [css, js]:
- os.makedirs(directory)
- #
- link_gv = os.path.join(root, 'link.gv')
- link_svg = os.path.join(gen, 'link.svg')
- run('dot', link_gv, '-Tsvg', '-o', link_svg)
- with open(link_svg, 'br') as f:
- link_text = f.read().decode('u8')
- page_file = os.path.join(web, 'index.html')
- page_text = f'''\
-
-
-
-
-
-
-
-
-
-
-Marc Beninca
-
-
-
-
-
-
-
-
-
My/
-
-
-
-
CV
-
{tabs['cv']}
-
-
Profiles
-
{tabs['profiles']}
-
-
Projects
-
-
-
LSGM
-
{tabs['lsgm']}
-
-
OFSP
-
{tabs['ofsp']}
-
-
-
Tasks
-
{tabs['tasks']}
-
-
Trips
-
{tabs['trips']}
-
-
…/
-
-
-
Identity
-
{tabs['id']}
-
-
Links
-
{tabs['links']}
-
-
Repos
-
{tabs['repos']}
-
-
…
-
{tabs['others']}
-
-
-
-
Learn
-
{tabs['learn']}
-
-
Music
-
{tabs['music']}
-
-
Sites/
-
-
-
Books
-
{tabs['books']}
-
-
Buy
-
{tabs['buy']}
-
-
Social
-
{tabs['social']}
-
-
Software
-
{tabs['software']}
-
-
-
Videos/
-
-
-
Comments
-
{tabs['comments']}
-
-
Health
-
{tabs['health']}
-
-
Vegan
-
{tabs['vegan']}
-
-
-
…/
-
-
-
Style
-
{tabs['style']}
-
-
…
-
{tabs['unsorted']}
-
-
-
-
-
-
-
-Last update: {time.strftime('%Y/%m/%d %H:%M:%S')}
-
-
-
-
-
-'''
- css_file = os.path.join(css, 'index.css')
- css_text = f'''\
-@media screen and (max-aspect-ratio: 10/16) {{
-
-body {{
-font-size: 2em;
-}}
-
-}}
-
-body {{
-background: rgb(255,255,255);
-color: rgb(0,0,0);
-font-family: sans;
-margin: .5em;
-}}
-body.dark {{
-background: rgb(0,0,0);
-color: rgb(160,160,160);
-}}
-
-header {{
-background-image: url("../img/debian.jpeg");
-background-position: center;
-background-size: cover;
-display: flex;
-flex-wrap: wrap;
-}}
-
-.tabs {{
-display: flex;
-flex-wrap: wrap;
-}}
-.tabs .tabs {{
-padding: .5em 0 0 0;
-}}
-.tabs > input {{
-display: none;
-}}
-.tabs > input:checked + label + div {{
-display: block;
-}}
-.tabs > label {{
-order: 1;
-}}
-.tabs > div {{
-display: none;
-flex-basis: 100%;
-order: 2;
-}}
-
-.tabs {{
-margin: 0;
-}}
-.tabs > input:checked + label {{
-background: linear-gradient(rgba(128,128,128,1), rgba(128,128,128,0));
-}}
-.tabs > label {{
-background: linear-gradient(rgba(64,64,64,1), rgba(64,64,64,0));
-border-color: rgb(128,128,128);
-border-radius: .5em;
-border-style: solid;
-border-width: 1px 1px 0 1px;
-font-weight: bold;
-margin: 0;
-padding: .5em 1.5em;
-}}
-.tabs > label:hover {{
-background: linear-gradient(rgba(64,64,64,0), rgba(64,64,64,1));
-color: rgb(192,0,0);
-}}
-.tabs > div {{
-margin: 0;
-}}
-
-a {{
-color: rgb(0,192,192);
-text-decoration: none;
-}}
-a:hover {{
-color: rgb(192,0,0);
-}}
-a:visited {{
-color: rgb(0,160,160);
-}}
-
-img {{
-border: 1px solid;
-border-color: rgb(192,192,192);
-border-radius: 1em;
-height: 8em;
-}}
-
-table {{
-empty-cells: hide;
-}}
-th,td {{
-border-radius: .2em;
-}}
-th:hover,td:hover {{
-background: rgb(48,0,0);
-}}
-th {{
-background: rgb(64,64,64);
-color: rgb(128,128,0);
-}}
-td {{
-background: rgb(48,48,48);
-border: 1px solid;
-border-color: rgb(192,192,192);
-text-align: center;
-}}
-
-.cards {{
-display: flex;
-}}
-.card {{
-list-style: none;
-margin: 0 1em;
-text-align: center;
-}}
-.card img {{
-border: none;
-height: 3em;
-}}
-
-.debug {{
-border-color: rgb(255,0,255);
-border-style: solid;
-border-width: 1px;
-}}
-'''
- js_file = os.path.join(js, 'index.js')
- js_text = f'''\
-function check(tab) {{
- const tabs = tab.split('/')
- let id = 'tab'
- let element
- for (tab of tabs) {{
- id = `${{id}}/${{tab}}`
- element = document.getElementById(id)
- if (element) {{
- element.checked = true
- }}
- }}
-}}
-
-function debug() {{
- for (element of document.getElementsByTagName('*')) {{
- element.classList.toggle('debug')
- }}
-}}
-
-function push(tab) {{
- window.history.pushState(null, null, `?tab=${{tab}}`)
-}}
-
-function update(id) {{
- const tab = id.split('/').slice(1).join('/')
- push(tab)
-}}
-
-function main() {{
- let tab = (new URL(document.location)).searchParams.get('tab')
- if (tab) {{
- check(tab)
- }} else {{
- tab = 'my/profiles'
- check(tab)
- push(tab)
- }}
- const dark = document.getElementById('dark')
- if (dark) {{
- dark.click()
- }}
-}}
-
-function swap() {{
- document.body.classList.toggle('dark')
-}}
-'''
-# {link_text}
- with open(page_file, 'bw') as f:
- f.write(page_text.encode('u8'))
- with open(css_file, 'bw') as f:
- f.write(css_text.encode('u8'))
- with open(js_file, 'bw') as f:
- f.write(js_text.encode('u8'))
-
-
-tabs = {
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'about': f'''\
-About…
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'bio': f'''\
-Marc Beninca
-Welcome to a recap attempt of my IT life!
-
-The early days
-In my primary school days I started to interact with computers at home,
-mainly Amstrad CPC 464 & 6128 machines.
-It was the occasion for me to:
-
-discover computer architectures
-learn how to program in BASIC
-suffer the noise and speed of tape recorders
-experience the revolution of floppy disks transfer rates
-
-
-Diving in
-Right before beginning high school, I was introduced to the PC platform.
-The “system programming PC bible” was my reference for a long time.
-I had the occasion to develop projects in:
-
-Pascal (for example my own hexadecimal file editor)
-Assembly (mainly for critical subroutines performance)
-AutoLISP (automation in LISP of AutoCAD elements processing)
-
-
-To be continued…
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'books': f'''\
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'buy': f'''\
-
-
-
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'comments': f'''\
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'cv': f'''\
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'repos': f'''\
-
-
-
-
-
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'health': f'''\
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'id': f'''\
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'learn': f'''\
-
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'links': f'''\
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'music': f'''\
-
-
-
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'profiles': f'''\
-
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'lsgm': f'''\
-Live Scan Grub Menu
-Setup a whole EFI System Partition:
-
-generate customized GRUB EFI & BIOS images
-scan data partition(s) for SquashFS image files
-display generated boot menu
-live boot selected kernel, initial ramdisk and file system image
-
-BASH experimenting:
-
-''',
- 'ofsp': f'''\
-Operating File System Profile
-Build from mirror a full operating system bootable file image:
-
-bootstrap base file system
-configure common core basics
-install TUI packages
-install GUI packages
-copy kernel and initial ramdisk for bootloader
-archive final file system as SquashFS file
-
-BASH experimenting:
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'social': f'''\
-
-
-
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'software': f'''\
-
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'style': f'''\
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'tasks': f'''\
-
-
-fix dark switch
-style list items
-switch fonts
-use CSS variables
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'trips': f'''\
-
-Belgium
-Estonia
- Lahemaa
- Narva
- Pärnu
- Saaremaa
- Tallinn
- Tartu
-
-Germany
-Japan
- Hiroshima
- Kyoto
- Okinawa
- Osaka
- Tokyo
-
-Netherlands
- Amsterdam
- Rotterdam
-
-Switzerland
-United States of America
- California
- Los Angeles
- San Francisco
-
- Georgia
- Hawaii
- Indiana
- Kentucky
- New York
- Ohio
- Tennessee
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'vegan': f'''\
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'others': f'''\
-
-
-
-
-
-''',
-#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
- 'unsorted': f'''\
-
-''',
-}
-
-
-if __name__ == '__main__':
- main()
+if __name__ == "__main__":
+ root = Path(__file__).resolve().parent
+ root_input = root / "in"
+ root_output = root / "out"
+ web = root_output / "web"
+ fs.wipe(root_output)
+ fs.make_directory(web)
+ run(
+ "rsync",
+ "--archive",
+ "--partial",
+ "--progress",
+ "--verbose",
+ f"{root_input}{sep}",
+ f"{web}{sep}",
+ )
+ run(
+ "qrencode",
+ ("--background", "00000000"),
+ ("--foreground", "000000FF"),
+ ("--level", "L"),
+ ("--margin", "1"),
+ ("--read-from", str(root_input / "marc.beninca.vcf")),
+ ("--size", "4"),
+ ("-t", "SVG"),
+ ("--output", str(web / "img" / "marc.beninca.svg")),
+ )
diff --git a/cc.html b/cc.html
deleted file mode 100644
index eda505c..0000000
--- a/cc.html
+++ /dev/null
@@ -1,35 +0,0 @@
-
diff --git a/cc/ada b/cc/ada
deleted file mode 100644
index 3d6b49f..0000000
--- a/cc/ada
+++ /dev/null
@@ -1 +0,0 @@
-addr1q8xzhlhssfx0fwd57ha4khf7wtwdmr8rc4lkwnge6xjnskxv90l0pqjv7jumfa0mtdwnuukumkxw83tlvax3n5d98pvqgu558s
diff --git a/cc/algo b/cc/algo
deleted file mode 100644
index aaecf7b..0000000
--- a/cc/algo
+++ /dev/null
@@ -1 +0,0 @@
-7GHLYCLQKIET5XT2OWMAXU6NQKIRFJOWMKUOFON4RABVAA2PUZ2DLCDRLQ
diff --git a/cc/ark b/cc/ark
deleted file mode 100644
index 0779f71..0000000
--- a/cc/ark
+++ /dev/null
@@ -1 +0,0 @@
-AHHRwwELYb2KUjhcnZ4dknHuerdpRLfD4N
diff --git a/cc/atom b/cc/atom
deleted file mode 100644
index 068d885..0000000
--- a/cc/atom
+++ /dev/null
@@ -1 +0,0 @@
-cosmos132qm6ymwft9ck0xaaa9qamyaqq5ckwku98sak2
diff --git a/cc/bch b/cc/bch
deleted file mode 100644
index c76470c..0000000
--- a/cc/bch
+++ /dev/null
@@ -1 +0,0 @@
-qrqs9yxvnknvma6n8yy79xvlpd4l6kktmv28j35rwj
diff --git a/cc/bnb b/cc/bnb
deleted file mode 100644
index 15141c7..0000000
--- a/cc/bnb
+++ /dev/null
@@ -1 +0,0 @@
-bnb1dezkkkg23fesfaz7jrt6xguuqsan20wz9jgt3d
diff --git a/cc/btc b/cc/btc
deleted file mode 100644
index 1ff9f73..0000000
--- a/cc/btc
+++ /dev/null
@@ -1 +0,0 @@
-bc1qu2qa6m3lkf3cvr5220k4npa77g6endlaf45c3j
diff --git a/cc/dash b/cc/dash
deleted file mode 100644
index bd9bc15..0000000
--- a/cc/dash
+++ /dev/null
@@ -1 +0,0 @@
-Xx6DuquvMtZHZAuEjPSt175Kmmx3r36Pg3
diff --git a/cc/dgb b/cc/dgb
deleted file mode 100644
index 4428add..0000000
--- a/cc/dgb
+++ /dev/null
@@ -1 +0,0 @@
-DBHEv2ChbeQc7RJGaobMpwejK9tpgmi9FA
diff --git a/cc/dot b/cc/dot
deleted file mode 100644
index b574f33..0000000
--- a/cc/dot
+++ /dev/null
@@ -1 +0,0 @@
-13Mfiye1NW43JZKmr1MM2GxgJfbVvQFu9Rh3L83UMxYFUmRY
diff --git a/cc/egld b/cc/egld
deleted file mode 100644
index 165a8e9..0000000
--- a/cc/egld
+++ /dev/null
@@ -1 +0,0 @@
-erd1lz5tmvdvspyemykl05u34qqjj3tvkvze5n3hyac38dk37v2ymwasc6gyyg
diff --git a/cc/eth b/cc/eth
deleted file mode 100644
index fbe78a9..0000000
--- a/cc/eth
+++ /dev/null
@@ -1 +0,0 @@
-0xF9ef31EEea5956Cd193147E7D19b04f45cd9a38D
diff --git a/cc/fil b/cc/fil
deleted file mode 100644
index 08a2da0..0000000
--- a/cc/fil
+++ /dev/null
@@ -1 +0,0 @@
-f1unsj2vjm35jxvrctbvi2wxp2shsbvnvcaurszyq
diff --git a/cc/hbar b/cc/hbar
deleted file mode 100644
index 1d2d877..0000000
--- a/cc/hbar
+++ /dev/null
@@ -1 +0,0 @@
-0.0.892596
diff --git a/cc/icx b/cc/icx
deleted file mode 100644
index dfc5515..0000000
--- a/cc/icx
+++ /dev/null
@@ -1 +0,0 @@
-hx02b19ad56ff68d3a0a725b04ef27dbf8996684a8
diff --git a/cc/ltc b/cc/ltc
deleted file mode 100644
index ec662f1..0000000
--- a/cc/ltc
+++ /dev/null
@@ -1 +0,0 @@
-LVZGzfx6uPqJeTXPDUrCviBiyxveqvK2WK
diff --git a/cc/luna b/cc/luna
deleted file mode 100644
index 7872a9e..0000000
--- a/cc/luna
+++ /dev/null
@@ -1 +0,0 @@
-terra1rw6d6qkwqtlf38ncllt38axgwyu24ezlgx54wr
diff --git a/cc/ont b/cc/ont
deleted file mode 100644
index 597d656..0000000
--- a/cc/ont
+++ /dev/null
@@ -1 +0,0 @@
-AWEjJtRPkwL3VPwvp6G3wd96Z2oqAJ8s6s
diff --git a/cc/qtum b/cc/qtum
deleted file mode 100644
index a026b66..0000000
--- a/cc/qtum
+++ /dev/null
@@ -1 +0,0 @@
-QWDBhWadR1Xe2frRAZJ58LjzbMMff7udfH
diff --git a/cc/sol b/cc/sol
deleted file mode 100644
index 88bb5fb..0000000
--- a/cc/sol
+++ /dev/null
@@ -1 +0,0 @@
-FbDhn6rkT4x1uW6p9XufYwBrHeS53y56Q8vdo2eKb2Zc
diff --git a/cc/theta b/cc/theta
deleted file mode 100644
index 93a44fd..0000000
--- a/cc/theta
+++ /dev/null
@@ -1 +0,0 @@
-0x27d77039F7E852c72b15F824842E44A1295cC53A
diff --git a/cc/trx b/cc/trx
deleted file mode 100644
index a7fa108..0000000
--- a/cc/trx
+++ /dev/null
@@ -1 +0,0 @@
-TAFW2JVYXPfskGaoz4vu1oMwo6B72J2fEE
diff --git a/cc/vet b/cc/vet
deleted file mode 100644
index 6012dd5..0000000
--- a/cc/vet
+++ /dev/null
@@ -1 +0,0 @@
-0x877996962b331c032955fdb80B2AA7D6E78cb0d7
diff --git a/cc/xlm b/cc/xlm
deleted file mode 100644
index 9ede2c8..0000000
--- a/cc/xlm
+++ /dev/null
@@ -1 +0,0 @@
-GAYZAZU7BZ3PLSBLHMBIARS2NXC77R5TZBHLWX7PZV474FWYOTIXCYTK
diff --git a/cc/xmr b/cc/xmr
deleted file mode 100644
index 8a8a416..0000000
--- a/cc/xmr
+++ /dev/null
@@ -1 +0,0 @@
-43NTvQEtdgTHfvm9vtj3tQDYJL9R3aja1QR98YkY2DgDi8gcWnfCYBJe9qgBerGiu6eE9JM65o8rhHxbNHySUcLf4yxyYpr
diff --git a/cc/xno b/cc/xno
deleted file mode 100644
index b0bc9fd..0000000
--- a/cc/xno
+++ /dev/null
@@ -1 +0,0 @@
-nano_1ade4pu7t6t46xj7ufw99itgxzu873r6exhazz5mddbiz3hje8j614qipw3f
diff --git a/cc/xrp b/cc/xrp
deleted file mode 100644
index 1e949f6..0000000
--- a/cc/xrp
+++ /dev/null
@@ -1 +0,0 @@
-rKyjesfPonKVordBMoiFj3UztMWxCLQ6CV
diff --git a/cc/xtz b/cc/xtz
deleted file mode 100644
index c2bc73a..0000000
--- a/cc/xtz
+++ /dev/null
@@ -1 +0,0 @@
-tz1iLTaChtfT3ZH45DoxrWxyjhRLnFzuLRwu
diff --git a/cc/zec b/cc/zec
deleted file mode 100644
index 0da982b..0000000
--- a/cc/zec
+++ /dev/null
@@ -1 +0,0 @@
-t1ceshuxTbpEf6XqCXPbaL1LSazyJUvgVFE
diff --git a/cc/zil b/cc/zil
deleted file mode 100644
index 9eba3bb..0000000
--- a/cc/zil
+++ /dev/null
@@ -1 +0,0 @@
-zil13yagsjncsd0xxk8jte43gu9ll8s2ezwes258fl
diff --git a/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx b/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx
deleted file mode 120000
index 41aa63b..0000000
--- a/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx
+++ /dev/null
@@ -1 +0,0 @@
-social
\ No newline at end of file
diff --git a/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod b/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod
deleted file mode 120000
index 0899c29..0000000
--- a/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod
+++ /dev/null
@@ -1 +0,0 @@
-git
\ No newline at end of file
diff --git a/in/.well-known/openpgpkey/hu/git b/in/.well-known/openpgpkey/hu/git
deleted file mode 120000
index 687d959..0000000
--- a/in/.well-known/openpgpkey/hu/git
+++ /dev/null
@@ -1 +0,0 @@
-marc
\ No newline at end of file
diff --git a/in/.well-known/openpgpkey/hu/marc b/in/.well-known/openpgpkey/hu/marc
deleted file mode 100644
index 312f125..0000000
Binary files a/in/.well-known/openpgpkey/hu/marc and /dev/null differ
diff --git a/in/.well-known/openpgpkey/hu/social b/in/.well-known/openpgpkey/hu/social
deleted file mode 120000
index 687d959..0000000
--- a/in/.well-known/openpgpkey/hu/social
+++ /dev/null
@@ -1 +0,0 @@
-marc
\ No newline at end of file
diff --git a/in/.well-known/openpgpkey/policy b/in/.well-known/openpgpkey/policy
deleted file mode 100644
index e69de29..0000000
diff --git a/in/en/index.html b/in/en/index.html
new file mode 100644
index 0000000..67570f9
--- /dev/null
+++ b/in/en/index.html
@@ -0,0 +1,551 @@
+
+
+
+
+
+
+
+Curriculum Vitæ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+TEL
+
+ 33 607478434
+
+
+EMAIL
+
+cv marc.beninca.link
+
+
+
+
+
+
+
+Skills
+
+
+continuous technology watch
+always curious to learn
+
+
+
+Boot
+
+ARM ,
+BIOS ,
+EFI ,
+GRUB ,
+Secure Boot
+
+BTRFS ,
+ESP ,
+LUKS ,
+LVM ,
+Parted ,
+RAID
+
+Linux ,
+Live ,
+SquashFS
+
+
+
+
+
+
+Ansible ,
+Jenkins ,
+Nexus ,
+SonarQube
+
+Forgejo ,
+Git ,
+Gitea ,
+GitHub ,
+GitLab
+
+Maven ,
+NPM ,
+NVD ,
+PIP ,
+PyPI ,
+UV
+
+
+
+
+Code
+
+
+
+
+Cryptography
+
+
+
+
+Data
+
+
+
+
+Documentation
+
+
+
+
+Systems
+
+
+
+
+Virtualization
+
+
+
+
+Web
+
+
+
+
+
+
+Links
+
+
+
+Git
+
+
+
+Identity
+
+
+
+Social
+
+
+
+
+
+
+Education
+
+
+
+
+
+
2 years
+
+2021 ← 2019
+
+
+IRSM (Networks, Systems & Multimedia)
+
+
+
+
+
+
+
+
5 years
+
+2019 ← 2014
+
+
+CAI (Computing Architecture Designer)
+
+
+
+
+
+
+
+
+
+
+
+booting, building, configuring, securing, maintaining systems
+modeling, implementing, integrating, deploying, documenting software
+
+
+
+
+Experience
+
+
+
+
+
+
9 years
+
+2025 ← 2016
+
+
+
+
+
+
Defense Applications Development Center
+
DevOps @ Quality Assurance, CDAD
+
+
+
6 years
+
+2025 ← 2019
+
+
+administered CI / CD tools: Gitea , GitLab , Jenkins , Nexus , SonarQube
+wrote Python scripts to maintain offline mirrors:Alma , Alpine , CentOS , Debian , Docker , Maven , MSys2 , NPM , NVD , PyPI
+wrote & maintained BASH scripts for easier offline usage & packaging of MSys2
+wrote Ansible playbooks & roles for configurations & deployments
+built Ubuntu LTS Live system images with kiosk graphical interface
+
+
+
+
+
+
+
Defense Applications Development Center
+
System Administrator @ Infrastructure & Security, CDAD
+
+
+
2 years
+
+2019 ← 2017
+
+
+maintained Proxmox & vSphere infrastructures, with VM & LXC containers
+designed a SSO architecture: HAproxy , KeyCloak / WildFly , MariaDB Galera
+wrote Python scripts for: APT mirrors, Git repos, OpenSSH keypairs, Sphinx docs
+
+
+
+
+
+
+
Defense Applications Development Center
+
Software Developer @ Digital Factory, CDAD
+
+
+
+installed a Debian based development network: LXC server, laptops, workstations
+wrote BASH & Python scripts for: CloneZilla , Debian , DebMirror, GRUB , PanDoc
+wrote Python script to transform all existing code repositories from SVN to Git
+
+
+
+
+
+
+
+
+
+
14 years
+
+2016 ← 2002
+
+
+
+
+
+
+
8 years
+
+2016 ← 2008
+
+MELISSA NG (MELISSA New Generation)
+Complete reimplementation in Java and PostgreSQL database:
+designed & implemented a cartographic engine with PNG images & XML metadata
+wrote device drivers, emulators & graphical user interfaces for:
+ADL (Airborne Data Loader) equipment, handling
+DTM (Data Transfer Module) contactless cards for Alpha Jet onboard computers
+simultaneous programming of EEPROM modules for Mirage onboard computers
+
+ wrote import of KML / KMZ files to display layers of tactical situations (SITAC)
+
+
+
+
+
+
+
+
6 years
+
+2008 ← 2002
+
+
+MELISSA (Logical Elaboration Module for Simplified Overflight Info)
+Preparation, programming, unloading & replaying of missions for aircrafts
+Alpha Jet , Transall , Mirage 2000 , Mirage F1 , Mirage IV , Jaguar :
+wrote device drivers & graphical user interfaces for:
+sequential programming of EEPROM modules for Mirage onboard computers
+programming & unloading routes for various Garmin GPS devices
+
+ wrote import of NavData global database (international standard ARINC 424 )
+wrote NavData export adapted to Transall onboard computers (FMS ) constraints
+
+
+
+
+EVA (Aircraft Display Screen)
+Onboard display of navigation & video recorders for Mirage F1CR aircrafts:
+optimized cartographic engine for embedded computers (PC/104 )
+designed & built a dedicated system with Windows XP Embedded Studio
+
+
+
+
+
+
+
+
+
+Personal Projects
+
+
+
+
+
+
2 years
+
+2025 ← 2023
+
+Python & POSIX Shell parent project
+
+
+POSIX Shell & Python program handling CI / CD workflows in a unified way:
+whether the network infrastructure is online or offline with custom CA & DNS
+whatever the forge: Forgejo , Gitea , GitHub , GitLab
+whatever the Docker container’s Linux system base:
+Alma , Alpine , Arch , Debian , Fedora , OpenSUSE , Rocky , Ubuntu
+
+
+
+
+BASH & GRUB Shell program building ESP File Systems with:
+Secure Boot or custom ARM , EFI & BIOS standalone GRUB images
+on-the-fly OpenPGP signature checking of selected images
+dynamic menu scanning available Live bootable SquashFS images
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/in/fonts/forkawesome-webfont.css b/in/fonts/forkawesome-webfont.css
new file mode 100644
index 0000000..2ad41f6
--- /dev/null
+++ b/in/fonts/forkawesome-webfont.css
@@ -0,0 +1,2733 @@
+/*!
+Fork Awesome 1.2.0
+License - https://forkaweso.me/Fork-Awesome/license
+
+Copyright 2018 Dave Gandy & Fork Awesome
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'ForkAwesome';
+ src: url('../fonts/forkawesome-webfont.eot?v=1.2.0');
+ src: url('../fonts/forkawesome-webfont.eot?#iefix&v=1.2.0') format('embedded-opentype'), url('../fonts/forkawesome-webfont.woff2?v=1.2.0') format('woff2'), url('../fonts/forkawesome-webfont.woff?v=1.2.0') format('woff'), url('../fonts/forkawesome-webfont.ttf?v=1.2.0') format('truetype'), url('../fonts/forkawesome-webfont.svg?v=1.2.0#forkawesomeregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+ font-display: block;
+}
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 ForkAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: 0.75em;
+ vertical-align: -15%;
+}
+.fa-2x {
+ font-size: 2em;
+}
+.fa-3x {
+ font-size: 3em;
+}
+.fa-4x {
+ font-size: 4em;
+}
+.fa-5x {
+ font-size: 5em;
+}
+.fa-fw {
+ width: 1.28571429em;
+ text-align: center;
+}
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14285714em;
+ list-style-type: none;
+}
+.fa-ul > li {
+ position: relative;
+}
+.fa-li {
+ position: absolute;
+ left: -2.14285714em;
+ width: 2.14285714em;
+ top: 0.14285714em;
+ text-align: center;
+}
+.fa-li.fa-lg {
+ left: -1.85714286em;
+}
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid 0.08em #eee;
+ border-radius: .1em;
+}
+.fa-pull-left {
+ float: left;
+}
+.fa-pull-right {
+ float: right;
+}
+.fa.fa-pull-left {
+ margin-right: .3em;
+}
+.fa.fa-pull-right {
+ margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+.fa.pull-left {
+ margin-right: .3em;
+}
+.fa.pull-right {
+ margin-left: .3em;
+}
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+.fa-rotate-90 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ filter: none;
+}
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+.fa-stack-1x {
+ line-height: inherit;
+}
+.fa-stack-2x {
+ font-size: 2em;
+}
+.fa-inverse {
+ color: #fff;
+}
+/* Fork Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: "\f000";
+}
+.fa-music:before {
+ content: "\f001";
+}
+.fa-search:before {
+ content: "\f002";
+}
+.fa-envelope-o:before {
+ content: "\f003";
+}
+.fa-heart:before {
+ content: "\f004";
+}
+.fa-star:before {
+ content: "\f005";
+}
+.fa-star-o:before {
+ content: "\f006";
+}
+.fa-user:before {
+ content: "\f007";
+}
+.fa-film:before {
+ content: "\f008";
+}
+.fa-th-large:before {
+ content: "\f009";
+}
+.fa-th:before {
+ content: "\f00a";
+}
+.fa-th-list:before {
+ content: "\f00b";
+}
+.fa-check:before {
+ content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: "\f00d";
+}
+.fa-search-plus:before {
+ content: "\f00e";
+}
+.fa-search-minus:before {
+ content: "\f010";
+}
+.fa-power-off:before {
+ content: "\f011";
+}
+.fa-signal:before {
+ content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+ content: "\f013";
+}
+.fa-trash-o:before {
+ content: "\f014";
+}
+.fa-home:before {
+ content: "\f015";
+}
+.fa-file-o:before {
+ content: "\f016";
+}
+.fa-clock-o:before {
+ content: "\f017";
+}
+.fa-road:before {
+ content: "\f018";
+}
+.fa-download:before {
+ content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+ content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+ content: "\f01b";
+}
+.fa-inbox:before {
+ content: "\f01c";
+}
+.fa-play-circle-o:before {
+ content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: "\f01e";
+}
+.fa-sync:before,
+.fa-refresh:before {
+ content: "\f021";
+}
+.fa-list-alt:before {
+ content: "\f022";
+}
+.fa-lock:before {
+ content: "\f023";
+}
+.fa-flag:before {
+ content: "\f024";
+}
+.fa-headphones:before {
+ content: "\f025";
+}
+.fa-volume-off:before {
+ content: "\f026";
+}
+.fa-volume-down:before {
+ content: "\f027";
+}
+.fa-volume-up:before {
+ content: "\f028";
+}
+.fa-qrcode:before {
+ content: "\f029";
+}
+.fa-barcode:before {
+ content: "\f02a";
+}
+.fa-tag:before {
+ content: "\f02b";
+}
+.fa-tags:before {
+ content: "\f02c";
+}
+.fa-book:before {
+ content: "\f02d";
+}
+.fa-bookmark:before {
+ content: "\f02e";
+}
+.fa-print:before {
+ content: "\f02f";
+}
+.fa-camera:before {
+ content: "\f030";
+}
+.fa-font:before {
+ content: "\f031";
+}
+.fa-bold:before {
+ content: "\f032";
+}
+.fa-italic:before {
+ content: "\f033";
+}
+.fa-text-height:before {
+ content: "\f034";
+}
+.fa-text-width:before {
+ content: "\f035";
+}
+.fa-align-left:before {
+ content: "\f036";
+}
+.fa-align-center:before {
+ content: "\f037";
+}
+.fa-align-right:before {
+ content: "\f038";
+}
+.fa-align-justify:before {
+ content: "\f039";
+}
+.fa-list:before {
+ content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+ content: "\f03b";
+}
+.fa-indent:before {
+ content: "\f03c";
+}
+.fa-video:before,
+.fa-video-camera:before {
+ content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: "\f03e";
+}
+.fa-pencil:before {
+ content: "\f040";
+}
+.fa-map-marker:before {
+ content: "\f041";
+}
+.fa-adjust:before {
+ content: "\f042";
+}
+.fa-tint:before {
+ content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: "\f044";
+}
+.fa-share-square-o:before {
+ content: "\f045";
+}
+.fa-check-square-o:before {
+ content: "\f046";
+}
+.fa-arrows:before {
+ content: "\f047";
+}
+.fa-step-backward:before {
+ content: "\f048";
+}
+.fa-fast-backward:before {
+ content: "\f049";
+}
+.fa-backward:before {
+ content: "\f04a";
+}
+.fa-play:before {
+ content: "\f04b";
+}
+.fa-pause:before {
+ content: "\f04c";
+}
+.fa-stop:before {
+ content: "\f04d";
+}
+.fa-forward:before {
+ content: "\f04e";
+}
+.fa-fast-forward:before {
+ content: "\f050";
+}
+.fa-step-forward:before {
+ content: "\f051";
+}
+.fa-eject:before {
+ content: "\f052";
+}
+.fa-chevron-left:before {
+ content: "\f053";
+}
+.fa-chevron-right:before {
+ content: "\f054";
+}
+.fa-plus-circle:before {
+ content: "\f055";
+}
+.fa-minus-circle:before {
+ content: "\f056";
+}
+.fa-times-circle:before {
+ content: "\f057";
+}
+.fa-check-circle:before {
+ content: "\f058";
+}
+.fa-question-circle:before {
+ content: "\f059";
+}
+.fa-info-circle:before {
+ content: "\f05a";
+}
+.fa-crosshairs:before {
+ content: "\f05b";
+}
+.fa-times-circle-o:before {
+ content: "\f05c";
+}
+.fa-check-circle-o:before {
+ content: "\f05d";
+}
+.fa-ban:before {
+ content: "\f05e";
+}
+.fa-arrow-left:before {
+ content: "\f060";
+}
+.fa-arrow-right:before {
+ content: "\f061";
+}
+.fa-arrow-up:before {
+ content: "\f062";
+}
+.fa-arrow-down:before {
+ content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+ content: "\f064";
+}
+.fa-expand:before {
+ content: "\f065";
+}
+.fa-compress:before {
+ content: "\f066";
+}
+.fa-plus:before {
+ content: "\f067";
+}
+.fa-minus:before {
+ content: "\f068";
+}
+.fa-asterisk:before {
+ content: "\f069";
+}
+.fa-exclamation-circle:before {
+ content: "\f06a";
+}
+.fa-gift:before {
+ content: "\f06b";
+}
+.fa-leaf:before {
+ content: "\f06c";
+}
+.fa-fire:before {
+ content: "\f06d";
+}
+.fa-eye:before {
+ content: "\f06e";
+}
+.fa-eye-slash:before {
+ content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: "\f071";
+}
+.fa-plane:before {
+ content: "\f072";
+}
+.fa-calendar:before {
+ content: "\f073";
+}
+.fa-random:before {
+ content: "\f074";
+}
+.fa-comment:before {
+ content: "\f075";
+}
+.fa-magnet:before {
+ content: "\f076";
+}
+.fa-chevron-up:before {
+ content: "\f077";
+}
+.fa-chevron-down:before {
+ content: "\f078";
+}
+.fa-retweet:before {
+ content: "\f079";
+}
+.fa-shopping-cart:before {
+ content: "\f07a";
+}
+.fa-folder:before {
+ content: "\f07b";
+}
+.fa-folder-open:before {
+ content: "\f07c";
+}
+.fa-arrows-v:before {
+ content: "\f07d";
+}
+.fa-arrows-h:before {
+ content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: "\f080";
+}
+.fa-twitter-square:before {
+ content: "\f081";
+}
+.fa-facebook-square:before {
+ content: "\f082";
+}
+.fa-camera-retro:before {
+ content: "\f083";
+}
+.fa-key:before {
+ content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+ content: "\f085";
+}
+.fa-comments:before {
+ content: "\f086";
+}
+.fa-thumbs-o-up:before {
+ content: "\f087";
+}
+.fa-thumbs-o-down:before {
+ content: "\f088";
+}
+.fa-star-half:before {
+ content: "\f089";
+}
+.fa-heart-o:before {
+ content: "\f08a";
+}
+.fa-sign-out:before {
+ content: "\f08b";
+}
+.fa-linkedin-square:before {
+ content: "\f08c";
+}
+.fa-thumb-tack:before {
+ content: "\f08d";
+}
+.fa-external-link:before {
+ content: "\f08e";
+}
+.fa-sign-in:before {
+ content: "\f090";
+}
+.fa-trophy:before {
+ content: "\f091";
+}
+.fa-github-square:before {
+ content: "\f092";
+}
+.fa-upload:before {
+ content: "\f093";
+}
+.fa-lemon-o:before {
+ content: "\f094";
+}
+.fa-phone:before {
+ content: "\f095";
+}
+.fa-square-o:before {
+ content: "\f096";
+}
+.fa-bookmark-o:before {
+ content: "\f097";
+}
+.fa-phone-square:before {
+ content: "\f098";
+}
+.fa-twitter:before {
+ content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+ content: "\f09a";
+}
+.fa-github:before {
+ content: "\f09b";
+}
+.fa-unlock:before {
+ content: "\f09c";
+}
+.fa-credit-card:before {
+ content: "\f09d";
+}
+.fa-feed:before,
+.fa-rss:before {
+ content: "\f09e";
+}
+.fa-hdd-o:before {
+ content: "\f0a0";
+}
+.fa-bullhorn:before {
+ content: "\f0a1";
+}
+.fa-bell-o:before {
+ content: "\f0f3";
+}
+.fa-certificate:before {
+ content: "\f0a3";
+}
+.fa-hand-o-right:before {
+ content: "\f0a4";
+}
+.fa-hand-o-left:before {
+ content: "\f0a5";
+}
+.fa-hand-o-up:before {
+ content: "\f0a6";
+}
+.fa-hand-o-down:before {
+ content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+ content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+ content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+ content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+ content: "\f0ab";
+}
+.fa-globe:before {
+ content: "\f0ac";
+}
+.fa-globe-e:before {
+ content: "\f304";
+}
+.fa-globe-w:before {
+ content: "\f305";
+}
+.fa-wrench:before {
+ content: "\f0ad";
+}
+.fa-tasks:before {
+ content: "\f0ae";
+}
+.fa-filter:before {
+ content: "\f0b0";
+}
+.fa-briefcase:before {
+ content: "\f0b1";
+}
+.fa-arrows-alt:before {
+ content: "\f0b2";
+}
+.fa-community:before,
+.fa-group:before,
+.fa-users:before {
+ content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+ content: "\f0c1";
+}
+.fa-cloud:before {
+ content: "\f0c2";
+}
+.fa-flask:before {
+ content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+ content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+ content: "\f0c5";
+}
+.fa-paperclip:before {
+ content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+ content: "\f0c7";
+}
+.fa-square:before {
+ content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: "\f0c9";
+}
+.fa-list-ul:before {
+ content: "\f0ca";
+}
+.fa-list-ol:before {
+ content: "\f0cb";
+}
+.fa-strikethrough:before {
+ content: "\f0cc";
+}
+.fa-underline:before {
+ content: "\f0cd";
+}
+.fa-table:before {
+ content: "\f0ce";
+}
+.fa-magic:before {
+ content: "\f0d0";
+}
+.fa-truck:before {
+ content: "\f0d1";
+}
+.fa-pinterest:before {
+ content: "\f0d2";
+}
+.fa-pinterest-square:before {
+ content: "\f0d3";
+}
+.fa-google-plus-square:before {
+ content: "\f0d4";
+}
+.fa-google-plus-g:before,
+.fa-google-plus:before {
+ content: "\f0d5";
+}
+.fa-money:before {
+ content: "\f0d6";
+}
+.fa-caret-down:before {
+ content: "\f0d7";
+}
+.fa-caret-up:before {
+ content: "\f0d8";
+}
+.fa-caret-left:before {
+ content: "\f0d9";
+}
+.fa-caret-right:before {
+ content: "\f0da";
+}
+.fa-columns:before {
+ content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+ content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: "\f0de";
+}
+.fa-envelope:before {
+ content: "\f0e0";
+}
+.fa-linkedin:before {
+ content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+ content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: "\f0e4";
+}
+.fa-comment-o:before {
+ content: "\f0e5";
+}
+.fa-comments-o:before {
+ content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+ content: "\f0e7";
+}
+.fa-sitemap:before {
+ content: "\f0e8";
+}
+.fa-umbrella:before {
+ content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+ content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+ content: "\f0eb";
+}
+.fa-exchange:before {
+ content: "\f0ec";
+}
+.fa-cloud-download:before {
+ content: "\f0ed";
+}
+.fa-cloud-upload:before {
+ content: "\f0ee";
+}
+.fa-user-md:before {
+ content: "\f0f0";
+}
+.fa-stethoscope:before {
+ content: "\f0f1";
+}
+.fa-suitcase:before {
+ content: "\f0f2";
+}
+.fa-bell:before {
+ content: "\f0a2";
+}
+.fa-coffee:before {
+ content: "\f0f4";
+}
+.fa-utensils:before,
+.fa-cutlery:before {
+ content: "\f0f5";
+}
+.fa-file-text-o:before {
+ content: "\f0f6";
+}
+.fa-building-o:before {
+ content: "\f0f7";
+}
+.fa-hospital-o:before {
+ content: "\f0f8";
+}
+.fa-ambulance:before {
+ content: "\f0f9";
+}
+.fa-medkit:before {
+ content: "\f0fa";
+}
+.fa-fighter-jet:before {
+ content: "\f0fb";
+}
+.fa-beer:before {
+ content: "\f0fc";
+}
+.fa-h-square:before {
+ content: "\f0fd";
+}
+.fa-plus-square:before {
+ content: "\f0fe";
+}
+.fa-angle-double-left:before {
+ content: "\f100";
+}
+.fa-angle-double-right:before {
+ content: "\f101";
+}
+.fa-angle-double-up:before {
+ content: "\f102";
+}
+.fa-angle-double-down:before {
+ content: "\f103";
+}
+.fa-angle-left:before {
+ content: "\f104";
+}
+.fa-angle-right:before {
+ content: "\f105";
+}
+.fa-angle-up:before {
+ content: "\f106";
+}
+.fa-angle-down:before {
+ content: "\f107";
+}
+.fa-desktop:before {
+ content: "\f108";
+}
+.fa-laptop:before {
+ content: "\f109";
+}
+.fa-tablet:before {
+ content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: "\f10b";
+}
+.fa-circle-o:before {
+ content: "\f10c";
+}
+.fa-quote-left:before {
+ content: "\f10d";
+}
+.fa-quote-right:before {
+ content: "\f10e";
+}
+.fa-spinner:before {
+ content: "\f110";
+}
+.fa-circle:before {
+ content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: "\f112";
+}
+.fa-github-alt:before {
+ content: "\f113";
+}
+.fa-folder-o:before {
+ content: "\f114";
+}
+.fa-folder-open-o:before {
+ content: "\f115";
+}
+.fa-smile-o:before {
+ content: "\f118";
+}
+.fa-frown-o:before {
+ content: "\f119";
+}
+.fa-meh-o:before {
+ content: "\f11a";
+}
+.fa-gamepad:before {
+ content: "\f11b";
+}
+.fa-keyboard-o:before {
+ content: "\f11c";
+}
+.fa-flag-o:before {
+ content: "\f11d";
+}
+.fa-flag-checkered:before {
+ content: "\f11e";
+}
+.fa-terminal:before {
+ content: "\f120";
+}
+.fa-code:before {
+ content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: "\f123";
+}
+.fa-location-arrow:before {
+ content: "\f124";
+}
+.fa-crop:before {
+ content: "\f125";
+}
+.fa-code-fork:before {
+ content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: "\f127";
+}
+.fa-question:before {
+ content: "\f128";
+}
+.fa-info:before {
+ content: "\f129";
+}
+.fa-exclamation:before {
+ content: "\f12a";
+}
+.fa-superscript:before {
+ content: "\f12b";
+}
+.fa-subscript:before {
+ content: "\f12c";
+}
+.fa-eraser:before {
+ content: "\f12d";
+}
+.fa-puzzle-piece:before {
+ content: "\f12e";
+}
+.fa-microphone:before {
+ content: "\f130";
+}
+.fa-microphone-slash:before {
+ content: "\f131";
+}
+.fa-shield:before {
+ content: "\f132";
+}
+.fa-calendar-o:before {
+ content: "\f133";
+}
+.fa-fire-extinguisher:before {
+ content: "\f134";
+}
+.fa-rocket:before {
+ content: "\f135";
+}
+.fa-maxcdn:before {
+ content: "\f136";
+}
+.fa-chevron-circle-left:before {
+ content: "\f137";
+}
+.fa-chevron-circle-right:before {
+ content: "\f138";
+}
+.fa-chevron-circle-up:before {
+ content: "\f139";
+}
+.fa-chevron-circle-down:before {
+ content: "\f13a";
+}
+.fa-html5:before {
+ content: "\f13b";
+}
+.fa-css3:before {
+ content: "\f13c";
+}
+.fa-anchor:before {
+ content: "\f13d";
+}
+.fa-unlock-alt:before {
+ content: "\f13e";
+}
+.fa-bullseye:before {
+ content: "\f140";
+}
+.fa-ellipsis-h:before {
+ content: "\f141";
+}
+.fa-ellipsis-v:before {
+ content: "\f142";
+}
+.fa-rss-square:before {
+ content: "\f143";
+}
+.fa-play-circle:before {
+ content: "\f144";
+}
+.fa-ticket:before {
+ content: "\f145";
+}
+.fa-minus-square:before {
+ content: "\f146";
+}
+.fa-minus-square-o:before {
+ content: "\f147";
+}
+.fa-level-up:before {
+ content: "\f148";
+}
+.fa-level-down:before {
+ content: "\f149";
+}
+.fa-check-square:before {
+ content: "\f14a";
+}
+.fa-pencil-square:before {
+ content: "\f14b";
+}
+.fa-external-link-square:before {
+ content: "\f14c";
+}
+.fa-share-square:before {
+ content: "\f14d";
+}
+.fa-compass:before {
+ content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+ content: "\f153";
+}
+.fa-pound:before,
+.fa-gbp:before {
+ content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+ content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+ content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+ content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: "\f15a";
+}
+.fa-file:before {
+ content: "\f15b";
+}
+.fa-file-text:before {
+ content: "\f15c";
+}
+.fa-sort-alpha-down:before,
+.fa-sort-alpha-asc:before {
+ content: "\f15d";
+}
+.fa-sort-alpha-up:before,
+.fa-sort-alpha-desc:before {
+ content: "\f15e";
+}
+.fa-sort-amount-down:before,
+.fa-sort-amount-asc:before {
+ content: "\f160";
+}
+.fa-sort-amount-up:before,
+.fa-sort-amount-desc:before {
+ content: "\f161";
+}
+.fa-sort-numeric-down:before,
+.fa-sort-numeric-asc:before {
+ content: "\f162";
+}
+.fa-sort-numeric-up:before,
+.fa-sort-numeric-desc:before {
+ content: "\f163";
+}
+.fa-thumbs-up:before {
+ content: "\f164";
+}
+.fa-thumbs-down:before {
+ content: "\f165";
+}
+.fa-youtube-square:before {
+ content: "\f166";
+}
+.fa-youtube:before {
+ content: "\f167";
+}
+.fa-xing:before {
+ content: "\f168";
+}
+.fa-xing-square:before {
+ content: "\f169";
+}
+.fa-youtube-play:before {
+ content: "\f16a";
+}
+.fa-dropbox:before {
+ content: "\f16b";
+}
+.fa-stack-overflow:before {
+ content: "\f16c";
+}
+.fa-instagram:before {
+ content: "\f16d";
+}
+.fa-flickr:before {
+ content: "\f16e";
+}
+.fa-adn:before {
+ content: "\f170";
+}
+.fa-bitbucket:before {
+ content: "\f171";
+}
+.fa-bitbucket-square:before {
+ content: "\f172";
+}
+.fa-tumblr:before {
+ content: "\f173";
+}
+.fa-tumblr-square:before {
+ content: "\f174";
+}
+.fa-long-arrow-down:before {
+ content: "\f175";
+}
+.fa-long-arrow-up:before {
+ content: "\f176";
+}
+.fa-long-arrow-left:before {
+ content: "\f177";
+}
+.fa-long-arrow-right:before {
+ content: "\f178";
+}
+.fa-apple:before {
+ content: "\f179";
+}
+.fa-windows:before {
+ content: "\f17a";
+}
+.fa-android:before {
+ content: "\f17b";
+}
+.fa-linux:before {
+ content: "\f17c";
+}
+.fa-dribbble:before {
+ content: "\f17d";
+}
+.fa-skype:before {
+ content: "\f17e";
+}
+.fa-foursquare:before {
+ content: "\f180";
+}
+.fa-trello:before {
+ content: "\f181";
+}
+.fa-female:before {
+ content: "\f182";
+}
+.fa-male:before {
+ content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+ content: "\f184";
+}
+.fa-sun-o:before {
+ content: "\f185";
+}
+.fa-moon-o:before {
+ content: "\f186";
+}
+.fa-archive:before {
+ content: "\f187";
+}
+.fa-bug:before {
+ content: "\f188";
+}
+.fa-vk:before {
+ content: "\f189";
+}
+.fa-weibo:before {
+ content: "\f18a";
+}
+.fa-renren:before {
+ content: "\f18b";
+}
+.fa-pagelines:before {
+ content: "\f18c";
+}
+.fa-stack-exchange:before {
+ content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+ content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+ content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: "\f191";
+}
+.fa-dot-circle-o:before {
+ content: "\f192";
+}
+.fa-wheelchair:before {
+ content: "\f193";
+}
+.fa-vimeo-square:before {
+ content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: "\f195";
+}
+.fa-plus-square-o:before {
+ content: "\f196";
+}
+.fa-space-shuttle:before {
+ content: "\f197";
+}
+.fa-slack:before {
+ content: "\f198";
+}
+.fa-envelope-square:before {
+ content: "\f199";
+}
+.fa-wordpress:before {
+ content: "\f19a";
+}
+.fa-openid:before {
+ content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: "\f19d";
+}
+.fa-yahoo:before {
+ content: "\f19e";
+}
+.fa-google:before {
+ content: "\f1a0";
+}
+.fa-reddit:before {
+ content: "\f1a1";
+}
+.fa-reddit-square:before {
+ content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+ content: "\f1a3";
+}
+.fa-stumbleupon:before {
+ content: "\f1a4";
+}
+.fa-delicious:before {
+ content: "\f1a5";
+}
+.fa-digg:before {
+ content: "\f1a6";
+}
+.fa-drupal:before {
+ content: "\f1a9";
+}
+.fa-joomla:before {
+ content: "\f1aa";
+}
+.fa-language:before {
+ content: "\f1ab";
+}
+.fa-fax:before {
+ content: "\f1ac";
+}
+.fa-building:before {
+ content: "\f1ad";
+}
+.fa-child:before {
+ content: "\f1ae";
+}
+.fa-paw:before {
+ content: "\f1b0";
+}
+.fa-utensil-spoon:before,
+.fa-spoon:before {
+ content: "\f1b1";
+}
+.fa-cube:before {
+ content: "\f1b2";
+}
+.fa-cubes:before {
+ content: "\f1b3";
+}
+.fa-behance:before {
+ content: "\f1b4";
+}
+.fa-behance-square:before {
+ content: "\f1b5";
+}
+.fa-steam:before {
+ content: "\f1b6";
+}
+.fa-steam-square:before {
+ content: "\f1b7";
+}
+.fa-recycle:before {
+ content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+ content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+ content: "\f1ba";
+}
+.fa-tree:before {
+ content: "\f1bb";
+}
+.fa-spotify:before {
+ content: "\f1bc";
+}
+.fa-deviantart:before {
+ content: "\f1bd";
+}
+.fa-soundcloud:before {
+ content: "\f1be";
+}
+.fa-database:before {
+ content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+ content: "\f1c1";
+}
+.fa-file-word-o:before {
+ content: "\f1c2";
+}
+.fa-file-excel-o:before {
+ content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+ content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: "\f1c8";
+}
+.fa-file-code-o:before {
+ content: "\f1c9";
+}
+.fa-vine:before {
+ content: "\f1ca";
+}
+.fa-codepen:before {
+ content: "\f1cb";
+}
+.fa-jsfiddle:before {
+ content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+ content: "\f1ce";
+}
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+ content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+ content: "\f1d1";
+}
+.fa-git-square:before {
+ content: "\f1d2";
+}
+.fa-git:before {
+ content: "\f1d3";
+}
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+ content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+ content: "\f1d5";
+}
+.fa-qq:before {
+ content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+ content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+ content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: "\f1d9";
+}
+.fa-history:before {
+ content: "\f1da";
+}
+.fa-circle-thin:before {
+ content: "\f1db";
+}
+.fa-heading:before,
+.fa-header:before {
+ content: "\f1dc";
+}
+.fa-paragraph:before {
+ content: "\f1dd";
+}
+.fa-sliders:before {
+ content: "\f1de";
+}
+.fa-share-alt:before {
+ content: "\f1e0";
+}
+.fa-share-alt-square:before {
+ content: "\f1e1";
+}
+.fa-bomb:before {
+ content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: "\f1e3";
+}
+.fa-tty:before {
+ content: "\f1e4";
+}
+.fa-binoculars:before {
+ content: "\f1e5";
+}
+.fa-plug:before {
+ content: "\f1e6";
+}
+.fa-slideshare:before {
+ content: "\f1e7";
+}
+.fa-twitch:before {
+ content: "\f1e8";
+}
+.fa-yelp:before {
+ content: "\f1e9";
+}
+.fa-newspaper-o:before {
+ content: "\f1ea";
+}
+.fa-wifi:before {
+ content: "\f1eb";
+}
+.fa-calculator:before {
+ content: "\f1ec";
+}
+.fa-paypal:before {
+ content: "\f1ed";
+}
+.fa-google-wallet:before {
+ content: "\f1ee";
+}
+.fa-cc-visa:before {
+ content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+ content: "\f1f1";
+}
+.fa-cc-discover:before {
+ content: "\f1f2";
+}
+.fa-cc-amex:before {
+ content: "\f1f3";
+}
+.fa-cc-paypal:before {
+ content: "\f1f4";
+}
+.fa-cc-stripe:before {
+ content: "\f1f5";
+}
+.fa-bell-slash:before {
+ content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+ content: "\f1f7";
+}
+.fa-trash:before {
+ content: "\f1f8";
+}
+.fa-copyright:before {
+ content: "\f1f9";
+}
+.fa-at:before {
+ content: "\f1fa";
+}
+.fa-eyedropper:before {
+ content: "\f1fb";
+}
+.fa-paint-brush:before {
+ content: "\f1fc";
+}
+.fa-birthday-cake:before {
+ content: "\f1fd";
+}
+.fa-area-chart:before {
+ content: "\f1fe";
+}
+.fa-pie-chart:before {
+ content: "\f200";
+}
+.fa-line-chart:before {
+ content: "\f201";
+}
+.fa-lastfm:before {
+ content: "\f202";
+}
+.fa-lastfm-square:before {
+ content: "\f203";
+}
+.fa-toggle-off:before {
+ content: "\f204";
+}
+.fa-toggle-on:before {
+ content: "\f205";
+}
+.fa-bicycle:before {
+ content: "\f206";
+}
+.fa-bus:before {
+ content: "\f207";
+}
+.fa-ioxhost:before {
+ content: "\f208";
+}
+.fa-angellist:before {
+ content: "\f209";
+}
+.fa-closed-captioning:before,
+.fa-cc:before {
+ content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: "\f20b";
+}
+.fa-meanpath:before {
+ content: "\f20c";
+}
+.fa-buysellads:before {
+ content: "\f20d";
+}
+.fa-connectdevelop:before {
+ content: "\f20e";
+}
+.fa-dashcube:before {
+ content: "\f210";
+}
+.fa-forumbee:before {
+ content: "\f211";
+}
+.fa-leanpub:before {
+ content: "\f212";
+}
+.fa-sellsy:before {
+ content: "\f213";
+}
+.fa-shirtsinbulk:before {
+ content: "\f214";
+}
+.fa-simplybuilt:before {
+ content: "\f215";
+}
+.fa-skyatlas:before {
+ content: "\f216";
+}
+.fa-cart-plus:before {
+ content: "\f217";
+}
+.fa-cart-arrow-down:before {
+ content: "\f218";
+}
+.fa-gem:before,
+.fa-diamond:before {
+ content: "\f219";
+}
+.fa-ship:before {
+ content: "\f21a";
+}
+.fa-user-secret:before {
+ content: "\f21b";
+}
+.fa-motorcycle:before {
+ content: "\f21c";
+}
+.fa-street-view:before {
+ content: "\f21d";
+}
+.fa-heartbeat:before {
+ content: "\f21e";
+}
+.fa-venus:before {
+ content: "\f221";
+}
+.fa-mars:before {
+ content: "\f222";
+}
+.fa-mercury:before {
+ content: "\f223";
+}
+.fa-intersex:before,
+.fa-transgender:before {
+ content: "\f224";
+}
+.fa-transgender-alt:before {
+ content: "\f225";
+}
+.fa-venus-double:before {
+ content: "\f226";
+}
+.fa-mars-double:before {
+ content: "\f227";
+}
+.fa-venus-mars:before {
+ content: "\f228";
+}
+.fa-mars-stroke:before {
+ content: "\f229";
+}
+.fa-mars-stroke-v:before {
+ content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+ content: "\f22b";
+}
+.fa-neuter:before {
+ content: "\f22c";
+}
+.fa-genderless:before {
+ content: "\f22d";
+}
+.fa-facebook-official:before {
+ content: "\f230";
+}
+.fa-pinterest-p:before {
+ content: "\f231";
+}
+.fa-whatsapp:before {
+ content: "\f232";
+}
+.fa-server:before {
+ content: "\f233";
+}
+.fa-user-plus:before {
+ content: "\f234";
+}
+.fa-user-times:before {
+ content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+ content: "\f236";
+}
+.fa-viacoin:before {
+ content: "\f237";
+}
+.fa-train:before {
+ content: "\f238";
+}
+.fa-subway:before {
+ content: "\f239";
+}
+.fa-medium:before {
+ content: "\f23a";
+}
+.fa-medium-square:before {
+ content: "\f2f8";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+ content: "\f23b";
+}
+.fa-optin-monster:before {
+ content: "\f23c";
+}
+.fa-opencart:before {
+ content: "\f23d";
+}
+.fa-expeditedssl:before {
+ content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+ content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+ content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+ content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+ content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+ content: "\f244";
+}
+.fa-mouse-pointer:before {
+ content: "\f245";
+}
+.fa-i-cursor:before {
+ content: "\f246";
+}
+.fa-object-group:before {
+ content: "\f247";
+}
+.fa-object-ungroup:before {
+ content: "\f248";
+}
+.fa-sticky-note:before {
+ content: "\f249";
+}
+.fa-sticky-note-o:before {
+ content: "\f24a";
+}
+.fa-cc-jcb:before {
+ content: "\f24b";
+}
+.fa-cc-diners-club:before {
+ content: "\f24c";
+}
+.fa-clone:before {
+ content: "\f24d";
+}
+.fa-balance-scale:before {
+ content: "\f24e";
+}
+.fa-hourglass-o:before {
+ content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+ content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+ content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+ content: "\f253";
+}
+.fa-hourglass:before {
+ content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+ content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+ content: "\f256";
+}
+.fa-hand-scissors-o:before {
+ content: "\f257";
+}
+.fa-hand-lizard-o:before {
+ content: "\f258";
+}
+.fa-hand-spock-o:before {
+ content: "\f259";
+}
+.fa-hand-pointer-o:before {
+ content: "\f25a";
+}
+.fa-hand-peace-o:before {
+ content: "\f25b";
+}
+.fa-trademark:before {
+ content: "\f25c";
+}
+.fa-registered:before {
+ content: "\f25d";
+}
+.fa-creative-commons:before {
+ content: "\f25e";
+}
+.fa-gg:before {
+ content: "\f260";
+}
+.fa-gg-circle:before {
+ content: "\f261";
+}
+.fa-tripadvisor:before {
+ content: "\f262";
+}
+.fa-odnoklassniki:before {
+ content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+ content: "\f264";
+}
+.fa-get-pocket:before {
+ content: "\f265";
+}
+.fa-wikipedia-w:before {
+ content: "\f266";
+}
+.fa-safari:before {
+ content: "\f267";
+}
+.fa-chrome:before {
+ content: "\f268";
+}
+.fa-firefox:before {
+ content: "\f269";
+}
+.fa-opera:before {
+ content: "\f26a";
+}
+.fa-internet-explorer:before {
+ content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+ content: "\f26c";
+}
+.fa-contao:before {
+ content: "\f26d";
+}
+.fa-500px:before {
+ content: "\f26e";
+}
+.fa-amazon:before {
+ content: "\f270";
+}
+.fa-calendar-plus-o:before {
+ content: "\f271";
+}
+.fa-calendar-minus-o:before {
+ content: "\f272";
+}
+.fa-calendar-times-o:before {
+ content: "\f273";
+}
+.fa-calendar-check-o:before {
+ content: "\f274";
+}
+.fa-industry:before {
+ content: "\f275";
+}
+.fa-map-pin:before {
+ content: "\f276";
+}
+.fa-map-signs:before {
+ content: "\f277";
+}
+.fa-map-o:before {
+ content: "\f278";
+}
+.fa-map:before {
+ content: "\f279";
+}
+.fa-commenting:before {
+ content: "\f27a";
+}
+.fa-commenting-o:before {
+ content: "\f27b";
+}
+.fa-houzz:before {
+ content: "\f27c";
+}
+.fa-vimeo-v:before,
+.fa-vimeo:before {
+ content: "\f27d";
+}
+.fa-black-tie:before {
+ content: "\f27e";
+}
+.fa-fonticons:before {
+ content: "\f280";
+}
+.fa-reddit-alien:before {
+ content: "\f281";
+}
+.fa-edge:before {
+ content: "\f282";
+}
+.fa-credit-card-alt:before {
+ content: "\f283";
+}
+.fa-codiepie:before {
+ content: "\f284";
+}
+.fa-modx:before {
+ content: "\f285";
+}
+.fa-fort-awesome:before {
+ content: "\f286";
+}
+.fa-usb:before {
+ content: "\f287";
+}
+.fa-product-hunt:before {
+ content: "\f288";
+}
+.fa-mixcloud:before {
+ content: "\f289";
+}
+.fa-scribd:before {
+ content: "\f28a";
+}
+.fa-pause-circle:before {
+ content: "\f28b";
+}
+.fa-pause-circle-o:before {
+ content: "\f28c";
+}
+.fa-stop-circle:before {
+ content: "\f28d";
+}
+.fa-stop-circle-o:before {
+ content: "\f28e";
+}
+.fa-shopping-bag:before {
+ content: "\f290";
+}
+.fa-shopping-basket:before {
+ content: "\f291";
+}
+.fa-hashtag:before {
+ content: "\f292";
+}
+.fa-bluetooth:before {
+ content: "\f293";
+}
+.fa-bluetooth-b:before {
+ content: "\f294";
+}
+.fa-percent:before {
+ content: "\f295";
+}
+.fa-gitlab:before {
+ content: "\f296";
+}
+.fa-wpbeginner:before {
+ content: "\f297";
+}
+.fa-wpforms:before {
+ content: "\f298";
+}
+.fa-envira:before {
+ content: "\f299";
+}
+.fa-universal-access:before {
+ content: "\f29a";
+}
+.fa-wheelchair-alt:before {
+ content: "\f29b";
+}
+.fa-question-circle-o:before {
+ content: "\f29c";
+}
+.fa-blind:before {
+ content: "\f29d";
+}
+.fa-audio-description:before {
+ content: "\f29e";
+}
+.fa-phone-volume:before,
+.fa-volume-control-phone:before {
+ content: "\f2a0";
+}
+.fa-braille:before {
+ content: "\f2a1";
+}
+.fa-assistive-listening-systems:before {
+ content: "\f2a2";
+}
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+ content: "\f2a3";
+}
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+ content: "\f2a4";
+}
+.fa-glide:before {
+ content: "\f2a5";
+}
+.fa-glide-g:before {
+ content: "\f2a6";
+}
+.fa-signing:before,
+.fa-sign-language:before {
+ content: "\f2a7";
+}
+.fa-low-vision:before {
+ content: "\f2a8";
+}
+.fa-viadeo:before {
+ content: "\f2a9";
+}
+.fa-viadeo-square:before {
+ content: "\f2aa";
+}
+.fa-snapchat:before {
+ content: "\f2ab";
+}
+.fa-snapchat-ghost:before {
+ content: "\f2ac";
+}
+.fa-snapchat-square:before {
+ content: "\f2ad";
+}
+.fa-first-order:before {
+ content: "\f2b0";
+}
+.fa-yoast:before {
+ content: "\f2b1";
+}
+.fa-themeisle:before {
+ content: "\f2b2";
+}
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+ content: "\f2b3";
+}
+.fa-fa:before,
+.fa-font-awesome:before {
+ content: "\f2b4";
+}
+.fa-handshake-o:before {
+ content: "\f2b5";
+}
+.fa-envelope-open:before {
+ content: "\f2b6";
+}
+.fa-envelope-open-o:before {
+ content: "\f2b7";
+}
+.fa-linode:before {
+ content: "\f2b8";
+}
+.fa-address-book:before {
+ content: "\f2b9";
+}
+.fa-address-book-o:before {
+ content: "\f2ba";
+}
+.fa-vcard:before,
+.fa-address-card:before {
+ content: "\f2bb";
+}
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+ content: "\f2bc";
+}
+.fa-user-circle:before {
+ content: "\f2bd";
+}
+.fa-user-circle-o:before {
+ content: "\f2be";
+}
+.fa-user-o:before {
+ content: "\f2c0";
+}
+.fa-id-badge:before {
+ content: "\f2c1";
+}
+.fa-drivers-license:before,
+.fa-id-card:before {
+ content: "\f2c2";
+}
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+ content: "\f2c3";
+}
+.fa-quora:before {
+ content: "\f2c4";
+}
+.fa-free-code-camp:before {
+ content: "\f2c5";
+}
+.fa-telegram:before {
+ content: "\f2c6";
+}
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+ content: "\f2c7";
+}
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+ content: "\f2c8";
+}
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+ content: "\f2c9";
+}
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+ content: "\f2ca";
+}
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+ content: "\f2cb";
+}
+.fa-shower:before {
+ content: "\f2cc";
+}
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+ content: "\f2cd";
+}
+.fa-podcast:before {
+ content: "\f2ce";
+}
+.fa-window-maximize:before {
+ content: "\f2d0";
+}
+.fa-window-minimize:before {
+ content: "\f2d1";
+}
+.fa-window-restore:before {
+ content: "\f2d2";
+}
+.fa-times-rectangle:before,
+.fa-window-close:before {
+ content: "\f2d3";
+}
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+ content: "\f2d4";
+}
+.fa-bandcamp:before {
+ content: "\f2d5";
+}
+.fa-grav:before {
+ content: "\f2d6";
+}
+.fa-etsy:before {
+ content: "\f2d7";
+}
+.fa-imdb:before {
+ content: "\f2d8";
+}
+.fa-ravelry:before {
+ content: "\f2d9";
+}
+.fa-eercast:before {
+ content: "\f2da";
+}
+.fa-microchip:before {
+ content: "\f2db";
+}
+.fa-snowflake-o:before {
+ content: "\f2dc";
+}
+.fa-superpowers:before {
+ content: "\f2dd";
+}
+.fa-wpexplorer:before {
+ content: "\f2de";
+}
+.fa-meetup:before {
+ content: "\f2e0";
+}
+.fa-mastodon:before {
+ content: "\f2e1";
+}
+.fa-mastodon-alt:before {
+ content: "\f2e2";
+}
+.fa-fork-circle:before,
+.fa-fork-awesome:before {
+ content: "\f2e3";
+}
+.fa-peertube:before {
+ content: "\f2e4";
+}
+.fa-diaspora:before {
+ content: "\f2e5";
+}
+.fa-friendica:before {
+ content: "\f2e6";
+}
+.fa-gnu-social:before {
+ content: "\f2e7";
+}
+.fa-liberapay-square:before {
+ content: "\f2e8";
+}
+.fa-liberapay:before {
+ content: "\f2e9";
+}
+.fa-ssb:before,
+.fa-scuttlebutt:before {
+ content: "\f2ea";
+}
+.fa-hubzilla:before {
+ content: "\f2eb";
+}
+.fa-social-home:before {
+ content: "\f2ec";
+}
+.fa-artstation:before {
+ content: "\f2ed";
+}
+.fa-discord:before {
+ content: "\f2ee";
+}
+.fa-discord-alt:before {
+ content: "\f2ef";
+}
+.fa-patreon:before {
+ content: "\f2f0";
+}
+.fa-snowdrift:before {
+ content: "\f2f1";
+}
+.fa-activitypub:before {
+ content: "\f2f2";
+}
+.fa-ethereum:before {
+ content: "\f2f3";
+}
+.fa-keybase:before {
+ content: "\f2f4";
+}
+.fa-shaarli:before {
+ content: "\f2f5";
+}
+.fa-shaarli-o:before {
+ content: "\f2f6";
+}
+.fa-cut-key:before,
+.fa-key-modern:before {
+ content: "\f2f7";
+}
+.fa-xmpp:before {
+ content: "\f2f9";
+}
+.fa-archive-org:before {
+ content: "\f2fc";
+}
+.fa-freedombox:before {
+ content: "\f2fd";
+}
+.fa-facebook-messenger:before {
+ content: "\f2fe";
+}
+.fa-debian:before {
+ content: "\f2ff";
+}
+.fa-mastodon-square:before {
+ content: "\f300";
+}
+.fa-tipeee:before {
+ content: "\f301";
+}
+.fa-react:before {
+ content: "\f302";
+}
+.fa-dogmazic:before {
+ content: "\f303";
+}
+.fa-zotero:before {
+ content: "\f309";
+}
+.fa-nodejs:before {
+ content: "\f308";
+}
+.fa-nextcloud:before {
+ content: "\f306";
+}
+.fa-nextcloud-square:before {
+ content: "\f307";
+}
+.fa-hackaday:before {
+ content: "\f30a";
+}
+.fa-laravel:before {
+ content: "\f30b";
+}
+.fa-signalapp:before {
+ content: "\f30c";
+}
+.fa-gnupg:before {
+ content: "\f30d";
+}
+.fa-php:before {
+ content: "\f30e";
+}
+.fa-ffmpeg:before {
+ content: "\f30f";
+}
+.fa-joplin:before {
+ content: "\f310";
+}
+.fa-syncthing:before {
+ content: "\f311";
+}
+.fa-inkscape:before {
+ content: "\f312";
+}
+.fa-matrix-org:before {
+ content: "\f313";
+}
+.fa-pixelfed:before {
+ content: "\f314";
+}
+.fa-bootstrap:before {
+ content: "\f315";
+}
+.fa-dev-to:before {
+ content: "\f316";
+}
+.fa-hashnode:before {
+ content: "\f317";
+}
+.fa-jirafeau:before {
+ content: "\f318";
+}
+.fa-emby:before {
+ content: "\f319";
+}
+.fa-wikidata:before {
+ content: "\f31a";
+}
+.fa-gimp:before {
+ content: "\f31b";
+}
+.fa-c:before {
+ content: "\f31c";
+}
+.fa-digitalocean:before {
+ content: "\f31d";
+}
+.fa-att:before {
+ content: "\f31e";
+}
+.fa-gitea:before {
+ content: "\f31f";
+}
+.fa-file-epub:before {
+ content: "\f321";
+}
+.fa-python:before {
+ content: "\f322";
+}
+.fa-archlinux:before {
+ content: "\f323";
+}
+.fa-pleroma:before {
+ content: "\f324";
+}
+.fa-unsplash:before {
+ content: "\f325";
+}
+.fa-hackster:before {
+ content: "\f326";
+}
+.fa-spell-check:before {
+ content: "\f327";
+}
+.fa-moon:before {
+ content: "\f328";
+}
+.fa-sun:before {
+ content: "\f329";
+}
+.fa-f-droid:before {
+ content: "\f32a";
+}
+.fa-biometric:before {
+ content: "\f32b";
+}
+.fa-wire:before {
+ content: "\f32c";
+}
+.fa-tor-onion:before {
+ content: "\f32e";
+}
+.fa-volume-mute:before {
+ content: "\f32f";
+}
+.fa-bell-ringing:before {
+ content: "\f32d";
+}
+.fa-bell-ringing-o:before {
+ content: "\f330";
+}
+.fa-hal:before {
+ content: "\f333";
+}
+.fa-jupyter:before {
+ content: "\f335";
+}
+.fa-julia:before {
+ content: "\f334";
+}
+.fa-classicpress:before {
+ content: "\f331";
+}
+.fa-classicpress-circle:before {
+ content: "\f332";
+}
+.fa-open-collective:before {
+ content: "\f336";
+}
+.fa-orcid:before {
+ content: "\f337";
+}
+.fa-researchgate:before {
+ content: "\f338";
+}
+.fa-funkwhale:before {
+ content: "\f339";
+}
+.fa-askfm:before {
+ content: "\f33a";
+}
+.fa-blockstack:before {
+ content: "\f33b";
+}
+.fa-boardgamegeek:before {
+ content: "\f33c";
+}
+.fa-bunny:before {
+ content: "\f35f";
+}
+.fa-buymeacoffee:before {
+ content: "\f33d";
+}
+.fa-cc-by:before {
+ content: "\f33e";
+}
+.fa-creative-commons-alt:before,
+.fa-cc-cc:before {
+ content: "\f33f";
+}
+.fa-cc-nc-eu:before {
+ content: "\f341";
+}
+.fa-cc-nc-jp:before {
+ content: "\f342";
+}
+.fa-cc-nc:before {
+ content: "\f340";
+}
+.fa-cc-nd:before {
+ content: "\f343";
+}
+.fa-cc-pd:before {
+ content: "\f344";
+}
+.fa-cc-remix:before {
+ content: "\f345";
+}
+.fa-cc-sa:before {
+ content: "\f346";
+}
+.fa-cc-share:before {
+ content: "\f347";
+}
+.fa-cc-zero:before {
+ content: "\f348";
+}
+.fa-conway-hacker:before,
+.fa-conway-glider:before {
+ content: "\f349";
+}
+.fa-csharp:before {
+ content: "\f34a";
+}
+.fa-email-bulk:before {
+ content: "\f34b";
+}
+.fa-email-bulk-o:before {
+ content: "\f34c";
+}
+.fa-gnu:before {
+ content: "\f34d";
+}
+.fa-google-play:before {
+ content: "\f34e";
+}
+.fa-heroku:before {
+ content: "\f34f";
+}
+.fa-hassio:before,
+.fa-home-assistant:before {
+ content: "\f350";
+}
+.fa-java:before {
+ content: "\f351";
+}
+.fa-mariadb:before {
+ content: "\f352";
+}
+.fa-markdown:before {
+ content: "\f353";
+}
+.fa-mysql:before {
+ content: "\f354";
+}
+.fa-nordcast:before {
+ content: "\f355";
+}
+.fa-plume:before {
+ content: "\f356";
+}
+.fa-postgresql:before {
+ content: "\f357";
+}
+.fa-sass-alt:before {
+ content: "\f359";
+}
+.fa-sass:before {
+ content: "\f358";
+}
+.fa-skate:before {
+ content: "\f35a";
+}
+.fa-sketchfab:before {
+ content: "\f35b";
+}
+.fa-tex:before {
+ content: "\f35c";
+}
+.fa-textpattern:before {
+ content: "\f35d";
+}
+.fa-unity:before {
+ content: "\f35e";
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
diff --git a/in/fonts/forkawesome-webfont.woff2 b/in/fonts/forkawesome-webfont.woff2
new file mode 100644
index 0000000..7a03153
Binary files /dev/null and b/in/fonts/forkawesome-webfont.woff2 differ
diff --git a/in/fr/index.html b/in/fr/index.html
new file mode 100644
index 0000000..76b0fd2
--- /dev/null
+++ b/in/fr/index.html
@@ -0,0 +1,551 @@
+
+
+
+
+
+
+
+Curriculum Vitæ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+TEL
+
+ 33 607478434
+
+
+EMAIL
+
+cv marc.beninca.link
+
+
+
+
+
+
+
+Compétences
+
+
+veille technologique continue
+toujours curieux d’apprendre
+
+
+
+Amorçage
+
+ARM ,
+BIOS ,
+EFI ,
+GRUB ,
+Secure Boot
+
+BTRFS ,
+ESP ,
+LUKS ,
+LVM ,
+Parted ,
+RAID
+
+Linux ,
+Live ,
+SquashFS
+
+
+
+
+
+
+Ansible ,
+Jenkins ,
+Nexus ,
+SonarQube
+
+Forgejo ,
+Git ,
+Gitea ,
+GitHub ,
+GitLab
+
+Maven ,
+NPM ,
+NVD ,
+PIP ,
+PyPI ,
+UV
+
+
+
+
+Code
+
+
+
+
+Cryptographie
+
+
+
+
+Data
+
+
+
+
+Documentation
+
+
+
+
+Systèmes
+
+
+
+
+Virtualisation
+
+
+
+
+Web
+
+
+
+
+
+
+Liens
+
+
+
+Git
+
+
+
+Identité
+
+
+
+Social
+
+
+
+
+
+
+Éducation
+
+
+
+
+
+
+IRSM (Réseaux, Systèmes et Multimédia)
+
+
+
+
+
+
+
+
+CAI (Concepteur Architecte Informatique)
+
+
+
+
+
+
+
+
+
+
+
+amorçage, construction, configuration, sécurisation, maintien de systèmes
+modélisation, implémentation, intégration, déploiement, documentation de logiciels
+
+
+
+
+Expérience
+
+
+
+
+
+
+
+
+
+
Centre de Développement des Applications de la Défense
+
DevOps @ Assurance qualité, CDAD
+
+
+
+administration d’outils CI / CD : Gitea , GitLab , Jenkins , Nexus , SonarQube
+écriture de scripts Python pour maintenir des miroirs hors ligne :Alma , Alpine , CentOS , Debian , Docker , Maven , MSys2 , NPM , NVD , PyPI
+écriture et maintien de scripts BASH simplifiant usage et empaquetage pour MSys2
+écriture de playbooks et rôles Ansible pour configurations et déploiements
+construction d’images systèmes Ubuntu LTS Live avec interface graphique kiosque
+
+
+
+
+
+
+
Centre de Développement des Applications de la Défense
+
Administrateur système @ Infrastructure / Sécurité, CDAD
+
+
+
+administration d’infrastructures Proxmox et vSphere , avec VM et conteneurs LXC
+conception d’une architecture SSO : HAproxy , KeyCloak / WildFly , MariaDB Galera
+scripts Python pour : miroirs APT , dépôts Git , biclés OpenSSH , docs Sphinx
+
+
+
+
+
+
+
Centre de Développement des Applications de la Défense
+
Développeur logiciel @ Fabrique numérique, CDAD
+
+
+
+installation d’un réseau de développement : stations et serveur LXC sous Debian
+scripts BASH et Python pour : CloneZilla , Debian , DebMirror, GRUB , PanDoc
+écriture d’un programme Python pour migrer tous les dépôts SVN vers Git
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+MELISSA NG (MELISSA Nouvelle Génération)
+Réécriture complète en Java et base de données PostgreSQL :
+écriture d’un moteur cartographique basé sur images PNG et métadonnées XML
+écriture de pilotes, émulateurs et interfaces graphiques pour :
+prise en charge de l’équipement ADL (Airborne Data Loader), programmant les
+cartes sans contact DTM (Data Transfer Module) pour centrales avion Alpha Jet
+programmation simultanée de modules EEPROM pour centrales avion Mirage
+
+ import de fichiers KML / KMZ pour matérialiser des situations tactiques (SITAC)
+
+
+
+
+
+
+
+
+MELISSA (Module d’Élaboration Logique des Informations Simplifiées de Survol Aérien)
+Préparation, programmation, déchargement et rejeu de missions pour avions
+Alpha Jet , Transall , Mirage 2000 , Mirage F1 , Mirage IV , Jaguar :
+écriture de pilotes et interfaces graphiques pour :
+programmation séquentielle de modules EEPROM pour centrales avion Mirage
+programmation et déchargement de routes pour divers appareils GPS Garmin
+
+ import de base de données mondiale NavData (standard international ARINC 424 )
+exports NavData adaptés aux contraintes des centrales avion Transall (FMS )
+
+
+
+
+EVA (Écran de Visualisation Aéronef)
+Restitution embarquée de navigation et enregistreurs vidéo pour Mirage F1CR :
+optimisation de moteur cartographique pour ordinateurs embarqués (PC/104 )
+conception et réalisation d’un système dédié avec Windows XP Embedded Studio
+
+
+
+
+
+
+
+
+
+Projets personnels
+
+
+
+
+
+Projet parent, en Python et POSIX Shell
+
+
+Programme, en POSIX Shell et Python , gérant des pipelines CI / CD de façon unifiée :
+que l’infrastrucure réseau soit en ligne ou hors ligne avec CA et DNS locaux
+quelle que soit la forge: Forgejo , Gitea , GitHub , GitLab
+quelle que soit la base de système Linux du conteneur Docker :
+Alma , Alpine , Arch , Debian , Fedora , OpenSUSE , Rocky , Ubuntu
+
+
+
+
+Programme, en BASH et GRUB Shell , créant des systèmes de fichiers ESP avec :
+images GRUB autonomes, Secure Boot ou construites, pour ARM , EFI et BIOS
+vérification à la volée des signatures OpenPGP des images sélectionnées
+menu dynamique recherchant les images SquashFS amorçables Live disponibles
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/in/img/ForgeJo.svg b/in/img/ForgeJo.svg
deleted file mode 100644
index 804b05e..0000000
--- a/in/img/ForgeJo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/in/img/InstaGram.png b/in/img/InstaGram.png
deleted file mode 100644
index e388cb4..0000000
Binary files a/in/img/InstaGram.png and /dev/null differ
diff --git a/in/img/KeyOxide.png b/in/img/KeyOxide.png
deleted file mode 100644
index 249f088..0000000
Binary files a/in/img/KeyOxide.png and /dev/null differ
diff --git a/in/img/LinkedIn.png b/in/img/LinkedIn.png
deleted file mode 100644
index 40fb929..0000000
Binary files a/in/img/LinkedIn.png and /dev/null differ
diff --git a/in/img/PeerTube.png b/in/img/PeerTube.png
deleted file mode 100644
index 932a7ae..0000000
Binary files a/in/img/PeerTube.png and /dev/null differ
diff --git a/in/img/PixelFed.svg b/in/img/PixelFed.svg
deleted file mode 100644
index dfaf03f..0000000
--- a/in/img/PixelFed.svg
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
- icon/color/svg/pixelfed-icon-color
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/in/img/YouTube.png b/in/img/YouTube.png
deleted file mode 100644
index 69f69ab..0000000
Binary files a/in/img/YouTube.png and /dev/null differ
diff --git a/in/img/aae.png b/in/img/aae.png
new file mode 100644
index 0000000..889a310
Binary files /dev/null and b/in/img/aae.png differ
diff --git a/in/img/bluesky.svg b/in/img/bluesky.svg
new file mode 100644
index 0000000..c71e201
--- /dev/null
+++ b/in/img/bluesky.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/in/img/cdad-bdx.png b/in/img/cdad-bdx.png
new file mode 100644
index 0000000..6bf098d
Binary files /dev/null and b/in/img/cdad-bdx.png differ
diff --git a/in/img/ceam.png b/in/img/ceam.png
new file mode 100644
index 0000000..b81368d
Binary files /dev/null and b/in/img/ceam.png differ
diff --git a/in/img/cnam.png b/in/img/cnam.png
new file mode 100644
index 0000000..06d62c6
Binary files /dev/null and b/in/img/cnam.png differ
diff --git a/in/img/debian.jpeg b/in/img/debian.jpeg
deleted file mode 100644
index ab060b0..0000000
Binary files a/in/img/debian.jpeg and /dev/null differ
diff --git a/in/img/dirisi.png b/in/img/dirisi.png
new file mode 100644
index 0000000..247bb95
Binary files /dev/null and b/in/img/dirisi.png differ
diff --git a/in/img/en.png b/in/img/en.png
new file mode 100644
index 0000000..32b6133
Binary files /dev/null and b/in/img/en.png differ
diff --git a/in/img/en.svg b/in/img/en.svg
deleted file mode 100644
index fcec86c..0000000
--- a/in/img/en.svg
+++ /dev/null
@@ -1,1119 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/in/img/forgejo.svg b/in/img/forgejo.svg
new file mode 100644
index 0000000..9c46d82
--- /dev/null
+++ b/in/img/forgejo.svg
@@ -0,0 +1,40 @@
+
+
+
+
+ Forgejo logo
+ Caesar Schinas
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/in/img/fr.png b/in/img/fr.png
new file mode 100644
index 0000000..59cca8f
Binary files /dev/null and b/in/img/fr.png differ
diff --git a/in/img/fr.svg b/in/img/fr.svg
deleted file mode 100644
index b50bd7e..0000000
--- a/in/img/fr.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/in/img/gaio.png b/in/img/gaio.png
new file mode 100644
index 0000000..193fe53
Binary files /dev/null and b/in/img/gaio.png differ
diff --git a/in/img/keyoxide.svg b/in/img/keyoxide.svg
new file mode 100644
index 0000000..bc37abe
--- /dev/null
+++ b/in/img/keyoxide.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/in/img/link.svg b/in/img/link.svg
new file mode 100644
index 0000000..0ef3a14
--- /dev/null
+++ b/in/img/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/in/img/linkedin.svg b/in/img/linkedin.svg
new file mode 100644
index 0000000..a5c4e76
--- /dev/null
+++ b/in/img/linkedin.svg
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/in/img/location.svg b/in/img/location.svg
new file mode 100644
index 0000000..f443b44
--- /dev/null
+++ b/in/img/location.svg
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/in/img/mail.svg b/in/img/mail.svg
new file mode 100644
index 0000000..dd0cc8c
--- /dev/null
+++ b/in/img/mail.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/in/img/marc.jpeg b/in/img/marc.jpeg
deleted file mode 100644
index b8fabcc..0000000
Binary files a/in/img/marc.jpeg and /dev/null differ
diff --git a/in/img/peertube.svg b/in/img/peertube.svg
new file mode 100644
index 0000000..0e6e228
--- /dev/null
+++ b/in/img/peertube.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/in/img/rwx.svg b/in/img/rwx.svg
new file mode 100644
index 0000000..7a2a9ee
--- /dev/null
+++ b/in/img/rwx.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+index
+
+
+x
+
+X
+
+
+
+r
+
+R
+
+
+
+x->r
+
+
+
+
+
+w
+
+W
+
+
+
+r->w
+
+
+
+
+
+w->x
+
+
+
+
+
+w->r
+
+
+
+
+
diff --git a/in/img/tel.svg b/in/img/tel.svg
new file mode 100644
index 0000000..42cb379
--- /dev/null
+++ b/in/img/tel.svg
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/in/img/theme.svg b/in/img/theme.svg
new file mode 100644
index 0000000..64d26fd
--- /dev/null
+++ b/in/img/theme.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/in/img/web.svg b/in/img/web.svg
new file mode 100644
index 0000000..0099d72
--- /dev/null
+++ b/in/img/web.svg
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/in/index.html b/in/index.html
new file mode 120000
index 0000000..d7a7d75
--- /dev/null
+++ b/in/index.html
@@ -0,0 +1 @@
+en/index.html
\ No newline at end of file
diff --git a/in/marc.beninca.asc b/in/marc.beninca.asc
deleted file mode 100644
index daf987b..0000000
--- a/in/marc.beninca.asc
+++ /dev/null
@@ -1,75 +0,0 @@
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-mDMEXTefmxYJKwYBBAHaRw8BAQdA+H8/RzqjvpB7+mnypomWrxRe2zoUO0htbwP7
-xC/Mxei0IE1hcmMgQmVuaW5jYSA8bWFyY0BiZW5pbmNhLmxpbms+iQGOBBMWCgE2
-AhsBAgsJAhUKAhYDAh4BAheAAhkBMBSAAAAAABAAF3Byb29mQGFyaWFkbmUuaWRk
-bnM6dGlsZGUubGluaz90eXBlPVRYVDUUgAAAAAAQABxwcm9vZkBhcmlhZG5lLmlk
-ZG5zOm1hcmMtYmVuaW5jYS5mcj90eXBlPVRYVDIUgAAAAAAQABlwcm9vZkBhcmlh
-ZG5lLmlkZG5zOmJlbmluY2EubGluaz90eXBlPVRYVDQUgAAAAAAQABtwcm9vZkBh
-cmlhZG5lLmlkZG5zOmNvbXB1dGluZy5sYW5kP3R5cGU9VFhULhSAAAAAABAAFXBy
-b29mQGFyaWFkbmUuaWRkbnM6cnd4Lndvcms/dHlwZT1UWFQWIQQI7acAYjSg6ymj
-qEcdvV7EutpVeQUCZld4FwUJCwEL/AAKCRAdvV7EutpVeStiAQC5mlCjnqk4FU26
-bdDJyx69ghq+bxnTsvs6GkOfwByxNwEAn1ekf7ZvnN2i/xLKbjw3tw1XlZzBiqzg
-CgECjNiu4gG0JE1hcmMgQmVuaW5jYSA8Z2l0QG1hcmMuYmVuaW5jYS5saW5rPojT
-BBMWCgB7AhsBAgsJAhUKAhYDAh4BAheARRSAAAAAABAALHByb29mQGFyaWFkbmUu
-aWRodHRwczovL2ZvcmdlLnJ3eC53b3JrL21hcmMuYmVuaW5jYS8ucHJvZmlsZRYh
-BAjtpwBiNKDrKaOoRx29XsS62lV5BQJmV3gXBQkLAQv8AAoJEB29XsS62lV5ceoB
-ANCsDlwxQO75SVnvt11RNShnSqZl4S8wNDfJpOJyybTZAP4wTHDw8g82BYHgRPl/
-SpXBMSyK3bfii4qVqyGmHXWIC7QnTWFyYyBCZW5pbmNhIDxzb2NpYWxAbWFyYy5i
-ZW5pbmNhLmxpbms+iQLSBBMWCgJ6AhsBAgsJAhUKAhYDAh4BAheAShSAAAAAABAA
-MXByb29mQGFyaWFkbmUuaWRodHRwczovL25ld3MueWNvbWJpbmF0b3IuY29tL3Vz
-ZXI/aWQ9bWFyY19iZW5pbmNhPxSAAAAAABAAJnByb29mQGFyaWFkbmUuaWRodHRw
-czovL3Byb2dyYW1taW5nLmRldi91L21hcmNfYmVuaW5jYUMUgAAAAAAQACpwcm9v
-ZkBhcmlhZG5lLmlkaHR0cHM6Ly9waXhlbGZlZC5zb2NpYWwvdXNlcnMvbWFyYy5i
-ZW5pbmNhOxSAAAAAABAAInByb29mQGFyaWFkbmUuaWRodHRwczovL2xpYmVyYXBh
-eS5jb20vbWFyYy5iZW5pbmNhPRSAAAAAABAAJHByb29mQGFyaWFkbmUuaWRodHRw
-czovL21hc3RvZG9uLmNsb3VkL0BtYXJjX2JlbmluY2E9FIAAAAAAEAAkcHJvb2ZA
-YXJpYWRuZS5pZGh0dHBzOi8vZGV2cy5saXZlL3VzZXJzL21hcmNfYmVuaW5jYUQU
-gAAAAAAQACtwcm9vZkBhcmlhZG5lLmlkaHR0cHM6Ly9wZWVydHViZS5pcmlzZWRl
-bi5ldS9hL21hcmNfYmVuaW5jYT4UgAAAAAAQACVwcm9vZkBhcmlhZG5lLmlkaHR0
-cHM6Ly9yYW50LmxpL21hcmMtYmVuaW5jYS9rZXlveGlkZTkUgAAAAAAQACBwcm9v
-ZkBhcmlhZG5lLmlkaHR0cHM6Ly9sb2JzdGUucnMvdS9tYXJjX2JlbmluY2EWIQQI
-7acAYjSg6ymjqEcdvV7EutpVeQUCZld4GAUJCwEL/AAKCRAdvV7EutpVeYD4AP4v
-2JGU1fRKrjJef93q0+SRq+cPDDvQsPZewaokig3m8AD/UHc6qnBD8uJvZIkkgNQ0
-ej7DQhKeMxq0OLqfvMTXaQ+4MwRkBLE2FgkrBgEEAdpHDwEBB0AsYIYac0mKd7Ui
-WhnkXlDo2hidqKEDneaCGfRV9UhR4Yh+BBgWCgAmAhsgFiEECO2nAGI0oOspo6hH
-Hb1exLraVXkFAmZXeBkFCQQz+mMACgkQHb1exLraVXmcewD/S0zIWpVmEJikiijA
-Kd97fjcYGuAWdcYnkhARFU7cihgBAIarS+OWe5ZkvOVZAJDCCTxLrdpN8tQXgf4K
-xP9RxVMKuDMEZASx7RYJKwYBBAHaRw8BAQdAwJl98sJxO1aJ/6ucVHDMxjpjNuI+
-l7/M5I6Z8GdNHzCI9QQYFgoAJgIbAhYhBAjtpwBiNKDrKaOoRx29XsS62lV5BQJm
-V3gZBQkEM/msAIF2IAQZFgoAHRYhBEZFD76ABdKwQwlIa70nrOrleYioBQJkBLHt
-AAoJEL0nrOrleYio6MwA/Rrcqz5tol3l3fuADm0PWk3MzeaClfYC9ICaxS994mDQ
-AP9etGedvYD4evXdJ1aQ41a0cLi+vbctUaeKmVmjUZNXBgkQHb1exLraVXlzrQEA
-1myZeH/H1cF+61cKsi6fEsAgXJXuF7IykX8/Rp3b1+YBAO70LDuaIAw4JozIAWVX
-aUt2q9cu8ihSBAzI5mM7hc0AuDgEZASzfBIKKwYBBAGXVQEFAQEHQOL7FEfVtSrh
-I36LfH8Suxvcb6t9z40yTvDgNaDbCtFMAwEIB4h+BBgWCgAmAhsMFiEECO2nAGI0
-oOspo6hHHb1exLraVXkFAmZXeBkFCQQz+B0ACgkQHb1exLraVXkF6gEAry1FxYoP
-0Bw7a8TR7bo3/MlOYfOYvcW7J7B35P3l6HMBAMjd2Qo5QklwLlSCLZ2S74mptlj0
-GdQ1w1trFHvZoiEHuQINBGVJ9IYBEACmuAQeyc3N/xXxX5PR8KeXLR7yeEhzzSCH
-Eppc2GId+TTK6kHU65Cc20deXjjHjqSeghGZ585soCV1l38e3dYJ13puPjRqnQ2g
-bu6kRPHR1vEFYnDHCAGV+Tv8orKJ505Xo5sRxtETtEeK6KpwmgwO7kWJprmD8oDa
-MkDMSGNwF3ogEtrkYc1g5S8gtiHS5jcg7GUHp3jMtyrPoyWj1YPzxWe7/EG8tYEo
-wy6FPwrLNEFFIF2oRlq6/bXyr0bb3tuyYYWTeHMhQ3YZJ8AUhXfVeiJQ28JxMjFX
-+wmNwE9IvDMWRdb/PYNPE/hfni1eCSlNgIYGXMa8xZL00k7W2DNbSXReB98bw6YH
-2CaXutE+zy7R9+GPhWCy+nQiYRCZMIO40H0nTED9ZgztrIByDxjxJD6Q6KhFnwAl
-z8HQ8oPyq8HFwGX7zElRVC+fka9znhqqSYm4WrX7OuXbTsFT03/wKnLLaS9lgb0X
-MIz0fvOjzl1HZBeFV+1+oRT94f+cp7iJgIN3G2ALcpBI97yE10dWPuO/WOgFbPh7
-3y+olH8ujxPI5xMNg5pS40sjqCW1vwM4zBzPs5RPioX+9EtEQCAAyoq6TBYHMJxv
-tzwAogoCOo5sAQcIR8Sg7EpwhSjJrbVt4rjqq82EKzhqZj4nrS9ycrrlTHGqs7NA
-ZsCuoCj7bQARAQABiQK0BBgWCgAmAhsCFiEECO2nAGI0oOspo6hHHb1exLraVXkF
-AmZXeBkFCQLutxMCQMF0IAQZAQoAHRYhBDEqzfm7A8ga3pW5wJx2E0UMgMJPBQJl
-SfSGAAoJEJx2E0UMgMJP+2kP/0f/azRfWgHd4ce1COKv/u9XLqNOmEpBYMgi86GU
-Z8natRGk4TPFvfjo3qY6LSDrA3PgzYR/T3NSw4+rDuSpRr1U9nWFQ34CIj5phC5t
-IPwQeLUk4699wi0BsLBdYeiOEBJ3km6O1FdsNdOrB6Xuvom20ymx3eDAEf1xwFo6
-PJLITQVK6cz/iC7VCN68cBd/NE/8mTT7caWRxhFjZ7/7vcuu0DpwJG9wShCnEcqs
-IfKQGssztC9sH4usYfcQHSba+wAeRLVBbLqN7SmG7EFhdRCf5Kxw/nfXa3NEWIEg
-+OEmsBHaerMMJ/sQ8++LTbL//xFtJCyVj21qlybAmzavjEj21c3JHvMX+qpX3Afp
-nHsT/7suUhYiuZWpZa+ornEBXfJKTj+9Mn9apjwGQMEulJ+b+y8DcjgIBpEjZAyt
-h0mFr0cLm43OY/ujZY+W755PivJJTBUaQVL0XQEM5KkDWfxUzCrfipGIQla+h5Al
-JQti13UY/Nd3PGoBao35B/7AiWHhxtFx4TSNDA08pLuhHVqimcgtdRMkmgDdAws2
-EnNGz0Bv/Q5OY7La1Uo/9uIIvIyOXZ0O069NyrhnV9RUSfC/ACvAI0q07wABPQWo
-YzFxBs9RL/Anm2q+QVWVq1Rn1HyvUjRPLDNWgVMcDQQ/nanSMRLvLbGw5fzOaY2f
-opOeCRAdvV7EutpVeSA8AQDvn67nBs1ci9OlaqMHjRYObQkQUJOIdjqXlgMEHjBX
-4QEAom3cNIGGbP8AupzSa+8PeRgvYD6VW6mJfbqjQz8q1A4=
-=jG40
------END PGP PUBLIC KEY BLOCK-----
diff --git a/in/marc.beninca.pgp b/in/marc.beninca.pgp
deleted file mode 100644
index 312f125..0000000
Binary files a/in/marc.beninca.pgp and /dev/null differ
diff --git a/in/marc.beninca.vcf b/in/marc.beninca.vcf
new file mode 100644
index 0000000..f84c741
--- /dev/null
+++ b/in/marc.beninca.vcf
@@ -0,0 +1,8 @@
+BEGIN:VCARD
+VERSION:4.0
+N:Beninca;Marc
+FN:Marc Beninca
+TEL:+33607478434
+EMAIL:cv@marc.beninca.link
+URL:marc.beninca.link
+END:VCARD
diff --git a/in/pdf/cv.en.pdf b/in/pdf/cv.en.pdf
deleted file mode 100644
index 179b30f..0000000
Binary files a/in/pdf/cv.en.pdf and /dev/null differ
diff --git a/in/pdf/cv.fr.pdf b/in/pdf/cv.fr.pdf
deleted file mode 100644
index 0ad5cd8..0000000
Binary files a/in/pdf/cv.fr.pdf and /dev/null differ
diff --git a/in/script/main.js b/in/script/main.js
new file mode 100644
index 0000000..7b6582a
--- /dev/null
+++ b/in/script/main.js
@@ -0,0 +1,37 @@
+const buttons = ["item", "link", "swap"];
+
+for (let button of buttons) {
+ document.getElementById(button).addEventListener("click", () => {
+ document.body.classList.toggle(button);
+ });
+}
+
+let theme
+
+function theme_get() {
+ theme = localStorage.getItem("theme");
+ if (! theme) {
+ if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
+ theme = "dark";
+ } else {
+ theme = "light";
+ }
+ }
+ theme_set()
+}
+
+function theme_set() {
+ document.documentElement.setAttribute("data-theme", theme);
+ localStorage.setItem("theme", theme);
+}
+
+function theme_swap() {
+ theme = theme === "light" ? "dark" : "light";
+ theme_set();
+}
+
+document.getElementById("theme").addEventListener("click", () => {
+ theme_swap();
+});
+
+theme_get()
diff --git a/in/style/debug.css b/in/style/debug.css
new file mode 100644
index 0000000..9be33b8
--- /dev/null
+++ b/in/style/debug.css
@@ -0,0 +1,5 @@
+* {
+ border-color: lightgray;
+ border-style: dashed;
+ border-width: 1px;
+}
diff --git a/in/style/main.css b/in/style/main.css
new file mode 100644
index 0000000..e0f4fc0
--- /dev/null
+++ b/in/style/main.css
@@ -0,0 +1,265 @@
+/* variables */
+
+:root {
+ --alpha: rgba(0, 0, 0, 0);
+ /* border */
+ --border-off: var(--border-width) none var(--alpha);
+ --border-on: var(--border-width) solid var(--border-color);
+ --border-width: .1rem;
+ /* margin */
+ --margin: .4rem;
+ /* theme */
+ color-scheme: light dark;
+ /* theme / gradients */
+ --anchor-gradient: linear-gradient(to top, var(--alpha), var(--anchor-background), var(--alpha));
+ --banner-gradient: linear-gradient(to top, var(--alpha), var(--banner-background));
+ --body-gradient: linear-gradient(to top, var(--alpha), var(--body-background));
+ --header-gradient: linear-gradient(to top, var(--alpha), var(--header-background));
+ --item-even-gradient: linear-gradient(to top, var(--alpha), var(--item-even));
+ --item-odd-gradient: linear-gradient(to top, var(--alpha), var(--item-odd));
+ --org-gradient: linear-gradient(to top, var(--alpha), var(--org-background));
+ /* theme / light */
+ --anchor-background: #fcc;
+ --anchor-text: #f00;
+ --banner-background: #ccf;
+ --body-background: #fff;
+ --body-text: #000;
+ --border-color: #888;
+ --button-background: #bbb;
+ --header-background: #ccc;
+ --item-even: #ddd;
+ --item-odd: #eee;
+ --org-background: #afa;
+ --qrcode-background: ;
+ --ruler-border: #888;
+}
+@media screen {
+[data-theme="dark"] {
+ /* theme / dark */
+ --anchor-background: #622;
+ --anchor-text: #f88;
+ --banner-background: #558;
+ --body-background: #000;
+ --body-text: #aaa;
+ --border-color: #888;
+ --button-background: #444;
+ --header-background: #444;
+ --item-even: #222;
+ --item-odd: #111;
+ --org-background: #030;
+ --qrcode-background: #aaa;
+ --ruler-border: #444;
+}
+}
+
+/* main */
+
+#item, #link, #swap, #theme {
+ background-color: var(--button-background);
+}
+#swap::after { content: "◂"; }
+body.swap #swap::after { content: "▸"; }
+#vcard {
+ background-color: var(--qrcode-background);
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "fa";
+ src: url("font/fa.woff2");
+}
+
+html {
+ font-family: "DejaVu Sans", sans-serif;
+ text-align: start;
+}
+
+body {
+ background-color: var(--body-background);
+ color: var(--body-text);
+ margin-inline: auto;
+ max-inline-size: 108ch;
+ padding-inline: .25rem;
+}
+
+article, h2, h3, table {
+ margin-block-start: var(--margin);
+}
+
+h2, h3, header {
+ border-bottom: var(--border-off);
+ border-left: var(--border-on);
+ border-right: var(--border-on);
+ border-top: var(--border-on);
+}
+
+.link a:not(:has(img)),
+.link button.link {
+ background: var(--anchor-gradient);
+}
+a:not(:has(img)) {
+ color: inherit;
+ padding: 0 .2em;
+ text-decoration: none;
+ text-decoration-skip-ink: auto;
+ text-underline-offset: .2em;
+}
+a:hover {
+ color: var(--anchor-text);
+}
+
+body.item button.item {
+ background: var(--item-odd-gradient);
+}
+
+article.org, header {
+ border-radius: .25em;
+ padding-block: .25em;
+}
+header {
+ padding-inline: .5em;
+ background: var(--header-gradient);
+}
+header.org {
+ background: var(--org-gradient);
+}
+
+article header {
+ display: flex;
+ justify-content: space-between;
+}
+
+div.org {
+ display: flex;
+}
+
+section.banner {
+ align-items: center;
+ display: flex;
+ justify-content: space-evenly;
+}
+.banner {
+ margin-block-start: .5em;
+}
+
+button {
+ block-size: 2em;
+ border-radius: .25em;
+ color: var(--body-text);
+ margin-block: 0 auto;
+ margin-inline: .25em;
+ padding-inline: .5em;
+}
+
+h1, h2, h3 {
+ border-radius: .25em;
+ font-weight: bold;
+}
+h1 {
+ font-size: 1.15rem;
+}
+h2 {
+ background: var(--banner-gradient);
+ font-size: 1.10rem;
+ padding-block: .25em;
+ text-align: center;
+}
+h3 {
+ background: var(--header-gradient);
+ font-size: 1.05rem;
+ padding: .125em .25em;
+}
+
+hr {
+ border: .1em dashed;
+ border-color: var(--ruler-border);
+ margin-block: var(--margin);
+}
+
+img.big {
+ block-size: 5em;
+}
+img.inline {
+ block-size: 1.5em;
+ vertical-align: middle;
+}
+a.logo {
+ block-size: 2em;
+ margin-block: 0 auto;
+}
+img.logo {
+ block-size: 100%;
+ margin-inline: auto;
+}
+img.org {
+ block-size: 2em;
+ margin-inline-end: .5em;
+}
+
+body.item li:nth-of-type(even) {
+ background: var(--item-even-gradient);
+}
+body.item li:nth-of-type(odd) {
+ background: var(--item-odd-gradient);
+}
+
+strong, th {
+ text-shadow: .05em .05em .05em;
+}
+
+.banner table {
+ margin-block-start: 0;
+ margin-inline: 0;
+}
+table {
+ border-collapse: separate;
+ border-spacing: .5em .125em;
+ margin-inline: auto;
+}
+table h3 {
+ text-align: center;
+}
+th.logo, td.logo {
+ block-size: 1.5em;
+}
+th {
+ text-align: end;
+}
+
+ul {
+ list-style-type: disc;
+ padding-inline-start: 1.25em;
+}
+
+.columns {
+ display: grid;
+ gap: 1em;
+ grid-template-columns: 1fr;
+}
+.level {
+ text-align: center;
+}
+.title, .duration.org {
+ font-weight: bold;
+}
+.sub, .period {
+ font-size: .75em;
+}
+.time {
+ text-align: end;
+}
+
+@media (width > 66ch), print {
+ .columns { grid-template-columns: 1fr 2fr; }
+ body.swap .columns { grid-template-columns: 2fr 1fr; }
+ body.swap aside { order: 2; }
+ body.swap main { order: 1; }
+}
+
+@media print {
+ @page { size: A4; }
+ html { font-size: 3mm; }
+ button { display: none; }
+ /* way too blurry as PDF output above .041em */
+ strong, th { text-shadow: .05em .05em .041em; }
+}
diff --git a/in/style/reset.css b/in/style/reset.css
new file mode 100644
index 0000000..25ddd3a
--- /dev/null
+++ b/in/style/reset.css
@@ -0,0 +1,43 @@
+*::after,
+*::before,
+* {
+ box-sizing: border-box;
+}
+
+* {
+ font: inherit;
+ margin: 0;
+ padding: 0;
+}
+
+html {
+ color-scheme: dark light;
+}
+
+body {
+ /* LATER */
+ hanging-punctuation: first last;
+ @media screen {
+ min-block-size: 100svh;
+ }
+}
+
+h1, h2, h3, h4, h5, h6 {
+ text-wrap: balance;
+}
+
+figcaption,
+li,
+p {
+ max-inline-size: 79ch;
+ /* LATER */
+ text-wrap: pretty;
+}
+
+img,
+picture,
+svg,
+video {
+ display: block;
+ max-inline-size: 100%;
+}
diff --git a/link.gv b/link.gv
deleted file mode 100644
index 0c40c49..0000000
--- a/link.gv
+++ /dev/null
@@ -1,71 +0,0 @@
-digraph {
-
-graph [
-rankdir="LR"
-]
-node [
-#shape="record"
-]
-
-subgraph cluster_git {
-"bitbucket" [label="Bit\nBucket",href="https://bitbucket.org/marc_beninca"]
-"github" [label="Git\nHub",href="https://github.com/marc-beninca"]
-"gitlab" [label="Git\nLab",href="https://gitlab.com/marc.beninca"]
-}
-
-"facebook" [label="Face\nBook",href="https://facebook.com/marc.beninca.page"]
-"hackernews" [label="Hacker\nNews",href="https://news.ycombinator.com/user?id=marc_beninca"]
-"instagram" [label="Insta\nGram",href="https://instagram.com/marc.beninca"]
-"linuxfr" [label="Linux\nFR",href="https://linuxfr.org/users/marc-beninca"]
-"lobsters" [label="Lobsters",href="https://lobste.rs/u/marc_beninca"]
-"mastodon" [label="Mastodon",href="https://social.tchncs.de/@marc_beninca"]
-"omglol" [label="OMG\nLOL",href="https://omg.lol/marc-beninca"]
-"openstreetmap" [label="Open\nStreet\nMap",href="https://openstreetmap.org/user/Marc Beninca"]
-"pleroma" [label="Pleroma",href="https://poa.st/@marc_beninca"]
-"reddit" [label="Reddit",href="https://reddit.com/user/marc_beninca"]
-"twitch" [label="Twitch",href="https://twitch.tv/marc_beninca"]
-"twitter" [label="Twitter",href="https://twitter.com/marc_beninca"]
-"youtube" [label="You\nTube",href="https://youtube.com/channel/UC4uk_6OKRke2soVah-Tf2Lw"]
-
-"keybase" [label="Key\nBase",href="https://keybase.io/marc_beninca"]
-"liberapay" [label="Libera\nPay",href="https://liberapay.com/marc.beninca"]
-"patreon" [label="Patreon",href="https://patreon.com/marc_beninca"]
-"utip" [label="U\ntip",href="https://utip.io/marc_beninca"]
-
-
-"instagram" -> "facebook"
-
-"keybase" -> {
-"github"
-"hackernews"
-"lobsters"
-"omglol"
-"reddit"
-"twitter"
-}
-"liberapay" -> {
-"bitbucket"
-"github"
-"gitlab"
-"linuxfr"
-"mastodon"
-"openstreetmap"
-"pleroma"
-"twitch"
-"twitter"
-}
-"patreon" -> {
-"facebook"
-"instagram"
-"twitter"
-"youtube"
-}
-"utip" -> {
-"facebook"
-"instagram"
-"twitch"
-"twitter"
-"youtube"
-}
-
-}
diff --git a/pubnix.py b/pubnix.py
deleted file mode 100644
index 30d5b30..0000000
--- a/pubnix.py
+++ /dev/null
@@ -1,61 +0,0 @@
-import os
-import subprocess
-
-PORT = 22
-USER = 'mspe'
-ROOT = 'public_html'
-PROTOCOL = 'https'
-DIR = False
-
-
-class PubNix:
-
- def __init__(self, dn,
- ssh=None, port=PORT, user=USER,
- root=ROOT, dir=DIR, web=None, sub=None):
- self.dn = dn
- self.ssh = f'{ssh}.{self.dn}' if ssh else self.dn
- self.port = port
- self.user = user
- self.root = root
- self.web = f'{web}.{self.dn}' if web else self.dn
- if sub:
- self.fqdn = f'{self.user}.{self.web}'
- self.context = None
- else:
- self.fqdn = self.web
- self.context = f'~{self.user}'
- self.path = os.path.join(self.root, self.fqdn) if dir else self.root
- self.target = f'{self.user}@{self.ssh}:{self.path}'
- self.url = [f'{PROTOCOL}:', str(), self.fqdn]
- if self.context:
- self.url.append(self.context)
- self.url = '/'.join(self.url)
-
- def capturun(self, *args):
- return self.run(*args, capture_output=True)
-
- def run(self, *args, **kwargs):
- return subprocess.run(['ssh',
- '-o', 'LogLevel Error',
- '-p', str(self.port),
- f'{self.user}@{self.ssh}',
- '--',
- *args,
- ], **kwargs)
-
- def disk_free(self):
- process = self.capturun('df', '-h', os.curdir)
- return process.stdout.decode('UTF-8').strip()
-
- def os(self):
- ps = self.capturun('cat', '/etc/os-release')
- if ps.returncode == 0:
- for line in ps.stdout.decode('UTF-8').strip().split(os.linesep):
- if 'PRETTY_NAME' in line:
- return line.split('=')[1].split('"')[1]
- else:
- return self.capturun('uname', '-sr').stdout.decode('UTF-8').strip()
-
- def __str__(self):
- return os.linesep.join([self.target, self.url])
diff --git a/readme.md b/readme.md
index 97ed378..c183e9e 100644
--- a/readme.md
+++ b/readme.md
@@ -1,13 +1,23 @@
-# Marc Beninca
+# CV
-## ToDo
+## Tasks
-## Nope
-
-### Email
-
- * biolink.me
-
-### GAFAM
-
- * about.me
+* french link for
+ * ARINC 424
+ * ESP
+ * Galera
+ * KeyCloak
+ * LVM
+ * MSys2
+ * Mirage
+ * Nexus
+ * PDFtk
+ * uWSGI
+* lsgm
+ * radicle
+ * tangled
+* spcd
+ * radicle
+ * tangled
+* lists items highlighting
+ * vertical middle
diff --git a/sync.py b/sync.py
deleted file mode 100755
index 2a63d5d..0000000
--- a/sync.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#! /usr/bin/env python3
-
-import os
-import subprocess
-
-import pubnix
-
-ARGS = [
- {'dn':'blinkenshell.org',
- 'ssh': 'ssh', 'port': 2222, 'web': 'u', 'sub': True},
- {'dn':'ctrl-c.club', 'sub': False},
- {'dn':'dimension.sh', 'sub': True},
- {'dn':'envs.net', 'sub': True},
- {'dn':'freeshell.de', 'sub': False},
- # {'dn':'hextilde.xyz', 'sub': True},
- {'dn':'insomnia247.nl', 'dir': True, 'sub': True},
- {'dn':'p.projectsegfau.lt', 'sub': True},
- # {'dn':'pubnix.pink', 'web': 'sites', 'sub': False},
- {'dn':'rawtext.club', 'sub': False},
- {'dn':'rw.rs', 'sub': False},
- {'dn':'thunix.net', 'sub': False},
- {'dn':'tilde.32bit.cafe', 'root': 'www', 'sub': False},
- {'dn':'tilde.cafe', 'sub': True},
- {'dn':'tilde.club', 'sub': False},
- {'dn':'tilde.fun', 'root': 'html', 'sub': False},
- {'dn':'tilde.green', 'sub': False},
- {'dn':'tilde.guru', 'sub': False},
- {'dn':'tilde.institute', 'sub': True},
- {'dn':'tilde.pink', 'sub': False},
- {'dn':'tilde.team', 'sub': True},
- {'dn':'tilde.town', 'sub': False},
- # {'dn':'trash.town', 'sub': False},
- # permissions
- # {'dn':'sdf.org', 'root': 'html', 'sub': True},
- # old
- {'dn':'fr.tild3.org', 'sub': True},
- {'dn':'remotes.club', 'port': 9022, 'root': 'web', 'sub': True},
- {'dn':'squiggle.city', 'sub': False},
- # down
- # {'dn':'aussies.space', 'sub': False},
- # {'dn':'heathens.club', 'root': 'www', 'sub': False},
- # {'dn':'vern.cc', 'sub': True},
-]
-PUBNIXES = [pubnix.PubNix(**args) for args in ARGS]
-
-
-def sync(root, pubnix, exclude=None):
- args = [
- 'rsync',
- '--archive',
- '--checksum',
- '--delete-before',
- '--rsh', f"ssh -o 'LogLevel Error' -p {pubnix.port}",
- '--partial',
- '--progress',
- '--verbose',
- os.path.join(root, str()),
- ]
- for item in exclude:
- args.extend(['--exclude', os.path.join(str(), item)])
- args.append(os.path.join(pubnix.target, str()))
- subprocess.call(args, stdout=subprocess.DEVNULL)
-
-
-def main():
- root = os.path.dirname(os.path.realpath(__file__))
- root = os.path.join(root, 'out', 'web')
- dns_length = max([len(pubnix.dn) for pubnix in PUBNIXES])
- for pubnix in PUBNIXES:
- print()
- print(pubnix)
- # print(f'{pubnix.dn.rjust(dns_length)} → ', end=str(), flush=True)
- sync(root, pubnix, exclude=['__pycache__', 'pgp.asc'])
- # print(pubnix.disk_free())
- # print(pubnix.os())
-
-
-if __name__ == '__main__':
- main()
diff --git a/test.css b/test.css
deleted file mode 100644
index fcb78a1..0000000
--- a/test.css
+++ /dev/null
@@ -1,40 +0,0 @@
-.tabs {
-display: flex;
-flex-wrap: wrap;
-}
-.tabs > input {
-display: none;
-}
-.tabs > input:checked + label + div {
-display: block;
-}
-.tabs > label {
-order: 1;
-}
-.tabs > div {
-display: none;
-flex-basis: 100%;
-order: 2;
-}
-
-.tabs {
-border: 1px solid;
-}
-.tabs > input:checked + label {
-background-color: gray;
-}
-.tabs > label {
-padding: 10px;
-}
-.tabs > div {
-padding: 10px;
-}
-
-body {
-background-color: white;
-color: black;
-}
-body.dark {
-background-color: black;
-color: white;
-}
diff --git a/test.html b/test.html
deleted file mode 100644
index 982a6e6..0000000
--- a/test.html
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Tab: 1
-
-
-
-
Tab: 1 / 1
-
Tab: One / One
-
-
Tab: 1 / 2
-
Tab: One / Two
-
-
Tab: 1 / 3
-
Tab: One / Three
-
-
-
-
Tab: 2
-
-
-
-
Tab: 2 / 1
-
Tab: Two / One
-
-
Tab: 2 / 2
-
Tab: Two / Two
-
-
Tab: 2 / 3
-
Tab: Two / Three
-
-
-
-
-
-
diff --git a/test.js b/test.js
deleted file mode 100644
index b482e7c..0000000
--- a/test.js
+++ /dev/null
@@ -1,29 +0,0 @@
-function check(tab) {
- const tabs = tab.split('/')
- let path = 'tab'
- for (tab of tabs) {
- path = `${path}/${tab}`
- document.getElementById(path).checked = true
- }
-}
-function push(tab) {
- window.history.pushState(null, null, `?tab=${tab}`)
-}
-function update(id) {
- const tab = id.split('/').slice(1).join('/')
- push(tab)
-}
-function main() {
- let tab = (new URL(document.location)).searchParams.get('tab')
- if (tab) {
- check(tab)
- } else {
- tab = '1/1'
- check(tab)
- push(tab)
- }
-}
-
-function swap() {
- document.body.classList.toggle('dark')
-}