New layout

This commit is contained in:
Felipe Martin 2020-01-12 20:26:01 +01:00
parent 440e7a3994
commit f6a070f084
Signed by: fmartingr
GPG Key ID: 716BC147715E716F
45 changed files with 661 additions and 758 deletions

7
.gitignore vendored
View File

@ -4,14 +4,12 @@ __pycache__
# node/bower
node_modules
bower_components
# emacs
*~
# static js
assets/static/js/app-min.js
assets/static/js/app.js
assets/static/js
assets/static/css
# Tests
@ -19,3 +17,6 @@ tests/venv
# Build
public
# Lektor
.lektor

View File

@ -1,36 +0,0 @@
image: archlinux/base:latest
variables:
POETRY_CACHE_DIR: "$CI_PROJECT_DIR/.cache/poetry"
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
before_script:
- pacman -Syu python-pip nodejs npm python2 base-devel --noconfirm
cache:
paths:
- .cache/pip
- .cache/poetry
stages:
- deploy
pages:
stage: deploy
script:
- pip install -r requirements.txt
- npm install
- make build
artifacts:
paths:
- public
only:
- master
pages_test:
stage: deploy
script:
- pip install requests
- python -m unittest tests.tests_deploy
only:
- master

View File

@ -1,16 +1,15 @@
setup:
poetry install
dev:
node_modules/gulp/bin/gulp.js sass
node_modules/gulp/bin/gulp.js js
npm install
build:
make dev
lektor build --prune --output-path ${PWD}/public
node_modules/gulp/bin/gulp.js sass
node_modules/gulp/bin/gulp.js js
lektor build --prune --output-path ${PWD}/public --buildstate-path ${PWD}/.lektor
watch:
node_modules/gulp/bin/gulp.js sass:watch
deploy_tests:
bash tests/run.sh
deploy:
make build
rsync -e ssh --info=progress2 -r ${PWD}/public/ pages.sites.town:~/public_html/fmartingr.com/

380
assets/pubkey.txt Normal file
View File

