De nada sirve amar un informe en R Markdown y luego compilarlo si nadie lo va a ver. Hay que hacérselo llegar a las personas que deben leerlo. Publicar los reportes en una página web puede ser un método especialmente útil para reportes que requieren actualizarse periódicamente y lo bueno es que podés convertir tu reporte de R Markdown en una página web en muy pocos pasos.

Sitio web de una sola página

Lo bueno es que si ya sabés cómo generar un reporte en html usando R Markdown, ya sabés todo lo que necesitás para publicar un sitio web simple! Lo único que hace falta es un servicio que te hostee el archivo y lo muestre a los visitantes. Uno de ellos es Netlify, que permite crear un sitio web con sólo arrastrar una carpeta.

Pero primero un pequeño detalle. Seguramente tu reporte tiene algún nombre descriptivo consistente con su contenido, pero para este paso va a tener que tener el nombre especial: “index.html”. Para esto tenés dos opciones:

  1. ponerle “index.Rmd” al archivo de R Markdown y knitear como siempre
  2. que tu archivo Rmd tenga el nombre que sea, knitear como siempre y luego ir y renombrar el archivo de salida como “index.html”

En cualquiera de los dos casos, lo que querés tener es una carpeta con un archivo llamado “index.html” adentro. Listo, eso es un sitio web!

Ahora lo último que queda es ir a https://app.netlify.com/drop y arrastrar la carpeta. Netlify va a crear una página web con un nombre aleatorio:

Desafío Creá una página web! 1. creá una copia del informe que venís trabajando, renombrala “index.Rmd”, kniteá y asegurate que el resultado sea un archivo llamado “index.html” en la raiz de la carpeta del proyecto. 2. Andá a https://app.netlify.com/drop 3. Arrastrá la carpeta de tu proyecto, que tiene el archivo index.html.

Habrás notado que Netlify borra los sitios web luego de 24 horas. Para que tu sitio sea permanente tenés que crearte una cuenta.

Sitio web de muchas páginas

Esto que hiciste para un sitio web con una sola página se puede extender para un sitio web con varias páginas simplemente agregando otros archivos html a la carpeta que subís a Netlify. El problema es que por convención, el archivo que vas a poder ver cuando entrás a la URL de tu página siempre va a ser el archivo index.html. Para poder ver los otros tenés agregarlos en la URL, pero esto requiere que sepas el nombre de cada archivo y es muy poco amigable.

Para un sitio web con más de una página, lo mejor es que el archivo index.html (generado a partir de un archivo llamado “index.Rmd”) sea una página “bienvenida” donde estén los vínculos a todos demás archivos. Por ejemplo, un buen archivo index.Rmd podría ser algo como esto:

---
title: "Inicio"
---

### Listado de informes:

* Informe 1: [link](informe_1.html)
* Informe 2: [link](informe_2.html)

Donde los los archivos informe_1.html e informe_2.html serían generados por sus correspondientes archivos informe_1.Rmd e informe_2.Rmd. Notá que los links son a los archivos html, no a los archivos Rmd!

Desafío Creá un sitio web con una página de inicio!

  1. Creá uno o más archivos Rmd (podés dejar la plantilla por defecto que da RStudio) y knitealos en sus respectivos archivos html.
  2. Abrí el archivo index.Rmd convertila en una página de inicio con vínculos a los archivos html que creaste y knitealo para obtener el archivo index.html
  3. Subí esa carpeta a Netlify.

Sitio web organizado

Ahora tenés un sitio web funcional pero el flujo de trabajo es muy manual. Tenés que knitear los documentos uno por uno cada vez que los cambiás y en la carpeta de tu proyecto tenés tanto los archivos Rmd como los html, lo cual puede ser molesto. Además, cada página parece aislada: no es posible navegar entre los distintos informes.

Estos problemas se puede resolver agregando un archivo con el nombre “_site.yml” en la carpeta de tu proyecto. Este archivo va a identificar a este proyecto como un sitio web y va a tener todas las opciones globales del mismo. Además va a servir para generar una barra de navegación que lo va a hacer mucho más amigable.

