Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2020-2021. El repo del trabajo está aquí. La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


1. Introducción

Este trabajo tiene por objetivo estudiar la evolución en el precio de la criptomoneda de referencia en el mundo, así como determinar posibles causas de las fuertes fluctuaciones que este experimenta.

2. Datos

Los datos han sido descargados de Yahoo! finanzas, concretamente de la página dedicada al BitCoin. Ambas son totalmente gratuitas.

2.1. Procesando los datos

Para transmitir correctamente los argumentos que se exponen, es necesario trabajar con las variables y las representaciones oportunas.

El primer paso ha sido escoger uno de los 4 precios que contiene la tabla, en este caso el de cierre de la sesión, el único que no ha sido eliminado.


df <- import("./datos/BTC-EUR.csv")

df1 <- df %>% select(-c("High", "Low", "Adj Close"))

2.2 Creación de los gráficos

Aunque todos parten del mismo archivo, para crear los gráficos se han realizado diferentes transformaciones del mismo, ya que representan la evolucion de diferentes variables.

2.2.1 Evolución del precio

Para mejorar la apariencia, he transformado las unidades de la escala, y cambiado los colores del gráfico.

evol_var1 <- df1 %>%  mutate(Value = Close/1000)

evol_val <- ggplot(evol_var1, aes(Date, Value)) +
  geom_line(color = "yellow")