@ -0,0 +1,380 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFj2XD4BEADbtfrOIjvgn5fnG/Z8eUw348IG/ERiheyed7EnCjk6MGcCgkfGNs4IsefG
RUGZOvJXzXMlj56T3nmMMvFEJ5/T6Zbu+eNLSYJC8yfkMsfHoSTJ83RDeJ/PVtwE3KbijiyU
C6wm+Gxo63Ef9V5vv/IOMc5CEtG3rF94j+v4wACl8LDnqH3IZZlCNfkXXxACqsLTvCWJhHj1
r3GezBkBxiELCFcek1qISYoOdxZnpP804sk5IP8IYNXhdmxdsUbNQilLLA/Og+CmPcxzBN4n
3K4mWUfEDAwymkMkRC7PYimHdfu9pmJDV4S/4PwIOHElEOhseW7oOqe0PNnnm0mmVjcO04Uh
FK6TeBJJTnsSY1xVLi6Ni/K1F3/wnUV0e/fXNlItc9Qx69RXe3Gd1lUrreAWr3Z63h6gtzRv
xwBnTobemg3Xwm0XogtPtBhuaSxbt++YE1QRJ1jgW9ZcYevGrdMmSKyzFBL9w3blYcsMuZ4Z
PxxOWBWK6C+6Cfpaw5Wr9zPWnThpsS4Cw7iK/xX/U1IKZZJBk0FjRm9dbalvWG5YgFWAcabD
ZM735VPV27iL+9VxPL8rW1HQ8U4xfMtIyeEopEUq8N+4M0IQevm4lhFS/1hXLa91tBBPmV3E
jP9+q6GsQF0yjOokbLoMPD85f0w4cMASMA2HHSqrEJTpBaIDwwARAQABtCpGZWxpcGUgTWFy
dGluIEdhcmNpYSA8Zm1hcnRpbmdAcmVkaGF0LmNvbT6JAlQEEwEIAD4WIQT0na+XDN7rq/dE
P7Jxa8FHcV5xbwUCXg9QtQIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRBx
a8FHcV5xbyqRD/42B3JLD8M4f/iJpUBA4jPeLAr1UtJoIBGBGHHo+gl4ZQFoS9/hbpwZzsVp
FFoQyYuSUBZNpoX4o9HG5A57Rx1MFYihWe3asfEAw2h7Ym4JYfynpiLTEg/DlKHeYVpcl/I5
Xot16liIUaAGPBWh47i8DyTTfC+c2NC9pEC2cmXeciqz4vK3W19nw5c+gahQin33xK7gtrVe
/TRmdvf47nBcH/monkS3DFqZ1B0jY1bNDC7HqY+bYPUUpUDxXRMA+xiSiggwdMcDJlFEHj1s
mhEE57wLS7guFhUGvyffAoHyxhOvZgBDMgSeeVwWz4DMaA6cn9wolW3PTXV7EZLrxMN6RP+e
l5XFVgTd5tdJrzTVSdCawRFQJlVuUnax4MMNsBpniqDESzHQAk0On11MvtJ9Jddhls225jFR
WjX8t2CCrdH5m9ljPVH8zP0Xt28kq/1C5aWsw8N4vKOHejustUIiZ5OJ002Cn/HNh3wTkWz7
LPAQUHkWxbhesVqDcrHMsZ9GW+kN0NC6cIIxsJAwaZP7sSKPWxxEGsOL2kMod2DctteD0Ejx
9ylri3gpIqs/sNcz3fiONhvH8ceU8UWuBWrWdg8y2nNeC5x9/YmRlY9m0PdrKqP88hYSSRXz
gxNX2tzXd85HpaHOk2NBkR5LIDDYcEtn20ZlgX5TP95boTBRerQsRmVsaXBlIE1hcnRpbiAo
Zm1hcnRpbmdyKSA8bWVAZm1hcnRpbmdyLmNvbT6JAj4EEwECACgFAlj2XD4CGwMFCQlmAYAG
CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHFrwUdxXnFvwjAQAIL7yhaMA8euNWRTIKx/
ejqX6FwGmTNC0TXD+ud+QlwnR5EzfcJeYdm2dGZySuzM266kXoU5t/bH0b6b6CqboTnn2i7z
p4JMMxsHKUldD3MH9a+lOaTaVVTfmkmqe7YNAAUogh6tvLZ0uKAIs0dzWDPhkVNERjRRoFyS
bz4Ico++guPWVEpt3+KulLCuUMCN0jiiSIx5dp3wiQq5gBOtgFFaknV6Me55bgW9Gofqx+dN
OVDVghRKPmUebqaqQMHbVb1vwra6n0BLVt5QyybC+rLzDqg3LGYhdqqkCo4I6pljBXCv2vmp
nW8Nt6zU+4C4grD6SGdihiZ5zzOWpT7JBDyawYurLJWn513CFrdROZN7b8aJWWL1X1KT6mGr
zHMDvjXzcOvu7fh6LYicWuSNcTwryxd+msPpJO906P+IpJiif83RynTBcHN3XHzEtER3r303
Lv6oDKUWCSLYjhsVY5eI3X7Krz5PCYS1HCl7drazNahz3x0r3EVX96xlPEtOHfdhyzXpgw8i
qrZmyEwpdUJEAMKdvWnXdM3O+VlKp4kcV3Zn0+uCJwpxI88plPTIEoZi3CfuvmkGoWr8g4qh
rnRPR/GUzIkqJWXi2B2Fjc+DGYGV093GUWZmR7920ZwndsWz9tfwSOYhn5aLHXeyr1I1mTAo
PFaWglQ4A5PDxJMHiQJYBBMBCABCAhsDBQkJZgGABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIX
gBYhBPSdr5cM3uur90Q/snFrwUdxXnFvBQJeD1DMAhkBAAoJEHFrwUdxXnFvVz0P+QFq1OIx
Th8E4Q+4TFr5fhHn8D5crC+OYTwJISSMQgnqGJI3FL70C0GNlIPpfnS04c0WAMMgm4Qmaimx
ycc9Oe+hCRHig7ubARhhBKhJRqs5IOPpyW/NhylBZrVJhE9FCdj82XEi0a64JEiFMhaFOHiN
F9Wb3t6TjG4A6Uo5c/c/gNdS71GLzb9+4QVPxbvDm1cn7kmxcZC5ykhiQ/BRFk/vON2/4NgI
ExKF3DeHJm8BCLM9BRf6gUwDr/wLekJVmNSrdm+h8gNn9zCpS7IGJokZpA8oqWdhAcg8/puS
xuho2lieLuqW5Db7p0okFNi+7Zh7n7IqWFdq7mt3zf/5CMT8kNRyOMYcVyPyqbcmqzZGxeph
1El+6nD5hDOguh3UMa7Lt5QZp78Lagtpv+aI4rDf+IX1hkda5aYbcOWjxRk/zTI2kxjyj22q
NTs4vuuEC3BZJOckLl4lojGs68sizSAaPC3GQigd82BUy401sk0RtRveTladm62JOqynERdo
Tjm7sasn38ZNy7g9elgJltMkAHYNEKWcfQgTRlVcSUzlZrIDMnjJn/xT+alaOtE8qQM1aekO
DSEM1ps8KhpYxuLZcjkbHrFJnMeqnakII4uSdaDW0A4R7jnVaPdOqrgrJdwVT7gEVoXsx3Z1
paT7m5L3HBKO+PoTzTbdiwhx9O8O0f8AABK90fsBEAABAQAAAAAAAAAAAAAAAP/Y/+AAEEpG
SUYAAQEAAAEAAQAA/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQu
JyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAhwCHAwEi
AAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMF
BQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYn
KCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SV
lpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz
9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQH
BQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBka
JicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKT
lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz
9PX29/j5+v/aAAwDAQACEQMRAD8A9qspGht1RxjjkelRTclhu/GlaRS20EE+gqMsJGwR8o7+
tdUYqOxyuTluc9D4U+3Xs8s7BISuQqNgsc9xik/4Re1vL1pp3kdI+AN2MAdB9K6kgRFZD0NY
Wu65Dp8TrJ5geTkbMDIzyM07vVjaWiOd8bXtvbaXBZRxOSMqGJ+6B2OfwNeWXO2SZ5gqKS2S
iDA/D0rrfFOqpqdwvlReXGBxlsk8dT71x985jgcjaSgOCBWc3zFQXKV5ZG2hQqDIxnI6VVZc
HofrWVI7sxLMST70kVzLC25HIP1rN0zVM1wmc8gYHQ96sCCNxlVC5HPNV9PvIblwkuFk7E9D
XQR2BkXOAF9qwneO5pFXMpbLygfLO4nJ3DsKY6FGwRwew7V0hs440VBxkfexmq0umeXcCOQg
FhkY5FZc5fKY5yx+UbV9AKlhtjMHldXEEXLlRyfYf54q6LcHzGICovBYLwP8TVe4m3bIV3JB
kgY4J+tUtSWiB7x5JN20AAbUQdEHoKiILAZHSpjaSRAl42X3YYqQBoXLZzt44PT6UwKm0AdK
KncE5ZelFAHuOiXsKSNZTylLluTubIf6Gt0YIBXGO2K8wuriQQrKFEsaAMsndAfeus8M+IIb
23S0mZUmXhcnAb6V3wqN7nLUh1Rv3DSm3YIRkf3jgCvPNXuY3MsUrG5bosjtwvrium1rWlDG
3tyGGcEj+I+n0rnbm0haMF4nluXy2EOD9fpSnUS0CEHuzkr5ETGzLDuSayriLzY3iK4De3Nd
fbaJK2om2KK8irvOW+RR7+prOvdOmbZK0WzHyucYII/pWLmaKJ5rMhjkZGGGU4NQNXUeJtIa
JFvo1BQYWQqD17H+n5VyrGtFLmVwtYTcVOQcEV3Xg/W4Z/8AQrxv3gGYmJ+97GuFRHlcKikk
9hU5hurF1lwykHIZexqJKMtGaRutUewXYtXiRlfywCWdZCAFz3HsfpWLcbBjDPhjsGIznPbA
OM57etYmm6z9uSGORdpXIxEwjDHBIBwM5J44I7ces9petb21vIotlcuQX3FSMHlXGOTjHc9i
Oc1rHCUlrui6VT2q5LWl+Hl8vxLl9HFJHDBZ3YYjhYuMu3rwSee2QBWA7tJKTzvB5B6g/Sti
SVGlaG1SG1iwxZZRIhZRk5yvUEevc4qpJZw3FlHcWuxZTxhMgMcZK4JPPX6/iMzVw0Y6w2Kg
1VSja01uvT7/AMxlvqEu9fN/exgEFGORjpWrDd2iabdQC3BuWceUxUEhO/PY++K52GVSDu5w
Og4qe3ungk84qjfKV57e/wBa5ldaMyZaYD95C0qq27I52iis152clhnjufSipGX18QXxhEDT
AxA52bRj8fWtzR7xJj5xYh0x8o7muHDGul8L4a6LMSEUfMeuK3b0IS1PQLCAyH7TcMeeAv8A
SrIlRJijkNjkY6r9KyXu5o1OQDlf3QHQ+lYs+omKYF2LTN1PQ/jjtWN2zS1joL6WSxsZEtVJ
aZt0k5OWI7VDa2872qGaJgkpwCDgk07Tbw3CbZTuD87T0PvXQ2dsbmcohDnbiMtwqiolOysU
oXZxerXNvHbtpcVs1xcTqFaPGce5PauGudFVdSexkgRe6XEDlk/M9fSvdYPDEWn6fLHcMklx
cKRNKiYLZ7Z64rj9S0C0j1GC0jcI8pOHk5CgdWx34H51tTqU9KcNZMmVKok6s7KCOEawtbFF
UMq5HX1qvKVIK5DKR0q7q3hu1N05F25JY4XeGOB37VlDRru3j86CeO5st2C6P909gR2PsM05
UGru+xNLHU5tJdSiyfYbjcBmB+CPSty3uJnzNb7JJ2GJFbqSPuyAZ68nnnnOetZ93atGmyQh
gw7HpUWnTbd8EgDMFK/N3BrShVtox1qbi1OGjOisSoK25kknWT91OpO4IzDIK/kQfpn0qpPN
NYmI/wCj+fC3lqcKWwPutjr+ft61TPyA7GdMjBCMRkehxUHyr0ArVVdGrGkqnvKcdH1/Qadw
OQeauI6Pb4AO5iA4FUHmVQec/SmQzky9doIxXPON0ZJmi9qUyc4XHeilSQyRkHLpxuPeisCh
lnaJKZMyIAFJBY4/Ae9a1hL9kc5JTy1yABnis/ToBLyZY0ABJDnGQO31qxLMWJdAGcADYvXj
ire409DpbfV4Wt8yMAh6q3GPcf4VWmjge782O4EykZOOtcmsjO/P1xWnaAswz27VNrDvc7rR
kiYh2A4+4M8j61o30y29tJJFeJA8PzLuOMt/dHrXOWep/ZLXLZZgduM81LJoss8Bn1W1ubea
QfuZS3yJ6A//AF+awnbqdOHpylL3TqtB8SPqdu1penZdxDcGHRx6iud8XwyX87NbvskCBAT6
d8frV3w7Y2rgWt98s8Z/dsGxkex710kOm2l080LruCPhT3HFYKbp1OaJ3ShCpTcZnj0WntBJ
Kl95ckJUoI+SSOxB7evelW4mhUWEK+RbSqVKhcH8/f8AM969Yn8G2bS7ypJqGfwrbuEVol+U
5BxW9TGSl8SOWngqUHeLPF5opYm2ykso+Ugnr6H61mXKPazpNjocEV69r3g1QvmQLuQj5x3H
vXAazpJhspExlox19a0p1lI2qYWU6bkuhkyXIxxzmqrzM9QwSZTy26jofatnS9OjmgkuZyxC
DKoFzn3x+f5Guq6POo0J1p8kTIx680mSrKR2NdNYm0ujJZv5ZznyyTkMQM7T6ZHQjGDXPTxC
G6kjDbgjkA+o9a3qUHCKle6ZyKqvaypPeJZjZkJ5IBoqJizNksT9TRXE0bFqO6cSZAA7YHSp
i5knLqNpJzx61EIcDpViFDuCkUNjRbijjuuHKxT9n/hb6+h96sCN7dtkyFGXtUccSqm5jwPW
qmq6hI1ukAY7F+6cc/TPp7VK1L2NW1We6n/0c8hgFO7qa9M8Of2iLc2eoRlnxhg/II968g0P
WpNOuI2AHB4Jr0tvHlq8EcyjEmMEk9T/AJzXPXjP7KOvDzjFasq+LbGTSriBreQKrPmNQeUP
cD2rrtNt54I0lkB3SKGYehxXnmreIU1TVYZnAIiA47GuusfEiyyLFKw+6PwrCcZcqOiNROTd
zp3mbHXpUMlww6/pVU3sJGVdcdetZ1zr9pAv3iz54ArL3marlW5tEjaS3TvmvKfGcsUepiOA
gxsMkDsfSt+88QzXkbLGwVTn5R1x6mubGkT6jO6QplQPnkI75roox5HzSIlWltDqcTqdqtvd
iWH7jYJHpmuk0VrabRhB5/k3BO3OBhsFjtyeBkMcH6+lS6p4L1UqGto/tOcgqn3hj271zGbz
TZ3jdJIJhw8ciY/MGu2E1NaMxp1Pqtfna0Zc8sacZVEu1mU7hkEjtzj/ACTWRI5llZwMbjnm
nyyySkl2z3wBgZ+gqOKNpZQgz7/SuuVZuCj0R5tSFN1XOCtclBIOcHpRUrIyEgcr6UVzXuKx
rRKHxiu80/4Z31xYrNNdw28rjcsTKTj/AHiOn61wEU211VMbs/WvVbT4gaLeadbDU2eKdRyV
QsCRwcEZrCv7SKXKa01F7nDa/oepaG5jvLdlGfllXlH+hrmWDSq2U+ma+g7HxToeqjyIbyF9
3BilHX8DVk6BojP5n9jaaWPOfsqf4VksVbSS1LdBvZnzXKpwvy9qQSyou3dx79q+l20PR5EK
Po+nlT2+yp/hXNa18MNA1VGa0R9PuD91oiWTPup/oRVxxUXuhOjJHiUF0wI56ck+tbFjq0kY
aTPfqTyaztd0G+8O6pLYXseHToy/ddezD2rM81lxya2cVJaERm4naHX5jCFWTBJG5s9R6VGm
qhS75LO3GSev+FcnHM2AQfmq1ah5Jgq5b6VLppGqqtnbaLC15dIgAI6kkZwK9Bt1t4bVrO2Q
GZsA7V4GfU1xeg30GhXFql1GRC4JkfGTnt+HWuzPiXRQnyarapgZw7DiuCs235HpUUoq73Ir
LQVuUlGpF1vIWK+YrcEHkYH+elcN8TLcW9pYC5kSS7V3RJP4niwDz9DWn4h+KVrZB4tJCXdy
esxBEa/1Y/pXlWp6ze6zetd307TTN3PQD0A7CtsPRlzKb0MMTiE4uG/6FcknpWjDbG2gDvkM
3Lc84pmmwqJBNMucfdUn9av3RjltUbYwdT83PUGuuc9eU81Ip71dCCu49eKKrKzI25cge9FL
lfQLlx54beP9xMgb3IH9apS6tK6OhSMljlmGck+vWp4tNSPk/MfpT3hVOQtdLRmRQ3ksqKWJ
DL0bcc16B4O+JMmnFbDWXeW36JOeSn19R7153JKRx2FVHlJbJNY1KUZqzLhNxeh9V2Wo2Wow
rNaXEcqMMgqwNWyABk18r6fqV3ZOGs7uWFv9h8V0X/CW+J3g8v8AtOYqe4Az/KuKWGktmdUa
yfQ6z4tz2dze6fGjBriJGEm3nAOMA/rXmEkKhWJHPpWi8F3cP5km52JyWY5JPvTBazSyBNjF
j6CumnaEbXMJqUpXsZsUDvIqLkk9q7rwv4cMQ+0XKY7gGrvh7wosTrdXS5YcqCOldHeOsEJC
AcCuatXv7sTtw+Ht70jmvFEsaxjYvzKMCvMLy4aS5f5u9dZ4jv5C7IpwTwAK5eO3hAZ5mJbs
o7mtqEeWN2Y4mpzSsiOCNnyTnb61bhWNcAAL6tVYuzADPA6CpNrqoJOQa3ZzJljzSgKqxxnv
VsXYkibcF3enQCqax7Ytzg8/dNIi54zg9qlxTAnYKy5Ve/PtRTFORjjA70VQj03xV4SEVi2r
aYim3jfyp0M3mSBu7uRwDyBgVwMkRzyNv4167YWcfhM3sepXjfYdQzFFbNESzrnAdv7vB+tc
V4s8JjQb8KjyS2kqh4Zsghx+HeuhdjNnFTwk5+6azpoSD0Nb0lmvZzVSS0cdifpSaC5jBGzw
cGt3R9ZS0cJfQtLEf4l+8P8AGqLwMO1R7COo4qJQUlZlxk4u6PUtLttN1lAdPuY5SBkp0cfU
Hmt6z8NxwsHeMFh0JHSvEYneCVZYZHikU5VlJBH4iuz0f4m6xpyrFfIl/COMv8r/APfQ6/iD
XDVw0/sM7qeKj9tHpxtmA2qOBWbfWZETbugFRad8SPDl8AJ3ls5D1EqZXP1XP64q5qGvaFPZ
s0eq2bccYlGfy61wunUi9Ud0KtOS0Z4/q4W71GZYn+eNioQ/xfSsVwVYg8EdjU1+x+3zOrZD
OWUjvk05roXSKlxhZRwJMdf97/GvYjGySPFm7ybKqn5utXrGBbmY7shFGaoyI0T7XXBrX09o
4bQzMep6UyRt5CcAgYHQDPQVTCHk1ae73b96/Mehqu7DaCpz60gJbfy/+WnIPaiq5+cZHSin
YD3HSr7SvE62/huSW8aBGLxXEqr5nA+7nnAxn1qTxDo+pXOmPpdloqra2gOyaa73soHOVG4A
Z+lFFbbMjoeXPbv3x+FVpLY/3jRRVsSKzxsvXmq0irjuKKKkorMhHpTCcDpRRUjEynoacrAn
AzRRSAScYVGBPpVZunvRRUsCSO4+XypQXj7eq/T/AAqYBolCg7kc7lP/ANaiigYO2RgdB1pv
O3I6UUUkA8MpOBkLRRRTA//ZiQJUBBMBCAA+FiEE9J2vlwze66v3RD+ycWvBR3FecW8FAl4P
VigCGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQcWvBR3FecW/anA/6Ar/S
clVW45egAbHF4VeaLAktzuwlTW9zL2f8plCmbVibR/dXt6xSI86FaOb1JJBbE7JzFOc3fUrG
Pmu6s+vTmTmiBkPjyBlKl29mSzulVxDW7gOwVqwMsMWHo0flCG5mHY1cY/tTPTEhDoEQpsjW
L266IbNAvIyvylDmAtjvm2zyP6ZWzWRpMYlb2tuxgJAZbC8YG+NIA7zbTqZfuh0+IcHnpprF
x9YewNvFrhqQOQpZy5eUVHrWCvf0H/nbWjE89c3pY2qbjIKbF1v1luJcRBfyc1cBOIPsvQcr
krawEkEl/XPBo7KLLkTtnzxOhmYDalinsw8hrxFr8K1nIN5lDKC5vRzIwWEWKdFAUY9R4wz1
OZsXT3mxlNseVnmuYmihgzPsqaRZ0J4Og2j/dS+5NvoNU5Fysy+e36mvoZja9EfvCiZUI7NW
UalRx2zwPa7D7JR0mK2F4f80RJubn01fcFoiUMKRjXtbWoAH+w926AMzl8mVoXBJfCM+hcsu
qQ9ArTLPc/ibXxFqxCMBFBGeiIywyU+7SQWKhx99yuohk4BTMpXFEnjuiSxsQvz/KzeUQAZb
9mz3YIkhhxab+BLJnVtjvL1MvngxkPzO57xx5sq/hL+GQZP2SpgXpsmNu26oUquqmQk+rg8F
QgAXjB7o+aKZXneXovFvDPCA/8tLalLR/wAAIXP/AAAhbgEQAAEBAAAAAAAAAAAAAAAA/9j/
4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAA
A6ABAAMAAAABAAEAAKACAAQAAAABAAAA+qADAAQAAAABAAAA+gAAAAD/7QA4UGhvdG9zaG9w
IDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8IAEQgA+gD6
AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAMCBAEFAAYHCAkKC//EAMMQAAEDAwIE
AwQGBAcGBAgGcwECAAMRBBIhBTETIhAGQVEyFGFxIweBIJFCFaFSM7EkYjAWwXLRQ5I0ggjh
U0AlYxc18JNzolBEsoPxJlQ2ZJR0wmDShKMYcOInRTdls1V1pJXDhfLTRnaA40dWZrQJChka
KCkqODk6SElKV1hZWmdoaWp3eHl6hoeIiYqQlpeYmZqgpaanqKmqsLW2t7i5usDExcbHyMnK
0NTV1tfY2drg5OXm5+jp6vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAQIAAwQFBgcI
CQoL/8QAwxEAAgIBAwMDAgMFAgUCBASHAQACEQMQEiEEIDFBEwUwIjJRFEAGMyNhQhVxUjSB
UCSRoUOxFgdiNVPw0SVgwUThcvEXgmM2cCZFVJInotIICQoYGRooKSo3ODk6RkdISUpVVldY
WVpkZWZnaGlqc3R1dnd4eXqAg4SFhoeIiYqQk5SVlpeYmZqgo6SlpqeoqaqwsrO0tba3uLm6
wMLDxMXGx8jJytDT1NXW19jZ2uDi4+Tl5ufo6ery8/T19vf4+fr/2wBDAAwMDAwMDBQMDBQd
FBQUHScdHR0dJzEnJycnJzE7MTExMTExOzs7Ozs7OztHR0dHR0dTU1NTU11dXV1dXV1dXV3/
2wBDAQ4PDxgWGCgWFihhQjZCYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh
YWFhYWFhYWFhYWFhYWH/2gAMAwEAAhEDEQAAAegOFTLAioZakz4oNM7dQQ0pH1cCJWSjQjao
nSDpyxCUXRFiIqYyqjSWkoRNSlWqNMV2sCXtlOSqMqwhS1BX1DUiARs3TSo2iJDtJE/kbxGE
QmUtodgoeXJkgWgiJcDpC8mohaa6CwrFaJYxCmWGjtrTRqoasIZYEFi/bxbxsaImKm1qVA9K
loUNgpUStqaDNkwpFk7ZYFg1EUyBSsVoLQ1YWHOP2V2ySsFTVzALRTsImMux1Rot6tgPYkR5
5lZu+YL0zfSFTs6CIlLbLKmrRYVplJEIWmNFSocuHrurswXBxJUrloWoA8mhSdpTRrdMdcmh
ZaZ7GQ1XErc0CURo71yUVqu2W3WiyjTCk0CKlGIKI9lsFW1a8BOIkCb4RzOztnClwVg7VyNH
TNdANW4evgKNZ1Zmko8+kBMJkcxoK6IRSkxFSUKxGkalMOGxTKIlAnKmCqey0cU/M3ErOGC4
GlsBRE0qwXbZ0rQ3E1VAuWZmAXg2UMDI+MbOZm2eZ8mSkrzeVIwiuWqoqiNSCFQJRhyCZzXO
Q74Fm3XZS6W1CvlCUBo0RwiSDUsb2h0euU4a6ch3oHN1MHrInT57aY2GitErTKtUqhYOcCUD
Ic2NZW1Dco7srIKaM72isWV7hqR5iIqZbNyF07xvogmtgyaz+sUZw3TmSJSQJomRG0qEldgQ
NWjI3IhC0mgoop0lvILpxXrBtj1KleybM1wNgGiV6oyaNgrsA1LTdVzWuIdG0yk8QtkEQIzh
vmuxDWOcNHlY/PVGq7xFG16aTcQjtuada+UwwLhSIuHMXFnXu01t5QrLQuY0jJa87G2ykw3M
st3LcUEDJlkwWBxtop46rVqevccZ0OWlloUphBAm45B0b4iyojja0V1hesctWLZbfXFUpKyp
XChSocU5HECyVwYJD5wGVppMQkWydTx9UFRrRiNYIpKlgIpbNWQ5UPLYNe6rXRvCla4piNUz
MVMqSLbTUxtV7U9C1cUySJgJBkRDBEiQSNVm6on2ej9RXuejYhoVgIdDjXVNrVa4jgwdMomJ
pRBO4jC5DSMqKUQU1bXM07Bu16TnyAoOmgJOkEOJFI04UO2mB6Gx42Ufs0c0dHLSvGmmaiAz
JsRFEctV1MIiKoiITpiuld87fNIqusrYc7BUmEksCFC0RSlUUnTAomIpWTqWmdSImBQUWoky
mlJ2raU0qU6v/9oACAEBAAEFAk91OmoQpLKFKKIylzcFY0+/TtT7wFWT94adywlNVMBlzE1L
PbT+cpVqGI/nahrpVn7gUxr3AdHR07+y+P38h9zychoas9lcPuVaVVdOxD07HUnp74PgfuIp
91VS6pDpVntx+/Eqr0ahR07AUZBHerCqiHiTUjsepokLGvdZZ746NY+8DRpXkMqMqq9S6qBr
qfu8A8j2yccnZanxegBGTHHXKjKdCKH7qVEOuRJPMOTKn9IxkQpNOx7FRPdJDUQTWjRIaVYZ
1ZViEDAFWTLAc0elD2CS6OjIo0l+0/bfQ6dKa06u4+8k17JT24Pi1klivbg1LyMgXGQMmR9z
gwWdGmgCelVKKpTvXR0+4Gl1ZVR1NavQtICXxahzFcsIQUl0o1KU6lhXcaNNXqXkWSo/dr90
MPgzxJowx2Tq0xISy1tABZAdAzDVgMhlg/er9yp7UYYLqzp2AaR2KylolCmXL7KlEOrUirSp
KGo61ZY0P83pTgyWFMSB1B7B1o1KQBqGleSVspFcUh8WoF0qKdiwdPvD7g1Z+6NGC1K15JpG
+W6amNmJ8plD5bUijx1UGO4QxRrT2HcOopV0+7XREILKFIdGiSr/ADdqOnZSQpqS1DQsNLVV
11r0fcqwWe2inw+4hRqktaXXUasfeWKhR1UnRx6tYVWlGf5oEFkYurSxGKJDVoPaUAKfeXIz
qfItJoQSyyf5tR7JXRxyihkapNEmhzYPerK2VFl8Xy1Mgj7w/mKs9wp5PJgvJhTzZW86s9qE
tMdBo6pLXbpKe/H7yLdSmq1UGdP5gMF1eXYF1qxxSGVClCleKS8cVL9vtTT7iKZMKLUhC2q0
fui37oX7mWq1lDNR3q6urq6sONLxYSAzqHNcJHdIZ76d0XFB7xGxKg/eUlKxPAYvvoDyxUJE
F1S1Sxock6l9wHXSun3KgPR1dWidSGiQLH3FDJJGv3EirSmjWGovLvR0+4R3qzTuOyFqQY7h
KnUHutYSDx7pTVoRTsstX8wD9yjo6feTKtLF0pm7LVIpf3AmrQinZTUWXR8P5qn81R4vF0aU
VaUU7Fqau1fu0+9JCEj+YBo0YqeLxYSwn7imr7wDP3A8WiWPO5ixP8yidSWiSNbxdHR0ZDm0
SFMp/m6tcShIQVRyRYGjo6fzCJ5ENN0gsFKuxdxwYJDPV3T2qz91GKk1WiReEsf85WjE8ofv
UjVIpf3OLo0sn74VFEUxolZnxaypR7UdP5w/cq6fzNrwoHdez/Pn7qeH3//aAAgBAxEBPwG+
wfth+jGQJpIPowIkO4hA7trKLjLIbTuix5HP0rJPDdO5KeOWJFUUdo7Nr6JBu2Mb5CAkfT8a
GALsaZR0jElMqNHvi+UdhIpIcQ+1zRs898ToNSUlkwybWZv6Fttt6AJLMfl3U7Xa12R0JpJv
utB7YjQn6QLy0iOkj9QS7J/WE0ZAyNn9n//aAAgBAhEBPwGuw/XPafoA/QL7ZRAeqYfk13Xr
aDpaJaXfCQ12HW0cvAfLt0GhOhGp7L0/o3Wg7D9ETLuRJvXZxfedCOyOsDx3yaTrSEHS+y+2
mmtCdIHQ6U0W3cXciXZLQC0Cko7CExrtJ0A+kYh4bTLSP1DHsh9Wk432yxFfs/8A/9oACAEB
AAY/AvuaOvarq9OP+oaDh/PfD/UNB/PZEvT/AFdp/Pa96PX+e11/m6F0P3OIq6/cofu6Oh+5
p96v3/Xt5n5P0Po8U6uqz9j0/mqHtQd+kOg4uh70+9o9Rq6I0dKPE+b9Hxr8HUcPua96Vena
jp2r2yP3Mv5j4h1HHzdKMlLyDUV/zWn39e1EvUvL71Q8k8C8lB4unkXT+bp97J4vp4/zOho9
Xwep/m6dq/zOZ4+T1eoD6DX/AFFq6H+axDo6g6On6nV0/nvj31+9rxeSe9f9V0DrWvbR0en8
5q/j96lO1R96qi/UOqXT+cr6dxl/M/H7+SXo6/zer+Dr/N0V3o6/zlfuU4h6fzlO+vev83Q/
74OpLyi/D+aqdH0mrof9Q6PLtoz/ADAr36g+lT4h+0H7T9Xr/NUP3KJ496/f6u2h+9RQdRw/
mAe/Gr9B92n3Ne3HTvq6j7pSXT/VVR92v+reL1fB1P8Av1qTVX++Cg/F5+R/mtdf5mo/nMA8
F8XT+c6tH0n7ujr/ADdUcXU8Xl5/z3Htr/PdJL5h1dEJo8j/AKkof5o9h/qU/wAx/8QAMxAB
AAMAAgICAgIDAQEAAAILAREAITFBUWFxgZGhscHw0RDh8SAwQFBgcICQoLDA0OD/2gAIAQEA
AT8hcXkrdG1WbUXzVDwvVZk0dnq4IPl/zOKpEH/4CG5qd0ht+f8AmHzZ/wCI4KfrfuqRB/yP
+iEWa3RFFJL5G3uea0JOuayfbj/jVzuz5X7sN7vf/CLEvixY/wCRRKCt0nb5/wCxY/8AwrQs
WYLOZQRlVrwXiruqv/UKigCx4srccVVHeMjbHg1s/buw8LH/ADe7KkeP+TXiLxzfbSsUvmvo
/wCy3k//AAiKeGlBG1DXungpMyXgF6DL/FZmFTmo6voyhu2E5sZP/NNYvv8A/BxTLopBTxcN
a4qQx/8AhGKf69x0TcRzZdE31h8tAL6l84PNf+g8Hw1CpiYyazRRJ/zKaGd5VCf+ukUqv3Xa
rX/On/8AiRSWEYV3FVyD/Pf+rJiYeDFlo+RdlYmxxNxA/DbCfGkJ7/4MNmGL2ebMN+KsmlU5
/wBj+0qzg4ryDLI6KTBNIHyVU7UYPDWZdf8A4Im8VHUWIMj/ABUAJGFcAMRx5/F4o5H790Hh
H4Fc5IclfYFKji7z/wA1N2qJwLPslFWmrJhRB6olD8UsOWyHZSUxYpL/AMGw5vrf+K5ygKh5
vW4smVYz83s80HocP9qpdH3NIuTP5jukTDmIaCAQJ+/+DN8GtP8Ak0bIhs9UFfFNZWNHNzOq
ZZdM6WQMlUP22MyUiIh/VArFbzUnVzmKFanAn8WakHBN09HSjUi/wf8AlZHw/wCkvam/8R/y
a42k/N8FAy2CUzPFPPG43QaE5fVVA4ctey+dgaTcd+i8Li++yY2a6VShsSyfBryOWhARU7by
p8WP+zFNWeVsP/dsVgSsPvddh1elzVX1cSO6H1uiEr2/8QBaU+hWhVYHJ5oaj3ytgae7Mf8A
4Zr/AMCXn/8AAAGd3CiiXCxt7rJpYjagJxeJf+J4LqkTzWcL83Hs0Dx/b5q8UD0XlLiiMq/6
SVf/AMA5RSzcfm8cVEoqmXCKAw6VVJlJcrDisE1SbVJeygTUtVT3Wq8KDkrQ+ViSn/gn/wDI
zS6RUMQVQLNKVtAX2BqFTltIsuLxK9tI0hRSKZyyIbisqoa/8U5Jf0Vhhc+DLDIkDfSf8xx/
3F/slIZWX/ApSvVSci+LpFIPqpaVbKhYf8wH/Ej+v+AQxeF7/wCTYg9WLQ2BowfH/D/urDUL
lFNLHBlQqGm3qzNNcpfWNUT7XitWbNmz/wA4Dm8TxZJFMYpJHDGzksKjouJ63/hze/8ApY/4
X+RK/wAPNetE47sP2oFQje0ygIXP/wABVDmgcWaXMUOy63Xdhz9bVGCDy2TD/hY/5H/Sh/xY
8KMP/ACgG3h/8ALKLZs2BzRNLEl7olmwuCrcViCH/kpx/wDgGTdLJ/yLFLMVoTQvDUq2sssF
3hYqNsvFlguMoq+b1aN2G3yz5rbq/wDwAlFzix3/AMLFIki0CQ9KFdlWk/8AH/kvFGKrpB/y
QIo+/wDrTxYy4GrHrhsTij8ZsSHiX/pD/gbNL6JN6ytYaT+7ui7+b/meej1C6IfShIEf8mkN
/wCJf9FeBeWw9FwinC9eigrz/D/vasgmtH/oaZnXujd/8kkeP/w75VTkff8A+A4/4WRs+kKb
zZ+6bsni5/0Fn/k2tlizVS/9hoR18Ui4ZdNQOV7Fe7Fmx/8AhPvFgXhYsf8AXVjXabCVVn/g
mwKO7RlvLn/4CJ0fmp9/9+X/AFSbDjTgf9RqqU+f+NipfMa4f8H/AND/AIJZ/wCQWdvPFilB
/wCIs2bP/OGo/Cp4pCW73/yNruKJi8VXw1y0bSps/wDCpHP/AOHGWP8AjX/s0Sh/+CzrKh/w
v+X/AMyQf9I/4Ys3i5/zLsS9ef8AmXa1/wDwPSxHf/wSJ/xqU5QzP/4p9vgf/hQ80kLnvzQh
f+lYuf8AGKlj/vFwsvdzRh8P/wCIBSWDHSyHKf8A4TiKwFT/AKMf88iXqjopF07/AMttRY//
AAxcgZPDckz/AFTJB+LFFH7/APHZqGHP/RLeC8tq6r/+CY+2616p1zjA4qIx/wBywWLFj/8A
CLRlzSfzt8kf8ykP/J8WTLjVDtUNk/5Nnz/+CeOaFo/dLOh5rUdf+RX/APANj/8AME/DWGlm
X/8AAf8AIKf8PZF/a/8AwNf/AMT/APh4f/iB/wAaf/g//9oADAMBAAIRAxEAABBQVZaCo2ps
TDhTBQQ2APGp0bN8+4zjTRQdqqFd4pEQS4IhvLnrLWzLHG4e4RTOk8vs2fMLHPPSN63OaOBU
RvR0mkq7JDkTQlAafNm7YeaQXP2UsuECC+b5ByeWt0uahANUMKae71anGSSormEMj0QBJ+Qt
JS4Cg2+JtZPARBNdgIdDw0jISrLLjkxBOsAd3eZCirWOuyS7AXyhNZZjPy7EoduTIWkABQzh
VXyht4HhYusFj2Hik0sIAuMdVO+8tcP/xAAzEQEBAQADAAECBQUBAQABAQkBABEhMRBBUWEg
cfCRgaGx0cHh8TBAUGBwgJCgsMDQ4P/aAAgBAxEBPxB2+Zx+Nn48iXIfwllnj+AzBsWWejly
Lblyh+9zIxnhz8OlhJdQSQL14Fd+b6nfVudT3By/f+E9yXCOOcR0MCGxVmVDQY+b5kMs8I0a
XUemzYS4ObL8Qzb4RvBIzLkPVc586WP3j8CN5lxjPnJHY2JWHuzbB58zgjmPwZbBKdy8HwRb
mF8y17+DGXzfBC84dsIDsjMfwBtH5ktiRKLbbY/LaxDNn8P4BHVr4+6s4E/h/wDBJ1bt+4MO
LD8b+Dcj+Yx6gsnzn4+vxCnUp3fIj0Pxn/4H/9oACAECEQE/EDMW8+8s8W238XVkcwmPE2GT
b4PmeanNtuTbD6NMhzbqQyOLct48IcmbcrM0Nlzyx+U8iRlq4hJm/jBrLB5kVpKIcnvFoPES
ceYdebLYfG0Ry82GYnobuX4j5k+Ydk9wOPYcvV8E+P4NZb9LLmGctlsN87czZ9fAgwo76aiE
Emw8yX3PUe5MaZsteIleHxbDMS+IZ5DiePMsl8Hiw4/gvok3zIXuaER5nCr6b4HP4UvoIByW
LKXYfjPo+Z4k3xKnctsON/H3HP4UPcD1MIMfxZP1j/4P4//aAAgBAQABPxAhP5qkhVtEoJHm
wqQ0wgBJPmhUkTqiRskJFxCC9vdLgEmS40EYmJykZ5eG+YJqT/xzihg3jfmyXMsTVhBk0hPf
HzWUnSYHqzOtABD2my4jmuG3jMcq8B5bCCf2ry3yZPNYT3/xFywvhRDeVBJJWnpjSJD8LOof
+LNgDUvFBTkKRMFR4Viaig7y6yqPAf1/N8w0kC6FWZBy0Dlq0BjUThDoueaqZLrzSg5a0FBP
ZNX+qNClS5qWP+gG/BUGXmsN83gdtkJUMXwUEHf1X7SVSd0gWR6K7L/wU4bw7eDx8VgmmYFU
JqBGrxI2omCYqAonASYH/lwclcv6PVGP6U8iwHFeHQqRLOB4vuy9XUkpeE2CvZ/FVkoYlRYw
hJxXSu+ryyyERQ8XNa/9ZEeP+RnC8TVkyQr5hyCuLsnBQFgX5Tk0h0OL/SkSTB3WSOvN5KX5
yoSs3MT3UcFPVX4ijXwjzYK+6TjQXXXFdwvFliKM7Wq+CiDoYT3VUEPFih+moi8R4rIuStf+
opKHND/iKE0gxPVfYF0e7PAyfVRFbN4K3ZHZYPfHNAkiPBkmqediynFUkLZoQSwl+KcuDTpe
824cQeLJzMRh7sWGHJx7+a7GcD/2xvCa+LEVRBn7qRKc1zOnFIosssSx1xWMM4f/AMRloSzB
MQOj0+NoCkPbAfbn6fdEkjUgH3z91wvYGTyE7/fip3h9zA/DCeJvPdiESR4Yg/dRbIbg8xUh
PpSQaQQ1kg5/NJyRo8OVQA/FZdfwL4nN2HPmjI8r3TSwM3yq9E5aZs3e9UDKwLbh8NiWHxPC
2TjHTUkXBFxBaf8AosBNRUJFmKLyWORISul7jn6mKUBMQRLwz81slADA9IOPuqQAV3g8R4f0
1zXCY2g9c0xMBdidcc+KUZ3gnkex930oAIT5srX5oBOYILrizTkU0qux2FhSBgd/LWJKNtM8
PYXcPlvVTSmsh24bGD666kHXxcLseebGE7wl0+MrgeOfZUiWL4r4uhhSYClwJqudVAnz1Udr
zLsP5Hf5sG2pBkzxnz37qyF44F9xEUY2E3iDg++J9VRLsnGxpr34ohFl4DwizexzZKSB8WQp
VplUmy5aozxTB9/m5jmajU+ahIcFT2DxWYGLFPKREy+KcdJw+6n8uVbO1LAPR9UZKJOTnpoM
QxeF7qEKZR50VxDXlOKZ8g+fVPIBo6eV8UCTIOz3HwVArMcvCxn5GGiBeECdcPz/ALV3eVGV
G6aU5OnVhjurmOPdj5s/8KgdVEK72qQl+bKTLMeoHi+NB+7w43xZXZrvidLBm1pxyhvc+L5Y
cjVSsA4LNWPqkNC7Uei+erLukYay25lAvAMVvLi7arhsEznWcZZ4iLMGD8UAf8fV2kaIoMaF
4EiHpvpf+FyDuoC1wq2X/Hqtk6cPdbC1y/0WdEmV2hPmcN54qdHBllJYl02w4ihKAFjcQwPB
HceaILnteVmzxCzER8Qn7swIOeoD3RRcSDik4adXocl2nnhrVmyxZqD3U4s3ApNB2bYslvov
GDWk4ny7LODm8Nj8PTYnY8XsSwIzeqrGzv5qlBvI0x+aBANSNm8xmhCv0BoYWP0uLfYzEeAs
tTLpz7rqkzfGCqc4v0+aqV1crpskVahUebL1YCrZqnAf+BTx+jctIDCNVE5aKAH3S8E78XTF
OzrzW0uO0pUcacrl4uRRiDrxYDE7Hn5rhxjiwnZZJN4o+T4WA/V4rD0+PigHIPNI5OSsHaKb
DQyxs2QeSvtZf+xWhVCwebCx7vM54a4oMjPV1Dz1Rt8qla4I0knnzWZQ5E8Fi4KJSzYduZry
EOpQmxlCfJ1VOK3Oz8WWPSooxV98OscXc3AoOrs38HCx8j38FDJnGB+EbZxp4pnlh0nr/klK
hqqy2WtUxSLCLx2othPq72ntOygzRSnN9LOAac2R/hHT5bq3uOfxZ/E6ShcCHdF+t3eVVKil
hEJvmoYTf2Kah4aqLqqdUAsTCT5YUhEccXnNvEGcH3TBTW4y/wDtcULzvcXanAQWaIz81g6m
siQ+qdV4un/25LCdVHpeKMAwKGFy8B+K4xw8nTTMxLShHZEXCuYq63r/AIKPBxQl9h4pd8c/
FlKrUbkTmDZxApINa3FGON1qkcMn68Ve7wNxrLFEUlQyhonhwPJ8+S4jq4HDRUDNMECqwgAO
aTtWPATWVCC9XqSCwGCqTWs0xy0RUFPiS3BuXuiX9UlOax7JRA8jzZlVN0X4Y4bGx3l/uxOY
mV7X/VKto4mwUqKZQJfDQAq43Gx/wGQWAPej5qTI5j6syffLRkfNjaheqaM18CsbC1BT+SrP
Iu7p+Jo5wHdAzsTFcoDpoyFN6T4YrKy7Y/4LJxfwf8ApRKnqkClmSWbEXxZWGy/BRJLEWeR6
qntNlYxF1LOebgH/AMpiFhtVTOZWRTKcpRElGYXTG81LJlDg8UY5eJ5VAEdK38VP+TWgYXBD
Cq5Fk/4KHm4A6v1UkZ8Ia8BByORYnOallJG+ljzcCl0c2DZqsHmyCFzzXgnubkzQRnF0jgOK
GDy+LFE8d2YaTmVMk4Pw1kXDZ45ySwDii/NmxeuZeWqRBzRMaueCjouTHCfzd6J6pEQ5lJ6+
bGpHoYPupQD0f7LD6/b/AKo+k+Ba01+oSlwSduf1zXzGcjjfm4IvFWTvdJiKgJdaN7qSd+qB
6OVg0URlFE480jREd0RhMdlmTZEnFKuv/Mo86saMeamZaAik+rC26G4WRxokvSGzVp/jeHGg
JU2P+ilhiPns+G7nfnYfDUTmzBlleWr8KbvV5Q7Ukjiq5vIfNlET5vHD+awfABmppf2HzeTZ
sjor0BD1RMByPisCGn/N80bVRCSA1cq/1ZyKEyOPjiztj5Om6fw0IJ8bzS//AOFcNRj7rIcp
PxXpWhC6mXJa9UtKBYEh2pcbNoqf8zhcvukDoU9cJmyLOWpKG9tRixXkD/jxesfUv9VQ4Zs1
obAqkZL82UkeTppRfS0yVNj/AI3fB+XxXiQkv5sQzNMsHV4XhCqPBxUQFZywSTZoLxYTWyjl
Iy7dWbwvPdeSuPSzqrScljzFgVhcVlRTRi5bJ4aLEvw0KNvbZC2ODooplVZsmBtCEizlUB8U
Yae0+VfqMANU0i2VaJYq+ClPdkiC75qmohOq0mUNlVq0pXzZ+LPqjTxZFToSkDHFUDbhVIt3
g7oBZcPPP/ApWNiGzSrLnqjKa4nlaeW/Kr1vkJPt7+6wYkNRcNQe77FBUsf8U8lIPhHmjDiz
8VV0y8SRYih6rRtMU1M/DxX/AKKV4GrpxScnFcYpZCiOeH/iDqeKsp6+rDfTY6/9UGrSjQqP
VXYjmwfFJUmWAw+uX5sFI/R+OmgLi6r/AMGI7z82L9b4+KHJFZ4rRoSlEEnVCHtsBvNDtqff
/UXAyTDs81YBGe3O4rvKyRiJK0lQrbT/AMLA2RYWH+0+uynCPJz/ALWHR9prWFTJU2VnydN1
Y9isjDZL9PZ2XixfHehRBRJmsTcrfURvKe7ONl2dn/xpcBGHc+I91ghE6azV81HXqamprUN0
vNhOK1IryZTxAOofyohAf1/7YTEHguR5rAUQzhKflr02JCKcL3XcdFd4si6KecpHdkqVyIUC
P3QiuyEER1BFYWGMb+C+RMMQVHus/wDgwqJX2UFYXbLZsly5SFhoCIf+P/CHJ0eyqzQ6S6GI
mqBBzZvO1g7Z3P8AqTBOSWRkJ8xckf5ivFeK/wDRr/xr/wAd/wDCvF4v/wABdA8QN5Xv/o8t
Of8An//ZiQJUBBMBCAA+FiEE9J2vlwze66v3RD+ycWvBR3FecW8FAloq58gCGwMFCQlmAYAF
CwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQcWvBR3FecW+c6w/7BUwTKPo2bIz6iwqWko/w
1wFdDnXgZjHdts0K33zHtuz3AgutlZZCu9ItaxEX5Lq2W5rBX/KfKhtGgRyI55xilB3FiHBb
aYyLC7Sc68ay3B2r3rdsM68SMNPyCUSAcG0SwiCKu7v2LM7KoLW+/+zGvPoED0mF+nfE1pw/
WyZc/chvVXpLQOc19A7MsOuBxzD1Ud0Z6Q9uJkrAmj9AJ2xNk72DthE4JPpHwoAY8xptQszX
Goyp6AQOMtWibR2lngBjrUl215mn2h0QohWlZKfIJZKETapRwLWxPwJKPOYjNAsNu/fUnizc
qKFU2E20E35bAuxlSwWsLw5bQKs0vYE7bMrfhYjk96D+Pxv4UmyacCY/cM/xgjy6dg9L0pfY
de1Juu/7SHOaZa7yiKX2B9lcoOQKIfG5PPiIvwQGlzZRSTQFOa+Geh7MqGbLv4fYEyH+TstA
Z96+O3/twoyoz8RrDZDAao4iAcS2weuk2tM+OunBwnPE9SRrDZFlXlBZ3w69r6mm8CQmFLMS
XR7CwuG0dt7azuFcXD3d+L2yQcE4ZzczVWbp7Xzzehoupjhots5mMhmBjj/EObBAILZoO+1p
z1f+6JNiyBKhbAPxMK3UDVYw8X2jh+P7KDcCLZQkLJPniOjL5k0KDmNPMA/smthbo5sB8SDp
j1S2lo6KjqzwnIO5Ag0EWPZcPgEQANK0PfaRzz50o+5i0ExQjRSe7F5CtbDwSxStnfWFG9ZO
u4Xit3rrtZw6LmkNbkh19S+/ov/dBBdU3n7xC0ZAb+1GoeLwD/VMADDuVh0TZunl74JIvlEJ
5l0DKoQH5i6fjZGrr6+t/oOWlMACrhzyRrGZNw97rs4PZ/NMq6kwYfpejXtgd4YEONUQk4Ss
gHTktnjwV53VWrb8Ueg44w1dhVwwu5BKVZqIdkfwtFA7PEKjAsJ4yhXZOeskzwbted9tiEcd
xtV8U40rV7iNV9UeONF1s4NUt2e7ZlaLK0IRQu1SjAiJJ7DczquRQw/xn3OhAk926/Iq8BUC
SRIj0s5egQYHWvpUC0RUFbN6jH+MTkoHIJdAyko7yK74eq7OykyhIU+ynUrBqzOaqeK2MEL6
DOQpVnUCeQ3cuCZS9J4WqwzIHWtCticR4RckrUqxjgSfwSxMBngCxjWPIVE8nimkAPngpZd+
PrRcUGgbyXb77EAUR41UGWw93y/Rr4VdA0hABWOg+NcgDLxCM5Am8vT9u9BG+rVxM/kUvp30
DCuPkPjC37m9VEL59L/9TBGOgdj1x672wThggdciJs54pCb1K/0Xv/bSEdi+it0znn3aM5tD
Q58rBJltm7fSu87shIWE6opqBVUjU2CyH7Bvy3xvYw4sqmHaaPE5M90Or1OeuORtABEBAAGJ
AiUEGAECAA8FAlj2XD4CGwwFCQlmAYAACgkQcWvBR3FecW/Pgg//dmXzNvaQxbyxuHoMMfdE
oqkZQz4JY8Q563zpffxXNITX7p1Cmge3yccAk/KnIdsGTVrsbTj4Jp4t0yGPpI2ekTOZi8rA
64dm5XBo0fRVz51osCoTr0LAokebKn5jyratoMaidQlCg6Dc3aWpfTHyBzx9PkRli6+RZclE
nG43gW9Ag77es1blGuTSwrhuZ2P/+9ii+XfdbarjyQcuBdKWfOIi7A48nNDiXXYHn35g0sxt
ohU4gTPU2OTCEHdec4cTqJkJv+bhGWLJSOfh8qMpQ+vGANkEmb+4b72NslJ+3VK+zko95nCV
P6nwimpeTmyrsRzpxOSa5JuCUv9VV9WmdRHZCWkhIAuEHpED9cMaZLdAMrMjmZVRDvylDKZi
9EtKswAUZMgm4XXzoE61CSFZHNd9MwYfMkpV28DTlszSscoS0yKUdOyko9ySYC/hktI6azwM
cCUcx1aUYnjtSWdP2+1+zLLMPjGovEA/VL90U9sesntmWf3XXmmcQTc7TtWMRJVh2Yh+kpTI
BrUSH+GoyW/7nUD2n/Hb/1D0SvXQ37QaxyMhE4a+ZTMrLOqZIGChAH42+CIqmJi8Y7O+vwFQ
5URSEMisXXRd2jn4cPsdVoVIbPa9N6gvWKuCggKnnmX4fRn/H8pm0/A/WOG0kknZp447mmk6
vD9pSUu8A1brD5q5Ag0EWx1LvwEQAK1GiX8GGumYrme0wtxMV2LtlSh/2FX+N/dyGqTpEnQj
pJH4mNvRKKuFYYguUl9n2BAEw9QPXJk+j/9RL79D8OB6M0qWVbR4YYD0A4kVgqC++BaGBOqx
7omhSFJNgE2C8kMmMxr37+KjfVJj3zAA0rDfShS2VS+grCcW4+lEaQHUzdH99F7qsB5DzKdm
E25d7NcU34zupbc8XpGK2q8NXKrLfVlsJQG4zPVDC41RwySe8rfFy1DqQGXdKmYDXgBfQK4z
2wWF1vjT/EewwVoYviUNOOP1UfXrc5L7HOtH1gueU/DMeCskVQwfBjcdmkufKY/cBCPetwGF
uHIwrhdZVYYu0JuqM1xTAWk5qeC4qKF77qXHQNwXVRlGpjlkVols98jwgkhE7CIUYgCAQ9B9
LUS3MFi4+ul/uQtmF2FcHgvzGmAUVrb8ayGkfCLcebu0lYA0KnAd+Gm/VcF7izjJhhdh1Hla
7zduIeHbo4xX4LYPTnnf+wjTfq7aep5adnbdhsmTeg6r629EX5v5Lrvq8evepUARwYGIBFjP
wQXaBGLMoR0IesuUvcuY88i/pqqfEc0EWw1ZBodwAQsRwqH7bO5RcMopFxAjD5EsyQbIH0kn
b9uR3/++mRS0SsBYytIaWH0fRA5fdHf4KvjhlOAJD6mz7xe1DFXVtyIJ0DghQZJVABEBAAGJ
AjYEKAEIACAWIQT0na+XDN7rq/dEP7Jxa8FHcV5xbwUCW0xq3AIdAAAKCRBxa8FHcV5xb0Vm
EACHRNOfbQn+K4GU131FlX/TTj5vsEHFZISvVJ1ifqdT7NOaVW2KOwNzSOWLSw0oJuBRQIVC
NXbiYaurgQO0E35BvOVTRGQVyAP1ePj/AqS9lUCv155G8fBM3zfl+Ittq+WDRus5ZZg3BUxW
hzl+fMBY6/2ZN/lGAFJ9I/gUr74n5D4WIC+3Kxsm4Yf/+8se7gkh2rHaZKIVUxRcmkxQ+2oR
isZG9T13HIMfc633OE5aVRMaheF7RYZcOpMfh3ItjDhRyRjz8K96/ZU09nIgcYiTgVskpb6+
42schp07iHCjTKURUzPInb2BAouU6aotD8xHCdtDaby5bMH9+d/0ZEa5sOrP9i2lwPDkjcVe
ObxU67wjnoMc5N57vDo8p0BvTch/L+IBWc4+WpbAUNyK2ICU/6H2MpUUef/CuQ9nWuJbB3Xh
vsZklWY9fkPPqFvdYYfZxjtWYL1xoFGMTC2JCGYX1wiaxLQlE8Vp6kZb3n6YYvmbf8/ycZuF
mhQhzLX9O2Gh9QbDfSQmXTqkn8/IDJp6Xck2Y6Q5iVBMhCOgE2CGmpUoPKISL3+E5qGbh8d9
E1r/TwiaTQBjsXwzHQaoc8VcOhRePBk3b/XsJXaevakYd1JO0WNAVAbIFGNlQZQy3YWSPDt0
uFmeDak6EZEFpmgkRvej9C4TXrwM6mznus7Z1okEcgQYAQgAJhYhBPSdr5cM3uur90Q/snFr
wUdxXnFvBQJbHUu/AhsCBQkHhh+AAkAJEHFrwUdxXnFvwXQgBBkBCAAdFiEEETgweQbNJq7k
iOC5yifJzOBX1k0FAlsdS78ACgkQyifJzOBX1k35AQ/9EzNarYdM75GaNstQO3HqEdlbDOfy
ULgSnad1+87fXf9CtvXkaY9BapfwfRJDj9iRkdfw0vMPCdGO7UBXKo6QqmQ52Zy6N50OwCop
oEayh/SCHknwTH8KWl9gts93ZHlQuLZoWGWkRXsesTbBn4PI+1ium6XdqQE6tnzwa9RLT3qd
vH1ASYzlUneYwDwSe3Vy7j7YDRC9HAFuY2w8xLvDBTpPgHQRSy2na/lUs54AgHTmIa/wFRDy
prKAJO0oFZCv5q0nfokF3FCFi4NjQff/hhTE5kQRR2Y9p86OsWFnPpt2IBYcjLfM5n5oKAGy
hkSsQJBtk+l3qxQ58soJ9nbE/b3TXc9JcGTiD3DnnaSPavlifRVolm55SAOOrsvCjFppEvsb
W/ybSJ4a3PZmxR1Pqgblvdsd/V4NTmJvpl7vRhOQhg9a/UV4pFRUnb098rxX1gi8vCxvkmS0
hHG7mDn3AfKZ36kwjJ19p9oYtk9g/YwEAv0xVKLiR08a2iRE8YHyzB5zQ/goBA5vbX2qh4BR
Mcf4lTnMY7TZykSagw24BFLTad51j9fjwvdyFNNvHPufa9uckh5FsKc65Pw08JqAj7A8hvk2
OquTewYo6knU696uH8e+cmQ1wrm77jmDZbhkTtlpNbKyvdT2MEDTG8+MGvQhYOyYDUkH5iY2
fXu7ExWVxA/+JMsbZokv1q+vNSn/gF4szWhHMqtHSgZku0hZ56+/G+ZKxIDYUaMX/k8IZoWi
pue+FIqEkljyZhLg0Wnw9iL2oc7hWQWvtb0p9s1F/ANhAiLXTPPmUjOtq8P+LHRF2jPzXyR/
19fD6VYA6htEUqUQWi7F3ZRP2xyNGi6BTLsJE6Xx4EcUquF1g6m24Y1PtDslSETha2gmB9q/
sngfOJ+OtdnQOkOBOJxXJni63QBfFfbtOhJBYo4Udrg0fuStv+cvb0FCzWrR9mnxG+VfyLu0
D6AN0lgg2rylIxzacBY5QJurfzOq3lvv6TvmDOCpCSxX1fHtLCNAslim+G0e8NnVLpGVN9V1
d3QBpMEWXZhwSqnwAyM2VWsyBjeriu5ylD5QIqDkFe7mCbsWtL8IvyYCFZruEjeWeMsncdMq
KBGCdFD9eSD0VM93EYByfcbVjLS7xpwo8cLiiHrEH7jXdatk6dU8Fdh8kSmn/X5Gb948imAS
jP/o7yLRgCR+bu4OBFtaRQGrWJIz25s4UWGdaERzhZe3b4wyG/wWTkxN23s1P5hU96p/aTUA
ZEwK5Qr6kKpJP8cmcWyuS9fg5vd9wsu/0jVWnIVKihn/MgxW774GrcfAcZB47H+AFpLNBLO0
ga7Vc38c8OptkHtjZBNdqrQ0up+FqwhTZar9f4EpOWucTes=
=aVl0
-----END PGP PUBLIC KEY BLOCK-----

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,84 +0,0 @@
body
font-family: "Antic Slab"
font-size: $font-size-normal
line-height: 1.5em
.center
margin: 0 auto
max-width: 920px
a
text-decoration: underilne
color: $red
&.no-underline
text-decoration: none
img
max-width: 100%
header
h1
font-size: 1.5em
margin-bottom: 0
text-align: right
h2
font-size: 0.8em
font-weight: normal
margin-top: 0
display: none
nav.main-menu
text-align: right
footer
font-size: 0.7em
padding-top: 1em
hr.light
border: 0px
margin: 1em 0 1em 0
border-top: #CCC 1px solid
p:first-child
margin-top: 0
.text-center
text-align: center
.text-right
text-align: right
.text-bold
font-weight: bold
.text-size-normal
font-size: $font-size-normal
.text-size-enormous
font-size: $font-size-enormous
.float-right
float: right
.float-left
float: left
.clearfloat
clear: both
.display-block
display: block
.block-info
background-color: lightblue
padding: 12px
&:before
color: darken(lightblue, 50)
content: '🛈'
float: left
font-size: 180%
line-height: 80%
padding-right: 6px