Por ejemplo, el archivo _site.yml de este sitio web tiene las siguientes líneas:

output_dir: docs

output:
  html_document:
    theme: united

navbar: 
  title: Página con informes
  left: 
  - text: Informes
    menu: 
      - text: Informe 1
        href: informe_1.html
      - text: Informe 2
        href: informe_2.html

¿Qué es lo que hace cada parte?

  • output_dir: docs define que el sitio web se va a generar en la carpeta “docs”, que va a estar dentro de la carpeta del proyecto. Esa carpeta va a tener todos los archivos html y demás archivos necesarios para que el sitio funcione.

  • output:... define opciones globales de salida para no tener que definirlas dentro de cada archivo Rmd. Podés ver las opciones disponibles en la documentación con ?rmarkdown::html_document(). En este caso, define que la apariencia a a ser con el tema “united”.

  • navbar:... define una barra de navegación que ves ahí arriba. Tiene varias partes, como un título, un link que lleva a la hoja de ruta, y dos menúes desplegables.

Las partes del navbar

Tener el archivo _site.yaml tiene otra gran ventaja. Ahora RStudio sabe que querés hacer un sitio web y podés generar todo el sitio web directamente yendo a la solapa “Build” y haciendo click en “Build Website” o con el atajo de teclado Ctrl + Shift + B. Esto va a renderizar todos los archivos .Rmd que estén en la raiz del proyecto y va a generar el sitio web en la carpeta especificada en output_dir.

Desafío Armá tu sitio web con barra de navegación!

  1. Creá un archivo “_site.yaml”.
  2. Definí el tema (fijate en la documentación de rmarkdown::html_document cuáles son las opciones disponibles)
  3. Generá una barra de navegación que linkee a los informes.
  4. Generá el sitio apretando el botón “Build Website” que está en la solapa “Build” de RStudio.
  5. Andá a https://app.netlify.com/drop y arrastrá la carpeta donde se generó el sitio (que va a ser una carpeta dentro del proyecto, no la carpeta del proyecto).
