Resultados

  1. El análisis de tópicos arrojo dos claras dimensiones, una política y otra económica.

  2. El tópico más importante fue el COVID-19 seguido por un tópico relacionado a la economía. Existe un traslape importante entre éstos.

  3. Otros tópicos incluyen: cambio climático y desarrollo sustentable, desarrollo tecnológico, la Unión Europea, relaciones internacionales (con un énfasis en China e Irán), el conflicto palestino-israelí, política interna de Norteamérica, Política de Rusia y Europa del este, y un último tópico que está compuesto por una serie de cartas abiertas firmadas por académicos, políticos y personas relacionada a instituciones internacionales. Este último tópico está vinculado con el efecto que tuvo la pandemia en la relación entre los países desarrollados y los países en vías de desarrollo.

  4. El análisis de sentimientos arrojo dos momentos en donde los sentimientos negativos tuvieron notoriedad. Entre marzo y junio por la situación sanitaria, y en octubre relacionado a las elecciones presidenciales norteamericanas y a los reclamos de fraude electoral.

  5. Con respecto de las emociones: el miedo y la tristeza suben en marzo, con la llegada del COVID a Estados Unidos. Por otra parte, la confianza y la anticipación suben octubre en debido a las expectativas que se tenían con respecto de la administración Biden en el plano internacional. En el mismo periodo también suben la rabia, la tristeza y el miedo debido a la incertidumbre que se generó debido a la negativa de Donald por reconocer los resultados electorales.

Intro

Project Syndicate es una página web que publica columnas de opinión de autores provenientes de todas partes del mundo. Ellos se definen a sí mismos como the World’s Opinion Page. En el about page ellos mencionan que:

“Project Syndicate produces and delivers original, high-quality commentaries to a global audience. Featuring exclusive contributions by prominent political leaders, policymakers, scholars, business leaders, and civic activists from around the world.”

Por esta razón considere que era una buena idea ocupar esta página para analizar qué temas fueron importantes el año 2020 en el mundo. Con este propósito hare una detección de tópicos ocupando el algoritmo LDA, además hice un análisis de sentimientos (polaridad y emociones) ocupando el paquete sentimentR de R. La base de datos fue recolectada haciendo web scrapping con el paquete Rselenium.

Modelaje de Tópicos

Con el objetivo de encontrar los tópicos más importantes de los que se hablaron en 2020 ocupe el Latent Dirichlet Allocation (LDA), el cual es un método popular para modelar tópicos. Es importante recordar que éste trata a cada articulo como una mezcla de tópicos y a cada tópico como una mezcla de palabras. Esto permite que los documentos se traslapen unos con otros en términos de contenido, en vez de separarlos en grupo diferenciados.

El algoritmo fue corrido con un k = 10, lo cual significa que se buscó que encontrara 10 tópicos. Probablemente existen más tópicos, para encontrar un número optimo se puede entrenar el modelo de una manera similar a la que se entrenaría un modelo de machine learning. Lamentablemente, esto es muy costoso computacionalmente (toma mucho tiempo), por lo que decidí solo buscar 10 tópicos. Aquí los resultados:

LDAvis

El mapa de distancia intertópica es una visualización de los tópicos en un plano con 2 dimensiones. El área de estos tópicos, representada por el tamaño del circulo, es proporcional a la cantidad de palabras que pertenecen a cada uno. Los círculos, que representan a los tópicos, son graficados en base a las palabras que los componen. Por lo tanto, cuando hay dos tópicos cerca, esto quiere decir que éstos tienen muchas palabras en común. La dimensión horizontal (PC2) separa a lo que es “político”, a la izquierda, de lo que es “económico/COVID”, a la derecha. La dimensión vertical (PC1) separa a los textos que son columnas de opinión, abajo, de las “cartas abiertas”, arriba.

El grafico de barras de la derecha, muestra por defecto los 30 términos mas importantes. Las barras indican la frecuencia total del término a lo largo de todos los artículos. “Salient” es una medida especifica que está definida debajo de la visualización, puede ser pensada como una métrica usada para identificar las palabras más informativas o útiles para identificar los tópicos en una base de datos. Un valor de “saliency” más alto indica que la palabra es más útil para identificar un tópico especifico.

Es posible ajustar las palabras que aparecen en el grafico de barras por tópico, moviendo el deslizador λ (lambda). Cuando los valores están cerca de 0, lo que se resalta son los términos menos frecuentes, pero más exclusivos del tópico seleccionado. Valores de lambda más cercanos a 1 resaltan términos más frecuentes en el topico pero que pueden no ser exclusivos de éste.

Tópicos

El primer tópico es claramente sobre la pandemia y es el más importante (en términos de tamaño) del año pasado, lo cual no es una sorpresa en absoluto. El segundo tópico es sobre temas económicos, es posible constatar que existe un traslape con el tópico COVID. Lo cual tiene sentido debido a la incertidumbre económica que se desato en varios lugares del mundo a raíz de la pandemia. El Tópico 3 está relacionado a temas de cambio climático y desarrollo sustentable, como sugieren las palabras: climate, global, development, food, africa, water, o energy.

El tópico 4 a primera vista pareciera ser sobre economía al igual que el 2. Para comparar estos dos tópicos lo que se hizo fue usar las probabilidades per-topic-per-word, llamadas β (“beta”). Para encontrar los términos con mayor diferencia en β entre los tópicos se uso la tasa del logaritmo de dos: log2(β2/β1).

Al comparar ambos tópicos pareciera ser que el tópico 4 es sobre tecnología. Una de las palabras más importante de este tópico es workers, lo cual se explica por la cantidad de artículos que hablaban del impacto que tuvo la tecnología sobre el empleo durante la pandemia. Pareciera que por su parte el tópico 2 tuviera un enfoque mayor en la economía internacional debido a palabras como ECB (European Central Bank), G20 o Currency).

En un principio pareciera que el tópico 5 es sobre China, pero cuando con se analiza con mayor detalle es posible constatar que otro termino importante del tópico es Irán. Lo cual puede parecer confuso, pero si se mira con más profundidad, las palabras war, global, international, power y security, son también importantes en este tópico. Estos términos son muy comunes en la literatura sobre relaciones internacionales. Por lo cual este tópico trata posiblemente sobre relaciones internacionales y/o geopolítica.

El tópico 6 es sobre política norteamericana como parece sugerir las palabras Trump, Biden y Americans. El tópico 7 está relacionado a la Unión Europea. En este caso, es curioso que pareciera estar en ambas dimensiones horizontales, por lo cual es posible pensar que es un tópico que trata tanto cosas políticas como económicas. El numero 8 trata sobre temas relacionados a la Rusia y Europa del este. Existe cierta proximidad con el tópico 6, lo cual se puede deber al proceso de impeachment al que fue sometido Donald Trump. El tópico nueve pareciere ser sobre el conflicto palestino-israelí. Algo interesante es que también hay muchas palabras relacionadas a temas de género. Lo cual puede ser una señal de poca coherencia semántica, lo cual, es a su vez, una señal de que es probable que el número de tópicos que tenemos no sea el óptimo.

El tópico más misterioso es el 10. Mirando a los términos más relevantes del tópico es difícil hacerse una idea sobre de que se trata. Ya que contiene palabras como economics, global y world bank, vamos a contrastarlo con el tópico 2.

Es difícil encontrar algo de sentido al mirar los términos que diferencian a ambos tópicos. Por lo que decidí explorar los artículos que tienen una probabilidad alta de estar en el tópico 10.

Al mirar los títulos me dio la impresión de que los artículos se trataban de como la relación económica entre los países ricos y los que están en vías de desarrollo se vio afectada por la pandemia. Pero cuando se analizó los artículos en mayor profundidad se constató que estos eran cartas abiertas, que en la parte final eran firmadas por muchas personas. Al lado del nombre de las personas firmantes siempre había una pequeña mención al cargo que las personas tenian, es por eso que las palabras, president, minister, professor, secretary o director estaban presentes en este tópico.

Tópicos en el Tiempo

El grafico de arriba es un heatmap que muestra el porcentaje de artículos por tópico durante los meses del año. Lo primero que llama la atención es que el tópico 1 y el 2 tienen una peak entre marzo y mayo, debido a que es en esta fecha cuando el coronavirus llega a Estados Unidos. Lo cual provocó preocupación sobre el efecto que la pandemia podía tener sobre la economía, que es la razón por la cual también se incrementa el porcentaje del artículo del tópico 2 (economía internacional).

Por otro lado, el tópico 6, política norteamericana, tiene un predominio en los meses de octubre, noviembre y diciembre debido a las elecciones presidenciales y a la negativa de Donald Trump de reconocer los resultados de éstas. El asesinato de Qassem Suleimani (un oficial militar iraní, el cual era miembro de los Cuerpos de la Guardia Revolucionaria Islámica) en enero de 2020 es lo que provoca que el tópico de relaciones internacionales tenga un peak en ese mes. Hay otro pequeño peak en julio debido a una serie de noticias relacionadas a la política internacional China.

En primer lugar, Irán anuncio que estaba negociando un acuerdo bilateral con China que comprendía áreas de comercio, energía, infraestructura, telecomunicaciones e incluso cooperación militar. Segundo, el Reino Unido decidió prohibir a Huawei en su red de 5G. Tercero, la decisión de imponer una ley de seguridad nacional en Hong Kong. Cuarto, las tensiones bilaterales que le siguieron a un enfrentamiento armado entre China e India en la región de Ladakh, que tuvo como resultado la muerte de soldados de ambos bandos.

