Ejercicio 1

library(MASS)
data(ships)  
head(ships)
##   type year period service incidents
## 1    A   60     60     127         0
## 2    A   60     75      63         0
## 3    A   65     60    1095         3
## 4    A   65     75    1095         4
## 5    A   70     60    1512         6
## 6    A   70     75    3353        18

a)¿Cuántas filas y variables tiene esta base de datos?

dim (ships)
## [1] 40  5
# 2da manera
str (ships)
## 'data.frame':    40 obs. of  5 variables:
##  $ type     : Factor w/ 5 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 2 2 ...
##  $ year     : int  60 60 65 65 70 70 75 75 60 60 ...
##  $ period   : int  60 75 60 75 60 75 60 75 60 75 ...
##  $ service  : int  127 63 1095 1095 1512 3353 0 2244 44882 17176 ...
##  $ incidents: int  0 0 3 4 6 18 0 11 39 29 ...

b) ¿Hay alguna variable cualitativa? ¿Está almacenada en R como factor, integer o num?

Si, la variable “type” esta registrada como factor

c)Representa los boxplots de la variable incidentes por tipo de barcoen un mismo gráfico.

boxplot(ships$incidents~ ships$type, col=c("aquamarine","pink", "ivory1","navajowhite1","skyblue1"),
        main="INCIDENTES", xlab="Incidentes", ylab="Tipo")
medias <- tapply(ships$incidents, ships$type, mean, na.rm=TRUE)
points(1:length(medias), medias, col=c("yellow"), pch=16)

¿En cuáles ves datos atípicos?

En los incidentes C y D

d) Dibuja el histograma y el boxplot de los incidentes de los barcos uno al lado del otro en el mismo canvas

par(mfrow=c(1,2))
boxplot(ships$incidents, col=c("pink"),
        main="INCIDENTES")
points(1,mean(ships$incidents), col="yellow", pch=16)

hist(ships$incidents, col=c("skyblue1","pink", "plum1","navajowhite1","aquamarine","ivory1"), main="Hisotgrama de Incidentes",
     xlab="Incidentes", ylab="Frecuencias")
abline(v=mean(ships$incidents, na.rm=TRUE), col="yellow", lty=2)

¿Qué tipo de asimetría presenta la variable incidentes?

La variable “Incidentes” muestra una asimetría positiva. En el histograma, se observa que la cola larga está hacia la derecha, lo que indica que la mayoría de los barcos tienen pocos incidentes, pero hay algunos con valores atípicos que presentan un número significativamente mayor de incidentes. Por otro lado, el boxplot confirma esta asimetría positiva, ya que la mediana está más cerca del borde inferior de la caja, lo que significa que la mayoría de los datos son valores bajos. Además, el bigote superior es más largo, lo que indica una mayor dispersión en los valores altos, asimismo la existencia de valores atipicos, confirman que hay incidentes excepcionalmente altos que afectan la distribución.

e) Crea una nueva base de datos, que se llame ships_new en la que todas las variables son iguales a las originales, salvo type: deberás seleccionar solo los valores de la variable que sean iguales a A.

ships_new<- subset(ships, type=="A")
head(ships_new)
##   type year period service incidents
## 1    A   60     60     127         0
## 2    A   60     75      63         0
## 3    A   65     60    1095         3
## 4    A   65     75    1095         4
## 5    A   70     60    1512         6
## 6    A   70     75    3353        18
#2da Manera
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
## 
##     select
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
ships_new2 <- ships%>%filter(type == "A")
head(ships_new2)
##   type year period service incidents
## 1    A   60     60     127         0
## 2    A   60     75      63         0
## 3    A   65     60    1095         3
## 4    A   65     75    1095         4
## 5    A   70     60    1512         6
## 6    A   70     75    3353        18

f) ¿Cuál es el mínimo, máximo, media y desviación típica de los incidentes de los barcos de tipo A?

summary(ships_new)
##  type       year           period        service       incidents    
##  A:8   Min.   :60.00   Min.   :60.0   Min.   :   0   Min.   : 0.00  
##  B:0   1st Qu.:63.75   1st Qu.:60.0   1st Qu.: 111   1st Qu.: 0.00  
##  C:0   Median :67.50   Median :67.5   Median :1095   Median : 3.50  
##  D:0   Mean   :67.50   Mean   :67.5   Mean   :1186   Mean   : 5.25  
##  E:0   3rd Qu.:71.25   3rd Qu.:75.0   3rd Qu.:1695   3rd Qu.: 7.25  
##        Max.   :75.00   Max.   :75.0   Max.   :3353   Max.   :18.00
sd_inc <- sd(ships_new$incidents)
cat("Desviación estándar:", sd_inc, "\n")
## Desviación estándar: 6.386369