View File

@ -1,6 +0,0 @@
$red: #c24e4a
$lightgray: #f6f6f6
$darkgray: #e9e9e9
$font-size-normal: 20px
$font-size-enormous: 5em

48
content/about/contents.lr Normal file
View File

@ -0,0 +1,48 @@
_model: page
---
title: About
---
body:
Hi! I'm Felipe, and I am a developer. Whatever that is.
I have been playing with code for a while now, but I also enjoy geeking around with computers, algorithms and other stuff; the less I know about it, the better!
Learning new things every day is my way of life.
I think that developers are like artists, writers and composers... we all make art. But we don't use strokes and colors, words or notes, we make it through code. And I really love it.
If you want to get in touch feel free to drop me a line.
<div class="grid">
<div class="col-1-3">
<h4>E-Mail</h4>
<a target="_blank" href="mailto:me@fmartingr.com">me@fmartingr.com</a>
</div>
<div class="col-1-3">
<h4>LinkedIn</h4>
<a target="_blank" href="https://www.linkedin.com/in/fmartingr/">linkedin.com/fmartingr</a>
</div>
<div class="col-1-3">
<h4>Mastodon</h4>
<a target="_blank" rel="me" href="https://fosstodon.org/@fmartingr">fmartingr@fosstodon.org</a>
</div>
<div class="col-1-3">
<h4>Sourcehut</h4>
<a target="_blank" href="https://git.sr.ht/~fmartingr">~fmartingr</a>
</div>
<div class="col-1-3">
<h4>Github</h4>
<a target="_blank" href="https://github.com/fmartingr">fmartingr</a>
</div>
<div class="col-1-3">
<h4>Gitlab</h4>
<a target="_blank" href="https://gitlab.com/fmartingr">fmartingr</a>
</div>
<div class="col-1-3">
<h4>Telegram</h4>
<a target="_blank" href="https://t.me/fmartingr">@fmartingr</a>
</div>
<div class="col-1-3">
<h4>Keybase</h4>
<a target="_blank" href="https://keybase.io/fmarting">@fmarting</a>
</div>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