El tópico 8, Rusia y Europa del este, tiene un peak en agosto debido a las protestas que sucedieron luego de que el presidente bielorruso señalara luego de las votaciones el había ganado con el 80% de los votos. El otro punto se da en febrero debido a que al comienzo de dicho mes concluyó el primer impeachment de Donald Trump. El impeachment se llevó a cabo como respuesta al escándalo Trump-Ucrania, en el cual Trump presionó al gobierno ucraniano a investigar a Hunter Biden, el hijo del entonces candidato presidencial Joe Biden.

El tópico 3, sustentabilidad, tiene un peak en septiembre debido a un evento llamado The Green Recovery, de acuerdo con Project Syndicate este era un “virtual sustainability event” el cual fue transmitido en vivo en septiembre de ese año. Posiblemente hubo un número de columnas publicadas ese mes que tenían relación dicho el evento. El primer día del evento puede ser visto aquí

Análisis de Sentimientos

Se realizó un análisis de sentimientos ocupando el paquete sentimentR. Primero se hizo un análisis de polaridad, sentimientos negativos versus sentimientos positivos. El paquete sentimentR calcula los sentimientos dentro de cada artículo mirando cada una de las oraciones que componen el texto. La manera en específico de como se le asigna un puntaje a cada artículo puede ser revisada en este link. Lo importante es saber valores positivos equivalen a sentimientos positivos y valores negativos a sentimientos negativos. Calculamos el promedio de sentimiento de los artículos por mes del año y estos son los resultados que encontramos:

Lo primero que llama la atención es el claro efecto que tuvo la pandemia sobre los sentimientos de los columnistas de Project Syndicate. El efecto fue negativo desde marzo a mayo. El otro momento en donde los sentimientos bajan es en octubre debido a las elecciones en Estados Unidos y en específico a la negativa de Donald Trump de reconocer los resultados. Lo segundo que se analizó fueron las emociones, no solo polaridad, con el fin de ver en específico que fue lo que sucedió, aquí un gráfico con los resultados.

Con la llegada del COVID a Estados Unidos y Europa las emociones de miedo (fear) y tristeza (sadness) se incrementan. Pareciera que tristeza tiene un peak más prolongado, manteniéndose más o menos estable hasta mayo. Por su parte las emociones de felicidad (joy) y confianza (trust) disminuyen en este mismo periodo. Otro punto de inflexión es octubre. Por un lado, las emociones de confianza, felicidad y anticipación(anticipation) suben principalmente por las expectativas que generó la victoria de Joe Biden sobre la política internacional. Al mismo tiempo la negativa de Trump a aceptar los resultados provoco que los sentimientos de enojo(anger), tristeza y miedo también aumentaran.

Reflexiones Finales

Este análisis exploratorio arroja ciertas luces que son interesantes sobre el acontecer noticioso del año pasado. Es fascinante constatar el efecto que tuvieron los fenómenos más importantes del año: La Pandemia y las elecciones norteamericanas, tanto en el análisis de tópicos como en el de sentimientos.

Si se pudiera resumir el año pasado, se tendría que al comienzo los temas más importantes fueron el asesinato de Qassem Soleimani y el impeachment de Trump. Con la llegada del COVID a Estados Unidos y Europa todo cambio. La agenda paso a estar tomada por este tópico y por las consecuencias económicas que la pandemia iba a tener. Hacia fines de año las elecciones presidenciales de Estados Unidos y la posterior negativa de Donald Trump de aceptar su derrota pasaron a ser el centro de atención.

