From 0f90b91bae57b155a4422f49449ce199fc23497a Mon Sep 17 00:00:00 2001 From: voidbert Date: Wed, 14 May 2025 02:44:38 +0100 Subject: [PATCH 1/5] Fix automatic normal generation --- src/utils/WavefrontOBJ.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/utils/WavefrontOBJ.cpp b/src/utils/WavefrontOBJ.cpp index 92c6c3d0..559eff88 100644 --- a/src/utils/WavefrontOBJ.cpp +++ b/src/utils/WavefrontOBJ.cpp @@ -267,20 +267,20 @@ void WavefrontOBJ::generateNormals() { const glm::vec4 p1 = this->positions[face.positions[1]]; const glm::vec4 p2 = this->positions[face.positions[2]]; - const glm::vec3 v0 = glm::vec3(p0) - glm::vec3(p1); - const glm::vec3 v1 = glm::vec3(p0) - glm::vec3(p2); - const glm::vec3 v2 = glm::vec3(p1) - glm::vec3(p2); + const glm::vec3 v0 = glm::vec3(p1) - glm::vec3(p0); + const glm::vec3 v1 = glm::vec3(p2) - glm::vec3(p0); + const glm::vec3 v2 = glm::vec3(p2) - glm::vec3(p1); // Calculate area of triangle via Heron's formula const float sideLength0 = glm::length(v0); const float sideLength1 = glm::length(v1); const float sideLength2 = glm::length(v2); const float semiPerimeter = 0.5f * (sideLength0 + sideLength1 + sideLength2); - const float area = semiPerimeter * (semiPerimeter - sideLength0) * - (semiPerimeter - sideLength1) * (semiPerimeter - sideLength2); + const float area = sqrtf(semiPerimeter * (semiPerimeter - sideLength0) * + (semiPerimeter - sideLength1) * (semiPerimeter - sideLength2)); // Calculate weighted average - const glm::vec3 normal = glm::cross(v0, v1) * area; + const glm::vec3 normal = glm::normalize(glm::cross(v0, v1)) * area; averageNormals[p0] += normal; averageWeights[p0] += area; From 14ea14ca4c27f90a8e39fde5b475e49f7fea8277 Mon Sep 17 00:00:00 2001 From: voidbert Date: Wed, 14 May 2025 02:44:55 +0100 Subject: [PATCH 2/5] Add automatic normal generation to report --- reports/RelatorioFase4.tex | 65 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/reports/RelatorioFase4.tex b/reports/RelatorioFase4.tex index 80f374e6..e36247b7 100644 --- a/reports/RelatorioFase4.tex +++ b/reports/RelatorioFase4.tex @@ -109,7 +109,11 @@ \subsection{\emph{Torus}} \subsection{Outras Figuras} -{\color{red} TODO - Humberto} +Para as restantes figuras, devido à sua complexidade e ao pouco tempo disponível para a conclusão +desta fase do trabalho prático, não foram adicionadas nem coordenadas de textura nem normais. No +entanto, a \texttt{engine} ainda é capaz de importar estes modelos e de os desenhar com iluminação, +graças a um algoritmo de geração automática de normais implementado e descrito posteriormente neste +relatório. \subsection{Sistema Solar} @@ -119,7 +123,64 @@ \section{\emph{Engine}} \subsection{Geração Automática de Normais} -{\color{red} TODO - Humberto} +A \texttt{engine} é capaz de carregar modelos que não tenham informação sobre coordenadas de +texturas ou normais. Caso não haja informação sobre as coordenadas de textura de um modelo, é +possível desenhá-lo a uma cor sólida, mas é necessário que se tenha informação sobre as suas normais +para o iluminar corretamente. Como esta nem sempre está presente, foi implementado um algoritmo para +gerar normais de modelos automaticamente. + +Este algoritmo considera o modelo inteiro como um único \emph{smoothing group}, e calcula a normal +de cada vértice como a média das normais dos triângulos a que este pertence, pesada pela área dos +triângulos. Logo, é necessário, em primeiro lugar, uma forma de calcular a normal de um triângulo. +Para um triângulo $[ABC]$, esta pode ser calculada do seguinte modo: + +$$ +\hat{n}_{[ABC]} = \frac{ + \overrightarrow{AB} \times \overrightarrow{AC} +}{ + \lVert \overrightarrow{AB} \times \overrightarrow{AC} \rVert +} +$$ + +Depois, a área de cada triângulo, $A$, pode ser calculada pela fórmula de Heron: + +$$ +S = \frac{ + \lVert \overrightarrow{AB} \rVert + + \lVert \overrightarrow{AC} \rVert + + \lVert \overrightarrow{BC} \rVert +}{ + 2 +} +$$ + +$$ +A = \sqrt{ + S + \left ( S - \lVert \overrightarrow{AB} \rVert \right ) + \left ( S - \lVert \overrightarrow{AC} \rVert \right ) + \left ( S - \lVert \overrightarrow{BC} \rVert \right ) +} +$$ + +Logo, sendo $F$ o conjunto de faces triangulares nas quais um ponto está presente, o vetor normal +desse ponto é dado por: + +$$ +\hat{n} = \frac{ + \sum_{f \in F} {A_f \, \hat{n}_f} +}{ + \lVert \sum_{f \in F} {A_f \, \hat{n}_f} \rVert +} +$$ + +Em termos de implementação deste algoritmo, um dicionário é utilizado para armazenar associações +entre posições de pontos e pares normal-área. Iteram-se por todas as faces do modelo e, para +cada face, calcula-se a sua normal e a sua área. Depois, para cada ponto nessa face, adicionam-se +aos valores armazenados de normal e de área $A \, \hat{n}$ e $A$ respetivamente. Após iterar por +todas as faces, itera-se por todas as posições no dicionário, e define-se a normal de cada ponto +como o quociente entre a normal armazenada e a área total. Logicamente, este vetor deve ser +normalizado antes de adicionado ao modelo. \subsection{Adição ao \emph{Schema} XML} From 8d44ecad764ee736be15d178264e129270de1828 Mon Sep 17 00:00:00 2001 From: voidbert Date: Wed, 14 May 2025 03:11:48 +0100 Subject: [PATCH 3/5] Add .3d format to report --- reports/RelatorioFase4.tex | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/reports/RelatorioFase4.tex b/reports/RelatorioFase4.tex index e36247b7..8cffa3a6 100644 --- a/reports/RelatorioFase4.tex +++ b/reports/RelatorioFase4.tex @@ -81,7 +81,36 @@ \section{\emph{Generator}} \subsection{Formato \texttt{.3d}} -{\color{red} TODO - Humberto} +O formato \texttt{.3d} exportado pelo \texttt{generator} e utilizado pela \texttt{engine} é o +Wavefront OBJ \cite{wavefront-obj}. Apenas uma pequena fração das funcionalidades deste formato +são suportadas e, nesta fase, foram necessárias adições aos mecanismos de escrita e leitura de +ficheiros Wavefront OBJ para suportar coordenadas de textura e normais. Este formato é textual, onde +cada linha pode ser um comentário, uma posição, uma coordenada de textura, uma normal, ou uma face +triangular, como mostra o exemplo abaixo, na ordem apresentada: + +\begin{lstlisting} + +# Comment +v 0.5 0.5 1 +vt 0.3 0.3 +vn 0 1 0 +f 1/2/3 4/5/6 7/8/9 +\end{lstlisting} + +Quando uma linha começa com \texttt{v}, \texttt{vt} ou \texttt{vn}, devem seguir-se as coordenadas +de uma posição, de uma textura, ou de um vetor normal, respetivamente. Quando uma linha começa com +\texttt{f}, deve seguir-se uma face triangular, ou seja três pontos. O \texttt{generator} e a +\texttt{engine} suportam dois tipos de ponto: + +\begin{itemize} + \item Apenas um número, um índice de uma posição, ou seja, um elemento do tipo \texttt{v} + (começando a contar em 1); + \item Da forma \texttt{v/t/n}, onde estão presentes três índices, um para uma posição, um para + uma coordenada de textura, e outro para um vetor normal. +\end{itemize} + +Como o \emph{parser} de ficheiros Wavefront OBJ foi reimplementado na fase anterior com base em +expressões regulares, foi trivial adicionar o suporte para coordenadas de textura e vetores normais. \subsection{Plano Horizontal} @@ -208,6 +237,9 @@ \section{Bibliografia} \renewcommand{\section}[2]{} \begin{thebibliography}{9} + \bibitem{wavefront-obj} + "Wavefront OBJ File Format Summary."{} FileFormat.Info. Accessed: May 14, 2025. [Online.] + Available: \url{https://www.fileformat.info/format/wavefrontobj/egff.htm} \end{thebibliography} \endgroup From 139456c562ef867a4a6ff405ebe57256377e8d37 Mon Sep 17 00:00:00 2001 From: voidbert Date: Wed, 14 May 2025 03:58:49 +0100 Subject: [PATCH 4/5] Add VBOs to report --- reports/RelatorioFase4.tex | 35 ++++++++ reports/res/phase4/VAO.drawio | 153 ++++++++++++++++++++++++++++++++++ reports/res/phase4/VAO.pdf | Bin 0 -> 37296 bytes 3 files changed, 188 insertions(+) create mode 100644 reports/res/phase4/VAO.drawio create mode 100644 reports/res/phase4/VAO.pdf diff --git a/reports/RelatorioFase4.tex b/reports/RelatorioFase4.tex index 8cffa3a6..8e8fce2a 100644 --- a/reports/RelatorioFase4.tex +++ b/reports/RelatorioFase4.tex @@ -211,6 +211,41 @@ \subsection{Geração Automática de Normais} como o quociente entre a normal armazenada e a área total. Logicamente, este vetor deve ser normalizado antes de adicionado ao modelo. +\subsection{VBOs} + +Com a adição de coordenadas de textura e normais, foi necessário criar mais VBOs para as armazenar. +Agora, cada modelo passa a ter um VAO associado a três VBOs, como mostra a figura abaixo: + +\begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{res/phase4/VAO.pdf} + \caption{Organização do VAO, dos VBOs, e do EBO de um modelo.} +\end{figure} + +Pode observar-se que, ao contrário do que acontece nos ficheiros \texttt{.3d}, não pode haver +vértices formados por posições, coordenadas de textura, e normais com diferentes índices. Para isso, +seria necessário mais do que um \emph{buffer} de índices, e isso não é suportado pelo OpenGL. Logo, +após carregar um modelo, é necessário converter o esquema de indexação de um ficheiro Wavefront OBJ +para o de um \emph{index buffer}. Para o fazer, um algoritmo simples pode ser utilizado: + +\begin{itemize} + \item Cria-se um \emph{index buffer} e três outros \emph{buffers}, para armazenamento das + posições, das coordenadas de textura, e das normais, inicialmente vazios; + + \item Armazena-se um dicionário que associa tuplos posição-c.textura-normal a índices (elementos + do \emph{index buffer}); + + \item Iteram-se por todos os vértices no modelo. Para cada vértice: + \begin{itemize} + \item Constrói-se o tuplo posição-c.textura-normal associado ao vértice, que se procura + no dicionário; + \item Caso seja encontrado, adiciona-se o índice encontrado ao \emph{index buffer}. + \item Caso contrário, coloca-se o tuplo no dicionário; adicionam-se a posição, a + coordenada de textura e a normal aos seus respetivos \emph{buffers}; e adiciona-se o + índice de um destes elementos ao \emph{index buffer}. + \end{itemize} +\end{itemize} + \subsection{Adição ao \emph{Schema} XML} {\color{red} TODO - Mariana} diff --git a/reports/res/phase4/VAO.drawio b/reports/res/phase4/VAO.drawio new file mode 100644 index 00000000..342467b0 --- /dev/null +++ b/reports/res/phase4/VAO.drawio @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reports/res/phase4/VAO.pdf b/reports/res/phase4/VAO.pdf new file mode 100644 index 0000000000000000000000000000000000000000..081051ad77a2a27bd05b56a83c279cbe7e5284a0 GIT binary patch literal 37296 zcmaHSb9663(`J$z+qP{xH@0ot&Q0=*Z*1GPZQHhUV>|is?(RAJ?ms&-r>3i)e!6?A z&QuM_6hy@6nCLm6$^3s7XlM>XMnZcdD`;L`Xa+G$8y8b2LIyD#Ll;vKQ)7D*Q)mVm zQ#*4P3qmG#4kl=RerRVGCsRXPXphXHbWQtBcEpjLN2(W{-UnP>-~qoF&QoE(V!hlM zq4Yw^i(EuyYu^LrlVx*FQ6x_;;%Xa0uYCTZFP+-lNX|i*>hcAGs|2p z#eksM^QI0kkbcHi&Qt}5yOS7{A1~0t-oJ`17=n{Or^Eq7J@Hqot<1U~LhbbNLeb9c zCdNh}=o4Gl$IyPx5ZbW7yXd{*K&|hFF9x;mwW~g>3LawilyQ&8ZG2+(+1Md_NM6lU zhnYwH#(&EiTTOl?C!d56X)--+6$N)-Im{J5-!Fd5d0%W-@3Y|RBbxNX1>j<-qmyO{ z#)6)8fQ3;Y9V))SMM#R&IxfEkf{R% zU2%q$-G}!Uvjn^L-o=%xY4qY#392|?@18;4(i}~nzFNJ*8Xn1m_%vpO#f%vYPr-)u zGBFs|oWNhHFS54OK=GS_az`B|!Ad1-o`=}A~?0;3%= zxdX3tWXE<^NM;)SKQ>#RSg~RX%%zeKq?$;mcGsGsi&yQbjh?k@XCkeQ)r(0lMua1k zb9unLIG=N;En)7`9BmJ!FpnDX+mOY%dUz}4JE`)9JugaRLbm`zRJ?YlJ#CJcU((Rj znGjG_2=}-AE-Gvi7Xs8z1Wmfr5JH|Bvnec*gwnf=yizs^Cg>iG`3T#CCcyv?R2$m3rp$jRB)`V;|r{uU029(PG_pD7u?4yf!XJu*VhjzeQG>l z$2XYZ$A3{|3ed*U?5IL1``aWs{%T+tvF$o5BQl|3N~)9x5*%O(WL!&>!a2-LfaM8g zPk`zhPs&W@3srR*KFM1eT(Mv+`yw^Xj3X0^t(7y-Agz@48S89bP8zeg`P5Ol%T?N; z{MKVd*yZ(`jkl(6O5-sDlDF+B%;{in6JM7{9g4P!b4r9ZrWtl(MlaBbe;x*7N^T}S zt`bqIOR)DYE|3dPCN=G2@6aResv%=q{u56xCe1#)q_lcrPJ-+Q|J|kAA5q8M6W;>9gz-ngRt5?0tD?U%E8#z1{Q3ee?AIKwmq%FI~y7!7mfN zD1GTlN6r`Sf;Td{PT=p&AH=kO*ih(Gv#%zxg7ZV*pM1v6kG&7n_vuf-9%){()LO=A zmINHjM99bJo;xz8lXUcU(qNXGI5;US(f^K#85|m#Z&My7u|^cM=EP?4L>D%aMMqXy z53JPFqCVX~arb#C>{@H0Ux73K#x(soT4Ijb9PO3j8q+u_CMQ9Bv^zx@A|>n$#TuQc zO+grZN)$KZr1Lf6P3UIcbFG30h2_Uu@609FJ#?GRc*Y!Cs+Lqa zsay_(zqEnxYJ#|L4Vm(rNQ}jleX++W`_jtp z+{ssyj8UTcOc@{F%I=mafT&Lu0<@`}$^XenKc)ZVF=%Ec*8fUr|2umz5wdWxak2mZ zGaNH38w<<-lj1Hqp}bW@+xb6KmbiS{6I`CpNV`b03gt@{BqhvAV2JYA@Zt#(5lv(Z z;(}_e5(NV`N(UWLBVk%2CtCL=cfsMaKpTZ>%sx5-AnhRSas&2}A zw%@;(cb+?xw?5UDwC%f^x*k=QG_gVbq=2AOnY&60`3$Y81@nQ@&6i~DcsE*JQhHN6 zfH&}}Fq#?{jFpfCb%Cxdx(b!0bL4lxK*s#uDuOQ~=-VkTvf)?j{aSDGlcU`VdtqWh z^~Up?Coq7>n>@ZmQ~2UJ81NX2fyoc{!RYRL>|pR9BryCGBQO{&B-3p= zK?zTQN42~aPfXQ)tzOW2*MXcgH|Cdrad}Zrj+J2SYzsUZ39d-svm9sLa%&ZKCE%?A`LnZu5omn;{k|kv>0wshDYr_6LTPxRX>3~b6+Ie_}7+QS})FGTb_y^n#$c56JIhB&_)f{KKW6_w}%n%>l0IIr|yBZ4HNio!DF&AH1u2^qS`BDCRsN|90?c`c_K;UyT z>=y+;X&PyQ`56}NOO8(=1Z>ntfzC$^fpGxU`y$2F9pEbr5CE9eHYTu^yDEEiRg|C~LOt{QIIQ)7>h3G!byym&&n%vK9cP)=m2z(hX zn2NU5mU417v^=ktRYoiXCQaBd(Bd1`Z~h5?dVE*zZ({qc$ktq@JJF%@?$ zD$HCM5`f|{=iD0>TS_4^uGB9COCu6&_AAc}+o}$AVvgPdhWqcj5+od(g>c4f8)!r= zW>$WoWxmMvm2@r8eQ+U`<30yI3?stC-+#=ai4II=nY7l(S`J*vMqu1|d2rHo5{*j2 zG|BmRDaNm3^^FO1lwwq@COMI+g!+pGV73+`Mi!V1T9dAg`~5^~VH)8>`Sv5mV8;=9 zkxdcLL&$T<%>d1u;Cunr$RXrO;f&qp&~47HC?-DXzgp#CN@@mNTB3jCBR7kTIyue3 z=!d=M{$O*h#Q6@RseEvFFSaoTEdLC!AeBjQnyec^LU*`5azl9I#={h&O2(UM+c; z_~B(T>SU3jvm&5`Mx33XHKp$F@573%nJ{O_h;@`_|8(Vsb$feTa^9j5Qqe#@*tzhS zVPpo%M$b<#$ArCqQ0YjXKtn|}j9!JhWheOicmLU&?LP-s_K2HBLlEK1gK%UNWMt$> zax$X6|M+!2KX5~5!Macmi%5cQ+cslfmAyo55Qqr_3s57|} zs!vD9@819?K(%q?NO9z zEShmH89_ABP$ma0Rn@2%4$UgLilu#7*-!CL_KZuHPq`6?&+2a#K=}A0MXF7?vMSxz z!-KLi1$!kqDH&N-bq>c}BDZ^``Q`v9vhlzaS`h^qIXRieemwG47(3g{IiKlzon6e| zEjs~SKnRWmA6f)j5|a!e7dwBaubz1QmYpif#n{qcxWI zxo^Lxv8d$$52Kl!j$-k^o=a(%S&6VScf7QdlbmdpMoUIq|GRPPy(jR@n1)(qX{8|u zeJ@kt&b5@RWF48NvW_NwiLr{Fo{fbFL%4rK@1p3BQE+bxW6!#5tZo9im?#8wR0(N$d3mRD zOG{5n%d#d@(~{!i0U|G`v@}4A06n$eYWT2Doxm|1$|&lOO(`cH%*?oz5}3P0_2|0t z%Kt6O#JK)Ju5W0NU(weKFdPY11m07Hz3$ccc5JAaoSvSRlWZ}6pZL_=K4W7mG4o2t z;Nl7W@5|1p!jyo5y|9DYW9wD(A4D0Xj z;n|4f`-SO4jZRbUmMUmi`Tc?!NkdCZ`(RRpjvh%zJDLS}TI+?fet^c26q1x2J9`_6 z0h{LhaSfYqs-WZr<i7)`{RjW%r;-d22Qjz&2Q!EF)t!)}(nfMnmuV&CncjYJ6+g7~IOPiVT1dfPy{z6rSWQU4=Xl%Hz5Wv5Et1*&gul<5 z5DMhFtp2EgIR*Cm7^kAI>q9!EK4Oh%`1O|j8drA0y1dfXwe29}8?@N`b}YJ!gHs0{ z1ZgG8gd}V$f;40y?P2Xuu$-{7>P1*X+1-qr!1s?M^r6(b(}P30>1&?%+m+p=7VNf>7Z1=RtbMi0E%Rjwpsv`_$^J z70kSqU>uUeb_b#E;f=lxRO>AeeZCV`{ajI*?z--wEezHci@3!r$YR~AOIcYs+a(0T zCcX3Qxzl^G@~v(MX{ zjR~Jp9#P&X#CgY|%jKesRdX15UvrtXm{C{Db9M~whDxzJh-m;hAbwDc@%B*Pa8`W62q%Jp^7h@!tqJ%wny4BKn=GP$C( zeBAF9cGxF5>CmMKe3)%1MU0@3{>4aqh4u;bsb6a`+scucD*!~EV(yn1Eb$4R?%L2L z%WX~Uu%m-ZGoV!C2G{T9td8S`L93ynlS!G4k5zxHYv!r`Tnk zEwAjerL9R~ePLH)&(HLs=(7=ZHQJidkJRMJR7O4ee4BW6^~z`Pg%uSS+wnJ4Q1mit zZ!}SG6(bGf#?vPXrXTE;PgUY(+M=3n^g0i7+W>%EI=3 z)j=Lz(?{+=4Gt2D{zzx~5GhK0RuH?G?MbO1*4-WsSeIB885YSt3K=r{7BnW8P0E;; zO--Shk`gq0xfE3zDl0a57MpF@Lzn4nlgN@ptAJX54O|K+4%3-0w}}N?*byzSd^UA9 ztuej*52X2{T2Og2k^!vHPFi7l>z{UuOV+;V`08vXqGz={%k@|jjA6v-bMCPSC5Jl0 z@cumwVf7i_rGPYN?DuIAHb)q2_`f4gBe(T#Vh1;AguB5rApS*FNL8MDGcN-r4h{Bt zLf!U82z)$*-ozhQVcl=9NdHcHeooN4b;~F{Ti;aa*H+gXq_33UCaH)ce0iPPc+SLP zAx22YF^m9rlex3GA&P>7ml`hOR~TayQesn>jR!G$2l4fO{{&*XxN1+Wmg2YaRx
    786!UDV*6`L-Q(8fp3#X6mO`+a$1?t+X$WX6ZFQ94I)-#J-QJqV4 zTMIZ{NI_fMwLJNg7K`Z3v^TeBczeHa&Ob5PWg`u|j6tui?DXA(f=J>4na#DL5uQCayV8n}D+yR!Iw?PMvuvwlbV_#5HTBNL1 zbLYoxO^{hkL5X!AC?0ChVZafl1=DjzR^dmDggqnjYVvseM>7$mY%)A6ctm?3Kx~ew zeP1Fug510pIP89eyf(Qju~%XBHSZePCGEr0@cC&z{t#V-?q{?1Or z|2BspI{&;l=ze>PS4i~P#Gpj=wZ96Duj0+)V5>S5SRHX8aoU}GU;EPgt6k{5$m4dQ zV6b?qk;_n%YXXqPeTM`X5%|}~toj}fJ3StuC*zheHGC3YSZP4{L!7Vv4Xs5GLNdC3 zG&N1(eZl<$7i4Q*W7IwRWL2}Kri3!0XC_aCg#Sdk!JJrMG-E^~Bn#1j1^Rhmc45YG z0MvmczB(0Ko5&ZCbb(Z97-N9)2Nb#T0?ETS8m&&8G1z$(ycrl^bS`9IdagLQY)qvc z!)C)rI%yCSxcggft>6O0q<_H9$h{XHp(AdK{$r1EnuR zhj8JySttOZ;}^Wg>Xz`A?uA?Ho}qg^Ptf;y-V2#c@aPKHVU00f7Z!dKdEgd&)K;{S z8xJO{8$|dT9%LQQOE8xk1Y}2YQ&_y029A_(b4Y|y_x4QnzsI*hOx>ju87fV6l#%M+ zLAt@dZfI@|6@+J>7vm_*>cb|`t4X1?G;=f6gLZCYq^J$>K^hP}NrT+E_3##zzhEIW zAfh3C56#1Tm;JW_zAJKymcMA5qDNMXEPX&%2=Y5(3=rSOn#8-6?EiSw*Z0N(+bb?l2KR`%$2n?L_>f2VQrbmF; zF_=}%f`=<9&D1W;)Nl>de3#-hMaLI&xTYqvCm^B&B+V8P>j zMMg6vU~W4fG$;j10H9%!gy&+hO(YVO8oJ8JLD44u1DB-8%Dhsk2QXE40 z8NPDQvlI$H=N+35i1H~)s&tNDjae0nm6%jH5t=J)) z*KivfxMJ%friOjlGtSK$_6!^5rp=5|GT_3d44qeP*faQra&mFb#F7b^V;cV$VfZ84 ziZzK9L8U^nc&f~HfOQGYS_w7$P7XW1rby4pvgr2B=Q7WK)l84TP94Jw@DjddJDy@Y zreZrrVmro8;@%5RTL)uvkm^Q$uo1c!9@D#z(Yx30JhtyTe(yRq)w{>i%VvPXPqnPi zz0Hj00n4JaaHHHd_8l|MzGPDOm}E1%11j^!G6tJMT%4kMy*IPYLMtvA%Ta`2A?xZx z%BBpy3Ejr2ycHQUu)m>|PsF{3Th1duRw6Mu30!zP-z)^W{D$<@*cam5w<|=Zi=N?G>LC1@!wX&-?lD zc;;SYtgGuaIh6|{JP$bgnZ)RjTXPKcPe%G{ll9G$-*8A z_53bMlG^}-H%wjlct#wRw{guiwtONc`#XZy7q)jg2ks7%_4Ti8`5YpYQCg21sI=LR zzWZUdZQZVH-B-nZ!2EstwdG8NrXq92%0dnSTfE+k^Q)p%vxiqbycegF!iNeuG* zITTpIAVK)O%4_l;>OdUcf&!D@JK!^;m6SD7bplcxyk}z*+^1ttqGOd)*>`CyG|h8P zlqRB-`e!P~R1JyFiA+*uO1TzN?eRa4&{3kw=Zs_+hq0o>0u`B+NFv7+KLsg!bJ8W* zOE+00GNp(smE*B%%g;nNCM8zPmiHFNh*q;!c zq&b#mVvmWiIgfPw_okEh*`3S>9)`E?MhN5yaH11KYpY9Q;5bC4 z_c7v|=S^KKeYVurr@I^u)SSR{)dZsM$Ix8&5{yO*FCSgCkq+@O&V|V_gvrlPj1qz{ z)BGmi+OsDoQ)ll@Kro0=M(=-HD9Wg#>khlh9_h6@(o6{^&nAhov}z>Ar!t>Am_iY% z^O9;Hg#Ooe63 zj?Eixci_AMlxQu1kgdv|n-+uL@%1z}9JDk! zGHEN^jsz5&<7q06O!+o%qR|C96O;pXP%;nb`no}HUpYwIUV&GHWkb@viB!R_fr zjRZX>$vbXm+&ic<63t~|wW_wS2H0I~KF%xcD1Faw7M&MSbyIy&wJ9%4FLhf1T8OG_f7(Bi4dni^K^t6a{TAP^)`7t)p3Z(;S0<8lOz&XH2Sk)rygOwri{r3a+ zkqIQ>9>bPBzr9eQW!RyRSi|zXwOPAU=1R6omeghJW$H$*ZoY1s?6O-eZ%1!RU#rdw zMM$+ujk!9bA?R&!8nss8a--7w!I33T%&Pm;NLT!ApS|92L0e;4axG0@z;YZKVHjHP z2(-dDG-DQ;;PCew*8@6DZ%HK(zz{6f;c~{Q<(u}oBj@Oi^DkO$fY(Yq_cp{Hkhl^C z%^3|n0~VesnGYR|@z(gm_j!(JH!CqDP(MKI2t4_HQu+tkY_?d=( zH2fk%nXov-*(vHKe6}svvwUl`Tpk(FE4pAdXbdlu<-Q8Ur?H>_j2bd(JM}hq**G?gIl`TBXBiB6kqggzfgin(%P`{y1}6DN+kWb1Pjr%y%j(Kxfi)$9+q?gvE(N zr{Sk>Kp;s>qA4*mH}da!*M>JhU;)S{jH;H%4=Obx;}((K5CMLl2U&i6?9=4en&39! z&gh>Zlx!LYuyzLl{9%&S&?*yBEXk}zC};{X1M>D-@bkF{{tI$AQkl0gf;F!;k6JDH z<;%B|_Gn(#eSF?ffqla0cq8OvvRavCDpQFpr?FdWMyz{B0=EOWi#~DApzE7oV zGJRaB(XXvY06~WQP$PtH688MKI1^T`3>lJ$QEVrQuy`L60yYH(U9lb$q~<^$!l-!D zF6c0an*{;y)TkkgfhCQojavMeebG*-3(^eKSfl#C7bH6iOpVdYb31do4U6hojV2Y&1L!3-_9UTQ?sIKs6% zPRyve;Vc{e%J+b;*~jw^t#M5B^N?iH{7p}Y5l1uTdWh}>)ArYf6hO)luRb<%_~$Dx zjWywTUa>KKdEU_lsViDf{5rSe4BsoYs7|dp-nEYY3FuG!WdfmOJblV2*`3F$*elWi zJefLH%_K{=o6WAr_U+AW3^-FNx5w3PRv-ZPLno(5A09*iS|OCC4!Y&XgF%lPF(Y+Q z^7~|+A?~8O-!hbOVF|6FF^6&9%<(D-4WppU{xakzvCgA1%n6g^&ZD^VzmMaFOqet! z+eaD3nhw2x45Z?zV%sEJHc%Z3-*`CU z00ZeU+Be)W6a2Ptxxm4HECl6pDwbsBI~08ARi3X z2kLoweUp`X>&I`wqz|Aq1_8kxKXSZW$yNEcF={Uizm+p&FB0q`=2r?@BIi-#JJZ9I zLz(vU!@8Ct2#3(uQ~gmSCyMG`IcCN2{F4Q#df*O+OcMh?T4A17w%>=AcSKX%|=nc4~5vZU?eDLYP#;Nfhtah#1C1 zSGin}x%dgU=v4kN?s?$i5IK9Hbk|AtgH;}(N5H<(bTScyiC@bR!T#|8P$8V7I$QTTGw<$RC5e{zg9T5c__oThU1b{e|eX+OZ zJ5r;qKFL4vR^uXMHUm9VLjzkOcXknn8+;Stvt|E0I9B4NOuRcre}!HVIcik47(!?F zd5I2#yATQMAqdzdqR$)AzP261D+SSKQV5K0o9;+mzO=mm_xhdV+zU*h<3NOF=fMQx zIV#+}x`UAiYKj>Q9Vtdu&Im4)>CeK1e!vKi!UUDT1g6Z0x4?wbfHdsMi6Cpy|C$^;)e7dmFSi-o;Xtsw*Ybjg zKP>i;hagWJUgd#4vlp|!`9iGMKd~Bpx$3`igRM7$5B^`F&i^LTMB0O$yv#GK9bvC zP7o+ND^mK#L@Kld_|0tdCSOaU_zeY5dM?lxX7Xw8&{zEpN9FJjAY7hn*ZM#Z7ozeh zUI>#8-10@jE3p6w3Ss?(@QADa?!B%%7wCnM{RY;Yedy^&sQFSiAyNLOaRQwZP5$B& z>#YIA@S2?Okoe(#{y8L3|Aq&{%me)WeR#H$CoyXT`cQxw=KV=2rI1S?T9#`{IsYBt zgnAC>qZFcHRQiSyD-ii+p;j#a#!{tR`Ho}?0B4f=W|{7#{M612gZ|W3F>d^#`&~NU zBMMjkK!O>;^oF!ZTuLB>H$5AZi*J4k=;u^92lQ(~o&owjgeY>wzQIwL)V{&tN|$>2 zNEgp`44D5t0%t}!z5x~Q()s`?gYiKeJk~J5q5KHlSuBg$o?#i8`JR4SndP2-8zCGf z(Qjx&nWdh7+{^+%m@^n3!omZ?T+rED3MT=}0|O%l%Ok^Vq~;rjMW4+l%;bR0C!^L} zDZ#M!2_SmNVqRbbS%{%m=aWSz)a;Yxt2*Ng3&5f94U1u% z?Hk%dS3>Zc=lJ|@EiBA~uts$7n~;k^oG)TlKy|OtCn0?w@{bq_ek*B}nVpy`287c% z#C=iu`bRvU?9a3Hz*z;!==uLXWSy*4b!mEYC#A^7rpfACo)wE%rS zf1eG6c<4GE3VhRhFwE-4$heK|#?Zde{?z3S+c~@5rxGf7>H4B?-Z%6?Xoh-Y#h-iL z#o{f$?gQ*Hed6)boI0=O_5}LcEbjCX+y;HIXJb47_7L7SJb;ltZ979lztHu5$NUJf zoFCC=_DR=Ced=a2w=)ROThs%1{OYKc{Sjb3zvRzxue0ae59oL+ zu7@`Qx&u!hwpIgueK59%2p)A;X-@e+7=Dxin74Be{aJ*Y{4Z|)LFu>i7f6P4o;re> zQyxd4ntwdEOwH#!w@_}UHG9fJ2>WcGY`FdBZ`Lm|vom$lJN^T!RoA^39>P2R3}Bzo z_GcTnY}?B%#z5Dn8@ExpfPQ=*p6Fd&AD-?ZJs+O0NS`;i53uXAntjUc75yRi0N)sd z2lZQZ@4}t{f?9n5m;m$}2kxwXpZtpk0BZ!4FIxUFg()=fZDQ6@0&upI`Xzw7(1V=% zmDKyd09Fj3V*Hf$KhuYn`TlM2h5@qBgP8gi`~!g&1Be(uVSXS;839_x&)VLH0gwd* z7@2P!gSQiq1p$oIueRQYnV)v#jGrw2XE{(Z-!cYoME+-gL5m5HQ+*{2-h}+mAi#UAuaX)Q-#(elDD&FA>I(z?;H+<9cKl}58qNR4L8~k78tGf5W z9jv&AhVfI^|LhuCW`~5)C#Ls-4`ksPQU)My@U{W6u=6u)bMHgTPdhTkPdfiIdng%z zw82}(4}_ZfRowf)@dN!>0`3R;VJRED;ru{9Mhf|Xe&&as+O2KyX6OI&{cQ0ya%%Sv zm;OfqE$*Rb{B-p{tAUXL=o-A8gDklJ%z%o~r=<5`<%fru+AVDG2Je5y^WRDhl*|qh zqtD;o2fQBwq|6RIqfbZg!zIW<%TGV525%K03;I7sEbo0#|AH{|+WqmTz05a3;Mwzs ze*c5}H$ne{?Dz1)HwI(Y-M4-G!i(^Z!Yq0l{p_mn*usM*X722X7m>8$+l5&OXD~!F zVj(8no%4g{m%gD1sLbJSCw?8^$M@aa-L-#nyN3rtDiARcOU8W%eQ`rq_!5doTixu4 zWaXV33u3#}(5PVH;vrq^HB;A3o|5T7#@Ocq=<&BGtYtYnX*o=sae7oc0i>)q+`-=N z>-cqZ=O}iybFCe+?3=Rjkcj49i}74bg0Q+{EYl}R7TBElu;oH32r3AXv|=chPS0_L zIY+unOG6|BgV|XLvJO7;=&`jf3Rvz{6~5at zho54cEcx(xoJ9O#cNMt9(W~h13v)>>T@q2Os66$ZOAXgKfeR`-1E_l<2QhR__n zdcwij<8(e`^<4%Y8Ua4l5Bo88!dwJs|G8B7#?lVmhmK$>maqoF-qM;tt0raqUOIA? zJrr6XM`6=Vap*(qq@PHJ0Qt51=b} zQgc)TopT*3O&$0-A<0lrl*!Emz`tRsKsEtlS}h~lN5Ipd^p6z-f-JFScjY9lRc;WH zmBNSRm5X~w23CB1)z^!SdN@lkc4xdTK5xjPC+V6|288(Uf4uRcjh=(Hi^p*yOZ*5_ zj!&NZz?8QiD%mebN4f`BaZROnN5|}%>>CB+7+tnzEILd6R(8pfreSCWQqr05+RSV( z%+B>RDkTMtCMrXe+M051a?K3NOtWDeuG5y?*W-WGd)TgDt?9k;x}DZarz89KE60&k zU5^eXPJjI!OSEJ|=;mxaJMW_a_?*T7@OU@x&y$aEB#-v~@Pv1n%Mf(N#B3q?VI2-R zj&gs=>k`|Lp1%g z64Evzt5eb9huKNZF6zS6|j`<$S;WN2??~4$WPq(-Sm(f;2aK(684~1 zeHZPA*SNILPg6Pv{|M>5!Sp?cNQHoL&?BZH#QEu@W6T-XX-8d)i$+)SZ45xq5&p*T zOH{J@k$P55>l4>=8@z>plmPdoTReTysNJ7%lA*LKC7Edtb#E`taZM@?&J~MrnqVb! zE2-b%eUnP1HV#~PPbOrN%;IDFv16!Ga-~CRuCmacjHb%avTMUqeWO!8 zLF6VPV^c&dusJf4=^2fzmZtHEsAN)Raf1~7pLAK^F zXDmg+mZ#?rFHYH(%P9Zsx7pJXGk%37i8hZDM<-8e!zZSgzB9vx+b@N<7C#vZjB~zJtm= zL7_fD?XOZ0mBbaBGFC86#lg$-ob5j&N2*zgD7qS%DlSZK@kE4s%#{B6wc{-tZY0-b zwFJXZTA}A*Xi~>>$gWkX)_|R2cqj9SeX&f+wv_zOt)y)pPVbAdq9^l@&rp3EfP` zuywMkdKYc=vI=DTQH{&C6|Wkvn9J?Rs^zMGfI_>eRl}|7?)YxL1D|ufN1AiPM~C5< zWr9V51;FGehbGSEVuFwd1rZ+!$&^W$a|W)ZT+4t2TFacBwA%*5L~VI`dR%g{rE-Gp zC42vO$pCUuO^6LEN!mQD{F@iyvZG=>S)zeT)#Q}}W)!)xR^kVpN&R|gRCP;`jiS~j z2U(zr$k_@}1bV$p6K);j1j%~vmXWTsB;Pjcu9PaoBDr0Kl>(d^#81c*dh~EeDqA5%Jou8gnoBH9h$7F_%S6jm%&=s{BVNn2@1&*3 zt{;j1KI)ugx(7F(mZ9QH@IEE^Lz7WV@V%coz8N9#p5EDLE)`uOar<6Xy}wa(@7w<8 zk*j`(0nO|F1es-u`wMu7$rNPX{EpOw&~NU+)!%5ynUUfEymGoV?;(5f-I=}EZt|7* zaUydj0$J=JJaa-CpzI`n_EtF}{ak!CwU&WHp(=WI;bnZ2SV;-O4G1WFpR*fu6Q( zCS8L)gSB{atSw<(rBsz=EVJ^s{HeUU+*NgWaepzs%%D6zJt;0ji4==+!of_2N;m5< zqtd4+Tn()}U2927TeD%)#zHMUf`Q4U(5-cYg}Z^s^k-Rj+ir1OG=j+i61Yz7q=Z^6Cz9cWWGFB5510%f7= zJaCv~CYE_~k`QsaNFk*s$>9tKDcM}wE0h{di5W{)T27f3om$d#qZO}}Pj3A`tUK^d z3nKbf5dVf4aFD*SU;cvs2~2_u%wM=K5^6WW+8)35{IFr2&h_{SBb~WgUVy(2*f|Ju zS2ZmUEG{Y!E6gvC^3wB}^{Z(DDa)=B&ULN0s&`M(IsWO-!gJ z9AhZShMWwkKF-pLMkx)Cih=~;zytgZ<^4`{?;A*DCr0m%ChEM`#xCJ{_RgPWAA36FG0 znZIS7aV1Ef4eqpTzxF1L0QPdUJvT1R1$u117NlxSXrhKkv{eLUNl|CoNQuzP9SeCuJr^vS1hL8r{e4E6xPb4TvEr-9V;Zf@+ zx>>Gw4aKyvqYLPI=WcS+6m88`SF%>Kx?;5_vJJD5D<_X+T}?gw*#xec!BkS^UN~*i z;3aQS+$%mf!X1(>8`)KxSK%Pzk623A3xD+gjamxUNGP=f?RkIyYcac%f6IrHj&93h z-GUXHU5$nY4O&#Sm{KO}Urul_v~CKj-6VnsbU3tykoG^ZDLkiZcb4aevZKqR^Knfs z6~oMOMmbf?lJv6~sa?+oP!^gbmIi!Ep4y~JWQa;ZLPXx_u=NL@h2FX1z>yvVRyH`$ zA$p-tExzeIcLhQFpMZYj5qk~2=wFlPi$N&-HJe>MhF6b{4h|dQH-;)9D~o_=t%9{W zFDBsyq-dJkLKjOhNhY|EAj-=pyejE6DOYZ+h8(z_$IybA(NbunB3d?;GQ|<7*Ud+Z zrhO8wgx-*^Y?gR9aok~9A9v__oQU<|8$sr{KH0}-b#*$!jgFC{nb5IcQWGBWE1iYS zTCC2b<#<(E+6iOy;l)tj@WjB*I-SA2)=Vy1nTGqmyf4bP1l!7VqIzuf5uy9fo=Qj3 zHPi4p!9>a!1~IT*Csn2Cp>9|Vb<7Z7u~bU@M3SmW6Y&!ERGYz*PT&~Yp?#wQW0GZM zYH;c#d7<;WL>2wYyzm+87W$!mpF+i$aegtB<-NA?M)Oeu1bM{-$j*IlnX(L&yQ} z1MrU2I`D1*Id}8*q_)f89yw)tcfO=1x@Vu~cgt&2EG4JK{>=+1fa!GV z=6*jHm$cJ5Ob7IVK8U0&PTX?rlim2c-RqoAJ)d>XeOILq*B|GeapuBc@3S_sh!NWd zGvpZU+qX*mmaTK)_T-$DZ0*a8{Q~|RqnQa;&WpuTOq96tV)T*_r48kyMW|r!(CJEg zaUv)*G3c|v;LqR=7)?Wdq=d-OSCK(dk~Fo5R1@^R#!yK!&)i%_Df-L%=0LaEBU4i&Qv=AGg?cg01)Za)kG8NwKiOu(1-JFSr@vNYJpbIDY!JAPEp#ApWfUVj^Z{V7?x|v<=_H76>DLtlq zKctHI%Z&=7I%wCW#n=7EU4Uvo<1R>KNg8+fWqbrz#HLiY?$XWD)21U!pY&t4DZS=` zAxywC+GCCVL~UiE4Cy*1{6k}Wc+vcj0!|z4)$!;3kMa1ylQ`~O*SOaC`rr=dveyyW z)9bX{*$YZ>>n&jB5X|^TBjW(52HT4;ss=jc2>ia;NFM#XF}=?Wpen zB-u);^^EK2jn%f1eS>?8dNf|sZ_8SbCQk8kl9@i-@HCD&TP8{oCNJ7V9LWT)k0A{G zMlv<_FqU+lMA)=e!=?(miXjU(ZQg0v7K-v3=r!DMAr@+>;(_c7hgH)+fBV%5JUQRt zCygp}m{KFg&qLDbnFu_h5v>uVzlWSUHVA7a>m*MkZki1o8ylCpZe#dG`g~=c*AI8P zUb_~`%Hu!rPSydc0Is}G)yc58-~HGrPa5>=ahR9(>7XRjBcqZ^FnJ|=1(SKG4Vk7Y zZ%~S=oWNJ9iWNJ7I;ph#d8}}}b(3^@Ys0vT*Wdi-;}0i+BZWoSep)lbUVIo;&dji_ zKl!UJt8n2$MEw2gv6)UaTL!fhJWzYZ=?PiN^xuY^J>G)`(Ex>UMP>3#$@^&nU5S2D z6%|zmiqV7*v+GeX0bRN+Zi=;ogil{(L$xum5qKtTb0IHJ-aKE0Pl`{%4eA{bi2Bjz z61i+XEGHEKY$Yz<(J?58Ax8%XGLgp_c4u74(0?QB&dHDtFA}?VX7o9+yH3CJiwh~= zNlm2T(hbJ)sJ3y6!!=OK1z=%svWTemyKW70^?k}HYZLT|qkeA9C!oY+CCA)u zczNwZXwBdEq!=^cSaelX;qti!Y>sb(O24L*Gm~OtFHZyqUBTZxElw0Xc|0Ax&2+2H z5_WL1S#1=%A0(XIs@g0Qle+?RiFIexBoP|m#Exi#Rj?AAC)p&i#$4&mK}cJEm8WD@ zj!DFHsufQ;rF2S~-Kj&t_a-I9=BAgVZ%kQFDW!N;aT%F0R+vrc*hHtkPjyU%bCo{} zpwV)0yyw^>N}J|duHEgLJaV=S9LP=>R~+40Wi%-1I3pvbXXMv;kZBuZVM|6i7ZDAi z<;0r({1+yEXGKc3ofYB|s2%7b%uFb#?Dvm(9#s%U6Cb|g{UUd}bgr!}ikiG-wLf*= z7^b8Z(R<$r{O@mVSTN_0BK8d^jYIX<(bRKa=lhJFF2{kz$A-#u8oHU^@z7EX<-E^d z?g@I|o-1KK(+g%-ameItLIG3Jl#Dw(@&o|-P8Sfwv&}CW^%_jZdf~! z#^1hdq44UFc%61(nwbLCYRx1RdE_AsMP6#*OG*_tlO)>TSKvW}>_miQRzZMdvaqzo z#P8RBi*$X;VeEDGL|Y~R8LmLw^W7ex`c1{qEH}OPR7{zUq=5dJUkR^vnp%#1&`9OtIdqLL~1%X^(pEyk4d}{}*N`U!9Pka8Y|-PD-LmI^9&$ z$Y&0)OSy1;*7|_0xW1A>9bLx?oS%Iel-wRUZiB-6eaKQkw4!6-5?2(H6vG04#GanH zX+k_S+$5@Lt!=bvXI#!;Y|Yw?MKla58hGmvsnZX)S*`9vUbos`b40JM9BFDGMm^YX zWmul2Zdx`~ij!V7kxZB4<%N+`K9QabzT{tQ^3!J%U42@HvUXEdV^MiywPR5>z5l1r z!m+v1Lj7UV2kI};*x`Co#f{drAA+a#^gY*zp6+QiI9hopz`VbDCW588^VpQ7%y-~? zDRg+7O!hN4k!?m6LUpa`)U>Ef;p(G?<&6~-NfhZ-^Ob9qL%c8pda3ZC16MQ=NOlcG z<=E@T{gG3WOTj}fp9(jHeouiZkVv$(we%-qXGlpW!V|h z1D?j8A1Y4OR5z^19Bt+ew24KVPd2@9?)pbgi_ZCMNY)x%vfz^Pwg*zdoH&_!x;yL#igIo>XFh4 zK)>&`*YLfulCm#Qg4TwyBmYf-;4tDW2a*B}?O3t8wA&0O#nHm6$Wiu|_Obeb(e6kQ zkr^wDV6f=#HQx{lIwPC}dHMDqNajmxMZTy$QT$pa(IqrpXt2c}J)PL>{sg8p@kT*v z^3`TeLId)-#iXc^Mas(PrXjFkAubT(FyPE~#R-EM&)($G$INNxnXk7}1w{0F!^%k16W7+v~j;*r6_9!9WWyivEK%Vc5{CK;3JaxQ3MveJ1RN%xUxV=|r6p*bqDRHkQ!Q}gPSc;3j`FkFU;k$ID65$4W3^U246R?Xy`CFlSfnq7zynrQ#(6%QY(~1 zmtmKeQQKuCMJ+X}gNY|vZi4i6w^IeK9c)xhG*wkC?MW?OUAmJEr!0T%eqq>>n`Y2! zF~V!zX6_>DMfDTdM#*N-+ipxs3~kD{^`VG8(y=);9Aw5NW#~Hai-U`*MsX3aTm>N? z2X$&&YENmf2v&>kA+dx6fpIpNDl*d9%!hj=w$|C_Nsu8+N1XY>6xpvyIA~85`il_HZK%Gg(fCGBS}zJmIrKiQVD6Hft`4r7Ztdx>}|mb4OWA zOJ{!LcBNvIa7>sv1MEQhv&RAQd4vLWzD|;*q&>$r(Gl%c97!rA*U+y6eVs2cBLE1_ zh)S`$or=p!MaTJEP5GHxQ+q{))Y4gU`%;1w>M5fSA2Jn`Yh_#vI0G>OE+IwgAi*#+ zQ@D}-uM3?Zl!eX4B!*DXvOYL+ zdBx#kBq|^pd>Fm`4H6YbG$?N6{^Uix%*WVmRw=US$ohU@Pz3(W6SWk9BI@npX!+M+ zn<}IR@Zt|w6F5x&X0g)~4^FIVgdm)tX4vT})*9w~2r4)`igM>~jT9189Ty+OYVBlI zD6(o_&%v5(-?sHIY$+1`%1T7#ZR(p-pT^`hKoi2%k@Gyqj;>_0XfF)mbSZ$%73Ddh zjx6z~E{1vTH(C1!GmbA-oNBrSAMkoW87}53(etYE(udw-1YiT;Op69@^LL|x3tchY z$4;VmTe;pAK%C2yk@Duk-cF&p#4ZIa7ChPLX>OESqR&hJ6t&*F-_24hLkjP`Yj^6gUhIJ*ZU7Y#c^jQcm&p-pMWfIf;IMF=bUn>1Oh zW2jaV1qR2rIWx5AGvqcd)o`7*TYv!o}Lj$rH8nZsgU?DaEUK_aHyndvgZ<1uAd(miv^+W|j}!zBzk0%ND1mCZTE; z?nvq+Cr#U(8&*1-Ytfn%Ingj4Bs+PVKDTc>144*LRjghj?%Oi)gIfPm%i)>rP(VOW zf-wzr_R32~{+*UlZ&L2&GK$vRUk(zH(Hf~zLWQE9BcztzA*%DS>iilTU^ku}RQEgK zqU8Fm2?iR|0P@|uX(B@MjY5cIU*hDRinnUvwM$>g35jDlOq?vcdLBf~oQ8C#{vE1a z3O2zVR15};Hg;4L)Wxf#ZqKZzVZu`f>sPcY%QC>VfA`7vW%3E=K|T1~{26)*Kil@!_*GW|7=-yOd73!Lc`8B*qnJHQF;6CHI@7c>G zGQ^YgCoADnD0g^vqToa2S;m-n@3jQG`g~vZU;YDkLpA;ac{?F0g(0{CQD{5SA-E7U zxSi7Mg`HX;fHSDdyTj(7eZ}cC`p2{y80n@EZoWWbWX|Nvx z522X5raP*|POOaZ$?J@ORSAKVfRtIsf0!ktrTdE%<8nIit&9MBP^O=RwR=#qYeX=k zEe$O>l-rHK#S^%eO!&f<>}h!|yH1lCC;VFONZX}I+tbL9^+(T7nAuUvT>hZSZi?KUSMgYkbZ!@V>s2FPM5hH?Ku{+_!RSd_3@BhkUd)L_IRu zV5Ih88LDgfP0J$eI*08Fecv_M4wCBNoEE_h<)M%0q~TSEd|Br=qEQEL5vXN}B3i|Q zK9?K1>roR_<%+C=phiCHgRSuN)u7^_g%Yf&lrZT100P3!jQd&Jv zObp8;A=Zjq%8@D@!Ycaab9&LO+N)?vA7{lLhd-&zXI7!3`FzG8r6J>@VPa;1vOlPj z@}S{?{ag^E1W0_XeY0rYxB z0OQY52+x(PvgpU_>ypi;+Wt5ZDfn|$P47Y~>mn4UUy~QIOmM7-^*Y35_3S_9(h!+B z$yA_J-WfL?V$hF^+Y+(IfSP3eG=D=gW*_G+gp*UJ1>;Z}O6nWPA>(lH1nWtk7Ufr) zs>})fM0_;8hUAEZ$er}jwK{dn76gV*=)j=6M6;^TYLP0>YKP%ZYGdh)R2pp75qN^` zn@KYuU1tQ>`TS61_;4s&PV{)X_y$K*;JDl^OL4w#4`k*`MSj^M6_hxngEt7}TQbl= zM$RoC3(!X(HjSbFZ0bKU;^K2ZKPdR~)oPQg9?i9p;_NaDD>kI9$)L}N^;VJbq~kVF zb(Os>neAMx%lXm`^u6Ef-w!PioSDyPS(*>|Y2*dqy#pF`NuJ!y^KB<$tvdmK7WFI5a_B|_O*V=)VeXzPR_-gDVQs8<+k*7;Zhj`>(? zHs7C0QuEU-LMYGLid?EAbA;U|>F1B*y+1t4HOm<`&NX#z5!FYgZmxE9&yWS{>K@FV zQqQ{YxVOOd_l9R@K5|*h(1pacfv16Wz`7n1Z;3Yruw_&%omv)(F2R%SbYFuQ|0HbNqlO{zj$SHKh43j@GjzJMz z49pV-F=iw%E=Gy-A0c3XFWHq47lhCO|8U8Zi;58qzZTUC`(%|A6p!M`n^`ODPg2=H)PL^M|YBoPJ7ZDcIa#_O1;&fa)6ur&_7nj!pg5W zp}wab@iYf(3hpdE)^sv){6y7g-IThT26Pk)e@2qnjj-{60`ZZ{`LSw-PRyevQl{N> z_QSnJaiduou0}%S-!pIf^<&%twg$r zCR7}=xwdfjM?fq4yBRm8g^kVC<}MnCb8CP`;k5xm0~i**#ZZnv5`-a?=h+GNSCBt@ z;6DUoKxsgMXqt4(BP%cq<(R+7;nvV8_>pwe(^(L$Tv){(O6>(qq+`q8j%^YjdC2FM zh+|=K1!evSqW5-7Q5cP&D7R5V47RryT>?Zi+{qI-`zYkgu>jZM|8K^aku!5S_8e?h z1o)4)LT}#tt@ZIBv`ac7hK`Gck7EhGUXF&DWX8;;mvYz25((e#L0Vd&E{#H)Vb-wU z?3y$(8)m(>f<5;n*dtD+scVe&{DM6PXU%G)>({TAhhrx;u|sn?JNB2W^W+N|9m->v zqsFMQK63XvGCmDG#$T+Wl^e;;SM+~gy?8@_gBv-2)#ev^o@i$N@R7&`@SX`(SdUj4 zWR$ms2_PX>w0|%1;^t8p{FkPxC;aJt5ciatbPsb;6vh;5Pkn*Bt$<(NqTqt7G8NB7 zyO$QJtj=&TR(~+_#<EB0fz?W1tjk zR5XiSa@1rB&1I5$ggZG+g|L$q7$3Sy&l^fvhQ}S&PjD3xUX#by_0j~74E=G(6LS)o z#;lQ9EVlB=TMlUVBwodSQMeJyYx~H&<#VDt^i}o9^5A*)_?$wbW0Rbk5A}pkis>^N zWN_rOW+r`!j3S$-O#cV#q5#TS zNsAlj>}da@%EcW`{_3P7D(gt*_?y;qrbb9DM@T-~y_&){p=$E+P;fILvfJ{tLz@?E z3c_8yew^582RWO*^v}J+3YaMha$0Sjo3qySX;!*(>sq{3Bi$#dx$%?ygAyi1Rwy89 zA{hB^j9C#qBv%NS1BGh9e!bmX51KDsmr7x}kv+6D$YSYqFNR@A=57x#jvTfe z@ABj8rnFoxM+g`>b7v)B|1L?J4jta$P$sn>ERA-t%ds^bJ0U?|i zHham1qbyX9IvIZPp{Tf6jI^%2gfD3*#S4cHi z$@ZwHwms+oB}K4M3o{o~|UbYx@-tt#r# zdci(b7Ij36f=sj#4Mj-GoXVrH)hk@(Pm8RGh*T4>CDOm6Fi_}SR3I&)_@C@-P(W#k zoj1Rqo;pLh`^KG1Jy{;tuS{zNBNQ!G&whUOPn z==L&ZhAkOD3>vyAyRm*zd`U6z{mcCtU4T;paclt_DZ`Bce)t$TyvL3CZzy=kzyVj% z;g^2)>PlpO*Qi#S;Pm(_m@^TBxWV=>AjpE@D${##^Cf2tsqUbwR^$=!@>LbdT zVl}Vd!edL|; zPadyO^=vYi4AO1; zb`w>H73_YL$6Qw~;tU_1xQZWTieV)R+;0{Kx=h%morZeW)Xdy1`;J_$XW)jWdUa|} zZ5bAH@^XyWHTRO_c7rGb*Ek7w_kZCvFb0o)xkL+IGfUqy!&^x)4j?;Q7qkN+dyx;8 z@2+c;#q{H|y;XNZ(;CeTG@z_9MzGcj1q3+E=-65gMoNIX0K z#U%8WJc+th!myh)+A)14jb$3cu*=CgWj*UoG}O2w$~O6PKwia*hal$oFK-2rFA12e z0C_JIJE)!?vhZ6mLB)3zSZrWqV9@#H?~8J(@KIR{+#((>o!8e5R~unE{!+Hy>EV8X z9<@kK?a<>d9fo-1!opky5CY&j1ZFJGA<`C=AUvnHe#>O?E~NNqAfT^I^;13ew!VmzRf=Uig4+pE!DXWEb~rZG5>OSuX&)jXU>b z@brt3hCJdsmfXaep8;N%%r}7$^8hTAwZ8CwHW_D1?5usY)@sS%n0S5j9>fF)>baKJPObs;cgX`7h9)&kc7no4AKvlx5Aydb|TG9kb>y-R3;`qK()a zLnb6T(^T!{Rzj5naAPrwYN3rbld7(uEedO;wo6xr-Gki2pJJDh;c3-1fi(X!~W;o&$w%YQ*|`1!3QT`MBR48EDYvS-2;M*KRY#QiO;P)KUvUex#36(WE*a zc3~s8akC9%9qS%=Z4$8hN9i~NlgLud(sJmDox)TQ%+d5gPW*JTd8kH#)SPxK!4phN zoRry6i$A$0kgQ>Ro;z2;OFBC3gk*Lrxafl38z9S7=96QX!j1ic&AS5^aCwudTynuSM~3?C5>MW(`pCu z#J21WLgxl#1ra)pb*S2pd#uAT?HwUJZsi% zB~$yeW-RG&|4akV;{6VZarBAqT=3AyP6MpEHNRD`YX1Dy8n~BOnp-W=w6`T7cM=^t2 zH;(kFz}2IxP7(EHo9{@%sw((kxK%hT^NXo?xY_USr?QQK!{?cxQ++gutCONurWj~3V+~E1+FS*b&Y!6*ZF5*654O$E z$1|90v(^Nv7*YpDoE?4DmQ`O4Z?DG$)HDNAbfF1iYmZ%FELNK!N^k}wb9}WkYvNf* zB4G)RTNM#76t(F=obMdS$Ca})NmFMuLzE(Zq_DW8nRjl`$X(Qr57FO%gI+1|xP6<_ zTTgMLy-LR@CY%F{o=}c?&}{t7YO|s?-z&ArReJ6g5*!0sZ#qLxde4TYhd<|f$)8i| zZ|;^;^zQw+^JCH$w|cv5v9KdTg$8jB3~1rBpYYu*xuJ7lFFQIbJ~GxiULnNI%K?z_ zNI&9w2<7}({&hq&K|p8D>*adzGb)wiyHt=-BUx!4SRD(ZGdrHg(F-|EC1qpEOpz`sd zilS2E8A&1=_L2x>vDb&T8RfUIsgZuI^s<}?@@o1gIp*o@lFN&(#L<>0%C>PI zIRB_s6c7^F?1N-KrtG&9P3z1xSZU0@i63su!>}lmM zUWHovjE2mLSd$hqUQ>pQ90U8X@JI}@gf!9ZnGzQ?CS9yt_HT}l7|vKikjS@9Ow6hb zcXc6AwxpFG#@6dC8$Bv18WlEcNu@Mj2yC#uB3se7Ojm(o(QnxM5rpA~rC*3!W?9M< zs_}FHW~B~(cc|^7R8;1aE_eAVYx+$KKJB`Ur{k`rS-H!?73@W%xh`dK@AundtQX07 z(^!-nVuGQa)e)5P@mWGBhxP0LVZa;r=b1@~hDF4^%+w2-J-#9Lk964+*VxsXu*;O0h$eTeTPs|I zY=^4L%Uv!El48R~VDTbfmZo9^p!2gZzrJFm*{O^C#JL=I?_+TO86TN414(}PoMHx6 zvab1g_?l~UBCr{NoE8wHn_zT;w0?ca#7#vr&8})U7@wLtuopOlJ&}Yx5zVRcFi%1j!>f~W zb5%le{N--G0G;vXv}Lvg4QBjPmf}IlL=ZOd$D>Ee2Hj6zibUcG6z)SFog+@AZNN`U z94K={IRooT&w!qASc$hh+6?crjk!$wX`wysxwlplzEi? z6=3D64o&N4>^x5a-fP{~Y?NpjI6tiSWz(AkC<%WfC>x-R`s~c``0)yb30wYnSWzWk zp_*zF9T38#yKs=){LJQ=@gKay^K174H=j_Gbu#4gzQL*_zmJXsKBNA=q8oXF`)Im0 z;OndBO;f;#ZX(k3pPF#5(y#Fcb>ykj=uYfP?2rQHx_a(S&jTj~u5vwcp5h0AMFpD* zk1#th7spLAYiPYipT4)p>dAGNif(Mb>csL0*$S0yItai;)mW-pG9sPboJcl?;lsA3 z7+qV26|t4-J6Mv8Fi2NiMWi!P=GN*x*o5}r%NqJ}%p(!vkLA?@9WS&2veJ}p{fL`)dqA1ZZFcgH~ z;EhtOV6`$SkgeteLgIY}MSQ{TURS)2RD_tfVegk%t)mv zQeE-8aTx<7S{NU?i1U04VvwV)@)@@nse5H{#5-aX0*QzNC`mtmdG0XYV9ZAWJv;gx zv}b7flVC71ZTxCb0{-7CZ6rv^X0tZ6qJgz+ClF)-#_|<|ShraYjJV|YF8ut0(L-N- zSdG;^oE(lWpB~IQ-j)ZJPT!y&$8%kM#UZ!(PBACUBp9znV(?QGmuY90AP6k_5k+zl2+8j8TIo* zdIQEZDog(Mkp6S0fSec5I6NYqU@QW$wB+Yey|2FFn$gr9^n-TK)}i~{xGHet4S29p z{`di+Lzt!dKRyBW{|mC=e?%ctcDFadr;{_ZRC2a~rjx~Iq5ltS zWy^xR&hHMU3&>UL=4sZ_2dE^C$##}fwrC_vT21ybN-j)i=0YCi?4 zcvO@@7dwlC3ithk*Zn^4eBZe!vi50Qs0#QBr{?Q$61;#hS?fH3@ila{GbCl!ND@2& zm$rS8kUin^l1GIt^x?8%Sj4vmV$wspJf|=XAZVTd^Y!w4g)WBH7ME8hGUdzrBSme+ zEv09BQWxk5jIGhdmbofUL1^gMJAA$PvgP$|=SHd#zulj}v$d@;>)A%TraOS_A@rp^ zh>7@Wd#T#v^HIV6x|=9DMOet$-sZ-JQte5Af4M!}u%nv>0L^Ysj{pmM8K+AcJ%nd~z5VYb=(Vl2k;QOm$J%2`#i`Ei+r`60R9reD2gseu zZ$Y_(cj0c$*ZjMNj~G@*t!_(OJx9GMNQ05P4yOBZ%LP&Inpl)(V3}9Si0WDDA17+N z$>TQNqVvVkTn^9mnkqay(-yK6g!w5l-vlK=M1uXWyJqVz{!!o2FJrM8vz4vTkJyj9 z{gj+fmM#x_**LvF7<)lXM&?`SppAwmezhawMCc4zi&^@`3-?c(T(aHe^PExYX5UR6 ziU*o_M9+<%Qk4p7;EiccTP~Lz&R+h(eGIO9Ts)c?8n^DZUQqoJ?Mb*kNBZ*zOt4$s zLf1*hUuP3;xeN;AQ0&X|F|90Rk!*UBYu~|roX_RZ+wQT#hGb-|!p0g@E7Nx|wVQ!g z{j7#Zc7mwS6=Sr%E_Xy~b(LM~Dkpi(K+76drRRZNiRo$G&TQDNu5PhrJ<;28gk~{s zy&X9CGPTlGe`(0~J4fo)t$md*2MgyZ0$+70NcYYLeWj|7fHUVpuuo2go9Z>6dE+D6 zyUBI8bgC7`(s`U@D@wuW*ewM|2$+0dq9fIMJh5JlXRB+O1H(j?;?>vnauyN1JWY~* zQ<5-8Y7EKrwdkgRG5s{TN<6|6M_}D~&O-5<&z6_;Fd|r+Cuh}z_3XgKRPWDwn+|bj z)7xc2PD`~~T4ww|we`n<^~aL!-e$|W6_=4F_~U0(6_xwKc#D#OfLMt!1&F2yBwodc8ja`W=gq{r!==EmrAVaGM*H0t@o zxMr3X)}Q_T`+>w$yI6M)vohEoUM_&b0DXi5az|-X5Qi>%^Xv4RG()teP@`-|a)q}? zRmEgoOq*h6uEt_@i>8m^RF+)_E7{Y>Fpiu}b-~jI`HO6HtPh{ms*#g1PPVVhD$`8x zGM!U4wAUmEmt}|OjGVU3Ra(utwTc~%{ib5hrH5YDU!yDMU&qo{9~F*H`i2^>)(*5g zF9qkB`qPR!?jaDzsIoCBO0OYrE_gUjw=oR)x}UDDA&k~oI3+@tGh=k7A?ehu zElQ;&Aa+n9=h5_{jEiX`MO3 z98t?ZJ?ZfE=3TCydZA{|zF%r;Q_H~hIN~-~DJAgMw7@z$ztLMQwgYf(n7py&n6bh? z@(}b_qg`>9M$b&Yjzmd!HLJMBB&zVtdHtTO3uK6BxjOj1uR5+aS_Lxe16|+qA#T9= z+m?$g@E`lkPy$bECg54V3a><;s8#{Mi6*raBdUC^XrpjWSn86u9IT0EsUsKZ@2Ycd z$++*YxkAo<%5j@{bqqg!+&t}=xWs+#QzEa{SNC{UmwrC(cTVV-GVJRYV>S_}A5S(# zm~q#Q_2-zb#42a<`mB@6A=~KIW;J_Z_o&nCn48woYJ%0uzcsds58;kq?_>fQ=4c(h z%a?}8j{aAEMU>Z(Q*IH!>Bk$NTR?Xdv|hEOWC(TqOs#29F-|H#{odQ?TP(GJ5+Do69w z#D9i*jcz-Oa;Bhh|FbjCog86zgZ>wmyVw^7?7xOscj{PYG2Z@gL*Q}=N5w{uSbp=P zDvua%R*|&)zSVc?SlpvrPGEsh-|{$w!z05+GG3L>!$z?z*D0?)`@AFv-Uqf-n(DAgc5H7d%FI~@>KR>g{oGyHQV?C_2D{V4v zwd^~mt90HRZ9Gog$9)6s%y|rXpHnR=mIK_U!s8FqX-KSAB)Tet6g2V4@pTkGj+57mA8f7?iue>9Z86VZL2^Rp=@n|LMEQzN` z*Y}g1Nw1T-N>=oV^+r8UY$B^$CrmNhcfK0;Mo{n7-HIYJF}~&|OFRcTo6VA|d%2-5 zlc>c`_eO`d85gnMF9yE%C$W{Vy2rACCxHvM($B&RQ{2#e+a$hc$(tWn1%$1!XTNo& zDm^wMc@I1Q^P9s>!rD^KRt3>|+EN#N*VNxO&>#mFfTS&V5!aE>(re}g;H@jSIsC{= zvf$fx?(3auQgANSv4h*3IwE(NzAL+YbKL7in?39`g%IUzFUmQJ>9>wzsaC2(Q`1zc zljj<|zU1>I8}5adQ?GjqM+=(bKe5+lMfJ?0WRKB$k!G)9 z*xC2Z8yPkEYl_;()DXlb+P`uA3Nteal5!O+r4c$ko3o>6Ptoe^P@`p84Le%Xx)RNu z?YZSR;) zw|f^IH{RGG|NcSode%;zbeL$@R!tbX_qRu2NwwZ^;AJH>x~+pq^dIXr1|IxptzRz= zu!#!z&lY2XSv|Vee+FZd#)Nrs705up1sU5cGo+UxzTMOR5*jcrd--1nDE+U)gnE7c zNrjbeo?yqrN>sV6+r~=dS>Dt;e2?~kb>wsOHI>;ky+ZSsJ@EOa&#O(o5Woz<^L{5@ z8(y0)R$C90GvPDQH@O{ulJYLMqAp~?IMA4GN{94_2;Q`a|L=!?z6PX0qCYiA{kMUZ ziYyIHI>lsRSg8nz=+mvJ#OZ&|1vp3Z!;c8nV1R8dytf>aqtuy^kbug`o(q7Z!V80?YTp=Jz@%r zyZa8~w^dTlyNR;)xM68S{BH|(JV$SZ)qdJ+tNixJ-v-=k65mawyY|rS@hxqw=D;gT zYjk@H@y)>{NwIn7Bt84KXnEAuO1_jwebjFmSnVSRji{QZF_Y1+(h2-8qAxq5FSYNl z$@iPS{(j00vEP09+m=xYz0GvT)s(bvemFAAQWcFO5=Xe%v~E$skPEM&Gj z@&ERqe~*5*I@4*7j~&f$gQNsVxuJaD);uTgcBz!R_xcF1zf>xZHu$4QjUlLJXJsM=Z0&{{T~ zB8tBU+-SRRbspSBPlV@V{Po({rSj#8YTWm7@z%X{Qp=$A7RYdi>#tUz@;+NIZFS6IU*-H0H3i@q z5kRb0T)CJ^X%vz}pWx^=ZjRP;vrI6a+)QmdXK!Nj@c_y`I#f!xz@I;cuYoq`m2Bx? z|JCObn<_2a^tUQ$b$x@h3hjItUK=aH{R(Y%t~`}mLA`X4g7wqHv-Bn!18CJehVujD z;i+Vztl%5&^6Ntu-^Stff~=M~A9*F~StJ&Ly~Mlk z|EzV8jO&mck&(GI=RW$DLzRDp77q@8HDgFP%N8`S3G`+W*g|mWsaj|HidIbh(`+DC z{?*4>VkmjYYy+eBVoKxL{;=+(*mdR6etdzr5Pvc-Z&xoYJ-tHL{rNWZUw?CbzDzW+ zy<0!r-}X-4zwsOT|gFSM|$# zWWo1X_v?%OEB#Vcj{!K9_-)tb9(aqEioz*P+53sL>w9i2_n%;U&n2|uh4YLFwgy0< zA>o&ab|{MdAK!Kmv<|jCDF_Nz*b5{C_;*x2U&dc`Bc7xV^Vg-M8229 z!%-)@2Vcj#*X!724t53bXv6K#(%Y8r>DO28Q)UlUtFpbeILbox(Xf9x+g&XkAJ0jw zWeM`_(Vb8EySsDc*XzL0)bT0s{j>%!!>hOL^YYh+V9V8$rK7tIsL_6>x$bp;^N!c! z?cmJV)sw!htGCTt`t&@H*0|WMwAGUee0&mZP9M)|0t{KJNzND0QKDZZCH9Cnfn)!$6LNw)dxX+>&gI=g+3{^gg zTlXrTDj8-rmkC^ECYP`P1begnN+|+b(@>Q0Y-1{DQb}5gj$N7=@ToQHm~1Rn`#!N- z$yiKLXl7Q|=y1`Jp_w<=%mxkGx46~9&c;=UfmAZcEP8 z#{ElSmF&{di{F7>n$M3E=MQD-D<#y76T)&i9`}(Vcl9U7N=Jt#sA)V)aU?NG-rnO} z-kNY2y(BrJrW#9hVhnaZb>cDQZ-?YZhvcTF2$8}*EXGAfT}nwO&Ne)QP2G&BY1WT% zFJ@h2T1z(Gq;#U7fnuauTXYokcJ;TT##V16;8!xNwxn3Gg=wav>bKiY)mP3oO#jiu zO>>elou+}g$XZLcJ!gtE<)$Z0t2$+yYGV`nYwXjKhOsB?o)(=kHcTYF0*_hot$OKf z!}TB4-)T-Z|D_rmzh%7*&zbi?DCBI`pOEVQ`GsVmzxF={6gmFi1By)lS3r@Co%O%P z6SGp~tdIo|hpyi#&Pq#8%RiM=5FI7B!-NBFNwcL91^&d7zg&7}tdZcHxVF1#lp44m zEuEiz%B)zULjNPOD9#LPP@E7JwDLXlMlL7`(OhJh3`l_W{v0#OdY zOp=~NqzzU#Bo%j*4in7;bK|HV62uIHp`svakAtq;GmIWA4x4o<3>AR-EeZn_1jQE) znIA9QDo-Y%y#x81H%fwWP?{bac8V~(Ka&J05Fs$zs4~O>;-wdokV(`y40kM(&<7tO ztaS|I(Ox(&)c_)8FadN|d6E1e%^rjBLE9b=y5;#?G+cqnO*qUEGU&E|)1N|wJS*!m zIo8*Ad(QFx<@`Bigbi@*bCHatN!tTlqgnZfq4Z$T(pez)p4QLcy-j0Bce(@|xYSwo zWiMRmxWC^j{->;XDgjMmPIdG})$QA=H^Y58Y_@gGRZVMu_C|%1psRxq%A}07_AqFz zUTpKuN|YLUDYelpXT0x$RB4lAV$Iu>a2NAk_FivBanqGTxv7wuPK{S>W4)YgW~pUH zHQ!8UAXs}-3tViZ^V*vyFEjFmeN+@sc^hWwXNiFCCnV zJqTAiaF99D*QyWiguKic@weWT( zpga3ss+}64EsV|Mm3vdF+m#DQ$!YMTA$5tfl~vQ$H%?1~RTi6@0t}d+C`esbP61eA_`71t~ zkOB{jzh-<7bvnIN;++GncHDfiicJ+sY}eKbyi6LrF*+R_PigDRYn_2vGY>huop_QB zU;pUuXFcnf*WdGCyN5mDBr+VPD_mHk@DyiW7s$N5d$$1+d%#+Ey(TwyB z3eL{?pXMGT{r~&iV`gIcKf!!<2FCwB_ta(V7U>bYu4__>GMDdn>B`QE4*ld6z&8=e zN)eG7AyJ4wdG?JrJSrG4t|hmKT|Z2>owlb7(IG+f^+z=jK+qrQgmaM}Q~ipf%@8g3 z!43I&RK>;p(D7Ap#1;=ZtBpuVc^DT9&+YpZy_D&tFX6LD40z@&idj{DkTkxQ_ocYw zM61+@qZvp07uGp0(ak53G*O6D)2PfV3r!>;Aw~o!K;*ApQSeho2%v~-V#D(*v=J5{ zS+6miO4zi~%R^n_&Lx%$XvCwTR#FC)&T)VmSx&&vhZm2dq#D`6DpPa`MvuV25bP`t zDmG_kXcBrTvZ#djvNU=kwWt>8Q2+{D)F zt1VWP2R(-0?N{IS_Et3!6)~RxFHKwfY~Fc|eVCg|9sxO3QATGi(yZdK)#fv^||o58Qh__+pKY$^B^hX@DBJ|)*>Vy^$zX^~4`=;k@57Kr$FecJe&<`wV=C*(X7#H# zx=i>)=Abvqk^k?Bkl(QcYdZ8C-{(4W`u|$H4xpy8HB617!K^39JshP$GdC=@@CDDJ=m^h=8!7NUwqL!aDo*?aa=bd1cO> zd;a;q^Z)0bd(U_NbLZT-XE$vDbHy3E`T7+Qbjh=z#?NY+TUk;n-9!-QP}deKJt`Sm zkWK9JDH=9sm^0%zi_+ME0=MtNa#$WeH zFW|89s0NV3%7w$$86f$W#iiLaw`pU;f2iN{Lc(uobnRB)7jlhD@UKz z&<%|ew|rv!5`I@>f^t;2$o_P4qF=GHAl1yn|H=#eM5&|F+Q$LWD8ExL8_qtMzN<8S zzMB6MXHV|vb>cjS9TIT$y=n%#T4)(642v{>L@vW9r;L@h@xRyzj<9ePAGR6 zl^<6G9M~8>{RuY4&&%)Xa8Z^iB_O(A{gnNvL)woe8c(ii3G6?4NVccr!kQw@AniE9 z^06I*@Iy;;rciOWobVfXTgc!~uTOvD?({e;f8%+*PlBLZ6&(ooetW)FB3;GgBdPr` zP}#@$rdh87A5d8#+N*7tK%g(N`%(iK5 zP{zCDfUY6_=M_!1?#C)suXqY!>6^MSA5=t}NOil>;IC>kD?-b4N8XGi{i1dVUYOWT z23GaO`@AVGG^WeEW2Z)JuCC`ses0MHwFUlAwg#)(rwQ7^1Y?J9%OYH^7IM0!Pm`2k z5`@2m47}TiDcnjMtTr)j@2y$ODjC_QWUjmn3`-lCHDZmdnqaNVQ&{*~p=^aateehi z(E#&%8z8tC;$1W#Xvy@1VZyoV>_}LS-~jbx*3W>9LuKV`g5sB?-hxpQsP!Sqn$wpF zYt244-~O7M=3fsh?ZVu0kWMGssf}Sap{N|9*OrzmhjfL_vy-M(cI45)k{U1REavx7 zp$r@%)^YeGn^)IE-Eu|j($Eb1_=EeA3Q3$T$h_g?707o}=Uq3@T;l9tNhcnJ9w*Im z1_vEKb_~GbJ`Q-SdqTS+GH6l}ylTI%N3Fs8t+qjO%cyM3q+;rQ+{RhpyorNQD(jv9 zcis`Gnnf*+lZs@10_na|at7FC^@}Wnb8noYx?Z3nQ_T5d0eT(X>(cECzM&uD0?3rW z(mH(^CM$K|MRmh&2szHzag-6a^_vlW!811_f>Xr2$M@odVg8Q!TOaiy^lzly54Rr< zIELp$@_^Z0xTm{3D(Ym)-_jEDpVCs}%pWV?8XA8FOAQ@e?Y~6JhdJ~B32mWU^D_z& zzFr@5R7K(vWa9m0!N(uC;Hx`tVbFI5?Ep$W`!y%wt7}lFXJvNMdSCXdyPu;gFP*F_ z1^F69XzLi^yWCV;?0`Y{d*wH^Pqmw@eob^~AnBxe;4G&Kur2S?(A(!zI&c%0FIfm@ zd6p`^Z%xN-r$0L^yxyZtXlH+83iGX}y>6wqrK zkGpO|9rBvOZVW7pl-wVw ztqU1MP(XA2B8*oiRjBN>{n{F5G^*uIk6iPU$`geq4Za-|f2K+VyuP!SitiL(P_Qaf zx#)k@U+}u<*4Y)ms7Iqv8ESUc*9d6qt6YOvBfEt1=&}rdK#@2;fRZu z=La+E7_SxfAaiW5wPfKrgV5;GVl@}f%HG{=cY`KDpRPF)!xPyaNQ~HBjFqpXz+_7d zXr9C(=XG2IBPv$+c0#J${M|<5`Rw&cAE{?r>84JF@;o&Xs}cr|3cpe?vjpxz#T)sh zu{x2FcR)^(ZU859XX7D;;*0*geOlH}c=C?A%_LZr7B4r8Y`=HNl`OS$gdIEwfT6{Y z(Vn#N6JG=-s9f{_5KkQiA}u1X!7Qr+I07O)LB$u#E8HBHe})6Uz5r z;3A%A;D;#*X>&mj6S&4YKE6Qq@LoGK!@X{Gf|ffTtK+d+jqM>9Jt z^2|@DK#E!J%Rf#@Wr+ML3%YP9#q88kj`CT9)yPi-J?=b2IFFVZE+@X{U?7iH&o@3~ zE?t1;I>`e*2<6er8oJcn_9iRdO34JERn8|yOSFZ<4hm`W<~b(BW_bYdKoRiiq&5J0BFXJ2W^i65!D7)) z1wcAlIbsfTsFxE@uvxT|7rA#gby(I`4lS5zq0oYh=()s0n8`M{{$oB@jx1}YFRc{xNSp}at+@SkBEEbN^V8Y8iXQOod8coe z7sl6l?F=8Gft|-}m?(~=s07FIP%>d6zID$skhJG@*@hX!!DxG!VKRCm{{0>n;u_Ay z=bRjR(3lyzSEnQg4Uh-k6NGTN|o7MhelzLQBj!c9)pM?SY6bDVGD7c8ME?kY2amd zf`rO`+Z#c@E9aOoUr$YMzQ7hSw@J0{uZfM%bq{r2dmG-hvlI}l2hCSOwHFYGgx1eN ztfGunR34d3R;|gKyg!CAN)g8u{WxpVpWK6(zj1JJ`NnqeheH4M@wPcqV-~INC6j>+ ztRFS_pdy{BO+AL&p>Ig+U_WgQH;7X!cVi57xp!g-4C&OmFLSeAO(VTuQ3k&Rp|#hR zQ_({^q$nfyrdM#2M^Qo1l@87DuCW43LTesh)UGW3geyTTe3Mo-D6~vVv`LD2n;$Ij2|`1jb@WF#5Pt=M2n(a>UP%NH$(;#HbeDu zRoFERVy~1gW3XZ7qdjCYJ)$yLmnOu%YL3pXdeFW6MnxVVPaL`Y*#skcW7Dy3Uk;$( z^mSLPB`~vk5z?n%X@}kE@qufse0yT}VL*Xe!Ksh+ zzaYo;z!Y?X;6C1le)`m>mW^k znu`pSV+Y}+%X?nn-Vq#y`d$?rg`wer;E*71FaHA(`Lcc5K^b16x8BdIUEUQF92ct!+Uv$l0^fL$$TknQOp()#xDOc+$$KELq)hYXmDffUW=WkP2 zq^9f&r`!y?s|A>RafwDPMNFH~vhM%U-SedrYX7$*Et&I=5)fy{D5<6YTC6`g-=VjZ z@|Ub)H7ZyQHJ$*BDrzrZZQL%L{xa^{7?VHEYVwWU&Yz}YhuOU8$Ee(Y({X}Byn;d^ Uf;bOcQ%hT2>wv861sk(}0Ic>qQUCw| literal 0 HcmV?d00001 From a549bcd1cd95641b980e52ebb33a639323f0e4c6 Mon Sep 17 00:00:00 2001 From: voidbert Date: Wed, 14 May 2025 04:00:25 +0100 Subject: [PATCH 5/5] Fix bad quotes --- reports/RelatorioFase4.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reports/RelatorioFase4.tex b/reports/RelatorioFase4.tex index 8e8fce2a..13e1efe0 100644 --- a/reports/RelatorioFase4.tex +++ b/reports/RelatorioFase4.tex @@ -273,7 +273,7 @@ \section{Bibliografia} \begin{thebibliography}{9} \bibitem{wavefront-obj} - "Wavefront OBJ File Format Summary."{} FileFormat.Info. Accessed: May 14, 2025. [Online.] + ``Wavefront OBJ File Format Summary.''{} FileFormat.Info. Accessed: May 14, 2025. [Online.] Available: \url{https://www.fileformat.info/format/wavefrontobj/egff.htm} \end{thebibliography} \endgroup