evol_val +
  labs(title = "Histórico precio BitCoin",
            subtitle = "Último trimestre (16/10 - 15/01)",
            caption = "Fuente: Yahoo! finanzas",
            x = element_blank(),
            y = "Valor (miles de €)") +
  theme(panel.background = element_rect(fill = "black", colour = "yellow"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank())
alt text here

2.2.2 Evolución del volumen

Para estudiar la evolución del volumen de los intercambios de BitCoin, de nuevo he cambiado la unidad de la escala, para que cupiesen los números en el eje y he empleado una plantilla que permite una mejor visualización


vol_month1 <- df1 %>%  mutate(Volume = Volume/100000000)

vol_month <- ggplot(vol_month1, aes(Date, Volume)) +
                    geom_point(size = 2, color = "salmon",  fill = alpha("salmon", 0.5), alpha = 0.7, shape = 23) +
                    geom_segment( aes(x = Date, xend=Date, y = 0, yend = Volume), color = "deepskyblue2")


vol_month + theme_economist() +
            labs(title = "Volumen operaciones BitCoin",
            subtitle = "(en billones de €)",
            caption = "Fuente: Yahoo! finanzas",
            x = element_blank(),
            y = element_blank())

2.2.3 Variación diaria

Este ha sido algo más complicado ya que R no posee un operador para calcular el incremento de una varibable, por lo que he optado por extraer los precios como un vector y duplicarlo para poder calcular las variaciones en porcentaje. Para abreviar, el vector de incrementos tiene una fila mas, que hay que eliminar para introducirla en el dataframe y poder trabajar; para que se vea bien he cogido las observaciones del último mes y medio, ya que cada línea corresponde a un diaº


v1 <- df1%>% pull(Close)

v2 <- append(v1, 0, 0)

variation <- ((v2-v1)/v1)*100

df_2 <- data.frame(variation) %>% slice(-c(94))

var<- df1 %>% bind_cols(df_2)


var_1 <- var %>% slice(-c(1)) %>% mutate(mycolor = ifelse(variation<0, "red", "green"))

aa<- var_1 %>% slice(47:92)


var_mes <- ggplot(aa, aes(Date, variation, color= mycolor)) +
        geom_segment(aes(x = Date, xend = Date, y = 0, yend = variation))


var_mes + scale_colour_manual(values=c("red", "green"), name="",
              guide=guide_legend(nrow=4)) +
              theme_hc()+
                theme(legend.position = "none") +
            labs(title = "Variación precio BitCoin",
                caption = "Fuente: Yahoo! finanzas",
                x = element_blank(),
                y = "Variación (%)")

3. Trabajos en los que te has basado

Ya tenía pensado hablar sobre algo relacionado con la bolsa, y como a finales de año se produjeron algunos hechos relevantes relacionados con el BitCoin, que fueron publicados en Cincodías, el diario económico de El País, finalmente me decidí a hacer el trabajo sobre este.
Lo que trato de mostrar con los gráficos no obedece a un artculo en particular; la volatilidad y el aumento del valor de este activo son de sobra conocidos.

4. Método de inversión en BitCoin


Ni matemáticos de Harvard ni físicos del MIT, las mejores predicciones sobre la valoración del BitCoin las realiza una astróloga del Tik Tok. Porque si una combinación arbitraria de astros puede predecir como va a ser tu día ¿por que no como va a ser el mercado?

5. Preguntas

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBCaXRDb2luIg0Kc3VidGl0bGU6ICJOYWNobyBDb3JhY2jDoW4gUMOpcmV6IChpZ2NvcGVAYWx1bW5pLnV2LmVzKSIgIy0gcG9uZ28gdMO6IG5vbWJyZSBhaMOtIHBhcmEgcSBhcGFyZXpjYSBtw6FzIGdyYW5kZSBxIGVsIGRlIGxhIFVWDQphdXRob3I6ICJVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEiDQpkYXRlOiAiRGljaWVtYnJlIGRlIDIwMjAgKGFjdHVhbGl6YWRvIGVsIGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQtJW0tJVknKWApIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgICNjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiDQogICAgdGhlbWU6IHBhcGVyDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBwYWNrYWdlcy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzcGF0aGlhbCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoanBlZykNCmxpYnJhcnkocG5nKQ0KbGlicmFyeShrbGlwcHkpICAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCmBgYHtyIGNodW5rLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgY2FjaGUucGF0aCA9ICIvY2FjaGVzLyIsIGNvbW1lbnQgPSAiIz4iLA0KICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICANCiAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLCAgZmlnLnNob3cgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSANCmBgYA0KDQoNCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCJ0b3AiLCAicmlnaHQiKSkgIy0gcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KYGBgDQoNCjxociBjbGFzcz0ibGluZWEtYmxhY2siPg0KDQpUcmFiYWpvIGVsYWJvcmFkbyBwYXJhIGxhIGFzaWduYXR1cmEgIlByb2dyYW1hY2nDs24geSBtYW5lam8gZGUgZGF0b3MgZW4gbGEgZXJhIGRlbCBCaWcgRGF0YSIgZGUgbGEgVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIGR1cmFudGUgZWwgY3Vyc28gMjAyMC0yMDIxLiBFbCByZXBvIGRlbCB0cmFiYWpvIGVzdMOhIFthcXXDrV0oaHR0cHM6Ly9naXRodWIuY29tL05hY2hvLUNQL3RyYWJham9fQmlnRGF0YSl7dGFyZ2V0PSJfYmxhbmsifS4gTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSB5IGxvcyB0cmFiYWpvcyBkZSBtaXMgY29tcGHDsWVyb3MgcHVlZGVuIHZlcnNlIFthcXXDrV0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjAtMjEtd2ViLzA3LXRyYWJham9zLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uDQoNCjwhLS0gRWwgcMOhcnJhZm8gZGUgYXJyaWJhIGhhcyBkZSBkZWphcmxvIGNhc2kgaWd1YWwsIA0KICAgICAgICBzb2xvIEhBUyBkZSBTVVNUSVRVSVIgbGFzIDIgdmVjZXMgcXVlIGFwYXJlY2UgInBlcmV6cDQ0IiBwb3IgdHUgdXN1YXJpbyBkZSBHaXRodWItLT4NCg0KPGhyIGNsYXNzPSJsaW5lYS1yZWQiPg0KDQojIDEuIEludHJvZHVjY2nDs24NCg0KRXN0ZSB0cmFiYWpvIHRpZW5lIHBvciBvYmpldGl2byBlc3R1ZGlhciBsYSBldm9sdWNpw7NuIGVuIGVsIHByZWNpbyBkZSBsYSBjcmlwdG9tb25lZGEgZGUgcmVmZXJlbmNpYSBlbiBlbCBtdW5kbywgYXPDrSBjb21vIGRldGVybWluYXIgcG9zaWJsZXMgY2F1c2FzIGRlIGxhcyBmdWVydGVzIGZsdWN0dWFjaW9uZXMgcXVlIGVzdGUgZXhwZXJpbWVudGEuDQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG89RkFMU0V9DQoyICsgMg0KYGBgDQoNCg0KIyAyLiBEYXRvcw0KDQpMb3MgZGF0b3MgaGFuIHNpZG8gZGVzY2FyZ2Fkb3MgZGUgW1lhaG9vISBmaW5hbnphc10oaHR0cHM6Ly9lcy5maW5hbmNlLnlhaG9vLmNvbS8pLCBjb25jcmV0YW1lbnRlIGRlIGxhIA0KW3DDoWdpbmEgZGVkaWNhZGEgYWwgQml0Q29pbl0oaHR0cHM6Ly9lcy5maW5hbmNlLnlhaG9vLmNvbS9xdW90ZS9CVEMtRVVSL2hpc3Rvcnk/cD1CVEMtRVVSKS4gQW1iYXMgc29uIHRvdGFsbWVudGUgZ3JhdHVpdGFzLg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvPUZBTFNFfQ0KZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5MZW5ndGgsIFBldGFsLkxlbmd0aCkpICsgZ2VvbV9wb2ludCgpDQpgYGANCg0KDQojIyAyLjEuIFByb2Nlc2FuZG8gbG9zIGRhdG9zDQoNClBhcmEgdHJhbnNtaXRpciBjb3JyZWN0YW1lbnRlIGxvcyBhcmd1bWVudG9zIHF1ZSBzZSBleHBvbmVuLCBlcyBuZWNlc2FyaW8gdHJhYmFqYXIgY29uIGxhcyB2YXJpYWJsZXMgeSBsYXMgcmVwcmVzZW50YWNpb25lcyBvcG9ydHVuYXMuIA0KDQpFbCBwcmltZXIgcGFzbyBoYSBzaWRvIGVzY29nZXIgdW5vIGRlIGxvcyA0IHByZWNpb3MgcXVlIGNvbnRpZW5lIGxhIHRhYmxhLCBlbiBlc3RlIGNhc28gZWwgZGUgY2llcnJlIGRlIGxhIHNlc2nDs24sIGVsIMO6bmljbyBxdWUgbm8gaGEgc2lkbyBlbGltaW5hZG8uDQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG89VFJVRX0NCg0KZGYgPC0gaW1wb3J0KCIuL2RhdG9zL0JUQy1FVVIuY3N2IikNCg0KZGYxIDwtIGRmICU+JSBzZWxlY3QoLWMoIkhpZ2giLCAiTG93IiwgIkFkaiBDbG9zZSIpKQ0KDQpgYGANCg0KDQoNCg0KIyMgMi4yIENyZWFjacOzbiBkZSBsb3MgZ3LDoWZpY29zDQoNCkF1bnF1ZSB0b2RvcyBwYXJ0ZW4gZGVsIG1pc21vIGFyY2hpdm8sIHBhcmEgY3JlYXIgbG9zIGdyw6FmaWNvcyBzZSBoYW4gcmVhbGl6YWRvIGRpZmVyZW50ZXMgdHJhbnNmb3JtYWNpb25lcyBkZWwgbWlzbW8sIHlhIHF1ZSByZXByZXNlbnRhbiBsYSBldm9sdWNpb24gZGUgZGlmZXJlbnRlcyB2YXJpYWJsZXMuDQoNCiMjIyAyLjIuMSBFdm9sdWNpw7NuIGRlbCBwcmVjaW8NCg0KUGFyYSBtZWpvcmFyIGxhIGFwYXJpZW5jaWEsIGhlIHRyYW5zZm9ybWFkbyBsYXMgdW5pZGFkZXMgZGUgbGEgZXNjYWxhLCB5IGNhbWJpYWRvIGxvcyBjb2xvcmVzIGRlbCBncsOhZmljby4NCg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvPVRSVUV9DQpldm9sX3ZhcjEgPC0gZGYxICU+JSAgbXV0YXRlKFZhbHVlID0gQ2xvc2UvMTAwMCkNCg0KZXZvbF92YWwgPC0gZ2dwbG90KGV2b2xfdmFyMSwgYWVzKERhdGUsIFZhbHVlKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAieWVsbG93IikNCg0KDQpldm9sX3ZhbCArDQogIGxhYnModGl0bGUgPSAiSGlzdMOzcmljbyBwcmVjaW8gQml0Q29pbiIsDQogICAgICAgICAgICBzdWJ0aXRsZSA9ICLDmmx0aW1vIHRyaW1lc3RyZSAoMTYvMTAgLSAxNS8wMSkiLA0KICAgICAgICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IFlhaG9vISBmaW5hbnphcyIsDQogICAgICAgICAgICB4ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgeSA9ICJWYWxvciAobWlsZXMgZGUg4oKsKSIpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImJsYWNrIiwgY29sb3VyID0gInllbGxvdyIpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQ0KDQpgYGANCg0KDQo8Y2VudGVyPiFbYWx0IHRleHQgaGVyZV0oaW1hZ2VuZXMvZXZvbF9wcmVjaW8ucG5nKTwvY2VudGVyPg0KDQoNCiMjIyAyLjIuMiBFdm9sdWNpw7NuIGRlbCB2b2x1bWVuDQoNClBhcmEgZXN0dWRpYXIgbGEgZXZvbHVjacOzbiBkZWwgdm9sdW1lbiBkZSBsb3MgaW50ZXJjYW1iaW9zIGRlIEJpdENvaW4sIGRlIG51ZXZvIGhlIGNhbWJpYWRvIGxhIHVuaWRhZCBkZSBsYSBlc2NhbGEsIHBhcmEgcXVlIGN1cGllc2VuIGxvcyBuw7ptZXJvcyBlbiBlbCBlamUgeSBoZSBlbXBsZWFkbyB1bmEgcGxhbnRpbGxhIHF1ZSBwZXJtaXRlIHVuYSBtZWpvciB2aXN1YWxpemFjacOzbg0KDQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG89VFJVRX0NCg0Kdm9sX21vbnRoMSA8LSBkZjEgJT4lICBtdXRhdGUoVm9sdW1lID0gVm9sdW1lLzEwMDAwMDAwMCkNCg0Kdm9sX21vbnRoIDwtIGdncGxvdCh2b2xfbW9udGgxLCBhZXMoRGF0ZSwgVm9sdW1lKSkgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX3BvaW50KHNpemUgPSAyLCBjb2xvciA9ICJzYWxtb24iLCAgZmlsbCA9IGFscGhhKCJzYWxtb24iLCAwLjUpLCBhbHBoYSA9IDAuNywgc2hhcGUgPSAyMykgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX3NlZ21lbnQoIGFlcyh4ID0gRGF0ZSwgeGVuZD1EYXRlLCB5ID0gMCwgeWVuZCA9IFZvbHVtZSksIGNvbG9yID0gImRlZXBza3libHVlMiIpDQoNCg0Kdm9sX21vbnRoICsgdGhlbWVfZWNvbm9taXN0KCkgKw0KICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJWb2x1bWVuIG9wZXJhY2lvbmVzIEJpdENvaW4iLA0KICAgICAgICAgICAgc3VidGl0bGUgPSAiKGVuIGJpbGxvbmVzIGRlIOKCrCkiLA0KICAgICAgICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IFlhaG9vISBmaW5hbnphcyIsDQogICAgICAgICAgICB4ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgeSA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KYGBgDQoNCjxjZW50ZXI+IVtdKGltYWdlbmVzL3ZvbHVtZW4ucG5nKTwvY2VudGVyPg0KDQoNCiMjIyAyLjIuMyBWYXJpYWNpw7NuIGRpYXJpYQ0KDQpFc3RlIGhhIHNpZG8gYWxnbyBtw6FzIGNvbXBsaWNhZG8geWEgcXVlIFIgbm8gcG9zZWUgdW4gb3BlcmFkb3IgcGFyYSBjYWxjdWxhciBlbCBpbmNyZW1lbnRvIGRlIHVuYSB2YXJpYmFibGUsIHBvciBsbyBxdWUgaGUgb3B0YWRvIHBvciBleHRyYWVyIGxvcyBwcmVjaW9zIGNvbW8gdW4gdmVjdG9yIHkgZHVwbGljYXJsbyBwYXJhIHBvZGVyIGNhbGN1bGFyIGxhcyB2YXJpYWNpb25lcyBlbiBwb3JjZW50YWplLiBQYXJhIGFicmV2aWFyLCBlbCB2ZWN0b3IgZGUgaW5jcmVtZW50b3MgdGllbmUgdW5hIGZpbGEgbWFzLCBxdWUgaGF5IHF1ZSBlbGltaW5hciBwYXJhIGludHJvZHVjaXJsYSBlbiBlbCBkYXRhZnJhbWUgeSBwb2RlciB0cmFiYWphcjsgcGFyYSBxdWUgc2UgdmVhIGJpZW4gaGUgY29naWRvIGxhcyBvYnNlcnZhY2lvbmVzIGRlbCDDumx0aW1vIG1lcyB5IG1lZGlvLCB5YSBxdWUgY2FkYSBsw61uZWEgY29ycmVzcG9uZGUgYSB1biBkaWHCug0KDQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG89VFJVRX0NCg0KdjEgPC0gZGYxJT4lIHB1bGwoQ2xvc2UpDQoNCnYyIDwtIGFwcGVuZCh2MSwgMCwgMCkNCg0KdmFyaWF0aW9uIDwtICgodjItdjEpL3YxKSoxMDANCg0KZGZfMiA8LSBkYXRhLmZyYW1lKHZhcmlhdGlvbikgJT4lIHNsaWNlKC1jKDk0KSkNCg0KdmFyPC0gZGYxICU+JSBiaW5kX2NvbHMoZGZfMikNCg0KDQp2YXJfMSA8LSB2YXIgJT4lIHNsaWNlKC1jKDEpKSAlPiUgbXV0YXRlKG15Y29sb3IgPSBpZmVsc2UodmFyaWF0aW9uPDAsICJyZWQiLCAiZ3JlZW4iKSkNCg0KYWE8LSB2YXJfMSAlPiUgc2xpY2UoNDc6OTIpDQoNCg0KdmFyX21lcyA8LSBnZ3Bsb3QoYWEsIGFlcyhEYXRlLCB2YXJpYXRpb24sIGNvbG9yPSBteWNvbG9yKSkgKw0KICAgICAgICBnZW9tX3NlZ21lbnQoYWVzKHggPSBEYXRlLCB4ZW5kID0gRGF0ZSwgeSA9IDAsIHllbmQgPSB2YXJpYXRpb24pKQ0KDQoNCnZhcl9tZXMgKyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJyZWQiLCAiZ3JlZW4iKSwgbmFtZT0iIiwNCiAgICAgICAgICAgICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKG5yb3c9NCkpICsNCiAgICAgICAgICAgICAgdGhlbWVfaGMoKSsNCiAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVmFyaWFjacOzbiBwcmVjaW8gQml0Q29pbiIsDQogICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IFlhaG9vISBmaW5hbnphcyIsDQogICAgICAgICAgICAgICAgeCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICB5ID0gIlZhcmlhY2nDs24gKCUpIikNCmBgYA0KDQo8Y2VudGVyPiFbXShpbWFnZW5lcy92YXJfZGlhLnBuZyk8L2NlbnRlcj4NCg0KIyAzLiBUcmFiYWpvcyBlbiBsb3MgcXVlIHRlIGhhcyBiYXNhZG8NCg0KWWEgdGVuw61hIHBlbnNhZG8gaGFibGFyIHNvYnJlIGFsZ28gcmVsYWNpb25hZG8gY29uIGxhIGJvbHNhLCB5IGNvbW8gYSBmaW5hbGVzIGRlIGHDsW8gc2UgcHJvZHVqZXJvbiBhbGd1bm9zIGhlY2hvcyByZWxldmFudGVzIHJlbGFjaW9uYWRvcyBjb24gZWwgQml0Q29pbiwgcXVlIGZ1ZXJvbiBwdWJsaWNhZG9zIGVuIFtDaW5jb2TDrWFzLCBlbCBkaWFyaW8gZWNvbsOzbWljbyBkZSBFbCBQYcOtc10oaHR0cHM6Ly9jaW5jb2RpYXMuZWxwYWlzLmNvbS8pLCBmaW5hbG1lbnRlIG1lIGRlY2lkw60gYSBoYWNlciBlbCB0cmFiYWpvIHNvYnJlIGVzdGUuDQo8YnI+PC9icj4NCkxvIHF1ZSB0cmF0byBkZSBtb3N0cmFyIGNvbiBsb3MgZ3LDoWZpY29zIG5vIG9iZWRlY2UgYSB1biBhcnRjdWxvIGVuIHBhcnRpY3VsYXI7IGxhIHZvbGF0aWxpZGFkIHkgZWwgYXVtZW50byBkZWwgdmFsb3IgZGUgZXN0ZSBhY3Rpdm8gc29uIGRlIHNvYnJhIGNvbm9jaWRvcy4NCg0KDQojIDQuIE3DqXRvZG8gZGUgaW52ZXJzacOzbiBlbiBCaXRDb2luDQoNCjxicj48L2JyPg0KDQpOaSBtYXRlbcOhdGljb3MgZGUgSGFydmFyZCBuaSBmw61zaWNvcyBkZWwgTUlULCBsYXMgbWVqb3JlcyBwcmVkaWNjaW9uZXMgc29icmUgbGEgdmFsb3JhY2nDs24gZGVsIEJpdENvaW4gbGFzIHJlYWxpemEgdW5hIFsqKmFzdHLDs2xvZ2EgZGVsIFRpayBUb2sqKl0oaHR0cHM6Ly9jaW5jb2RpYXMuZWxwYWlzLmNvbS9jaW5jb2RpYXMvMjAyMS8wMS8xNC9tZXJjYWRvcy8xNjEwNjM0NzM2XzkxMzU1My5odG1sKS4gUG9ycXVlIHNpIHVuYSBjb21iaW5hY2nDs24gYXJiaXRyYXJpYSBkZSBhc3Ryb3MgcHVlZGUgcHJlZGVjaXIgY29tbyB2YSBhIHNlciB0dSBkw61hIMK/cG9yIHF1ZSBubyBjb21vIHZhIGEgc2VyIGVsIG1lcmNhZG8/DQoNCg0KPGNlbnRlcj4hW10oaW1hZ2VuZXMvdHUud2VicCk8L2NlbnRlcj4NCg0KDQojIDUuIFByZWd1bnRhcw0KDQo8Y2VudGVyPiFbXShpbWFnZW5lcy9kdWRhcy5qcGcpPC9jZW50ZXI+DQoNCg0KDQoNCg0K