View File

@ -1,3 +0,0 @@
_model: gallery
---
_discoverable: no

Binary file not shown.

Before

Width:  |  Height:  |  Size: 383 KiB

After

Width:  |  Height:  |  Size: 240 KiB

View File

@ -2,13 +2,14 @@ title: Welcome to Felipe Martin!
---
body:
Hi! I'm Felipe, and I am a developer. Whatever that is.
I have been playing with code for a while now, but I also enjoy geeking around with computers, algorithms and other stuff; the less I know about it, the better! Learning new things every day is my way of life.
I think that developers are like artists, writers and composers... we all make art. But we don't use strokes and colors, words or notes, we make it through code. And I really love it.
If you want to get in touch feel free to drop me a line.
<h3>I'm currently reading...</h3>
<ul>
<li><a href="https://www.goodreads.com/book/show/9579634-prince-of-thorns" target="_blank">Prince of Thorns (The Broken Empire, #1)</a> by <i>Mark Lawrence</i></li>
</ul>
<h3>I'm currently playing...</h3>
<ul>
<li><a href="https://backloggery.com/fmartingr" target="_blank">Final Fantasy IX</a> on PC</li>
</ul>
---
_template: home.html

View File

@ -1,32 +1,26 @@
'use strict';
var gulp = require('gulp');
// Styles
var sass = require('gulp-sass');
var concatCss = require('gulp-concat-css');
var concatJs = require('gulp-concat');
var merge = require('merge-stream');
var minifyCss = require('gulp-minify-css');
var livereload = require('gulp-livereload');
var yargs = require('yargs').argv;
var minify = require('gulp-minify');
gulp.task('sass', function () {
var sassStream = gulp.src('./assets/static/sass/style.sass')
gulp.task('sass', function() {
var sassStream = gulp.src('./static/sass/style.sass')
.pipe(sass().on('error', sass.logError));
// var bowerStream = gulp.src([]);
return merge(sassStream)
.pipe(concatCss("style.css"))
.pipe(minifyCss())
.pipe(gulp.dest('./assets/static/css'))
.pipe(livereload());
.pipe(gulp.dest('./assets/static/css'));
});
gulp.task('js', function () {
gulp.task('js', function() {
var jsStream = gulp.src([
'./assets/static/js/main.js'
'./static/js/main.js'
]);
return jsStream
.pipe(concatJs('app.js'))
@ -37,12 +31,6 @@ gulp.task('js', function () {
.pipe(gulp.dest('./assets/static/js'))
})
gulp.task('livereload', function () {
return gulp.src('./templates/**/*.html').pipe(livereload());
});
gulp.task('sass:watch', function () {
livereload.listen();
gulp.watch('./assets/static/sass/*', gulp.parallel(['sass']));
gulp.watch('./assets/static/templates/**/*.html', gulp.parallel(['livereload']));
});
gulp.task('sass:watch', function() {
gulp.watch('./static/sass/*', gulp.parallel(['sass']));
});

394
package-lock.json generated
View File

@ -4,12 +4,6 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@ -469,18 +463,6 @@
"inherits": "~2.0.0"
}
},
"body": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
"integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
"dev": true,
"requires": {
"continuable-cache": "^0.3.1",
"error": "^7.0.0",
"raw-body": "~1.1.0",
"safe-json-parse": "~1.0.1"
}
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@ -567,12 +549,6 @@
}
}
},
"bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
"integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
"dev": true
},
"cache-base": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
@ -862,12 +838,6 @@
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true
},
"continuable-cache": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
"integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
"dev": true
},
"convert-source-map": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
@ -1142,12 +1112,6 @@
"safer-buffer": "^2.1.0"
}
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@ -1157,15 +1121,6 @@
"once": "^1.4.0"
}
},
"error": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz",
"integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==",
"dev": true,
"requires": {
"string-template": "~0.2.1"
}
},
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@ -1408,15 +1363,6 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
"faye-websocket": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
"integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
"dev": true,
"requires": {
"websocket-driver": ">=0.5.1"
}
},
"file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
@ -2475,55 +2421,6 @@
}
}
},
"gulp-livereload": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/gulp-livereload/-/gulp-livereload-4.0.2.tgz",
"integrity": "sha512-InmaR50Xl1xB1WdEk4mrUgGHv3VhhlRLrx7u60iY5AAer90FlK95KXitPcGGQoi28zrUJM189d/h6+V470Ncgg==",
"dev": true,
"requires": {
"chalk": "^2.4.1",
"debug": "^3.1.0",
"fancy-log": "^1.3.2",
"lodash.assign": "^4.2.0",
"readable-stream": "^3.0.6",
"tiny-lr": "^1.1.1",
"vinyl": "^2.2.0"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
},
"lodash.assign": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
"dev": true
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"readable-stream": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
"integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
"dev": true,
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
}
}
},
"gulp-minify": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/gulp-minify/-/gulp-minify-3.1.0.tgz",
@ -2795,12 +2692,6 @@
"integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
"dev": true
},
"http-parser-js": {
"version": "0.4.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
"integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
"dev": true
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@ -3216,12 +3107,6 @@
"resolve": "^1.1.7"
}
},
"livereload-js": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
"integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==",
"dev": true
},
"load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
@ -3235,15 +3120,6 @@
"strip-bom": "^2.0.0"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
@ -3978,30 +3854,6 @@
"os-tmpdir": "^1.0.0"
}
},
"p-limit": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
"integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"parse-filepath": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
@ -4238,30 +4090,6 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
"qs": {
"version": "6.9.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz",
"integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==",
"dev": true
},
"raw-body": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
"integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
"dev": true,
"requires": {
"bytes": "1",
"string_decoder": "0.10"
},
"dependencies": {
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"dev": true
}
}
},
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@ -4560,12 +4388,6 @@
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"safe-json-parse": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
"integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=",
"dev": true
},
"safe-regex": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
@ -4949,12 +4771,6 @@
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
"dev": true
},
"string-template": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
"integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
"dev": true
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
@ -5077,43 +4893,6 @@
"integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
"dev": true
},
"tiny-lr": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz",
"integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
"dev": true,
"requires": {
"body": "^5.1.0",
"debug": "^3.1.0",
"faye-websocket": "~0.10.0",
"livereload-js": "^2.3.0",
"object-assign": "^4.1.0",
"qs": "^6.4.0"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
}
}
},
"to-absolute-glob": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
@ -5482,23 +5261,6 @@
"source-map": "^0.5.1"
}
},
"websocket-driver": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
"integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
"dev": true,
"requires": {
"http-parser-js": ">=0.4.0 <0.4.11",
"safe-buffer": ">=5.1.0",
"websocket-extensions": ">=0.1.1"
}
},
"websocket-extensions": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
"integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
"dev": true
},
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@ -5557,162 +5319,6 @@
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
},
"yargs": {
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz",
"integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==",
"dev": true,
"requires": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
"find-up": "^4.1.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^4.2.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^16.1.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
"cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
"string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
},
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
"wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
}
},
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"dev": true
},
"yargs-parser": {
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz",
"integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
}
}
},
"yargs-parser": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",

