1 EJERCICIO 1

Con los datos del archivo SONIC.csv:

dat1 = import ("Lab-3_files/SONIC(1).csv")
dat2= dat1 %>% 
  select(where(is.numeric) & !ends_with(c('_c','_z')))

dat2 %>% head() %>% flextable()

1.1 Regresión Lineal

a.Realice una regresión lineal de Velocidad (km/s) con respecto a Densidad (g/cm3 ) (Velocidad~Densidad),


mod1 = lm(Velocidad_P~Densidad, data= dat1) # modelo de regresión lineal
mod1 %>% tidy()
mod1%>% glance()

1.2 Regresión Cuadrática

  1. Realice una regresión cuadrática de Velocidad con respecto a Densidad
mod2 = lm(Velocidad_P ~ Densidad + I(Densidad^2), data = dat1) # modelo de regresión cuadrática
mod2 %>% tidy()
mod2 %>% glance()

1.3 Gráfico regresión lineal y cuadrática

  1. Muestre ambas regresiones en un mismo gráfico
ggplot(dat1, aes(Densidad,Velocidad_P)) + geom_point() + geom_smooth(method = 'lm', aes(col='Lineal')) + geom_smooth(method = 'lm', aes(col='Cuadratico'), formula = y~poly(x, 2)) + scale_color_brewer('Modelo',palette = 'Dark2')
`geom_smooth()` using formula 'y ~ x'

1.4 Correlación

  1. Estime la correlación utilizando la relación con la pendiente de la regresión lineal, y de la manera convencional (directamente entre las variables). Obtiene el mismo resultado?
x = dat1$Velocidad_P
y = dat1$Densidad
cor(x,y,method = "pearson",
    use = 'pairwise.complete.obs') # coeficiente de correlacion de Pearson
[1] 0.939
cov(x,y,use = 'pairwise.complete.obs') # covarianza
[1] 0.174

Relación entre correlación y regresión simple Estandarizando el modelo con variables originales

lm(Velocidad_P ~ Densidad, data = dat1) %>% 
standardize_parameters(method = 'refit') %>%
flextable() %>%
colformat_double()
map_dbl(dat1,sd) # desviacion estandar de cada columna
   Densidad Velocidad_P   Tipi_Roca 
      0.226       0.819       2.468 
(3.39*0.226/0.819)   # Coeficiente de correlación = Pendiente* Desv.est.Densidad/ Desv.est. Velocidad
[1] 0.935

1.5 Mejor ajuste

Comparando ambos modelos, cuál considera se ajusta mejor a los datos y por qué? (Recuerde que puede usar medidas de ajuste y gráficos diagnóstico)

R/ El modelo lineal tiene un error cuadrático medio de 0.08 el cual es menor que el del modelo cuadrático que es 0.26. Con respecto al R2 el modelo lineal tiene un valor de 0.881 mientras que el modelo cuadrático tiene un valor de 0.900. Según la puntuación de rendimiento (Performance score) el modelo lineal tiene un 66,67% y el modelo cuadrático un 33,33%. Por lo tanto el modelo lineal se ajusta más a los datos.

1.5.1 Gráficos diagnóstico lineal

# plot(mod1) 
check_model(mod1,panel=F)
$PP_CHECK

$NCV

$HOMOGENEITY

$OUTLIERS

$QQ

1.5.2 Gráficos diagnóstico cuadrática

# plot(mod2) 
check_model(mod2,panel=F)
$PP_CHECK

$NCV

$HOMOGENEITY

$OUTLIERS

$VIF

$QQ

1.5.3 Comparación de modelos

TMod(mod1,mod2) # DescTools
modelsummary(list(Lineal=mod1,Cuadratico=mod2),
             title = 'Comparasion de modelos',
             statistic = NULL, # 'conf.int',
             coef_omit = NULL, # 'Int'
             gof_omit = '^(?!R|Num|A)',
             stars = F,
             fmt = 4)
