]> git.leonardobizzoni.com Git - highschool-graduation-project/commitdiff
Finished live, started list
authorLeonardoBizzoni <leo2002714@gmail.com>
Mon, 23 May 2022 07:04:37 +0000 (09:04 +0200)
committerLeonardoBizzoni <leo2002714@gmail.com>
Mon, 23 May 2022 07:04:37 +0000 (09:04 +0200)
20 files changed:
README.org
dockerfiles/bll/Dockerfile
dockerfiles/web/nginx.conf
media/proxy.svg [new file with mode: 0644]
www/controllers/AuthController.php
www/controllers/SiteController.php
www/core/Application.php
www/core/Router.php
www/models/Vtubers.php
www/pub/css/live.css [moved from www/pub/css/index.css with 100% similarity]
www/pub/css/main.css [new file with mode: 0644]
www/pub/img/XtPIXR8.png [new file with mode: 0644]
www/pub/index.php
www/updateVtuberPfp.php [new file with mode: 0644]
www/views/layouts/list.php [new file with mode: 0644]
www/views/layouts/live.php
www/views/layouts/main.php
www/views/list.php [new file with mode: 0644]
www/views/live.php
www/vtuberIsLive.php

index fa8cec192b5fced03174aa9259cbba01b41980af..90a0ba345025203ef3e899bd212c5d21ab26a631 100644 (file)
@@ -2,64 +2,33 @@
 
 * Tabella dei contenuti :TOC:
 - [[#descrizione-del-progetto][Descrizione del progetto]]
-  - [[#idea-home-page][IDEA Home page]]
-  - [[#idea-popolazione-del-database][IDEA Popolazione del database]]
-  - [[#live-page][Live page]]
+  - [[#home-page][Home page]]
+  - [[#list-page][List page]]
 - [[#setup][Setup]]
   - [[#configurazione-ed-installazione-server][Configurazione ed installazione server]]
 
 * Descrizione del progetto
-Attraverso la web app è possibile registrare un account con cui è possibile tenere traccia di:
-- Anime visti
-- Manga/light novel lette
-- Visual novel giocate
-
-Inoltre attravero la pagina "live" è possibile visualizzare quali vtuber sono attualmente live e partecipare ad una di esse senza doversi recare sul sito di streaming da loro adottato.
+Attraverso la web app è possibile visualizzare quali vtuber sono attualmente live e partecipare ad una di esse senza doversi recare sul sito di streaming da loro adottato.
 Gli utenti registrati possono anche aggiungere una vtuber alla loro lista personale di vtuber preferite e ricevere una notifica via email quando una di esse va in onda.
 
 Un utente può anche richiedere l'aggiunta di una vtuber al catalogo della web app, qualora essa non ne faccia già parte, semplicemente inviando, tramite l'apposito form, l'URL al canale della vtuber, sia esso su [[twitch.tv/][twitch]] o [[youtube.com/][youtube]].
 
-** IDEA Home page
-Nella home page è possibile visualizzare una lista delle ultime uscite, divise per categoria [anime, manga, LN, VN] e per genere [azione, horror, sportivo, sci-fi, ...].
-
-** IDEA Popolazione del database
-*** Anime
-- Titolo
-- Tipo di anime [film, serie TV, speciale]
-- Stato pubblicazione
-    + Numero episodi se lo stato è *concluso*
-- Data di inizio/fine pubblicazione
-- Trama
-- Generi
-- Immagine di copertina
-
-*** Manga e Light novels
-- Titolo
-- Stato pubblicazione
-  + Numero di capitoli e volumi se lo stato è *concluso*
-- Data di inizio/fine pubblicazione
-- Trama
-- Generi
-- Immagine di copertina
-
-*** Visual novels
-- Titolo
-- Link del seller
-- Trama
-- Generi
-- Immagine di copertina
-
-** TODO Live page
-Attraverso la pagina "live" è possibile partecipare alla stream di una vtuber direttamente senza recarsi sul sito di streaming da loro utilizzato.
-Nonappena si visita quasta pagina vengono visualizzate 3 liste:
-- *Preferite*: lista dedicata alle vtuber preferite dell'utente attualmente in live
+** DONE Home page
+Attraverso la pagina "home" è possibile partecipare alla stream di una vtuber direttamente senza recarsi sul sito di streaming da loro utilizzato.
+Appena si visita quasta pagina vengono visualizzate 2 liste:
 - *In live*: lista di tutte le vtuber presenti nel catalogo attualmente in onda
 - *Offline*: lista delle vtuber presenti nel catalogo attualmente non in onda
 
+Se l'utente è registrato allora viene visualizzata un'ulteriore lista che mostra le live attualmente in onda dell vtuber preferite dall'utente.
+
 L'aggiunta di una vtuber viene effettuata tramite l'apposito form visibile agli utenti registrati tramite il tasto "Add vtuber".
 Una volta cliccato verrà chiesto all'utente l'inserimento dell'URL del canale della vtuber che desidera venga aggiunta al catalogo.
-/In qualche modo dovrei tipo controllare che non venga mandata merda, pensavo tipo mi manda una mail quando un utente vuole aggiungere roba ed aspetta una mia risposta prima di aggiungere, però boh troppo sbatti da parte mia./
-/Un'altra roba epica da fare è tipo spostare il controllo se una vtuber è live ad uno script epico in esecuzione sul server separato dal webserver così da rendere la visualizzazione della pagina più rapida visto che ora per renderla un minimo più rapida utilizzo la cache della pagina. Si la pagina è lenta in culo ora./
+
+** TODO List page
+Attraverso la pagina "list", visibile solo agli utenti registrati, un utente può gestire le sue vtuber preferite.
+L'utente può quindi:
+- decidere di rimuovere una vtuber dai suoi preferiti
+- disabilitare l'invio delle notifiche via email.
 
 * DONE Setup
 ** Configurazione ed installazione server
@@ -74,18 +43,26 @@ Un vantaggio che offre questa architettura è la netta divisione delle 3 parti,
 Il presentation layer è il layer che si occupa dell'interazione con l'utente.
 Il suo compito principale è quello di mostrare e ricevere informazioni dal client.
 
-Ho deciso di utilizzare Nginx come web server per le performance nettamente migliori e leggerezza in confronto ad altri web server.
+Ho deciso di utilizzare Nginx come web server per le migliori performance e leggerezza in confronto ad altri web server.
 Inoltre la configura di Nginx è molto più semplice di web server come Apache.
 [[./media/nginxApacheGraph.png]]
 
-/Soluzioni microsoft come il web server IIS non sono state considerate per via delle license sotto cui sono pubblicate ed a causa del mio odio verso i loro prodotti./
-
 *** Application Layer - PHP
 L'application layer rappresenta il cuore dell'applicazione.
 In questo layer le informazioni ricevute dal presentation layer vengono elaborate anche in base a dati presenti nel data layer.
 L'application layer può inoltre aggiungere, cancellare e modificare i dati nel data layer.
 
-Un docker container si occupa dell'esecuzione di php-fpm e rimane in ascolto sulla porta 9000.
+Un docker container si occupa dell'esecuzione di php-fpm e rimane in ascolto sulla porta 9000, questo permette al presentation layer (nginx) di operare similarmente ad un *reverse proxy*: quando riceve una richiesta per una risorsa *.php la inoltra al server php-fpm.
+[[./media/proxy.svg]]
+
+**** Reverse e Forward proxy
+Un *forward proxy*, a differenza di un reverse, è logicamente situato /prima/ di un gruppo di macchine *client* e svolge il compito di *middleman* ricevendo le richieste dai client ed inviandole lui stesso a destinazione.
+Utilizzando un forward proxy i server destinatari riceveranno richieste dall'indirizzo IP del proxy server e non del client originale, questo permette di nascondere il proprio indirizzo IP aumentando il proprio livello di sicurezza online.
+
+Al contratio un *reverse proxy* è logicamente situato /prima/ di un gruppo di macchine *server* e svolge il compito di ricevere le richieste, analizzarle ed inviarle al server che ritiene più adatto all'elaborazione.
 
 *** Data Layer - MariaDB
+Il data layer si occupa della gestione ed immagazinamento dei dati generati dall'application layer.
+/Il presentation layer non genera dati visto che opera come un reverse proxy./
+
 L'installazione del database server mariadb viene anch'essa eseguita tramite un docker container e la container image disponibile su [[https://hub.docker.com/_/mariadb][hub.docker]] per cui non ha bisogno di alcuna configurazione.
index be1e7197a51a6c42938a2557f346e43a10eb1360..f32ad287a46432c3fae6cb7c5c4f72e86cb10c53 100644 (file)
@@ -3,5 +3,3 @@ WORKDIR /var/www/html
 
 RUN docker-php-ext-install pdo pdo_mysql mysqli
 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
-
-RUN php /var/www/html/vtuberIsLive.php
index 9a37f1246ec58c687c48b1901c657645abfff7fe..2a0cf796f7933145c2a6a4617b128dc01ff0b3dc 100644 (file)
@@ -7,10 +7,8 @@ events {
     worker_connections 1024;
 }
 
-
 http {
-# fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MY_CACHE:100m inactive=60m;
-# fastcgi_cache_key "$scheme$request_method$host$request_uri";
+     include mime.types;
 
      server {
           listen 80 default_server;
@@ -25,12 +23,6 @@ http {
           }
 
           location ~ \.php$ {
-
-# fastcgi_ignore_headers Expires Cache-Control;
-# fastcgi_cache MY_CACHE;
-#         fastcgi_cache_valid 200 60m;
-#         add_header X-Cache $upstream_cache_status;
-
                fastcgi_read_timeout 300;
                fastcgi_pass      app:9000;
                fastcgi_index     index.php;
diff --git a/media/proxy.svg b/media/proxy.svg
new file mode 100644 (file)
index 0000000..fa71405
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 298"><defs><style>.cls-1{fill:#404242;}.cls-2{fill:none;stroke:#707070;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}.cls-3{fill:#707070;}.cls-4{fill:#7d4788;}.cls-5{fill:#4f8cc8;}</style></defs><title>update</title><path class="cls-1" d="M235,9.15v4.56h-1.86V2.29h3.22a5.33,5.33,0,0,1,3.28.83,3,3,0,0,1,1.06,2.5,3.13,3.13,0,0,1-2.22,3l3.23,5.05h-2.13l-2.73-4.56Zm0-1.55h1.3a3,3,0,0,0,1.89-.48,1.77,1.77,0,0,0,.59-1.44,1.53,1.53,0,0,0-.64-1.39,3.45,3.45,0,0,0-1.9-.42H235Z"/><path class="cls-1" d="M246.83,13.87a4.16,4.16,0,0,1-3.15-1.18,4.44,4.44,0,0,1-1.13-3.24,4.92,4.92,0,0,1,1-3.33,3.66,3.66,0,0,1,2.9-1.21,3.56,3.56,0,0,1,2.7,1,4,4,0,0,1,1,2.86v1h-5.75a2.81,2.81,0,0,0,.68,1.94,2.34,2.34,0,0,0,1.8.67,6.48,6.48,0,0,0,1.43-.14,7.84,7.84,0,0,0,1.41-.48v1.49a5,5,0,0,1-1.35.45A8.29,8.29,0,0,1,246.83,13.87ZM246.5,6.3a1.84,1.84,0,0,0-1.4.56,2.67,2.67,0,0,0-.63,1.62h3.92a2.33,2.33,0,0,0-.52-1.62A1.75,1.75,0,0,0,246.5,6.3Z"/><path class="cls-1" d="M254.17,13.71l-3.28-8.64h1.94l1.75,5a10.11,10.11,0,0,1,.55,2.05h.06a14.18,14.18,0,0,1,.55-2.05l1.76-5h1.95l-3.3,8.64Z"/><path class="cls-1" d="M264.37,13.87a4.13,4.13,0,0,1-3.15-1.18,4.45,4.45,0,0,1-1.14-3.24,4.92,4.92,0,0,1,1.05-3.33A3.68,3.68,0,0,1,264,4.91a3.6,3.6,0,0,1,2.71,1,4,4,0,0,1,1,2.86v1H262a2.86,2.86,0,0,0,.68,1.94,2.37,2.37,0,0,0,1.8.67,6.48,6.48,0,0,0,1.43-.14,8.2,8.2,0,0,0,1.42-.48v1.49a5.05,5.05,0,0,1-1.36.45A8.18,8.18,0,0,1,264.37,13.87ZM264,6.3a1.84,1.84,0,0,0-1.4.56A2.67,2.67,0,0,0,262,8.48h3.92a2.38,2.38,0,0,0-.51-1.62A1.77,1.77,0,0,0,264,6.3Z"/><path class="cls-1" d="M274.18,4.91a4.62,4.62,0,0,1,.92.08l-.18,1.71a3.62,3.62,0,0,0-.82-.09,2.35,2.35,0,0,0-1.78.72,2.58,2.58,0,0,0-.68,1.87v4.51H269.8V5.07h1.44l.24,1.52h.09a3.47,3.47,0,0,1,1.12-1.22A2.72,2.72,0,0,1,274.18,4.91Z"/><path class="cls-1" d="M282.66,11.25a2.27,2.27,0,0,1-.92,1.94,4.45,4.45,0,0,1-2.65.68,6.21,6.21,0,0,1-2.77-.53V11.76a6.8,6.8,0,0,0,2.84.7c1.13,0,1.69-.34,1.69-1a.85.85,0,0,0-.18-.55,2.42,2.42,0,0,0-.62-.45,9.21,9.21,0,0,0-1.2-.53,5.56,5.56,0,0,1-2-1.16,2.16,2.16,0,0,1-.52-1.5,2,2,0,0,1,.89-1.72,4.24,4.24,0,0,1,2.43-.62,7,7,0,0,1,2.89.62l-.6,1.38a6.45,6.45,0,0,0-2.35-.57c-1,0-1.45.27-1.45.82a.81.81,0,0,0,.38.69,7.66,7.66,0,0,0,1.65.77,7.65,7.65,0,0,1,1.55.76,2.17,2.17,0,0,1,.72.8A2.23,2.23,0,0,1,282.66,11.25Z"/><path class="cls-1" d="M288.39,13.87a4.16,4.16,0,0,1-3.15-1.18,4.45,4.45,0,0,1-1.14-3.24,4.93,4.93,0,0,1,1.06-3.33,3.66,3.66,0,0,1,2.9-1.21,3.56,3.56,0,0,1,2.7,1,4,4,0,0,1,1,2.86v1H286a2.85,2.85,0,0,0,.67,1.94,2.38,2.38,0,0,0,1.81.67,6.55,6.55,0,0,0,1.43-.14,7.84,7.84,0,0,0,1.41-.48v1.49a4.94,4.94,0,0,1-1.36.45A8.1,8.1,0,0,1,288.39,13.87Zm-.33-7.57a1.83,1.83,0,0,0-1.4.56A2.56,2.56,0,0,0,286,8.48H290a2.33,2.33,0,0,0-.52-1.62A1.75,1.75,0,0,0,288.06,6.3Z"/><path class="cls-1" d="M305.75,5.74a3.31,3.31,0,0,1-1.17,2.74,5.12,5.12,0,0,1-3.33,1h-1.19v4.27h-1.87V2.29h3.29a5,5,0,0,1,3.21.87A3.16,3.16,0,0,1,305.75,5.74Zm-5.69,2.13h1a3.58,3.58,0,0,0,2.11-.5,1.83,1.83,0,0,0,.67-1.57,1.76,1.76,0,0,0-.6-1.46,2.94,2.94,0,0,0-1.88-.49h-1.29Z"/><path class="cls-1" d="M312,4.91a4.51,4.51,0,0,1,.91.08l-.18,1.71a3.59,3.59,0,0,0-.81-.09,2.37,2.37,0,0,0-1.79.72,2.62,2.62,0,0,0-.68,1.87v4.51h-1.84V5.07h1.44l.24,1.52h.1a3.38,3.38,0,0,1,1.12-1.22A2.7,2.7,0,0,1,312,4.91Z"/><path class="cls-1" d="M322.1,9.38a4.68,4.68,0,0,1-1.09,3.3,3.89,3.89,0,0,1-3,1.19,4.08,4.08,0,0,1-2.14-.55,3.58,3.58,0,0,1-1.43-1.57,5.37,5.37,0,0,1-.5-2.37A4.69,4.69,0,0,1,315,6.09a3.93,3.93,0,0,1,3-1.18,3.83,3.83,0,0,1,3,1.21A4.67,4.67,0,0,1,322.1,9.38Zm-6.29,0c0,2,.74,3,2.21,3s2.19-1,2.19-3-.73-3-2.2-3a1.9,1.9,0,0,0-1.68.77A3.87,3.87,0,0,0,315.81,9.38Z"/><path class="cls-1" d="M325.85,9.3,323,5.07H325l2,3,2-3h2.07l-2.9,4.23,3.05,4.41h-2.08L327,10.48l-2.12,3.23h-2.08Z"/><path class="cls-1" d="M332,5.07h2l1.76,4.9a9.68,9.68,0,0,1,.53,2h.06a7.93,7.93,0,0,1,.26-1c.12-.4.78-2.35,2-5.82h2l-3.7,9.79c-.67,1.8-1.79,2.69-3.36,2.69a5.23,5.23,0,0,1-1.19-.13V16a4.51,4.51,0,0,0,.95.09,1.94,1.94,0,0,0,1.87-1.54l.32-.81Z"/><path class="cls-1" d="M348.11,13.71h-1.85V2.29h6.45V3.87h-4.6V7.44h4.31V9h-4.31Z"/><path class="cls-1" d="M356.32,13.71h-1.83V1.55h1.83Z"/><path class="cls-1" d="M366.56,9.38a4.72,4.72,0,0,1-1.08,3.3,3.91,3.91,0,0,1-3,1.19,4.11,4.11,0,0,1-2.14-.55,3.64,3.64,0,0,1-1.43-1.57,5.37,5.37,0,0,1-.5-2.37,4.69,4.69,0,0,1,1.08-3.29,3.93,3.93,0,0,1,3-1.18,3.83,3.83,0,0,1,3,1.21A4.67,4.67,0,0,1,366.56,9.38Zm-6.29,0c0,2,.74,3,2.21,3s2.19-1,2.19-3-.73-3-2.2-3a1.9,1.9,0,0,0-1.68.77A4,4,0,0,0,360.27,9.38Z"/><path class="cls-1" d="M375.66,13.71l-1.12-4c-.13-.43-.38-1.42-.73-3h-.07c-.31,1.41-.54,2.41-.72,3l-1.15,4h-2l-2.42-8.64h1.87l1.1,4.26c.25,1.05.43,1.95.53,2.7H371c0-.38.13-.82.24-1.31s.2-.86.28-1.1l1.31-4.55h2l1.27,4.55c.08.25.17.64.29,1.17a8.5,8.5,0,0,1,.21,1.23h.06a23.75,23.75,0,0,1,.55-2.69l1.12-4.26h1.84l-2.44,8.64Z"/><line class="cls-2" x1="68.1" y1="64.9" x2="157.44" y2="149.33"/><polygon class="cls-3" points="152.22 149.06 157.01 148.92 156.88 144.13 158.97 146.1 159.1 150.9 154.31 151.03 152.22 149.06"/><line class="cls-2" x1="68.1" y1="259.4" x2="157.5" y2="168.53"/><polygon class="cls-3" points="157.13 173.74 157.09 168.95 152.29 168.99 154.31 166.94 159.1 166.9 159.14 171.69 157.13 173.74"/><path class="cls-4" d="M609.5,109.18H537.05a2.55,2.55,0,0,0-2.54,2.55v24.79a2.55,2.55,0,0,0,2.54,2.55H609.5a2.55,2.55,0,0,0,2.54-2.55V111.73A2.55,2.55,0,0,0,609.5,109.18Zm-.37,27H537.42V112.09h71.71ZM572.4,128.8v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,1,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm6.5,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,1,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm-45.54,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,1,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm6.5,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,1,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm32.52,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm1.93,14.36a1.46,1.46,0,0,1-1.46,1.45H547.66a1.46,1.46,0,0,1,0-2.91h51.23A1.46,1.46,0,0,1,600.35,143.16Z"/><path class="cls-4" d="M609.5,178.18H537.05a2.55,2.55,0,0,0-2.54,2.55v24.79a2.55,2.55,0,0,0,2.54,2.55H609.5a2.55,2.55,0,0,0,2.54-2.55V180.73A2.55,2.55,0,0,0,609.5,178.18Zm-.37,27H537.42V181.09h71.71ZM572.4,197.8v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,0,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm6.5,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,0,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm-45.54,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,0,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm6.5,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,0,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm32.52,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm1.93,14.36a1.46,1.46,0,0,1-1.46,1.45H547.66a1.46,1.46,0,0,1,0-2.91h51.23A1.46,1.46,0,0,1,600.35,212.16Z"/><path class="cls-5" d="M68.43,177.32V138.64a3.06,3.06,0,0,0-3.06-3H7.09a3.06,3.06,0,0,0-3.06,3v38.68H0c.36,2.76,2.27,4.88,4.57,4.88H67.61c2.3,0,4.21-2.12,4.57-4.88ZM7.52,139.08H64.94v38.24H7.52Z"/><path class="cls-5" d="M68.43,274.32V235.64a3.06,3.06,0,0,0-3.06-3H7.09a3.06,3.06,0,0,0-3.06,3v38.68H0c.36,2.76,2.27,4.88,4.57,4.88H67.61c2.3,0,4.21-2.12,4.57-4.88ZM7.52,236.08H64.94v38.24H7.52Z"/><path class="cls-5" d="M68.43,80.32V41.64a3.06,3.06,0,0,0-3.06-3H7.09a3.06,3.06,0,0,0-3.06,3V80.32H0c.36,2.76,2.27,4.88,4.57,4.88H67.61c2.3,0,4.21-2.12,4.57-4.88ZM7.52,42.08H64.94V80.32H7.52Z"/><line class="cls-2" x1="68.1" y1="158.9" x2="156.82" y2="158.9"/><polygon class="cls-3" points="152.84 162.29 156.23 158.9 152.84 155.51 155.71 155.51 159.1 158.9 155.71 162.29 152.84 162.29"/><line class="cls-2" x1="250.1" y1="158.9" x2="338.82" y2="158.9"/><polygon class="cls-3" points="334.83 162.29 338.23 158.9 334.83 155.51 337.71 155.51 341.11 158.9 337.71 162.29 334.83 162.29"/><line class="cls-2" x1="432.33" y1="152.94" x2="516.71" y2="125.56"/><polygon class="cls-3" points="513.97 130.01 516.15 125.74 511.87 123.56 514.61 122.67 518.88 124.85 516.7 129.12 513.97 130.01"/><line class="cls-2" x1="432.33" y1="158.85" x2="516.71" y2="186.24"/><polygon class="cls-3" points="511.87 188.23 516.15 186.06 513.97 181.78 516.7 182.67 518.88 186.94 514.61 189.12 511.87 188.23"/><path class="cls-1" d="M13.47,64.32a2,2,0,0,1-1.5-.58,2.25,2.25,0,0,1-.55-1.6,2.5,2.5,0,0,1,.51-1.65,1.69,1.69,0,0,1,1.37-.61,1.61,1.61,0,0,1,1.27.53,2,2,0,0,1,.47,1.4v.41H12.09a1.73,1.73,0,0,0,.38,1.14,1.33,1.33,0,0,0,1,.39,3.34,3.34,0,0,0,1.37-.29V64a3.25,3.25,0,0,1-.65.21A3.21,3.21,0,0,1,13.47,64.32Zm-.18-3.9a1.08,1.08,0,0,0-.82.34,1.58,1.58,0,0,0-.36.93h2.24a1.39,1.39,0,0,0-.28-.94A1,1,0,0,0,13.29,60.42Z"/><path class="cls-1" d="M17.37,62.05,15.89,60h.73l1.13,1.64L18.88,60h.73l-1.49,2.09,1.57,2.19H19l-1.2-1.73-1.21,1.73h-.73Z"/><path class="cls-1" d="M23.31,64.24l-.13-.61h0a1.85,1.85,0,0,1-.64.55,2,2,0,0,1-.79.14,1.42,1.42,0,0,1-1-.33,1.2,1.2,0,0,1-.36-.93c0-.87.69-1.32,2.07-1.36l.73,0v-.26a1.07,1.07,0,0,0-.22-.75.87.87,0,0,0-.69-.24,2.8,2.8,0,0,0-1.21.33l-.2-.49a2.61,2.61,0,0,1,.69-.27,2.78,2.78,0,0,1,.76-.1,1.59,1.59,0,0,1,1.13.34,1.41,1.41,0,0,1,.37,1.09v2.92Zm-1.46-.46a1.32,1.32,0,0,0,.95-.33,1.22,1.22,0,0,0,.34-.93v-.38l-.65,0a2.41,2.41,0,0,0-1.11.24.72.72,0,0,0-.34.66.67.67,0,0,0,.21.54A.9.9,0,0,0,21.85,63.78Z"/><path class="cls-1" d="M30.7,64.24V61.46a1.12,1.12,0,0,0-.22-.77.84.84,0,0,0-.68-.26,1.1,1.1,0,0,0-.89.35,1.61,1.61,0,0,0-.29,1.07v2.39H28V61.46a1.12,1.12,0,0,0-.22-.77.84.84,0,0,0-.68-.26,1,1,0,0,0-.89.37A1.94,1.94,0,0,0,25.89,62v2.25h-.65V60h.53l.11.59h0a1.18,1.18,0,0,1,.52-.49,1.53,1.53,0,0,1,.74-.18,1.28,1.28,0,0,1,1.32.73h0a1.28,1.28,0,0,1,.55-.53,1.73,1.73,0,0,1,.83-.2,1.5,1.5,0,0,1,1.09.37,1.69,1.69,0,0,1,.36,1.2v2.79Z"/><path class="cls-1" d="M34.79,64.32a1.76,1.76,0,0,1-.76-.16,1.46,1.46,0,0,1-.58-.47H33.4a6.07,6.07,0,0,1,.05.71v1.76H32.8V60h.53l.09.59h0A1.46,1.46,0,0,1,34,60a1.7,1.7,0,0,1,.76-.16,1.61,1.61,0,0,1,1.32.58,2.58,2.58,0,0,1,.46,1.64,2.47,2.47,0,0,1-.47,1.63A1.59,1.59,0,0,1,34.79,64.32Zm-.09-3.89a1.13,1.13,0,0,0-1,.37,1.91,1.91,0,0,0-.3,1.15v.15a2.15,2.15,0,0,0,.3,1.29,1.14,1.14,0,0,0,1,.39,1,1,0,0,0,.86-.45,2.15,2.15,0,0,0,.32-1.24,2,2,0,0,0-.32-1.23A1,1,0,0,0,34.7,60.43Z"/><path class="cls-1" d="M38.49,64.24h-.65V58.16h.65Z"/><path class="cls-1" d="M41.8,64.32a1.93,1.93,0,0,1-1.49-.58,2.21,2.21,0,0,1-.55-1.6,2.5,2.5,0,0,1,.51-1.65,1.68,1.68,0,0,1,1.37-.61,1.62,1.62,0,0,1,1.27.53,2,2,0,0,1,.47,1.4v.41h-3a1.68,1.68,0,0,0,.38,1.14,1.32,1.32,0,0,0,1,.39,3.3,3.3,0,0,0,1.36-.29V64a3.06,3.06,0,0,1-.65.21A3.15,3.15,0,0,1,41.8,64.32Zm-.17-3.9a1.05,1.05,0,0,0-.82.34,1.52,1.52,0,0,0-.37.93h2.24a1.44,1.44,0,0,0-.27-.94A1,1,0,0,0,41.63,60.42Z"/><path class="cls-1" d="M44.46,63.83a.58.58,0,0,1,.12-.4.42.42,0,0,1,.34-.13.48.48,0,0,1,.36.13.58.58,0,0,1,.12.4.53.53,0,0,1-.13.39.45.45,0,0,1-.35.13.48.48,0,0,1-.33-.12A.56.56,0,0,1,44.46,63.83Z"/><path class="cls-1" d="M48.43,64.32A1.81,1.81,0,0,1,47,63.75a2.35,2.35,0,0,1-.51-1.62A2.44,2.44,0,0,1,47,60.47a1.88,1.88,0,0,1,1.48-.59,2.54,2.54,0,0,1,.61.07,1.91,1.91,0,0,1,.49.15l-.2.55a4.41,4.41,0,0,0-.47-.14,1.93,1.93,0,0,0-.45,0c-.87,0-1.3.55-1.3,1.66a1.92,1.92,0,0,0,.32,1.21,1.1,1.1,0,0,0,.94.42,2.79,2.79,0,0,0,1.1-.23v.58A2.49,2.49,0,0,1,48.43,64.32Z"/><path class="cls-1" d="M54.29,62.1a2.37,2.37,0,0,1-.53,1.63,1.87,1.87,0,0,1-1.46.59,1.94,1.94,0,0,1-1-.27,1.82,1.82,0,0,1-.68-.77,2.59,2.59,0,0,1-.25-1.18,2.33,2.33,0,0,1,.53-1.63,1.85,1.85,0,0,1,1.45-.59,1.81,1.81,0,0,1,1.43.6A2.38,2.38,0,0,1,54.29,62.1ZM51,62.1a2.12,2.12,0,0,0,.32,1.25,1.16,1.16,0,0,0,1,.43,1.17,1.17,0,0,0,1-.43,2,2,0,0,0,.33-1.25,2,2,0,0,0-.33-1.24,1.32,1.32,0,0,0-1.94,0A2,2,0,0,0,51,62.1Z"/><path class="cls-1" d="M61,64.24V61.46a1.12,1.12,0,0,0-.22-.77.85.85,0,0,0-.68-.26,1.13,1.13,0,0,0-.9.35,1.67,1.67,0,0,0-.28,1.07v2.39h-.65V61.46a1.12,1.12,0,0,0-.22-.77.85.85,0,0,0-.68-.26,1.06,1.06,0,0,0-.9.37A2,2,0,0,0,56.2,62v2.25h-.65V60h.53l.1.59h0a1.29,1.29,0,0,1,.52-.49,1.6,1.6,0,0,1,.75-.18,1.26,1.26,0,0,1,1.31.73h0a1.36,1.36,0,0,1,.56-.53,1.73,1.73,0,0,1,.83-.2,1.47,1.47,0,0,1,1.08.37,1.64,1.64,0,0,1,.37,1.2v2.79Z"/><path class="cls-1" d="M10.11,102.24l-.13-.57H9.93a1.27,1.27,0,0,1-.54.48,1.92,1.92,0,0,1-.81.17,1.59,1.59,0,0,1-1.17-.39A1.62,1.62,0,0,1,7,100.74V97.92H8v2.66a1.2,1.2,0,0,0,.2.75.81.81,0,0,0,.64.25,1,1,0,0,0,.85-.35,1.92,1.92,0,0,0,.27-1.16V97.92h.92v4.32Z"/><path class="cls-1" d="M15.21,101a1.12,1.12,0,0,1-.46,1,2.14,2.14,0,0,1-1.32.34,3.17,3.17,0,0,1-1.38-.26v-.8a3.31,3.31,0,0,0,1.41.36c.57,0,.85-.17.85-.52a.4.4,0,0,0-.09-.27,1.24,1.24,0,0,0-.31-.23c-.14-.07-.34-.16-.6-.26a2.78,2.78,0,0,1-1-.58A1.09,1.09,0,0,1,12,99a1,1,0,0,1,.45-.86,2,2,0,0,1,1.21-.31,3.51,3.51,0,0,1,1.44.31l-.29.69a3.29,3.29,0,0,0-1.18-.29c-.48,0-.73.14-.73.42a.43.43,0,0,0,.19.34,5.19,5.19,0,0,0,.83.39,3.52,3.52,0,0,1,.78.38,1.11,1.11,0,0,1,.36.39A1.27,1.27,0,0,1,15.21,101Z"/><path class="cls-1" d="M18.24,102.32a2.11,2.11,0,0,1-1.58-.59,2.26,2.26,0,0,1-.56-1.62,2.45,2.45,0,0,1,.52-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.5,1.43v.5H17a1.39,1.39,0,0,0,.34,1,1.15,1.15,0,0,0,.9.34,3.26,3.26,0,0,0,.72-.07,4.25,4.25,0,0,0,.71-.24V102a3.16,3.16,0,0,1-.68.22A3.81,3.81,0,0,1,18.24,102.32Zm-.17-3.78a.94.94,0,0,0-.7.27,1.36,1.36,0,0,0-.31.81h2a1.23,1.23,0,0,0-.26-.81A.9.9,0,0,0,18.07,98.54Z"/><path class="cls-1" d="M23.3,97.84a2.71,2.71,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41,0,1.18,1.18,0,0,0-.89.36A1.29,1.29,0,0,0,22,100v2.26h-.92V97.92h.72l.12.76H22a1.65,1.65,0,0,1,.56-.61A1.34,1.34,0,0,1,23.3,97.84Z"/><path class="cls-1" d="M25.74,96.53l.06.09a12,12,0,0,1-.69,1.87h-.66c.17-.76.31-1.41.39-2Z"/><path class="cls-1" d="M29.55,101a1.12,1.12,0,0,1-.46,1,2.18,2.18,0,0,1-1.32.34,3.22,3.22,0,0,1-1.39-.26v-.8a3.38,3.38,0,0,0,1.42.36c.57,0,.85-.17.85-.52a.4.4,0,0,0-.09-.27,1.46,1.46,0,0,0-.31-.23c-.15-.07-.34-.16-.6-.26a2.78,2.78,0,0,1-1-.58,1,1,0,0,1-.26-.75,1,1,0,0,1,.44-.86A2.1,2.1,0,0,1,28,97.84a3.51,3.51,0,0,1,1.44.31l-.29.69A3.29,3.29,0,0,0,28,98.55c-.48,0-.73.14-.73.42a.43.43,0,0,0,.19.34,4.78,4.78,0,0,0,.83.39,3.77,3.77,0,0,1,.78.38,1.11,1.11,0,0,1,.36.39A1.27,1.27,0,0,1,29.55,101Z"/><path class="cls-1" d="M34.08,102.32a1.5,1.5,0,0,1-1.26-.59,2.64,2.64,0,0,1-.45-1.64,2.71,2.71,0,0,1,.45-1.66,1.54,1.54,0,0,1,1.28-.59,1.48,1.48,0,0,1,1.29.63h0a4.71,4.71,0,0,1-.07-.73V96.16h.92v6.08h-.71l-.16-.57h-.05A1.46,1.46,0,0,1,34.08,102.32Zm.25-.74a1,1,0,0,0,.82-.32,1.72,1.72,0,0,0,.27-1v-.13a1.9,1.9,0,0,0-.27-1.16,1,1,0,0,0-.83-.35.86.86,0,0,0-.75.39,2.08,2.08,0,0,0-.26,1.12,2,2,0,0,0,.25,1.1A.88.88,0,0,0,34.33,101.58Z"/><path class="cls-1" d="M39.62,102.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62A2.4,2.4,0,0,1,38,98.45a2,2,0,0,1,2.8-.09,2,2,0,0,1,.49,1.43v.5H38.42a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4.25,4.25,0,0,0,.71-.24V102a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,39.62,102.32Zm-.16-3.78a1,1,0,0,0-.71.27,1.36,1.36,0,0,0-.31.81h2a1.23,1.23,0,0,0-.26-.81A.87.87,0,0,0,39.46,98.54Z"/><path class="cls-1" d="M43.45,102.24l-1.64-4.32h1l.88,2.51a4.93,4.93,0,0,1,.27,1h0a8.14,8.14,0,0,1,.28-1l.87-2.51h1l-1.65,4.32Z"/><path class="cls-1" d="M46.9,96.78a.48.48,0,0,1,.52-.52.52.52,0,0,1,.38.14.5.5,0,0,1,.13.38.51.51,0,0,1-.13.37.56.56,0,0,1-.38.13.54.54,0,0,1-.38-.13A.51.51,0,0,1,46.9,96.78Zm1,5.46H47V97.92h.91Z"/><path class="cls-1" d="M51.05,102.32a1.89,1.89,0,0,1-1.49-.57,2.91,2.91,0,0,1,0-3.32,2,2,0,0,1,1.54-.59,2.85,2.85,0,0,1,1.23.26l-.28.73a2.79,2.79,0,0,0-1-.22c-.75,0-1.12.49-1.12,1.49a1.77,1.77,0,0,0,.28,1.09,1,1,0,0,0,.82.36,2.39,2.39,0,0,0,1.16-.3v.8a2,2,0,0,1-.53.21A3.2,3.2,0,0,1,51.05,102.32Z"/><path class="cls-1" d="M55.23,102.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.49,1.43v.5H54a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4,4,0,0,0,.71-.24V102a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,55.23,102.32Zm-.16-3.78a1,1,0,0,0-.71.27,1.36,1.36,0,0,0-.31.81h2a1.18,1.18,0,0,0-.26-.81A.87.87,0,0,0,55.07,98.54Z"/><path class="cls-1" d="M59.7,100.05a6.11,6.11,0,0,1,.3-1.94,4.76,4.76,0,0,1,.87-1.58h.8a5.81,5.81,0,0,0-.83,1.65,6.18,6.18,0,0,0-.29,1.86,6.06,6.06,0,0,0,.29,1.85,5.77,5.77,0,0,0,.83,1.62h-.8A4.71,4.71,0,0,1,60,102,6,6,0,0,1,59.7,100.05Z"/><path class="cls-1" d="M67.45,99.33a2.82,2.82,0,0,1-.79,2.16,3.13,3.13,0,0,1-2.26.75H62.8V96.53h1.77a2.92,2.92,0,0,1,2.12.73A2.73,2.73,0,0,1,67.45,99.33Zm-1,0c0-1.37-.64-2-1.91-2h-.81v4.15h.66A1.84,1.84,0,0,0,66.46,99.36Z"/><path class="cls-1" d="M70.07,100.05a5.67,5.67,0,0,1-.31,1.91,4.61,4.61,0,0,1-.87,1.55H68.1a5.62,5.62,0,0,0,.82-1.62,5.77,5.77,0,0,0,.29-1.85,5.83,5.83,0,0,0-.29-1.86,5.56,5.56,0,0,0-.83-1.65h.8a4.83,4.83,0,0,1,.88,1.59A6.05,6.05,0,0,1,70.07,100.05Z"/><path class="cls-1" d="M10.11,295.24l-.13-.57H9.93a1.27,1.27,0,0,1-.54.48,1.92,1.92,0,0,1-.81.17,1.59,1.59,0,0,1-1.17-.39A1.61,1.61,0,0,1,7,293.75v-2.83H8v2.66a1.2,1.2,0,0,0,.2.75.81.81,0,0,0,.64.25,1,1,0,0,0,.85-.35,1.92,1.92,0,0,0,.27-1.16v-2.15h.92v4.32Z"/><path class="cls-1" d="M15.21,294a1.12,1.12,0,0,1-.46,1,2.14,2.14,0,0,1-1.32.34,3.17,3.17,0,0,1-1.38-.26v-.8a3.31,3.31,0,0,0,1.41.36c.57,0,.85-.17.85-.52a.42.42,0,0,0-.09-.27,1.24,1.24,0,0,0-.31-.23c-.14-.07-.34-.16-.6-.26a2.78,2.78,0,0,1-1-.58A1.09,1.09,0,0,1,12,292a1,1,0,0,1,.45-.86,2,2,0,0,1,1.21-.31,3.51,3.51,0,0,1,1.44.31l-.29.69a3.29,3.29,0,0,0-1.18-.29c-.48,0-.73.14-.73.42a.43.43,0,0,0,.19.34,4.42,4.42,0,0,0,.83.39,3.52,3.52,0,0,1,.78.38,1.11,1.11,0,0,1,.36.39A1.27,1.27,0,0,1,15.21,294Z"/><path class="cls-1" d="M18.24,295.32a2.11,2.11,0,0,1-1.58-.59,2.26,2.26,0,0,1-.56-1.62,2.45,2.45,0,0,1,.52-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.5,1.43v.5H17a1.39,1.39,0,0,0,.34,1,1.15,1.15,0,0,0,.9.34,3.26,3.26,0,0,0,.72-.07,4.25,4.25,0,0,0,.71-.24V295a3.16,3.16,0,0,1-.68.22A3.81,3.81,0,0,1,18.24,295.32Zm-.17-3.78a.91.91,0,0,0-.7.28,1.3,1.3,0,0,0-.31.8h2a1.23,1.23,0,0,0-.26-.81A.9.9,0,0,0,18.07,291.54Z"/><path class="cls-1" d="M23.3,290.84a2.71,2.71,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41-.05,1.18,1.18,0,0,0-.89.36A1.29,1.29,0,0,0,22,293v2.26h-.92v-4.32h.72l.12.76H22a1.65,1.65,0,0,1,.56-.61A1.34,1.34,0,0,1,23.3,290.84Z"/><path class="cls-1" d="M25.74,289.53l.06.09a12,12,0,0,1-.69,1.87h-.66c.17-.76.31-1.41.39-2Z"/><path class="cls-1" d="M29.55,294a1.12,1.12,0,0,1-.46,1,2.18,2.18,0,0,1-1.32.34,3.22,3.22,0,0,1-1.39-.26v-.8a3.38,3.38,0,0,0,1.42.36c.57,0,.85-.17.85-.52a.42.42,0,0,0-.09-.27,1.46,1.46,0,0,0-.31-.23c-.15-.07-.34-.16-.6-.26a2.78,2.78,0,0,1-1-.58,1,1,0,0,1-.26-.75,1,1,0,0,1,.44-.86,2.1,2.1,0,0,1,1.22-.31,3.51,3.51,0,0,1,1.44.31l-.29.69a3.29,3.29,0,0,0-1.18-.29c-.48,0-.73.14-.73.42a.43.43,0,0,0,.19.34,4.11,4.11,0,0,0,.83.39,3.77,3.77,0,0,1,.78.38,1.11,1.11,0,0,1,.36.39A1.27,1.27,0,0,1,29.55,294Z"/><path class="cls-1" d="M34.08,295.32a1.5,1.5,0,0,1-1.26-.59,2.64,2.64,0,0,1-.45-1.64,2.71,2.71,0,0,1,.45-1.66,1.54,1.54,0,0,1,1.28-.59,1.48,1.48,0,0,1,1.29.63h0a4.71,4.71,0,0,1-.07-.73v-1.58h.92v6.08h-.71l-.16-.57h-.05A1.46,1.46,0,0,1,34.08,295.32Zm.25-.74a1,1,0,0,0,.82-.32,1.72,1.72,0,0,0,.27-1v-.13a1.9,1.9,0,0,0-.27-1.16,1,1,0,0,0-.83-.35.85.85,0,0,0-.75.4,2,2,0,0,0-.26,1.11,2,2,0,0,0,.25,1.1A.88.88,0,0,0,34.33,294.58Z"/><path class="cls-1" d="M39.62,295.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.49,1.43v.5H38.42a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4.25,4.25,0,0,0,.71-.24V295a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,39.62,295.32Zm-.16-3.78a.92.92,0,0,0-.71.28,1.3,1.3,0,0,0-.31.8h2a1.23,1.23,0,0,0-.26-.81A.87.87,0,0,0,39.46,291.54Z"/><path class="cls-1" d="M43.45,295.24l-1.64-4.32h1l.88,2.51a4.93,4.93,0,0,1,.27,1h0a8.14,8.14,0,0,1,.28-1l.87-2.51h1l-1.65,4.32Z"/><path class="cls-1" d="M46.9,289.78a.48.48,0,0,1,.52-.52.52.52,0,0,1,.38.14.5.5,0,0,1,.13.38.51.51,0,0,1-.13.37.52.52,0,0,1-.38.13.5.5,0,0,1-.38-.13A.51.51,0,0,1,46.9,289.78Zm1,5.46H47v-4.32h.91Z"/><path class="cls-1" d="M51.05,295.32a1.89,1.89,0,0,1-1.49-.57,2.91,2.91,0,0,1,0-3.32,2,2,0,0,1,1.54-.59,2.85,2.85,0,0,1,1.23.26l-.28.73a2.79,2.79,0,0,0-1-.22c-.75,0-1.12.49-1.12,1.49a1.77,1.77,0,0,0,.28,1.09,1,1,0,0,0,.82.36,2.39,2.39,0,0,0,1.16-.3v.8a2,2,0,0,1-.53.21A3.2,3.2,0,0,1,51.05,295.32Z"/><path class="cls-1" d="M55.23,295.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.49,1.43v.5H54a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4,4,0,0,0,.71-.24V295a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,55.23,295.32Zm-.16-3.78a.92.92,0,0,0-.71.28,1.3,1.3,0,0,0-.31.8h2a1.18,1.18,0,0,0-.26-.81A.87.87,0,0,0,55.07,291.54Z"/><path class="cls-1" d="M59.7,293.05a6.11,6.11,0,0,1,.3-1.94,4.76,4.76,0,0,1,.87-1.58h.8a5.81,5.81,0,0,0-.83,1.65,6.18,6.18,0,0,0-.29,1.86,6.06,6.06,0,0,0,.29,1.85,5.77,5.77,0,0,0,.83,1.62h-.8A4.71,4.71,0,0,1,60,295,6,6,0,0,1,59.7,293.05Z"/><path class="cls-1" d="M67.45,292.33a2.82,2.82,0,0,1-.79,2.16,3.13,3.13,0,0,1-2.26.75H62.8v-5.71h1.77a2.92,2.92,0,0,1,2.12.73A2.73,2.73,0,0,1,67.45,292.33Zm-1,0c0-1.36-.64-2.05-1.91-2.05h-.81v4.15h.66A1.84,1.84,0,0,0,66.46,292.36Z"/><path class="cls-1" d="M70.07,293.05a5.67,5.67,0,0,1-.31,1.91,4.61,4.61,0,0,1-.87,1.55H68.1a5.62,5.62,0,0,0,.82-1.62,5.77,5.77,0,0,0,.29-1.85,5.83,5.83,0,0,0-.29-1.86,5.56,5.56,0,0,0-.83-1.65h.8a4.83,4.83,0,0,1,.88,1.59A6.05,6.05,0,0,1,70.07,293.05Z"/><path class="cls-1" d="M10.11,199.24l-.13-.57H9.93a1.27,1.27,0,0,1-.54.48,1.92,1.92,0,0,1-.81.17,1.59,1.59,0,0,1-1.17-.39A1.61,1.61,0,0,1,7,197.75v-2.83H8v2.66a1.2,1.2,0,0,0,.2.75.81.81,0,0,0,.64.25,1,1,0,0,0,.85-.35,1.92,1.92,0,0,0,.27-1.16v-2.15h.92v4.32Z"/><path class="cls-1" d="M15.21,198a1.12,1.12,0,0,1-.46,1,2.14,2.14,0,0,1-1.32.34,3.17,3.17,0,0,1-1.38-.26v-.8a3.31,3.31,0,0,0,1.41.36c.57,0,.85-.17.85-.52a.42.42,0,0,0-.09-.27,1.24,1.24,0,0,0-.31-.23c-.14-.07-.34-.16-.6-.26a2.78,2.78,0,0,1-1-.58A1.09,1.09,0,0,1,12,196a1,1,0,0,1,.45-.86,2,2,0,0,1,1.21-.31,3.51,3.51,0,0,1,1.44.31l-.29.69a3.29,3.29,0,0,0-1.18-.29c-.48,0-.73.14-.73.42a.43.43,0,0,0,.19.34,4.42,4.42,0,0,0,.83.39,3.52,3.52,0,0,1,.78.38,1.11,1.11,0,0,1,.36.39A1.27,1.27,0,0,1,15.21,198Z"/><path class="cls-1" d="M18.24,199.32a2.11,2.11,0,0,1-1.58-.59,2.26,2.26,0,0,1-.56-1.62,2.45,2.45,0,0,1,.52-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.5,1.43v.5H17a1.39,1.39,0,0,0,.34,1,1.15,1.15,0,0,0,.9.34,3.26,3.26,0,0,0,.72-.07,4.25,4.25,0,0,0,.71-.24V199a3.16,3.16,0,0,1-.68.22A3.81,3.81,0,0,1,18.24,199.32Zm-.17-3.78a.91.91,0,0,0-.7.28,1.3,1.3,0,0,0-.31.8h2a1.23,1.23,0,0,0-.26-.81A.9.9,0,0,0,18.07,195.54Z"/><path class="cls-1" d="M23.3,194.84a2.71,2.71,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41-.05,1.18,1.18,0,0,0-.89.36A1.29,1.29,0,0,0,22,197v2.26h-.92v-4.32h.72l.12.76H22a1.65,1.65,0,0,1,.56-.61A1.34,1.34,0,0,1,23.3,194.84Z"/><path class="cls-1" d="M25.74,193.53l.06.09a12,12,0,0,1-.69,1.87h-.66c.17-.76.31-1.41.39-2Z"/><path class="cls-1" d="M29.55,198a1.12,1.12,0,0,1-.46,1,2.18,2.18,0,0,1-1.32.34,3.22,3.22,0,0,1-1.39-.26v-.8a3.38,3.38,0,0,0,1.42.36c.57,0,.85-.17.85-.52a.42.42,0,0,0-.09-.27,1.46,1.46,0,0,0-.31-.23c-.15-.07-.34-.16-.6-.26a2.78,2.78,0,0,1-1-.58,1,1,0,0,1-.26-.75,1,1,0,0,1,.44-.86,2.1,2.1,0,0,1,1.22-.31,3.51,3.51,0,0,1,1.44.31l-.29.69a3.29,3.29,0,0,0-1.18-.29c-.48,0-.73.14-.73.42a.43.43,0,0,0,.19.34,4.11,4.11,0,0,0,.83.39,3.77,3.77,0,0,1,.78.38,1.11,1.11,0,0,1,.36.39A1.27,1.27,0,0,1,29.55,198Z"/><path class="cls-1" d="M34.08,199.32a1.5,1.5,0,0,1-1.26-.59,2.64,2.64,0,0,1-.45-1.64,2.71,2.71,0,0,1,.45-1.66,1.54,1.54,0,0,1,1.28-.59,1.48,1.48,0,0,1,1.29.63h0a4.71,4.71,0,0,1-.07-.73v-1.58h.92v6.08h-.71l-.16-.57h-.05A1.46,1.46,0,0,1,34.08,199.32Zm.25-.74a1,1,0,0,0,.82-.32,1.72,1.72,0,0,0,.27-1v-.13a1.9,1.9,0,0,0-.27-1.16,1,1,0,0,0-.83-.35.85.85,0,0,0-.75.4,2,2,0,0,0-.26,1.11,2,2,0,0,0,.25,1.1A.88.88,0,0,0,34.33,198.58Z"/><path class="cls-1" d="M39.62,199.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.49,1.43v.5H38.42a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4.25,4.25,0,0,0,.71-.24V199a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,39.62,199.32Zm-.16-3.78a.92.92,0,0,0-.71.28,1.3,1.3,0,0,0-.31.8h2a1.23,1.23,0,0,0-.26-.81A.87.87,0,0,0,39.46,195.54Z"/><path class="cls-1" d="M43.45,199.24l-1.64-4.32h1l.88,2.51a4.93,4.93,0,0,1,.27,1h0a8.14,8.14,0,0,1,.28-1l.87-2.51h1l-1.65,4.32Z"/><path class="cls-1" d="M46.9,193.78a.48.48,0,0,1,.52-.52.52.52,0,0,1,.38.14.5.5,0,0,1,.13.38.51.51,0,0,1-.13.37.52.52,0,0,1-.38.13.5.5,0,0,1-.38-.13A.51.51,0,0,1,46.9,193.78Zm1,5.46H47v-4.32h.91Z"/><path class="cls-1" d="M51.05,199.32a1.89,1.89,0,0,1-1.49-.57,2.91,2.91,0,0,1,0-3.32,2,2,0,0,1,1.54-.59,2.85,2.85,0,0,1,1.23.26l-.28.73a2.79,2.79,0,0,0-1-.22c-.75,0-1.12.49-1.12,1.49a1.77,1.77,0,0,0,.28,1.09,1,1,0,0,0,.82.36,2.39,2.39,0,0,0,1.16-.3v.8a2,2,0,0,1-.53.21A3.2,3.2,0,0,1,51.05,199.32Z"/><path class="cls-1" d="M55.23,199.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.49,1.43v.5H54a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4,4,0,0,0,.71-.24V199a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,55.23,199.32Zm-.16-3.78a.92.92,0,0,0-.71.28,1.3,1.3,0,0,0-.31.8h2a1.18,1.18,0,0,0-.26-.81A.87.87,0,0,0,55.07,195.54Z"/><path class="cls-1" d="M59.7,197.05a6.11,6.11,0,0,1,.3-1.94,4.76,4.76,0,0,1,.87-1.58h.8a5.81,5.81,0,0,0-.83,1.65,6.18,6.18,0,0,0-.29,1.86,6.06,6.06,0,0,0,.29,1.85,5.77,5.77,0,0,0,.83,1.62h-.8A4.71,4.71,0,0,1,60,199,6,6,0,0,1,59.7,197.05Z"/><path class="cls-1" d="M67.45,196.33a2.82,2.82,0,0,1-.79,2.16,3.13,3.13,0,0,1-2.26.75H62.8v-5.71h1.77a2.92,2.92,0,0,1,2.12.73A2.73,2.73,0,0,1,67.45,196.33Zm-1,0c0-1.36-.64-2.05-1.91-2.05h-.81v4.15h.66A1.84,1.84,0,0,0,66.46,196.36Z"/><path class="cls-1" d="M70.07,197.05a5.67,5.67,0,0,1-.31,1.91,4.61,4.61,0,0,1-.87,1.55H68.1a5.62,5.62,0,0,0,.82-1.62,5.77,5.77,0,0,0,.29-1.85,5.83,5.83,0,0,0-.29-1.86,5.56,5.56,0,0,0-.83-1.65h.8a4.83,4.83,0,0,1,.88,1.59A6.05,6.05,0,0,1,70.07,197.05Z"/><path class="cls-4" d="M429.17,141.18H356.73a2.55,2.55,0,0,0-2.55,2.55v24.79a2.55,2.55,0,0,0,2.55,2.55h72.44a2.55,2.55,0,0,0,2.55-2.55V143.73A2.55,2.55,0,0,0,429.17,141.18Zm-.36,27H357.09V144.09h71.72Zm-36.73-7.36v-9.35a.87.87,0,0,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm6.5,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,0,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm6.5,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm-45.53,0v-9.35a.87.87,0,0,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm6.5,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm6.51,0v-9.35a.87.87,0,0,1,1.74,0v9.35a.87.87,0,1,1-1.74,0Zm6.5,0v-9.35a.88.88,0,0,1,1.75,0v9.35a.88.88,0,0,1-1.75,0Zm32.53,0v-9.35a.87.87,0,1,1,1.74,0v9.35a.87.87,0,1,1-1.74,0ZM420,175.16a1.45,1.45,0,0,1-1.45,1.45H367.33a1.46,1.46,0,0,1,0-2.91h51.24A1.45,1.45,0,0,1,420,175.16Z"/><path class="cls-1" d="M362.52,188.84a2.71,2.71,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41-.05,1.17,1.17,0,0,0-.89.36,1.29,1.29,0,0,0-.34.93v2.26h-.92v-4.32h.72l.12.76h0a1.68,1.68,0,0,1,.57-.61A1.32,1.32,0,0,1,362.52,188.84Z"/><path class="cls-1" d="M365.77,193.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.49,1.43v.5h-2.88a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4,4,0,0,0,.71-.24V193a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,365.77,193.32Zm-.16-3.78a.92.92,0,0,0-.71.28,1.3,1.3,0,0,0-.31.8h2a1.23,1.23,0,0,0-.26-.81A.87.87,0,0,0,365.61,189.54Z"/><path class="cls-1" d="M369.6,193.24,368,188.92h1l.88,2.51a4.93,4.93,0,0,1,.27,1h0a8.14,8.14,0,0,1,.28-1l.87-2.51h1l-1.65,4.32Z"/><path class="cls-1" d="M374.86,193.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.49,1.43v.5h-2.88a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4,4,0,0,0,.71-.24V193a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,374.86,193.32Zm-.16-3.78a.92.92,0,0,0-.71.28,1.3,1.3,0,0,0-.31.8h2a1.23,1.23,0,0,0-.26-.81A.87.87,0,0,0,374.7,189.54Z"/><path class="cls-1" d="M379.93,188.84a2.58,2.58,0,0,1,.45,0l-.09.86a1.68,1.68,0,0,0-.4-.05,1.15,1.15,0,0,0-.89.36,1.29,1.29,0,0,0-.35.93v2.26h-.91v-4.32h.72l.12.76h0a1.74,1.74,0,0,1,.56-.61A1.35,1.35,0,0,1,379.93,188.84Z"/><path class="cls-1" d="M384.32,192a1.14,1.14,0,0,1-.46,1,2.18,2.18,0,0,1-1.32.34,3.19,3.19,0,0,1-1.39-.26v-.8a3.35,3.35,0,0,0,1.42.36c.56,0,.85-.17.85-.52a.43.43,0,0,0-.1-.27,1.07,1.07,0,0,0-.31-.23c-.14-.07-.34-.16-.59-.26a2.69,2.69,0,0,1-1-.58,1,1,0,0,1-.27-.75,1,1,0,0,1,.45-.86,2.08,2.08,0,0,1,1.22-.31,3.58,3.58,0,0,1,1.44.31l-.3.69a3.29,3.29,0,0,0-1.18-.29q-.72,0-.72.42a.4.4,0,0,0,.19.34,3.94,3.94,0,0,0,.82.39,3.52,3.52,0,0,1,.78.38,1.11,1.11,0,0,1,.36.39A1.13,1.13,0,0,1,384.32,192Z"/><path class="cls-1" d="M387.34,193.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,1.79,1.79,0,0,1,1.44-.61,1.81,1.81,0,0,1,1.36.52,2,2,0,0,1,.49,1.43v.5h-2.88a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4,4,0,0,0,.71-.24V193a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,387.34,193.32Zm-.17-3.78a.91.91,0,0,0-.7.28,1.3,1.3,0,0,0-.31.8h2a1.18,1.18,0,0,0-.26-.81A.87.87,0,0,0,387.17,189.54Z"/><path class="cls-1" d="M394.33,193.32a1.52,1.52,0,0,1-1.27-.59H393c0,.36.05.59.05.66v1.77h-.92v-6.24h.75c0,.08.06.27.12.58h.05a1.44,1.44,0,0,1,1.29-.66,1.5,1.5,0,0,1,1.26.59,3.22,3.22,0,0,1,0,3.3A1.52,1.52,0,0,1,394.33,193.32Zm-.22-3.73a1,1,0,0,0-.8.32,1.75,1.75,0,0,0-.25,1v.13a2.11,2.11,0,0,0,.25,1.15,1,1,0,0,0,.82.35.82.82,0,0,0,.73-.39,2,2,0,0,0,.26-1.11,1.84,1.84,0,0,0-.26-1.1A.85.85,0,0,0,394.11,189.59Z"/><path class="cls-1" d="M399.46,188.84a2.81,2.81,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41-.05,1.17,1.17,0,0,0-.89.36,1.29,1.29,0,0,0-.34.93v2.26h-.92v-4.32H398l.12.76h.05a1.65,1.65,0,0,1,.56-.61A1.32,1.32,0,0,1,399.46,188.84Z"/><path class="cls-1" d="M404.66,191.07a2.39,2.39,0,0,1-.54,1.66,2,2,0,0,1-1.51.59,2.07,2.07,0,0,1-1.07-.27,1.9,1.9,0,0,1-.72-.79,2.78,2.78,0,0,1-.25-1.19,2.35,2.35,0,0,1,.54-1.64,2,2,0,0,1,1.52-.59,1.89,1.89,0,0,1,1.49.61A2.33,2.33,0,0,1,404.66,191.07Zm-3.14,0c0,1,.37,1.5,1.1,1.5s1.1-.5,1.1-1.5-.37-1.48-1.1-1.48a.93.93,0,0,0-.84.39A1.87,1.87,0,0,0,401.52,191.07Z"/><path class="cls-1" d="M406.7,191l-1.45-2.11h1.05l1,1.51,1-1.51h1L407.86,191l1.53,2.21h-1l-1.06-1.62-1.07,1.62h-1Z"/><path class="cls-1" d="M409.92,188.92h1l.88,2.45a4.69,4.69,0,0,1,.27,1h0a4.34,4.34,0,0,1,.13-.52q.09-.3,1-2.91h1l-1.84,4.9a1.76,1.76,0,0,1-1.68,1.34,3,3,0,0,1-.6-.06v-.73a2.26,2.26,0,0,0,.47,0,1,1,0,0,0,.94-.77l.16-.41Z"/><path class="cls-1" d="M416.61,191.05a6.11,6.11,0,0,1,.3-1.94,5,5,0,0,1,.88-1.58h.8a5.56,5.56,0,0,0-.83,1.65,5.88,5.88,0,0,0-.29,1.86,5.77,5.77,0,0,0,.29,1.85,5.5,5.5,0,0,0,.82,1.62h-.79a4.56,4.56,0,0,1-.88-1.55A6,6,0,0,1,416.61,191.05Z"/><path class="cls-1" d="M423,193.24h-3.23v-5.71H423v.79h-2.3v1.55h2.15v.79h-2.15v1.79H423Z"/><path class="cls-1" d="M425.91,191.05a5.67,5.67,0,0,1-.31,1.91,4.61,4.61,0,0,1-.87,1.55h-.79a5.62,5.62,0,0,0,.82-1.62,5.77,5.77,0,0,0,.29-1.85,5.83,5.83,0,0,0-.29-1.86,5.56,5.56,0,0,0-.83-1.65h.8a4.83,4.83,0,0,1,.88,1.59A6.05,6.05,0,0,1,425.91,191.05Z"/><path class="cls-5" d="M239.77,145.75a23.58,23.58,0,0,0-45.5-7.59,14.17,14.17,0,0,0-4.35-.67A14.5,14.5,0,0,0,175.43,152a14.85,14.85,0,0,0,.31,3,9.92,9.92,0,0,0,1.89,19.65H238a14.48,14.48,0,0,0,1.74-28.85ZM238,171.08h-60.4a6.4,6.4,0,0,1,0-12.8l.17,0,2.89.2-1-2.58a11,11,0,0,1,14.89-13.87l1.84.86L197,141a20.07,20.07,0,0,1,39.27,5.81l0,.62v1.77H238a11,11,0,0,1,0,21.92Z"/><path class="cls-1" d="M196.93,156.24v-5.71h.66v5.71Z"/><path class="cls-1" d="M202.1,156.24v-2.77a1.1,1.1,0,0,0-.24-.78,1,1,0,0,0-.74-.26,1.22,1.22,0,0,0-1,.37,1.81,1.81,0,0,0-.31,1.19v2.25h-.65V152h.53l.1.59h0a1.19,1.19,0,0,1,.55-.49,1.79,1.79,0,0,1,.81-.18,1.66,1.66,0,0,1,1.16.37,1.6,1.6,0,0,1,.39,1.2v2.79Z"/><path class="cls-1" d="M205.6,155.78a1.88,1.88,0,0,0,.34,0l.25,0v.49a1.17,1.17,0,0,1-.31.09l-.37,0c-.83,0-1.24-.44-1.24-1.31v-2.55h-.61v-.31l.61-.27.27-.91h.38v1h1.24v.5h-1.24V155a.9.9,0,0,0,.18.6A.65.65,0,0,0,205.6,155.78Z"/><path class="cls-1" d="M209,156.32a1.94,1.94,0,0,1-1.5-.58,2.21,2.21,0,0,1-.55-1.6,2.5,2.5,0,0,1,.51-1.65,1.68,1.68,0,0,1,1.37-.61,1.62,1.62,0,0,1,1.27.53,2,2,0,0,1,.47,1.4v.41h-3a1.68,1.68,0,0,0,.38,1.14,1.32,1.32,0,0,0,1,.39,3.38,3.38,0,0,0,1.37-.29V156a3.28,3.28,0,0,1-1.39.28Zm-.18-3.9a1.07,1.07,0,0,0-.82.34,1.46,1.46,0,0,0-.36.93h2.23a1.44,1.44,0,0,0-.27-.94A1,1,0,0,0,208.77,152.42Z"/><path class="cls-1" d="M213.71,151.88a2.59,2.59,0,0,1,.51.05l-.09.6a2.23,2.23,0,0,0-.47-.06,1.15,1.15,0,0,0-.89.42,1.56,1.56,0,0,0-.37,1.05v2.3h-.65V152h.54l.07.79h0a1.81,1.81,0,0,1,.58-.64A1.3,1.3,0,0,1,213.71,151.88Z"/><path class="cls-1" d="M218.15,156.24v-2.77a1.15,1.15,0,0,0-.23-.78,1,1,0,0,0-.75-.26,1.22,1.22,0,0,0-1,.37,1.87,1.87,0,0,0-.31,1.19v2.25h-.65V152h.53l.11.59h0a1.22,1.22,0,0,1,.56-.49,1.74,1.74,0,0,1,.8-.18,1.66,1.66,0,0,1,1.16.37,1.6,1.6,0,0,1,.39,1.2v2.79Z"/><path class="cls-1" d="M222.08,156.32a1.94,1.94,0,0,1-1.5-.58,2.21,2.21,0,0,1-.55-1.6,2.5,2.5,0,0,1,.51-1.65,1.69,1.69,0,0,1,1.37-.61,1.61,1.61,0,0,1,1.27.53,2,2,0,0,1,.47,1.4v.41h-3a1.68,1.68,0,0,0,.38,1.14,1.32,1.32,0,0,0,1,.39,3.34,3.34,0,0,0,1.37-.29V156a3.25,3.25,0,0,1-.65.21A3.21,3.21,0,0,1,222.08,156.32Zm-.18-3.9a1.07,1.07,0,0,0-.82.34,1.46,1.46,0,0,0-.36.93H223a1.44,1.44,0,0,0-.28-.94A1,1,0,0,0,221.9,152.42Z"/><path class="cls-1" d="M226.3,155.78a1.83,1.83,0,0,0,.33,0l.26,0v.49a1.3,1.3,0,0,1-.31.09l-.37,0c-.83,0-1.25-.44-1.25-1.31v-2.55h-.61v-.31l.61-.27.28-.91h.37v1h1.24v.5h-1.24V155a.85.85,0,0,0,.19.6A.65.65,0,0,0,226.3,155.78Z"/><path class="cls-1" d="M549.45,159.07a2.39,2.39,0,0,1-.54,1.66,2,2,0,0,1-1.52.59,2.1,2.1,0,0,1-1.07-.27,1.88,1.88,0,0,1-.71-.79,2.64,2.64,0,0,1-.25-1.19,2.35,2.35,0,0,1,.54-1.64,2,2,0,0,1,1.52-.59,1.87,1.87,0,0,1,1.48.61A2.29,2.29,0,0,1,549.45,159.07Zm-3.15,0q0,1.5,1.11,1.5c.73,0,1.09-.5,1.09-1.5s-.36-1.48-1.1-1.48a1,1,0,0,0-.84.39A2,2,0,0,0,546.3,159.07Z"/><path class="cls-1" d="M552.82,156.84a2.71,2.71,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41-.05,1.18,1.18,0,0,0-.89.36,1.29,1.29,0,0,0-.34.93v2.26h-.92v-4.32h.72l.12.76h0a1.65,1.65,0,0,1,.56-.61A1.34,1.34,0,0,1,552.82,156.84Z"/><path class="cls-1" d="M554.17,155.78a.5.5,0,0,1,.13-.38.53.53,0,0,1,.39-.14.5.5,0,0,1,.37.14.51.51,0,0,1,.14.38.51.51,0,0,1-.14.37.54.54,0,0,1-.37.13.57.57,0,0,1-.39-.13A.51.51,0,0,1,554.17,155.78Zm1,5.46h-.92v-4.32h.92Z"/><path class="cls-1" d="M560.22,156.92v.5l-.74.14a1,1,0,0,1,.17.34,1.16,1.16,0,0,1,.07.42,1.33,1.33,0,0,1-.46,1.05,2,2,0,0,1-1.27.38,2.17,2.17,0,0,1-.38,0,.52.52,0,0,0-.3.43.24.24,0,0,0,.14.22,1.22,1.22,0,0,0,.51.08h.76a1.68,1.68,0,0,1,1.08.3,1.08,1.08,0,0,1,.37.88,1.27,1.27,0,0,1-.6,1.13,3.15,3.15,0,0,1-1.75.4,2.41,2.41,0,0,1-1.35-.31A1,1,0,0,1,556,162a.93.93,0,0,1,.25-.67,1.36,1.36,0,0,1,.7-.38.65.65,0,0,1-.3-.25.65.65,0,0,1-.12-.36.62.62,0,0,1,.14-.41,1.4,1.4,0,0,1,.4-.34,1.16,1.16,0,0,1-.54-.47,1.35,1.35,0,0,1-.21-.76,1.39,1.39,0,0,1,.44-1.09,1.87,1.87,0,0,1,1.27-.39l.38,0a1.3,1.3,0,0,1,.3,0Zm-3.39,5a.52.52,0,0,0,.26.46,1.46,1.46,0,0,0,.76.16,2.15,2.15,0,0,0,1.11-.22.63.63,0,0,0,.37-.57.44.44,0,0,0-.2-.4,1.62,1.62,0,0,0-.75-.11h-.69a1,1,0,0,0-.63.18A.59.59,0,0,0,556.83,161.91Zm.39-3.59a.85.85,0,0,0,.21.62.78.78,0,0,0,.6.22c.53,0,.8-.28.8-.85a1,1,0,0,0-.2-.65.9.9,0,0,0-1.2,0A.93.93,0,0,0,557.22,158.32Z"/><path class="cls-1" d="M561.11,155.78a.5.5,0,0,1,.13-.38.53.53,0,0,1,.39-.14.52.52,0,0,1,.38.14.5.5,0,0,1,.13.38.51.51,0,0,1-.13.37.56.56,0,0,1-.38.13.57.57,0,0,1-.39-.13A.51.51,0,0,1,561.11,155.78Zm1,5.46h-.92v-4.32h.92Z"/><path class="cls-1" d="M567.29,161.24h-.92v-2.66a1.17,1.17,0,0,0-.2-.74.76.76,0,0,0-.64-.25,1,1,0,0,0-.85.35,1.89,1.89,0,0,0-.27,1.15v2.15h-.92v-4.32h.72l.13.57h0a1.23,1.23,0,0,1,.55-.48,1.91,1.91,0,0,1,.8-.17,1.38,1.38,0,0,1,1.55,1.58Z"/><path class="cls-1" d="M573.55,160a1.12,1.12,0,0,1-.46,1,2.18,2.18,0,0,1-1.32.34,3.19,3.19,0,0,1-1.39-.26v-.8a3.35,3.35,0,0,0,1.42.36c.57,0,.85-.17.85-.52a.4.4,0,0,0-.09-.27,1.46,1.46,0,0,0-.31-.23l-.6-.26a2.78,2.78,0,0,1-1-.58,1,1,0,0,1-.26-.75,1,1,0,0,1,.44-.86,2.1,2.1,0,0,1,1.22-.31,3.51,3.51,0,0,1,1.44.31l-.3.69a3.2,3.2,0,0,0-1.17-.29c-.49,0-.73.14-.73.42a.4.4,0,0,0,.19.34,4.78,4.78,0,0,0,.83.39,4,4,0,0,1,.78.38,1,1,0,0,1,.35.39A1.13,1.13,0,0,1,573.55,160Z"/><path class="cls-1" d="M576.58,161.32a2.11,2.11,0,0,1-1.58-.59,2.22,2.22,0,0,1-.57-1.62,2.45,2.45,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.5,1.43v.5h-2.88a1.35,1.35,0,0,0,.34,1,1.15,1.15,0,0,0,.9.34,3.17,3.17,0,0,0,.71-.07,4,4,0,0,0,.71-.24V161a2.84,2.84,0,0,1-.68.22A3.71,3.71,0,0,1,576.58,161.32Zm-.17-3.78a.93.93,0,0,0-.7.27,1.36,1.36,0,0,0-.32.81h2a1.28,1.28,0,0,0-.26-.81A.9.9,0,0,0,576.41,157.54Z"/><path class="cls-1" d="M581.64,156.84a2.81,2.81,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41-.05,1.17,1.17,0,0,0-.89.36,1.29,1.29,0,0,0-.34.93v2.26h-.92v-4.32h.72l.12.76h0a1.74,1.74,0,0,1,.56-.61A1.35,1.35,0,0,1,581.64,156.84Z"/><path class="cls-1" d="M584.33,161.24l-1.64-4.32h1l.88,2.51a4.93,4.93,0,0,1,.27,1h0a8.14,8.14,0,0,1,.28-1l.87-2.51h1l-1.65,4.32Z"/><path class="cls-1" d="M589.59,161.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,1.79,1.79,0,0,1,1.44-.61,1.81,1.81,0,0,1,1.36.52,2,2,0,0,1,.49,1.43v.5h-2.88a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4,4,0,0,0,.71-.24V161a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,589.59,161.32Zm-.17-3.78a.94.94,0,0,0-.7.27,1.36,1.36,0,0,0-.31.81h2a1.18,1.18,0,0,0-.26-.81A.87.87,0,0,0,589.42,157.54Z"/><path class="cls-1" d="M594.66,156.84a2.81,2.81,0,0,1,.46,0l-.09.86a1.92,1.92,0,0,0-.41-.05,1.15,1.15,0,0,0-.89.36,1.29,1.29,0,0,0-.35.93v2.26h-.91v-4.32h.72l.12.76h0a1.74,1.74,0,0,1,.56-.61A1.35,1.35,0,0,1,594.66,156.84Z"/><path class="cls-1" d="M595.83,159.05a6.11,6.11,0,0,1,.3-1.94,4.78,4.78,0,0,1,.88-1.58h.8a5.84,5.84,0,0,0-.84,1.65,6.17,6.17,0,0,0-.28,1.86,6.06,6.06,0,0,0,.28,1.85,5.77,5.77,0,0,0,.83,1.62H597a4.56,4.56,0,0,1-.88-1.55A6,6,0,0,1,595.83,159.05Z"/><path class="cls-1" d="M599.86,161.24h-.92v-5.71h3.22v.79h-2.3v1.78H602v.8h-2.15Z"/><path class="cls-1" d="M605,159.05a5.93,5.93,0,0,1-.3,1.91,4.61,4.61,0,0,1-.87,1.55H603a5.65,5.65,0,0,0,.83-1.62,6.06,6.06,0,0,0,.29-1.85,6.13,6.13,0,0,0-.29-1.86,5.81,5.81,0,0,0-.83-1.65h.8a4.8,4.8,0,0,1,.87,1.59A6.05,6.05,0,0,1,605,159.05Z"/><path class="cls-1" d="M549.45,228.07a2.39,2.39,0,0,1-.54,1.66,2,2,0,0,1-1.52.59,2.1,2.1,0,0,1-1.07-.27,1.88,1.88,0,0,1-.71-.79,2.64,2.64,0,0,1-.25-1.19,2.35,2.35,0,0,1,.54-1.64,2,2,0,0,1,1.52-.59,1.87,1.87,0,0,1,1.48.61A2.29,2.29,0,0,1,549.45,228.07Zm-3.15,0q0,1.5,1.11,1.5c.73,0,1.09-.5,1.09-1.5s-.36-1.48-1.1-1.48a1,1,0,0,0-.84.39A2,2,0,0,0,546.3,228.07Z"/><path class="cls-1" d="M552.82,225.84a2.71,2.71,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41-.05,1.18,1.18,0,0,0-.89.36,1.29,1.29,0,0,0-.34.93v2.26h-.92v-4.32h.72l.12.76h0a1.65,1.65,0,0,1,.56-.61A1.34,1.34,0,0,1,552.82,225.84Z"/><path class="cls-1" d="M554.17,224.78a.5.5,0,0,1,.13-.38.53.53,0,0,1,.39-.14.5.5,0,0,1,.37.14.51.51,0,0,1,.14.38.51.51,0,0,1-.14.37.49.49,0,0,1-.37.13.53.53,0,0,1-.39-.13A.51.51,0,0,1,554.17,224.78Zm1,5.46h-.92v-4.32h.92Z"/><path class="cls-1" d="M560.22,225.92v.5l-.74.14a1,1,0,0,1,.17.34,1.16,1.16,0,0,1,.07.42,1.33,1.33,0,0,1-.46,1.05,2,2,0,0,1-1.27.38,2.17,2.17,0,0,1-.38,0,.52.52,0,0,0-.3.43.24.24,0,0,0,.14.22,1.22,1.22,0,0,0,.51.08h.76a1.68,1.68,0,0,1,1.08.3,1.08,1.08,0,0,1,.37.88,1.27,1.27,0,0,1-.6,1.13,3.15,3.15,0,0,1-1.75.4,2.41,2.41,0,0,1-1.35-.31A1,1,0,0,1,556,231a.93.93,0,0,1,.25-.67,1.36,1.36,0,0,1,.7-.38.65.65,0,0,1-.3-.25.65.65,0,0,1-.12-.36.62.62,0,0,1,.14-.41,1.4,1.4,0,0,1,.4-.34,1.16,1.16,0,0,1-.54-.47,1.35,1.35,0,0,1-.21-.76,1.39,1.39,0,0,1,.44-1.09,1.87,1.87,0,0,1,1.27-.39l.38,0a1.3,1.3,0,0,1,.3,0Zm-3.39,5a.52.52,0,0,0,.26.46,1.46,1.46,0,0,0,.76.16,2.27,2.27,0,0,0,1.11-.21.65.65,0,0,0,.37-.57.45.45,0,0,0-.2-.41,1.62,1.62,0,0,0-.75-.11h-.69a1,1,0,0,0-.63.18A.59.59,0,0,0,556.83,230.91Zm.39-3.59a.85.85,0,0,0,.21.62.78.78,0,0,0,.6.22c.53,0,.8-.28.8-.85a1,1,0,0,0-.2-.65.9.9,0,0,0-1.2,0A.93.93,0,0,0,557.22,227.32Z"/><path class="cls-1" d="M561.11,224.78a.5.5,0,0,1,.13-.38.53.53,0,0,1,.39-.14.52.52,0,0,1,.38.14.5.5,0,0,1,.13.38.51.51,0,0,1-.13.37.52.52,0,0,1-.38.13.53.53,0,0,1-.39-.13A.51.51,0,0,1,561.11,224.78Zm1,5.46h-.92v-4.32h.92Z"/><path class="cls-1" d="M567.29,230.24h-.92v-2.66a1.17,1.17,0,0,0-.2-.74.76.76,0,0,0-.64-.25,1,1,0,0,0-.85.35,1.89,1.89,0,0,0-.27,1.15v2.15h-.92v-4.32h.72l.13.57h0a1.23,1.23,0,0,1,.55-.48,1.91,1.91,0,0,1,.8-.17,1.38,1.38,0,0,1,1.55,1.58Z"/><path class="cls-1" d="M573.55,229a1.12,1.12,0,0,1-.46,1,2.18,2.18,0,0,1-1.32.34,3.19,3.19,0,0,1-1.39-.26v-.8a3.35,3.35,0,0,0,1.42.36c.57,0,.85-.17.85-.52a.42.42,0,0,0-.09-.27,1.46,1.46,0,0,0-.31-.23l-.6-.26a2.78,2.78,0,0,1-1-.58,1,1,0,0,1-.26-.75,1,1,0,0,1,.44-.86,2.1,2.1,0,0,1,1.22-.31,3.51,3.51,0,0,1,1.44.31l-.3.69a3.2,3.2,0,0,0-1.17-.29c-.49,0-.73.14-.73.42a.4.4,0,0,0,.19.34,4.11,4.11,0,0,0,.83.39,4,4,0,0,1,.78.38,1,1,0,0,1,.35.39A1.13,1.13,0,0,1,573.55,229Z"/><path class="cls-1" d="M576.58,230.32a2.11,2.11,0,0,1-1.58-.59,2.22,2.22,0,0,1-.57-1.62,2.45,2.45,0,0,1,.53-1.66,2,2,0,0,1,2.8-.09,2,2,0,0,1,.5,1.43v.5h-2.88a1.35,1.35,0,0,0,.34,1,1.15,1.15,0,0,0,.9.34,3.17,3.17,0,0,0,.71-.07,4,4,0,0,0,.71-.24V230a2.84,2.84,0,0,1-.68.22A3.71,3.71,0,0,1,576.58,230.32Zm-.17-3.78a.9.9,0,0,0-.7.28,1.31,1.31,0,0,0-.32.8h2a1.28,1.28,0,0,0-.26-.81A.9.9,0,0,0,576.41,226.54Z"/><path class="cls-1" d="M581.64,225.84a2.81,2.81,0,0,1,.46,0l-.09.86a1.84,1.84,0,0,0-.41-.05,1.17,1.17,0,0,0-.89.36,1.29,1.29,0,0,0-.34.93v2.26h-.92v-4.32h.72l.12.76h0a1.74,1.74,0,0,1,.56-.61A1.35,1.35,0,0,1,581.64,225.84Z"/><path class="cls-1" d="M584.33,230.24l-1.64-4.32h1l.88,2.51a4.93,4.93,0,0,1,.27,1h0a8.14,8.14,0,0,1,.28-1l.87-2.51h1l-1.65,4.32Z"/><path class="cls-1" d="M589.59,230.32a2.09,2.09,0,0,1-1.57-.59,2.22,2.22,0,0,1-.57-1.62,2.4,2.4,0,0,1,.53-1.66,1.79,1.79,0,0,1,1.44-.61,1.81,1.81,0,0,1,1.36.52,2,2,0,0,1,.49,1.43v.5h-2.88a1.44,1.44,0,0,0,.34,1,1.19,1.19,0,0,0,.91.34,3.23,3.23,0,0,0,.71-.07,4,4,0,0,0,.71-.24V230a3,3,0,0,1-.68.22A3.74,3.74,0,0,1,589.59,230.32Zm-.17-3.78a.91.91,0,0,0-.7.28,1.3,1.3,0,0,0-.31.8h2a1.18,1.18,0,0,0-.26-.81A.87.87,0,0,0,589.42,226.54Z"/><path class="cls-1" d="M594.66,225.84a2.81,2.81,0,0,1,.46,0l-.09.86a1.92,1.92,0,0,0-.41-.05,1.15,1.15,0,0,0-.89.36,1.29,1.29,0,0,0-.35.93v2.26h-.91v-4.32h.72l.12.76h0a1.74,1.74,0,0,1,.56-.61A1.35,1.35,0,0,1,594.66,225.84Z"/><path class="cls-1" d="M595.83,228.05a6.11,6.11,0,0,1,.3-1.94,4.78,4.78,0,0,1,.88-1.58h.8a5.84,5.84,0,0,0-.84,1.65,6.17,6.17,0,0,0-.28,1.86,6.06,6.06,0,0,0,.28,1.85,5.77,5.77,0,0,0,.83,1.62H597a4.56,4.56,0,0,1-.88-1.55A6,6,0,0,1,595.83,228.05Z"/><path class="cls-1" d="M599.86,230.24h-.92v-5.71h3.22v.79h-2.3v1.78H602v.8h-2.15Z"/><path class="cls-1" d="M605,228.05a5.93,5.93,0,0,1-.3,1.91,4.61,4.61,0,0,1-.87,1.55H603a5.65,5.65,0,0,0,.83-1.62,6.06,6.06,0,0,0,.29-1.85,6.13,6.13,0,0,0-.29-1.86,5.81,5.81,0,0,0-.83-1.65h.8a4.8,4.8,0,0,1,.87,1.59A6.05,6.05,0,0,1,605,228.05Z"/><path class="cls-1" d="M13.47,161.32a2,2,0,0,1-1.5-.58,2.25,2.25,0,0,1-.55-1.6,2.5,2.5,0,0,1,.51-1.65,1.69,1.69,0,0,1,1.37-.61,1.64,1.64,0,0,1,1.28.53,2,2,0,0,1,.46,1.4v.41H12.09a1.68,1.68,0,0,0,.39,1.14,1.31,1.31,0,0,0,1,.39,3.34,3.34,0,0,0,1.37-.29V161a3.25,3.25,0,0,1-.65.21A3.21,3.21,0,0,1,13.47,161.32Zm-.18-3.9a1.08,1.08,0,0,0-.82.34,1.58,1.58,0,0,0-.36.93h2.24a1.44,1.44,0,0,0-.27-.94A1,1,0,0,0,13.29,157.42Z"/><path class="cls-1" d="M17.38,159.05,15.89,157h.73l1.13,1.64L18.88,157h.73l-1.49,2.09,1.57,2.19H19l-1.2-1.73-1.21,1.73h-.73Z"/><path class="cls-1" d="M23.31,161.24l-.13-.61h0a1.85,1.85,0,0,1-.64.55,2,2,0,0,1-.79.14,1.42,1.42,0,0,1-1-.33,1.2,1.2,0,0,1-.36-.93c0-.87.69-1.32,2.07-1.36l.73,0v-.26a1.07,1.07,0,0,0-.22-.75.87.87,0,0,0-.69-.24,2.8,2.8,0,0,0-1.21.33l-.2-.49a2.61,2.61,0,0,1,.69-.27,2.84,2.84,0,0,1,.76-.1,1.59,1.59,0,0,1,1.13.34,1.41,1.41,0,0,1,.37,1.09v2.92Zm-1.46-.46a1.32,1.32,0,0,0,.95-.33,1.22,1.22,0,0,0,.34-.93v-.38l-.65,0a2.41,2.41,0,0,0-1.11.24.72.72,0,0,0-.34.66.67.67,0,0,0,.21.54A.9.9,0,0,0,21.85,160.78Z"/><path class="cls-1" d="M30.7,161.24v-2.78a1.12,1.12,0,0,0-.22-.77.84.84,0,0,0-.68-.26,1.1,1.1,0,0,0-.89.35,1.67,1.67,0,0,0-.29,1.07v2.39H28v-2.78a1.12,1.12,0,0,0-.22-.77.84.84,0,0,0-.68-.26,1,1,0,0,0-.89.37,1.94,1.94,0,0,0-.29,1.19v2.25h-.65V157h.53l.11.59h0a1.18,1.18,0,0,1,.52-.49,1.53,1.53,0,0,1,.74-.18,1.28,1.28,0,0,1,1.32.73h0a1.34,1.34,0,0,1,.55-.53,1.73,1.73,0,0,1,.83-.2,1.5,1.5,0,0,1,1.09.37,1.69,1.69,0,0,1,.36,1.2v2.79Z"/><path class="cls-1" d="M34.79,161.32a1.76,1.76,0,0,1-.76-.16,1.46,1.46,0,0,1-.58-.47H33.4a4.47,4.47,0,0,1,.05.71v1.76H32.8V157h.53l.09.59h0A1.46,1.46,0,0,1,34,157a1.7,1.7,0,0,1,.76-.16,1.61,1.61,0,0,1,1.32.58,2.58,2.58,0,0,1,.46,1.64,2.47,2.47,0,0,1-.47,1.63A1.59,1.59,0,0,1,34.79,161.32Zm-.09-3.89a1.13,1.13,0,0,0-1,.37,1.91,1.91,0,0,0-.3,1.15v.15a2.15,2.15,0,0,0,.3,1.29,1.14,1.14,0,0,0,1,.39,1,1,0,0,0,.87-.45,2.23,2.23,0,0,0,.31-1.24,2.12,2.12,0,0,0-.31-1.23A1,1,0,0,0,34.7,157.43Z"/><path class="cls-1" d="M38.49,161.24h-.65v-6.08h.65Z"/><path class="cls-1" d="M41.8,161.32a1.93,1.93,0,0,1-1.49-.58,2.21,2.21,0,0,1-.55-1.6,2.5,2.5,0,0,1,.51-1.65,1.68,1.68,0,0,1,1.37-.61,1.62,1.62,0,0,1,1.27.53,2,2,0,0,1,.47,1.4v.41h-3a1.68,1.68,0,0,0,.38,1.14,1.32,1.32,0,0,0,1,.39,3.3,3.3,0,0,0,1.36-.29V161a2.89,2.89,0,0,1-.65.21A3.15,3.15,0,0,1,41.8,161.32Zm-.17-3.9a1.05,1.05,0,0,0-.82.34,1.52,1.52,0,0,0-.37.93h2.24a1.44,1.44,0,0,0-.27-.94A1,1,0,0,0,41.63,157.42Z"/><path class="cls-1" d="M44.46,160.83a.58.58,0,0,1,.12-.4.44.44,0,0,1,.34-.13.48.48,0,0,1,.36.13.58.58,0,0,1,.12.4.57.57,0,0,1-.12.39.54.54,0,0,1-.69,0A.56.56,0,0,1,44.46,160.83Z"/><path class="cls-1" d="M48.44,161.32a1.83,1.83,0,0,1-1.44-.57,2.35,2.35,0,0,1-.51-1.62,2.44,2.44,0,0,1,.51-1.66,1.88,1.88,0,0,1,1.48-.59,2.68,2.68,0,0,1,.62.07,2,2,0,0,1,.48.15l-.2.55a4.41,4.41,0,0,0-.47-.14,1.93,1.93,0,0,0-.45,0c-.87,0-1.3.55-1.3,1.66a1.92,1.92,0,0,0,.32,1.21,1.1,1.1,0,0,0,.94.42,2.79,2.79,0,0,0,1.1-.23v.58A2.47,2.47,0,0,1,48.44,161.32Z"/><path class="cls-1" d="M54.29,159.1a2.37,2.37,0,0,1-.53,1.63,1.87,1.87,0,0,1-1.46.59,1.94,1.94,0,0,1-1-.27,1.82,1.82,0,0,1-.68-.77,2.73,2.73,0,0,1-.25-1.18,2.33,2.33,0,0,1,.53-1.63,1.85,1.85,0,0,1,1.45-.59,1.81,1.81,0,0,1,1.43.6A2.38,2.38,0,0,1,54.29,159.1Zm-3.26,0a2.12,2.12,0,0,0,.32,1.25,1.31,1.31,0,0,0,1.94,0,2,2,0,0,0,.33-1.25,2,2,0,0,0-.33-1.24,1.32,1.32,0,0,0-1.94,0A2,2,0,0,0,51,159.1Z"/><path class="cls-1" d="M61,161.24v-2.78a1.12,1.12,0,0,0-.22-.77.85.85,0,0,0-.68-.26,1.1,1.1,0,0,0-.89.35,1.61,1.61,0,0,0-.29,1.07v2.39h-.65v-2.78a1.12,1.12,0,0,0-.22-.77.85.85,0,0,0-.68-.26,1.06,1.06,0,0,0-.9.37A2,2,0,0,0,56.2,159v2.25h-.65V157h.53l.1.59h0a1.21,1.21,0,0,1,.51-.49,1.6,1.6,0,0,1,.75-.18,1.26,1.26,0,0,1,1.31.73h0a1.28,1.28,0,0,1,.55-.53,1.73,1.73,0,0,1,.83-.2,1.51,1.51,0,0,1,1.09.37,1.69,1.69,0,0,1,.36,1.2v2.79Z"/><path class="cls-1" d="M13.47,258.32a2,2,0,0,1-1.5-.58,2.25,2.25,0,0,1-.55-1.6,2.5,2.5,0,0,1,.51-1.65,1.69,1.69,0,0,1,1.37-.61,1.61,1.61,0,0,1,1.27.53,2,2,0,0,1,.47,1.4v.41H12.09a1.73,1.73,0,0,0,.38,1.14,1.33,1.33,0,0,0,1,.39,3.34,3.34,0,0,0,1.37-.29V258a3.25,3.25,0,0,1-.65.21A3.21,3.21,0,0,1,13.47,258.32Zm-.18-3.9a1.08,1.08,0,0,0-.82.34,1.58,1.58,0,0,0-.36.93h2.24a1.39,1.39,0,0,0-.28-.94A1,1,0,0,0,13.29,254.42Z"/><path class="cls-1" d="M17.37,256.05,15.89,254h.73l1.13,1.64L18.88,254h.73l-1.49,2.09,1.57,2.19H19l-1.2-1.73-1.21,1.73h-.73Z"/><path class="cls-1" d="M23.31,258.24l-.13-.61h0a1.85,1.85,0,0,1-.64.55,2,2,0,0,1-.79.14,1.42,1.42,0,0,1-1-.33,1.2,1.2,0,0,1-.36-.93c0-.87.69-1.32,2.07-1.36l.73,0v-.26a1,1,0,0,0-.22-.74.84.84,0,0,0-.69-.25,2.8,2.8,0,0,0-1.21.33l-.2-.49a2.61,2.61,0,0,1,.69-.27,2.78,2.78,0,0,1,.76-.1,1.59,1.59,0,0,1,1.13.34,1.41,1.41,0,0,1,.37,1.09v2.92Zm-1.46-.46a1.32,1.32,0,0,0,.95-.33,1.22,1.22,0,0,0,.34-.93v-.38l-.65,0a2.41,2.41,0,0,0-1.11.24.73.73,0,0,0-.34.67.66.66,0,0,0,.21.53A.9.9,0,0,0,21.85,257.78Z"/><path class="cls-1" d="M30.7,258.24v-2.78a1.12,1.12,0,0,0-.22-.77.84.84,0,0,0-.68-.26,1.1,1.1,0,0,0-.89.35,1.61,1.61,0,0,0-.29,1.07v2.39H28v-2.78a1.12,1.12,0,0,0-.22-.77.84.84,0,0,0-.68-.26,1,1,0,0,0-.89.37,2,2,0,0,0-.29,1.2v2.24h-.65V254h.53l.11.59h0a1.18,1.18,0,0,1,.52-.49,1.53,1.53,0,0,1,.74-.18,1.28,1.28,0,0,1,1.32.73h0a1.28,1.28,0,0,1,.55-.53,1.73,1.73,0,0,1,.83-.2,1.5,1.5,0,0,1,1.09.37,1.69,1.69,0,0,1,.36,1.2v2.79Z"/><path class="cls-1" d="M34.79,258.32a1.91,1.91,0,0,1-.76-.15,1.58,1.58,0,0,1-.58-.48H33.4a6.07,6.07,0,0,1,.05.71v1.76H32.8V254h.53l.09.59h0A1.46,1.46,0,0,1,34,254a1.7,1.7,0,0,1,.76-.16,1.61,1.61,0,0,1,1.32.58,2.58,2.58,0,0,1,.46,1.64,2.52,2.52,0,0,1-.47,1.64A1.61,1.61,0,0,1,34.79,258.32Zm-.09-3.89a1.13,1.13,0,0,0-1,.37,1.91,1.91,0,0,0-.3,1.15v.15a2.15,2.15,0,0,0,.3,1.29,1.14,1.14,0,0,0,1,.39,1,1,0,0,0,.86-.45,2.15,2.15,0,0,0,.32-1.24,2,2,0,0,0-.32-1.23A1,1,0,0,0,34.7,254.43Z"/><path class="cls-1" d="M38.49,258.24h-.65v-6.08h.65Z"/><path class="cls-1" d="M41.8,258.32a1.93,1.93,0,0,1-1.49-.58,2.21,2.21,0,0,1-.55-1.6,2.5,2.5,0,0,1,.51-1.65,1.68,1.68,0,0,1,1.37-.61,1.62,1.62,0,0,1,1.27.53,2,2,0,0,1,.47,1.4v.41h-3a1.68,1.68,0,0,0,.38,1.14,1.32,1.32,0,0,0,1,.39,3.3,3.3,0,0,0,1.36-.29V258a3.06,3.06,0,0,1-.65.21A3.15,3.15,0,0,1,41.8,258.32Zm-.17-3.9a1.05,1.05,0,0,0-.82.34,1.52,1.52,0,0,0-.37.93h2.24a1.44,1.44,0,0,0-.27-.94A1,1,0,0,0,41.63,254.42Z"/><path class="cls-1" d="M44.46,257.83a.58.58,0,0,1,.12-.4.42.42,0,0,1,.34-.13.48.48,0,0,1,.36.13.58.58,0,0,1,.12.4.53.53,0,0,1-.13.39.45.45,0,0,1-.35.13.48.48,0,0,1-.33-.12A.56.56,0,0,1,44.46,257.83Z"/><path class="cls-1" d="M48.43,258.32a1.81,1.81,0,0,1-1.43-.57,2.35,2.35,0,0,1-.51-1.62,2.44,2.44,0,0,1,.51-1.66,1.88,1.88,0,0,1,1.48-.59,2.54,2.54,0,0,1,.61.07,1.91,1.91,0,0,1,.49.15l-.2.56a2.88,2.88,0,0,0-.47-.15,1.93,1.93,0,0,0-.45,0c-.87,0-1.3.55-1.3,1.66a1.92,1.92,0,0,0,.32,1.21,1.1,1.1,0,0,0,.94.42,2.79,2.79,0,0,0,1.1-.23v.58A2.35,2.35,0,0,1,48.43,258.32Z"/><path class="cls-1" d="M54.29,256.1a2.37,2.37,0,0,1-.53,1.63,1.87,1.87,0,0,1-1.46.59,1.94,1.94,0,0,1-1-.27,1.82,1.82,0,0,1-.68-.77,2.59,2.59,0,0,1-.25-1.18,2.33,2.33,0,0,1,.53-1.63,1.85,1.85,0,0,1,1.45-.59,1.81,1.81,0,0,1,1.43.6A2.38,2.38,0,0,1,54.29,256.1Zm-3.26,0a2.12,2.12,0,0,0,.32,1.25,1.16,1.16,0,0,0,1,.43,1.17,1.17,0,0,0,1-.43,2,2,0,0,0,.33-1.25,2,2,0,0,0-.33-1.24,1.32,1.32,0,0,0-1.94,0A2,2,0,0,0,51,256.1Z"/><path class="cls-1" d="M61,258.24v-2.78a1.12,1.12,0,0,0-.22-.77.85.85,0,0,0-.68-.26,1.13,1.13,0,0,0-.9.35,1.67,1.67,0,0,0-.28,1.07v2.39h-.65v-2.78a1.12,1.12,0,0,0-.22-.77.85.85,0,0,0-.68-.26,1.06,1.06,0,0,0-.9.37,2,2,0,0,0-.28,1.2v2.24h-.65V254h.53l.1.59h0a1.29,1.29,0,0,1,.52-.49,1.6,1.6,0,0,1,.75-.18,1.26,1.26,0,0,1,1.31.73h0a1.36,1.36,0,0,1,.56-.53,1.73,1.73,0,0,1,.83-.2,1.47,1.47,0,0,1,1.08.37,1.64,1.64,0,0,1,.37,1.2v2.79Z"/></svg>
\ No newline at end of file
index 6456621fd5138ec1f33583c26a94bcb8b1caa4b2..d29c3c4352f161c43fcae5affe933ab2f4c4883f 100644 (file)
@@ -4,11 +4,13 @@ namespace app\controllers;
 use app\core\Application;
 use app\core\BaseController;
 use app\core\Request;
+use app\core\Response;
 use app\models\LoginForm;
 use app\models\User;
 
 class AuthController extends BaseController{
     public function login(Request $req) {
+        Application::$app->router->title = "WeebSite - Login";
         $loginForm = new LoginForm;
 
         if ($req->getMethod() == "post"){
@@ -24,6 +26,7 @@ class AuthController extends BaseController{
     }
 
     public function register(Request $req) {
+        Application::$app->router->title = "WeebSite - Sign up";
         $registerModel = new User;
 
         if ($req->getMethod() == "post") {
@@ -35,4 +38,9 @@ class AuthController extends BaseController{
         }
         return $this->render("register", [ "model" => $registerModel ]);
     }
+
+    public function logout(Request $req, Response $res) {
+        Application::$app->logout();
+        $res->redirect("/");
+    }
 }
index cbf3fe1f8875a954d8ba6d169bc0341684940ea8..d08b973718ad6cfd9bb71a2c90100963c8a81c6d 100644 (file)
@@ -9,21 +9,22 @@ use app\models\Vtubers;
 
 class SiteController extends BaseController
 {
-    public function home()
+    public function list()
     {
-        $params = [
-            "name" => "Leonardo"
-        ];
-
-        return $this->render("home", $params);
+        Application::$app->router->title = "WeebSite - Your top vtubers";
+        $this->setLayout("list");
+        return $this->render("list");
     }
 
     public function live(Request $req)
     {
         $params = [];
-        $statement = Application::$app->db->pdo->prepare("SELECT * FROM vtubers;");
+        $singleVtuber = false;
         $vtuberModel = new Vtubers;
 
+        Application::$app->router->title = "WeebSite - Live";
+        $statement = Application::$app->db->pdo->prepare("SELECT * FROM vtubers;");
+
         if ($req->getMethod() == "post") {
             $vtuberModel->loadData($req->getBody());
             $vtuberModel->getVtuberInfo();
@@ -33,6 +34,7 @@ class SiteController extends BaseController
             }
         } else if ($req->getMethod() == "get") {
             if (isset($_GET["id"])) {
+                $singleVtuber = true;
                 $this->setLayout("live");
                 $statement = Application::$app->db->pdo->prepare("SELECT * from vtubers where id={$_GET['id']}");
             }
@@ -40,6 +42,9 @@ class SiteController extends BaseController
 
             foreach ($statement->fetchAll() as $vtuber) {
                 $params[] = [ $vtuber, $vtuberModel->isLive($vtuber["login"], $vtuber["link"]) ];
+                if ($singleVtuber) {
+                    Application::$app->router->title = "WeebSite - ".$vtuber["username"];
+                }
             }
         }
 
index 7922f6df575f243e76a5f3cb2aec5803d1e01c1e..8929f72aca3a3d82e6ef7044c6357c5bab6b1907 100644 (file)
@@ -2,8 +2,9 @@
 namespace app\core;
 
 class Application {
-    private BaseController $controller;
+    private ?BaseController $controller = null;
 
+    public string $layout = "main";
     public $userClass;
     public array $config;
     public Router $router;
@@ -11,7 +12,7 @@ class Application {
     public Response $res;
     public Database $db;
     public Session $session;
-    public ?DbModel $user = null;
+    public ?DbModel $user;
 
     public static Application $app;
     public static string $ROOT_DIR;
@@ -33,6 +34,8 @@ class Application {
         if ($primaryValue) {
             $primaryKey = $this->userClass::primaryKey();
             $this->user = $this->userClass::findOne([$primaryKey => $primaryValue]);
+        } else {
+            $this->user = null;
         }
     }
 
@@ -62,5 +65,9 @@ class Application {
         $this->user = null;
         $this->session->remove("user");
     }
+
+    public static function isGuest() {
+        return !self::$app->user;
+    }
 }
 ?>
index d4932363c316b3e2c0b024ebdf46de8f01936591..89ef169454b8e53ed3c8a962c7cad0a17814ae64 100644 (file)
@@ -6,6 +6,7 @@ class Router
 {
     private array $routes = [];
 
+    public string $title;
     public Request $req;
     public Response $res;
 
@@ -40,7 +41,7 @@ class Router
             Application::$app->setController(new $callback[0]);
             $callback[0] = Application::$app->getController();
 
-            return call_user_func($callback, $this->req);
+            return call_user_func($callback, $this->req, $this->res);
         } else {
             $this->res->setStatusCode(404);
             return $this->renderView("404");
@@ -57,7 +58,10 @@ class Router
 
     private function loadLayoutContent()
     {
-        $layout = Application::$app->getController()->layout;
+        $layout = Application::$app->layout;
+        if (Application::$app->getController()) {
+            $layout = Application::$app->getController()->layout;
+        }
         ob_start();
         include_once Application::$ROOT_DIR . "/views/layouts/$layout.php";
         return ob_get_clean();
index ccaa464107c3f301fdda64dc04361cb4b8d29136..8beb6d3ab4db0cb071148c48610abe833269f738 100644 (file)
@@ -4,7 +4,6 @@ namespace app\models;
 
 use app\core\Application;
 use app\core\DbModel;
-use DOMDocument;
 use Google_Client;
 use Google_Service_YouTube;
 
similarity index 100%
rename from www/pub/css/index.css
rename to www/pub/css/live.css
diff --git a/www/pub/css/main.css b/www/pub/css/main.css
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/www/pub/img/XtPIXR8.png b/www/pub/img/XtPIXR8.png
new file mode 100644 (file)
index 0000000..141958a
Binary files /dev/null and b/www/pub/img/XtPIXR8.png differ
index ca1a395541d6dbce8caeefaae61b7531934bf915..91568a2e7906663b2923de6934178f27f375159e 100644 (file)
@@ -25,10 +25,11 @@ $config = [
 
 $app = new Application(dirname(__DIR__), $config);
 
-$app->router->get("/", [SiteController::class, "home"]);
+$app->router->get("/", [SiteController::class, "live"]);
+$app->router->post("/", [SiteController::class, "live"]);
 
-$app->router->get("/live", [SiteController::class, "live"]);
-$app->router->post("/live", [SiteController::class, "live"]);
+$app->router->get("/list", [SiteController::class, "list"]);
+$app->router->post("/list", [SiteController::class, "list"]);
 
 # User authentication
 $app->router->get("/login", [AuthController::class, "login"]);
@@ -37,4 +38,6 @@ $app->router->post("/login", [AuthController::class, "login"]);
 $app->router->get("/register", [AuthController::class, "register"]);
 $app->router->post("/register", [AuthController::class, "register"]);
 
+$app->router->get("/logout", [AuthController::class, "logout"]);
+
 $app->run();
diff --git a/www/updateVtuberPfp.php b/www/updateVtuberPfp.php
new file mode 100644 (file)
index 0000000..b988ba2
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+
+use app\core\Application;
+
+require_once __DIR__ . "/vendor/autoload.php";
+$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
+$dotenv->load();
+
+use Google_Client;
+use Google_Service_YouTube;
+
+$config = [
+    "db" => [
+        "dsn" => $_ENV["DB_DSN"],
+        "user" => $_ENV["DB_USER"],
+        "password" => $_ENV["DB_PASSWORD"]
+    ],
+    "twitch" => [
+        "clientid" => $_ENV["TWITCH_CLIENTID"],
+        "token" => $_ENV["TWITCH_TOKEN"]
+    ],
+    "yt" => [
+        "key" => $_ENV["GOOGLE_API_KEY"]
+    ],
+    "userClass" => null
+];
+
+$app = new Application(__DIR__, $config);
+
+$stmt = $app->db->pdo->prepare("select id, link, login from vtubers");
+$stmt->execute();
+$data = $stmt->fetchAll();
+
+foreach ($data as $vtuber) {
+    $link = $vtuber["link"];
+    $login = $vtuber["login"];
+
+    if (str_contains($link, "twitch.tv")) {
+        $clientID = Application::$app->config["twitch"]["clientid"] ?? "";
+        $token = Application::$app->config["twitch"]["token"] ?? "";
+
+        $url = "https://api.twitch.tv/helix/users?login=" . $vtuber["login"];
+
+        $ch = curl_init($url);
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, array("Client-ID: $clientID", "Authorization: Bearer $token"));
+
+        $result = get_object_vars(json_decode(curl_exec($ch)));
+        curl_close($ch);
+
+        $result = get_object_vars($result["data"][0]);
+
+        $img = rtrim($result["profile_image_url"], "/ ");
+    }
+
+    if (str_contains($link, "youtube.com")) {
+        $client = new Google_Client();
+        $client->setDeveloperKey(Application::$app->config["yt"]["key"]);
+        $service = new Google_Service_YouTube($client);
+
+        $response = get_object_vars($service->channels->listChannels('snippet', ["id" => $vtuber["login"]]));
+        $img = $response["items"][0]["snippet"]["thumbnails"]["default"]["url"];
+    }
+
+    if (!is_null($img)) {
+        $stmt = $app->db->pdo->prepare("update vtubers set img='" . $img . "' where id=" . $vtuber["id"]);
+        $stmt->execute();
+    }
+}
diff --git a/www/views/layouts/list.php b/www/views/layouts/list.php
new file mode 100644 (file)
index 0000000..26b9e6b
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+use app\core\Application;
+?>
+
+<!doctype html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8" />
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
+    <link rel="stylesheet" href="/css/main.css" type="text/css" media="screen" />
+
+    <title>Document</title>
+</head>
+
+<body>
+    <nav class="navbar navbar-expand-lg navbar-light bg-light">
+        <div class="container-fluid">
+            <a class="navbar-brand" href="/">
+                <img src="/img/XtPIXR8.png" alt="" width="80" height="auto">
+            </a>
+            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <div class="collapse navbar-collapse" id="navbarNav" style="display: flex;">
+
+                <ul class="navbar-nav" style="margin-right: 0px; margin-left: auto;">
+                    <div class="btn-group" role="group" aria-label="Basic outlined example">
+                        <li class="nav-item btn btn-outline-primary">
+                            <a class="nav-link" href="/list">Favorites</a>
+                        </li>
+                        <li class="nav-item btn btn-outline-primary">
+                            <a class="nav-link" href="/logout">Logout</a>
+                        </li>
+                    </div>
+                </ul>
+            </div>
+        </div>
+    </nav>
+
+
+    <div class="container">
+        <table class="table">
+            <thead>
+                <tr>
+                    <th scope="col">Icon</th>
+                    <th scope="col">Username</th>
+                    <th scope="col"></th>
+                    <th scope="col"></th>
+                </tr>
+            </thead>
+            <tbody class="table-group-divider">
+                {{content}}
+            </tbody>
+        </table>
+    </div>
+
+</body>
+<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.5/dist/umd/popper.min.js" integrity="sha384-Xe+8cL9oJa6tN/veChSP7q+mnSPaj5Bcu9mPX5F5xIGE0DVittaqT5lorf0EI7Vk" crossorigin="anonymous"></script>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-kjU+l4N0Yf4ZOJErLsIcvOU2qSb74wXpOhqTvwVx3OElZRweTnQ6d31fXEoRD1Jy" crossorigin="anonymous"></script>
+
+</html>
index 402b17ea6381967acdf3118365cba530f2bcecfe..725a07937bd6531442c4760624425fd5e7291f71 100644 (file)
@@ -3,8 +3,8 @@
 <head>
     <meta charset="UTF-8"/>
     <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
-    <link rel="stylesheet" href="/css/index.css" type="text/css" media="screen" />
-    <title>WeebSite - Live!</title>
+    <link rel="stylesheet" href="/css/live.css" type="text/css" media="screen" />
+    <title><?= $this->title ?></title>
 </head>
 
 <body>
index 00a44c8d6d63c4d617cb70aee7e49a8fc880dc0b..a4a71f849614209be5d046cff1f16d2081f3002a 100644 (file)
@@ -1,10 +1,6 @@
 <?php
 
 use app\core\Application;
-
-echo " <pre>";
-var_dump(Application::$app->user);
-echo "</pre>";
 ?>
 
 <!doctype html>
@@ -12,33 +8,50 @@ echo "</pre>";
 
 <head>
     <meta charset="UTF-8" />
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
+    <link rel="stylesheet" href="/css/main.css" type="text/css" media="screen" />
 
-    <title>Document</title>
+    <title><?= $this->title ?></title>
 </head>
 
 <body>
     <nav class="navbar navbar-expand-lg navbar-light bg-light">
         <div class="container-fluid">
-            <a class="navbar-brand" href="/">Navbar</a>
+            <a class="navbar-brand" href="/">
+                <img src="/img/XtPIXR8.png" alt="" width="80" height="auto">
+            </a>
             <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
                 <span class="navbar-toggler-icon"></span>
             </button>
             <div class="collapse navbar-collapse" id="navbarNav" style="display: flex;">
-                <ul class="navbar-nav">
-                    <li class="nav-item">
-                        <a class="nav-link" href="/live">Live</a>
-                    </li>
-                </ul>
-
-                <ul class="navbar-nav" style="margin-right: 0px; margin-left: auto;">
-                    <li class="nav-item">
-                        <a class="nav-link" href="/login">Login</a>
-                    </li>
-                    <li class="nav-item">
-                        <a class="nav-link" href="/register">Register</a>
-                    </li>
-                </ul>
+
+                <?php if (Application::isGuest()) : ?>
+                    <ul class="navbar-nav" style="margin-right: 0px; margin-left: auto;">
+                        <li class="nav-item">
+                            <a class="nav-link" href="/login">Login</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" href="/register">Register</a>
+                        </li>
+                    </ul>
+                <?php else : ?>
+                    <ul class="navbar-nav" style="margin-right: 0px; margin-left: auto;">
+                        <div class="btn-group" role="group" aria-label="Basic outlined example">
+                            <?php if (!Application::isGuest()) {
+                                echo "<li class='nav-item btn btn-outline-primary'>";
+                                echo "<a class='nav-link' data-bs-toggle='modal' data-bs-target='#exampleModal' href=''>Add vtuber to the list</a>";
+                                echo "</li>";
+                            }
+                            ?>
+                            <li class="nav-item btn btn-outline-primary">
+                                <a class="nav-link" href="/list">Favorites</a>
+                            </li>
+                            <li class="nav-item btn btn-outline-primary">
+                                <a class="nav-link" href="/logout">Logout</a>
+                            </li>
+                        </div>
+                    </ul>
+                <?php endif; ?>
             </div>
         </div>
     </nav>
@@ -47,7 +60,8 @@ echo "</pre>";
         {{content}}
     </div>
 
-    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
 </body>
+<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.5/dist/umd/popper.min.js" integrity="sha384-Xe+8cL9oJa6tN/veChSP7q+mnSPaj5Bcu9mPX5F5xIGE0DVittaqT5lorf0EI7Vk" crossorigin="anonymous"></script>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-kjU+l4N0Yf4ZOJErLsIcvOU2qSb74wXpOhqTvwVx3OElZRweTnQ6d31fXEoRD1Jy" crossorigin="anonymous"></script>
 
 </html>
diff --git a/www/views/list.php b/www/views/list.php
new file mode 100644 (file)
index 0000000..30b09ce
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+
+use app\core\Application;
+
+if (!Application::isGuest()) :
+?>
+
+
+<?php
+else:
+    Application::$app->res->redirect("/");
+
+endif; ?>
index 5dc4ebf3e2f7464be2c836b0e3084815db89f48f..ca90ac31d783143135a704af7e4c8b98629bfbda 100644 (file)
@@ -1,16 +1,19 @@
 <?php
+
+use app\core\Application;
+
 if (isset($_GET["aggiungi"])) {
     $model->addToFav();
     exit;
 }
 
-if (!isset($_GET["id"])) {
+if (count($model->errors) > 0) {
+    echo "<pre>";
+    var_dump($model->errors);
+    echo "</pre>";
+} else if (!isset($_GET["id"])) {
     echo "<h1>Live page</h1>";
-
 ?>
-
-    <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">Add vtuber to the list</button>
-
     <!-- Modal -->
     <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
         <div class="modal-dialog">
@@ -36,10 +39,11 @@ if (!isset($_GET["id"])) {
 
     <?php
     echo "<h2>Currently live</h2>";
-    echo "<ul>";
+    echo "<ul class='list-group list-group-flush'>";
     foreach ($params[0] as $idol) {
-        if (gettype($idol[1]) == "string")
-            echo "<li><a href='/live?id=" . $idol[0]["id"] . "'>" . ucfirst($idol[0]["username"]) . "</a></li>";
+        if (gettype($idol[1]) == "string") {
+            echo "<li class='list-group-item'><span class='badge bg-danger'>Live</span> <a href='/?id=" . $idol[0]["id"] . "'>" . ucfirst($idol[0]["username"]) . "</a></li>";
+        }
     }
     echo "</ul>";
 
@@ -47,7 +51,7 @@ if (!isset($_GET["id"])) {
     echo "<ul>";
     foreach ($params[0] as $idol) {
         if (gettype($idol[1]) == "array")
-            echo "<li><a href='/live?id=" . $idol[0]["id"] . "'>" . ucfirst($idol[0]["username"]) . "</a></li>";
+            echo "<li><a href='/?id=" . $idol[0]["id"] . "'>" . ucfirst($idol[0]["username"]) . "</a></li>";
     }
     echo "</ul>";
 } else {
@@ -60,10 +64,9 @@ if (!isset($_GET["id"])) {
         <div class=\"container-fluid\">
                 <h1>" . ucfirst($vtuber[0]["username"]) . "</h1>";
 
-            # TODO: controllo con session se l'utente è loggato
-            // echo "<button id='add' class='btn btn-primary' name='add'>Add to favorites</button>";
-            echo "<button id='add'>Add to favorites</button>";
-            # -------------------------------------------------
+            if (!Application::isGuest()) {
+                echo "<button id='add' type='button' class='btn btn-outline-light'>Add to favorites</button>";
+            }
 
             echo "<img class=\"idolLogo\" src=\"" . $vtuber[0]["img"] . "\"/>
         </div>
@@ -76,7 +79,7 @@ if (!isset($_GET["id"])) {
             if (str_contains($vtuber[0]["link"], "twitch.tv")) {
                 echo "<iframe src=\"https://player.twitch.tv/?channel=" . $vtuber[0]["login"] . "&parent=localhost\" frameborder=\"0\" allowfullscreen=\"true\" scrolling=\"no\"></iframe>";
             } else {
-                echo "<iframe src=\"".str_replace("watch?v=", "embed/", $vtuber[1])."\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>";
+                echo "<iframe src=\"" . str_replace("watch?v=", "embed/", $vtuber[1]) . "\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>";
             }
     ?>
             </div>
@@ -85,7 +88,7 @@ if (!isset($_GET["id"])) {
                 document.getElementById('add').onclick = function() {
                     let req = new XMLHttpRequest();
 
-                    req.open("get", "/live?aggiungi=1&id="+ <?php echo $_GET["id"] ?>, true);
+                    req.open("get", "/?aggiungi=1&id=" + <?php echo $_GET["id"] ?>, true);
                     req.send();
                 };
             </script>
index 4d5d6ba552c8d0a9311f0035fef67fe9870c509d..54e20f28f604ca216489271179832fb28d133549 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 use app\core\Application;
 
 require_once __DIR__ . "/vendor/autoload.php";
@@ -25,12 +24,12 @@ $config = [
 $app = new Application(__DIR__, $config);
 
 while (true) {
-    $stmt = $app->db->pdo->prepare("select id, link, login from vtubers");
+    $stmt = $app->db->pdo->prepare("select * from vtubers");
     $stmt->execute();
     $data = $stmt->fetchAll();
-    $isLive = false;
 
     foreach ($data as $vtuber) {
+        $isLive = false;
         $link = $vtuber["link"];
         $login = $vtuber["login"];
 
@@ -49,7 +48,7 @@ while (true) {
             curl_close($ch);
 
             if (count($result["data"])) {
-                echo $login."\n";
+                echo "{$vtuber["username"]}\n";
                 $stmt = $app->db->pdo->prepare("update vtubers set live='twitch.tv/$login' where id=" . $vtuber["id"]);
                 $stmt->execute();
                 $isLive = true;
@@ -76,7 +75,7 @@ while (true) {
             for ($i = 0; $i < $length; $i++) {
                 $tag = $result->item($i)->getAttribute("href");
                 if (str_contains($tag, "https://www.youtube.com/watch?v=")) {
-                    echo $tag."\n";
+                    echo "{$vtuber["username"]} - $tag\n";
                     $stmt = $app->db->pdo->prepare("update vtubers set live='$tag' where id=" . $vtuber["id"]);
                     $stmt->execute();
                     $isLive = true;