LS0tCnRpdGxlOiAiTmV0bGlmeSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGhpZ2hsaWdodDogdGFuZ28KLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCgpEZSBuYWRhIHNpcnZlIGFtYXIgdW4gaW5mb3JtZSBlbiBSIE1hcmtkb3duIHkgbHVlZ28gY29tcGlsYXJsbyBzaSBuYWRpZSBsbyB2YSBhIHZlci4gSGF5IHF1ZSBoYWPDqXJzZWxvIGxsZWdhciBhIGxhcyBwZXJzb25hcyBxdWUgZGViZW4gbGVlcmxvLiBQdWJsaWNhciBsb3MgcmVwb3J0ZXMgZW4gdW5hIHDDoWdpbmEgd2ViIHB1ZWRlIHNlciB1biBtw6l0b2RvIGVzcGVjaWFsbWVudGUgw7p0aWwgcGFyYSByZXBvcnRlcyBxdWUgcmVxdWllcmVuIGFjdHVhbGl6YXJzZSBwZXJpw7NkaWNhbWVudGUgeSBsbyBidWVubyBlcyBxdWUgcG9kw6lzIGNvbnZlcnRpciB0dSByZXBvcnRlIGRlIFIgTWFya2Rvd24gZW4gdW5hIHDDoWdpbmEgd2ViIGVuIG11eSBwb2NvcyBwYXNvcy4KCiMjIFNpdGlvIHdlYiBkZSB1bmEgc29sYSBww6FnaW5hIAoKTG8gYnVlbm8gZXMgcXVlIHNpIHlhIHNhYsOpcyBjw7NtbyBnZW5lcmFyIHVuIHJlcG9ydGUgZW4gaHRtbCB1c2FuZG8gUiBNYXJrZG93biwgeWEgc2Fiw6lzIHRvZG8gbG8gcXVlIG5lY2VzaXTDoXMgcGFyYSBwdWJsaWNhciB1biBzaXRpbyB3ZWIgc2ltcGxlISBMbyDDum5pY28gcXVlIGhhY2UgZmFsdGEgZXMgdW4gc2VydmljaW8gcXVlIHRlIGhvc3RlZSBlbCBhcmNoaXZvIHkgbG8gbXVlc3RyZSBhIGxvcyB2aXNpdGFudGVzLiBVbm8gZGUgZWxsb3MgZXMgW05ldGxpZnldKGh0dHBzOi8vd3d3Lm5ldGxpZnkuY29tLyksIHF1ZSBwZXJtaXRlIGNyZWFyIHVuIHNpdGlvIHdlYiBjb24gc8OzbG8gYXJyYXN0cmFyIHVuYSBjYXJwZXRhLiAKClBlcm8gcHJpbWVybyB1biBwZXF1ZcOxbyBkZXRhbGxlLiBTZWd1cmFtZW50ZSB0dSByZXBvcnRlIHRpZW5lIGFsZ8O6biBub21icmUgZGVzY3JpcHRpdm8gY29uc2lzdGVudGUgY29uIHN1IGNvbnRlbmlkbywgcGVybyBwYXJhIGVzdGUgcGFzbyB2YSBhIHRlbmVyIHF1ZSB0ZW5lciBlbCBub21icmUgZXNwZWNpYWw6ICJpbmRleC5odG1sIi4gUGFyYSBlc3RvIHRlbsOpcyBkb3Mgb3BjaW9uZXM6IAoKMS4gcG9uZXJsZSAiaW5kZXguUm1kIiBhbCBhcmNoaXZvIGRlIFIgTWFya2Rvd24geSBrbml0ZWFyIGNvbW8gc2llbXByZQoyLiBxdWUgdHUgYXJjaGl2byBSbWQgdGVuZ2EgZWwgbm9tYnJlIHF1ZSBzZWEsIGtuaXRlYXIgY29tbyBzaWVtcHJlIHkgbHVlZ28gaXIgeSByZW5vbWJyYXIgZWwgYXJjaGl2byBkZSBzYWxpZGEgY29tbyAiaW5kZXguaHRtbCIKCkVuIGN1YWxxdWllcmEgZGUgbG9zIGRvcyBjYXNvcywgbG8gcXVlIHF1ZXLDqXMgdGVuZXIgZXMgdW5hIGNhcnBldGEgY29uIHVuIGFyY2hpdm8gbGxhbWFkbyAiaW5kZXguaHRtbCIgYWRlbnRyby4gTGlzdG8sIGVzbyBlcyB1biBzaXRpbyB3ZWIhCgpBaG9yYSBsbyDDumx0aW1vIHF1ZSBxdWVkYSBlcyBpciBhIFtodHRwczovL2FwcC5uZXRsaWZ5LmNvbS9kcm9wXShodHRwczovL2FwcC5uZXRsaWZ5LmNvbS9kcm9wKSB5IGFycmFzdHJhciBsYSBjYXJwZXRhLiBOZXRsaWZ5IHZhIGEgY3JlYXIgdW5hIHDDoWdpbmEgd2ViIGNvbiB1biBub21icmUgYWxlYXRvcmlvOgoKCjxmaWd1cmU+Cjx2aWRlbyB3aWR0aD03NzBweCBjb250cm9scz4KICA8c291cmNlIHNyYz0iaW1nL25ldGxpZnlfZHJvcC53ZWJtIiB0eXBlPSJ2aWRlby93ZWJtIj4KPC92aWRlbz4KPC9maWd1cmU+CgoKOjo6IHsuYWxlcnQgLmFsZXJ0LWluZm99IAoqKkRlc2Fmw61vKiogQ3Jlw6EgdW5hIHDDoWdpbmEgd2ViIQoxLiBjcmXDoSB1bmEgY29waWEgZGVsIGluZm9ybWUgcXVlIHZlbsOtcyB0cmFiYWphbmRvLCByZW5vbWJyYWxhICJpbmRleC5SbWQiLCAqa25pdGXDoSogeSBhc2VndXJhdGUgcXVlIGVsIHJlc3VsdGFkbyBzZWEgdW4gYXJjaGl2byBsbGFtYWRvICJpbmRleC5odG1sIiBlbiBsYSByYWl6IGRlIGxhIGNhcnBldGEgZGVsIHByb3llY3RvLiAKMi4gQW5kw6EgYSBbaHR0cHM6Ly9hcHAubmV0bGlmeS5jb20vZHJvcF0oaHR0cHM6Ly9hcHAubmV0bGlmeS5jb20vZHJvcCkKMy4gQXJyYXN0csOhIGxhIGNhcnBldGEgZGUgdHUgcHJveWVjdG8sIHF1ZSB0aWVuZSBlbCBhcmNoaXZvIGluZGV4Lmh0bWwuCjo6OgoKCjo6OnsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3N9CkhhYnLDoXMgbm90YWRvIHF1ZSBOZXRsaWZ5IGJvcnJhIGxvcyBzaXRpb3Mgd2ViIGx1ZWdvIGRlIDI0IGhvcmFzLiBQYXJhIHF1ZSB0dSBzaXRpbyBzZWEgcGVybWFuZW50ZSB0ZW7DqXMgcXVlIGNyZWFydGUgdW5hIGN1ZW50YS4KOjo6CgojIyBTaXRpbyB3ZWIgZGUgbXVjaGFzIHDDoWdpbmFzCgpFc3RvIHF1ZSBoaWNpc3RlIHBhcmEgdW4gc2l0aW8gd2ViIGNvbiB1bmEgc29sYSBww6FnaW5hIHNlIHB1ZWRlIGV4dGVuZGVyIHBhcmEgdW4gc2l0aW8gd2ViIGNvbiB2YXJpYXMgcMOhZ2luYXMgc2ltcGxlbWVudGUgYWdyZWdhbmRvIG90cm9zIGFyY2hpdm9zIGh0bWwgYSBsYSBjYXJwZXRhIHF1ZSBzdWLDrXMgYSBOZXRsaWZ5LiBFbCBwcm9ibGVtYSBlcyBxdWUgcG9yIGNvbnZlbmNpw7NuLCBlbCBhcmNoaXZvIHF1ZSB2YXMgYSBwb2RlciB2ZXIgY3VhbmRvIGVudHLDoXMgYSBsYSBVUkwgZGUgdHUgcMOhZ2luYSBzaWVtcHJlIHZhIGEgc2VyIGVsIGFyY2hpdm8gaW5kZXguaHRtbC4gUGFyYSBwb2RlciB2ZXIgbG9zIG90cm9zIHRlbsOpcyBhZ3JlZ2FybG9zIGVuIGxhIFVSTCwgcGVybyBlc3RvIHJlcXVpZXJlIHF1ZSBzZXBhcyBlbCBub21icmUgZGUgY2FkYSBhcmNoaXZvIHkgZXMgbXV5IHBvY28gYW1pZ2FibGUuIAoKUGFyYSB1biBzaXRpbyB3ZWIgY29uIG3DoXMgZGUgdW5hIHDDoWdpbmEsIGxvIG1lam9yIGVzIHF1ZSBlbCBhcmNoaXZvIGluZGV4Lmh0bWwgKGdlbmVyYWRvIGEgcGFydGlyIGRlIHVuIGFyY2hpdm8gbGxhbWFkbyAiaW5kZXguUm1kIikgc2VhIHVuYSBww6FnaW5hICJiaWVudmVuaWRhIiBkb25kZSBlc3TDqW4gbG9zIHbDrW5jdWxvcyBhIHRvZG9zIGRlbcOhcyBhcmNoaXZvcy4gUG9yIGVqZW1wbG8sIHVuIGJ1ZW4gYXJjaGl2byBpbmRleC5SbWQgcG9kcsOtYSBzZXIgYWxnbyBjb21vIGVzdG86CgpgYGBtYXJrZG93bgotLS0KdGl0bGU6ICJJbmljaW8iCi0tLQoKIyMjIExpc3RhZG8gZGUgaW5mb3JtZXM6CgoqIEluZm9ybWUgMTogW2xpbmtdKGluZm9ybWVfMS5odG1sKQoqIEluZm9ybWUgMjogW2xpbmtdKGluZm9ybWVfMi5odG1sKQpgYGAKCkRvbmRlIGxvcyBsb3MgYXJjaGl2b3MgaW5mb3JtZV8xLmh0bWwgZSBpbmZvcm1lXzIuaHRtbCBzZXLDrWFuIGdlbmVyYWRvcyBwb3Igc3VzIGNvcnJlc3BvbmRpZW50ZXMgYXJjaGl2b3MgaW5mb3JtZV8xLlJtZCBlIGluZm9ybWVfMi5SbWQuIE5vdMOhIHF1ZSBsb3MgbGlua3Mgc29uIGEgbG9zIGFyY2hpdm9zIGh0bWwsIG5vIGEgbG9zIGFyY2hpdm9zIFJtZCEKCjo6OiB7LmFsZXJ0IC5hbGVydC1pbmZvfSAKKipEZXNhZsOtbyoqIENyZcOhIHVuIHNpdGlvIHdlYiBjb24gdW5hIHDDoWdpbmEgZGUgaW5pY2lvIQoKMS4gQ3Jlw6EgdW5vIG8gbcOhcyBhcmNoaXZvcyBSbWQgKHBvZMOpcyBkZWphciBsYSBwbGFudGlsbGEgcG9yIGRlZmVjdG8gcXVlIGRhIFJTdHVkaW8pIHkga25pdGVhbG9zIGVuIHN1cyByZXNwZWN0aXZvcyBhcmNoaXZvcyBodG1sLiAKMi4gQWJyw60gZWwgYXJjaGl2byBpbmRleC5SbWQgY29udmVydGlsYSBlbiB1bmEgcMOhZ2luYSBkZSBpbmljaW8gY29uIHbDrW5jdWxvcyBhIGxvcyBhcmNoaXZvcyBodG1sIHF1ZSBjcmVhc3RlIHkga25pdGVhbG8gcGFyYSBvYnRlbmVyIGVsIGFyY2hpdm8gaW5kZXguaHRtbAozLiBTdWLDrSBlc2EgY2FycGV0YSBhIE5ldGxpZnkuIAo6OjoKCgojIyBTaXRpbyB3ZWIgb3JnYW5pemFkbwoKQWhvcmEgdGVuw6lzIHVuIHNpdGlvIHdlYiBmdW5jaW9uYWwgcGVybyBlbCBmbHVqbyBkZSB0cmFiYWpvIGVzIG11eSBtYW51YWwuIFRlbsOpcyBxdWUga25pdGVhciBsb3MgZG9jdW1lbnRvcyB1bm8gcG9yIHVubyBjYWRhIHZleiBxdWUgbG9zIGNhbWJpw6FzIHkgZW4gbGEgY2FycGV0YSBkZSB0dSBwcm95ZWN0byB0ZW7DqXMgdGFudG8gbG9zIGFyY2hpdm9zIFJtZCBjb21vIGxvcyBodG1sLCBsbyBjdWFsIHB1ZWRlIHNlciBtb2xlc3RvLiBBZGVtw6FzLCBjYWRhIHDDoWdpbmEgcGFyZWNlIGFpc2xhZGE6IG5vIGVzIHBvc2libGUgbmF2ZWdhciBlbnRyZSBsb3MgZGlzdGludG9zIGluZm9ybWVzLiAKCkVzdG9zIHByb2JsZW1hcyBzZSBwdWVkZSByZXNvbHZlciBhZ3JlZ2FuZG8gdW4gYXJjaGl2byBjb24gZWwgbm9tYnJlICJfc2l0ZS55bWwiIGVuIGxhIGNhcnBldGEgZGUgdHUgcHJveWVjdG8uIEVzdGUgYXJjaGl2byB2YSBhIGlkZW50aWZpY2FyIGEgZXN0ZSBwcm95ZWN0byBjb21vIHVuIHNpdGlvIHdlYiB5IHZhIGEgdGVuZXIgdG9kYXMgbGFzIG9wY2lvbmVzIGdsb2JhbGVzIGRlbCBtaXNtby4gQWRlbcOhcyB2YSBhIHNlcnZpciBwYXJhIGdlbmVyYXIgdW5hIGJhcnJhIGRlIG5hdmVnYWNpw7NuIHF1ZSBsbyB2YSBhIGhhY2VyIG11Y2hvIG3DoXMgYW1pZ2FibGUuIAoKUG9yIGVqZW1wbG8sIGVsIGFyY2hpdm8gX3NpdGUueW1sIGRlIGVzdGUgc2l0aW8gd2ViIHRpZW5lIGxhcyBzaWd1aWVudGVzIGzDrW5lYXM6CgpgYGB5YW1sCm91dHB1dF9kaXI6IGRvY3MKCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IHVuaXRlZAoKbmF2YmFyOiAKICB0aXRsZTogUMOhZ2luYSBjb24gaW5mb3JtZXMKICBsZWZ0OiAKICAtIHRleHQ6IEluZm9ybWVzCiAgICBtZW51OiAKICAgICAgLSB0ZXh0OiBJbmZvcm1lIDEKICAgICAgICBocmVmOiBpbmZvcm1lXzEuaHRtbAogICAgICAtIHRleHQ6IEluZm9ybWUgMgogICAgICAgIGhyZWY6IGluZm9ybWVfMi5odG1sCmBgYAoKCgrCv1F1w6kgZXMgbG8gcXVlIGhhY2UgY2FkYSBwYXJ0ZT8KCiogYG91dHB1dF9kaXI6IGRvY3NgIGRlZmluZSBxdWUgZWwgc2l0aW8gd2ViIHNlIHZhIGEgZ2VuZXJhciBlbiBsYSBjYXJwZXRhICJkb2NzIiwgcXVlIHZhIGEgZXN0YXIgZGVudHJvIGRlIGxhIGNhcnBldGEgZGVsIHByb3llY3RvLiBFc2EgY2FycGV0YSB2YSBhIHRlbmVyIHRvZG9zIGxvcyBhcmNoaXZvcyBodG1sIHkgZGVtw6FzIGFyY2hpdm9zIG5lY2VzYXJpb3MgcGFyYSBxdWUgZWwgc2l0aW8gZnVuY2lvbmUuCgoqIGBvdXRwdXQ6Li4uYCBkZWZpbmUgb3BjaW9uZXMgZ2xvYmFsZXMgZGUgc2FsaWRhIHBhcmEgbm8gdGVuZXIgcXVlIGRlZmluaXJsYXMgZGVudHJvIGRlIGNhZGEgYXJjaGl2byBSbWQuIFBvZMOpcyB2ZXIgbGFzIG9wY2lvbmVzIGRpc3BvbmlibGVzIGVuIGxhIGRvY3VtZW50YWNpw7NuIGNvbiBgP3JtYXJrZG93bjo6aHRtbF9kb2N1bWVudCgpYC4gRW4gZXN0ZSBjYXNvLCBkZWZpbmUgcXVlIGxhIGFwYXJpZW5jaWEgYSBhIHNlciBjb24gZWwgdGVtYSAidW5pdGVkIi4gCgoqIGBuYXZiYXI6Li4uYCBkZWZpbmUgdW5hIGJhcnJhIGRlIG5hdmVnYWNpw7NuIHF1ZSB2ZXMgYWjDrSBhcnJpYmEuIFRpZW5lIHZhcmlhcyBwYXJ0ZXMsIGNvbW8gdW4gdMOtdHVsbywgdW4gbGluayBxdWUgbGxldmEgYSBsYSBob2phIGRlIHJ1dGEsIHkgZG9zIG1lbsO6ZXMgZGVzcGxlZ2FibGVzLiAKCiFbTGFzIHBhcnRlcyBkZWwgbmF2YmFyXShpbWcvbmF2YmFyLnBuZykKClRlbmVyIGVsIGFyY2hpdm8gX3NpdGUueWFtbCB0aWVuZSBvdHJhIGdyYW4gdmVudGFqYS4gQWhvcmEgUlN0dWRpbyBzYWJlIHF1ZSBxdWVyw6lzIGhhY2VyIHVuIHNpdGlvIHdlYiB5IHBvZMOpcyBnZW5lcmFyIHRvZG8gZWwgc2l0aW8gd2ViIGRpcmVjdGFtZW50ZSB5ZW5kbyBhIGxhIHNvbGFwYSAiQnVpbGQiIHkgaGFjaWVuZG8gY2xpY2sgZW4gIkJ1aWxkIFdlYnNpdGUiIG8gY29uIGVsIGF0YWpvIGRlIHRlY2xhZG8gQ3RybCArIFNoaWZ0ICsgQi4gRXN0byB2YSBhIHJlbmRlcml6YXIgdG9kb3MgbG9zIGFyY2hpdm9zIC5SbWQgcXVlIGVzdMOpbiBlbiBsYSByYWl6IGRlbCBwcm95ZWN0byB5IHZhIGEgZ2VuZXJhciBlbCBzaXRpbyB3ZWIgZW4gbGEgY2FycGV0YSBlc3BlY2lmaWNhZGEgZW4gYG91dHB1dF9kaXJgLgoKOjo6IHsuYWxlcnQgLmFsZXJ0LWluZm99CioqRGVzYWbDrW8qKiBBcm3DoSB0dSBzaXRpbyB3ZWIgY29uIGJhcnJhIGRlIG5hdmVnYWNpw7NuIQoKMS4gQ3Jlw6EgdW4gYXJjaGl2byAiX3NpdGUueWFtbCIuCjIuIERlZmluw60gZWwgdGVtYSAoZmlqYXRlIGVuIGxhIGRvY3VtZW50YWNpw7NuIGRlIGBybWFya2Rvd246Omh0bWxfZG9jdW1lbnRgIGN1w6FsZXMgc29uIGxhcyBvcGNpb25lcyBkaXNwb25pYmxlcykKMy4gR2VuZXLDoSB1bmEgYmFycmEgZGUgbmF2ZWdhY2nDs24gcXVlIGxpbmtlZSBhIGxvcyBpbmZvcm1lcy4gCjQuIEdlbmVyw6EgZWwgc2l0aW8gYXByZXRhbmRvIGVsIGJvdMOzbiAiQnVpbGQgV2Vic2l0ZSIgcXVlIGVzdMOhIGVuIGxhIHNvbGFwYSAiQnVpbGQiIGRlIFJTdHVkaW8uIAo1LiBBbmTDoSBhIFtodHRwczovL2FwcC5uZXRsaWZ5LmNvbS9kcm9wXShodHRwczovL2FwcC5uZXRsaWZ5LmNvbS9kcm9wKSB5IGFycmFzdHLDoSBsYSBjYXJwZXRhIGRvbmRlIHNlIGdlbmVyw7MgZWwgc2l0aW8gKHF1ZSB2YSBhIHNlciB1bmEgY2FycGV0YSBkZW50cm8gZGVsIHByb3llY3RvLCBubyBsYSBjYXJwZXRhIGRlbCBwcm95ZWN0bykuCjo6OgoKCjxkaXYgY2xhc3M9ImJ0bi1ncm91cCIgcm9sZT0iZ3JvdXAiIGFyaWEtbGFiZWw9Ik5hdmVnYWNpw7NuIj4KICA8YSBocmVmPSAiMTEtcmVwb3J0ZXMtSUkuaHRtbCIgY2xhc3MgPSAiYnRuIGJ0bi1wcmltYXJ5Ij5BbnRlcmlvcjwvYT4KICA8YSBocmVmPSAiaG9qYS1kZS1ydXRhLmh0bWwiIGNsYXNzID0gImJ0biBidG4tcHJpbWFyeSI+SG9qYSBkZSBSdXRhPC9hPgo8L2Rpdj4KCg==