A pesar de lo ya mencionado, queda espacio para mejorar tanto el análisis de sentimientos como la detección de tópicos. Sobre el primero, se pueden adaptar mejor los diccionarios de sentimientos y emociones para tener resultados más adecuados. En el caso del segundo, es posible agregar más tópicos para poder entender de mejor cuales fueron las temáticas que estuvieron presentes en la agenda noticiosa en 2020.

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBUZXh0byBjb24gbGFzIE5vdGljaWFzIGRlIDIwMjAiDQphdXRob3I6ICJKb3PDqSBQZcOxYSBTIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCjxzdHlsZT4NCg0KYm9keXsNCiB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KfQ0KDQo8L3N0eWxlPg0KDQojIyBSZXN1bHRhZG9zDQoNCg0KMSkgRWwgYW7DoWxpc2lzIGRlIHTDs3BpY29zIGFycm9qbyBkb3MgY2xhcmFzIGRpbWVuc2lvbmVzLCB1bmEgcG9sw610aWNhIHkgb3RyYSBlY29uw7NtaWNhLg0KDQoyKSBFbCB0w7NwaWNvIG3DoXMgaW1wb3J0YW50ZSBmdWUgZWwgQ09WSUQtMTkgc2VndWlkbyBwb3IgdW4gdMOzcGljbyByZWxhY2lvbmFkbyBhIGxhIGVjb25vbcOtYS4gRXhpc3RlIHVuIHRyYXNsYXBlIGltcG9ydGFudGUgZW50cmUgw6lzdG9zLiANCg0KMykgT3Ryb3MgdMOzcGljb3MgaW5jbHV5ZW46IGNhbWJpbyBjbGltw6F0aWNvIHkgZGVzYXJyb2xsbyBzdXN0ZW50YWJsZSwgZGVzYXJyb2xsbyB0ZWNub2zDs2dpY28sIGxhIFVuacOzbiBFdXJvcGVhLCByZWxhY2lvbmVzIGludGVybmFjaW9uYWxlcyAoY29uIHVuIMOpbmZhc2lzIGVuIENoaW5hIGUgSXLDoW4pLCBlbCBjb25mbGljdG8gcGFsZXN0aW5vLWlzcmFlbMOtLCBwb2zDrXRpY2EgaW50ZXJuYSBkZSBOb3J0ZWFtw6lyaWNhLCBQb2zDrXRpY2EgZGUgUnVzaWEgeSBFdXJvcGEgZGVsIGVzdGUsIHkgdW4gw7psdGltbyB0w7NwaWNvIHF1ZSBlc3TDoSBjb21wdWVzdG8gcG9yIHVuYSBzZXJpZSBkZSBjYXJ0YXMgYWJpZXJ0YXMgZmlybWFkYXMgcG9yIGFjYWTDqW1pY29zLCBwb2zDrXRpY29zIHkgcGVyc29uYXMgcmVsYWNpb25hZGEgYSBpbnN0aXR1Y2lvbmVzIGludGVybmFjaW9uYWxlcy4gRXN0ZSDDumx0aW1vIHTDs3BpY28gZXN0w6EgdmluY3VsYWRvIGNvbiBlbCBlZmVjdG8gcXVlIHR1dm8gbGEgcGFuZGVtaWEgZW4gbGEgcmVsYWNpw7NuIGVudHJlIGxvcyBwYcOtc2VzIGRlc2Fycm9sbGFkb3MgeSBsb3MgcGHDrXNlcyBlbiB2w61hcyBkZSBkZXNhcnJvbGxvLg0KDQo0KSBFbCBhbsOhbGlzaXMgZGUgc2VudGltaWVudG9zIGFycm9qbyBkb3MgbW9tZW50b3MgZW4gZG9uZGUgbG9zIHNlbnRpbWllbnRvcyBuZWdhdGl2b3MgdHV2aWVyb24gbm90b3JpZWRhZC4gRW50cmUgbWFyem8geSBqdW5pbyBwb3IgbGEgc2l0dWFjacOzbiBzYW5pdGFyaWEsIHkgZW4gb2N0dWJyZSByZWxhY2lvbmFkbyBhIGxhcyBlbGVjY2lvbmVzIHByZXNpZGVuY2lhbGVzIG5vcnRlYW1lcmljYW5hcyB5IGEgbG9zIHJlY2xhbW9zIGRlIGZyYXVkZSBlbGVjdG9yYWwuDQoNCjUpIENvbiByZXNwZWN0byBkZSBsYXMgZW1vY2lvbmVzOiBlbCBtaWVkbyB5IGxhIHRyaXN0ZXphIHN1YmVuIGVuIG1hcnpvLCBjb24gbGEgbGxlZ2FkYSBkZWwgQ09WSUQgYSBFc3RhZG9zIFVuaWRvcy4gUG9yIG90cmEgcGFydGUsIGxhIGNvbmZpYW56YSB5IGxhIGFudGljaXBhY2nDs24gc3ViZW4gb2N0dWJyZSBlbiBkZWJpZG8gYSBsYXMgZXhwZWN0YXRpdmFzIHF1ZSBzZSB0ZW7DrWFuIGNvbiByZXNwZWN0byBkZSBsYSBhZG1pbmlzdHJhY2nDs24gQmlkZW4gZW4gZWwgcGxhbm8gaW50ZXJuYWNpb25hbC4gRW4gZWwgbWlzbW8gcGVyaW9kbyB0YW1iacOpbiBzdWJlbiBsYSByYWJpYSwgbGEgdHJpc3RlemEgeSBlbCBtaWVkbyBkZWJpZG8gYSBsYSBpbmNlcnRpZHVtYnJlIHF1ZSBzZSBnZW5lcsOzIGRlYmlkbyBhIGxhIG5lZ2F0aXZhIGRlIERvbmFsZCBwb3IgcmVjb25vY2VyIGxvcyByZXN1bHRhZG9zIGVsZWN0b3JhbGVzLg0KDQoNCiMjIEludHJvDQoNCiFbXShodHRwczovL3d3dy5wcm9qZWN0LXN5bmRpY2F0ZS5vcmcvaW1hZ2VzL3BzLXRoZS13b3JsZHMtb3Bpbmlvbi1wYWdlLnBuZykNCg0KW1Byb2plY3QgU3luZGljYXRlXShodHRwczovL3d3dy5wcm9qZWN0LXN5bmRpY2F0ZS5vcmcvKSBlcyB1bmEgcMOhZ2luYSB3ZWIgcXVlIHB1YmxpY2EgY29sdW1uYXMgZGUgb3BpbmnDs24gZGUgYXV0b3JlcyBwcm92ZW5pZW50ZXMgZGUgdG9kYXMgcGFydGVzIGRlbCBtdW5kby4gRWxsb3Mgc2UgZGVmaW5lbiBhIHPDrSBtaXNtb3MgY29tbyB0aGUgKipXb3JsZCdzIE9waW5pb24gUGFnZSoqLiBFbiBlbCBbYWJvdXRdKGh0dHBzOi8vd3d3LnByb2plY3Qtc3luZGljYXRlLm9yZy9hYm91dCkgcGFnZSBlbGxvcyBtZW5jaW9uYW4gcXVlOg0KDQoqIlByb2plY3QgU3luZGljYXRlIHByb2R1Y2VzIGFuZCBkZWxpdmVycyBvcmlnaW5hbCwgaGlnaC1xdWFsaXR5IGNvbW1lbnRhcmllcyB0byBhIGdsb2JhbCBhdWRpZW5jZS4gRmVhdHVyaW5nIGV4Y2x1c2l2ZSBjb250cmlidXRpb25zIGJ5IHByb21pbmVudCBwb2xpdGljYWwgbGVhZGVycywgcG9saWN5bWFrZXJzLCBzY2hvbGFycywgYnVzaW5lc3MgbGVhZGVycywgYW5kIGNpdmljIGFjdGl2aXN0cyBmcm9tIGFyb3VuZCB0aGUgd29ybGQuIioNCg0KUG9yIGVzdGEgcmF6w7NuIGNvbnNpZGVyZSBxdWUgZXJhIHVuYSBidWVuYSBpZGVhIG9jdXBhciBlc3RhIHDDoWdpbmEgcGFyYSBhbmFsaXphciBxdcOpIHRlbWFzIGZ1ZXJvbiBpbXBvcnRhbnRlcyBlbCBhw7FvIDIwMjAgZW4gZWwgbXVuZG8uIENvbiBlc3RlIHByb3DDs3NpdG8gaGFyZSB1bmEgZGV0ZWNjacOzbiBkZSB0w7NwaWNvcyBvY3VwYW5kbyBlbCBhbGdvcml0bW8gTERBLCBhZGVtw6FzIGhpY2UgdW4gYW7DoWxpc2lzIGRlIHNlbnRpbWllbnRvcyAocG9sYXJpZGFkIHkgZW1vY2lvbmVzKSBvY3VwYW5kbyBlbCBwYXF1ZXRlIGBzZW50aW1lbnRSYCBkZSBSLiBMYSBiYXNlIGRlIGRhdG9zIGZ1ZSByZWNvbGVjdGFkYSBoYWNpZW5kbyB3ZWIgc2NyYXBwaW5nIGNvbiBlbCBwYXF1ZXRlIGBSc2VsZW5pdW1gLg0KDQoNCiMjIE1vZGVsYWplIGRlIFTDs3BpY29zDQoNCkNvbiBlbCBvYmpldGl2byBkZSBlbmNvbnRyYXIgbG9zIHTDs3BpY29zIG3DoXMgaW1wb3J0YW50ZXMgZGUgbG9zIHF1ZSBzZSBoYWJsYXJvbiBlbiAyMDIwIG9jdXBlIGVsICoqTGF0ZW50IERpcmljaGxldCBBbGxvY2F0aW9uKiogKExEQSksIGVsIGN1YWwgZXMgdW4gbcOpdG9kbyBwb3B1bGFyIHBhcmEgbW9kZWxhciB0w7NwaWNvcy4gRXMgaW1wb3J0YW50ZSByZWNvcmRhciBxdWUgw6lzdGUgdHJhdGEgYSBjYWRhIGFydGljdWxvIGNvbW8gdW5hIG1lemNsYSBkZSB0w7NwaWNvcyB5IGEgY2FkYSB0w7NwaWNvIGNvbW8gdW5hIG1lemNsYSBkZSBwYWxhYnJhcy4gRXN0byBwZXJtaXRlIHF1ZSBsb3MgZG9jdW1lbnRvcyBzZSB0cmFzbGFwZW4gdW5vcyBjb24gb3Ryb3MgZW4gdMOpcm1pbm9zIGRlIGNvbnRlbmlkbywgZW4gdmV6IGRlIHNlcGFyYXJsb3MgZW4gZ3J1cG8gZGlmZXJlbmNpYWRvcy4NCg0KRWwgYWxnb3JpdG1vIGZ1ZSBjb3JyaWRvIGNvbiB1biBrID0gMTAsIGxvIGN1YWwgc2lnbmlmaWNhIHF1ZSBzZSBidXNjw7MgcXVlIGVuY29udHJhcmEgMTAgdMOzcGljb3MuIFByb2JhYmxlbWVudGUgZXhpc3RlbiBtw6FzIHTDs3BpY29zLCBwYXJhIGVuY29udHJhciB1biBuw7ptZXJvIG9wdGltbyBzZSBwdWVkZSBlbnRyZW5hciBlbCBtb2RlbG8gZGUgdW5hIG1hbmVyYSBzaW1pbGFyIGEgbGEgcXVlIHNlIGVudHJlbmFyw61hIHVuIG1vZGVsbyBkZSBtYWNoaW5lIGxlYXJuaW5nLiBMYW1lbnRhYmxlbWVudGUsIGVzdG8gZXMgbXV5IGNvc3Rvc28gY29tcHV0YWNpb25hbG1lbnRlICh0b21hIG11Y2hvIHRpZW1wbyksIHBvciBsbyBxdWUgZGVjaWTDrSBzb2xvIGJ1c2NhciAxMCB0w7NwaWNvcy4gQXF1w60gbG9zIHJlc3VsdGFkb3M6DQoNCg0KDQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KICA8dGl0bGU+TERBdmlzPC90aXRsZT4NCiAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Kb3NlUGVuYVMvc29tZS1kYXRhL21haW4vZDMudjMuanMiPjwvc2NyaXB0Pg0KICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0pvc2VQZW5hUy9zb21lLWRhdGEvbWFpbi9sZGF2aXMuanMiPjwvc2NyaXB0Pg0KICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJsZGEuY3NzIj4NCiAgPC9oZWFkPg0KICANCiAgPGJvZHk+DQogIDxkaXYgaWQgPSAibGRhIj48L2Rpdj4NCiAgPHNjcmlwdD4NCiAgdmFyIHZpcyA9IG5ldyBMREF2aXMoIiNsZGEiLCAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0pvc2VQZW5hUy9zb21lLWRhdGEvbWFpbi9sZGEuanNvbiIpOw0KPC9zY3JpcHQ+DQogIDwvYm9keT4NCg0KRWwgbWFwYSBkZSBkaXN0YW5jaWEgaW50ZXJ0w7NwaWNhIGVzIHVuYSB2aXN1YWxpemFjacOzbiBkZSBsb3MgdMOzcGljb3MgZW4gdW4gcGxhbm8gY29uIDIgZGltZW5zaW9uZXMuIEVsIMOhcmVhIGRlIGVzdG9zIHTDs3BpY29zLCByZXByZXNlbnRhZGEgcG9yIGVsIHRhbWHDsW8gZGVsIGNpcmN1bG8sIGVzIHByb3BvcmNpb25hbCBhIGxhIGNhbnRpZGFkIGRlIHBhbGFicmFzIHF1ZSBwZXJ0ZW5lY2VuIGEgY2FkYSB1bm8uIExvcyBjw61yY3Vsb3MsIHF1ZSByZXByZXNlbnRhbiBhIGxvcyB0w7NwaWNvcywgc29uIGdyYWZpY2Fkb3MgZW4gYmFzZSBhIGxhcyBwYWxhYnJhcyBxdWUgbG9zIGNvbXBvbmVuLiBQb3IgbG8gdGFudG8sIGN1YW5kbyBoYXkgZG9zIHTDs3BpY29zIGNlcmNhLCBlc3RvIHF1aWVyZSBkZWNpciBxdWUgw6lzdG9zIHRpZW5lbiBtdWNoYXMgcGFsYWJyYXMgZW4gY29tw7puLiBMYSBkaW1lbnNpw7NuIGhvcml6b250YWwgKFBDMikgc2VwYXJhIGEgbG8gcXVlIGVzICJwb2zDrXRpY28iLCBhIGxhIGl6cXVpZXJkYSwgZGUgbG8gcXVlIGVzICJlY29uw7NtaWNvL0NPVklEIiwgYSBsYSBkZXJlY2hhLiBMYSBkaW1lbnNpw7NuIHZlcnRpY2FsIChQQzEpIHNlcGFyYSBhIGxvcyB0ZXh0b3MgcXVlIHNvbiBjb2x1bW5hcyBkZSBvcGluacOzbiwgYWJham8sIGRlIGxhcyDigJxjYXJ0YXMgYWJpZXJ0YXPigJ0sIGFycmliYS4gDQoNCkVsIGdyYWZpY28gZGUgYmFycmFzIGRlIGxhIGRlcmVjaGEsIG11ZXN0cmEgcG9yIGRlZmVjdG8gbG9zIDMwIHTDqXJtaW5vcyBtYXMgaW1wb3J0YW50ZXMuIExhcyBiYXJyYXMgaW5kaWNhbiBsYSBmcmVjdWVuY2lhIHRvdGFsIGRlbCB0w6lybWlubyBhIGxvIGxhcmdvIGRlIHRvZG9zIGxvcyBhcnTDrWN1bG9zLiAq4oCcU2FsaWVudOKAnSogZXMgdW5hIG1lZGlkYSBlc3BlY2lmaWNhIHF1ZSBlc3TDoSBkZWZpbmlkYSBkZWJham8gZGUgbGEgdmlzdWFsaXphY2nDs24sIHB1ZWRlIHNlciBwZW5zYWRhIGNvbW8gdW5hIG3DqXRyaWNhIHVzYWRhIHBhcmEgaWRlbnRpZmljYXIgbGFzIHBhbGFicmFzIG3DoXMgaW5mb3JtYXRpdmFzIG8gw7p0aWxlcyBwYXJhIGlkZW50aWZpY2FyIGxvcyB0w7NwaWNvcyBlbiB1bmEgYmFzZSBkZSBkYXRvcy4gVW4gdmFsb3IgZGUgKuKAnHNhbGllbmN54oCdKiBtw6FzIGFsdG8gaW5kaWNhIHF1ZSBsYSBwYWxhYnJhIGVzIG3DoXMgw7p0aWwgcGFyYSBpZGVudGlmaWNhciB1biB0w7NwaWNvIGVzcGVjaWZpY28uDQoNCkVzIHBvc2libGUgYWp1c3RhciBsYXMgcGFsYWJyYXMgcXVlIGFwYXJlY2VuIGVuIGVsIGdyYWZpY28gZGUgYmFycmFzIHBvciB0w7NwaWNvLCBtb3ZpZW5kbyBlbCBkZXNsaXphZG9yIM67IChsYW1iZGEpLiBDdWFuZG8gbG9zIHZhbG9yZXMgZXN0w6FuIGNlcmNhIGRlIDAsIGxvIHF1ZSBzZSByZXNhbHRhIHNvbiBsb3MgdMOpcm1pbm9zIG1lbm9zIGZyZWN1ZW50ZXMsIHBlcm8gbcOhcyBleGNsdXNpdm9zIGRlbCB0w7NwaWNvIHNlbGVjY2lvbmFkby4gVmFsb3JlcyBkZSBsYW1iZGEgbcOhcyBjZXJjYW5vcyBhIDEgcmVzYWx0YW4gdMOpcm1pbm9zIG3DoXMgZnJlY3VlbnRlcyBlbiBlbCB0b3BpY28gcGVybyBxdWUgcHVlZGVuIG5vIHNlciBleGNsdXNpdm9zIGRlIMOpc3RlLg0KIA0KDQojIyMgVMOzcGljb3MNCg0KRWwgcHJpbWVyIHTDs3BpY28gZXMgY2xhcmFtZW50ZSBzb2JyZSBsYSBwYW5kZW1pYSB5IGVzIGVsIG3DoXMgaW1wb3J0YW50ZSAoZW4gdMOpcm1pbm9zIGRlIHRhbWHDsW8pIGRlbCBhw7FvIHBhc2FkbywgbG8gY3VhbCBubyBlcyB1bmEgc29ycHJlc2EgZW4gYWJzb2x1dG8uIEVsIHNlZ3VuZG8gdMOzcGljbyBlcyBzb2JyZSB0ZW1hcyBlY29uw7NtaWNvcywgZXMgcG9zaWJsZSBjb25zdGF0YXIgcXVlIGV4aXN0ZSB1biB0cmFzbGFwZSBjb24gZWwgdMOzcGljbyBDT1ZJRC4gTG8gY3VhbCB0aWVuZSBzZW50aWRvIGRlYmlkbyBhIGxhIGluY2VydGlkdW1icmUgZWNvbsOzbWljYSBxdWUgc2UgZGVzYXRvIGVuIHZhcmlvcyBsdWdhcmVzIGRlbCBtdW5kbyBhIHJhw616IGRlIGxhIHBhbmRlbWlhLiBFbCBUw7NwaWNvIDMgZXN0w6EgcmVsYWNpb25hZG8gYSB0ZW1hcyBkZSBjYW1iaW8gY2xpbcOhdGljbyB5IGRlc2Fycm9sbG8gc3VzdGVudGFibGUsIGNvbW8gc3VnaWVyZW4gbGFzIHBhbGFicmFzOiAqY2xpbWF0ZSwgZ2xvYmFsLCBkZXZlbG9wbWVudCwgZm9vZCwgYWZyaWNhLCB3YXRlciwqKiBvICoqZW5lcmd5Ki4NCg0KRWwgdMOzcGljbyA0IGEgcHJpbWVyYSB2aXN0YSBwYXJlY2llcmEgc2VyIHNvYnJlIGVjb25vbcOtYSBhbCBpZ3VhbCBxdWUgZWwgMi4gUGFyYSBjb21wYXJhciBlc3RvcyBkb3MgdMOzcGljb3MgbG8gcXVlIHNlIGhpem8gZnVlIHVzYXIgbGFzIHByb2JhYmlsaWRhZGVzICoqcGVyLXRvcGljLXBlci13b3JkKiosIGxsYW1hZGFzIM6yICgq4oCcYmV0YeKAnSopLiBQYXJhIGVuY29udHJhciBsb3MgdMOpcm1pbm9zIGNvbiBtYXlvciBkaWZlcmVuY2lhIGVuIM6yIGVudHJlIGxvcyB0w7NwaWNvcyBzZSB1c28gbGEgdGFzYSBkZWwgbG9nYXJpdG1vIGRlIGRvczogbG9nMijOsjIvzrIxKS4NCg0KQWwgY29tcGFyYXIgYW1ib3MgdMOzcGljb3MgcGFyZWNpZXJhIHNlciBxdWUgZWwgdMOzcGljbyA0IGVzIHNvYnJlIHRlY25vbG9nw61hLiBVbmEgZGUgbGFzIHBhbGFicmFzIG3DoXMgaW1wb3J0YW50ZSBkZSBlc3RlIHTDs3BpY28gZXMgKndvcmtlcnMqLCBsbyBjdWFsIHNlIGV4cGxpY2EgcG9yIGxhIGNhbnRpZGFkIGRlIGFydMOtY3Vsb3MgcXVlIGhhYmxhYmFuIGRlbCBpbXBhY3RvIHF1ZSB0dXZvIGxhIHRlY25vbG9nw61hIHNvYnJlIGVsIGVtcGxlbyBkdXJhbnRlIGxhIHBhbmRlbWlhLiBQYXJlY2llcmEgcXVlIHBvciBzdSBwYXJ0ZSBlbCB0w7NwaWNvIDIgdHV2aWVyYSB1biBlbmZvcXVlIG1heW9yIGVuIGxhIGVjb25vbcOtYSBpbnRlcm5hY2lvbmFsIGRlYmlkbyBhIHBhbGFicmFzIGNvbW8gKkVDQiAoRXVyb3BlYW4gQ2VudHJhbCBCYW5rKSwgRzIwIG8gQ3VycmVuY3kpKi4NCg0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLmFsaWduID0gJ2NlbnRlcid9DQoNCmJldGFfc3ByZWFkIDwtIGFwX3RvcGljcyAlPiUNCiAgbXV0YXRlKHRvcGljID0gcGFzdGUwKCJ0b3BpYyIsIHRvcGljKSkgJT4lDQogIHNwcmVhZCh0b3BpYywgYmV0YSkgJT4lDQogIGZpbHRlcih0b3BpYzEgPiAuMDAxIHwgdG9waWM0ID4gLjAwMSkgJT4lDQogIG11dGF0ZShsb2dfcmF0aW8gPSBsb2cyKHRvcGljMSAvIHRvcGljNCkpDQoNCmJldGFfc3ByZWFkICU+JQ0KICBncm91cF9ieShkaXJlY3Rpb24gPSBsb2dfcmF0aW8gPiAwKSAlPiUNCiAgdG9wX24oMTAsIGFicyhsb2dfcmF0aW8pKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUodGVybSA9IHJlb3JkZXIodGVybSwgbG9nX3JhdGlvKSkgJT4lDQogIGdncGxvdChhZXMobG9nX3JhdGlvLCB0ZXJtLCBmaWxsID0gbG9nX3JhdGlvID4gMCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGxhYnMoeCA9ICJMb2cyIHJhdGlvIG9mIGJldGEgaW4gdG9waWMgNCAvIHRvcGljIDIiLCB5ID0gTlVMTCkrDQogIHRoZW1lX2xpZ2h0KCkrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgZ2d0aXRsZSgiVGVybXMgdGhhdCBoYWQgdGhlIGdyZWF0ZXN0IGRpZmZlcmVuY2UgaW4gzrIgYmV0d2VlbiB0b3BpYyA0IGFuZCB0b3BpYyAyIikNCg0KYGBgDQoNCkVuIHVuIHByaW5jaXBpbyBwYXJlY2llcmEgcXVlIGVsIHTDs3BpY28gNSBlcyBzb2JyZSBDaGluYSwgcGVybyBjdWFuZG8gY29uIHNlIGFuYWxpemEgY29uIG1heW9yIGRldGFsbGUgZXMgcG9zaWJsZSBjb25zdGF0YXIgcXVlIG90cm8gdGVybWlubyBpbXBvcnRhbnRlIGRlbCB0w7NwaWNvIGVzIElyw6FuLiBMbyBjdWFsIHB1ZWRlIHBhcmVjZXIgY29uZnVzbywgcGVybyBzaSBzZSBtaXJhIGNvbiBtw6FzIHByb2Z1bmRpZGFkLCBsYXMgcGFsYWJyYXMgKndhciwgZ2xvYmFsLCBpbnRlcm5hdGlvbmFsLCBwb3dlciAqIHkgKnNlY3VyaXR5Kiwgc29uIHRhbWJpw6luIGltcG9ydGFudGVzIGVuIGVzdGUgdMOzcGljby4gRXN0b3MgdMOpcm1pbm9zIHNvbiBtdXkgY29tdW5lcyBlbiBsYSBsaXRlcmF0dXJhIHNvYnJlIHJlbGFjaW9uZXMgaW50ZXJuYWNpb25hbGVzLiBQb3IgbG8gY3VhbCBlc3RlIHTDs3BpY28gdHJhdGEgcG9zaWJsZW1lbnRlIHNvYnJlIHJlbGFjaW9uZXMgaW50ZXJuYWNpb25hbGVzIHkvbyBnZW9wb2zDrXRpY2EuDQoNCkVsIHTDs3BpY28gNiBlcyBzb2JyZSBwb2zDrXRpY2Egbm9ydGVhbWVyaWNhbmEgY29tbyBwYXJlY2Ugc3VnZXJpciBsYXMgcGFsYWJyYXMgKlRydW1wLCBCaWRlbiogeSAqQW1lcmljYW5zKi4gRWwgdMOzcGljbyA3IGVzdMOhIHJlbGFjaW9uYWRvIGEgbGEgVW5pw7NuIEV1cm9wZWEuIEVuIGVzdGUgY2FzbywgZXMgY3VyaW9zbyBxdWUgcGFyZWNpZXJhIGVzdGFyIGVuIGFtYmFzIGRpbWVuc2lvbmVzIGhvcml6b250YWxlcywgcG9yIGxvIGN1YWwgZXMgcG9zaWJsZSBwZW5zYXIgcXVlIGVzIHVuIHTDs3BpY28gcXVlIHRyYXRhIHRhbnRvIGNvc2FzIHBvbMOtdGljYXMgY29tbyBlY29uw7NtaWNhcy4gRWwgbnVtZXJvIDggdHJhdGEgc29icmUgdGVtYXMgcmVsYWNpb25hZG9zIGEgbGEgUnVzaWEgeSBFdXJvcGEgZGVsIGVzdGUuICBFeGlzdGUgY2llcnRhIHByb3hpbWlkYWQgY29uIGVsIHTDs3BpY28gNiwgbG8gY3VhbCBzZSBwdWVkZSBkZWJlciBhbCBwcm9jZXNvIGRlICppbXBlYWNobWVudCogYWwgcXVlIGZ1ZSBzb21ldGlkbyBEb25hbGQgVHJ1bXAuIEVsIHTDs3BpY28gbnVldmUgcGFyZWNpZXJlIHNlciBzb2JyZSBlbCBjb25mbGljdG8gcGFsZXN0aW5vLWlzcmFlbMOtLiBBbGdvIGludGVyZXNhbnRlIGVzIHF1ZSB0YW1iacOpbiBoYXkgbXVjaGFzIHBhbGFicmFzIHJlbGFjaW9uYWRhcyBhIHRlbWFzIGRlIGfDqW5lcm8uIExvIGN1YWwgcHVlZGUgc2VyIHVuYSBzZcOxYWwgZGUgcG9jYSBjb2hlcmVuY2lhIHNlbcOhbnRpY2EsIGxvIGN1YWwsIGVzIGEgc3UgdmV6LCB1bmEgc2XDsWFsIGRlIHF1ZSBlcyBwcm9iYWJsZSBxdWUgZWwgbsO6bWVybyBkZSB0w7NwaWNvcyBxdWUgdGVuZW1vcyBubyBzZWEgZWwgw7NwdGltby4NCg0KRWwgdMOzcGljbyBtw6FzIG1pc3Rlcmlvc28gZXMgZWwgMTAuIE1pcmFuZG8gYSBsb3MgdMOpcm1pbm9zIG3DoXMgcmVsZXZhbnRlcyBkZWwgdMOzcGljbyBlcyBkaWbDrWNpbCBoYWNlcnNlIHVuYSBpZGVhIHNvYnJlIGRlIHF1ZSBzZSB0cmF0YS4gWWEgcXVlIGNvbnRpZW5lIHBhbGFicmFzIGNvbW8gKmVjb25vbWljcywgZ2xvYmFsKiB5ICp3b3JsZCBiYW5rKiwgdmFtb3MgYSBjb250cmFzdGFybG8gY29uIGVsIHTDs3BpY28gMi4NCg0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLmFsaWduID0gJ2NlbnRlcid9DQoNCmJldGFfc3ByZWFkIDwtIGFwX3RvcGljcyAlPiUNCiAgbXV0YXRlKHRvcGljID0gcGFzdGUwKCJ0b3BpYyIsIHRvcGljKSkgJT4lDQogIHNwcmVhZCh0b3BpYywgYmV0YSkgJT4lDQogIGZpbHRlcih0b3BpYzEgPiAuMDAxIHwgdG9waWMzID4gLjAwMSkgJT4lDQogIG11dGF0ZShsb2dfcmF0aW8gPSBsb2cyKHRvcGljMSAvIHRvcGljMykpDQoNCmJldGFfc3ByZWFkICU+JQ0KICBncm91cF9ieShkaXJlY3Rpb24gPSBsb2dfcmF0aW8gPiAwKSAlPiUNCiAgdG9wX24oMTAsIGFicyhsb2dfcmF0aW8pKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUodGVybSA9IHJlb3JkZXIodGVybSwgbG9nX3JhdGlvKSkgJT4lDQogIGdncGxvdChhZXMobG9nX3JhdGlvLCB0ZXJtLCBmaWxsID0gbG9nX3JhdGlvID4gMCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGxhYnMoeCA9ICJMb2cyIHJhdGlvIG9mIGJldGEgaW4gdG9waWMgMTAgLyB0b3BpYyAyIiwgeSA9IE5VTEwpKw0KICB0aGVtZV9saWdodCgpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGdndGl0bGUoIlRlcm1zIHRoYXQgaGFkIHRoZSBncmVhdGVzdCBkaWZmZXJlbmNlIGluIM6yIGJldHdlZW4gdG9waWMgMTAgYW5kIHRvcGljIDIiKQ0KYGBgDQoNCkVzIGRpZsOtY2lsIGVuY29udHJhciBhbGdvIGRlIHNlbnRpZG8gYWwgbWlyYXIgbG9zIHTDqXJtaW5vcyBxdWUgZGlmZXJlbmNpYW4gYSBhbWJvcyB0w7NwaWNvcy4gUG9yIGxvIHF1ZSBkZWNpZMOtIGV4cGxvcmFyIGxvcyBhcnTDrWN1bG9zIHF1ZSB0aWVuZW4gdW5hIHByb2JhYmlsaWRhZCBhbHRhIGRlIGVzdGFyIGVuIGVsIHTDs3BpY28gMTAuDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCiBhcF9kb2N1bWVudHMlPiUNCiAgYXJyYW5nZShkZXNjKGRvY3VtZW50KSkgJT4lIGZpbHRlcih0b3BpYz09MyZnYW1tYT4wLjgpDQpgYGANCg0KQWwgbWlyYXIgbG9zIHTDrXR1bG9zIG1lIGRpbyBsYSBpbXByZXNpw7NuIGRlIHF1ZSBsb3MgYXJ0w61jdWxvcyBzZSB0cmF0YWJhbiBkZSBjb21vIGxhIHJlbGFjacOzbiBlY29uw7NtaWNhIGVudHJlIGxvcyBwYcOtc2VzIHJpY29zIHkgbG9zIHF1ZSBlc3TDoW4gZW4gdsOtYXMgZGUgZGVzYXJyb2xsbyBzZSB2aW8gYWZlY3RhZGEgcG9yIGxhIHBhbmRlbWlhLiBQZXJvIGN1YW5kbyBzZSBhbmFsaXrDsyBsb3MgYXJ0w61jdWxvcyBlbiBtYXlvciBwcm9mdW5kaWRhZCBzZSBjb25zdGF0w7MgcXVlIGVzdG9zIGVyYW4gY2FydGFzIGFiaWVydGFzLCBxdWUgZW4gbGEgcGFydGUgZmluYWwgZXJhbiBmaXJtYWRhcyBwb3IgbXVjaGFzIHBlcnNvbmFzLiBBbCBsYWRvIGRlbCBub21icmUgZGUgbGFzIHBlcnNvbmFzIGZpcm1hbnRlcyBzaWVtcHJlIGhhYsOtYSB1bmEgcGVxdWXDsWEgbWVuY2nDs24gYWwgY2FyZ28gcXVlIGxhcyBwZXJzb25hcyB0ZW5pYW4sIGVzIHBvciBlc28gcXVlIGxhcyBwYWxhYnJhcywgKnByZXNpZGVudCwgbWluaXN0ZXIsIHByb2Zlc3Nvciwgc2VjcmV0YXJ5KiBvICpkaXJlY3RvciogZXN0YWJhbiBwcmVzZW50ZXMgZW4gZXN0ZSB0w7NwaWNvLg0KDQojIyMgVMOzcGljb3MgZW4gZWwgVGllbXBvDQogICANCmBgYHtyLGZpZy5hbGlnbiA9ICdjZW50ZXInLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KDQptb250aF93b3JkcyAlPiUgbXV0YXRlKGdhbW1hMT1pZmVsc2UoZ2FtbWE+MC44LDEsMCkpJT4lDQogIGdyb3VwX2J5KA0KICAgIG1vbnRoID0gbW9udGgoZGF0ZTIpLA0KICAgIHRvcGljKSAlPiUNCiAgc3VtbWFyaXNlKGdhbW1hMSA9IG1lYW4oZ2FtbWExKSkgJT4lDQogIG11dGF0ZSh0b3BpYz0gY2FzZV93aGVuKHRvcGljID09IDEgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BpYyA9PSAyIH4gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9waWMgPT0gMyB+IDEwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BpYyA9PSA0IH4gNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9waWMgPT0gNSB+IDgsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljID09IDYgfiA5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BpYyA9PSA3IH4gNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9waWMgPT0gOCB+IDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljID09IDkgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BpYyA9PSAxMCB+IDMpKSAlPiUgDQogIGdncGxvdChhZXMoYXMuZmFjdG9yKG1vbnRoKSwgYXMuZmFjdG9yKHRvcGljKSwgZmlsbCA9IGdhbW1hMSkpICsNCiAgZ2VvbV90aWxlKGFscGhhID0gMC45KSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBsYWJzKGZpbGwgPSAiQXJ0aWNsZXMgJSIsIHggPSAibW9udGggb2YgdGhlIHllYXIiLCB5ID0gInRvcGljIikrDQogIHRoZW1lX2xpZ2h0KCkrIA0KICBnZ3RpdGxlKCJBcnRpY2xlcyBieSBUb3BpYyBhbmQgTW9udGgiKQ0KICAgDQpgYGANCiAgIA0KRWwgZ3JhZmljbyBkZSBhcnJpYmEgZXMgdW4gKmhlYXRtYXAqIHF1ZSBtdWVzdHJhIGVsIHBvcmNlbnRhamUgZGUgYXJ0w61jdWxvcyBwb3IgdMOzcGljbyBkdXJhbnRlIGxvcyBtZXNlcyBkZWwgYcOxby4gTG8gcHJpbWVybyBxdWUgbGxhbWEgbGEgYXRlbmNpw7NuIGVzIHF1ZSBlbCB0w7NwaWNvIDEgeSBlbCAyIHRpZW5lbiB1bmEgcGVhayBlbnRyZSBtYXJ6byB5IG1heW8sIGRlYmlkbyBhIHF1ZSBlcyBlbiBlc3RhIGZlY2hhIGN1YW5kbyBlbCBjb3JvbmF2aXJ1cyBsbGVnYSBhIEVzdGFkb3MgVW5pZG9zLiBMbyBjdWFsIHByb3ZvY8OzIHByZW9jdXBhY2nDs24gc29icmUgZWwgZWZlY3RvIHF1ZSBsYSBwYW5kZW1pYSBwb2TDrWEgdGVuZXIgc29icmUgbGEgZWNvbm9tw61hLCBxdWUgZXMgbGEgcmF6w7NuIHBvciBsYSBjdWFsIHRhbWJpw6luIHNlIGluY3JlbWVudGEgZWwgcG9yY2VudGFqZSBkZWwgYXJ0w61jdWxvIGRlbCB0w7NwaWNvIDIgKGVjb25vbcOtYSBpbnRlcm5hY2lvbmFsKS4NCg0KUG9yIG90cm8gbGFkbywgZWwgdMOzcGljbyA2LCBwb2zDrXRpY2Egbm9ydGVhbWVyaWNhbmEsIHRpZW5lIHVuIHByZWRvbWluaW8gZW4gbG9zIG1lc2VzIGRlIG9jdHVicmUsIG5vdmllbWJyZSB5IGRpY2llbWJyZSBkZWJpZG8gYSBsYXMgZWxlY2Npb25lcyBwcmVzaWRlbmNpYWxlcyB5IGEgbGEgbmVnYXRpdmEgZGUgRG9uYWxkIFRydW1wIGRlIHJlY29ub2NlciBsb3MgcmVzdWx0YWRvcyBkZSDDqXN0YXMuIEVsIGFzZXNpbmF0byBkZSBRYXNzZW0gU3VsZWltYW5pICh1biBvZmljaWFsIG1pbGl0YXIgaXJhbsOtLCBlbCBjdWFsIGVyYSBtaWVtYnJvIGRlIGxvcyBDdWVycG9zIGRlIGxhIEd1YXJkaWEgUmV2b2x1Y2lvbmFyaWEgSXNsw6FtaWNhKSBlbiBlbmVybyBkZSAyMDIwIGVzIGxvIHF1ZSBwcm92b2NhIHF1ZSBlbCB0w7NwaWNvIGRlIHJlbGFjaW9uZXMgaW50ZXJuYWNpb25hbGVzIHRlbmdhIHVuIHBlYWsgZW4gZXNlIG1lcy4gSGF5IG90cm8gcGVxdWXDsW8gcGVhayBlbiBqdWxpbyBkZWJpZG8gYSB1bmEgc2VyaWUgZGUgbm90aWNpYXMgcmVsYWNpb25hZGFzIGEgbGEgcG9sw610aWNhIGludGVybmFjaW9uYWwgQ2hpbmEuDQoNCkVuIHByaW1lciBsdWdhciwgSXLDoW4gYW51bmNpbyBxdWUgZXN0YWJhIG5lZ29jaWFuZG8gdW4gYWN1ZXJkbyBiaWxhdGVyYWwgY29uIENoaW5hIHF1ZSBjb21wcmVuZMOtYSDDoXJlYXMgZGUgY29tZXJjaW8sIGVuZXJnw61hLCBpbmZyYWVzdHJ1Y3R1cmEsIHRlbGVjb211bmljYWNpb25lcyBlIGluY2x1c28gY29vcGVyYWNpw7NuIG1pbGl0YXIuIFNlZ3VuZG8sIGVsIFJlaW5vIFVuaWRvIGRlY2lkacOzIHByb2hpYmlyIGEgSHVhd2VpIGVuIHN1IHJlZCBkZSA1Ry4gVGVyY2VybywgbGEgZGVjaXNpw7NuIGRlIGltcG9uZXIgdW5hIGxleSBkZSBzZWd1cmlkYWQgbmFjaW9uYWwgZW4gSG9uZyBLb25nLiBDdWFydG8sIGxhcyB0ZW5zaW9uZXMgYmlsYXRlcmFsZXMgcXVlIGxlIHNpZ3VpZXJvbiBhIHVuIGVuZnJlbnRhbWllbnRvIGFybWFkbyBlbnRyZSBDaGluYSBlIEluZGlhIGVuIGxhIHJlZ2nDs24gZGUgTGFkYWtoLCBxdWUgdHV2byBjb21vIHJlc3VsdGFkbyBsYSBtdWVydGUgZGUgc29sZGFkb3MgZGUgYW1ib3MgYmFuZG9zLg0KDQpFbCB0w7NwaWNvIDgsIFJ1c2lhIHkgRXVyb3BhIGRlbCBlc3RlLCB0aWVuZSB1biBwZWFrIGVuIGFnb3N0byBkZWJpZG8gYSBsYXMgcHJvdGVzdGFzIHF1ZSBzdWNlZGllcm9uIGx1ZWdvIGRlIHF1ZSBlbCBwcmVzaWRlbnRlIGJpZWxvcnJ1c28gc2XDsWFsYXJhIGx1ZWdvIGRlIGxhcyB2b3RhY2lvbmVzIGVsIGhhYsOtYSBnYW5hZG8gY29uIGVsIDgwJSBkZSBsb3Mgdm90b3MuIEVsIG90cm8gcHVudG8gc2UgZGEgZW4gZmVicmVybyBkZWJpZG8gYSBxdWUgYWwgY29taWVuem8gZGUgZGljaG8gbWVzIGNvbmNsdXnDsyBlbCBwcmltZXIgKmltcGVhY2htZW50KiBkZSBEb25hbGQgVHJ1bXAuIEVsICppbXBlYWNobWVudCogc2UgbGxldsOzIGEgY2FibyBjb21vIHJlc3B1ZXN0YSBhbCBlc2PDoW5kYWxvIFRydW1wLVVjcmFuaWEsIGVuIGVsIGN1YWwgVHJ1bXAgcHJlc2lvbsOzIGFsIGdvYmllcm5vIHVjcmFuaWFubyBhIGludmVzdGlnYXIgYSBIdW50ZXIgQmlkZW4sIGVsIGhpam8gZGVsIGVudG9uY2VzIGNhbmRpZGF0byBwcmVzaWRlbmNpYWwgSm9lIEJpZGVuLg0KDQpFbCB0w7NwaWNvIDMsIHN1c3RlbnRhYmlsaWRhZCwgdGllbmUgdW4gcGVhayBlbiBzZXB0aWVtYnJlIGRlYmlkbyBhIHVuIGV2ZW50byBsbGFtYWRvICpUaGUgR3JlZW4gUmVjb3ZlcnkqLCBkZSBhY3VlcmRvIGNvbiBQcm9qZWN0IFN5bmRpY2F0ZSBlc3RlIGVyYSB1biAqInZpcnR1YWwgc3VzdGFpbmFiaWxpdHkgZXZlbnQiKiBlbCBjdWFsIGZ1ZSB0cmFuc21pdGlkbyBlbiB2aXZvIGVuIHNlcHRpZW1icmUgZGUgZXNlIGHDsW8uIFBvc2libGVtZW50ZSBodWJvIHVuIG7Dum1lcm8gZGUgY29sdW1uYXMgcHVibGljYWRhcyBlc2UgbWVzIHF1ZSB0ZW7DrWFuIHJlbGFjacOzbiBkaWNobyBlbCBldmVudG8uIEVsIHByaW1lciBkw61hIGRlbCBldmVudG8gcHVlZGUgc2VyIHZpc3RvIFthcXXDrV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1ZRk1OMkRBX05oSSZhYl9jaGFubmVsPVByb2plY3RTeW5kaWNhdGUpDQoNCg0KDQojIyBBbsOhbGlzaXMgZGUgU2VudGltaWVudG9zDQoNClNlIHJlYWxpesOzIHVuIGFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3Mgb2N1cGFuZG8gZWwgcGFxdWV0ZSBgc2VudGltZW50UmAuIFByaW1lcm8gc2UgaGl6byB1biBhbsOhbGlzaXMgZGUgcG9sYXJpZGFkLCBzZW50aW1pZW50b3MgbmVnYXRpdm9zIHZlcnN1cyBzZW50aW1pZW50b3MgcG9zaXRpdm9zLiBFbCBwYXF1ZXRlIHNlbnRpbWVudFIgY2FsY3VsYSBsb3Mgc2VudGltaWVudG9zIGRlbnRybyBkZSBjYWRhIGFydMOtY3VsbyBtaXJhbmRvIGNhZGEgdW5hIGRlIGxhcyBvcmFjaW9uZXMgcXVlIGNvbXBvbmVuIGVsIHRleHRvLiBMYSBtYW5lcmEgZW4gZXNwZWPDrWZpY28gZGUgY29tbyBzZSBsZSBhc2lnbmEgdW4gcHVudGFqZSBhIGNhZGEgYXJ0w61jdWxvIHB1ZWRlIHNlciByZXZpc2FkYSBlbiBlc3RlIFtsaW5rXShodHRwczovL2dpdGh1Yi5jb20vdHJpbmtlci9zZW50aW1lbnRyKS4gTG8gaW1wb3J0YW50ZSBlcyBzYWJlciB2YWxvcmVzIHBvc2l0aXZvcyBlcXVpdmFsZW4gYSBzZW50aW1pZW50b3MgcG9zaXRpdm9zIHkgdmFsb3JlcyBuZWdhdGl2b3MgYSBzZW50aW1pZW50b3MgbmVnYXRpdm9zLiBDYWxjdWxhbW9zIGVsIHByb21lZGlvIGRlIHNlbnRpbWllbnRvIGRlIGxvcyBhcnTDrWN1bG9zIHBvciBtZXMgZGVsIGHDsW8geSBlc3RvcyBzb24gbG9zIHJlc3VsdGFkb3MgcXVlIGVuY29udHJhbW9zOg0KDQoNCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTcuNSwgZmlnLmhlaWdodD00LjV9DQoNCnBvbGFyaWRhZCAlPiUgZ3JvdXBfYnkodGl0bGUsZGF0ZTIpICU+JSANCiAgc3VtbWFyaXplKGF2Z19zZW50aW1lbnQ9bWVhbihzZW50aW1lbnQpKSAlPiUgZ3JvdXBfYnkobW9udGg9Zmxvb3JfZGF0ZShkYXRlMiwgIm1vbnRoIikpICU+JSANCiAgc3VtbWFyaXplKGF2Z19zZW50aW1lbnQ9bWVhbihhdmdfc2VudGltZW50KSkgJT4lIA0KICBwbG90X2x5KCB4ID0gfm1vbnRoKSAlPiUgYWRkX3RyYWNlKHkgPSB+YXZnX3NlbnRpbWVudCwgbmFtZSA9ICd0cmFjZSAwJyxtb2RlID0gJ2xpbmVzJyklPiUgDQogIGxheW91dCh0aXRsZSA9ICJTZW50aW1lbnQgQW5hbHlzaXMgKFBvbGFyaXR5KSAyMDIwIikNCmBgYA0KDQpMbyBwcmltZXJvIHF1ZSBsbGFtYSBsYSBhdGVuY2nDs24gZXMgZWwgY2xhcm8gZWZlY3RvIHF1ZSB0dXZvIGxhIHBhbmRlbWlhIHNvYnJlIGxvcyBzZW50aW1pZW50b3MgZGUgbG9zIGNvbHVtbmlzdGFzIGRlIFByb2plY3QgU3luZGljYXRlLiBFbCBlZmVjdG8gZnVlIG5lZ2F0aXZvIGRlc2RlIG1hcnpvIGEgbWF5by4gRWwgb3RybyBtb21lbnRvIGVuIGRvbmRlIGxvcyBzZW50aW1pZW50b3MgYmFqYW4gZXMgZW4gb2N0dWJyZSBkZWJpZG8gYSBsYXMgZWxlY2Npb25lcyBlbiBFc3RhZG9zIFVuaWRvcyB5IGVuIGVzcGVjw61maWNvIGEgbGEgbmVnYXRpdmEgZGUgRG9uYWxkIFRydW1wIGRlIHJlY29ub2NlciBsb3MgcmVzdWx0YWRvcy4gTG8gc2VndW5kbyBxdWUgc2UgYW5hbGl6w7MgZnVlcm9uIGxhcyBlbW9jaW9uZXMsIG5vIHNvbG8gcG9sYXJpZGFkLCBjb24gZWwgZmluIGRlIHZlciBlbiBlc3BlY8OtZmljbyBxdWUgZnVlIGxvIHF1ZSBzdWNlZGnDsywgYXF1w60gdW4gZ3LDoWZpY28gY29uIGxvcyByZXN1bHRhZG9zLg0KDQoNCmBgYHtyLGVjaG89RkFMU0UsIGZpZy53aWR0aD03LjUsIGZpZy5oZWlnaHQ9NC4yLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KDQp0cnVzdDwtZW1vY2lvbmVzICU+JSANCiAgZ3JvdXBfYnkobW9udGg9Zmxvb3JfZGF0ZShkYXRlMiwgIm1vbnRoIiksZW1vdGlvbl90eXBlKSAlPiUgDQogIHN1bW1hcml6ZShhdmVfZW1vdGlvbj1tZWFuKGF2ZV9lbW90aW9uKSklPiUgDQogIGZpbHRlcihlbW90aW9uX3R5cGU9PSJ0cnVzdCIpICU+JSBzZWxlY3QoYXZlX2Vtb3Rpb24pDQoNCnNhZG5lc3M8LWVtb2Npb25lcyAlPiUgDQogIGdyb3VwX2J5KG1vbnRoPWZsb29yX2RhdGUoZGF0ZTIsICJtb250aCIpLGVtb3Rpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpemUoYXZlX2Vtb3Rpb249bWVhbihhdmVfZW1vdGlvbikpJT4lIA0KICBmaWx0ZXIoZW1vdGlvbl90eXBlPT0ic2FkbmVzcyIpICU+JSBzZWxlY3QoYXZlX2Vtb3Rpb24pDQoNCmFudGljaXBhdGlvbjwtZW1vY2lvbmVzICU+JSANCiAgZ3JvdXBfYnkobW9udGg9Zmxvb3JfZGF0ZShkYXRlMiwgIm1vbnRoIiksZW1vdGlvbl90eXBlKSAlPiUgDQogIHN1bW1hcml6ZShhdmVfZW1vdGlvbj1tZWFuKGF2ZV9lbW90aW9uKSklPiUgDQogIGZpbHRlcihlbW90aW9uX3R5cGU9PSJhbnRpY2lwYXRpb24iKSAlPiUgc2VsZWN0KGF2ZV9lbW90aW9uKQ0KDQpkaXNndXN0PC1lbW9jaW9uZXMgJT4lIA0KICBncm91cF9ieShtb250aD1mbG9vcl9kYXRlKGRhdGUyLCAibW9udGgiKSxlbW90aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXplKGF2ZV9lbW90aW9uPW1lYW4oYXZlX2Vtb3Rpb24pKSU+JSANCiAgZmlsdGVyKGVtb3Rpb25fdHlwZT09ImRpc2d1c3QiKSAlPiUgc2VsZWN0KGF2ZV9lbW90aW9uKQ0KDQpmZWFyPC1lbW9jaW9uZXMgJT4lIA0KICBncm91cF9ieShtb250aD1mbG9vcl9kYXRlKGRhdGUyLCAibW9udGgiKSxlbW90aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXplKGF2ZV9lbW90aW9uPW1lYW4oYXZlX2Vtb3Rpb24pKSU+JSANCiAgZmlsdGVyKGVtb3Rpb25fdHlwZT09ImZlYXIiKSAlPiUgc2VsZWN0KGF2ZV9lbW90aW9uKQ0KDQpqb3k8LWVtb2Npb25lcyAlPiUgDQogIGdyb3VwX2J5KG1vbnRoPWZsb29yX2RhdGUoZGF0ZTIsICJtb250aCIpLGVtb3Rpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpemUoYXZlX2Vtb3Rpb249bWVhbihhdmVfZW1vdGlvbikpJT4lIA0KICBmaWx0ZXIoZW1vdGlvbl90eXBlPT0iam95IikgJT4lIHNlbGVjdChhdmVfZW1vdGlvbikNCg0Kc3VycHJpc2U8LWVtb2Npb25lcyAlPiUgDQogIGdyb3VwX2J5KG1vbnRoPWZsb29yX2RhdGUoZGF0ZTIsICJtb250aCIpLGVtb3Rpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpemUoYXZlX2Vtb3Rpb249bWVhbihhdmVfZW1vdGlvbikpJT4lIA0KICBmaWx0ZXIoZW1vdGlvbl90eXBlPT0ic3VycHJpc2UiKSAlPiUgc2VsZWN0KGF2ZV9lbW90aW9uKQ0KDQphbmdlcjwtZW1vY2lvbmVzICU+JSANCiAgZ3JvdXBfYnkobW9udGg9Zmxvb3JfZGF0ZShkYXRlMiwgIm1vbnRoIiksZW1vdGlvbl90eXBlKSAlPiUgDQogIHN1bW1hcml6ZShhdmVfZW1vdGlvbj1tZWFuKGF2ZV9lbW90aW9uKSklPiUgDQogIGZpbHRlcihlbW90aW9uX3R5cGU9PSJhbmdlciIpICU+JSBzZWxlY3QoYXZlX2Vtb3Rpb24pDQoNCmZlY2hhPC10cnVzdCAlPiUgc2VsZWN0KG1vbnRoKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoZmVjaGEsIHRydXN0LCBzYWRuZXNzLGFudGljaXBhdGlvbixkaXNndXN0LGZlYXIsam95LHN1cnByaXNlLGFuZ2VyKQ0KDQpwbG90X2x5KGRhdGEsIHggPSB+bW9udGgpICU+JSBhZGRfdHJhY2UoeSA9IH5hdmVfZW1vdGlvbiwgbmFtZSA9ICdUcnVzdCcsbW9kZSA9ICdsaW5lcycpJT4lIA0KICBsYXlvdXQodGl0bGUgPSAiU2VudGltZW50IEFuYWx5c2lzIChQb2xhcml0eSkgMjAyMCIpJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5hdmVfZW1vdGlvbi4xLCBuYW1lID0gJ1NhZG5lc3MnLG1vZGUgPSAnbGluZXMnKSAlPiUgIA0KICBhZGRfdHJhY2UoeSA9IH5hdmVfZW1vdGlvbi4yLCBuYW1lID0gJ0FudGljaXBhdGlvbicsbW9kZSA9ICdsaW5lcycpICU+JSAgDQogIGFkZF90cmFjZSh5ID0gfmF2ZV9lbW90aW9uLjMsIG5hbWUgPSAnRGlzZ3VzdCcsbW9kZSA9ICdsaW5lcycpICU+JSAgDQogIGFkZF90cmFjZSh5ID0gfmF2ZV9lbW90aW9uLjQsIG5hbWUgPSAnRmVhcicsbW9kZSA9ICdsaW5lcycpICU+JSAgDQogIGFkZF90cmFjZSh5ID0gfmF2ZV9lbW90aW9uLjUsIG5hbWUgPSAnSm95Jyxtb2RlID0gJ2xpbmVzJykgJT4lICANCiAgYWRkX3RyYWNlKHkgPSB+YXZlX2Vtb3Rpb24uNiwgbmFtZSA9ICdTdXJwcmlzZScsbW9kZSA9ICdsaW5lcycpJT4lICANCiAgYWRkX3RyYWNlKHkgPSB+YXZlX2Vtb3Rpb24uNywgbmFtZSA9ICdBbmdlcicsbW9kZSA9ICdsaW5lcycpJT4lIA0KICBsYXlvdXQodGl0bGUgPSAiU2VudGltZW50IEFuYWx5c2lzIEJ5IEVtb3Rpb25zIDIwMjAiKQ0KDQpgYGANCg0KDQpDb24gbGEgbGxlZ2FkYSBkZWwgQ09WSUQgYSBFc3RhZG9zIFVuaWRvcyB5IEV1cm9wYSBsYXMgZW1vY2lvbmVzIGRlIG1pZWRvICgqZmVhciopIHkgdHJpc3RlemEgKCpzYWRuZXNzKikgc2UgaW5jcmVtZW50YW4uIFBhcmVjaWVyYSBxdWUgdHJpc3RlemEgdGllbmUgdW4gcGVhayBtw6FzIHByb2xvbmdhZG8sIG1hbnRlbmnDqW5kb3NlIG3DoXMgbyBtZW5vcyBlc3RhYmxlIGhhc3RhIG1heW8uIFBvciBzdSBwYXJ0ZSBsYXMgZW1vY2lvbmVzIGRlIGZlbGljaWRhZCAoKmpveSopIHkgY29uZmlhbnphICgqdHJ1c3QqKSBkaXNtaW51eWVuIGVuIGVzdGUgbWlzbW8gcGVyaW9kby4gT3RybyBwdW50byBkZSBpbmZsZXhpw7NuIGVzIG9jdHVicmUuIFBvciB1biBsYWRvLCBsYXMgZW1vY2lvbmVzIGRlIGNvbmZpYW56YSwgZmVsaWNpZGFkIHkgYW50aWNpcGFjacOzbigqYW50aWNpcGF0aW9uKikgc3ViZW4gcHJpbmNpcGFsbWVudGUgcG9yIGxhcyBleHBlY3RhdGl2YXMgcXVlIGdlbmVyw7MgbGEgdmljdG9yaWEgZGUgSm9lIEJpZGVuIHNvYnJlIGxhIHBvbMOtdGljYSBpbnRlcm5hY2lvbmFsLiBBbCBtaXNtbyB0aWVtcG8gbGEgbmVnYXRpdmEgZGUgVHJ1bXAgYSBhY2VwdGFyIGxvcyByZXN1bHRhZG9zIHByb3ZvY28gcXVlIGxvcyBzZW50aW1pZW50b3MgZGUgZW5vam8oKmFuZ2VyKiksIHRyaXN0ZXphIHkgbWllZG8gdGFtYmnDqW4gYXVtZW50YXJhbi4NCg0KDQoNCg0KDQojIyBSZWZsZXhpb25lcyBGaW5hbGVzDQoNCkVzdGUgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBhcnJvamEgY2llcnRhcyBsdWNlcyBxdWUgc29uIGludGVyZXNhbnRlcyBzb2JyZSBlbCBhY29udGVjZXIgbm90aWNpb3NvIGRlbCBhw7FvIHBhc2Fkby4gRXMgZmFzY2luYW50ZSBjb25zdGF0YXIgZWwgZWZlY3RvIHF1ZSB0dXZpZXJvbiBsb3MgZmVuw7NtZW5vcyBtw6FzIGltcG9ydGFudGVzIGRlbCBhw7FvOiBMYSBQYW5kZW1pYSB5IGxhcyBlbGVjY2lvbmVzIG5vcnRlYW1lcmljYW5hcywgdGFudG8gZW4gZWwgYW7DoWxpc2lzIGRlIHTDs3BpY29zIGNvbW8gZW4gZWwgZGUgc2VudGltaWVudG9zLiANCg0KU2kgc2UgcHVkaWVyYSByZXN1bWlyIGVsIGHDsW8gcGFzYWRvLCBzZSB0ZW5kcsOtYSBxdWUgYWwgY29taWVuem8gbG9zIHRlbWFzIG3DoXMgaW1wb3J0YW50ZXMgZnVlcm9uIGVsIGFzZXNpbmF0byBkZSBRYXNzZW0gU29sZWltYW5pIHkgZWwgKmltcGVhY2htZW50KiBkZSBUcnVtcC4gQ29uIGxhIGxsZWdhZGEgZGVsIENPVklEIGEgRXN0YWRvcyBVbmlkb3MgeSBFdXJvcGEgdG9kbyBjYW1iaW8uIExhIGFnZW5kYSBwYXNvIGEgZXN0YXIgdG9tYWRhIHBvciBlc3RlIHTDs3BpY28geSBwb3IgbGFzIGNvbnNlY3VlbmNpYXMgZWNvbsOzbWljYXMgcXVlIGxhIHBhbmRlbWlhIGliYSBhIHRlbmVyLiBIYWNpYSBmaW5lcyBkZSBhw7FvIGxhcyBlbGVjY2lvbmVzIHByZXNpZGVuY2lhbGVzIGRlIEVzdGFkb3MgVW5pZG9zIHkgbGEgcG9zdGVyaW9yIG5lZ2F0aXZhIGRlIERvbmFsZCBUcnVtcCBkZSBhY2VwdGFyIHN1IGRlcnJvdGEgcGFzYXJvbiBhIHNlciBlbCBjZW50cm8gZGUgYXRlbmNpw7NuLg0KDQpBIHBlc2FyIGRlIGxvIHlhIG1lbmNpb25hZG8sIHF1ZWRhIGVzcGFjaW8gcGFyYSBtZWpvcmFyIHRhbnRvIGVsIGFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MgY29tbyBsYSBkZXRlY2Npw7NuIGRlIHTDs3BpY29zLiBTb2JyZSBlbCBwcmltZXJvLCBzZSBwdWVkZW4gYWRhcHRhciBtZWpvciBsb3MgZGljY2lvbmFyaW9zIGRlIHNlbnRpbWllbnRvcyB5IGVtb2Npb25lcyBwYXJhIHRlbmVyIHJlc3VsdGFkb3MgbcOhcyBhZGVjdWFkb3MuIEVuIGVsIGNhc28gZGVsIHNlZ3VuZG8sIGVzIHBvc2libGUgYWdyZWdhciBtw6FzIHTDs3BpY29zIHBhcmEgcG9kZXIgZW50ZW5kZXIgZGUgbWVqb3IgY3VhbGVzIGZ1ZXJvbiBsYXMgdGVtw6F0aWNhcyBxdWUgZXN0dXZpZXJvbiBwcmVzZW50ZXMgZW4gbGEgYWdlbmRhIG5vdGljaW9zYSBlbiAyMDIwLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=