Comparasion de modelos
Lineal Cuadratico
(Intercept) 1.2403 18.9099
Velocidad_P 0.2596
Densidad −11.7417
I(Densidad^2) 2.5487
Num.Obs. 357 357
R2 0.881 0.900
R2 Adj. 0.881 0.900
AIC −802.3 53.7
RMSE 0.08 0.26
sjPlot::tab_model(mod1,mod2,
                  title = 'Comparasion de modelos',
                  show.std = NULL, # 'std', NULL
                  show.intercept = T,
                  show.ci = F, # .95
                  collapse.ci = F,
                  ci.hyphen = ', ',
                  show.stat = F,
                  show.p = F,
                  show.aic = T,
                  dv.labels = c('Lineal','Cuadrático'),
                  digits = 4,
                  file = 'sjplot_models_lab3.doc')
comp.mods = compare_performance(mod1,mod2,rank = T) # performance
comp.mods
# Comparison of Model Performance Indices

Name | Model |    R2 | R2 (adj.) |  RMSE | Sigma | AIC weights | BIC weights | Performance-Score
------------------------------------------------------------------------------------------------
mod1 |    lm | 0.881 |     0.881 | 0.078 | 0.078 |        1.00 |        1.00 |            66.67%
mod2 |    lm | 0.900 |     0.900 | 0.258 | 0.259 |     < 0.001 |     < 0.001 |            33.33%
plot(comp.mods)

2 EJERCICIO 2

Se tienen 3 grupos de conglomerados, y para cada uno se separan los clastos en mayor o menor a 5 cm. En el conglomerado I hay 20 clastos menores a 5 cm y 16 clastos mayores a 5 cm. En el conglomerado II hay 31 clastos menores a 5 cm y 25 clastos mayores a 5 cm. En el conglomerado III hay 12 clastos menores a 5 cm y 8 clastos mayores a 5 cm.

  1. Cuál es la probabilidad de seleccionar un clasto menor a 5 cm?

R/ De la tabla 1 se obtiene que es 56%/100 = 0.56

  1. Cuál es la probabilidad de seleccionar un clasto mayor a 5 cm, sabiendo que proviene del conglomerado III?

R/ De la tabla 2 se obtiene que es 40%/100 = 0.40

  1. Cuál es la probabilidad de seleccionar un clasto del conglomerado I, sabiendo que es mayor a 5 cm?

R/ De la tabla 3 se obtiene que es 33%/100 = 0.33

  1. Cuál es la probabilidad de seleccionar un clasto del conglomerado II?

R/ De la tabla 1 se obtiene que es 50%/100 = 0.50

A = matrix(data = c(16,20,25,31,8,12),nrow = 2,
           dimnames = list(Clasto=c('Mayor a 5','Menor a 5'),
                           Conglomerado=c('I','II','III')))

A.tb = Untable(A) %>% tibble()

tbl_cross(A.tb, percent = 'cell')
Característica Conglomerado Total
I II III
Clasto
Mayor a 5 16 (14%) 25 (22%) 8 (7.1%) 49 (44%)
Menor a 5 20 (18%) 31 (28%) 12 (11%) 63 (56%)
Total 36 (32%) 56 (50%) 20 (18%) 112 (100%)
tbl_cross(A.tb, percent = 'column')
Característica Conglomerado Total
I II III
Clasto
Mayor a 5 16 (44%) 25 (45%) 8 (40%) 49 (44%)
Menor a 5 20 (56%) 31 (55%) 12 (60%) 63 (56%)
Total 36 (100%) 56 (100%) 20 (100%) 112 (100%)
tbl_cross(A.tb, percent = 'row')
Característica Conglomerado Total
I II III
Clasto
Mayor a 5 16 (33%) 25 (51%) 8 (16%) 49 (100%)
Menor a 5 20 (32%) 31 (49%) 12 (19%) 63 (100%)
Total 36 (32%) 56 (50%) 20 (18%) 112 (100%)
NA
NA

3 PARTE A MANO

knitr::include_graphics("Lab3_files/Parte a mano lab3.jpeg")