View File

@ -7,12 +7,10 @@
"gulp": "*",
"gulp-concat": "*",
"gulp-concat-css": "*",
"gulp-livereload": "*",
"gulp-minify": "*",
"gulp-minify-css": "*",
"gulp-sass": "*",
"merge-stream": "*",
"yargs": "*"
"merge-stream": "*"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"

View File

@ -1,6 +1,5 @@
article.blog-post
h1
font-size: 1.8em
.title
margin-bottom: 0.3em
.info
@ -13,7 +12,8 @@ article.blog-post
img
border-radius: 6px
display: block
margin: 0 auto
margin: 0 auto
max-width: 100%
img
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2)

103
static/sass/_layout.sass Normal file
View File

@ -0,0 +1,103 @@
body
font-family: $font-family
font-size: $font-size-base
line-height: 1.5em
.center
margin: 0 auto
max-width: 920px
a
text-decoration: underilne
color: $highlight-color
&.no-underline
text-decoration: none
hr.light
border: 0px
margin: 1em 0 1em 0
border-top: #CCC 1px solid
p:first-child
margin-top: 0
.text-left
text-align: left
.text-center
text-align: center
.text-right
text-align: right
.text-bold
font-weight: bold
.text-size-small
font-size: $font-size-small
.text-size-normal
font-size: $font-size-normal
.text-size-enormous
font-size: $font-size-enormous
.float-right
float: right
.float-left
float: left
.clearfloat
clear: both
.display-block
display: block
.block-info
background-color: lighten($highlight-color, 40%)
padding: 12px
// New
.page-content
display: flex
margin: 0 auto
flex-direction: row
max-width: 980px
@media ($tablet)
display: block
width: 100%
header
width: 25%
text-align: center
@media ($tablet)
width: 100%
.avatar
max-width: 125px
h1
font-size: 1.3em
.avatar
width: 70%
margin: 0 auto
border-radius: 12%
nav
a
display: block
.social
list-style: none
padding: 0
.main-content
@media ($tablet)
width: 100%
width: 75%
padding-right: 16px