g) Coloca los resultados del apartado anterior en una tabla con dos columnas, una será el nombre del estadístico y otra contendrá su valor.

min_inc <- min(ships_new$incidents)
max_inc <- max(ships_new$incidents)
mean_inc <- mean(ships_new$incidents)
sd_inc <- sd(ships_new$incidents)

tabla_estadisticos <- data.frame(
  Estadístico = c("Mínimo", "Máximo", "Media", "Desviación Estándar"),
  Valor = c(min_inc, max_inc, mean_inc, sd_inc))

print(tabla_estadisticos)
##           Estadístico     Valor
## 1              Mínimo  0.000000
## 2              Máximo 18.000000
## 3               Media  5.250000
## 4 Desviación Estándar  6.386369

Ejercicio 2

head(USArrests)
##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58 21.2
## Alaska       10.0     263       48 44.5
## Arizona       8.1     294       80 31.0
## Arkansas      8.8     190       50 19.5
## California    9.0     276       91 40.6
## Colorado      7.9     204       78 38.7

a) ¿Hay valores NA en la base de datos? En caso de que los contenga, cuenta cuántos son y elimínalos de la base de datos.

sum(is.na((USArrests)))
## [1] 0

b) Crea una nueva base de datos, que se llame USArrests_new en la que todas las variables son iguales a las originales, salvo Rape: deberás seleccionar los valores de la variable Rape que sean mayores que 4.

USArrests_new<-subset(USArrests, Rape>4)
head(USArrests_new)
##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58 21.2
## Alaska       10.0     263       48 44.5
## Arizona       8.1     294       80 31.0
## Arkansas      8.8     190       50 19.5
## California    9.0     276       91 40.6
## Colorado      7.9     204       78 38.7

c) Utilizando la nueva base USArrests_new, obtén el gráfico de dispersión de las variables Rape (eje x) y Murder (eje y)

plot(USArrests_new$Rape, USArrests_new$Murder, col= "lightskyblue", xlab="Rape", ylab= "Murder", pch=16)

d) Cambia el rango de los ejes del gráfico anterior: el eje y debe ir desde 0 hasta 20 y el eje x desde 0 hasta 50.

plot(USArrests_new$Rape, USArrests_new$Murder, col= "lightskyblue", xlab="Rape", ylab= "Murder", pch=16,xlim=c(0,50), ylim=c(0,20))

Ejercicio 3

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
mtcars <- mtcars

a) Añade al dataframe una variable de nombre am_new que sea de tipo factor en la que haya dos categorías, transmisión automática o manual, a partir de la variable am

mtcars$am_new <- ifelse(mtcars$am == 0, "automático", "manual")
mtcars$am_new <- factor(mtcars$am_new)  

b) Representa el diagrama de barras que muestre el número de coches por tipo de transmisión

plot(mtcars$am_new, main = "Tipo de Transmisión",
     xlab = "Transmisión", ylab = "Frecuencia",  col= "palegreen4" )

c) Representa el gráfico de sectores que muestre el número de coches por tipo de transmisión

counts <- table(mtcars$am_new)
pie(counts, labels = names(counts), main = "Número de coches por tipo de transmisión", col = c("pink", "skyblue"))

Ejercicio 4

a)¿Qué datos del dataframe seleccionará la siguiente instrucción?

El dataframe arrojará una coincidencia. El resultado será una fila con “Álvaro”, “Soler” y “Baile”.

b)¿Qué otra instrucción dará el mismo output que la del apartado a)? Escribe exactamente cuál sería la línea de código a ejecutar

Una manera alternativa de obtener el resultado del punto a es con:

profesores[profesores$apellidos == "Soler" & profesores$asignatura == "Baile", ]

c)¿Qué datos del dataframe seleccionará la siguiente instrucción?

El resultado será tres filas: una correspondiente a “María” con la asignatura “Baile” y dos filas donde la asignatura es “Canto”, aunque el nombre no sea “María”.

Ejercicio 5

