Análisis de concurrencia en programas de Elixir con la herramienta Rascal
Elixir es un lenguaje de programación destacado por su sólido modelo de concurrencia, diseñado para construir aplicaciones distribuidas, escalables y resilientes. A medida que su adopción crece en sectores como telecomunicaciones, fintech y servicios web, surge la necesidad de identificar los elemen...
- Autores:
-
Peniche Calderón, Javier David
- Tipo de recurso:
- Trabajo de grado de pregrado
- Fecha de publicación:
- 2025
- Institución:
- Universidad de los Andes
- Repositorio:
- Séneca: repositorio Uniandes
- Idioma:
- spa
- OAI Identifier:
- oai:repositorio.uniandes.edu.co:1992/75472
- Acceso en línea:
- https://hdl.handle.net/1992/75472
- Palabra clave:
- Rascal
AST
Elixir
Concurrencia
Ingeniería
- Rights
- openAccess
- License
- Attribution 4.0 International
id |
UNIANDES2_4556f8543b057a7722a615f88b553ee1 |
---|---|
oai_identifier_str |
oai:repositorio.uniandes.edu.co:1992/75472 |
network_acronym_str |
UNIANDES2 |
network_name_str |
Séneca: repositorio Uniandes |
repository_id_str |
|
dc.title.spa.fl_str_mv |
Análisis de concurrencia en programas de Elixir con la herramienta Rascal |
title |
Análisis de concurrencia en programas de Elixir con la herramienta Rascal |
spellingShingle |
Análisis de concurrencia en programas de Elixir con la herramienta Rascal Rascal AST Elixir Concurrencia Ingeniería |
title_short |
Análisis de concurrencia en programas de Elixir con la herramienta Rascal |
title_full |
Análisis de concurrencia en programas de Elixir con la herramienta Rascal |
title_fullStr |
Análisis de concurrencia en programas de Elixir con la herramienta Rascal |
title_full_unstemmed |
Análisis de concurrencia en programas de Elixir con la herramienta Rascal |
title_sort |
Análisis de concurrencia en programas de Elixir con la herramienta Rascal |
dc.creator.fl_str_mv |
Peniche Calderón, Javier David |
dc.contributor.advisor.none.fl_str_mv |
Cardozo Álvarez, Nicolás |
dc.contributor.author.none.fl_str_mv |
Peniche Calderón, Javier David |
dc.subject.keyword.spa.fl_str_mv |
Rascal AST Elixir Concurrencia |
topic |
Rascal AST Elixir Concurrencia Ingeniería |
dc.subject.themes.spa.fl_str_mv |
Ingeniería |
description |
Elixir es un lenguaje de programación destacado por su sólido modelo de concurrencia, diseñado para construir aplicaciones distribuidas, escalables y resilientes. A medida que su adopción crece en sectores como telecomunicaciones, fintech y servicios web, surge la necesidad de identificar los elementos concurrentes de sus aplicaciones. Comprender los elementos de concurrencia podría llegar en un futuro a ser útil en la facilitación en el diagnóstico de problemas y la optimización de recursos. El objetivo principal de este trabajo es identificar los elementos de concurrencia en programas desarrollados en Elixir. Para ello, Rascal facilita la transformación del código fuente de Elixir en árboles de sintaxis concreta, que representan la estructura escrita del código. Estos árboles permiten inspeccionar elementos de concurrencia y analizar las interacciones entre los componentes del programa de forma estructurada. El análisis con Rascal se fundamenta en el uso de gramáticas formales y herramientas que permiten definir tanto la sintaxis concreta (cómo se escribe el código) como la abstracta (su estructura lógica). A través de módulos gramaticales, Rascal transforma el código fuente en estructuras como árboles de sintaxis abstracta (AST), que representan los elementos del programa. En particular, los árboles de sintaxis (parse trees) proporcionan una representación jerárquica del código fuente, mostrando cómo los elementos del lenguaje se relacionan de acuerdo con sus reglas gramaticales. Esto permite identificar elementos de concurrencia, exponiendo de forma explícita las interacciones y dependencias entre los diferentes componentes. Así, los parse trees se convierten en una manera útil para la visualización de la concurrencia en programas escritos en Elixir. Estas estructuras no solo permiten detectar elementos de concurrencia, sino también la integración de Rascal con colecciones, expresiones regulares y herramientas de visualización que lo convierte en una solución versátil para el estudio de programas en diferentes lenguajes. |
publishDate |
2025 |
dc.date.accessioned.none.fl_str_mv |
2025-01-20T13:03:05Z |
dc.date.available.none.fl_str_mv |
2025-01-20T13:03:05Z |
dc.date.issued.none.fl_str_mv |
2025-01-17 |
dc.type.none.fl_str_mv |
Trabajo de grado - Pregrado |
dc.type.driver.none.fl_str_mv |
info:eu-repo/semantics/bachelorThesis |
dc.type.version.none.fl_str_mv |
info:eu-repo/semantics/acceptedVersion |
dc.type.coar.none.fl_str_mv |
http://purl.org/coar/resource_type/c_7a1f |
dc.type.content.none.fl_str_mv |
Text |
dc.type.redcol.none.fl_str_mv |
http://purl.org/redcol/resource_type/TP |
format |
http://purl.org/coar/resource_type/c_7a1f |
status_str |
acceptedVersion |
dc.identifier.uri.none.fl_str_mv |
https://hdl.handle.net/1992/75472 |
dc.identifier.instname.none.fl_str_mv |
instname:Universidad de los Andes |
dc.identifier.reponame.none.fl_str_mv |
reponame:Repositorio Institucional Séneca |
dc.identifier.repourl.none.fl_str_mv |
repourl:https://repositorio.uniandes.edu.co/ |
url |
https://hdl.handle.net/1992/75472 |
identifier_str_mv |
instname:Universidad de los Andes reponame:Repositorio Institucional Séneca repourl:https://repositorio.uniandes.edu.co/ |
dc.language.iso.none.fl_str_mv |
spa |
language |
spa |
dc.relation.references.none.fl_str_mv |
[1] “Rascal: one-stop shop for metaprogramming,” Www.cwi.nl, 2025. https://www.cwi.nl/en/results/software/rascal-one-stop-shop-for-metaprogramming/ (accessed Jan. 12, 2025). [2] “Stack Overflow,” Stackoverflow.co, 2024. https://survey.stackoverflow.co/ (accessed Jan. 12, 2025). [3] N. Savic, “Inside BEAM: How Elixir and Erlang Leverage a Shared Runtime for Resilient Applications,” Hackernoon.com, Apr. 03, 2024. https://hackernoon.com/inside-beam-how-elixir-and-erlang-leverage-a-shared-runtime-for-resilient-applications (accessed Jan. 12, 2025). [4] “The Elixir programming language,” The Elixir programming language, 2025. https://elixir-lang.org/ (accessed Jan. 12, 2025). [5] Mathijs Schuts, “Rascal DSL Tutorial,” ResearchGate, Nov. 2023. https://www.researchgate.net/publication/375422469_Rascal_DSL_Tutorial (accessed Jan. 12, 2025). [6] “The Rascal Meta Programming Language | The Rascal Meta Programming Language,” Rascal-mpl.org, 2024. https://www.rascal-mpl.org/ (accessed Jan. 12, 2025). [7] “Rascal: one-stop shop for metaprogramming,” Www.cwi.nl, 2025. https://www.cwi.nl/en/results/software/rascal-one-stop-shop-for-metaprogramming/ (accessed Jan. 12, 2025). [8] J. J. Vinju, M. A. Hills, P. Klint, van, and van, “The Rascal meta-programming language - a lab for software analysis, transformation, generation & visualization,” https://homepages.cwi.nl/~paulk/publications/ICTOPENRascalLab.pdf, Nov. 14, 2011. https://www.researchgate.net/publication/254817781_The_Rascal_meta-programming_language_-_a_lab_for_software_analysis_transformation_generation_visualization |
dc.rights.en.fl_str_mv |
Attribution 4.0 International |
dc.rights.uri.none.fl_str_mv |
http://creativecommons.org/licenses/by/4.0/ |
dc.rights.accessrights.none.fl_str_mv |
info:eu-repo/semantics/openAccess |
dc.rights.coar.none.fl_str_mv |
http://purl.org/coar/access_right/c_abf2 |
rights_invalid_str_mv |
Attribution 4.0 International http://creativecommons.org/licenses/by/4.0/ http://purl.org/coar/access_right/c_abf2 |
eu_rights_str_mv |
openAccess |
dc.format.extent.none.fl_str_mv |
34 páginas |
dc.format.mimetype.none.fl_str_mv |
application/pdf |
dc.publisher.none.fl_str_mv |
Universidad de los Andes |
dc.publisher.program.none.fl_str_mv |
Ingeniería de Sistemas y Computación |
dc.publisher.faculty.none.fl_str_mv |
Facultad de Ingeniería |
dc.publisher.department.none.fl_str_mv |
Departamento de Ingeniería de Sistemas y Computación |
publisher.none.fl_str_mv |
Universidad de los Andes |
institution |
Universidad de los Andes |
bitstream.url.fl_str_mv |
https://repositorio.uniandes.edu.co/bitstreams/e48991a1-8bb8-44c8-b52c-998fd711416e/download https://repositorio.uniandes.edu.co/bitstreams/48eb1605-8e9c-4126-8956-b39a450ff101/download https://repositorio.uniandes.edu.co/bitstreams/bba858c7-fa89-4ee1-a595-dc428db2f51a/download https://repositorio.uniandes.edu.co/bitstreams/472ac0bd-c28f-4cea-acb4-948b2e135c72/download https://repositorio.uniandes.edu.co/bitstreams/6402f4fb-ff89-4b27-9f52-47f8bfa93a20/download https://repositorio.uniandes.edu.co/bitstreams/d4b627fd-894a-4cde-be09-84d7067fa31c/download https://repositorio.uniandes.edu.co/bitstreams/db1247c3-b2f4-43f9-aac7-276d3e363c4b/download https://repositorio.uniandes.edu.co/bitstreams/f68f4a4c-6583-4699-bebf-6a9cb9794fe4/download |
bitstream.checksum.fl_str_mv |
14d9f95fa38334099dd39589798c1613 5baf669ef4e38765ff82c0982b991500 0175ea4a2d4caec4bbcc37e300941108 ae9e573a68e7f92501b6913cc846c39f 1b296b0508437fa5deda4209aee61d6c 81380ffe97743f3100d0e7ccbbe80e27 4d4cd1a1f87a2ca2aa437fea7895942e 64d580971654008a4276fb5ff0ddfbbd |
bitstream.checksumAlgorithm.fl_str_mv |
MD5 MD5 MD5 MD5 MD5 MD5 MD5 MD5 |
repository.name.fl_str_mv |
Repositorio institucional Séneca |
repository.mail.fl_str_mv |
adminrepositorio@uniandes.edu.co |
_version_ |
1831927650625519616 |
spelling |
Cardozo Álvarez, Nicolásvirtual::22186-1Peniche Calderón, Javier David2025-01-20T13:03:05Z2025-01-20T13:03:05Z2025-01-17https://hdl.handle.net/1992/75472instname:Universidad de los Andesreponame:Repositorio Institucional Sénecarepourl:https://repositorio.uniandes.edu.co/Elixir es un lenguaje de programación destacado por su sólido modelo de concurrencia, diseñado para construir aplicaciones distribuidas, escalables y resilientes. A medida que su adopción crece en sectores como telecomunicaciones, fintech y servicios web, surge la necesidad de identificar los elementos concurrentes de sus aplicaciones. Comprender los elementos de concurrencia podría llegar en un futuro a ser útil en la facilitación en el diagnóstico de problemas y la optimización de recursos. El objetivo principal de este trabajo es identificar los elementos de concurrencia en programas desarrollados en Elixir. Para ello, Rascal facilita la transformación del código fuente de Elixir en árboles de sintaxis concreta, que representan la estructura escrita del código. Estos árboles permiten inspeccionar elementos de concurrencia y analizar las interacciones entre los componentes del programa de forma estructurada. El análisis con Rascal se fundamenta en el uso de gramáticas formales y herramientas que permiten definir tanto la sintaxis concreta (cómo se escribe el código) como la abstracta (su estructura lógica). A través de módulos gramaticales, Rascal transforma el código fuente en estructuras como árboles de sintaxis abstracta (AST), que representan los elementos del programa. En particular, los árboles de sintaxis (parse trees) proporcionan una representación jerárquica del código fuente, mostrando cómo los elementos del lenguaje se relacionan de acuerdo con sus reglas gramaticales. Esto permite identificar elementos de concurrencia, exponiendo de forma explícita las interacciones y dependencias entre los diferentes componentes. Así, los parse trees se convierten en una manera útil para la visualización de la concurrencia en programas escritos en Elixir. Estas estructuras no solo permiten detectar elementos de concurrencia, sino también la integración de Rascal con colecciones, expresiones regulares y herramientas de visualización que lo convierte en una solución versátil para el estudio de programas en diferentes lenguajes.Pregrado34 páginasapplication/pdfspaUniversidad de los AndesIngeniería de Sistemas y ComputaciónFacultad de IngenieríaDepartamento de Ingeniería de Sistemas y ComputaciónAttribution 4.0 Internationalhttp://creativecommons.org/licenses/by/4.0/info:eu-repo/semantics/openAccesshttp://purl.org/coar/access_right/c_abf2Análisis de concurrencia en programas de Elixir con la herramienta RascalTrabajo de grado - Pregradoinfo:eu-repo/semantics/bachelorThesisinfo:eu-repo/semantics/acceptedVersionhttp://purl.org/coar/resource_type/c_7a1fTexthttp://purl.org/redcol/resource_type/TPRascalASTElixirConcurrenciaIngeniería[1] “Rascal: one-stop shop for metaprogramming,” Www.cwi.nl, 2025. https://www.cwi.nl/en/results/software/rascal-one-stop-shop-for-metaprogramming/ (accessed Jan. 12, 2025).[2] “Stack Overflow,” Stackoverflow.co, 2024. https://survey.stackoverflow.co/ (accessed Jan. 12, 2025).[3] N. Savic, “Inside BEAM: How Elixir and Erlang Leverage a Shared Runtime for Resilient Applications,” Hackernoon.com, Apr. 03, 2024. https://hackernoon.com/inside-beam-how-elixir-and-erlang-leverage-a-shared-runtime-for-resilient-applications (accessed Jan. 12, 2025).[4] “The Elixir programming language,” The Elixir programming language, 2025. https://elixir-lang.org/ (accessed Jan. 12, 2025).[5] Mathijs Schuts, “Rascal DSL Tutorial,” ResearchGate, Nov. 2023. https://www.researchgate.net/publication/375422469_Rascal_DSL_Tutorial (accessed Jan. 12, 2025).[6] “The Rascal Meta Programming Language | The Rascal Meta Programming Language,” Rascal-mpl.org, 2024. https://www.rascal-mpl.org/ (accessed Jan. 12, 2025).[7] “Rascal: one-stop shop for metaprogramming,” Www.cwi.nl, 2025. https://www.cwi.nl/en/results/software/rascal-one-stop-shop-for-metaprogramming/ (accessed Jan. 12, 2025).[8] J. J. Vinju, M. A. Hills, P. Klint, van, and van, “The Rascal meta-programming language - a lab for software analysis, transformation, generation & visualization,” https://homepages.cwi.nl/~paulk/publications/ICTOPENRascalLab.pdf, Nov. 14, 2011. https://www.researchgate.net/publication/254817781_The_Rascal_meta-programming_language_-_a_lab_for_software_analysis_transformation_generation_visualization201716772Publicationhttps://scholar.google.es/citations?user=3iTzjQsAAAAJvirtual::22186-10000-0002-1094-9952virtual::22186-1a77ff528-fc33-44d6-9022-814f81ef407avirtual::22186-1a77ff528-fc33-44d6-9022-814f81ef407avirtual::22186-1ORIGINALautorizacion tesis final.pdfautorizacion tesis final.pdfHIDEapplication/pdf320825https://repositorio.uniandes.edu.co/bitstreams/e48991a1-8bb8-44c8-b52c-998fd711416e/download14d9f95fa38334099dd39589798c1613MD51Análisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdfAnálisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdfapplication/pdf914220https://repositorio.uniandes.edu.co/bitstreams/48eb1605-8e9c-4126-8956-b39a450ff101/download5baf669ef4e38765ff82c0982b991500MD55CC-LICENSElicense_rdflicense_rdfapplication/rdf+xml; charset=utf-8908https://repositorio.uniandes.edu.co/bitstreams/bba858c7-fa89-4ee1-a595-dc428db2f51a/download0175ea4a2d4caec4bbcc37e300941108MD53LICENSElicense.txtlicense.txttext/plain; charset=utf-82535https://repositorio.uniandes.edu.co/bitstreams/472ac0bd-c28f-4cea-acb4-948b2e135c72/downloadae9e573a68e7f92501b6913cc846c39fMD54TEXTautorizacion tesis final.pdf.txtautorizacion tesis final.pdf.txtExtracted texttext/plain2051https://repositorio.uniandes.edu.co/bitstreams/6402f4fb-ff89-4b27-9f52-47f8bfa93a20/download1b296b0508437fa5deda4209aee61d6cMD56Análisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdf.txtAnálisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdf.txtExtracted texttext/plain41686https://repositorio.uniandes.edu.co/bitstreams/d4b627fd-894a-4cde-be09-84d7067fa31c/download81380ffe97743f3100d0e7ccbbe80e27MD58THUMBNAILautorizacion tesis final.pdf.jpgautorizacion tesis final.pdf.jpgGenerated Thumbnailimage/jpeg10955https://repositorio.uniandes.edu.co/bitstreams/db1247c3-b2f4-43f9-aac7-276d3e363c4b/download4d4cd1a1f87a2ca2aa437fea7895942eMD57Análisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdf.jpgAnálisis de Concurrencia en Programas de Elixir con la herramienta Rascal.pdf.jpgGenerated Thumbnailimage/jpeg5074https://repositorio.uniandes.edu.co/bitstreams/f68f4a4c-6583-4699-bebf-6a9cb9794fe4/download64d580971654008a4276fb5ff0ddfbbdMD591992/75472oai:repositorio.uniandes.edu.co:1992/754722025-03-05 10:02:10.714http://creativecommons.org/licenses/by/4.0/Attribution 4.0 Internationalopen.accesshttps://repositorio.uniandes.edu.coRepositorio institucional Sénecaadminrepositorio@uniandes.edu.coPGgzPjxzdHJvbmc+RGVzY2FyZ28gZGUgUmVzcG9uc2FiaWxpZGFkIC0gTGljZW5jaWEgZGUgQXV0b3JpemFjacOzbjwvc3Ryb25nPjwvaDM+CjxwPjxzdHJvbmc+UG9yIGZhdm9yIGxlZXIgYXRlbnRhbWVudGUgZXN0ZSBkb2N1bWVudG8gcXVlIHBlcm1pdGUgYWwgUmVwb3NpdG9yaW8gSW5zdGl0dWNpb25hbCBTw6luZWNhIHJlcHJvZHVjaXIgeSBkaXN0cmlidWlyIGxvcyByZWN1cnNvcyBkZSBpbmZvcm1hY2nDs24gZGVwb3NpdGFkb3MgbWVkaWFudGUgbGEgYXV0b3JpemFjacOzbiBkZSBsb3Mgc2lndWllbnRlcyB0w6lybWlub3M6PC9zdHJvbmc+PC9wPgo8cD5Db25jZWRhIGxhIGxpY2VuY2lhIGRlIGRlcMOzc2l0byBlc3TDoW5kYXIgc2VsZWNjaW9uYW5kbyBsYSBvcGNpw7NuIDxzdHJvbmc+J0FjZXB0YXIgbG9zIHTDqXJtaW5vcyBhbnRlcmlvcm1lbnRlIGRlc2NyaXRvcyc8L3N0cm9uZz4geSBjb250aW51YXIgZWwgcHJvY2VzbyBkZSBlbnbDrW8gbWVkaWFudGUgZWwgYm90w7NuIDxzdHJvbmc+J1NpZ3VpZW50ZScuPC9zdHJvbmc+PC9wPgo8aHI+CjxwPllvLCBlbiBtaSBjYWxpZGFkIGRlIGF1dG9yIGRlbCB0cmFiYWpvIGRlIHRlc2lzLCBtb25vZ3JhZsOtYSBvIHRyYWJham8gZGUgZ3JhZG8sIGhhZ28gZW50cmVnYSBkZWwgZWplbXBsYXIgcmVzcGVjdGl2byB5IGRlIHN1cyBhbmV4b3MgZGUgc2VyIGVsIGNhc28sIGVuIGZvcm1hdG8gZGlnaXRhbCB5L28gZWxlY3Ryw7NuaWNvIHkgYXV0b3Jpem8gYSBsYSBVbml2ZXJzaWRhZCBkZSBsb3MgQW5kZXMgcGFyYSBxdWUgcmVhbGljZSBsYSBwdWJsaWNhY2nDs24gZW4gZWwgU2lzdGVtYSBkZSBCaWJsaW90ZWNhcyBvIGVuIGN1YWxxdWllciBvdHJvIHNpc3RlbWEgbyBiYXNlIGRlIGRhdG9zIHByb3BpbyBvIGFqZW5vIGEgbGEgVW5pdmVyc2lkYWQgeSBwYXJhIHF1ZSBlbiBsb3MgdMOpcm1pbm9zIGVzdGFibGVjaWRvcyBlbiBsYSBMZXkgMjMgZGUgMTk4MiwgTGV5IDQ0IGRlIDE5OTMsIERlY2lzacOzbiBBbmRpbmEgMzUxIGRlIDE5OTMsIERlY3JldG8gNDYwIGRlIDE5OTUgeSBkZW3DoXMgbm9ybWFzIGdlbmVyYWxlcyBzb2JyZSBsYSBtYXRlcmlhLCB1dGlsaWNlIGVuIHRvZGFzIHN1cyBmb3JtYXMsIGxvcyBkZXJlY2hvcyBwYXRyaW1vbmlhbGVzIGRlIHJlcHJvZHVjY2nDs24sIGNvbXVuaWNhY2nDs24gcMO6YmxpY2EsIHRyYW5zZm9ybWFjacOzbiB5IGRpc3RyaWJ1Y2nDs24gKGFscXVpbGVyLCBwcsOpc3RhbW8gcMO6YmxpY28gZSBpbXBvcnRhY2nDs24pIHF1ZSBtZSBjb3JyZXNwb25kZW4gY29tbyBjcmVhZG9yIGRlIGxhIG9icmEgb2JqZXRvIGRlbCBwcmVzZW50ZSBkb2N1bWVudG8uPC9wPgo8cD5MYSBwcmVzZW50ZSBhdXRvcml6YWNpw7NuIHNlIGVtaXRlIGVuIGNhbGlkYWQgZGUgYXV0b3IgZGUgbGEgb2JyYSBvYmpldG8gZGVsIHByZXNlbnRlIGRvY3VtZW50byB5IG5vIGNvcnJlc3BvbmRlIGEgY2VzacOzbiBkZSBkZXJlY2hvcywgc2lubyBhIGxhIGF1dG9yaXphY2nDs24gZGUgdXNvIGFjYWTDqW1pY28gZGUgY29uZm9ybWlkYWQgY29uIGxvIGFudGVyaW9ybWVudGUgc2XDsWFsYWRvLiBMYSBwcmVzZW50ZSBhdXRvcml6YWNpw7NuIHNlIGhhY2UgZXh0ZW5zaXZhIG5vIHNvbG8gYSBsYXMgZmFjdWx0YWRlcyB5IGRlcmVjaG9zIGRlIHVzbyBzb2JyZSBsYSBvYnJhIGVuIGZvcm1hdG8gbyBzb3BvcnRlIG1hdGVyaWFsLCBzaW5vIHRhbWJpw6luIHBhcmEgZm9ybWF0byBlbGVjdHLDs25pY28sIHkgZW4gZ2VuZXJhbCBwYXJhIGN1YWxxdWllciBmb3JtYXRvIGNvbm9jaWRvIG8gcG9yIGNvbm9jZXIuPC9wPgo8cD5FbCBhdXRvciwgbWFuaWZpZXN0YSBxdWUgbGEgb2JyYSBvYmpldG8gZGUgbGEgcHJlc2VudGUgYXV0b3JpemFjacOzbiBlcyBvcmlnaW5hbCB5IGxhIHJlYWxpesOzIHNpbiB2aW9sYXIgbyB1c3VycGFyIGRlcmVjaG9zIGRlIGF1dG9yIGRlIHRlcmNlcm9zLCBwb3IgbG8gdGFudG8sIGxhIG9icmEgZXMgZGUgc3UgZXhjbHVzaXZhIGF1dG9yw61hIHkgdGllbmUgbGEgdGl0dWxhcmlkYWQgc29icmUgbGEgbWlzbWEuPC9wPgo8cD5FbiBjYXNvIGRlIHByZXNlbnRhcnNlIGN1YWxxdWllciByZWNsYW1hY2nDs24gbyBhY2Npw7NuIHBvciBwYXJ0ZSBkZSB1biB0ZXJjZXJvIGVuIGN1YW50byBhIGxvcyBkZXJlY2hvcyBkZSBhdXRvciBzb2JyZSBsYSBvYnJhIGVuIGN1ZXN0acOzbiwgZWwgYXV0b3IgYXN1bWlyw6EgdG9kYSBsYSByZXNwb25zYWJpbGlkYWQsIHkgc2FsZHLDoSBkZSBkZWZlbnNhIGRlIGxvcyBkZXJlY2hvcyBhcXXDrSBhdXRvcml6YWRvcywgcGFyYSB0b2RvcyBsb3MgZWZlY3RvcyBsYSBVbml2ZXJzaWRhZCBhY3TDumEgY29tbyB1biB0ZXJjZXJvIGRlIGJ1ZW5hIGZlLjwvcD4KPHA+U2kgdGllbmUgYWxndW5hIGR1ZGEgc29icmUgbGEgbGljZW5jaWEsIHBvciBmYXZvciwgY29udGFjdGUgY29uIGVsIDxhIGhyZWY9Im1haWx0bzpiaWJsaW90ZWNhQHVuaWFuZGVzLmVkdS5jbyIgdGFyZ2V0PSJfYmxhbmsiPkFkbWluaXN0cmFkb3IgZGVsIFNpc3RlbWEuPC9hPjwvcD4K |