View File

@ -4,7 +4,7 @@ table
box-shadow: 0 1px 3px rgba(0,0,0,0.2)
th
background: $red
background: $highlight-color
color: white
font-weight: bold

View File

@ -0,0 +1,11 @@
$highlight-color: #c24e4a
$lightgray: #f6f6f6
$darkgray: #e9e9e9
$font-family: "Antic Slab"
$font-size-base: 1.2em
$font-size-small: 0.8em
$font-size-normal: 1.3em
$font-size-enormous: 5em

View File

@ -3,7 +3,6 @@
@import ./mixins
@import ./grid
@import ./layout
@import ./about
@import ./blog
@import ./portfolio
@import ./table

View File

@ -8,6 +8,7 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fork-awesome@1.0.11/css/fork-awesome.min.css" integrity="sha256-MGU/JUq/40CFrfxjXb5pZjpoZmxiP2KuICN5ElLFNd8=" crossorigin="anonymous">
<link rel="stylesheet" href="{{ get_pygments_stylesheet()|url }}">
<link rel="alternate" type="application/rss+xml" title="RSS Feed for fmartingr.com" href="/feed.xml" />
<link rel="icon" href="/static/images/favicon.ico">
<!-- Mobile -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
@ -17,40 +18,58 @@
{% block endhead %}{% endblock %}
</head>
<body class="{% block body_class %}{% endblock %}">
<header class="center">
<h1>Felipe Martín</h1>
<h2>Be incomprehensible. If they can't understand, they can't disagree.</h2>
<nav class="main-menu">
<a {% if this.path == '/' %}class="text-bold"{% endif %} href="{{ '/'|url }}">/home</a> &nbsp;
{% for section in site.get('/').children %}
<a{% if this.is_child_of(section) %} class="text-bold"{% endif
%} href="{{ section|url }}">{{ section.path }}</a> {% if not loop.last %}&nbsp;{% endif %}
{% endfor %}
</nav>
<hr class="light">
</header>
{% block main_content %}{% endblock %}
<footer class="center text-center">
<hr class="light">
<div>
Powered by <a href="https://www.getlektor.com/" target="_blank">Lektor</a> and <a href="https://about.gitlab.com/product/pages/">Gitlab Pages</a>.
</div>
<div>
<a target="_blank" href="mailto:me@fmartingr.com">E-Mail</a>
|
<a target="_blank" href="https://gitlab.com/fmartingr">Gitlab</a>
|
<a target="_blank" href="https://github.com/fmartingr">Github</a>
|
<a target="_blank" href="https://www.linkedin.com/in/fmartingr/">LinkedIn</a>
|
<a target="_blank" href="https://telegram.me/fmartingr">Telegram</a>
|
<a target="_blank" rel="me" href="https://fosstodon.org/@fmartingr">Mastodon</a>
</div>
</footer>
<script src="https://cdn.commento.io/js/commento.js"></script>
<script src="https://cdn.commento.io/js/count.js"></script>
<div class="page-content">
<section class="main-content">
{% block main_content %}asd{% endblock %}
</section>
<header>
<h1>Felipe Martín</h1>
<img class="avatar" src="{{ '/static/images/avatar.jpg'|asseturl }}">
<hr class="light" />
<nav>
<a {% if this.path == '/' %}class="text-bold"{% endif %} href="{{ '/'|url }}">/home</a>
{% for section in site.get('/').children %}
<a {% if this.is_child_of(section) %}class="text-bold"{% endif %} href="{{ section|url }}">{{ section.path }}</a>
{% endfor %}
</nav>
<hr class="light" />
<ul class="social text-size-small">
<li>
<span class="title">E-mail</span>
<a target="_blank" href="mailto:me@fmartingr.com">me@fmartingr.com</a>
</li>
<li>
<span class="title">Sourcehut</span>
<a target="_blank" href="https://git.sr.ht/~fmartingr">~fmartingr</a>
</li>
<li>
<span class="title">LinkedIn</span>
<a target="_blank" href="https://www.linkedin.com/in/fmartingr/">linkedin.com/fmartingr</a>
</li>
<li>
<span class="title">Mastodon</span>
<a target="_blank" rel="me" href="https://fosstodon.org/@fmartingr">fmartingr@fosstodon.org</a>
</li>
<li>
<span class="title">PGP</span>
<a href="/pubkey.txt">716B C147 715E 716F</a>
<li>
<a href="{{ '/about'|url }}">[+ more]</a>
</li>
</ul>
<hr class="light" />
<ul class="social text-size-small">
<li>
<span class="title">Site created using</span>
<a target="_blank" href="https://www.getlektor.com/">lektor</a>
</li>
<li>
<span class="title">Published using</span>
<a target="_blank" href="https://sites.town">sites.town</a>
</li>
</ul>
</header>
</div>
<script type="text/javascript" src="{{ '/static/js/app-min.js'|url }}"></script>
{% block endbody %}{% endblock %}
</body>