NA
LS0tCnRpdGxlOiAiTGFiIDM6IEVzdGFkaXN0aWNhIERlc2NyaXB0aXZhIDIiCmF1dGhvcjogIkpvc8OpIEzDs3BleiBDaGFjw7NuIEExMTk3OCIKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6CiAgICBkZl9wcmludDoga2FibGUKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBrYWJsZQogICAga2VlcF90ZXg6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQogICAga2VlcF9tZDogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IHNwYWNlbGFiCiAgICB0b2M6IHllcwphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgd2FybmluZz1GLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZ3RzdW1tYXJ5KQpsaWJyYXJ5KGZsZXh0YWJsZSkKbGlicmFyeShEZXNjVG9vbHMpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShoaWdoY2hhcnRlcikKbGlicmFyeShtb2RlbHN1bW1hcnkpCmxpYnJhcnkodGlkeW1vZGVscykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmlvKQpsaWJyYXJ5KGVhc3lzdGF0cykKCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSkKCmZvcm1hdG8uc2FsaWRhID0gY2FzZV93aGVuKAogIGtuaXRyOjppc19odG1sX291dHB1dCgpIH4gJ2h0bWwnLAogIGtuaXRyOjppc19sYXRleF9vdXRwdXQoKSB+ICdsYXRleCcsCiAgVCAgfiAnc2ltcGxlJywKKQoKb3B0aW9ucygKICBrbml0ci50YWJsZS5mb3JtYXQgPSBmb3JtYXRvLnNhbGlkYSwKICBtb2RlbHN1bW1hcnlfZ2V0ID0gJ2FsbCcKICAjIE91dERlYyA9ICcsJwogICwgZGlnaXRzID0gMwogICkKCnNldF9mbGV4dGFibGVfZGVmYXVsdHMoCiAgIyBkZWNpbWFsLm1hcmsgPSAnLCcsCiAgIyBiaWcubWFyayA9ICcuJywKICBkaWdpdHMgPSAzCikKCnRoZW1lX2d0c3VtbWFyeV9sYW5ndWFnZSgKICBsYW5ndWFnZSA9ICJlcyIsCiAgIyBkZWNpbWFsLm1hcmsgPSAnLCcsCiAgIyBiaWcubWFyayA9ICcuJywKICBpcXIuc2VwID0gTlVMTCwKICBjaS5zZXAgPSBOVUxMCikKCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIGVycm9yID0gRkFMU0UsCiAgIyBmaWcucGF0aCA9ICJmaWdzLyIsCiAgZmlnLnJldGluYSA9IDMsCiAgZmlnLndpZHRoID0gOCwKICBmaWcuYXNwID0gMC42MTgsCiAgIyBmaWcuYWxpZ24gPSAiY2VudGVyIiwKICBvdXQud2lkdGggPSAiOTAlIgopCmBgYAoKIyBFSkVSQ0lDSU8gMQpDb24gbG9zIGRhdG9zIGRlbCBhcmNoaXZvIFNPTklDLmNzdjoKYGBge3IgZGF0b3N9CmRhdDEgPSBpbXBvcnQgKCJMYWItM19maWxlcy9TT05JQygxKS5jc3YiKQoKYGBgCmBgYHtyIGRhdG9zLW51bX0KZGF0Mj0gZGF0MSAlPiUgCiAgc2VsZWN0KHdoZXJlKGlzLm51bWVyaWMpICYgIWVuZHNfd2l0aChjKCdfYycsJ196JykpKQoKZGF0MiAlPiUgaGVhZCgpICU+JSBmbGV4dGFibGUoKQpgYGAKCgojIyBSZWdyZXNpw7NuIExpbmVhbAphLlJlYWxpY2UgdW5hIHJlZ3Jlc2nDs24gbGluZWFsIGRlIFZlbG9jaWRhZCAoa20vcykgY29uIHJlc3BlY3RvIGEgRGVuc2lkYWQgKGcvY20zICkgKFZlbG9jaWRhZH5EZW5zaWRhZCksCmBgYHtyIG1vZC1saW59Cgptb2QxID0gbG0oVmVsb2NpZGFkX1B+RGVuc2lkYWQsIGRhdGE9IGRhdDEpICMgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsCm1vZDEgJT4lIHRpZHkoKQptb2QxJT4lIGdsYW5jZSgpCmBgYAoKIyMgUmVncmVzacOzbiBDdWFkcsOhdGljYQpiLiBSZWFsaWNlIHVuYSByZWdyZXNpw7NuIGN1YWRyw6F0aWNhIGRlIFZlbG9jaWRhZCBjb24gcmVzcGVjdG8gYSBEZW5zaWRhZApgYGB7cn0KbW9kMiA9IGxtKFZlbG9jaWRhZF9QIH4gRGVuc2lkYWQgKyBJKERlbnNpZGFkXjIpLCBkYXRhID0gZGF0MSkgIyBtb2RlbG8gZGUgcmVncmVzacOzbiBjdWFkcsOhdGljYQptb2QyICU+JSB0aWR5KCkKbW9kMiAlPiUgZ2xhbmNlKCkKYGBgCgojIyBHcsOhZmljbyByZWdyZXNpw7NuIGxpbmVhbCB5IGN1YWRyw6F0aWNhCmMuIE11ZXN0cmUgYW1iYXMgcmVncmVzaW9uZXMgZW4gdW4gbWlzbW8gZ3LDoWZpY28KYGBge3J9CmdncGxvdChkYXQxLCBhZXMoRGVuc2lkYWQsVmVsb2NpZGFkX1ApKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGFlcyhjb2w9J0xpbmVhbCcpKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGFlcyhjb2w9J0N1YWRyYXRpY28nKSwgZm9ybXVsYSA9IHl+cG9seSh4LCAyKSkgKyBzY2FsZV9jb2xvcl9icmV3ZXIoJ01vZGVsbycscGFsZXR0ZSA9ICdEYXJrMicpCmBgYAojIyBDb3JyZWxhY2nDs24KCmQuIEVzdGltZSBsYSBjb3JyZWxhY2nDs24gdXRpbGl6YW5kbyBsYSByZWxhY2nDs24gY29uIGxhIHBlbmRpZW50ZSBkZSBsYSByZWdyZXNpw7NuIGxpbmVhbCwgeSBkZSBsYSBtYW5lcmEgY29udmVuY2lvbmFsIChkaXJlY3RhbWVudGUgZW50cmUgbGFzIHZhcmlhYmxlcykuIE9idGllbmUgZWwgbWlzbW8gcmVzdWx0YWRvPwoKYGBge3J9CnggPSBkYXQxJFZlbG9jaWRhZF9QCnkgPSBkYXQxJERlbnNpZGFkCmBgYAoKYGBge3IgY292LWNvcn0KY29yKHgseSxtZXRob2QgPSAicGVhcnNvbiIsCiAgICB1c2UgPSAncGFpcndpc2UuY29tcGxldGUub2JzJykgIyBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2lvbiBkZSBQZWFyc29uCmNvdih4LHksdXNlID0gJ3BhaXJ3aXNlLmNvbXBsZXRlLm9icycpICMgY292YXJpYW56YQoKYGBgCgoKUmVsYWNpw7NuIGVudHJlIGNvcnJlbGFjacOzbiB5IHJlZ3Jlc2nDs24gc2ltcGxlCkVzdGFuZGFyaXphbmRvIGVsIG1vZGVsbyBjb24gdmFyaWFibGVzIG9yaWdpbmFsZXMKCmBgYHtyIGNvci1tb2Qten0KbG0oVmVsb2NpZGFkX1AgfiBEZW5zaWRhZCwgZGF0YSA9IGRhdDEpICU+JSAKc3RhbmRhcmRpemVfcGFyYW1ldGVycyhtZXRob2QgPSAncmVmaXQnKSAlPiUKZmxleHRhYmxlKCkgJT4lCmNvbGZvcm1hdF9kb3VibGUoKQpgYGAKYGBge3J9Cm1hcF9kYmwoZGF0MSxzZCkgIyBkZXN2aWFjaW9uIGVzdGFuZGFyIGRlIGNhZGEgY29sdW1uYQoKYGBgCmBgYHtyfSAKKDMuMzkqMC4yMjYvMC44MTkpICAgIyBDb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gPSBQZW5kaWVudGUqIERlc3YuZXN0LkRlbnNpZGFkLyBEZXN2LmVzdC4gVmVsb2NpZGFkCgpgYGAKIyMgTWVqb3IgYWp1c3RlCkNvbXBhcmFuZG8gYW1ib3MgbW9kZWxvcywgY3XDoWwgY29uc2lkZXJhIHNlIGFqdXN0YSBtZWpvciBhIGxvcyBkYXRvcyB5IHBvciBxdcOpPyAoUmVjdWVyZGUgcXVlIHB1ZWRlIHVzYXIgbWVkaWRhcyBkZSBhanVzdGUgeSBncsOhZmljb3MgZGlhZ27Ds3N0aWNvKQoKUi8gRWwgbW9kZWxvIGxpbmVhbCB0aWVuZSB1biBlcnJvciBjdWFkcsOhdGljbyBtZWRpbyBkZSAwLjA4IGVsIGN1YWwgZXMgbWVub3IgcXVlIGVsIGRlbCBtb2RlbG8gY3VhZHLDoXRpY28gcXVlIGVzIDAuMjYuIENvbiByZXNwZWN0byBhbCBSMiBlbCBtb2RlbG8gbGluZWFsIHRpZW5lIHVuIHZhbG9yIGRlIDAuODgxIG1pZW50cmFzIHF1ZSBlbCBtb2RlbG8gY3VhZHLDoXRpY28gdGllbmUgdW4gdmFsb3IgZGUgMC45MDAuClNlZ8O6biBsYSBwdW50dWFjacOzbiBkZSByZW5kaW1pZW50byAoUGVyZm9ybWFuY2Ugc2NvcmUpIGVsIG1vZGVsbyBsaW5lYWwgdGllbmUgdW4gNjYsNjclIHkgZWwgbW9kZWxvIGN1YWRyw6F0aWNvIHVuIDMzLDMzJS4gUG9yIGxvIHRhbnRvIGVsIG1vZGVsbyBsaW5lYWwgc2UgYWp1c3RhIG3DoXMgYSBsb3MgZGF0b3MuCgojIyMgR3LDoWZpY29zIGRpYWduw7NzdGljbyBsaW5lYWwKCmBgYHtyIG1vZC1jaGVjay0xfQojIHBsb3QobW9kMSkgCmNoZWNrX21vZGVsKG1vZDEscGFuZWw9RikKYGBgCiMjIyBHcsOhZmljb3MgZGlhZ27Ds3N0aWNvIGN1YWRyw6F0aWNhCgpgYGB7ciBtb2QtY2hlY2stMn0KIyBwbG90KG1vZDIpIApjaGVja19tb2RlbChtb2QyLHBhbmVsPUYpCmBgYAoKIyMjIENvbXBhcmFjacOzbiBkZSBtb2RlbG9zCgpgYGB7ciBjb21wLW1vZDF9ClRNb2QobW9kMSxtb2QyKSAjIERlc2NUb29scwpgYGAKCmBgYHtyIGNvbXAtbW9kMn0KbW9kZWxzdW1tYXJ5KGxpc3QoTGluZWFsPW1vZDEsQ3VhZHJhdGljbz1tb2QyKSwKICAgICAgICAgICAgIHRpdGxlID0gJ0NvbXBhcmFzaW9uIGRlIG1vZGVsb3MnLAogICAgICAgICAgICAgc3RhdGlzdGljID0gTlVMTCwgIyAnY29uZi5pbnQnLAogICAgICAgICAgICAgY29lZl9vbWl0ID0gTlVMTCwgIyAnSW50JwogICAgICAgICAgICAgZ29mX29taXQgPSAnXig/IVJ8TnVtfEEpJywKICAgICAgICAgICAgIHN0YXJzID0gRiwKICAgICAgICAgICAgIGZtdCA9IDQpCmBgYAoKYGBge3IgY29tcC1tb2QzfQpzalBsb3Q6OnRhYl9tb2RlbChtb2QxLG1vZDIsCiAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ0NvbXBhcmFzaW9uIGRlIG1vZGVsb3MnLAogICAgICAgICAgICAgICAgICBzaG93LnN0ZCA9IE5VTEwsICMgJ3N0ZCcsIE5VTEwKICAgICAgICAgICAgICAgICAgc2hvdy5pbnRlcmNlcHQgPSBULAogICAgICAgICAgICAgICAgICBzaG93LmNpID0gRiwgIyAuOTUKICAgICAgICAgICAgICAgICAgY29sbGFwc2UuY2kgPSBGLAogICAgICAgICAgICAgICAgICBjaS5oeXBoZW4gPSAnLCAnLAogICAgICAgICAgICAgICAgICBzaG93LnN0YXQgPSBGLAogICAgICAgICAgICAgICAgICBzaG93LnAgPSBGLAogICAgICAgICAgICAgICAgICBzaG93LmFpYyA9IFQsCiAgICAgICAgICAgICAgICAgIGR2LmxhYmVscyA9IGMoJ0xpbmVhbCcsJ0N1YWRyw6F0aWNvJyksCiAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDQsCiAgICAgICAgICAgICAgICAgIGZpbGUgPSAnc2pwbG90X21vZGVsc19sYWIzLmRvYycpCmBgYAoKYGBge3IgY29tcC1tb2Q0fQpjb21wLm1vZHMgPSBjb21wYXJlX3BlcmZvcm1hbmNlKG1vZDEsbW9kMixyYW5rID0gVCkgIyBwZXJmb3JtYW5jZQpjb21wLm1vZHMKcGxvdChjb21wLm1vZHMpCmBgYAoKIyBFSkVSQ0lDSU8gMgpTZSB0aWVuZW4gMyBncnVwb3MgZGUgY29uZ2xvbWVyYWRvcywgeSBwYXJhIGNhZGEgdW5vIHNlIHNlcGFyYW4gbG9zIGNsYXN0b3MgZW4gbWF5b3IgbyBtZW5vciBhIDUgY20uIEVuIGVsIGNvbmdsb21lcmFkbyBJIGhheSAyMCBjbGFzdG9zIG1lbm9yZXMgYSA1IGNtIHkgMTYgY2xhc3RvcyBtYXlvcmVzIGEgNSBjbS4gRW4gZWwgY29uZ2xvbWVyYWRvIElJIGhheSAzMSBjbGFzdG9zIG1lbm9yZXMgYSA1IGNtIHkgMjUgY2xhc3RvcyBtYXlvcmVzIGEgNSBjbS4gRW4gZWwgY29uZ2xvbWVyYWRvIElJSSBoYXkgMTIgY2xhc3RvcyBtZW5vcmVzIGEgNSBjbSB5IDggY2xhc3RvcyBtYXlvcmVzIGEgNSBjbS4KCmEuIEN1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBzZWxlY2Npb25hciB1biBjbGFzdG8gbWVub3IgYSA1IGNtPwoKUi8gRGUgbGEgdGFibGEgMSBzZSBvYnRpZW5lIHF1ZSBlcyA1NiUvMTAwID0gMC41NgoKYi4gQ3XDoWwgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHNlbGVjY2lvbmFyIHVuIGNsYXN0byBtYXlvciBhIDUgY20sIHNhYmllbmRvIHF1ZSBwcm92aWVuZSBkZWwgY29uZ2xvbWVyYWRvIElJST8KClIvIERlIGxhIHRhYmxhIDIgc2Ugb2J0aWVuZSBxdWUgZXMgNDAlLzEwMCA9IDAuNDAKCmMuIEN1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBzZWxlY2Npb25hciB1biBjbGFzdG8gZGVsIGNvbmdsb21lcmFkbyBJLCBzYWJpZW5kbyBxdWUgZXMgbWF5b3IgYSA1IGNtPwoKUi8gRGUgbGEgdGFibGEgMyAgc2Ugb2J0aWVuZSBxdWUgZXMgMzMlLzEwMCA9IDAuMzMKCmQuIEN1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBzZWxlY2Npb25hciB1biBjbGFzdG8gZGVsIGNvbmdsb21lcmFkbyBJST8KClIvIERlIGxhIHRhYmxhIDEgc2Ugb2J0aWVuZSBxdWUgZXMgNTAlLzEwMCA9IDAuNTAKCgpgYGB7ciBwcm9ifQpBID0gbWF0cml4KGRhdGEgPSBjKDE2LDIwLDI1LDMxLDgsMTIpLG5yb3cgPSAyLAogICAgICAgICAgIGRpbW5hbWVzID0gbGlzdChDbGFzdG89YygnTWF5b3IgYSA1JywnTWVub3IgYSA1JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmdsb21lcmFkbz1jKCdJJywnSUknLCdJSUknKSkpCgpBLnRiID0gVW50YWJsZShBKSAlPiUgdGliYmxlKCkKCnRibF9jcm9zcyhBLnRiLCBwZXJjZW50ID0gJ2NlbGwnKQp0YmxfY3Jvc3MoQS50YiwgcGVyY2VudCA9ICdjb2x1bW4nKQp0YmxfY3Jvc3MoQS50YiwgcGVyY2VudCA9ICdyb3cnKQoKCmBgYAojIFBBUlRFIEEgTUFOTwpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkxhYjNfZmlsZXMvUGFydGUgYSBtYW5vIGxhYjMuanBlZyIpCgpgYGAK