Reproduce el gráfico que se muestra a continuación sobre la base de datos PimaIndiansDiabetes. Para acceder a dicha base, instala y carga el paquete mlbench. Las variables a utilizar son mass, glucose and diabetes

#install.packages("mlbench")
library(mlbench)
## Warning: package 'mlbench' was built under R version 4.3.3
data(PimaIndiansDiabetes)
plot(x=PimaIndiansDiabetes$mass, y=PimaIndiansDiabetes$glucose, col= PimaIndiansDiabetes$diabetes, pch=16,  xlab = "Mass", ylab = "Glucose")
legend(x = "topright", legend = c("neg", "pos"), fill = c("Black", "Red"))

LS0tCnRpdGxlOiAiRWplcmNpY2lvcyIKYXV0aG9yOiAiS2FybGEgTWlyZXlhIFZlbGRlcnJhaW4iCmRhdGU6ICIyMDI1LTAzLTE0IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6IGNvc21vCi0tLQojIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjQ0Q5NkNEOyI+RWplcmNpY2lvIDE8L3NwYW4+CgpgYGB7cn0KbGlicmFyeShNQVNTKQpkYXRhKHNoaXBzKSAgCmBgYAoKYGBge3J9CmhlYWQoc2hpcHMpCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gYSnCv0N1w6FudGFzIGZpbGFzIHkgdmFyaWFibGVzIHRpZW5lIGVzdGEgYmFzZSBkZSBkYXRvcz88L3NwYW4+CgpgYGB7cn0KZGltIChzaGlwcykKYGBgCmBgYHtyfQojIDJkYSBtYW5lcmEKc3RyIChzaGlwcykKYGBgCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+IGIpIMK/SGF5IGFsZ3VuYSB2YXJpYWJsZSBjdWFsaXRhdGl2YT8gwr9Fc3TDoSBhbG1hY2VuYWRhIGVuIFIgY29tbyBmYWN0b3IsIGludGVnZXIgbyBudW0/PC9zcGFuPgoKU2ksIGxhIHZhcmlhYmxlICJ0eXBlIiBlc3RhIHJlZ2lzdHJhZGEgY29tbyBmYWN0b3IKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+IGMpUmVwcmVzZW50YSBsb3MgYm94cGxvdHMgZGUgbGEgdmFyaWFibGUgaW5jaWRlbnRlcyBwb3IgdGlwbyBkZSBiYXJjb2VuIHVuIG1pc21vIGdyw6FmaWNvLiAgPC9zcGFuPgoKYGBge3J9CmJveHBsb3Qoc2hpcHMkaW5jaWRlbnRzfiBzaGlwcyR0eXBlLCBjb2w9YygiYXF1YW1hcmluZSIsInBpbmsiLCAiaXZvcnkxIiwibmF2YWpvd2hpdGUxIiwic2t5Ymx1ZTEiKSwKICAgICAgICBtYWluPSJJTkNJREVOVEVTIiwgeGxhYj0iSW5jaWRlbnRlcyIsIHlsYWI9IlRpcG8iKQptZWRpYXMgPC0gdGFwcGx5KHNoaXBzJGluY2lkZW50cywgc2hpcHMkdHlwZSwgbWVhbiwgbmEucm09VFJVRSkKcG9pbnRzKDE6bGVuZ3RoKG1lZGlhcyksIG1lZGlhcywgY29sPWMoInllbGxvdyIpLCBwY2g9MTYpCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij7Cv0VuIGN1w6FsZXMgdmVzIGRhdG9zIGF0w61waWNvcz88L3NwYW4+CkVuIGxvcyBpbmNpZGVudGVzIEMgeSBEIAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gZCkgRGlidWphIGVsIGhpc3RvZ3JhbWEgeSBlbCBib3hwbG90IGRlIGxvcyBpbmNpZGVudGVzIGRlIGxvcyBiYXJjb3MgdW5vIGFsIGxhZG8gZGVsIG90cm8gZW4gZWwgbWlzbW8gY2FudmFzPC9zcGFuPgoKYGBge3J9CnBhcihtZnJvdz1jKDEsMikpCmJveHBsb3Qoc2hpcHMkaW5jaWRlbnRzLCBjb2w9YygicGluayIpLAogICAgICAgIG1haW49IklOQ0lERU5URVMiKQpwb2ludHMoMSxtZWFuKHNoaXBzJGluY2lkZW50cyksIGNvbD0ieWVsbG93IiwgcGNoPTE2KQoKaGlzdChzaGlwcyRpbmNpZGVudHMsIGNvbD1jKCJza3libHVlMSIsInBpbmsiLCAicGx1bTEiLCJuYXZham93aGl0ZTEiLCJhcXVhbWFyaW5lIiwiaXZvcnkxIiksIG1haW49Ikhpc290Z3JhbWEgZGUgSW5jaWRlbnRlcyIsCiAgICAgeGxhYj0iSW5jaWRlbnRlcyIsIHlsYWI9IkZyZWN1ZW5jaWFzIikKYWJsaW5lKHY9bWVhbihzaGlwcyRpbmNpZGVudHMsIG5hLnJtPVRSVUUpLCBjb2w9InllbGxvdyIsIGx0eT0yKQpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+wr9RdcOpIHRpcG8gZGUgYXNpbWV0csOtYSBwcmVzZW50YSBsYSB2YXJpYWJsZSBpbmNpZGVudGVzPzwvc3Bhbj4KCkxhIHZhcmlhYmxlICJJbmNpZGVudGVzIiBtdWVzdHJhIHVuYSBhc2ltZXRyw61hIHBvc2l0aXZhLiBFbiBlbCBoaXN0b2dyYW1hLCBzZSBvYnNlcnZhIHF1ZSBsYSBjb2xhIGxhcmdhIGVzdMOhIGhhY2lhIGxhIGRlcmVjaGEsIGxvIHF1ZSBpbmRpY2EgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBiYXJjb3MgdGllbmVuIHBvY29zIGluY2lkZW50ZXMsIHBlcm8gaGF5IGFsZ3Vub3MgY29uIHZhbG9yZXMgYXTDrXBpY29zIHF1ZSBwcmVzZW50YW4gdW4gbsO6bWVybyBzaWduaWZpY2F0aXZhbWVudGUgbWF5b3IgZGUgaW5jaWRlbnRlcy4KUG9yIG90cm8gbGFkbywgZWwgYm94cGxvdCBjb25maXJtYSBlc3RhIGFzaW1ldHLDrWEgcG9zaXRpdmEsIHlhIHF1ZSBsYSBtZWRpYW5hIGVzdMOhIG3DoXMgY2VyY2EgZGVsIGJvcmRlIGluZmVyaW9yIGRlIGxhIGNhamEsIGxvIHF1ZSBzaWduaWZpY2EgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBkYXRvcyBzb24gdmFsb3JlcyBiYWpvcy4gQWRlbcOhcywgZWwgYmlnb3RlIHN1cGVyaW9yIGVzIG3DoXMgbGFyZ28sIGxvIHF1ZSBpbmRpY2EgdW5hIG1heW9yIGRpc3BlcnNpw7NuIGVuIGxvcyB2YWxvcmVzIGFsdG9zLCBhc2ltaXNtbyBsYSBleGlzdGVuY2lhIGRlIHZhbG9yZXMgYXRpcGljb3MsIGNvbmZpcm1hbiBxdWUgaGF5IGluY2lkZW50ZXMgZXhjZXBjaW9uYWxtZW50ZSBhbHRvcyBxdWUgYWZlY3RhbiBsYSBkaXN0cmlidWNpw7NuLgoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gZSkgQ3JlYSB1bmEgbnVldmEgYmFzZSBkZSBkYXRvcywgcXVlIHNlIGxsYW1lIHNoaXBzX25ldyBlbiBsYSBxdWUgdG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gaWd1YWxlcyBhIGxhcyBvcmlnaW5hbGVzLCBzYWx2byB0eXBlOiBkZWJlcsOhcyBzZWxlY2Npb25hciBzb2xvIGxvcyB2YWxvcmVzIGRlIGxhIHZhcmlhYmxlIHF1ZSBzZWFuIGlndWFsZXMgYSBBLjwvc3Bhbj4KCmBgYHtyfQpzaGlwc19uZXc8LSBzdWJzZXQoc2hpcHMsIHR5cGU9PSJBIikKYGBgCgpgYGB7cn0KaGVhZChzaGlwc19uZXcpCmBgYAoKYGBge3J9CiMyZGEgTWFuZXJhCmxpYnJhcnkoZHBseXIpCnNoaXBzX25ldzIgPC0gc2hpcHMlPiVmaWx0ZXIodHlwZSA9PSAiQSIpCmBgYAoKYGBge3J9CmhlYWQoc2hpcHNfbmV3MikKYGBgCgoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gZikgwr9DdcOhbCBlcyBlbCBtw61uaW1vLCBtw6F4aW1vLCBtZWRpYSB5IGRlc3ZpYWNpw7NuIHTDrXBpY2EgZGUgbG9zIGluY2lkZW50ZXMgZGUgbG9zIGJhcmNvcyBkZSB0aXBvIEE/PC9zcGFuPgoKYGBge3J9CnN1bW1hcnkoc2hpcHNfbmV3KQpgYGAKYGBge3J9CnNkX2luYyA8LSBzZChzaGlwc19uZXckaW5jaWRlbnRzKQpjYXQoIkRlc3ZpYWNpw7NuIGVzdMOhbmRhcjoiLCBzZF9pbmMsICJcbiIpCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij4gZykgQ29sb2NhIGxvcyByZXN1bHRhZG9zIGRlbCBhcGFydGFkbyBhbnRlcmlvciBlbiB1bmEgdGFibGEgY29uIGRvcyBjb2x1bW5hcywgdW5hIHNlcsOhIGVsIG5vbWJyZSBkZWwgZXN0YWTDrXN0aWNvIHkgb3RyYSBjb250ZW5kcsOhIHN1IHZhbG9yLjwvc3Bhbj4KCmBgYHtyfQoKbWluX2luYyA8LSBtaW4oc2hpcHNfbmV3JGluY2lkZW50cykKbWF4X2luYyA8LSBtYXgoc2hpcHNfbmV3JGluY2lkZW50cykKbWVhbl9pbmMgPC0gbWVhbihzaGlwc19uZXckaW5jaWRlbnRzKQpzZF9pbmMgPC0gc2Qoc2hpcHNfbmV3JGluY2lkZW50cykKCnRhYmxhX2VzdGFkaXN0aWNvcyA8LSBkYXRhLmZyYW1lKAogIEVzdGFkw61zdGljbyA9IGMoIk3DrW5pbW8iLCAiTcOheGltbyIsICJNZWRpYSIsICJEZXN2aWFjacOzbiBFc3TDoW5kYXIiKSwKICBWYWxvciA9IGMobWluX2luYywgbWF4X2luYywgbWVhbl9pbmMsIHNkX2luYykpCgpwcmludCh0YWJsYV9lc3RhZGlzdGljb3MpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogI0NEOTZDRDsiPkVqZXJjaWNpbyAyPC9zcGFuPgoKYGBge3J9CmhlYWQoVVNBcnJlc3RzKQpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+YSkgwr9IYXkgdmFsb3JlcyBOQSBlbiBsYSBiYXNlIGRlIGRhdG9zPyBFbiBjYXNvIGRlIHF1ZSBsb3MgY29udGVuZ2EsIGN1ZW50YSBjdcOhbnRvcyBzb24geSBlbGltw61uYWxvcyBkZSBsYSBiYXNlIGRlIGRhdG9zLjwvc3Bhbj4KCmBgYHtyfQpzdW0oaXMubmEoKFVTQXJyZXN0cykpKQpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+YikgQ3JlYSB1bmEgbnVldmEgYmFzZSBkZSBkYXRvcywgcXVlIHNlIGxsYW1lIFVTQXJyZXN0c19uZXcgZW4gbGEgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMgc29uIGlndWFsZXMgYSBsYXMgb3JpZ2luYWxlcywgc2Fsdm8gUmFwZTogZGViZXLDoXMgc2VsZWNjaW9uYXIgbG9zIHZhbG9yZXMgZGUgbGEgdmFyaWFibGUgUmFwZSBxdWUgc2VhbiBtYXlvcmVzIHF1ZSA0Ljwvc3Bhbj4KCmBgYHtyfQpVU0FycmVzdHNfbmV3PC1zdWJzZXQoVVNBcnJlc3RzLCBSYXBlPjQpCmBgYAoKYGBge3J9CmhlYWQoVVNBcnJlc3RzX25ldykKYGBgCgoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij5jKSBVdGlsaXphbmRvIGxhIG51ZXZhIGJhc2UgVVNBcnJlc3RzX25ldywgb2J0w6luIGVsIGdyw6FmaWNvIGRlIGRpc3BlcnNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgUmFwZSAoZWplIHgpIHkgTXVyZGVyIChlamUgeSk8L3NwYW4+CgpgYGB7cn0KcGxvdChVU0FycmVzdHNfbmV3JFJhcGUsIFVTQXJyZXN0c19uZXckTXVyZGVyLCBjb2w9ICJsaWdodHNreWJsdWUiLCB4bGFiPSJSYXBlIiwgeWxhYj0gIk11cmRlciIsIHBjaD0xNikKYGBgCgojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogIzYzQjhGRjsiPmQpIENhbWJpYSBlbCByYW5nbyBkZSBsb3MgZWplcyBkZWwgZ3LDoWZpY28gYW50ZXJpb3I6IGVsIGVqZSB5IGRlYmUgaXIgZGVzZGUgMCBoYXN0YSAyMCB5IGVsIGVqZSB4IGRlc2RlIDAgaGFzdGEgNTAuPC9zcGFuPgoKYGBge3J9CnBsb3QoVVNBcnJlc3RzX25ldyRSYXBlLCBVU0FycmVzdHNfbmV3JE11cmRlciwgY29sPSAibGlnaHRza3libHVlIiwgeGxhYj0iUmFwZSIsIHlsYWI9ICJNdXJkZXIiLCBwY2g9MTYseGxpbT1jKDAsNTApLCB5bGltPWMoMCwyMCkpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogI0NEOTZDRDsiPkVqZXJjaWNpbyAzPC9zcGFuPgoKYGBge3J9CmhlYWQobXRjYXJzKQpgYGAKYGBge3J9Cm10Y2FycyA8LSBtdGNhcnMKCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij5hKSBBw7FhZGUgYWwgZGF0YWZyYW1lIHVuYSB2YXJpYWJsZSBkZSBub21icmUgYW1fbmV3IHF1ZSBzZWEgZGUgdGlwbyBmYWN0b3IgZW4gbGEgcXVlIGhheWEgZG9zIGNhdGVnb3LDrWFzLCB0cmFuc21pc2nDs24gYXV0b23DoXRpY2EgbyBtYW51YWwsIGEgcGFydGlyIGRlIGxhIHZhcmlhYmxlIGFtPC9zcGFuPgoKCmBgYHtyfQptdGNhcnMkYW1fbmV3IDwtIGlmZWxzZShtdGNhcnMkYW0gPT0gMCwgImF1dG9tw6F0aWNvIiwgIm1hbnVhbCIpCm10Y2FycyRhbV9uZXcgPC0gZmFjdG9yKG10Y2FycyRhbV9uZXcpICAKCmBgYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij5iKSBSZXByZXNlbnRhIGVsIGRpYWdyYW1hIGRlIGJhcnJhcyBxdWUgbXVlc3RyZSBlbCBuw7ptZXJvIGRlIGNvY2hlcyBwb3IgdGlwbyBkZSB0cmFuc21pc2nDs248L3NwYW4+CgpgYGB7cn0KcGxvdChtdGNhcnMkYW1fbmV3LCBtYWluID0gIlRpcG8gZGUgVHJhbnNtaXNpw7NuIiwKICAgICB4bGFiID0gIlRyYW5zbWlzacOzbiIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsICBjb2w9ICJwYWxlZ3JlZW40IiApCgpgYGAKCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+YykgUmVwcmVzZW50YSBlbCBncsOhZmljbyBkZSBzZWN0b3JlcyBxdWUgbXVlc3RyZSBlbCBuw7ptZXJvIGRlIGNvY2hlcyBwb3IgdGlwbyBkZSB0cmFuc21pc2nDs248L3NwYW4+CgpgYGB7cn0KY291bnRzIDwtIHRhYmxlKG10Y2FycyRhbV9uZXcpCnBpZShjb3VudHMsIGxhYmVscyA9IG5hbWVzKGNvdW50cyksIG1haW4gPSAiTsO6bWVybyBkZSBjb2NoZXMgcG9yIHRpcG8gZGUgdHJhbnNtaXNpw7NuIiwgY29sID0gYygicGluayIsICJza3libHVlIikpCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogI0NEOTZDRDsiPkVqZXJjaWNpbyA0PC9zcGFuPgohW10oL1VzZXJzL2thcmxhbG9wZXovRGVza3RvcC9kYXRvcy5wbmcpCgojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogIzYzQjhGRjsiPmEpwr9RdcOpIGRhdG9zIGRlbCBkYXRhZnJhbWUgc2VsZWNjaW9uYXLDoSBsYSBzaWd1aWVudGUgaW5zdHJ1Y2Npw7NuPzwvc3Bhbj4KIVtdKC9Vc2Vycy9rYXJsYWxvcGV6L0Rlc2t0b3AvYi5wbmcpCgpFbCBkYXRhZnJhbWUgYXJyb2phcsOhIHVuYSBjb2luY2lkZW5jaWEuIEVsIHJlc3VsdGFkbyBzZXLDoSB1bmEgZmlsYSBjb24gIsOBbHZhcm8iLCAiU29sZXIiIHkgIkJhaWxlIi4KCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+IGIpwr9RdcOpIG90cmEgaW5zdHJ1Y2Npw7NuIGRhcsOhIGVsIG1pc21vIG91dHB1dCBxdWUgbGEgZGVsIGFwYXJ0YWRvIGEpPyBFc2NyaWJlIGV4YWN0YW1lbnRlIGN1w6FsIHNlcsOtYSBsYSBsw61uZWEgZGUgY8OzZGlnbyBhIGVqZWN1dGFyPC9zcGFuPgpVbmEgbWFuZXJhIGFsdGVybmF0aXZhIGRlIG9idGVuZXIgZWwgcmVzdWx0YWRvIGRlbCBwdW50byBhIGVzIGNvbjogIAoKYHByb2Zlc29yZXNbcHJvZmVzb3JlcyRhcGVsbGlkb3MgPT0gIlNvbGVyIiAmIHByb2Zlc29yZXMkYXNpZ25hdHVyYSA9PSAiQmFpbGUiLCBdYAoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICM2M0I4RkY7Ij5jKcK/UXXDqSBkYXRvcyBkZWwgZGF0YWZyYW1lIHNlbGVjY2lvbmFyw6EgbGEgc2lndWllbnRlIGluc3RydWNjacOzbj88L3NwYW4+CiFbXSgvVXNlcnMva2FybGFsb3Blei9EZXNrdG9wL2MucG5nKQoKRWwgcmVzdWx0YWRvIHNlcsOhICB0cmVzIGZpbGFzOiB1bmEgY29ycmVzcG9uZGllbnRlIGEgIk1hcsOtYSIgY29uIGxhIGFzaWduYXR1cmEgIkJhaWxlIiB5IGRvcyBmaWxhcyBkb25kZSBsYSBhc2lnbmF0dXJhIGVzICJDYW50byIsIGF1bnF1ZSBlbCBub21icmUgbm8gc2VhICJNYXLDrWEiLgogCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6ICNDRDk2Q0Q7Ij5FamVyY2ljaW8gNTwvc3Bhbj4KCiMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjNjNCOEZGOyI+UmVwcm9kdWNlIGVsIGdyw6FmaWNvIHF1ZSBzZSBtdWVzdHJhIGEgY29udGludWFjacOzbiBzb2JyZSBsYSBiYXNlIGRlIGRhdG9zIFBpbWFJbmRpYW5zRGlhYmV0ZXMuIFBhcmEgYWNjZWRlciBhIGRpY2hhIGJhc2UsIGluc3RhbGEgeSBjYXJnYSBlbCBwYXF1ZXRlIG1sYmVuY2guIExhcyB2YXJpYWJsZXMgYSB1dGlsaXphciBzb24gbWFzcywgZ2x1Y29zZSBhbmQgZGlhYmV0ZXM8L3NwYW4+CgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoIm1sYmVuY2giKQpsaWJyYXJ5KG1sYmVuY2gpCmBgYAoKCmBgYHtyfQpkYXRhKFBpbWFJbmRpYW5zRGlhYmV0ZXMpCgpgYGAKCmBgYHtyfQpwbG90KHg9UGltYUluZGlhbnNEaWFiZXRlcyRtYXNzLCB5PVBpbWFJbmRpYW5zRGlhYmV0ZXMkZ2x1Y29zZSwgY29sPSBQaW1hSW5kaWFuc0RpYWJldGVzJGRpYWJldGVzLCBwY2g9MTYsICB4bGFiID0gIk1hc3MiLCB5bGFiID0gIkdsdWNvc2UiKQpsZWdlbmQoeCA9ICJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIm5lZyIsICJwb3MiKSwgZmlsbCA9IGMoIkJsYWNrIiwgIlJlZCIpKQpgYGAKCgoK