View File

@ -1,3 +1,3 @@
{% extends "_base.html" %}
{% block page_title %}{{ super() }} | Blog{% endblock %}
{% block page_title %}Blog | {{ super() }}{% endblock %}

View File

@ -3,15 +3,15 @@
{% block body_class %}blog post{% endblock %}
{% block page_title %}{{ super() }} | {{ this.title }}{% endblock %}
{% block page_title %}{{ this.title }} | {{ super() }}{% endblock %}
{% block main_content %}
{{ render_blog_post(this) }}
{% if this.children.get("gallery") %}
{{ render_gallery(this) }}
{% endif %}
<div class="center block-info">
Comments have been disabled in this blog. If you want to contact me directly please use the information at the bottom of the page.
In order to make a public comment on this entry please use
<a href="mailto:~fmartingr/fmartingr.com@lists.sr.ht?subject=Re: {{ this.title }}">the mailing list</a>
and if you want to approach me directly use the most appropriate channel from
<a href="{{ '/about'|url }}">the about page</a>.
</div>
{% endblock %}

View File

View File

@ -1,16 +1,19 @@
{% extends "_base.html" %}
{% from "macros/blog.html" import render_blog_post %}
{% block page_title %}{{ super() }} | {{ this.title }}{% endblock %}
{% block page_title %}{{ this.title }} | {{ super() }}{% endblock %}
{% block main_content %}
<div class="grid center">
<div class="col-1-3">
<img src="{{ 'static/images/avatar.jpg'|url }}">
</div>
<div class="col-2-3">
{{ this.body }}
</div>
</div>
<h2>Latest blog posts</h2>
{% for post in site.get('/blog').pagination.for_page(1).pagination.items %}
<article class="blog-post center">
<p class="text-right float-right"><a href="{{ post|url }}">Read &raquo;</a></p>
<h3 class="title"><a href="{{ post|url }}">{{ post.title }}</a></h3>
<div class="info">{{ post.pub_date }}</div>
</article>
<hr class="light">
{% endfor %}
{{ this.body }}
{% endblock %}
{% block body_class %}home{% endblock %}

