Commit 02f58cef authored by Simonas's avatar Simonas

SSL updates

parent 666bc1c0
PROJECT=dev-biuro PROJECT=dev-biuro
IMAGE_NGINX=nginx:1.15.7 #IMAGE_NGINX=nginx:1.15.7
# IMAGE_NGINX=fholzer/nginx-brotli IMAGE_NGINX=kbenassm/nginx-brotli-tls13
IMAGE_MYSQL=mariadb:10.3 IMAGE_MYSQL=mariadb:10.3
IMAGE_WORDPRESS=wordpress:php7.2-fpm IMAGE_WORDPRESS=wordpress:php7.3-fpm
IMAGE_WORDPRESS_CLI=wordpress:cli-php7.2 IMAGE_WORDPRESS_CLI=wordpress:cli-php7.3
DB_NAME=dev_biuro DB_NAME=dev_biuro
DB_HOST=mysql DB_HOST=mysql
......
FROM php:7.2-fpm FROM php:7.3-fpm
LABEL maintainer="Biuro<info@biuro.lt>" # install the PHP extensions we need
RUN set -ex; \
\
savedAptMark="$(apt-mark showmanual)"; \
\
apt-get update; \
apt-get install -y --no-install-recommends \
libjpeg-dev \
libpng-dev \
libzip-dev \
; \
\
docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr; \
docker-php-ext-install gd mysqli opcache zip; \
\
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
apt-mark auto '.*' > /dev/null; \
apt-mark manual $savedAptMark; \
ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \
| awk '/=>/ { print $3 }' \
| sort -u \
| xargs -r dpkg-query -S \
| cut -d: -f1 \
| sort -u \
| xargs -rt apt-mark manual; \
\
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
rm -rf /var/lib/apt/lists/*
# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
echo 'opcache.memory_consumption=128'; \
echo 'opcache.interned_strings_buffer=8'; \
echo 'opcache.max_accelerated_files=4000'; \
echo 'opcache.revalidate_freq=2'; \
echo 'opcache.fast_shutdown=1'; \
echo 'opcache.enable_cli=1'; \
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
VOLUME /var/www/html
ENV WORDPRESS_VERSION 5.0.3
ENV WORDPRESS_SHA1 f9a4b482288b5be7a71e9f3dc9b5b0c1f881102b
RUN set -ex; \
curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz"; \
echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c -; \
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
tar -xzf wordpress.tar.gz -C /usr/src/; \
rm wordpress.tar.gz; \
chown -R www-data:www-data /usr/src/wordpress
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
FROM php:7.3-fpm
# install the PHP extensions we need # install the PHP extensions we need
RUN set -ex; \ RUN set -ex; \
...@@ -11,6 +67,7 @@ RUN set -ex; \ ...@@ -11,6 +67,7 @@ RUN set -ex; \
apt-get install -y --no-install-recommends \ apt-get install -y --no-install-recommends \
libjpeg-dev \ libjpeg-dev \
libpng-dev \ libpng-dev \
libzip-dev \
; \ ; \
\ \
docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr; \ docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr; \
...@@ -72,30 +129,3 @@ RUN \ ...@@ -72,30 +129,3 @@ RUN \
ENTRYPOINT ["docker-entrypoint.sh"] ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["php-fpm"] CMD ["php-fpm"]
#####FROM wordpress:php7.2-fpm
#####
#####LABEL maintainer="Biuro<info@biuro.lt>"
#####
#####RUN \
##### apt-get update && \
##### apt-get install unzip wget mysql-client -y && \
##### rm -rf /var/lib/apt/lists/*
#####
###### COPY ./uploads.ini /usr/local/etc/php/conf.d/uploads.ini
#####
#####COPY docker-entrypoint.sh /usr/local/bin/
#####RUN chmod +x /usr/local/bin/docker-entrypoint.sh
#####
#####COPY ./wp-content/themes/biuro /temp/themes/biuro
#####COPY ./wp-content/plugins/ /temp/plugins/
###### COPY ./base/ /temp/base
#####
#####RUN \
##### unzip '/temp/themes/*.zip' -d /temp/themes && rm /temp/themes/*.zip || true; \
##### unzip '/temp/plugins/*.zip' -d /temp/plugins && rm /temp/plugins/*.zip || true; \
##### # unzip '/temp/base/*.zip' -d /temp/base && rm /temp/base/*.zip || true; \
##### exit 0
# COPY ./app /usr/share/nginx/html
...@@ -16,10 +16,11 @@ ...@@ -16,10 +16,11 @@
- check if dev.biuro.lt, dev.biuro.lv, dev.biuro.ee works - check if dev.biuro.lt, dev.biuro.lv, dev.biuro.ee works
### DB backup ### DB backup
- `C:\web\dev.biuro> docker exec -i dev-biuro-mysql mysqldump -udev_user -pY6V6bFkD6@GyD!wTShgFmWz! --default-character-set=utf8 dev_biuro > docker/mariadb/data-002.sql` - `C:\web\dev.biuro> docker exec -i dev-biuro-mysql mysqldump -udev_user -pY6V6bFkD6@GyD!wTShgFmWz! --default-character-set=utf8 dev_biuro > docker/mariadb/data-004.sql`
- `sudo docker exec -i biuro-staging-mysql mysqldump -ustaging_user -p'qzl8pMNV^gZ&c1!7ebVsXqQh' --default-character-set=utf8 staging_biuro > docker/mariadb/data-005.sql`
### DB restore ### DB restore
- `C:\web\dev.biuro> docker exec -i dev-biuro-mysql mysql -udev_user -pY6V6bFkD6@GyD!wTShgFmWz! --default-character-set=utf8 dev_biuro < docker/mariadb/data-002.sql` - `C:\web\dev.biuro> docker exec -i dev-biuro-mysql mysql -udev_user -pY6V6bFkD6@GyD!wTShgFmWz! --default-character-set=utf8 dev_biuro < docker/mariadb/data-004.sql`
## Development ## Development
- `C:\web\dev.biuro\ npm install` - `C:\web\dev.biuro\ npm install`
...@@ -87,24 +88,13 @@ Restart docker (sometimes PC restart may be required) ...@@ -87,24 +88,13 @@ Restart docker (sometimes PC restart may be required)
- docker restart dev-biuro-nginx - docker restart dev-biuro-nginx
- docker restart dev-biuro-wordpress - docker restart dev-biuro-wordpress
- docker push simoncereska/ourdemo - sudo docker login --username=biuro --password=9Ndtjd2vKsLvGuFOeFq1KdJs
- docker pull simoncereska/ourdemo:0.0.0
- sudo docker login --username=simoncereska --password=rlgjsPeOuF2T6VgW8fGss81h
- sudo docker-compose up -d - sudo docker-compose up -d
- sudo docker restart staging-biuro-nginx - sudo docker restart staging-biuro-nginx
- curl docker - curl docker
- docker run -d -p 80:80 release:0.0.0
- docker run -d -p 80:80 -p 443:443 release:0.0.0
- docker run -d -p 80:80 simoncereska/ourdemo:0.0.1
- docker run -it simoncereska/ourdemo
- docker build -t release:0.0.0 .
- docker images - docker images
- docker rmi 568c4670fa80 - docker rmi 568c4670fa80
...@@ -113,15 +103,17 @@ Restart docker (sometimes PC restart may be required) ...@@ -113,15 +103,17 @@ Restart docker (sometimes PC restart may be required)
- docker load --input ourdemo.tar - docker load --input ourdemo.tar
- docker build -t simoncereska/biuro-staging:0.0.8 . - docker build -t biuro/web:0.0.1 .
- docker login --username=simoncereska --password=rlgjsPeOuF2T6VgW8fGss81h - docker login --username=biuro --password=9Ndtjd2vKsLvGuFOeFq1KdJs
- docker push simoncereska/biuro-staging:0.0.8 - docker push biuro/web:0.0.1
- docker pull biuro/web:0.0.0
- sudo chown -R www-data:www-data wordpress/wp-content/plugins - sudo chown -R www-data:www-data wordpress/wp-content/plugins
### DB preview ### DB preview
- `docker exec -it mysql bash` - `docker exec -it dev-biuro-wordpress bash`
- `docker exec -it dev-biuro-mysql bash`
- `mysql -uroot -pIiIjnsLi2wR9i1kWVbVpUAzP --default-character-set=utf8` - `mysql -uroot -pIiIjnsLi2wR9i1kWVbVpUAzP --default-character-set=utf8`
- `use wordpress;` - `use wordpress;`
- `show tables;` - `show tables;`
......
-----BEGIN CERTIFICATE-----
MIIFUDCCBDigAwIBAgISA9mzsJR5ciXLVrWOiCS6hGdUMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xOTAzMTMwNjE4MTBaFw0x
OTA2MTEwNjE4MTBaMBcxFTATBgNVBAMTDGRldi5iaXVyby5lZTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAK2MZ1r0jxaT+72K32sCPopOFRc7vMnaAEcI
KqMMBz79ZgUGQYhJQB1XjGr6ig+8Nb48+qKIAaVwsPAboem3YvymUYj4zzdML72O
eGFCKfdus+m53PnA9fmbpiTXQVt63zGjjFXnkXeX+3POO7TftiaPH/U1jPbyVZJ0
oK6eVm1VwOckPM23FpJFcGfWuPQKbXeVMd+6prWe/L6YuNYUygXceorB/STx3ACH
nNke7eNMIz761BYo9WsSUF5MDLoP0/vBf+px3kif8cGwDatwQyoLeRN7Qb28QKDD
ZTTE565gJWF4u8ZE8selxtslX1R97MzJAK7Lx6Xk2XUGiv0LAKkCAwEAAaOCAmEw
ggJdMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
AwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU7mhBhG43m0xTzbV8ph5ZUCkX2B0w
HwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUHAQEEYzBh
MC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
LzAXBgNVHREEEDAOggxkZXYuYml1cm8uZWUwTAYDVR0gBEUwQzAIBgZngQwBAgEw
NwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5j
cnlwdC5vcmcwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgDiaUuuJujpQAnohhu2
O4PUPuf+dIj7pI8okwGd3fHb/gAAAWl16mn5AAAEAwBHMEUCIAaxpwrnZoGsPQol
nDx5IPy1od1nuADqPE2zGyefnVyTAiEAwYLGl9i6HOowYJmjUi+d84p9G45pFCgN
QsiDvMG8QZQAdgApPFGWVMg5ZbqqUPxYB9S3b79Yeily3KTDDPTlRUf0eAAAAWl1
6mvtAAAEAwBHMEUCIQC9zzs/9gjwGxFZWqXI9cka5NPlNuW+sl/lOOArJTg9VwIg
cCYpvsxYXN4I1tAZcDwDPjTTPI0LV1Ql/6it1O2InC4wDQYJKoZIhvcNAQELBQAD
ggEBAINmgKkNY5dRZDtankobBOGAwwHXnJiCNBtsdfYPQCL/DBJ8F2wqnZ156DLs
9Sv5dPsKvXPJzacQTn2vSGjqMvj00pCSmm8FZVMdJeZZ+qXfCTLKTRSEfRUKxNFI
kT93pUKIB/gbaSVQkx7xW3GsMTHb94tih7O7iIwdWztBGYbJLAxT9COlusJRTGjx
OquO8cNEhEKwquwsMLnDgXF9gAjCNBz/EcC1G9EIaxl5HPr8jtVQcIAwLhHp26qS
MaEpCdPjufCDEFLrhBR2UViP164AnacTOoD+YHgZcQUzrkRZf6GHoA03/2X1Z2Oy
xBgY9ejhCCMp7iXOKw71JHFkvs8=
-----END CERTIFICATE-----
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIFdTCCBF2gAwIBAgISA4ujuYPUr58GoShRiGmuAecTMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xODEyMTMwNTU2MzJaFw0x
OTAzMTMwNTU2MzJaMBMxETAPBgNVBAMTCGJpdXJvLmVlMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEA1kxA+f/1qSDIhiyxxDj0Lj+kt3zGig317MiuC6S5
8aTqRrX+aQbMSuWhEkKAAgXg7apfr1xFmqGIv0aWcqH2vVQ+PHdGO4dnGdsdVVrA
IdcVNekN/66PnfC5cf0NlsmwmiN/iPLykeGK0A3p8VCCwFFIfJ6YjtO6lJKkAvEb
ucMKq1BIHUUDl1eSuz18H8frPqBQslStXToIWlmspIbb82uhOGBJYUYDppVfCMwv
ODrcpBsQrEOQ0c2TbZeaeZ97t5nAJ3F5LF8b8IZxRCML5rTnHWhHU6qTCERXxEX4
8oaVRlvBN5WeCCr7QWj3sSCI74Vzj+qjonC82XtwUqYhFwIDAQABo4ICijCCAoYw
DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM
BgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTpgGUo7JOrkjuiYOLYQvbin0vPvTAfBgNV
HSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBvBggrBgEFBQcBAQRjMGEwLgYI
KwYBBQUHMAGGImh0dHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlwdC5vcmcwLwYI
KwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5vcmcvMEEG
A1UdEQQ6MDiCCGJpdXJvLmVlggxkZXYuYml1cm8uZWWCEHN0YWdpbmcuYml1cm8u
ZWWCDHd3dy5iaXVyby5lZTBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLf
EwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCC
AQMGCisGAQQB1nkCBAIEgfQEgfEA7wB1AOJpS64m6OlACeiGG7Y7g9Q+5/50iPuk
jyiTAZ3d8dv+AAABZ6ZaRFwAAAQDAEYwRAIgEKGNkSgVjgZXDTPlwo68/1gt4I3t
8XEeK+3pjXKc5SoCIHjnxGV//NHssODSc6lj9+rqHq3nEZxUSthFtbBTv7h9AHYA
Y/Lbzeg7zCzPC3KEJ1drM6SNYXePvXWmOLHHaFRL2I0AAAFnplpCaQAABAMARzBF
AiEA2Ha5clsCtlLEUZPNBS2N5/JZ8R1YkwvGTX0vhfSALf8CICIpI3NgenI15WqI
FozzBpTiO3zsDb+d/f2DjAtW6ftDMA0GCSqGSIb3DQEBCwUAA4IBAQBE+67q27GC
lP9ioH0ownwvNq5K7tYPqeU8wXFQ7NmHWDDokHWOCKu/zdDIk8DTzS1XmonkZJy8
9GTyuIg8PLB3zweLIXQ/RP7Wml5yB3G7+T3aeD31/tUK1FxJwBowgcS81nBmJ+b4
gWYG39m3D3nPHbs1lJDwnACZeNyXVUODx1aliyoIOpmOBJL2FMdhzAE/sM85bsXJ
ZeuWPUUVfJW5oJdmUbrb2U+JOEq7S9LyQ0Cpt7fNuP0H2KA2bBC3ugq+KqPQrrw+
ShXsHrnGijA6Ni7+IJG48thLDYSimG/paUQL+ZVZ2KeQAh/c9EkgH0TneVdr0wus
PUwCZ4n1eP6Y
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtjGda9I8Wk/u9
it9rAj6KThUXO7zJ2gBHCCqjDAc+/WYFBkGISUAdV4xq+ooPvDW+PPqiiAGlcLDw
G6Hpt2L8plGI+M83TC+9jnhhQin3brPpudz5wPX5m6Yk10Fbet8xo4xV55F3l/tz
zju037Ymjx/1NYz28lWSdKCunlZtVcDnJDzNtxaSRXBn1rj0Cm13lTHfuqa1nvy+
mLjWFMoF3HqKwf0k8dwAh5zZHu3jTCM++tQWKPVrElBeTAy6D9P7wX/qcd5In/HB
sA2rcEMqC3kTe0G9vECgw2U0xOeuYCVheLvGRPLHpcbbJV9UfezMyQCuy8el5Nl1
Bor9CwCpAgMBAAECggEABhTHiu7LJnuG/bDbV5VJQ3DR2Tr+NhdXCt0AQFPHJKad
3q98uBSKJnPqwGe/5UqvLI6hBawYXPVG7e5eg+pytjiFJ72vCtiSb64b6OSKMn07
2PKhnArJnNsMYcL0Bua64fxBii9YptdwpXrkqY6ROvjyWLqRyTqSnMJxJ4Qa1uWZ
JQ2uujsCUdL9ltoOnrfX2dO0c6OuRFu379jaKbz9YJaEw7qIa4P42ERShMLq9PwL
paJo4XhO7NMIJTr5qwI4BJYcz8uCXayfZU2BogKbRLXmCCqA0QDrClcACD4Wmg5C
2iQ6hCc63w0STiiNrpTPN/oZmPcdkRCLZPQhArOfUQKBgQDXcArea/7n6ebCDUgn
I1C4y+5/i3z/TZVEz8R820NdHdjgGYwwJdbocXp1r0J3EFLS7ie+QJXPN8rJ0NjN
NIGF3/0fOybckBF9x3fbrvHLL7x4etr7AYgibLLEGQaCXbHvJGG8y/CBcbLqnYTF
xOoclUVhFnDSZwyEW6bh/UM2fQKBgQDOOVP3bxw2NX9go8HkZbwsqDJ1UAF/lrNq
/4rVTpGBDRmSpKG9/Us6jyj/nI3/32U3mnkU3D4MQlFWx3PpkwqVZWhE02A7s1mj
A2dHHAP0q3WiU6xhrBGmjy9vbRO1lCvnroh0WlcZeeH0pQO4marEpaJf+2UrqINm
LeQRSALOnQKBgQCDqjkqSExohh3+mMlxCfdKiXAASUqiaVMB1Azc1dBst1IVW+e+
gVG/i6LxC6SOSc6klOJ7NtOX6hwojVgCycUjAYqcLLWKdQ4Llf2dqGSj7k+8PjFY
2E3P5Ci5CiZdRE/7vHtzPByHr+pN0ukTSU5fG6dkN6fKHyqaNb1fPj52rQKBgFMb
YU5G9byW5KVieSH9Kc9pXSRPwLrVVaraHu4FgrfaOqMRO6lgKXAI/4G7arJiKd01
oHQaqdqw4yywpnLL8ijwvAt4j8Cfb5E1LurGTIXOj1KCm+akvFw+OeSSta2ob+Un
PhB907oNl1TLJ2u+acZj5cL+gfANMh78gXvBZHg1AoGBAJge+WxP7TSila4r2ZT2
n7CkSH8v5GrHUY7lKFTPqhV89FvhcF3jSg4TJx3EbD0LrzenppE/yA0ozuMRZA/M
GrPastMm2z+yvwb49DZruZ+UkidYpH4x+MIYVblHJn3ZVzQ1BRPpP0Kni12g57Wi
vuimYdjZ9yw+eYw2GLrMu9hA
-----END PRIVATE KEY-----
\ No newline at end of file
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDWTED5//WpIMiG
LLHEOPQuP6S3fMaKDfXsyK4LpLnxpOpGtf5pBsxK5aESQoACBeDtql+vXEWaoYi/
RpZyofa9VD48d0Y7h2cZ2x1VWsAh1xU16Q3/ro+d8Llx/Q2WybCaI3+I8vKR4YrQ
DenxUILAUUh8npiO07qUkqQC8Ru5wwqrUEgdRQOXV5K7PXwfx+s+oFCyVK1dOgha
Waykhtvza6E4YElhRgOmlV8IzC84OtykGxCsQ5DRzZNtl5p5n3u3mcAncXksXxvw
hnFEIwvmtOcdaEdTqpMIRFfERfjyhpVGW8E3lZ4IKvtBaPexIIjvhXOP6qOicLzZ
e3BSpiEXAgMBAAECggEALsfNpWWJWKbV72hhVA8EyvXMvNtpsehzR4HVcKhAiS4x
kEcZZw77WNxA6a4HqKlk3S0En1DaxvM9WVgM7rBJnzH9NhDpjYQ07xGEmUXqzFha
An9CNY8DPfy3VtlhdonH2hYmuJwkdNESDvICoFGtgVMdKksqzX8N63IJiLTekxHJ
BhUAroMKLQPbuPwadau2N2vRmxQRC0iYB+uQEVRcYgx2fzg4MJDTisMNzO4CaoyF
hVBglCRrkul/bo1kwB6PtbAzHXVsfjR99D9CTESp7AKAQtyq7uEuIwAtAvi5i1kz
li/k3ZEnFnniy7DIH5iGgein5qnYlRSt+VUzIGSumQKBgQDsMiwk3sVQETYEf9XB
vsEBzKBsTtPPXhWPEze9mIKDf/hvlRhp0l7qdIRr3lSbMSQxK84WhXY2c2WO1wIY
x4xi4Qn778mHb7RMNwMBDchq6rer+qU//0VufjNVLttyFiG9e43v/HLTSFTEHHCY
cp2vxWd29Hpq7VhNQerZDDj9yQKBgQDoRAyeyvHREN8Or8pnwfboYx6/8xBGsmki
3h7CADVO/JeSToNfUOZc4wkqNUBp9TtC/7uk8K6QBJPMXU79czUgHdNvnvB132ZR
xhI47/gDBbKyolaPIEkslp9WpZjTv/3mbnQdKiwO7E3ClzjGl8yh2LSjsf+MOpIf
cdvvJpQX3wKBgQCwYkNfAVFeGow5TfGmLrpZiqMeXruENyFoaBSPLI4Cf5VaVoAV
vnkNIxgkqbKK9matpaXQYbhGr2RfCCdTs+kdiip3jrjzwDJnXAmNRuqtFT02XAX9
xbbm7a2N5mEQUIC/zL3RQrfJGlHa5dYbsjQZqBQ83BNzOG1hvGER1zPUKQKBgHP2
BZcCG9kVY0gh3BwRawR6+E89O1MQoA0YeKLDF9pnogUZzd04tsqJT3oTPCWqmfvJ
UhX3VC/zGRdfPqCrdEqkmXuRDtzKvHr3OQHUTS61GZK2GiE7LU1lpgfMhZCyukDh
xHcLJxQMRoZwmZgNEc18NDPGGqAYXfv1DKlJyYZhAoGAJ+lXklUrznejkhja7f+a
jcxyxcmEaib2CcF34PYBQyAExzfroWHfTBv/IXTOrU1UtvTYET2JmPBj1975fbSe
nysSV/tkHM6WEjRESjbe16HCGT/Y7R9plq53rAp/KTYcNnkgNL9TqJasKJMM3he9
Ty+DTGlUsmef+Rnabb8n69Q=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIIFdjCCBF6gAwIBAgISA7PuB239ajK5xTr/Mo8cq7GeMA0GCSqGSIb3DQEBCwUA MIIFUDCCBDigAwIBAgISAyz1WlvtTwY+MFAgHi/Xgu19MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xODEyMTIxMzExMjNaFw0x ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xOTAzMTMwNjA5MThaFw0x
OTAzMTIxMzExMjNaMBMxETAPBgNVBAMTCGJpdXJvLmx0MIIBIjANBgkqhkiG9w0B OTA2MTEwNjA5MThaMBcxFTATBgNVBAMTDGRldi5iaXVyby5sdDCCASIwDQYJKoZI
AQEFAAOCAQ8AMIIBCgKCAQEAuX61TmS7TxCJbZNf49rcw18vjh2oqbQe4pDi4DnB hvcNAQEBBQADggEPADCCAQoCggEBAK44Jy0ldITO/Bg588yto5ImSfKK3KdfRn7n
VbyN9Dpc7+kwWsESZYE9czdzuEpn/5ypqpP+H5kpxNHbSKqON0VFBxKQJbx+DaOp 6VKO1920bhaLKTK2O1TDrELjOIGwIKA2dt0HNfdzF3NeAF2bmKp/1NVYJJKUYP0K
e4SaDzktt9/0UA/4v8E/D4ZVpxbwNX6ntt/7JyR4l8gmAktdOHAQ9DjrfayAIfNq S0V0MUVAWvufbqVFs4Ez9l1TjYIFZlpVSCg9FSlIfskJK/MaXe5nEth2dqj5czjf
vZPib2r/LaaaU9W8fDJEoxYP4JLiz2GRO8jhWSwDZGie8vCz4hJ7HSv3S+FaMJGe 9JIDT9jNlcMKRlhzPTpY2gKvu8FuytggLmsk9au8lzI0PyvWHAl9gAGZXNLCjt/C
lWL87WUfKr8exLf2kGWD9ThuHFgK1VxGTyFQKotwxQmdaqB7oG2GFh2O1EQjdb1B UqfgdYhHRB5e8gNf1cXdrkZgI/c8a1v/9Pb9HFPHYY7oBicAoGMlk3cYBM4wfzYL
f0Q1DPlDSyny9kAQOKDICzT8PtFb8xTrWhm96A1+JUvlOwIDAQABo4ICizCCAocw LG/YXOWDt/+Jr48hvKFbP1PvTd1swyDhOoZFZmDMNwjmTPAmHJ8CAwEAAaOCAmEw
DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM ggJdMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
BgNVHRMBAf8EAjAAMB0GA1UdDgQWBBR7LmltXQ7Ty+IRx9Y2tcJOE/FeDTAfBgNV AwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUZEXaoRehGe1f0LFXnCqo2DXMKKkw
HSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBvBggrBgEFBQcBAQRjMGEwLgYI HwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUHAQEEYzBh
KwYBBQUHMAGGImh0dHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlwdC5vcmcwLwYI MC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
KwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5vcmcvMEEG MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
A1UdEQQ6MDiCCGJpdXJvLmx0ggxkZXYuYml1cm8ubHSCEHN0YWdpbmcuYml1cm8u LzAXBgNVHREEEDAOggxkZXYuYml1cm8ubHQwTAYDVR0gBEUwQzAIBgZngQwBAgEw
bHSCDHd3dy5iaXVyby5sdDBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLf NwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5j
EwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCC cnlwdC5vcmcwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgB0ftqDMa0zEJEhnM4l
AQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2AOJpS64m6OlACeiGG7Y7g9Q+5/50iPuk T0Jwwr/9XkIgCMY3NXnmEHvMVgAAAWl14kzLAAAEAwBHMEUCIDmAkK2QVG3Y/XhF
jyiTAZ3d8dv+AAABZ6LCBfkAAAQDAEcwRQIhANlInn2gqgVXwAcS879BxPCCGUkT d/7z2ewxufcEWh00ZagT77M/wJF0AiEA4bSPOe54wvmKhMSB9OP6i0Ffy2C/Gh6F
+hY76gXucWQyfbqTAiAjazlEIYhzg+LZHAzYygbRT9CJl7RR/lmSIUsWRhjT1wB2 sxYLCryRORsAdgBj8tvN6DvMLM8LcoQnV2szpI1hd4+9daY4scdoVEvYjQAAAWl1
ACk8UZZUyDlluqpQ/FgH1Ldvv1h6KXLcpMMM9OVFR/R4AAABZ6LCBfoAAAQDAEcw 4kq5AAAEAwBHMEUCIQCmTWEx75r+6lS+gyDZAZmWhZ9EyleesxOBIBonKi0FvgIg
RQIgbq6mDsB1VIx6ow9kS7+HACOg6q7adlGBlfMk1FMG1TYCIQCQ/PkN4OEd4uzF bORao2OyRYrwhve3BIx8srPP88p5xox4lK6dEen7xWYwDQYJKoZIhvcNAQELBQAD
rAUqT395TEfdXhsJKlPqYFaAd0NySTANBgkqhkiG9w0BAQsFAAOCAQEARTMgz/u+ ggEBADpWFozE+tzt6xC8bN2ZxOBb2ACW72RYNRgWGmLg3iio8V4VqF4OE9C2ozSf
SFFK3U8dZMrxTLWPi5Igm0y2/o/lZq32mTOgmodVB8qjE7GVfp2sw7mEHQHOzi4z 2bQ5uIO1RsEVlGXKkqFeOPdecmAsbZfSAxTfYIyKdNarBeUIV7p9imH5oHEQhorM
uhhOs9s70VSufqXoi7x5usvbw9Z2F9hOPtRxEYcr2DfYfn87OVr26a8My8np39AC gwkmljYJLRBud4URmVyUtTW/rVnL1yg/YtzJr9WuYP+XUj/z6YTOfFSKlgKv2UJZ
1FP7g1HEKzXGgJ9RXxLMK5JxCfHXxdWxrEa9Z6HKOpzvvnaL7T5FFwrg3Y2IZS8A /NyvDK0hBz+eeLyCBwHnWvYF62fkvKgiCVFLTGE0RDOlHOiCHcr6/axCEBmw/7W1
JN+OioSQu4st9nkABVjWnbq2M+MIMLDpfLf9YR1OCl1uDVXGpYJSlOExRDLeUHrM UrMzkkhKdfa/qkNMR6XyrP+Uu0kXfd9Rxp0NYGm5BOMPKd0SGTspoZalJFf6uNYj
KYRMxAfXLdRiMKytxUzkV2Fzi+BoA9unRr/njTQBwFdmagurPt63W1LxwKOi8ZSs p9b7zuHKH+3LFh5uH2Ll17pPg2M=
yycuXMI/XBSm2Q==
-----END CERTIFICATE----- -----END CERTIFICATE-----
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIFdjCCBF6gAwIBAgISA7PuB239ajK5xTr/Mo8cq7GeMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xODEyMTIxMzExMjNaFw0x
OTAzMTIxMzExMjNaMBMxETAPBgNVBAMTCGJpdXJvLmx0MIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAuX61TmS7TxCJbZNf49rcw18vjh2oqbQe4pDi4DnB
VbyN9Dpc7+kwWsESZYE9czdzuEpn/5ypqpP+H5kpxNHbSKqON0VFBxKQJbx+DaOp
e4SaDzktt9/0UA/4v8E/D4ZVpxbwNX6ntt/7JyR4l8gmAktdOHAQ9DjrfayAIfNq
vZPib2r/LaaaU9W8fDJEoxYP4JLiz2GRO8jhWSwDZGie8vCz4hJ7HSv3S+FaMJGe
lWL87WUfKr8exLf2kGWD9ThuHFgK1VxGTyFQKotwxQmdaqB7oG2GFh2O1EQjdb1B
f0Q1DPlDSyny9kAQOKDICzT8PtFb8xTrWhm96A1+JUvlOwIDAQABo4ICizCCAocw
DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM
BgNVHRMBAf8EAjAAMB0GA1UdDgQWBBR7LmltXQ7Ty+IRx9Y2tcJOE/FeDTAfBgNV
HSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBvBggrBgEFBQcBAQRjMGEwLgYI
KwYBBQUHMAGGImh0dHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlwdC5vcmcwLwYI
KwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5vcmcvMEEG
A1UdEQQ6MDiCCGJpdXJvLmx0ggxkZXYuYml1cm8ubHSCEHN0YWdpbmcuYml1cm8u
bHSCDHd3dy5iaXVyby5sdDBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLf
EwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCC
AQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2AOJpS64m6OlACeiGG7Y7g9Q+5/50iPuk
jyiTAZ3d8dv+AAABZ6LCBfkAAAQDAEcwRQIhANlInn2gqgVXwAcS879BxPCCGUkT
+hY76gXucWQyfbqTAiAjazlEIYhzg+LZHAzYygbRT9CJl7RR/lmSIUsWRhjT1wB2
ACk8UZZUyDlluqpQ/FgH1Ldvv1h6KXLcpMMM9OVFR/R4AAABZ6LCBfoAAAQDAEcw
RQIgbq6mDsB1VIx6ow9kS7+HACOg6q7adlGBlfMk1FMG1TYCIQCQ/PkN4OEd4uzF
rAUqT395TEfdXhsJKlPqYFaAd0NySTANBgkqhkiG9w0BAQsFAAOCAQEARTMgz/u+
SFFK3U8dZMrxTLWPi5Igm0y2/o/lZq32mTOgmodVB8qjE7GVfp2sw7mEHQHOzi4z
uhhOs9s70VSufqXoi7x5usvbw9Z2F9hOPtRxEYcr2DfYfn87OVr26a8My8np39AC
1FP7g1HEKzXGgJ9RXxLMK5JxCfHXxdWxrEa9Z6HKOpzvvnaL7T5FFwrg3Y2IZS8A
JN+OioSQu4st9nkABVjWnbq2M+MIMLDpfLf9YR1OCl1uDVXGpYJSlOExRDLeUHrM
KYRMxAfXLdRiMKytxUzkV2Fzi+BoA9unRr/njTQBwFdmagurPt63W1LxwKOi8ZSs
yycuXMI/XBSm2Q==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY----- -----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC5frVOZLtPEIlt MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCuOCctJXSEzvwY
k1/j2tzDXy+OHaiptB7ikOLgOcFVvI30Olzv6TBawRJlgT1zN3O4Smf/nKmqk/4f OfPMraOSJknyitynX0Z+5+lSjtfdtG4WiykytjtUw6xC4ziBsCCgNnbdBzX3cxdz
mSnE0dtIqo43RUUHEpAlvH4No6l7hJoPOS233/RQD/i/wT8PhlWnFvA1fqe23/sn XgBdm5iqf9TVWCSSlGD9CktFdDFFQFr7n26lRbOBM/ZdU42CBWZaVUgoPRUpSH7J
JHiXyCYCS104cBD0OOt9rIAh82q9k+Jvav8tpppT1bx8MkSjFg/gkuLPYZE7yOFZ CSvzGl3uZxLYdnao+XM43/SSA0/YzZXDCkZYcz06WNoCr7vBbsrYIC5rJPWrvJcy
LANkaJ7y8LPiEnsdK/dL4VowkZ6VYvztZR8qvx7Et/aQZYP1OG4cWArVXEZPIVAq ND8r1hwJfYABmVzSwo7fwlKn4HWIR0QeXvIDX9XF3a5GYCP3PGtb//T2/RxTx2GO
i3DFCZ1qoHugbYYWHY7URCN1vUF/RDUM+UNLKfL2QBA4oMgLNPw+0VvzFOtaGb3o 6AYnAKBjJZN3GATOMH82Cyxv2Fzlg7f/ia+PIbyhWz9T703dbMMg4TqGRWZgzDcI
DX4lS+U7AgMBAAECggEAPE3fL5877dZYd1EkKXVrs/BsC23E+XbfW5TyzSa5nd/w 5kzwJhyfAgMBAAECggEAEpTuqMQL73ZcMQFNXZFPlvD6hiIFctyYmkSGAEY4A++Q
3mdi83QCDl8aVfmQOrbaXh2Cde0+k4ANa8RleeEnwxX/qiRQ7p2wUzRWXqTIYqmX plrlZAFHxrywDNpLVpnAgRYOC3kPanseDzIBe/pyiAzmWHL0Q6YLyjFk4d2Iu8gn
VD+oh1C9opGusthmYeuwSOQCL8H/UEq84drPgbjF8pUBt2lneZ5PoMnF1kPGfd7Z bBsPJBWRFcDDECUvPKTyy8O41IHfVe3jh/GwfFddmWXo/qlz8oXYokJQxZoQ1CC8
uxkdP4qykBxxd5BVQKfzy+sl+GSvt48j6PLhECDbhntHFALZ8fCISb4ZUe5j3qj8 J3v/Huk9BzcwaGr2wLmFOMZtldCyPehXzXoLDaKi2ago7MNF8j7pfBR/58JPAOup
JfFYADxf6g1Mvym4fZMTqtnNrfEjJmn1mrgy7zTDEyKcmf04u2fX1ZBrGWz1Y1+P O+1Z4OrvAgszRPO161k98hJ0ZAqyYTUqUGW35JTA2nJG13bar52OE9putz6VOtzB
pkWXv3WLSVzRmP+59tmGPSu22MAQO2akG5YaOiDf0QKBgQDvboBn/NvT9gxmIEuX V6vAxioKt5eizLm1nuCLn4GROxzSRf0+osVv0SmpIQKBgQDh5ovTbDWWmiPg3s7t
dUT9/Tr2o71fazbs1+dp85yayVHp3ZmsdTn84bFkREczSaBCmzMBiaCYfyclAKMa 0ejZ4FQ8ve1l1SeVnFstBF4ayUuTERXS6Cq2PMkd3MicE8ldDuabgeMejPXy8OOV
EG/SPZIxcbn9Iu3CWOnokSMnNXk1082Rao/VKE9F9murzyFVHni2uRrRLI8TixTk hlU8LCYZ47BqvD9vdg3MmuiWrBUeJ+apC8FqIkcmNSaD+fXdYAKi0KVSl42vx3uF
+kBPNcMcDeLGex/7nWCJaGE/BwKBgQDGVLnBgD0QZT96TxhWm7HrqBigdHiHgW0r eMFsYfQ8GrAlMpU2gUZCsVqKKQKBgQDFbsN/x/hcaNLomcGhod7wXwPkVjBO6zdo
m0KCMNPzWVX1BGBqoWELtrJc6yosFRSRJSsNJjik5+czHvoxelUaGtUHv2XPrap7 ELCLrvzualk89xlNzDy8eSZTxH44tHxb1P9EVKFE2N6/W2I6iKp87XlfMhjRrYWe
bVpVPZaao7kL7QtjhEGg/8wBQcyWq1e67R4SGNUQjADIH/DsxItDiCeyr07TMmBB iacDoElartG2EdKSF4nm8/UnDlUZQHLRc5y2+Wubtqd1KpMxe160ImzuImgoGaZj
lH7kJ2hnLQKBgBPC2gQ7IWWYHCPdrH9+pUgVO2WZ1AppDep0U1wySA2aahFUQdez fI/nbkdZhwKBgCyCkZBx5Mksy971583iK0AqvE5PmeQTsL4A1dIz5xreCL8MgcFR
ASs28W4mGH5KKFj2+Dm7Qy7y56ctK0j+bEw82rEMAt66oEb3Ea8pM26MAkoIBiJn r4DCz1nL89cU6vskAXooiIive5KHtj/y/P5jMIqvW0Zcmx8qIqPq7eMqOur7L66l
WiGspwZONUrD2KtuzWW/V1BGTjS9uObBJMek10qcdsgM53Hb5ljQ7Z3HAoGBAIh/ O1HfOSelF1avvKsGzN4pwDla1TcKViNBXNMvJcFl/MkHg3D+3cosScupAoGADYOl
rWzoxp4vINYb88M/2t82zOQ55O5V/H3jmI2j72vvk0JTpcwdj34RWoaq71Zxl7sh ciu3/mtWdIGB1ZSE9CMs2wZjTCOhqUfrLcSOn6s77IZlfwPJ7ITGcNl0YmFIWejc
mpStNpUAalX7vvQonsOdrfpsFzUs8EWMiHxcK/f4MJZtqcXvM4AMLSq8T4NvH60u iEratyG5LZQNxz/vm5mNw0xkkoW0LcPyYLcqDkEFLddOeJ2P3PU6BLBgdtgIg/nL
HuETqCiAQtV5bkZ2KubqoW/QSe7/H9Ji0kZSfP9tAoGBAMtOM6Gx5snEMAmRJArk 8mJkUUZRdB2z8aEmPGJW3n4Qbx5CW3D9ULQlwiUCgYAt2QGFWHWD2I7AUXF1fOdx
jGvm3B6nHzdJ1kKy7a+/O7Hm4y1GBacKKJdPoACbdwHCLbgs4NH0OmYaB6T5miVI tTEgWpiz1sDjVvDrBzWHgm362rYt6Xx229vPqoAN1gwDOwWybEM6i8pZkgJJgoW0
u5+g1E9eq84i2qhPF3e1ZvSK9G826fGLSw1MeRdEaCm/nJwqudDAlgEJviKFNs0U KNEtAcFqD6SmbC4Y+DvL6YLN9YsKtM9/gbN+Q4JSa1i9ziOBCejeda1D8Y8IRbT7
HCHAkM7R2ySMwwyhAn6MzFSF iuBfZ0b1wSkfeDp4jn4P/w==
-----END PRIVATE KEY----- -----END PRIVATE KEY-----
\ No newline at end of file
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC5frVOZLtPEIlt
k1/j2tzDXy+OHaiptB7ikOLgOcFVvI30Olzv6TBawRJlgT1zN3O4Smf/nKmqk/4f
mSnE0dtIqo43RUUHEpAlvH4No6l7hJoPOS233/RQD/i/wT8PhlWnFvA1fqe23/sn
JHiXyCYCS104cBD0OOt9rIAh82q9k+Jvav8tpppT1bx8MkSjFg/gkuLPYZE7yOFZ
LANkaJ7y8LPiEnsdK/dL4VowkZ6VYvztZR8qvx7Et/aQZYP1OG4cWArVXEZPIVAq
i3DFCZ1qoHugbYYWHY7URCN1vUF/RDUM+UNLKfL2QBA4oMgLNPw+0VvzFOtaGb3o
DX4lS+U7AgMBAAECggEAPE3fL5877dZYd1EkKXVrs/BsC23E+XbfW5TyzSa5nd/w
3mdi83QCDl8aVfmQOrbaXh2Cde0+k4ANa8RleeEnwxX/qiRQ7p2wUzRWXqTIYqmX
VD+oh1C9opGusthmYeuwSOQCL8H/UEq84drPgbjF8pUBt2lneZ5PoMnF1kPGfd7Z
uxkdP4qykBxxd5BVQKfzy+sl+GSvt48j6PLhECDbhntHFALZ8fCISb4ZUe5j3qj8
JfFYADxf6g1Mvym4fZMTqtnNrfEjJmn1mrgy7zTDEyKcmf04u2fX1ZBrGWz1Y1+P
pkWXv3WLSVzRmP+59tmGPSu22MAQO2akG5YaOiDf0QKBgQDvboBn/NvT9gxmIEuX
dUT9/Tr2o71fazbs1+dp85yayVHp3ZmsdTn84bFkREczSaBCmzMBiaCYfyclAKMa
EG/SPZIxcbn9Iu3CWOnokSMnNXk1082Rao/VKE9F9murzyFVHni2uRrRLI8TixTk
+kBPNcMcDeLGex/7nWCJaGE/BwKBgQDGVLnBgD0QZT96TxhWm7HrqBigdHiHgW0r
m0KCMNPzWVX1BGBqoWELtrJc6yosFRSRJSsNJjik5+czHvoxelUaGtUHv2XPrap7
bVpVPZaao7kL7QtjhEGg/8wBQcyWq1e67R4SGNUQjADIH/DsxItDiCeyr07TMmBB
lH7kJ2hnLQKBgBPC2gQ7IWWYHCPdrH9+pUgVO2WZ1AppDep0U1wySA2aahFUQdez
ASs28W4mGH5KKFj2+Dm7Qy7y56ctK0j+bEw82rEMAt66oEb3Ea8pM26MAkoIBiJn
WiGspwZONUrD2KtuzWW/V1BGTjS9uObBJMek10qcdsgM53Hb5ljQ7Z3HAoGBAIh/
rWzoxp4vINYb88M/2t82zOQ55O5V/H3jmI2j72vvk0JTpcwdj34RWoaq71Zxl7sh
mpStNpUAalX7vvQonsOdrfpsFzUs8EWMiHxcK/f4MJZtqcXvM4AMLSq8T4NvH60u
HuETqCiAQtV5bkZ2KubqoW/QSe7/H9Ji0kZSfP9tAoGBAMtOM6Gx5snEMAmRJArk
jGvm3B6nHzdJ1kKy7a+/O7Hm4y1GBacKKJdPoACbdwHCLbgs4NH0OmYaB6T5miVI
u5+g1E9eq84i2qhPF3e1ZvSK9G826fGLSw1MeRdEaCm/nJwqudDAlgEJviKFNs0U
HCHAkM7R2ySMwwyhAn6MzFSF
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFUjCCBDqgAwIBAgISA5vMqkousJFf5C7XNAVHhG3hMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xOTAzMTMwNjE2MDJaFw0x
OTA2MTEwNjE2MDJaMBcxFTATBgNVBAMTDGRldi5iaXVyby5sdjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBALNbTQ4zAUaacv4TzcrvNsD21tQPgMgRlt12
dvLmj5aFtJ1PHLJqbuV2QBJCOFysAf5dnp2V++sec4D2uPtS9mWV4JwkrTlzaS0R
Cj/9wHnAQU6tWQuEVpLgLeCwfQmsQOpwyd0JVC94SoUvBzjjjxyjeA8S848Cge3S
R50WbObLy4/gmANOs0INhL0GrawNlAuq52Ss15np+L0YA13ntV9u6nS34pYmKiKJ
9XK/B9ZcAr4O2ulTF9gUskuon5JCofWt/les8FTXe3jNlhtLF1txFQhvzhmSsNlN
XbU3rUaGv2l6GgI/EESMM4cQ6Ko0zYOeDKn8YWX4Bx/bW5u6cS8CAwEAAaOCAmMw
ggJfMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
AwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUBX4KUqipj5GU2AlsWYfVqwgLJHgw
HwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUHAQEEYzBh
MC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
LzAXBgNVHREEEDAOggxkZXYuYml1cm8ubHYwTAYDVR0gBEUwQzAIBgZngQwBAgEw
NwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5j
cnlwdC5vcmcwggEGBgorBgEEAdZ5AgQCBIH3BIH0APIAdwDiaUuuJujpQAnohhu2
O4PUPuf+dIj7pI8okwGd3fHb/gAAAWl16HdHAAAEAwBIMEYCIQCMHt92oa11zYNu
Gn7ajl36OL19VudrZRXFHW+tSf5RAwIhAKre+jnPDK+NfTWoIigWaECHm2crVQNZ
WDXp1/+lxFBMAHcAKTxRllTIOWW6qlD8WAfUt2+/WHopctykwwz05UVH9HgAAAFp
deh1TwAABAMASDBGAiEA3PSdpak/lvy4EUx3INh0KS4WFLHTow+P8Eg8j+33EfwC
IQDmjOUxJO5MC06TfJ8AZtbjqzadjjWdXxTFr8Unlpkn1DANBgkqhkiG9w0BAQsF
AAOCAQEAA7c+SxN9RpK9bz/R9/m+IN4Ax1+w4cMRs4l7tuJonRzG220xQ6EuxG0H
8HrKAQ8cNedylCfhlHlsrfAoy1SYherE49g4J8t8/QpMTpgIAwrY4sgNpmyRLWN7
e4Rlygauoj0VBDASBg5jXxyGD+EQxY0qWaUbCFsUQvTN7AaUJVnyH2tdOfKiNslD
KvoBgXXuO0tFS4rGVMbz/f3GTslMp5nOVtmEypDF0td5TEjYrS+li2s3sc0gy2f4
pJWq11zpL3I6B1PXfhuFDwEGf653cheC9UxnKoO1z19h6IweN+6/Qyt7g8Ka1GS+
xW7vFVkUY9O6b6rmTs7waypbLLciCw==
-----END CERTIFICATE-----
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIFdTCCBF2gAwIBAgISAx3DpW3B2YYmavHTM+Jl9wTCMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xODEyMTQwNTM4MzdaFw0x
OTAzMTQwNTM4MzdaMBMxETAPBgNVBAMTCGJpdXJvLmx2MIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAmI15ZcOTi2Nm3Lz1JHRT9j74ype4QYYnG4awz0Yg
OU7YvLZBEiNXAYHeSrIJ6JVhqgzuFChPfJ3mqE4udCMP5rqCT7qA74GYG4sisiev
i6stOB7SShcsd7aTKXGuj2RsqQnhQEDpoHV+7EJelqK3wUDWz/OILGtRoquLJet3
WXOTBsMPHkG3j/aDNQSt05CVtK4qY7oFhDWQsEHdespQ6rS6mdBwFDlyxDOpDLpN
DzLbFdURMplPXsaB0cJSX29j/RW+OVEdgS6YzrjFwaAaWS33wQSF0HXuFc1XpgZO
n1yVd17FFSgQ7dcpTyAahe2ZTSCTx0mqavVp3evGQkYVzwIDAQABo4ICijCCAoYw
DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM
BgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTrKY9/iRbSYpLy5mlHzROpnbO5/zAfBgNV
HSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBvBggrBgEFBQcBAQRjMGEwLgYI
KwYBBQUHMAGGImh0dHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlwdC5vcmcwLwYI
KwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5vcmcvMEEG
A1UdEQQ6MDiCCGJpdXJvLmx2ggxkZXYuYml1cm8ubHaCEHN0YWdpbmcuYml1cm8u
bHaCDHd3dy5iaXVyby5sdjBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLf
EwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCC
AQMGCisGAQQB1nkCBAIEgfQEgfEA7wB1ACk8UZZUyDlluqpQ/FgH1Ldvv1h6KXLc
pMMM9OVFR/R4AAABZ6twN/sAAAQDAEYwRAIgVzEdMqfXOhCn3vWES4VYObl3a0TA
K+B/mbx+czCLf/cCIDWkkCOP/LhYZs0alYH4b+x2ojB2pI3OLuqT3/9oMXA1AHYA
dH7agzGtMxCRIZzOJU9CcMK//V5CIAjGNzV55hB7zFYAAAFnq3A6WQAABAMARzBF
AiB+dUrdUY159aooUmcvvYcvTghM68oV09gMEd5QdCJ+GwIhAOngDvKIFhOdcYVU
QTOPy2F0ZK27cnRvNkjgM1o9ysRNMA0GCSqGSIb3DQEBCwUAA4IBAQCJkVuGlpBX
4vFHJtWk7W3Qm7lU6zVYvBgFtjqoLUAhzHuw/orAHOhiCESiyrQfQWRv8wHyz5GR
eboOyAbDYVxed8TN2AcmaMxtrQgfaDP4ZUqvqh7cmfrotYX61Zi1PuBqyaI6zwio
Y5xJgN/w6CvVljtQms6RLTB4axGOK1Ef+V2onoTxFgHvP0TBaeYpPbh2R8zvATXL
oy5VzRxYZylLmQLZgXNQy2hjvkwmsSnahKhZn1iUAKDCwYbSstyBn2f15LrJdvOc
e+M/nbV7M/fEAOf+Y8oy1Bokt0Kww8wUGtFs8jmd4KZTsPsQfgY3tDpy+vLRSnHk
5Ql1KxbEETDZ
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCzW00OMwFGmnL+
E83K7zbA9tbUD4DIEZbddnby5o+WhbSdTxyyam7ldkASQjhcrAH+XZ6dlfvrHnOA
9rj7UvZlleCcJK05c2ktEQo//cB5wEFOrVkLhFaS4C3gsH0JrEDqcMndCVQveEqF
Lwc4448co3gPEvOPAoHt0kedFmzmy8uP4JgDTrNCDYS9Bq2sDZQLqudkrNeZ6fi9
GANd57Vfbup0t+KWJioiifVyvwfWXAK+DtrpUxfYFLJLqJ+SQqH1rf5XrPBU13t4
zZYbSxdbcRUIb84ZkrDZTV21N61Ghr9pehoCPxBEjDOHEOiqNM2Dngyp/GFl+Acf
21ubunEvAgMBAAECggEACQbu3WiWx1ltsTkI8g5RKKwjyt+O4UL1X2cffIE7N925
5fL95EL0Gut1NRYNJSjpHsbSfWb3m3FYaeTBEbEuwpUlDWbRKyOSZxjE9cyNO/N/
tfiGk0xRWSocVQM8/9giGkqb9lqKWKtKwOJJkETvxoa5u7R9+rQrGu+q+A6RY5pH
qxWIOotXXAaFCXEXBgQsuTLwetly5Ub8iDTBTbZkHan633KzTtiRLPcduO2SoqBs
btnC9AaIMebwNhtFzYpl2+/lDXrKD9Dckree7ROQBSm16f2yilgsfNR/AXVY41W1
R0f/AZ4gweSzEymp68kHr61Hcf9umtAbJ0QKHOFPCQKBgQDdnK9HOnc+mVdo95FP
fmuvHYnQUsB2b5Da6pH5y4/QZTEmlysuv/T8/xGzGqTLRQi+ZIWFYamzfRyjRW1N
2QSLhF9RK7qCZ1NO7bFqYvkHs+UAgKgT2rbu7igOaK7AJ1w1mQF618bxI0n+ckNk
JJVtDBj25JYN3BM3xK8GjFFS+QKBgQDPMBAc0WmG8l+lG2chAzPcrKbWvzIOJJND
D4rZOPWJKMzqcZZEgAPFrjc04A3aS++56MClrgqfHK0AAMzY0fIxHWPddJpqT4uE
ULtDJKqbm8VtxHafHgMoezFuCVXK4ZMIZhV9eU/GB+IWqx3qi64WGXU+L1kpzb+P
Logn0bdHZwKBgD6eRVClDoibn31DZsXFfPvwJr68gzFz+MRCv5iLkklaLncvA76j
8r+B+yhWgPYGvZ++m5PCssbKtUrVFTuH9KbPcndnGb47H+kPdLAQ4zjv9eccc2GY
zVPZ62uW3Lni5UUnxKlHSylbxU6mTrB/PdGgN3WbxWKJKsz5QFNjVp9RAoGBAIky
pJjQu3aXLWriGIqt2jv5QInYFkdzROkVc7agl0d6cyeUjBNUSisvUHN9Iu85dcfA
L0IHXBU9IfpsjTnO3PhVI/pT6qUXg6Xc6ARwVWGx5yzm+j4n26OE4JijKeKtOXZI
U1bBbGgQdFDag3b7hA4yUYcaR4r9Kiqgf50OrLVlAoGAEUOGBSAepxksYlvHUOL+
MvzQ7TYdXNWyCl7sf8/zENkHmc0yyUKq0ptwIXIJn5XdhJLg2+fGOxuuM+MTXwps
+LZBnjrKK+WNs3eCZYQcNx2TMWsiCl27CiwIUCdvmkcNNh2m9SiVDgTBnbmdGUxb
fhTIcChYlpUz9mPcPD3vwNw=
-----END PRIVATE KEY-----
\ No newline at end of file
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYjXllw5OLY2bc
vPUkdFP2PvjKl7hBhicbhrDPRiA5Tti8tkESI1cBgd5KsgnolWGqDO4UKE98neao
Ti50Iw/muoJPuoDvgZgbiyKyJ6+Lqy04HtJKFyx3tpMpca6PZGypCeFAQOmgdX7s
Ql6WorfBQNbP84gsa1Giq4sl63dZc5MGww8eQbeP9oM1BK3TkJW0ripjugWENZCw
Qd16ylDqtLqZ0HAUOXLEM6kMuk0PMtsV1REymU9exoHRwlJfb2P9Fb45UR2BLpjO
uMXBoBpZLffBBIXQde4VzVemBk6fXJV3XsUVKBDt1ylPIBqF7ZlNIJPHSapq9Wnd
68ZCRhXPAgMBAAECggEAAdYQxCxOo4AJS2viKX5Vn7enUqJGifyy43kYug32h6oO
ysqzeCPrwVgOVGjV3LJQ8B/it7m6fIisBOeYAIwxffijETxF9Aa5Is+8awI2RzXt
apOtuqLnxUhxzK8SclBmTGyS2lf4V+xCIFbg1kBUJOPXvL4KLBAIoK7JkyXFPygz
tarVV4S7D5T07prFa+qY+dkfw9fPdB0WW/26qWCYSOuAT8e3+YpvBMq2yFRDvEgT
M314oOzQiKDXu0ykkjkmtWAbO4guaS26Q5svMAENwsKIkZJ6iWo4zcyGaGYyXkhr
LvPsX9KbhbtjrBo9QTS3WmqVkNZAcm+ZF3bK+0Yq9QKBgQDOTeXsRI5Ya7pEbPrm
DG0Bx8g9w0Arflkzod/INND0s2iPTSeDQVwyMSgrZ4D5YxTgiHgvq9rbFpdj4H5A
6sL55QiemX+Y3ajRyy6HnW9awVFa5t7LuAixBDBe9BwFDYlxwz6Z03yEZgOtHuO/
0WdnIDseRmy8Xz8YQenaUW12OwKBgQC9TOO7X5mLt5DxakqR2FU2NTxf9C4j0vNO
Q71VqHCShBBvQFFhra5keE3HaGnStff100wTNoym+zPQY0VM1YcPwgCzyAi07lX7
XwUk7dyOG9mV1yg71W9+SuTlWx+jy6kD/tdQY7KTnTg6hyFbQ4sLdY6nLpmNRmIl
/nxXVqVhfQKBgQC9PuwJPiItrjSiDC5j1UYxeeiP74nv2+lL2dQEPZ7ouaLSwX3b
g5tlV353wmynWGKQTd+iK02J6EFbl1V5i2DsB1NO2ZQY0EzKlk3KjXrWj7tnXZ1G
1zzx1NviXp9Na0uHlgjY5w20DjiVGF7nWNo32XMhpIyeh+jDAcPZRxTYfQKBgE5r
JMgBUW1UrQGlQ6DpWltrcEhbsiV7BPm+DBgJACFh/iDoJw5s0ZqjT600runwIfk+
//vRlDC0TYGdLh8nMZ0wg/P2AM1bEllgwpPKyZxBI0D0caFfyKEry2jL9+51tt2F
25JcyqRl894jDoltEJO9rkvJfSjOKGiO5NmVdktNAoGBAI7xH+xY9gv4FPwUN9+r
EqrvO0RfoQVxJqL56caKBm7QbRrq54zSFhjre4CVoquBghlwQ7Jck75o3F+oEsPK
+9bH6BRFvJWRaiHFxP6d3ZGwY+ZI1hnMF+00RsmSCPUwJjqXbyuIO2WiALsa1KJu
LswlHkO3Gj4ljmxnbUC8gb2T
-----END PRIVATE KEY-----
...@@ -26,6 +26,8 @@ services: ...@@ -26,6 +26,8 @@ services:
- "front" - "front"
- "back" - "back"
volumes: volumes:
- ./nginx/php.ini:/usr/local/etc/php/conf.d/php.ini
- ./wp-content/plugins/cookies-warning:/var/www/html/wp-content/plugins/cookies-warning - ./wp-content/plugins/cookies-warning:/var/www/html/wp-content/plugins/cookies-warning
- ./wp-content/plugins/data-controller:/var/www/html/wp-content/plugins/data-controller - ./wp-content/plugins/data-controller:/var/www/html/wp-content/plugins/data-controller
- ./wp-content/plugins/jobs-importer:/var/www/html/wp-content/plugins/jobs-importer - ./wp-content/plugins/jobs-importer:/var/www/html/wp-content/plugins/jobs-importer
...@@ -66,7 +68,12 @@ services: ...@@ -66,7 +68,12 @@ services:
- '80:80' - '80:80'
- '443:443' - '443:443'
volumes: volumes:
- ./nginx:/etc/nginx/conf.d - ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/h5bp:/etc/nginx/h5bp
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/redirects:/etc/nginx/redirects
- ./nginx/cache:/var/cache/nginx
- ./logs/nginx:/var/log/nginx - ./logs/nginx:/var/log/nginx
- ./certs:/etc/letsencrypt - ./certs:/etc/letsencrypt
- ./certs-data:/data/letsencrypt - ./certs-data:/data/letsencrypt
...@@ -97,6 +104,8 @@ services: ...@@ -97,6 +104,8 @@ services:
networks: networks:
- "back" - "back"
volumes: volumes:
- './var/wp-cli/cache:/etc/X11/fs/.wp-cli/cache'
- ./wp-content/plugins/cookies-warning:/var/www/html/wp-content/plugins/cookies-warning - ./wp-content/plugins/cookies-warning:/var/www/html/wp-content/plugins/cookies-warning
- ./wp-content/plugins/data-controller:/var/www/html/wp-content/plugins/data-controller - ./wp-content/plugins/data-controller:/var/www/html/wp-content/plugins/data-controller
- ./wp-content/plugins/jobs-importer:/var/www/html/wp-content/plugins/jobs-importer - ./wp-content/plugins/jobs-importer:/var/www/html/wp-content/plugins/jobs-importer
......
server {
listen 80;
listen [::]:80;
server_name dev.biuro.lt dev.biuro.lv dev.biuro.ee;
location ^~ /.well-known {
allow all;
default_type "text/plain";
root /data/letsencrypt/;
}
location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name dev.biuro.lt;
include /etc/nginx/conf.d/server-shared.conf;
ssl_certificate /etc/letsencrypt/biuro.lt/certificate.crt;
ssl_certificate_key /etc/letsencrypt/biuro.lt/private.key;
ssl_trusted_certificate /etc/letsencrypt/biuro.lt/ca_bundle.crt;
# 301 redirects
include redirects/biuro.lt.conf;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name dev.biuro.lv;
include /etc/nginx/conf.d/server-shared.conf;
ssl_certificate /etc/letsencrypt/biuro.lv/certificate.crt;
ssl_certificate_key /etc/letsencrypt/biuro.lv/private.key;
ssl_trusted_certificate /etc/letsencrypt/biuro.lv/ca_bundle.crt;
# 301 redirects
include redirects/biuro.lv.conf;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name dev.biuro.ee;
include /etc/nginx/conf.d/server-shared.conf;
ssl_certificate /etc/letsencrypt/biuro.ee/certificate.crt;
ssl_certificate_key /etc/letsencrypt/biuro.ee/private.key;
ssl_trusted_certificate /etc/letsencrypt/biuro.ee/ca_bundle.crt;
# 301 redirects
include redirects/biuro.ee.conf;
}
include h5bp/internet_explorer/x-ua-compatible.conf;
include h5bp/security/content-security-policy.conf;
include h5bp/security/referrer-policy.conf;
include h5bp/security/strict-transport-security.conf;
include h5bp/security/x-content-type-options.conf;
include h5bp/security/x-frame-options.conf;
include h5bp/security/x-xss-protection.conf;
include h5bp/location/security_file_access.conf;
include h5bp/location/web_performance_cache_expiration.conf;
include h5bp/web_performance/no-transform.conf;
include h5bp/cross-origin/requests.conf;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
server {
listen 80;
listen [::]:80;
server_name dev.biuro.lt dev.biuro.lv dev.biuro.ee;
location ^~ /.well-known {
allow all;
default_type "text/plain";
root /data/letsencrypt/;
}
location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name dev.biuro.lt;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!ADH:!AECDH:!MD5;";
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
ssl_certificate /etc/letsencrypt/biuro.lt/certificate.crt;
ssl_certificate_key /etc/letsencrypt/biuro.lt/private.key;
ssl_trusted_certificate /etc/letsencrypt/biuro.lt/ca_bundle.crt;
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers EECDH+CHACHA20:EECDH+AES;
# # (1)
# ssl_ecdh_curve X25519;
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# ssl_prefer_server_ciphers on;
# ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 301 redirects
include /etc/nginx/conf.d/redirects/biuro.lt.conf;
#
gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_proxied any;
gzip_vary on;
gzip_types
application/atom+xml
application/javascript
application/json
application/rss+xml
application/vnd.ms-fontobject
application/x-font-ttf
application/x-javascript text/xml
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
application/xml+rss text/javascript
font/opentype
image/svg+xml
image/x-icon
text/css
text/plain
text/x-component;
gzip_disable "MSIE [1-6]\.";
# brotli on;
# brotli_comp_level 6;
# brotli_types application/eot application/x-otf application/font application/x-perl application/font-sfnt application/x-ttf application/javascript
# font/eot application/json font/ttf application/opentype font/otf application/otf font/opentype application/pkcs7-mime image/svg+xml
# application/truetype text/css application/ttf text/csv application/vnd.ms-fontobject text/html application/xhtml+xml text/javascript
# application/xml text/js application/xml+rss text/plain application/x-font-opentype text/richtext application/x-font-truetype
# text/tab-separated-values application/x-font-ttf text/xml application/x-httpd-cgi text/x-script application/x-javascript
# text/x-component application/x-mpegurl text/x-java-source application/x-opentype
# ;
#
# Expire rules for static content
# https://serversforhackers.com/c/nginx-caching
# https://github.com/h5bp/server-configs-nginx
# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
expires -1;
# access_log logs/static.log; # I don't usually include a static log
}
# Feed
location ~* \.(?:rss|atom)$ {
expires 1h;
add_header Cache-Control "public";
}
# Media: images, icons, video, audio, HTC
location ~* \.(?:webp|jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires 6M;
access_log off;
add_header Cache-Control "public";
}
# CSS and Javascript
location ~* \.(?:css|js)$ {
expires 1y;
access_log off;
add_header Cache-Control "public";
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name dev.biuro.lv;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!ADH:!AECDH:!MD5;";
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
ssl_certificate /etc/letsencrypt/biuro.lv/certificate.pem;
ssl_certificate_key /etc/letsencrypt/biuro.lv/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/biuro.lv/ca-bundle.pem;
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# ssl_prefer_server_ciphers on;
# ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 301 redirects
include /etc/nginx/conf.d/redirects/biuro.lv.conf;
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable "MSIE [1-6]\.";
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name dev.biuro.ee;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!ADH:!AECDH:!MD5;";
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
ssl_certificate /etc/letsencrypt/biuro.ee/certificate.pem;
ssl_certificate_key /etc/letsencrypt/biuro.ee/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/biuro.ee/ca-bundle.pem;
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# ssl_prefer_server_ciphers on;
# ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 301 redirects
include /etc/nginx/conf.d/redirects/biuro.ee.conf;
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable "MSIE [1-6]\.";
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
# RewriteEngine On
# RewriteBase /
# RewriteRule ^index\.php$ - [L]
#
# # add a trailing slash to /wp-admin
# RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
#
# RewriteCond %{REQUEST_FILENAME} -f [OR]
# RewriteCond %{REQUEST_FILENAME} -d
# RewriteRule ^ - [L]
# RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
# RewriteRule ^(.*\.php)$ $1 [L]
# RewriteRule . index.php [L]
# Nginx Server Configs | MIT License
# https://github.com/h5bp/server-configs-nginx
include h5bp/internet_explorer/x-ua-compatible.conf;
include h5bp/security/content-security-policy.conf;
include h5bp/security/referrer-policy.conf;
include h5bp/security/x-content-type-options.conf;
include h5bp/security/x-frame-options.conf;
include h5bp/security/x-xss-protection.conf;
include h5bp/location/security_file_access.conf;
include h5bp/web_performance/no-transform.conf;
include h5bp/cross-origin/requests.conf;
# ----------------------------------------------------------------------
# | Cross-origin requests |
# ----------------------------------------------------------------------
# Allow cross-origin requests.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
# https://enable-cors.org/
# https://www.w3.org/TR/cors/
# (!) Do not use this without understanding the consequences.
# This will permit access from any other website.
#
# Instead of using this file, consider using a specific rule such as:
#
# Allow access based on [sub]domain:
# add_header Access-Control-Allow-Origin "subdomain.example.com";
add_header Access-Control-Allow-Origin $cors;
# ----------------------------------------------------------------------
# | Cross-origin resource timing |
# ----------------------------------------------------------------------
# Allow cross-origin access to the timing information for all resources.
#
# If a resource isn't served with a `Timing-Allow-Origin` header that
# would allow its timing information to be shared with the document,
# some of the attributes of the `PerformanceResourceTiming` object will
# be set to zero.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Timing-Allow-Origin
# https://www.w3.org/TR/resource-timing/
# https://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/
add_header Timing-Allow-Origin "*";
# ----------------------------------------------------------------------
# | Custom error messages/pages |
# ----------------------------------------------------------------------
# Customize what Nginx returns to the client in case of an error.
#
# https://nginx.org/en/docs/http/ngx_http_core_module.html#error_page
error_page 404 /404.html;
# ----------------------------------------------------------------------
# | Document modes |
# ----------------------------------------------------------------------
# Force Internet Explorer 8/9/10 to render pages in the highest mode
# available in the various cases when it may not.
#
# https://hsivonen.fi/doctype/#ie8
#
# (!) Starting with Internet Explorer 11, document modes are deprecated.
# If your business still relies on older web apps and services that were
# designed for older versions of Internet Explorer, you might want to
# consider enabling `Enterprise Mode` throughout your company.
#
# https://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode
# https://blogs.msdn.microsoft.com/ie/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11/
# https://msdn.microsoft.com/en-us/library/ff955275.aspx
add_header X-UA-Compatible $x_ua_compatible;
# ----------------------------------------------------------------------
# | File access |
# ----------------------------------------------------------------------
# Block access to all hidden files and directories with the exception of
# the visible content from within the `/.well-known/` hidden directory.
#
# These types of files usually contain user preferences or the preserved
# state of an utility, and can include rather private places like, for
# example, the `.git` or `.svn` directories.
#
# The `/.well-known/` directory represents the standard (RFC 5785) path
# prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`,
# `/.well-known/keybase.txt`), and therefore, access to its visible
# content should not be blocked.
#
# https://www.mnot.net/blog/2010/04/07/well-known
# https://tools.ietf.org/html/rfc5785
location ~* /\.(?!well-known\/) {
deny all;
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Block access to files that can expose sensitive information.
#
# By default, block access to backup and source files that may be
# left by some text editors and can pose a security risk when anyone
# has access to them.
#
# https://feross.org/cmsploit/
#
# (!) Update the `location` regular expression from below to
# include any files that might end up on your production server and
# can expose sensitive information about your website. These files may
# include: configuration files, files that contain metadata about the
# project (e.g.: project dependencies), build scripts, etc..
location ~* (?:#.*#|\.(?:bak|conf|dist|fla|in[ci]|log|orig|psd|sh|sql|sw[op])|~)$ {
deny all;
}
# ----------------------------------------------------------------------
# | Cache expiration |
# ----------------------------------------------------------------------
# Serve resources with far-future expiration date.
#
# (!) If you don't control versioning with filename-based
# cache busting, you should consider lowering the cache times
# to something like one week.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires
# https://nginx.org/en/docs/http/ngx_http_headers_module.html#expires
# No default expire rule. This config mirrors that of apache as outlined in the
# html5-boilerplate .htaccess file. However, nginx applies rules by location,
# the apache rules are defined by type. A consequence of this difference is that
# if you use no file extension in the url and serve html, with apache you get an
# expire time of 0s, with nginx you'd get an expire header of one month in the
# future (if the default expire rule is 1 month). Therefore, do not use a
# default expire rule with nginx unless your site is completely static
# Documents
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
expires 0;
}
# Feeds
location ~* \.(?:rss|atom)$ {
expires 1h;
}
# Media files
location ~* \.(?:webp|jpg|jpeg|gif|png|ico|cur|gz|svg|mp4|ogg|ogv|webm|htc)$ {
access_log off;
expires 1M;
}
# Media: svgz files are already compressed.
location ~* \.svgz$ {
access_log off;
gzip off;
expires 1M;
}
# CSS and JavaScript
location ~* \.(?:css|js)$ {
expires 1y;
access_log off;
}
# Web fonts
# If you are NOT using cross-domain-fonts.conf, uncomment the following directive
location ~* \.(?:eot|otf|tt[cf]|woff2?)$ {
expires 1M;
access_log off;
}
# ----------------------------------------------------------------------
# | Filename-based cache busting |
# ----------------------------------------------------------------------
# If you're not using a build process to manage your filename version
# revving, you might want to consider enabling the following directives
#
# To understand why this is important and even a better solution than
# using something like `*.css?v231`, please see:
# https://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/
location ~* (.+)\.(?:\w+)\.(bmp|css|cur|gif|ico|jpe?g|m?js|png|svgz?|webp|webmanifest)$ {
try_files $uri $1.$2;
}
# ----------------------------------------------------------------------
# | Character encodings |
# ----------------------------------------------------------------------
# Serve all resources labeled as `text/html` or `text/plain`
# with the media type `charset` parameter set to `UTF-8`.
#
# https://nginx.org/en/docs/http/ngx_http_charset_module.html#charset
charset utf-8;
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Update charset_types to match updated mime.types.
# text/html is always included by charset module.
# Default: text/html text/xml text/plain text/vnd.wap.wml application/javascript application/rss+xml
#
# https://nginx.org/en/docs/http/ngx_http_charset_module.html#charset_types
charset_types
text/css
text/plain
text/vnd.wap.wml
text/javascript
text/markdown
text/calendar
text/x-component
text/vcard
text/cache-manifest
text/vtt
application/json
application/manifest+json;
# ----------------------------------------------------------------------
# | Media types |
# ----------------------------------------------------------------------
# Serve resources with the proper media types (f.k.a. MIME types).
#
# https://www.iana.org/assignments/media-types/media-types.xhtml
# https://nginx.org/en/docs/http/ngx_http_core_module.html#types
include mime.types;
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Default: text/plain
#
# https://nginx.org/en/docs/http/ngx_http_core_module.html#default_type
default_type application/octet-stream;
# ----------------------------------------------------------------------
# | Content Security Policy (CSP) |
# ----------------------------------------------------------------------
# Mitigate the risk of cross-site scripting and other content-injection
# attacks.
#
# This can be done by setting a `Content Security Policy` which
# whitelists trusted sources of content for your website.
#
# The example header below allows ONLY scripts that are loaded from
# the current website's origin (no inline scripts, no CDN, etc).
# That almost certainly won't work as-is for your website!
#
# To make things easier, you can use an online CSP header generator
# such as: https://www.cspisawesome.com/.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
# https://www.w3.org/TR/CSP3/
# https://content-security-policy.com/
# https://www.html5rocks.com/en/tutorials/security/content-security-policy/
add_header Content-Security-Policy $content_security_policy always;
# ----------------------------------------------------------------------
# | Referrer Policy |
# ----------------------------------------------------------------------
# A web application uses HTTPS and a URL-based session identifier.
# The web application might wish to link to HTTPS resources on other
# web sites without leaking the user's session identifier in the URL.
#
# This can be done by setting a `Referrer Policy` which
# whitelists trusted sources of content for your website.
#
# To check your referrer policy, you can use an online service
# such as: https://securityheaders.io/.
#
# https://scotthelme.co.uk/a-new-security-header-referrer-policy/
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
add_header Referrer-Policy $referrer_policy always;
# ----------------------------------------------------------------------
# | Server software information |
# ----------------------------------------------------------------------
# Prevent Nginx from sending in the `Server` response header its
# exact version number.
#
# https://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens
server_tokens off;
# ----------------------------------------------------------------------
# | HTTP Strict Transport Security (HSTS) |
# ----------------------------------------------------------------------
# Force client-side SSL redirection.
#
# If a user types `example.com` in their browser, even if the server
# redirects them to the secure version of the website, that still leaves
# a window of opportunity (the initial HTTP connection) for an attacker
# to downgrade or redirect the request.
#
# The following header ensures that browser will ONLY connect to your
# server via HTTPS, regardless of what the users type in the browser's
# address bar.
#
# (!) Be aware that this, once published, is not revokable and you must ensure
# being able to serve the site via SSL for the duration you've specified
# in max-age. When you don't have a valid SSL connection (anymore) your
# visitors will see a nasty error message even when attempting to connect
# via simple HTTP.
#
# (!) Remove the `includeSubDomains` optional directive if the website's
# subdomains are not using HTTPS.
#
# (1) If you want to submit your site for HSTS preload (2) you must
# * ensure the `includeSubDomains` directive to be present
# * the `preload` directive to be specified
# * the `max-age` to be at least 31536000 seconds (1 year) according to the current status.
#
# It is also advised (3) to only serve the HSTS header via a secure connection.
#
# (2) https://hstspreload.org/
# (3) https://tools.ietf.org/html/rfc6797#section-7.2
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
# https://tools.ietf.org/html/rfc6797#section-6.1
# https://www.html5rocks.com/en/tutorials/security/transport-layer-security/
# https://blogs.msdn.microsoft.com/ieinternals/2014/08/18/strict-transport-security/
add_header Strict-Transport-Security "max-age=16070400; includeSubDomains" always;
# (1) or if HSTS preloading is desired (respect (2) for current requirements):
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# ----------------------------------------------------------------------
# | Reducing MIME type security risks |
# ----------------------------------------------------------------------
# Prevent some browsers from MIME-sniffing the response.
#
# This reduces exposure to drive-by download attacks and cross-origin
# data leaks, and should be left uncommented, especially if the server
# is serving user-uploaded content or content that could potentially be
# treated as executable by the browser.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
# https://blogs.msdn.microsoft.com/ie/2008/07/02/ie8-security-part-v-comprehensive-protection/
# https://mimesniff.spec.whatwg.org/
add_header X-Content-Type-Options nosniff always;
# ----------------------------------------------------------------------
# | Clickjacking |
# ----------------------------------------------------------------------
# Protect website against clickjacking.
#
# The example below sends the `X-Frame-Options` response header with
# the value `DENY`, informing browsers not to display the content of
# the web page in any frame.
#
# This might not be the best setting for everyone. You should read
# about the other two possible values the `X-Frame-Options` header
# field can have: `SAMEORIGIN` and `ALLOW-FROM`.
# https://tools.ietf.org/html/rfc7034#section-2.1.
#
# Keep in mind that while you could send the `X-Frame-Options` header
# for all of your website’s pages, this has the potential downside that
# it forbids even non-malicious framing of your content (e.g.: when
# users visit your website using a Google Image Search results page).
#
# Nonetheless, you should ensure that you send the `X-Frame-Options`
# header for all pages that allow a user to make a state changing
# operation (e.g: pages that contain one-click purchase links, checkout
# or bank-transfer confirmation pages, pages that make permanent
# configuration changes, etc.).
#
# Sending the `X-Frame-Options` header can also protect your website
# against more than just clickjacking attacks:
# https://cure53.de/xfo-clickjacking.pdf.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
# https://tools.ietf.org/html/rfc7034
# https://blogs.msdn.microsoft.com/ieinternals/2010/03/30/combating-clickjacking-with-x-frame-options/
# https://www.owasp.org/index.php/Clickjacking
add_header X-Frame-Options $x_frame_options always;
# ----------------------------------------------------------------------
# | Reflected Cross-Site Scripting (XSS) attacks |
# ----------------------------------------------------------------------
# (1) Try to re-enable the cross-site scripting (XSS) filter built
# into most web browsers.
#
# The filter is usually enabled by default, but in some cases it
# may be disabled by the user. However, in Internet Explorer for
# example, it can be re-enabled just by sending the
# `X-XSS-Protection` header with the value of `1`.
#
# (2) Prevent web browsers from rendering the web page if a potential
# reflected (a.k.a non-persistent) XSS attack is detected by the
# filter.
#
# By default, if the filter is enabled and browsers detect a
# reflected XSS attack, they will attempt to block the attack
# by making the smallest possible modifications to the returned
# web page.
#
# Unfortunately, in some browsers (e.g.: Internet Explorer),
# this default behavior may allow the XSS filter to be exploited,
# thereby, it's better to inform browsers to prevent the rendering
# of the page altogether, instead of attempting to modify it.
#
# https://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities
#
# (!) Do not rely on the XSS filter to prevent XSS attacks! Ensure that
# you are taking all possible measures to prevent XSS attacks, the
# most obvious being: validating and sanitizing your website's inputs.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
# https://blogs.msdn.microsoft.com/ie/2008/07/02/ie8-security-part-iv-the-xss-filter/
# https://blogs.msdn.microsoft.com/ieinternals/2011/01/31/controlling-the-xss-filter/
# https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29
add_header X-XSS-Protection $x_xss_protection always;
# ----------------------------------------------------------------------
# | Certificate files |
# ----------------------------------------------------------------------
# This default SSL certificate will be served whenever the client lacks
# support for SNI (Server Name Indication).
# Make it a symlink to the most important certificate you have, so that
# users of IE 8 and below on WinXP can see your main site without SSL errors.
#
# (1) Certificate and key files location
# The certificate file can contain intermediate certificate.
#
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate
#
# (2) Intermediate certificate location if loaded certificate (1) does not
# contain intermediate certificate when enabling OCSP stanpling.
#
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate
#
# (3) CA certificate file location for client certificate authentication
#
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate
# (1)
ssl_certificate /etc/nginx/certs/default.crt;
ssl_certificate_key /etc/nginx/certs/default.key;
# (2)
# ssl_trusted_certificate /path/to/ca.crt;
# (3)
# ssl_client_certificate /etc/nginx/default_ssl.crt;
# ----------------------------------------------------------------------
# | Online Certificate Status Protocol stapling |
# ----------------------------------------------------------------------
# OCSP is a lightweight, only one record to help clients verify the
# validity of the server certificate.
# OCSP stapling allow the server to send its cached OCSP record during
# the TLS handshake, whithout the need of 3rd party OCSP responder.
#
# https://wiki.mozilla.org/Security/Server_Side_TLS#OCSP_Stapling
# https://tools.ietf.org/html/rfc6066#section-8
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=60s;
resolver_timeout 2s;
# ----------------------------------------------------------------------
# | SSL policy - Deprecated |
# ----------------------------------------------------------------------
# For services that don't need compatibility with legacy clients
# (mostly WinXP), but still need to support a wide range of clients,
# this configuration is recommended.
#
# Protect against the BEAST and POODLE attacks by not using SSLv3 at all.
# If you need to support older browsers (IE6) you may need to add
# SSLv3 to the list of protocols.
#
# Based on intermediate profile recommended by Mozilla.
# https://mozilla.github.io/server-side-tls/ssl-config-generator/
#
# (1) Diffie-Hellman parameter for DHE cipher suites
# A 4096 bits or more DH parameter is recommended.
# (!) A DH parameter generation is required to enable this directive.
# openssl dhparam -out /etc/nginx/dhparam.pem 4096
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam
#
# https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA;
ssl_ecdh_curve X25519:prime256v1:secp521r1:secp384r1;
# (1)
# ssl_dhparam /etc/nginx/dhparam.pem;
# ----------------------------------------------------------------------
# | SSL policy - Intermediate |
# ----------------------------------------------------------------------
# For services that don't need backward compatibility, the parameters
# below provide a higher level of security.
#
# (!) This policy enfore a strong SSL configuration, which may raise
# errors with old clients.
# If a more compatible profile is required, use intermediate policy.
#
# (1) The NIST curves (prime256v1, secp384r1, secp521r1) are known
# to be weak and potentially vulnerable but are required to support
# Microsoft Edge and Safari.
# https://safecurves.cr.yp.to/
#
# https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES;
# (1)
ssl_ecdh_curve X25519:prime256v1:secp521r1:secp384r1;
# ----------------------------------------------------------------------
# | SSL policy - Modern |
# ----------------------------------------------------------------------
# For services that want to be on the bleeding edge, the parameters
# below sacrifice compatibility for the highest level of security & performance
#
# (!) TLSv1.3 and it's 0-RTT feature require NGINX >=1.15.4 and OpenSSL >=1.1.1
# to be installed.
#
# (!) Don't enable `ssl_early_data` blindly! Requests sent within early data are
# subject to replay attacks.
#
# (1) The NIST curves (prime256v1, secp384r1, secp521r1) are known to be weak
# and potentially vulnerable.
#
# Add them back to the parameter `ssl_ecdh_curve` below to support
# Microsoft Edge and Safari.
#
# https://safecurves.cr.yp.to/
#
# (2) Enables TLS 1.3 0-RTT, allows for faster resumption of TLS sessions.
#
# (!) Requests sent within early data are subject to replay attacks.
# To protect against such attacks at the application layer, the
# $ssl_early_data variable should be used:
# proxy_set_header Early-Data $ssl_early_data;
#
# The application should return response code 425 for anything that
# could contain user supplied data.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/425
#
# https://github.com/certbot/certbot/issues/6367
# https://github.com/mozilla/server-side-tls/issues/217
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES;
# (1)
ssl_ecdh_curve X25519;
# (2)
#ssl_early_data on;
# ----------------------------------------------------------------------
# | SSL engine |
# ----------------------------------------------------------------------
# (1) Optimize SSL by caching session parameters for 10 minutes.
# This cuts down on the number of expensive SSL handshakes.
# By enabling a cache, we tell the client to re-use the already
# negotiated state.
# A 1Mb cache can hold about 4000 sessions, so we can hold 40000 sessions.
#
# (2) Use a higher keepalive timeout to reduce the need for repeated handshakes
# (!) Shouldn't be done unless you serve primarily HTTPS.
# Default is 75s
#
# (3) SSL buffer size
# Set 1400 bytes to fit in one MTU
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_buffer_size
#
# (4) Disable session tickets
# Session tickets keys are not auto-rotated. Only a HUP / restart
# will do so and when a restart is performed the previous key is
# lost, which resets all previous sessions.
# Only enable session tickets if you setup a manual rotation mechanism.
# https://trac.nginx.org/nginx/changeset/1356a3b9692441e163b4e78be4e9f5a46c7479e9/nginx
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_tickets
#
# (5) Basic security improvements
# (1)
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 24h;
# (2)
keepalive_timeout 300s;
# (3)
# ssl_buffer_size 1400;
# (4)
ssl_session_tickets off;
# (5)
ssl_prefer_server_ciphers on;
# ----------------------------------------------------------------------
# | Cache file-descriptors |
# ----------------------------------------------------------------------
# This tells nginx to cache open file handles, "not found" errors and
# metadata about files and their permissions.
#
# Based on these cached metadata, nginx can immediately begin sending
# data when a popular file is requested, and will also know to
# immediately send a 404 if a file is missing on disk, and so on.
#
# (!) It also means that the server won't react immediately to changes
# on disk, which may be undesirable.
# As only metadata are cached, edited files may be troncated until
# the cache is refreshed.
# https://github.com/h5bp/server-configs-nginx/issues/203
#
# In the below configuration, inactive files are released from the cache
# after 20 seconds, whereas active (recently requested) files are
# re-validated every 30 seconds.
# Descriptors will not be cached unless they are used at least 2 times
# within 20 seconds (the inactive time).
# A maximum of the 1000 most recently used file descriptors can be
# cached at any time.
#
# Production servers with stable file collections will definitely want
# to enable the cache.
#
# https://nginx.org/en/docs/http/ngx_http_core_module.html#open_file_cache
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# ----------------------------------------------------------------------
# | Cache expiration |
# ----------------------------------------------------------------------
# Serve resources with far-future expiration date.
#
# (!) If you don't control versioning with filename-based
# cache busting, you should consider lowering the cache times
# to something like one week.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires
# https://nginx.org/en/docs/http/ngx_http_headers_module.html#expires
map $sent_http_content_type $expires {
default 1M;
# CSS
text/css 1y;
# Data interchange
application/atom+xml 1h;
application/rdf+xml 1h;
application/rss+xml 1h;
application/json 0;
application/ld+json 0;
application/schema+json 0;
application/geo+json 0;
application/xml 0;
text/calendar 0;
text/xml 0;
# Favicon (cannot be renamed!) and cursor images
image/vnd.microsoft.icon 1w;
image/x-icon 1w;
# HTML
text/html 0;
# JavaScript
application/javascript 1y;
application/x-javascript 1y;
text/javascript 1y;
# Manifest files
application/manifest+json 1w;
application/x-web-app-manifest+json 0;
text/cache-manifest 0;
# Markdown
text/markdown 0;
# Media files
audio/ogg 1M;
image/bmp 1M;
image/gif 1M;
image/jpeg 1M;
image/png 1M;
image/svg+xml 1M;
image/webp 1M;
video/mp4 1M;
video/ogg 1M;
video/webm 1M;
# WebAssembly
application/wasm 1y;
# Web fonts
font/collection 1M;
application/vnd.ms-fontobject 1M;
font/eot 1M;
font/opentype 1M;
font/otf 1M;
application/x-font-ttf 1M;
font/ttf 1M;
application/font-woff 1M;
application/x-font-woff 1M;
font/woff 1M;
application/font-woff2 1M;
font/woff2 1M;
# Other
text/x-cross-domain-policy 1w;
}
expires $expires;
# ----------------------------------------------------------------------
# | Compression brotli |
# ----------------------------------------------------------------------
brotli on;
brotli_comp_level 6;
brotli_types application/eot application/x-otf application/font application/x-perl application/font-sfnt application/x-ttf application/javascript
font/eot application/json font/ttf application/opentype font/otf application/otf font/opentype application/pkcs7-mime image/svg+xml
application/truetype text/css application/ttf text/csv application/vnd.ms-fontobject application/xhtml+xml text/javascript
application/xml text/js application/xml+rss text/plain application/x-font-opentype text/richtext application/x-font-truetype
text/tab-separated-values application/x-font-ttf text/xml application/x-httpd-cgi text/x-script application/x-javascript
text/x-component application/x-mpegurl text/x-java-source application/x-opentype
;
# ----------------------------------------------------------------------
# | Compression |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Enable gzip compression.
# Default: off
gzip on;
# Compression level (1-9).
# 5 is a perfect compromise between size and CPU usage, offering about
# 75% reduction for most ASCII files (almost identical to level 9).
# Default: 1
gzip_comp_level 5;
# Don't compress anything that's already small and unlikely to shrink much
# if at all (the default is 20 bytes, which is bad as that usually leads to
# larger files after gzipping).
# Default: 20
gzip_min_length 256;
# Compress data even for clients that are connecting to us via proxies,
# identified by the "Via" header (required for CloudFront).
# Default: off
gzip_proxied any;
# Tell proxies to cache both the gzipped and regular version of a resource
# whenever the client's Accept-Encoding capabilities header varies;
# Avoids the issue where a non-gzip capable client (which is extremely rare
# today) would display gibberish if their proxy gave them the gzipped version.
# Default: off
gzip_vary on;
# Compress all output labeled with one of the following MIME-types.
# text/html is always compressed by gzip module.
# Default: text/html
gzip_types
application/atom+xml
application/javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/geo+json
application/vnd.ms-fontobject
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
application/rdf+xml
font/otf
application/wasm
image/bmp
image/svg+xml
text/cache-manifest
text/css
text/javascript
text/plain
text/markdown
text/vcard
text/calendar
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
# This should be turned on if you are going to have pre-compressed copies (.gz) of
# static files available. If not it should be left off as it will cause extra I/O
# for the check. It is best if you enable this in a location{} block for
# a specific directory, or on an individual server{} level.
# gzip_static on;
# ----------------------------------------------------------------------
# | Content transformation |
# ----------------------------------------------------------------------
# Prevent intermediate caches or proxies (e.g.: such as the ones
# used by mobile network providers) from modifying the website's
# content.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
# https://tools.ietf.org/html/rfc2616#section-14.9.5
#
# (!) If you are using `ngx_pagespeed`, please note that setting
# the `Cache-Control: no-transform` response header will prevent
# `PageSpeed` from rewriting `HTML` files, and, if the
# `pagespeed DisableRewriteOnNoTransform off` directive isn't used,
# also from rewriting other resources.
#
# https://developers.google.com/speed/pagespeed/module/configuration#notransform
add_header Cache-Control "no-transform";
types {
# Data interchange
application/atom+xml atom;
application/json json map topojson;
application/ld+json jsonld;
application/rss+xml rss;
# Normalize to standard type.
# https://tools.ietf.org/html/rfc7946#section-12
application/geo+json geojson;
application/xml xml;
# Normalize to standard type.
# https://tools.ietf.org/html/rfc3870#section-2
application/rdf+xml rdf;
# JavaScript
# Servers should use text/javascript for JavaScript resources.
# https://html.spec.whatwg.org/multipage/scripting.html#scriptingLanguages
text/javascript js mjs;
application/wasm wasm;
# Manifest files
application/manifest+json webmanifest;
application/x-web-app-manifest+json webapp;
text/cache-manifest appcache;
# Media files
audio/midi mid midi kar;
audio/mp4 aac f4a f4b m4a;
audio/mpeg mp3;
audio/ogg oga ogg opus;
audio/x-realaudio ra;
audio/x-wav wav;
audio/x-matroska mka;
image/bmp bmp;
image/gif gif;
image/jpeg jpeg jpg;
image/jxr jxr hdp wdp;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-jng jng;
video/3gpp 3gp 3gpp;
video/mp4 f4p f4v m4v mp4;
video/mpeg mpeg mpg;
video/ogg ogv;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-mng mng;
video/x-ms-asf asf asx;
video/x-ms-wmv wmv;
video/x-msvideo avi;
video/x-matroska mkv mk3d;
# Serving `.ico` image files with a different media type
# prevents Internet Explorer from displaying then as images:
# https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee
image/x-icon cur ico;
# Microsoft Office
application/msword doc;
application/vnd.ms-excel xls;
application/vnd.ms-powerpoint ppt;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
# Web fonts
font/woff woff;
font/woff2 woff2;
application/vnd.ms-fontobject eot;
font/ttf ttf;
font/collection ttc;
font/otf otf;
# Other
application/java-archive ear jar war;
application/mac-binhex40 hqx;
application/octet-stream bin deb dll dmg exe img iso msi msm msp safariextz;
application/pdf pdf;
application/postscript ai eps ps;
application/rtf rtf;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-bb-appworld bbaw;
application/x-bittorrent torrent;
application/x-chrome-extension crx;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-opera-extension oex;
application/x-perl pl pm;
application/x-pilot pdb prc;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert crt der pem;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xslt+xml xsl;
application/zip zip;
text/css css;
text/csv csv;
text/html htm html shtml;
text/markdown md markdown;
text/mathml mml;
text/plain txt;
text/vcard vcard vcf;
text/calendar ics;
text/vnd.rim.location.xloc xloc;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/vtt vtt;
text/x-component htc;
}
# Configuration File - Nginx Server Configs
# https://nginx.org/en/docs/
# Run as a unique, less privileged user for security reasons.
# Default: nobody nobody
# https://nginx.org/en/docs/ngx_core_module.html#user
# https://en.wikipedia.org/wiki/Principle_of_least_privilege
user nginx;
# Sets the worker threads to the number of CPU cores available in the system for best performance.
# Should be > the number of CPU cores.
# Maximum number of connections = worker_processes * worker_connections
# Default: 1
# https://nginx.org/en/docs/ngx_core_module.html#worker_processes
worker_processes auto;
# Maximum number of open files per worker process.
# Should be > worker_connections.
# Default: no limit
# https://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile
worker_rlimit_nofile 8192;
# Provides the configuration file context in which the directives
# that affect connection processing are specified.
# https://nginx.org/en/docs/ngx_core_module.html#events
events {
# If you need more connections than this, you start optimizing your OS.
# That's probably the point at which you hire people who are smarter than you as this is *a lot* of requests.
# Should be < worker_rlimit_nofile.
# Default: 512
# https://nginx.org/en/docs/ngx_core_module.html#worker_connections
worker_connections 8000;
}
# Log errors and warnings to this file
# This is only used when you don't override it on a server{} level
# Default: logs/error.log error
# https://nginx.org/en/docs/ngx_core_module.html#error_log
error_log /var/log/nginx/error.log warn;
# The file storing the process ID of the main process
# Default: logs/nginx.pid
# https://nginx.org/en/docs/ngx_core_module.html#pid
pid /var/run/nginx.pid;
http {
# Hide nginx version information.
include h5bp/security/server_software_information.conf;
# Specify MIME types for files.
include h5bp/media_types/media_types.conf;
# Set character encodings.
include h5bp/media_types/character_encodings.conf;
# Include $http_x_forwarded_for within default format used in log files
# https://nginx.org/en/docs/http/ngx_http_log_module.html#log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# Log access to this file
# This is only used when you don't override it on a server{} level
# Default: logs/access.log combined
# https://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
access_log /var/log/nginx/access.log main;
# How long to allow each connection to stay idle.
# Longer values are better for each individual client, particularly for SSL,
# but means that worker connections are tied up longer.
# Default: 75s
# https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
# keepalive_timeout 20s;
# Speed up file transfers by using sendfile() to copy directly
# between descriptors rather than using read()/write().
# For performance reasons, on FreeBSD systems w/ ZFS
# this option should be disabled as ZFS's ARC caches
# frequently used files in RAM by default.
# Default: off
# https://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile
sendfile on;
# Don't send out partial frames; this increases throughput
# since TCP frames are filled up before being sent out.
# Default: off
# https://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nopush
tcp_nopush on;
# Enable gzip compression.
include h5bp/web_performance/compression.conf;
# Enable brotli compression.
include h5bp/web_performance/compression-brotli.conf;
# Specify file cache expiration.
include h5bp/web_performance/cache_expiration.conf;
# Add X-XSS-Protection for HTML documents.
# h5bp/security/x-xss-protection.conf
map $sent_http_content_type $x_xss_protection {
# (1) (2)
text/html "1; mode=block";
}
# Add X-Frame-Options for HTML documents.
# h5bp/security/x-frame-options.conf
map $sent_http_content_type $x_frame_options {
text/html DENY;
}
# Add Content-Security-Policy for HTML documents.
# h5bp/security/content-security-policy.conf
map $sent_http_content_type $content_security_policy {
text/html "script-src 'self'; object-src 'self'";
}
# Add Referrer-Policy for HTML documents.
# h5bp/security/referrer-policy.conf.conf
map $sent_http_content_type $referrer_policy {
text/html "no-referrer-when-downgrade";
}
# Add X-UA-Compatible for HTML documents.
# h5bp/internet_explorer/x-ua-compatible.conf
map $sent_http_content_type $x_ua_compatible {
text/html "IE=edge";
}
# Add Access-Control-Allow-Origin.
# h5bp/cross-origin/requests.conf
map $sent_http_content_type $cors {
# Images
image/bmp "*";
image/gif "*";
image/jpeg "*";
image/png "*";
image/svg+xml "*";
image/webp "*";
image/x-icon "*";
# Web fonts
font/collection "*";
application/vnd.ms-fontobject "*";
font/eot "*";
font/opentype "*";
font/otf "*";
application/x-font-ttf "*";
font/ttf "*";
application/font-woff "*";
application/x-font-woff "*";
font/woff "*";
application/font-woff2 "*";
font/woff2 "*";
}
# Include files in the conf.d folder.
# server{} configuration files should be placed in the conf.d folder.
# The configurations should be disabled by prefixing files with a dot.
include h5bp/ssl/ocsp_stapling.conf;
include h5bp/ssl/policy_modern.conf;
include h5bp/ssl/ssl_engine.conf;
include /etc/nginx/conf.d/dev-biuro.conf;
}
# user nginx;
# worker_processes 1;
# error_log /var/log/nginx/error.log warn;
# pid /var/run/nginx.pid;
# events {
# worker_connections 1024;
# }
# http {
# include /etc/nginx/mime.types;
# default_type application/octet-stream;
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# access_log /var/log/nginx/access.log main;
# sendfile on;
# #tcp_nopush on;
# keepalive_timeout 65;
# gzip on;
# brotli on;
# ################################
# # DO WHATEVER YOU WANT HERE :) #
# ################################
# include /etc/nginx/conf.d/*.conf;
# }
file_uploads = On
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
...@@ -10,30 +10,75 @@ rewrite ^/employers/staf-search-and-selection-in-lithuania/?$ /employers/staff-s ...@@ -10,30 +10,75 @@ rewrite ^/employers/staf-search-and-selection-in-lithuania/?$ /employers/staff-s
# Biuro SEO issues # Biuro SEO issues
# https://docs.google.com/spreadsheets/d/1dXP0dh_v2sFajrcwR2_9HONMadCdZQW4Y2dVXvhxG3E/edit?ts=5b5eaa6b#gid=0 # https://docs.google.com/spreadsheets/d/1dXP0dh_v2sFajrcwR2_9HONMadCdZQW4Y2dVXvhxG3E/edit?ts=5b5eaa6b#gid=0
# #
rewrite ^/darbo-paieska/uzsidirbtilietuvoje/?$ /darbo-paieska/laikinas-darbas/ permanent;
rewrite ^/contacts/course-agentures/?$ /contacts/job-seekers/ permanent; rewrite ^/contacts/course-agentures/?$ /contacts/job-seekers/ permanent;
rewrite ^/darbo-paieska/atvesk-drauga-gauk-dovanu/?$ /darbo-paieska/laikinas-darbas/ permanent;
# Intertnal ex 302 # Intertnal ex 302
rewrite ^/rabotodatelyam/?$ /rabotodatelyam/vremennye-rabochie-v-litve/ permanent;
rewrite ^/kontaktanagaben/?$ /kontaktanagaben/personalo-nuomai-de-DE/ permanent; # --- Darbuotojams ---
rewrite ^/darbuotojams/?$ /darbo-pasiulymai/ permanent;
# rewrite ^/darbo-paieska/uzsidirbtilietuvoje/?$ /darbo-paieska/laikinas-darbas/ permanent;
# rewrite ^/darbo-paieska/atvesk-drauga-gauk-dovanu/?$ /darbo-paieska/laikinas-darbas/ permanent;
rewrite ^/darbo-paieska/uzsidirbtilietuvoje/?$ /darbo-pasiulymai/ permanent;
rewrite ^/darbo-paieska/atvesk-drauga-gauk-dovanu/?$ /darbo-pasiulymai/ permanent;
# rewrite ^/darbo-paieska/vasarosdarbubankas/?$ / permanent;
rewrite ^/darbo-paieska/vasarosdarbubankas/?$ /darbo-pasiulymai/ permanent;
rewrite ^/darbo-paieska/?$ /darbo-pasiulymai/ permanent;
rewrite ^/darbo-paieska/laikinas-darbas/?$ /darbo-pasiulymai/ permanent;
rewrite ^/darbo-paieska/siulo-darba/?$ /darbuotojams/siulo-darba/ permanent;
rewrite ^/darbo-paieska/papildomas-darbas/?$ /darbuotojams/duk/ permanent;
rewrite ^/darbo-paieska/klauskite\;/?$ /darbuotojams/kontaktai/ permanent;
rewrite ^/darbo-paieska/klauskite/?$ /darbuotojams/kontaktai/ permanent;
rewrite ^/kontaktai/?$ /darbuotojams/kontaktai/ permanent;
rewrite ^/kontaktai/darbinimo-agenturos/?$ /darbuotojams/kontaktai/ permanent;
# --- Darbdaviams ---
# rewrite ^/personalo-nuoma/vasarosdarbubankas/?$ / permanent;
rewrite ^/darbdaviams/?$ /darbdaviams/pardaviminis-puslapis-lt/ permanent;
rewrite ^/personalo-nuoma/vasarosdarbubankas/?$ /darbdaviams/pardaviminis-puslapis-lt/ permanent;
rewrite ^/personalo-nuoma/?$ /darbdaviams/pardaviminis-puslapis-lt/ permanent;
rewrite ^/personalo-nuoma/laikinas-idarbinimas/?$ /darbdaviams/pardaviminis-puslapis-lt/ permanent;
rewrite ^/personalo-nuoma/specialistu-nuoma/?$ /darbdaviams/specialistu-nuoma/ permanent;
rewrite ^/personalo-nuoma/personalo-paieska-atranka/?$ /darbdaviams/personalo-paieska-ir-atranka/ permanent;
rewrite ^/kontaktai/personalo-nuomai/?$ /darbdaviams/kontaktai/ permanent;
rewrite ^/personalo-nuoma/siuskite-uzklausa/?$ /darbdaviams/kontaktai/ permanent;
# --- Apie Mus
rewrite ^/personalo-nuomos-paslaugos/?$ /apie-mus/ permanent;
rewrite ^/personalo-nuomos-paslaugos/idarbinimo-agentura/?$ /apie-mus/ permanent;
rewrite ^/personalo-nuomos-paslaugos/darbuotoju-paieska-ir-atranka/?$ /tarptautinis-tinklas/ permanent;
rewrite ^/personalo-nuomos-paslaugos/naryste-lietuvoje/?$ /naryste-lietuvoje/ permanent;
rewrite ^/personalo-nuomos-paslaugos/etikos-kodeksas/?$ /etikos-kodeksas/ permanent;
rewrite ^/personalo-nuomos-paslaugos/antikorupcines-priemones/?$ /antikorupcines-priemones/ permanent;
rewrite ^/employers/?$ /employers/temporary-employees-in-lithuania/ permanent; rewrite ^/employers/?$ /employers/temporary-employees-in-lithuania/ permanent;
rewrite ^/fuer-arbeitgeber/?$ /fuer-arbeitgeber/befristete-beschaeftigung/ permanent;
rewrite ^/darbo-paieska/?$ /darbo-paieska/laikinas-darbas/ permanent;
rewrite ^/personalo-nuomos-paslaugos/?$ /personalo-nuomos-paslaugos/idarbinimo-agentura/ permanent;
rewrite ^/job-seekers/?$ /job-seekers/temporary-employment-in-lithuania/ permanent; rewrite ^/job-seekers/?$ /job-seekers/temporary-employment-in-lithuania/ permanent;
rewrite ^/ueber-biuro/?$ /ueber-biuro/ueber-die-arbeitsvermittlungsagentur/ permanent;
rewrite ^/kontakty/?$ /kontakty/rabotnikam/ permanent;
rewrite ^/assets/(.*)CODE-OF-CONDUCT-LT.pdf$ /wp-content/uploads/2018/10/CODE-OF-CONDUCT-LT.pdf permanent;
rewrite ^/assets/(.*)CODE-OF-CONDUCT-EN.pdf$ /wp-content/uploads/2018/10/CODE-OF-CONDUCT-EN.pdf permanent;
rewrite ^/personalo-nuoma/vasarosdarbubankas/?$ / permanent;
rewrite ^/darbo-paieska/vasarosdarbubankas/?$ / permanent;
rewrite ^/contacts/?$ /contacts/job-seekers/ permanent;
rewrite ^/home/?$ / permanent;
rewrite ^/about-biuro/?$ /about-biuro/staffing-agency-in-lithuania/ permanent; rewrite ^/about-biuro/?$ /about-biuro/staffing-agency-in-lithuania/ permanent;
rewrite ^/kontaktai/?$ /kontaktai/darbinimo-agenturos/ permanent; rewrite ^/home/?$ / permanent;
rewrite ^/contacts/?$ /contacts/job-seekers/ permanent;
rewrite ^/rabotnikam/?$ /rabotnikam/vremennoe-trudoustrojstvo-v-litve/ permanent; rewrite ^/rabotnikam/?$ /rabotnikam/vremennoe-trudoustrojstvo-v-litve/ permanent;
rewrite ^/o-biuro/?$ /o-biuro/agenstvo-po-naemu-personala-v-litve/ permanent; rewrite ^/o-biuro/?$ /o-biuro/agenstvo-po-naemu-personala-v-litve/ permanent;
rewrite ^/kontakty/?$ /kontakty/rabotnikam/ permanent;
rewrite ^/rabotodatelyam/?$ /rabotodatelyam/vremennye-rabochie-v-litve/ permanent;
rewrite ^/kontaktanagaben/?$ /kontaktanagaben/personalo-nuomai-de-DE/ permanent;
rewrite ^/fuer-arbeitnehmer/?$ /fuer-arbeitnehmer/befristete-beschaeftigung/ permanent; rewrite ^/fuer-arbeitnehmer/?$ /fuer-arbeitnehmer/befristete-beschaeftigung/ permanent;
rewrite ^/darbo-paieska/klauskite\;/?$ /darbo-paieska/laikinas-darbas/ permanent; rewrite ^/fuer-arbeitgeber/?$ /fuer-arbeitgeber/befristete-beschaeftigung/ permanent;
rewrite ^/personalo-nuoma/?$ /personalo-nuoma/laikinas-idarbinimas/ permanent; rewrite ^/ueber-biuro/?$ /ueber-biuro/ueber-die-arbeitsvermittlungsagentur/ permanent;
rewrite ^/assets/(.*)CODE-OF-CONDUCT-LT.pdf$ /wp-content/uploads/2018/10/CODE-OF-CONDUCT-LT.pdf permanent;
rewrite ^/assets/(.*)CODE-OF-CONDUCT-EN.pdf$ /wp-content/uploads/2018/10/CODE-OF-CONDUCT-EN.pdf permanent;
...@@ -34,17 +34,22 @@ const bundler = webpack(config); ...@@ -34,17 +34,22 @@ const bundler = webpack(config);
export function server () { export function server () {
bs.init({ bs.init({
logPrefix: 'Biuro', logPrefix: 'Biuro',
proxy: { socket: {
target: conf.proxy, domain: 'https://dev.biuro.lt:2000'
// proxyRes: [ // port: 443
// function (proxyRes, req, res) {
// // console.log(proxyRes.headers);
// console.log(req);
// }
// ],
ws: true
}, },
httpModule: http2, proxy: conf.proxy,
// proxy: {
// target: conf.proxy
// // proxyRes: [
// // function (proxyRes, req, res) {
// // // console.log(proxyRes.headers);
// // console.log(req);
// // }
// // ],
// // ws: true
// },
// httpModule: http2,
https: { https: {
key: conf.certs.key, key: conf.certs.key,
cert: conf.certs.cert cert: conf.certs.cert
......
<?php
/**
* Class JobsImporter - Import data to WP posts with custom fields
*
* @uses Pods framework
* @package Biuro Jobs importer
* @used-by \jobs-importer\job-importer.php
*/
class JobsImporter
{
private $data;
// Biuro record unique key
protected $primaryKey = 'livas-id';
// Language attribute key
protected $lang_id = 'lang';
// Pods instance
protected $pods;
// Posts container in WP
protected $podsType = 'job';
// Additional post fields
protected $postProperties = [
'post_status' => 'publish',
'comment_status' => 'closed'
];
public function __construct($data)
{
$this->data = $data;
$this->setPods();
}
/**
* Set Pods instance
*/
private function setPods()
{
$this->pods = pods($this->podsType);
}
/**
* Transform data keys by relations mapping
*
* @param array $data Data array
*
* @param array $relationsMap
*
* @return array
*/
private function mapRelations($data, $relationsMap = [])
{
foreach ($relationsMap as $relationKey => $dataKey) {
if (array_key_exists($dataKey, $data)) {
$data[$relationKey] = $data[$dataKey];
unset($data[$dataKey]);
}
}
return $data;
}
/**
* Import posts from provided data: if post with given Id exists, it rewrites
*/
public function import()
{
global $permalink_manager_uris;
foreach ($this->data as $ad) {
// Set language code
$lang = $this->getAdLang($ad);
// Set relations mapping
$relations = $ad['relations'];
// Set related taxonomies
$terms = $this->getTerms($ad['terms'], $lang);
// Set related custom posts
$posts = $this->getPosts($ad['posts'], $lang);
// Collect and prepare job's data
$adData = $this->mapRelations(array_merge(
$ad['properties'],
['lang' => $lang],
$terms,
$posts,
$this->postProperties
),
$relations
);
// Unique key of post
$primaryKey = $adData[$this->primaryKey];
$pod = $this->getPod($primaryKey);
if ($pod->total_found() > 0) {
try {
$podId = $pod->save($adData);
print_r("Old record ($this->primaryKey: $primaryKey) has been updated. <br>");
} catch (Exception $e) {
print_r("Error while updating record ($this->idKey: $primaryKey). Error: $e->getMessage()<br>");
}
} else {
try {
$podId = $this->pods->add($adData);
print_r("New record ($this->primaryKey: $primaryKey) has been created. <br>");
} catch (Exception $e) {
print_r("Error while creating record ($this->primaryKey: $primaryKey). Error: $e->getMessage()<br>");
}
}
if (isset($podId)) {
// Set post language
$this->setPostLang($podId, $ad['lang']);
// if (isset($custom_uri)) {
// $permalink_manager_uris[$podId] = $custom_uri;
// update_option('permalink-manager-uris', $permalink_manager_uris);
// }
}
}
}
/**
* Get taxonomies Id's
*
* @param array $terms Data array
* @param string $lang Language code
*
* @return array
*/
private function getTerms($terms, $lang)
{
$result = [];
foreach ($terms as $termKey => $termData) {
$slug = $this->getSlug($termKey, $termData, $lang);
$result[$termKey] = $this->getTerm($termKey, $slug, $termData['name'], $lang);
}
return $result;
}
/**
* Get custom posts Id's
*
* @param $posts array Data array
* @param $lang string Language code
*
* @return array
*/
private function getPosts($posts, $lang)
{
$result = [];
foreach ($posts as $postKey => $postData) {
$result[$postKey] = $this->getPost($postKey, $postData, $lang);
}
return $result;
}
/**
* Return formated slug
*
* @param string $key Object key name
* @param array $data Object data
* @param string $lang Language code
*
* @return string Slug
*/
private function getSlug($key, $data, $lang)
{
if (isset($data['slug'])) {
return $key . '-' . $data['slug'] . '-' . $lang;
}
return $data['name'] . '-' . $lang;
}
/**
* Find and return taxonomy id, if not exist, create it
*
* @param string $key Taxonomy key name
* @param string $slug Taxonomy slug0
* @param string $value Taxonomy name
* @param string $lang Taxonomy language code
*
* @return int Taxonomy id
*/
private function getTerm($key, $slug, $value, $lang)
{
$term = pods($key, $slug);
if (!$term->exists()) {
try {
$termId = pods($key)->add([
'name' => $value,
'slug' => $slug,
]);
} catch (Exception $e) {
print_r("Error while creating taxonomies ($key => $slug). Error: $e->getMessage()<br>");
}
} else {
try {
$termId = $term->save([
'name' => $value,
'slug' => $slug,
]);
} catch (Exception $e) {
print_r("Error while updating taxonomies ($key => $slug). Error: $e->getMessage()<br>");
}
}
if (empty($termId)) {
return false;
}
$this->setTermLang($termId, $lang);
return $termId;
}
/**
* Get custom post Id, if post not exists, creates it
*
* @param string $key Post key name
* @param array $data Post data array
* @param string $lang Post language code
*
* @return int Post Id
*/
private function getPost($key, $data, $lang)
{
$slug = $this->getSlug($key, $data, $lang);
$post = pods($key, $slug);
if (!$post->exists()) {
try {
$postId = pods($key)->add(
array_merge(
$data,
['slug' => $slug],
$this->postProperties
)
);
} catch (Exception $e) {
print_r("Error while creating custom post ($key => $slug). Error: $e->getMessage()<br>");
}
} else {
try {
$postId = $post->save(
array_merge(
$data,
['slug' => $slug],
$this->postProperties
)
);
} catch (Exception $e) {
print_r("Error while updating custom post ($key => $slug). Error: $e->getMessage()<br>");
}
}
if (empty($postId)) {
return false;
}
$this->setPostLang($postId, $lang);
return $postId;
}
/**
* Set language param for given pod, using Polylang library
*
* @param $postId
* @param $lang
*/
private function setPostLang($postId, $lang)
{
try {
PLL()->model->post->set_language($postId, $lang);
print_r("Set language code '$lang' for custom post (id: $postId). <br>");
} catch (Exception $e) {
print_r("Error while setting language code for custom post (id: $postId), error: $e->getMessage().<br>");
}
}
/**
* Set language param for given taxonomy, using Polylang library
*
* @param $termId
* @param $lang
*/
private function setTermLang($termId, $lang)
{
try {
PLL()->model->term->set_language($termId, $lang);
print_r("Set language code '$lang' for taxonomy (id: $termId). <br>");
} catch (Exception $e) {
print_r("Error while setting language code for taxonomy (id: $termId), error: $e->getMessage().<br>");
}
}
/**
* Get pod by given id
*
* @param $id
*
* @return mixed
*/
private function getPod($id)
{
$params = [
'where' => [
'relation' => 'AND',
[
'value' => (int)$id,
'key' => $this->primaryKey,
'compare' => '=',
]
]
];
return $this->pods->find($params);
}
/**
* Get language code from advert data
*
* @param array $ad
*
* @return string`
*/
private function getAdLang($ad)
{
return $ad[$this->lang_id];
}
}
<?php
/*
Plugin Name: Biuro Jobs importer
description: A plugin for import jobs ads from Biuro endpoint
Version: 1.0.0
*/
set_time_limit(300);
// Data collector: prepare data for import
require_once 'JsonDataCollector.php';
// Data importer: imports data to WP posts
require_once 'JobsImporter.php';
if (function_exists('importer_admin_menu')) {
// Add item to admin menu
add_action('admin_menu', 'importer_admin_menu');
}
/**
* Set admin menu item for plugin
*/
function importer_admin_menu()
{
add_submenu_page(
'options-general.php',
'Biuro Jobs importer',
'Biuro Jobs importer',
'data_importer',
'jobs-importer',
'do_import'
);
}
/**
* Imports posts from Biuro endpoint
*/
function do_import()
{
// Set environment type
// $env = 'prod';
$env = 'dev';
// Set data source path by environment type
if ($env === 'dev') {
// $inputFile = plugin_dir_path(__FILE__) . "source_data/wp_biuro.php.xml";
$inputFile = "https://base.biuro.lt/_export/wp_biuro.php";
} elseif ($env === 'prod') {
$inputFile = "http://export.biuro.lt/wp_biuro.php";
}
echo "<pre>";
print_r('<h4>Biuro Jobs importer</h4>');
print_r("Running in <strong>$env</strong> environment.");
echo "<br><br>";
print_r("Data source: $inputFile<br>");
// JSON reader
$ads = (new JsonDataCollector($inputFile))->getData();
// var_dump($ads);
// exit();
print_r("Found " . count($ads) . " ads from Biuro.<br>");
if (count($ads) > 0) {
print_r("importing....<br><br>");
// Posts (via Pods framework) creator
(new JobsImporter($ads))->import();
} else {
print_r("<br>There is nothing more to do.");
}
echo "</pre>";
}
\ No newline at end of file
...@@ -6,6 +6,7 @@ rich design UI styling. Class names here are more specific. This layer usually h ...@@ -6,6 +6,7 @@ rich design UI styling. Class names here are more specific. This layer usually h
c-: Signify that something is a Component. This is a concrete, implementation-specific piece of UI. All of the changes you make to its styles should be detectable in the context you’re currently looking at. Modifying these styles should be safe and have no side effects. c-: Signify that something is a Component. This is a concrete, implementation-specific piece of UI. All of the changes you make to its styles should be detectable in the context you’re currently looking at. Modifying these styles should be safe and have no side effects.
========================================================================== */ ========================================================================== */
@import '_component--awesomplete.css';
@import '_component--breadcrumbs.css'; @import '_component--breadcrumbs.css';
@import '_component--cookies-warning.css'; @import '_component--cookies-warning.css';
@import '_component--copy.css'; @import '_component--copy.css';
......
/* ------------- Component: awesomplete ------------- */
/* critical:start */
/* critical:end */
.awesomplete [hidden] {
display: none;
}
.awesomplete .visually-hidden {
position: absolute;
clip: rect(0, 0, 0, 0);
}
.awesomplete {
display: inline-block;
position: relative;
}
.awesomplete > input {
display: block;
}
.awesomplete > ul {
position: absolute;
left: 0;
z-index: 1;
min-width: 100%;
box-sizing: border-box;
list-style: none;
padding: 0;
margin: 0;
background: #fff;
}
.awesomplete > ul:empty {
display: none;
}
@font-face{font-family:PT Sans Narrow;src:url(../fonts/pt_sans_narrow.woff2) format("woff2"),url(../fonts/pt_sans_narrow.woff) format("woff");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:PT Sans Narrow;src:url(../fonts/pt_sans_narrow_bold.woff2) format("woff2"),url(../fonts/pt_sans_narrow_bold.woff) format("woff");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:Bebas Neue;src:url(../fonts/bebas-neue.woff2) format("woff2"),url(../fonts/bebas-neue.woff) format("woff");font-weight:400;font-style:normal;font-display:swap}
/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}a:hover{text-decoration:none}figure{margin:0}img{max-width:100%}p{margin:0 0 1.6rem}b,strong{font-weight:600;font-weight:var(--typo--weight-bold)}table{border-collapse:collapse;border-spacing:0}.l-footer--inner{display:-webkit-box;display:-ms-flexbox;display:flex;padding-top:15px;-ms-flex-wrap:wrap;flex-wrap:wrap}.l-footer--section{-webkit-box-flex:1;-ms-flex:1 0 15%;flex:1 0 15%}.l-footer--section h4{margin:0;padding:0}.l-footer{padding-bottom:100px;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.45);box-shadow:0 -1px 1px 0 rgba(0,0,0,.45)}.c-breadcrumbs{padding-top:1em}.c-cookies-warning{position:fixed;left:0;right:0;bottom:0;padding:15px 20px;background:#f6f6f6;overflow:hidden;z-index:100}.c-cookies-warning .bu-action{margin-top:10px}.c-cookies-warning .bu-action--alt{float:right}.c-copy{padding-top:.75em;text-align:center}.c-divisions--list{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:16px}.c-divisions--list-item{margin-right:10px;padding:0 12px;font-weight:400;font-weight:var(--typo--weight-regular);line-height:1.5;cursor:pointer}.is-divisions--list-item-active{background:#ccc;font-weight:600;font-weight:var(--typo--weight-bold)}#custom .biuro-title{margin:0 0 20px;padding:10px;font-size:calc(1.125rem + .8929vw - 2.85728px);border:2px solid #006957;border:2px solid var(--color--green);border-radius:12px}#custom .biuro-title h1{margin:0;padding:0;line-height:1.2;color:#006957;color:var(--color--green);font-weight:600;font-weight:var(--typo--weight-bold);overflow:hidden;text-align:center;text-transform:uppercase}.c-jobs-list tr:nth-child(2n){background:#f8f8f8}.c-jobs-list td,.c-jobs-list th{vertical-align:top}.c-jobs-list a{display:block}.c-jobs-list--head{font-weight:700;text-align:left}.c-jobs-list--col-valid{display:none}.pods-pagination-paginate{display:block;padding-bottom:1em;text-align:center}.page-numbers{margin:0 1px;padding:1px}.page-numbers.current{font-weight:600;font-weight:var(--typo--weight-bold)}.c-logo{text-decoration:none}.c-nav--main-item{position:relative;margin-right:10px;border:1px solid grey;padding:5px}.c-nav--main-anchor{display:block;padding:0 .25em;text-transform:uppercase}.c-nav--sub{position:absolute;top:100%;left:-1px;padding:0 1em 0 6px;border:1px solid grey;overflow:hidden;background:#fff}.c-nav--sub-item{background:#fff;padding:.5em .5em .5em 0}.c-nav--sub-anchor{padding:.25em;white-space:nowrap}.c-nav--item{margin:10px}.c-nav--link{line-height:40px;font-size:24px;text-decoration:none}.c-nav--link:hover{text-decoration:underline}.c-nav--lang{display:-webkit-box;display:-ms-flexbox;display:flex}.c-nav--lang li{padding:0 5px}.is-nav--main-item-active{position:relative;border-bottom-color:red}.is-nav--main-item-active:before{content:"";position:absolute;height:1px;width:100%;bottom:-1px;left:0;background:#fff;z-index:10}.is-nav--main-item-active .c-nav--sub{display:-webkit-box;display:-ms-flexbox;display:flex}.is-nav--main-anchor-active{text-decoration:none}.is-nav--sub-anchor-active{text-decoration:none;font-weight:600}.bu-action{height:28px;cursor:pointer;border:1px solid #e1e1e1;padding:0 15px;margin:0;display:inline-block}.bu-action--main{color:#fff;background:#006957}.c-nav-footer a:hover{border-color:#ababab}.c-nav-footer .act,.c-nav-footer .act:hover{border-color:#4b4d4f}#content a:hover{text-decoration:underline}#content h1{padding:0 0 10px;font-size:22px;font-weight:400}#content h2{padding:0 0 13px;font-size:19px;font-weight:700}#content h2 small{display:block;font-size:16px}#content h3{padding:0 0 10px;font-size:17px;font-weight:700}#content .info_box,#content .info_box p{font-size:16px;line-height:1.2;text-transform:uppercase}#content .t-reason{padding:0;border:0}#content .t-reason td{display:block;vertical-align:top}#content .t-reason .t-reason-col-2 h2{padding:25px 0 13px}#content .t-reason h2{text-align:center}#content .t-reason ul{padding:0}#content .t-membership{width:100%;border:0;text-align:left}#content .t-membership td{text-align:justify;vertical-align:middle}#content .t-membership .t-membership-row-4 td{border-bottom:none}#content .t-contacts-box{max-width:650px}#content .t-contacts{width:100%}#content .t-contacts td{vertical-align:top}#content .t-contacts p{text-align:left}#content .info_box{position:relative;margin:0 0 20px;color:#fff}#content .info_box.tyle_1{background-position:0 0}#content .info_box.tyle_1 .bottom{background-position:-250px 100%}#content .info_box.tyle_2{background-position:-500px 0}#content .info_box.tyle_2 .bottom{background-position:-750px 100%}#content .info_box.tyle_3{background-position:-1000px 0}#content .info_box.tyle_3 .bottom{background-position:-1250px 100%}#content .info_box.tyle_4{background-position:-1500px 0}#content .info_box.tyle_4 .bottom{background-position:-1750px 100%}#content .info_box.tyle_5{background-position:-2000px 0}#content .info_box.tyle_5 .bottom{background-position:-2250px 100%}#content .info_box .bottom{width:219px;height:22px;position:absolute;left:0;bottom:-22px}#content .info_box p{padding:0}#content .search_box{background:#f8f8f8;padding:10px}#content .search_box select{width:130px;background:#f7f7f7;border:1px solid #e1e1e1;padding:6px}#content .search_box li{padding:0;display:block;background:0 0;overflow:hidden}#content .search_box li label{display:block;font-weight:700}#content .search_box li .input{width:78%;color:#4b4d4f;border:0;padding:8px;background:0 0}#content .search_box li select{color:#4b4d4f;background:#f5f5f5;margin:0 20px 10px 0}#content .search_box li select+.filter-button{clear:left;margin-left:100px}#content .search_box li .submit{float:right;width:39px;height:39px;cursor:pointer;background:url(../_img/search_box_icon.gif) 50% 50% no-repeat;border:0;vertical-align:middle}#content .search_box li a.url{float:right;margin-top:7px;padding:4px 18px 4px 0;font-weight:700}#content .search_box li a.url.open{background:url(../_img/search_box_url_icon.gif) right 12px no-repeat}#content .search_box li a.url.close{background:url(../_img/search_box_url_icon.gif) right -13px no-repeat}#content .search_box li #search-input-block{border:1px solid #dfe1e4;background:#fff;overflow:hidden}#content .search_box li.filter-additional{padding-top:10px}#content .search_box li.filter-additional label{float:left;width:95px;padding:6px 5px 0 0}#content .search_box li.filter-additional select{float:left}#content .search_box li.filter-additional+.filter-additional{padding-top:0}#content .search_box li #period,#content .search_box li #type{margin-right:0}#content .search_box .filter-button{float:left;color:#4b4d4f;background:#f5f5f5;margin:0 22px 0 0;border:1px solid #e1e1e1;padding:7px;cursor:pointer;text-decoration:none}#content .search_box .filter-button:hover{background:#eee}#content p{text-align:justify}#content a{text-decoration:none}#content .img_left{margin:0 20px 15px 0;float:left}#content a.home_url,.c-home-url{width:254px;color:#4b4d4f;font-size:21px;margin:15px auto;display:block;text-align:center;line-height:1.2}#content a.home_url{text-decoration:none;padding:280px 0 0}#content a.home_url_1{background:url(../_img/workis_l.png) no-repeat;background-size:contain}#content a.home_url_2{background:url(../_img/img_2.jpg) no-repeat}#content a:hover.home_url{text-decoration:underline}.c-home-url{text-decoration:none}.c-home-url:hover{text-decoration:underline}.c-home-pic{display:block;border-radius:50%;margin-bottom:20px;overflow:hidden}#content .contact-form .form li textarea,.cv-form .form li textarea{overflow-y:auto;resize:none}.c-home-pic img{display:block}#content .news_list{padding:0 0 15px;display:block}#content .news_list li{border-top:1px solid #dfe1e4;padding:15px 0 0;display:block}#content .news_list li a.more{font-weight:700;text-decoration:underline}#content .news_list li:first-child{border-top:0;padding:0}#content .staff{margin:0 0 15px -33px;display:block}#content .staff li{width:216px;margin:0 0 10px 33px;float:left}#content .staff li.sep{width:100%}#content .staff li .foto{margin:0 0 10px;display:block}#content .staff li p{padding:0 5px 15px}#content .form{width:318px;padding:0 0 15px;display:inline-block}#content .form li{padding:0 0 28px;display:block;background:0 0}#content .form li.bottom{padding:0 0 10px;margin:-10px 0 0}#content .form li label{padding:0 0 6px;display:block}#content .form li input.text,#content .form li select,#content .form li textarea{background:#f7f7f7;border:1px solid #e1e1e1;padding:6px}#content .form li input.text,#content .form li textarea{width:318px}#content .form li select{width:164px}#content .form li textarea{height:114px;overflow:auto}#content .form li .errormessage{color:#bb2543;padding:6px 0 0;display:block}#content .form li .txt{color:#bb2543;display:inline-block}#content .form li .action{height:28px;color:#fff;cursor:pointer;background:#006957;border:1px solid #e1e1e1;padding:0 20px;margin:0 10px 0 0;display:inline-block}#content .form li .action:hover{background:#008d75}#content .form li .Actions{display:inline-block}#content .country_tabs{width:100%;padding:0 0 15px;float:left}#content .country_tabs li{padding:0 10px 0 0;float:left}#content .country_tabs li a{color:#4b4d4f;text-decoration:none;float:left}#content .country_tabs li a.act{font-weight:700;background:#ebebeb;padding:0 10px}#content .country_tabs li a:hover{text-decoration:underline}#content .pages{text-align:center;padding:0 0 15px;display:block}#content .pages a{margin:0 3px}#content .pages a.prev{font-weight:700;float:left}#content .pages a.next{font-weight:700;float:right}#content .pages a.act{font-weight:700}#banners{width:976px;padding:20px 0;float:left}#banners li{margin:0 0 0 40px;float:left}#banners li:first-child{margin:0}.fl{float:left!important}.fr{float:right!important}.clear{height:0;clear:both;display:block}.input,input.text,select,textarea{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}button::-moz-focus-inner,input[type=button]::-moz-focus-inner,input[type=reset]::-moz-focus-inner,input[type=submit]::-moz-focus-inner{border:0;padding:0}.map_page{width:540px;text-align:center;margin:20px auto}.map_page .logo{margin:0 0 30px;display:block}.map_page p{padding:0 0 15px;display:block}.map_page a.map_url{width:168px;position:relative;display:inline-block}.map_page a.map_url.es{height:89px;background:url(../_img/map_url.jpg) no-repeat;margin:0 0 -20px}.map_page a:hover.map_url.es{background:url(../_img/map_url.jpg) -200px 0 no-repeat;z-index:1}.map_page a.map_url.lv{height:100px;background:url(../_img/map_url.jpg) 0 -69px no-repeat;margin:0 0 -30px}.map_page a:hover.map_url.lv{background:url(../_img/map_url.jpg) -400px -69px no-repeat;z-index:1}.map_page a.map_url.lt{height:109px;background:url(../_img/map_url.jpg) 0 -139px no-repeat}.map_page a:hover.map_url.lt{background:url(../_img/map_url.jpg) -600px -139px no-repeat;z-index:1}.hide{display:none!important}#content ul:not([class]) a{text-decoration:underline}#content img.left{margin:15px 20px 15px 0;float:left}#content img.ico{position:relative;top:7px}#map_canvas{width:100%;height:450px}#content .contact-form .form li input[type=text].error,#content .contact-form .form li textarea.error{border:1px solid #bb2543}.job-cont{padding:0 0 15px;display:block}.cont-content{display:block;padding:0 0 10px}.cv-form .form li.bottom{padding:0 0 10px;margin:-10px 0 0}.cv-form .form li label{padding:0 0 6px;display:block}.cv-form .form li input.text,.cv-form .form li textarea{background:#f7f7f7;border:1px solid #e1e1e1;padding:6px;width:318px}.cv-form .form li textarea{height:114px}#custom,#custom .biuro-header,#custom .biuro-ti,#custom .biuro-ti-text,.about-biuro{overflow:hidden}.cv-form .form li input[type=file]{background:#f7f7f7;border:1px solid #e1e1e1;padding:0 6px;width:304px;height:30px}.cv-form .form li .errormessage{color:#bb2543;padding:6px 0 0}.cv-form .form li input[type=file].error,.cv-form .form li input[type=text].error{border:1px solid #bb2543}.cv-form .form li .txt{color:#bb2543;display:inline-block}.cv-form .form li .action{height:28px;color:#fff;cursor:pointer;background:#006957;border:1px solid #e1e1e1;padding:0 20px;margin:0 10px 0 0;display:inline-block}.cv-form .form li .action:hover{background:#008d75}.cv-form .form li .Actions{display:inline-block}#cv-success,#cv-success p{color:#393}#content ul:not([class]){padding:0 0 15px;display:block}#content ul.table li,#content ul:not([class]) li{position:relative;padding:0 0 5px 25px;display:block}#content ul.table li:before,#content ul:not([class]) li:before{content:"";position:absolute;top:9px;left:1px;width:4px;height:4px;border-radius:50%;background:#4b4d4f}#content ul:not([class]) a:hover{text-decoration:none}#content ol{padding:0 0 15px 20px;text-align:justify}#content ol>li{padding:0 0 5px;text-align:justify}#content .cform .form li select{width:318px}#content #filter-empty-results{padding-top:15px}#content a.home_url,#content h1{text-transform:uppercase}.hidden-coords{display:none}.banner{width:180px;height:160px;float:left;position:relative;left:-15px;margin-right:50px;margin-bottom:20px}.banner a,.banner a img{border:0}.icon:before{content:"";position:relative;top:9px;display:inline-block;width:30px;height:26px;margin:0 8px 0 0;background:url(../_img/icons.png) 50px 50px no-repeat;border-radius:3px}#content .icon-blue-dark{color:#253466;font-weight:700}.icon-blue-dark:before{border:1px solid #253466}.icon-blue-dark:hover:before{background-color:#253466}#content .icon-blue-light{color:#156292;font-weight:700}.icon-blue-light:before{border:1px solid #156292}.icon-blue-light:hover:before{background-color:#156292}#content .icon-red{color:#bb2543;font-weight:700}.icon-red:before{border:1px solid #bb2543}.icon-red:hover:before{background-color:#bb2543}#content .icon-brown{color:#b76630;font-weight:700}.icon-brown:before{border:1px solid #b76630}.icon-brown:hover:before{background-color:#b76630}#content .icon-purple{color:#6b1c3a;font-weight:700}.icon-purple:before{border:1px solid #6b1c3a}.icon-purple:hover:before{background-color:#6b1c3a}#content .icon-green{color:#006957;font-weight:700}.icon-green:before{border:1px solid #006957}.icon-green:hover:before{background-color:#006957}.icon-blue-dark.icon-facebook:before{background-position:-2px -45px}.icon-blue-dark.icon-linkedin:before{background-position:-40px -45px}.icon-blue-dark.icon-phone:before{background-position:-80px -45px}.icon-blue-dark.icon-note:before{background-position:-121px -45px}.icon-blue-light.icon-facebook:before{background-position:-2px -87px}.icon-blue-light.icon-linkedin:before{background-position:-40px -87px}.icon-blue-light.icon-phone:before{background-position:-80px -87px}.icon-blue-light.icon-note:before{background-position:-121px -87px}.icon-red.icon-facebook:before{background-position:-2px -131px}.icon-red.icon-linkedin:before{background-position:-40px -131px}.icon-red.icon-phone:before{background-position:-80px -131px}.icon-red.icon-note:before{background-position:-121px -131px}.icon-brown.icon-facebook:before{background-position:-2px -176px}.icon-brown.icon-linkedin:before{background-position:-40px -176px}.icon-brown.icon-phone:before{background-position:-80px -176px}.icon-brown.icon-note:before{background-position:-121px -176px}.icon-purple.icon-facebook:before{background-position:-2px -218px}.icon-purple.icon-linkedin:before{background-position:-40px -218px}.icon-purple.icon-phone:before{background-position:-80px -218px}.icon-purple.icon-note:before{background-position:-121px -218px}.icon-green.icon-facebook:before{background-position:-2px -258px}.icon-green.icon-linkedin:before{background-position:-40px -258px}.icon-green.icon-phone:before{background-position:-80px -258px}.icon-green.icon-note:before{background-position:-121px -258px}.icon-facebook:hover:before{background-position:-2px -7px}.icon-linkedin:hover:before{background-position:-40px -7px}.icon-phone:hover:before{background-position:-80px -7px}.icon-note:hover:before{background-position:-121px -7px}.about-biuro{margin:0 auto}.about-biuro-img{position:relative;float:left;width:100%;height:214px;background-repeat:no-repeat}.about-biuro-img:before{position:absolute;top:0;left:50%;width:178px;height:214px;margin:0 0 0 -89px}.about-biuro-img-1:before{background-position:0 0}.about-biuro-img-2:before{background-position:-178px 0}.about-biuro-img-3:before{background-position:-356px 0}.about-biuro-img-4:before{background-position:-534px 0}.about-biuro-lt .about-biuro-img:before{background-image:url(../_img/lt-apie-idarbinimo-agentura.jpg)}.about-biuro-lv .about-biuro-img:before{background-image:url(../_img/lv-apie-idarbinimo-agentura.jpg)}.about-biuro-ee .about-biuro-img:before{background-image:url(../_img/ee-apie-idarbinimo-agentura.jpg)}.about-biuro-en .about-biuro-img:before{background-image:url(../_img/en-apie-idarbinimo-agentura.jpg)}.about-biuro-ru .about-biuro-img:before{background-image:url(../_img/ru-apie-idarbinimo-agentura.jpg)}.job-add h3{float:left;clear:both;font-weight:700;padding:0 6px 15px 0}.job-add span{display:block;float:left;padding:0 0 15px}#custom .biuro-header p{color:#006957;font-weight:700}#custom .biuro-header .logo{float:none;width:133px;margin:0 auto 20px}#custom .biuro-ti-img{display:none}#custom .biuro-ti-text h3{color:#006957;padding:0}#custom .biuro-ti-text li{position:relative;padding:0 0 0 15px;background:none}#custom .biuro-ti-text li:before{content:"";position:absolute;top:7px;left:2px;width:6px;height:6px;border-radius:50%;background:#006957}.u-align--center{text-align:center}.tmp-contacts img{display:none}.tmp-contacts ul{padding-left:5px}.c-logos{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.c-logos div{-webkit-box-flex:0;-ms-flex:0 0 21%;flex:0 0 21%;border:1px solid grey;padding:1em;margin-bottom:1em;text-align:center}.biuro-ti-img{display:none}@media (min-width:80em){[href^=tel]{pointer-events:none;text-decoration:none;color:inherit}}@media (max-width:47.999em){.l-footer--section{-webkit-box-flex:1;-ms-flex:1 0 35%;flex:1 0 35%;margin-bottom:20px}.c-jobs-list--head{display:none}.c-jobs-list--col-city{text-align:right}.c-fixed-footer{position:fixed;left:0;bottom:0;width:100%;background:hsla(0,0%,100%,.85);padding:20px 20px 0;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.45);box-shadow:0 -1px 1px 0 rgba(0,0,0,.45)}}@media (min-width:48em){#custom .biuro-title{border-width:3px;margin:0 0 30px;padding:20px;font-size:22px}.c-jobs-list--col-city,.c-jobs-list--col-valid,.c-jobs-list--head:nth-child(n+2){border-left:1px solid #dfe1e4}.c-jobs-list--col-valid{display:table-cell}}@media (max-width:29.999em){.c-jobs-list--col{float:left;width:calc(100% - 20px)}.c-jobs-list--col-city{padding-bottom:10px;text-align:left}}@media (min-width:30em){.c-jobs-list--col{max-width:260px}}@media (max-width:600px){.bu-action{height:44px}}@media (min-width:360px){#content .search_box li .input{width:83%}}@media (min-width:480px){#content img.starjobs-img{float:left;width:100px;margin:15px 20px 15px 0}#content .t-contacts td.t-contacts-col-1{width:43%}#content .t-contacts td.t-contacts-col-2,#content .t-contacts td.t-contacts-col-3{width:50%}#content .info_box{float:right;margin:47px 0 20px 20px}#content .search_box li .input{width:88%}.about-biuro-img{width:50%}#custom .biuro-header .logo{float:left;margin:0 20px 20px 0}#custom .biuro-ti-img{display:block;float:left;width:70px}#custom .biuro-job-contacts{margin:0 0 0 70px}}@media (min-width:600px){#content .search_box li label{float:left;padding:9px 10px 0 0}#content .search_box li #search-input-block{margin:0 0 0 100px}}@media (min-width:768px){#content h1{text-align:justify}#content img.starjobs-img{width:200px}#content .t-membership td{border-bottom:1px solid #dfdfdf;padding-bottom:10px}#content .t-membership .t-membership-col-1{width:150px;padding-right:20px}#content .t-contacts td.t-contacts-col-1{width:34%}#content .t-contacts td.t-contacts-col-2,#content .t-contacts td.t-contacts-col-3{width:33%}#content .info_box.tyle_1,#content .info_box.tyle_1 .bottom,#content .info_box.tyle_2,#content .info_box.tyle_2 .bottom,#content .info_box.tyle_3,#content .info_box.tyle_3 .bottom,#content .info_box.tyle_4,#content .info_box.tyle_4 .bottom,#content .info_box.tyle_5,#content .info_box.tyle_5 .bottom{background-image:url(../_img/info_box_bg.png);background-repeat:no-repeat}#custom .biuro-header .logo{margin:0 20px 24px 0}}@media (min-width:980px){#content h2,#content h3,#content ul:not([class]){text-align:justify}#content h1{padding:0 0 15px;font-size:24px}#content .t-reason td{display:table-cell;width:50%}#content .t-reason .t-reason-col-1{padding-right:20px;border-right:1px solid #dfdfdf}#content .t-reason .t-reason-col-2{padding-left:20px}#content .t-reason .t-reason-col-2 h2{padding:12px 0 25px}#content .t-membership td{padding-bottom:0}#content .t-membership .t-membership-col-1{width:250px;padding-right:0}#content .info_box,#content .info_box p{font-size:18px}#content .search_box li select{margin:0 33px 10px 0}#content .search_box li a.url{margin-top:-36px}#content .search_box li #search-input-block{margin:0 200px 0 100px}#content a.home_url,.c-home-url{display:inline-block;font-weight:400;margin:15px 50px;font-size:24px}#content ul:not([class]) li{padding:0 0 5px 45px}#content ul:not([class]) li:before{left:21px}.about-biuro-img{width:25%}}@media only screen and (min-width:1281px){[href^=tel]{pointer-events:none;text-decoration:none;color:inherit}}@media (max-width:767px){#content h1 .icon{display:block;margin-top:10px}#content .t-membership tr{display:block}#content .t-membership td{display:block;float:left;width:100%}#content .t-membership .t-membership-col-2{border-bottom:1px solid #dfdfdf;padding:0 0 20px}#content .t-contacts td{float:left;width:50%}.hidden-max-small{display:none!important}}@media (max-width:599px){#content .search_box li select+label{clear:left}}@media (max-width:479px){#content .t-contacts td{width:100%}.hidden-max-x-small{display:none!important}#custom .biuro-job-valid-till{display:block}}
\ No newline at end of file
@font-face{font-family:PT Sans Narrow;src:url(../fonts/pt_sans_narrow.woff2) format("woff2"),url(../fonts/pt_sans_narrow.woff) format("woff");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:PT Sans Narrow;src:url(../fonts/pt_sans_narrow_bold.woff2) format("woff2"),url(../fonts/pt_sans_narrow_bold.woff) format("woff");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:Bebas Neue;src:url(../fonts/bebas-neue.woff2) format("woff2"),url(../fonts/bebas-neue.woff) format("woff");font-weight:400;font-style:normal;font-display:swap}
/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}a:hover{text-decoration:none}figure{margin:0}img{max-width:100%}p{margin:0 0 1.6rem}b,strong{font-weight:600;font-weight:var(--typo--weight-bold)}table{border-collapse:collapse;border-spacing:0}.l-footer--inner{display:-webkit-box;display:-ms-flexbox;display:flex;padding-top:15px;-ms-flex-wrap:wrap;flex-wrap:wrap}.l-footer--section{-webkit-box-flex:1;-ms-flex:1 0 15%;flex:1 0 15%}.l-footer--section h4{margin:0;padding:0}.l-footer{padding-bottom:100px;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.45);box-shadow:0 -1px 1px 0 rgba(0,0,0,.45)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;padding:0;margin:0;background:#fff}.awesomplete>ul:empty{display:none}.c-breadcrumbs{padding-top:1em}.c-cookies-warning{position:fixed;left:0;right:0;bottom:0;padding:15px 20px;background:#f6f6f6;overflow:hidden;z-index:100}.c-cookies-warning .bu-action{margin-top:10px}.c-cookies-warning .bu-action--alt{float:right}.c-copy{padding-top:.75em;text-align:center}.c-divisions--list{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:16px}.c-divisions--list-item{margin-right:10px;padding:0 12px;font-weight:400;font-weight:var(--typo--weight-regular);line-height:1.5;cursor:pointer}.is-divisions--list-item-active{background:#ccc;font-weight:600;font-weight:var(--typo--weight-bold)}#custom .biuro-title{margin:0 0 20px;padding:10px;font-size:calc(1.125rem + .8929vw - 2.85728px);border:2px solid #006957;border:2px solid var(--color--green);border-radius:12px}#custom .biuro-title h1{margin:0;padding:0;line-height:1.2;color:#006957;color:var(--color--green);font-weight:600;font-weight:var(--typo--weight-bold);overflow:hidden;text-align:center;text-transform:uppercase}.c-jobs-list tr:nth-child(2n){background:#f8f8f8}.c-jobs-list td,.c-jobs-list th{vertical-align:top}.c-jobs-list a{display:block}.c-jobs-list--head{font-weight:700;text-align:left}.c-jobs-list--col-valid{display:none}.pods-pagination-paginate{display:block;padding-bottom:1em;text-align:center}.page-numbers{margin:0 1px;padding:1px}.page-numbers.current{font-weight:600;font-weight:var(--typo--weight-bold)}.c-logo{text-decoration:none}.c-nav--main-item{position:relative;margin-right:10px;border:1px solid grey;padding:5px}.c-nav--main-anchor{display:block;padding:0 .25em;text-transform:uppercase}.c-nav--sub{position:absolute;top:100%;left:-1px;padding:0 1em 0 6px;border:1px solid grey;overflow:hidden;background:#fff}.c-nav--sub-item{background:#fff;padding:.5em .5em .5em 0}.c-nav--sub-anchor{padding:.25em;white-space:nowrap}.c-nav--item{margin:10px}.c-nav--link{line-height:40px;font-size:24px;text-decoration:none}.c-nav--link:hover{text-decoration:underline}.c-nav--lang{display:-webkit-box;display:-ms-flexbox;display:flex}.c-nav--lang li{padding:0 5px}.is-nav--main-item-active{position:relative;border-bottom-color:red}.is-nav--main-item-active:before{content:"";position:absolute;height:1px;width:100%;bottom:-1px;left:0;background:#fff;z-index:10}.is-nav--main-item-active .c-nav--sub{display:-webkit-box;display:-ms-flexbox;display:flex}.is-nav--main-anchor-active{text-decoration:none}.is-nav--sub-anchor-active{text-decoration:none;font-weight:600}.bu-action{height:28px;cursor:pointer;border:1px solid #e1e1e1;padding:0 15px;margin:0;display:inline-block}.bu-action--main{color:#fff;background:#006957}.c-nav-footer a:hover{border-color:#ababab}.c-nav-footer .act,.c-nav-footer .act:hover{border-color:#4b4d4f}#content a:hover{text-decoration:underline}#content h1{padding:0 0 10px;font-size:22px;font-weight:400}#content h2{padding:0 0 13px;font-size:19px;font-weight:700}#content h2 small{display:block;font-size:16px}#content h3{padding:0 0 10px;font-size:17px;font-weight:700}#content .info_box,#content .info_box p{font-size:16px;line-height:1.2;text-transform:uppercase}#content .t-reason{padding:0;border:0}#content .t-reason td{display:block;vertical-align:top}#content .t-reason .t-reason-col-2 h2{padding:25px 0 13px}#content .t-reason h2{text-align:center}#content .t-reason ul{padding:0}#content .t-membership{width:100%;border:0;text-align:left}#content .t-membership td{text-align:justify;vertical-align:middle}#content .t-membership .t-membership-row-4 td{border-bottom:none}#content .t-contacts-box{max-width:650px}#content .t-contacts{width:100%}#content .t-contacts td{vertical-align:top}#content .t-contacts p{text-align:left}#content .info_box{position:relative;margin:0 0 20px;color:#fff}#content .info_box.tyle_1{background-position:0 0}#content .info_box.tyle_1 .bottom{background-position:-250px 100%}#content .info_box.tyle_2{background-position:-500px 0}#content .info_box.tyle_2 .bottom{background-position:-750px 100%}#content .info_box.tyle_3{background-position:-1000px 0}#content .info_box.tyle_3 .bottom{background-position:-1250px 100%}#content .info_box.tyle_4{background-position:-1500px 0}#content .info_box.tyle_4 .bottom{background-position:-1750px 100%}#content .info_box.tyle_5{background-position:-2000px 0}#content .info_box.tyle_5 .bottom{background-position:-2250px 100%}#content .info_box .bottom{width:219px;height:22px;position:absolute;left:0;bottom:-22px}#content .info_box p{padding:0}#content .search_box{background:#f8f8f8;padding:10px}#content .search_box select{width:130px;background:#f7f7f7;border:1px solid #e1e1e1;padding:6px}#content .search_box li{padding:0;display:block;background:0 0;overflow:hidden}#content .search_box li label{display:block;font-weight:700}#content .search_box li .input{width:78%;color:#4b4d4f;border:0;padding:8px;background:0 0}#content .search_box li select{color:#4b4d4f;background:#f5f5f5;margin:0 20px 10px 0}#content .search_box li select+.filter-button{clear:left;margin-left:100px}#content .search_box li .submit{float:right;width:39px;height:39px;cursor:pointer;background:url(../_img/search_box_icon.gif) 50% 50% no-repeat;border:0;vertical-align:middle}#content .search_box li a.url{float:right;margin-top:7px;padding:4px 18px 4px 0;font-weight:700}#content .search_box li a.url.open{background:url(../_img/search_box_url_icon.gif) right 12px no-repeat}#content .search_box li a.url.close{background:url(../_img/search_box_url_icon.gif) right -13px no-repeat}#content .search_box li #search-input-block{border:1px solid #dfe1e4;background:#fff;overflow:hidden}#content .search_box li.filter-additional{padding-top:10px}#content .search_box li.filter-additional label{float:left;width:95px;padding:6px 5px 0 0}#content .search_box li.filter-additional select{float:left}#content .search_box li.filter-additional+.filter-additional{padding-top:0}#content .search_box li #period,#content .search_box li #type{margin-right:0}#content .search_box .filter-button{float:left;color:#4b4d4f;background:#f5f5f5;margin:0 22px 0 0;border:1px solid #e1e1e1;padding:7px;cursor:pointer;text-decoration:none}#content .search_box .filter-button:hover{background:#eee}#content p{text-align:justify}#content a{text-decoration:none}#content .img_left{margin:0 20px 15px 0;float:left}#content a.home_url,.c-home-url{width:254px;color:#4b4d4f;font-size:21px;margin:15px auto;display:block;text-align:center;line-height:1.2}#content a.home_url{text-decoration:none;padding:280px 0 0}#content a.home_url_1{background:url(../_img/workis_l.png) no-repeat;background-size:contain}#content a.home_url_2{background:url(../_img/img_2.jpg) no-repeat}#content a:hover.home_url{text-decoration:underline}.c-home-url{text-decoration:none}.c-home-url:hover{text-decoration:underline}.c-home-pic{display:block;border-radius:50%;margin-bottom:20px;overflow:hidden}#content .contact-form .form li textarea,.cv-form .form li textarea{overflow-y:auto;resize:none}.c-home-pic img{display:block}#content .news_list{padding:0 0 15px;display:block}#content .news_list li{border-top:1px solid #dfe1e4;padding:15px 0 0;display:block}#content .news_list li a.more{font-weight:700;text-decoration:underline}#content .news_list li:first-child{border-top:0;padding:0}#content .staff{margin:0 0 15px -33px;display:block}#content .staff li{width:216px;margin:0 0 10px 33px;float:left}#content .staff li.sep{width:100%}#content .staff li .foto{margin:0 0 10px;display:block}#content .staff li p{padding:0 5px 15px}#content .form{width:318px;padding:0 0 15px;display:inline-block}#content .form li{padding:0 0 28px;display:block;background:0 0}#content .form li.bottom{padding:0 0 10px;margin:-10px 0 0}#content .form li label{padding:0 0 6px;display:block}#content .form li input.text,#content .form li select,#content .form li textarea{background:#f7f7f7;border:1px solid #e1e1e1;padding:6px}#content .form li input.text,#content .form li textarea{width:318px}#content .form li select{width:164px}#content .form li textarea{height:114px;overflow:auto}#content .form li .errormessage{color:#bb2543;padding:6px 0 0;display:block}#content .form li .txt{color:#bb2543;display:inline-block}#content .form li .action{height:28px;color:#fff;cursor:pointer;background:#006957;border:1px solid #e1e1e1;padding:0 20px;margin:0 10px 0 0;display:inline-block}#content .form li .action:hover{background:#008d75}#content .form li .Actions{display:inline-block}#content .country_tabs{width:100%;padding:0 0 15px;float:left}#content .country_tabs li{padding:0 10px 0 0;float:left}#content .country_tabs li a{color:#4b4d4f;text-decoration:none;float:left}#content .country_tabs li a.act{font-weight:700;background:#ebebeb;padding:0 10px}#content .country_tabs li a:hover{text-decoration:underline}#content .pages{text-align:center;padding:0 0 15px;display:block}#content .pages a{margin:0 3px}#content .pages a.prev{font-weight:700;float:left}#content .pages a.next{font-weight:700;float:right}#content .pages a.act{font-weight:700}#banners{width:976px;padding:20px 0;float:left}#banners li{margin:0 0 0 40px;float:left}#banners li:first-child{margin:0}.fl{float:left!important}.fr{float:right!important}.clear{height:0;clear:both;display:block}.input,input.text,select,textarea{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}button::-moz-focus-inner,input[type=button]::-moz-focus-inner,input[type=reset]::-moz-focus-inner,input[type=submit]::-moz-focus-inner{border:0;padding:0}.map_page{width:540px;text-align:center;margin:20px auto}.map_page .logo{margin:0 0 30px;display:block}.map_page p{padding:0 0 15px;display:block}.map_page a.map_url{width:168px;position:relative;display:inline-block}.map_page a.map_url.es{height:89px;background:url(../_img/map_url.jpg) no-repeat;margin:0 0 -20px}.map_page a:hover.map_url.es{background:url(../_img/map_url.jpg) -200px 0 no-repeat;z-index:1}.map_page a.map_url.lv{height:100px;background:url(../_img/map_url.jpg) 0 -69px no-repeat;margin:0 0 -30px}.map_page a:hover.map_url.lv{background:url(../_img/map_url.jpg) -400px -69px no-repeat;z-index:1}.map_page a.map_url.lt{height:109px;background:url(../_img/map_url.jpg) 0 -139px no-repeat}.map_page a:hover.map_url.lt{background:url(../_img/map_url.jpg) -600px -139px no-repeat;z-index:1}.hide{display:none!important}#content ul:not([class]) a{text-decoration:underline}#content img.left{margin:15px 20px 15px 0;float:left}#content img.ico{position:relative;top:7px}#map_canvas{width:100%;height:450px}#content .contact-form .form li input[type=text].error,#content .contact-form .form li textarea.error{border:1px solid #bb2543}.job-cont{padding:0 0 15px;display:block}.cont-content{display:block;padding:0 0 10px}.cv-form .form li.bottom{padding:0 0 10px;margin:-10px 0 0}.cv-form .form li label{padding:0 0 6px;display:block}.cv-form .form li input.text,.cv-form .form li textarea{background:#f7f7f7;border:1px solid #e1e1e1;padding:6px;width:318px}.cv-form .form li textarea{height:114px}#custom,#custom .biuro-header,#custom .biuro-ti,#custom .biuro-ti-text,.about-biuro{overflow:hidden}.cv-form .form li input[type=file]{background:#f7f7f7;border:1px solid #e1e1e1;padding:0 6px;width:304px;height:30px}.cv-form .form li .errormessage{color:#bb2543;padding:6px 0 0}.cv-form .form li input[type=file].error,.cv-form .form li input[type=text].error{border:1px solid #bb2543}.cv-form .form li .txt{color:#bb2543;display:inline-block}.cv-form .form li .action{height:28px;color:#fff;cursor:pointer;background:#006957;border:1px solid #e1e1e1;padding:0 20px;margin:0 10px 0 0;display:inline-block}.cv-form .form li .action:hover{background:#008d75}.cv-form .form li .Actions{display:inline-block}#cv-success,#cv-success p{color:#393}#content ul:not([class]){padding:0 0 15px;display:block}#content ul.table li,#content ul:not([class]) li{position:relative;padding:0 0 5px 25px;display:block}#content ul.table li:before,#content ul:not([class]) li:before{content:"";position:absolute;top:9px;left:1px;width:4px;height:4px;border-radius:50%;background:#4b4d4f}#content ul:not([class]) a:hover{text-decoration:none}#content ol{padding:0 0 15px 20px;text-align:justify}#content ol>li{padding:0 0 5px;text-align:justify}#content .cform .form li select{width:318px}#content #filter-empty-results{padding-top:15px}#content a.home_url,#content h1{text-transform:uppercase}.hidden-coords{display:none}.banner{width:180px;height:160px;float:left;position:relative;left:-15px;margin-right:50px;margin-bottom:20px}.banner a,.banner a img{border:0}.icon:before{content:"";position:relative;top:9px;display:inline-block;width:30px;height:26px;margin:0 8px 0 0;background:url(../_img/icons.png) 50px 50px no-repeat;border-radius:3px}#content .icon-blue-dark{color:#253466;font-weight:700}.icon-blue-dark:before{border:1px solid #253466}.icon-blue-dark:hover:before{background-color:#253466}#content .icon-blue-light{color:#156292;font-weight:700}.icon-blue-light:before{border:1px solid #156292}.icon-blue-light:hover:before{background-color:#156292}#content .icon-red{color:#bb2543;font-weight:700}.icon-red:before{border:1px solid #bb2543}.icon-red:hover:before{background-color:#bb2543}#content .icon-brown{color:#b76630;font-weight:700}.icon-brown:before{border:1px solid #b76630}.icon-brown:hover:before{background-color:#b76630}#content .icon-purple{color:#6b1c3a;font-weight:700}.icon-purple:before{border:1px solid #6b1c3a}.icon-purple:hover:before{background-color:#6b1c3a}#content .icon-green{color:#006957;font-weight:700}.icon-green:before{border:1px solid #006957}.icon-green:hover:before{background-color:#006957}.icon-blue-dark.icon-facebook:before{background-position:-2px -45px}.icon-blue-dark.icon-linkedin:before{background-position:-40px -45px}.icon-blue-dark.icon-phone:before{background-position:-80px -45px}.icon-blue-dark.icon-note:before{background-position:-121px -45px}.icon-blue-light.icon-facebook:before{background-position:-2px -87px}.icon-blue-light.icon-linkedin:before{background-position:-40px -87px}.icon-blue-light.icon-phone:before{background-position:-80px -87px}.icon-blue-light.icon-note:before{background-position:-121px -87px}.icon-red.icon-facebook:before{background-position:-2px -131px}.icon-red.icon-linkedin:before{background-position:-40px -131px}.icon-red.icon-phone:before{background-position:-80px -131px}.icon-red.icon-note:before{background-position:-121px -131px}.icon-brown.icon-facebook:before{background-position:-2px -176px}.icon-brown.icon-linkedin:before{background-position:-40px -176px}.icon-brown.icon-phone:before{background-position:-80px -176px}.icon-brown.icon-note:before{background-position:-121px -176px}.icon-purple.icon-facebook:before{background-position:-2px -218px}.icon-purple.icon-linkedin:before{background-position:-40px -218px}.icon-purple.icon-phone:before{background-position:-80px -218px}.icon-purple.icon-note:before{background-position:-121px -218px}.icon-green.icon-facebook:before{background-position:-2px -258px}.icon-green.icon-linkedin:before{background-position:-40px -258px}.icon-green.icon-phone:before{background-position:-80px -258px}.icon-green.icon-note:before{background-position:-121px -258px}.icon-facebook:hover:before{background-position:-2px -7px}.icon-linkedin:hover:before{background-position:-40px -7px}.icon-phone:hover:before{background-position:-80px -7px}.icon-note:hover:before{background-position:-121px -7px}.about-biuro{margin:0 auto}.about-biuro-img{position:relative;float:left;width:100%;height:214px;background-repeat:no-repeat}.about-biuro-img:before{position:absolute;top:0;left:50%;width:178px;height:214px;margin:0 0 0 -89px}.about-biuro-img-1:before{background-position:0 0}.about-biuro-img-2:before{background-position:-178px 0}.about-biuro-img-3:before{background-position:-356px 0}.about-biuro-img-4:before{background-position:-534px 0}.about-biuro-lt .about-biuro-img:before{background-image:url(../_img/lt-apie-idarbinimo-agentura.jpg)}.about-biuro-lv .about-biuro-img:before{background-image:url(../_img/lv-apie-idarbinimo-agentura.jpg)}.about-biuro-ee .about-biuro-img:before{background-image:url(../_img/ee-apie-idarbinimo-agentura.jpg)}.about-biuro-en .about-biuro-img:before{background-image:url(../_img/en-apie-idarbinimo-agentura.jpg)}.about-biuro-ru .about-biuro-img:before{background-image:url(../_img/ru-apie-idarbinimo-agentura.jpg)}.job-add h3{float:left;clear:both;font-weight:700;padding:0 6px 15px 0}.job-add span{display:block;float:left;padding:0 0 15px}#custom .biuro-header p{color:#006957;font-weight:700}#custom .biuro-header .logo{float:none;width:133px;margin:0 auto 20px}#custom .biuro-ti-img{display:none}#custom .biuro-ti-text h3{color:#006957;padding:0}#custom .biuro-ti-text li{position:relative;padding:0 0 0 15px;background:none}#custom .biuro-ti-text li:before{content:"";position:absolute;top:7px;left:2px;width:6px;height:6px;border-radius:50%;background:#006957}.u-align--center{text-align:center}.tmp-contacts img{display:none}.tmp-contacts ul{padding-left:5px}.c-logos{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.c-logos div{-webkit-box-flex:0;-ms-flex:0 0 21%;flex:0 0 21%;border:1px solid grey;padding:1em;margin-bottom:1em;text-align:center}.biuro-ti-img{display:none}@media (min-width:80em){[href^=tel]{pointer-events:none;text-decoration:none;color:inherit}}@media (max-width:47.999em){.l-footer--section{-webkit-box-flex:1;-ms-flex:1 0 35%;flex:1 0 35%;margin-bottom:20px}.c-jobs-list--head{display:none}.c-jobs-list--col-city{text-align:right}.c-fixed-footer{position:fixed;left:0;bottom:0;width:100%;background:hsla(0,0%,100%,.85);padding:20px 20px 0;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.45);box-shadow:0 -1px 1px 0 rgba(0,0,0,.45)}}@media (min-width:48em){#custom .biuro-title{border-width:3px;margin:0 0 30px;padding:20px;font-size:22px}.c-jobs-list--col-city,.c-jobs-list--col-valid,.c-jobs-list--head:nth-child(n+2){border-left:1px solid #dfe1e4}.c-jobs-list--col-valid{display:table-cell}}@media (max-width:29.999em){.c-jobs-list--col{float:left;width:calc(100% - 20px)}.c-jobs-list--col-city{padding-bottom:10px;text-align:left}}@media (min-width:30em){.c-jobs-list--col{max-width:260px}}@media (max-width:600px){.bu-action{height:44px}}@media (min-width:360px){#content .search_box li .input{width:83%}}@media (min-width:480px){#content img.starjobs-img{float:left;width:100px;margin:15px 20px 15px 0}#content .t-contacts td.t-contacts-col-1{width:43%}#content .t-contacts td.t-contacts-col-2,#content .t-contacts td.t-contacts-col-3{width:50%}#content .info_box{float:right;margin:47px 0 20px 20px}#content .search_box li .input{width:88%}.about-biuro-img{width:50%}#custom .biuro-header .logo{float:left;margin:0 20px 20px 0}#custom .biuro-ti-img{display:block;float:left;width:70px}#custom .biuro-job-contacts{margin:0 0 0 70px}}@media (min-width:600px){#content .search_box li label{float:left;padding:9px 10px 0 0}#content .search_box li #search-input-block{margin:0 0 0 100px}}@media (min-width:768px){#content h1{text-align:justify}#content img.starjobs-img{width:200px}#content .t-membership td{border-bottom:1px solid #dfdfdf;padding-bottom:10px}#content .t-membership .t-membership-col-1{width:150px;padding-right:20px}#content .t-contacts td.t-contacts-col-1{width:34%}#content .t-contacts td.t-contacts-col-2,#content .t-contacts td.t-contacts-col-3{width:33%}#content .info_box.tyle_1,#content .info_box.tyle_1 .bottom,#content .info_box.tyle_2,#content .info_box.tyle_2 .bottom,#content .info_box.tyle_3,#content .info_box.tyle_3 .bottom,#content .info_box.tyle_4,#content .info_box.tyle_4 .bottom,#content .info_box.tyle_5,#content .info_box.tyle_5 .bottom{background-image:url(../_img/info_box_bg.png);background-repeat:no-repeat}#custom .biuro-header .logo{margin:0 20px 24px 0}}@media (min-width:980px){#content h2,#content h3,#content ul:not([class]){text-align:justify}#content h1{padding:0 0 15px;font-size:24px}#content .t-reason td{display:table-cell;width:50%}#content .t-reason .t-reason-col-1{padding-right:20px;border-right:1px solid #dfdfdf}#content .t-reason .t-reason-col-2{padding-left:20px}#content .t-reason .t-reason-col-2 h2{padding:12px 0 25px}#content .t-membership td{padding-bottom:0}#content .t-membership .t-membership-col-1{width:250px;padding-right:0}#content .info_box,#content .info_box p{font-size:18px}#content .search_box li select{margin:0 33px 10px 0}#content .search_box li a.url{margin-top:-36px}#content .search_box li #search-input-block{margin:0 200px 0 100px}#content a.home_url,.c-home-url{display:inline-block;font-weight:400;margin:15px 50px;font-size:24px}#content ul:not([class]) li{padding:0 0 5px 45px}#content ul:not([class]) li:before{left:21px}.about-biuro-img{width:25%}}@media only screen and (min-width:1281px){[href^=tel]{pointer-events:none;text-decoration:none;color:inherit}}@media (max-width:767px){#content h1 .icon{display:block;margin-top:10px}#content .t-membership tr{display:block}#content .t-membership td{display:block;float:left;width:100%}#content .t-membership .t-membership-col-2{border-bottom:1px solid #dfdfdf;padding:0 0 20px}#content .t-contacts td{float:left;width:50%}.hidden-max-small{display:none!important}}@media (max-width:599px){#content .search_box li select+label{clear:left}}@media (max-width:479px){#content .t-contacts td{width:100%}.hidden-max-x-small{display:none!important}#custom .biuro-job-valid-till{display:block}}
\ No newline at end of file
...@@ -41,18 +41,16 @@ qa-: Signify that a QA or Test Engineering team is running an automated UI test ...@@ -41,18 +41,16 @@ qa-: Signify that a QA or Test Engineering team is running an automated UI test
.tmp-contacts { .tmp-contacts {
img { display: none; } img { display: none; }
ul { padding-left: 5px } ul { padding-left: 5px }
} }
.c-logos { display: flex; flex-wrap: wrap; justify-content: space-between; .c-logos { display: flex; flex-wrap: wrap; justify-content: space-between;
div { flex: 0 0 21%; border: 1px solid gray; padding: 1em; margin-bottom: 1em; text-align: center; } div { flex: 0 0 21%; border: 1px solid gray; padding: 1em; margin-bottom: 1em; text-align: center; }
} }
.c-fixed-footer { .c-fixed-footer {
@media (--max--small) { @media (--max--small) {
position: fixed; left: 0; bottom: 0; width: 100%; background: rgba(255, 255, 255, .85); padding: 20px 20px 0; box-shadow: 0 -1px 1px 0 rgba(0, 0, 0, .45); position: fixed; left: 0; bottom: 0; width: 100%; background: rgba(255, 255, 255, .85); padding: 20px 20px 0; box-shadow: 0 -1px 1px 0 rgba(0, 0, 0, .45);
} }
} }
.biuro-ti-img { display: none; } .biuro-ti-img { display: none; }
</main><!-- .l-main --> </main><!-- .l-main -->
<?php <?php
if ( !searchQuery && !cityID && get_post_type() == 'job' ):
if ( !is_search() && get_post_type() == 'job' ):
?> ?>
<aside class="l-aside"> <aside class="l-aside">
<?php <?php
...@@ -99,6 +100,6 @@ ...@@ -99,6 +100,6 @@
endif; endif;
?> ?>
<script src="/wp-content/themes/biuro/js/main-32abb748.min.js" async></script> <script src="/wp-content/themes/biuro/js/main-2a9639b0.min.js" async></script>
</body> </body>
</html> </html>
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
// https://pods.io/docs/code/pods/find/ // https://pods.io/docs/code/pods/find/
$where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '"'; $where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '"';
// $where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '" AND (t.post_title LIKE "%' . searchQuery . '%" OR t.post_content LIKE "%' . searchQuery . '%")';
$params = array( $params = array(
'orderby' => 'date DESC', 'orderby' => 'date DESC',
......
...@@ -76,16 +76,6 @@ add_filter('upload_mimes', 'cc_mime_types'); ...@@ -76,16 +76,6 @@ add_filter('upload_mimes', 'cc_mime_types');
// return 'medium_large' !== $val; // Filter out 'medium_large' // return 'medium_large' !== $val; // Filter out 'medium_large'
// }); // });
// }); // });
// /*
// * Let WordPress manage the document title.
// * By adding theme support, we declare that this theme does not use a
// * hard-coded <title> tag in the document head, and expect WordPress to
// * provide it for us.
// */
add_theme_support( 'title-tag' );
// } // }
// add_action( 'after_setup_theme', 'biuro_theme_setup' ); // add_action( 'after_setup_theme', 'biuro_theme_setup' );
...@@ -206,15 +196,6 @@ function init_biuro_theme() { ...@@ -206,15 +196,6 @@ function init_biuro_theme() {
// Remove tags support from posts // Remove tags support from posts
// unregister_taxonomy_for_object_type('post_tag', 'post'); // unregister_taxonomy_for_object_type('post_tag', 'post');
/*
* Let WordPress manage the document title.
* By adding theme support, we declare that this theme does not use a
* hard-coded <title> tag in the document head, and expect WordPress to
* provide it for us.
*/
add_theme_support( 'title-tag' );
// Register menus // Register menus
register_nav_menus( register_nav_menus(
array( array(
...@@ -303,11 +284,31 @@ add_action('init', 'df_disable_comments_admin_bar'); ...@@ -303,11 +284,31 @@ add_action('init', 'df_disable_comments_admin_bar');
$l = get_nav_menu_locations(); // $l = get_nav_menu_locations();
$m = $l ? wp_get_nav_menu_object( $l[ 'main-menu' ] ) : null; // $m = $l ? wp_get_nav_menu_object( $l[ 'main-menu' ] ) : null;
$items = $m ? wp_get_nav_menu_items( $m->term_id, array( 'order' => 'DESC' ) ) : array(); // $items = $m ? wp_get_nav_menu_items( $m->term_id, array( 'order' => 'DESC' ) ) : array();
// $searchPageURL = $items[0] ? $items[0]->url : '/';
// global $searchPageURL;
// $searchPage = new WP_Query( array(
// 'numberposts' => 1,
// 'post_type' => 'page',
// 'meta_key' => 'search-page',
// 'meta_value' => 'true'
// ) );
// if ( $searchPage->have_posts() ) :
// while( $searchPage->have_posts() ) :
// $searchPage->the_post();
// $searchPageURL = get_the_permalink();
// endwhile;
// else:
// $searchPageURL = '/';
// endif;
$searchPageURL = $items[0] ? $items[0]->url : '/'; // delog( $searchPageURL );
// require_once 'includes/disable_discussion'; // require_once 'includes/disable_discussion';
...@@ -318,7 +319,7 @@ function getSiteTree($taxonomy) ...@@ -318,7 +319,7 @@ function getSiteTree($taxonomy)
'hide_empty' => false, 'hide_empty' => false,
)); ));
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ): if ( !empty( $terms ) && ! is_wp_error( $terms ) ):
echo '<ul>'; echo '<ul>';
foreach ( $terms as $term ): foreach ( $terms as $term ):
......
...@@ -13,7 +13,7 @@ define('cityID', $cityID); ...@@ -13,7 +13,7 @@ define('cityID', $cityID);
<meta charset="<?php bloginfo( 'charset' ); ?>"> <meta charset="<?php bloginfo( 'charset' ); ?>">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" /> <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title><?php wp_title(''); ?> | Biuro</title>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
...@@ -33,14 +33,14 @@ define('cityID', $cityID); ...@@ -33,14 +33,14 @@ define('cityID', $cityID);
<style><?php include 'css/core-a25434ed1d.min.css'; ?></style> <style><?php include 'css/core-a25434ed1d.min.css'; ?></style>
<link rel="preload" href="/wp-content/themes/biuro/css/main-04cee33275.min.css" as="style" onload="this.rel='stylesheet'"> <link rel="preload" href="/wp-content/themes/biuro/css/main-8c9c954583.min.css" as="style" onload="this.rel='stylesheet'">
<link rel="preload" href="/wp-content/themes/biuro/fonts/pt_sans_narrow.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/wp-content/themes/biuro/fonts/pt_sans_narrow.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/wp-content/themes/biuro/fonts/pt_sans_narrow_bold.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/wp-content/themes/biuro/fonts/pt_sans_narrow_bold.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/wp-content/themes/biuro/fonts/bebas-neue.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/wp-content/themes/biuro/fonts/bebas-neue.woff2" as="font" type="font/woff2" crossorigin>
<noscript> <noscript>
<link rel="stylesheet" href="/wp-content/themes/biuro/css/main-04cee33275.min.css"> <link rel="stylesheet" href="/wp-content/themes/biuro/css/main-8c9c954583.min.css">
</noscript> </noscript>
<?php wp_head(); ?> <?php wp_head(); ?>
...@@ -58,7 +58,6 @@ $section = get_post_meta( $post->ID, 'section', true ); ...@@ -58,7 +58,6 @@ $section = get_post_meta( $post->ID, 'section', true );
?> ?>
<body> <body>
<svg xmlns="http://www.w3.org/2000/svg" class="u-hidden"> <svg xmlns="http://www.w3.org/2000/svg" class="u-hidden">
<symbol id="biuro-logo" viewBox="0 0 108 63" aria-labelledby="svg-title svg-desc"> <symbol id="biuro-logo" viewBox="0 0 108 63" aria-labelledby="svg-title svg-desc">
<title id="svg-title">Biuro</title> <title id="svg-title">Biuro</title>
...@@ -94,9 +93,22 @@ $section = get_post_meta( $post->ID, 'section', true ); ...@@ -94,9 +93,22 @@ $section = get_post_meta( $post->ID, 'section', true );
?> ?>
</div> </div>
<div class="l-inner">
<?php
/*
delog( get_search_query(), 'Search Query');
delog( get_post_type(), 'Post type');
delog( get_page_template_slug(), 'slug');
delog( is_front_page(), 'is_front_page');
delog( is_search(), 'is_search');
*/
?>
</div>
<div id="main" class="l-content"> <div id="main" class="l-content">
<?php <?php
if ( !is_front_page() && get_post_type() == 'page' && get_page_template_slug() == 'page-jobs.php' || is_search() ):
if ( get_page_template_slug() == 'search.php' || is_search() ):
?> ?>
<aside class="l-aside"> <aside class="l-aside">
<?php <?php
......
...@@ -17,44 +17,6 @@ ...@@ -17,44 +17,6 @@
get_header(); ?> get_header(); ?>
<?php
if ( is_search() ):
?>
<?php
// Use for search
// https://pods.io/docs/code/pods/find/
// $where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '" AND t.post_title LIKE "%' . $searchQuery . '%"';
$where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '" AND (t.post_title LIKE "%' . searchQuery . '%" OR t.post_content LIKE "%' . searchQuery . '%")';
if (cityID):
$where = $where . ' AND city.term_id = ' . cityID;
endif;
$params = array(
'orderby' => 'date DESC',
'where' => $where,
'limit' => 21
);
$jobs = pods( 'job', $params );
if ( 0 < $jobs->total() ):
get_template_part( 'template-parts/jobs/jobs', 'list' );
else:
get_template_part( 'template-parts/jobs/jobs', 'not-found' );
endif;
?>
<?php
else:
?>
<?php <?php
while ( have_posts() ) : while ( have_posts() ) :
...@@ -62,8 +24,6 @@ get_header(); ?> ...@@ -62,8 +24,6 @@ get_header(); ?>
the_content(); the_content();
endwhile; endwhile;
endif;
?> ?>
<?php get_footer(); <?php get_footer();
!function(t){var e={};function n(i){if(e[i])return e[i].exports;var s=e[i]={i:i,l:!1,exports:{}};return t[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)n.d(i,s,function(e){return t[e]}.bind(null,s));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="/",n(n.s=1)}([function(t,e,n){"use strict";(function(t){function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}e.a=function(){var e=function t(e,n){var i=this;t.count=(t.count||0)+1,this.count=t.count,this.isOpened=!1,this.input=o(e),this.input.setAttribute("autocomplete","off"),this.input.setAttribute("aria-expanded","false"),this.input.setAttribute("aria-owns","awesomplete_list_"+this.count),this.input.setAttribute("role","combobox"),this.options=n=n||{},function(t,e,n){for(var i in e){var s=e[i],o=t.input.getAttribute("data-"+i.toLowerCase());"number"==typeof s?t[i]=parseInt(o):!1===s?t[i]=null!==o:s instanceof Function?t[i]=null:t[i]=o,t[i]||0===t[i]||(t[i]=i in n?n[i]:s)}}(this,{minChars:2,maxItems:10,autoFirst:!1,data:t.DATA,filter:t.FILTER_CONTAINS,sort:!1!==n.sort&&t.SORT_BYLENGTH,container:t.CONTAINER,item:t.ITEM,replace:t.REPLACE,tabSelect:!1},n),this.index=-1,this.container=this.container(e),this.ul=o.create("ul",{hidden:"hidden",role:"listbox",id:"awesomplete_list_"+this.count,inside:this.container}),this.status=o.create("span",{className:"visually-hidden",role:"status","aria-live":"assertive","aria-atomic":!0,inside:this.container,textContent:0!=this.minChars?"Type "+this.minChars+" or more characters for results.":"Begin typing for results."}),this._events={input:{input:this.evaluate.bind(this),blur:this.close.bind(this,{reason:"blur"}),keydown:function(t){var e=t.keyCode;i.opened&&(13===e&&i.selected?(t.preventDefault(),i.select()):9===e&&i.selected&&i.tabSelect?i.select():27===e?i.close({reason:"esc"}):38!==e&&40!==e||(t.preventDefault(),i[38===e?"previous":"next"]()))}},form:{submit:this.close.bind(this,{reason:"submit"})},ul:{mousedown:function(t){t.preventDefault()},click:function(t){var e=t.target;if(e!==this){for(;e&&!/li/i.test(e.nodeName);)e=e.parentNode;e&&0===t.button&&(t.preventDefault(),i.select(e,t.target))}}}},o.bind(this.input,this._events.input),o.bind(this.input.form,this._events.form),o.bind(this.ul,this._events.ul),this.input.hasAttribute("list")?(this.list="#"+this.input.getAttribute("list"),this.input.removeAttribute("list")):this.list=this.input.getAttribute("data-list")||n.list||[],t.all.push(this)};function i(t){var e=Array.isArray(t)?{label:t[0],value:t[1]}:"object"===n(t)&&"label"in t&&"value"in t?t:{label:t,value:t};this.label=e.label||e.value,this.value=e.value}e.prototype={set list(t){if(Array.isArray(t))this._list=t;else if("string"==typeof t&&t.indexOf(",")>-1)this._list=t.split(/\s*,\s*/);else if((t=o(t))&&t.children){var e=[];s.apply(t.children).forEach(function(t){if(!t.disabled){var n=t.textContent.trim(),i=t.value||n,s=t.label||n;""!==i&&e.push({label:s,value:i})}}),this._list=e}document.activeElement===this.input&&this.evaluate()},get selected(){return this.index>-1},get opened(){return this.isOpened},close:function(t){this.opened&&(this.input.setAttribute("aria-expanded","false"),this.ul.setAttribute("hidden",""),this.isOpened=!1,this.index=-1,this.status.setAttribute("hidden",""),o.fire(this.input,"awesomplete-close",t||{}))},open:function(){this.input.setAttribute("aria-expanded","true"),this.ul.removeAttribute("hidden"),this.isOpened=!0,this.status.removeAttribute("hidden"),this.autoFirst&&-1===this.index&&this.goto(0),o.fire(this.input,"awesomplete-open")},destroy:function(){if(o.unbind(this.input,this._events.input),o.unbind(this.input.form,this._events.form),!this.options.container){var t=this.container.parentNode;t.insertBefore(this.input,this.container),t.removeChild(this.container)}this.input.removeAttribute("autocomplete"),this.input.removeAttribute("aria-autocomplete");var n=e.all.indexOf(this);-1!==n&&e.all.splice(n,1)},next:function(){var t=this.ul.children.length;this.goto(this.index<t-1?this.index+1:t?0:-1)},previous:function(){var t=this.ul.children.length,e=this.index-1;this.goto(this.selected&&-1!==e?e:t-1)},goto:function(t){var e=this.ul.children;this.selected&&e[this.index].setAttribute("aria-selected","false"),this.index=t,t>-1&&e.length>0&&(e[t].setAttribute("aria-selected","true"),this.status.textContent=e[t].textContent+", list item "+(t+1)+" of "+e.length,this.input.setAttribute("aria-activedescendant",this.ul.id+"_item_"+this.index),this.ul.scrollTop=e[t].offsetTop-this.ul.clientHeight+e[t].clientHeight,o.fire(this.input,"awesomplete-highlight",{text:this.suggestions[this.index]}))},select:function(t,e){if(t?this.index=o.siblingIndex(t):t=this.ul.children[this.index],t){var n=this.suggestions[this.index];o.fire(this.input,"awesomplete-select",{text:n,origin:e||t})&&(this.replace(n),this.close({reason:"select"}),o.fire(this.input,"awesomplete-selectcomplete",{text:n}))}},evaluate:function(){var t=this,e=this.input.value;e.length>=this.minChars&&this._list&&this._list.length>0?(this.index=-1,this.ul.innerHTML="",this.suggestions=this._list.map(function(n){return new i(t.data(n,e))}).filter(function(n){return t.filter(n,e)}),!1!==this.sort&&(this.suggestions=this.suggestions.sort(this.sort)),this.suggestions=this.suggestions.slice(0,this.maxItems),this.suggestions.forEach(function(n,i){t.ul.appendChild(t.item(n,e,i))}),0===this.ul.children.length?(this.status.textContent="No results found",this.close({reason:"nomatches"})):(this.open(),this.status.textContent=this.ul.children.length+" results found")):(this.close({reason:"nomatches"}),this.status.textContent="No results found")}},e.all=[],e.FILTER_CONTAINS=function(t,e){return RegExp(o.regExpEscape(e.trim()),"i").test(t)},e.FILTER_STARTSWITH=function(t,e){return RegExp("^"+o.regExpEscape(e.trim()),"i").test(t)},e.SORT_BYLENGTH=function(t,e){return t.length!==e.length?t.length-e.length:t<e?-1:1},e.CONTAINER=function(t){return o.create("div",{className:"awesomplete",around:t})},e.ITEM=function(t,e,n){var i=""===e.trim()?t:t.replace(RegExp(o.regExpEscape(e.trim()),"gi"),"<mark>$&</mark>");return o.create("li",{innerHTML:i,role:"option","aria-selected":"false",id:"awesomplete_list_"+this.count+"_item_"+n})},e.REPLACE=function(t){this.input.value=t.value},e.DATA=function(t){return t},Object.defineProperty(i.prototype=Object.create(String.prototype),"length",{get:function(){return this.label.length}}),i.prototype.toString=i.prototype.valueOf=function(){return""+this.label};var s=Array.prototype.slice;function o(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function r(t,e){return s.call((e||document).querySelectorAll(t))}function u(){r("input.awesomplete").forEach(function(t){new e(t)})}return o.create=function(t,e){var n=document.createElement(t);for(var i in e){var s=e[i];if("inside"===i)o(s).appendChild(n);else if("around"===i){var r=o(s);r.parentNode.insertBefore(n,r),n.appendChild(r),null!=r.getAttribute("autofocus")&&r.focus()}else i in n?n[i]=s:n.setAttribute(i,s)}return n},o.bind=function(t,e){if(t)for(var n in e){var i=e[n];n.split(/\s+/).forEach(function(e){t.addEventListener(e,i)})}},o.unbind=function(t,e){if(t)for(var n in e){var i=e[n];n.split(/\s+/).forEach(function(e){t.removeEventListener(e,i)})}},o.fire=function(t,e,n){var i=document.createEvent("HTMLEvents");for(var s in i.initEvent(e,!0,!0),n)i[s]=n[s];return t.dispatchEvent(i)},o.regExpEscape=function(t){return t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&")},o.siblingIndex=function(t){for(var e=0;t=t.previousElementSibling;e++);return e},"undefined"!=typeof self&&(self.Awesomplete=e),"undefined"!=typeof Document&&("loading"!==document.readyState?u():document.addEventListener("DOMContentLoaded",u)),e.$=o,e.$$=r,"object"===n(t)&&t.exports&&(t.exports=e),e}()}).call(this,n(3)(t))},function(t,e,n){t.exports=n(2)},function(t,e,n){"use strict";n.r(e);var i,s=n(0);!function(t){var e=document.getElementById("cookie-warning"),n=document.getElementById("cookie-agree"),i=document.getElementById("cookie-close"),s=!!o()&&localStorage.getItem("biuro-agree");function o(){try{return localStorage.setItem("a","a"),localStorage.removeItem("a"),!0}catch(t){return!1}}e&&n&&i&&!s&&(e.style.display="block",n.addEventListener("click",function(){o()&&localStorage.setItem("biuro-agree","true"),e.style.display="none"}),i.addEventListener("click",function(){e.style.display="none"}))}(window),window,(i=document.getElementById("js-divisions-map"))&&fetch("/wp-json/biuro-api/v1/divisions?lang="+i.dataset.lang).then(function(t){return t.json()}).then(function(t){!function t(e,n){if(window.google){var i=new window.google.maps.Map(e,{mapTypeId:window.google.maps.MapTypeId.ROADMAP});window.google.maps.event.addListenerOnce(i,"bounds_changed",function(){this.getZoom()>15&&this.setZoom(14)});var s=[],o=document.querySelector(".js-active-region"),r=o&&o.dataset.id?o.dataset.id:"";n[r]?s=n[r]:Object.keys(n).forEach(function(t){var e=n[t];"city"===t.substr(0,4)&&(s=s.concat(e))}),function(t,e){for(var n,i=new window.google.maps.LatLngBounds,s=0;s<e.length;s++){var o=e[s],r=new window.google.maps.LatLng(o.lat,o.lng),u=new window.google.maps.Marker({position:r,map:t,icon:"/wp-content/themes/biuro/i/maps/pin.png",title:o.title});i.extend(r),u.content=o.content,window.google.maps.event.addListener(u,"click",function(){n&&n.close(),(n=new window.google.maps.InfoWindow({content:this.content})).open(t,this)})}t.fitBounds(i)}(i,s.filter(function(t){return t.lat&&t.lng}))}else setTimeout(function(){t(e,n)},250)}(i,t)});var o=document.getElementById("search"),r=document.getElementById("search-city"),u=document.getElementById("search-query"),a=new s.a(r,{minChars:0,sort:!1});r.addEventListener("focus",function(){a.evaluate()});var l=new s.a(u,{minChars:0,sort:!1});u.addEventListener("focus",function(){l.evaluate()}),o&&o.addEventListener("submit",function(t){r.value||u.value||(r.focus(),t.preventDefault())},!1)},function(t,e){t.exports=function(t){if(!t.webpackPolyfill){var e=Object.create(t);e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),Object.defineProperty(e,"exports",{enumerable:!0}),e.webpackPolyfill=1}return e}}]);
\ No newline at end of file
!function(e){var n={};function t(o){if(n[o])return n[o].exports;var i=n[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,t),i.l=!0,i.exports}t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var i in e)t.d(o,i,function(n){return e[n]}.bind(null,i));return o},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/",t(t.s=0)}([function(e,n,t){e.exports=t(1)},function(e,n,t){var o;!function(e){var n=document.getElementById("cookie-warning"),t=document.getElementById("cookie-agree"),o=document.getElementById("cookie-close"),i=!!r()&&localStorage.getItem("biuro-agree");function r(){try{return localStorage.setItem("a","a"),localStorage.removeItem("a"),!0}catch(e){return!1}}n&&t&&o&&!i&&(n.style.display="block",t.addEventListener("click",function(){r()&&localStorage.setItem("biuro-agree","true"),n.style.display="none"}),o.addEventListener("click",function(){n.style.display="none"}))}(window),window,(o=document.getElementById("js-divisions-map"))&&fetch("/wp-json/biuro-api/v1/divisions?lang="+o.dataset.lang).then(function(e){return e.json()}).then(function(e){!function e(n,t){if(window.google){var o=new window.google.maps.Map(n,{mapTypeId:window.google.maps.MapTypeId.ROADMAP});window.google.maps.event.addListenerOnce(o,"bounds_changed",function(){this.getZoom()>15&&this.setZoom(14)});var i=[],r=document.querySelector(".js-active-region"),a=r&&r.dataset.id?r.dataset.id:"";t[a]?i=t[a]:Object.keys(t).forEach(function(e){var n=t[e];"city"===e.substr(0,4)&&(i=i.concat(n))}),function(e,n){for(var t,o=new window.google.maps.LatLngBounds,i=0;i<n.length;i++){var r=n[i],a=new window.google.maps.LatLng(r.lat,r.lng),c=new window.google.maps.Marker({position:a,map:e,icon:"/wp-content/themes/biuro/i/maps/pin.png",title:r.title});o.extend(a),c.content=r.content,window.google.maps.event.addListener(c,"click",function(){t&&t.close(),(t=new window.google.maps.InfoWindow({content:this.content})).open(e,this)})}e.fitBounds(o)}(o,i.filter(function(e){return e.lat&&e.lng}))}else setTimeout(function(){e(n,t)},250)}(o,e)})}]);
\ No newline at end of file
// const cb = () => { import Awesomplete from './vendor/awesomplete';
// const l = document.createElement('link');
// const h = document.getElementsByTagName('head')[0];
// l.rel = 'stylesheet';
// l.href = '/wp-content/themes/biuro/css/main.min.css';
// h.parentNode.insertBefore(l, h);
// };
// const raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
// if (raf) {
// raf(cb);
// } else {
// if (window.addEventListener) {
// window.addEventListener('load', cb);
// } else {
// window.attachEvent('onload', cb);
// }
// }
(global => { (global => {
const container = document.getElementById('cookie-warning'); const container = document.getElementById('cookie-warning');
...@@ -133,7 +114,7 @@ function initDivisionsMap (node, data) { ...@@ -133,7 +114,7 @@ function initDivisionsMap (node, data) {
} else { } else {
Object.keys(data).forEach((key) => { Object.keys(data).forEach((key) => {
const division = data[key]; const division = data[key];
if (key.substr(0, 4) === 'city' ) { if (key.substr(0, 4) === 'city') {
divisions = divisions.concat(division); divisions = divisions.concat(division);
} }
}); });
...@@ -141,3 +122,161 @@ function initDivisionsMap (node, data) { ...@@ -141,3 +122,161 @@ function initDivisionsMap (node, data) {
setMarkers(map, divisions.filter((d) => { return d.lat && d.lng; })); setMarkers(map, divisions.filter((d) => { return d.lat && d.lng; }));
} }
const search = document.getElementById('search');
const city = document.getElementById('search-city');
const query = document.getElementById('search-query');
const cityBox = new Awesomplete(city, {
minChars: 0,
sort: false
// data: (item, input) => {
// console.error('----------');
// console.dir(item);
// console.dir(input);
// return { label: item.value, value: item.name };
// },
// replace: function(text) {
// console.error('text');
// console.dir(text);
// // var hidden = document.querySelector('[name="' + this.input.dataset.name + '"]');
// // this.input.value = text.label;
// // if (!hidden) {
// // return;
// // }
// // hidden.value = text.value;
// // if (hidden.classList.contains('js-trigger-datalist')) {
// // hidden.dispatchEvent(new Event('change', {
// // 'bubbles': true,
// // 'cancelable': true
// // }));
// // }
// // hidden.dispatchEvent(event);
// }
// });
});
city.addEventListener('focus', () => {
cityBox.evaluate();
});
const queryBox = new Awesomplete(query, {
minChars: 0,
sort: false
});
query.addEventListener('focus', () => {
queryBox.evaluate();
});
if (search) {
search.addEventListener('submit', (e) => {
if (!city.value && !query.value) {
city.focus();
e.preventDefault();
}
}, false);
}
// function initDatalist() {
// var nodes = document.querySelectorAll('.js-datalist, .js-datalist-ajax'),
// node,
// getHidden = function(node) {
// return document.querySelector('[name="' + node.dataset.name + '"]');
// },
// event = new Event('input', {
// 'bubbles': true,
// 'cancelable': true
// });
// for (var i = 0; i < nodes.length; i++) {
// node = nodes[i];
// if (node.comboplete) {
// return;
// }
// node.comboplete = new Awesomplete(node, {
// minChars: 0,
// maxItems: 50,
// replace: function(text) {
// var hidden = getHidden(this.input);
// this.input.value = text.label;
// if (!hidden) {
// return;
// }
// hidden.value = text.value;
// if (hidden.classList.contains('js-trigger-datalist')) {
// hidden.dispatchEvent(new Event('change', {
// 'bubbles': true,
// 'cancelable': true
// }));
// }
// hidden.dispatchEvent(event);
// }
// });
// node.addEventListener('click', function() {
// if (this.comboplete.ul.childNodes.length === 0 || !node.value) {
// this.comboplete.minChars = 0;
// this.comboplete.evaluate();
// }
// else if (this.comboplete.ul.hasAttribute('hidden')) {
// this.comboplete.open();
// }
// else {
// this.comboplete.close();
// }
// });
// node.addEventListener('keyup', function(e) {
// var code = e.keyCode || 0;
// if (code === 13) {
// if (this.comboplete.ul.childNodes.length === 1) {
// this.comboplete.select(this.comboplete.ul.childNodes[0]);
// }
// }
// });
// node.addEventListener('input', function() {
// var value = this.value,
// exists = false,
// hidden;
// this.comboplete.ul.childNodes.forEach(function(n) {
// if (n.innerText === value) {
// exists = true;
// }
// });
// if (exists) {
// return;
// }
// hidden = getHidden(this);
// if (!hidden) {
// return;
// }
// hidden.value = '';
// hidden.dispatchEvent(event);
// })
// }
// }
/**
* Simple, lightweight, usable local autocomplete library for modern browsers
* Because there weren’t enough autocomplete scripts in the world? Because I’m completely insane and have NIH syndrome? Probably both. :P
* @author Lea Verou http://leaverou.github.io/awesomplete
* MIT license
*/
export default (function () {
var _ = function (input, o) {
var me = this;
// Keep track of number of instances for unique IDs
_.count = (_.count || 0) + 1;
this.count = _.count;
// Setup
this.isOpened = false;
this.input = $(input);
this.input.setAttribute("autocomplete", "off");
this.input.setAttribute("aria-expanded", "false");
this.input.setAttribute("aria-owns", "awesomplete_list_" + this.count);
this.input.setAttribute("role", "combobox");
// store constructor options in case we need to distinguish
// between default and customized behavior later on
this.options = o = o || {};
configure(this, {
minChars: 2,
maxItems: 10,
autoFirst: false,
data: _.DATA,
filter: _.FILTER_CONTAINS,
sort: o.sort === false ? false : _.SORT_BYLENGTH,
container: _.CONTAINER,
item: _.ITEM,
replace: _.REPLACE,
tabSelect: false
}, o);
this.index = -1;
// Create necessary elements
this.container = this.container(input);
this.ul = $.create("ul", {
hidden: "hidden",
role: "listbox",
id: "awesomplete_list_" + this.count,
inside: this.container
});
this.status = $.create("span", {
className: "visually-hidden",
role: "status",
"aria-live": "assertive",
"aria-atomic": true,
inside: this.container,
textContent: this.minChars != 0 ? ("Type " + this.minChars + " or more characters for results.") : "Begin typing for results."
});
// Bind events
this._events = {
input: {
"input": this.evaluate.bind(this),
"blur": this.close.bind(this, { reason: "blur" }),
"keydown": function(evt) {
var c = evt.keyCode;
// If the dropdown `ul` is in view, then act on keydown for the following keys:
// Enter / Esc / Up / Down
if(me.opened) {
if (c === 13 && me.selected) { // Enter
evt.preventDefault();
me.select();
}
else if (c === 9 && me.selected && me.tabSelect) {
me.select();
}
else if (c === 27) { // Esc
me.close({ reason: "esc" });
}
else if (c === 38 || c === 40) { // Down/Up arrow
evt.preventDefault();
me[c === 38? "previous" : "next"]();
}
}
}
},
form: {
"submit": this.close.bind(this, { reason: "submit" })
},
ul: {
// Prevent the default mousedowm, which ensures the input is not blurred.
// The actual selection will happen on click. This also ensures dragging the
// cursor away from the list item will cancel the selection
"mousedown": function(evt) {
evt.preventDefault();
},
// The click event is fired even if the corresponding mousedown event has called preventDefault
"click": function(evt) {
var li = evt.target;
if (li !== this) {
while (li && !/li/i.test(li.nodeName)) {
li = li.parentNode;
}
if (li && evt.button === 0) { // Only select on left click
evt.preventDefault();
me.select(li, evt.target);
}
}
}
}
};
$.bind(this.input, this._events.input);
$.bind(this.input.form, this._events.form);
$.bind(this.ul, this._events.ul);
if (this.input.hasAttribute("list")) {
this.list = "#" + this.input.getAttribute("list");
this.input.removeAttribute("list");
}
else {
this.list = this.input.getAttribute("data-list") || o.list || [];
}
_.all.push(this);
};
_.prototype = {
set list(list) {
if (Array.isArray(list)) {
this._list = list;
}
else if (typeof list === "string" && list.indexOf(",") > -1) {
this._list = list.split(/\s*,\s*/);
}
else { // Element or CSS selector
list = $(list);
if (list && list.children) {
var items = [];
slice.apply(list.children).forEach(function (el) {
if (!el.disabled) {
var text = el.textContent.trim();
var value = el.value || text;
var label = el.label || text;
if (value !== "") {
items.push({ label: label, value: value });
}
}
});
this._list = items;
}
}
if (document.activeElement === this.input) {
this.evaluate();
}
},
get selected() {
return this.index > -1;
},
get opened() {
return this.isOpened;
},
close: function (o) {
if (!this.opened) {
return;
}
this.input.setAttribute("aria-expanded", "false");
this.ul.setAttribute("hidden", "");
this.isOpened = false;
this.index = -1;
this.status.setAttribute("hidden", "");
$.fire(this.input, "awesomplete-close", o || {});
},
open: function () {
this.input.setAttribute("aria-expanded", "true");
this.ul.removeAttribute("hidden");
this.isOpened = true;
this.status.removeAttribute("hidden");
if (this.autoFirst && this.index === -1) {
this.goto(0);
}
$.fire(this.input, "awesomplete-open");
},
destroy: function() {
//remove events from the input and its form
$.unbind(this.input, this._events.input);
$.unbind(this.input.form, this._events.form);
// cleanup container if it was created by Awesomplete but leave it alone otherwise
if (!this.options.container) {
//move the input out of the awesomplete container and remove the container and its children
var parentNode = this.container.parentNode;
parentNode.insertBefore(this.input, this.container);
parentNode.removeChild(this.container);
}
//remove autocomplete and aria-autocomplete attributes
this.input.removeAttribute("autocomplete");
this.input.removeAttribute("aria-autocomplete");
//remove this awesomeplete instance from the global array of instances
var indexOfAwesomplete = _.all.indexOf(this);
if (indexOfAwesomplete !== -1) {
_.all.splice(indexOfAwesomplete, 1);
}
},
next: function () {
var count = this.ul.children.length;
this.goto(this.index < count - 1 ? this.index + 1 : (count ? 0 : -1) );
},
previous: function () {
var count = this.ul.children.length;
var pos = this.index - 1;
this.goto(this.selected && pos !== -1 ? pos : count - 1);
},
// Should not be used, highlights specific item without any checks!
goto: function (i) {
var lis = this.ul.children;
if (this.selected) {
lis[this.index].setAttribute("aria-selected", "false");
}
this.index = i;
if (i > -1 && lis.length > 0) {
lis[i].setAttribute("aria-selected", "true");
this.status.textContent = lis[i].textContent + ", list item " + (i + 1) + " of " + lis.length;
this.input.setAttribute("aria-activedescendant", this.ul.id + "_item_" + this.index);
// scroll to highlighted element in case parent's height is fixed
this.ul.scrollTop = lis[i].offsetTop - this.ul.clientHeight + lis[i].clientHeight;
$.fire(this.input, "awesomplete-highlight", {
text: this.suggestions[this.index]
});
}
},
select: function (selected, origin) {
if (selected) {
this.index = $.siblingIndex(selected);
} else {
selected = this.ul.children[this.index];
}
if (selected) {
var suggestion = this.suggestions[this.index];
var allowed = $.fire(this.input, "awesomplete-select", {
text: suggestion,
origin: origin || selected
});
if (allowed) {
this.replace(suggestion);
this.close({ reason: "select" });
$.fire(this.input, "awesomplete-selectcomplete", {
text: suggestion
});
}
}
},
evaluate: function() {
var me = this;
var value = this.input.value;
if (value.length >= this.minChars && this._list && this._list.length > 0) {
this.index = -1;
// Populate list with options that match
this.ul.innerHTML = "";
this.suggestions = this._list
.map(function(item) {
return new Suggestion(me.data(item, value));
})
.filter(function(item) {
return me.filter(item, value);
});
if (this.sort !== false) {
this.suggestions = this.suggestions.sort(this.sort);
}
this.suggestions = this.suggestions.slice(0, this.maxItems);
this.suggestions.forEach(function(text, index) {
me.ul.appendChild(me.item(text, value, index));
});
if (this.ul.children.length === 0) {
this.status.textContent = "No results found";
this.close({ reason: "nomatches" });
} else {
this.open();
this.status.textContent = this.ul.children.length + " results found";
}
}
else {
this.close({ reason: "nomatches" });
this.status.textContent = "No results found";
}
}
};
// Static methods/properties
_.all = [];
_.FILTER_CONTAINS = function (text, input) {
return RegExp($.regExpEscape(input.trim()), "i").test(text);
};
_.FILTER_STARTSWITH = function (text, input) {
return RegExp("^" + $.regExpEscape(input.trim()), "i").test(text);
};
_.SORT_BYLENGTH = function (a, b) {
if (a.length !== b.length) {
return a.length - b.length;
}
return a < b? -1 : 1;
};
_.CONTAINER = function (input) {
return $.create("div", {
className: "awesomplete",
around: input
});
}
_.ITEM = function (text, input, item_id) {
var html = input.trim() === "" ? text : text.replace(RegExp($.regExpEscape(input.trim()), "gi"), "<mark>$&</mark>");
return $.create("li", {
innerHTML: html,
"role": "option",
"aria-selected": "false",
"id": "awesomplete_list_" + this.count + "_item_" + item_id
});
};
_.REPLACE = function (text) {
this.input.value = text.value;
};
_.DATA = function (item/*, input*/) { return item; };
// Private functions
function Suggestion(data) {
var o = Array.isArray(data)
? { label: data[0], value: data[1] }
: typeof data === "object" && "label" in data && "value" in data ? data : { label: data, value: data };
this.label = o.label || o.value;
this.value = o.value;
}
Object.defineProperty(Suggestion.prototype = Object.create(String.prototype), "length", {
get: function() { return this.label.length; }
});
Suggestion.prototype.toString = Suggestion.prototype.valueOf = function () {
return "" + this.label;
};
function configure(instance, properties, o) {
for (var i in properties) {
var initial = properties[i],
attrValue = instance.input.getAttribute("data-" + i.toLowerCase());
if (typeof initial === "number") {
instance[i] = parseInt(attrValue);
}
else if (initial === false) { // Boolean options must be false by default anyway
instance[i] = attrValue !== null;
}
else if (initial instanceof Function) {
instance[i] = null;
}
else {
instance[i] = attrValue;
}
if (!instance[i] && instance[i] !== 0) {
instance[i] = (i in o)? o[i] : initial;
}
}
}
// Helpers
var slice = Array.prototype.slice;
function $(expr, con) {
return typeof expr === "string"? (con || document).querySelector(expr) : expr || null;
}
function $$(expr, con) {
return slice.call((con || document).querySelectorAll(expr));
}
$.create = function(tag, o) {
var element = document.createElement(tag);
for (var i in o) {
var val = o[i];
if (i === "inside") {
$(val).appendChild(element);
}
else if (i === "around") {
var ref = $(val);
ref.parentNode.insertBefore(element, ref);
element.appendChild(ref);
if (ref.getAttribute("autofocus") != null) {
ref.focus();
}
}
else if (i in element) {
element[i] = val;
}
else {
element.setAttribute(i, val);
}
}
return element;
};
$.bind = function(element, o) {
if (element) {
for (var event in o) {
var callback = o[event];
event.split(/\s+/).forEach(function (event) {
element.addEventListener(event, callback);
});
}
}
};
$.unbind = function(element, o) {
if (element) {
for (var event in o) {
var callback = o[event];
event.split(/\s+/).forEach(function(event) {
element.removeEventListener(event, callback);
});
}
}
};
$.fire = function(target, type, properties) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent(type, true, true );
for (var j in properties) {
evt[j] = properties[j];
}
return target.dispatchEvent(evt);
};
$.regExpEscape = function (s) {
return s.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&");
};
$.siblingIndex = function (el) {
/* eslint-disable no-cond-assign */
for (var i = 0; el = el.previousElementSibling; i++);
return i;
};
// Initialization
function init() {
$$("input.awesomplete").forEach(function (input) {
new _(input);
});
}
// Make sure to export Awesomplete on self when in a browser
if (typeof self !== "undefined") {
self.Awesomplete = _;
}
// Are we in a browser? Check for Document constructor
if (typeof Document !== "undefined") {
// DOM already loaded?
if (document.readyState !== "loading") {
init();
}
else {
// Wait for it
document.addEventListener("DOMContentLoaded", init);
}
}
_.$ = $;
_.$$ = $$;
// Expose Awesomplete as a CJS module
if (typeof module === "object" && module.exports) {
module.exports = _;
}
return _;
}());
<?php
/**
* Template Name: Search & Jobs page
*
* This is the most generic template file in a WordPress theme
* and one of the two required files for a theme (the other being style.css).
* It is used to display a page when nothing more specific matches a query.
* E.g., it puts together the home page when no home.php file exists.
*
* @link https://codex.wordpress.org/Template_Hierarchy
*
* @package WordPress
* @subpackage Biuro
* @since 1.0
* @version 1.0
*/
get_header(); ?>
<?php
if ( !is_search() ):
while ( have_posts() ) :
the_post();
the_content();
endwhile;
endif;
?>
<?php
global $query_string;
$ID = get_the_ID();
$keys = get_post_custom_keys();
$where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '"';
if ( is_search() ):
wp_parse_str( $query_string, $searchQuery );
if ( $searchQuery ) :
if ( $searchQuery['city'] ) :
$city = get_term_by( 'name', $searchQuery['city'], 'city' );
if ( $city ) :
$where = $where . ' AND city.term_id = ' . $city->term_id;
endif;
endif;
if ( $searchQuery['s'] ) :
$field = get_term_by( 'name', $searchQuery['s'], 'field' );
$type = get_term_by( 'name', $searchQuery['s'], 'type' );
if ( $field ) :
$where = $where . ' AND field.term_id = ' . $field->term_id;
elseif ( $type ) :
$where = $where . ' AND type.term_id = ' . $type->term_id;
else:
$where = $where . ' AND (t.post_title LIKE "%' . $searchQuery['s'] . '%" OR t.post_content LIKE "%' . $searchQuery['s'] . '%")';
endif;
endif;
endif;
// $where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '" AND (t.post_title LIKE "%' . $searchQuery . '%" OR t.post_content LIKE "%' . $searchQuery . '%")';
elseif ($keys):
foreach ( $keys as $key => $value ) :
$val = trim($value);
$taxonomy = substr($val, 20);
if ( '_' == $val{0} || substr($val, 0, 20) != 'built_in_taxonomies_' || !$taxonomy):
continue;
endif;
$res = get_post_custom_values( $val, $ID );
if ( !$res ) :
continue;
endif;
$term = $res[0];
if ( !$term ) :
continue;
endif;
$where = $where . ' AND ' . $taxonomy . '.slug = "' . $term . '"';
endforeach;
endif;
$params = array(
'orderby' => 'date DESC',
'where' => $where,
'limit' => 21
);
$jobs = pods( 'job', $params );
if ( 0 < $jobs->total() ):
get_template_part( 'template-parts/jobs/jobs', 'list' );
else:
get_template_part( 'template-parts/jobs/jobs', 'not-found' );
endif;
?>
<?php get_footer();
...@@ -8,9 +8,14 @@ ...@@ -8,9 +8,14 @@
* @version 1.0 * @version 1.0
*/ */
global $query_string;
?> ?>
<form class="c-search" action="<?php echo pll_home_url(); ?>" method="get"> <?php /*
<form class="c-search" action="<?php echo $searchPageURL; ?>" method="get">
*/ ?>
<form id="search" class="c-search" action="<?php echo home_url(); ?>" method="get">
<?php <?php
...@@ -22,6 +27,11 @@ ...@@ -22,6 +27,11 @@
endwhile; endwhile;
endif; endif;
if ( is_search() ):
wp_parse_str( $query_string, $searchQuery );
endif;
?> ?>
<datalist id="search-cities"> <datalist id="search-cities">
...@@ -41,7 +51,7 @@ ...@@ -41,7 +51,7 @@
foreach ( $cities as $city ): foreach ( $cities as $city ):
$name = $city->name; $name = $city->name;
$termID = $city->term_id; $termID = $city->term_id;
$selected = ($cityID == $termID) ? 'selected="selected"' : ''; // $selected = ($cityID == $termID) ? 'selected="selected"' : '';
$where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '" AND city.term_id = ' . $termID; $where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '" AND city.term_id = ' . $termID;
...@@ -55,41 +65,113 @@ ...@@ -55,41 +65,113 @@
if ( 0 < $jobsIn->total() ): if ( 0 < $jobsIn->total() ):
?> ?>
<option value="<?php echo $termID; ?>" <?php echo $selected; ?>><?php echo $name; ?> (<?php echo $jobsIn->total(); ?>)</option> <option value="<?php echo $name; ?>" <?php echo $selected; ?>><?php echo $name; ?> (<?php echo $jobsIn->total(); ?>)</option>
<?php <?php
endif; endif;
endforeach; endforeach;
endif; endif;
?> ?>
</datalist> </datalist>
<input list="search-cities" id="search-city" name="city" value="<?php echo cityID; ?>" placeholder="Vietovė" /> <input list="search-cities" id="search-city" name="city" value="<?php echo ($searchQuery) ? $searchQuery['city'] : ''; ?>" placeholder="Vietovė" />
<datalist id="search-types">
<option value="Darbas užsienyje: Norvegijoje, Vokietijoje, UK ir kt.">Darbas užsienyje: Norvegijoje, Vokietijoje, UK ir kt.</option>
<option value="Darbas studentams">Darbas studentams</option>
<option value="Sezoninis darbas">Sezoninis darbas</option>
<option value="Darbas namuose">Darbas namuose</option>
<option value="Darbas vasarai">Darbas vasarai</option>
<option value="Papildomas darbas">Papildomas darbas</option>
<option value="Personalo specialistai">Personalo specialistai</option>
<option value="Elektonika">Elektonika</option>
<option value="Pardavimai">Pardavimai</option>
<option value="Gamyba">Gamyba</option>
<option value="Sandėliavimas">Sandėliavimas</option>
<option value="Klientų aptarnavimas">Klientų aptarnavimas</option>
<option value="Padavejai">Padavejai</option>
</datalist>
<input list="search-types" id="search" name="s" value="<?php echo searchQuery; ?>" placeholder="Raktažodis" />
<datalist id="search-queries">
<input type="submit" value="Ieškoti" class="filter-button" />
<?php <?php
$options = array();
$types = get_terms( array(
'taxonomy' => 'type',
'orderby' => 'count',
'order' => 'DESC'
// 'orderby' => array(
// 'title' => 'DESC'
// // 'menu_order' => 'ASC'
// )
// 'hide_empty' => false,
));
if ( ! empty( $types ) && ! is_wp_error( $types ) ):
foreach ( $types as $type ):
$name = $type->name;
$termID = $type->term_id;
$selected = '';
// $selected = ($cityID == $termID) ? 'selected="selected"' : '';
$where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '" AND type.term_id = ' . $termID;
$params = array(
// 'orderby' => 'title DESC',
'where' => $where,
'limit' => -1
);
$jobsIn = pods( 'job', $params );
if ( 0 < $jobsIn->total() ):
array_push( $options , array( 'name' => $name, 'total' => $jobsIn->total() ) );
/* /*
<a href="<?php echo pll_home_url(); ?>" class="filter-button"><?php pll_e('Clear'); ?></a> ?>
<option value="<?php echo $name; ?>"><?php echo $name; ?> (<?php echo $jobsIn->total(); ?>)</option>
<?php
*/ */
endif;
endforeach;
endif;
$fields = get_terms( array(
'taxonomy' => 'field',
'orderby' => 'count',
'order' => 'DESC'
// 'orderby' => array(
// 'title' => 'DESC'
// // 'menu_order' => 'ASC'
// )
// 'hide_empty' => false,
));
if ( ! empty( $fields ) && ! is_wp_error( $fields ) ):
foreach ( $fields as $field ):
$name = $field->name;
$termID = $field->term_id;
$selected = '';
// $selected = ($cityID == $termID) ? 'selected="selected"' : '';
$where = 'valid.meta_value > "' . date('Y-m-d', strtotime('-1 days')) . '" AND field.term_id = ' . $termID;
$params = array(
// 'orderby' => 'title DESC',
'where' => $where,
'limit' => -1
);
$jobsIn = pods( 'job', $params );
if ( 0 < $jobsIn->total() ):
array_push( $options , array( 'name' => $name, 'total' => $jobsIn->total() ) );
endif;
endforeach;
endif;
usort($options, function ($item1, $item2) {
return $item2['total'] <=> $item1['total'];
});
foreach ( $options as $option ):
?>
<option value="<?php echo $option['name']; ?>"><?php echo $option['name']; ?> (<?php echo $option['total']; ?>)</option>
<?php
endforeach;
?> ?>
</datalist>
<input list="search-queries" id="search-query" name="s" value="<?php echo ($searchQuery) ? $searchQuery['s'] : ''; ?>" placeholder="Raktažodis" />
<input type="submit" value="Ieškoti" class="filter-button" />
</form> </form>
<?php <?php
/* /*
......
...@@ -39,9 +39,9 @@ get_header(); ...@@ -39,9 +39,9 @@ get_header();
// debug( $pod ); // debug( $pod );
?> ?>
<p> <p>
Paskelbta: <?php echo date("Y-m-d", strtotime( $pod->field( 'post_date' ) ) ); ?> Paskelbta: <?php echo date_i18n( get_option( 'date_format' ), strtotime( $pod->field( 'post_date' ) ) ); ?>
<br> <br>
Galioja iki: <?php echo date("Y-m-d", strtotime( $pod->field( 'valid' ) ) ); ?> Galioja iki: <?php echo date_i18n( get_option( 'date_format' ), strtotime( $pod->field( 'valid' ) ) ); ?>
</p> </p>
<br> <br>
......
...@@ -35,7 +35,7 @@ global $jobs; ...@@ -35,7 +35,7 @@ global $jobs;
<?php echo $jobs->display( 'city' ); ?> <?php echo $jobs->display( 'city' ); ?>
</td> </td>
<td class="c-jobs-list--col c-jobs-list--col-valid"> <td class="c-jobs-list--col c-jobs-list--col-valid">
<?php echo $jobs->display( 'valid' ); ?> <?php echo date_i18n( get_option( 'date_format' ), strtotime( $jobs->field( 'valid' ) ) ); ?>
</td> </td>
</tr> </tr>
......
...@@ -12,6 +12,15 @@ ...@@ -12,6 +12,15 @@
?> ?>
</div> </div>
<h3>Tipas</h3>
<div style="border: 1px solid #666; margin-right: 20px">
<?php
getSiteTree( 'type' );
?>
</div>
<?php
/*
<h3>Tipas</h3> <h3>Tipas</h3>
<div style="border: 1px solid #666; margin-right: 20px; margin-bottom: 20px;"> <div style="border: 1px solid #666; margin-right: 20px; margin-bottom: 20px;">
<ul> <ul>
...@@ -23,6 +32,8 @@ ...@@ -23,6 +32,8 @@
<li><a href="#" style="color: #900">Papildomas darbas</a></li> <li><a href="#" style="color: #900">Papildomas darbas</a></li>
</ul> </ul>
</div> </div>
*/
?>
<?php <?php
/* /*
......
<?php <?php
// https://torquemag.io/2017/10/add-breadcrumbs-wordpress-website/ // https://torquemag.io/2017/10/add-breadcrumbs-wordpress-website/
if ( !function_exists('yoast_breadcrumb') || is_front_page() || searchQuery) : if ( !function_exists('yoast_breadcrumb') || is_front_page() || is_search() ) :
return; return;
endif; endif;
......
<?php <?php
global $query_string;
if ( cityID && !searchQuery ) : wp_parse_str( $query_string, $searchQuery );
$page = get_term_meta( cityID, 'page-id', true);
if ( is_search() ) :
if ( $searchQuery['city'] && !$searchQuery['s'] ) :
$term = get_term_by( 'name', $searchQuery['city'], 'city' );
if ( $term ) :
$page = get_term_meta( $term->term_id, 'page-id', true);
if ( $page ) :
?>
<link rel="canonical" href="<?php echo get_page_link( $page['ID'] ); ?>" />
<?php
return;
endif;
endif;
elseif ( !$searchQuery['city'] && $searchQuery['s'] ) :
$term = get_term_by( 'name', $searchQuery['s'], 'field' );
if ( !$term ) {
$term = get_term_by( 'name', $searchQuery['s'], 'type' );
}
if ( $term ) {
$page = get_term_meta( $term->term_id, 'page-id', true);
if ( $page ) : if ( $page ) :
?> ?>
<link rel="canonical" href="<?php echo get_page_link( $page['ID'] ); ?>" /> <link rel="canonical" href="<?php echo get_page_link( $page['ID'] ); ?>" />
<?php <?php
return;
endif;
}
endif; endif;
elseif ( !cityID && !searchQuery && get_post_type() == 'page' && get_post_meta( get_the_ID(), 'built_in_taxonomies_city', true ) ): ?>
<meta name="robots" content="noindex" />
<?php
elseif ( get_post_type() == 'page' ):
if ( get_post_meta( get_the_ID(), 'built_in_taxonomies_city', true ) || get_post_meta( get_the_ID(), 'built_in_taxonomies_type', true ) || get_post_meta( get_the_ID(), 'built_in_taxonomies_field', true ) ) :
?> ?>
<link rel="canonical" href="<?php echo get_permalink(); ?>" /> <link rel="canonical" href="<?php echo get_permalink(); ?>" />
<?php <?php
endif;
endif; endif;
...@@ -44,15 +44,13 @@ wp plugin activate cookies-warning --network ...@@ -44,15 +44,13 @@ wp plugin activate cookies-warning --network
wp plugin activate data-controller --network wp plugin activate data-controller --network
# wp plugin activate jobs-importer # wp plugin activate jobs-importer
# Update translations
wp language core update
wp language plugin update --all
# WP themes # WP themes
wp theme update --all;
wp theme activate biuro wp theme activate biuro
wp theme delete twentynineteen # Update translations
wp theme delete twentyseventeen wp language core update
wp theme delete twentysixteen wp language theme update --all
wp language plugin update --all
echo "WP CLI done. Ready to use." echo "WP CLI done. Ready to use."
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment