diff --git a/README.md b/README.md new file mode 100644 index 0000000..9380796 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Appunti per laurea in Informatica diff --git a/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/esercizi-sul-capitolo-1.html b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/esercizi-sul-capitolo-1.html new file mode 100644 index 0000000..dc3d7ad --- /dev/null +++ b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/esercizi-sul-capitolo-1.html @@ -0,0 +1 @@ +Esercizi sul capitolo 1
Esercizi sul capitolo 1

Esercizio 1
...

Pasted image 20230918123347.png

  • Il throughput è il minimo tra le velocità dei collegamenti: 200 kbps
  • Se il throughput è di 200 kbps, significa che vengono trasferiti, ogni secondo 200 mila (kilo) bit
    • Il file da trasferire è di 4 milioni di byte, il che vuol dire che è in bit sono milioni di bit;
    • Ricordiamo che bps sono bit per secondo, e che è equivalente a dire
    • Dunque, il file viene trasferito in:
    • La semplificazione delle unità di misura è la seguente:

Esercizio 1.2
...

Pasted image 20230918160954.png
Vogliamo trovare
Il file ha dimensioni pari a 9500 byte.
Un pacchetto ha dimensione massima di 1500 byte.
Il numero di pacchetti che dobbiamo creare dato il file è di
Quindi abbiamo 7 pacchetti totali:

  • 6 di 1500 byte
  • 1 di 333 byte, per semplicità supponiamo che questo sia di 500 byte.

I 6 pacchetti, in bit: bit
L'ultimo pacchetto, in bit:
In totale i bit sono: .

La velocità di trasmissione è di 1 Mbps = 1000 kbps = 1000 per 1000 bps = 1 milione di bit per secondo.

Per trasmettere 76000 bit sono necessari: Ovvero 76 ms.

A cui dobbiamo aggiungere il ritardo di propagazione di 5 ms. In totale abbiamo 81 ms.

Perché il ritardo di propagazione è unico per tutti i pacchetti?

Il ritardo di propagazione, fa viaggiare i bit (impulsi) sul mezzo trasmissivo, non c'entra niente con i pacchetti. Tutti i bit inviati da S condividono lo stesso mezzo trasmissivo, dunque, gli impulsi raggiungono (tutti insieme) in 5 ms il destinatario D.

Esercizio 1.3
...

Pasted image 20230918164414.png

Domanda 1
...

Nella prima domanda si vuole trovare solo la velocità di propagazione:
Per applicare la formula abbiamo bisogno di convertire km in metri,
Ricordiamo che i millisecondi sono quindi se volessimo portarlo in ms sarebbero .

Domanda 2
...

La domanda è ambigua: non è chiaro se è ricercato il tempo che impiega un pacchetto a propagarsi inteso come voglio solo il ritardo di propagazione, o se intende tutto il tempo necessario per far si che un pacchetto venga trasferito da un punto all'altro

Solo il ritardo di propagazione è il seguente: La prima frazione indica spazio fratto velocità. La seconda applica le variabili utilizzate dal problema dove è appunto la distanza e è la velocità di propagazione.

Nel caso in cui sia richiesto il tempo totale, allora dobbiamo sommare al ritardo di propagazione anche quello di trasmissione:

Domanda 3
...

Altra domanda ambigua.
Il ritardo di propagazione non dipende dalla velocità di trasmissione.
Il ritardo necessario per trasferire il pacchetto, dipende da entrambi i ritardi.
Il ritardo di trasmissione dipende dalla velocità di trasmissione e dalla grandezza del pacchetto.

Esercizio 1.4
...

Pasted image 20230919144255.png

Domanda 1
...

La tecnologia cable modem è utilizzata per rendere possibile l'accesso ad internet attraverso infrastrutture per fornire la TV via cavo. Tale tecnica si basa sull'uso di HFC.
Il cable modem invia i segnali analogici alla stazione di testa in cui è presente il CMST che effettua la traduzione dei segnali analogici in segnali digitali.
Il cable modem funge da interfaccia tra la rete e i dispositivi dell'utente.

Domanda 2
...

Le bande di upstream e downstream sono condivise fra tutte le abitazioni.
Potenzialmente se più utenti richiedessero un file nello stesso istante la velocità effettiva di trasmissione ne risentirebbe.

Domanda 3
...

Le componenti principali sono:

  • cavo coassiale e fibra ottica HFC
  • cable modem
  • CMST

Esercizio 1.5
...

Pasted image 20230919150925.png

  • Nella commutazione di circuito possono essere supportati contemporaneamente circa 33 utenti.
  • La probabilità che un certo utente stia trasmettendo è del 10%

Esercizio 1.6
...

Pasted image 20230921160144.png

  • Domanda 1: il throughput è la capacità con cui il router R può trasferire i file. Se tutti e tre gli host sopra stanno in qualche modo saturando tutta la banda, la capacità del collegamento viene suddivisa tra i tre host ed è
  • Domanda 2:
    • Supponendo che il collegamento sia libero, il tempo necessario per trasferire il file è di:
      • 4 milioni di byte, sono 32 milioni di bit
    • Supponendo invece che sia utilizzato al massimo (come dice la domanda sopra):

Esercizio 1.7
...

Pasted image 20231004165528.png
La velocità di trasmissione è:
mentre la lunghezza del cavo:
ipotizziamo che il collegamento Francia-USA utilizzi un cavo in rame, la cui velocità di propagazione del segnale è .

Per prima cosa dobbiamo sapere a quanto ammonta il ritardo di propagazione:
Il ritardo di trasmissione invece è: Il primo gruppo di 1000, porta i gigabit in megabit, il secondo i megabit in kilobit, il terzo i kilobit in bit.
Al tempo il primo bit viene trasmesso, dopo (ritardo di propagazione) il primo bit giunge negli USA.
Affinché l'ultimo bit del file di dimensione entri nel canale, quando il primo è arrivato, la dimensione del file deve tenere occupato il canale di trasmissione per tutta la durata della propagazione: In :

  • portano da bit a kilobit
  • l'altro porta da kilobit a megabit
  • il aggiunge uno 0
    Se vogliamo il risultato in byte dividiamo per 8:

Esercizio 1.8
...

Pasted image 20231004173331.png
La figura è leggermente fuorviante.
photo_2023-10-04_18-20-17.jpg
In questo modo è più chiara.
Ogni ISP può avere 1 o 2 router.
Nei sistemi periferici vengono eseguite operazioni per applicazione, trasporto e rete.
Tra i sistemi periferici e l'ISP di accesso vengono eseguite operazioni per collegamento e livello fisico. Negli ISP vengono eseguite operazioni per rete, collegamento e livello fisico.
Dobbiamo distinguere due casi:

  • il caso in cui abbiamo solo un router per ISP:
    • operazioni di applicazione, trasporto e rete = 2
    • operazioni di rete, collegamento e fisico = 5
    • operazioni di collegamento e fisico tra host e ISP di accesso = 2
    • collegamento = rete = fisico = 7
    • applicazione = trasporto = 2
  • il caso in cui abbiamo due router per ogni ISP:
    • operazioni di applicazione, trasporto e rete = 2
    • operazioni di rete, collegamento e fisico = 10
    • operazioni di collegamento e fisico tra host e ISP di accesso = 2
    • collegamento = rete = fisico = 12
    • applicazione = trasporto = 2

Esercizio 1.9
...

Pasted image 20231006164022.png
Scrivere soluzione (vedi tablet)

Esercizio 1.10
...

Pasted image 20231006172027.png
Scrivere soluzione (vedi tablet)

Esercizio 1.11
...

Pasted image 20231006172928.pngScrivere soluzione (vedi tablet)

\ No newline at end of file diff --git a/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/il-nucleo-della-rete.html b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/il-nucleo-della-rete.html new file mode 100644 index 0000000..dec123e --- /dev/null +++ b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/il-nucleo-della-rete.html @@ -0,0 +1 @@ +Il nucleo della rete
Il nucleo della rete

Il nucleo della rete è una maglia di commutatori di pacchetti e collegamenti che interconnettono i sistemi periferici di internet. Le applicazioni scambiano messaggi di qualsiasi tipo (immagini, file, mail, …). I messaggi vengono suddivisi in pacchetti più piccoli nella sorgente e poi vengono inoltrati nei vari commutatori di pacchetto.
Se il pacchetto è di dimensione bit e viaggia su un canale a velocità , la velocità di trasmissione è di: I commutatori di pacchetto usano una tecnica chiamata store and forward in cui, come dice il nome stesso, un commutatore prima di inoltrare il pacchetto su un nuovo collegamento deve riceverlo interamente. Un commutatore non può inoltrare solo alcuni bit di un pacchetto.

Esempio: calcolo velocità di trasmissione di un pacchetto
...

Adesso calcoliamo la velocità di trasmissione di un pacchetto (trascurando il ritardo di propagazione del pacchetto).
La sorgente invia 3 pacchetti ognuno di grandezza .
Tra la sorgente e il destinatario vi è un router intermedio.
Il router comincia a ricevere i primi bit del primo pacchetto, ma ha bisogno di averlo tutto prima di poterlo inoltrare verso il destinatario.
Il pacchetto per giungere al destinatario impiegherà: Pasted image 20230916151818.png
Tutto il pacchetto impiegherà la velocità: per andare dalla sorgente al router, e altrettanti per andare dal router alla destinazione.

Invece per la trasmissione di tutti i pacchetti?

Quando il primo pacchetto raggiuge il router () e parte da esso, il secondo pacchetto parte dalla sorgente per raggiungere il router.

Quando il primo pacchetto sarà arrivato a destinazione, il secondo pacchetto sarà arrivato nel router e sta partendo da esso e il terzo pacchetto sarà partito dalla sorgente ().
Quando il secondo pacchetto sarà arrivato a destinazione, il terzo sarà arrivato al router () e sta per partire da esso.
Infine il terzo pacchetto per arrivare a destinazione impiegherà un altro , quindi in totale avremo .

Regola generale velocità di trasmissione

In generale la velocità di trasmissione di un pacchetto di bit, che parte da una sorgente ad una destinazione, in un percorso in cui vi sono collegamenti (quindi router), in cui ogni pacchetto viaggia alla velocità di è:

Altro esempio
...

Supponiamo di avere 4 pacchetti alla sorgente, di avere 2 router e dunque 3 collegamenti: calcoliamo la velocità di trasmissione dei pacchetti sopra descritti:
Pasted image 20230918093543.png
Pasted image 20230918093633.png
Pasted image 20230918093802.png
Pasted image 20230918093859.png
Pasted image 20230918094039.png
Pasted image 20230918094124.png
Pasted image 20230918094215.png

I commutatori di pacchetto (router o switch a livello di rete) hanno numerosi collegamenti.
Ogni commutatore è dotato di un buffer di output (o coda di output) in cui i pacchetti attendono nel caso in cui dovessero arrivare quando il commutatore è impegnato nella trasmissione di un altro pacchetto. Il buffer ha una quantità finita, quindi se un pacchetto giunge quando il buffer è pieno, il pacchetto che arriva o uno dei pacchetti in code nel buffer deve essere eliminato verificandosi packet loss (perdita di pacchetto). Oltre ai ritardi che si verificano a causa dello store-and-foreward si verificano anche ritardi di accodamento.

Tabelle di inoltro e protocolli di instradamento
...

In questa parte vedremo come i router scelgono il percorso per instradare un pacchetto verso la destinazione. Ogni sistema periferico è distinto nella rete attraverso un indirizzo IP. Ogni pacchetto contiene nella sua intestazione l'indirizzo verso cui è diretto. Il router esamina tale indirizzo e confrontando quest'ultimo con una tabella di inoltro sceglie il percorso adatto a raggiungere la destinazione. Le tabelle di inoltro mettono in relazione gli indirizzi di destinazione (o loro parti dell'indirizzo) con i collegamenti in uscita. In ogni commutatore si verificherà l'inoltro al prossimo commutatore, e alla fine il pacchetto giungerà alla destinazione. Le tabelle di inoltro vengono impostate automaticamente attraverso dei protocolli di instradamento che per esempio possono determinare il percorso più breve per una certa destinazione.

Reti a commutazione di circuito
...

Finora abbiamo parlato di reti a commutazione di pacchetto (internet). Un altro tipo di reti sono quelle a commutazione di circuito. In questo tipo di reti le risorse vengono riservate a priori e perdurano per tutta la durata della comunicazione tra i due sistemi periferici. Nelle reti a commutazione di pacchetto questo non avviene, poiché un pacchetto che viaggia nella rete tra i vari commutatori può trovare il buffer pieno e attendere affinché siano riservate risorse per il suo viaggio nella rete. Nelle reti a commutazione di circuito le risorse vengono riservate fin dall'inizio e durano per tutta la comunicazione. Una rete a commutazione di circuito infatti è garantita anche una velocità costante di connessione, così non è per le reti a commutazione di pacchetto.

Nelle reti a commutazione di pacchetto è implementato il multplexing a divisione di frequenza (FDM) o il multiplexing a divisione di tempo (TDM).

In FDM lo spettro di frequenza di una connessione viene suddivisa tra le connessioni stabilite attraverso il collegamento. Ad ogni connessione viene assegnata una banda di frequenza (bandwidth o ampiezza di banda).

In TDM invece il tempo viene ripartito in frame di durata fissa a loro volta suddiviso in un numero fisso di slot. Quando la rete stabilisce una connessione attraverso un collegamento le dedica uno slot di tempo ad ogni frame.

Pasted image 20230918095318.png
Per esempio lo slot azzurro è presente in ogni frame della connessione.
Un frame è formato da quattro slot: blu, verde, giallo e fucsia. Dove il blu l'inizio del frame, mentre il fucsia è la fine.

Confronto commutazione di pacchetto e commutazione di circuito

Vediamo con un semplice esempio perché conviene la commutazione di pacchetto. Supponiamo che ci sia un collegamento da 1Mbps e che ciascun utente alterni periodi in cui invia dati (10% del tempo) e periodi di inattività (90% del tempo). Con una commutazione di circuito è necessario riservare 100 kbps ad ogni utente. 1 Mbps/100 kbps = 10 utenti. In ogni istante vengono riservati 100 kbps ad ogni utente.
Con la commutazione di pacchetto, come abbiamo stabilito prima (utente invia dati per il 10% del tempo), la probabilità che un utente sia attivo è pari a 0,1. Se condividono il collegamento 35 utenti, la probabilità che 11 o più utenti siano attivi è pari allo 0,0004. Quando ci sono 10 o meno utenti attivi (il che avviene con probabilità pari a 0,9996) il flusso di pacchetti nel collegamento avviene senza ritardo. Quando il numero di utenti sarà superiore a 11, il flusso avverrà con ritardo. Ma dato che la probabilità che ci siano più di 11 utenti è assai limitata, la commutazione di pacchetto risulta più efficiente poiché ha le stesse prestazioni della commutazione di circuito e consente più del triplo degli utenti.
Consideriamo un altro scenario. Supponiamo che un utente improvvisamente cominci ad inviare 1000 pacchetti da 1000 bit ciascuno mentre tutti gli altri utenti sono inattivi. Nella rete a commutazione di circuito l'utente ha a disposizione solo 100 kbps e i pacchetti per giungere a destinazione impiegheranno 10 secondi. Invece nella commutazione di pacchetto, se gli altri utenti sono inattivi, l'utente ha a disposizione tutta la banda e può inviare i dati in solo secondo.

Internet: una rete di reti
...

I sistemi periferici si scambiano pacchetti, questi per poter interagire tra di loro devono essere connessi ad internet. I sistemi periferici hanno accesso ad internet poiché sono allacciati agli ISP di accesso. Gli ISP di accesso non sono necessariamente compagnie telefoniche, ma possono anche essere università o aziende. Gli ISP di accesso sono dislocati in tutto il mondo. Questo vuol dire che due sistemi periferici in parti opposte del mondo possono scambiarsi pacchetti se in qualche modo i due ISP di accesso che consentono loro di connettersi a internet sono collegati. In internet gli ISP sono interconnessi tra di loro in maniera complessa. Vediamo, sviluppando delle strutture di rete via via più complesse, com'è fatta internet.

Struttura di rete 1
...

Tutti gli ISP sono interconnessi tra di loro, ogni ISP deve essere connesso a tutti gli altri ISP sparsi in tutto il mondo. Questo tipo di struttura sarebbe troppo costosa, per questo supponiamo che vi sia un ISP globale che interconnette tuti gli altri. Tale ISP è formato da migliaia di router interconnessi, e inoltre deve avere almeno un router nelle vicinanze di ogni altro ISP.

Struttura di rete 2
...

Questa struttura è uguale a quella precedente, solo che al posto di avere un solo ISP globale, ce ne sono più di uno. In tal modo gli ISP clienti avrebbero più scelta sul fornitore, in base al costo e/o ai servizi che offre.
Definiamo questi ISP globali: ISP di primo livello.
Seppur molti ISP hanno una copertura impressionante, nessun ISP si trova in ogni città del mondo. Al massimo vi sono degli ISP regionali a cui si connettono tutti gli ISP di accesso. Gli ISP regionali si connetteranno all'ISP di primo livello.
Gli ISP di primo livello, nella realtà, sono circa una dozzina.
Gli ISP di accesso (ovvero gli ISP che consentono l'accesso ad internet agli utenti) pagano l'ISP regionale e l'ISP regionale paga l'ISP di primo livello. Un ISP di accesso può anche decidere di connettersi ad un ISP di primo livello e pagarlo direttamente. Da un punto di vista economico vi sono più ISP di primo livello in competizione tra di loro e più ISP regionali in competizione tra di loro.

Struttura di rete 3
...

Questa struttura è uguale alla precedente, solo che consideriamo che ci possa essere un ISP ancor più grande di quello regionale a cui tutti gli ISP si connettono. Chiameremo questa caratteristica: gerarchia multilivello.

Struttura di rete 4
...

La struttura di rete 4, si arricchisce di Pop, multi-homing, peering e IXP.

  • Pop: point of presence, non sono altro che un gruppo di router vicini nella rete del provider che consentono all'ISP cliente di connettersi. I pop sono presenti in tutti i livelli, tranne nei router degli ISP di accesso (che sono gli ultimi nella gerarchia).
  • Multi-homing: tutti tranne gli ISP di primo livello possono scegliere questa modalità. Consiste nella possibilità per l'ISP cliente di connettersi a due o più fornitori. Tale modalità consente all'ISP di poter continuare a servire i clienti se uno dei due (o più) fornitori è guasto per qualche motivo.
  • Peering: il peering è un accesso diretto tra ISP di pari livello gerarchico per risparmiare sui costi del servizio.
  • IXP: anche gli ISP di primo livello fanno peering tra di loro. Un palazzo dedicato ad un punto di incontro tra una coppia di ISP si chiama IXP, ovvero Interne tExchange Point.

Pasted image 20230918101115.png
Il peering, avviene tra ISP di pari livello.
Due ISP di pari livello si connettono tra di loro, il risparmio si verifica nel momento in cui, un pacchetto deve viaggiare dall'ISP A verso la rete dell'ISP B (o viceversa), per risparmiare sui costi di trasporto di quel pacchetto nel caso in cui esso passerebbe per l'ISP di primo livello, l'ISP A invia direttamente il pacchetto all'IPS B a cui è connesso direttamente tramite peering.

Struttura di rete 5
...

Questa struttura descrive la internet odierna. È la struttura di rete 4 arricchita con le reti di quelle società che si occupano di offrire contenuti (Google, …). Google per esempio ha data center dislocati in tutto il modo. Essi sono interconnessi tra di loro. Google ha una sua rete, separata da quella che costituisce internet. Poi, per rendere disponibili i suoi contenuti (e per risparmiare) si connette agli ISP di accesso, quando possibile, dato che la sua rete potrebbe non riuscire a coprire tutto il globo, si connette anche agli ISP di primo livello.
Pasted image 20230918121421.png

\ No newline at end of file diff --git a/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/introduzione-alle-reti-start-point.html b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/introduzione-alle-reti-start-point.html new file mode 100644 index 0000000..1e94699 --- /dev/null +++ b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/introduzione-alle-reti-start-point.html @@ -0,0 +1 @@ +Introduzione alle reti - Start point
Introduzione alle reti - Start point

I dispositivi collegati a internet vengono chiamati host o sistemi periferici. Questi sono connessi mediante una rete di collegamenti, collegamenti che possono essere di diverso tipo: cavo coassiale, fibra ottica, onde elettromagnetiche, ecc.
In base al tipo di collegamento i dati possono essere trasmessi a velocità differente.
La velocità (velocità di trasmissione) viene misurata in bps (bit per secondo).
Quando un sistema periferico vuole inviare dati ad un altro, suddivide i dati in pacchetti.
I pacchetti, giunti al destinatario vengono ri-assemblati per comporre il messaggio originario.

Commutatori di pacchetto usati oggi sono i router e i commutatori a livello di collegamento.

La sequenza di collegamenti che attraversa un pacchetto prima di giungere a destinazione è detto cammino o percorso (route o path).

I sistemi periferici accedono a internet tramite gli internet service provider (ISP) suddivisi in:

  • ISP residenziali (compagnie telefoniche)
  • ISP aziendali
  • ISP universitari
  • ISP che forniscono accesso Wi-Fi in aeroporti, hotel, bar e altri luoghi pubblici
  • ISP che forniscono accesso in mobilità
    Un provider è un insieme di commutatori di pacchetto e di collegamenti.

Il controllo di invio/ricezione di informazioni all'interno della rete è regolato da protocolli. I due principali sono: transmission control protocol (TCP) e internet protocol (IP).

Interfacce socket
...

Internet fornisce diverse applicazioni e servizi. L'aspetto rilevante è che tali applicazioni vengono eseguite sui sistemi periferici e non sui commutatori di pacchetto del nucleo della rete. Una volta che un programma è in esecuzione su un sistema periferico per istruire internet affinché recapiti dati ad un'altra parte di software in esecuzione su un altro sistema periferico viene utilizzata un'interfaccia socket che specifica come un programma possa chiedere a Internet di recapitare dati di un programma (in esecuzione su un certo sistema) ad un altro programma (in esecuzione su un altro sistema). Le interfacce socket saranno descritte più avanti.

Supponiamo che Alice debba inviare una lettera a Bob. Alice scriverà i dati sulla lettera, ma non si può limitare a lanciarla fuori dalla finestra. Occorre che Alice esegua alcune operazioni per far si che la letta si recapitata a Bob. Dovrà indicare i dati del destinatario: il suo nome e cognome, il suo indirizzo, dovrà compare un francobollo, dopo di che il sistema postale si occuperà di recapitare la lettera a Bob per conto di Alice. L'insieme di regole che Alice esegue rappresentano un'analogia con la nostra interfaccia socket, Alice e Bob sono le applicazioni su due sistemi periferici diversi che vogliono comunicare.

Protocolli di rete
...

Facciamo un'altra analogia.
Supponiamo che un uomo voglia chiedere l'ora ad un'altra persona. Prima di chiedere l'ora, la persona A saluterà, dopo aver ricevuto il saluto di ritorno chiederà l'ora. Le regole tra gli esseri umani definiscono un comportamento di questo tipo. Queste regole formano un protocollo. Se la persona B risponde con un saluto allora la persona A chiederà l'ora, in caso di una risposta negativa ("Non mi scocciare", "Non parlo italiano", …) la persona A dovrà abbandonare la comunicazione e chiedere l'ora ad un'altra persona. Il protocollo di rete funziona allo stesso modo. Per esempio quando vogliamo scaricare una certa pagina web, il nostro sistema periferico effettua prima una richiesta al web server, una volta ricevuta una risposta, effettuare la richiesta per un certo sito web.
Pasted image 20230916150759.png
I sistemi periferici possono anche essere chiamati end system.
I sistemi periferici sono anche chiamati host poiché ospitano ed eseguono programmi applicativi. Tra gli host viene fatta un ulteriore distinzione in:

  • client: host che richiedono servizi (computer, smartphone, …);
  • server: sono host che forniscono servizi (macchine più potenti).

Reti di accesso
...

Gli end system (sistemi periferici) accedono ad internet attraverso delle reti di accesso, ovvero delle reti che connettono l'end system ad internet, attraverso un router di bordo (edge router). L'edge router è il primo router sul percorso dal sistema di origine a qualsiasi altro sistema destinatario.

Accesso residenziale
...

Gli accessi residenziali a banda larga più diffusi sono: DSL (digital subscriber line) e quello via cavo.
In genere l'accesso residenziale DSL viene fornito dalla compagnia telefonica che fornisce il servizio di linea fissa. In questo contesto la compagnia telefonica diventa anche un ISP.
Pasted image 20230919140810.png
Come si vede nella figura sopra il modem DSL dell'utente usa la linea fissa esistente (doppino telefonico intrecciato in rame) per scambiare dati con un digital subscriber line access multiplex (DSLAM) che si trova nella centrale locale della compagnia. Il modem converte i dati digitali in toni ad alta frequenza per poterli trasmettere alla centrale locale sul cavo telefonico; tutti i segnali analogici in arrivo dalle abitazioni vengono riconvertiti in formato digitale nel DSLAM.
Le linee telefoniche residenziali trasportano contemporaneamente dati e segnali telefonici tradizionali codificandoli in tre bande di frequenza non sovrapposte:

  • un canale di downstream (verso l'abitazione) ad alta velocità, nella banda 50kHz e 1MHz
  • un canale di upstream (verso il DSLAM) a velocità media, nella banda tra 4 e 50kHz
  • un canale telefoni ordinario a due viene, nella banda tra 0 e 4 kHz.
    In tal modo, lo scambio di dati con la rete internet e una telefonata sulla linea fissa possono verificarsi contemporaneamente senza interferenze condividendo lo stesso collegamento.
    Il DSLAM nella centrale locale, separa i segnali dei dati da quelli della telefonia e invia i dati su internet.
Accesso via cavo
...

Mentre DSL si appoggia alle infrastrutture già in funzione per la linea fissa, l'accesso ad internet via cavo utilizza infrastrutture esistenti della televisione via cavo. In questo caso la compagnia che fornisce l'accesso alla TV via cavo diventa anche provider.
Pasted image 20230919142448.png
Come si vede in figura, le fibre ottiche connettono la terminazione del cavo a giunzioni a livello di quartire, dalle quali viene usato il tradizionale cavo coassiale per la distribuzione televisiva nelle singole case. Questo sistema viene detto HFC (hybrid fiber coax).
L'accesso ad internet via cavo richiede modem speciali, chiamati cable modem.
Sono molto simili ai modem delle reti di accesso DSL.
Alla stazione di testa (vedi figura) il sistema di terminazione dei cable modem (CMTS, cable modem termination system) svolge una funzione simile al DSLAM nelle reti ad accesso DSL.
I cable modem inviano alla stazione di testa (cable head end) i segnali analogici che vengono tradotti in segnali digitali dal CMTS.
I cable modem dividono la rete HFC in due canali: downstream e upstream, come per DSL, l'accesso è asimmetrico. Una caratteristica di HFC è che il mezzo di trasmissione dei pacchetti è condiviso, infatti se giunge un pacchetto alla stazione di testa da recapitare ad una certa abitazione viaggia sul canale di downstream in tutti i collegamenti e verso ogni abitazione; ciascun pacchetto inviato da un'abitazione viaggia sul canale di upstream verso la stazione di testa. Per questo motivo se diversi utenti stanno contemporaneamente scaricando un file video sul canale di downstream, l'effettiva velocità alla quale ciascun utente lo riceve sarà inferiore rispetto a quella totale del canale di downstream, d'altra parte se pochi utenti stanno navigando, potranno ricevere i file richiesti alla velocità massima.

Accesso via FTTH (fiber to the home)
...

L'idea è fornire la fibra ottica, dalla centrale, direttamente nelle abitazioni degli utenti.
Ci sono diverse tecnologie per rendere possibile quest'idea.
La più semplice è chiamata fibra diretta, in cui ogni singola fibra viene collegata ad una singola abitazione. Di solito però la fibra uscente dalla centrale locale è in effetti condivisa da molte abitazioni e solo quando arriva relativamente vicina alle abitazioni viene suddivisa in più fibre, ognuna dedicata ad un utente.

Mezzi trasmissivi
...

I bit vengono trasmessi attraverso dei mezzi fisici. La prima volta che un bit viene immesso nella rete, parte da un router e attraversa una serie di router. Quindi viene ritrasmesso più volte in diverse coppie di trasmettitori-ricevitori propagandosi sotto forma di impulso ottico (cavi, fibra ottica, cavo coassiale, …) o onde elettromagnetiche (wi-fi). Il mezzo fisico può essere diverso tra le varie coppie che il bit incontra per strada.
Distinguiamo tra questi:

  • mezzi vincolati: ne sono un esempio le onde elettromagnetiche, che si propagano nell'atmosfera;
  • mezzi non vincolati: sono i mezzi fisici (fibra ottica, cavo intrecciato in rame, …).

Nel prossimo argomento vediamo com'è fatto il nucleo della rete.

\ No newline at end of file diff --git a/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/protocolli-di-rete.html b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/protocolli-di-rete.html new file mode 100644 index 0000000..e9a259b --- /dev/null +++ b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/protocolli-di-rete.html @@ -0,0 +1 @@ +Protocolli di rete
Protocolli di rete

Prima di tentare di descrivere l'architettura a livelli di internet, vediamo un'analogia.

Se si dovesse descrivere il sistema che consente a una persona di viaggiare con una compagnia aerea, si direbbe che c'è un momento in cui si acquista il biglietto, si imbarca il bagaglio, ci si reca al gate, si decolla, l'aereo si instrada verso la destinazione, (giunti a destinazione) si atterra, si esce dal gate, si ritira il bagaglio e si esce dall'aeroporto (biglietto).
Dopodiché i passi si ripetono all'inverso per tornare indietro.

Queste fasi consentono ad un viaggiatore di partire da un'origine verso una destinazione. Si possono suddividere le fasi di questo sistema in livelli:
Pasted image 20230918121535.png
Pasted image 20230918121551.png

Si noti che ogni livello funziona in modo autonomo. E che tutti i livelli insieme rendono possibile il viaggio. I livelli cooperano in un certo modo tra di loro, ma senza ostacolarsi. Se si è muniti di biglietto si può imbarcare il bagaglio, imbarcato il bagaglio si può entrare al gate e se si è entrati al gate si può decollare, una volta decollati ci si può instradare verso la destinazione. Il vantaggio di una suddivisione a livelli di questo tipo permette l'aggiornamento dei livelli in maniera indipendente dagli altri. Per esempio il fatto che variano le modalità con cui si consegna il bagaglio, non vuol dire che varia il modo in cui si fa il biglietto.

Internet è organizzata in livelli. I livelli possono essere implementati per via hardware o software.
Pasted image 20230918120811.png
Per la descrizione dei livelli sarà utilizzato un approccio top-down, ovvero partendo prima dal livello più in alto (applicazione) fino al livello più in basso (fisico).

Introduzione a ciascun livello
...

Livello di applicazione
...

Di questo livello fanno parte tutti quei protocolli di rete (HTTP, SMTP, …) tramite il quale le applicazioni (nei sistemi periferici) comunicano. Anche il protocollo DNS fa parte di questo livello. Chiameremo messaggi i pacchetti di informazioni scambiati a questo livello.

Livello di trasporto
...

Di questo livello fanno parte due protocolli: TCP e UDP. Entrambi trasferiscono i messaggi tra punti periferici del livello di applicazione.

  • TCP: è un protocollo orientato alla connessione. Garantisce la consegna dei messaggi e offre un servizio per il controllo della congestione della rete.
  • UDP: è un protocollo non orientato alla connessione. Non garantisce la consegna dei messaggi e non offre nessun servizio di controllo della congestione delle rete. Ma è più veloce. Chiameremo segmenti i pacchetti di informazioni scambiati a questo livello.
Livello di rete
...

Questo livello si occupa di trasferire (a livello di rete) da un host all'altro i segmenti (ricevuti dal livello sovrastante) in cui è specificato l'indirizzo di destinazione. In questo livello è contenuto anche il protocollo IP e vari protocolli di instradamento per la scelta del percorso più adatto da far intraprendere ai datagrammi.

Livello di collegamento
...

In questo livello si instrada un datagramma attraverso una serie di router tra la sorgente e la destinazione. Ad ogni nodo, il livello di rete, passa il datagramma al livello sottostante, che lo trasporta al nodo successi. In questo nodo, il livello di collegamento passa il datagramma al livello di rete superiore.
I servizi forniti da questo livello dipendono dallo specifico protocollo utilizzato. Alcuni protocolli garantiscono la consegna affidabile (che è diverso da quello omonimo di TCP che fornisce consegna affidabile da un sistema periferico all'altro). Esempi del livello di collegamento sono: ethernet, Wi-Fi. I pacchetti a questo livello sono chiamati frame.

Livello fisico
...

Mentre il compito del livello di collegamento è trasferire interi frame da un elemento della rete a quello adiacente, il ruolo del livello fisico è trasferire i singoli bit del frame da un nodo a quello successivo. In base alla tipologia del mezzo trasmissivo la modalità con cui viaggiano i bit varia. Mezzi trasmissivi (fibra ottica, doppino in rame,…)
Pasted image 20230918122020.png
La figura sopra illustra il concetto di incapsulamento.
Un messaggio a livello di applicazione , viene passato al livello di trasporto. Nel caso più semplice, il livello di trasporto prende il messaggio e gli concatena informazioni aggiuntive (le cosiddette informazioni di intestazione a livello di trasporto, che sta per header, mentre la t per transport) che saranno utilizzate dalla parte ricevente del livello di trasporto. Il messaggio e le informazioni di intestazione (aggiunte dal livello di trasposrto) costituiscono il segmento a livello di trasporto. Il livello di trasporto passa il segmento al livello sottostante, che aggiunge altre informazioni d intestazione (n sta per network) così da creare un datagramma a livello di rete. Poi il datagramma viene passato al livello di collegamento, il quale aggiunge le proprie informazioni, creando un frame a livello di collegamento.
A ciascun livello un pacchetto ha due tipi di campi:

  • intestazione (header)
  • payload (carico utile trasportato), il payload è tipicamente un pacchetto proveniente da livello superiore.
\ No newline at end of file diff --git a/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/ritardi,-perdite-e-throughput-nelle-reti-a-commutazione-di-pacchetto.html b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/ritardi,-perdite-e-throughput-nelle-reti-a-commutazione-di-pacchetto.html new file mode 100644 index 0000000..4a13c8b --- /dev/null +++ b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/ritardi,-perdite-e-throughput-nelle-reti-a-commutazione-di-pacchetto.html @@ -0,0 +1 @@ +Ritardi, perdite e throughput nelle reti a commutazione di pacchetto
Ritardi, perdite e throughput nelle reti a commutazione di pacchetto

Un pacchetto che parte da un host sorgente e raggiunge un host di destinazione attraversa diversi router e collegamenti. In ogni tappa il pacchetto può subire vari tipi di ritardo: ritardo di elaborazione, ritardo di accodamento, ritardo di propagazione e ritardo di trasmissione. La somma di questi ritardi restituiscono il ritardo totale di nodo (nodal delay).

Ritardo di elaborazione
...

È il tempo che occorre al router per esaminare l'intestazione del pacchetto e capire in quale collegamento dirigerlo.

Ritardo di accodamento
...

È il tempo che occorre al pacchetto per essere spedito sul collegamento adatto alla sua intestazione. Tale ritardo dipende dal numero di pacchetti in coda. Se il traffico è intenso e ci sono molti pacchetti, il ritardo di accodamento sarà dell'ordine dei microsecondi o dei millisecondi. Se non c'è alcun pacchetto in coda, il ritardo di accodamento sarà nullo.

Ritardo di trasmissione
...

È il tempo che occorre per trasmettere tutti i bit di un pacchetto da un nodo all'altro ().

Ritardo di propagazione
...

Una volta che un bit del pacchetto è immesso nel collegamento questo deve raggiungere la destinazione. La velocità con cui si sposta varia a seconda del mezzo fisico, che varia dai m/s a m/s (velocità della luce).

  • è la distanza da percorrere
  • è la velocità
  • è il ritardo di propagazione del bit sul collegamento.
    Nelle reti molto estese è dell'ordine dei millisecondi.

Differenza ritardo di propagazione e ritardo di trasmissione
...

Il ritardo di trasmissione è il tempo che ci vuole per trasmettere in uscita il pacchetto e dipende dalla grandezza del pacchetto e dalla velocità del collegamento. Il ritardo di propagazione è il tempo che impiega il bit, immesso nel collegamento, per raggiungere la destinazione e dipende dalla distanza fra i due router.
(Possiamo dire in modo molto grezzo che il ritardo di trasmissione è il tempo che impiega il router per processare i pacchetti. Mentre il tempo di propagazione è il tempo per propagarli nel collegamento verso la destinazione).

Ritardo end-to-end
...

Fino a qui abbiamo visto solo i ritardi su un singolo router. Supponiamo che ci siano router tra l'host sorgente e l'host di destinazione. Ipotizziamo che non ci siano ritardi di accodamento.
Il ritardo di elaborazione di ciascun router e presso il mittente è di .
La velocità di trasmissione in uscita ad ogni router e dall'host sorgente è di bps.
La propagazione su ciascun collegamento sia di .
Il ritardo end-to-end Dove ancora e la dimensione del pacchetto.

Il tool traceroute

Con il programma traceroute in Linux (tracert in Windows) si può tracciare il percorso dei pacchetti verso un certo host di destinazione, esso calcola anche i ritardi riportarti dai pacchetti durante il viaggio verso la destinazione.
Pasted image 20230918105011.png

Throughput
...

Oltre al ritardo e alla perdita di pacchetti, un'altra misura critica delle prestazioni è il throughput (letteralmente portata). Per darne una definizione supponiamo che debba essere inviato un file voluminoso da un nodo A ad un nodo B. Il throughput istantaneo è la velocità a cui il nodo B sta ricevendo il file. Se il file è di bit e il trasferimento richiede secondi il throughput medio è di bps. Per far si che alcune applicazioni funzionino come si deve a volte si richiede che il throughput medio sia sopra una certa soglia.

Consideriamo un esempio per approfondire:
Pasted image 20230918114508.png
Sia la velocità del collegamento tra server e router e la velocità del collegamento tra client e router. Il server invia una file di un certa dimensione a una velocità e chiaramente non può inviarlo ad una velocità maggiore, l'host lo riceve ad una velocità .

  • Se allora il throughput dipende da
  • Se allora il throughput dipende da
Il throughput è il minimo tra la velocità dei due collegamenti

Il tempo necessario a traferire un grosso file dal server al client quindi richiede: In questo caso abbiamo fatto riferimento ad una rete con due collegamenti e un solo router.
In caso di più collegamenti, il ragionamento è identico. Il throughput è il .

Vediamo un altro caso. Supponiamo che ci siano 10 server che inviano file (10 downloads) e 10 client che li ricevono. Supponiamo i collegamenti passino per un unico nucleo.

  • Ogni server invia a velocità
  • Ogni client riceve a velocità
  • Il nucleo della rete inoltra i dati a velocità
    Se è molto più grande sia di , che di , allora il throughput per ogni coppia di server-client sarà il minimo tra le rispettive velocità di trasferimento dei singoli collegamenti.
    Pasted image 20230918121514.png
Ma se è dell'ordine di grandezza di e , la situazione cambia

Esaminiamo un caso specifico:

Il collegamento comune suddivide equamente la propria velocità di trasmissione tra i 10 downloads. Quindi il collo di bottiglia non è più il minimo tra ed , ma . In sostanza, quando non c'è traffico, il throughput può essere approssimato al minimo tra le velocità di trasmissione dei collegamenti attraversati dal file, se c'è traffico il throughput varia in base a diversi fattori.

Prossimo argomento: Protocolli di rete

\ No newline at end of file diff --git a/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/ritardo-di-accodamento.html b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/ritardo-di-accodamento.html new file mode 100644 index 0000000..5906e7f --- /dev/null +++ b/reti-di-elaboratori/capitolo-1-introduzione-alle-reti/ritardo-di-accodamento.html @@ -0,0 +1 @@ +Ritardo di accodamento
Ritardo di accodamento

Fra tutti i ritardi, quello più significativo ed interessante è il ritardo di accodamento. Spiegheremo solo ad alto livello come il ritardo di accodamento influisce sulla trasmissione dei pacchetti.

Quando si considera trascurabile e quando rilevante questo tipo di ritardo?

Dipende dalla velocità di trasmissione e dall'entità del traffico entrante.

Per comprenderlo facciamo un esempio, prima di tutto supponiamo che:

  • sia la velocità media con cui i pacchetti arrivano nella coda, che esprimiamo in pacchetti al secondo;
  • sia la velocità di trasmissione ovvero la velocità con cui i pacchetti vengono processati in uscita dalla coda;
  • per semplicità, diciamo che tutti i pacchetti hanno la stessa dimensione .

Il numero di pacchetti che arrivano al secondo (), moltiplicati per la dimensione di un pacchetto (, ci dà la mole di bit che giungono ogni secondo nella coda.
Dunque i bit che arrivano ogni secondo nella coda sono:Mentre, l'intensità di traffico è data da: Se questo rapporto è maggiore di 1, vuol dire che la velocità media di arrivo dei bit sulla coda è più alta della velocità con cui i pacchetti vengono trasmessi.

Se invece questo rapporto è minore di 1, distinguiamo dei casi:

  1. i pacchetti arrivano con cadenza periodica: in questo caso, ciascun pacchetto, giungendo alla coda, la troverà vuota, quindi il ritardo di accodamento è nullo per ogni pacchetto;
  2. i pacchetti arrivano a raffiche periodiche può causare ritardi (anche gravi). Supponiamo di avere pacchetti che giungono simultaneamente ogni secondi. Il primo pacchetto non subisce ritardo, il secondo subisce ritardo di , fino a che l'ultimo pacchetto non sperimenta ritardo di .
    Nella realtà non possiamo distinguere questi casi, poiché i pacchetti arrivano nella coda in maniera del tutto casuale.
    Se l'intensità di traffico è vicina allo 0 i pacchetti sono distanziati e i pacchetti entranti non subiranno ritardi dovuti al riempimento della coda. Se l'intensità di traffico è vicina all'1, si riscontrano intervalli in cui la coda si riempie e altri intervalli in cui la coda si svuota.

Perdita di pacchetti
...

Fino ad ora non abbiamo fatto assunzioni riguardo la dimensione della coda (buffer). In un certo senso abbiamo supposto che fosse di dimensione illimitata. In realtà la coda ha una dimensione fissata. Quando un pacchetto arriva in coda e la coda è piena, si verifica la perdita del pacchetto. Il pacchetto risulterà inoltrato dal router sorgente, ma non arriverà a destinazione.

\ No newline at end of file diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230916150759.png b/reti-di-elaboratori/lib/media/pasted-image-20230916150759.png new file mode 100644 index 0000000..3fd3038 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230916150759.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230916151818.png b/reti-di-elaboratori/lib/media/pasted-image-20230916151818.png new file mode 100644 index 0000000..7d4f205 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230916151818.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918093543.png b/reti-di-elaboratori/lib/media/pasted-image-20230918093543.png new file mode 100644 index 0000000..159ada9 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918093543.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918093633.png b/reti-di-elaboratori/lib/media/pasted-image-20230918093633.png new file mode 100644 index 0000000..62fe783 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918093633.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918093802.png b/reti-di-elaboratori/lib/media/pasted-image-20230918093802.png new file mode 100644 index 0000000..b8e6dcd Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918093802.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918093859.png b/reti-di-elaboratori/lib/media/pasted-image-20230918093859.png new file mode 100644 index 0000000..b90528b Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918093859.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918094039.png b/reti-di-elaboratori/lib/media/pasted-image-20230918094039.png new file mode 100644 index 0000000..f0d85c5 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918094039.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918094124.png b/reti-di-elaboratori/lib/media/pasted-image-20230918094124.png new file mode 100644 index 0000000..34ad3f4 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918094124.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918094215.png b/reti-di-elaboratori/lib/media/pasted-image-20230918094215.png new file mode 100644 index 0000000..ea46977 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918094215.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918095318.png b/reti-di-elaboratori/lib/media/pasted-image-20230918095318.png new file mode 100644 index 0000000..49e615d Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918095318.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918101115.png b/reti-di-elaboratori/lib/media/pasted-image-20230918101115.png new file mode 100644 index 0000000..034c161 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918101115.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918105011.png b/reti-di-elaboratori/lib/media/pasted-image-20230918105011.png new file mode 100644 index 0000000..a65d899 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918105011.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918114508.png b/reti-di-elaboratori/lib/media/pasted-image-20230918114508.png new file mode 100644 index 0000000..0d23668 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918114508.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918120811.png b/reti-di-elaboratori/lib/media/pasted-image-20230918120811.png new file mode 100644 index 0000000..9f74e58 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918120811.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918121421.png b/reti-di-elaboratori/lib/media/pasted-image-20230918121421.png new file mode 100644 index 0000000..a5444d1 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918121421.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918121514.png b/reti-di-elaboratori/lib/media/pasted-image-20230918121514.png new file mode 100644 index 0000000..65dcec0 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918121514.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918121535.png b/reti-di-elaboratori/lib/media/pasted-image-20230918121535.png new file mode 100644 index 0000000..ce42911 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918121535.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918121551.png b/reti-di-elaboratori/lib/media/pasted-image-20230918121551.png new file mode 100644 index 0000000..9980ac9 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918121551.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918122020.png b/reti-di-elaboratori/lib/media/pasted-image-20230918122020.png new file mode 100644 index 0000000..8500f5c Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918122020.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918123347.png b/reti-di-elaboratori/lib/media/pasted-image-20230918123347.png new file mode 100644 index 0000000..1472681 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918123347.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918160954.png b/reti-di-elaboratori/lib/media/pasted-image-20230918160954.png new file mode 100644 index 0000000..782c339 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918160954.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230918164414.png b/reti-di-elaboratori/lib/media/pasted-image-20230918164414.png new file mode 100644 index 0000000..d170472 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230918164414.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230919140810.png b/reti-di-elaboratori/lib/media/pasted-image-20230919140810.png new file mode 100644 index 0000000..4cca0c3 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230919140810.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230919142448.png b/reti-di-elaboratori/lib/media/pasted-image-20230919142448.png new file mode 100644 index 0000000..7190f20 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230919142448.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230919144255.png b/reti-di-elaboratori/lib/media/pasted-image-20230919144255.png new file mode 100644 index 0000000..2a168a5 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230919144255.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230919150925.png b/reti-di-elaboratori/lib/media/pasted-image-20230919150925.png new file mode 100644 index 0000000..c71c288 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230919150925.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20230921160144.png b/reti-di-elaboratori/lib/media/pasted-image-20230921160144.png new file mode 100644 index 0000000..60725e5 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20230921160144.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20231004165528.png b/reti-di-elaboratori/lib/media/pasted-image-20231004165528.png new file mode 100644 index 0000000..d348bb2 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20231004165528.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20231004173331.png b/reti-di-elaboratori/lib/media/pasted-image-20231004173331.png new file mode 100644 index 0000000..6d25bac Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20231004173331.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20231006164022.png b/reti-di-elaboratori/lib/media/pasted-image-20231006164022.png new file mode 100644 index 0000000..9456111 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20231006164022.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20231006172027.png b/reti-di-elaboratori/lib/media/pasted-image-20231006172027.png new file mode 100644 index 0000000..6331694 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20231006172027.png differ diff --git a/reti-di-elaboratori/lib/media/pasted-image-20231006172928.png b/reti-di-elaboratori/lib/media/pasted-image-20231006172928.png new file mode 100644 index 0000000..53a58e7 Binary files /dev/null and b/reti-di-elaboratori/lib/media/pasted-image-20231006172928.png differ diff --git a/reti-di-elaboratori/lib/media/photo_2023-10-04_18-20-17.jpg b/reti-di-elaboratori/lib/media/photo_2023-10-04_18-20-17.jpg new file mode 100644 index 0000000..77790fe Binary files /dev/null and b/reti-di-elaboratori/lib/media/photo_2023-10-04_18-20-17.jpg differ diff --git a/reti-di-elaboratori/lib/scripts/generated.js b/reti-di-elaboratori/lib/scripts/generated.js new file mode 100644 index 0000000..783836d --- /dev/null +++ b/reti-di-elaboratori/lib/scripts/generated.js @@ -0,0 +1 @@ +let nodes={paths:["capitolo-1-introduzione-alle-reti/esercizi-sul-capitolo-1.html","capitolo-1-introduzione-alle-reti/il-nucleo-della-rete.html","capitolo-1-introduzione-alle-reti/introduzione-alle-reti-start-point.html","capitolo-1-introduzione-alle-reti/protocolli-di-rete.html","capitolo-1-introduzione-alle-reti/ritardi,-perdite-e-throughput-nelle-reti-a-commutazione-di-pacchetto.html","capitolo-1-introduzione-alle-reti/ritardo-di-accodamento.html"],nodeCount:6,linkSources:[1,2,4,4],linkTargets:[4,1,5,3],labels:["Esercizi sul capitolo 1","Il nucleo della rete","Introduzione alle reti - Start point","Protocolli di rete","Ritardi, perdite e throughput nelle reti a commutazione di pacchetto","Ritardo di accodamento"],radii:[3,6.888888888888889,5.638888888888889,5.638888888888889,7,5.638888888888889],linkCount:4},attractionForce=1,linkLength=10,repulsionForce=150,centralForce=3,edgePruning=100 \ No newline at end of file diff --git a/reti-di-elaboratori/lib/scripts/graph-render-worker.js b/reti-di-elaboratori/lib/scripts/graph-render-worker.js new file mode 100644 index 0000000..495e979 --- /dev/null +++ b/reti-di-elaboratori/lib/scripts/graph-render-worker.js @@ -0,0 +1 @@ +if("function"==typeof importScripts){let e,t,o;importScripts("https://d157l7jdn8e5sf.cloudfront.net/v7.2.0/webworker.js","./tinycolor.js"),addEventListener("message",onMessage),isDrawing=!1;let n=0,a=[],r=[],i=0,l=[],c=[],d=[],s=[],u=[],g={x:0,y:0},p=new Float32Array(0),h=0,f=0,y={background:2302755,link:11184810,node:13421772,outline:11184810,text:16777215,accent:4203434},S=-1,x=-1,v=-1,m=!1,w=[],b=-1,C=1,k=1;function toScreenSpace(e,t,o=!0){return o?{x:Math.floor(e*C+g.x),y:Math.floor(t*C+g.y)}:{x:e*C+g.x,y:t*C+g.y}}function vecToScreenSpace({x:e,y:t},o=!0){return toScreenSpace(e,t,o)}function toWorldspace(e,t){return{x:(e-g.x)/C,y:(t-g.y)/C}}function vecToWorldspace({x:e,y:t}){return toWorldspace(e,t)}function setCameraCenterWorldspace({x:e,y:t}){g.x=canvas.width/2-e*C,g.y=canvas.height/2-t*C}function getCameraCenterWorldspace(){return toWorldspace(canvas.width/2,canvas.height/2)}function getNodeScreenRadius(e){return e*k}function getNodeWorldspaceRadius(e){return e/k}function getPosition(e){return{x:p[2*e],y:p[2*e+1]}}function mixColors(e,t,o){return tinycolor.mix(tinycolor(e.toString(16)),tinycolor(t.toString(16)),o).toHexNumber()}function darkenColor(e,t){return tinycolor(e.toString(16)).darken(t).toHexNumber()}function lightenColor(e,t){return tinycolor(e.toString(16)).lighten(t).toHexNumber()}function invertColor(e,t){if(0===(e=e.toString(16)).indexOf("#")&&(e=e.slice(1)),3===e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),6!==e.length)throw new Error("Invalid HEX color.");var o=parseInt(e.slice(0,2),16),n=parseInt(e.slice(2,4),16),a=parseInt(e.slice(4,6),16);return t?.299*o+.587*n+.114*a>186?"#000000":"#FFFFFF":(o=(255-o).toString(16),n=(255-n).toString(16),a=(255-a).toString(16),"#"+padZero(o)+padZero(n)+padZero(a))}function clamp(e,t,o){return Math.min(Math.max(e,t),o)}function lerp(e,t,o){return e+(t-e)*o}let N=0,T=.2,F=15,M=12,P=F/M;function showLabel(e,t,o=!1){let n=u[e];if(d[e]=t,!(t>.01))return void hideLabel(e);n.visible=!0,n.style.fontSize=o?F:M;let a=vecToScreenSpace(getPosition(e)),r=s[e]*(o?P:1)/2;n.x=a.x-r,n.y=a.y+getNodeScreenRadius(l[e])+9,n.alpha=t}function hideLabel(e){u[e].visible=!1}function draw(){o.clear();let e=[];m&&(w=[]),N=-1!=S||-1!=v?Math.min(1,N+T):Math.max(0,N-T),o.lineStyle(1,mixColors(y.link,y.background,50*N),.7);for(let t=0;t2){showLabel(e,lerp(0,(t-4)/10-1/k/6*.9,Math.max(1-N,.2)))}else hideLabel(e);if(S==e||x==e&&0!=N||-1!=S&&w.includes(e))continue;let n=vecToScreenSpace(getPosition(e));o.drawCircle(n.x,n.y,t)}o.endFill(),t=.7*N,o.lineStyle(1,mixColors(mixColors(y.link,y.accent,100*N),y.background,20),t);for(let t=0;tMath.max(e,r))),GraphAssembly.averageRadius=GraphAssembly.radii.reduce(((e,r)=>e+r))/GraphAssembly.radii.length,GraphAssembly.minRadius=GraphAssembly.radii.reduce(((e,r)=>Math.min(e,r))),r=this.loadState(),Module.HEAP32.set(new Int32Array(r.buffer),GraphAssembly.#e/r.BYTES_PER_ELEMENT),Module.HEAP32.set(new Int32Array(GraphAssembly.radii.buffer),GraphAssembly.#t/GraphAssembly.radii.BYTES_PER_ELEMENT),Module.HEAP32.set(new Int32Array(GraphAssembly.linkSources.buffer),GraphAssembly.#a/GraphAssembly.linkSources.BYTES_PER_ELEMENT),Module.HEAP32.set(new Int32Array(GraphAssembly.linkTargets.buffer),GraphAssembly.#s/GraphAssembly.linkTargets.BYTES_PER_ELEMENT),Module._Init(GraphAssembly.#e,GraphAssembly.#t,GraphAssembly.#a,GraphAssembly.#s,GraphAssembly.nodeCount,GraphAssembly.linkCount,batchFraction,dt,attractionForce,linkLength,repulsionForce,centralForce)}static get positions(){return Module.HEAP32.buffer.slice(GraphAssembly.#e,GraphAssembly.#e+GraphAssembly.#r)}static saveState(e){localStorage.setItem("positions",JSON.stringify(new Float32Array(GraphAssembly.positions).map((e=>Math.round(e)))))}static loadState(){let e=localStorage.getItem("positions"),r=null;if(e&&(r=new Float32Array(Object.values(JSON.parse(e)))),!r||!e||r.length!=2*GraphAssembly.nodeCount){r=new Float32Array(2*GraphAssembly.nodeCount);let e=GraphAssembly.averageRadius*Math.sqrt(GraphAssembly.nodeCount)*2;for(let t=0;t{try{var e=renderWorker.canvasSidebar.classList.contains("is-collapsed")}catch(e){return}running&&e?running=!1:running||e||(running=!0,renderWorker.autoResizeCanvas(),renderWorker.centerCamera())}),1e3))}function updateGraph(){if(running&&!renderWorker.canvasSidebar.classList.contains("is-collapsed")&&(GraphAssembly.update(mouseWorldPos,renderWorker.grabbedNode,renderWorker.cameraScale),GraphAssembly.hoveredNode!=renderWorker.hoveredNode&&(renderWorker.hoveredNode=GraphAssembly.hoveredNode,renderWorker.canvas.style.cursor=-1==GraphAssembly.hoveredNode?"default":"pointer"),renderWorker.draw(GraphAssembly.positions),averageFPS=.95*averageFPS+.05*pixiApp.ticker.FPS,averageFPS<.9*targetFPS&&batchFraction>minBatchFraction&&(batchFraction=Math.max(batchFraction-.5/targetFPS,minBatchFraction),GraphAssembly.batchFraction=batchFraction,GraphAssembly.repulsionForce=repulsionForce/batchFraction),0!=scrollVelocity)){renderWorker.getCameraCenterWorldspace();Math.abs(scrollVelocity)<.001&&(scrollVelocity=0),zoomGraphViewAroundPoint(mouseWorldPos,scrollVelocity),scrollVelocity*=.65}}function zoomGraphViewAroundPoint(e,r,t=.15,a=15){let s=renderWorker.getCameraCenterWorldspace();if(renderWorker.cameraScale=Math.max(Math.min(renderWorker.cameraScale+r*renderWorker.cameraScale,a),t),renderWorker.cameraScale!=t&&renderWorker.cameraScale!=a&&scrollVelocity>0&&null!=mouseWorldPos.x&&null!=mouseWorldPos.y){let t={x:e.x-s.x,y:e.y-s.y},a={x:s.x+t.x*r,y:s.y+t.y*r};renderWorker.setCameraCenterWorldspace(a)}else renderWorker.setCameraCenterWorldspace(s)}function scaleGraphViewAroundPoint(e,r,t=.15,a=15){let s=renderWorker.getCameraCenterWorldspace(),o=renderWorker.cameraScale;renderWorker.cameraScale=Math.max(Math.min(r*renderWorker.cameraScale,a),t);let i=(o-renderWorker.cameraScale)/o;if(renderWorker.cameraScale!=t&&renderWorker.cameraScale!=a&&0!=r){let r={x:e.x-s.x,y:e.y-s.y},t={x:s.x-r.x*i,y:s.y-r.y*i};renderWorker.setCameraCenterWorldspace(t)}else renderWorker.setCameraCenterWorldspace(s)}function initializeGraphEvents(){window.addEventListener("beforeunload",(()=>{running=!1,GraphAssembly.free()}));let e=!1,r=renderWorker.canvas.width;window.addEventListener("resize",(()=>{(e||renderWorker.canvas.width!=r)&&(renderWorker.autoResizeCanvas(),renderWorker.centerCamera())}));let t=document.querySelector(".graph-view-container");function a(e){e.composedPath().includes(t)||s()}function s(){let r=t.clientWidth,s=t.clientHeight;t.classList.add("scale-down"),t.animate({opacity:0},{duration:100,easing:"ease-in",fill:"forwards"}).addEventListener("finish",(function(){t.classList.toggle("expanded"),renderWorker.autoResizeCanvas(),renderWorker.centerCamera();let e=t.clientWidth,a=t.clientHeight;renderWorker.cameraScale*=(e/r+a/s)/2,t.classList.remove("scale-down"),t.classList.add("scale-up"),updateGraph(),t.animate({opacity:1},{duration:200,easing:"ease-out",fill:"forwards"}).addEventListener("finish",(function(){t.classList.remove("scale-up")}))})),e=!e,e?document.addEventListener("pointerdown",a):document.removeEventListener("pointerdown",a)}function o(e){var r=renderWorker.canvas.getBoundingClientRect();let t=getPointerPosition(e);return{x:t.x-r.left,y:t.y-r.top}}let i={x:0,y:0},n={x:0,y:0},d={x:0,y:0},l={x:0,y:0},c={x:0,y:0},h=0,m=!1,p=!1,u=!1,y=document.querySelector(".graph-view-container"),g=-1;y.addEventListener("pointerenter",(function(r){let t=0,a=!1;function b(e){n=o(e),mouseWorldPos=renderWorker.vecToWorldspace(n),l={x:n.x-d.x,y:n.y-d.y},d=n,-1!=renderWorker.grabbedNode&&(c={x:n.x-i.x,y:n.y-i.y}),m&&-1!=renderWorker.hoveredNode&&-1==renderWorker.grabbedNode&&renderWorker.hoveredNode!=renderWorker.grabbedNode&&(renderWorker.grabbedNode=renderWorker.hoveredNode),m&&-1==renderWorker.hoveredNode&&-1==renderWorker.grabbedNode||p?renderWorker.cameraOffset={x:renderWorker.cameraOffset.x+l.x,y:renderWorker.cameraOffset.y+l.y}:-1!=renderWorker.hoveredNode?renderWorker.canvas.style.cursor="pointer":renderWorker.canvas.style.cursor="default"}function v(e){if(1==e.touches?.length)return a&&(d=o(e),a=!1),void b(e);if(2==e.touches?.length){let r=getTouchPosition(e.touches[0]),s=getTouchPosition(e.touches[1]);n=o(e),l={x:n.x-d.x,y:n.y-d.y},d=n;let i=Math.sqrt(Math.pow(r.x-s.x,2)+Math.pow(r.y-s.y,2));a||(a=!0,t=i,l={x:0,y:0},mouseWorldPos={x:void 0,y:void 0},renderWorker.grabbedNode=-1,renderWorker.hoveredNode=-1);let c=(i-t)/t;scaleGraphViewAroundPoint(renderWorker.vecToWorldspace(n),1+c,.15,15),renderWorker.cameraOffset={x:renderWorker.cameraOffset.x+l.x,y:renderWorker.cameraOffset.y+l.y},t=i}}function k(r){document.removeEventListener("pointerup",k);let t=Date.now();setTimeout((()=>{m&&-1!=renderWorker.hoveredNode&&Math.abs(c.x)<=4&&Math.abs(c.y)<=4&&t-h<300&&async function(r){e?s():GraphAssembly.saveState(renderWorker);let t=nodes.paths[r];window.location.pathname.endsWith(nodes.paths[r])||await loadDocument(t)}(renderWorker.hoveredNode),m&&-1!=renderWorker.grabbedNode&&(renderWorker.grabbedNode=-1),0==r.button&&(m=!1),"touch"==r.pointerType&&g==r.pointerId&&(g=-1,m=!1),1==r.button&&(p=!1),u||(document.removeEventListener("mousemove",b),document.removeEventListener("touchmove",v))}),0)}function f(e){document.addEventListener("pointerup",k),mouseWorldPos=renderWorker.vecToWorldspace(n),c={x:0,y:0},0==e.button&&(m=!0),"touch"==e.pointerType&&-1==g&&(g=e.pointerId,m=!0),1==e.button&&(p=!0),i=n,h=Date.now(),m&&-1!=renderWorker.hoveredNode&&(renderWorker.grabbedNode=renderWorker.hoveredNode)}n=o(r),mouseWorldPos=renderWorker.vecToWorldspace(n),d=o(r),u=!0,document.addEventListener("mousemove",b),document.addEventListener("touchmove",v),y.addEventListener("pointerdown",f),y.addEventListener("pointerleave",(function e(r){setTimeout((()=>{u=!1,m||(document.removeEventListener("mousemove",b),document.removeEventListener("touchmove",v),mouseWorldPos={x:void 0,y:void 0}),y.removeEventListener("pointerdown",f),y.removeEventListener("pointerleave",e)}),1)}))})),document.querySelector(".graph-expand.graph-icon")?.addEventListener("click",(e=>{e.stopPropagation(),s()})),y.addEventListener("wheel",(function(e){let r=.09;e.deltaY>0?(scrollVelocity>=-.09&&(scrollVelocity=-.09),scrollVelocity*=1.4):(scrollVelocity<=r&&(scrollVelocity=r),scrollVelocity*=1.4)})),document.querySelector(".theme-toggle-input")?.addEventListener("change",(e=>{setTimeout((()=>renderWorker.resampleColors()),0)}))}Module.onRuntimeInitialized=initializeGraphView,setTimeout((()=>Module.onRuntimeInitialized()),300) \ No newline at end of file diff --git a/reti-di-elaboratori/lib/scripts/graph_wasm.js b/reti-di-elaboratori/lib/scripts/graph_wasm.js new file mode 100644 index 0000000..816023d --- /dev/null +++ b/reti-di-elaboratori/lib/scripts/graph_wasm.js @@ -0,0 +1 @@ +var read_,readAsync,readBinary,setWindowTitle,Module=void 0!==Module?Module:{},moduleOverrides=Object.assign({},Module),arguments_=[],thisProgram="./this.program",quit_=(e,n)=>{throw n},ENVIRONMENT_IS_WEB="object"==typeof window,ENVIRONMENT_IS_WORKER="function"==typeof importScripts,ENVIRONMENT_IS_NODE="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,scriptDirectory="";function locateFile(e){return Module.locateFile?Module.locateFile(e,scriptDirectory):scriptDirectory+e}if(ENVIRONMENT_IS_NODE){var fs=require("fs"),nodePath=require("path");scriptDirectory=ENVIRONMENT_IS_WORKER?nodePath.dirname(scriptDirectory)+"/":__dirname+"/",read_=(e,n)=>(e=isFileURI(e)?new URL(e):nodePath.normalize(e),fs.readFileSync(e,n?void 0:"utf8")),readBinary=e=>{var n=read_(e,!0);return n.buffer||(n=new Uint8Array(n)),n},readAsync=(e,n,t)=>{e=isFileURI(e)?new URL(e):nodePath.normalize(e),fs.readFile(e,(function(e,r){e?t(e):n(r.buffer)}))},!Module.thisProgram&&process.argv.length>1&&(thisProgram=process.argv[1].replace(/\\/g,"/")),arguments_=process.argv.slice(2),"undefined"!=typeof module&&(module.exports=Module),process.on("uncaughtException",(function(e){if(!("unwind"===e||e instanceof ExitStatus||e.context instanceof ExitStatus))throw e}));var nodeMajor=process.versions.node.split(".")[0];nodeMajor<15&&process.on("unhandledRejection",(function(e){throw e})),quit_=(e,n)=>{throw process.exitCode=e,n},Module.inspect=function(){return"[Emscripten Module object]"}}else(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&(ENVIRONMENT_IS_WORKER?scriptDirectory=self.location.href:"undefined"!=typeof document&&document.currentScript&&(scriptDirectory=document.currentScript.src),scriptDirectory=0!==scriptDirectory.indexOf("blob:")?scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1):"",read_=e=>{var n=new XMLHttpRequest;return n.open("GET",e,!1),n.send(null),n.responseText},ENVIRONMENT_IS_WORKER&&(readBinary=e=>{var n=new XMLHttpRequest;return n.open("GET",e,!1),n.responseType="arraybuffer",n.send(null),new Uint8Array(n.response)}),readAsync=(e,n,t)=>{var r=new XMLHttpRequest;r.open("GET",e,!0),r.responseType="arraybuffer",r.onload=()=>{200==r.status||0==r.status&&r.response?n(r.response):t()},r.onerror=t,r.send(null)},setWindowTitle=e=>document.title=e);var wasmBinary,out=Module.print||console.log.bind(console),err=Module.printErr||console.warn.bind(console);Object.assign(Module,moduleOverrides),moduleOverrides=null,Module.arguments&&(arguments_=Module.arguments),Module.thisProgram&&(thisProgram=Module.thisProgram),Module.quit&&(quit_=Module.quit),Module.wasmBinary&&(wasmBinary=Module.wasmBinary);var wasmMemory,noExitRuntime=Module.noExitRuntime||!0;"object"!=typeof WebAssembly&&abort("no native wasm support detected");var EXITSTATUS,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64,wasmTable,ABORT=!1;function updateMemoryViews(){var e=wasmMemory.buffer;Module.HEAP8=HEAP8=new Int8Array(e),Module.HEAP16=HEAP16=new Int16Array(e),Module.HEAP32=HEAP32=new Int32Array(e),Module.HEAPU8=HEAPU8=new Uint8Array(e),Module.HEAPU16=HEAPU16=new Uint16Array(e),Module.HEAPU32=HEAPU32=new Uint32Array(e),Module.HEAPF32=HEAPF32=new Float32Array(e),Module.HEAPF64=HEAPF64=new Float64Array(e)}var __ATPRERUN__=[],__ATINIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1;function preRun(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(e){__ATPRERUN__.unshift(e)}function addOnInit(e){__ATINIT__.unshift(e)}function addOnPostRun(e){__ATPOSTRUN__.unshift(e)}var runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function addRunDependency(e){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}function removeRunDependency(e){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),0==runDependencies&&(null!==runDependencyWatcher&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var n=dependenciesFulfilled;dependenciesFulfilled=null,n()}}function abort(e){throw Module.onAbort&&Module.onAbort(e),err(e="Aborted("+e+")"),ABORT=!0,EXITSTATUS=1,e+=". Build with -sASSERTIONS for more info.",new WebAssembly.RuntimeError(e)}var wasmBinaryFile,tempDouble,tempI64,dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(e){return e.startsWith(dataURIPrefix)}function isFileURI(e){return e.startsWith("file://")}function getBinary(e){try{if(e==wasmBinaryFile&&wasmBinary)return new Uint8Array(wasmBinary);if(readBinary)return readBinary(e);throw"both async and sync fetching of the wasm failed"}catch(e){abort(e)}}function getBinaryPromise(e){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if("function"==typeof fetch&&!isFileURI(e))return fetch(e,{credentials:"same-origin"}).then((function(n){if(!n.ok)throw"failed to load wasm binary file at '"+e+"'";return n.arrayBuffer()})).catch((function(){return getBinary(e)}));if(readAsync)return new Promise((function(n,t){readAsync(e,(function(e){n(new Uint8Array(e))}),t)}))}return Promise.resolve().then((function(){return getBinary(e)}))}function instantiateArrayBuffer(e,n,t){return getBinaryPromise(e).then((function(e){return WebAssembly.instantiate(e,n)})).then((function(e){return e})).then(t,(function(e){err("failed to asynchronously prepare wasm: "+e),abort(e)}))}function instantiateAsync(e,n,t,r){return e||"function"!=typeof WebAssembly.instantiateStreaming||isDataURI(n)||isFileURI(n)||ENVIRONMENT_IS_NODE||"function"!=typeof fetch?instantiateArrayBuffer(n,t,r):fetch(n,{credentials:"same-origin"}).then((function(e){return WebAssembly.instantiateStreaming(e,t).then(r,(function(e){return err("wasm streaming compile failed: "+e),err("falling back to ArrayBuffer instantiation"),instantiateArrayBuffer(n,t,r)}))}))}function createWasm(){var e={a:wasmImports};function n(e,n){var t=e.exports;return Module.asm=t,wasmMemory=Module.asm.f,updateMemoryViews(),wasmTable=Module.asm.r,addOnInit(Module.asm.g),removeRunDependency("wasm-instantiate"),t}if(addRunDependency("wasm-instantiate"),Module.instantiateWasm)try{return Module.instantiateWasm(e,n)}catch(e){return err("Module.instantiateWasm callback failed with error: "+e),!1}return instantiateAsync(wasmBinary,wasmBinaryFile,e,(function(e){n(e.instance)})),{}}isDataURI(wasmBinaryFile="graph_wasm.wasm")||(wasmBinaryFile=locateFile(wasmBinaryFile));var ASM_CONSTS={2304:e=>{console.log(UTF8ToString(e))}};function ExitStatus(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function callRuntimeCallbacks(e){for(;e.length>0;)e.shift()(Module)}function getValue(e,n="i8"){switch(n.endsWith("*")&&(n="*"),n){case"i1":case"i8":return HEAP8[e>>0];case"i16":return HEAP16[e>>1];case"i32":case"i64":return HEAP32[e>>2];case"float":return HEAPF32[e>>2];case"double":return HEAPF64[e>>3];case"*":return HEAPU32[e>>2];default:abort("invalid type for getValue: "+n)}}function setValue(e,n,t="i8"){switch(t.endsWith("*")&&(t="*"),t){case"i1":case"i8":HEAP8[e>>0]=n;break;case"i16":HEAP16[e>>1]=n;break;case"i32":HEAP32[e>>2]=n;break;case"i64":tempI64=[n>>>0,(tempDouble=n,+Math.abs(tempDouble)>=1?tempDouble>0?(0|Math.min(+Math.floor(tempDouble/4294967296),4294967295))>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[e>>2]=tempI64[0],HEAP32[e+4>>2]=tempI64[1];break;case"float":HEAPF32[e>>2]=n;break;case"double":HEAPF64[e>>3]=n;break;case"*":HEAPU32[e>>2]=n;break;default:abort("invalid type for setValue: "+t)}}function _abort(){abort("")}var readEmAsmArgsArray=[];function readEmAsmArgs(e,n){var t;for(readEmAsmArgsArray.length=0,n>>=2;t=HEAPU8[e++];)n+=105!=t&n,readEmAsmArgsArray.push(105==t?HEAP32[n]:HEAPF64[n++>>1]),++n;return readEmAsmArgsArray}function runEmAsmFunction(e,n,t){var r=readEmAsmArgs(n,t);return ASM_CONSTS[e].apply(null,r)}function _emscripten_asm_const_int(e,n,t){return runEmAsmFunction(e,n,t)}function _emscripten_date_now(){return Date.now()}function _emscripten_memcpy_big(e,n,t){HEAPU8.copyWithin(e,n,n+t)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(e){var n=wasmMemory.buffer;try{return wasmMemory.grow(e-n.byteLength+65535>>>16),updateMemoryViews(),1}catch(e){}}function _emscripten_resize_heap(e){var n=HEAPU8.length;e>>>=0;var t=getHeapMax();if(e>t)return!1;for(var r=1;r<=4;r*=2){var o=n*(1+.2/r);if(o=Math.min(o,e+100663296),emscripten_realloc_buffer(Math.min(t,(a=Math.max(e,o))+((i=65536)-a%i)%i)))return!0}var a,i;return!1}function getCFunc(e){return Module["_"+e]}function writeArrayToMemory(e,n){HEAP8.set(e,n)}function lengthBytesUTF8(e){for(var n=0,t=0;t=55296&&r<=57343?(n+=4,++t):n+=3}return n}function stringToUTF8Array(e,n,t,r){if(!(r>0))return 0;for(var o=t,a=t+r-1,i=0;i=55296&&u<=57343)u=65536+((1023&u)<<10)|1023&e.charCodeAt(++i);if(u<=127){if(t>=a)break;n[t++]=u}else if(u<=2047){if(t+1>=a)break;n[t++]=192|u>>6,n[t++]=128|63&u}else if(u<=65535){if(t+2>=a)break;n[t++]=224|u>>12,n[t++]=128|u>>6&63,n[t++]=128|63&u}else{if(t+3>=a)break;n[t++]=240|u>>18,n[t++]=128|u>>12&63,n[t++]=128|u>>6&63,n[t++]=128|63&u}}return n[t]=0,t-o}function stringToUTF8(e,n,t){return stringToUTF8Array(e,HEAPU8,n,t)}function stringToUTF8OnStack(e){var n=lengthBytesUTF8(e)+1,t=stackAlloc(n);return stringToUTF8(e,t,n),t}var UTF8Decoder="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(e,n,t){for(var r=n+t,o=n;e[o]&&!(o>=r);)++o;if(o-n>16&&e.buffer&&UTF8Decoder)return UTF8Decoder.decode(e.subarray(n,o));for(var a="";n>10,56320|1023&s)}}else a+=String.fromCharCode((31&i)<<6|u)}else a+=String.fromCharCode(i)}return a}function UTF8ToString(e,n){return e?UTF8ArrayToString(HEAPU8,e,n):""}function ccall(e,n,t,r,o){var a={string:e=>{var n=0;return null!=e&&0!==e&&(n=stringToUTF8OnStack(e)),n},array:e=>{var n=stackAlloc(e.length);return writeArrayToMemory(e,n),n}};var i=getCFunc(e),u=[],l=0;if(r)for(var s=0;s"number"===e||"boolean"===e));return"string"!==n&&o&&!r?getCFunc(e):function(){return ccall(e,n,t,arguments,r)}}var calledRun,wasmImports={b:_abort,e:_emscripten_asm_const_int,d:_emscripten_date_now,c:_emscripten_memcpy_big,a:_emscripten_resize_heap},asm=createWasm(),___wasm_call_ctors=function(){return(___wasm_call_ctors=Module.asm.g).apply(null,arguments)},_SetBatchFractionSize=Module._SetBatchFractionSize=function(){return(_SetBatchFractionSize=Module._SetBatchFractionSize=Module.asm.h).apply(null,arguments)},_SetAttractionForce=Module._SetAttractionForce=function(){return(_SetAttractionForce=Module._SetAttractionForce=Module.asm.i).apply(null,arguments)},_SetLinkLength=Module._SetLinkLength=function(){return(_SetLinkLength=Module._SetLinkLength=Module.asm.j).apply(null,arguments)},_SetRepulsionForce=Module._SetRepulsionForce=function(){return(_SetRepulsionForce=Module._SetRepulsionForce=Module.asm.k).apply(null,arguments)},_SetCentralForce=Module._SetCentralForce=function(){return(_SetCentralForce=Module._SetCentralForce=Module.asm.l).apply(null,arguments)},_SetDt=Module._SetDt=function(){return(_SetDt=Module._SetDt=Module.asm.m).apply(null,arguments)},_Init=Module._Init=function(){return(_Init=Module._Init=Module.asm.n).apply(null,arguments)},_Update=Module._Update=function(){return(_Update=Module._Update=Module.asm.o).apply(null,arguments)},_SetPosition=Module._SetPosition=function(){return(_SetPosition=Module._SetPosition=Module.asm.p).apply(null,arguments)},_FreeMemory=Module._FreeMemory=function(){return(_FreeMemory=Module._FreeMemory=Module.asm.q).apply(null,arguments)},___errno_location=function(){return(___errno_location=Module.asm.__errno_location).apply(null,arguments)},_malloc=Module._malloc=function(){return(_malloc=Module._malloc=Module.asm.s).apply(null,arguments)},_free=Module._free=function(){return(_free=Module._free=Module.asm.t).apply(null,arguments)},stackSave=function(){return(stackSave=Module.asm.u).apply(null,arguments)},stackRestore=function(){return(stackRestore=Module.asm.v).apply(null,arguments)},stackAlloc=function(){return(stackAlloc=Module.asm.w).apply(null,arguments)},___cxa_is_pointer_type=function(){return(___cxa_is_pointer_type=Module.asm.__cxa_is_pointer_type).apply(null,arguments)};function run(){function e(){calledRun||(calledRun=!0,Module.calledRun=!0,ABORT||(initRuntime(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),postRun()))}runDependencies>0||(preRun(),runDependencies>0||(Module.setStatus?(Module.setStatus("Running..."),setTimeout((function(){setTimeout((function(){Module.setStatus("")}),1),e()}),1)):e()))}if(Module.cwrap=cwrap,Module.setValue=setValue,Module.getValue=getValue,dependenciesFulfilled=function e(){calledRun||run(),calledRun||(dependenciesFulfilled=e)},Module.preInit)for("function"==typeof Module.preInit&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();run() \ No newline at end of file diff --git a/reti-di-elaboratori/lib/scripts/graph_wasm.wasm b/reti-di-elaboratori/lib/scripts/graph_wasm.wasm new file mode 100644 index 0000000..e94bee2 Binary files /dev/null and b/reti-di-elaboratori/lib/scripts/graph_wasm.wasm differ diff --git a/reti-di-elaboratori/lib/scripts/tinycolor.js b/reti-di-elaboratori/lib/scripts/tinycolor.js new file mode 100644 index 0000000..3c4a921 --- /dev/null +++ b/reti-di-elaboratori/lib/scripts/tinycolor.js @@ -0,0 +1 @@ +function w3color(t,e){return this instanceof w3color?"object"==typeof t?t:(this.attachValues(toColorObject(t)),void(e&&(e.style.backgroundColor=this.toRgbString()))):new w3color(t,e)}function toColorObject(t){var e,r,a,n,i,s,o,h,f,u,l,c=[],b=[],d=[];if(e=(t=w3trim(t.toLowerCase())).substr(0,1).toUpperCase(),r=t.substr(1),h=1,"R"!=e&&"Y"!=e&&"G"!=e&&"C"!=e&&"B"!=e&&"M"!=e&&"W"!=e||isNaN(r)||(6!=t.length||-1!=t.indexOf(","))&&(t="ncol("+t+")"),3==t.length||6==t.length||isNaN(t)||(t="ncol("+t+")"),t.indexOf(",")>0&&-1==t.indexOf("(")&&(t="ncol("+t+")"),"rgb"==t.substr(0,3)||"hsl"==t.substr(0,3)||"hwb"==t.substr(0,3)||"ncol"==t.substr(0,4)||"cmyk"==t.substr(0,4)){if("ncol"==t.substr(0,4)?(4==t.split(",").length&&-1==t.indexOf("ncola")&&(t=t.replace("ncol","ncola")),a="ncol",t=t.substr(4)):"cmyk"==t.substr(0,4)?(a="cmyk",t=t.substr(4)):(a=t.substr(0,3),t=t.substr(3)),n=3,s=!1,"a"==t.substr(0,1).toLowerCase()?(n=4,s=!0,t=t.substr(1)):"cmyk"==a&&(n=4,5==t.split(",").length&&(n=5,s=!0)),c=(t=(t=t.replace("(","")).replace(")","")).split(","),"rgb"==a){if(c.length!=n)return emptyObject();for(i=0;i-1&&(c[i]=c[i].replace("%",""),c[i]=Number(c[i]/100),i<3&&(c[i]=Math.round(255*c[i]))),isNaN(c[i]))return emptyObject();parseInt(c[i])>255&&(c[i]=255),i<3&&(c[i]=parseInt(c[i])),3==i&&Number(c[i])>1&&(c[i]=1)}l={r:c[0],g:c[1],b:c[2]},1==s&&(h=Number(c[3]))}if("hsl"==a||"hwb"==a||"ncol"==a){for(;c.length=360&&(c[0]=0),i=1;i-1){if(c[i]=c[i].replace("%",""),c[i]=Number(c[i]),isNaN(c[i]))return emptyObject();c[i]=c[i]/100}else c[i]=Number(c[i]);Number(c[i])>1&&(c[i]=1),0>Number(c[i])&&(c[i]=0)}"hsl"==a&&(l=hslToRgb(c[0],c[1],c[2]),f=Number(c[0]),u=Number(c[1])),"hwb"==a&&(l=hwbToRgb(c[0],c[1],c[2])),"ncol"==a&&(l=ncolToRgb(c[0],c[1],c[2])),1==s&&(h=Number(c[3]))}if("cmyk"==a){for(;c.length-1){if(c[i]=c[i].replace("%",""),c[i]=Number(c[i]),isNaN(c[i]))return emptyObject();c[i]=c[i]/100}else c[i]=Number(c[i]);Number(c[i])>1&&(c[i]=1),0>Number(c[i])&&(c[i]=0)}l=cmykToRgb(c[0],c[1],c[2],c[3]),1==s&&(h=Number(c[4]))}}else if("ncs"==t.substr(0,3))l=ncsToRgb(t);else{for(i=0,o=!1,b=getColorArr("names");i=6&&(r-=6),r<1?(e-t)*r+t:r<3?e:r<4?(e-t)*(4-r)+t:t}function hwbToRgb(t,e,r){var a,n,i,s=[];for(n=hslToRgb(t,1,.5),s[0]=n.r/255,s[1]=n.g/255,s[2]=n.b/255,(i=e+r)>1&&(e=Number((e/i).toFixed(2)),r=Number((r/i).toFixed(2))),a=0;a<3;a++)s[a]*=1-e-r,s[a]+=e,s[a]=Number(255*s[a]);return{r:s[0],g:s[1],b:s[2]}}function cmykToRgb(t,e,r,a){return{r:255-255*Math.min(1,t*(1-a)+a),g:255-255*Math.min(1,e*(1-a)+a),b:255-255*Math.min(1,r*(1-a)+a)}}function ncolToRgb(t,e,r){var a,n,i;if(i=t,isNaN(t.substr(0,1))){if(a=t.substr(0,1).toUpperCase(),""==(n=t.substr(1))&&(n=0),isNaN(n=Number(n)))return!1;"R"==a&&(i=0+.6*n),"Y"==a&&(i=60+.6*n),"G"==a&&(i=120+.6*n),"C"==a&&(i=180+.6*n),"B"==a&&(i=240+.6*n),"M"==a&&(i=300+.6*n),"W"==a&&(i=0,e=1-n/100,r=n/100)}return hwbToRgb(i,e,r)}function hueToNcol(t){for(;t>=360;)t-=360;return t<60?"R"+t/.6:t<120?"Y"+(t-60)/.6:t<180?"G"+(t-120)/.6:t<240?"C"+(t-180)/.6:t<300?"B"+(t-240)/.6:t<360?"M"+(t-300)/.6:void 0}function ncsToRgb(t){var e,r,a,n,i,s,o,h,f,u,l,c,b,d,g,m,p;return-1==(t=(t=(t=(t=(t=w3trim(t).toUpperCase()).replace("(","")).replace(")","")).replace("NCS","NCS ")).replace(/ /g," ")).indexOf("NCS")&&(t="NCS "+t),null!==(t=t.match(/^(?:NCS|NCS\sS)\s(\d{2})(\d{2})-(N|[A-Z])(\d{2})?([A-Z])?$/))&&(e=parseInt(t[1],10),r=parseInt(t[2],10),("N"==(a=t[3])||"Y"==a||"R"==a||"B"==a||"G"==a)&&(n=parseInt(t[4],10)||0,"N"!==a?(i=1.05*e-5.25,s=r,"Y"===a&&n<=60?o=1:"Y"===a&&n>60||"R"===a&&n<=80?o=(Math.sqrt(14884-Math.pow(h="Y"===a?n-60:n+40,2))-22)/100:"R"===a&&n>80||"B"===a?o=0:"G"===a&&(o=(Math.sqrt(33800-Math.pow(h=n-170,2))-70)/100),"Y"===a&&n<=80?f=0:"Y"===a&&n>80||"R"===a&&n<=60?f=(104-Math.sqrt(11236-Math.pow(h="Y"===a?n-80+20.5:n+20+20.5,2)))/100:"R"===a&&n>60||"B"===a&&n<=80?f=(Math.sqrt(1e4-Math.pow(h="R"===a?n-60-60:n+40-60,2))-10)/100:"B"===a&&n>80||"G"===a&&n<=40?f=(122-Math.sqrt(19881-Math.pow(h="B"===a?n-80-131:n+20-131,2)))/100:"G"===a&&n>40&&(f=0),"Y"===a?green1=(85-.85*n)/100:"R"===a&&n<=60?green1=0:"R"===a&&n>60?green1=(67.5-Math.sqrt(5776-Math.pow(h=n-60+35,2)))/100:"B"===a&&n<=60?green1=(6.5+Math.sqrt(7044.5-Math.pow(h=1*n-68.5,2)))/100:"B"===a&&n>60||"G"===a&&n<=60?green1=.9:"G"===a&&n>60&&(green1=(90-1/8*(h=n-60))/100),u=((h=(o+green1+f)/3)-o)*(100-s)/100+o,c=(h-f)*(100-s)/100+f,b=1/(u>(l=(h-green1)*(100-s)/100+green1)&&u>c?u:l>u&&l>c?l:c>u&&c>l?c:(u+l+c)/3),(g=parseInt(u*b*(100-i)/100*255,10))>255&&(g=255),(m=parseInt(l*b*(100-i)/100*255,10))>255&&(m=255),(p=parseInt(c*b*(100-i)/100*255,10))>255&&(p=255),g<0&&(g=0),m<0&&(m=0),p<0&&(p=0)):((d=parseInt(255*(1-e/100),10))>255&&(d=255),d<0&&(d=0),g=d,m=d,p=d),{r:g,g:m,b:p}))}function rgbToHsl(t,e,r){var a,n,i,s,o,h,f=[];for(i=0,f[0]=t/255,f[1]=e/255,f[2]=r/255,a=f[0],n=f[0],o=0;i=n&&(n=f[i+1],o=i+1);return 0==o&&(h=(f[1]-f[2])/(n-a)),1==o&&(h=2+(f[2]-f[0])/(n-a)),2==o&&(h=4+(f[0]-f[1])/(n-a)),isNaN(h)&&(h=0),(h*=60)<0&&(h+=360),s=(a+n)/2,{h:h,s:a==n?0:s<.5?(n-a)/(n+a):(n-a)/(2-n-a),l:s}}function rgbToHwb(t,e,r){return t/=255,e/=255,r/=255,{h:0==(chroma=(max=Math.max(t,e,r))-(min=Math.min(t,e,r)))?0:t==max?(e-r)/chroma%6*360:e==max?((r-t)/chroma+2)%6*360:((t-e)/chroma+4)%6*360,w:min,b:1-max}}function rgbToCmyk(t,e,r){var a,n,i,s;return t/=255,e/=255,r/=255,1==(s=1-(max=Math.max(t,e,r)))?(a=0,n=0,i=0):(a=(1-t-s)/(1-s),n=(1-e-s)/(1-s),i=(1-r-s)/(1-s)),{c:a,m:n,y:i,k:s}}function toHex(t){for(var e=t.toString(16);e.length<2;)e="0"+e;return e}function cl(t){console.log(t)}function w3trim(t){return t.replace(/^\s+|\s+$/g,"")}function isHex(t){return"0123456789ABCDEFabcdef".indexOf(t)>-1}function w3SetColorsByAttribute(){var t,e,r;for(e=0,t=document.getElementsByTagName("*");e1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}if(t=w(t,360),e=w(e,100),r=w(r,100),0===e)a=n=i=r;else{var o=r<.5?r*(1+e):r+e-r*e,h=2*r-o;a=s(h,o,t+1/3),n=s(h,o,t),i=s(h,o,t-1/3)}return{r:255*a,g:255*n,b:255*i}}(s.h,f,u),l=!0,c="hsl"),s.hasOwnProperty("a")&&(h=s.a)),h=_(h),{ok:l,format:s.format||c,r:Math.min(255,Math.max(o.r,0)),g:Math.min(255,Math.max(o.g,0)),b:Math.min(255,Math.max(o.b,0)),a:h});this._originalInput=n,this._r=G.r,this._g=G.g,this._b=G.b,this._a=G.a,this._roundA=Math.round(100*this._a)/100,this._format=i.format||G.format,this._gradientType=i.gradientType,this._r<1&&(this._r=Math.round(this._r)),this._g<1&&(this._g=Math.round(this._g)),this._b<1&&(this._b=Math.round(this._b)),this._ok=G.ok}function n(t,e,r){t=w(t,255),e=w(e,255),r=w(r,255);var a,n,i=Math.max(t,e,r),s=Math.min(t,e,r),o=(i+s)/2;if(i==s)a=n=0;else{var h=i-s;switch(n=o>.5?h/(2-i-s):h/(i+s),i){case t:a=(e-r)/h+(e>1)+720)%360;--e;)n.h=(n.h+i)%360,s.push(a(n));return s}function M(t,e){e=e||6;for(var r=a(t).toHsv(),n=r.h,i=r.s,s=r.v,o=[],h=1/e;e--;)o.push(a({h:n,s:i,v:s})),s=(s+h)%1;return o}a.prototype={isDark:function(){return 128>this.getBrightness()},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,e,r,a=this.toRgb();return t=a.r/255,e=a.g/255,r=a.b/255,.2126*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.7152*(e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},setAlpha:function(t){return this._a=_(t),this._roundA=Math.round(100*this._a)/100,this},toHsv:function(){var t=i(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=i(this._r,this._g,this._b),e=Math.round(360*t.h),r=Math.round(100*t.s),a=Math.round(100*t.v);return 1==this._a?"hsv("+e+", "+r+"%, "+a+"%)":"hsva("+e+", "+r+"%, "+a+"%, "+this._roundA+")"},toHsl:function(){var t=n(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=n(this._r,this._g,this._b),e=Math.round(360*t.h),r=Math.round(100*t.s),a=Math.round(100*t.l);return 1==this._a?"hsl("+e+", "+r+"%, "+a+"%)":"hsla("+e+", "+r+"%, "+a+"%, "+this._roundA+")"},toHex:function(t){return s(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHexNumber:function(){return Number("0x"+this.toHex())},toHex8:function(t){var e,r,a,n,i,s;return e=this._r,r=this._g,a=this._b,n=this._a,i=t,s=[A(Math.round(e).toString(16)),A(Math.round(r).toString(16)),A(Math.round(a).toString(16)),A(R(n))],i&&s[0].charAt(0)==s[0].charAt(1)&&s[1].charAt(0)==s[1].charAt(1)&&s[2].charAt(0)==s[2].charAt(1)&&s[3].charAt(0)==s[3].charAt(1)?s[0].charAt(0)+s[1].charAt(0)+s[2].charAt(0)+s[3].charAt(0):s.join("")},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:Math.round(this._r),g:Math.round(this._g),b:Math.round(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+")":"rgba("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:Math.round(100*w(this._r,255))+"%",g:Math.round(100*w(this._g,255))+"%",b:Math.round(100*w(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+Math.round(100*w(this._r,255))+"%, "+Math.round(100*w(this._g,255))+"%, "+Math.round(100*w(this._b,255))+"%)":"rgba("+Math.round(100*w(this._r,255))+"%, "+Math.round(100*w(this._g,255))+"%, "+Math.round(100*w(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1||!v[s(this._r,this._g,this._b,!0)])},toFilter:function(t){var e="#"+o(this._r,this._g,this._b,this._a),r=e,n=this._gradientType?"GradientType = 1, ":"";if(t){var i=a(t);r="#"+o(i._r,i._g,i._b,i._a)}return"progid:DXImageTransform.Microsoft.gradient("+n+"startColorstr="+e+",endColorstr="+r+")"},toString:function(t){var e=!!t;t=t||this._format;var r=!1,a=this._a<1&&this._a>=0;return e||!a||"hex"!==t&&"hex6"!==t&&"hex3"!==t&&"hex4"!==t&&"hex8"!==t&&"name"!==t?("rgb"===t&&(r=this.toRgbString()),"prgb"===t&&(r=this.toPercentageRgbString()),("hex"===t||"hex6"===t)&&(r=this.toHexString()),"hex3"===t&&(r=this.toHexString(!0)),"hex4"===t&&(r=this.toHex8String(!0)),"hex8"===t&&(r=this.toHex8String()),"name"===t&&(r=this.toName()),"hsl"===t&&(r=this.toHslString()),"hsv"===t&&(r=this.toHsvString()),r||this.toHexString()):"name"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return a(this.toString())},_applyModification:function(t,e){var r=t.apply(null,[this].concat([].slice.call(e)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(l,arguments)},brighten:function(){return this._applyModification(c,arguments)},darken:function(){return this._applyModification(b,arguments)},desaturate:function(){return this._applyModification(h,arguments)},saturate:function(){return this._applyModification(f,arguments)},greyscale:function(){return this._applyModification(u,arguments)},spin:function(){return this._applyModification(d,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(y,arguments)},complement:function(){return this._applyCombination(g,arguments)},monochromatic:function(){return this._applyCombination(M,arguments)},splitcomplement:function(){return this._applyCombination(p,arguments)},triad:function(){return this._applyCombination(m,[3])},tetrad:function(){return this._applyCombination(m,[4])}},a.fromRatio=function(e,r){if("object"==t(e)){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]="a"===i?e[i]:N(e[i]));e=n}return a(e,r)},a.equals=function(t,e){return!!t&&!!e&&a(t).toRgbString()==a(e).toRgbString()},a.random=function(){return a.fromRatio({r:Math.random(),g:Math.random(),b:Math.random()})},a.mix=function(t,e,r){r=0===r?0:r||50;var n=a(t).toRgb(),i=a(e).toRgb(),s=r/100;return a({r:(i.r-n.r)*s+n.r,g:(i.g-n.g)*s+n.g,b:(i.b-n.b)*s+n.b,a:(i.a-n.a)*s+n.a})},a.readability=function(t,e){var r=a(t),n=a(e);return(Math.max(r.getLuminance(),n.getLuminance())+.05)/(Math.min(r.getLuminance(),n.getLuminance())+.05)},a.isReadable=function(t,e,r){var n,i,s,o,h,f=a.readability(t,e);switch(i=!1,(s=r,o=((s=s||{level:"AA",size:"small"}).level||"AA").toUpperCase(),h=(s.size||"small").toLowerCase(),"AA"!==o&&"AAA"!==o&&(o="AA"),"small"!==h&&"large"!==h&&(h="small"),n={level:o,size:h}).level+n.size){case"AAsmall":case"AAAlarge":i=f>=4.5;break;case"AAlarge":i=f>=3;break;case"AAAsmall":i=f>=7}return i},a.mostReadable=function(t,e,r){var n,i,s,o,h=null,f=0;i=(r=r||{}).includeFallbackColors,s=r.level,o=r.size;for(var u=0;uf&&(f=n,h=a(e[u]));return a.isReadable(t,h,{level:s,size:o})||!i?h:(r.includeFallbackColors=!1,a.mostReadable(t,["#fff","#000"],r))};var k=a.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},v=a.hexNames=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}(k);function _(t){return(isNaN(t=parseFloat(t))||t<0||t>1)&&(t=1),t}function w(t,e){"string"==typeof(r=t)&&-1!=r.indexOf(".")&&1===parseFloat(r)&&(t="100%");var r,a,n="string"==typeof(a=t)&&-1!=a.indexOf("%");return t=Math.min(e,Math.max(0,parseFloat(t))),n&&(t=parseInt(t*e,10)/100),1e-6>Math.abs(t-e)?1:t%e/parseFloat(e)}function x(t){return Math.min(1,Math.max(0,t))}function S(t){return parseInt(t,16)}function A(t){return 1==t.length?"0"+t:""+t}function N(t){return t<=1&&(t=100*t+"%"),t}function R(t){return Math.round(255*parseFloat(t)).toString(16)}function C(t){return S(t)/255}var H,G,B,T=(G="[\\s|\\(]+("+(H="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+H+")[,|\\s]+("+H+")\\s*\\)?",B="[\\s|\\(]+("+H+")[,|\\s]+("+H+")[,|\\s]+("+H+")[,|\\s]+("+H+")\\s*\\)?",{CSS_UNIT:RegExp(H),rgb:RegExp("rgb"+G),rgba:RegExp("rgba"+B),hsl:RegExp("hsl"+G),hsla:RegExp("hsla"+B),hsv:RegExp("hsv"+G),hsva:RegExp("hsva"+B),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function F(t){return!!T.CSS_UNIT.exec(t)}return a})),w3color.prototype={toRgbString:function(){return"rgb("+this.red+", "+this.green+", "+this.blue+")"},toRgbaString:function(){return"rgba("+this.red+", "+this.green+", "+this.blue+", "+this.opacity+")"},toHwbString:function(){return"hwb("+this.hue+", "+Math.round(100*this.whiteness)+"%, "+Math.round(100*this.blackness)+"%)"},toHwbStringDecimal:function(){return"hwb("+this.hue+", "+this.whiteness+", "+this.blackness+")"},toHwbaString:function(){return"hwba("+this.hue+", "+Math.round(100*this.whiteness)+"%, "+Math.round(100*this.blackness)+"%, "+this.opacity+")"},toHslString:function(){return"hsl("+this.hue+", "+Math.round(100*this.sat)+"%, "+Math.round(100*this.lightness)+"%)"},toHslStringDecimal:function(){return"hsl("+this.hue+", "+this.sat+", "+this.lightness+")"},toHslaString:function(){return"hsla("+this.hue+", "+Math.round(100*this.sat)+"%, "+Math.round(100*this.lightness)+"%, "+this.opacity+")"},toCmykString:function(){return"cmyk("+Math.round(100*this.cyan)+"%, "+Math.round(100*this.magenta)+"%, "+Math.round(100*this.yellow)+"%, "+Math.round(100*this.black)+"%)"},toCmykStringDecimal:function(){return"cmyk("+this.cyan+", "+this.magenta+", "+this.yellow+", "+this.black+")"},toNcolString:function(){return this.ncol+", "+Math.round(100*this.whiteness)+"%, "+Math.round(100*this.blackness)+"%"},toNcolStringDecimal:function(){return this.ncol+", "+this.whiteness+", "+this.blackness},toNcolaString:function(){return this.ncol+", "+Math.round(100*this.whiteness)+"%, "+Math.round(100*this.blackness)+"%, "+this.opacity},toName:function(){var t,e,r,a=getColorArr("hexs");for(i=0;i1&&(this.sat=1),r=colorObject(hslToRgb(this.hue,this.sat,this.lightness),this.opacity,this.hue,this.sat),this.attachValues(r)},desaturate:function(t){var e,r;e=t/100||.1,this.sat-=e,this.sat<0&&(this.sat=0),r=colorObject(hslToRgb(this.hue,this.sat,this.lightness),this.opacity,this.hue,this.sat),this.attachValues(r)},lighter:function(t){var e,r;e=t/100||.1,this.lightness+=e,this.lightness>1&&(this.lightness=1),r=colorObject(hslToRgb(this.hue,this.sat,this.lightness),this.opacity,this.hue,this.sat),this.attachValues(r)},darker:function(t){var e,r;e=t/100||.1,this.lightness-=e,this.lightness<0&&(this.lightness=0),r=colorObject(hslToRgb(this.hue,this.sat,this.lightness),this.opacity,this.hue,this.sat),this.attachValues(r)},attachValues:function(t){this.red=t.red,this.green=t.green,this.blue=t.blue,this.hue=t.hue,this.sat=t.sat,this.lightness=t.lightness,this.whiteness=t.whiteness,this.blackness=t.blackness,this.cyan=t.cyan,this.magenta=t.magenta,this.yellow=t.yellow,this.black=t.black,this.ncol=t.ncol,this.opacity=t.opacity,this.valid=t.valid}} \ No newline at end of file diff --git a/reti-di-elaboratori/lib/scripts/webpage.js b/reti-di-elaboratori/lib/scripts/webpage.js new file mode 100644 index 0000000..52366e3 --- /dev/null +++ b/reti-di-elaboratori/lib/scripts/webpage.js @@ -0,0 +1 @@ +let webpageContainer,documentContainer,viewContent,leftSidebar,rightSidebar,sidebarCollapseIcons,sidebarGutters,sidebars,sidebarTargetWidth,contentTargetWidth,canvasWrapper,canvas,canvasNodes,canvasBackground,canvasBackgroundPattern,focusedCanvasNode,loadingIcon,documentType,embedType,customType,deviceSize,lastScreenWidth,isOffline=!1,collapseIconUp=["m7 15 5 5 5-5","m7 9 5-5 5 5"],collapseIconDown=["m7 20 5-5 5 5","m7 4 5 5 5-5"],isTouchDevice=isTouchCapable(),fullyInitialized=!1;function initGlobalObjects(){loadingIcon=document.createElement("div"),loadingIcon.classList.add("loading-icon"),document.body.appendChild(loadingIcon),loadingIcon.innerHTML="
",webpageContainer=document.querySelector(".webpage-container"),documentContainer=document.querySelector(".document-container"),leftSidebar=document.querySelector(".sidebar-left"),rightSidebar=document.querySelector(".sidebar-right"),sidebarCollapseIcons=Array.from(document.querySelectorAll(".sidebar-collapse-icon")),sidebarGutters=[sidebarCollapseIcons[0].parentElement,sidebarCollapseIcons[1].parentElement],sidebars=[sidebarGutters[0].parentElement,sidebarGutters[1].parentElement]}async function initializePage(){focusedCanvasNode=null,canvasWrapper=document.querySelector(".canvas-wrapper")??canvasWrapper,canvas=document.querySelector(".canvas")??canvas;let e=document.querySelectorAll(".canvas-node");canvasNodes=e.length>0?e:canvasNodes,canvasBackground=document.querySelector(".canvas-background")??canvasBackground,canvasBackgroundPattern=document.querySelector(".canvas-background pattern")??canvasBackgroundPattern,viewContent=document.querySelector(".document-container > .view-content")??document.querySelector(".document-container > .markdown-preview-view")??viewContent,fullyInitialized||(initGlobalObjects(),initializeDocumentTypes(),setupSidebars(),setupThemeToggle(),sidebarTargetWidth=await getComputedPixelValue("--sidebar-width"),contentTargetWidth=.9*await getComputedPixelValue("--line-width"),window.addEventListener("resize",(()=>onResize())),onResize(),document.body.classList.toggle("post-load",!0),document.body.classList.toggle("loading",!1),setTimeout((function(){document.body.classList.toggle("loaded",!0),document.body.classList.toggle("post-load",!1)}),2e3),fullyInitialized=!0),"video"==embedType||"embed"==embedType||"excalidraw"==customType||"kanban"==customType||"canvas"==documentType?rightSidebar.collapsed||rightSidebar.temporaryCollapse():rightSidebar.temporarilyCollapsed&&rightSidebar.collapsed&&(rightSidebar.collapse(!1),rightSidebar.temporarilyCollapsed=!1)}function initializePageEvents(e){setupHeaders(e),setupTrees(e),setupCallouts(e),setupCheckboxes(e),setupCanvas(e),setupCodeblocks(e),setupLinks(e),setupScroll(e)}function initializeDocumentTypes(){document.querySelector(".document-container > .markdown-preview-view")?documentType="markdown":document.querySelector(".canvas-wrapper")?documentType="canvas":(documentType="custom",document.querySelector(".kanban-plugin")?customType="kanban":document.querySelector(".excalidraw-plugin")&&(customType="excalidraw"))}function initializeForFileProtocol(){let e=document.querySelector(".graph-view-placeholder");e&&(console.log("Running locally, skipping graph view initialization and hiding graph."),e.style.display="none",e.previousElementSibling.style.display="none")}function onOffline(e){e.preventDefault(),e.stopPropagation(),console.log("Offline"),isOffline=!0}function onEndResize(){document.body.classList.toggle("resizing",!1)}function onStartResize(){document.body.classList.toggle("resizing",!0)}window.onload=async function(){"file:"==window.location.protocol&&initializeForFileProtocol(),await initializePage(),initializePageEvents(document)},window.addEventListener("offline",onOffline),window.onpopstate=function(e){if(e.preventDefault(),e.stopPropagation(),document.body.classList.contains("floating-sidebars")&&(!leftSidebar.collapsed||!rightSidebar.collapsed))return leftSidebar.collapse(!0),void rightSidebar.collapse(!0);loadDocument(getURLPath(),!1)};let checkStillResizingTimeout,isResizing=!1;function onResize(e=!1){function t(e,t){let o=window.innerWidth;return o>e&&oe&&o=t)}isResizing||(onStartResize(),isResizing=!0),!function(e){let t=window.innerWidth;return t>e&&null==lastScreenWidth||t>e&&lastScreenWidthe}(1.5*sidebarTargetWidth)&&(deviceSize="phone",document.body.classList.toggle("floating-sidebars",!0),document.body.classList.toggle("is-large-screen",!1),document.body.classList.toggle("is-small-screen",!1),document.body.classList.toggle("is-tablet",!1),document.body.classList.toggle("is-phone",!0),sidebars.forEach((function(e){e.collapse(!0)})),sidebarGutters.forEach((function(e){e.collapse(!1)}))):(deviceSize="large-screen",document.body.classList.toggle("floating-sidebars",!1),document.body.classList.toggle("is-large-screen",!0),document.body.classList.toggle("is-small-screen",!1),document.body.classList.toggle("is-tablet",!1),document.body.classList.toggle("is-phone",!1),sidebars.forEach((function(e){e.collapse(!1)})),document.body.classList.contains("sidebars-always-collapsible")?sidebarGutters.forEach((function(e){e.collapse(!1)})):sidebarGutters.forEach((function(e){e.collapse(!0)}))),lastScreenWidth=window.innerWidth,null!=checkStillResizingTimeout&&clearTimeout(checkStillResizingTimeout);let o=window.innerWidth;checkStillResizingTimeout=setTimeout((function(){window.innerWidth==o&&(checkStillResizingTimeout=void 0,isResizing=!1,onEndResize())}),200)}function clamp(e,t,o){return Math.min(Math.max(e,t),o)}function getElBounds(e){let t=e.getBoundingClientRect(),o=t.x,n=t.y,i=t.width,s=t.height;return{x:o,y:n,width:i,height:s,minX:o,minY:n,maxX:o+i,maxY:n+s,centerX:t.x+t.width/2,centerY:t.y+t.height/2}}async function getComputedPixelValue(e){const t=document.createElement("div");document.body.appendChild(t),t.style.position="absolute",t.style.width=`var(${e})`,await new Promise((e=>setTimeout(e,10)));const o=window.getComputedStyle(t).width;return t.remove(),parseFloat(o)}function getPointerPosition(e){let t=e.touches?Array.from(e.touches):[];return{x:t.length>0?t.reduce(((e,t)=>e+t.clientX),0)/e.touches.length:e.clientX,y:t.length>0?t.reduce(((e,t)=>e+t.clientY),0)/e.touches.length:e.clientY}}function getTouchPosition(e){return{x:e.clientX,y:e.clientY}}function getAllChildrenRecursive(e){let t=[];for(let o=0;o0||navigator.msMaxTouchPoints>0}function downloadBlob(e,t="file.txt"){if(window.navigator&&window.navigator.msSaveOrOpenBlob)return window.navigator.msSaveOrOpenBlob(e);const o=window.URL.createObjectURL(e),n=document.createElement("a");n.href=o,n.download=t,n.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window})),setTimeout((()=>{window.URL.revokeObjectURL(o),n.remove()}),100)}function extentionToTag(e){return["png","jpg","jpeg","svg","gif","bmp","ico"].includes(e)?"img":["mp4","mov","avi","webm","mpeg"].includes(e)?"video":["mp3","wav","ogg","aac"].includes(e)?"audio":["pdf"].includes(e)?"embed":void 0}let slideUp=(e,t=500)=>{e.style.transitionProperty="height, margin, padding",e.style.transitionDuration=t+"ms",e.style.boxSizing="border-box",e.style.height=e.offsetHeight+"px",e.offsetHeight,e.style.overflow="hidden",e.style.height=0,e.style.paddingTop=0,e.style.paddingBottom=0,e.style.marginTop=0,e.style.marginBottom=0,window.setTimeout((async()=>{e.style.display="none",e.style.removeProperty("height"),e.style.removeProperty("padding-top"),e.style.removeProperty("padding-bottom"),e.style.removeProperty("margin-top"),e.style.removeProperty("margin-bottom"),e.style.removeProperty("overflow"),e.style.removeProperty("transition-duration"),e.style.removeProperty("transition-property")}),t)},slideUpAll=(e,t=500)=>{e.forEach((async e=>{e.style.transitionProperty="height, margin, padding",e.style.transitionDuration=t+"ms",e.style.boxSizing="border-box",e.style.height=e.offsetHeight+"px",e.offsetHeight,e.style.overflow="hidden",e.style.height=0,e.style.paddingTop=0,e.style.paddingBottom=0,e.style.marginTop=0,e.style.marginBottom=0})),window.setTimeout((async()=>{e.forEach((async e=>{e.style.display="none",e.style.removeProperty("height"),e.style.removeProperty("padding-top"),e.style.removeProperty("padding-bottom"),e.style.removeProperty("margin-top"),e.style.removeProperty("margin-bottom"),e.style.removeProperty("overflow"),e.style.removeProperty("transition-duration"),e.style.removeProperty("transition-property")}))}),t)},slideDown=(e,t=500)=>{e.style.removeProperty("display");let o=window.getComputedStyle(e).display;"none"===o&&(o="block"),e.style.display=o;let n=e.offsetHeight;e.style.overflow="hidden",e.style.height=0,e.style.paddingTop=0,e.style.paddingBottom=0,e.style.marginTop=0,e.style.marginBottom=0,e.offsetHeight,e.style.boxSizing="border-box",e.style.transitionProperty="height, margin, padding",e.style.transitionDuration=t+"ms",e.style.height=n+"px",e.style.removeProperty("padding-top"),e.style.removeProperty("padding-bottom"),e.style.removeProperty("margin-top"),e.style.removeProperty("margin-bottom"),window.setTimeout((async()=>{e.style.removeProperty("height"),e.style.removeProperty("overflow"),e.style.removeProperty("transition-duration"),e.style.removeProperty("transition-property")}),t)},slideDownAll=(e,t=500)=>{e.forEach((async e=>{e.style.removeProperty("display");let o=window.getComputedStyle(e).display;"none"===o&&(o="block"),e.style.display=o;let n=e.offsetHeight;e.style.overflow="hidden",e.style.height=0,e.style.paddingTop=0,e.style.paddingBottom=0,e.style.marginTop=0,e.style.marginBottom=0,e.offsetHeight,e.style.boxSizing="border-box",e.style.transitionProperty="height, margin, padding",e.style.transitionDuration=t+"ms",e.style.height=n+"px",e.style.removeProperty("padding-top"),e.style.removeProperty("padding-bottom"),e.style.removeProperty("margin-top"),e.style.removeProperty("margin-bottom")})),window.setTimeout((async()=>{e.forEach((async e=>{e.style.removeProperty("height"),e.style.removeProperty("overflow"),e.style.removeProperty("transition-duration"),e.style.removeProperty("transition-property")}))}),t)};var slideToggle=(e,t=500)=>"none"===window.getComputedStyle(e).display?slideDown(e,t):slideUp(e,t),slideToggleAll=(e,t=500)=>"none"===window.getComputedStyle(e[0]).display?slideDownAll(e,t):slideUpAll(e,t);let transferDocument=document.implementation.createHTMLDocument();async function loadDocument(e,t=!0,o=!0){let n=e.split("#"),i=n[0]??e;console.log("Loading document: "+i),loadingIcon.classList.toggle("shown",!0);let s,a=getViewBounds();if(loadingIcon.style.left=a.centerX-loadingIcon.offsetWidth/2+"px",loadingIcon.style.top=a.centerY-loadingIcon.offsetHeight/2+"px",documentContainer.classList.toggle("hide",!0),documentContainer.classList.toggle("show",!1),"phone"==deviceSize&&leftSidebar.collapse(!0),!isOffline){try{s=await fetch(i)}catch(e){return console.log("Cannot use fetch API (likely due to CORS), just loading the page normally."),void window.location.assign(i)}if(s.ok){setActiveDocument(i,o,t);let a=e.split(".").pop().split("?")[0].split("#")[0].toLowerCase().trim();if(documentType="none",embedType="none",customType="none","html"==a){let e=(await s.text()).replaceAll("","").replaceAll("","").replaceAll("","");transferDocument.write(e);let t=document.importNode(transferDocument.querySelector(".document-container"),!0);documentContainer.remove(),documentContainer=t,webpageContainer.insertBefore(documentContainer,webpageContainer.children[1]),document.querySelector(".outline-tree").innerHTML=transferDocument.querySelector(".outline-tree").innerHTML;let o=n.length>1?n[1]:null;o&&document.getElementById(o).scrollIntoView(),setupRootPath(transferDocument),initializeDocumentTypes(),setTimeout((function(){initializePageEvents(documentContainer),initializePageEvents(document.querySelector(".outline-tree"))}),0),document.title=transferDocument.title,transferDocument.close()}else if(documentType="embed",embedType=extentionToTag(a),null!=embedType){let t=document.createElement(embedType);t.controls=!0,t.src=e,t.style.maxWidth="100%","embed"==embedType&&(t.style.width="100%",t.style.height="100%"),t.style.objectFit="contain",viewContent.innerHTML="",viewContent.setAttribute("class","view-content embed"),viewContent.appendChild(t),document.querySelector(".outline-tree").innerHTML="",document.title=e.split("/").pop()}else{downloadBlob(await s.blob(),e.split("/").pop())}await initializePage()}else setTimeout((function(){viewContent.innerHTML="\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

Page Not Found

\n\t\t\t\t
\n\t\t\t
\n\t\t\t",document.querySelector(".outline-tree").innerHTML="",console.log("Page not found: "+getAbsoluteRootPath()+e);let t=getURLRootPath(getAbsoluteRootPath()+e);rootPath=t,document.querySelector("base").href=t,document.title="Page Not Found"}),1e3);return loadingIcon.classList.toggle("shown",!1),documentContainer.style.transitionDuration="",documentContainer.classList.toggle("hide",!1),documentContainer.classList.toggle("show",!0),transferDocument}setTimeout((function(){viewContent.innerHTML="\n
\n\t

You appear to be offline. Check your internet connection and then try reloading the page.

\n
",document.querySelector(".outline-tree").innerHTML="",console.log("Page offline: "+getAbsoluteRootPath()+e);let t=getURLRootPath(getAbsoluteRootPath()+e);rootPath=t,document.querySelector("base").href=t,document.title="Page Offline",documentContainer.classList.toggle("hide",!1),documentContainer.classList.toggle("show",!0),loadingIcon.classList.toggle("shown",!1)}),1e3)}function setActiveDocument(e,t=!0,o=!0){let n=e.split("#")[0]??e;document.querySelector(".tree-item.mod-active")?.classList.remove("mod-active");let i,s=Array.from(document.querySelectorAll(".tree-item > .tree-item-contents > .tree-item-link"));for(let t of s)if(t.getAttribute("href")==decodeURI(e)){let e=t.parentElement.parentElement;for(e.classList.add("mod-active"),i=e;e.hasAttribute("data-depth");)setTreeCollapsed(e,!1,!1),e=e.parentElement.parentElement;break}if(t&&i?.scrollIntoView({block:"center",inline:"nearest"}),"undefined"!=typeof nodes&&window.renderWorker){let e=nodes?.paths.findIndex((function(e){return e.endsWith(n)}))??-1;e>=0&&(window.renderWorker.activeNode=e)}o&&"file:"!=window.location.protocol&&window.history.pushState({path:n},"",n)}function setupRootPath(e){let t=e.querySelector("#root-path").getAttribute("root-path");document.querySelector("base").href=t,document.querySelector("#root-path").setAttribute("root-path",t),rootPath=t}function getAbsoluteRootPath(){return"undefined"==typeof rootPath&&setupRootPath(document),new URL(window.location.href+"/../"+rootPath).pathname}function getURLPath(e=window.location.pathname){let t=getAbsoluteRootPath();return e.substring(t.length)}function getURLRootPath(e=window.location.pathname){let t=getURLPath(e).split("/"),o="";for(let e=0;ee+t.offsetHeight),0);return void(e.markdownPreviewSizer.style.minHeight=o+"px")}let a=getComputedStyle(i).transitionDuration;a=a.endsWith("s")?parseFloat(a):a.endsWith("ms")?parseFloat(a)/1e3:0;let l=Math.min(a*Math.sqrt(s)/16,.5);i.style.transitionDuration=`${l}s`,i.style.height=t?"0px":s+"px",e.classList.toggle("is-animating",!0),e.classList.toggle("is-collapsed",t),setTimeout((function(){i.style.transitionDuration="",t||(i.style.height=""),e.classList.toggle("is-animating",!1);let o=Array.from(e.markdownPreviewSizer.children).reduce(((e,t)=>e+t.offsetHeight),0);e.markdownPreviewSizer.style.minHeight=o+"px"}),1e3*l)}function toggleTreeHeaderOpen(e,t=!0){e.collapse(!e.collapsed,t)}function hideHeader(e){if(e.forceShown)return;if(e.classList.contains("is-hidden")||e.classList.contains("is-collapsed"))return;if("none"==getComputedStyle(e).display)return;let t=e.offsetHeight;e.classList.toggle("is-hidden",!0),0!=t&&(e.style.height=t+"px"),e.style.visibility="hidden"}function showHeader(e,t=!0,o=!1,n=!1){if(n&&(e.forceShown=!0),t){let t=e.parentHeader;isHeadingWrapper(t)&&t.show(!0,!1,n)}if(o){e.querySelectorAll(".heading-wrapper").forEach((function(e){e.show(!1,!0,n)}))}e.classList.contains("is-hidden")&&!e.classList.contains("is-collapsed")&&(e.classList.toggle("is-hidden",!1),e.style.height="",e.style.visibility="")}function setupTrees(e){const t=Array.from(e.querySelectorAll(".tree-container.file-tree .tree-item")),o=Array.from(e.querySelectorAll(".tree-container.outline-tree .tree-item"));e.querySelectorAll(".tree-item-link > .collapse-icon").forEach((function(e){e.addEventListener("click",(function(t){return t.preventDefault(),t.stopPropagation(),toggleTreeCollapsed(e.parentElement.parentElement.parentElement),!1}))})),e.querySelectorAll(".collapse-tree-button").forEach((function(e){e.treeRoot=e.parentElement.parentElement,e.icon=e.firstChild,e.icon.innerHTML="";let n=e.treeRoot.classList.contains("file-tree")?t:o;e.setIcon=function(t){e.icon.children[0].setAttribute("d",t?collapseIconUp[0]:collapseIconDown[0]),e.icon.children[1].setAttribute("d",t?collapseIconUp[1]:collapseIconDown[1])},e.collapse=function(t){setTreeCollapsedAll(n,t),e.setIcon(t),e.collapsed=t},e.toggleCollapse=function(){e.collapse(!e.collapsed)},e.collapsed=0!=e.treeRoot.querySelectorAll(".tree-scroll-area + .tree-item.mod-collapsible.is-collapsed"),e.setIcon(e.collapsed),e.addEventListener("click",(function(t){return t.preventDefault(),t.stopPropagation(),e.toggleCollapse(),!1}))})),t.forEach((function(e){let t=e.querySelector(".tree-item-link");if(e.querySelector(".collapse-icon"))t?.addEventListener("click",(function(e){e.preventDefault(),e.stopPropagation();let t=this.parentElement?.parentElement;t&&toggleTreeCollapsed(t)}));else{let o=t.getAttribute("href").split(".").pop();if(!o.includes(" ")&&"html"!=o){let t=document.createElement("div");t.classList.add("nav-file-tag"),t.textContent=o.toUpperCase(),e.querySelector(".tree-item-contents").appendChild(t)}}}))}async function setTreeCollapsed(e,t,o=!0){if(!e||!e.classList.contains("mod-collapsible"))return;let n=e.querySelector(".tree-item-children");t?(e.classList.add("is-collapsed"),o?slideUp(n,100):n.style.display="none"):(e.classList.remove("is-collapsed"),o?slideDown(n,100):n.style.removeProperty("display"))}async function setTreeCollapsedAll(e,t,o=!0){let n=[];e.forEach((async e=>{if(!e||!e.classList.contains("mod-collapsible"))return;let o=e.querySelector(".tree-item-children");t?e.classList.add("is-collapsed"):e.classList.remove("is-collapsed"),n.push(o)})),t?o?slideUpAll(n,100):n.forEach((async e=>e.style.display="none")):o?slideDownAll(n,100):n.forEach((async e=>e.style.removeProperty("display")))}function toggleTreeCollapsed(e){e&&setTreeCollapsed(e,!e.classList.contains("is-collapsed"))}function toggleTreeCollapsedAll(e){e&&setTreeCollapsedAll(e,!e[0].classList.contains("is-collapsed"))}function setupCanvas(e){if("canvas"!=documentType||!e.querySelector(".canvas-wrapper"))return;e.querySelector(".canvas")?.setAttribute("style","translate: 0px 1px; scale: 1;");let t=getNodesBounds();function o(e){let t=e.touches??[];if(!(t.length>1)&&(1==e.button||0==e.button||t.length>0)){let o=getPointerPosition(e),n=!1,i=0,s=t.length,a=function(t){let a=t.touches??[],l=getPointerPosition(t);s!=a.length&&(o=l,s=a.length);let r=l.x-o.x,c=l.y-o.y,d=!1;if((1==e.button||1==a.length)&&focusedCanvasNode){let e=Math.abs(r)>Math.abs(1.5*c),t=Math.abs(c)>Math.abs(1.5*r),o=focusedCanvasNode.querySelector(".markdown-preview-sizer");if(o){let n=o.scrollHeight>o.parentElement.clientHeight+1,i=o.scrollWidth>o.parentElement.clientWidth+1;(e&&i||t&&n)&&(d=!0)}}if(d||(translateCanvas(r,c),o=l),2==a.length){let e=getPointerPosition(t,!1),o=getTouchPosition(t.touches[0]),s=getTouchPosition(t.touches[1]),a=Math.sqrt(Math.pow(o.x-s.x,2)+Math.pow(o.y-s.y,2));n||(n=!0,i=a),scaleCanvasAroundPoint(1+(a-i)/i,e.x,e.y),i=a}},l=function(e){document.body.removeEventListener("mousemove",a),document.body.removeEventListener("mouseup",l),document.body.removeEventListener("mouseenter",r),document.body.removeEventListener("touchmove",a),document.body.removeEventListener("touchend",l),document.body.removeEventListener("touchcancel",l)},r=function(e){1!=e.buttons&&4!=e.buttons&&l(e)};document.body.addEventListener("mousemove",a),document.body.addEventListener("mouseup",l),document.body.addEventListener("mouseenter",r),document.body.addEventListener("touchmove",a),document.body.addEventListener("touchend",l),document.body.addEventListener("touchcancel",l)}}setViewCenter(t.centerX,t.centerY),e.querySelectorAll(".canvas-node-container").forEach((function(e){var t=e.parentElement;function o(e){t.classList.toggle("is-focused"),null!=focusedCanvasNode&&focusedCanvasNode!=t&&(focusedCanvasNode.classList.remove("is-focused"),focusedCanvasNode.querySelector(".canvas-node-container").style.display=""),focusedCanvasNode=t,t.addEventListener("mouseleave",n),t.addEventListener("touchend",n)}function n(e){focusedCanvasNode&&(focusedCanvasNode.classList.remove("is-focused"),focusedCanvasNode=null),t.removeEventListener("mouseleave",n),t.removeEventListener("touchend",n)}e.addEventListener("mouseenter",o),e.addEventListener("touchstart",o)})),e.querySelectorAll(".canvas-node").forEach((function(e){e.addEventListener("dblclick",(function(t){fitViewToNode(e)}))})),e.querySelectorAll(".canvas-background").forEach((function(e){e.addEventListener("dblclick",(function(e){fitViewToCanvas()}))})),canvasWrapper.addEventListener("mousedown",o),canvasWrapper.addEventListener("touchstart",o);let n=0,i=0;canvasWrapper.addEventListener("mousemove",(function(e){let t=getPointerPosition(e);n=t.x,i=t.y}));let s=1,a=0,l=!1;canvasWrapper.addEventListener("wheel",(function(e){if(focusedCanvasNode){let e=focusedCanvasNode.querySelector(".markdown-preview-sizer");if(e&&e.scrollHeight>e.parentElement.clientHeight)return}if(e.preventDefault(),e.stopPropagation(),l){let t=1;t-=e.deltaY/700*t,t=clamp(t,.1,10);let o=getViewBounds();scaleCanvasAroundPoint(t,o.centerX,o.centerY)}else{let t=0==a;a-=e.deltaY/200;const o=.14*s;a=clamp(a,-o,o),t&&requestAnimationFrame(u)}}));let r=0,c=0,d=0;function u(e){if(r=e-c,0==c&&(r=30),c=e,d=.05*r+.95*d,d>50)return console.log("Scrolling too slow, turning on instant scroll"),void(l=!0);let t=s;s+=a*(r/1e3)*30,s=clamp(s,.1,10);getViewBounds();scaleCanvasAroundPoint(s/t,n,i),a*=.4,Math.abs(a)<.01?(a=0,c=0):requestAnimationFrame(u)}fitViewToCanvas()}function getViewBounds(){let e=viewContent.getBoundingClientRect(),t=e.x,o=e.y,n=e.x+e.width,i=e.y+e.height;return{x:t,y:o,width:n-t,height:i-o,minX:t,minY:o,maxX:n,maxY:i,centerX:e.x+e.width/2,centerY:e.y+e.height/2}}function getNodesBounds(){let e=1/0,t=1/0,o=-1/0,n=-1/0;canvasNodes.forEach((function(i){let s=i.getBoundingClientRect();s.xo&&(o=s.x+s.width),s.y+s.height>n&&(n=s.y+s.height)}));let i=o-e,s=n-t;return{x:e,y:t,width:i,height:s,minX:e,minY:t,maxX:o,maxY:n,centerX:e+i/2,centerY:t+s/2}}function getCanvasBounds(){let e=canvas.getBoundingClientRect(),t=e.x,o=e.y,n=e.width,i=e.height;return{x:t,y:o,width:n,height:i,minX:t,minY:o,maxX:t+n,maxY:o+i,centerX:e.x+e.width/2,centerY:e.y+e.height/2}}function scaleCanvasAroundPoint(e,t,o){let n=getCanvasBounds(),i=t-n.x,s=o-n.y,a=t-(n.x+i*e),l=o-(n.y+s*e);return scaleCanvas(e),translateCanvas(a,l),{x:a,y:l}}function scaleCanvas(e){let t=Math.max(e*canvas.style.scale,.001);canvas.style.scale=t,canvasWrapper.style.setProperty("--zoom-multiplier",1/Math.sqrt(t))}function translateCanvas(e,t){let o=canvas.style.translate,n=o.split(" "),i=n.length>0?parseFloat(o.split(" ")[0].trim()):0,s=n.length>1?parseFloat(o.split(" ")[1].trim()):i;canvas.style.translate=`${i+e}px ${s+t}px`}function setViewCenter(e,t){let o=getViewBounds();translateCanvas(o.centerX-e,o.centerY-t)}function getCanvasTranslation(){let e=canvas.style.translate,t=e.split(" "),o=t.length>0?parseFloat(e.split(" ")[0].trim()):0;return{x:o,y:t.length>1?parseFloat(e.split(" ")[1].trim()):o}}function scaleCanvasBackground(e){let t=e*canvasBackgroundPattern.getAttribute("width"),o=e*canvasBackgroundPattern.getAttribute("height");canvasBackgroundPattern.setAttribute("width",t),canvasBackgroundPattern.setAttribute("height",o)}function translateCanvasBackground(e,t){canvasBackgroundPattern.setAttribute("x",e+canvasBackgroundPattern.getAttribute("x")),canvasBackgroundPattern.setAttribute("y",t+canvasBackgroundPattern.getAttribute("y"))}function fitViewToNode(e){let t=getElBounds(e),o=getViewBounds(),n=getCanvasBounds(),i=.8*Math.min(o.width/t.width,o.height/t.height),s=n.x,a=n.y,l=s+(t.centerX-s)*i,r=a+(t.centerY-a)*i,c=o.centerX-l,d=o.centerY-r;t=getElBounds(e),canvas.style.transition="scale 0.5s cubic-bezier(0.5, -0.1, 0.5, 1.1), translate 0.5s cubic-bezier(0.5, -0.1, 0.5, 1.1)",scaleCanvas(i),translateCanvas(c,d),setTimeout((function(){canvas.style.transition=""}),550)}function fitViewToCanvas(){let e=getNodesBounds(),t=getViewBounds(),o=getCanvasBounds(),n=.8*Math.min(t.width/e.width,t.height/e.height),i=o.x,s=o.y,a=i+(e.centerX-i)*n,l=s+(e.centerY-s)*n,r=t.centerX-a,c=t.centerY-l;canvas.style.transition="scale 0.5s cubic-bezier(0.5, -0.1, 0.5, 1.1), translate 0.5s cubic-bezier(0.5, -0.1, 0.5, 1.1)",scaleCanvas(n),translateCanvas(r,c),setTimeout((function(){canvas.style.transition=""}),550)}function setupCallouts(e){e.querySelectorAll(".callout.is-collapsible .callout-title").forEach((function(e){e.addEventListener("click",(function(){var t=this.parentElement;t.classList.toggle("is-collapsed"),e.querySelector(".callout-fold").classList.toggle("is-collapsed"),slideToggle(t.querySelector(".callout-content"),100)}))}))}function setupCheckboxes(e){e.querySelectorAll(".task-list-item-checkbox").forEach((function(e){e.addEventListener("click",(function(){var e=this.parentElement;e.classList.toggle("is-checked"),e.setAttribute("data-task",e.classList.contains("is-checked")?"x":" ")}))})),e.querySelectorAll('.plugin-tasks-list-item input[type="checkbox"]').forEach((function(e){e.checked=e.parentElement.classList.contains("is-checked")})),e.querySelectorAll(".kanban-plugin__item.is-complete").forEach((function(e){e.querySelector('input[type="checkbox"]').checked=!0}))}function setupCodeblocks(e){e.querySelectorAll(".copy-code-button").forEach((function(t){t.addEventListener("click",(function(){var t=this.parentElement.querySelector("code").textContent;navigator.clipboard.writeText(t),this.textContent="Copied!",setTimeout((function(){e.querySelectorAll(".copy-code-button").forEach((function(e){e.textContent="Copy"}))}),2e3)}))}))}function setupLinks(e){e.querySelectorAll(".internal-link, .footnote-link, .tree-item:not(.mod-tree-folder) > .tree-item-contents > .tree-item-link").forEach((function(e){e.addEventListener("click",(function(t){let o=e.getAttribute("href");if(t.preventDefault(),o)if(o.startsWith("#")){let e=document.getElementById(o.substring(1));e?(e.headingWrapper?.collapse(!1,!0,!0),setTimeout((function(){e.classList.contains(".heading")?e.headingWrapper?.scrollIntoView({behavior:"smooth",block:"start"}):e.scrollIntoView({behavior:"smooth",block:"start"}),"phone"==deviceSize&&rightSidebar.collapse(!0)}),0)):console.log("No element found with id: "+o.substring(1))}else loadDocument(o,!0,!e.classList.contains("tree-item-link"))}))}))}function setupSidebars(){sidebarCollapseIcons[0].otherIcon=sidebarCollapseIcons[1],sidebarCollapseIcons[1].otherIcon=sidebarCollapseIcons[0],sidebarCollapseIcons[0].gutter=sidebarGutters[0],sidebarCollapseIcons[1].gutter=sidebarGutters[1],sidebarCollapseIcons[0].sidebar=sidebars[0],sidebarCollapseIcons[1].sidebar=sidebars[1],sidebarGutters[0].otherGutter=sidebarGutters[1],sidebarGutters[1].otherGutter=sidebarGutters[0],sidebarGutters[0].collapseIcon=sidebarCollapseIcons[0],sidebarGutters[1].collapseIcon=sidebarCollapseIcons[1],sidebars[0].otherSidebar=sidebars[1],sidebars[1].otherSidebar=sidebars[0],sidebars[0].gutter=sidebarGutters[0],sidebars[1].gutter=sidebarGutters[1],sidebars.forEach((function(e){e.collapsed=e.classList.contains("is-collapsed"),e.collapse=function(t=!0){if(!t&&this.temporarilyCollapsed&&"large-screen"==deviceSize&&this.gutter.collapse(!0),!t&&document.body.classList.contains("floating-sidebars")){document.body.addEventListener("click",(function t(o){e.collapse(!0),document.body.removeEventListener("click",t)}))}"phone"==deviceSize&&(t||e.otherSidebar.fullCollapse(!0,!0),t&&e.gutter.otherGutter.collapse(!1,!0)),"tablet"==deviceSize&&(t||e.otherSidebar.collapse(!0)),this.classList.toggle("is-collapsed",t),this.collapsed=t},e.temporaryCollapse=function(e=!0){this.temporarilyCollapsed=!0,this.collapse(!0),this.gutter.collapse(!1),this.collapsed=e},e.fullCollapse=function(e=!0,t=!1){this.collapse(e),this.gutter.collapse(!0,t),this.collapsed=e},e.toggleCollapse=function(){this.collapse(!this.collapsed)},e.toggleFullCollapse=function(){this.fullCollapse(!this.collapsed)}})),sidebarGutters.forEach((function(e){e.collapsed=e.classList.contains("is-collapsed"),e.collapse=function(e,t=!1){!t&&document.body.classList.contains("sidebars-always-collapsible")||(this.classList.toggle("is-collapsed",e),this.collapsed=e)},e.toggleCollapse=function(){this.collapse(!this.collapsed)}})),sidebarCollapseIcons.forEach((function(e){e.addEventListener("click",(function(t){t.stopPropagation(),e.sidebar.toggleCollapse()}))})),document.querySelectorAll(".sidebar-container").forEach((function(e){e.addEventListener("click",(function(e){e.stopPropagation()}))}))}function getSidebarWidthProp(){return getComputedPixelValue("--sidebar-width")}function setupThemeToggle(){function e(e,t=!1){let o=document.querySelector(".theme-toggle-input");if(o.checked=e,t){var n=document.body.style.transition;document.body.style.transition="none"}!o.classList.contains("is-checked")&&e?o.classList.add("is-checked"):o.classList.contains("is-checked")&&!e&&o.classList.remove("is-checked"),e?(document.body.classList.contains("theme-dark")&&document.body.classList.remove("theme-dark"),document.body.classList.contains("theme-light")||document.body.classList.add("theme-light")):(document.body.classList.contains("theme-light")&&document.body.classList.remove("theme-light"),document.body.classList.contains("theme-dark")||document.body.classList.add("theme-dark")),t&&setTimeout((function(){document.body.style.transition=n}),100),localStorage.setItem("theme_toggle",e?"true":"false")}null!=localStorage.getItem("theme_toggle")&&e("true"==localStorage.getItem("theme_toggle")),document.body.classList.contains("theme-light")?e(!0):e(!1),document.querySelector(".theme-toggle-input")?.addEventListener("change",(t=>{console.log("Theme toggle changed to: "+!("true"==localStorage.getItem("theme_toggle"))),e(!("true"==localStorage.getItem("theme_toggle")))}))}function setupScroll(e){if("canvas"!=documentType)return;let t=Array.from(e.querySelectorAll(".markdown-preview-view")),o=0,n=0;t.forEach((async function(e){console.log("Setting up markdown view");let t=Array.from(e.querySelectorAll(".heading-wrapper"));e.updateVisibleWindowMarkdown=function(o=!0,i=!0){let s=e.getBoundingClientRect();n=Math.min(.1*s.height,150);let a=s.top-n,l=s.bottom+n;async function r(e){let t=e?.getBoundingClientRect();if(!t)return;let n=t.topl&&t.bottom>l;n&&o?e.hide():!n&&i&&e.show()}for(let e=0;en/3&&e.updateVisibleWindowMarkdown(!1,!0),o=e.scrollTop}))})),setInterval((async function(){t.length>0&&(t[o].updateVisibleWindowMarkdown(),o=(o+1)%t.length)}),200)}function setupExcalidraw(e){e.querySelectorAll(".excalidraw-svg svg").forEach((function(e){let t=e.querySelector("rect").getAttribute("fill")>"#7F7F7F";e.classList.add(t?"light":"dark")}))} \ No newline at end of file diff --git a/reti-di-elaboratori/lib/styles/generated-styles.css b/reti-di-elaboratori/lib/styles/generated-styles.css new file mode 100644 index 0000000..84d8cfe --- /dev/null +++ b/reti-di-elaboratori/lib/styles/generated-styles.css @@ -0,0 +1 @@ +body{--line-width:50em;--line-width-adaptive:50em;--file-line-width:50em;--content-width:500em;--sidebar-width:calc(min(25em, 80vw));--collapse-arrow-size:0.35em;--tree-horizontal-spacing:0.6em;--tree-vertical-spacing:0.6em;--sidebar-margin:24px}body{--zoom-factor:1!important;--font-text-size:16px} \ No newline at end of file diff --git a/reti-di-elaboratori/lib/styles/obsidian-styles.css b/reti-di-elaboratori/lib/styles/obsidian-styles.css new file mode 100644 index 0000000..d0df5b5 --- /dev/null +++ b/reti-di-elaboratori/lib/styles/obsidian-styles.css @@ -0,0 +1 @@ +.markdown-preview-view .heading-collapse-indicator{margin-left:calc(0px - var(--collapse-arrow-size) - 10px)!important;padding:0 0!important}.node-insert-event{animation-duration:unset!important;animation-name:none!important}h1,h2,h3,h4,h5,h6{margin-top:0!important}hr{border:none;border-top:var(--hr-thickness) solid;border-color:var(--hr-color)}@media print{html body>:not(.print){display:unset!important}.collapse-indicator{display:none!important}.is-collapsed>element>.collapse-indicator{display:unset!important}}.list-collapse-indicator{display:none!important}.collapse-icon::before{content:"​"!important;visibility:hidden!important}.mod-header{display:none!important}.markdown-embed .markdown-embed-content .markdown-preview-sizer{padding-left:1em!important}.markdown-embed .embed-title.markdown-embed-title{display:none}.markdown-embed-link{display:none!important}.canvas-card-menu{display:none;cursor:default!important}.canvas-controls{display:none;cursor:default!important}.canvas-background{pointer-events:visible!important;cursor:grab!important}.canvas-background:active{cursor:grabbing!important}.canvas-node-connection-point{display:none;cursor:default!important}.canvas-node-content{backface-visibility:visible!important}.canvas-menu-container{display:none}.canvas-node-content-blocker{cursor:pointer!important}.canvas-wrapper{position:relative;cursor:default!important}.canvas-node-resizer{cursor:default!important}.canvas-node-container{cursor:default!important}.markdown-rendered pre:not(:hover)>button.copy-code-button{display:unset;opacity:0}.markdown-rendered pre:hover>button.copy-code-button{opacity:1}.markdown-rendered pre button.copy-code-button{transition:opacity .2s ease-in-out,width .3s ease-in-out,background-color .2s ease-in-out;text-overflow:clip}.markdown-rendered pre>button.copy-code-button:hover{background-color:var(--interactive-normal)}.markdown-rendered pre>button.copy-code-button:active{background-color:var(--interactive-hover);box-shadow:var(--input-shadow);transition:none}@font-face{font-family:MJXZERO;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Zero.woff") format("woff")}@font-face{font-family:MJXTEX;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Main-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-B;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Main-Bold.woff") format("woff")}@font-face{font-family:MJXTEX-I;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Math-Italic.woff") format("woff")}@font-face{font-family:MJXTEX-MI;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Main-Italic.woff") format("woff")}@font-face{font-family:MJXTEX-BI;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Math-BoldItalic.woff") format("woff")}@font-face{font-family:MJXTEX-S1;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Size1-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-S2;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Size2-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-S3;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Size3-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-S4;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Size4-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-A;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_AMS-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-C;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-CB;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Bold.woff") format("woff")}@font-face{font-family:MJXTEX-FR;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Fraktur-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-FRB;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Fraktur-Bold.woff") format("woff")}@font-face{font-family:MJXTEX-SS;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_SansSerif-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-SSB;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_SansSerif-Bold.woff") format("woff")}@font-face{font-family:MJXTEX-SSI;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_SansSerif-Italic.woff") format("woff")}@font-face{font-family:MJXTEX-SC;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Script-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-T;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Typewriter-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-V;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Vector-Regular.woff") format("woff")}@font-face{font-family:MJXTEX-VB;src:url("https://publish.obsidian.md/lib/mathjax/output/chtml/fonts/woff-v2/MathJax_Vector-Bold.woff") format("woff")}@font-face{font-family:'Avenir Next';font-weight:400;font-style:normal;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/94f2f163d4b698242fef.otf')}@font-face{font-family:Inter;font-style:normal;font-weight:200;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/72505e6a122c6acd5471.woff2') format('woff2')}@font-face{font-family:Inter;font-style:normal;font-weight:300;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/2d5198822ab091ce4305.woff2') format('woff2')}@font-face{font-family:Inter;font-weight:400;font-style:normal;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/c8ba52b05a9ef10f4758.woff2')}@font-face{font-family:Inter;font-weight:400;font-style:italic;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/cb10ffd7684cd9836a05.woff2')}@font-face{font-family:Inter;font-weight:600;font-style:normal;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/b5f0f109bc88052d4000.woff2')}@font-face{font-family:Inter;font-weight:800;font-style:normal;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/cbe0ae49c52c920fd563.woff2')}@font-face{font-family:Inter;font-weight:800;font-style:italic;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/535a6cf662596b3bd6a6.woff2')}@font-face{font-family:'Source Code Pro';font-weight:400;font-style:normal;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/70cc7ff27245e82ad414.ttf')}@font-face{font-family:'Source Code Pro';font-weight:400;font-style:italic;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/454577c22304619db035.ttf')}@font-face{font-family:'Source Code Pro';font-weight:700;font-style:normal;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/52ac8f3034507f1d9e53.ttf')}@font-face{font-family:'Source Code Pro';font-weight:700;font-style:italic;font-display:swap;src:url('https://publish.obsidian.md/public/fonts/05b618077343fbbd92b7.ttf')}@font-face{font-family:'Flow Circular';font-display:swap;src:url('https://publish.obsidian.md/public/fonts/853ff76f08786ae44ca0.woff')}:root{--highlight-bg-color:rgba(180, 0, 170, 1);--highlight-selected-bg-color:rgba(0, 100, 0, 1)}:root{--annotation-unfocused-field-background:url("data:image/svg+xml;charset=UTF-8,");--input-focus-border-color:Highlight;--input-focus-outline:1px solid Canvas;--input-unfocused-border-color:transparent;--input-disabled-border-color:transparent;--input-hover-border-color:black;--link-outline:none}:root{--xfa-unfocused-field-background:url("data:image/svg+xml;charset=UTF-8,");--xfa-focus-outline:auto}:root{--viewer-container-height:0;--pdfViewer-padding-bottom:0;--page-margin:1px auto -8px;--page-border:9px solid transparent;--spreadHorizontalWrapped-margin-LR:-3.5px;--loading-icon-delay:400ms}[data-main-rotation="90"]{transform:rotate(90deg) translateY(-100%)}[data-main-rotation="180"]{transform:rotate(180deg) translate(-100%,-100%)}[data-main-rotation="270"]{transform:rotate(270deg) translateX(-100%)}.hiddenCopyElement{position:absolute;top:0;left:0;width:0;height:0;display:none}body{--anim-duration-none:0;--anim-duration-superfast:70ms;--anim-duration-fast:140ms;--anim-duration-moderate:300ms;--anim-duration-slow:560ms;--anim-motion-smooth:cubic-bezier(0.45, 0.05, 0.55, 0.95);--anim-motion-delay:cubic-bezier(0.65, 0.05, 0.36, 1);--anim-motion-jumpy:cubic-bezier(0.68, -0.55, 0.27, 1.55);--anim-motion-swing:cubic-bezier(0, 0.55, 0.45, 1);--blockquote-border-thickness:2px;--blockquote-border-color:var(--interactive-accent);--blockquote-font-style:normal;--blockquote-color:inherit;--blockquote-background-color:transparent;--bold-weight:var(--font-semibold);--bold-color:inherit;--border-width:1px;--button-radius:var(--input-radius);--callout-border-width:0px;--callout-border-opacity:0.25;--callout-padding:var(--size-4-3) var(--size-4-3) var(--size-4-3) var(--size-4-6);--callout-radius:var(--radius-s);--callout-blend-mode:var(--highlight-mix-blend-mode);--callout-title-color:inherit;--callout-title-padding:0;--callout-title-size:inherit;--callout-content-padding:0;--callout-content-background:transparent;--callout-bug:var(--color-red-rgb);--callout-default:var(--color-blue-rgb);--callout-error:var(--color-red-rgb);--callout-example:var(--color-purple-rgb);--callout-fail:var(--color-red-rgb);--callout-important:var(--color-cyan-rgb);--callout-info:var(--color-blue-rgb);--callout-question:var(--color-orange-rgb);--callout-success:var(--color-green-rgb);--callout-summary:var(--color-cyan-rgb);--callout-tip:var(--color-cyan-rgb);--callout-todo:var(--color-blue-rgb);--callout-warning:var(--color-orange-rgb);--callout-quote:158,158,158;--canvas-background:var(--background-primary);--canvas-card-label-color:var(--text-faint);--canvas-color-1:var(--color-red-rgb);--canvas-color-2:var(--color-orange-rgb);--canvas-color-3:var(--color-yellow-rgb);--canvas-color-4:var(--color-green-rgb);--canvas-color-5:var(--color-cyan-rgb);--canvas-color-6:var(--color-purple-rgb);--canvas-dot-pattern:var(--color-base-30);--checkbox-radius:var(--radius-s);--checkbox-size:var(--font-text-size);--checkbox-marker-color:var(--background-primary);--checkbox-color:var(--interactive-accent);--checkbox-color-hover:var(--interactive-accent-hover);--checkbox-border-color:var(--text-faint);--checkbox-border-color-hover:var(--text-muted);--checklist-done-decoration:line-through;--checklist-done-color:var(--text-muted);--code-white-space:pre-wrap;--code-radius:var(--radius-s);--code-size:var(--font-smaller);--code-background:var(--background-primary-alt);--code-normal:var(--text-muted);--code-comment:var(--text-faint);--code-function:var(--color-yellow);--code-important:var(--color-orange);--code-keyword:var(--color-pink);--code-operator:var(--color-red);--code-property:var(--color-cyan);--code-punctuation:var(--text-muted);--code-string:var(--color-green);--code-tag:var(--color-red);--code-value:var(--color-purple);--collapse-icon-color:var(--text-faint);--collapse-icon-color-collapsed:var(--text-accent);--cursor:default;--cursor-link:pointer;--dialog-width:560px;--dialog-max-width:80vw;--dialog-max-height:85vh;--divider-color:var(--background-modifier-border);--divider-color-hover:var(--interactive-accent);--divider-width:1px;--divider-width-hover:3px;--divider-vertical-height:calc(100% - var(--header-height));--drag-ghost-background:rgba(0, 0, 0, 0.85);--drag-ghost-text-color:#fff;--embed-max-height:4000px;--embed-canvas-max-height:400px;--embed-background:inherit;--embed-border-left:2px solid var(--interactive-accent);--embed-border-right:none;--embed-border-top:none;--embed-border-bottom:none;--embed-padding:0 0 0 var(--size-4-6);--embed-font-style:inherit;--embed-block-shadow-hover:0 0 0 1px var(--background-modifier-border),inset 0 0 0 1px var(--background-modifier-border);--file-line-width:700px;--file-folding-offset:24px;--file-margins:var(--size-4-8);--file-header-font-size:var(--font-ui-small);--file-header-font-weight:400;--file-header-border:var(--border-width) solid transparent;--file-header-justify:center;--font-smallest:0.8em;--font-smaller:0.875em;--font-small:0.933em;--font-ui-smaller:12px;--font-ui-small:13px;--font-ui-medium:15px;--font-ui-large:20px;--font-thin:100;--font-extralight:200;--font-light:300;--font-normal:400;--font-medium:500;--font-semibold:600;--font-bold:700;--font-extrabold:800;--font-black:900;--footnote-size:var(--font-smaller);--graph-controls-width:240px;--graph-text:var(--text-normal);--graph-line:var(--color-base-35, var(--background-modifier-border-focus));--graph-node:var(--text-muted);--graph-node-unresolved:var(--text-faint);--graph-node-focused:var(--text-accent);--graph-node-tag:var(--color-green);--graph-node-attachment:var(--color-yellow);--heading-formatting:var(--text-faint);--heading-spacing:calc(var(--p-spacing) * 2.5);--h1-color:inherit;--h2-color:inherit;--h3-color:inherit;--h4-color:inherit;--h5-color:inherit;--h6-color:inherit;--h1-font:inherit;--h2-font:inherit;--h3-font:inherit;--h4-font:inherit;--h5-font:inherit;--h6-font:inherit;--h1-line-height:1.2;--h2-line-height:1.2;--h3-line-height:1.3;--h4-line-height:1.4;--h5-line-height:var(--line-height-normal);--h6-line-height:var(--line-height-normal);--h1-size:1.802em;--h2-size:1.602em;--h3-size:1.424em;--h4-size:1.266em;--h5-size:1.125em;--h6-size:1em;--h1-style:normal;--h2-style:normal;--h3-style:normal;--h4-style:normal;--h5-style:normal;--h6-style:normal;--h1-variant:normal;--h2-variant:normal;--h3-variant:normal;--h4-variant:normal;--h5-variant:normal;--h6-variant:normal;--h1-weight:700;--h2-weight:600;--h3-weight:600;--h4-weight:600;--h5-weight:600;--h6-weight:600;--header-height:40px;--hr-color:var(--background-modifier-border);--hr-thickness:2px;--icon-size:var(--icon-m);--icon-stroke:var(--icon-m-stroke-width);--icon-xs:14px;--icon-s:16px;--icon-m:18px;--icon-l:18px;--icon-xl:32px;--icon-xs-stroke-width:2px;--icon-s-stroke-width:2px;--icon-m-stroke-width:1.75px;--icon-l-stroke-width:1.75px;--icon-xl-stroke-width:1.25px;--icon-color:var(--text-muted);--icon-color-hover:var(--text-muted);--icon-color-active:var(--text-accent);--icon-color-focused:var(--text-normal);--icon-opacity:0.85;--icon-opacity-hover:1;--icon-opacity-active:1;--clickable-icon-radius:var(--radius-s);--indentation-guide-width:1px;--indentation-guide-width-active:1px;--indentation-guide-color:rgba(var(--mono-rgb-100), 0.12);--indentation-guide-color-active:rgba(var(--mono-rgb-100), 0.3);--inline-title-color:var(--h1-color);--inline-title-font:var(--h1-font);--inline-title-line-height:var(--h1-line-height);--inline-title-size:var(--h1-size);--inline-title-style:var(--h1-style);--inline-title-variant:var(--h1-variant);--inline-title-weight:var(--h1-weight);--inline-title-margin-bottom:0.5em;--input-height:30px;--input-radius:5px;--input-font-weight:var(--font-normal);--input-border-width:1px;--italic-color:inherit;--italic-weight:inherit;--layer-cover:5;--layer-sidedock:10;--layer-status-bar:15;--layer-popover:30;--layer-slides:45;--layer-modal:50;--layer-notice:60;--layer-menu:65;--layer-tooltip:70;--layer-dragged-item:80;--line-height-normal:1.5;--line-height-tight:1.3;--link-color:var(--text-accent);--link-color-hover:var(--text-accent-hover);--link-decoration:underline;--link-decoration-hover:underline;--link-decoration-thickness:auto;--link-external-color:var(--text-accent);--link-external-color-hover:var(--text-accent-hover);--link-external-decoration:underline;--link-external-decoration-hover:underline;--link-external-filter:none;--link-unresolved-color:var(--text-accent);--link-unresolved-opacity:0.7;--link-unresolved-filter:none;--link-unresolved-decoration-style:solid;--link-unresolved-decoration-color:hsla(var(--interactive-accent-hsl), 0.3);--list-indent:2em;--list-spacing:0.075em;--list-marker-color:var(--text-faint);--list-marker-color-hover:var(--text-muted);--list-marker-color-collapsed:var(--text-accent);--list-bullet-border:none;--list-bullet-radius:50%;--list-bullet-size:0.3em;--list-bullet-transform:none;--list-numbered-style:decimal;--nav-item-size:var(--font-ui-small);--nav-item-color:var(--text-muted);--nav-item-color-hover:var(--text-normal);--nav-item-color-active:var(--text-normal);--nav-item-color-selected:var(--text-normal);--nav-item-color-highlighted:var(--text-accent-hover);--nav-item-background-hover:var(--background-modifier-hover);--nav-item-background-active:var(--background-modifier-hover);--nav-item-background-selected:hsla(var(--color-accent-hsl), 0.15);--nav-item-padding:var(--size-4-1) var(--size-4-2) var(--size-4-1) var(--size-4-6);--nav-item-parent-padding:var(--nav-item-padding);--nav-item-children-padding-left:var(--size-2-2);--nav-item-children-margin-left:var(--size-4-3);--nav-item-weight:inherit;--nav-item-weight-hover:inherit;--nav-item-weight-active:inherit;--nav-item-white-space:nowrap;--nav-indentation-guide-width:var(--indentation-guide-width);--nav-indentation-guide-color:var(--indentation-guide-color);--nav-collapse-icon-color:var(--collapse-icon-color);--nav-collapse-icon-color-collapsed:var(--text-faint);--metadata-background:transparent;--metadata-display-reading:block;--metadata-display-editing:block;--metadata-max-width:none;--metadata-padding:var(--size-4-2) 0;--metadata-border-color:var(--background-modifier-border);--metadata-border-radius:0;--metadata-border-width:0;--metadata-divider-color:var(--background-modifier-border);--metadata-divider-color-hover:transparent;--metadata-divider-color-focus:transparent;--metadata-divider-width:0;--metadata-gap:3px;--metadata-property-padding:0;--metadata-property-radius:6px;--metadata-property-background:transparent;--metadata-property-background-hover:transparent;--metadata-property-background-active:var(--background-modifier-hover);--metadata-label-background-hover:transparent;--metadata-label-background-active:var(--background-modifier-hover);--metadata-label-font-size:var(--font-smaller);--metadata-label-font-weight:inherit;--metadata-label-text-color:var(--text-muted);--metadata-label-text-color-hover:var(--text-muted);--metadata-label-width:9em;--metadata-input-height:calc(var(--font-text-size) * 1.75);--metadata-input-text-color:var(--text-normal);--metadata-input-font-size:var(--font-smaller);--metadata-input-background:transparent;--metadata-input-background-hover:transparent;--metadata-input-background-active:var(--background-modifier-hover);--metadata-sidebar-label-font-size:var(--font-ui-small);--metadata-sidebar-input-font-size:var(--font-ui-small);--modal-background:var(--background-primary);--modal-width:90vw;--modal-height:85vh;--modal-max-width:1100px;--modal-max-height:1000px;--modal-max-width-narrow:800px;--modal-border-width:var(--border-width);--modal-border-color:var(--color-base-40, var(--background-modifier-border-focus));--modal-radius:var(--radius-l);--modal-community-sidebar-width:280px;--pill-color:var(--text-muted);--pill-color-hover:var(--text-normal);--pill-color-remove:var(--text-faint);--pill-color-remove-hover:var(--text-accent);--pill-decoration:none;--pill-decoration-hover:none;--pill-background:transparent;--pill-background-hover:transparent;--pill-border-color:var(--background-modifier-border);--pill-border-color-hover:var(--background-modifier-border-hover);--pill-border-width:var(--border-width);--pill-padding-x:0.65em;--pill-padding-y:0.25em;--pill-radius:2em;--pill-weight:inherit;--p-spacing:1rem;--p-spacing-empty:0rem;--pdf-background:var(--background-primary);--pdf-page-background:var(--background-primary);--pdf-shadow:0 0 0 1px rgba(0, 0, 0, 0.05),0 2px 8px rgba(0, 0, 0, 0.1);--pdf-spread-shadow:0 0 0 1px rgba(0, 0, 0, 0.05);--pdf-sidebar-background:var(--background-primary);--pdf-thumbnail-shadow:0 0 0 1px rgba(0, 0, 0, 0.15),0 2px 8px rgba(0, 0, 0, 0.2);--popover-width:450px;--popover-height:400px;--popover-max-height:70vh;--popover-pdf-width:600px;--popover-pdf-height:800px;--popover-font-size:var(--font-text-size);--prompt-width:700px;--prompt-max-width:80vw;--prompt-max-height:70vh;--prompt-border-width:var(--border-width);--prompt-border-color:var(--color-base-40, var(--background-modifier-border-focus));--radius-s:4px;--radius-m:8px;--radius-l:12px;--radius-xl:16px;--ribbon-background:var(--background-secondary);--ribbon-background-collapsed:var(--background-primary);--ribbon-width:44px;--ribbon-padding:var(--size-4-2) var(--size-4-1) var(--size-4-3);--scrollbar-active-thumb-bg:rgba(var(--mono-rgb-100), 0.2);--scrollbar-bg:rgba(var(--mono-rgb-100), 0.05);--scrollbar-thumb-bg:rgba(var(--mono-rgb-100), 0.1);--search-clear-button-color:var(--text-muted);--search-clear-button-size:13px;--search-icon-color:var(--text-muted);--search-icon-size:18px;--search-result-background:var(--background-primary);--size-2-1:2px;--size-2-2:4px;--size-2-3:6px;--size-4-1:4px;--size-4-2:8px;--size-4-3:12px;--size-4-4:16px;--size-4-5:20px;--size-4-6:24px;--size-4-8:32px;--size-4-9:36px;--size-4-12:48px;--size-4-16:64px;--size-4-18:72px;--sidebar-markdown-font-size:calc(var(--font-text-size) * 0.9);--sidebar-tab-text-display:none;--slider-thumb-border-width:1px;--slider-thumb-border-color:var(--background-modifier-border-hover);--slider-thumb-height:18px;--slider-thumb-width:18px;--slider-thumb-y:-6px;--slider-thumb-radius:50%;--slider-s-thumb-size:15px;--slider-s-thumb-position:-5px;--slider-track-background:var(--background-modifier-border);--slider-track-height:3px;--status-bar-background:var(--background-secondary);--status-bar-border-color:var(--divider-color);--status-bar-border-width:1px 0 0 1px;--status-bar-font-size:var(--font-ui-smaller);--status-bar-text-color:var(--text-muted);--status-bar-position:fixed;--status-bar-radius:var(--radius-m) 0 0 0;--status-bar-scroll-padding:calc(var(--status-bar-font-size) + 18px);--swatch-radius:14px;--swatch-height:24px;--swatch-width:24px;--swatch-shadow:inset 0 0 0 1px rgba(var(--mono-rgb-100), 0.15);--tab-background-active:var(--background-primary);--tab-text-color:var(--text-faint);--tab-text-color-active:var(--text-muted);--tab-text-color-focused:var(--text-muted);--tab-text-color-focused-active:var(--text-muted);--tab-text-color-focused-highlighted:var(--text-accent);--tab-text-color-focused-active-current:var(--text-normal);--tab-font-size:var(--font-ui-small);--tab-font-weight:inherit;--tab-container-background:var(--background-secondary);--tab-divider-color:var(--background-modifier-border-hover);--tab-outline-color:var(--divider-color);--tab-outline-width:1px;--tab-curve:6px;--tab-radius:var(--radius-s);--tab-radius-active:6px 6px 0 0;--tab-width:200px;--tab-max-width:320px;--tab-stacked-pane-width:700px;--tab-stacked-header-width:var(--header-height);--tab-stacked-font-size:var(--font-ui-small);--tab-stacked-font-weight:400;--tab-stacked-text-align:left;--tab-stacked-text-transform:rotate(0deg);--tab-stacked-text-writing-mode:vertical-lr;--tab-stacked-shadow:-8px 0 8px 0 rgba(0, 0, 0, 0.05);--table-background:transparent;--table-border-width:1px;--table-border-color:var(--background-modifier-border);--table-white-space:normal;--table-header-background:var(--table-background);--table-header-background-hover:inherit;--table-header-border-width:var(--table-border-width);--table-header-border-color:var(--table-border-color);--table-header-font:inherit;--table-header-size:var(--font-text-size);--table-header-weight:var(--bold-weight);--table-header-color:var(--text-normal);--table-line-height:var(--line-height-tight);--table-text-size:inherit;--table-text-color:inherit;--table-column-max-width:none;--table-column-alt-background:var(--table-background);--table-column-first-border-width:var(--table-border-width);--table-column-last-border-width:var(--table-border-width);--table-row-background-hover:var(--table-background);--table-row-alt-background:var(--table-background);--table-row-last-border-width:var(--table-border-width);--tag-size:var(--font-smaller);--tag-color:var(--text-accent);--tag-color-hover:var(--text-accent);--tag-decoration:none;--tag-decoration-hover:none;--tag-background:hsla(var(--interactive-accent-hsl), 0.1);--tag-background-hover:hsla(var(--interactive-accent-hsl), 0.2);--tag-border-color:hsla(var(--interactive-accent-hsl), 0.15);--tag-border-color-hover:hsla(var(--interactive-accent-hsl), 0.15);--tag-border-width:0px;--tag-padding-x:0.65em;--tag-padding-y:0.25em;--tag-radius:2em;--tag-weight:inherit;--titlebar-background:var(--background-secondary);--titlebar-background-focused:var(--background-secondary-alt);--titlebar-border-width:0px;--titlebar-border-color:var(--background-modifier-border);--titlebar-text-color:var(--text-muted);--titlebar-text-color-focused:var(--text-normal);--titlebar-text-weight:var(--font-bold);--toggle-border-width:2px;--toggle-width:40px;--toggle-radius:18px;--toggle-thumb-color:white;--toggle-thumb-radius:18px;--toggle-thumb-height:18px;--toggle-thumb-width:18px;--toggle-s-border-width:2px;--toggle-s-width:34px;--toggle-s-thumb-height:15px;--toggle-s-thumb-width:15px;--vault-name-font-size:var(--font-ui-small);--vault-name-font-weight:var(--font-medium);--vault-name-color:var(--text-normal);--workspace-background-translucent:rgba(var(--mono-rgb-0), 0.6);--accent-h:258;--accent-s:88%;--accent-l:66%;--background-primary:var(--color-base-00);--background-primary-alt:var(--color-base-10);--background-secondary:var(--color-base-20);--background-modifier-hover:rgba(var(--mono-rgb-100), 0.075);--background-modifier-active-hover:hsla(var(--interactive-accent-hsl), 0.15);--background-modifier-border:var(--color-base-30);--background-modifier-border-hover:var(--color-base-35);--background-modifier-border-focus:var(--color-base-40);--background-modifier-error-rgb:var(--color-red-rgb);--background-modifier-error:var(--color-red);--background-modifier-error-hover:var(--color-red);--background-modifier-success-rgb:var(--color-green-rgb);--background-modifier-success:var(--color-green);--background-modifier-message:rgba(0, 0, 0, 0.9);--background-modifier-form-field:var(--color-base-00);--text-normal:var(--color-base-100);--text-muted:var(--color-base-70);--text-faint:var(--color-base-50);--text-on-accent:white;--text-on-accent-inverted:black;--text-error:var(--color-red);--text-warning:var(--color-orange);--text-success:var(--color-green);--text-selection:hsla(var(--color-accent-hsl), 0.2);--text-highlight-bg-rgb:255,208,0;--text-highlight-bg:rgba(var(--text-highlight-bg-rgb), 0.4);--text-accent:var(--color-accent);--text-accent-hover:var(--color-accent-2);--interactive-normal:var(--color-base-00);--interactive-hover:var(--color-base-10);--interactive-accent-hsl:var(--color-accent-hsl);--interactive-accent:var(--color-accent-1);--interactive-accent-hover:var(--color-accent-2)}.theme-light{color-scheme:light;--highlight-mix-blend-mode:darken;--mono-rgb-0:255,255,255;--mono-rgb-100:0,0,0;--color-red-rgb:233,49,71;--color-red:#e93147;--color-orange-rgb:236,117,0;--color-orange:#ec7500;--color-yellow-rgb:224,172,0;--color-yellow:#e0ac00;--color-green-rgb:8,185,78;--color-green:#08b94e;--color-cyan-rgb:0,191,188;--color-cyan:#00bfbc;--color-blue-rgb:8,109,221;--color-blue:#086ddd;--color-purple-rgb:120,82,238;--color-purple:#7852ee;--color-pink-rgb:213,57,132;--color-pink:#d53984;--color-base-00:#ffffff;--color-base-05:#fcfcfc;--color-base-10:#fafafa;--color-base-20:#f6f6f6;--color-base-25:#e3e3e3;--color-base-30:#e0e0e0;--color-base-35:#d4d4d4;--color-base-40:#bdbdbd;--color-base-50:#ababab;--color-base-60:#707070;--color-base-70:#5c5c5c;--color-base-100:#222222;--color-accent-hsl:var(--accent-h),var(--accent-s),var(--accent-l);--color-accent:hsl(var(--accent-h), var(--accent-s), var(--accent-l));--color-accent-1:hsl(calc(var(--accent-h) - 1), calc(var(--accent-s) * 1.01), calc(var(--accent-l) * 1.075));--color-accent-2:hsl(calc(var(--accent-h) - 3), calc(var(--accent-s) * 1.02), calc(var(--accent-l) * 1.15));--background-secondary-alt:var(--color-base-05);--background-modifier-box-shadow:rgba(0, 0, 0, 0.1);--background-modifier-cover:rgba(220, 220, 220, 0.4);--input-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.12),0 2px 3px 0 rgba(0,0,0,.05),0 1px 1.5px 0 rgba(0,0,0,.03),0 1px 2px 0 rgba(0,0,0,.04),0 0 0 0 transparent;--input-shadow-hover:inset 0 0 0 1px rgba(0, 0, 0, 0.17),0 2px 3px 0 rgba(0,0,0,.1),0 1px 1.5px 0 rgba(0,0,0,.03),0 1px 2px 0 rgba(0,0,0,.04),0 0 0 0 transparent;--shadow-s:0px 1px 2px rgba(0, 0, 0, 0.028),0px 3.4px 6.7px rgba(0, 0, 0, .042),0px 15px 30px rgba(0, 0, 0, .07);--shadow-l:0px 1.8px 7.3px rgba(0, 0, 0, 0.071),0px 6.3px 24.7px rgba(0, 0, 0, 0.112),0px 30px 90px rgba(0, 0, 0, 0.2)}.theme-dark{color-scheme:dark;--highlight-mix-blend-mode:lighten;--mono-rgb-0:0,0,0;--mono-rgb-100:255,255,255;--color-red-rgb:251,70,76;--color-red:#fb464c;--color-orange-rgb:233,151,63;--color-orange:#e9973f;--color-yellow-rgb:224,222,113;--color-yellow:#e0de71;--color-green-rgb:68,207,110;--color-green:#44cf6e;--color-cyan-rgb:83,223,221;--color-cyan:#53dfdd;--color-blue-rgb:2,122,255;--color-blue:#027aff;--color-purple-rgb:168,130,255;--color-purple:#a882ff;--color-pink-rgb:250,153,205;--color-pink:#fa99cd;--color-base-00:#1e1e1e;--color-base-05:#212121;--color-base-10:#242424;--color-base-20:#262626;--color-base-25:#2a2a2a;--color-base-30:#363636;--color-base-35:#3f3f3f;--color-base-40:#555555;--color-base-50:#666666;--color-base-60:#999999;--color-base-70:#b3b3b3;--color-base-100:#dadada;--color-accent-hsl:var(--accent-h),var(--accent-s),var(--accent-l);--color-accent:hsl(var(--accent-h), var(--accent-s), var(--accent-l));--color-accent-1:hsl(calc(var(--accent-h) - 3), calc(var(--accent-s) * 1.02), calc(var(--accent-l) * 1.15));--color-accent-2:hsl(calc(var(--accent-h) - 5), calc(var(--accent-s) * 1.05), calc(var(--accent-l) * 1.29));--background-modifier-form-field:var(--color-base-25);--background-secondary-alt:var(--color-base-30);--interactive-normal:var(--color-base-30);--interactive-hover:var(--color-base-35);--text-accent:var(--color-accent-1);--interactive-accent:var(--color-accent);--interactive-accent-hover:var(--color-accent-1);--background-modifier-box-shadow:rgba(0, 0, 0, 0.3);--background-modifier-cover:rgba(10, 10, 10, 0.4);--text-selection:hsla(var(--interactive-accent-hsl), 0.25);--input-shadow:inset 0 0.5px 0.5px 0.5px rgba(255, 255, 255, 0.09),0 2px 4px 0 rgba(0,0,0,.15),0 1px 1.5px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.2),0 0 0 0 transparent;--input-shadow-hover:inset 0 0.5px 1px 0.5px rgba(255, 255, 255, 0.16),0 2px 3px 0 rgba(0,0,0,.3),0 1px 1.5px 0 rgba(0,0,0,.2),0 1px 2px 0 rgba(0,0,0,.4),0 0 0 0 transparent;--shadow-s:0px 1px 2px rgba(0, 0, 0, 0.121),0px 3.4px 6.7px rgba(0, 0, 0, 0.179),0px 15px 30px rgba(0, 0, 0, 0.3);--shadow-l:0px 1.8px 7.3px rgba(0, 0, 0, 0.071),0px 6.3px 24.7px rgba(0, 0, 0, 0.112),0px 30px 90px rgba(0, 0, 0, 0.2);--pdf-shadow:0 0 0 1px var(--background-modifier-border);--pdf-thumbnail-shadow:0 0 0 1px var(--background-modifier-border)}iframe{color-scheme:normal}@font-face{font-family:"Avenir Next";font-weight:400;font-style:normal;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/94f2f163d4b698242fef.otf")}@font-face{font-family:Inter;font-style:normal;font-weight:200;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/72505e6a122c6acd5471.woff2") format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:300;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/2d5198822ab091ce4305.woff2") format("woff2")}@font-face{font-family:Inter;font-weight:400;font-style:normal;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/c8ba52b05a9ef10f4758.woff2")}@font-face{font-family:Inter;font-weight:400;font-style:italic;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/cb10ffd7684cd9836a05.woff2")}@font-face{font-family:Inter;font-weight:600;font-style:normal;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/b5f0f109bc88052d4000.woff2")}@font-face{font-family:Inter;font-weight:800;font-style:normal;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/cbe0ae49c52c920fd563.woff2")}@font-face{font-family:Inter;font-weight:800;font-style:italic;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/535a6cf662596b3bd6a6.woff2")}@font-face{font-family:"Source Code Pro";font-weight:400;font-style:normal;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/70cc7ff27245e82ad414.ttf")}@font-face{font-family:"Source Code Pro";font-weight:400;font-style:italic;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/454577c22304619db035.ttf")}@font-face{font-family:"Source Code Pro";font-weight:700;font-style:normal;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/52ac8f3034507f1d9e53.ttf")}@font-face{font-family:"Source Code Pro";font-weight:700;font-style:italic;font-display:swap;src:url("https://publish.obsidian.md/public/fonts/05b618077343fbbd92b7.ttf")}@font-face{font-family:"Flow Circular";font-display:swap;src:url("https://publish.obsidian.md/public/fonts/4bb6ac751d1c5478ff3a.woff2")}@font-face{font-family:"??";unicode-range:U+0}body{--font-default:ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Inter","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Microsoft YaHei Light",sans-serif;--font-monospace-default:Menlo,SFMono-Regular,Consolas,"Roboto Mono",'Source Code Pro',monospace;--font-interface-override:'??';--font-interface-theme:'??';--font-interface:var(--font-interface-override),var(--font-interface-theme),var(--default-font, '??'),var(--font-default);--font-text-override:'??';--font-text-theme:'??';--font-text:var(--font-text-override),var(--font-text-theme),var(--font-interface);--font-print-override:'??';--font-print:var(--font-print-override),var(--font-text-override),var(--font-text-theme),'Arial';--font-monospace-override:'??';--font-monospace-theme:'??';--font-monospace:var(--font-monospace-override),var(--font-monospace-theme),var(--font-monospace-default);--font-text-size:16px;--font-mermaid:var(--font-text)}*{box-sizing:border-box}body,html{margin:0;padding:0;height:100%;width:100%;overflow:hidden}body{text-rendering:optimizelegibility;font-family:var(--font-interface);line-height:var(--line-height-tight);font-size:var(--font-ui-medium);background-color:var(--background-primary);color:var(--text-normal);-webkit-tap-highlight-color:rgba(255,255,255,0)}body.is-translucent{background-color:transparent}.node-insert-event{animation-duration:10ms;animation-name:node-inserted}.is-flashing{transition:all .25s ease 0s;color:var(--text-normal);mix-blend-mode:var(--highlight-mix-blend-mode);border-radius:var(--radius-s);background-color:var(--text-highlight-bg)!important}body{user-select:none;overflow:hidden}body.is-grabbing iframe:not(.is-controlled),body.is-grabbing webview{pointer-events:none}.app-container{display:flex;height:100%;width:100%;position:relative;flex-direction:column}.app-container.no-transition *{transition:none 0s ease 0s!important}.horizontal-main-container{width:100%;display:flex;overflow:hidden;flex:1 0 0px}:focus{outline:0}.is-text-garbled *{font-family:"Flow Circular",sans-serif!important;line-height:1.45em!important}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none;outline:0}.CodeMirror-vscrollbar{right:0;top:0;overflow:hidden scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow:scroll hidden}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{z-index:unset;outline:unset}.CodeMirror-vscrollbar{outline:0}.CodeMirror-hscrollbar{outline:0;z-index:3}.empty-state{position:absolute;height:100%;width:100%;top:0;left:0;display:flex;align-items:center;justify-content:center;flex-direction:column}.empty-state-container{max-width:480px;max-height:280px;margin:20px;text-align:center}.empty-state-title{margin:20px 0;font-weight:var(--h2-weight);font-size:var(--h2-size);line-height:var(--line-height-tight);position:relative}.empty-state-action-list{font-size:var(--font-text-size);line-height:var(--line-height-tight);color:var(--text-muted);margin-top:20px}.empty-state-action{cursor:var(--cursor);line-height:36px;color:var(--text-accent)}.empty-state-close-button{display:none}body{--zoom-factor:1;--titlebar-height:30px}body.is-frameless:not(.is-hidden-frameless){padding-top:calc(var(--titlebar-height)/ var(--zoom-factor))}.is-hidden-frameless{--divider-vertical-height:100%}body.is-frameless>.app-container~*{app-region:no-drag}body.is-frameless .modal{app-region:no-drag}.pane-empty{color:var(--text-faint);font-size:var(--font-ui-small);margin:var(--size-4-2) auto;text-align:center}.view-header-title::-webkit-scrollbar{display:none}.view-content{width:100%;height:calc(100% - var(--header-height))}.inline-title{font-weight:var(--inline-title-weight);font-size:var(--inline-title-size);line-height:var(--inline-title-line-height);font-style:var(--inline-title-style);font-variant:var(--inline-title-variant);font-family:var(--inline-title-font);margin-bottom:var(--inline-title-margin-bottom);letter-spacing:-.015em;color:var(--inline-title-color)}body:not(.show-inline-title) .inline-title:not([data-level]){display:none}::selection{background-color:var(--text-selection)}.markdown-reading-view{display:flex;flex-direction:column}.markdown-preview-view{font-size:var(--font-text-size);font-family:var(--font-text);line-height:var(--line-height-normal);width:100%;height:100%;padding:var(--file-margins);position:relative;overflow-y:auto;overflow-wrap:break-word;color:var(--text-normal);user-select:text;scrollbar-gutter:stable}.markdown-preview-view.is-readable-line-width .markdown-preview-sizer{max-width:var(--file-line-width);margin-left:auto;margin-right:auto}.markdown-rendered.rtl{direction:rtl}.release-notes-view{padding:var(--file-margins)}.release-notes-view .markdown-preview-view{overflow:visible}.release-notes-view .is-readable-line-width{max-width:var(--file-line-width);margin-left:auto;margin-right:auto}.modal.mod-trust-folder{max-width:700px}.modal.mod-plugin-options .modal-content{margin:var(--size-4-6) 0}.hotkey-list-container{overflow:auto}.search-input-container.mod-hotkey .clickable-icon{padding:var(--size-2-1)}.modal.mod-image-lightbox{max-width:90vw;max-height:90vh;padding:0}.modal.mod-image-lightbox .modal-content{padding:var(--size-4-12) var(--size-4-3) var(--size-4-2) var(--size-4-3);text-align:center}.login-field{max-width:500px;margin:1em auto}.search-input-container input:placeholder-shown~.search-input-clear-button{display:none}.community-modal-details-empty-state{padding:0;text-align:center}.community-modal-search-summary{font-size:var(--font-ui-small);padding:var(--size-4-1) var(--size-4-3) var(--size-4-3) var(--size-4-4)}.community-modal-search-results-wrapper{flex:1 0 auto;overflow:auto;border-top:var(--border-width) solid var(--divider-color);scroll-padding:var(--size-4-3);contain:strict}.community-modal-search-results{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--size-4-3);padding:var(--size-4-3)}.community-item{position:relative;background-color:var(--background-primary);padding:var(--size-4-3);cursor:var(--cursor);border-radius:var(--radius-m);border:1px solid var(--background-modifier-border);display:flex;flex-direction:column;gap:var(--size-2-1)}.community-item:last-child{margin-bottom:0}.community-item.is-selected,.community-item.is-selected:hover{border-color:var(--interactive-accent);background-color:var(--interactive-accent);color:var(--text-on-accent)}.community-item.is-selected .flair,.community-item.is-selected:hover .flair{color:var(--text-on-accent);background-color:transparent}.community-item .flair{margin-left:var(--size-4-1);background-color:var(--tag-background);color:var(--tag-color);vertical-align:middle;top:-1px}.community-item-name{font-size:var(--font-ui-medium);line-height:var(--line-height-tight);font-weight:var(--font-medium)}.community-item-author{font-size:var(--font-ui-smaller);line-height:var(--line-height-tight);color:var(--text-muted)}.community-item-updated{font-size:var(--font-ui-smaller);color:var(--text-muted);margin-bottom:var(--size-4-2)}.community-item-desc{font-size:var(--font-ui-small);line-height:var(--line-height-tight);margin-top:4px}.community-item-badge.mod-update{--icon-size:var(--icon-xs);--icon-stroke:var(--icon-xs-stroke-width);color:var(--interactive-accent);position:absolute;top:var(--size-4-3);right:var(--size-4-3)}.community-item-screenshot{max-width:100%;object-fit:cover;border-radius:var(--radius-s);aspect-ratio:16/9;image-rendering:-webkit-optimize-contrast;margin-top:var(--size-4-1)}.community-item-screenshot.mod-unavailable{text-align:center;color:var(--text-muted)}.community-item-screenshot .placeholder-icon{display:flex;align-items:center;justify-content:center;height:100%}.community-item-screenshot .placeholder-icon .svg-icon{color:var(--text-faint);width:var(--size-4-8);height:var(--size-4-8)}.community-modal-info-name{font-size:var(--h2-size);font-weight:var(--font-semibold);line-height:var(--line-height-tight);margin-bottom:var(--size-4-6)}.community-modal-info-author,.community-modal-info-repo,.community-modal-info-version{font-size:var(--font-ui-small);line-height:var(--line-height-tight);color:var(--text-muted)}.community-modal-info-desc{font-size:var(--font-ui-small);line-height:var(--line-height-tight);margin-top:4px}.community-modal-details{flex:1 1 calc(var(--modal-max-width) - var(--modal-community-sidebar-width));overflow:auto;display:flex;flex-direction:column;border-left:1px solid var(--divider-color)}.community-modal-info{flex:1 1 0px;overflow-y:auto;padding:var(--size-4-8) var(--size-4-16);scroll-padding:var(--size-4-4)}.community-readme{overflow-y:visible;height:auto;padding:var(--size-4-4) 0}.community-readme img,.community-readme video{max-width:100%}.community-modal-info-desc{font-size:var(--font-ui-medium);line-height:var(--line-height-tight);margin-top:var(--size-4-2)}.community-modal-button-container{display:flex;flex-wrap:wrap;gap:var(--size-4-2);margin:1.5em 0}.community-modal-readme{font-size:var(--font-text-size);font-family:var(--font-text);line-height:var(--line-height-normal);overflow-wrap:break-word;color:var(--text-normal);user-select:text}.installed-plugins-container{padding-top:var(--size-4-4);border-top:1px solid var(--background-modifier-border)}.community-modal-grid-button-container{position:absolute;top:var(--size-4-4);right:var(--size-4-12);display:flex;gap:var(--size-4-2)}body.is-frameless.is-hidden-frameless{padding-top:0!important}.is-translucent:not(.is-fullscreen){--nav-collapse-icon-color:rgba(var(--mono-rgb-100), 0.3);--nav-collapse-icon-color-collapsed:rgba(var(--mono-rgb-100), 0.3);--divider-color:rgba(0, 0, 0, 0.15)}.workspace-tab-header-container-inner::-webkit-scrollbar,.workspace-tab-header-container-inner::-webkit-scrollbar-thumb{display:none}.button-container{margin-top:20px}button{app-region:no-drag;display:inline-flex;align-items:center;justify-content:center;color:var(--text-normal);font-size:var(--font-ui-small);border-radius:var(--button-radius);border:0;padding:var(--size-4-1) var(--size-4-3);height:var(--input-height);font-weight:var(--input-font-weight);cursor:var(--cursor);font-family:inherit;outline:0;user-select:none;white-space:nowrap}button:not(.clickable-icon){background-color:var(--interactive-normal);box-shadow:var(--input-shadow)}button:focus-visible{box-shadow:0 0 0 3px var(--background-modifier-border-focus)}button[disabled=true]{cursor:not-allowed}button.mod-cta{background-color:var(--interactive-accent);color:var(--text-on-accent)}button.mod-cta:focus-visible{box-shadow:0 0 0 3px var(--background-modifier-border-focus)}button.mod-muted{background-color:var(--background-secondary);color:var(--text-muted)}button.mod-warning{background-color:var(--background-modifier-error);color:var(--text-on-accent)}button.mod-destructive{color:var(--text-error)}.card-container{display:flex}.card-container.mod-horizontal{flex-direction:column}.card{background-color:var(--background-secondary-alt);border-radius:4px;border:1px solid var(--background-modifier-border);margin:0 10px;padding:15px 30px;display:flex;flex-direction:column;flex-grow:1}.card ul{padding:0}.card .button-container{margin:10px 0}.card-container.mod-horizontal .card{margin:10px 0}.card-container.mod-horizontal .card ul{padding-left:24px}.card li{margin:5px 0}.card.u-clickable{cursor:var(--cursor)}.card.is-selected{border:1px solid var(--interactive-accent);background-color:hsla(var(--interactive-accent-hsl),.2)}.card-title{text-align:center;font-size:20px;line-height:30px;color:var(--text-muted);margin-bottom:8px}.card-description{color:var(--text-muted);font-size:var(--font-ui-small);line-height:20px;flex-grow:1}.changelog-item{margin:var(--size-4-2) 0;font-size:var(--font-ui-medium);line-height:var(--line-height)}.changelog-item::before{content:attr(data-label);width:50px;border-radius:var(--radius-m);font-size:var(--font-ui-small);display:inline-block;text-align:center;margin-right:14px;text-transform:uppercase;letter-spacing:1px;line-height:22px}.changelog-item.mod-success::before{background-color:var(--background-modifier-success)}.changelog-item.mod-highlighted::before{background-color:var(--interactive-accent)}.list-item{display:flex;padding:0;margin:8px 0;gap:var(--size-4-2);align-items:center}.list-item-part.mod-extended{flex-grow:1;overflow-wrap:anywhere}.list-item-part.clickable-icon{display:flex;align-items:center;justify-content:center;padding:var(--size-2-2);cursor:var(--cursor);border-radius:var(--radius-s);color:var(--icon-color)}.list-item-part.clickable-icon:active,.list-item-part.clickable-icon:hover{color:var(--icon-color-hover);background-color:var(--background-modifier-hover)}.u-center-text{text-align:center}.u-faded-text{color:var(--text-muted)}.u-pop{color:var(--text-accent);font-weight:var(--font-semibold)}.u-muted{color:var(--text-muted)}.u-small{font-size:.8em}.u-clickable{cursor:var(--cursor)}.diff-view{height:100%;overflow:auto;user-select:text}.diff-line{padding:0 var(--size-4-2)}.diff-line.mod-left{background-color:rgba(var(--background-modifier-error-rgb),.2)}.diff-line.mod-left .diff-changed{background-color:rgba(var(--background-modifier-error-rgb),.4)}.diff-line.mod-right{background-color:rgba(var(--background-modifier-success-rgb),.2)}.diff-line.mod-right .diff-changed{background-color:rgba(var(--background-modifier-success-rgb),.4)}.diff-collapsed{text-align:center;color:var(--text-muted);cursor:pointer;font-size:var(--font-ui-small);margin:var(--size-4-2) 0}.diff-collapsed:hover{color:var(--text-accent)}.mod-active .document-search-container{background-color:var(--background-primary)}.document-search-container{display:flex;flex-direction:column;padding:var(--size-4-2) 0;margin:0 var(--size-4-4);gap:var(--size-4-2);z-index:var(--layer-popover)}.document-replace,.document-search{width:100%;max-width:var(--file-line-width);margin:0 auto;display:flex;padding:0 var(--size-4-2);gap:var(--size-4-2)}.document-replace{display:none}.document-search-container.mod-replace-mode .document-replace{display:flex}input.document-replace-input,input.document-search-input{flex-grow:1}input.document-replace-input.mod-no-match,input.document-search-input.mod-no-match{background-color:rgba(var(--background-modifier-error-rgb),.2)}.document-replace-buttons,.document-search-buttons{display:flex;gap:var(--size-4-2);align-items:center}.document-search-button{font-size:var(--font-ui-small);padding:0 var(--size-4-2);color:var(--text-muted)}.document-search-close-button{cursor:var(--cursor);position:relative;top:2px;font-size:24px;line-height:20px;height:24px;width:24px;padding:0 var(--size-2-2);border-radius:var(--radius-s);color:var(--text-muted)}.document-search-close-button::before{font-family:Inter,sans-serif;content:"×";font-weight:300}.markdown-rendered .search-highlight>div{position:absolute;pointer-events:none;box-shadow:0 0 0 2px var(--text-normal);opacity:.3;mix-blend-mode:var(--highlight-mix-blend-mode);border-radius:2px}.markdown-rendered .search-highlight>div.is-active{box-shadow:0 0 0 3px var(--text-accent);opacity:1}.flair{background-color:var(--interactive-normal);border-radius:var(--radius-s);color:var(--text-normal);font-size:10px;letter-spacing:.05em;margin-left:var(--size-4-2);padding:var(--size-2-1) var(--size-2-2);position:relative;text-transform:uppercase;white-space:nowrap;vertical-align:middle}.flair.mod-flat{vertical-align:top}.flair.mod-pop{background-color:var(--interactive-accent);color:var(--text-on-accent)}.markdown-preview-view:not(.allow-fold-headings) .heading-collapse-indicator,.markdown-preview-view:not(.allow-fold-lists) .list-collapse-indicator{display:none}.collapse-icon{display:flex;align-items:center}.collapse-icon::before{content:"​"}.collapse-icon svg.svg-icon{color:var(--nav-collapse-icon-color);stroke-width:4px;width:10px;height:10px;transition:transform .1s ease-in-out 0s}.collapse-icon.is-collapsed svg.svg-icon{transform:rotate(-90deg)}.rtl .collapse-icon.is-collapsed svg.svg-icon{transform:rotate(90deg)}.view-content .collapse-indicator svg.svg-icon,.view-content .list-collapse-indicator svg.svg-icon{color:var(--collapse-icon-color)}.view-content .is-collapsed .collapse-indicator svg.svg-icon,.view-content .is-collapsed .list-collapse-indicator svg.svg-icon{color:var(--collapse-icon-color-collapsed)}.markdown-preview-view .collapse-indicator{float:left;cursor:var(--cursor)}.markdown-preview-view .collapse-indicator .svg-icon{vertical-align:middle}.markdown-preview-view li.is-collapsed>ol,.markdown-preview-view li.is-collapsed>ul{display:none}.markdown-preview-view .heading-collapse-indicator{margin-left:-22px;padding:0 6px}svg.svg-icon{height:var(--icon-size);width:var(--icon-size);stroke-width:var(--icon-stroke)}.view-actions{gap:0;align-items:center;--icon-size:var(--icon-s)}.clickable-icon{app-region:no-drag;background-color:transparent;display:flex;align-items:center;justify-content:center;padding:var(--size-2-2) var(--size-2-3);cursor:var(--cursor);border-radius:var(--clickable-icon-radius);color:var(--icon-color);opacity:var(--icon-opacity);transition:opacity .15s ease-in-out 0s;height:auto}.clickable-icon.is-active{opacity:var(--icon-opacity-hover);color:var(--icon-color-active);background-color:var(--background-modifier-active-hover)}.clickable-icon.mod-warning{color:var(--text-error)}.clickable-icon.mod-filled svg{fill:var(--icon-color)}.text-icon-button{app-region:no-drag;display:inline-flex;align-items:center;color:var(--text-muted);font-size:var(--font-ui-small);border-radius:var(--button-radius);padding:var(--size-2-1) var(--size-4-3) var(--size-2-1) var(--size-4-2);height:var(--input-height);font-weight:var(--input-font-weight);cursor:var(--cursor);font-family:inherit;gap:var(--size-2-2);user-select:none;white-space:nowrap}.text-icon-button .text-button-icon{display:flex;align-items:center;justify-content:center}.text-icon-button .text-button-icon svg.svg-icon{height:var(--icon-size);width:var(--icon-size);stroke-width:var(--icon-stroke)}.text-icon-button:focus{box-shadow:0 0 0 2px var(--background-modifier-border-focus);outline:0}.markdown-rendered.show-indentation-guide li>ol,.markdown-rendered.show-indentation-guide li>ul{position:relative}.markdown-rendered.show-indentation-guide li>ol::before,.markdown-rendered.show-indentation-guide li>ul::before{content:"​";position:absolute;display:block;left:-1em;top:0;bottom:0;border-right:var(--indentation-guide-width) solid var(--indentation-guide-color)}.input-label{display:inline-block;width:150px;text-align:right;margin-right:var(--size-4-2)}.input-button{padding:6px 14px;margin-left:14px;color:var(--text-muted);font-size:var(--font-ui-medium);position:relative;top:-1px}input.metadata-input-text,input[type=date],input[type=datetime-local],input[type=email],input[type=number],input[type=password],input[type=search],input[type=text],textarea{app-region:no-drag;background:var(--background-modifier-form-field);border:var(--input-border-width) solid var(--background-modifier-border);color:var(--text-normal);font-family:inherit;padding:var(--size-4-1) var(--size-4-2);font-size:var(--font-ui-small);border-radius:var(--input-radius);outline:0}input.metadata-input-text:active,input.metadata-input-text:focus,input[type=date]:active,input[type=date]:focus,input[type=datetime-local]:active,input[type=datetime-local]:focus,input[type=email]:active,input[type=email]:focus,input[type=number]:active,input[type=number]:focus,input[type=password]:active,input[type=password]:focus,input[type=search]:active,input[type=search]:focus,input[type=text]:active,input[type=text]:focus,textarea:active,textarea:focus{border-color:var(--background-modifier-border-focus);transition:box-shadow .15s ease-in-out 0s,border .15s ease-in-out 0s}input.metadata-input-text:active,input.metadata-input-text:focus,input.metadata-input-text:focus-visible,input[type=date]:active,input[type=date]:focus,input[type=date]:focus-visible,input[type=datetime-local]:active,input[type=datetime-local]:focus,input[type=datetime-local]:focus-visible,input[type=email]:active,input[type=email]:focus,input[type=email]:focus-visible,input[type=number]:active,input[type=number]:focus,input[type=number]:focus-visible,input[type=password]:active,input[type=password]:focus,input[type=password]:focus-visible,input[type=search]:active,input[type=search]:focus,input[type=search]:focus-visible,input[type=text]:active,input[type=text]:focus,input[type=text]:focus-visible,textarea:active,textarea:focus,textarea:focus-visible{box-shadow:0 0 0 2px var(--background-modifier-border-focus)}input.metadata-input-text::placeholder,input[type=date]::placeholder,input[type=datetime-local]::placeholder,input[type=email]::placeholder,input[type=number]::placeholder,input[type=password]::placeholder,input[type=search]::placeholder,input[type=text]::placeholder,textarea::placeholder{color:var(--text-faint)}input[type=email],input[type=number],input[type=password],input[type=search],input[type=text]{height:var(--input-height)}textarea{line-height:var(--line-height-tight)}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{display:none;pointer-events:none}input[type=number]::-webkit-inner-spin-button{appearance:none}input[type=date],input[type=datetime-local]{font-variant-numeric:tabular-nums;position:relative}input[type=date]::-webkit-calendar-picker-indicator,input[type=datetime-local]::-webkit-calendar-picker-indicator{position:absolute;left:var(--size-4-1);opacity:.5}body:not(.is-ios):not(.is-android) input[type=date],body:not(.is-ios):not(.is-android) input[type=datetime-local]{padding-left:var(--size-4-6)}input[type=range]{width:100px;appearance:none;background-color:var(--slider-track-background);border-radius:var(--slider-track-height);height:var(--slider-track-height);padding:0;outline:0}input[type=range]::-webkit-slider-runnable-track{height:6px;appearance:none}input[type=range]::-webkit-slider-thumb{appearance:none;height:var(--slider-thumb-height);width:var(--slider-thumb-width);border-radius:var(--slider-thumb-radius);cursor:default;background:#fff;border:var(--slider-thumb-border-width) solid var(--slider-thumb-border-color);position:relative;top:var(--slider-thumb-y);transition:all .1s linear 0s;box-shadow:rgba(0,0,0,.05) 0 1px 1px 0,rgba(0,0,0,.1) 0 2px 2px 0}input[type=range]::-webkit-slider-thumb:active,input[type=range]::-webkit-slider-thumb:hover{background:#fff;border-color:var(--background-modifier-border-focus);box-shadow:rgba(0,0,0,.1) 0 1px 2px 0,rgba(0,0,0,.2) 0 2px 3px 0;transition:all .1s linear 0s}input[type=color]{appearance:none;width:calc(var(--swatch-width) + 4px);background-color:transparent;border:none;cursor:var(--cursor);padding:0}input[type=color]::-webkit-color-swatch-wrapper{padding:2px}input[type=color]::-webkit-color-swatch{border:0;box-shadow:var(--swatch-shadow);border-radius:var(--swatch-radius);height:var(--swatch-height);width:var(--swatch-width);align-self:center}input[type=color]:focus-visible::-webkit-color-swatch,input[type=color]:focus::-webkit-color-swatch{box-shadow:var(--swatch-shadow),0 0 0 3px var(--background-modifier-border-focus)}select.mod-hidden{display:none}.notice-container{z-index:var(--layer-notice);position:fixed;top:22px;right:0;padding:10px;overflow:hidden}.notice{background-color:var(--background-modifier-message);border-radius:var(--radius-m);box-shadow:0 2px 8px var(--background-modifier-box-shadow);color:#fafafa;font-size:var(--font-ui-small);line-height:var(--line-height-tight);padding:.75em 1em;max-width:300px;margin-bottom:14px;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;cursor:var(--cursor)}.debug-textarea{width:100%;height:50vh;max-height:80vh;font-family:var(--font-monospace);tab-size:4;resize:none}.modal-container{display:flex;align-items:center;justify-content:center;position:absolute;top:0;left:0;width:100%;height:100%;z-index:var(--layer-modal)}.modal-container.mod-dim .modal{box-shadow:var(--shadow-l)}.modal-bg{position:absolute;top:0;left:0;width:100%;height:100%;background-color:var(--background-modifier-cover)}.modal{--checkbox-size:var(--font-ui-medium);background-color:var(--modal-background);border-radius:var(--modal-radius);border:var(--modal-border-width) solid var(--modal-border-color);padding:var(--size-4-4);position:relative;min-height:100px;width:var(--dialog-width);max-width:var(--dialog-max-width);max-height:var(--dialog-max-height);display:flex;flex-direction:column;overflow:auto}.modal.mod-scrollable-content{padding:0;overflow:hidden}.modal.mod-scrollable-content .modal-title{padding:var(--size-4-4) var(--size-4-4) 0 var(--size-4-4)}.modal.mod-scrollable-content .modal-content{padding:0 var(--size-4-4) var(--size-4-4) var(--size-4-4);overflow:auto}body:not(.native-scrollbars) .modal-close-button{right:12px}.modal-close-button{cursor:var(--cursor);position:absolute;top:var(--size-2-3);right:var(--size-2-3);font-size:24px;line-height:20px;height:24px;width:24px;padding:0 var(--size-2-2);border-radius:var(--radius-s);color:var(--text-muted)}.modal-close-button::before{font-family:Inter,sans-serif;content:"×";font-weight:300}.modal-title{font-size:var(--font-ui-large);margin-bottom:.75em;font-weight:var(--font-semibold);text-align:left;line-height:var(--line-height-tight)}.modal-title:empty{display:none}.modal-content{flex:1 1 auto;font-size:var(--font-ui-medium)}.modal-button-container{margin-top:1.5em;display:flex;justify-content:flex-end;gap:var(--size-4-2);flex-wrap:wrap;font-size:var(--font-ui-medium)}.modal-button-container .mod-checkbox{flex-grow:1;display:flex;align-items:center;gap:var(--size-4-1)}.modal-button-container .mod-secondary{margin-right:auto}.modal.mod-scrollable-content>.modal-button-container{margin-top:0;border-top:1px solid var(--background-modifier-border);padding:var(--size-4-4)}.modal-checkbox-label{cursor:var(--cursor);margin-left:10px;user-select:none}.mod-warning{color:var(--text-error)}.mod-success{color:var(--text-success)}.modal .modal-nav-action{background-color:unset;margin-top:var(--size-4-1);position:absolute;top:0;width:unset}.modal .modal-nav-action.mod-secondary{left:0}.modal .modal-nav-action.mod-cta{color:var(--color-accent);font-weight:var(--font-semibold);right:0}.nav-buttons-container{flex-wrap:wrap;gap:var(--size-2-1)}.nav-buttons-container.has-separator{border-bottom:1px solid var(--background-modifier-border);padding-bottom:var(--size-2-3);margin-bottom:var(--size-4-2)}body{--pill-focus-width:calc(100% + 6px);--pill-focus-left-adjust:-4px}.multi-select-container{cursor:text;display:inline-flex;vertical-align:top;flex-wrap:wrap;min-height:var(--input-height);width:100%;background:var(--background-modifier-form-field);border:var(--input-border-width) solid var(--background-modifier-border);color:var(--text-normal);font-size:var(--font-ui-small);border-radius:var(--input-radius);outline:0;padding:var(--size-4-1);gap:var(--size-4-1)}.multi-select-pill{--icon-size:var(--icon-xs);--icon-stroke:var(--icon-xs-stroke-width);display:flex;align-items:center;background-color:var(--pill-background);border:var(--pill-border-width) solid var(--pill-border-color);border-radius:var(--pill-radius);color:var(--pill-color);cursor:var(--cursor);font-weight:var(--pill-weight);padding:var(--pill-padding-y) 0;line-height:1;max-width:100%;gap:var(--size-2-1);position:relative}.multi-select-pill:focus::after{content:"";display:block;position:absolute;pointer-events:none;border-radius:var(--pill-radius);left:var(--pill-focus-left-adjust);width:var(--pill-focus-width);height:100%;box-shadow:0 0 0 1px var(--background-modifier-border-focus),inset 0 0 0 1px var(--background-modifier-border-focus)}.multi-select-pill-content{margin-left:var(--pill-padding-x)}.multi-select-pill-remove-button{margin-right:min(var(--size-2-3),var(--pill-padding-x));cursor:var(--cursor);color:var(--pill-color-remove);border-radius:var(--radius-s);display:flex;align-items:center;--icon-size:var(--icon-xs);--icon-stroke:var(--icon-xs-stroke-width)}.multi-select-pill-remove-button:hover{color:var(--pill-color-remove-hover)}.multi-select-input{cursor:text;font-family:var(--font-interface);min-width:1ch;max-width:max-content;color:var(--text-normal);background-color:inherit;border:none;overflow-x:auto;white-space:nowrap}.multi-select-input::-webkit-scrollbar{display:none}.multi-select-input::before{content:"​"}.multi-select-input:empty::before{content:attr(placeholder);color:var(--text-faint);pointer-events:none}.multi-select-duplicate{animation:2s ease-in 0s 1 normal none running multi-select-highlight}body:not(.native-scrollbars) ::-webkit-scrollbar{width:12px;height:12px;border-radius:var(--radius-l);background-color:transparent}body:not(.native-scrollbars) ::-webkit-scrollbar-track{background-color:transparent}body:not(.native-scrollbars) ::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-bg);border-radius:var(--radius-l);background-clip:padding-box;border-style:solid;border-color:transparent;border-image:initial;border-width:3px 3px 3px 2px;min-height:45px}body:not(.native-scrollbars) ::-webkit-scrollbar-thumb:active{border-radius:var(--radius-l)}body:not(.native-scrollbars) ::-webkit-scrollbar-thumb:active,body:not(.native-scrollbars) ::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-active-thumb-bg)}body:not(.native-scrollbars) ::-webkit-scrollbar-corner{background:0 0}.checkbox-container{app-region:no-drag;cursor:var(--cursor);background-color:var(--background-modifier-border-hover);border-radius:var(--toggle-radius);display:inline-block;flex-shrink:0;height:calc(var(--toggle-thumb-height) + var(--toggle-border-width) * 2);position:relative;user-select:none;width:var(--toggle-width);box-shadow:rgba(0,0,0,.07) 0 4px 10px inset,rgba(0,0,0,.21) 0 0 1px inset;transition:box-shadow .15s ease-in-out 0s,outline .15s ease-in-out 0s,border .15s ease-in-out 0s,opacity .15s ease-in-out 0s;outline:0 solid var(--background-modifier-border-focus)}.checkbox-container input[type=checkbox]{position:absolute;opacity:0;left:0}.checkbox-container:focus-within{outline:var(--toggle-border-width) solid var(--background-modifier-border-focus)}.checkbox-container.is-enabled{background-color:var(--interactive-accent)}.checkbox-container.is-enabled::after{transform:translate3d(calc(var(--toggle-width) - var(--toggle-thumb-width) - var(--toggle-border-width)),0,0)}.checkbox-container.is-enabled:active::after{left:-4px}.checkbox-container::before{content:"";display:block;position:absolute;inset:0px;opacity:0}.checkbox-container::after{pointer-events:none;content:"";display:block;position:absolute;background-color:var(--toggle-thumb-color);width:var(--toggle-thumb-width);height:var(--toggle-thumb-height);margin:var(--toggle-border-width) 0 0 0;border-radius:var(--toggle-thumb-radius);transition:transform .15s ease-in-out 0s,width .1s ease-in-out 0s,left .1s ease-in-out 0s;left:0;transform:translate3d(var(--toggle-border-width),0,0);box-shadow:rgba(0,0,0,.15) 0 1px 2px}.checkbox-container:active::after{width:calc(var(--toggle-thumb-width) + var(--toggle-border-width))}.checkbox-container.mod-small{width:var(--toggle-s-width);height:calc(var(--toggle-s-thumb-height) + var(--toggle-s-border-width) * 2)}.checkbox-container.mod-small:focus-within{outline:var(--toggle-s-border-width) solid var(--background-modifier-border-focus)}.checkbox-container.mod-small::after{width:var(--toggle-s-thumb-width);height:var(--toggle-s-thumb-height);margin:var(--toggle-s-border-width) 0 0 0;transform:translate3d(var(--toggle-s-border-width),0,0)}.checkbox-container.mod-small.is-enabled::after{transform:translate3d(calc(var(--toggle-s-width) - var(--toggle-s-thumb-width) - var(--toggle-s-border-width)),0,0)}.checkbox-container.mod-small:active::after{width:calc(var(--toggle-s-thumb-width) + var(--toggle-s-border-width))}.tree-item-self{align-items:baseline;display:flex;border-radius:var(--radius-s);color:var(--nav-item-color);font-size:var(--nav-item-size);line-height:var(--line-height-tight);font-weight:var(--nav-item-weight);margin-bottom:var(--size-2-1);padding:var(--nav-item-padding);position:relative}.tree-item-self.mod-collapsible{padding:var(--nav-item-parent-padding)}.tree-item-self.mod-collapsible.is-being-dragged-over{border-radius:var(--radius-s);color:var(--nav-item-color-highlighted);background:hsla(var(--interactive-accent-hsl),.1)}.tree-item-self.mod-collapsible.is-being-dragged-over .collapse-icon{color:var(--nav-item-color-highlighted)}.tree-item-self.is-clickable{cursor:var(--cursor)}.tree-item-self.is-active,body:not(.is-grabbing) .tree-item-self.is-active:hover{color:var(--nav-item-color-active);background-color:var(--nav-item-background-active);font-weight:var(--nav-item-weight-active)}.tree-item-self.is-selected,body:not(.is-grabbing) .tree-item-self.is-selected:hover{color:var(--nav-item-color-selected);background-color:var(--nav-item-background-selected)}.tree-item-self.is-being-dragged,body:not(.is-grabbing) .tree-item-self.is-being-dragged:hover{color:var(--text-on-accent);background-color:var(--interactive-accent)}.tree-item-self.is-being-dragged .tree-item-icon,body:not(.is-grabbing) .tree-item-self.is-being-dragged:hover .tree-item-icon{color:var(--text-on-accent)}.tree-item-self .tree-item-icon{position:absolute;margin-left:calc(-1 * var(--size-4-5));width:var(--size-4-4);display:flex;align-items:center;justify-content:center;opacity:var(--icon-opacity);color:var(--icon-color);flex:0 0 auto}.tree-item-self .tree-item-icon::before{content:"​"}.tree-item-self .tree-item-icon .svg-icon:not(.right-triangle){--icon-size:var(--icon-xs);--icon-stroke:var(--icon-s-stroke-width)}.tree-item-flair-outer{padding-left:var(--size-4-1);margin-left:auto;display:flex;flex-shrink:0;align-items:center}.tree-item-flair{font-size:var(--font-ui-smaller);color:var(--text-faint);line-height:1;border-radius:var(--radius-s)}.tree-item-inner{overflow:hidden}.tree-item-inner-text{overflow:hidden;text-overflow:ellipsis}.tree-item-inner-subtext{color:var(--text-faint);font-size:85%}.tree-item-children{padding-left:var(--nav-item-children-padding-left);margin-left:var(--nav-item-children-margin-left);margin-bottom:1px;border-left:var(--nav-indentation-guide-width) solid var(--nav-indentation-guide-color)}audio{outline:0}.markdown-rendered audio{max-width:100%;outline:0}audio{width:100%;height:42px}audio::-webkit-media-controls-enclosure{border-radius:calc(var(--radius-m) - 1px);border:1px solid var(--background-modifier-border);background-color:var(--background-primary-alt)}audio::-webkit-media-controls-current-time-display,audio::-webkit-media-controls-time-remaining-display{font-family:var(--font-interface)}iframe{border:0}kbd{color:var(--code-normal);font-family:var(--font-monospace);background-color:var(--code-background);border-radius:var(--radius-s);font-size:var(--code-size);padding:.1em .25em}.popupWrapper{--pdf-popup-width:280px;font-size:var(--font-ui-medium);pointer-events:none;position:absolute;transform:translate(-50%,0);z-index:10000}.popupWrapper>div{margin:var(--size-4-3);background-color:var(--background-primary);border-radius:var(--radius-s);filter:drop-shadow(rgba(0, 0, 0, .2) 0px 0px 1px) drop-shadow(rgba(0, 0, 0, .3) 0px 1px 2px) drop-shadow(rgba(0, 0, 0, .3) 0px 4px 6px)}.popupWrapper>div::after{background:var(--background-primary);border-top-left-radius:2px;content:"";height:var(--size-4-3);left:calc(50% - 2px);position:absolute;top:-5px;transform:rotate(45deg);width:var(--size-4-3);z-index:-1}.popup{cursor:initial;display:flex;flex-direction:column;pointer-events:auto;user-select:text;white-space:normal;width:var(--pdf-popup-width);overflow-wrap:break-word}.popupContent{font-size:var(--font-ui-small);line-height:var(--line-height-tight);max-height:200px;overflow:auto;padding:var(--size-4-4)}.popupContent:empty{display:none}.popupMeta{--icon-size:var(--font-ui-small);--icon-stroke:2.5px;align-items:center;background-color:var(--background-secondary);border-top:1px solid var(--background-modifier-border);color:var(--text-muted);display:flex;font-size:var(--font-ui-smaller);gap:var(--size-4-1);justify-content:space-between;padding:var(--size-4-1) var(--size-4-2);border-bottom-left-radius:var(--radius-s);border-bottom-right-radius:var(--radius-s)}.popupContent:empty+.popupMeta{border-top:none;background-color:var(--background-primary);border-top-left-radius:var(--radius-s);border-top-right-radius:var(--radius-s)}.popupMeta .clickable-icon{margin-right:calc(var(--size-4-1) * -1);margin-left:calc(var(--size-2-1) * -1)}.popupDate{white-space:nowrap}.markdown-rendered video{max-width:100%;outline:0}.markdown-rendered blockquote{color:var(--blockquote-color);font-style:var(--blockquote-font-style);background-color:var(--blockquote-background-color);border-left:var(--blockquote-border-thickness) solid var(--blockquote-border-color);padding:0 0 0 var(--size-4-6);margin-inline:0px}.markdown-rendered blockquote>:first-child{margin-top:0}.markdown-rendered blockquote>:last-child{margin-bottom:0}.callout{--callout-color:var(--callout-default);--callout-icon:lucide-pencil}.callout[data-callout=abstract],.callout[data-callout=summary],.callout[data-callout=tldr]{--callout-color:var(--callout-summary);--callout-icon:lucide-clipboard-list}.callout[data-callout=info]{--callout-color:var(--callout-info);--callout-icon:lucide-info}.callout[data-callout=todo]{--callout-color:var(--callout-todo);--callout-icon:lucide-check-circle-2}.callout[data-callout=important]{--callout-color:var(--callout-important);--callout-icon:lucide-flame}.callout[data-callout=hint],.callout[data-callout=tip]{--callout-color:var(--callout-tip);--callout-icon:lucide-flame}.callout[data-callout=check],.callout[data-callout=done],.callout[data-callout=success]{--callout-color:var(--callout-success);--callout-icon:lucide-check}.callout[data-callout=faq],.callout[data-callout=help],.callout[data-callout=question]{--callout-color:var(--callout-question);--callout-icon:help-circle}.callout[data-callout=attention],.callout[data-callout=caution],.callout[data-callout=warning]{--callout-color:var(--callout-warning);--callout-icon:lucide-alert-triangle}.callout[data-callout=fail],.callout[data-callout=failure],.callout[data-callout=missing]{--callout-color:var(--callout-fail);--callout-icon:lucide-x}.callout[data-callout=danger],.callout[data-callout=error]{--callout-color:var(--callout-error);--callout-icon:lucide-zap}.callout[data-callout=bug]{--callout-color:var(--callout-bug);--callout-icon:lucide-bug}.callout[data-callout=example]{--callout-color:var(--callout-example);--callout-icon:lucide-list}.callout[data-callout=cite],.callout[data-callout=quote]{--callout-color:var(--callout-quote);--callout-icon:quote-glyph}.callout{overflow:hidden;border-style:solid;border-color:rgba(var(--callout-color),var(--callout-border-opacity));border-width:var(--callout-border-width);border-radius:var(--callout-radius);margin:1em 0;mix-blend-mode:var(--callout-blend-mode);background-color:rgba(var(--callout-color),.1);padding:var(--callout-padding)}.callout.is-collapsible .callout-title{cursor:var(--cursor)}.callout-title{padding:var(--callout-title-padding);display:flex;gap:var(--size-4-1);font-size:var(--callout-title-size);color:rgb(var(--callout-color));line-height:var(--line-height-tight);align-items:flex-start}.callout-content{overflow-x:auto;padding:var(--callout-content-padding);background-color:var(--callout-content-background)}.callout-icon{flex:0 0 auto;display:flex;align-items:center}.callout-icon .svg-icon{color:rgb(var(--callout-color))}.callout-icon::after{content:"​"}.callout-title-inner{font-weight:var(--bold-weight);color:var(--callout-title-color)}.callout-fold{display:flex;align-items:center;padding-right:var(--size-4-2)}.callout-fold::after{content:"​"}.callout-fold .svg-icon{transition:transform .1s ease-in-out 0s}.callout-fold.is-collapsed .svg-icon{transform:rotate(-90deg)}.markdown-rendered code{color:var(--code-normal);font-family:var(--font-monospace);background-color:var(--code-background);border-radius:var(--code-radius);font-size:var(--code-size);padding:.1em .25em}.markdown-rendered pre{position:relative;padding:var(--size-4-3) var(--size-4-4);min-height:38px;background-color:var(--code-background);border-radius:var(--code-radius);white-space:var(--code-white-space);overflow-x:auto}.markdown-rendered pre code{border:none;padding:0;background-color:transparent}.markdown-rendered pre:not(:hover)>button.copy-code-button{display:none}.markdown-rendered button.copy-code-button{margin:6px;padding:6px 8px;height:auto;background-color:transparent;box-shadow:none;color:var(--text-muted);font-size:var(--font-ui-smaller);font-family:var(--font-interface);position:absolute;top:0;right:0}code[class*=language-],pre[class*=language-]{color:var(--code-normal);background:0 0;overflow-wrap:break-word;white-space:pre-wrap;word-break:normal;font-family:var(--font-monospace);text-align:left;word-spacing:normal;line-height:var(--line-height-normal);hyphens:none}:not(pre)>code[class*=language-],pre[class*=language-]{background:var(--code-background)}pre[class*=language-]{overflow:hidden}code[class*=language-]{display:block;padding:1em;overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:var(--code-comment)}.token.namespace{opacity:.7}.token.constant,.token.deleted,.token.symbol,.token.tag{color:var(--code-tag)}.token.punctuation{color:var(--code-punctuation)}.token.boolean,.token.number{color:var(--code-value)}.token.attr-name,.token.char,.token.inserted,.token.selector,.token.string{color:var(--code-string)}.token.operator{color:var(--code-operator)}.token.atrule,.token.attr-value,.token.builtin,.token.class-name,.token.function,.token.property-access{color:var(--code-function)}.token.keyword{color:var(--code-keyword)}.token.important,.token.regex{color:var(--code-important)}.markdown-preview-view .markdown-embed .markdown-preview-view{--file-folding-offset:0px;height:100%;padding:0}.markdown-preview-view .markdown-embed .markdown-preview-view .markdown-preview-pusher h1,.markdown-preview-view .markdown-embed .markdown-preview-view .markdown-preview-pusher h2,.markdown-preview-view .markdown-embed .markdown-preview-view .markdown-preview-pusher h3,.markdown-preview-view .markdown-embed .markdown-preview-view .markdown-preview-pusher h4,.markdown-preview-view .markdown-embed .markdown-preview-view .markdown-preview-pusher h5,.markdown-preview-view .markdown-embed .markdown-preview-view .markdown-preview-pusher h6{margin-top:0}.file-embed,.markdown-embed{position:relative}.file-embed-link,.markdown-embed-link{position:absolute;top:4px;right:4px;color:var(--icon-color);opacity:var(--icon-opacity);cursor:var(--cursor-link);padding:var(--size-2-2);border-radius:var(--radius-s);display:flex;align-items:center;--icon-size:var(--icon-s);--icon-stroke:var(--icon-s-stroke-width)}.file-embed-title{display:flex;align-items:center;justify-content:center;gap:var(--size-4-2)}.file-embed-icon{color:var(--text-muted);display:flex}.file-embed{display:flex;justify-content:center;border-radius:var(--radius-m);background-color:var(--background-primary-alt)}.file-embed.mod-empty,.file-embed.mod-generic{cursor:var(--cursor-link);padding:var(--size-4-2);color:var(--text-muted);text-align:center;font-size:var(--font-smaller)}.markdown-embed-content{height:100%}.embed-title{align-items:center;display:flex;gap:var(--size-4-1);font-size:var(--font-text-size);font-weight:var(--bold-weight);text-align:left;text-overflow:ellipsis;white-space:nowrap;padding:0 0 var(--size-4-2) 0}.markdown-embed{font-style:var(--embed-font-style);background-color:var(--embed-background);border-top:var(--embed-border-top);border-right:var(--embed-border-right);border-bottom:var(--embed-border-bottom);border-left:var(--embed-border-left);margin:0;padding:var(--embed-padding)}.markdown-embed .markdown-preview-view{padding:0}.internal-embed:not(.image-embed){display:block}.internal-embed audio,.internal-embed img:not([width]),.internal-embed video{max-width:100%}.inline-embed .markdown-embed-content{height:fit-content;max-height:var(--embed-max-height);overflow:auto}.inline-embed .markdown-embed-content p:first-child{margin-top:0}.embed-iframe{width:100%;height:100%}iframe.external-embed{width:600px;max-width:100%;height:350px}.footnote-link{text-decoration:none}.footnotes{font-size:var(--footnote-size)}.footnote-ref{vertical-align:super}.footnote-backref{color:var(--text-faint);text-decoration:none}.markdown-rendered .frontmatter.mod-failed{position:relative}.markdown-rendered .frontmatter.mod-failed .mod-error{color:var(--text-error);font-size:var(--font-smaller)}.markdown-rendered .frontmatter.mod-failed::after{content:"";position:absolute;top:0;right:0;width:100%;height:100%;background-color:var(--background-modifier-error);opacity:.3;mix-blend-mode:var(--highlight-mix-blend-mode)}.metadata-container{--input-height:var(--metadata-input-height);border-radius:var(--metadata-border-radius);background-color:var(--metadata-background);border-color:var(--metadata-border-color);border-style:solid;border-width:var(--metadata-border-width);padding:var(--metadata-padding);color:var(--text-muted);position:relative;max-width:var(--metadata-max-width);margin-block-end:var(--p-spacing);transform:translateX(calc(var(--size-4-1) * -1))}.metadata-container .metadata-add-button{padding-left:var(--size-2-3);margin-top:.5em;font-size:var(--metadata-label-font-size)}.markdown-embed-content .metadata-container{display:none}.metadata-container.is-collapsed .metadata-property{display:none}.metadata-container:focus-within .metadata-property.is-selected{color:var(--nav-item-color-selected);background-color:var(--nav-item-background-selected)}.metadata-properties{display:flex;flex-direction:column;gap:var(--metadata-gap)}.metadata-properties-heading{display:inline-block;padding:var(--size-4-1);margin-bottom:var(--size-4-2);position:relative;line-height:1.2}.metadata-properties-heading::before{content:"";border-radius:var(--metadata-property-radius);position:absolute;display:inline-block;inset:0px}.metadata-properties-heading:focus::before{box-shadow:0 0 0 2px var(--background-modifier-border-focus)}.metadata-properties-heading .collapse-indicator{position:absolute;left:-22px;padding:0 6px}.metadata-properties-title{user-select:none;font-size:max(var(--font-ui-small), 1em);color:var(--text-normal);font-weight:var(--font-medium)}.metadata-input-text{background-color:transparent;width:100%;min-height:var(--input-height);border-width:0;resize:none;overflow-y:hidden}.metadata-input-text::-webkit-date-and-time-value{text-align:left}.metadata-input-text.mod-date{padding-right:0;width:auto}.metadata-property{position:relative;display:flex;align-items:start;padding:var(--metadata-property-padding);border-radius:var(--metadata-property-radius);overflow:hidden;background-color:var(--metadata-property-background)}.metadata-property:focus-within{background-color:var(--metadata-property-background-hover);--metadata-divider-color:var(--metadata-divider-color-focus);box-shadow:0 0 0 2px var(--background-modifier-border-focus)}.metadata-property-icon{cursor:var(--cursor);color:var(--icon-color);display:flex;align-items:center;padding:var(--size-4-1) 0;height:var(--input-height);user-select:none}.metadata-property-icon::before{content:"​";width:var(--size-4-1)}.metadata-input-number{background-color:transparent;width:100%;border-width:0}input[type=checkbox].metadata-input-checkbox{margin-left:var(--size-4-2)}.metadata-property-key{display:flex;align-self:stretch;align-items:flex-start;flex-direction:row;flex-shrink:0;border-bottom:var(--metadata-divider-width) solid var(--metadata-divider-color);background-color:var(--metadata-label-background);width:var(--metadata-label-width);min-width:var(--metadata-label-width)}.metadata-property-key:focus-within{background-color:var(--metadata-label-background-active)}input.metadata-property-key-input{border:none;flex-grow:1;color:var(--metadata-label-text-color);font-size:var(--metadata-label-font-size);font-weight:var(--metadata-label-font-weight);height:var(--input-height);background-color:transparent;display:flex;align-items:center;text-overflow:ellipsis;overflow:hidden}input.metadata-property-key-input:active,input.metadata-property-key-input:focus{background-color:transparent}.metadata-property button{margin-top:var(--size-4-2)}.metadata-property .multi-select-container,.metadata-property input[type=date],.metadata-property input[type=datetime-local],.metadata-property input[type=number],.metadata-property input[type=text]{border-radius:0;border:none}.metadata-property .multi-select-container:active,.metadata-property .multi-select-container:focus,.metadata-property .multi-select-container:hover,.metadata-property input[type=date]:active,.metadata-property input[type=date]:focus,.metadata-property input[type=date]:hover,.metadata-property input[type=datetime-local]:active,.metadata-property input[type=datetime-local]:focus,.metadata-property input[type=datetime-local]:hover,.metadata-property input[type=number]:active,.metadata-property input[type=number]:focus,.metadata-property input[type=number]:hover,.metadata-property input[type=text]:active,.metadata-property input[type=text]:focus,.metadata-property input[type=text]:hover{box-shadow:none;border:none}.metadata-property .metadata-input-number,.metadata-property .metadata-input-text,.metadata-property .multi-select-container{background-color:transparent}.metadata-property .metadata-input-number:hover,.metadata-property .metadata-input-text:hover,.metadata-property .multi-select-container:hover{background-color:transparent}.metadata-property .metadata-input-number:active,.metadata-property .metadata-input-number:focus,.metadata-property .metadata-input-number:focus-within,.metadata-property .metadata-input-text:active,.metadata-property .metadata-input-text:focus,.metadata-property .metadata-input-text:focus-within,.metadata-property .multi-select-container:active,.metadata-property .multi-select-container:focus,.metadata-property .multi-select-container:focus-within{background-color:transparent}.metadata-property .metadata-input-text{text-overflow:ellipsis;overflow:hidden}.metadata-property .multi-select-container input{background-color:transparent}.metadata-property .multi-select-container{padding:var(--size-4-1) var(--size-4-2)}.metadata-property[data-property-key=tags]{--pill-color:var(--tag-color);--pill-color-hover:var(--tag-color-hover);--pill-color-remove:var(--tag-color);--pill-color-remove-hover:var(--tag-color-hover);--pill-decoration:var(--tag-decoration);--pill-decoration-hover:var(--tag-decoration-hover);--pill-background:var(--tag-background);--pill-background-hover:var(--tag-background-hover);--pill-border-color:var(--tag-border-color);--pill-border-color-hover:var(--tag-border-color-hover);--pill-border-width:var(--tag-border-width);--pill-padding-x:var(--tag-padding-x);--pill-padding-y:var(--tag-padding-y);--pill-radius:var(--tag-radius);--pill-weight:var(--tag-weight);--pill-focus-width:100%;--pill-focus-left-adjust:0}.metadata-property[data-property-key=tags] .multi-select-pill{cursor:var(--cursor-link)}.metadata-property:not([data-property-key=tags]){--pill-border-width:0;--pill-padding-x:0;--pill-padding-y:0;--pill-color:var(--metadata-input-text-color)}.metadata-property:not([data-property-key=tags]) .multi-select-pill{line-height:var(--line-height-tight)}.metadata-property-warning-icon{--icon-size:var(--icon-s);position:absolute;right:var(--size-2-1);top:var(--size-2-1);bottom:var(--size-2-1);align-items:center;display:flex;color:var(--text-warning)}.metadata-property-value{display:flex;flex:1 1 auto;gap:var(--size-2-2);align-items:center;align-self:stretch;min-height:var(--input-height);background-color:var(--metadata-input-background);border-bottom:var(--metadata-divider-width) solid var(--metadata-divider-color);overflow:hidden}.metadata-property-value.mod-external-link:not(:placeholder-shown){text-decoration-line:var(--link-decoration);text-decoration-thickness:var(--link-decoration-thickness);text-decoration-color:var(--text-faint)}.metadata-property-value .mod-unknown{color:var(--text-warning);padding:var(--size-4-1) var(--size-4-2);font-size:var(--metadata-input-font-size);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.metadata-property-value .multi-select-input{font-size:inherit}.metadata-property-value .metadata-link-inner,.metadata-property-value .multi-select-container,.metadata-property-value input{font-size:var(--metadata-input-font-size)}.metadata-property-value .multi-select-container{--background-modifier-form-field:transparent;--background-modifier-border:transparent}.metadata-property-value .multi-select-container .multi-select-pill.is-invalid{--pill-background:transparent;--pill-color:var(--text-error);--pill-color-remove:var(--text-error)}.metadata-property-value .external-link.multi-select-pill-content,.metadata-property-value .internal-link .multi-select-pill-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metadata-property-value .clickable-icon{--icon-size:var(--icon-xs);--icon-stroke:var(--icon-xs-stroke-width);margin-right:2px;margin-left:-4px;padding:4px}.metadata-property-value .clickable-icon:hover{background:0 0;color:var(--text-normal);cursor:var(--cursor-link)}.metadata-property-value:focus-within{background-color:var(--metadata-input-background-active)}.metadata-input-longtext{cursor:text;white-space:pre-wrap;-webkit-box-orient:vertical;-webkit-line-clamp:3;color:var(--metadata-input-text-color);font-size:var(--metadata-input-font-size);max-height:300px;overflow-y:auto;padding:var(--size-4-1) var(--size-4-2);width:100%}.metadata-input-longtext:focus{-webkit-line-clamp:unset}.metadata-input-longtext:not(:empty){display:-webkit-box}.metadata-input-longtext:empty::before{content:attr(placeholder);color:var(--text-faint)}.metadata-link{cursor:text;align-items:center;padding:var(--size-4-1) var(--size-4-2);display:flex;gap:var(--size-4-2);width:100%}.metadata-link-inner{cursor:var(--cursor-link);color:var(--link-color);text-decoration-line:var(--link-decoration);text-decoration-thickness:var(--link-decoration-thickness);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.metadata-link-flair{--icon-size:var(--icon-xs);background-color:transparent;cursor:text;margin-left:auto;display:flex;align-items:center;justify-content:center;padding:var(--size-2-1);border-radius:var(--clickable-icon-radius);color:var(--icon-color);opacity:0;transition:opacity .15s ease-in-out 0s;height:auto}.markdown-preview-view.show-properties .metadata-container{display:var(--metadata-display-reading)}.markdown-rendered li h1,.markdown-rendered li h2,.markdown-rendered li h3,.markdown-rendered li h4,.markdown-rendered li h5{margin-top:0;margin-bottom:0}.markdown-rendered h1,h1{font-variant:var(--h1-variant);letter-spacing:-.015em;line-height:var(--h1-line-height);font-size:var(--h1-size);color:var(--h1-color);font-weight:var(--h1-weight);font-style:var(--h1-style);font-family:var(--h1-font);margin-block-start:var(--p-spacing);margin-block-end:var(--p-spacing)}.markdown-rendered h1 a,h1 a{font-weight:inherit}.markdown-rendered h2,h2{font-variant:var(--h2-variant);letter-spacing:-.015em;line-height:var(--h2-line-height);font-size:var(--h2-size);color:var(--h2-color);font-weight:var(--h2-weight);font-style:var(--h2-style);font-family:var(--h2-font);margin-block-start:var(--p-spacing);margin-block-end:var(--p-spacing)}.markdown-rendered h2 a,h2 a{font-weight:inherit}.markdown-rendered h3,h3{font-variant:var(--h3-variant);letter-spacing:-.015em;line-height:var(--h3-line-height);font-size:var(--h3-size);color:var(--h3-color);font-weight:var(--h3-weight);font-style:var(--h3-style);font-family:var(--h3-font);margin-block-start:var(--p-spacing);margin-block-end:var(--p-spacing)}.markdown-rendered h3 a,h3 a{font-weight:inherit}.markdown-rendered h4,h4{font-variant:var(--h4-variant);letter-spacing:.015em;line-height:var(--h4-line-height);font-size:var(--h4-size);color:var(--h4-color);font-weight:var(--h4-weight);font-style:var(--h4-style);font-family:var(--h4-font);margin-block-start:var(--p-spacing);margin-block-end:var(--p-spacing)}.markdown-rendered h4 a,h4 a{font-weight:inherit}.markdown-rendered h5,h5{font-variant:var(--h5-variant);letter-spacing:.015em;font-size:var(--h5-size);line-height:var(--h5-line-height);color:var(--h5-color);font-weight:var(--h5-weight);font-style:var(--h5-style);font-family:var(--h5-font);margin-block-start:var(--p-spacing);margin-block-end:var(--p-spacing)}.markdown-rendered h5 a,h5 a{font-weight:inherit}.markdown-rendered h6,h6{font-variant:var(--h6-variant);letter-spacing:.015em;font-size:var(--h6-size);line-height:var(--h6-line-height);color:var(--h6-color);font-weight:var(--h6-weight);font-style:var(--h6-style);font-family:var(--h6-font);margin-block-start:var(--p-spacing);margin-block-end:var(--p-spacing)}.markdown-rendered h6 a,h6 a{font-weight:inherit}hr{border-right-width:initial;border-bottom-width:initial;border-left-width:initial;border-right-style:none;border-bottom-style:none;border-left-style:none;border-image:initial;border-color:var(--hr-color);margin:2rem 0}.markdown-rendered hr{border-right-width:initial;border-bottom-width:initial;border-left-width:initial;border-right-style:none;border-bottom-style:none;border-left-style:none;border-image:initial;border-color:var(--hr-color)}.markdown-preview-view img,.markdown-rendered img{image-rendering:-webkit-optimize-contrast}.markdown-preview-view img:not([width]),.markdown-rendered img:not([width]){max-width:100%;outline:0}.internal-query{margin:0;border-top:1px solid var(--background-modifier-border)}.internal-query .search-result-container{padding:var(--size-4-2);max-height:800px;overflow:auto;border:1px solid var(--background-modifier-border);background-color:var(--background-secondary);border-radius:var(--radius-m)}ol ol ul,ol ul,ol ul ul,ul ol ul,ul ul,ul ul ul{list-style-type:disc}ol{list-style-type:var(--list-numbered-style)}ol>li::marker,ul>li::marker{color:var(--list-marker-color)}ol>li.is-collapsed::marker,ul>li.is-collapsed::marker{color:var(--list-marker-color-collapsed)}.markdown-rendered ol,.markdown-rendered ul{padding-inline-start:var(--list-indent);margin-block-start:var(--p-spacing);margin-block-end:var(--p-spacing)}.markdown-rendered ol ol,.markdown-rendered ol ul,.markdown-rendered ul ol,.markdown-rendered ul ul{margin-block:0px}.markdown-rendered ol li p:first-of-type,.markdown-rendered ul li p:first-of-type{margin-block-start:0px}.markdown-rendered ol li p:last-of-type,.markdown-rendered ul li p:last-of-type{margin-block-end:0px}.markdown-rendered ol>li,.markdown-rendered ul>li{padding-top:var(--list-spacing);padding-bottom:var(--list-spacing)}.markdown-rendered .list-collapse-indicator{margin-inline-start:-3em;padding-inline-end:2em}.markdown-rendered .list-bullet{float:left;margin-inline-start:-1em}.markdown-rendered .task-list-item>.list-bullet{display:none}.markdown-rendered ul.has-list-bullet{list-style-type:"​"}.markdown-rendered ul.has-list-bullet>li::marker{color:transparent}.list-bullet{color:transparent;position:relative;display:inline-flex;justify-content:center;align-items:center;will-change:transform}.list-bullet::before{content:"​"}.list-bullet::after{position:absolute;content:"​";pointer-events:none;color:var(--list-marker-color);border-radius:var(--list-bullet-radius);width:var(--list-bullet-size);height:var(--list-bullet-size);border:var(--list-bullet-border);transform:var(--list-bullet-transform);background-color:var(--list-marker-color);transition:transform .15s ease 0s,box-shadow .15s ease 0s;will-change:transform}.list-bullet::selection{background-color:transparent!important}a{color:var(--link-color);outline:0;text-decoration-line:var(--link-decoration);text-decoration-thickness:var(--link-decoration-thickness);cursor:var(--cursor-link)}.external-link{color:var(--link-external-color);text-decoration-line:var(--link-external-decoration);background-position:right 4px;background-repeat:no-repeat;background-image:linear-gradient(transparent,transparent),url("https://publish.obsidian.md/public/images/874d8b8e340f75575caa.svg");background-size:13px;padding-right:16px;cursor:var(--cursor-link);filter:var(--link-external-filter)}.markdown-rendered .internal-link,.metadata-container .internal-link{cursor:var(--cursor-link);text-decoration-line:var(--link-decoration);color:var(--link-color)}.markdown-rendered .internal-link.is-unresolved,.metadata-container .internal-link.is-unresolved{color:var(--link-unresolved-color);opacity:var(--link-unresolved-opacity);filter:var(--link-unresolved-filter);text-decoration-style:var(--link-unresolved-decoration-style);text-decoration-color:var(--link-unresolved-decoration-color)}.inline-block{display:inline-block;vertical-align:middle}.hidden-token{display:inline;letter-spacing:-1ch;font-family:monospace;color:transparent;font-size:1px!important}mjx-container{outline:0}.markdown-rendered td,.markdown-rendered th{padding:var(--size-2-2) var(--size-4-2);border:var(--table-border-width) solid var(--table-border-color);max-width:var(--table-column-max-width)}.markdown-rendered td{font-size:var(--table-text-size);color:var(--table-text-color)}.markdown-rendered th{font-size:var(--table-header-size);font-weight:var(--table-header-weight);color:var(--table-header-color);font-family:var(--table-header-font);text-align:left;line-height:var(--line-height-tight)}.markdown-rendered th[align=center]{text-align:center}.markdown-rendered th[align=right]{text-align:right}.markdown-rendered tbody>tr>td,.markdown-rendered thead>tr>th{white-space:var(--table-white-space);text-overflow:ellipsis;overflow:hidden}.markdown-rendered tbody tr{background-color:var(--table-background)}.markdown-rendered tbody tr:nth-child(odd){background-color:var(--table-row-alt-background)}.markdown-rendered tbody tr>td:nth-child(2n+2){background-color:var(--table-column-alt-background)}.markdown-rendered tbody tr:last-child>td{border-bottom-width:var(--table-row-last-border-width)}.markdown-rendered tbody tr>td:first-child{border-left-width:var(--table-column-first-border-width)}.markdown-rendered tbody tr>td:last-child{border-right-width:var(--table-column-last-border-width)}.markdown-rendered thead tr{background-color:var(--table-header-background)}.markdown-rendered thead tr>th{border-top-width:var(--table-header-border-width);border-color:var(--table-header-border-color)}.markdown-rendered thead tr>th:nth-child(2n+2){background-color:var(--table-column-alt-background)}.markdown-rendered thead tr>th:first-child{border-left-width:var(--table-column-first-border-width)}.markdown-rendered thead tr>th:last-child{border-right-width:var(--table-column-last-border-width)}a.tag{background-color:var(--tag-background);border:var(--tag-border-width) solid var(--tag-border-color);border-radius:var(--tag-radius);color:var(--tag-color);font-size:var(--tag-size);font-weight:var(--tag-weight);text-decoration:var(--tag-decoration);padding:var(--tag-padding-y) var(--tag-padding-x);line-height:1}a.tag{background-color:var(--tag-background);border:var(--tag-border-width) solid var(--tag-border-color);border-radius:var(--tag-radius);color:var(--tag-color);font-size:var(--tag-size);font-weight:var(--tag-weight);text-decoration:var(--tag-decoration);padding:var(--tag-padding-y) var(--tag-padding-x);line-height:1}input[type=checkbox]{appearance:none;border-radius:var(--checkbox-radius);border:1px solid var(--checkbox-border-color);flex-shrink:0;padding:0;margin:0;margin-inline-end:6px;width:var(--checkbox-size);height:var(--checkbox-size);position:relative;transition:box-shadow .15s ease-in-out 0s}input[type=checkbox]:active,input[type=checkbox]:focus,input[type=checkbox]:hover{outline:0;border-color:var(--checkbox-border-color-hover)}input[type=checkbox]:focus-visible{box-shadow:0 0 0 2px var(--background-modifier-border-focus)}input[type=checkbox]:checked::after{content:"";top:-1px;left:-1px;position:absolute;width:var(--checkbox-size);height:var(--checkbox-size);display:block;background-color:var(--checkbox-marker-color);-webkit-mask-position:52% 52%;-webkit-mask-size:65%;-webkit-mask-repeat:no-repeat;-webkit-mask-image:url("data:image/svg+xml; utf8, ")}input[type=checkbox]:checked{background-color:var(--checkbox-color);border-color:var(--checkbox-color)}input[type=checkbox][data-indeterminate=true]:not(:checked)::after{content:"";position:absolute;top:calc(var(--checkbox-size)/ 2 - 2px);width:calc(var(--checkbox-size) - 6px);left:0;right:0;margin:0 auto;height:2px;display:block;border-radius:2px;background-color:var(--text-normal)}.task-list-item-checkbox{width:var(--checkbox-size);height:var(--checkbox-size)}.markdown-preview-view .task-list-item-checkbox{position:relative;top:.2em;margin-inline-end:.6em}ul>li.task-list-item{list-style:none}ul>li.task-list-item .task-list-item-checkbox{margin-inline-start:calc(var(--checkbox-size) * -1.5)}ul>li.task-list-item[data-task="X"],ul>li.task-list-item[data-task="x"]{text-decoration:var(--checklist-done-decoration);color:var(--checklist-done-color)}b,strong{font-weight:var(--bold-weight);color:var(--bold-color)}em,i{font-style:italic;color:var(--italic-color)}.markdown-rendered p{margin-block-start:var(--p-spacing);margin-block-end:var(--p-spacing)}.markdown-rendered mark{background-color:var(--text-highlight-bg);color:var(--text-normal)}.markdown-rendered mark .internal-link{color:var(--text-normal)}.view-action.mod-bookmark{--icon-color:var(--icon-color-active);--icon-color-hover:var(--icon-color-active)}.nav-buttons-container.has-separator{border-bottom:1px solid var(--background-modifier-border);padding-bottom:var(--size-2-3);margin-bottom:var(--size-4-2)}.nav-files-container{flex-grow:1;overflow:hidden auto;padding:0 var(--size-4-3) var(--size-4-6) var(--size-4-3);scroll-padding-block:var(--size-4-2)}.nav-folder.mod-root>.nav-folder-title{font-size:var(--vault-name-font-size);color:var(--vault-name-color);font-weight:var(--vault-name-font-weight);cursor:default}.nav-folder.mod-root>.nav-folder-title.is-being-dragged-over{background-color:hsla(var(--interactive-accent-hsl),.2)}.nav-folder.mod-root>.nav-folder-children{border-left:none;margin-left:0;padding-left:0}.nav-file-tag{background-color:var(--background-modifier-hover);border-radius:var(--radius-s);font-size:9px;font-weight:var(--font-semibold);letter-spacing:.05em;line-height:var(--line-height-normal);margin-left:var(--size-2-3);padding:0 var(--size-4-1);text-transform:uppercase;align-self:center}.nav-file-icon{display:inline-flex;align-items:center;margin-right:var(--size-2-3);position:relative;color:var(--icon-color);opacity:var(--icon-opacity)}.nav-files-container:not(.show-unsupported) .is-unsupported{display:none}.nav-file-title-content,.nav-folder-title-content{display:inline-block;overflow-wrap:anywhere;overflow:hidden;white-space:var(--nav-item-white-space);text-overflow:ellipsis}.nav-files-container{flex-grow:1;overflow:hidden auto;padding:0 var(--size-4-3) var(--size-4-6) var(--size-4-3);scroll-padding-block:var(--size-4-2)}.nav-folder.mod-root>.nav-folder-title{font-size:var(--vault-name-font-size);color:var(--vault-name-color);font-weight:var(--vault-name-font-weight);cursor:default}.nav-folder.mod-root>.nav-folder-title.is-being-dragged-over{background-color:hsla(var(--interactive-accent-hsl),.2)}.nav-folder.mod-root .nav-folder>.nav-folder-children{padding-left:var(--nav-item-children-padding-left);margin:0 0 0 var(--nav-item-children-margin-left);border-left:var(--nav-indentation-guide-width) solid var(--nav-indentation-guide-color)}.nav-file{border-radius:var(--radius-s)}.nav-folder-title{padding:var(--nav-item-parent-padding)}.nav-file-title{padding:var(--nav-item-padding)}.nav-file-title,.nav-folder-title{margin-bottom:var(--size-2-1);display:flex;border-radius:var(--radius-s);cursor:var(--cursor);color:var(--nav-item-color);font-size:var(--nav-item-size);font-weight:var(--nav-item-weight);line-height:var(--line-height-tight)}.nav-file-title.is-active,.nav-folder-title.is-active,body:not(.is-grabbing) .nav-file-title.is-active:hover,body:not(.is-grabbing) .nav-folder-title.is-active:hover{color:var(--nav-item-color-active);background-color:var(--nav-item-background-active);font-weight:var(--nav-item-weight-active)}.nav-file-title.is-selected,.nav-folder-title.is-selected,body:not(.is-grabbing) .nav-file-title.is-selected:hover,body:not(.is-grabbing) .nav-folder-title.is-selected:hover{color:var(--nav-item-color-selected);background-color:var(--nav-item-background-selected)}.nav-file-title.is-being-dragged,.nav-folder-title.is-being-dragged,body:not(.is-grabbing) .nav-file-title.is-being-dragged,body:not(.is-grabbing) .nav-folder-title.is-being-dragged{background-color:var(--interactive-accent);color:var(--text-on-accent)}.nav-file-title.is-being-dragged .nav-folder-collapse-indicator,.nav-folder-title.is-being-dragged .nav-folder-collapse-indicator,body:not(.is-grabbing) .nav-file-title.is-being-dragged .nav-folder-collapse-indicator,body:not(.is-grabbing) .nav-folder-title.is-being-dragged .nav-folder-collapse-indicator{color:var(--text-on-accent)}.nav-file-title.is-being-dragged .nav-file-tag,.nav-folder-title.is-being-dragged .nav-file-tag,body:not(.is-grabbing) .nav-file-title.is-being-dragged .nav-file-tag,body:not(.is-grabbing) .nav-folder-title.is-being-dragged .nav-file-tag{color:var(--text-normal)}.nav-folder-title.is-being-dragged-over{border-radius:var(--radius-s);color:var(--nav-item-color-highlighted);background:hsla(var(--interactive-accent-hsl),.1)}.nav-folder-title.is-being-dragged-over .collapse-icon{color:var(--nav-item-color-highlighted)}.file-tree-item-checkbox,.file-tree-item-icon{flex-shrink:0}.file-tree-item-title{flex-grow:1;word-break:break-word}.file-tree-item-icon{--icon-size:var(--icon-s);--icon-stroke:var(--icon-s-stroke-width);margin-right:var(--size-4-1);color:var(--icon-color);position:relative;top:var(--size-2-1)}.file-tree .tree-item-inner{display:flex;align-items:center;position:relative;width:100%}.file-tree .tree-item-flair{line-height:1;padding:var(--size-2-1) var(--size-2-3);color:var(--text-on-accent)}.file-tree .is-selected{color:var(--text-normal)}.file-tree .mod-changed.is-selected{background-color:hsla(var(--interactive-accent-hsl),.2)}.file-tree .mod-changed .tree-item-flair{color:var(--text-accent-hover)}.file-tree .mod-new.is-selected{background-color:rgba(var(--background-modifier-success-rgb),.2)}.file-tree .mod-new .tree-item-flair{color:var(--text-success)}.file-tree .mod-deleted.is-selected,.file-tree .mod-to-delete.is-selected{background-color:rgba(var(--background-modifier-error-rgb),.2)}.file-tree .mod-deleted .tree-item-flair,.file-tree .mod-to-delete .tree-item-flair{color:var(--text-error)}.file-tree .mod-to-delete .tree-item-flair{display:none}.file-tree .mod-to-delete.is-selected .tree-item-flair{display:block}.file-tree .clickable-icon{display:flex;--icon-size:var(--icon-s);--icon-stroke:var(--icon-s-stroke-width)}.graph-view.color-fill{color:var(--graph-node)}.graph-view.color-fill-focused{color:var(--graph-node-focused)}.graph-view.color-fill-tag{color:var(--graph-node-tag)}.graph-view.color-fill-attachment{color:var(--graph-node-attachment)}.graph-view.color-fill-unresolved{color:var(--graph-node-unresolved);opacity:.5}.graph-view.color-fill-1{color:var(--text-muted)}.graph-view.color-fill-2{color:var(--text-muted)}.graph-view.color-fill-3{color:var(--text-muted)}.graph-view.color-fill-4{color:var(--text-muted)}.graph-view.color-fill-5{color:var(--text-muted)}.graph-view.color-fill-6{color:var(--text-muted)}.graph-view.color-arrow{color:var(--text-normal);opacity:.5}.graph-view.color-circle{color:var(--graph-node-focused)}.graph-view.color-line{color:var(--graph-line)}.graph-view.color-text{color:var(--graph-text)}.graph-view.color-fill-highlight{color:var(--interactive-accent)}.graph-view.color-line-highlight{color:var(--interactive-accent)}.graph-controls{border-radius:var(--radius-m);position:absolute;right:var(--size-4-3);top:var(--size-4-3);padding:0;background-color:var(--background-primary);width:var(--graph-controls-width);overflow:auto}.graph-controls:not(.is-close){max-height:calc(100% - var(--size-4-4));border:1px solid var(--background-modifier-border);box-shadow:var(--shadow-s)}.graph-controls.is-close{min-width:inherit;width:auto;background-color:var(--background-primary);border:1px solid transparent;padding:var(--size-2-3)}.graph-controls.is-close>.graph-control-section{display:none}.graph-controls input[type=range],.graph-controls input[type=text]{width:100%;font-size:var(--font-ui-small)}.graph-controls .mod-cta{margin-top:var(--size-2-3);width:100%}.graph-controls::-webkit-scrollbar,.graph-controls::-webkit-scrollbar-thumb{display:none}.graph-color-group{--swatch-height:18px;--swatch-width:18px;position:relative;display:flex;align-items:center;padding:0 0 6px;transition:top .2s ease-in-out 0s}.graph-color-group input[type=color]{margin:0 2px 0 6px}.graph-color-group .clickable-icon{padding:var(--size-2-2)}.graph-color-button-container{text-align:center;margin-bottom:10px}.graph-color-button-container button{margin:0;width:100%}.graph-control-section.mod-color-groups .tree-item-children.is-grabbing .graph-color-groups-container{padding-bottom:40px}.graph-controls-button{display:none;z-index:1}.graph-controls-button.mod-close,.graph-controls-button.mod-reset{position:absolute;top:var(--size-4-2);right:var(--size-4-2);padding:var(--size-2-2)}.graph-controls:not(.is-close) .graph-controls-button.mod-close,.graph-controls:not(.is-close) .graph-controls-button.mod-reset{display:flex}.graph-controls-button.mod-reset{right:36px}.graph-controls.is-close .graph-controls-button.mod-open{display:flex}.graph-controls-button.mod-animate{margin-top:var(--size-4-2)}.graph-controls.is-close .graph-controls-button.mod-animate{display:flex}.graph-control-section{padding:var(--size-2-3) var(--size-4-3);border-bottom:1px solid var(--background-modifier-border)}.graph-control-section:last-child{border-bottom:none}.graph-control-section:last-child .tree-item-children{padding-bottom:var(--size-4-4)}.graph-control-section>.tree-item-self{padding-left:var(--size-4-4)}.graph-control-section .tree-item-children{margin:0;padding:var(--size-4-1) 0;border-left:none}.metadata-container{container:metadata/inline-size}@container (width < 250px){.metadata-property{flex-wrap:wrap}.metadata-property .metadata-property-key{width:100%;border-bottom:0}.metadata-property .metadata-property-value{margin-top:-2px;padding-left:calc(var(--icon-size) + var(--size-4-1))}}.site-list-container{border-top:1px solid var(--background-modifier-border);margin-bottom:var(--size-4-4)}.site-list-container .list-item:last-child{padding-top:var(--size-4-4)}.site-list-item-name{flex-grow:1}.slug-input{text-transform:lowercase}.passwords-container{margin-bottom:var(--size-4-4)}.password-item{border-radius:var(--radius-s);padding:var(--size-4-2) var(--size-4-4);margin:var(--size-4-1) 0}.tree-item.mod-custom-nav.hidden .tree-item-self{color:var(--text-faint)}.tree-item.mod-custom-nav .tree-item-inner{display:flex;align-items:center;position:relative}.tree-list{padding:var(--size-4-4) 0}.tree-list-title{font-size:var(--font-ui-medium);font-weight:var(--font-semibold)}.tree-list-action{align-items:center;display:flex;color:var(--text-muted);font-size:var(--font-ui-small)}.search-input-container{position:relative}.search-input-container::before{top:calc((var(--input-height) - var(--search-icon-size))/ 2);left:8px;position:absolute;content:"";height:var(--search-icon-size);width:var(--search-icon-size);display:block;background-color:var(--search-icon-color);-webkit-mask-image:url("data:image/svg+xml,");-webkit-mask-repeat:no-repeat}.search-input-container input{display:block;width:100%;padding-right:28px;padding-left:36px}.global-search-input-container.search-input-container input{padding-right:56px}.search-input-clear-button{position:absolute;background:0 0;border-radius:50%;color:var(--search-clear-button-color);cursor:var(--cursor);top:0;right:2px;bottom:0;line-height:0;height:var(--input-height);width:28px;margin:auto;padding:0;text-align:center;display:flex;justify-content:center;align-items:center;transition:color .15s ease-in-out 0s}.search-input-clear-button::after{content:"";height:var(--search-clear-button-size);width:var(--search-clear-button-size);display:block;background-color:currentcolor;-webkit-mask-image:url("data:image/svg+xml,");-webkit-mask-repeat:no-repeat}.search-input-clear-button:active,.search-input-clear-button:hover{color:var(--text-normal);transition:color .15s ease-in-out 0s}.search-input-suggest-button{position:absolute;left:0;top:0;color:var(--text-faint);cursor:var(--cursor);padding:var(--size-4-1) var(--size-4-2);opacity:0;z-index:10}.search-result-container{padding:var(--size-4-3) var(--size-4-3) var(--size-4-4);position:relative;flex:1 0 0px}.search-result-container.mod-global-search{overflow-y:auto}.search-result-container::before{content:" ";position:absolute;top:0;width:0;height:3px}.search-suggest-info-text{color:var(--text-muted);margin-left:4px}.search-suggest-icon{padding:4px;border-radius:var(--radius-s)}.search-suggest-icon{align-items:center;display:flex}.search-suggest-item{padding:var(--size-4-1) var(--size-4-2);border-radius:var(--radius-s)}.search-suggest-item.mod-group{align-items:center;margin:0;color:var(--text-muted);padding:0 0 0 var(--size-4-2);cursor:default;font-weight:var(--font-semibold);font-size:var(--font-ui-smaller);border-radius:0}.search-suggest-item.mod-group:not(:first-child){border-top:1px solid var(--background-modifier-border);margin-top:6px;padding:6px 6px 0 14px;margin-left:-6px;margin-right:-6px}.search-suggest-item.mod-group.is-selected,.search-suggest-item.mod-group:hover{background-color:initial}.search-empty-state{color:var(--text-faint);font-size:var(--font-ui-small);margin:0 0 var(--size-4-3);padding-left:var(--size-4-2)}.search-result{word-break:break-word}.search-result:not(.is-collapsed) .search-result-file-title{color:var(--nav-item-color-active)}.search-result-file-matches{font-size:var(--font-ui-smaller);line-height:var(--line-height-tight);background-color:var(--search-result-background);border-radius:var(--radius-s);overflow:hidden;margin:var(--size-4-1) 0 var(--size-4-2);color:var(--text-muted);box-shadow:0 0 0 1px var(--background-modifier-border)}.search-result-file-matches:empty{display:none}.search-info-more-matches{color:var(--text-faint)}.search-result-file-match{cursor:var(--cursor);position:relative;padding:var(--size-4-2) var(--size-4-5) var(--size-4-2) var(--size-4-3);white-space:pre-wrap;width:100%;border-bottom:1px solid var(--background-modifier-border)}.search-result-file-match:last-child{border-bottom:none}.search-result-file-match:hover .search-result-file-match-replace-button{display:block}.search-result-file-match-replace-button{display:none;position:absolute;height:auto;bottom:5px;right:24px;padding:var(--size-4-1) var(--size-4-2);color:var(--text-muted);font-size:var(--font-ui-smaller)}.search-result-hover-button{position:absolute;display:flex;right:2px;border-radius:var(--radius-s);color:var(--text-faint);padding:1px 3px}.search-result-hover-button.mod-top{top:2px}.search-result-hover-button.mod-bottom{bottom:2px}.search-result-file-matched-text{color:var(--text-normal);background-color:var(--text-highlight-bg)}.search-info-container{color:var(--text-muted);padding:var(--size-4-1) var(--size-4-4) var(--size-4-1);font-size:var(--font-ui-smaller)}.search-info-children{padding-left:20px;border-left:1px solid var(--background-modifier-border);margin:1px 0}.copy-search-result-container{display:flex;flex-direction:column}.copy-search-result-textarea{height:300px;max-height:20vh;resize:none}.search-result-file-match-destination-file-container{margin-top:var(--size-2-3)}.search-result-file-match-destination-file{display:inline-flex;background-color:var(--interactive-normal);border-radius:var(--radius-s);box-shadow:var(--input-shadow);color:var(--text-muted);padding:var(--size-2-2) var(--size-2-3);margin-bottom:var(--size-2-1)}.search-result-file-match-destination-file-icon{--icon-size:var(--icon-xs);--icon-stroke:var(--icon-xs-stroke-width);margin-right:var(--size-4-1);display:flex;color:var(--text-faint)}.search-result-file-match-destination-file-icon .svg-icon{align-self:center}.search-result-file-match-destination-file-name{white-space:pre-wrap;word-break:break-all}.search-results-info{color:var(--text-muted);display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--background-modifier-border);margin:var(--size-4-1) var(--size-4-2) 0;padding-bottom:var(--size-4-1);white-space:nowrap}.search-results-result-count{font-size:var(--font-ui-smaller)}.search-row{display:flex;margin:var(--size-4-2);gap:var(--size-4-1)}.search-params{margin:var(--size-4-1) var(--size-4-4)}.search-params input[type=range],.search-params input[type=text]{width:100%;font-size:var(--font-ui-small)}.search-params .mod-cta{margin-top:var(--size-2-3);width:100%}.search-params::-webkit-scrollbar,.search-params::-webkit-scrollbar-thumb{display:none}.global-search-input-container{flex-grow:1}.more-options-icon{--icon-size:10px;background-color:var(--icon-color);border-radius:50%;color:var(--background-secondary);display:flex;margin-left:var(--size-2-3);opacity:var(--icon-opacity);padding:.5px}.clickable-icon:hover .more-options-icon{background-color:var(--icon-color-hover);opacity:var(--icon-opacity-hover)}.slides-container{position:fixed;top:0;left:0;height:100vh;width:100vw;transition:-webkit-transform .8s ease 0s;background-color:#191919;z-index:var(--layer-slides);border:none}.slides-container li .collapse-indicator{display:none}.slides-close-btn{display:inline-block;position:absolute;top:var(--size-4-2);right:var(--size-4-2);color:var(--text-faint);cursor:var(--cursor);z-index:1}.reveal input[type=checkbox]{width:24px;height:24px}.reveal .footnote-item,.reveal .task-list-item{list-style:none}.reveal .task-list-item{margin-left:-1.5em}.tag-pane-tag.is-active{background-color:var(--interactive-accent);color:var(--text-on-accent)}.tag-pane-tag.is-active .tag-pane-tag-count{background-color:var(--background-modifier-hover);color:var(--text-normal)}.tag-container{font-size:var(--font-ui-small);padding:var(--size-4-3) var(--size-4-3) var(--size-4-8);overflow:auto}.tree-item-children .tag-pane-tag .tag-pane-tag-parent{display:none}.mod-canvas-color-1{--canvas-color:var(--canvas-color-1)}.mod-canvas-color-2{--canvas-color:var(--canvas-color-2)}.mod-canvas-color-3{--canvas-color:var(--canvas-color-3)}.mod-canvas-color-4{--canvas-color:var(--canvas-color-4)}.mod-canvas-color-5{--canvas-color:var(--canvas-color-5)}.mod-canvas-color-6{--canvas-color:var(--canvas-color-6)}body{--canvas-color:192,192,192}body.theme-dark{--canvas-color:126,126,126}.canvas-wrapper{position:absolute;width:100%;height:100%;left:0;top:0;--resizer-size:20px;--shadow-stationary:0px 0.5px 1px 0.5px rgba(0, 0, 0, 0.1);--shadow-drag:0px 2px 10px rgba(0, 0, 0, 0.1);--shadow-border-accent:0 0 0 2px var(--color-accent);--zoom-multiplier:1;background-color:var(--canvas-background);overflow:hidden;contain:strict;touch-action:none;user-select:none}.canvas-wrapper.is-dragging{cursor:grabbing}.canvas-wrapper.is-dragging iframe:not(.is-controlled),.canvas-wrapper.is-dragging webview{pointer-events:none}.canvas-wrapper.is-screenshotting{z-index:999999}.canvas-wrapper.is-screenshotting *{pointer-events:none!important}.canvas-mover{position:absolute;width:100%;height:100%;left:0;top:0;cursor:grab}.canvas-mover:active{cursor:grabbing}.canvas-background{position:absolute;width:100%;height:100%;left:0;top:0;pointer-events:none}.canvas-background circle{fill:var(--canvas-dot-pattern)}.canvas{position:absolute;width:100%;height:100%;left:0;top:0;transform-origin:0px 0px;pointer-events:none}.canvas>*{pointer-events:initial}.canvas-selection{pointer-events:none;position:absolute;background-color:hsla(var(--color-accent-hsl),.1);border:2px solid var(--color-accent);z-index:-1}.canvas-selection.mod-group-selection{border-width:3px;border-radius:3px;background-color:hsla(var(--color-accent-hsl),.03);border-color:hsla(var(--color-accent-hsl),.3);pointer-events:initial}.canvas-wrapper:not(.mod-readonly) .canvas-selection.mod-group-selection{cursor:grab}.canvas-wrapper:not(.mod-readonly) .canvas-selection.mod-group-selection:active{cursor:grabbing}.canvas-selection.mod-node-highlight{border-radius:var(--radius-m)}.canvas-controls{right:var(--size-4-2);top:var(--size-4-2);gap:var(--size-4-2);display:flex;flex-direction:column}.canvas-control-group{border-radius:var(--radius-s);background-color:var(--background-primary);border:1px solid var(--background-modifier-border);box-shadow:var(--input-shadow);display:flex;flex-direction:column;overflow:hidden}.canvas-control-item{border-radius:0;box-shadow:none;height:auto;display:flex;line-height:1;font-size:inherit;align-items:center;justify-content:center;cursor:var(--cursor);padding:var(--size-4-2);border-bottom:1px solid var(--background-modifier-border);color:var(--text-muted);background-color:var(--interactive-normal);--icon-size:var(--icon-s);--icon-stroke:var(--icon-s-stroke-width)}.canvas-control-item:last-child{border-bottom:none}.canvas-control-item.is-active{color:var(--color-accent)}.canvas-control-item.is-disabled svg{color:var(--text-faint)}.canvas-control-item svg{pointer-events:none}.canvas-node-container{background-color:var(--background-primary);border-radius:var(--radius-m);border:2px solid rgb(var(--canvas-color));contain:strict;display:flex;flex-direction:column;overflow:hidden;position:absolute;left:0;top:0;width:100%;height:100%;box-shadow:var(--shadow-stationary)}.canvas-node-label{position:absolute;left:0;top:calc(-1 * var(--size-4-1) * var(--zoom-multiplier));transform:translate(0,-100%) scale(var(--zoom-multiplier));transform-origin:left bottom;max-width:calc(100% / var(--zoom-multiplier));overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--canvas-card-label-color);--icon-size:1em}body:not(.is-ios) .canvas-wrapper.mod-animating .canvas-node-label{transition:transform .5s cubic-bezier(.16, 1, .3, 1) 0s}.canvas-node-label svg{position:relative;top:2px;margin-right:var(--size-4-1)}.canvas-node-label.mod-hover-label{opacity:0}.canvas-wrapper.mod-zoomed-out .canvas-node-label{display:none}.canvas-node-placeholder{display:flex;align-items:center;justify-content:center;text-align:center;width:100%;height:100%;overflow:hidden;overflow-wrap:anywhere;padding:var(--size-4-6);font-size:32px;font-weight:var(--font-semibold)}.canvas-node-placeholder::after{border-radius:var(--radius-s);content:" ";display:block;position:absolute;top:var(--size-4-4);right:var(--size-4-4);bottom:var(--size-4-4);left:var(--size-4-4);background-color:rgba(var(--canvas-color),.1)}.canvas-icon-placeholder{display:flex;width:40%;height:40%}.canvas-icon-placeholder svg{opacity:.3;color:rgb(var(--canvas-color));width:100%;height:100%}.canvas-node-interaction-layer{position:absolute;width:0;height:0;pointer-events:none}.canvas-node-interaction-layer>*{pointer-events:initial}.canvas-node{--shadow-border-themed-inset:inset 0 0 0 1px rgb(var(--canvas-color));--shadow-border-themed:0 0 0 2px rgb(var(--canvas-color));position:absolute;width:0;height:0}.canvas-node.is-dragging{pointer-events:none}.canvas-node.is-dragging .canvas-node-container{box-shadow:var(--shadow-drag)}.canvas-node.is-focused,.canvas-node.is-selected{touch-action:initial}.canvas-node.is-focused .canvas-node-label,.canvas-node.is-selected .canvas-node-label{color:var(--text-muted)}.canvas-node.is-focused .canvas-node-container,.canvas-node.is-selected .canvas-node-container{border-color:var(--color-accent);box-shadow:var(--shadow-stationary),var(--shadow-border-accent)}.canvas-node.is-focused.is-dragging .canvas-node-container,.canvas-node.is-selected.is-dragging .canvas-node-container{box-shadow:var(--shadow-drag),var(--shadow-border-accent)}.canvas-node.is-themed .canvas-node-container{border-color:rgba(var(--canvas-color),.7);box-shadow:inset 0 0 0 1px rgba(var(--canvas-color),.7),var(--shadow-stationary)}.canvas-node.is-focused.is-themed .canvas-node-container,.canvas-node.is-selected.is-themed .canvas-node-container{border-color:rgb(var(--canvas-color));box-shadow:var(--shadow-border-themed-inset),var(--shadow-border-themed)}.canvas-node.is-focused.is-themed.is-dragging .canvas-node-container,.canvas-node.is-selected.is-themed.is-dragging .canvas-node-container{box-shadow:var(--shadow-border-themed-inset),var(--shadow-border-themed)}.canvas-node.is-dummy{cursor:grabbing}.canvas-node.is-dummy .canvas-node-container{border:4px solid var(--color-accent);box-shadow:rgba(0,0,0,.15) 0 2px 10px;background-color:hsla(var(--color-accent-hsl),.2)}.canvas-node.is-focused:not(.is-dragging) .canvas-node-content-blocker{display:none}.canvas-node-content-blocker{position:absolute;width:100%;height:100%;left:0;top:0;z-index:var(--layer-cover)}.canvas-node-group:not(.is-focused):not(.is-selected){pointer-events:none}.canvas-node-group .canvas-node-resizer{pointer-events:initial}.canvas-node-group .canvas-node-container{background-color:transparent}.canvas-node-group .canvas-node-content{background-color:rgba(var(--canvas-color),.07)}.canvas-group-label{position:absolute;left:0;top:calc(-1 * var(--size-4-1) * var(--zoom-multiplier));transform:translate(0,-100%) scale(var(--zoom-multiplier));transform-origin:left bottom;max-width:calc(100% / var(--zoom-multiplier));overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:initial;font-size:1.5em;padding:var(--size-4-1) var(--size-4-2);border-radius:var(--radius-s);color:var(--text-muted);background-color:rgba(var(--canvas-color),.1);line-height:1}body:not(.is-ios) .canvas-wrapper.mod-animating .canvas-group-label{transition:transform .5s cubic-bezier(.16, 1, .3, 1) 0s}.canvas-wrapper:not(.mod-readonly) .canvas-group-label{cursor:grab}.canvas-wrapper:not(.mod-readonly) .canvas-group-label:active{cursor:grabbing}.canvas-node-content{backface-visibility:hidden;width:100%;height:100%;overflow:hidden;position:relative}.canvas-node-content.markdown-embed{border:none;padding:0}.canvas-node-content.markdown-embed .inline-title{cursor:text}.canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view{padding:0 var(--size-4-6);display:flex;flex-direction:column}.canvas-wrapper:not(.mod-readonly) .canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view{user-select:none}.canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view::after,.canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view::before{content:" ";display:block;min-height:min(calc(var(--canvas-node-height) * .1 - 3px),var(--size-4-6));max-height:var(--size-4-4);flex:1 1 0px}.canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view>.markdown-preview-sizer{flex:1 0 0px}.canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view .callout{mix-blend-mode:normal}.canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view .markdown-preview-pusher+div>:first-child{margin-top:0}.canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view .markdown-preview-sizer>div:last-child>:last-child{margin-bottom:0}.is-focused .canvas-node-content.markdown-embed>.markdown-embed-content>.markdown-preview-view{transform:translateZ(0)}.canvas-node.is-themed .canvas-node-content{background-color:rgba(var(--canvas-color),.07)}.canvas-node-content.media-embed{justify-content:center;align-items:center;display:flex}.canvas-node-content.media-embed audio,.canvas-node-content.media-embed img,.canvas-node-content.media-embed video{flex-shrink:0;flex-grow:1}.canvas-node-content.media-embed audio,.canvas-node-content.media-embed img:not([width]),.canvas-node-content.media-embed video{max-width:100%}.canvas-node-resizer{position:absolute;height:calc(var(--resizer-size) * var(--zoom-multiplier));width:calc(var(--resizer-size) * var(--zoom-multiplier))}.is-selected .canvas-node-resizer{pointer-events:none}.canvas-wrapper.mod-readonly .canvas-node-resizer{display:none}.canvas-node-resizer[data-resize=top]{left:0;right:0;width:auto;top:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);cursor:ns-resize}.canvas-node-resizer[data-resize=bottom]{left:0;right:0;width:auto;bottom:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);cursor:ns-resize}.canvas-node-resizer[data-resize=left]{top:0;bottom:0;height:auto;left:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);cursor:ew-resize}.canvas-node-resizer[data-resize=right]{top:0;bottom:0;height:auto;right:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);cursor:ew-resize}.canvas-node-resizer[data-resize=topright]{right:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);top:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);cursor:nesw-resize}.canvas-node-resizer[data-resize=bottomright]{right:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);bottom:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);cursor:nwse-resize}.canvas-node-resizer[data-resize=topleft]{left:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);top:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);cursor:nwse-resize}.canvas-node-resizer[data-resize=bottomleft]{left:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);bottom:calc(var(--resizer-size) * var(--zoom-multiplier) * -.5);cursor:nesw-resize}.canvas-node-connection-point{width:calc(var(--resizer-size) * var(--zoom-multiplier));height:calc(var(--resizer-size) * var(--zoom-multiplier));position:absolute;pointer-events:all;cursor:pointer}.canvas-node-connection-point[data-side=top]{top:1px;left:calc(50% - var(--resizer-size) * var(--zoom-multiplier)/ 2)}.canvas-node-connection-point[data-side=right]{right:1px;top:calc(50% - var(--resizer-size) * var(--zoom-multiplier)/ 2)}.canvas-node-connection-point[data-side=bottom]{bottom:1px;left:calc(50% - var(--resizer-size) * var(--zoom-multiplier)/ 2)}.canvas-node-connection-point[data-side=left]{left:1px;top:calc(50% - var(--resizer-size) * var(--zoom-multiplier)/ 2)}.canvas-node-connection-point::after{content:" ";background-color:var(--color-accent);border-radius:50%;border:3px solid var(--background-modifier-border);box-sizing:border-box;display:block;height:calc(var(--resizer-size) * var(--zoom-multiplier));opacity:0;position:relative;width:calc(var(--resizer-size) * var(--zoom-multiplier));left:0;top:0}.canvas-snaps{position:absolute;width:100%;height:100%;left:0;top:0;overflow:visible;pointer-events:none;opacity:.6}.canvas-snaps line{stroke-width:1px;stroke:var(--color-accent)}.canvas-snaps circle{fill:var(--color-accent)}.canvas-edges{position:absolute;width:100%;height:100%;left:0;top:0;overflow:visible;pointer-events:none}.canvas-edges>*{pointer-events:initial}.canvas-edges path.canvas-display-path{pointer-events:none;stroke-width:calc(3px * var(--zoom-multiplier));stroke:rgb(var(--canvas-color));fill:none;transition:stroke-width .1s ease-out 0s}.canvas-edges path.canvas-interaction-path{pointer-events:stroke;stroke-width:calc(24px * var(--zoom-multiplier));stroke-linecap:round;stroke:transparent;fill:none;transition:stroke .1s ease-out 0s}.canvas-wrapper:not(.mod-readonly) .canvas-edges path.canvas-interaction-path{cursor:grab}.canvas-wrapper:not(.mod-readonly) .canvas-edges path.canvas-interaction-path:active{cursor:grabbing}.canvas-edges polygon.canvas-path-end{pointer-events:none;stroke:rgb(var(--canvas-color));fill:rgb(var(--canvas-color));stroke-linecap:round;stroke-linejoin:round;stroke-width:1px;transform-box:fill-box;transform:scale(var(--zoom-multiplier));transform-origin:center top}.canvas-edges g.is-focused path.canvas-display-path,.canvas:not(.is-connecting) .canvas-edges g:hover path.canvas-display-path{stroke-width:calc(5.5px * var(--zoom-multiplier))}.canvas-edges g.is-focused path.canvas-interaction-path,.canvas:not(.is-connecting) .canvas-edges g:hover path.canvas-interaction-path{stroke:rgba(var(--canvas-color),0.1)}.canvas-path-label-wrapper{position:absolute;width:fit-content;height:fit-content}.canvas-path-label{font-size:calc(var(--font-ui-large) * var(--zoom-multiplier));background-color:var(--background-primary);border-radius:var(--radius-s);padding:calc(var(--size-2-3) * var(--zoom-multiplier));line-height:var(--line-height-tight);white-space:pre-wrap;transform:translate(-50%,-50%);text-align:center;max-width:calc(17em * var(--zoom-multiplier))}.canvas-color-picker-item{cursor:var(--cursor);width:24px;height:24px;margin:2px;border-radius:12px;border:2px solid var(--background-primary);background-color:rgb(var(--canvas-color))}.canvas-color-picker-item.is-active{box-shadow:0 0 0 2px rgb(var(--canvas-color))}.canvas-color-picker-item input[type=color]{margin:-4px 0 0 -2px;--swatch-width:20px;--swatch-height:20px;opacity:0}.canvas-color-picker-item.canvas-color-picker-custom:not(.is-active){background:conic-gradient(var(--color-red),var(--color-yellow),var(--color-green),var(--color-blue),var(--color-purple),var(--color-red))}.canvas-empty-embed-container{align-items:center;display:flex;flex-direction:column;gap:var(--size-4-6);justify-content:center;height:100%;padding:var(--size-4-3);text-align:center}.canvas-empty-embed-action-list{display:flex;flex-direction:column;gap:var(--size-4-3)}.canvas-empty-embed-action-list button{font-size:var(--font-text-size);padding:var(--size-4-5) var(--size-4-9)}.canvas-help{display:flex;flex-direction:column;gap:var(--size-4-3)}.canvas-instruction{display:flex;justify-content:space-between}.canvas-instruction-desc{display:flex;gap:var(--size-4-1)}.canvas-minimap{width:100%;height:100%;padding:var(--size-4-1)}.inline-embed>.canvas-minimap{max-height:var(--embed-canvas-max-height)}.canvas-minimap rect{stroke-width:5px;stroke:var(--background-modifier-border);fill:var(--background-modifier-border);fill-opacity:0.65}.canvas-minimap rect.is-themed{stroke:rgb(var(--canvas-color));fill:rgb(var(--canvas-color));fill-opacity:0.5}.canvas-minimap path{stroke:rgb(192,192,192);fill:none}.canvas-minimap path.is-themed{stroke:rgb(var(--canvas-color))}.canvas-cursor{position:absolute;width:1px;height:1px;border:5px solid var(--color-accent);border-radius:5px;pointer-events:none}.canvas-watermark *{font-family:var(--font-default)!important}.starter{user-select:none;padding-top:0!important}.starter-screen{display:flex;flex-direction:column;background-color:var(--background-primary);width:100%;height:100%}.starter-screen-inner{flex-grow:1;display:flex;height:calc(100% - 24px)}.splash{align-items:center;background-color:var(--background-primary);display:flex;flex-direction:column;justify-content:center;flex:1 1 auto;text-align:center;padding:36px 0 0}.splash-brand{flex:0 0 content;padding:20px 0}.splash-brand-logo-text{margin-top:20px;color:#fff}.splash-brand-version{color:var(--text-muted);margin-top:8px;font-size:var(--font-ui-small)}.help-options-container{flex:1 0 0px;overflow:auto;width:100%;max-width:82%;text-align:left;padding:var(--size-4-6) 0}.help-options-container::-webkit-scrollbar{display:none}.open-vault-options-container::-webkit-scrollbar{display:none}.quick-start-container{margin-bottom:10px}.quick-start-container button{font-size:var(--font-ui-medium);padding:8px 60px}.open-folder-input[type=text]{font-size:var(--font-ui-small);width:200px;height:28px}.browse-folder-button{margin-left:10px}.open-folder-button{margin-top:14px;padding:6px 36px}.starter .notice{top:38px}:root{--safe-area-inset-top:env(safe-area-inset-top);--safe-area-inset-bottom:env(safe-area-inset-bottom);--safe-area-inset-left:env(safe-area-inset-left);--safe-area-inset-right:env(safe-area-inset-right)}.mod-tappable{transition:opacity .15s ease-in-out 0s}.mod-tappable.mod-tap{opacity:.5}.mod-fade{--scroll-fade-offset-right:0;--scroll-fade-offset-left:0}.mod-fade:not(.mod-at-start)::before{content:" ";position:absolute;top:0;left:var(--scroll-fade-offset-left);width:30px;height:100%;background:linear-gradient(to right,var(--background-primary),transparent)}.mod-fade:not(.mod-at-end)::after{content:" ";position:absolute;top:0;right:var(--scroll-fade-offset-right);width:30px;height:100%;background:linear-gradient(to right,transparent,var(--background-primary))}.workspace-drawer .nav-buttons-container::-webkit-scrollbar,.workspace-drawer .nav-buttons-container::-webkit-scrollbar-thumb,.workspace-drawer .workspace-drawer-actions::-webkit-scrollbar,.workspace-drawer .workspace-drawer-actions::-webkit-scrollbar-thumb{visibility:hidden}.workspace-drawer-ribbon::-webkit-scrollbar,.workspace-drawer-ribbon::-webkit-scrollbar-thumb{visibility:hidden;width:0}.pull-action{position:absolute;background-color:var(--background-secondary);z-index:var(--layer-popover);color:var(--text-muted);font-size:90%;transition:background-color 150ms ease-in-out 0s}.pull-action.mod-activated{background-color:var(--interactive-accent);color:var(--text-on-accent)}.pull-down-action{top:0;left:0;right:0;width:96%;max-width:500px;margin:var(--safe-area-inset-top) auto 0 auto;padding:var(--size-4-3) var(--size-4-4);text-align:center;border-radius:40px}.pull-out-action{top:50%;padding:var(--size-4-3) var(--size-4-4);border-radius:40px;margin:0 var(--size-4-4)}.mobile-toolbar-options-list::-webkit-scrollbar{width:0!important;height:0!important} \ No newline at end of file diff --git a/reti-di-elaboratori/lib/styles/plugin-styles.css b/reti-di-elaboratori/lib/styles/plugin-styles.css new file mode 100644 index 0000000..c99d893 --- /dev/null +++ b/reti-di-elaboratori/lib/styles/plugin-styles.css @@ -0,0 +1,2 @@ +body{--color-fade-speed:0.2s}.sidebar{font-size:14px;display:contents;z-index:1}.sidebar-container{background-color:var(--background-secondary);height:100%;z-index:inherit;transition:width ease-in-out,flex-basis ease-in-out,min-width ease-in-out,background-color var(--color-fade-speed) ease-in-out,box-shadow ease-in-out;transition-duration:.2s;overflow:hidden;flex:none}.floating-sidebars .sidebar:not(.is-collapsed) .sidebar-container{box-shadow:0 0 50px 3em rgba(0,0,0,.4)}.sidebar-gutter{height:100%;width:3em;padding:12px;background-color:hsla(var(--color-accent-hsl),.25);padding-left:calc(12px / 2);padding-right:calc(12px / 2);transition:width ease-in-out,padding-left ease-in-out,padding-right ease-in-out,background-color var(--color-fade-speed) ease-in-out,border ease-in-out;transition-duration:.2s;z-index:1;flex:none;position:relative;pointer-events:none}.sidebar.is-collapsed .sidebar-gutter{background-color:transparent}.sidebar-left .sidebar-gutter{border-left:solid var(--divider-width) var(--divider-color);border-radius:0 var(--radius-l) var(--radius-l) 0}.sidebar-right .sidebar-gutter{border-right:solid var(--divider-width) var(--divider-color);margin-left:auto;border-radius:var(--radius-l) 0 0 var(--radius-l)}.sidebar-gutter.is-collapsed,body.loading .sidebar-gutter{height:100%;width:0!important;padding:var(--sidebar-margin);padding-left:0;padding-right:0}.sidebar-sizer{width:calc(100vw - var(--sidebar-width) - var(--content-width));height:100%;transition:width .2s ease-in-out,min-width .2s ease-in-out;min-width:var(--sidebar-width)}.sidebar.is-collapsed .sidebar-sizer,body.loading .sidebar-sizer{width:0;min-width:0}.sidebar-left .sidebar-sizer{float:left}.sidebar-right .sidebar-sizer{float:right}.sidebar-content-positioner{width:var(--sidebar-width);height:100%}.sidebar-left .sidebar-content-positioner{float:right}.sidebar-right .sidebar-content-positioner{float:left}.sidebar-content{width:var(--sidebar-width);line-height:var(--line-height-tight);display:flex;flex-direction:column;padding:var(--sidebar-margin);height:100%;transition:width ease-in-out,padding-left ease-in-out,padding-right ease-in-out;transition-duration:.2s}.sidebar-left .sidebar-content{float:left}.sidebar-right .sidebar-content{float:right}.sidebar-section-header{margin:0 0 1em 0;text-transform:uppercase;letter-spacing:.06em;font-weight:600}.clickable-icon.sidebar-collapse-icon{width:100%;background-color:transparent;height:75px;border-radius:12px;padding:13%;display:block;max-width:3em;max-height:3em;color:var(--icon-color-focused);pointer-events:all}.clickable-icon.sidebar-collapse-icon svg.svg-icon{width:100%;height:fit-content}body{transition:background-color var(--color-fade-speed) ease-in-out}.webpage-container{display:flex;flex-direction:row;height:100%;width:100%;position:fixed;align-items:stretch;justify-content:center}.document-container{opacity:0;flex-basis:var(--content-width);width:var(--content-width);height:100%;z-index:0;display:flex;flex-direction:column;align-items:center;padding:1em;max-width:100%;padding-right:0}@keyframes hide{from{opacity:1}to{opacity:0}}@keyframes show{from{opacity:0}to{opacity:1}}.document-container.hide{animation:hide .3s forwards ease-in-out}body:not(.loading) .document-container.show{opacity:0;animation:show .3s forwards ease-in-out;animation-delay:.2s}.floating-sidebars .document-container{position:absolute}.markdown-reading-view{display:none}.document-container>.markdown-preview-view{display:flex;padding-bottom:30em;align-items:flex-start;justify-content:center;overflow-x:hidden;overflow-y:scroll}.document-container>.markdown-preview-view>.markdown-preview-sizer{padding:1.5em;padding-bottom:50vh;width:100%;position:absolute;background-color:var(--background-primary);border-radius:var(--window-radius);max-width:var(--line-width);flex-basis:var(--line-width);transition:background-color var(--color-fade-speed) ease-in-out}.markdown-rendered img:not([width]),.view-content img:not([width]){max-width:100%;outline:0}.document-container>.view-content.embed{display:flex;padding:1em;height:100%;width:100%;align-items:center;justify-content:center}.document-container>.view-content.embed>*{max-width:100%;max-height:100%;object-fit:contain}.document-container>.view-content{overflow-x:scroll;contain:content;padding:0;margin:0;height:100%}.tree-container{position:relative;height:100%;width:auto;margin-top:3em;margin-bottom:0}.tree-container .tree-header{display:flex;flex-direction:row;align-items:center;position:absolute;top:-3em}.tree-container .tree-header .sidebar-section-header{margin:1em;margin-left:0}.tree-container:has(.tree-scroll-area:empty){display:none}.tree-container .tree-scroll-area{width:100%;height:100%;max-height:100%;overflow-y:scroll;padding-right:1em;border-radius:var(--radius-m);position:absolute}.tree-container .tree-item{display:flex;flex-direction:column;align-items:flex-start;padding:0}.tree-container .tree-item-children{padding:0;margin-left:0;border-left:none;width:100%}.tree-item-title *{padding:0;margin:0;overflow:visible}.tree-container .tree-item.mod-active>.tree-item-contents>.tree-item-link{color:var(--color-accent)}.tree-container .tree-item-contents{position:relative;display:flex;flex-direction:row;align-items:center;border-radius:.4em;color:var(--nav-item-color);width:100%;margin-left:var(--tree-horizontal-spacing)}.tree-container .tree-item-contents:active{color:var(--nav-item-color-active)}.tree-container .tree-item-link{width:100%;height:100%;transition:background-color .1s;border-radius:var(--radius-s);padding-left:calc(var(--tree-horizontal-spacing) * 2 + var(--collapse-arrow-size));padding-bottom:calc(var(--tree-vertical-spacing)/ 2);padding-top:calc(var(--tree-vertical-spacing)/ 2);color:var(--nav-item-color);text-decoration:none}.tree-container .mod-tree-file>.tree-item-contents>.tree-item-link{padding-left:calc(var(--tree-horizontal-spacing) * 2)}.tree-container .tree-item-icon.collapse-icon{margin-left:calc(0px - var(--collapse-arrow-size) - var(--tree-horizontal-spacing));position:absolute}.tree-container .tree-item.mod-tree-folder>.tree-item-contents>.tree-item-icon.collapse-icon{width:100%}.collapse-icon>svg{color:unset!important}.collapse-icon:hover{color:var(--nav-item-color-hover)}.tree-container .clickable-icon{width:3.2em;height:2.2em}.tree-container .tree-item.is-collapsed>.tree-item-contents>.tree-item-link>.tree-item-icon.collapse-icon>svg{transition:transform .1s ease-in-out;transform:rotate(-90deg)}.tree-container .tree-item-link:hover{cursor:pointer;color:var(--nav-item-color-hover);text-decoration:underline}.tree-container>.tree-scroll-area>* .tree-item{margin-left:calc(var(--tree-horizontal-spacing) * 2 + var(--collapse-arrow-size)/ 2);border-left:var(--nav-indentation-guide-width) solid var(--nav-indentation-guide-color)}.tree-container .tree-scroll-area>*>*>.tree-item{margin-left:calc(var(--tree-horizontal-spacing) + var(--collapse-arrow-size)/ 2)}.tree-container:not(.mod-nav-indicator) .tree-scroll-area>*>*>.tree-item{margin-left:0}.tree-container .tree-item.mod-active{border-left:var(--nav-indentation-guide-width) solid var(--color-accent)}.tree-container .tree-item:hover:not(.mod-active):not(.mod-collapsible):not(:has(.tree-item:hover)){border-left:var(--nav-indentation-guide-width) solid var(--nav-item-color-hover)}.tree-container .tree-item-contents:hover{background-color:var(--nav-item-background-hover)}.webpage-container .tree-container .tree-item:not(.mod-collapsible)>.tree-item-children>.tree-item,.webpage-container .tree-container:not(.mod-nav-indicator) .tree-item,.webpage-container .tree-container>.tree-scroll-area>.tree-item{border-left:none!important}.webpage-container .tree-container .tree-item:not(.mod-collapsible)>.tree-item-children>.tree-item>.tree-item-contents,.webpage-container .tree-container:not(.mod-nav-indicator) .tree-item .tree-item-contents,.webpage-container .tree-container>.tree-scroll-area>.tree-item>.tree-item-contents{margin-left:0!important;width:calc(100% + var(--tree-horizontal-spacing))}.tree-container.outline-tree .tree-item[data-depth='1']>.tree-item-contents>.tree-item-link{font-weight:900;font-size:1.1em;margin-left:0;padding-left:1em}.heading-wrapper{transition:height ease-in-out,margin-bottom ease-in-out;transition-duration:.2s;display:block}html>body>.webpage-container>.document-container .heading-wrapper,html>body>.webpage-container>.document-container>.markdown-preview-view>.markdown-preview-sizer>*{margin-inline:0!important;margin:0!important;padding:0!important;width:100%;max-width:100%}body>.webpage-container>.document-container .heading-wrapper>.heading{margin:0;margin-inline:0;margin-block:0}.markdown-preview-sizer>.heading-wrapper>h1{margin-top:var(--p-spacing)!important}body>.webpage-container>.document-container .heading-children>div:not(.heading-wrapper):first-child>*{margin-top:0}.heading-children{transition:height ease-in-out,margin-bottom ease-in-out;transition-duration:.2s;display:inline-block;width:100%;padding-top:1em}.heading-children.is-collapsed{padding-top:0}.heading-wrapper.is-animating>.heading-children,.heading-wrapper.is-collapsed>.heading-children{overflow:hidden}.heading-wrapper>.heading>.heading-after{display:none}.heading-wrapper.is-collapsed>.heading>.heading-after{display:inline-block;margin-left:.3em;opacity:.4;font-size:1em;cursor:auto;user-select:none}.heading-wrapper.is-hidden>*{display:none}.heading-wrapper.is-hidden{visibility:hidden}.collapse-icon svg.svg-icon{color:var(--nav-collapse-icon-color);stroke-width:4px;width:var(--collapse-arrow-size);height:var(--collapse-arrow-size);transition:transform .1s ease-in-out 0s;min-width:10px;min-height:10px}div.is-collapsed>*>.heading-collapse-indicator.collapse-icon>svg{transition:transform .1s ease-in-out;transform:rotate(-90deg)}body .webpage-container>.document-container .heading-collapse-indicator,body .webpage-container>.document-container .heading-collapse-indicator>svg{position:relative!important}a{overflow-wrap:anywhere}*{overflow-wrap:break-word}.theme-toggle-container{--toggle-width:3.5em;--toggle-height:1.75em;--border-radius:calc(var(--toggle-height) / 2);--handle-width:calc(var(--toggle-height) * 0.65);--handle-radius:calc(var(--handle-width) / 2);--handle-margin:calc((var(--toggle-height) / 2.0) - var(--handle-radius));--handle-translation:calc(var(--toggle-width) - var(--handle-width) - (var(--handle-margin) * 2));display:inline-block;cursor:pointer;margin:10px}.clickable-icon,.sidebar-section-header{transition:color var(--color-fade-speed) ease-in-out}@keyframes toggle-slide-right{0%{width:var(--handle-width);transform:translateX(0)}50%{width:calc(var(--toggle-width) * .5)}90%{width:var(--handle-width)}100%{transform:translateX(var(--handle-translation))}}@keyframes toggle-slide-left{0%{width:var(--handle-width);transform:translateX(calc(var(--handle-translation) - ((var(--toggle-width) * .33) - var(--handle-width))))}70%{width:calc(var(--toggle-width) * .5)}100%{width:var(--handle-width);transform:translateX(0)}}@keyframes toggle-expand-right{0%{width:var(--handle-width)}100%{width:calc(var(--toggle-width) * .33)}}@keyframes toggle-expand-left{0%{width:var(--handle-width);transform:translateX(var(--handle-translation))}100%{width:calc(var(--toggle-width) * .33);transform:translateX(calc(var(--handle-translation) - ((var(--toggle-width) * .33) - var(--handle-width))))}}@keyframes toggle-contract{0%{width:calc(var(--toggle-width) * .33)}100%{width:var(--handle-width)}}.theme-toggle-input{display:none;z-index:1000}.toggle-background{position:relative;width:var(--toggle-width);height:var(--toggle-height);border-radius:var(--border-radius);background-color:var(--background-modifier-border);transition:background-color var(--color-fade-speed);z-index:1000}.toggle-background::before{content:"";position:absolute;left:var(--handle-margin);top:var(--handle-margin);height:var(--handle-width);width:var(--handle-width);border-radius:var(--handle-radius);background-color:var(--text-normal);box-shadow:inset 0 1px 1px rgba(0,0,0,.2);animation:toggle-slide-left .2s ease-in-out normal both;z-index:1000}.theme-toggle-input:checked~.toggle-background::before{animation:toggle-slide-right .2s ease-in-out normal both}.theme-toggle-input:active~.toggle-background::before{animation:toggle-expand-right .2s ease-in-out normal both}.theme-toggle-input:active:checked~.toggle-background::before{animation:toggle-expand-left .2s ease-in-out normal both}.toggle-background::after{content:"";position:absolute;right:var(--handle-margin);top:calc(var(--handle-margin));height:var(--handle-width);width:var(--handle-width);transition:transform .3s;background:url('https://api.iconify.design/lucide/moon.svg?color=white') no-repeat center center;transform:scale(.9)}.theme-toggle-input:checked~.toggle-background::after{transform:translateX(calc(var(--handle-translation) * -1)) scale(.9);background:url('https://api.iconify.design/lucide/sun.svg') no-repeat center center}#graph-canvas{width:100%;height:100%;aspect-ratio:1/1}.graph-view-container.expanded{position:fixed;width:60%;height:90%;right:20%;top:5%;background-color:var(--background-secondary);z-index:100}body.is-phone .graph-view-container.expanded{position:fixed;width:94%;height:94%;right:3%;top:3%}body.is-tablet .graph-view-container.expanded{position:fixed;width:90%;right:5%}body.is-small-screen .graph-view-container.expanded{position:fixed;width:80%;right:10%}.graph-view-container{position:relative;width:100%;aspect-ratio:1/1;display:flex;transition:background-color var(--color-fade-speed) ease-in-out;touch-action:none;border:1px solid var(--modal-border-color);border-radius:var(--modal-radius)}.graph-icon{cursor:pointer;color:var(--text-muted)}.graph-view-container .graph-icon>svg{width:24px;height:24px;background-color:var(--color-base-00);outline-width:6px;outline-color:var(--color-base-00);outline-offset:-1px;outline-style:solid;border-radius:100px;margin:10px}.graph-view-placeholder{padding:0;width:auto;aspect-ratio:1/1;position:relative;flex:none}.graph-view-placeholder:has(.expanded){border-radius:var(--modal-radius);border:1px solid var(--modal-border-color)}.scale-down{transition:transform .2s ease-in-out;transform:scale(.9)}.scale-up{transition:transform .2s ease-in-out;transform:scale(1)}.graph-expand{position:absolute;top:5px;right:5px}.canvas{translate:0 0;scale:1 1;will-change:translate,scale}.canvas-controls{display:none;cursor:default!important}.canvas-card-menu{display:none;cursor:default!important}.canvas-node-content-blocker{pointer-events:none}body.is-phone .sidebar{font-size:1.06em}body.is-phone{--collapse-arrow-size:0.5em;--tree-vertical-spacing:0.8em;--tree-horizontal-spacing:0.45em}body.post-load .sidebar-sizer{transition-delay:0.5s!important;transition-duration:.4s!important}body.post-load .sidebar-gutter{transition-delay:0.8s!important;transition-duration:.4s!important}.loading-icon{--width:80px;--height:80px;display:inline-block;position:fixed;left:calc(50% - var(--width)/ 2);top:calc(50% - var(--height)/ 2);width:var(--width);height:var(--height);opacity:0;transition:opacity .5s ease-in-out;pointer-events:none}.loading-icon.shown{opacity:1}.loading-icon div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:var(--color-accent);animation-timing-function:cubic-bezier(0,1,1,0)}.loading-icon div:first-child{left:8px;animation:lds-ellipsis1 .6s infinite}.loading-icon div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.loading-icon div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.loading-icon div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}.loading-icon:not(.shown) div{animation-play-state:paused}@keyframes lds-ellipsis1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}@media print{.outline-container,.sidebar,.theme-toggle-container,.theme-toggle-container-inline,.theme-toggle-input,.toggle-background{display:none!important}}body.resizing :not(:is(.sidebar-sizer,.sidebar-gutter)){transition:none!important}.document-container .kanban-plugin{position:absolute;padding:0;margin:0;height:100%}.document-container .kanban-plugin{font-family:var(--font-text, var(--default-font));font-size:.875rem;line-height:var(--line-height-tight);width:unset;overflow-y:unset;overflow-wrap:unset;color:unset;user-select:unset;-webkit-user-select:unset}.document-container .kanban-plugin__item-button-wrapper,.kanban-plugin__item-postfix-button.clickable-icon,.kanban-plugin__lane-grip,.kanban-plugin__lane-settings-button.clickable-icon{display:none}.excalidraw-plugin rect,.excalidraw-svg rect{fill:transparent}body.theme-dark .excalidraw-plugin svg.dark,body.theme-dark .excalidraw-svg svg.dark,body.theme-light .excalidraw-plugin svg.light,body.theme-light .excalidraw-svg svg.light{filter:invert(93%) hue-rotate(180deg)}.excalidraw-plugin>svg{width:100%;height:100%}.excalidraw-plugin{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;width:100%;padding:10px}.columnParent{display:flex;padding:15px 20px;flex-wrap:wrap;gap:20px}.columnParent{white-space:normal}.columnChild{flex-grow:1;flex-basis:0px}.view-content:has(.mm-mindmap){overflow-y:none}.view-content .mm-mindmap{transform:scale(1);translate:-4000px -4000px;top:70%;left:50%;position:absolute;overflow:hidden;width:100vw} + diff --git a/reti-di-elaboratori/lib/styles/snippets.css b/reti-di-elaboratori/lib/styles/snippets.css new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/reti-di-elaboratori/lib/styles/snippets.css @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/reti-di-elaboratori/lib/styles/theme.css b/reti-di-elaboratori/lib/styles/theme.css new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/reti-di-elaboratori/lib/styles/theme.css @@ -0,0 +1 @@ + \ No newline at end of file