4
.agignore
Normal file
|
@ -0,0 +1,4 @@
|
|||
*/*.min.css
|
||||
*/*.min.js
|
||||
themes/*/static/*/*.min.*
|
||||
output
|
9
.gitignore
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
output
|
||||
output/*
|
||||
.*.sw.
|
||||
cache
|
||||
*.pid
|
||||
*.pyc
|
||||
.*.swp
|
||||
public/
|
||||
/*.ics
|
61
.gitlab-ci.yml
Normal file
|
@ -0,0 +1,61 @@
|
|||
stages:
|
||||
- build
|
||||
- deploy
|
||||
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
|
||||
build:
|
||||
stage: build
|
||||
image: python:alpine3.18
|
||||
script:
|
||||
- apk add build-base python3-dev
|
||||
- pip3 install -r requirements.txt
|
||||
- pelican --version
|
||||
- env TZ=Europe/Rome pelican ./content/ --ignore-cache -o public/ -s publishconf.py -v
|
||||
- echo -e "commit=${CI_COMMIT_SHA}\nbuildDate=$(date -Iseconds)\n" > public/buildinfo.txt
|
||||
- find public -type f
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
|
||||
|
||||
|
||||
.deploys:
|
||||
needs: ["build"]
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
stage: deploy
|
||||
|
||||
|
||||
|
||||
deploy-testing:
|
||||
extends: .deploys
|
||||
image: amd64/debian:bullseye
|
||||
before_script:
|
||||
- mkdir -p ~/.ssh
|
||||
- apt-get update -qq && apt-get install -y -qq rsync openssh-client
|
||||
- cp ${TESTDEPLOY_SSH_PRIVATE_KEY} ~/.ssh/id_ed25519
|
||||
- chmod 600 ~/.ssh/id_ed25519
|
||||
script:
|
||||
- rsync -avz -e "ssh -o StrictHostKeyChecking=no -p ${TESTDEPLOY_PORT} -i ~/.ssh/id_ed25519" public/ ${TESTDEPLOY_USERNAME}@"${TESTDEPLOY_SERVER}":${TESTDEPLOY_PATH}${CI_COMMIT_BRANCH:-}
|
||||
|
||||
|
||||
|
||||
# deploy-production:
|
||||
# extends: .deploys
|
||||
# only:
|
||||
# - master
|
||||
# image: tubia/webdav-upload
|
||||
# script:
|
||||
# - webdav-upload --verbose --user="$WEBDAV_USER" --password="$WEBDAV_PASSWORD" --url "${WEBDAV_HOST}/${WEBDAV_USER}/" public $WEBDAV_HOST_FOLDER
|
||||
|
||||
deploy-production:
|
||||
extends: .deploys
|
||||
only:
|
||||
- master
|
||||
image:
|
||||
name: rclone/rclone:latest
|
||||
entrypoint: [""]
|
||||
script:
|
||||
- "rclone sync -P -v -u --webdav-url ${WEBDAV_HOST}/${WEBDAV_USER}/ --webdav-user ${WEBDAV_USER} --webdav-pass $(echo -n \"${WEBDAV_PASSWORD}\" | rclone obscure -) ./public/ :webdav:${WEBDAV_HOST_FOLDER}/"
|
74
Makefile
Normal file
|
@ -0,0 +1,74 @@
|
|||
PY?=python
|
||||
PELICAN?=pelican
|
||||
PELICANOPTS=
|
||||
|
||||
BASEDIR=$(CURDIR)
|
||||
INPUTDIR=$(BASEDIR)/content
|
||||
OUTPUTDIR=$(BASEDIR)/output
|
||||
CONFFILE=$(BASEDIR)/pelicanconf.py
|
||||
PUBLISHCONF=$(BASEDIR)/publishconf.py
|
||||
|
||||
DEBUG ?= 0
|
||||
ifeq ($(DEBUG), 1)
|
||||
PELICANOPTS += -D
|
||||
endif
|
||||
VERBOSE ?= 0
|
||||
ifeq ($(VERBOSE), 1)
|
||||
PELICANOPTS += -v
|
||||
endif
|
||||
|
||||
all: publish
|
||||
|
||||
help:
|
||||
@echo 'Makefile for a pelican Web site '
|
||||
@echo ' '
|
||||
@echo 'Usage: '
|
||||
@echo ' make html (re)generate the web site '
|
||||
@echo ' make clean remove the generated files '
|
||||
@echo ' make regenerate regenerate files upon modification '
|
||||
@echo ' make publish generate using production settings '
|
||||
@echo ' make serve [PORT=8000] serve site at http://localhost:8000'
|
||||
@echo ' make devserver [PORT=8000] start/restart develop_server.sh '
|
||||
@echo ' make stopserver stop local server '
|
||||
@echo ' '
|
||||
@echo 'Set the VERBOSE variable to 1 for some more messages, e.g. make VERBOSE=1 html'
|
||||
@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html'
|
||||
@echo ' '
|
||||
|
||||
html:
|
||||
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
|
||||
|
||||
clean:
|
||||
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR)
|
||||
|
||||
regenerate:
|
||||
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
|
||||
|
||||
serve:
|
||||
ifdef PORT
|
||||
@echo http://localhost:$(PORT)/
|
||||
pelican --ignore-cache -lr -p $(PORT)
|
||||
else
|
||||
@echo http://localhost:8000/
|
||||
pelican --ignore-cache -lr
|
||||
endif
|
||||
|
||||
devserver:
|
||||
ifdef PORT
|
||||
$(BASEDIR)/develop_server.sh restart $(PORT)
|
||||
else
|
||||
$(BASEDIR)/develop_server.sh restart
|
||||
endif
|
||||
|
||||
stopserver:
|
||||
kill -9 `cat pelican.pid`
|
||||
kill -9 `cat srv.pid`
|
||||
@echo 'Stopped Pelican and SimpleHTTPServer processes running in background.'
|
||||
|
||||
publish:
|
||||
$(PELICAN) $(INPUTDIR) --ignore-cache -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS)
|
||||
|
||||
autopublish:
|
||||
while true; do inotifywait -r content pelicanconf.py publishconf.py Makefile themes -e modify -e create -e delete; make clean publish; sleep 0.1; done
|
||||
|
||||
.PHONY: html help clean regenerate serve devserver publish
|
75
README.md
Normal file
|
@ -0,0 +1,75 @@
|
|||
Hackmeeting 2025
|
||||
==================
|
||||
|
||||
Sources for Italian Hackmeeting 0x1C (2025) website.
|
||||
|
||||
Il sito viene gestito - in massima parte - dalla commissione comunicazione di hackmeeting. Se vuoi metterti in
|
||||
contatto con loro, scrivi nella [mailing list](https://hackmeeting.org/hackit24/contact.html) per coordinarti
|
||||
con loro. Se vuoi provare lo stesso a metterci le mani, fai pure... noi ti abbiamo avvertito!
|
||||
|
||||
Schema di massima
|
||||
--------------------
|
||||
|
||||
Questo repository git viene automaticamente "sincronizzato" (continous deployment) e il risultato va a finire
|
||||
su https://hackmeeting.org/hackit25/
|
||||
|
||||
Per fare modifiche al sito:
|
||||
|
||||
- fatti un account personale su git.lattuga.net
|
||||
- fai una modifica al sito
|
||||
- apri una pull request
|
||||
- quando la pull request viene approvata, e il tutto finisce in "master", la modifica è online
|
||||
|
||||
|
||||
HowTo
|
||||
-------
|
||||
|
||||
So you want to contribute, nice! You'll need a UNIX (Linux, BSD...) system and some proficiency with the terminal and with
|
||||
[Git-based workflows](https://git-scm.com/book/en/v2).
|
||||
|
||||
### Setup your development environment
|
||||
|
||||
Clona questo repository sul tuo computer
|
||||
|
||||
Installa mkvirtualenv (`apt install virtualenvwrapper`, su sistemi Debian-based)
|
||||
|
||||
```
|
||||
mkvirtualenv -p `which python3` hackmeeting-website
|
||||
pip install -r requirements.txt
|
||||
make all serve
|
||||
firefox http://localhost:8000/
|
||||
```
|
||||
|
||||
Also, `make help` is your friend.
|
||||
|
||||
For debug, `make DEBUG=1`
|
||||
|
||||
### Change content
|
||||
|
||||
Most content is in `content/pages/`. Just go there, find the relevant file, change it.
|
||||
|
||||
Now, `make all serve`, see the result in your browser
|
||||
|
||||
repeat until you like it
|
||||
|
||||
### Commit and push
|
||||
|
||||
usual git workflow
|
||||
|
||||
Griglia dei seminari
|
||||
----------------------
|
||||
|
||||
I talk compaiono in questo repository come cartelle all'interno della cartella `talks/`. Tuttavia, la cosa
|
||||
corretta da fare **NON** è modificare i contenuti direttamente lì, ma modificare un calendario nextcloud da cui
|
||||
queste informazioni provengono.
|
||||
Infatti il calendario viene gestito dalla commissione griglia: [coordinati con
|
||||
loro](https://hackmeeting.org/hackit24/contact.html) se vuoi toccare questa parte del sito.
|
||||
|
||||
Altre modifiche al sito
|
||||
-------------------------
|
||||
|
||||
Il sito è un'istanza di [pelican](https://docs.getpelican.com/en/latest/), più alcuni plugin custom:
|
||||
- `langmenu`, per avere un menu che punta alle versioni localizzate della pagina
|
||||
- `talks`, per gestire i talk in modo "speciale" per hackmeeting
|
||||
|
||||
Puoi quindi riferirti alla documentazione di pelican per fare delle prove e capire come modificare il sito.
|
0
content/images/.keepme
Normal file
BIN
content/images/locandina24_color2_stampa.png
Normal file
After Width: | Height: | Size: 5.6 MiB |
BIN
content/images/locandina24_color2_web.jpg
Normal file
After Width: | Height: | Size: 338 KiB |
BIN
content/images/locandina24_color_stampa.png
Normal file
After Width: | Height: | Size: 5.7 MiB |
BIN
content/images/locandina24_color_web.jpg
Normal file
After Width: | Height: | Size: 338 KiB |
BIN
content/images/locandina24_stampa.jpg
Normal file
After Width: | Height: | Size: 2.3 MiB |
BIN
content/images/locandina24_web.jpg
Normal file
After Width: | Height: | Size: 295 KiB |
BIN
content/images/logo_color2_hires.png
Normal file
After Width: | Height: | Size: 202 KiB |
BIN
content/images/logo_color_hires.png
Normal file
After Width: | Height: | Size: 589 KiB |
BIN
content/images/logo_hires.png
Normal file
After Width: | Height: | Size: 216 KiB |
BIN
content/images/map.png
Normal file
After Width: | Height: | Size: 3.1 MiB |
BIN
content/images/press/2016-IMG_0574.jpg
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
content/images/press/2016-IMG_0578.jpg
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
content/images/press/2016-IMG_0581.jpg
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
content/images/press/2016-IMG_0584.jpg
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
content/images/press/2016-IMG_0586.jpg
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
content/images/press/2016-IMG_0589.jpg
Normal file
After Width: | Height: | Size: 36 KiB |
65
content/pages/accessibilita.md
Normal file
|
@ -0,0 +1,65 @@
|
|||
Title: Accessibilità
|
||||
slug: accessibility
|
||||
navbar_sort: 2
|
||||
|
||||
Hackmeeting è uno spazio e una comunità autogestita: tutto quello che
|
||||
troverai è autocostruito con povertà di mezzi, generalmente recuperando
|
||||
strutture abbandonate e riadeguandole il più possibile ai nostri bisogni.
|
||||
Abbiamo cercato di rendere Hackmeeting più accessibile che potevamo, ma
|
||||
ci sono sicuramente ancora tante cose che non ci sono riuscite e altre
|
||||
che dovremmo migliorare. Abbi pazienza e aiutaci segnalandoci cosa non
|
||||
va, in modo da fare meglio il prossimo anno!
|
||||
|
||||
## Lo spazio
|
||||
|
||||
Hackit {{ hm.year }} si svolgerà al {{ hm.location.name }} a {{ hm.location.city }}
|
||||
|
||||
Il Magazzino47 è dislocato interamente al piano terra, tutte le aree sono accessibili anche tramite delle apposite rampe, il cortile è dotato di passaggio in asfalto per facilitare il passaggio per persone a mobilità ridotta.
|
||||
|
||||
## Aule seminari
|
||||
|
||||
Saranno allestiti 3 spazi seminari + un'eventuale spazio laboratorio (ma un po' piccolo)
|
||||
|
||||
## Dormire
|
||||
|
||||
Gli spazi tende e dormitorio sono senza gradini e raggiungibili tramite apposite rampe.
|
||||
Il tendone può ospitare all'incirca 80-100 persone munite di materassino, stuoia o brandina. Il tendone non può ospitare tende. Non ci sono letti a disposizione o stanze singole.
|
||||
Lo spazio esterno è molto risicato e può ospitare all'incirca 20 tende o poco più. Si invita chi ne ha la possibilità a trovare sistemazioni esterne allo spazio.
|
||||
Sarà disponibile uno spazio tende esterno all'evento raggiungibile a 15 min di auto.
|
||||
|
||||
## Bagni
|
||||
|
||||
Sono presenti tre turche e 1 bagno con doccia per persone a mobilità ridotta. Verranno allestite delle doccie esterne.
|
||||
|
||||
## Modalità aereo
|
||||
|
||||
C'è una piccola saletta che va sistemata (è il backstage artisti) ed è utilizzabile come sala modalità aereo.
|
||||
|
||||
## Clima
|
||||
|
||||
A giugno il clima è abbastanza variabile, si può passare da giornate di pioggia a giornate molto calde. Uno spazio seminario è al chiuso gli altri sono esterni ma comunque coperti da tendone o tettoia.
|
||||
|
||||
## Linguaggi
|
||||
|
||||
Non siamo ancora in grado di garantire un servizio di traduzioni in
|
||||
simultanea, ma Hackmeeting è frequentato da persone che parlano diverse
|
||||
lingue, compresa la LIS. Se hai bisogno, o se vuoi offrirti per
|
||||
tradurre, rivolgiti all'info point.
|
||||
|
||||
## Cani da assistenza
|
||||
|
||||
Se hai un cane che ti accompagna è il benvenuto. Troverà acqua e
|
||||
probabilmente altri cani con cui giocare. Se quest'ultima cosa dovesse
|
||||
essere un problema segnalacelo all'info point all'ingresso e cercheremo
|
||||
di limitare l'eventuale invadenza degli altri cani.
|
||||
|
||||
## Altre info
|
||||
|
||||
Nello spazio saranno presenti un po' ovunque prese per ricaricare
|
||||
qualunque dispositivo.
|
||||
La musica ad alto volume sarà presente in modo continuativo solo venerdì
|
||||
sera e in un luogo lontano dagli altri spazi comuni.
|
||||
Per qualsiasi altra informazione o necessità che non stiamo
|
||||
considerando, puoi rivolgerti all'info point all'ingresso.
|
||||
|
||||
Torna alla pagina delle [informazioni principali]({filename}info.md)
|
51
content/pages/call.en.md
Normal file
|
@ -0,0 +1,51 @@
|
|||
Title: Call for contents
|
||||
slug: call
|
||||
navbar_sort: 4
|
||||
lang: en
|
||||
|
||||
|
||||
Hackmeeting is the yearly meeting of the Italian countercultures related to
|
||||
hacking, communities which have a critical relationship with technology.
|
||||
|
||||
Our idea of hacking touches every aspect of our lives and it doesn't stop at
|
||||
the digital realm: we believe in the use of knowledge and technology to
|
||||
understand, modify and re-create what is around us.
|
||||
|
||||
It's not a vague idea, generic guidelines or aspiration, it's a pragmatic
|
||||
organization effort based on solidarity, complicity and sharing of knowledge,
|
||||
methods and tools to take back everything and take it back together, one piece
|
||||
at a time.
|
||||
|
||||
Hackmeeting will be held in {{hm.location.city}} from Friday 14 June to Sunday 16 June at {{hm.location.name}}
|
||||
|
||||
If you think you can enrich the event with a contribution, send your proposal
|
||||
joining the [hackmeeting mailing list](https://www.autistici.org/mailman/listinfo/hackmeeting) with subject `[talk] title` or `[lab]
|
||||
lab_title` and this info:
|
||||
|
||||
* Length (multiple of 30 minutes, max 2 hours)
|
||||
* (optional) day/time of the day requirements
|
||||
* Abstract, optional links and references
|
||||
* Nickname
|
||||
* Language
|
||||
* Projector
|
||||
* Can we record you? (audio only)
|
||||
* Anything else you might need
|
||||
|
||||
#### More concretely
|
||||
|
||||
We will set up three outdoor locations (indoor in case of
|
||||
rain), with microphone/speakers and projector.
|
||||
If you think your presentation will not need this much time, you can propose
|
||||
something directly at hackmeeting: a `ten minute talk` of a maximum of 10
|
||||
minutes.
|
||||
These talks will be held in the largest available space at the end of of the
|
||||
day on Saturday. There will be someone who will warn you if you are about to
|
||||
exceed the allocated time.
|
||||
|
||||
If you want to share your discoveries or curiosities in an even more informal
|
||||
and chaotic way, you will be able to to get a place with your hardware on the
|
||||
shared tables in the `LAN space`. You will find morbid curiosity, power and
|
||||
wired connection (bring a power strip, network cables and whatever you might
|
||||
find useful).
|
||||
|
||||
Have any questions or you are shy? Write us at [infohackit@tracciabi.li](mailto:infohackit@tracciabi.li)
|
36
content/pages/call.md
Normal file
|
@ -0,0 +1,36 @@
|
|||
Title: Call for contents
|
||||
slug: call
|
||||
navbar_sort: 4
|
||||
lang: it
|
||||
|
||||
Hackmeeting è l’incontro annuale delle controculture digitali legate all’hacking e hacktivismo, rivolto a tutte le comunità e persone che vivono in maniera critica il rapporto con la tecnologia, i mass-media, i social e ogni aspetto della vita imposta.
|
||||
|
||||
Hackmeeting investe ogni ambito delle nostre vite e non si limita al digitale: crediamo nella diffusione del sapere e della tecnologia per conoscere, modificare e ricreare quanto ci sta attorno. Crediamo fortemente nelle pratiche di autogestione e DIY. Crediamo che la tecnologia debba rispettare le nostre volontà e non le logiche del profitto.
|
||||
|
||||
Hackmeeting non è un idea vaga, una generica linea guida o aspirazione. E' una reale capacità organizzativa basata sulla solidarietà, sull'inclusività e sulla condivisione delle conoscenze e degli strumenti per riprenderci tutto e riprendercelo insieme.
|
||||
|
||||
Hackmeeting è il contributo di ogni singola persona, non ci sono partecipantɜ ma solo organizzatorɜ.
|
||||
|
||||
Hackmeeting quest’anno si svolgerà a {{hm.location.city}} da venerdì 14 giugno a domenica 16 giugno presso il {{hm.location.name}}.
|
||||
|
||||
Se pensi di poter arricchire l’evento con un tuo contributo:
|
||||
iscriviti alla mailing list di Hackmeeting <https://www.autistici.org/mailman/listinfo/hackmeeting>
|
||||
|
||||
Manda una mail a hackmeeting@inventati.org con:
|
||||
|
||||
- oggetto [Talk e titolo del talk oppure Laboratorio e titolo del laboratorio]
|
||||
- durata [un multiplo di 30 minuti per un massimo di due ore]
|
||||
- eventuali esigenze di giorno/ora
|
||||
- breve spiegazione, eventuali link e/o riferimenti utili
|
||||
- Nickname
|
||||
- lingua
|
||||
- necessità di proiettore e/o particolari tecnologie
|
||||
- eventuale disponibilità a farti registrare [solo audio]
|
||||
- altre necessità o particolari indicazioni.
|
||||
|
||||
Allestiremo spazi all’aperto (al coperto in caso di pioggia) muniti di amplificazione e proiettore.
|
||||
Se pensi che la tua presentazione non abbia bisogno di tempi così lunghi, puoi proporre direttamente ad Hackmeeting un Ten Minute Talk dalla durata di massimo 10 minuti. Questi talk si terranno al termine delle giornate di venerdì e sabato durante la sera.
|
||||
|
||||
Se invece vuoi condividere le tue scoperte e curiosità in modo ancora più informale e caotico, potrai sistemarti sui tavoli collettivi dell'area LAN Space. Troverai curiosità, corrente alternata e rete via cavo. Ricordati di portare una presa multipla, un cavo di rete e quel che vorresti trovare e che ti serve.
|
||||
|
||||
Hai una domanda? Scrivi a [infohackit@tracciabi.li](mailto:infohackit@tracciabi.li)
|
26
content/pages/come_arrivare.en.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
Title: How to get there
|
||||
slug: come-arrivare
|
||||
lang: en
|
||||
|
||||
Hackit {{hm.year}} will be held at [{{hm.location.name}}]({{hm.location.website}}) - [{{hm.location.address}}, {{hm.location.city}}](https://www.openstreetmap.org/#map=16/{{hm.location.geo.lat}}/{{hm.location.geo.lon}})
|
||||
|
||||
<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://www.openstreetmap.org/export/embed.html?bbox={{hm.osm.bbox}}&layer=mapnik&marker={{hm.location.geo.lat}}%2C{{hm.location.geo.lon}}" style="border: 1px solid black"></iframe><br/><small><a href="https://www.openstreetmap.org/?mlat={{hm.location.geo.lat}}&mlon={{hm.location.geo.lon}}#map=18/{{hm.location.geo.lat}}/{{hm.location.geo.lon}}" target="_blank">View Map</a></small>
|
||||
|
||||
Hackmeeting it's easy to reach. If you get lost just search for Brescia's monumental cemetery that's next to Magazzino 47.
|
||||
|
||||
## By train or autobus
|
||||
|
||||
Hackmeeting is 20 minutes walking from the train and the autobus stations.
|
||||
Out of the train station is possible to take the autobus number 3 direction **Mandolossa** and the number 9 direction **Violino** that stops in via Milano, just after the cemetery.
|
||||
|
||||
## By car
|
||||
|
||||
Hackmeeting it's easy to reach from highway A4, exit Brescia Ovest.
|
||||
Around the space it's possible to park for free, also for camper and vans.
|
||||
|
||||
|
||||
## By Airplane
|
||||
|
||||
The closest airport is Milano Bergamo (BGY), 40km from Brescia. There are fast autobus linking the airport with Brescia train station in about 1 hour, the price for the ticket is 12€.
|
||||
Another option to reach Brescia is to take an urban bus to Bergamo (3€) and then the train (5.20€) but it'll take 30 minutes more.
|
||||
|
31
content/pages/come_arrivare.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
Title: Come arrivare
|
||||
slug: come-arrivare
|
||||
navbar_sort: 2
|
||||
lang: it
|
||||
|
||||
Hackit {{hm.year}} si svolgerà al [{{hm.location.name}}]({{hm.location.website}}), in [{{hm.location.address}}, {{hm.location.city}}](https://www.openstreetmap.org/#map=16/{{hm.location.geo.lat}}/{{hm.location.geo.lon}})
|
||||
|
||||
<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://www.openstreetmap.org/export/embed.html?bbox={{hm.osm.bbox}}&layer=mapnik&marker={{hm.location.geo.lat}}%2C{{hm.location.geo.lon}}" style="border: 1px solid black"></iframe><br/><small><a href="https://www.openstreetmap.org/?mlat={{hm.location.geo.lat}}&mlon={{hm.location.geo.lon}}#map=18/{{hm.location.geo.lat}}/{{hm.location.geo.lon}}" target="_blank">Visualizza Mappa</a></small>
|
||||
|
||||
Il centro sociale è facilmente raggiungibile. Se vi disorientate cercate il cimitero monumentale di Brescia che è a fianco del Magazzino 47.
|
||||
|
||||
## Con i piedi
|
||||
Saprai come fare, ne siamo certi. Da dove parti parti.
|
||||
|
||||
## Con il treno e l'autobus
|
||||
|
||||
Lo spazio dista circa 20 min a piedi dalla stazione dei treni e dei bus di Brescia.
|
||||
Fuori dalla stazione dei treni è possibile prendere l'autobus numero 3 direzione Mandolossa e il 9 in direzione Violino con fermata in via Milano subito dopo il cimitero.
|
||||
|
||||
|
||||
## Con veicoli a motore
|
||||
|
||||
Il Magazzino 47 è facilmente raggiungibile dall'autostrada A4, uscita Brescia Ovest.
|
||||
Intorno allo spazio sono presenti diversi parcheggi gratuiti con possibilità di posteggiare camper e furgoni in diverse aree e vie adiacenti anche se siamo in città.
|
||||
|
||||
|
||||
## Con l'aereo
|
||||
|
||||
L'aeroporto più servito e più vicino è quello di Milano Bergamo (BGY), distante circa 40km da Brescia.
|
||||
Sono disponibili autobus autostradali che collegano l'aeroporto con la stazione di Brescia in circa un'ora al costo di 12€.
|
||||
Per raggiungere Brescia, è anche possibile passare prima per Bergamo con gli autobus urbani (3€) e poi prendere il treno (5.20€), ma i tempi si allungano di altri trenta minuti.
|
17
content/pages/contatti.en.rst
Normal file
|
@ -0,0 +1,17 @@
|
|||
Contact
|
||||
###########
|
||||
|
||||
:slug: contact
|
||||
:navbar_sort: 6
|
||||
:lang: en
|
||||
|
||||
**Mailing List**
|
||||
|
||||
There is a `mailing list <https://www.autistici.org/mailman/listinfo/hackmeeting>`_ where you can ask for info and follow the discussions about the meeting. It is mostly in italian but feel free to ask questions in english.
|
||||
|
||||
**IRC**
|
||||
|
||||
There is also an IRC (Internet Relay Chat) channel where discuss and chat with other participants: connect to server ``irc.autistici.org`` and join channel ``#hackit99`` (again, it will be mostly in italian, but english speakers are welcome).
|
||||
|
||||
If you prefer XMPP/Jabber, you can reach the same channel as room ``#hackit99@mufhd0.esiliati.org`` (please
|
||||
include the hash)
|
22
content/pages/contatti.rst
Normal file
|
@ -0,0 +1,22 @@
|
|||
Contatti
|
||||
###########
|
||||
|
||||
:slug: contact
|
||||
:navbar_sort: 6
|
||||
:lang: it
|
||||
|
||||
**Mailing List**
|
||||
|
||||
La comunità Hackmeeting ha una `lista di discussione <https://www.autistici.org/mailman/listinfo/hackmeeting>`_ dove poter chiedere informazioni e seguire le attività della comunità. La lista ha un `archivio pubblico <http://lists.autistici.org/list/hackmeeting.html>`_, quindi puoi leggerla anche senza iscriverti. L'iscrizione è invece necessaria per scrivere.
|
||||
|
||||
**IRC**
|
||||
|
||||
Esiste anche un canale IRC (Internet Relay Chat) dove poter discutere e chiacchierare con tutti i membri della comunità: collegati al server ``irc.autistici.org`` ed entra nel canale ``#hackit99``.
|
||||
|
||||
Se preferisci XMPP/Jabber, puoi raggiungere lo stesso canale come ``#hackit99@mufhd0.esiliati.org`` (includi il cancelletto).
|
||||
|
||||
|
||||
Sito
|
||||
---------
|
||||
|
||||
Se vuoi modificare il sito, vedi le info su https://0xacab.org/hackit/sito-hackit-{{hm.year - 2000}}#user-content-hackmeeting-{{hm.year}}
|
30
content/pages/index.en.rst
Normal file
|
@ -0,0 +1,30 @@
|
|||
About
|
||||
#####
|
||||
|
||||
:navbar_sort: 1
|
||||
:lang: en
|
||||
:slug: index
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<div class='twelve columns'>
|
||||
<div class='six columns'>
|
||||
<img src='{static}/images/locandina24_color2_web.jpg'>
|
||||
</div>
|
||||
<div class='five columns offset-by-one'>
|
||||
<h3><br/><br/><br/>
|
||||
{{ hm.when }}<br/>
|
||||
{{ hm.location.name }}<br> {{ hm.location.city }}
|
||||
</h3><br/><br/><br/>
|
||||
<!-- <h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Hackmeeting is the yearly Italian digital counter-cultures meeting; it gathers those communities that take a hard look at how technologies work in our society. And that's not all. We tell you, just you, in a whisper (don't even tell anybody!): Hack-it is just for real hackers, that is to say for those people who want to manage their own lives as they want and are ready to fight for this right, even though they haven't ever seen a computer in their life.
|
||||
|
||||
Three days of lessons, games, parties, debates, crossfires and collective learning, analyzing together those technologies that we use everyday, the way they change and how they can impact on our real or virtual lives; which role we can play in order to redirect these changes and set us free of control from those who want to monopolize their development, letting society crumble and relegating us in even tighter virtual spaces.
|
||||
|
||||
**The event is totally self-managed: there are neither promoters nor users, just participants.**
|
||||
|
||||
|
28
content/pages/index.es.rst
Normal file
|
@ -0,0 +1,28 @@
|
|||
About
|
||||
###################
|
||||
|
||||
:slug: index
|
||||
:navbar_sort: 1
|
||||
:lang: es
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<div class='twelve columns'>
|
||||
<div class='six columns'>
|
||||
<img src='{static}/images/locandina24_color2_web.jpg'>
|
||||
</div>
|
||||
<div class='five columns offset-by-one'>
|
||||
<h3><br/><br/><br/>
|
||||
{{ hm.when }}<br/>
|
||||
{{ hm.location.name }}<br>{{ hm.location.city }}
|
||||
</h3><br/><br/><br/>
|
||||
<!-- <h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Hackmeeting es el encuentro anual de las contraculturas digitales italianas, de aquellas comunidades que analizan de manera crítica los mecanismos de desarollo de las tecnologías en nuestra sociedad. Pero hackmeeting no es sólo esto, es mucho más. Te lo contamos al oído, no se lo digas a nadie, el hackmeeting es solamente para verdaderos hackers, para quienes quieran gestionarse la vida como quieran y luchan por eso, aunque no hayan visto un ordenador en su vida.
|
||||
|
||||
Tres días de charlas, juegos, fiestas, debates, intercambios de ideas y aprendizaje colectivo, para analizar juntxs las tecnologías que usamos todos los días, cómo cambian y cómo pueden impactar en nuestras vidas, tanto reales como virtuales. Un encuentro para indagar qué papel podemos jugar en este cambio y liberarnos del control de aquellos que quieren monopolizar su desarrollo, rompiendo nuestras estructuras sociales y relegándonos a espacios virtuales cada vez más limitados.
|
||||
|
||||
**El evento es totalmente autogestionado: no hay ni organizador@s ni asistentes, solamente participantes!**
|
38
content/pages/index.fr.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
Title: About
|
||||
Date: 2016-04-17
|
||||
Slug: index
|
||||
navbar_sort: 1
|
||||
lang: fr
|
||||
|
||||
<div class='twelve columns'>
|
||||
<div class='six columns'>
|
||||
<img src='{static}/images/locandina24_color2_web.jpg'>
|
||||
</div>
|
||||
<div class='five columns offset-by-one'>
|
||||
<h3><br/><br/><br/>
|
||||
{{ hm.when }}<br/>
|
||||
{{ hm.location.name }}<br> {{ hm.location.city }}
|
||||
</h3><br/><br/><br/>
|
||||
<!-- <h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
*Hackmeeting* est la rencontre annuel des cultures numériques alternatives
|
||||
italiennes, des communautés qui agissent de façon critique face aux mécanismes
|
||||
de développement des technologies dans notre société. Mais c'est pas seulement
|
||||
ça: on y trouve bien plus. On te le chuchote à l'oreille, ne le dis à personne:
|
||||
hackit est seulement pour les vrais hackers, c'est à dire pour ceux/celles qui
|
||||
veulent conduire leur vie comme ils/elles préfèrent, et qui savent comment se
|
||||
battre pour accomplir leur objectif; même s'ils/elles n'ont jamais vu un ordi.
|
||||
|
||||
|
||||
Trois jours entre talk techniques, jeux, fêtes, débats, discussions et
|
||||
apprentissage collectif, tout ça pour étudier tous ensemble les technologies
|
||||
qu'on utilise tous les jours, leur développement et les changements qu'elles
|
||||
provoquent dans le réel et le virtuel des nos vies; pour comprendre quel soit
|
||||
le rôle qu'on puisse jouer pour adresser ces changement vers la libération à
|
||||
las fois des technologies elles-mêmes et des nos vies.
|
||||
|
||||
**L'événement est complètement autogéré: il n'y a que des participants, pas
|
||||
d'organisateurs, pas d'entrepreneurs.**
|
23
content/pages/index.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
Title: About
|
||||
Slug: index
|
||||
navbar_sort: 1
|
||||
lang: it
|
||||
|
||||
<div class='twelve columns'>
|
||||
<div class='six columns'>
|
||||
<img src='{static}/images/locandina24_color2_web.jpg'>
|
||||
</div>
|
||||
<div class='five columns offset-by-one'>
|
||||
<h3><br/><br/><br/>
|
||||
{{ hm.when }}<br/>
|
||||
{{ hm.location.name }} <br>{{ hm.location.city }}
|
||||
</h3><br/><br/><br/>
|
||||
<h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
L'*hackmeeting* è l'[incontro]({filename}/pages/info.md) annuale delle controculture digitali italiane, di quelle comunità che si pongono in maniera critica rispetto ai meccanismi di sviluppo delle tecnologie all'interno della nostra società. Ma non solo, molto di più. Lo sussuriamo nel tuo orecchio e soltanto nel tuo, non devi dirlo a nessuno: l'hackit è solo per hackers, ovvero per chi vuole gestirsi la vita come preferisce e sa s/battersi per farlo. Anche se non ha mai visto un computer in vita sua.
|
||||
|
||||
Tre giorni di [seminari, giochi, dibattiti]({filename}/pages/programma.rst), scambi di idee e apprendimento collettivo, per analizzare assieme le tecnologie che utilizziamo quotidianamente, come cambiano e che stravolgimenti inducono sulle nostre vite reali e virtuali, quale ruolo possiamo rivestire nell'indirizzare questo cambiamento per liberarlo dal controllo di chi vuole monopolizzarne lo sviluppo, sgretolando i tessuti sociali e relegandoci in spazi virtuali sempre più stretti.
|
||||
|
||||
**L'evento è totalmente autogestito: non esiste chi organizza o fruisce, esiste solo chi partecipa.**
|
27
content/pages/index.pt.rst
Normal file
|
@ -0,0 +1,27 @@
|
|||
About
|
||||
###################
|
||||
|
||||
:slug: index
|
||||
:navbar_sort: 1
|
||||
:lang: pt
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<div class='twelve columns'>
|
||||
<div class='six columns'>
|
||||
<img src='{static}/images/locandina24_color2_web.jpg'>
|
||||
</div>
|
||||
<div class='five columns offset-by-one'>
|
||||
<h3><br/><br/><br/>
|
||||
{{ hm.when }}<br/>
|
||||
{{ hm.location.name }}, {{ hm.location.city }}
|
||||
</h3><br/><br/><br/>
|
||||
<!-- <h5><a href="{filename}/pages/info.md">Informazioni ospitalità</h5></p> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Hackmeeting é o encontro anual das contro-culturas digitais italianas, quer dizer daquelas comunidades que se colocam criticamente ao respeito dos mecanismos de desenvolvimento das tecnologías nas nossas sociedades. Mais não simplesmente isso, é muito mais. A gente sussurra no seu ouvido e só no seu, você não precisa contar para ninguém: o hackit é só para hackers de verdade, ou seja, para quem quer administrar sua vida como prefere e sabe comprometer-se a lutar por isso. Mesmo que nunca tenha visto um computador na sua vida.
|
||||
|
||||
Três dias de seminários, jogos, debates, trocas de ideias e aprendizagem coletivo, para analisarmos juntos as tecnologías que usamos todos os dias, como elas mudam e quais profundas mudanças induzem em nossas vidas reais e virtuais, que papel podemos desempenhar no direcionamento dessas mudanças para libertá-las do controle daqueles que querem monopolizar seu desenvolvimento, desintegrando o tecido social e nos relegando a espaços virtuais cada vez mais estreitos.
|
||||
O evento é totalmente autogerido: não há organizador@s e usuári@s, só participantes.
|
112
content/pages/info.en.md
Normal file
|
@ -0,0 +1,112 @@
|
|||
Title: Info
|
||||
slug: info
|
||||
navbar_sort: 1
|
||||
lang: en
|
||||
|
||||
|
||||
#### Where
|
||||
|
||||
{{hm.location.name}}, {{hm.location.address}}, {{hm.location.city}}, Italia
|
||||
|
||||
[Here is how to arrive]({filename}/pages/come_arrivare.en.md)
|
||||
|
||||
#### When
|
||||
|
||||
From Friday 14 June to Sunday 16 June 2024
|
||||
|
||||
#### Sleeping
|
||||
|
||||
TBD_EN
|
||||
|
||||
#### Map
|
||||
|
||||
TBD
|
||||
|
||||
##### Can I arrive before Friday 14?
|
||||
|
||||
TBD_EN
|
||||
|
||||
##### Can I stay even beyond Sunday 16?
|
||||
|
||||
TBD_EN
|
||||
|
||||
#### Eating
|
||||
|
||||
TBD_EN
|
||||
|
||||
#### Who is organizing?
|
||||
|
||||
Hackmeeting is a yearly meeting of a community that communicates
|
||||
through
|
||||
[a mailing list](https://www.autistici.org/mailman/listinfo/hackmeeting). There
|
||||
is no distinction between organizers and users. Everyone can subscribe
|
||||
and partecipate in the organization by visiting the site
|
||||
[it.hackmeeting.org](https://it.hackmeeting.org) and entering the community.
|
||||
|
||||
#### What is an hacker?
|
||||
|
||||
Hackers are curious people, always eager to discover how things are
|
||||
done. Whether it is technology or not, hackers reclaim freedom to
|
||||
experiment, disassemble and reassemble things or concepts, to
|
||||
understand how are they made, to improve them, and then to share how
|
||||
to do it again. Hackers solve problems and build things, believing in
|
||||
freedom and sharing. They do not like closed systems. Hackers' forma
|
||||
mentis is not restricted to the field of software hacking: there are
|
||||
people that keep the hacker mentality in every existing field, driven
|
||||
by their creative impulse.
|
||||
|
||||
#### Who holds the talks?
|
||||
|
||||
Whoever wants to. If someone wants to propose a talk, they just has to
|
||||
propose it on the mailing list. If the proposal is well received, it
|
||||
gets on calendar. If there are some problems, the community will be
|
||||
happy to help improve the proposal.
|
||||
|
||||
### What’s in there, besides talks?
|
||||
|
||||
There is a LAN space, as to say an area dedicated to the net: everyone
|
||||
can plug their laptop, forming a network with the other participants. In
|
||||
general, this is the right place to meet other attendees, to ask for
|
||||
help in installing Linux, to solve a doubt, or just to have a chat.
|
||||
Hackmeeting is an open-air festival, a meeting, an hacking party, a
|
||||
moment of consideration, an occasion to learn something together, an act
|
||||
of rebellion, an exhange of ideas, experiences, dreams, utopias.
|
||||
|
||||
#### How much does it cost?
|
||||
|
||||
Traditionally, entrance in Hackmeeting is totally free: always keep in
|
||||
mind that organizing the event has a cost. Expenses are sustained
|
||||
through voluntary contributions, selling shirts and other gadgets and
|
||||
sometimes through the earnings of the bar.
|
||||
Please donate whatever you can, every small donation counts.
|
||||
|
||||
#### What shall I bring?
|
||||
|
||||
If you want to bring a computer, take a power
|
||||
strip too. Do not forget networking hardware (like Ethernet cables,
|
||||
switches, WiFi access points). Remember to bring the hardware that
|
||||
you will want to hack in company. We will try to get some internet
|
||||
connection for everybody to share, but we can't really guarantee anything.
|
||||
If you think that you need it, bring a 3G/4G stick with you
|
||||
and the necessary to share it with friends! Try to be as independent
|
||||
as possible regarding your hardware.
|
||||
|
||||
#### May I take photos, make videos, post, tag, share, upload?
|
||||
|
||||
We think that the freedom to choose the dimensions of one’s own private
|
||||
sphere and public profile must be guaranteed to every participant: in
|
||||
this spirit, photos and/or videos are admitted only if explicitly
|
||||
authorized by every person that appears in the media. Nobody should be
|
||||
photographed without knowing.
|
||||
Many people at Hackmeeting really care about their privacy, please ask
|
||||
before taking a picture.
|
||||
|
||||
#### How are people expected to behave?
|
||||
|
||||
Hackmeeting is a self-managed space, a temporary independent space and
|
||||
whoever passes through is expected to behave according to the principles
|
||||
of antisexism, antiracism and antifascism. If you are victim or witness
|
||||
of an act of oppression, aggression, brute force, port scan, ping flood
|
||||
and other non-consensual DOS and you do not know how to react, always
|
||||
count on the community’s support and do not hesitate to attract
|
||||
attention and ask for help.
|
128
content/pages/info.md
Normal file
|
@ -0,0 +1,128 @@
|
|||
Title: Info
|
||||
slug: info
|
||||
navbar_sort: 1
|
||||
|
||||
#### Dove
|
||||
|
||||
{{hm.location.name}}, {{hm.location.address}}, {{hm.location.city}}, Italia
|
||||
|
||||
[Qui trovi tutte le informazioni su come arrivare]({filename}/pages/come_arrivare.md)
|
||||
|
||||
#### Quando
|
||||
|
||||
Da Venerdì 14 Giugno a Domenica 16 Giugno 2024
|
||||
|
||||
#### Dormire
|
||||
|
||||
All'interno dello spazio l'area tendone è stata adibita a spazio dormitorio (al coperto), all'interno del tendone sarà possibile pernottare con brandine, stuoie e materassini (niente tende). La disponibilità del tendone è di circa 100 posti letto.
|
||||
Nelle poche aree verdi del centro sociale sarà possibile campeggiare per un max di 20 tende piccole.
|
||||
Vista la scarsa capienza del magazzino47 per il pernottamento chiediamo a chi ne ha le possibilità di trovare una sistemazione alternativa nelle vicinanze (ostello, b&b, appartementi, amici e parenti).
|
||||
|
||||
Per chi comunque volesse dormire nello spazio si consiglia di munirsi di:
|
||||
- tappetino,stuoia, materassino (suolo in cemento)
|
||||
- tappi per le orecchie (lo spazio è piccolo ed è facile essere disturbati)
|
||||
- antizanzare
|
||||
- brandine e maschere per dormire (per i più attrezzati)
|
||||
|
||||
|
||||
Sarà possibile campeggiare in uno spazio diverso dal Magazzino47 per chi non dovesse trovare una sistemazione all'interno del centro sociale e per chi non ha la possibilità di una sistemazione alternativa indipendente. Il luogo individuato si trova a 15min di macchina dal Magazzino47 in località: LAGO PONTE MELLA.
|
||||
Ricordiamo che è un prato rencintato con possibilità di campeggio (non c'è sorveglianza): munirsi di antizanzare - INDISPENSABILE, tappi per orecchie, mascherine oscuranti (pochi alberi presenti), frontalino/luci e tutto il necessario per pernottare. In loco è presente solamente 1 bagno e no doccia. Non sono presenti prese per l'elettricità.
|
||||
|
||||
#### Mappa
|
||||
|
||||
[Clicca qui per aprire la mappa]({static}/images/map.png)
|
||||
|
||||
#### Posso arrivare prima di Venerdì 14?
|
||||
|
||||
E' possibile arrivare ad hackmeeting anche nei giorni precedenti all'evento per dare una mano. Per chi ha intenzione di arrivare durante la settimana può segnarsi sul seguente pad: <https://pad.cisti.org/p/hackit0x1b-arrivi>
|
||||
|
||||
#### Posso rimanere anche oltre Domenica 16?
|
||||
|
||||
E' possibile rimanere fino a lunedì all'interno degli spazi del Magazzino47.
|
||||
|
||||
#### Mangiare
|
||||
|
||||
Saranno garantite anche colazioni/pranzi/cene a un prezzo popolare.
|
||||
La cucina sarà vegana, con alternative celiache se avete delle necessità particolari (allergie o altro) segnalatecelo.
|
||||
|
||||
#### Lavarsi
|
||||
|
||||
C'è una doccia nel bagno per mobilità ridotta e verranno allestite delle doccie esterne. Lavatevi poco che fa male.
|
||||
|
||||
#### Hackmeeting è accessibile?
|
||||
|
||||
Speriamo di sì! Trovi tutte le informazioni nella [pagina dedicata
|
||||
all'accessibilità]({filename}accessibilita.md)
|
||||
|
||||
#### Chi organizza l'hackmeeting?
|
||||
|
||||
L’hackmeeting è un momento annuale di incontro di una comunità che si riunisce
|
||||
intorno a [una mailing list](https://www.autistici.org/mailman/listinfo/hackmeeting).
|
||||
Non esistono chi organizza e chi fruisce. Tutte le persone possono iscriversi e partecipare
|
||||
all’organizzazione dell'evento, semplicemente visitando il sito [hackmeeting.org](https://hackmeeting.org) ed entrando nella comunità.
|
||||
|
||||
#### Chi è un@ hacker?
|
||||
|
||||
Le persone cosiddette hacker sono persone curiose, che non accettano di non poter mettere le mani
|
||||
sulle cose. Che si tratti di tecnologia o meno chi è hackers reclama la libertà
|
||||
di sperimentare. Smontare tutto, e per poi rifarlo o semplicemente capire come
|
||||
funziona. Sono persone che risolvono problemi e costruiscono le cose, credono nella
|
||||
libertà e nella condivisione. Non amano i sistemi chiusi. La forma mentis
|
||||
di chi è hacker non è ristretta all’ambito del software-hacking: ci sono persone
|
||||
che mantengono un attitudine all'hacking in ogni campo dell’esistente, sono persone curiose spinte
|
||||
da un istinto creativo.
|
||||
|
||||
#### Chi tiene i seminari?
|
||||
|
||||
Chi ne ha voglia. Se qualche persona vuole proporre un seminario, non deve fare altro
|
||||
che proporlo in lista. Se la proposta piace, si calendarizza. Se non piace, si
|
||||
danno utili consigli per farla piacere.
|
||||
|
||||
#### Ma cosa si fa, a parte seguire i seminari?
|
||||
|
||||
Esiste un “LAN-space”, vale a dire un’area dedicata alla rete: ogni persona arriva
|
||||
col proprio portatile e si può mettere in rete con altre persone. In genere in
|
||||
questa zona è facile conoscere altre creature curiose, magari disponibili per farsi aiutare a
|
||||
installare Linux, per risolvere un dubbio, o anche solo per scambiare quattro
|
||||
chiacchiere. L’hackmeeting è un open-air festival, un meeting, un hacking
|
||||
party, un momento di riflessione, un’occasione di apprendimento collettivo, un
|
||||
atto di ribellione, uno scambio di idee, esperienze, sogni, utopie.
|
||||
|
||||
#### Quanto costa l’ingresso?
|
||||
|
||||
Come ogni anno, l’ingresso all’Hackmeeting è del tutto libero; ricordati però
|
||||
che organizzare l’Hackmeeting ha un costo. Le spese sono sostenute grazie ai
|
||||
contributi volontari, alla vendita di magliette e altri gadget e in alcuni casi
|
||||
all’introito del bar e della cucina.
|
||||
|
||||
#### Cosa devo portare?
|
||||
|
||||
Se hai intenzione di utilizzare un computer, portalo accompagnato da una
|
||||
ciabatta elettrica. Non dimenticare una periferica di rete di qualche tipo
|
||||
(cavi ethernet, switch, access point). Ricordati inoltre di portare tutto
|
||||
l’hardware su cui vorrai smanettare con gli altri. Durante l’evento la
|
||||
connessione internet sarà limitata quindi, se vuoi avere la certezza
|
||||
organizzati portando il necessario per te e per chi ne avra' bisogno.
|
||||
In generale ogni persona organizza e partecipa cercando di essere autosufficiente
|
||||
sul lato tecnologico portandosi l'hardware o costruendoselo al hackmeeting!
|
||||
|
||||
#### Posso scattare foto, girare video, postare, taggare, condividere, uploadare?
|
||||
|
||||
Pensiamo che ad ogni partecipante debba essere garantita la libertà di
|
||||
scegliere in autonomia l’ampiezza della propria sfera privata e dei propri
|
||||
profili pubblici; per questo all’interno di hackmeeting sono ammessi fotografie
|
||||
o video SOLO SE CHIARAMENTE SEGNALATI E PRECEDENTEMENTE AUTORIZZATI da tutte e
|
||||
tutti quanti vi compaiano.
|
||||
|
||||
Le persone che attraversano hackmeeting hanno particolarmente a cuore il concetto di privacy: prima di fare
|
||||
una foto, esplicitalo!
|
||||
|
||||
#### Come ci si aspetta che si comportino tutte e tutti?
|
||||
|
||||
Hackmeeting è uno spazio autogestito, una zona temporaneamente autonoma e chi
|
||||
ci transita è responsabile che le giornate di hackit si svolgano nel rispetto
|
||||
dell’antisessismo, antirazzismo e antifascimo. Se subisci o assisti a episodi
|
||||
di oppressione, aggressione, brute force, port scan, ping flood e altri DoS non
|
||||
consensuali e non sai come reagire o mitigare l’attacco, conta sul sostegno di
|
||||
tutta la comunità e non esitare a richiamare pubblicamente l’attenzione e
|
||||
chiedere aiuto.
|
42
content/pages/programma.en.rst
Normal file
|
@ -0,0 +1,42 @@
|
|||
Schedule
|
||||
===========
|
||||
|
||||
:slug: schedule
|
||||
:navbar_sort: 3
|
||||
:lang: en
|
||||
|
||||
.. `Add the schedule <schedule.ics>`_ |ics| as a calendar
|
||||
|
||||
.. |ics| image:: {attach}/images/ics.png
|
||||
:height: 2em
|
||||
:target: webcals://it.hackmeeting.org/schedule.ics
|
||||
|
||||
To track the schedule, you might want to:
|
||||
|
||||
* `add it to Android <https://ggt.gaa.st/#url=https://it.hackmeeting.org/schedule.ics>`_
|
||||
* `add it to your desktop calendar <webcals://it.hackmeeting.org/schedule.ics>`_ (ie: Thunderbird)
|
||||
* `raw URL <https://it.hackmeeting.org/schedule.ics>`_
|
||||
|
||||
The schedule is still work in progress: a large part of hackmeeting
|
||||
contents are scheduled last-minute! We will **stop** updating this page on Thursday, 23:00. From that time,
|
||||
the only authoritative source will be the paper-made schedule in the LAN space.
|
||||
|
||||
Read the `call for contents <{filename}call.en.md>`_ and propose yours in `mailing list <{filename}contatti.rst>`_.
|
||||
|
||||
|
||||
Contents in a language other than Italian are not only accepted, but
|
||||
appreciated!
|
||||
|
||||
Hackmeeting (still) hasn't a proper translation system, but you can
|
||||
find a bunch of people to ask to do translations when you need it.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
To see the map, <a href="{static}/images/mappa_hm23.png" target="_blank" rel="noopener noreferrer">click here</a>
|
||||
|
||||
|
||||
.. talkgrid::
|
||||
:lang: en
|
||||
|
||||
.. talklist::
|
||||
:lang: en
|
34
content/pages/programma.rst
Normal file
|
@ -0,0 +1,34 @@
|
|||
Programma
|
||||
===========
|
||||
|
||||
:slug: schedule
|
||||
:navbar_sort: 3
|
||||
:lang: it
|
||||
|
||||
..
|
||||
Gli audio dell'hackmeeting sono disponibili `qui
|
||||
<https://archive.org/search.php?query=creator%3A%28radiowombatfirenze%29%20AND%20subject%3A%28hackmeeting%202019%29>`_.
|
||||
|
||||
Per seguire il calendario con più comodità:
|
||||
|
||||
* `aggiungilo ad android <https://ggt.gaa.st/#url=https://it.hackmeeting.org/schedule.ics>`_
|
||||
* `aggiungilo al tuo calendario desktop <webcals://it.hackmeeting.org/schedule.ics>`_ (ad esempio Thunderbird)
|
||||
* `URL grezzo <https://it.hackmeeting.org/schedule.ics>`_
|
||||
|
||||
Il programma è soggetto a variazioni continue: vieni ad hackmeeting e vivitelo! In particolare, questa pagina **non** verrà più aggiornata con regolarità a partire da giovedì alle 23. Da quel momento, vale solo il tabellone di carta che si trova nel LAN space.
|
||||
|
||||
Fatti coraggio, `rispondi alla call for contents <{filename}call.md>`_, proponi il tuo contenuto in `mailing list <{filename}contatti.rst>`_: crea un nuovo thread
|
||||
dedicato alla tua proposta. Nel subject inserisci ``[TALK]``
|
||||
(ad esempio ``[TALK] come sbucciare le mele con un cluster di GPU``) così che sia facile ritrovarlo per chi è
|
||||
interessato.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
Per consultare la mappa, <a href="{static}/images/map.png" target="_blank" rel="noopener noreferrer">clicca qui</a>
|
||||
|
||||
|
||||
.. talkgrid::
|
||||
:lang: it
|
||||
|
||||
.. talklist::
|
||||
:lang: it
|
130
content/pages/propaganda.md
Normal file
|
@ -0,0 +1,130 @@
|
|||
Title: Propaganda
|
||||
slug: propaganda
|
||||
lang: it
|
||||
navbar_sort: 10
|
||||
|
||||
|
||||
|
||||
|
||||
#### Logo Hackmeeting
|
||||
|
||||
<img src='{static}/theme/images/logoHM24_color2_sito.png' width='350px' />
|
||||
|
||||
[download png color alta risoluzione]({static}/images/logo_color2_hires.png) -
|
||||
[download png color web]({static}/theme/images/logoHM24_color2_sito.png)
|
||||
|
||||
|
||||
<img src='{static}/theme/images/logoHM24_sito.png' width='350px' />
|
||||
|
||||
[download jpg n/n alta risoluzione]({static}/images/logo_hires.jpg) -
|
||||
[download png b/n web]({static}/theme/images/logoHM24_sito.png)
|
||||
|
||||
#### Locandine
|
||||
|
||||
Realizzate da ouch_bruh e judaskisss
|
||||
|
||||
<img alt='locandina color web' src='{static}/images/locandina24_color2_web.jpg' width='400px'/>
|
||||
|
||||
[download color png da stampare]({static}/images/locandina24_color2_stampa.png) -
|
||||
[download color jpg web]({static}/images/locandina24_color2_web.jpg)
|
||||
|
||||
|
||||
<img alt='locandina web' src='{static}/images/locandina24_web.jpg' width='400px'/>
|
||||
|
||||
[download b/n jpg da stampare]({static}/images/locandina24_stampa.jpg) -
|
||||
[download b/n jpg web]({static}/images/locandina24_web.jpg)
|
||||
|
||||
<!--
|
||||
#### Flyer
|
||||
|
||||
<img alt='flyer web' src='{static}/images/flyer_hm2023_web.png' width='400px'/>
|
||||
|
||||
[download pdf]({static}/images/flyer_hm2023.pdf) -
|
||||
[download png]({static}/images/flyer_hm2023_web.png)
|
||||
|
||||
|
||||
|
||||
##### Sticker & postcard
|
||||
|
||||
[download sticker pdf]({static}/images/stickerHM_date.pdf) -
|
||||
[download postcard pdf]({static}/images/cartolinaHM.pdf)
|
||||
|
||||
### Spot radio
|
||||
|
||||
|
||||
Ecco alcuni spot che è possibile mandare in radio:
|
||||
|
||||
##### Forum version
|
||||
|
||||
<audio controls >
|
||||
<source src="{static}/images/hackit-forum.ogg" type="audio/ogg" />
|
||||
</audio> [download]({static}/images/hackit-forum.ogg)
|
||||
|
||||
|
||||
##### Tearz version
|
||||
|
||||
<audio controls >
|
||||
<source src="{static}/images/hackit-tearz.ogg" type="audio/ogg" />
|
||||
</audio> [download]({static}/images/hackit-tearz.ogg)
|
||||
|
||||
|
||||
##### Conquista di mondo version
|
||||
|
||||
<audio controls >
|
||||
<source src="{static}/images/hackit-conquista-mondo.ogg" type="audio/ogg" />
|
||||
</audio> [download]({static}/images/hackit-conquista-mondo.ogg)
|
||||
|
||||
-->
|
||||
|
||||
<!--
|
||||
|
||||
In questa pagina trovate alcuni materiali utili per diffondere il verbo di hackmeeting in ogni dove.
|
||||
|
||||
## Grafiche
|
||||
|
||||
### Logo
|
||||
|
||||
[Logo (nero su trasparente)]({static}/images/logo-hm-trasp.png)
|
||||
|
||||
[Grafica maya completa (nero su bianco)](https://hackmeeting.org/media/hackit20/grafica-maya-nerosubianco.jpg)
|
||||
|
||||
[Grafica maya completa (bianco su nero)](https://hackmeeting.org/media/hackit20/grafica-maya-biancosunero.jpg)
|
||||
|
||||
### Locandina
|
||||
|
||||
[Versione stampabile A3 in PDF](https://hackmeeting.org/media/hackit20/hm2020-locandina-print.pdf)
|
||||
|
||||
### Flier
|
||||
|
||||
[Flier in PDF](https://hackmeeting.org/media/hackit20/flier-print.pdf) vanno stampati fronte retro e poi
|
||||
tagliati "a croce" in modo da ottenere 4 volantini A6 fronte retro per ogni foglio.
|
||||
|
||||
## Spot radio
|
||||
|
||||
Ecco alcuni spot che è possibile mandare in radio:
|
||||
|
||||
### Fratellino beriversion
|
||||
|
||||
<audio controls >
|
||||
<source
|
||||
src="https://archive.org/download/spot-hackit20-fratellino/spot-hackit20-fratellino-beriedition-compressed.ogg" type="audio/ogg" />
|
||||
<source
|
||||
src="https://archive.org/download/spot-hackit20-fratellino/spot-hackit20-fratellino-beriedition-compressed.mp3"
|
||||
type="audio/mpeg" />
|
||||
</audio> -->
|
||||
|
||||
|
||||
<!-- ### Fratellino franceversion
|
||||
|
||||
<audio controls >
|
||||
<source
|
||||
src="https://archive.org/download/spot-hackit20-fratellino/spot-hackit20-fratellino-franceedition-compressed.ogg"
|
||||
type="audio/ogg" />
|
||||
<source
|
||||
src="https://archive.org/download/spot-hackit20-fratellino/spot-hackit20-fratellino-franceedition-compressed.mp3"
|
||||
type="audio/mpeg" />
|
||||
</audio>
|
||||
|
||||
-->
|
||||
|
||||
|
76
content/pages/stampa.rst
Normal file
|
@ -0,0 +1,76 @@
|
|||
Stampa
|
||||
#########
|
||||
|
||||
:slug: press
|
||||
:navbar_sort: 9
|
||||
:lang: it
|
||||
|
||||
Cartella stampa
|
||||
""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
|
||||
Propaganda
|
||||
"""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
I materiali utili per la diffusione di hackmeeting {{hm.year}} sono nell'apposita pagina `Propaganda
|
||||
<{filename}propaganda.md>`_
|
||||
|
||||
|
||||
Foto
|
||||
"""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
|
||||
.. image:: images/press/2016-IMG_0578.jpg
|
||||
:height: 200px
|
||||
:alt: La bacheca dei seminari dell'hackmeeting 2016, a Pisa
|
||||
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0578.jpg
|
||||
|
||||
.. image:: images/press/2016-IMG_0581.jpg
|
||||
:height: 200px
|
||||
:alt: Sessione di elettronica digitale
|
||||
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0581.jpg
|
||||
|
||||
.. image:: images/press/2016-IMG_0584.jpg
|
||||
:height: 200px
|
||||
:alt: Programmazione
|
||||
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0584.jpg
|
||||
|
||||
.. image:: images/press/2016-IMG_0586.jpg
|
||||
:height: 200px
|
||||
:alt: Computer
|
||||
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0586.jpg
|
||||
|
||||
.. image:: images/press/2016-IMG_0589.jpg
|
||||
:height: 200px
|
||||
:alt: Il LAN party: un posto dove sperimentare insieme
|
||||
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0589.jpg
|
||||
|
||||
.. image:: images/press/2016-IMG_0574.jpg
|
||||
:height: 200px
|
||||
:alt: Un hack su Emilio: il famoso robottino degli anni '90 è stato riprogrammato
|
||||
:target: https://hackmeeting.org/hackit16/images/photos/IMG_0574.jpg
|
||||
|
||||
|
||||
Comunicati stampa
|
||||
"""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
|
||||
|
||||
|
||||
Comunicato Stampa 13 Giugno
|
||||
=================================
|
||||
|
||||
|
||||
| HACKMEETING
|
||||
| 14-16 giugno 2024
|
||||
| Centro Sociale Autogestito Magazzino 47
|
||||
| Via Industriale 10, BRESCIA
|
||||
|
|
||||
|
||||
|
||||
Strumenti per la programmazione dei robot, scoprire i segreti dell'intelligenza artificiale, viaggiare nel cuore di un motore di ricerca, conoscere la storia della Radio antagonista bresciana, cucinare e conoscere la cucina vegana e palestinese, cantare sulle note dell' HTTPS. Sono solo alcuni dei temi al centro dell'Hackmeeting, incontro annuale delle controculture digitali che giunge nel 2024 alla sua ventisettesima edizione e che si svolge quest’anno a Brescia, al CSA Magazzino 47, in via Industriale 10, dal 14 al 16 giugno. Il Magazzino 47, sede del movimento antagonista dal 1985, e' strettamente legato all’emittente Radio Onda d’Urto, punto di riferimento della galassia antagonista bresciana, uno spazio autogestito dove l’impegno politico si intreccia con l’attività sociale, la cultura e la musica. Un festival (il programma è disponibile su www.hackmeeting.org) dell’insegnamento reciproco e dello scambio libero e gratuito, per scoprire come configurare server autogestiti a prova di privacy, con approfondimenti dal punto di vista tecnico e legale, ma anche reti digitali in assenza di internet o sistemi anticollisione per droni. Obiettivo: riportare la tecnologia sotto il controllo delle persone in un mondo in cui sempre di più sono le persone a finire sotto il dominio dei dispositivi, e cioè delle grandi aziende che ci stanno dietro. L’HackIT è solo per "hackers" con un' eccezzione diversa da quella comune, ovvero per chi vuole gestirsi la vita come preferisce e sa mettersi in gioco per farlo. Anche se non ha mai visto un computer in vita sua.
|
||||
|
||||
|
||||
Si parte dalle basi - l'utilizzo di un tester elettrico o l'installazione di Linux sul proprio computer - per lanciarsi verso la conquista del controllo della propria indipendenza digitale. Seminari aperti a tutte le persone e gratuiti, per mettere insieme idee e competenze. Una formula consolidata, figlia di un'idea che precorse i tempi. La prima edizione risale al 1998, in oltre un quarto di secolo, l'Hackmeeting ha accompagnato tutte le fasi della rete. Lanciando l'allarme con anni di anticipo su quello che sarebbe successo in Italia e nel mondo. La voracità di Google sui dati delle persone, la pervasività dei social e le dipendenze che hanno provocato, il controllo sociale attraverso i dispositivi, le bolle digitali fatte di propaganda personalizzata, la trasformazione delle criptovalute da strumenti di libertà a mezzi speculativi, la fine della neutralità della rete, le insidie del telefonino nei rapporti di lavoro o come strumento di sorveglianza.
|
||||
|
||||
Ogni anno, la comunità dell'Hackmeeting si riunisce in una città diversa e, tenacemente, continua a interrogarsi sulle trasformazioni che la tecnologia sta impoendo al mondo, alla ricerca di strade alternative. Fatte di meno dominio e controllo; e di più autonomia, condivisione e consapevolezza.
|
217
content/pages/storia.md
Normal file
|
@ -0,0 +1,217 @@
|
|||
Title: Storia
|
||||
slug: storia
|
||||
navbar_sort: 8
|
||||
|
||||
####La storia dell'HackMeeting
|
||||
|
||||
* **1998 - Firenze - CPA Firenze Sud**
|
||||
|
||||
Viene organizzato il primo hackmeeting al Cpa di Firenze. [Strano Network](http://strano.net/), [Avana BBS](http://avana.forteprenestino.net/), [Ecn](http://www.ecn.org), [Freaknet](http://www.freaknet.org), Decoder, Metro Olografix e la rete
|
||||
Cybernet decidono di fare un meeting perché quattro anni prima c’era stato un primo giro di vite contro gli hacker italiani. Il problema era
|
||||
che i media iniziavano ad accorgersi che c’era il fenomeno digitale e identificavano il tentativo di capire la logica delle nuove tecnologie
|
||||
come fenomeno “criminali”. La comunità hacker invece voleva sottolineare che il computer era uno strumento di massa, domestico e non solo
|
||||
tecnico-universitario o militare, di controllo o di mercato.
|
||||
L’informazione che su quella rete di pc passava, doveva essere libera. Radio Cybernet strimmava i seminari su web, prima webradio italiana. Da
|
||||
allora, la radio ci sarà praticamente ogni anno. I tre giorni di Firenze sono quelli in cui e’ nato l’impianto dell’hackmeeting attuale. Il
|
||||
messaggio era: usciamo dal digitale e portiamo nel reale e alla portata di tutti questioni tecniche e opportunità di comunicazione diretta;
|
||||
siamo noi a dirtelo senza mediazioni (”don’t hate the media, become the media” da lì a qualche anno avrebbe affiancato “information wants to be
|
||||
free”). Quell’anno per esempio esce Kryptonite, un libro che raccoglie how-to su strumenti specifici, legati alla privacy e all’anonimato
|
||||
(anonimous remailer, gpg, packet radio). L’intenzione divulgativa dell’hackmeeting è chiara. All’hackmeeting partecipa tutta la scena più
|
||||
rappresentativa dell’underground italiano. La prima generazione di hacker che si riconosce nel termine non nel senso più comunemente
|
||||
attribuito dai media. Strumenti tecnici: corsi di linux per principianti e workshop sulla accessibilità delle tecnologie e dei siti.
|
||||
|
||||
* **1999 - Milano - Deposito Bulk**
|
||||
|
||||
Viene deciso collettivamente di uscire dalla dimensione dei tre giorni per darsi spazi tutto l’anno, e dare origine agli hacklab dove
|
||||
incontrarsi, avere un laboratorio, condividere il lavoro, divulgare tematiche. Ospite di rilievo è Wau Holland, un hacker libertario
|
||||
cofondatore del Chaos Computer Club, che senza carta di identità arrivò in Italia in modi rocamboleschi. Connessioni internazionali vengono
|
||||
fatte conoscere alla comunità italiana. Strumenti tecnici: si ricorda il seminario su attaccare i protocolli di comunicazione (ip icmp tcp udp +
|
||||
servizi), per capire/spiegare un po’ meglio come funzionano i protocolli di rete e quindi dove e perché sono vulnerabili. Un altro tema che
|
||||
diventerà ricorrente negli hackmeting.
|
||||
|
||||
* **2000 - Roma - Forte Prenestino**
|
||||
|
||||
Sede di Avana BBS, primo hackmeeting organizzato con gli hacklab, diventati ormai realtà concrete. Jaromil si presenta con asciicam,
|
||||
costruendo le relazioni declinate in altri ambiti come la net art, aspetto artistico, giocoso e capace di critica dell’hacking. È anche un
|
||||
hackmeeting dedicato ai diritti in rete, alla cooperazione sociale, all’accessibilità in rete. Molti i seminari su etica e web.
|
||||
|
||||
* **2001 - Catania - Freaknet media lab**
|
||||
|
||||
Un posto particolare, visto che era nato prima degli hacklab e già si apriva al pubblico con i bollettini meteo per i pescatori, via internet,
|
||||
e le tastiere in arabo per gli immigrati. È l’hackmeeting più forte dal punto di vista del numero di ore passato sul codice. Viene presentato il
|
||||
progetto autistici.org/inventati.org come server autogestito che si affiancava a ecn. Viene presentato anche Bolic1, che diventerà poi
|
||||
Dynebolic (the media hacktivist tool). Il Freaknet propone nell’università scientifica di Catania che si adotti il software libero
|
||||
come software di base e all’hackmeeting viene proposto di estenderlo anche ad altre città. Passeranno per questo meeting anche quelli che poi
|
||||
creeranno il media center del G8. Vengono proposti strumenti e persone che poi si coaguleranno per dare vita a media come Indymedia. Si inizia
|
||||
a parlare di reddito e lavoro nella net economy. Strumenti tecnici: si tiene un seminario di reverse engineering, ovvero
|
||||
modificare il comportamento di un programma senza conoscere il codice sorgente.
|
||||
|
||||
* **2002 - Bologna - TPO**
|
||||
|
||||
Hackmeeting mondano. la parola mediattivismo è uscita e diffusa, Indymedia è un media consolidato, NGvision rappresenta un archivio video
|
||||
su web consistente, ci sono le telestreet, l’hackmeeeting diventa non più solo da hacker ma da attivismo media, e non a caso compaiono le
|
||||
donne. Viene Richard Stallman. Strumenti tecnici: viene presentato il Retrocomputing ovvero la passione per il recupero dell’hardware.
|
||||
|
||||
* **2003 - Torino - Barrio**
|
||||
|
||||
Viene fatto il mitico seminario di stiraggio acrobatico e la questione genere/tecnologie viene proposta dal Sexy shock di Bologna, collettivo
|
||||
di donne, sottolineando che ci sono questioni di genere anche tra hacker e che sarebbe il caso di occuparsene. Alle aule vengono dati nomi
|
||||
storici dell’anarchismo. Strumenti tecnici: Honeypots, sicurezza informatica sul web sono tra gli argomenti trattati. Wireless diffuso.
|
||||
|
||||
* **2004 - Genova - Buridda**
|
||||
|
||||
Si apre ulteriormente l’ambito, vengono presentati seminari di robotica, ma anche sulla prostituzione. E sopratutto a partire da Reload di Milano
|
||||
viene lanciato il concetto di reality hacking, hacking della vita quotidiana e della politica, chiedendo agli hacklab di uscire dagli
|
||||
stretti ambiti nerd per entrare in quelli più allargati dell’agire politico. Strumenti tecnici: Bluetooth security uno dei seminari.
|
||||
|
||||
* **2005 - Napoli - TerraTerra**
|
||||
|
||||
Viene presentato Open non è free, il secondo libro che esce dalla comunità di hackmeeting. Visto che nella società iniziano a circolare i
|
||||
concetti di open source e di free software, la comunità sente la necessità di sottolineare la necessità di approcciare in maniera critica
|
||||
queste tematiche che sono comunque ormai assorbite anche dal mercato. Strumenti tecnici: introduzione al Phreaking, ovvero come telefonare
|
||||
gratis, dal fischietto di Captain Crunch al vOIP.
|
||||
|
||||
* **2006 - Parma - Collettivo Mario Lupo**
|
||||
|
||||
Gli hacklab non sono più l’elemento principale di organizzazione ma c’è una percezione più comunitaria che permette l’occupazione di uno spazio
|
||||
per la durata dell’hackmeeting. L’occupazione avviene in un momento ambiguo e cosparso di sgomberi nel territorio parmense e prende la forma
|
||||
politica di una TAZ, anche se c’era la speranza di fare molto di più (tenere il posto, che poi invece verrà sgomberato). Nell’ambito dei
|
||||
seminari si apre ulteriormente l’applicazione della filosofia hack in ambiti vari, per esempio, serpicanaro e la licenza open per la
|
||||
produzione materiale, bucare un sistema che non è solo informatico ma reale e di mercato. Viene presentato The darkside of Google, altro libro
|
||||
scritto da persone della comunità su aspetti ancora (allora) poco noti di Google. Strumenti tecnici: Web Semantico e Ontologie informatiche; si discute di Copyleft e fightsharing.
|
||||
|
||||
* **2007 - Pisa - Rebeldia**
|
||||
|
||||
Rispetto all’anno precedente si recupera di nuovo sul profilo internazionale, vengono Emmanuel Goldstein, parte della scena americana storica dei phreakers e media hacktivist. Andy Muller Maghun, membro del CCC, esordisce dicendo “il CCC nasce come progetto politico”, segno di come in Europa sin dall’82 si considerava il potenziale politico dell’hacking come concetto, Armin Medosh, che fa una ricostruzione storica in chiave marxista dell’evoluzione tecnologica. Appaiono seminari che impongono una presa di coscienza collettiva ecologica: viene fatto il seminario “hack the bread”, che riporta l’accento su pratiche politiche anche a livello personale. Viene introdotto lo spazio capanne dei suchi, uno spazio diverso dal workshop, di discussione libera e lavoro in comune. Strumenti tecnici: metodi di compromissione dell’anonimato, come difendersi. Voip Security, necessità di attenzione anche su Voip. IPSec, Meccanismi per proteggersi da attacchi basati sull’analisi statistica del traffico (Web site fingerprinting, etc ).
|
||||
|
||||
* **2008 - Palermo - AsK 191**
|
||||
|
||||
Hackmeeting importante per il luogo, l’incontro con le persone dell’Ask ha prodotto un momento di autogestione in comune molto forte. Conferma
|
||||
spirito forte comunitario, non molto aperto perché non c’era risposta da parte del pubblico palermitano. L’impronta ecologica continua, si parla
|
||||
di compost, di rifiuti, di energia solare e onde radio. Sharing not exploiting: Prosumer vs. Corporation, riflessione su social network e
|
||||
web 2.0, ritorni economici delle corporation. Dal punto di vista dell’immaginario compare il workshop sullo steampunk, il dopo cyberpunk.
|
||||
Strumenti tecnici: Web semantico, come approccio al web 3.0
|
||||
|
||||
* **2009 - Rho - Fornace**
|
||||
|
||||
Di nuovo l’hackmeeting va a supportare un’autogestione in difficoltà. Lo scenario è Rho, hinterland milanese devastato dalla speculazione Expo,
|
||||
un enorme capannone vuoto occupato da pochi giorni. Si parla di paura, di creazione della paura, di come uscire da questo modello sociale di
|
||||
persone spaventate, che si guardano in cagnesco. L’icona dell’hackit è il babau, il cattivo delle favole. Si stabilizza all’interno delle
|
||||
tematiche l’interesse per la questione precariato e modelli di vita conseguenti. Si inaugura la pratica dei warm up, seminari che introducono nelle settimane precedenti sia nella città ospite, che nel resto d’Italia l’evento principale. A livello di immaginario si parla di fantascienza, di retrocomputing e restauro, videogiochi per cellulari. Strumenti tecnici: streaming audio/video giss, sniffjoke, reti gsm, reti mesh
|
||||
|
||||
* **2010 - Roma - La Torre**
|
||||
|
||||
Hackmeeting tra gli ulivi nel caldo romano, tutti in tenda, ci si riprende dall’hinterland milanese dell’anno prima. Si parla di controllo, di quanto ne abbiamo intorno, di quali strumenti utilizza. Le tematiche ecologiste rientrano dalla porta principale con il seminario sulle pale eoliche, la presentazione della rete per l’autocostruzione e il seminario sugli orti urbani. Nel lan space presenti sempre più arduini, e un modello di elicottero radiocomandato. Ospite dell’hackit Margaret killjoy, un buffo personaggio dello Steampunk Magazine, un rivista autoprodotta americana, presentata assieme a Ruggine, una rivista autoprodotta italiana di racconti e disegni. Affollatissimo il seminario di pr0n, misterisca e intrigante estensione di firefox. Strumenti tecnici: ipv6 e reti mesh, opencv, arduino.
|
||||
|
||||
* **2011 - Firenze - csa nExt Emerson**
|
||||
|
||||
Il tema di questa edizione è stato quello dell’apocalisse. Dalle nuvole dei disastri nucleari alle nuvole del cloud computing: la tecnologia e la conoscenza quando centralizzate per interessi economici e politici e in contrasto con le aspirazioni individuali e collettive di autonomia portano inevitabilmente alla… apocalisse.
|
||||
|
||||
* **2012 - L’Aquila - Asilo Occupato**
|
||||
|
||||
Una presenza significativa in una città come L’Aquila che non assomiglia più ad una città. Hack the town!! Se non è più possibile riparare i danni, dare un senso a ciò che è andato distrutto, hackmeeting prova a capire se è possibile farla funzionare in un altro modo, partendo dalla ricostruzione dei tessuti sociali e relazionali, delle connessioni vitali della città.
|
||||
|
||||
* **2013 - Cosenza - Ex-Officine**
|
||||
|
||||
Si è tenuto nell’area occupata delle ex officine Ferrovie della Calabria ed ha avuto come tema la “iattura del controllo”. L’idea dell’Hackmeeting 2013 era quello di stimolare una nuova saggezza popolare 2.0 per far fronte alle forze avverse che minacciano le libertà di espressione e di condivisione nella rete. Neanche a farlo apposta, fra iatture e superstizioni, proprio nei giorni di quest’hackmeeting escono le prime rivelazioni di Snowden.
|
||||
L’attività di chi controlla i movimenti in rete, per affari, o per controllo è il tema chiave, ma gli argomenti trattati sono stati molteplici: dalla privacy alle tecnologie di comunicazione, dalla contrasessualità alle relazioni di inchiesta sui software spia utilizzati da governi e non. Degno di nota è anche l’esperimento di media trolling che porta hackmeeting sulle pagine dei più importanti quotidiani nazionali attraverso un divertente e totalmente infondato “scoop”.
|
||||
|
||||
* **2014 - Bologna - XM24**
|
||||
|
||||
Xm24 ospita gli ultimi 3 giorni di un hackmeeting durato molto più a lungo:
|
||||
l'articolato percorso di warmup cittadino, coordinato dall'hacklabbo ma che
|
||||
vede la partecipazione di molte realtà, antagoniste e non, porta ad un'edizione
|
||||
particolarmente partecipata.
|
||||
|
||||
Grazie alla lunga storia mediattivista di Xm24, la visibilità e il carattere
|
||||
universitario di Bologna e alla rete di comunità che si intrecciano nella lista
|
||||
hackmeeting prende vita un evento che dimostra alla sua stessa comunità come la
|
||||
scena sia tutt'altro che morta, ma anzi particolarmente attenta e attiva.
|
||||
Durante le tre giornate la necessità e la centralita' di un evento costruito
|
||||
dal basso viene riaffermato con forza non soltato dalla partecipazione della
|
||||
comunità storica, ma anche dalle assemblee di comunita' trasversali ad
|
||||
hackmeeting(eg. quella delle WCN italiane), l'affacciarsi di molti volti nuovi
|
||||
e i moltissimi talk di grande attualità (eg. Citizen Lab con il lavoro sulla
|
||||
sorveglianza digitale).
|
||||
|
||||
PS: il logo è un non morto, non un gorilla, non un fattone ;)
|
||||
|
||||
* **2015 - Napoli - Mensa occupata**
|
||||
|
||||
Dopo dieci anni Hackmeeting torna a Napoli e si riprende il centro della città.
|
||||
|
||||
La collocazione centralissima della Mensa Occupata favorisce lo svolgimento di un hackmeeting di livello non esclusivamentetecnico e molto divulgativo. A meno di due mesi del primo maggio e delle lotte contro Expo, la riflessione sul lato più politico e militante dell'hacking si impone: tecniche di autodifesa neuro-digitali, studio delle legislazioni in materia di intercettazioni, Tor, crittografia e resistenza digitale. Alla comunità si è aggiunta tanta gente nuova e questa diventa l'occasione per reinventarsi. Si scopre che i fritti favoriscono la concentrazione.
|
||||
|
||||
* **2016 - Pisa - Polo Fibonacci**
|
||||
|
||||
Polo Fibonacci, l'hackmeeting si ritrova a Pisa il 3-5 Giugno e occupa un polo
|
||||
universitario riempiendolo di giochi, feste, workshop e dibattiti. Per parlare di
|
||||
tecnologia, di privacy, di sicurezza, ma anche di differenze, di gender e di
|
||||
piu' inclusione all'interno del hackmeeting.
|
||||
|
||||
Si analizzano malware, si discute di crittografia quantistica e
|
||||
ci si ritrova a giocare a retrogame alle 3 di mattina tra musica punk e la
|
||||
birra che ormai e' finita da un po'
|
||||
|
||||
I bagni non divisi per genere si chiamano come gli editor: VIM, NANO o EMACS, mentre
|
||||
alcune faccie internazionali e non rispondo ad email e scrivono pezzi di python nel mezzo del Lan Space
|
||||
mentre altri cercano per la prima volta di installare Linux.
|
||||
|
||||
L'attenzione si sposta parecchio sui malware, anche detti captatori informatici
|
||||
si prova ad analizzarli e vedere la demo di hacking-team, poi Ippolita presenta [Anime Elettriche](http://www.vita.it/it/interview/2016/04/27/anime-elettriche-corpi-digitali-linee-di-fuga-e-tattiche-di-resistenza/52/) e la sera
|
||||
alcuni propongono giochi sulla comprensione del consenso, tavole rotonde sulle
|
||||
discussioni di genere e tentativi di migliorare la comunita'
|
||||
Poi all'improvviso e' gia' domenica e abbracci e baci, si accolla il prossimo
|
||||
hackit ai Torinesi, ci vediamo in Val Susa.
|
||||
|
||||
* **2017 - Venaus, Val di Susa - Borgata 8 Dicembre e Presidio permanente**
|
||||
|
||||
E' il ventesimo hackmeeting e per celebrare l'occasione, si pensa di
|
||||
farlo in un posto diverso. L'idea gira in lista, piace subito e così si parte.
|
||||
Si impara a saldare, a fare il dado vegetale, a costruire un'antenna, a
|
||||
farsi il formaggio con il latte di capra.
|
||||
Si parla di sicurezza digitale, di anonimato, di fisica quantistica, di
|
||||
cyberspionaggio, di pokemon, di controllo, di radio e di reti mesh.
|
||||
Ci si mischia con i resistenti valsusini, ci si contagia, si scambiano
|
||||
racconti, esperienze, sogni.La comunità condivide con la valle, la valle si racconta alla comunità.
|
||||
Si dorme in tenda si cucina e ci si lava all'aperto, si cena al cantiere
|
||||
di Chiomonte, si cammina in montagna.
|
||||
|
||||
Tagliare le reti, insomma, ci sta!
|
||||
|
||||
* **2018 - Buridda Genova**
|
||||
|
||||
Dopo 14 anni hackmeeting torna a Genova, nelle stanze del Buridda.
|
||||
L'impronta del luogo è sicuramente l'attenzione all'autocostruzione, ma
|
||||
non mancano dibattiti storici come la presentazione del numero di
|
||||
Zapruder (numero dedicato all'hacking), una spiegazione pratica degli
|
||||
avanzamenti crittografici negli ultimi anni, un workshop con pc e USB
|
||||
alla mano come quello su Tails ed anche confronti interessanti e
|
||||
contraddittori sui temi tecnici e politici come quello sul voto elettronico.
|
||||
Viene presentato Stop al Panico, una raccolta di suggermenti tecnici e
|
||||
legali da affrontare in caso di sequestro, si parla di sistemi operativi
|
||||
alternativi per cellulari.
|
||||
Si discute di social, di nolike e dell'uso tossico di questi strumenti,
|
||||
riflettendo su come riappropriarci delle tecnologie "social" anche
|
||||
presentando l'esperimento Bolognese di mastodon.bida.im
|
||||
Dopo 3 giorni intensi, l'assemblea della domenica è molto partecipata:
|
||||
scopriamo che i posti che hanno ospitato l'hackmeeting riprendono
|
||||
energie mentre in varie città stanno nascendo vari hacklab mossi non
|
||||
solo dalla volonta di smontare e comprendere la tecnologia come un tempo
|
||||
o dalla mancanza di internet in casa, ma dal desiderio di incontrarsi,
|
||||
discutere e condividere le impressioni su questi strumenti che oggi
|
||||
abbiamo intorno e cercare alternative comuni insieme.
|
||||
Ultimo giro al bar, dove quest'anno la birra non e' ancora finita, poi
|
||||
una tuffo al mare per chi riesce, saluti sparsi a tutte le creature di
|
||||
questo hackmeeting con la promessa di rivederci presto a sud a nord
|
||||
online o offline, non fa differenza, l'importante e' che ci siamo.
|
||||
|
||||
* **2019 - Firenze - csa nExt Emerson**
|
||||
|
||||
* **2020 - Roma - C.S.O.A Forte Prenestino**
|
||||
|
||||
* **2021 - Bologna - Casona di Ponticelli**
|
||||
|
||||
* **2022 - Torino - C.S.O.A Gabrio**
|
||||
|
||||
* **2023 - Gallico Marina, Reggio Calabria - CSOA Angelina Cartella**
|
245
content/pages/warmup.rst
Normal file
|
@ -0,0 +1,245 @@
|
|||
Warmup
|
||||
======
|
||||
|
||||
:slug: warmup
|
||||
:navbar_sort: 5
|
||||
:lang: it
|
||||
|
||||
Cosa sono
|
||||
"""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
I warmup sono eventi "preparatori" ad hackmeeting. Avvengono in giro per l'Italia, e possono trattare gli argomenti più disparati.
|
||||
|
||||
Proporre un warmup
|
||||
"""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
Vuoi fare un warmup? ottimo!
|
||||
|
||||
* iscriviti alla `mailing list di hackmeeting <https://www.autistici.org/mailman/listinfo/hackmeeting>`_.
|
||||
* scrivi in mailing list riguardo al tuo warmup: non c'è bisogno di alcuna "approvazione ufficiale", ma segnalarlo in lista è comunque un passaggio utile per favorire dibattito e comunicazione.
|
||||
|
||||
|
||||
Elenco
|
||||
"""""""""""""""""""""""""""""""""""""""
|
||||
.. contents:: :local:
|
||||
|
||||
==========================
|
||||
|
||||
Fighting Technologies of Domination: From decentralised event platforms to the right to analogue
|
||||
-------------------------------------------------------------------------------------------------
|
||||
|
||||
Domenica 9 giugno @ Disruption Network Lab (Berlino)
|
||||
|
||||
https://www.disruptionlab.org/event/fighting-technologies-of-domination
|
||||
|
||||
Si discuterà del diritto a vivere senza smartphone e di software fuori dal radar GAFAM con il collettivo Balotta.org di Bologna che condurrà un laboratorio su Gancio. Oltre a balotta ci sarà Agnese del collettivo [C.I.R.C.E.](https://circex.org) a moderare e Roberta Barone che approfondirà il tema del diritto a non avere uno smartphone mostrando alcune clip dal documentario ["Digital Dissidents"](https://digitalnisvobody.cz/wp-content/uploads/2022/09/Digitalni-disidenti_ABOUT-FILM.pdf). [Qui il trailer](https://iteroni.com/watch?v=qd9VGM4Q3WI).
|
||||
|
||||
* 15:00-16:30: Open discussion – From decentralised platforms to the right to analogue.
|
||||
|
||||
The first part of the meetup will be dedicated to an open discussion, on the one hand to name the contradictions of the acritical adoption of smartphones and to give a voice and a framework to doubts, questions and demands that remain largely unspoken, and on the other hand to explore the possibilities of grassroots technologies and decentralised open-source software to share events and collect experiences beyond the use of social media platforms.
|
||||
|
||||
* 16:45-18:15: Gancio and Balotta.org – Exploring open-source software for event publishing.
|
||||
|
||||
After a short break, the second part of the meetup will be hosted by the Balotta Collective (Italy) and we will delve deeper into the exploration of Gancio.
|
||||
|
||||
Born in Turin (Italy) out of political hacking movements, Gancio is a free open-source software designed for event publishing.
|
||||
|
||||
|
||||
|
||||
Oooh issaa! ...ooooh issaaa! il MIAI salpa!
|
||||
--------------------------------------------
|
||||
|
||||
Naviganti! dal primo marzo scioglieremo le vele e tireremo su l’ancora. Si riparte con l’allestimento del MIAI! Fino ad ora abbiamo pulito, ristrutturato, ammobiliato, allestito parte della Biblioteca e realizzato un affresco :) Si è fatta ora di affrontare la massa. La quantità di materia informatica che attende ormai da troppo tempo di essere liberata dal suo involucro di plastica e cartone per ritornare alla luce nel pieno del suo splendore. I pallet sono lì...intombati...aspettano soltanto noi!
|
||||
|
||||
Grazie anche ad Hackmeeting abbiamo resistito.
|
||||
Questo museo è frutto anche di questa comunità.
|
||||
|
||||
per chiarezza, i primi fine settimana dei prossimi mesi sono piccoli Warm Up di costruzione del MIAI in attesa dell'appuntamento Hackmeeting a Brescia :)
|
||||
|
||||
E' l'occasione per scoprire i reperti, familiarizzare, prendersene cura, riaccenderli.
|
||||
|
||||
* Ecco le date dei venerdì-sabato-domenica:
|
||||
|
||||
1-2-3 marzo
|
||||
|
||||
5-6-7 aprile
|
||||
|
||||
3-4-5 maggio
|
||||
|
||||
31 maggio 1-2 giugno
|
||||
|
||||
5-6-7 luglio inizia il Cool Down con sessione di restauro del GE-120 da tenersi il 26-27-28 ultimo fine settimana di luglio.
|
||||
|
||||
Questi sono appuntamenti fissi, ma se qualcun in transito volesse fermarsi in date diverse, male non fa!
|
||||
|
||||
Per informazioni su ospitalità e altro scrivete a info@verdebinario.org
|
||||
|
||||
Ti invitiamo a salire a bordo e a dare una mano in questa impresa!
|
||||
|
||||
Obiettivo?
|
||||
|
||||
Allestire il Museo Interattivo di Archeologia Informatica - MIAI.
|
||||
|
||||
Quando?
|
||||
|
||||
Ogni primo fine settimana del mese da marzo a luglio, qui al MIAI, in Calabria, a Rende (CS) -Via C.B.Cavour 4.
|
||||
|
||||
Ospitalità?
|
||||
|
||||
Provate a organizzarvi e nel caso vogliate un supporto contattateci in privato.
|
||||
|
||||
E se non posso venire?
|
||||
|
||||
Siamo liet* anche di un piccolo/grande contributo monetario che è utile per affrontare gli imprevisti di un allestimento di questo genere
|
||||
|
||||
E alla fine?
|
||||
|
||||
Cool Down! Dopo Hackmeeting 2024, una sessione di restauro del GE-120 da tenersi il 26-27-28 ultimo fine settimana di luglio!
|
||||
|
||||
E alla fine fine?
|
||||
|
||||
Arrivare in porto, attraccare e vivere il MIAI funzionante!
|
||||
|
||||
|
||||
Museo Interattivo di Archeologia Informatica - MIAI https://miai.musif.eu/
|
||||
|
||||
|
||||
|
||||
Questo titolo non è autogenerato
|
||||
---------------------------------
|
||||
|
||||
Martedì 28 maggio @ via Mascarella 59A ZEM GARDEN (Bologna)
|
||||
|
||||
https://balotta.org/event/questo-titolo-non-e-autogenerato
|
||||
|
||||
Tranquillu il tuo lavoro da titolista sopravviverà alle AI.
|
||||
|
||||
Una serata dedicata al futuro dell'intelligenza artificiale insieme al collettivo Hacklabbo.
|
||||
|
||||
|
||||
|
||||
RADIO EUSTACHIO: due giorni di incontri, costruzioni, accrocchi e musica!
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
Sabartolomenica 25 e 26 maggio @ Gigi Piccoli (Verona)
|
||||
|
||||
https://lasitua.org/event/radio-eustachio-due-giorni-di-incontri-costruzioni-accrocchi-e-musica
|
||||
|
||||
|
||||
**sabato 25/05**
|
||||
|
||||
* ore 11.00: Come funziona lo strumento radio: onde medie e corte
|
||||
|
||||
* ore 15.00: Calendari condivisi. Presentazione di Gancio e le istanze gancio.cisti.org, balotta.org e lasitua.org
|
||||
|
||||
* ore 17.00: Autocostruzione di un ricevitore AM (o qualcosa di simile)
|
||||
|
||||
* ore 19.00: Concerto con i Kani Sholty e a seguire selecta musicale con djset eustachiani!
|
||||
|
||||
**domenica 26/05**
|
||||
|
||||
* ore 11.00: Mercato autoproduzioni del Gigi Piccoli con diretta a microfono aperto
|
||||
|
||||
* ore 15.00: Chiacchiera su Gancio: una proposta per un calendario condiviso locale
|
||||
|
||||
* ore 17.00: Concerto e streaming di DucalicRock! con The Slurmies e Maybe Wonders
|
||||
|
||||
Radio Eustachio ha un blog: https://eustachio.indivia.net/blog
|
||||
|
||||
Il tutto si svolgerà al Gigi Piccoli, in via Caroto 1, Verona
|
||||
|
||||
|
||||
|
||||
Presentazione A-K-M-E, astro cyber crypto bluff
|
||||
------------------------------------------------
|
||||
|
||||
Sabato 25 maggio @ Piano Terra Lab (Milano)
|
||||
|
||||
* ore 19.30 cibo per tutti i palati
|
||||
|
||||
* ore 20.30 presentazione dei libri Cyber bluff e Crypto bluff con l’autore ginox
|
||||
|
||||
Cyber bluff, Collana BookBlock, Eris edizioni
|
||||
|
||||
Sono poche le persone che si interrogano sulla rete a cui questi servizi si appoggiano per capire da dove viene, com’è nata e da chi è controllata. Sappiamo come funziona questo strumento, questa rete che è onnipresente nelle nostre vite? Sappiamo dove vanno i nostri dati e chi ne trae profitto? Abbiamo davvero bisogno di comunicazioni istantanee? Internet è davvero democratico? Il libro descrive i servizi online più diffusi, raccontandone la genesi, il funzionamento, e fornendo alcuni consigli utili per utilizzarli in maniera più consapevole.
|
||||
|
||||
Crypto bluff, Collana BookBlock, Eris edizioni
|
||||
|
||||
Bitcoin e NFT, blockchain e miner: questi termini provocano reazioni contrastanti. Da un lato suscitano un forte hype, dall’altro appaiono come l’ennesima bolla finanziaria speculativa, neppure troppo raffinata. Non si tratta di un libro su come svoltare. L’obiettivo è spogliare le criptovalute dal glamour che le circonda e spiegare come la componente rivoluzionaria e libertaria di cui si fregiano sia solo una strategia di marketing.
|
||||
|
||||
* ore 22:00 Acaroroscopo, ovvero l’oroscopo che non ti aspettavi! Musica live e testi a cura di Lobo
|
||||
|
||||
Cosa accade quando un hacker decide di darsi all’astrologia? Vieni a scoprire finalmente cosa dicono le stelle del tuo benessere digitale e della tua privacy. Con l’Acaroroscopo, la tua guida all’hacking astrale, i misteri informatici del tuo destino non avranno piu’ segreti!
|
||||
|
||||
* ore 23:00 Low-tech live di Pablito el drito
|
||||
|
||||
25 maggio a partire dalle 19:30
|
||||
|
||||
https://akme.vado.li
|
||||
|
||||
https://www.pianoterralab.org/events/a-k-m-e-astro-cyber/
|
||||
|
||||
|
||||
|
||||
Assemblea di istanza mastodon bida.im e pranzo di autofinanziamento
|
||||
-------------------------------------------------------------------
|
||||
|
||||
Domenica 19 maggio 2020 dalle 12.00 @ Spazio Libero Autogestito @Vag61 (in via Paolo Fabbri 110 a Bologna)
|
||||
|
||||
https://bida.im/news/quarta-assemblea-generale-distanza-mastodon-bida-im/
|
||||
|
||||
|
||||
|
||||
Presentazione del libro Cyber Bluff (Catania)
|
||||
----------------------------------------------
|
||||
|
||||
Sabato 18 maggio @ Laboratorio Urbano Popolare Occupato (in Piazza Pietro Lupo 25, Catania)
|
||||
|
||||
Presentazione del libro Cyber Bluff: storie rischi e vantaggi della rete per navigare consapevolmente (2021, eris). Discuteremo e approfondiremo insieme all'autore Ginox dei temi trattati nel libro.
|
||||
|
||||
https://www.attoppa.it/event/presentazione-di-cyber-bluff
|
||||
|
||||
|
||||
|
||||
Presentazione Antennine/Ninux in appennino + cena benefit
|
||||
----------------------------------------------------------
|
||||
|
||||
Lunedì 13 Maggio @ Circolo Anarchico Berneri, Bologna (BO)
|
||||
|
||||
https://circoloberneri.indivia.net/events/event/presentazione-del-progetto-antennine-in-appennino-bolognese-e-cena-di-autofinanziamento
|
||||
|
||||
|
||||
|
||||
Brugole e merletti
|
||||
-------------------
|
||||
|
||||
10-11-12 maggio @ NextEmerson Via di Bellagio 15 - Firenze
|
||||
|
||||
https://doityourtrash.noblogs.org/
|
||||
|
||||
|
||||
|
||||
Instant Messaging e sicurezza
|
||||
------------------------------
|
||||
|
||||
10 maggio a partire dalle 21:00 @ Pianoterra Lab, Milano
|
||||
https://www.pianoterralab.org/events/a-k-m-e-instant-messaging/
|
||||
|
||||
Sono cambiati i mezzi con i quali comunichiamo: sempre meno si usano email, sempre di più le app da cellulare, in particolare, per la messaggistica istantanea. L’Instant Messaging è diventato il sistema di comunicazione più diffuso, anche nell’organizzazione del lavoro. Usati spesso da attivist* e agitator* a causa della loro enorme diffusione, questi sistemi immediatamente disponibili sono diventati un obbiettivo appetibile. La vulnerabilità di queste applicazioni può così mettere a rischio la libertà, la privacy e la sicurezza delle persone. Crittografia asimmetrica, metadati, immagini, backup, codice sorgente, ne discutiamo in una tavola rotonda allargata sulla base di strategie e alternative disponibili.
|
||||
|
||||
con samba – underscore hacklab (Torino)
|
||||
|
||||
10 maggio a partire dalle 21:00
|
||||
|
||||
A-K-M-E
|
||||
|
||||
https://akme.vado.li
|
||||
|
||||
|
||||
|
||||
Workshop mappe dalla carta al digitale
|
||||
---------------------------------------
|
||||
|
||||
Martedì 9 aprile @ Vag 61, via Paolo Fabbri 110, Bologna (BO)
|
||||
|
||||
https://ciemmona.noblogs.org/workshop-mappe-dalla-carta-al-digitale/
|
222
dev-utils/ics2yaml.py
Executable file
|
@ -0,0 +1,222 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
import logging
|
||||
import argparse
|
||||
import os.path
|
||||
from typing import Iterable
|
||||
from pathlib import Path
|
||||
from datetime import timedelta
|
||||
import json
|
||||
|
||||
import yaml
|
||||
from icalendar import Calendar, Event
|
||||
|
||||
|
||||
def get_parser():
|
||||
p = argparse.ArgumentParser()
|
||||
p.add_argument("files", nargs="+", type=str)
|
||||
p.add_argument("--hm-json", default='./hackmeeting.json', type=Path)
|
||||
p.add_argument(
|
||||
"--out-talks-dir",
|
||||
help="Output directory for markdown files",
|
||||
default="talks/",
|
||||
type=Path,
|
||||
)
|
||||
p.add_argument("--trust-location", type=str, nargs="*", default=[])
|
||||
p.add_argument(
|
||||
"--slot-size",
|
||||
type=int,
|
||||
metavar="MINUTES",
|
||||
default=15,
|
||||
help="Round times to the nearest */MINUTES",
|
||||
)
|
||||
p.add_argument("--night-threshold", metavar="HOUR", default=5, type=int)
|
||||
p.add_argument("--mode", choices=["pelican"], default="pelican")
|
||||
return p
|
||||
|
||||
|
||||
def round_down(num, divisor):
|
||||
"""
|
||||
>>> round_down(1000, 10)
|
||||
1000
|
||||
>>> round_down(1001, 10)
|
||||
1000
|
||||
>>> round_down(1009, 10)
|
||||
1000
|
||||
"""
|
||||
return num - (num % divisor)
|
||||
|
||||
|
||||
def round_down_time(hhmm: str, divisor: int):
|
||||
hh = hhmm[:-2]
|
||||
mm = hhmm[-2:]
|
||||
mm = round_down(int(mm, base=10), divisor)
|
||||
return int('%s%02d' % (hh,mm) , base=10)
|
||||
|
||||
|
||||
class Converter:
|
||||
"""
|
||||
This class takes care of everything converter-related.
|
||||
|
||||
Objects are used to enable multiple output formats to be added pretty easily by subclassing
|
||||
"""
|
||||
|
||||
def __init__(self, args):
|
||||
self.args = args
|
||||
self.rooms = []
|
||||
self.talks = {}
|
||||
self.talk_room = {} # map talk uid to room name
|
||||
self.talk_location = {} # same, but see --trust-location
|
||||
self.changed_files = []
|
||||
|
||||
def _fname_to_room(self, fpath: str) -> str:
|
||||
return os.path.splitext(os.path.basename(fpath))[0]
|
||||
|
||||
def get_vevents_from_calendar(self, cal: Calendar) -> Iterable[Event]:
|
||||
for subc in cal.subcomponents:
|
||||
if type(subc) is Event:
|
||||
yield subc
|
||||
|
||||
def load_input(self):
|
||||
with self.args.hm_json.open() as buf:
|
||||
self.hackmeeting_metadata = json.load(buf)
|
||||
for fpath in self.args.files:
|
||||
room = self._fname_to_room(fpath)
|
||||
with open(fpath) as buf:
|
||||
file_content = buf.read()
|
||||
cal = Calendar.from_ical(file_content, multiple=True)
|
||||
for subcal in cal:
|
||||
for ev in self.get_vevents_from_calendar(subcal):
|
||||
if ev.decoded('DTSTART').year != self.hackmeeting_metadata['year']:
|
||||
continue
|
||||
uid = ev.decoded("uid").decode("ascii")
|
||||
self.talks[uid] = ev
|
||||
self.talk_room[uid] = room
|
||||
self.talk_location[uid] = room
|
||||
if fpath in self.args.trust_location:
|
||||
try:
|
||||
self.talk_location[uid] = ev.decoded("location").decode(
|
||||
"utf8"
|
||||
)
|
||||
except:
|
||||
pass
|
||||
|
||||
def run(self):
|
||||
self.rooms = [self._fname_to_room(fpath) for fpath in self.args.files]
|
||||
self.load_input()
|
||||
self.output()
|
||||
for fpath in self.changed_files:
|
||||
print(fpath)
|
||||
|
||||
|
||||
class PelicanConverter(Converter):
|
||||
"""
|
||||
add relevant output features to the base converter
|
||||
"""
|
||||
|
||||
def load_input(self):
|
||||
super().load_input()
|
||||
talks_meta = self.args.out_talks_dir / 'meta.yaml'
|
||||
with talks_meta.open() as buf:
|
||||
self.talks_metadata = yaml.safe_load(buf)
|
||||
|
||||
def output_markdown(self):
|
||||
for uid in sorted(self.talks):
|
||||
talk = self.talks[uid]
|
||||
fname = 'meta.yaml'
|
||||
talkdir = self.args.out_talks_dir / uid
|
||||
talkdir.mkdir(exist_ok=True)
|
||||
fpath = talkdir / fname
|
||||
self.changed_files.append(fpath)
|
||||
day = (talk.decoded('DTSTART').date() - self.talks_metadata['startdate']).days
|
||||
frontmatter = dict(
|
||||
key=uid,
|
||||
title=talk.decoded("SUMMARY").decode("utf8"),
|
||||
format="conference",
|
||||
start=talk.decoded("DTSTART"),
|
||||
time=talk.decoded("DTSTART").strftime('%H:%M'),
|
||||
day=day,
|
||||
end=talk.decoded("DTEND"),
|
||||
room=self.talk_location[uid],
|
||||
duration=int(
|
||||
(talk.decoded("DTEND") - talk.decoded("DTSTART")).total_seconds()
|
||||
// 60
|
||||
),
|
||||
tags=[],
|
||||
)
|
||||
if "CATEGORIES" in talk:
|
||||
try:
|
||||
vobject = talk.get("CATEGORIES")
|
||||
if hasattr(vobject, "cats"):
|
||||
vobject = vobject.cats
|
||||
frontmatter["tags"] = [str(t) for t in vobject]
|
||||
else:
|
||||
frontmatter["tags"] = [str(vobject)]
|
||||
except Exception as exc:
|
||||
logging.warning("Error parsing categories: %s", str(exc))
|
||||
if "base" in frontmatter["tags"]:
|
||||
frontmatter["level"] = "beginner"
|
||||
if "DESCRIPTION" in talk:
|
||||
frontmatter['text'] = talk.decoded("DESCRIPTION").decode("utf8")
|
||||
else:
|
||||
frontmatter['text'] = ''
|
||||
with open(str(fpath), "w") as buf:
|
||||
yaml.safe_dump(frontmatter, buf)
|
||||
# body
|
||||
|
||||
def output_schedule(self):
|
||||
days = {}
|
||||
for uid in sorted(self.talks):
|
||||
talk = self.talks[uid]
|
||||
# TODO: talk just after midnight should belong to the preceding day
|
||||
dt = talk.decoded("dtstart")
|
||||
after_midnight = dt.time().hour < self.args.night_threshold
|
||||
if after_midnight:
|
||||
dt = dt - timedelta(days=1)
|
||||
day = dt.strftime("%Y-%m-%d")
|
||||
|
||||
hour = talk.decoded("dtstart").time().hour
|
||||
minute = talk.decoded("dtstart").time().minute
|
||||
if after_midnight:
|
||||
hour += 24
|
||||
|
||||
start = "%02d:%02d" % (hour, minute)
|
||||
if day not in days:
|
||||
days[day] = dict(day=day, start=start, rooms={})
|
||||
if days[day]["start"] > start:
|
||||
days[day]["start"] = start
|
||||
|
||||
room = self.talk_room[uid]
|
||||
days[day]["rooms"].setdefault(room, dict(room=room, slots=[]))
|
||||
|
||||
talkstart = round_down_time('%02d%02d' % (hour, minute), self.args.slot_size)
|
||||
duration = talk.decoded("dtend") - talk.decoded("dtstart")
|
||||
duration_minutes = int(duration.total_seconds() // 60)
|
||||
duration_minutes = round_down(duration_minutes, self.args.slot_size)
|
||||
slot = "%04d-%dmin" % (talkstart, duration_minutes)
|
||||
days[day]["rooms"][room]["slots"].append(dict(slot=slot, talk=uid))
|
||||
|
||||
# convert from our intermediate format to the correct one
|
||||
for d in sorted(days):
|
||||
# vanity: let's sort
|
||||
for room in sorted(days[d]["rooms"]):
|
||||
days[d]["rooms"][room]["slots"].sort(key=lambda x: x["slot"])
|
||||
# convert dict to list
|
||||
days[d]["rooms"] = [days[d]["rooms"][k] for k in sorted(days[d]["rooms"])]
|
||||
out = {"schedule": [days[k] for k in sorted(days)]}
|
||||
|
||||
# XXX: dump, finally
|
||||
|
||||
def output(self):
|
||||
self.output_markdown()
|
||||
|
||||
|
||||
def main():
|
||||
converter_register = {"pelican": PelicanConverter}
|
||||
args = get_parser().parse_args()
|
||||
c = converter_register[args.mode](args)
|
||||
c.run()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
16
dev-utils/sincronizza.sh
Executable file
|
@ -0,0 +1,16 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
|
||||
git reset --hard HEAD
|
||||
git ls-files | grep -E '^talks/.*/meta\.yaml$' | xargs -r git rm -f
|
||||
|
||||
curl -s 'https://files.esiliati.org/remote.php/dav/public-calendars/2w2meG65B4p9yfLD?export' > room1.ics
|
||||
curl -s 'https://files.esiliati.org/remote.php/dav/public-calendars/YpCMj9qgnWjHtAyd?export' > room2.ics
|
||||
curl -s 'https://files.esiliati.org/remote.php/dav/public-calendars/grWX9kAXpyxiBTDG?export' > room3.ics
|
||||
curl -s 'https://files.esiliati.org/remote.php/dav/public-calendars/RYWGzPpr2eYdXPX9?export' > extra.ics
|
||||
|
||||
mkdir -p content/talks/
|
||||
"$(dirname "$0")/ics2yaml.py" room1.ics room2.ics room3.ics extra.ics | stest -f | xargs -r git add
|
||||
|
||||
git commit --author='calendarioBot <calendario@example.com>' -m 'update calendar from remote ICS file'
|
12
hackmeeting.json
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"year": 2025,
|
||||
"location": {
|
||||
"name": "Sa domu",
|
||||
"website": "",
|
||||
"city": "Cagliari",
|
||||
"address": "",
|
||||
"geo": {
|
||||
}
|
||||
},
|
||||
"when": "30 Maggio - 1 Giugno 2025"
|
||||
}
|
12
new-year.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
Anno nuovo sito nuovo
|
||||
=========================
|
||||
|
||||
Come fare un sito per l'anno nuovo, abbastanza simile a quello vecchio?
|
||||
|
||||
copia ed aggiorna le date. Dove?
|
||||
|
||||
* `README.md`
|
||||
* `content/pages/index.*` ci sono le date/luogo
|
||||
* `content/pages/info*` c'è sicuramente roba da cambiare
|
||||
* `hackmeeting.json` cambia il campo `year`
|
||||
* `talks/meta.yaml`: cambia la startdate: deve essere quella del primo giorno da mettere in programma. Siccome a volte ci sono anche cose dal mercoledì, per prudenza indica il mercoledì come giorno di inizio.
|
113
pelicanconf.py
Normal file
|
@ -0,0 +1,113 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*- #
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import json
|
||||
import math
|
||||
with open('hackmeeting.json') as buf:
|
||||
hm_metadata = json.load(buf)
|
||||
|
||||
|
||||
# Non so dove metterla quindi le metto qui, poi vediamo
|
||||
|
||||
def geo_to_bbox(lat, lon, zoom):
|
||||
width = 425
|
||||
height = 350
|
||||
# m/pixel at zoom level
|
||||
# see https://wiki.openstreetmap.org/wiki/Zoom_levels to change
|
||||
meters_pixel = 156543/(2**zoom)
|
||||
r_earth = 6371000
|
||||
|
||||
dy = (width/2)*meters_pixel
|
||||
dx = (height/2)*meters_pixel
|
||||
latitude = lat
|
||||
longitude = lon
|
||||
lat_s = latitude + (dy / r_earth) * (180 / math.pi)
|
||||
lon_s = longitude + (dx / r_earth) * (180 / math.pi) / math.cos(latitude * math.pi/180)
|
||||
lat_e = latitude - (dy / r_earth) * (180 / math.pi)
|
||||
lon_e = longitude - (dx / r_earth) * (180 / math.pi) / math.cos(latitude * math.pi/180)
|
||||
bbox = f"{lon_s}%2C{lat_s}%2C{lon_e}%2C{lat_e}"
|
||||
|
||||
return bbox
|
||||
|
||||
|
||||
# da un anno all'altro cambiare solo la variabile YEAR è sufficiente per le operazioni più base!
|
||||
YEAR = hm_metadata['year']
|
||||
|
||||
EDITION = hex(YEAR - 1997)
|
||||
AUTHOR = "Hackmeeting"
|
||||
SITENAME = "Hackmeeting %s" % EDITION
|
||||
CC_LICENSE = "by-nc-sa"
|
||||
SITEURL = "/hackit%d" % (YEAR - 2000)
|
||||
|
||||
JINJA_GLOBALS = { 'hm': { 'edition': EDITION, **hm_metadata, 'osm': { 'bbox': geo_to_bbox(hm_metadata['location']['geo']['lat'], hm_metadata['location']['geo']['lon'], 18) } } }
|
||||
|
||||
PATH = "content"
|
||||
PAGE_PATHS = ["pages"]
|
||||
ARTICLE_PATHS = ["news"]
|
||||
STATIC_PATHS = ["images", "talks", "extra"]
|
||||
# DIRECT_TEMPLATES = ('search',) # tipue search
|
||||
|
||||
TIMEZONE = "Europe/Paris"
|
||||
|
||||
DEFAULT_LANG = "it"
|
||||
|
||||
# Feed generation is usually not desired when developing
|
||||
INDEX_SAVE_AS = "news.html"
|
||||
ARTICLE_URL = "news/{slug}.html"
|
||||
ARTICLE_SAVE_AS = "news/{slug}.html"
|
||||
FEED_DOMAIN = "https://it.hackmeeting.org"
|
||||
FEED_ALL_ATOM = "news.xml"
|
||||
CATEGORY_FEED_ATOM = None
|
||||
TRANSLATION_FEED_ATOM = None
|
||||
AUTHOR_FEED_ATOM = None
|
||||
AUTHOR_FEED_RSS = None
|
||||
|
||||
# Blogroll
|
||||
LINKS = None
|
||||
# Social widget
|
||||
SOCIAL = None
|
||||
DEFAULT_PAGINATION = 10
|
||||
USE_OPEN_GRAPH = False # COL CAZZO
|
||||
|
||||
# Uncomment following line if you want document-relative URLs when developing
|
||||
RELATIVE_URLS = True
|
||||
|
||||
DEFAULT_DATE = (YEAR, 3, 1)
|
||||
TYPOGRIFY = True
|
||||
|
||||
PAGE_ORDER_BY = "navbar_sort"
|
||||
PAGE_URL = "{slug}.html"
|
||||
PAGE_SAVE_AS = "{slug}.html"
|
||||
PAGE_LANG_URL = "{slug}.{lang}.html"
|
||||
PAGE_LANG_SAVE_AS = "{slug}.{lang}.html"
|
||||
BANNER = True
|
||||
BANNER_ALL_PAGES = True
|
||||
SITELOGO = "logo/logo.png"
|
||||
# PAGE_BACKGROUND = 'images/background.jpg'
|
||||
# THEME = 'themes/hackit0x15/'
|
||||
THEME = "themes/to0x19/"
|
||||
FAVICON = "images/cyberrights.png"
|
||||
FONT_URL = "theme/css/anaheim.css"
|
||||
|
||||
# Custom css by sticazzi.
|
||||
# CUSTOM_CSS = 'theme/css/hackit.css'
|
||||
EXTRA_PATH_METADATA = {
|
||||
# 'extra/main.css': {'path': 'themes/pelican-bootstrap3/static/css/main.css' },
|
||||
"extra/favicon.png": {"path": "images/favicon.png"},
|
||||
"images/locandina.jpg": {"path": "images/locandina.jpg"},
|
||||
}
|
||||
|
||||
# Pelican bootstrap 3 theme settings
|
||||
BOOTSTRAP_THEME = "darkly"
|
||||
HIDE_SITENAME = True
|
||||
HIDE_SIDEBAR = True
|
||||
PLUGIN_PATHS = ["plugins"]
|
||||
PLUGINS = ["langmenu", "talks", "tipue_search", "pelican_webassets", "pelican.plugins.jinja2content"]
|
||||
|
||||
# plugin/talks.py
|
||||
SCHEDULEURL = "https://hackmeeting.org" + SITEURL + "/schedule.html"
|
||||
TALKS_GRID_STEP = 15
|
||||
|
||||
MARKDOWN = {"extension_configs": {"markdown.extensions.toc": {}}}
|
||||
|
39
plugins/langmenu.py
Normal file
|
@ -0,0 +1,39 @@
|
|||
'''
|
||||
This plugin attemps to create something similar to menuitems,
|
||||
but more meaningful with respect to l10n
|
||||
'''
|
||||
from __future__ import print_function
|
||||
|
||||
from pelican import signals
|
||||
|
||||
|
||||
def add_localmenuitems(generator):
|
||||
menu = {} # lang: list of pages
|
||||
for page in generator.context['pages']:
|
||||
menu.setdefault(page.lang, [])
|
||||
for tr in page.translations:
|
||||
menu.setdefault(tr.lang, [])
|
||||
print('we have langs ' + ','.join(menu.keys()))
|
||||
for page in sorted(generator.context['pages'],
|
||||
key=lambda x: int(x.navbar_sort)):
|
||||
defined_langs = []
|
||||
menu[page.lang].append(page)
|
||||
defined_langs.append(page.lang)
|
||||
for tr in page.translations:
|
||||
menu[tr.lang].append(tr)
|
||||
defined_langs.append(tr.lang)
|
||||
for lang in menu.keys():
|
||||
if lang not in defined_langs:
|
||||
menu[lang].append(page)
|
||||
|
||||
menuitems = {}
|
||||
for lang in menu:
|
||||
menuitems[lang] = []
|
||||
for page in menu[lang]:
|
||||
menuitems[lang].append((page.title, page.url))
|
||||
|
||||
generator.context['LOCALMENUITEMS'] = menuitems
|
||||
|
||||
|
||||
def register():
|
||||
signals.page_generator_finalized.connect(add_localmenuitems)
|
1
plugins/pelican_webassets/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from .assets import register
|
64
plugins/pelican_webassets/assets.py
Normal file
|
@ -0,0 +1,64 @@
|
|||
|
||||
from pelican import signals
|
||||
import os
|
||||
|
||||
from webassets import Environment
|
||||
from webassets.ext.jinja2 import AssetsExtension
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def add_extension(pelican):
|
||||
"""add webassets' jinja2 extension to pelican"""
|
||||
jinja_env = pelican.settings['JINJA_ENVIRONMENT']
|
||||
if type(jinja_env) == dict: # pelican 3.7+
|
||||
jinja_env = jinja_env['extensions']
|
||||
jinja_env.append(AssetsExtension)
|
||||
logger.debug("'pelican-webassets' added to jinja2 environment")
|
||||
|
||||
|
||||
def create_environment(generator):
|
||||
"""define the webassets environment for the generator"""
|
||||
|
||||
theme_static_dir = generator.settings['THEME_STATIC_DIR']
|
||||
assets_destination = os.path.join(generator.output_path, theme_static_dir)
|
||||
generator.env.assets_environment = Environment(
|
||||
assets_destination, theme_static_dir)
|
||||
|
||||
# are we in debug mode?
|
||||
in_debug = generator.settings.get(
|
||||
'WEBASSETS_DEBUG', logger.getEffectiveLevel() <= logging.DEBUG
|
||||
)
|
||||
if in_debug:
|
||||
logger.info("'webassets' running in DEBUG mode")
|
||||
generator.env.assets_environment.debug = in_debug
|
||||
|
||||
# pass along the additional congiuration options
|
||||
for item in generator.settings.get('WEBASSETS_CONFIG', []):
|
||||
generator.env.assets_environment.config[item[0]] = item[1]
|
||||
logger.debug(
|
||||
"'webassets' adding config: '%s' -> %s",
|
||||
item[0], item[1]
|
||||
)
|
||||
|
||||
# pass along the named bundles
|
||||
for name, args, kwargs in generator.settings.get('WEBASSETS_BUNDLES', []):
|
||||
generator.env.assets_environment.register(name, *args, **kwargs)
|
||||
logger.debug("'webassets' registered bundle: '%s'", name)
|
||||
|
||||
# pass along the additional directories for webassets
|
||||
paths = (
|
||||
generator.settings['THEME_STATIC_PATHS'] +
|
||||
generator.settings.get('WEBASSETS_SOURCE_PATHS', [])
|
||||
)
|
||||
logger.debug("'webassets' looding for files in: %s", paths)
|
||||
for path in (paths):
|
||||
generator.env.assets_environment.append_path(
|
||||
os.path.join(generator.theme, path)
|
||||
)
|
||||
|
||||
|
||||
def register():
|
||||
signals.initialized.connect(add_extension)
|
||||
signals.generator_init.connect(create_environment)
|
3
plugins/talks/__init__.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from .talks import *
|
||||
|
||||
# flake8: noqa
|
104
plugins/talks/style.css
Normal file
|
@ -0,0 +1,104 @@
|
|||
|
||||
.talk-resources {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.talk-grid {
|
||||
table-layout: auto;
|
||||
min-width: 100%;
|
||||
border-collapse: separate;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.talk-grid > thead th:first-child {
|
||||
max-width: 5em;
|
||||
}
|
||||
|
||||
.talk-grid > thead th {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.talk-grid tr {
|
||||
height: 1.5em;
|
||||
}
|
||||
|
||||
|
||||
.rooms-4 .talk {
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.rooms-3 .talk {
|
||||
width: 33%;
|
||||
}
|
||||
|
||||
.rooms-2 .talk {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.rooms-1 .talk {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td.talk {
|
||||
border: 1px solid #444;
|
||||
padding: 4px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
td.talk > a {
|
||||
text-decoration: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.talk-grid tr {
|
||||
line-height: 1em;
|
||||
}
|
||||
|
||||
.talk-title a,
|
||||
.talk-title a:hover,
|
||||
.talk-title a:focus {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.talk-description strong {
|
||||
background: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* tag speciali nei talk {{{ */
|
||||
/* generati guardando i tag di glypicon come glyphicon-pushpin e copiandone il campo content */
|
||||
td.talk::before {
|
||||
font-family: 'Glyphicons Halflings';
|
||||
float: right;
|
||||
}
|
||||
td.tag-presentazione_libro::before {
|
||||
content: "\e043";
|
||||
}
|
||||
td.tag-percorso_base::before {
|
||||
content: "\e146";
|
||||
}
|
||||
/* tag speciali nei talk }}} */
|
||||
|
||||
/* END TALK }}} */
|
||||
|
||||
/* Pagine speciali */
|
||||
.body-info .entry-content > ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
/*media query min dal piccolo, max dal grande*/
|
||||
|
||||
@media all and (max-width: 770px) {
|
||||
.talk-grid {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
.talk-grid td {
|
||||
hyphens: auto;
|
||||
}
|
||||
}
|
||||
@media all and (max-width: 450px) {
|
||||
.talk-grid {
|
||||
font-size: 0.5em;
|
||||
}
|
||||
}
|
||||
|
607
plugins/talks/talks.py
Normal file
|
@ -0,0 +1,607 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Manage talks scheduling in a semantic way
|
||||
"""
|
||||
|
||||
|
||||
from __future__ import print_function
|
||||
import os
|
||||
import io
|
||||
from functools import wraps
|
||||
import logging
|
||||
import re
|
||||
import datetime
|
||||
import shutil
|
||||
from copy import copy
|
||||
import locale
|
||||
from contextlib import contextmanager
|
||||
import inspect
|
||||
|
||||
from babel.dates import format_date, format_datetime, format_time, get_timezone
|
||||
from markdown import markdown
|
||||
from docutils import nodes
|
||||
from docutils.parsers.rst import directives, Directive
|
||||
import six
|
||||
|
||||
from pelican import signals, generators
|
||||
import jinja2
|
||||
|
||||
try:
|
||||
import ics
|
||||
except ImportError:
|
||||
ICS_ENABLED = False
|
||||
else:
|
||||
ICS_ENABLED = True
|
||||
try:
|
||||
import unidecode
|
||||
except ImportError:
|
||||
logging.warning("unidecode not available")
|
||||
UNIDECODE_ENABLED = False
|
||||
else:
|
||||
UNIDECODE_ENABLED = True
|
||||
import dateutil
|
||||
|
||||
try:
|
||||
Markup = jinja2.Markup
|
||||
except AttributeError:
|
||||
from markupsafe import Markup
|
||||
|
||||
pelican = None # This will be set during register()
|
||||
if 'TZ' not in os.environ:
|
||||
os.environ['TZ'] = 'Europe/Rome'
|
||||
|
||||
|
||||
def memoize(function):
|
||||
"""decorators to cache"""
|
||||
memo = {}
|
||||
|
||||
@wraps(function)
|
||||
def wrapper(*args):
|
||||
if args in memo:
|
||||
return memo[args]
|
||||
else:
|
||||
rv = function(*args)
|
||||
memo[args] = rv
|
||||
return rv
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
@contextmanager
|
||||
def setlocale(name):
|
||||
saved = locale.setlocale(locale.LC_ALL)
|
||||
try:
|
||||
yield locale.setlocale(locale.LC_ALL, name)
|
||||
finally:
|
||||
locale.setlocale(locale.LC_ALL, saved)
|
||||
|
||||
|
||||
@memoize
|
||||
def get_talk_names():
|
||||
names = [
|
||||
name
|
||||
for name in os.listdir(pelican.settings["TALKS_PATH"])
|
||||
if not name.startswith("_") and get_talk_data(name) is not None
|
||||
]
|
||||
names.sort()
|
||||
return names
|
||||
|
||||
|
||||
def all_talks():
|
||||
return [get_talk_data(tn) for tn in get_talk_names()]
|
||||
|
||||
|
||||
def unique_attr(iterable, attr):
|
||||
return {x[attr] for x in iterable if attr in x}
|
||||
|
||||
|
||||
@memoize
|
||||
def get_global_data():
|
||||
fname = os.path.join(pelican.settings["TALKS_PATH"], "meta.yaml")
|
||||
if not os.path.isfile(fname):
|
||||
return None
|
||||
with io.open(fname, encoding="utf8") as buf:
|
||||
try:
|
||||
data = yaml.safe_load(buf)
|
||||
except Exception:
|
||||
logging.exception("Syntax error reading %s; skipping", fname)
|
||||
return None
|
||||
if data is None:
|
||||
return None
|
||||
if "startdate" not in data:
|
||||
logging.error("Missing startdate in global data")
|
||||
data["startdate"] = datetime.datetime.now()
|
||||
if "rooms" not in data:
|
||||
data["rooms"] = {}
|
||||
if "names" not in data["rooms"]:
|
||||
data["rooms"]["names"] = {}
|
||||
if "order" not in data["rooms"]:
|
||||
data["rooms"]["order"] = []
|
||||
return data
|
||||
|
||||
|
||||
def _get_time_shift(timestring):
|
||||
"""Il problema che abbiamo è che vogliamo dire che le 2 di notte del sabato sono in realtà "parte" del
|
||||
venerdì. Per farlo accettiamo orari che superano le 24, ad esempio 25.30 vuol dire 1.30.
|
||||
|
||||
Questa funzione ritorna una timedelta in base alla stringa passata
|
||||
"""
|
||||
timeparts = re.findall(r"\d+", timestring)
|
||||
if not timeparts or len(timeparts) > 2:
|
||||
raise ValueError("Malformed time %s" % timestring)
|
||||
timeparts += [0, 0] # "padding" per essere sicuro ci siano anche [1] e [2]
|
||||
duration = datetime.timedelta(
|
||||
hours=int(timeparts[0]),
|
||||
minutes=int(timeparts[1]),
|
||||
seconds=int(timeparts[2]),
|
||||
)
|
||||
if duration.total_seconds() > 3600 * 31 or duration.total_seconds() < 0:
|
||||
raise ValueError("Sforamento eccessivo: %d" % duration.hours)
|
||||
return duration
|
||||
|
||||
|
||||
@memoize
|
||||
def get_talk_data(talkname):
|
||||
fname = os.path.join(pelican.settings["TALKS_PATH"], talkname, "meta.yaml")
|
||||
if not os.path.isfile(fname):
|
||||
return None
|
||||
with io.open(fname, encoding="utf8") as buf:
|
||||
try:
|
||||
data = yaml.safe_load(buf)
|
||||
except Exception:
|
||||
logging.exception("Syntax error reading %s; skipping", fname)
|
||||
return None
|
||||
if data is None:
|
||||
return None
|
||||
try:
|
||||
gridstep = pelican.settings["TALKS_GRID_STEP"]
|
||||
data.setdefault("nooverlap", [])
|
||||
if "title" not in data:
|
||||
logging.warn("Talk <{}> has no `title` field".format(talkname))
|
||||
data["title"] = six.text_type(talkname)
|
||||
else:
|
||||
data["title"] = six.text_type(data["title"])
|
||||
if "text" not in data:
|
||||
logging.warn("Talk <{}> has no `text` field".format(talkname))
|
||||
data["text"] = ""
|
||||
else:
|
||||
data["text"] = six.text_type(data["text"])
|
||||
if "duration" not in data:
|
||||
logging.info(
|
||||
"Talk <{}> has no `duration` field (50min used)".format(
|
||||
talkname
|
||||
)
|
||||
)
|
||||
data["duration"] = 50
|
||||
data["duration"] = int(data["duration"])
|
||||
if data["duration"] < gridstep:
|
||||
logging.info(
|
||||
"Talk <{}> lasts only {} minutes; changing to {}".format(
|
||||
talkname, data["duration"], gridstep
|
||||
)
|
||||
)
|
||||
data["duration"] = gridstep
|
||||
if "links" not in data or not data["links"]:
|
||||
data["links"] = []
|
||||
if "contacts" not in data or not data["contacts"]:
|
||||
data["contacts"] = []
|
||||
if "needs" not in data or not data["needs"]:
|
||||
data["needs"] = []
|
||||
if "room" not in data:
|
||||
logging.warn("Talk <{}> has no `room` field".format(talkname))
|
||||
else:
|
||||
if data["room"] in get_global_data()["rooms"]["names"]:
|
||||
data["room"] = get_global_data()["rooms"]["names"][
|
||||
data["room"]
|
||||
]
|
||||
if "time" not in data or "day" not in data:
|
||||
logging.warn("Talk <{}> has no `time` or `day`".format(talkname))
|
||||
if "time" in data:
|
||||
del data["time"]
|
||||
if "day" in data:
|
||||
del data["day"]
|
||||
else:
|
||||
data["day"] = get_global_data()["startdate"] + datetime.timedelta(
|
||||
days=data["day"]
|
||||
)
|
||||
del data["time"]
|
||||
|
||||
logging.debug("parsed: %s - %s" % (data["title"], data.get('start', None)))
|
||||
data["id"] = talkname
|
||||
resdir = os.path.join(
|
||||
pelican.settings["TALKS_PATH"],
|
||||
talkname,
|
||||
pelican.settings["TALKS_ATTACHMENT_PATH"],
|
||||
)
|
||||
if os.path.isdir(resdir) and os.listdir(resdir):
|
||||
data["resources"] = resdir
|
||||
return data
|
||||
except Exception:
|
||||
logging.exception("Error on talk %s", talkname)
|
||||
raise
|
||||
|
||||
|
||||
def overlap(interval_a, interval_b):
|
||||
"""how many minutes do they overlap?"""
|
||||
return max(
|
||||
0,
|
||||
min(interval_a[1], interval_b[1]) - max(interval_a[0], interval_b[0]),
|
||||
)
|
||||
|
||||
|
||||
def get_talk_overlaps(name):
|
||||
data = get_talk_data(name)
|
||||
overlapping_talks = set()
|
||||
if "time" not in data:
|
||||
return overlapping_talks
|
||||
start = int(data["start"].strftime("%s"))
|
||||
end = start + data["duration"] * 60
|
||||
for other in get_talk_names():
|
||||
if other == name:
|
||||
continue
|
||||
if "time" not in get_talk_data(other):
|
||||
continue
|
||||
other_start = int(get_talk_data(other)["time"].strftime("%s"))
|
||||
other_end = other_start + get_talk_data(other)["duration"] * 60
|
||||
|
||||
minutes = overlap((start, end), (other_start, other_end))
|
||||
if minutes > 0:
|
||||
overlapping_talks.add(other)
|
||||
return overlapping_talks
|
||||
|
||||
|
||||
@memoize
|
||||
def check_overlaps():
|
||||
for t in get_talk_names():
|
||||
over = get_talk_overlaps(t)
|
||||
noover = get_talk_data(t)["nooverlap"]
|
||||
contacts = set(get_talk_data(t)["contacts"])
|
||||
for overlapping in over:
|
||||
if overlapping in noover or set(
|
||||
get_talk_data(overlapping)["contacts"]
|
||||
).intersection(contacts):
|
||||
logging.warning("Talk %s overlaps with %s" % (t, overlapping))
|
||||
|
||||
|
||||
@memoize
|
||||
def jinja_env():
|
||||
env = jinja2.Environment(
|
||||
loader=jinja2.FileSystemLoader(
|
||||
os.path.join(pelican.settings["TALKS_PATH"], "_templates")
|
||||
),
|
||||
autoescape=True,
|
||||
)
|
||||
env.filters["markdown"] = lambda text: Markup(markdown(text))
|
||||
env.filters["dateformat"] = format_date
|
||||
env.filters["datetimeformat"] = format_datetime
|
||||
env.filters["timeformat"] = format_time
|
||||
env.filters["parsetime"] = lambda iso: datetime.datetime.fromisoformat(iso).time()
|
||||
return env
|
||||
|
||||
|
||||
@memoize
|
||||
def get_css():
|
||||
plugindir = os.path.dirname(
|
||||
os.path.abspath(inspect.getfile(inspect.currentframe()))
|
||||
)
|
||||
with open(os.path.join(plugindir, "style.css")) as buf:
|
||||
return buf.read()
|
||||
|
||||
|
||||
class TalkListDirective(Directive):
|
||||
final_argument_whitespace = True
|
||||
has_content = True
|
||||
option_spec = {"lang": directives.unchanged}
|
||||
|
||||
def run(self):
|
||||
lang = self.options.get("lang", "C")
|
||||
tmpl = jinja_env().get_template("talk.html")
|
||||
|
||||
def _sort_date(name):
|
||||
"""
|
||||
This function is a helper to sort talks by start date
|
||||
|
||||
When no date is available, put at the beginning
|
||||
"""
|
||||
d = get_talk_data(name)
|
||||
room = d.get("room", "")
|
||||
time = d.get(
|
||||
"start",
|
||||
datetime.datetime(1, 1, 1).replace(
|
||||
tzinfo=dateutil.tz.gettz(os.environ['TZ'])
|
||||
),
|
||||
)
|
||||
title = d.get("title", "")
|
||||
return (time, room, title)
|
||||
|
||||
return [
|
||||
nodes.raw(
|
||||
"", tmpl.render(lang=lang,
|
||||
local_tz=get_timezone(os.environ['TZ']),
|
||||
**get_talk_data(n)), format="html"
|
||||
)
|
||||
for n in sorted(get_talk_names(), key=_sort_date)
|
||||
]
|
||||
|
||||
|
||||
class TalkDirective(Directive):
|
||||
required_arguments = 1
|
||||
final_argument_whitespace = True
|
||||
has_content = True
|
||||
option_spec = {"lang": directives.unchanged}
|
||||
|
||||
def run(self):
|
||||
lang = self.options.get("lang", "C")
|
||||
tmpl = jinja_env().get_template("talk.html")
|
||||
data = get_talk_data(self.arguments[0])
|
||||
if data is None:
|
||||
return []
|
||||
return [nodes.raw("", tmpl.render(lang=lang,
|
||||
local_tz=get_timezone(os.environ['TZ']),
|
||||
**data), format="html")]
|
||||
|
||||
|
||||
def _approx_time(time: datetime.datetime) -> datetime.datetime:
|
||||
gridstep = pelican.settings["TALKS_GRID_STEP"]
|
||||
minutes = time.minute
|
||||
new_minutes = minutes // gridstep * gridstep
|
||||
diff = new_minutes - minutes
|
||||
if diff != 0:
|
||||
new_dt = time + datetime.timedelta(minutes=diff)
|
||||
return new_dt
|
||||
else:
|
||||
return time
|
||||
|
||||
|
||||
class TalkGridDirective(Directive):
|
||||
"""A complete grid"""
|
||||
|
||||
final_argument_whitespace = True
|
||||
has_content = True
|
||||
option_spec = {"lang": directives.unchanged}
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
lang = self.options.get("lang", "C")
|
||||
tmpl = jinja_env().get_template("grid.html")
|
||||
output = []
|
||||
days = unique_attr(all_talks(), "day")
|
||||
gridstep = pelican.settings["TALKS_GRID_STEP"]
|
||||
for day in sorted(days):
|
||||
talks = {
|
||||
talk["id"]
|
||||
for talk in all_talks()
|
||||
if talk.get("day", None) == day
|
||||
and "start" in talk
|
||||
and "room" in talk
|
||||
}
|
||||
if not talks:
|
||||
continue
|
||||
talks = [get_talk_data(t) for t in talks]
|
||||
rooms = set()
|
||||
for t in talks:
|
||||
if type(t["room"]) is list:
|
||||
for r in t["room"]:
|
||||
rooms.add(r)
|
||||
else:
|
||||
rooms.add(t["room"])
|
||||
|
||||
def _room_sort_key(r):
|
||||
order = get_global_data()["rooms"]["order"]
|
||||
base = None
|
||||
for k, v in get_global_data()["rooms"]["names"].items():
|
||||
if v == r:
|
||||
base = k
|
||||
break
|
||||
else:
|
||||
if type(r) is str:
|
||||
return ord(r[0])
|
||||
# int?
|
||||
return r
|
||||
return order.index(base)
|
||||
|
||||
rooms = list(sorted(rooms, key=_room_sort_key))
|
||||
|
||||
# room=* is not a real room.
|
||||
# Remove it unless that day only has special rooms
|
||||
if "*" in rooms and len(rooms) > 1:
|
||||
del rooms[rooms.index("*")]
|
||||
mintime = min({talk["start"] for talk in talks})
|
||||
maxtime = max(
|
||||
{
|
||||
(talk["start"]
|
||||
+ datetime.timedelta(minutes=talk["duration"])
|
||||
)
|
||||
for talk in talks
|
||||
}
|
||||
)
|
||||
times = {}
|
||||
|
||||
t = mintime
|
||||
while t <= maxtime:
|
||||
times[t.isoformat('T', timespec="minutes")] = [None] * len(rooms)
|
||||
t += datetime.timedelta(minutes=gridstep)
|
||||
for talk in sorted(talks, key=lambda x: x["start"]):
|
||||
try:
|
||||
position = _approx_time(talk["start"]).isoformat('T', timespec="minutes")
|
||||
if talk["room"] == "*":
|
||||
roomnums = range(len(rooms))
|
||||
elif type(talk["room"]) is list:
|
||||
roomnums = [rooms.index(r) for r in talk["room"]]
|
||||
else:
|
||||
roomnums = [rooms.index(talk["room"])]
|
||||
for roomnum in roomnums:
|
||||
if times[position][roomnum] is not None:
|
||||
logging.error(
|
||||
"Talk %s and %s overlap! (room %s)",
|
||||
times[position][roomnum]["id"],
|
||||
talk["id"],
|
||||
rooms[roomnum],
|
||||
)
|
||||
continue
|
||||
times[position][roomnum] = copy(talk)
|
||||
times[position][roomnum]["skip"] = False
|
||||
for i in range(1, talk["duration"] // gridstep):
|
||||
p = _approx_time(talk["start"] + i *
|
||||
datetime.timedelta(minutes=pelican.settings["TALKS_GRID_STEP"])).isoformat('T', timespec="minutes")
|
||||
times[p][roomnum] = copy(talk)
|
||||
times[p][roomnum]["skip"] = True
|
||||
except Exception:
|
||||
logging.exception(
|
||||
"Error on talk %s", talk.get("title", "?")
|
||||
)
|
||||
|
||||
render = tmpl.render(
|
||||
local_tz=get_timezone(os.environ['TZ']),
|
||||
times=times,
|
||||
rooms=rooms,
|
||||
mintime=mintime,
|
||||
maxtime=maxtime,
|
||||
timestep=gridstep,
|
||||
lang=lang,
|
||||
)
|
||||
date_formatted = format_date(day, format="full", locale=lang)
|
||||
output.append(
|
||||
nodes.raw(
|
||||
"",
|
||||
f'<section class="talk-grid-day '
|
||||
f'talk-grid-day-{day}">'
|
||||
f'<h4>{date_formatted}</h4>'
|
||||
f'{render}'
|
||||
f'</section>',
|
||||
format="html",
|
||||
)
|
||||
)
|
||||
except:
|
||||
logging.exception("Error on talk grid")
|
||||
import traceback
|
||||
|
||||
traceback.print_exc()
|
||||
return []
|
||||
css = get_css()
|
||||
if css:
|
||||
output.insert(
|
||||
0,
|
||||
nodes.raw(
|
||||
"",
|
||||
'<style type="text/css">%s</style>' % css,
|
||||
format="html",
|
||||
),
|
||||
)
|
||||
return output
|
||||
|
||||
|
||||
def talks_to_ics():
|
||||
c = ics.Calendar()
|
||||
c.creator = "pelican"
|
||||
for t in all_talks():
|
||||
e = talk_to_ics(t)
|
||||
if e is not None:
|
||||
c.events.add(e)
|
||||
else:
|
||||
logging.warning("Event '%s' not added to ICS" % t.get('title', ''))
|
||||
return six.text_type(c)
|
||||
|
||||
|
||||
def talk_to_ics(talk):
|
||||
def _decode(s):
|
||||
if UNIDECODE_ENABLED:
|
||||
return unidecode.unidecode(s)
|
||||
else:
|
||||
return s
|
||||
|
||||
if "start" not in talk or "duration" not in talk:
|
||||
return None
|
||||
e = ics.Event(
|
||||
uid="%s@%d.hackmeeting.org"
|
||||
% (talk["id"], get_global_data()["startdate"].year),
|
||||
name=_decode(talk["title"]),
|
||||
begin=talk["start"],
|
||||
duration=datetime.timedelta(minutes=talk["duration"]),
|
||||
transparent=True,
|
||||
)
|
||||
# ics.py has some problems with unicode
|
||||
# unidecode replaces letters with their most similar ASCII counterparts
|
||||
# (ie: accents get stripped)
|
||||
if "text" in talk:
|
||||
e.description = _decode(talk["text"])
|
||||
e.url = pelican.settings["SCHEDULEURL"] + "#talk-" + talk["id"]
|
||||
if "room" in talk:
|
||||
e.location = talk["room"]
|
||||
|
||||
return e
|
||||
|
||||
|
||||
class TalksGenerator(generators.Generator):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.talks = []
|
||||
super(TalksGenerator, self).__init__(*args, **kwargs)
|
||||
|
||||
def generate_context(self):
|
||||
self.talks = {n: get_talk_data(n) for n in get_talk_names()}
|
||||
self._update_context(("talks",))
|
||||
check_overlaps()
|
||||
|
||||
def generate_output(self, writer=None):
|
||||
for talkname in sorted(self.talks):
|
||||
if "resources" in self.talks[talkname]:
|
||||
outdir = os.path.join(
|
||||
self.output_path,
|
||||
pelican.settings["TALKS_PATH"],
|
||||
talkname,
|
||||
pelican.settings["TALKS_ATTACHMENT_PATH"],
|
||||
)
|
||||
if os.path.isdir(outdir):
|
||||
shutil.rmtree(outdir)
|
||||
shutil.copytree(self.talks[talkname]["resources"], outdir)
|
||||
if ICS_ENABLED:
|
||||
logging.info("Generating ics...")
|
||||
with io.open(
|
||||
os.path.join(
|
||||
self.output_path, pelican.settings.get("TALKS_ICS")
|
||||
),
|
||||
"w",
|
||||
encoding="utf8",
|
||||
) as buf:
|
||||
content = talks_to_ics()
|
||||
logging.info("ics is %d characters" % len(content))
|
||||
buf.write(content)
|
||||
else:
|
||||
logging.warning(
|
||||
"module `ics` not found. " "ICS calendar will not be generated"
|
||||
)
|
||||
|
||||
|
||||
def add_talks_option_defaults(pelican):
|
||||
pelican.settings.setdefault("TALKS_PATH", "talks")
|
||||
pelican.settings.setdefault("TALKS_ATTACHMENT_PATH", "res")
|
||||
pelican.settings.setdefault("TALKS_ICS", "schedule.ics")
|
||||
pelican.settings.setdefault("TALKS_GRID_STEP", 30)
|
||||
|
||||
|
||||
def get_generators(gen):
|
||||
return TalksGenerator
|
||||
|
||||
|
||||
def pelican_init(pelicanobj):
|
||||
global pelican
|
||||
pelican = pelicanobj
|
||||
|
||||
|
||||
try:
|
||||
import yaml
|
||||
except ImportError:
|
||||
print("ERROR: yaml not found. Talks plugins will be disabled")
|
||||
|
||||
def register():
|
||||
pass
|
||||
|
||||
else:
|
||||
|
||||
def register():
|
||||
signals.initialized.connect(pelican_init)
|
||||
signals.get_generators.connect(get_generators)
|
||||
signals.initialized.connect(add_talks_option_defaults)
|
||||
directives.register_directive("talklist", TalkListDirective)
|
||||
directives.register_directive("talk", TalkDirective)
|
||||
directives.register_directive("talkgrid", TalkGridDirective)
|
67
plugins/tipue_search/README.md
Normal file
|
@ -0,0 +1,67 @@
|
|||
Tipue Search
|
||||
============
|
||||
|
||||
A Pelican plugin to serialize generated HTML to JSON that can be used by jQuery plugin - Tipue Search.
|
||||
|
||||
Copyright (c) Talha Mansoor
|
||||
|
||||
Author | Talha Mansoor
|
||||
----------------|-----
|
||||
Author Email | talha131@gmail.com
|
||||
Author Homepage | http://onCrashReboot.com
|
||||
Github Account | https://github.com/talha131
|
||||
|
||||
Why do you need it?
|
||||
===================
|
||||
|
||||
Static sites do not offer search feature out of the box. [Tipue Search](http://www.tipue.com/search/)
|
||||
is a jQuery plugin that search the static site without using any third party service, like DuckDuckGo or Google.
|
||||
|
||||
Tipue Search offers 4 search modes. Its [JSON search mode](http://www.tipue.com/search/docs/json/) is the best search mode
|
||||
especially for large sites.
|
||||
|
||||
Tipue's JSON search mode requires the textual content of site in JSON format.
|
||||
|
||||
Requirements
|
||||
============
|
||||
|
||||
Tipue Search requires BeautifulSoup.
|
||||
|
||||
```bash
|
||||
pip install beautifulsoup4
|
||||
```
|
||||
|
||||
How Tipue Search works
|
||||
=========================
|
||||
|
||||
Tipue Search serializes the generated HTML into JSON. Format of JSON is as follows
|
||||
|
||||
```python
|
||||
{
|
||||
"pages": [
|
||||
{
|
||||
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero.",
|
||||
"tags": "Example Category",
|
||||
"url" : "http://oncrashreboot.com/plugin-example.html",
|
||||
"title": "Everything you want to know about Lorem Ipsum"
|
||||
},
|
||||
{
|
||||
"text": "Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh.",
|
||||
"tags": "Example Category",
|
||||
"url" : "http://oncrashreboot.com/plugin-example-2.html",
|
||||
"title": "Review of the book Lorem Ipsum"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
JSON is written to file `tipuesearch_content.json` which is created in the root of `output` directory.
|
||||
|
||||
How to use
|
||||
==========
|
||||
|
||||
To utilize JSON Search mode, your theme needs to have Tipue Search properly configured in it. [Official documentation](http://www.tipue.com/search/docs/#json) has the required details.
|
||||
|
||||
Pelican [Elegant Theme](https://github.com/talha131/pelican-elegant) and [Plumage
|
||||
theme](https://github.com/kdeldycke/plumage) have Tipue Search configured. You can view their
|
||||
code to understand the configuration.
|
1
plugins/tipue_search/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from .tipue_search import *
|
107
plugins/tipue_search/tipue_search.py
Normal file
|
@ -0,0 +1,107 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Tipue Search
|
||||
============
|
||||
|
||||
A Pelican plugin to serialize generated HTML to JSON
|
||||
that can be used by jQuery plugin - Tipue Search.
|
||||
|
||||
Copyright (c) Talha Mansoor
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import os.path
|
||||
import json
|
||||
from bs4 import BeautifulSoup
|
||||
from codecs import open
|
||||
try:
|
||||
from urlparse import urljoin
|
||||
except ImportError:
|
||||
from urllib.parse import urljoin
|
||||
|
||||
from pelican import signals
|
||||
|
||||
|
||||
class Tipue_Search_JSON_Generator(object):
|
||||
|
||||
def __init__(self, context, settings, path, theme, output_path, *null):
|
||||
|
||||
self.output_path = output_path
|
||||
self.context = context
|
||||
self.siteurl = settings.get('SITEURL')
|
||||
self.relative_urls = settings.get('RELATIVE_URLS')
|
||||
self.tpages = settings.get('TEMPLATE_PAGES')
|
||||
self.output_path = output_path
|
||||
self.json_nodes = []
|
||||
|
||||
def create_json_node(self, page):
|
||||
if getattr(page, 'status', 'published') != 'published':
|
||||
return
|
||||
|
||||
soup_title = BeautifulSoup(page.title.replace(' ', ' '), 'html.parser')
|
||||
page_title = soup_title.get_text(' ', strip=True).replace('“', '"').replace('”', '"').replace('’', "'").replace('^', '^')
|
||||
|
||||
soup_text = BeautifulSoup(page.content, 'html.parser')
|
||||
page_text = soup_text.get_text(' ', strip=True).replace('“', '"').replace('”', '"').replace('’', "'").replace('¶', ' ').replace('^', '^')
|
||||
page_text = ' '.join(page_text.split())
|
||||
|
||||
page_category = page.category.name if getattr(page, 'category', 'None') != 'None' else ''
|
||||
|
||||
page_url = '.'
|
||||
if page.url:
|
||||
page_url = page.url if self.relative_urls else (self.siteurl + '/' + page.url)
|
||||
|
||||
node = {'title': page_title,
|
||||
'text': page_text,
|
||||
'tags': page_category,
|
||||
'loc': page_url}
|
||||
|
||||
self.json_nodes.append(node)
|
||||
|
||||
def create_tpage_node(self, srclink):
|
||||
with open(os.path.join(self.output_path, self.tpages[srclink]),
|
||||
encoding='utf-8') as srcfile:
|
||||
soup = BeautifulSoup(srcfile, 'html.parser')
|
||||
page_title = soup.title.string if soup.title is not None else ''
|
||||
page_text = soup.get_text()
|
||||
|
||||
# Should set default category?
|
||||
page_category = ''
|
||||
page_url = urljoin(self.siteurl, self.tpages[srclink])
|
||||
|
||||
node = {'title': page_title,
|
||||
'text': page_text,
|
||||
'tags': page_category,
|
||||
'url': page_url}
|
||||
|
||||
self.json_nodes.append(node)
|
||||
|
||||
def generate_output(self, writer):
|
||||
# bisognerebbe cambiare usando questo coso
|
||||
# for p in self.context['PAGES']:
|
||||
# print 'U', p.url
|
||||
path = os.path.join(self.output_path, 'tipuesearch_content.json')
|
||||
|
||||
pages = self.context['pages'] + self.context['articles']
|
||||
|
||||
for article in self.context['articles']:
|
||||
pages += article.translations
|
||||
|
||||
for srclink in self.tpages:
|
||||
self.create_tpage_node(srclink)
|
||||
|
||||
for page in pages:
|
||||
self.create_json_node(page)
|
||||
root_node = {'pages': self.json_nodes}
|
||||
|
||||
with open(path, 'w', encoding='utf-8') as fd:
|
||||
json.dump(root_node, fd, separators=(',', ':'), ensure_ascii=False)
|
||||
|
||||
|
||||
def get_generators(generators):
|
||||
return Tipue_Search_JSON_Generator
|
||||
|
||||
|
||||
def register():
|
||||
signals.get_generators.connect(get_generators)
|
14
publishconf.py
Normal file
|
@ -0,0 +1,14 @@
|
|||
#!/usr/bin/env python
|
||||
# This file is only used if you use `make publish` or
|
||||
# explicitly specify it as your config file.
|
||||
# -*- coding: utf-8 -*- #
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.append(os.curdir) # isort:skip
|
||||
from pelicanconf import * # isort:skip
|
||||
from pelicanconf import YEAR # isort:skip
|
||||
|
||||
SITEURL = "https://hackmeeting.org/hackit%d/" % (YEAR - 2000)
|
2
pyproject.toml
Normal file
|
@ -0,0 +1,2 @@
|
|||
[tool.black]
|
||||
line-length=79
|
34
requirements.txt
Normal file
|
@ -0,0 +1,34 @@
|
|||
anyio==4.3.0
|
||||
arrow==1.3.0
|
||||
attrs==23.2.0
|
||||
Babel==2.14.0
|
||||
beautifulsoup4==4.12.3
|
||||
blinker==1.7.0
|
||||
docutils==0.20.1
|
||||
feedgenerator==2.1.0
|
||||
ics==0.7.2
|
||||
idna==3.6
|
||||
Jinja2==3.1.3
|
||||
libsass==0.23.0
|
||||
Markdown==3.6
|
||||
markdown-it-py==3.0.0
|
||||
MarkupSafe==2.1.5
|
||||
mdurl==0.1.2
|
||||
ordered-set==4.1.0
|
||||
pelican==4.9.1
|
||||
pelican-jinja2content==1.0.1
|
||||
Pygments==2.17.2
|
||||
python-dateutil==2.9.0.post0
|
||||
pytz==2024.1
|
||||
PyYAML==6.0.1
|
||||
rich==13.7.1
|
||||
six==1.16.0
|
||||
smartypants==2.0.1
|
||||
sniffio==1.3.1
|
||||
soupsieve==2.5
|
||||
TatSu==5.12.0
|
||||
types-python-dateutil==2.9.0.20240316
|
||||
typogrify==2.0.7
|
||||
Unidecode==1.3.8
|
||||
watchfiles==0.21.0
|
||||
webassets==2.0
|
5
talks/README.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
Per aggiungere un talk, copia la directory `_talk_example` in una nuova
|
||||
directory che contenga **solo caratteri alfabetici**, quindi
|
||||
cambia il file ``meta.yaml`` a tuo piacimento.
|
||||
Usa UTF-8 o morirai.
|
||||
**NOTA BENE**: in realta' abbiamo usato il calendario di nextcloud con uno script magico che autopusha
|
40
talks/_templates/grid.html
Normal file
|
@ -0,0 +1,40 @@
|
|||
<table class="talk-grid rooms-{{-rooms|length}}">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
{% for room in rooms %}
|
||||
<th>{{room}}</th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for time in times|sort %}
|
||||
<tr>
|
||||
<td class="talk-grid-time talk-grid-time-minutes-{{(time | parsetime | timeformat(format='short', locale=lang, tzinfo=local_tz))[-2:]}}">
|
||||
<time datetime="{{time}}">
|
||||
{{time | parsetime | timeformat(format='short', locale=lang, tzinfo=local_tz)}}
|
||||
</time>
|
||||
</td>
|
||||
{% for talk in times[time] %}
|
||||
{% if not loop.first and talk.room == '*' %}
|
||||
{# skip: covered by colspan #}
|
||||
{% elif talk == None %}
|
||||
<td></td>
|
||||
{% elif not talk.skip %}
|
||||
<td id="t-cell-{{talk.id}}" class="talk
|
||||
{% if talk.room == '*' -%}allrooms{%endif-%}
|
||||
{% for t in talk.tags %} tag-{{t|replace(' ', '_')}} {%endfor-%}
|
||||
"
|
||||
rowspan="{{talk.duration // timestep}}"
|
||||
{% if talk.room == '*' %}colspan="{{rooms|length}}"{%endif%}>
|
||||
<a href="#talk-{{talk.id}}"
|
||||
title="{{talk.tags|join(",")}}"
|
||||
>{{talk.title}}</a>
|
||||
</td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{# vim: set ft=jinja: #}
|
63
talks/_templates/talk.html
Normal file
|
@ -0,0 +1,63 @@
|
|||
{% macro durata_human(d) %}
|
||||
{%- if d >= 60 -%}{{d//60}}h{%- endif -%}
|
||||
{%- if d % 60 != 0 -%}{{d%60}}m {%- endif -%}
|
||||
{% endmacro %}
|
||||
{% macro durata_html(d) %}
|
||||
PT{%- if d >= 60 -%}{{d//60}}H{%- endif -%}
|
||||
{%- if d % 60 != 0 -%}{{d%60}}M{%- endif -%}
|
||||
{% endmacro %}
|
||||
<div id="talk-{{id}}"
|
||||
class="{% for t in tags -%} tag-{{t|replace(' ', '_')}} {% endfor -%}">
|
||||
<h3 class="talk-title"><a href="#t-cell-{{id}}">{{title.strip()}}</a></h3>
|
||||
<div class="talk-info">
|
||||
<p>
|
||||
{% if start is defined and day is defined %}
|
||||
{# Vedi http://babel.pocoo.org/en/latest/dates.html #}
|
||||
<time datetime="{{start}}">
|
||||
{{start.date()|dateformat(format='EEEE', locale=lang)}}
|
||||
-
|
||||
{{start.time()|timeformat(format='short', locale=lang, tzinfo=local_tz)}}
|
||||
{% if duration %} (<time datetime="{{durata_html(duration)}}">{{durata_human(duration)}}</time>) {% endif %}
|
||||
</time>
|
||||
{% else %}
|
||||
<i>L'orario non è ancora stato fissato</i>
|
||||
{% if duration %} <p>Durata: {{durata_human(duration)}}</p> {% endif %}
|
||||
{% endif %} {# date-time #}
|
||||
{% if room is defined %}
|
||||
<span>Stanza {{ room }}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
|
||||
{% if needs: %}
|
||||
<div class="talk-needs">
|
||||
<strong>Materiale necessario:</strong>
|
||||
{{needs|join(", ")}}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="talk-description">{{text | markdown}}
|
||||
{% if contacts: %}
|
||||
<p class="contacts">A cura di {{contacts|join(', ')}}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if links or resources or mail: %}
|
||||
<div class="talk-resources">
|
||||
<h4>Link utili:</h4>
|
||||
<ul>
|
||||
{% if links is defined: %}
|
||||
{% for link in links %}
|
||||
<li>{{link|urlize}}</li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if resources is defined: %}
|
||||
<li><a href="{{resources}}/">Materiali</a></li>
|
||||
{% endif %}
|
||||
{% if mail is defined and mail: %}
|
||||
<li><a href="{{mail}}">Mail</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{# vim: set ft=jinja: #}
|
8
talks/meta.yaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
startdate: 2025-05-30
|
||||
rooms:
|
||||
names:
|
||||
room1: "a"
|
||||
room2: "b"
|
||||
room3: "c"
|
||||
arena: "xyz"
|
||||
order: [room1, room2, room3, arena, extra]
|
458
themes/hackit0x16/static/css/main.css
Normal file
|
@ -0,0 +1,458 @@
|
|||
/*
|
||||
Name: Smashing HTML5
|
||||
Date: July 2009
|
||||
Description: Sample layout for HTML5 and CSS3 goodness.
|
||||
Version: 1.0
|
||||
License: MIT <http://opensource.org/licenses/MIT>
|
||||
Licensed by: Smashing Media GmbH <http://www.smashingmagazine.com/>
|
||||
Original author: Enrique Ramírez <http://enrique-ramirez.com/>
|
||||
*/
|
||||
|
||||
/* Imports */
|
||||
@import url("reset.css");
|
||||
@import url("pygment.css");
|
||||
@import url("typogrify.css");
|
||||
@import url("fonts.css");
|
||||
/***** Global *****/
|
||||
/* Body */
|
||||
body * {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
body {
|
||||
background: #000; /*#FFF;*/
|
||||
color: #FFF;
|
||||
/*font-size: 87.5%; /* Base font size: 14px ***
|
||||
font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;*/
|
||||
font-size:18px;
|
||||
font-family: 'Typo';
|
||||
line-height: 1.429;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/* Headings */
|
||||
h1 {font-size: 2em }
|
||||
h2 {font-size: 1.571em} /* 22px */
|
||||
h3 {font-size: 1.429em} /* 20px */
|
||||
h4 {font-size: 1.286em} /* 18px */
|
||||
h5 {font-size: 1.143em} /* 16px */
|
||||
h6 {font-size: 1em} /* 14px */
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-weight: 400;
|
||||
line-height: 1.1;
|
||||
margin-bottom: .8em;
|
||||
font-family: 'Typo', arial, serif;
|
||||
color: #e85520;
|
||||
}
|
||||
|
||||
h3, h4, h5, h6 { margin-top: .8em; }
|
||||
|
||||
hr { border: 2px solid #EEEEEE; }
|
||||
|
||||
/* Anchors */
|
||||
a {outline: 0;}
|
||||
a img {border: 0px; text-decoration: none;}
|
||||
a:link, a:visited {
|
||||
color: #FFF;
|
||||
padding: 0 1px;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover, a:active {
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
text-shadow: 1px 1px 1px #333;
|
||||
}
|
||||
|
||||
h1 a:hover {
|
||||
background-color: inherit
|
||||
}
|
||||
|
||||
/* Paragraphs */
|
||||
div.line-block,
|
||||
p { margin-top: 1em;
|
||||
margin-bottom: 1em;}
|
||||
|
||||
strong, b {font-weight: bold;}
|
||||
em, i {font-style: italic;}
|
||||
|
||||
/* Lists */
|
||||
ul {
|
||||
list-style: outside disc;
|
||||
margin: 0em 0 0 1.5em;
|
||||
}
|
||||
|
||||
ol {
|
||||
list-style: outside decimal;
|
||||
margin: 0em 0 0 1.5em;
|
||||
}
|
||||
|
||||
li { margin-top: 0.5em;}
|
||||
|
||||
.post-info {
|
||||
float:right;
|
||||
margin:10px;
|
||||
padding:5px;
|
||||
}
|
||||
|
||||
.post-info p{
|
||||
margin-top: 1px;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.readmore { float: right }
|
||||
|
||||
dl {margin: 0 0 1.5em 0;}
|
||||
dt {font-weight: bold;}
|
||||
dd {margin-left: 1.5em;}
|
||||
|
||||
pre{ padding: 10px; margin: 10px; overflow: auto;}
|
||||
|
||||
/* Quotes */
|
||||
blockquote {
|
||||
margin: 20px;
|
||||
font-style: italic;
|
||||
}
|
||||
cite {}
|
||||
|
||||
q {}
|
||||
|
||||
div.note {
|
||||
float: right;
|
||||
margin: 5px;
|
||||
font-size: 85%;
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
table {margin: .5em auto 1.5em auto; width: 98%;}
|
||||
|
||||
/* Thead */
|
||||
thead th {padding: .5em .4em; text-align: left;}
|
||||
thead td {}
|
||||
|
||||
/* Tbody */
|
||||
tbody td {padding: .5em .4em;}
|
||||
tbody th {}
|
||||
|
||||
tbody .alt td {}
|
||||
tbody .alt th {}
|
||||
|
||||
/* Tfoot */
|
||||
tfoot th {}
|
||||
tfoot td {}
|
||||
|
||||
/* HTML5 tags */
|
||||
header, section,
|
||||
aside, nav, article, figure {
|
||||
display: block;
|
||||
}
|
||||
footer {display:none}
|
||||
|
||||
/***** Layout *****/
|
||||
.body {clear: both; margin: 0 auto; width: 100%;}
|
||||
img.right, figure.right {float: right; margin: 0 0 2em 2em;}
|
||||
img.left, figure.left {float: left; margin: 0 2em 2em 0;}
|
||||
|
||||
/*
|
||||
Header
|
||||
*****************/
|
||||
#banner {
|
||||
margin: 0 auto;
|
||||
padding: 2.5em 0 0 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
/* Banner */
|
||||
#banner h1 {font-size: 3.571em; line-height: 1;}
|
||||
#banner h1 a:link, #banner h1 a:visited {
|
||||
color: #e85520;
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
margin: 0 0 .6em .2em;
|
||||
text-decoration: none;
|
||||
}
|
||||
#banner h1 a:hover, #banner h1 a:active {
|
||||
background: none;
|
||||
color: #FFF;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
#banner h1 strong {font-size: 0.36em; font-weight: normal;}
|
||||
|
||||
/* Main Nav */
|
||||
#banner nav {
|
||||
background: #000;
|
||||
font-size: 1.143em;
|
||||
height: 40px;
|
||||
line-height: 30px;
|
||||
margin: 0 auto 2em auto;
|
||||
padding: 0;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#banner nav ul {list-style: none; margin: 0 auto; width: 100%;display: flex;justify-content: center;flex-wrap:wrap;}
|
||||
#banner nav li {float: left; display: inline; margin: 0;}
|
||||
|
||||
#banner nav a:link, #banner nav a:visited {
|
||||
color: #FFF;
|
||||
display: inline-block;
|
||||
height: 40px;
|
||||
padding: 5px 1.5em;
|
||||
text-decoration: none;
|
||||
border:0;
|
||||
position:relative;
|
||||
text-transform:uppercase;
|
||||
font-family: 'Typo';
|
||||
}
|
||||
#banner nav a:hover, #banner nav a:active,
|
||||
#banner nav .active a:link, #banner nav .active a:visited {
|
||||
background: transparent;
|
||||
color: #FFF;
|
||||
text-shadow: none !important;
|
||||
}
|
||||
#banner nav a:before {
|
||||
transition: width ease-in 0.3s;
|
||||
content: "";
|
||||
background: #e85520;
|
||||
width: 0px;
|
||||
height: 2px;
|
||||
position: absolute;
|
||||
top: 35px;
|
||||
z-index: 1000;
|
||||
left: 50%;
|
||||
margin-left: -25px;
|
||||
}
|
||||
#banner nav a:hover:before, #banner nav .active a:before {
|
||||
width:50px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Featured
|
||||
*****************/
|
||||
#featured {
|
||||
margin-bottom: 2em;
|
||||
overflow: hidden;
|
||||
padding: 20px;
|
||||
width: 760px;
|
||||
|
||||
}
|
||||
|
||||
#featured figure {
|
||||
border: 2px solid #eee;
|
||||
float: right;
|
||||
margin: 0.786em 2em 0 5em;
|
||||
width: 248px;
|
||||
}
|
||||
#featured figure img {display: block; float: right;}
|
||||
|
||||
#featured h2 {color: #C74451; font-size: 1.714em; margin-bottom: 0.333em;}
|
||||
#featured h3 {font-size: 1.429em; margin-bottom: .5em;}
|
||||
|
||||
#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;}
|
||||
#featured h3 a:hover, #featured h3 a:active {color: #fff;}
|
||||
|
||||
/*
|
||||
Body
|
||||
*****************/
|
||||
#content {
|
||||
background: #000;
|
||||
margin-bottom: 2em;
|
||||
overflow: hidden;
|
||||
padding: 20px 20px;
|
||||
max-width: 1200px;
|
||||
font-family:Arial;
|
||||
|
||||
border-radius: 10px;
|
||||
-moz-border-radius: 10px;
|
||||
-webkit-border-radius: 10px;
|
||||
}
|
||||
|
||||
/*
|
||||
Extras
|
||||
*****************/
|
||||
#extras {margin: 0 auto 3em auto; overflow: hidden;}
|
||||
|
||||
#extras ul {list-style: none; margin: 0;}
|
||||
#extras li {border-bottom: 1px solid #fff;}
|
||||
#extras h2 {
|
||||
color: #C74350;
|
||||
font-size: 1.429em;
|
||||
margin-bottom: .25em;
|
||||
padding: 0 3px;
|
||||
}
|
||||
|
||||
#extras a:link, #extras a:visited {
|
||||
color: #444;
|
||||
display: block;
|
||||
border-bottom: 1px solid #F4E3E3;
|
||||
text-decoration: none;
|
||||
padding: .3em .25em;
|
||||
}
|
||||
|
||||
#extras a:hover, #extras a:active {color: #fff;}
|
||||
|
||||
/* Blogroll */
|
||||
#extras .blogroll {
|
||||
float: left;
|
||||
width: 615px;
|
||||
}
|
||||
|
||||
#extras .blogroll li {float: left; margin: 0 20px 0 0; width: 185px;}
|
||||
|
||||
/* Social */
|
||||
#extras .social {
|
||||
float: right;
|
||||
width: 175px;
|
||||
}
|
||||
|
||||
#extras div[class='social'] a {
|
||||
background-repeat: no-repeat;
|
||||
background-position: 3px 6px;
|
||||
padding-left: 25px;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
About
|
||||
*****************/
|
||||
#about {
|
||||
background: #fff;
|
||||
font-style: normal;
|
||||
margin-bottom: 2em;
|
||||
overflow: hidden;
|
||||
padding: 20px;
|
||||
text-align: left;
|
||||
width: 760px;
|
||||
|
||||
border-radius: 10px;
|
||||
-moz-border-radius: 10px;
|
||||
-webkit-border-radius: 10px;
|
||||
}
|
||||
|
||||
#about .primary {float: left; width: 165px;}
|
||||
#about .primary strong {color: #C64350; display: block; font-size: 1.286em;}
|
||||
#about .photo {float: left; margin: 5px 20px;}
|
||||
|
||||
#about .url:link, #about .url:visited {text-decoration: none;}
|
||||
|
||||
#about .bio {float: right; width: 500px;}
|
||||
|
||||
/*
|
||||
Footer
|
||||
*****************/
|
||||
#contentinfo {padding-bottom: 2em; text-align: right;}
|
||||
|
||||
/***** Sections *****/
|
||||
/* Blog */
|
||||
.hentry {
|
||||
display: block;
|
||||
clear: both;
|
||||
border-bottom: 1px solid #eee;
|
||||
padding: 1.5em 0;
|
||||
}
|
||||
li:last-child .hentry, #content > .hentry {border: 0; margin: 0;}
|
||||
#content > .hentry {padding: 1em 0;}
|
||||
.hentry img{display : none ;}
|
||||
.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;}
|
||||
.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #ccc;}
|
||||
.entry-title a:visited {background-color: #fff;}
|
||||
.news article .entry-content { font-family: Arial; }
|
||||
|
||||
.hentry .post-info * {font-style: normal;}
|
||||
|
||||
/* Content */
|
||||
.hentry footer {margin-bottom: 2em;}
|
||||
.hentry footer address {display: inline;}
|
||||
#posts-list footer address {display: block;}
|
||||
|
||||
/* Blog Index */
|
||||
#posts-list {list-style: none; margin: 0;}
|
||||
#posts-list .hentry {padding-left: 10px; position: relative;}
|
||||
|
||||
#posts-list footer {
|
||||
left: 10px;
|
||||
position: relative;
|
||||
float: left;
|
||||
top: 0.5em;
|
||||
width: 190px;
|
||||
}
|
||||
|
||||
/* About the Author */
|
||||
#about-author {
|
||||
background: #f9f9f9;
|
||||
clear: both;
|
||||
font-style: normal;
|
||||
margin: 2em 0;
|
||||
padding: 10px 20px 15px 20px;
|
||||
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
}
|
||||
|
||||
#about-author strong {
|
||||
color: #C64350;
|
||||
clear: both;
|
||||
display: block;
|
||||
font-size: 1.429em;
|
||||
}
|
||||
|
||||
#about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;}
|
||||
|
||||
/* Comments */
|
||||
#comments-list {list-style: none; margin: 0 1em;}
|
||||
#comments-list blockquote {
|
||||
background: #f8f8f8;
|
||||
clear: both;
|
||||
font-style: normal;
|
||||
margin: 0;
|
||||
padding: 15px 20px;
|
||||
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
}
|
||||
#comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;}
|
||||
|
||||
#comments-list li:nth-child(2n) blockquote {background: #F5f5f5;}
|
||||
|
||||
/* Add a Comment */
|
||||
#add-comment label {clear: left; float: left; text-align: left; width: 150px;}
|
||||
#add-comment input[type='text'],
|
||||
#add-comment input[type='email'],
|
||||
#add-comment input[type='url'] {float: left; width: 200px;}
|
||||
|
||||
#add-comment textarea {float: left; height: 150px; width: 495px;}
|
||||
|
||||
#add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;}
|
||||
|
||||
#add-comment input[type='submit'] {float: right; margin: 0 .5em;}
|
||||
#add-comment * {margin-bottom: .5em;}
|
||||
|
||||
@media screen and (max-width:767px) {
|
||||
h4 {font-size:1.1em;}
|
||||
#banner h1 a:link, #banner h1 a:visited {
|
||||
font-size:30px;
|
||||
text-align:center;
|
||||
}
|
||||
#banner nav {
|
||||
height:auto;
|
||||
}
|
||||
.entry-title {
|
||||
font-size:1.8em;
|
||||
}
|
||||
}
|
205
themes/hackit0x16/static/css/pygment.css
Normal file
|
@ -0,0 +1,205 @@
|
|||
.hll {
|
||||
background-color:#eee;
|
||||
}
|
||||
.c {
|
||||
color:#408090;
|
||||
font-style:italic;
|
||||
}
|
||||
.err {
|
||||
border:1px solid #FF0000;
|
||||
}
|
||||
.k {
|
||||
color:#007020;
|
||||
font-weight:bold;
|
||||
}
|
||||
.o {
|
||||
color:#666666;
|
||||
}
|
||||
.cm {
|
||||
color:#408090;
|
||||
font-style:italic;
|
||||
}
|
||||
.cp {
|
||||
color:#007020;
|
||||
}
|
||||
.c1 {
|
||||
color:#408090;
|
||||
font-style:italic;
|
||||
}
|
||||
.cs {
|
||||
background-color:#FFF0F0;
|
||||
color:#408090;
|
||||
}
|
||||
.gd {
|
||||
color:#A00000;
|
||||
}
|
||||
.ge {
|
||||
font-style:italic;
|
||||
}
|
||||
.gr {
|
||||
color:#FF0000;
|
||||
}
|
||||
.gh {
|
||||
color:#000080;
|
||||
font-weight:bold;
|
||||
}
|
||||
.gi {
|
||||
color:#00A000;
|
||||
}
|
||||
.go {
|
||||
color:#303030;
|
||||
}
|
||||
.gp {
|
||||
color:#C65D09;
|
||||
font-weight:bold;
|
||||
}
|
||||
.gs {
|
||||
font-weight:bold;
|
||||
}
|
||||
.gu {
|
||||
color:#800080;
|
||||
font-weight:bold;
|
||||
}
|
||||
.gt {
|
||||
color:#0040D0;
|
||||
}
|
||||
.kc {
|
||||
color:#007020;
|
||||
font-weight:bold;
|
||||
}
|
||||
.kd {
|
||||
color:#007020;
|
||||
font-weight:bold;
|
||||
}
|
||||
.kn {
|
||||
color:#007020;
|
||||
font-weight:bold;
|
||||
}
|
||||
.kp {
|
||||
color:#007020;
|
||||
}
|
||||
.kr {
|
||||
color:#007020;
|
||||
font-weight:bold;
|
||||
}
|
||||
.kt {
|
||||
color:#902000;
|
||||
}
|
||||
.m {
|
||||
color:#208050;
|
||||
}
|
||||
.s {
|
||||
color:#4070A0;
|
||||
}
|
||||
.na {
|
||||
color:#4070A0;
|
||||
}
|
||||
.nb {
|
||||
color:#007020;
|
||||
}
|
||||
.nc {
|
||||
color:#0E84B5;
|
||||
font-weight:bold;
|
||||
}
|
||||
.no {
|
||||
color:#60ADD5;
|
||||
}
|
||||
.nd {
|
||||
color:#555555;
|
||||
font-weight:bold;
|
||||
}
|
||||
.ni {
|
||||
color:#D55537;
|
||||
font-weight:bold;
|
||||
}
|
||||
.ne {
|
||||
color:#007020;
|
||||
}
|
||||
.nf {
|
||||
color:#06287E;
|
||||
}
|
||||
.nl {
|
||||
color:#002070;
|
||||
font-weight:bold;
|
||||
}
|
||||
.nn {
|
||||
color:#0E84B5;
|
||||
font-weight:bold;
|
||||
}
|
||||
.nt {
|
||||
color:#062873;
|
||||
font-weight:bold;
|
||||
}
|
||||
.nv {
|
||||
color:#BB60D5;
|
||||
}
|
||||
.ow {
|
||||
color:#007020;
|
||||
font-weight:bold;
|
||||
}
|
||||
.w {
|
||||
color:#BBBBBB;
|
||||
}
|
||||
.mf {
|
||||
color:#208050;
|
||||
}
|
||||
.mh {
|
||||
color:#208050;
|
||||
}
|
||||
.mi {
|
||||
color:#208050;
|
||||
}
|
||||
.mo {
|
||||
color:#208050;
|
||||
}
|
||||
.sb {
|
||||
color:#4070A0;
|
||||
}
|
||||
.sc {
|
||||
color:#4070A0;
|
||||
}
|
||||
.sd {
|
||||
color:#4070A0;
|
||||
font-style:italic;
|
||||
}
|
||||
.s2 {
|
||||
color:#4070A0;
|
||||
}
|
||||
.se {
|
||||
color:#4070A0;
|
||||
font-weight:bold;
|
||||
}
|
||||
.sh {
|
||||
color:#4070A0;
|
||||
}
|
||||
.si {
|
||||
color:#70A0D0;
|
||||
font-style:italic;
|
||||
}
|
||||
.sx {
|
||||
color:#C65D09;
|
||||
}
|
||||
.sr {
|
||||
color:#235388;
|
||||
}
|
||||
.s1 {
|
||||
color:#4070A0;
|
||||
}
|
||||
.ss {
|
||||
color:#517918;
|
||||
}
|
||||
.bp {
|
||||
color:#007020;
|
||||
}
|
||||
.vc {
|
||||
color:#BB60D5;
|
||||
}
|
||||
.vg {
|
||||
color:#BB60D5;
|
||||
}
|
||||
.vi {
|
||||
color:#BB60D5;
|
||||
}
|
||||
.il {
|
||||
color:#208050;
|
||||
}
|
52
themes/hackit0x16/static/css/reset.css
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
Name: Reset Stylesheet
|
||||
Description: Resets browser's default CSS
|
||||
Author: Eric Meyer
|
||||
Author URI: http://meyerweb.com/eric/tools/css/reset/
|
||||
*/
|
||||
|
||||
/* v1.0 | 20080212 */
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
margin: 0;
|
||||
outline: 0;
|
||||
padding: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
body {line-height: 1;}
|
||||
|
||||
ol, ul {list-style: none;}
|
||||
|
||||
blockquote, q {quotes: none;}
|
||||
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none;
|
||||
}
|
||||
|
||||
/* remember to define focus styles! */
|
||||
:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/* remember to highlight inserts somehow! */
|
||||
ins {text-decoration: none;}
|
||||
del {text-decoration: line-through;}
|
||||
|
||||
/* tables still need 'cellspacing="0"' in the markup */
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
3
themes/hackit0x16/static/css/typogrify.css
Normal file
|
@ -0,0 +1,3 @@
|
|||
.caps {font-size:.92em;}
|
||||
.amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;}
|
||||
.dquo {margin-left:-.38em;}
|
48
themes/hackit0x16/static/css/wide.css
Normal file
|
@ -0,0 +1,48 @@
|
|||
@import url("main.css");
|
||||
|
||||
body {
|
||||
font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif;
|
||||
}
|
||||
|
||||
.post-info{
|
||||
display: none;
|
||||
}
|
||||
|
||||
#banner nav {
|
||||
display: none;
|
||||
-moz-border-radius: 0px;
|
||||
margin-bottom: 20px;
|
||||
overflow: hidden;
|
||||
font-size: 1em;
|
||||
background: #F5F4EF;
|
||||
}
|
||||
|
||||
#banner nav ul{
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
#banner nav li{
|
||||
float: right;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
#banner nav li a {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
#banner h1 {
|
||||
margin-bottom: -18px;
|
||||
}
|
||||
|
||||
#featured, #extras {
|
||||
padding: 50px;
|
||||
}
|
||||
|
||||
#featured {
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
#extras {
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
}
|
BIN
themes/hackit0x16/static/cyberright_black.gif
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
themes/hackit0x16/static/fonts/monotype.ttf
Normal file
19
themes/hackit0x16/templates/analytics.html
Normal file
|
@ -0,0 +1,19 @@
|
|||
{% if PIWIK_URL and PIWIK_SITE_ID %}
|
||||
<script type="text/javascript">
|
||||
{% if PIWIK_SSL_URL %}
|
||||
var pkBaseURL = "{{ PIWIK_SSL_URL }}";
|
||||
{% else %}
|
||||
var pkBaseURL = "{{ PIWIK_URL }}";
|
||||
{% endif %}
|
||||
var _paq = _paq || [];
|
||||
_paq.push(["trackPageView"]);
|
||||
_paq.push(["enableLinkTracking"]);
|
||||
(function() {
|
||||
var u=(("https:" == document.location.protocol) ? "https" : "http")+"://"+pkBaseURL+"/";
|
||||
_paq.push(["setTrackerUrl", u+"piwik.php"]);
|
||||
_paq.push(["setSiteId", "{{ PIWIK_SITE_ID }}"]);
|
||||
var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript";
|
||||
g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
13
themes/hackit0x16/templates/archives.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<section id="content" class="body">
|
||||
<h1>Archives for {{ SITENAME }}</h1>
|
||||
|
||||
<dl>
|
||||
{% for article in dates %}
|
||||
<dt>{{ article.locale_date }}</dt>
|
||||
<dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
|
||||
{% endfor %}
|
||||
</dl>
|
||||
</section>
|
||||
{% endblock %}
|
45
themes/hackit0x16/templates/article.html
Normal file
|
@ -0,0 +1,45 @@
|
|||
{% extends "base.html" %}
|
||||
{% block html_lang %}{{ article.lang }}{% endblock %}
|
||||
{% block title %}{{ article.title|striptags }}{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
{% import 'translations.html' as translations with context %}
|
||||
{% if translations.entry_hreflang(article) %}
|
||||
{{ translations.entry_hreflang(article) }}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section id="content" class="body">
|
||||
<article>
|
||||
<header>
|
||||
<h1 class="entry-title">
|
||||
<a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
|
||||
title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h1>
|
||||
</header>
|
||||
|
||||
<div class="entry-content">
|
||||
{% include 'article_infos.html' %}
|
||||
{{ article.content }}
|
||||
</div><!-- /.entry-content -->
|
||||
{% if DISQUS_SITENAME and SITEURL and article.status != "draft" %}
|
||||
<div class="comments">
|
||||
<h2>Comments !</h2>
|
||||
<div id="disqus_thread"></div>
|
||||
<script type="text/javascript">
|
||||
var disqus_shortname = '{{ DISQUS_SITENAME }}';
|
||||
var disqus_identifier = '{{ article.url }}';
|
||||
var disqus_url = '{{ SITEURL }}/{{ article.url }}';
|
||||
(function() {
|
||||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||
dsq.src = '//{{ DISQUS_SITENAME }}.disqus.com/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||
})();
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the comments.</noscript>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</article>
|
||||
</section>
|
||||
{% endblock %}
|
23
themes/hackit0x16/templates/article_infos.html
Normal file
|
@ -0,0 +1,23 @@
|
|||
<footer class="post-info">
|
||||
<abbr class="published" title="{{ article.date.isoformat() }}">
|
||||
Published: {{ article.locale_date }}
|
||||
</abbr>
|
||||
{% if article.modified %}
|
||||
<br />
|
||||
<abbr class="modified" title="{{ article.modified.isoformat() }}">
|
||||
Updated: {{ article.locale_modified }}
|
||||
</abbr>
|
||||
{% endif %}
|
||||
|
||||
{% if article.authors %}
|
||||
<address class="vcard author">
|
||||
By {% for author in article.authors %}
|
||||
<a class="url fn" href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a>
|
||||
{% endfor %}
|
||||
</address>
|
||||
{% endif %}
|
||||
<p>In <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>.</p>
|
||||
{% include 'taglist.html' %}
|
||||
{% import 'translations.html' as translations with context %}
|
||||
{{ translations.translations_for(article) }}
|
||||
</footer><!-- /.post-info -->
|
2
themes/hackit0x16/templates/author.html
Normal file
|
@ -0,0 +1,2 @@
|
|||
{% extends "index.html" %}
|
||||
{% block title %}{{ SITENAME }} - {{ author }}{% endblock %}
|
16
themes/hackit0x16/templates/authors.html
Normal file
|
@ -0,0 +1,16 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} - Authors{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<section id="content" class="body">
|
||||
<h1>Authors on {{ SITENAME }}</h1>
|
||||
<ul>
|
||||
{% for author, articles in authors|sort %}
|
||||
<li><a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> ({{ articles|count }})</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
{% endblock %}
|
73
themes/hackit0x16/templates/base.html
Normal file
|
@ -0,0 +1,73 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>{% block title %}{{ SITENAME }}{%endblock%}</title>
|
||||
<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/{{ CSS_FILE }}" />
|
||||
{% if FAVICON %}
|
||||
<link href="{{ SITEURL }}/{{ FAVICON }}" rel="icon">
|
||||
{% endif %}
|
||||
{% if FEED_ALL_ATOM %}
|
||||
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Atom Feed" />
|
||||
{% endif %}
|
||||
{% if FEED_ALL_RSS %}
|
||||
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
|
||||
{% endif %}
|
||||
{% block extra_head %}{% endblock extra_head %}
|
||||
</head>
|
||||
|
||||
<body id="index" class="home">
|
||||
<header id="banner" class="body">
|
||||
<h1><a href="{{ SITEURL }}/">{{ SITENAME }} {% if SITESUBTITLE %}<strong>{{ SITESUBTITLE }}</strong>{% endif %}</a></h1>
|
||||
<nav><ul>
|
||||
{% for title, link in MENUITEMS %}
|
||||
<li><a href="{{ link }}">{{ title }}</a></li>
|
||||
{% endfor %}
|
||||
{% if DISPLAY_PAGES_ON_MENU -%}
|
||||
{% for pg in pages %}
|
||||
<li{% if pg == page %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ pg.url }}">{{ pg.title }}</a></li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if DISPLAY_CATEGORIES_ON_MENU -%}
|
||||
{% for cat, null in categories %}
|
||||
<li{% if cat == category %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ cat.url }}">{{ cat }}</a></li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</ul></nav>
|
||||
</header><!-- /#banner -->
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
<section id="extras" class="body">
|
||||
{% if LINKS %}
|
||||
<div class="blogroll">
|
||||
<h2>{{ LINKS_WIDGET_NAME | default('links') }}</h2>
|
||||
<ul>
|
||||
{% for name, link in LINKS %}
|
||||
<li><a href="{{ link }}">{{ name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div><!-- /.blogroll -->
|
||||
{% endif %}
|
||||
{% if FEED_ALL_ATOM or FEED_ALL_RSS %}
|
||||
<div class="social">
|
||||
{% if FEED_ALL_ATOM %}
|
||||
<div>
|
||||
<a href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}
|
||||
{% else %}{{
|
||||
FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate">atom
|
||||
feed</a></div>
|
||||
{% endif %}
|
||||
{% if FEED_ALL_RSS %}
|
||||
<div><a href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}
|
||||
{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate">rss feed</a></div>
|
||||
{% endif %}
|
||||
|
||||
</div><!-- /.social -->
|
||||
{% endif %}
|
||||
</section><!-- /#extras -->
|
||||
|
||||
<footer id="contentinfo" class="body">
|
||||
</footer><!-- /#contentinfo -->
|
||||
|
||||
</body>
|
||||
</html>
|
2
themes/hackit0x16/templates/category.html
Normal file
|
@ -0,0 +1,2 @@
|
|||
{% extends "index.html" %}
|
||||
{% block title %}{{ SITENAME }} - {{ category }}{% endblock %}
|
0
themes/hackit0x16/templates/comments.html
Normal file
0
themes/hackit0x16/templates/disqus_script.html
Normal file
0
themes/hackit0x16/templates/github.html
Normal file
37
themes/hackit0x16/templates/index.html
Normal file
|
@ -0,0 +1,37 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content_title %}{% endblock %}
|
||||
{% block content %}
|
||||
<div class="news">
|
||||
{% if articles %}
|
||||
{% for article in articles_page.object_list %}
|
||||
|
||||
{% if loop.first %}
|
||||
<section id="content" class="body">
|
||||
<ol id="posts-list" class="hfeed" start="{{ articles_paginator.per_page -1 }}">
|
||||
{% endif %}
|
||||
<li><article class="hentry">
|
||||
<header>
|
||||
<h1><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
|
||||
title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h1>
|
||||
</header>
|
||||
|
||||
<div class="entry-content">
|
||||
{% include 'article_infos.html' %}
|
||||
{{ article.summary }}
|
||||
<a class="readmore" href="{{ SITEURL }}/{{ article.url }}">read more</a>
|
||||
{% include 'comments.html' %}
|
||||
</div><!-- /.entry-content -->
|
||||
</article></li>
|
||||
{% if loop.last %}
|
||||
{% if loop.length > 1 or articles_page.has_other_pages() %}
|
||||
</ol><!-- /#posts-list -->
|
||||
{% if articles_page.has_other_pages() %}
|
||||
{% include 'pagination.html' %}
|
||||
{% endif %}
|
||||
</section><!-- /#content -->
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock content %}
|
19
themes/hackit0x16/templates/page.html
Normal file
|
@ -0,0 +1,19 @@
|
|||
{% extends "base.html" %}
|
||||
{% block html_lang %}{{ page.lang }}{% endblock %}
|
||||
{% block title %}{{ page.title }}{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
{% import 'translations.html' as translations with context %}
|
||||
{% if translations.entry_hreflang(page) %}
|
||||
{{ translations.entry_hreflang(page) }}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section id="content" class="body">
|
||||
<h1 class="entry-title">{{ page.title }}</h1>
|
||||
{% import 'translations.html' as translations with context %}
|
||||
{{ translations.translations_for(page) }}
|
||||
{{ page.content }}
|
||||
</section>
|
||||
{% endblock %}
|
13
themes/hackit0x16/templates/period_archives.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<section id="content" class="body">
|
||||
<h1>Archives for {{ period | reverse | join(' ') }}</h1>
|
||||
|
||||
<dl>
|
||||
{% for article in dates %}
|
||||
<dt>{{ article.locale_date }}</dt>
|
||||
<dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
|
||||
{% endfor %}
|
||||
</dl>
|
||||
</section>
|
||||
{% endblock %}
|
2
themes/hackit0x16/templates/tag.html
Normal file
|
@ -0,0 +1,2 @@
|
|||
{% extends "index.html" %}
|
||||
{% block title %}{{ SITENAME }} - {{ tag }}{% endblock %}
|
1
themes/hackit0x16/templates/taglist.html
Normal file
|
@ -0,0 +1 @@
|
|||
{% if article.tags %}<p>tags: {% for tag in article.tags %}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag | escape }}</a> {% endfor %}</p>{% endif %}
|
16
themes/hackit0x16/templates/tags.html
Normal file
|
@ -0,0 +1,16 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ SITENAME }} - Tags{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<section id="content" class="body">
|
||||
<h1>Tags for {{ SITENAME }}</h1>
|
||||
<ul>
|
||||
{% for tag, articles in tags|sort %}
|
||||
<li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> ({{ articles|count }})</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
{% endblock %}
|
18
themes/hackit0x16/templates/translations.html
Normal file
|
@ -0,0 +1,18 @@
|
|||
{% macro translations_for(article) %}
|
||||
{% if article.translations %}
|
||||
<div class="translations-available">
|
||||
Translations:
|
||||
{% for translation in article.translations %}
|
||||
<a href="{{ SITEURL }}/{{ translation.url }}" hreflang="{{ translation.lang }}">{{ translation.lang }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro entry_hreflang(entry) %}
|
||||
{% if entry.translations %}
|
||||
{% for translation in entry.translations %}
|
||||
<link rel="alternate" hreflang="{{ translation.lang }}" href="{{ SITEURL }}/{{ translation.url }}">
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
0
themes/hackit0x16/templates/twitter.html
Normal file
78
themes/to0x19/static/effects.scss
Normal file
|
@ -0,0 +1,78 @@
|
|||
/* pulse {{{ */
|
||||
.pulse {
|
||||
border-radius: 50%;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 0 0 rgba(255,255,255, 0);
|
||||
}
|
||||
.pulse:hover {
|
||||
animation: none;
|
||||
}
|
||||
|
||||
@-webkit-keyframes pulse {
|
||||
0% {
|
||||
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
17% {
|
||||
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
20% {
|
||||
-webkit-box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
|
||||
}
|
||||
23% {
|
||||
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
26% {
|
||||
-webkit-box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
|
||||
}
|
||||
29% {
|
||||
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
100% {
|
||||
-webkit-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
}
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
17% {
|
||||
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
20% {
|
||||
-moz-box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
|
||||
box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
|
||||
}
|
||||
23% {
|
||||
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
26% {
|
||||
-moz-box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
|
||||
box-shadow: 0 0 0 2vw rgba(130,130,130,0.4);
|
||||
}
|
||||
29% {
|
||||
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
100% {
|
||||
-moz-box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
box-shadow: 0 0 0 0 rgba(130,130,130,0.4);
|
||||
}
|
||||
}
|
||||
/* pulse }}} */
|
||||
|
||||
/* rotate {{{ */
|
||||
.rotate {
|
||||
animation: rotation 1s infinite ease-out;
|
||||
}
|
||||
@keyframes rotation {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(1440deg);
|
||||
}
|
||||
}
|
||||
/* rotate }}} */
|
BIN
themes/to0x19/static/fonts/Metropolis-Black.eot
Normal file
BIN
themes/to0x19/static/fonts/Metropolis-Black.ttf
Normal file
BIN
themes/to0x19/static/fonts/Metropolis-Black.woff
Normal file
BIN
themes/to0x19/static/fonts/Metropolis-Black.woff2
Normal file
BIN
themes/to0x19/static/fonts/Metropolis-Bold.eot
Normal file
BIN
themes/to0x19/static/fonts/Metropolis-Bold.ttf
Normal file
BIN
themes/to0x19/static/fonts/Metropolis-Bold.woff
Normal file
BIN
themes/to0x19/static/fonts/Metropolis-Bold.woff2
Normal file
BIN
themes/to0x19/static/fonts/Metropolis-Regular.eot
Normal file
698
themes/to0x19/static/fonts/Metropolis-Regular.svg
Normal file
|
@ -0,0 +1,698 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
||||
<metadata>
|
||||
Created by FontForge 20200427 at Fri Oct 27 00:40:41 2017
|
||||
By www
|
||||
Copyright (c) 2016 by Chris Simpson.
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="Metropolis-Regular" horiz-adv-x="1212" >
|
||||
<font-face
|
||||
font-family="Metropolis"
|
||||
font-weight="400"
|
||||
font-stretch="normal"
|
||||
units-per-em="2048"
|
||||
panose-1="0 0 5 0 0 0 0 0 0 0"
|
||||
ascent="1628"
|
||||
descent="-420"
|
||||
x-height="1059"
|
||||
cap-height="1407"
|
||||
bbox="-117 -393 2138 1976"
|
||||
underline-thickness="40"
|
||||
underline-position="-472"
|
||||
unicode-range="U+0020-25FC"
|
||||
/>
|
||||
<missing-glyph horiz-adv-x="748"
|
||||
d="M68 0v1365h544v-1365h-544zM136 68h408v1229h-408v-1229z" />
|
||||
<glyph glyph-name=".notdef" horiz-adv-x="748"
|
||||
d="M68 0v1365h544v-1365h-544zM136 68h408v1229h-408v-1229z" />
|
||||
<glyph glyph-name="glyph1" horiz-adv-x="0"
|
||||
/>
|
||||
<glyph glyph-name="glyph2" horiz-adv-x="682"
|
||||
/>
|
||||
<glyph glyph-name="space" unicode=" " horiz-adv-x="593"
|
||||
/>
|
||||
<glyph glyph-name="exclam" unicode="!" horiz-adv-x="559"
|
||||
d="M170 88q0 43 33 76t80 33q44 0 76 -33t32 -76q0 -46 -32 -79.5t-76 -33.5q-47 0 -80 33.5t-33 79.5zM190 1407h189l-41 -1012h-109z" />
|
||||
<glyph glyph-name="quotedbl" unicode=""" horiz-adv-x="847"
|
||||
d="M145 1288q0 38 28.5 66t66.5 28t66 -28t28 -66q0 -46 -7.5 -113.5t-23 -171t-18.5 -124.5h-90q-4 26 -19 126t-23 168.5t-8 114.5zM514 1288q0 38 28 66t66 28t66 -28t28 -66q0 -46 -7.5 -113.5t-23 -171t-18.5 -124.5h-90q-3 21 -18.5 124.5t-23 171t-7.5 113.5z" />
|
||||
<glyph glyph-name="numbersign" unicode="#" horiz-adv-x="1380"
|
||||
d="M80 367l31 125h231l107 421h-234l31 125h235l92 369h136l-93 -369h308l92 369h135l-92 -369h239l-30 -125h-242l-106 -421h241l-31 -125h-241l-92 -367h-135l92 367h-308l-92 -367h-135l92 367h-231zM477 492h307l107 421h-307z" />
|
||||
<glyph glyph-name="dollar" unicode="$" horiz-adv-x="1255"
|
||||
d="M94 201l101 125q157 -157 346 -193v518q-98 25 -167 55t-123.5 74t-81 106.5t-26.5 145.5q0 153 112 264.5t286 133.5v124h159v-124q223 -27 408 -197l-98 -125q-148 141 -310 170v-492q83 -20 146.5 -42.5t122 -56t95.5 -75t59 -99.5t22 -130q0 -165 -116 -277.5
|
||||
t-329 -125.5v-132h-159v136q-260 33 -447 217zM305 1044q0 -81 58 -130t178 -85v453q-104 -19 -170 -86t-66 -152zM700 125q134 10 208.5 80t74.5 164q0 92 -68.5 146t-214.5 95v-485z" />
|
||||
<glyph glyph-name="percent" unicode="%" horiz-adv-x="1630"
|
||||
d="M96 1063q0 153 93 254.5t235 101.5q144 0 235 -101.5t91 -250.5q0 -151 -92.5 -251.5t-235.5 -100.5t-234.5 101t-91.5 247zM225 1065q0 -101 57 -170.5t142 -69.5q86 0 141.5 68.5t55.5 171.5q0 105 -56.5 174.5t-142.5 69.5t-141.5 -69t-55.5 -175zM268 0l963 1407h135
|
||||
l-963 -1407h-135zM879 332q0 148 91.5 250t235.5 102q143 0 234.5 -102t91.5 -248q0 -151 -93 -252.5t-235 -101.5q-141 0 -233 100.5t-92 251.5zM1008 334q0 -105 55.5 -174.5t142.5 -69.5t142 68.5t55 173.5q0 103 -56.5 172t-142.5 69t-141 -69t-55 -170z" />
|
||||
<glyph glyph-name="ampersand" unicode="&" horiz-adv-x="1372"
|
||||
d="M84 373q0 269 322 411q-119 165 -119 310q0 140 101 234.5t257 94.5q140 0 236 -96t96 -229q0 -68 -24.5 -122t-73.5 -96t-106 -73t-140 -64q122 -144 321 -352q98 148 160 316l133 -60q-101 -224 -194 -356l233 -238l-145 -67l-185 186q-190 -197 -430 -197
|
||||
q-192 0 -317 108.5t-125 289.5zM238 377q0 -121 84.5 -192.5t209.5 -71.5q177 0 326 159q-240 249 -373 410q-247 -115 -247 -305zM440 1094q0 -112 111 -252q148 58 210 112.5t62 139.5q0 82 -50.5 137t-127.5 55q-90 0 -147.5 -51.5t-57.5 -140.5z" />
|
||||
<glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="479"
|
||||
d="M145 1288q0 38 28.5 66t66.5 28t66 -28t28 -66q0 -46 -7.5 -113.5t-23 -171t-18.5 -124.5h-90q-4 26 -19 126t-23 168.5t-8 114.5z" />
|
||||
<glyph glyph-name="parenleft" unicode="(" horiz-adv-x="731"
|
||||
d="M127 543q0 263 110.5 490.5t317.5 400.5l82 -86q-174 -179 -260 -370.5t-86 -434.5q0 -242 86 -434t260 -369l-82 -88q-207 173 -317.5 401t-110.5 490z" />
|
||||
<glyph glyph-name="parenright" unicode=")" horiz-adv-x="731"
|
||||
d="M94 -260q174 177 260 369t86 434q0 243 -86 434.5t-260 370.5l82 86q207 -173 317.5 -400.5t110.5 -490.5q0 -262 -110.5 -490t-317.5 -401z" />
|
||||
<glyph glyph-name="asterisk" unicode="*" horiz-adv-x="837"
|
||||
d="M123.5 976q4.5 19 19.5 28q43 25 131.5 58.5t106.5 41.5q-18 8 -106.5 41.5t-131.5 58.5q-15 9 -19.5 28t5.5 38q10 18 30.5 24.5t35.5 -2.5q43 -25 114 -83t90 -72q-2 14 -17 109.5t-15 146.5q0 19 14.5 32t36.5 13t36.5 -13t14.5 -32q0 -51 -15.5 -145t-17.5 -111
|
||||
q18 13 90 71.5t115 83.5q15 9 35.5 2.5t30.5 -24.5q10 -19 5 -38t-20 -28q-43 -25 -131.5 -59t-105.5 -41q17 -7 105.5 -41t131.5 -59q15 -9 20 -28t-5 -38t-30.5 -25.5t-35.5 2.5q-43 25 -114 83.5t-91 72.5q2 -17 17.5 -111t15.5 -145q0 -19 -14.5 -32t-36.5 -13t-36.5 13
|
||||
t-14.5 32q0 51 15 146.5t17 109.5q-20 -15 -90.5 -73t-113.5 -83q-15 -9 -35.5 -2.5t-30.5 25.5t-5.5 38z" />
|
||||
<glyph glyph-name="plus" unicode="+" horiz-adv-x="1214"
|
||||
d="M137 608v152h393v395h154v-395h393v-152h-393v-393h-154v393h-393z" />
|
||||
<glyph glyph-name="comma" unicode="," horiz-adv-x="540"
|
||||
d="M158 88q0 44 32 76.5t80 32.5q57 0 91 -46t34 -118q0 -62 -33 -126.5t-124 -178.5l-76 57q81 93 106 190q-45 0 -77.5 33.5t-32.5 79.5z" />
|
||||
<glyph glyph-name="hyphen" unicode="-" horiz-adv-x="759"
|
||||
d="M115 481v150h530v-150h-530z" />
|
||||
<glyph glyph-name="period" unicode="." horiz-adv-x="518"
|
||||
d="M150 88q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z" />
|
||||
<glyph glyph-name="slash" unicode="/" horiz-adv-x="849"
|
||||
d="M-33 -152l719 1674h174l-719 -1674h-174z" />
|
||||
<glyph glyph-name="zero" unicode="0" horiz-adv-x="1411"
|
||||
d="M121 705q0 211 74.5 376.5t208 258t303.5 92.5q169 0 302 -92.5t207 -258.5t74 -376q0 -211 -74 -378t-207 -259.5t-302 -92.5q-170 0 -303.5 92.5t-208 259.5t-74.5 378zM283 705q0 -255 119 -418.5t305 -163.5q122 0 218.5 74t149.5 207t53 301q0 255 -117.5 417
|
||||
t-303.5 162t-305 -162t-119 -417z" />
|
||||
<glyph glyph-name="one" unicode="1" horiz-adv-x="722"
|
||||
d="M53 1171l346 236h129v-1407h-159v1212l-246 -159z" />
|
||||
<glyph glyph-name="two" unicode="2" horiz-adv-x="1206"
|
||||
d="M100 0v133l514 438q148 126 214.5 233t66.5 212q0 123 -87 197.5t-206 74.5q-217 0 -377 -219l-112 92q191 271 495 271q188 0 318.5 -115t130.5 -299q0 -142 -76.5 -267.5t-255.5 -279.5l-369 -319h715v-152h-971z" />
|
||||
<glyph glyph-name="three" unicode="3" horiz-adv-x="1200"
|
||||
d="M82 217l111 105q72 -93 174.5 -147t226.5 -54q148 0 238 74t90 194q0 122 -97 186t-266 64h-149v147l151 -2q145 -2 237.5 64.5t92.5 183.5q0 110 -89 182t-222 72q-111 0 -199 -51t-168 -148l-107 97q186 248 482 248q202 0 333.5 -106.5t131.5 -274.5q0 -127 -77 -211
|
||||
t-196 -119q57 -13 108 -39t96.5 -66.5t72 -101t26.5 -133.5q0 -178 -135.5 -292t-353.5 -114q-165 0 -297.5 67t-214.5 175z" />
|
||||
<glyph glyph-name="four" unicode="4" horiz-adv-x="1275"
|
||||
d="M82 475l698 932h185v-920h211v-145h-211v-342h-160v342h-703zM264 487h541v727z" />
|
||||
<glyph glyph-name="five" unicode="5" horiz-adv-x="1226"
|
||||
d="M115 199l104 116q180 -196 397 -196q145 0 238.5 89t93.5 224t-94 219t-242 84q-169 0 -313 -108l-117 57l21 723h831v-152h-676l-14 -473q142 95 301 95q96 0 180 -30t147.5 -84.5t100.5 -138.5t37 -186q0 -207 -140.5 -335t-359.5 -128q-298 0 -495 224z" />
|
||||
<glyph glyph-name="six" unicode="6" horiz-adv-x="1275"
|
||||
d="M123 682q0 155 44.5 294t120 239t181 158.5t223.5 58.5q225 0 400 -168l-88 -125q-73 72 -147 109.5t-169 37.5q-111 0 -203.5 -80t-146 -219t-53.5 -305v-18q65 102 169 158.5t228 56.5q130 0 235.5 -50.5t170.5 -152t65 -236.5q0 -198 -139.5 -331.5t-356.5 -133.5
|
||||
q-139 0 -243.5 54t-167 151.5t-93 223t-30.5 278.5zM303 479q32 -168 121 -267t231 -99q101 0 179.5 47.5t117.5 119.5t39 152q0 141 -96.5 225t-241.5 84q-133 0 -228.5 -72t-121.5 -190z" />
|
||||
<glyph glyph-name="seven" unicode="7" horiz-adv-x="1228"
|
||||
d="M121 1255v152h952v-121l-606 -1286h-184l600 1255h-762z" />
|
||||
<glyph glyph-name="eight" unicode="8" horiz-adv-x="1241"
|
||||
d="M106 369q0 126 87.5 220t224.5 138q-127 48 -201 132t-74 200q0 85 40.5 156.5t107.5 118t152.5 72.5t177.5 26q127 0 235.5 -44.5t176 -131.5t67.5 -199q0 -120 -77 -203t-198 -127q136 -46 223 -139t87 -219q0 -117 -68.5 -207.5t-185 -138.5t-260.5 -48
|
||||
q-145 0 -262 48.5t-185 138.5t-68 207zM268 379q0 -114 102 -186t251 -72t250.5 72t101.5 186q0 61 -34 113.5t-87 85.5t-113.5 52t-117.5 21q-56 -2 -116.5 -21t-114 -52t-88 -85.5t-34.5 -113.5zM305 1042q0 -58 30 -106.5t78.5 -78t101.5 -46.5t106 -20q54 3 108 20.5
|
||||
t101.5 47.5t77.5 78t30 105q0 105 -92 174.5t-225 69.5t-224.5 -69.5t-91.5 -174.5z" />
|
||||
<glyph glyph-name="nine" unicode="9" horiz-adv-x="1275"
|
||||
d="M123 967q0 198 139 331.5t356 133.5q139 0 243.5 -54t167.5 -151.5t93.5 -223t30.5 -278.5q0 -155 -44.5 -294t-120 -239t-181 -158.5t-223.5 -58.5q-225 0 -400 168l88 125q73 -72 147 -109.5t169 -37.5q111 0 203.5 80t146 219t53.5 305v18q-65 -102 -169 -158.5
|
||||
t-228 -56.5q-130 0 -235.5 50.5t-170.5 152t-65 236.5zM285 975q0 -141 96.5 -225t241.5 -84q133 0 228.5 72t121.5 190q-32 168 -121 267t-231 99q-101 0 -179.5 -47.5t-117.5 -119.5t-39 -152z" />
|
||||
<glyph glyph-name="colon" unicode=":" horiz-adv-x="518"
|
||||
d="M150 88q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5zM150 938q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z" />
|
||||
<glyph glyph-name="semicolon" unicode=";" horiz-adv-x="540"
|
||||
d="M158 88q0 44 32 76.5t80 32.5q57 0 91 -46t34 -118q0 -62 -33 -126.5t-124 -178.5l-76 57q81 93 106 190q-45 0 -77.5 33.5t-32.5 79.5zM158 938q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z" />
|
||||
<glyph glyph-name="less" unicode="<" horiz-adv-x="1200"
|
||||
d="M113 643v121l931 463v-144l-780 -378l780 -379v-146z" />
|
||||
<glyph glyph-name="equal" unicode="=" horiz-adv-x="1214"
|
||||
d="M137 383v152h940v-152h-940zM137 834v151h940v-151h-940z" />
|
||||
<glyph glyph-name="greater" unicode=">" horiz-adv-x="1200"
|
||||
d="M156 180v146l780 379l-780 378v144l931 -463v-121z" />
|
||||
<glyph glyph-name="question" unicode="?" horiz-adv-x="1038"
|
||||
d="M55 1196q191 236 463 236q191 0 310.5 -107.5t119.5 -267.5q0 -137 -114.5 -249.5t-294.5 -150.5v-262h-162v383q179 15 294 89.5t115 174.5q0 99 -76 171.5t-200 72.5q-108 0 -191.5 -51t-158.5 -143zM346 88q0 43 33 76t80 33q44 0 76 -33t32 -76q0 -46 -32 -79.5
|
||||
t-76 -33.5q-47 0 -80 33.5t-33 79.5z" />
|
||||
<glyph glyph-name="at" unicode="@" horiz-adv-x="1804"
|
||||
d="M90 530q0 170 69 327.5t184 272.5t273.5 183.5t329.5 68.5q154 0 296 -59t245.5 -157t165 -233t61.5 -280q0 -120 -32 -217t-85 -155.5t-117.5 -89.5t-133.5 -31q-95 0 -157 47t-79 129q-61 -79 -146.5 -127.5t-185.5 -48.5q-149 0 -244.5 98t-95.5 256q0 104 41 200.5
|
||||
t108 164t153.5 107.5t174.5 40q102 0 173 -46.5t108 -119.5l27 135l137 -10q-15 -76 -35 -179.5t-31 -159t-22.5 -115.5t-16 -92.5t-4.5 -47.5q0 -64 36.5 -99.5t98.5 -35.5q45 0 88 22.5t81 67.5t61.5 124.5t23.5 182.5q0 131 -56 252.5t-150 209.5t-223.5 141t-268.5 53
|
||||
q-155 0 -298 -62.5t-247 -167t-166.5 -248.5t-62.5 -299q0 -112 36.5 -218t102.5 -192t153.5 -151t195.5 -101t221 -36q126 0 228 29t214 96l37 -55q-119 -75 -232 -108.5t-252 -33.5q-208 0 -388.5 104t-287 281.5t-106.5 382.5zM586 522q0 -109 62.5 -175t166.5 -66
|
||||
q140 0 230 100.5t106 255.5q12 126 -43 197t-174 71q-141 0 -244.5 -114.5t-103.5 -268.5z" />
|
||||
<glyph glyph-name="A" unicode="A" horiz-adv-x="1546"
|
||||
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739z" />
|
||||
<glyph glyph-name="B" unicode="B" horiz-adv-x="1396"
|
||||
d="M193 0v1407h645q170 0 278.5 -98t108.5 -252q0 -107 -50 -178.5t-151 -130.5q123 -62 189.5 -155.5t66.5 -207.5q0 -169 -117.5 -277t-300.5 -108h-669zM352 145h469q130 0 213.5 73.5t83.5 187.5t-83.5 187t-213.5 73h-469v-521zM352 811h445q117 0 191.5 63.5
|
||||
t74.5 161.5q0 99 -74.5 162.5t-191.5 63.5h-445v-451z" />
|
||||
<glyph glyph-name="C" unicode="C" horiz-adv-x="1392"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 275 -56.5t231 -158.5l-108 -111q-78 84 -181.5 131t-216.5 47q-149 0 -278 -79t-205 -212.5t-76 -287.5q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47q113 0 216.5 47t181.5 131l108 -111
|
||||
q-101 -101 -232 -158t-274 -57q-191 0 -357.5 99.5t-265 268t-98.5 362.5z" />
|
||||
<glyph glyph-name="D" unicode="D" horiz-adv-x="1560"
|
||||
d="M193 0v1407h475q220 0 394 -89t271 -249.5t97 -363.5q0 -204 -97 -364.5t-271 -250.5t-394 -90h-475zM352 145h316q264 0 432 157t168 403q0 161 -76 288t-213 198t-311 71h-316v-1117z" />
|
||||
<glyph glyph-name="E" unicode="E" horiz-adv-x="1284"
|
||||
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009z" />
|
||||
<glyph glyph-name="F" unicode="F" horiz-adv-x="1247"
|
||||
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-641h-162z" />
|
||||
<glyph glyph-name="G" unicode="G" horiz-adv-x="1525"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q148 0 299 -58.5t248 -156.5l-108 -111q-75 80 -198 129t-241 49q-149 0 -278 -79t-205 -212.5t-76 -287.5q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47q98 0 203.5 35.5t183.5 95.5v336h-403v151h563
|
||||
v-551q-97 -97 -248 -156t-299 -59q-191 0 -357.5 99.5t-265 268t-98.5 362.5z" />
|
||||
<glyph glyph-name="H" unicode="H" horiz-adv-x="1472"
|
||||
d="M162 0v1407h160v-614h829v614h160v-1407h-160v641h-829v-641h-160z" />
|
||||
<glyph glyph-name="I" unicode="I" horiz-adv-x="483"
|
||||
d="M162 0v1407h160v-1407h-160z" />
|
||||
<glyph glyph-name="J" unicode="J" horiz-adv-x="1105"
|
||||
d="M53 209l117 115q41 -89 129.5 -146t185.5 -57q125 0 205 94.5t80 243.5v948h160v-948q0 -212 -125 -348t-320 -136q-125 0 -246.5 65.5t-185.5 168.5z" />
|
||||
<glyph glyph-name="K" unicode="K" horiz-adv-x="1351"
|
||||
d="M188 0v1407h160v-778l713 778h211l-592 -643l631 -764h-207l-535 655l-221 -233v-422h-160z" />
|
||||
<glyph glyph-name="L" unicode="L" horiz-adv-x="1136"
|
||||
d="M139 0v1407h160v-1255h768v-152h-928z" />
|
||||
<glyph glyph-name="M" unicode="M" horiz-adv-x="1748"
|
||||
d="M193 0v1407h159l522 -981l523 981h159v-1407h-159v1063l-523 -981l-522 981v-1063h-159z" />
|
||||
<glyph glyph-name="N" unicode="N" horiz-adv-x="1576"
|
||||
d="M193 0v1407h159l873 -1145v1145h159v-1407h-159l-873 1145v-1145h-159z" />
|
||||
<glyph glyph-name="O" unicode="O" horiz-adv-x="1652"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
|
||||
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5z" />
|
||||
<glyph glyph-name="P" unicode="P" horiz-adv-x="1318"
|
||||
d="M162 0v1407h571q220 0 369 -127.5t149 -323.5q0 -129 -68.5 -232.5t-187 -160.5t-262.5 -57h-411v-506h-160zM322 657h383q174 0 279.5 80t105.5 219t-105.5 219t-279.5 80h-383v-598z" />
|
||||
<glyph glyph-name="Q" unicode="Q" horiz-adv-x="1652"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -249 -157 -449l157 -137l-102 -119l-164 143q-202 -168 -453 -168q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186
|
||||
t179 -125.5t214.5 -47q186 0 336 121l-219 190l103 119l225 -195q112 154 112 347q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5z" />
|
||||
<glyph glyph-name="R" unicode="R" horiz-adv-x="1331"
|
||||
d="M162 0v1407h571q220 0 369 -127.5t149 -323.5q0 -163 -106.5 -281.5t-276.5 -154.5l365 -520h-182l-357 506h-372v-506h-160zM322 657h383q174 0 279.5 80t105.5 219t-105.5 219t-279.5 80h-383v-598z" />
|
||||
<glyph glyph-name="S" unicode="S" horiz-adv-x="1255"
|
||||
d="M94 201l101 125q203 -203 460 -203q155 0 241.5 72t86.5 174q0 106 -89.5 163t-289.5 103q-91 21 -157.5 43t-126.5 54.5t-97 73t-58.5 97.5t-21.5 129q0 170 135 286t336 116q276 0 494 -201l-98 -125q-186 180 -404 180q-128 0 -214.5 -72.5t-86.5 -171.5
|
||||
q0 -43 17.5 -77t46 -58.5t79.5 -46t103.5 -37t132.5 -34.5q109 -26 186.5 -56.5t143 -77.5t98.5 -115.5t33 -158.5q0 -176 -130 -291t-366 -115q-328 0 -555 224z" />
|
||||
<glyph glyph-name="T" unicode="T" horiz-adv-x="1290"
|
||||
d="M92 1255v152h1106v-152h-473v-1255h-160v1255h-473z" />
|
||||
<glyph glyph-name="U" unicode="U" horiz-adv-x="1527"
|
||||
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438z" />
|
||||
<glyph glyph-name="V" unicode="V" horiz-adv-x="1546"
|
||||
d="M66 1407h174l534 -1210l533 1210h174l-621 -1407h-174z" />
|
||||
<glyph glyph-name="W" unicode="W" horiz-adv-x="2213"
|
||||
d="M76 1407h180l389 -1139l373 1139h178l373 -1139l389 1139h180l-481 -1407h-158l-391 1198l-393 -1198h-158z" />
|
||||
<glyph glyph-name="X" unicode="X" horiz-adv-x="1427"
|
||||
d="M78 0l538 702l-538 705h196l441 -576l440 576h195l-539 -702l539 -705h-197l-440 575l-441 -575h-194z" />
|
||||
<glyph glyph-name="Y" unicode="Y" horiz-adv-x="1374"
|
||||
d="M37 1407h199l452 -682l457 682h192l-565 -834v-573h-168v573z" />
|
||||
<glyph glyph-name="Z" unicode="Z" horiz-adv-x="1308"
|
||||
d="M119 0v127l848 1128h-834v152h1053v-127l-850 -1128h858v-152h-1075z" />
|
||||
<glyph glyph-name="bracketleft" unicode="[" horiz-adv-x="749"
|
||||
d="M166 -236v1739h483v-117h-348v-1505h348v-117h-483z" />
|
||||
<glyph glyph-name="backslash" unicode="\" horiz-adv-x="849"
|
||||
d="M-10 1522h174l719 -1674h-174z" />
|
||||
<glyph glyph-name="bracketright" unicode="]" horiz-adv-x="749"
|
||||
d="M100 -119h349v1505h-349v117h484v-1739h-484v117z" />
|
||||
<glyph glyph-name="asciicircum" unicode="^" horiz-adv-x="1003"
|
||||
d="M111 846l331 561h121l330 -561h-133l-258 448l-260 -448h-131z" />
|
||||
<glyph glyph-name="underscore" unicode="_"
|
||||
d="M-4 -154h1221v-137h-1221v137z" />
|
||||
<glyph glyph-name="grave" unicode="`" horiz-adv-x="667"
|
||||
d="M129 1438l162 37l248 -295h-119z" />
|
||||
<glyph glyph-name="a" unicode="a" horiz-adv-x="1173"
|
||||
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
|
||||
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156z" />
|
||||
<glyph glyph-name="b" unicode="b" horiz-adv-x="1306"
|
||||
d="M170 0v1432h154v-572q61 106 160 164.5t225 58.5q210 0 348.5 -155.5t138.5 -397.5q0 -243 -138.5 -399t-348.5 -156q-125 0 -224.5 59t-160.5 165v-199h-154zM324 530q0 -183 99.5 -300t256.5 -117q155 0 254.5 117t99.5 300t-99.5 299.5t-254.5 116.5
|
||||
q-157 0 -256.5 -116.5t-99.5 -299.5z" />
|
||||
<glyph glyph-name="c" unicode="c" horiz-adv-x="1110"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q106 0 203.5 -41t173.5 -114l-106 -105q-53 58 -123.5 90.5t-147.5 32.5q-158 0 -272.5 -123.5t-114.5 -292.5q0 -170 114.5 -293.5t272.5 -123.5q78 0 150 34t127 95l106 -105q-76 -76 -175.5 -119t-207.5 -43
|
||||
q-109 0 -210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5z" />
|
||||
<glyph glyph-name="d" unicode="d" horiz-adv-x="1306"
|
||||
d="M111 530q0 242 138.5 397.5t348.5 155.5q126 0 225 -58.5t160 -164.5v572h154v-1432h-154v199q-61 -106 -160.5 -165t-224.5 -59q-210 0 -348.5 156t-138.5 399zM272 530q0 -183 100 -300t255 -117q157 0 256.5 117t99.5 300t-99.5 299.5t-256.5 116.5
|
||||
q-155 0 -255 -116.5t-100 -299.5z" />
|
||||
<glyph glyph-name="e" unicode="e" horiz-adv-x="1218"
|
||||
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
|
||||
q-142 0 -244.5 -93t-124.5 -245z" />
|
||||
<glyph glyph-name="f" unicode="f" horiz-adv-x="718"
|
||||
d="M76 922v137h166v145q0 119 72 195t186 76q109 0 196 -68l-75 -113q-40 43 -111 43q-47 0 -81 -38t-34 -95v-145h260v-137h-260v-922h-153v922h-166z" />
|
||||
<glyph glyph-name="g" unicode="g" horiz-adv-x="1302"
|
||||
d="M106 582q0 221 137 361t351 140q124 0 223.5 -54t161.5 -152v182h154v-946q0 -204 -146 -334.5t-375 -130.5q-126 0 -240 39t-188 102l68 121q62 -59 152 -92t188 -33q183 0 285 86.5t102 241.5v172q-62 -98 -161.5 -152.5t-223.5 -54.5q-214 0 -351 141.5t-137 362.5z
|
||||
M268 582q0 -161 100 -264t255 -103q157 0 256.5 103t99.5 264q0 160 -99.5 262t-256.5 102q-155 0 -255 -102t-100 -262z" />
|
||||
<glyph glyph-name="h" unicode="h"
|
||||
d="M158 0v1432h153v-543q46 86 141.5 140t206.5 54q175 0 286.5 -114.5t111.5 -294.5v-674h-154v653q0 129 -73.5 211t-190.5 82q-133 0 -230.5 -81t-97.5 -191v-674h-153z" />
|
||||
<glyph glyph-name="i" unicode="i" horiz-adv-x="460"
|
||||
d="M129 1354q0 40 30 70t72 30q41 0 71 -30t30 -70q0 -41 -30 -72t-71 -31q-42 0 -72 30.5t-30 72.5zM154 0v1059h153v-1059h-153z" />
|
||||
<glyph glyph-name="j" unicode="j" horiz-adv-x="460"
|
||||
d="M-117 -332l25 127q61 -22 131 -22q51 0 83 37t32 96v1153h153v-1153q0 -119 -72 -195t-186 -76q-91 0 -166 33zM129 1354q0 40 30 70t72 30q41 0 71 -30t30 -70q0 -41 -30 -72t-71 -31q-42 0 -72 30.5t-30 72.5z" />
|
||||
<glyph glyph-name="k" unicode="k" horiz-adv-x="1112"
|
||||
d="M154 0v1432h153v-959l580 586h196l-477 -486l451 -573h-193l-366 469l-191 -188v-281h-153z" />
|
||||
<glyph glyph-name="l" unicode="l" horiz-adv-x="464"
|
||||
d="M156 0v1432h153v-1432h-153z" />
|
||||
<glyph glyph-name="m" unicode="m" horiz-adv-x="1832"
|
||||
d="M156 0v1059h153v-156q40 84 121.5 132t185.5 48q118 0 208.5 -60.5t133.5 -164.5q32 102 126.5 163.5t215.5 61.5q166 0 271.5 -114.5t105.5 -294.5v-674h-153v653q0 129 -68.5 211t-175.5 82q-126 0 -206.5 -76t-80.5 -196v-674h-153v653q0 129 -68.5 211t-175.5 82
|
||||
q-126 0 -206.5 -76t-80.5 -196v-674h-153z" />
|
||||
<glyph glyph-name="n" unicode="n"
|
||||
d="M158 0v1059h153v-170q46 86 141.5 140t206.5 54q175 0 286.5 -114.5t111.5 -294.5v-674h-154v653q0 129 -73.5 211t-190.5 82q-133 0 -230.5 -81t-97.5 -191v-674h-153z" />
|
||||
<glyph glyph-name="o" unicode="o" horiz-adv-x="1292"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
|
||||
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5z" />
|
||||
<glyph glyph-name="p" unicode="p" horiz-adv-x="1306"
|
||||
d="M170 -352v1411h154v-199q61 106 160 164.5t225 58.5q210 0 348.5 -155.5t138.5 -397.5q0 -243 -138.5 -399t-348.5 -156q-125 0 -224.5 59t-160.5 165v-551h-154zM324 530q0 -183 99.5 -300t256.5 -117q155 0 254.5 117t99.5 300t-99.5 299.5t-254.5 116.5
|
||||
q-157 0 -256.5 -116.5t-99.5 -299.5z" />
|
||||
<glyph glyph-name="q" unicode="q" horiz-adv-x="1306"
|
||||
d="M111 530q0 242 138.5 397.5t348.5 155.5q126 0 225 -58.5t160 -164.5v199h154v-1411h-154v551q-61 -106 -160.5 -165t-224.5 -59q-210 0 -348.5 156t-138.5 399zM272 530q0 -183 100 -300t255 -117q157 0 256.5 117t99.5 300t-99.5 299.5t-256.5 116.5
|
||||
q-155 0 -255 -116.5t-100 -299.5z" />
|
||||
<glyph glyph-name="r" unicode="r" horiz-adv-x="790"
|
||||
d="M170 0v1059h154v-207q48 107 156 169t253 62v-137q-180 0 -294.5 -99.5t-114.5 -254.5v-592h-154z" />
|
||||
<glyph glyph-name="s" unicode="s" horiz-adv-x="1015"
|
||||
d="M92 133l80 113q183 -133 358 -133q105 0 169.5 45.5t64.5 120.5q0 24 -8 45t-19 36t-33.5 30t-40 24.5t-51 21t-54 18t-60.5 17.5q-195 56 -275 122.5t-80 178.5q0 142 104.5 226.5t266.5 84.5q199 0 379 -118l-74 -119q-156 100 -305 100q-94 0 -155.5 -40.5
|
||||
t-61.5 -114.5q0 -65 56 -99t218 -86q47 -15 73.5 -23.5t69 -26t66.5 -32.5t54 -39t46 -50t27 -62t11 -78q0 -144 -110.5 -232t-277.5 -88q-112 0 -228 41.5t-210 116.5z" />
|
||||
<glyph glyph-name="t" unicode="t" horiz-adv-x="757"
|
||||
d="M76 922v137h166v291h153v-291h260v-137h-260v-676q0 -57 34 -95t81 -38q71 0 111 43l75 -113q-87 -68 -196 -68q-114 0 -186 76t-72 195v676h-166z" />
|
||||
<glyph glyph-name="u" unicode="u"
|
||||
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295z" />
|
||||
<glyph glyph-name="v" unicode="v" horiz-adv-x="1153"
|
||||
d="M55 1059h172l353 -879l346 879h172l-445 -1059h-147z" />
|
||||
<glyph glyph-name="w" unicode="w" horiz-adv-x="1705"
|
||||
d="M72 1059h164l264 -854l288 854h134l288 -854l265 854h163l-356 -1059h-145l-281 846l-285 -846h-145z" />
|
||||
<glyph glyph-name="x" unicode="x" horiz-adv-x="1128"
|
||||
d="M66 0l409 541l-393 518h180l303 -400l301 400h181l-392 -518l408 -541h-180l-318 422l-319 -422h-180z" />
|
||||
<glyph glyph-name="y" unicode="y" horiz-adv-x="1214"
|
||||
d="M61 1059h170l371 -881l350 881h166l-483 -1178q-54 -132 -132 -190t-190 -60q-93 0 -168 35l37 131q53 -26 125 -26q53 0 88.5 21t65.5 73l61 131z" />
|
||||
<glyph glyph-name="z" unicode="z" horiz-adv-x="1052"
|
||||
d="M111 0v121l624 792h-612v146h819v-121l-627 -793h631v-145h-835z" />
|
||||
<glyph glyph-name="braceleft" unicode="{" horiz-adv-x="806"
|
||||
d="M88 487v113q109 0 155 46t46 149v286q0 110 37 178t127 109.5t247 58.5l13 -108q-94 -14 -148.5 -30.5t-88 -46t-44 -67.5t-10.5 -102l2 -295q0 -94 -38.5 -150t-115.5 -83q78 -28 116 -84.5t38 -151.5l-2 -293q0 -86 23.5 -131t83.5 -71t184 -45l-13 -109
|
||||
q-158 17 -248 59t-126.5 110t-36.5 177v289q0 103 -46.5 147.5t-154.5 44.5z" />
|
||||
<glyph glyph-name="bar" unicode="|" horiz-adv-x="569"
|
||||
d="M223 -152v1674h123v-1674h-123z" />
|
||||
<glyph glyph-name="braceright" unicode="}" horiz-adv-x="806"
|
||||
d="M94 -231q124 19 184 45t83.5 71t23.5 131l-2 293q0 95 38 151.5t116 84.5q-77 27 -115.5 83t-38.5 150l2 295q0 64 -10.5 102t-44 67.5t-88 46t-148.5 30.5l12 108q232 -26 322 -104.5t90 -241.5v-286q0 -103 46 -149t155 -46v-113q-108 0 -154.5 -44.5t-46.5 -147.5
|
||||
v-289q0 -109 -37 -177t-127 -110t-248 -59z" />
|
||||
<glyph glyph-name="asciitilde" unicode="~" horiz-adv-x="911"
|
||||
d="M127 625q31 243 197 243q41 0 80.5 -21t65.5 -46.5t58 -46.5t60 -21q40 0 65 33t37 106l94 -14q-31 -244 -196 -244q-41 0 -80.5 21t-65.5 47t-58 47t-60 21q-80 0 -103 -140z" />
|
||||
<glyph glyph-name="uni00A0" unicode=" " horiz-adv-x="593"
|
||||
/>
|
||||
<glyph glyph-name="exclamdown" unicode="¡" horiz-adv-x="559"
|
||||
d="M168 971q0 46 32 79t76 33q47 0 80 -33t33 -79q0 -43 -33 -76t-80 -33q-44 0 -76 33t-32 76zM180 -348l41 1012h109l39 -1012h-189z" />
|
||||
<glyph glyph-name="cent" unicode="¢" horiz-adv-x="1110"
|
||||
d="M98 530q0 196 127.5 350t315.5 193v133h159v-125q186 -21 324 -153l-106 -105q-91 101 -218 119v-825q131 21 224 125l106 -105q-139 -139 -330 -160v-129h-159v138q-188 40 -315.5 194t-127.5 350zM260 530q0 -139 79.5 -250.5t201.5 -150.5v801q-121 -39 -201 -150.5
|
||||
t-80 -249.5z" />
|
||||
<glyph glyph-name="sterling" unicode="£" horiz-adv-x="1267"
|
||||
d="M113 0v78l133 74v383h-127v137h127v276q0 212 124.5 348t319.5 136q141 0 261.5 -65.5t170.5 -168.5l-116 -115q-26 89 -114.5 146t-201.5 57q-125 0 -204.5 -94.5t-79.5 -243.5v-276h413v-137h-413v-383h768v-152h-1061z" />
|
||||
<glyph glyph-name="yen" unicode="¥" horiz-adv-x="1374"
|
||||
d="M37 1407h199l452 -682l457 682h192l-497 -733h356v-137h-424v-164h424v-137h-424v-236h-168v236h-424v137h424v164h-424v137h357z" />
|
||||
<glyph glyph-name="dieresis" unicode="¨" horiz-adv-x="839"
|
||||
d="M129 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM522 1317q0 37 27.5 65.5t66.5 28.5q38 0 66.5 -28.5t28.5 -65.5q0 -38 -28.5 -66t-66.5 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="uni00AD" unicode="­" horiz-adv-x="759"
|
||||
d="M115 481v150h530v-150h-530z" />
|
||||
<glyph glyph-name="macron" unicode="¯" horiz-adv-x="892"
|
||||
d="M129 1217v112h635v-112h-635z" />
|
||||
<glyph glyph-name="acute" unicode="´" horiz-adv-x="667"
|
||||
d="M129 1180l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="cedilla" unicode="¸" horiz-adv-x="638"
|
||||
d="M129 -336l39 86q58 -47 133 -47q44 0 73 22t29 56q0 31 -20 50t-59 19q-42 0 -70 -22l-33 35l68 160h106l-49 -117q8 2 23 2q62 0 101.5 -37.5t39.5 -97.5q0 -74 -57.5 -120t-143.5 -46q-109 0 -180 57z" />
|
||||
<glyph glyph-name="questiondown" unicode="¿" horiz-adv-x="1038"
|
||||
d="M90 2q0 137 115 249t295 150v263h162v-383q-179 -15 -294.5 -90t-115.5 -175q0 -99 76 -171t200 -72q108 0 192 51t159 143l104 -104q-191 -236 -463 -236q-191 0 -310.5 107.5t-119.5 267.5zM471 971q0 46 32.5 79t76.5 33q47 0 79.5 -33t32.5 -79q0 -43 -33 -76
|
||||
t-79 -33q-44 0 -76.5 33t-32.5 76z" />
|
||||
<glyph glyph-name="Agrave" unicode="À" horiz-adv-x="1546"
|
||||
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM426 1786l162 37l248 -295h-119zM446 471h654l-326 739z" />
|
||||
<glyph glyph-name="Aacute" unicode="Á" horiz-adv-x="1546"
|
||||
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739zM711 1528l247 295l162 -37l-291 -258h-118z" />
|
||||
<glyph glyph-name="Acircumflex" unicode="Â" horiz-adv-x="1546"
|
||||
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739zM496 1528l204 280h144l209 -280h-119l-162 176l-160 -176h-116z" />
|
||||
<glyph glyph-name="Atilde" unicode="Ã" horiz-adv-x="1546"
|
||||
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM442 1536q31 244 197 244q41 0 80.5 -21t65.5 -46.5t58 -46.5t60 -21q80 0 103 139l94 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-40 0 -65 -33t-37 -106zM446 471h654
|
||||
l-326 739z" />
|
||||
<glyph glyph-name="Adieresis" unicode="Ä" horiz-adv-x="1546"
|
||||
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739zM481 1665q0 37 27.5 65.5t66.5 28.5q38 0 66.5 -28.5t28.5 -65.5q0 -38 -28.5 -66t-66.5 -28q-39 0 -66.5 27.5t-27.5 66.5zM874 1665q0 37 28 65.5t67 28.5q38 0 66 -28.5
|
||||
t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -67 27.5t-28 66.5z" />
|
||||
<glyph glyph-name="Aring" unicode="Å" horiz-adv-x="1546"
|
||||
d="M66 0l620 1407h174l621 -1407h-174l-142 319h-784l-141 -319h-174zM446 471h654l-326 739zM561 1765q0 88 61.5 149.5t149.5 61.5t149.5 -61.5t61.5 -149.5t-61.5 -149.5t-149.5 -61.5t-149.5 61.5t-61.5 149.5zM651 1765q0 -49 35.5 -84.5t85.5 -35.5t85.5 35.5
|
||||
t35.5 84.5t-35.5 85t-85.5 36t-85.5 -36t-35.5 -85z" />
|
||||
<glyph glyph-name="AE" unicode="Æ" horiz-adv-x="2097"
|
||||
d="M66 0l811 1407h1108v-152h-848v-462h764v-152h-764v-489h848v-152h-1010v319h-541l-184 -319h-184zM522 471h453v784z" />
|
||||
<glyph glyph-name="Ccedilla" unicode="Ç" horiz-adv-x="1392"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 275 -56.5t231 -158.5l-108 -111q-78 84 -181.5 131t-216.5 47q-149 0 -278 -79t-205 -212.5t-76 -287.5q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47q113 0 216.5 47t181.5 131l108 -111
|
||||
q-94 -94 -215.5 -151t-255.5 -64l-28 -69q8 2 22 2q62 0 101.5 -37.5t39.5 -97.5q0 -74 -57 -120t-143 -46q-110 0 -181 57l39 86q58 -47 133 -47q44 0 73.5 22t29.5 56q0 31 -20 50t-60 19q-42 0 -70 -22l-32 35l49 117q-177 18 -326.5 120t-237.5 262.5t-88 342.5z" />
|
||||
<glyph glyph-name="Egrave" unicode="È" horiz-adv-x="1284"
|
||||
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009zM401 1786l162 37l248 -295h-119z" />
|
||||
<glyph glyph-name="Eacute" unicode="É" horiz-adv-x="1284"
|
||||
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009zM504 1528l248 295l161 -37l-290 -258h-119z" />
|
||||
<glyph glyph-name="Ecircumflex" unicode="Ê" horiz-adv-x="1284"
|
||||
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009zM391 1528l205 280h143l209 -280h-119l-161 176l-160 -176h-117z" />
|
||||
<glyph glyph-name="Edieresis" unicode="Ë" horiz-adv-x="1284"
|
||||
d="M162 0v1407h1009v-152h-847v-462h763v-152h-763v-489h847v-152h-1009zM377 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM770 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66
|
||||
t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="Igrave" unicode="Ì" horiz-adv-x="483"
|
||||
d="M-106 1786l161 37l248 -295h-119zM162 0v1407h160v-1407h-160z" />
|
||||
<glyph glyph-name="Iacute" unicode="Í" horiz-adv-x="483"
|
||||
d="M162 0v1407h160v-1407h-160zM180 1528l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="Icircumflex" unicode="Î" horiz-adv-x="483"
|
||||
d="M-35 1528l205 280h143l209 -280h-119l-161 176l-160 -176h-117zM162 0v1407h160v-1407h-160z" />
|
||||
<glyph glyph-name="Idieresis" unicode="Ï" horiz-adv-x="483"
|
||||
d="M-49 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM162 0v1407h160v-1407h-160zM344 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="Eth" unicode="Ð" horiz-adv-x="1595"
|
||||
d="M86 641v152h141v614h475q220 0 394 -89t271 -249.5t97 -363.5q0 -204 -97 -364.5t-271 -250.5t-394 -90h-475v641h-141zM387 145h315q264 0 432.5 157t168.5 403q0 161 -76.5 288t-213.5 198t-311 71h-315v-469h414l-2 -152h-412v-496z" />
|
||||
<glyph glyph-name="Ntilde" unicode="Ñ" horiz-adv-x="1576"
|
||||
d="M193 0v1407h159l873 -1145v1145h159v-1407h-159l-873 1145v-1145h-159zM459 1536q31 244 196 244q41 0 80.5 -21t66 -46.5t58.5 -46.5t60 -21q40 0 65 33t37 106l94 -15q-31 -243 -196 -243q-41 0 -80.5 21t-66 46.5t-58.5 46.5t-60 21q-40 0 -65 -33t-37 -106z" />
|
||||
<glyph glyph-name="Ograve" unicode="Ò" horiz-adv-x="1652"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
|
||||
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM483 1786l162 37l248 -295h-119z" />
|
||||
<glyph glyph-name="Oacute" unicode="Ó" horiz-adv-x="1652"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
|
||||
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM766 1528l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="Ocircumflex" unicode="Ô" horiz-adv-x="1652"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
|
||||
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM551 1528l205 280h143l209 -280h-119l-162 176l-159 -176h-117z" />
|
||||
<glyph glyph-name="Otilde" unicode="Õ" horiz-adv-x="1652"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
|
||||
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM498 1536q31 244 196 244q41 0 80.5 -21t65.5 -46.5t58 -46.5t60 -21q80 0 103 139l94 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5
|
||||
t-60 21q-40 0 -65 -33t-37 -106z" />
|
||||
<glyph glyph-name="Odieresis" unicode="Ö" horiz-adv-x="1652"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q144 0 277 -58.5t229.5 -156.5t154.5 -232.5t58 -279.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-191 0 -357.5 99.5t-265 268t-98.5 362.5zM268 705q0 -116 45 -223.5t120.5 -186t179 -125.5t214.5 -47
|
||||
t214.5 47t178 125.5t119.5 186t45 223.5q0 154 -75.5 287.5t-204 212.5t-277.5 79t-278 -79t-205 -212.5t-76 -287.5zM537 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM930 1665q0 37 27.5 65.5t66.5 28.5
|
||||
q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="multiply" unicode="×" horiz-adv-x="1107"
|
||||
d="M168 406l278 278l-278 279l108 108l279 -278l279 278l106 -108l-276 -277l276 -278l-109 -109l-276 279l-279 -279z" />
|
||||
<glyph glyph-name="Oslash" unicode="Ø" horiz-adv-x="1652"
|
||||
d="M106 705q0 145 58.5 279.5t156 232.5t230.5 156.5t276 58.5q234 0 424 -144l105 119h174l-180 -207q93 -100 144.5 -227.5t51.5 -267.5q0 -194 -97.5 -362.5t-263.5 -268t-358 -99.5q-230 0 -424 144l-104 -119h-174l180 207q-94 100 -146.5 229t-52.5 269zM268 705
|
||||
q0 -105 37 -204t103 -177l743 850q-145 110 -324 110q-149 0 -278 -79t-205 -212.5t-76 -287.5zM504 233q145 -110 323 -110q111 0 214.5 47t178 125.5t119.5 186t45 223.5q0 213 -139 378z" />
|
||||
<glyph glyph-name="Ugrave" unicode="Ù" horiz-adv-x="1527"
|
||||
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438zM498 1786l161 37l248 -295h-119z" />
|
||||
<glyph glyph-name="Uacute" unicode="Ú" horiz-adv-x="1527"
|
||||
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438zM600 1528l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="Ucircumflex" unicode="Û" horiz-adv-x="1527"
|
||||
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438zM487 1528l205 280h144l208 -280h-118l-162 176l-160 -176h-117z" />
|
||||
<glyph glyph-name="Udieresis" unicode="Ü" horiz-adv-x="1527"
|
||||
d="M176 584v823h160v-823q0 -203 120.5 -333t307.5 -130t307.5 130t120.5 333v823h160v-823q0 -267 -165 -438t-423 -171t-423 171t-165 438zM473 1665q0 37 27.5 65.5t66.5 28.5q38 0 66.5 -28.5t28.5 -65.5q0 -38 -28.5 -66t-66.5 -28q-39 0 -66.5 27.5t-27.5 66.5z
|
||||
M866 1665q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -67 27.5t-28 66.5z" />
|
||||
<glyph glyph-name="Yacute" unicode="Ý" horiz-adv-x="1374"
|
||||
d="M37 1407h199l452 -682l457 682h192l-565 -834v-573h-168v573zM524 1528l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="Thorn" unicode="Þ" horiz-adv-x="1318"
|
||||
d="M162 0v1407h164v-248h407q144 0 262.5 -57t187 -160.5t68.5 -232.5q0 -196 -149 -323.5t-369 -127.5h-411v-258h-160zM322 410h383q174 0 279.5 80t105.5 219t-105.5 219t-279.5 80h-383v-598z" />
|
||||
<glyph glyph-name="germandbls" unicode="ß" horiz-adv-x="1179"
|
||||
d="M172 0v1077q0 163 120 267t308 104q187 0 306.5 -104t119.5 -267q0 -212 -201 -329q123 -62 189.5 -155.5t66.5 -207.5q0 -169 -117 -277t-300 -108h-179v145h138q130 0 213.5 73.5t83.5 187.5t-83.5 187t-213.5 73h-138v145h113q115 0 190.5 72.5t75.5 173.5
|
||||
q0 107 -74.5 176.5t-191.5 69.5t-191.5 -71t-74.5 -181v-1051h-160z" />
|
||||
<glyph glyph-name="agrave" unicode="à" horiz-adv-x="1173"
|
||||
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
|
||||
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM334 1438l162 37l247 -295h-118z" />
|
||||
<glyph glyph-name="aacute" unicode="á" horiz-adv-x="1173"
|
||||
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
|
||||
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM436 1180l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="acircumflex" unicode="â" horiz-adv-x="1173"
|
||||
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
|
||||
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM324 1180l204 280h144l209 -280h-119l-162 176l-160 -176h-116z" />
|
||||
<glyph glyph-name="atilde" unicode="ã" horiz-adv-x="1173"
|
||||
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
|
||||
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM270 1188q31 244 197 244q41 0 80.5 -21t65.5 -47t58 -47t60 -21q80 0 103 140l94 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-40 0 -65 -33t-37 -106z
|
||||
" />
|
||||
<glyph glyph-name="adieresis" unicode="ä" horiz-adv-x="1173"
|
||||
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
|
||||
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM309 1317q0 37 27.5 65.5t66.5 28.5q38 0 66.5 -28.5t28.5 -65.5q0 -38 -28.5 -66t-66.5 -28q-39 0 -66.5 27.5t-27.5 66.5zM702 1317q0 37 28 65.5t67 28.5q38 0 66 -28.5
|
||||
t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -67 27.5t-28 66.5z" />
|
||||
<glyph glyph-name="aring" unicode="å" horiz-adv-x="1173"
|
||||
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q210 0 320 -119.5t110 -318.5v-645h-154v166q-55 -90 -159 -140.5t-214 -50.5q-170 0 -278.5 92t-108.5 246zM252 319
|
||||
q0 -96 74.5 -152t189.5 -56t216 58t130 163v162q-153 43 -319 43q-121 0 -206 -62t-85 -156zM389 1417q0 88 61.5 149.5t149.5 61.5t149.5 -61.5t61.5 -149.5t-61.5 -149.5t-149.5 -61.5t-149.5 61.5t-61.5 149.5zM479 1417q0 -49 35.5 -85t85.5 -36t85.5 36t35.5 85
|
||||
t-35.5 85t-85.5 36t-85.5 -36t-35.5 -85z" />
|
||||
<glyph glyph-name="ae" unicode="æ" horiz-adv-x="1982"
|
||||
d="M102 313q0 155 121 254t295 99q157 0 344 -60v39q0 46 -7.5 87t-27.5 82.5t-51.5 71t-83 48t-117.5 18.5q-121 0 -309 -96l-61 125q204 102 381 102q143 0 239.5 -56t143.5 -157q73 100 182 156.5t233 56.5q237 0 369.5 -165t132.5 -447h-866q18 -158 120.5 -258
|
||||
t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-134 0 -253 65t-192 179q-67 -110 -186.5 -177t-257.5 -67q-192 0 -300 89t-108 249zM252 319q0 -98 75.5 -153t209.5 -55q132 0 228.5 90.5t96.5 214.5v78q-153 43 -319 43
|
||||
q-121 0 -206 -62t-85 -156zM1022 608h713q-16 150 -104 244t-240 94q-142 0 -244.5 -93t-124.5 -245z" />
|
||||
<glyph glyph-name="ccedilla" unicode="ç" horiz-adv-x="1110"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q106 0 203.5 -41t173.5 -114l-106 -105q-53 58 -123.5 90.5t-147.5 32.5q-158 0 -272.5 -123.5t-114.5 -292.5q0 -170 114.5 -293.5t272.5 -123.5q78 0 150 34t127 95l106 -105q-148 -148 -346 -160l-31 -71q8 2 23 2
|
||||
q62 0 101.5 -37.5t39.5 -97.5q0 -74 -57.5 -120t-143.5 -46q-109 0 -180 57l39 86q58 -47 133 -47q44 0 73.5 22t29.5 56q0 31 -20 50t-60 19q-42 0 -70 -22l-33 35l50 117q-98 14 -187 63t-153 122t-102 168t-38 197z" />
|
||||
<glyph glyph-name="egrave" unicode="è" horiz-adv-x="1218"
|
||||
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
|
||||
q-142 0 -244.5 -93t-124.5 -245zM354 1438l162 37l248 -295h-119z" />
|
||||
<glyph glyph-name="eacute" unicode="é" horiz-adv-x="1218"
|
||||
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
|
||||
q-142 0 -244.5 -93t-124.5 -245zM457 1180l248 295l161 -37l-291 -258h-118z" />
|
||||
<glyph glyph-name="ecircumflex" unicode="ê" horiz-adv-x="1218"
|
||||
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
|
||||
q-142 0 -244.5 -93t-124.5 -245zM344 1180l205 280h143l209 -280h-119l-161 176l-160 -176h-117z" />
|
||||
<glyph glyph-name="edieresis" unicode="ë" horiz-adv-x="1218"
|
||||
d="M98 532q0 154 71 281t191 198.5t261 71.5q237 0 369 -165t132 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-105 0 -203 41.5t-172 114t-118 177.5t-44 224zM258 608h713q-16 150 -104 244t-240 94
|
||||
q-142 0 -244.5 -93t-124.5 -245zM330 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM723 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="igrave" unicode="ì" horiz-adv-x="460"
|
||||
d="M-117 1438l162 37l248 -295h-119zM154 0v1059h153v-1059h-153z" />
|
||||
<glyph glyph-name="iacute" unicode="í" horiz-adv-x="460"
|
||||
d="M154 0v1059h153v-1059h-153zM170 1180l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="icircumflex" unicode="î" horiz-adv-x="460"
|
||||
d="M-45 1180l205 280h143l209 -280h-119l-162 176l-159 -176h-117zM154 0v1059h153v-1059h-153z" />
|
||||
<glyph glyph-name="idieresis" unicode="ï" horiz-adv-x="460"
|
||||
d="M-59 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5zM154 0v1059h153v-1059h-153zM334 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="eth" unicode="ð" horiz-adv-x="1284"
|
||||
d="M123 508q0 224 134 368t343 144q202 0 342 -166q-85 165 -276 332l-250 -111l-56 127l187 82q-101 75 -166 119l156 63q100 -78 149 -118l203 90l55 -127l-145 -66q185 -171 273.5 -335.5t88.5 -358.5q0 -254 -144.5 -415t-371.5 -161q-229 0 -375.5 150t-146.5 383z
|
||||
M283 506q0 -172 101 -281.5t261 -109.5q155 0 254.5 108.5t99.5 278.5q0 163 -99 273t-261 110q-157 0 -256.5 -106.5t-99.5 -272.5z" />
|
||||
<glyph glyph-name="ntilde" unicode="ñ"
|
||||
d="M158 0v1059h153v-170q46 86 141.5 140t206.5 54q175 0 286.5 -114.5t111.5 -294.5v-674h-154v653q0 129 -73.5 211t-190.5 82q-133 0 -230.5 -81t-97.5 -191v-674h-153zM311 1188q31 244 197 244q41 0 80.5 -21t65.5 -47t58 -47t60 -21q79 0 102 140l95 -15
|
||||
q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-40 0 -65 -33t-37 -106z" />
|
||||
<glyph glyph-name="ograve" unicode="ò" horiz-adv-x="1292"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
|
||||
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM381 1438l162 37l248 -295h-119z" />
|
||||
<glyph glyph-name="oacute" unicode="ó" horiz-adv-x="1292"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
|
||||
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM483 1180l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="ocircumflex" unicode="ô" horiz-adv-x="1292"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
|
||||
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM371 1180l204 280h144l209 -280h-119l-162 176l-160 -176h-116z" />
|
||||
<glyph glyph-name="otilde" unicode="õ" horiz-adv-x="1292"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
|
||||
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM317 1188q31 244 197 244q41 0 80.5 -21t65.5 -47t58 -47t60 -21q80 0 103 140l94 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-40 0 -65 -33t-37 -106z
|
||||
" />
|
||||
<glyph glyph-name="odieresis" unicode="ö" horiz-adv-x="1292"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q109 0 210.5 -44.5t175 -119t117.5 -176.5t44 -213t-44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5t-210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5
|
||||
t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM356 1317q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -67 27.5t-28 66.5zM750 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5
|
||||
q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="divide" unicode="÷" horiz-adv-x="1214"
|
||||
d="M137 608v152h940v-152h-940zM498 354q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79t-76.5 -33q-47 0 -79.5 33t-32.5 79zM498 1018q0 43 32.5 75.5t79.5 32.5q44 0 76.5 -32.5t32.5 -75.5q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z
|
||||
" />
|
||||
<glyph glyph-name="oslash" unicode="ø" horiz-adv-x="1292"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q162 0 305 -96l62 72h174l-137 -160q143 -159 143 -369q0 -111 -44 -213.5t-117.5 -177.5t-175 -119.5t-210.5 -44.5q-161 0 -303 95l-59 -70h-174l135 158q-70 75 -109 171.5t-39 200.5zM260 530q0 -145 84 -256l514 603
|
||||
q-98 69 -211 69q-158 0 -272.5 -123.5t-114.5 -292.5zM438 180q95 -67 209 -67q157 0 271 123.5t114 293.5q0 134 -80 252z" />
|
||||
<glyph glyph-name="ugrave" unicode="ù"
|
||||
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295zM338 1438l162 37l248 -295h-119z" />
|
||||
<glyph glyph-name="uacute" unicode="ú"
|
||||
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295zM440 1180l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="ucircumflex" unicode="û"
|
||||
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295zM328 1180l204 280h144l209 -280h-119l-162 176l-160 -176h-116z" />
|
||||
<glyph glyph-name="udieresis" unicode="ü"
|
||||
d="M156 385v674h153v-653q0 -129 73.5 -211t190.5 -82q133 0 230.5 81t97.5 191v674h154v-1059h-154v170q-46 -86 -141.5 -140.5t-206.5 -54.5q-175 0 -286 115t-111 295zM313 1317q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-40 0 -67.5 27.5
|
||||
t-27.5 66.5zM707 1317q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="yacute" unicode="ý" horiz-adv-x="1214"
|
||||
d="M61 1059h170l371 -881l350 881h166l-483 -1178q-54 -132 -132 -190t-190 -60q-93 0 -168 35l37 131q53 -26 125 -26q53 0 88.5 21t65.5 73l61 131zM438 1180l248 295l162 -37l-291 -258h-119z" />
|
||||
<glyph glyph-name="thorn" unicode="þ" horiz-adv-x="1306"
|
||||
d="M170 -352v1784h154v-572q61 106 160 164.5t225 58.5q210 0 348.5 -155.5t138.5 -397.5q0 -243 -138.5 -399t-348.5 -156q-125 0 -224.5 59t-160.5 165v-551h-154zM324 530q0 -183 99.5 -300t256.5 -117q155 0 254.5 117t99.5 300t-99.5 299.5t-254.5 116.5
|
||||
q-157 0 -256.5 -116.5t-99.5 -299.5z" />
|
||||
<glyph glyph-name="ydieresis" unicode="ÿ" horiz-adv-x="1214"
|
||||
d="M61 1059h170l371 -881l350 881h166l-483 -1178q-54 -132 -132 -190t-190 -60q-93 0 -168 35l37 131q53 -26 125 -26q53 0 88.5 21t65.5 73l61 131zM311 1317q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-40 0 -67.5 27.5t-27.5 66.5zM705 1317
|
||||
q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="OE" unicode="Œ" horiz-adv-x="2113"
|
||||
d="M106 684q0 145 58.5 279t156 231t230.5 155t276 58h1174v-152h-848v-462h764v-152h-764v-489h848v-152h-1174q-193 0 -358 87.5t-264 245.5t-99 351zM268 684q0 -154 76.5 -278t204 -191.5t278.5 -67.5h164v1113h-164q-112 0 -215 -46.5t-178.5 -124t-120.5 -184
|
||||
t-45 -221.5z" />
|
||||
<glyph glyph-name="oe" unicode="œ" horiz-adv-x="2154"
|
||||
d="M98 530q0 148 75 275.5t201.5 202.5t272.5 75q142 0 265 -71.5t198 -190.5q70 121 188 191.5t258 70.5q237 0 369.5 -165t132.5 -447h-866q18 -158 120.5 -258t256.5 -100q93 0 188.5 36.5t145.5 90.5l94 -101q-67 -73 -189.5 -118.5t-236.5 -45.5q-141 0 -264 72
|
||||
t-195 195q-75 -121 -199 -194t-266 -73q-109 0 -210.5 45t-175.5 119.5t-118.5 177t-44.5 213.5zM260 530q0 -170 114.5 -293.5t272.5 -123.5q157 0 271 123.5t114 293.5q0 83 -31 160t-83 133t-123 89.5t-148 33.5q-158 0 -272.5 -123.5t-114.5 -292.5zM1194 608h713
|
||||
q-16 150 -104 244t-240 94q-142 0 -244.5 -93t-124.5 -245z" />
|
||||
<glyph glyph-name="Ydieresis" unicode="Ÿ" horiz-adv-x="1374"
|
||||
d="M37 1407h199l452 -682l457 682h192l-565 -834v-573h-168v573zM397 1665q0 37 28 65.5t67 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28q-40 0 -67.5 27.5t-27.5 66.5zM791 1665q0 37 27.5 65.5t66.5 28.5q38 0 66 -28.5t28 -65.5q0 -38 -28 -66t-66 -28
|
||||
q-39 0 -66.5 27.5t-27.5 66.5z" />
|
||||
<glyph glyph-name="circumflex" unicode="ˆ" horiz-adv-x="815"
|
||||
d="M129 1180l205 280h143l209 -280h-119l-161 176l-160 -176h-117z" />
|
||||
<glyph glyph-name="tilde" unicode="˜" horiz-adv-x="923"
|
||||
d="M133 1188q31 244 197 244q41 0 80.5 -21t65.5 -47t58 -47t60 -21q79 0 102 140l95 -15q-31 -243 -197 -243q-41 0 -80.5 21t-65.5 46.5t-58 46.5t-60 21q-80 0 -103 -139z" />
|
||||
<glyph glyph-name="uni2000" unicode=" " horiz-adv-x="988"
|
||||
/>
|
||||
<glyph glyph-name="uni2001" unicode=" " horiz-adv-x="1976"
|
||||
/>
|
||||
<glyph glyph-name="uni2002" unicode=" " horiz-adv-x="988"
|
||||
/>
|
||||
<glyph glyph-name="uni2003" unicode=" " horiz-adv-x="1976"
|
||||
/>
|
||||
<glyph glyph-name="uni2004" unicode=" " horiz-adv-x="658"
|
||||
/>
|
||||
<glyph glyph-name="uni2005" unicode=" " horiz-adv-x="494"
|
||||
/>
|
||||
<glyph glyph-name="uni2006" unicode=" " horiz-adv-x="329"
|
||||
/>
|
||||
<glyph glyph-name="uni2007" unicode=" " horiz-adv-x="329"
|
||||
/>
|
||||
<glyph glyph-name="uni2008" unicode=" " horiz-adv-x="247"
|
||||
/>
|
||||
<glyph glyph-name="uni2009" unicode=" " horiz-adv-x="395"
|
||||
/>
|
||||
<glyph glyph-name="uni200A" unicode=" " horiz-adv-x="109"
|
||||
/>
|
||||
<glyph glyph-name="uni2010" unicode="‐" horiz-adv-x="759"
|
||||
d="M115 481v150h530v-150h-530z" />
|
||||
<glyph glyph-name="uni2011" unicode="‑" horiz-adv-x="759"
|
||||
d="M115 481v150h530v-150h-530z" />
|
||||
<glyph glyph-name="figuredash" unicode="‒" horiz-adv-x="759"
|
||||
d="M115 481v150h530v-150h-530z" />
|
||||
<glyph glyph-name="endash" unicode="–" horiz-adv-x="1181"
|
||||
d="M115 483v146h952v-146h-952z" />
|
||||
<glyph glyph-name="emdash" unicode="—" horiz-adv-x="1806"
|
||||
d="M115 483v146h1577v-146h-1577z" />
|
||||
<glyph glyph-name="quoteleft" unicode="‘" horiz-adv-x="540"
|
||||
d="M145 1073q0 62 33 126t125 179l76 -57q-82 -94 -107 -191q46 0 78.5 -33t32.5 -79q0 -44 -32.5 -76.5t-80.5 -32.5q-57 0 -91 46t-34 118z" />
|
||||
<glyph glyph-name="quoteright" unicode="’" horiz-adv-x="540"
|
||||
d="M158 1274q0 44 32 76t80 32q57 0 91 -45.5t34 -117.5q0 -62 -33 -127t-124 -179l-76 58q81 93 106 190q-45 0 -77.5 33.5t-32.5 79.5z" />
|
||||
<glyph glyph-name="quotedblleft" unicode="“" horiz-adv-x="950"
|
||||
d="M145 1073q0 62 33 126t125 179l76 -57q-82 -94 -107 -191q46 0 78.5 -33t32.5 -79q0 -44 -32.5 -76.5t-80.5 -32.5q-57 0 -91 46t-34 118zM555 1073q0 62 33 126t125 179l75 -57q-81 -93 -106 -191q46 0 78.5 -33t32.5 -79q0 -44 -32.5 -76.5t-80.5 -32.5q-57 0 -91 46
|
||||
t-34 118z" />
|
||||
<glyph glyph-name="quotedblright" unicode="”" horiz-adv-x="950"
|
||||
d="M158 1274q0 44 32 76t80 32q57 0 91 -45.5t34 -117.5q0 -62 -33 -127t-124 -179l-76 58q81 93 106 190q-45 0 -77.5 33.5t-32.5 79.5zM567 1274q0 44 32.5 76t80.5 32q57 0 91 -45.5t34 -117.5q0 -62 -33 -126.5t-125 -179.5l-76 58q83 95 107 190q-46 0 -78.5 33.5
|
||||
t-32.5 79.5z" />
|
||||
<glyph glyph-name="ellipsis" unicode="…" horiz-adv-x="1339"
|
||||
d="M150 88q0 44 33 76.5t79 32.5q44 0 76.5 -33t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5zM559 88q0 43 33 76t80 33q44 0 76 -33t32 -76q0 -46 -32 -79.5t-76 -33.5q-47 0 -80 33.5t-33 79.5zM969 88q0 44 32.5 76.5t79.5 32.5q44 0 76.5 -33
|
||||
t32.5 -76q0 -46 -32.5 -79.5t-76.5 -33.5q-47 0 -79.5 33.5t-32.5 79.5z" />
|
||||
<glyph glyph-name="uni202F" unicode=" " horiz-adv-x="395"
|
||||
/>
|
||||
<glyph glyph-name="uni205F" unicode=" " horiz-adv-x="494"
|
||||
/>
|
||||
<glyph glyph-name="Euro" unicode="€" horiz-adv-x="1392"
|
||||
d="M-49 483v138h160q-5 67 -5 84q0 49 11 120h-166v138h205q81 207 264.5 338t406.5 131q144 0 275 -56.5t231 -158.5l-108 -111q-78 84 -181.5 131t-216.5 47q-158 0 -292.5 -88.5t-204.5 -232.5h637v-138h-686q-13 -63 -13 -120q0 -43 6 -84h693v-138h-656
|
||||
q65 -159 206.5 -259.5t309.5 -100.5q113 0 216.5 47t181.5 131l108 -111q-101 -101 -232 -158t-274 -57q-232 0 -422.5 143.5t-263.5 364.5h-190z" />
|
||||
<glyph glyph-name="uni25FC" unicode="◼" horiz-adv-x="1054"
|
||||
d="M0 0v1055h1055v-1055h-1055z" />
|
||||
<hkern u1="/" u2="/" k="256" />
|
||||
<hkern u1="Y" u2="c" k="233" />
|
||||
<hkern u1="\" u2="\" k="256" />
|
||||
<hkern u1="\" u2="/" k="-143" />
|
||||
<hkern u1="Ý" u2="c" k="233" />
|
||||
<hkern u1="Ÿ" u2="c" k="233" />
|
||||
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
|
||||
g2="G"
|
||||
k="39" />
|
||||
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
|
||||
g2="T"
|
||||
k="127" />
|
||||
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
|
||||
g2="V"
|
||||
k="182" />
|
||||
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
|
||||
g2="W"
|
||||
k="82" />
|
||||
<hkern g1="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring"
|
||||
g2="Y,Yacute,Ydieresis"
|
||||
k="72" />
|
||||
<hkern g1="C,Ccedilla"
|
||||
g2="O,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE"
|
||||
k="31" />
|
||||
<hkern g1="D"
|
||||
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
|
||||
k="109" />
|
||||
<hkern g1="K"
|
||||
g2="O,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE"
|
||||
k="61" />
|
||||
<hkern g1="K"
|
||||
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
|
||||
k="-41" />
|
||||
<hkern g1="L"
|
||||
g2="T"
|
||||
k="55" />
|
||||
<hkern g1="L"
|
||||
g2="V"
|
||||
k="223" />
|
||||
<hkern g1="O,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash"
|
||||
g2="W"
|
||||
k="51" />
|
||||
<hkern g1="R"
|
||||
g2="Y,Yacute,Ydieresis"
|
||||
k="72" />
|
||||
<hkern g1="T"
|
||||
g2="O,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE"
|
||||
k="88" />
|
||||
<hkern g1="T"
|
||||
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
|
||||
k="143" />
|
||||
<hkern g1="V"
|
||||
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
|
||||
k="182" />
|
||||
<hkern g1="V"
|
||||
g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae"
|
||||
k="61" />
|
||||
<hkern g1="V"
|
||||
g2="c,ccedilla"
|
||||
k="139" />
|
||||
<hkern g1="V"
|
||||
g2="e,egrave,eacute,ecircumflex,edieresis"
|
||||
k="139" />
|
||||
<hkern g1="V"
|
||||
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
k="139" />
|
||||
<hkern g1="W"
|
||||
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
|
||||
k="82" />
|
||||
<hkern g1="W"
|
||||
g2="c,ccedilla"
|
||||
k="113" />
|
||||
<hkern g1="W"
|
||||
g2="e,egrave,eacute,ecircumflex,edieresis"
|
||||
k="113" />
|
||||
<hkern g1="W"
|
||||
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
k="113" />
|
||||
<hkern g1="Y,Yacute,Ydieresis"
|
||||
g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring,AE"
|
||||
k="72" />
|
||||
<hkern g1="Y,Yacute,Ydieresis"
|
||||
g2="e,egrave,eacute,ecircumflex,edieresis"
|
||||
k="233" />
|
||||
<hkern g1="Y,Yacute,Ydieresis"
|
||||
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
k="233" />
|
||||
<hkern g1="c,ccedilla"
|
||||
g2="V"
|
||||
k="139" />
|
||||
<hkern g1="c,ccedilla"
|
||||
g2="W"
|
||||
k="113" />
|
||||
<hkern g1="c,ccedilla"
|
||||
g2="Y,Yacute,Ydieresis"
|
||||
k="233" />
|
||||
<hkern g1="c,ccedilla"
|
||||
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
k="23" />
|
||||
<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis"
|
||||
g2="V"
|
||||
k="139" />
|
||||
<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis"
|
||||
g2="W"
|
||||
k="113" />
|
||||
<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis"
|
||||
g2="Y,Yacute,Ydieresis"
|
||||
k="233" />
|
||||
<hkern g1="e,ae,egrave,eacute,ecircumflex,edieresis"
|
||||
g2="w"
|
||||
k="51" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
g2="V"
|
||||
k="139" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
g2="W"
|
||||
k="113" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
g2="Y,Yacute,Ydieresis"
|
||||
k="233" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
g2="w"
|
||||
k="41" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
g2="v"
|
||||
k="41" />
|
||||
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
g2="y,yacute,ydieresis"
|
||||
k="41" />
|
||||
<hkern g1="r"
|
||||
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
k="35" />
|
||||
<hkern g1="v"
|
||||
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
k="41" />
|
||||
<hkern g1="v"
|
||||
g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring,ae"
|
||||
k="82" />
|
||||
<hkern g1="v"
|
||||
g2="d"
|
||||
k="39" />
|
||||
<hkern g1="v"
|
||||
g2="e,egrave,eacute,ecircumflex,edieresis"
|
||||
k="72" />
|
||||
<hkern g1="v"
|
||||
g2="comma"
|
||||
k="256" />
|
||||
<hkern g1="v"
|
||||
g2="period"
|
||||
k="256" />
|
||||
<hkern g1="w"
|
||||
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
k="41" />
|
||||
<hkern g1="w"
|
||||
g2="e,egrave,eacute,ecircumflex,edieresis"
|
||||
k="51" />
|
||||
<hkern g1="w"
|
||||
g2="comma"
|
||||
k="205" />
|
||||
<hkern g1="w"
|
||||
g2="period"
|
||||
k="205" />
|
||||
<hkern g1="y,yacute,ydieresis"
|
||||
g2="o,ograve,oacute,ocircumflex,otilde,odieresis,oslash"
|
||||
k="41" />
|
||||
<hkern g1="y,yacute,ydieresis"
|
||||
g2="e,egrave,eacute,ecircumflex,edieresis"
|
||||
k="47" />
|
||||
<hkern g1="y,yacute,ydieresis"
|
||||
g2="comma"
|
||||
k="256" />
|
||||
<hkern g1="y,yacute,ydieresis"
|
||||
g2="period"
|
||||
k="256" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 59 KiB |