View File

@ -1,39 +1,24 @@
{% macro render_blog_post(post, from_index=false) %}
{% macro render_blog_post(post, from_index=false, include_content=true) %}
{% set summary = post.body.html.split('<!-- readmore -->') %}
<article class="blog-post center">
<h1><a href="{{ post|url }}">{{ post.title }}</a></h1>
<h1 class="title"><a href="{{ post|url }}">{{ post.title }}</a></h1>
<div class="info">
Published on {{ post.pub_date }}
</div>
<div class="content">
{% if from_index and summary|length > 1 %}
{{ summary[0] }}
<p class="text-right"><a href="{{ post|url }}">Read more &raquo;</a></p>
{% else %}
{{ post.body }}
{% if include_content %}
<div class="content">
{% if from_index and summary|length > 1 %}
{{ summary[0] }}
<p class="text-right"><a href="{{ post|url }}">Read more &raquo;</a></p>
{% else %}
{{ post.body }}
{% endif %}
</div>
{% if not from_index and post.edit_comment %}
<h3>Edits</h3>
{{ post.edit_comment }}
{% endif %}
</div>
{% if not from_index and post.edit_comment %}
<h3>Edits</h3>
{{ post.edit_comment }}
{% endif %}
<hr class="light">
</article>
{% endmacro %}
{% macro render_gallery(post) %}
<div class="center">
<h2>Gallery</h2>
<div class="grid">
{% for attachment in post.children.get("gallery").attachments.order_by("_id") %}
<a href="/blog/{{post._slug}}/gallery/{{attachment._id}}">
<img src="/blog/{{post._slug}}/gallery/{{attachment._id}}" class="col-1-3">
</a>
{% if loop.index is divisibleby(3) %}
</div><div class="grid">
{% endif %}
{% endfor %}
</div>
<hr class="light">
</div>
{% endmacro %}

View File

@ -1,9 +0,0 @@
{% extends "_base.html" %}
{% block page_title %}{{ super() }} | {{ this.title }}{% endblock %}
{% block main_content %}
<div class="center">
{{ this.body }}
</div>
{% endblock %}

View File

@ -1,10 +1,11 @@
{% extends "_base.html" %}
{% block page_title %}{{ super() }} | {{ this.title }}{% endblock %}
{% block page_title %}{{ this.title }} | {{ super() }}{% endblock %}
{% block body_class %}{{ this.title|lower }}{% endblock %}
{% block main_content %}
<h2>{{ this.title }}</h2>
<div class="center">
{{ this.body }}
</div>

View File

@ -1,34 +0,0 @@
{% extends "_base.html" %}
{% block page_title %}{{ super() }} | Portfolio{% endblock %}
{% block main_content %}
<div class="center">
<h1>Portfolio</h1>
<p>{{ this.content }}</p>
<ul>
{% for category in this.children %}
<li><a href="#{{ category.slug }}">{{ category.name }}</a></li>
{% endfor %}
</ul>
{% for category in this.children %}
<h2 id="{{ category.slug }}">{{ category.name }}</h2>
{% for item in category.children %}
<div class="project project-{{ category.slug }}" id="{{ item.slug }}">
<h3><a href="{% if item.url_in_list and item.url %}{{ item.url }}{% else %}{{ item|url }}{% endif %}">{{ item.name }}</a></h3>
{% if category.show_images %}
<div><img src="{{ item.attachments.images.first().thumbnail(512, 256, crop=True)|url }}"></div>
{% endif %}
{% if item.description_in_list %}
<p>{{ item.description }}</p>
{% endif %}
</div>
{% endfor %}
<div class="clearfloat"></div>
{% if not loop.last %}<hr class="light">{% endif %}
{% endfor %}
</div>
{% endblock %}

View File

@ -1,48 +0,0 @@
{% extends "_base.html" %}
{% block page_title %}{{ super() }} | Portfolio | {{ this.name }}{% endblock %}
{% set images_number = this.attachments.images.count() %}
{% block main_content %}
<div class="center">
<h1>{{ this.name }}</h1>
<ul>
{% if this.date %}<li><strong>Date:</strong> {{ this.date.year }}</li>{% endif %}
{% if this.role %}<li><strong>Role:</strong> {{ this.role }}</li>{% endif %}
{% if this.stack %}<li><strong>Stack:</strong> {{ this.stack }}</li>{% endif %}
{% if this.company %}<li><strong>Company:</strong> {{ this.company }}</li>{% endif %}
{% if this.url %}<li><strong>URL:</strong> <a href="{{ this.url }}">{{ this.url }}</a></li>{% endif %}
</ul>
<p>{{ this.description }}</p>
{% if images_number > 0 %}
<div class="grid grid-pad" data-featherlight-gallery data-featherlight-filter="a">
{% for image in this.attachments.images %}
<div class="col-1-8">
<a href="{{ image|url }}">
<img src="{{ image.thumbnail(200, 150, crop=True)|url }}">
</a>
</div>
{% endfor %}
</div>
</div>
{% endif %}
{% endblock %}
{% block endhead %}
{% if images_number > 0 %}
<link href="//cdn.rawgit.com/noelboss/featherlight/1.7.2/release/featherlight.min.css" type="text/css" rel="stylesheet" />
<link href="//cdn.rawgit.com/noelboss/featherlight/1.7.2/release/featherlight.gallery.min.css" type="text/css" rel="stylesheet" />
{% endif %}
{% endblock %}
{% block endbody %}
{% if images_number > 0 %}
<script src="//code.jquery.com/jquery-latest.js"></script>
<script src="//cdn.rawgit.com/noelboss/featherlight/1.7.2/release/featherlight.min.js" type="text/javascript" charset="utf-8"></script>
<script src="//cdn.rawgit.com/noelboss/featherlight/1.7.2/release/featherlight.gallery.min.js" type="text/javascript" charset="utf-8"></script>
{% endif %}
{% endblock %}

View File

@ -1,19 +0,0 @@
from urllib.parse import urlsplit
import unittest
import requests
class PagesTestCase(unittest.TestCase):
def test_http_redirect_to_https(self):
response = requests.get('http://fmartingr.com', allow_redirects=False)
scheme, host, *_ = urlsplit(response.headers.get("Location"))
self.assertEqual(response.status_code, 301)
self.assertEqual(scheme, 'https')
self.assertEquals(host, "fmartingr.com")
def test_www_redirects_to_non_www(self):
response = requests.get('https://www.fmartingr.com', allow_redirects=False)
scheme, host, *_ = urlsplit(response.headers.get("Location"))
self.assertEqual(response.status_code, 301)
self.assertEqual(scheme, 'https')
self.assertEquals(host, "fmartingr.com")