Distribución y Densidad de Probabilidad Normal
Distribuciones de Probabilidad Continua:
Pueden
tomar varias formas, pero un gran número de variables aleatorias
observadas en la naturaleza poseen una distribución de frecuencia que
tiene más o menos la forma de montículo, o bien, como se diría en
estadística, es aproximadamente una distribución normal de probabilidad.
Formula que genera esta distribución:
- e = 2.72
- pi = 3.141592653589793
\[
f(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{1}{2}\left(\frac{x -
\mu}{\sigma}\right)^2}
\]

- El área bajo la curva es igual a 1.
- Para variables aleatorias continuas, área = probabilidad.
- El área a la izquierda de la media es igual a .S.
- ” ” ” ” ” ” derechas ” ” ” ” ” ” ” ” ” ” ” “

Para hallar la probabilidad de que una variable aleatoria normal “x”
se encuentre en el intervalo de “a” a “b” necesitamos obtener el área
bajo la curva normal entre los puntos “a” y “b”. No obstante, hay un
número infinitamente grande de distribuciones normales, uno para cada
media y desviación estándar diferentes.
Variable Aleatoriamente Normal Estándar
Beneficio: nos permite usar la misma tabla para todas las
distribuciones normales.
Formula:
\[z = \frac{x - \mu}{\sigma}\]
La distribución de probabilidad para “z” se denomina “Distribución
Normal Estandarizada”
Ejercicio 3
a. Un estudio demostró que el uso de gasolina para autos
compactos vendidos en EE.UU. está distribuido normalmente, con una media
de 25.5 millas por galón (mpg) y una desviación estándar de 4.5 mpg.
¿Qué porcentaje de autos recorre 30 mpg o más?
Datos:
x = 30
μ = 25.5
σ = 4.5
P = ?
Formula:
\[z = \frac{x -
\mu}{\sigma}\] \[z = \frac{30 -
25.5}{4.5}=1.00\] \[P = 1 - 0.8413 =
0.1587\]
Porcentaje bajo la curva (Probabilidad)
1-pnorm(30,25.5,4.5) # se le pone 1 - ya que en el ejercicio se le restó
## [1] 0.1586553
Respuesta: El 15.9% de autos recorre 30 mpg o más.
b. Si un fabricante desea desarrollar un auto que supere al
95% de los compactos actuales, ¿Cuál debe ser el rendimiento
(mpg)?
\[X₀ = μ + Z₀ σ\] \[X₀ = 25.5 + 1.645(4.5)\] \[X₀ = 32.9\]
De Tablas, Z₀ = 1.645
Valor en el Eje X
qnorm(0.95,25.5,4.5)
## [1] 32.90184
Respuesta:El nuevo auto compacto debe recorrer 32.9 mpg para superar
al 95% de los autos actuales.
Ejercicio 4
Suponga que los diámetros de tallos no sorportados en la base, de una
especie particular de girasol, tienen una distribución normal con un
diámetro promedio de 35mm y una desviación estándar de 3mm.
a. ¿Cuál es la probabilidad de que una planta de girasol
tenga un diámetro de base de más de 40 mm?
? = Probabilidad base más de 40 mm
fomula
\[
\displaystyle f(x) = \frac{1}{\sigma \sqrt{2\pi}} \int_{-\infty}^{x}
e^{-\frac{(x - \mu)^2}{2\sigma^2}}
\]
z = (40 - 35) / 3
z = 1.67
P = 1 - 0.9525
P = 0.0475 =
4.75%
La probabilidad es de 4.75%
Za <- (40-35)/3
Za
## [1] 1.666667
Pa <- 1-pnorm(40,35,3)
Pa
## [1] 0.04779035
Función de Densidad de Probabilidad (Normal)
x<- 40
promedio<- 35
sd<- 3
# Lo maximo que nos podemos alejar del promedio es 3 deviaciones estandar de la media (99.7%)
x_den <- seq(promedio-3*sd,promedio+3*sd,length=1000)
y_den <- dnorm(x_den, promedio, sd)
plot(x_den, y_den, type="l", lty = 1, xlab = "x", ylab = "f(x)", main = "Función de Densidad de Probabilidad (Normal)", col = "darkgreen")

Función de Distribución de Probabilidad (Normal)
x_dist <- seq(promedio-3*sd,promedio+3*sd,length=1000)
y_dist <- pnorm(x_dist,promedio,sd)
plot(x_dist, y_dist, type="l", lty = 1, xlab = "x", ylab = "f(x)", main = "Función de Distribución de Probabilidad (Normal)", col = "blue")

b. Si 2 plantas de girasol se seleccionan al azar, ¿cuál es
la probabilidad de que ambas plantas tengan un diámetro de base de más
de 40 mm?
Por definición, la probabilidad de que dos eventos mutuamente
excluyentes ocurran es la de multiplicar la probabilidad individual de
cada una.
P1 * P2 = 0.0485 * 0.0485
P = 0.0023 = 0.23%
La probabilidad es de 0.23%
Pb <- Pa * Pa
Pb
## [1] 0.002283918
c. ¿Dentro de qué límites esperaría usted que se encuentren
los diámetros de base, con probabilidad de 0.95?
? = Límites de la base
Sería calcular los extremos que quedan
afuera del 95% (2.5% y 97.5%)
p1 = 0.025
x1 = 35 + -1.96(3)
x1 = 29.12
p2 = 0.975
x2 = 35 + 1.96(3)
x2 = 40.88
Los límites en los que se encuentran los diámetros de la base son
29.1 mm y 40.8 mm.
Esperaría que los girasoles con probabilidad de 0.95 se encuentren
dentro de los límites.
Pc1 <- qnorm(0.025,35,3) #Límite 1
Pc1
## [1] 29.12011
Pc2 <- qnorm(0.975,35,3) #Límite 2
Pc2
## [1] 40.87989
d. ¿Qué diámetro representa al 90avo percentil de la
distribución de diámetros?
p = 0.90
x = 35 + 1.28(3)
x = 38.84
El 90vo percentil está en un diámetro de 38.8 mm.
Pd <- qnorm(0.90,35,3)
Pd
## [1] 38.84465
Shiny App
## PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.
Shiny applications not supported in static R Markdown documents
Ejercicio 5
Un nuevo proceso para producir diamantes sintéticos es rentable sólo
di el peso de éstos es mayor a 0.5 quilates. Para evaluarlo se generaron
6 diamantes con los siguientes pesos:
Pesos: 0.46, 0.61, 0.52, 0.48, 0.57, 0.54
¿El proceso es rentable?
Solución:
Ho: μ ≤ 0.5
Ha: μ > 0.5
α = 0.05
Grafica de zonas de aceptación/rechazo
Valor crítico = 2.015
Grados de libertad = 5
Formula
\[\displaystyle t =
\frac{\bar{x} - \mu}{\frac{s}{\sqrt{n}}} \]
Procedimiento
#Insertar formula
peso_diamante <- c(0.46, 0.61, 0.52, 0.48, 0.57, 0.54)
promedio <- mean(peso_diamante)
promedio
## [1] 0.53
sd_muestral <- sqrt(var(peso_diamante))
sd_muestral
## [1] 0.05585696
n <- 6
miu_o <- 0.5
t <- (promedio-miu_o)/(sd_muestral/sqrt(n))
t
## [1] 1.315587
- Respuesta: No se rechaza Ho, los datos no presentan
suficiente evidencia para indicar que el peso medio de los diamantes
exceda los 0.5 quilates.
Función de Densidad de Probabilidad (t de Student)
x_den <- seq(-4,4,length=1000)
y_den <- dt(x_den, df=5)
plot(x_den,y_den,type="l",lty=1,xlab="t",ylab="f(t)", main="Función de Densidad de Probabilidad (t de Student)")

plot
## function (x, y, ...)
## UseMethod("plot")
## <bytecode: 0x11aa4a1f8>
## <environment: namespace:base>
Función de Distribución de Probabilidad (t de
Student)
x_den <- seq(-4,4,length=1000)
y_den <- pt(x_den, df=5)
plot(x_den,y_den,type="l",lty=1,xlab="t",ylab="f(t)", main="Función de Distribución de Probabilidad (t de Student)")

plot
## function (x, y, ...)
## UseMethod("plot")
## <bytecode: 0x11aa4a1f8>
## <environment: namespace:base>
Ejercicio 6
Contenido de O2 disuelto
Los desechos industriales y residuales descargados en nuestros ríos y
arroyos absorben oxígeno y, por tanto, reducen la cantidad de oxígeno
disuelto disponible para peces y otras formas de fauna acuática. Una
agencia estatal requiere un mínimo de 5 partes por millón (ppm) de
oxígeno disuelto para que el contenido de oxígeno sea suficiente para
sostener vida acuática. Seis especímenes de agua tomados de un río en un
lugar específico durante la estación de aguas bajas (julio) dio lecturas
de 4.9, 5.1, 4.9, 5.0, 5.0 y 4.7 de oxígeno disuelto.
¿Los datos dan suficiente evidencia para indicar que el
contenido de oxígeno disuelto es menor a 5 ppm? Pruebe usando α
= 0.05
Ho: μ ≤ 0.5
Ha: μ < 0.5
α = 0.05
Grafica de zonas de aceptación/rechazo
Valor crítico = -2.015
Grados de libertad = 5
Formula
\[\displaystyle t =
\frac{\bar{x} - \mu}{\frac{s}{\sqrt{n}}} \]
Procedimiento
ppm <- c(4.9, 5.1, 4.9, 5.0, 5.0, 4.7)
promedio <- mean(ppm)
promedio
## [1] 4.933333
sd_muestra <- sqrt(var(ppm))
sd_muestra
## [1] 0.136626
n <- 6
miu_o <- 5
t <- (promedio-miu_o)/(sd_muestra/sqrt(n))
t
## [1] -1.195229
- Respuesta: No se rechaza Ho.
LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDMuMiIKYXV0aG9yOiAiRXN0ZWZhbnkgZGUgbG9zIEFuZ2VsZXMgVmlsbGFsb2JvcyBGZXJuYW5kZXoiCmRhdGU6ICIyMDIzLTA5LTAzIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6ICJzYW5kc3RvbmUiCi0tLQoKIVtdKC9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL2Rlc2lkaXMuZ2lmKQoKIyMjIExsYW1hciBsaWJyZXLDrWFzCmBgYHtyfQoKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShtYWdpY2spCmxpYnJhcnkoa25pdHIpCgpgYGAKCiMjIyBTZXQgV29ya2luZyBEaXJlY3RvcnkKYGBge3J9CnNldHdkKCIvVXNlcnMvZXN0ZWZhbnl2aWxsYWxvYm9zL0Rlc2t0b3AvUlBvcnRmb2xpbyIpCmBgYAoKIyBEaXN0cmlidWNpw7NuIHkgRGVuc2lkYWQgZGUgUHJvYmFiaWxpZGFkIE5vcm1hbAoKKipEaXN0cmlidWNpb25lcyBkZSBQcm9iYWJpbGlkYWQgQ29udGludWE6KiogPGJyPgpQdWVkZW4gdG9tYXIgdmFyaWFzIGZvcm1hcywgcGVybyB1biBncmFuIG7Dum1lcm8gZGUgdmFyaWFibGVzIGFsZWF0b3JpYXMgb2JzZXJ2YWRhcyBlbiBsYSBuYXR1cmFsZXphIHBvc2VlbiB1bmEgZGlzdHJpYnVjacOzbiBkZSBmcmVjdWVuY2lhIHF1ZSB0aWVuZSBtw6FzIG8gbWVub3MgbGEgZm9ybWEgZGUgbW9udMOtY3VsbywgbyBiaWVuLCBjb21vIHNlIGRpcsOtYSBlbiBlc3RhZMOtc3RpY2EsIGVzIGFwcm94aW1hZGFtZW50ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgZGUgcHJvYmFiaWxpZGFkLiA8YnI+CgoqKkZvcm11bGEgcXVlIGdlbmVyYSBlc3RhIGRpc3RyaWJ1Y2nDs246KiogPGJyPgoKLSBlID0gMi43MiA8YnI+Ci0gcGkgPSAzLjE0MTU5MjY1MzU4OTc5MyA8YnI+CgokJApmKHgpID0gXGZyYWN7MX17XHNpZ21hIFxzcXJ0ezJccGl9fSBlXnstXGZyYWN7MX17Mn1cbGVmdChcZnJhY3t4IC0gXG11fXtcc2lnbWF9XHJpZ2h0KV4yfQokJAoKIVtdKC9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9SUG9ydGZvbGlvL3QyMV9ub3JtYWx0aXAuZ2lmKQoKLSBFbCDDoXJlYSBiYWpvIGxhIGN1cnZhIGVzIGlndWFsIGEgMS4gPGJyPgotIFBhcmEgdmFyaWFibGVzIGFsZWF0b3JpYXMgY29udGludWFzLCDDoXJlYSA9IHByb2JhYmlsaWRhZC4gPGJyPiAKLSBFbCDDoXJlYSBhIGxhIGl6cXVpZXJkYSBkZSBsYSBtZWRpYSBlcyBpZ3VhbCBhIC5TLiA8YnI+Ci0gKiIgIiAiICIgIiAiIGRlcmVjaGFzICIgIiAiICIgIiAiICIgIiAiICIgIiAiKiA8YnI+CgohW10oL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1JQb3J0Zm9saW8vZ3JhZmljYS1kaXN0cmlidWNpb24tbm9ybWFsLTEwMjR4NjcwLnBuZykKClBhcmEgaGFsbGFyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW5hIHZhcmlhYmxlIGFsZWF0b3JpYSBub3JtYWwgIngiIHNlIGVuY3VlbnRyZSBlbiBlbCBpbnRlcnZhbG8gZGUgImEiIGEgImIiIG5lY2VzaXRhbW9zIG9idGVuZXIgZWwgw6FyZWEgYmFqbyBsYSBjdXJ2YSBub3JtYWwgZW50cmUgbG9zIHB1bnRvcyAiYSIgeSAiYiIuIE5vIG9ic3RhbnRlLCBoYXkgdW4gbsO6bWVybyBpbmZpbml0YW1lbnRlIGdyYW5kZSBkZSBkaXN0cmlidWNpb25lcyBub3JtYWxlcywgdW5vIHBhcmEgY2FkYSBtZWRpYSB5IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBkaWZlcmVudGVzLiA8YnI+CgoqKlZhcmlhYmxlIEFsZWF0b3JpYW1lbnRlIE5vcm1hbCBFc3TDoW5kYXIqKiA8YnI+IAoKKkJlbmVmaWNpbyo6IG5vcyBwZXJtaXRlIHVzYXIgbGEgbWlzbWEgdGFibGEgcGFyYSB0b2RhcyBsYXMgZGlzdHJpYnVjaW9uZXMgbm9ybWFsZXMuIDxicj4KKkZvcm11bGEqOiA8YnI+ICAKXFt6ID0gXGZyYWN7eCAtIFxtdX17XHNpZ21hfVxdCgpMYSBkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZCBwYXJhICJ6IiBzZSBkZW5vbWluYSAgIkRpc3RyaWJ1Y2nDs24gTm9ybWFsIEVzdGFuZGFyaXphZGEiIDxicj4KCgojIyBFamVyY2ljaW8gMyAgPGJyPgoqKmEuIFVuIGVzdHVkaW8gZGVtb3N0csOzIHF1ZSBlbCB1c28gZGUgZ2Fzb2xpbmEgcGFyYSBhdXRvcyBjb21wYWN0b3MgdmVuZGlkb3MgZW4gRUUuVVUuIGVzdMOhIGRpc3RyaWJ1aWRvIG5vcm1hbG1lbnRlLCBjb24gdW5hIG1lZGlhIGRlIDI1LjUgbWlsbGFzIHBvciBnYWzDs24gKG1wZykgeSB1bmEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIDQuNSBtcGcuIMK/UXXDqSBwb3JjZW50YWplIGRlIGF1dG9zIHJlY29ycmUgMzAgbXBnIG8gbcOhcz8qKiA8YnI+CgoqRGF0b3M6KiAgPGJyPgoKeCA9IDMwIDxicj4KzrwgPSAyNS41IDxicj4Kz4MgPSA0LjUgPGJyPgpQID0gPyA8YnI+CgoqRm9ybXVsYToqICA8YnI+ClxbeiA9IFxmcmFje3ggLSBcbXV9e1xzaWdtYX1cXQpcW3ogPSBcZnJhY3szMCAtIDI1LjV9ezQuNX09MS4wMFxdClxbUCA9IDEgLSAwLjg0MTMgPSAwLjE1ODdcXQoKIyMjIFBvcmNlbnRhamUgYmFqbyBsYSBjdXJ2YSAoUHJvYmFiaWxpZGFkKQpgYGB7cn0KMS1wbm9ybSgzMCwyNS41LDQuNSkgIyBzZSBsZSBwb25lIDEgLSB5YSBxdWUgZW4gZWwgZWplcmNpY2lvIHNlIGxlIHJlc3TDswpgYGAKClJlc3B1ZXN0YTogRWwgMTUuOSUgZGUgYXV0b3MgcmVjb3JyZSAzMCBtcGcgbyBtw6FzLiA8YnI+CgoqKmIuIFNpIHVuIGZhYnJpY2FudGUgZGVzZWEgZGVzYXJyb2xsYXIgdW4gYXV0byBxdWUgc3VwZXJlIGFsIDk1JSBkZSBsb3MgY29tcGFjdG9zIGFjdHVhbGVzLCDCv0N1w6FsIGRlYmUgc2VyIGVsIHJlbmRpbWllbnRvIChtcGcpPyoqIDxicj4KClxbWOKCgCA9IM68ICsgWuKCgCDPg1xdClxbWOKCgCA9IDI1LjUgKyAxLjY0NSg0LjUpXF0KXFtY4oKAID0gMzIuOVxdCgpEZSBUYWJsYXMsIFrigoAgPSAxLjY0NSA8YnI+CgojIyMgVmFsb3IgZW4gZWwgRWplIFgKYGBge3J9CnFub3JtKDAuOTUsMjUuNSw0LjUpCmBgYAoKUmVzcHVlc3RhOkVsIG51ZXZvIGF1dG8gY29tcGFjdG8gZGViZSByZWNvcnJlciAzMi45IG1wZyBwYXJhIHN1cGVyYXIgYWwgOTUlIGRlIGxvcyBhdXRvcyBhY3R1YWxlcy4gPGJyPgoKIyMgRWplcmNpY2lvIDQKClN1cG9uZ2EgcXVlIGxvcyBkacOhbWV0cm9zIGRlIHRhbGxvcyBubyBzb3Jwb3J0YWRvcyBlbiBsYSBiYXNlLCBkZSB1bmEgZXNwZWNpZSBwYXJ0aWN1bGFyIGRlIGdpcmFzb2wsIHRpZW5lbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIHVuIGRpw6FtZXRybyBwcm9tZWRpbyBkZSAzNW1tIHkgdW5hIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBkZSAzbW0uIDxicj4KCioqYS4gwr9DdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuYSBwbGFudGEgZGUgZ2lyYXNvbCB0ZW5nYSB1biBkacOhbWV0cm8gIGRlIGJhc2UgZGUgbcOhcyBkZSA0MCBtbT8qKiA8YnI+Cgo/ID0gUHJvYmFiaWxpZGFkIGJhc2UgbcOhcyBkZSA0MCBtbSA8YnI+CgoqKmZvbXVsYSoqIDxicj4KJCQKXGRpc3BsYXlzdHlsZSBmKHgpID0gXGZyYWN7MX17XHNpZ21hIFxzcXJ0ezJccGl9fSBcaW50X3stXGluZnR5fV57eH0gZV57LVxmcmFjeyh4IC0gXG11KV4yfXsyXHNpZ21hXjJ9fSAKJCQKCnogPSAoNDAgLSAzNSkgLyAzIDxicj4KeiA9IDEuNjcgPGJyPgpQID0gMSAtIDAuOTUyNSA8YnI+ClAgPSAwLjA0NzUgPSA0Ljc1JSA8YnI+CgpMYSBwcm9iYWJpbGlkYWQgZXMgZGUgNC43NSUgPGJyPgoKCmBgYHtyfQpaYSA8LSAoNDAtMzUpLzMKWmEKUGEgPC0gMS1wbm9ybSg0MCwzNSwzKSAKUGEKYGBgCgoqKkZ1bmNpw7NuIGRlIERlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCAoTm9ybWFsKSoqIDxicj4KCmBgYHtyfQp4PC0gNDAKcHJvbWVkaW88LSAzNQpzZDwtIDMKYGBgCgoKYGBge3J9CiMgTG8gbWF4aW1vIHF1ZSBub3MgcG9kZW1vcyBhbGVqYXIgZGVsIHByb21lZGlvIGVzIDMgZGV2aWFjaW9uZXMgZXN0YW5kYXIgZGUgbGEgbWVkaWEgKDk5LjclKQoKeF9kZW4gPC0gc2VxKHByb21lZGlvLTMqc2QscHJvbWVkaW8rMypzZCxsZW5ndGg9MTAwMCkKeV9kZW4gPC0gZG5vcm0oeF9kZW4sIHByb21lZGlvLCBzZCkKCnBsb3QoeF9kZW4sIHlfZGVuLCB0eXBlPSJsIiwgbHR5ID0gMSwgeGxhYiA9ICJ4IiwgeWxhYiA9ICJmKHgpIiwgbWFpbiA9ICJGdW5jacOzbiBkZSBEZW5zaWRhZCBkZSBQcm9iYWJpbGlkYWQgKE5vcm1hbCkiLCBjb2wgPSAiZGFya2dyZWVuIikKCmBgYAoKKipGdW5jacOzbiBkZSBEaXN0cmlidWNpw7NuIGRlIFByb2JhYmlsaWRhZCAoTm9ybWFsKSoqIDxicj4KCmBgYHtyfQoKeF9kaXN0IDwtIHNlcShwcm9tZWRpby0zKnNkLHByb21lZGlvKzMqc2QsbGVuZ3RoPTEwMDApCnlfZGlzdCA8LSBwbm9ybSh4X2Rpc3QscHJvbWVkaW8sc2QpCgpwbG90KHhfZGlzdCwgeV9kaXN0LCB0eXBlPSJsIiwgbHR5ID0gMSwgeGxhYiA9ICJ4IiwgeWxhYiA9ICJmKHgpIiwgbWFpbiA9ICJGdW5jacOzbiBkZSBEaXN0cmlidWNpw7NuIGRlIFByb2JhYmlsaWRhZCAoTm9ybWFsKSIsIGNvbCA9ICJibHVlIikKCmBgYAoKCioqYi4gU2kgMiBwbGFudGFzIGRlIGdpcmFzb2wgc2Ugc2VsZWNjaW9uYW4gYWwgYXphciwgwr9jdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGFtYmFzIHBsYW50YXMgdGVuZ2FuIHVuIGRpw6FtZXRybyBkZSBiYXNlIGRlIG3DoXMgZGUgNDAgbW0/KiogPGJyPgoKUG9yIGRlZmluaWNpw7NuLCBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGRvcyBldmVudG9zIG11dHVhbWVudGUgZXhjbHV5ZW50ZXMgb2N1cnJhbiBlcyBsYSBkZSBtdWx0aXBsaWNhciBsYSBwcm9iYWJpbGlkYWQgaW5kaXZpZHVhbCBkZSBjYWRhIHVuYS4gPGJyPgoKUDEgKiBQMiA9IDAuMDQ4NSAqIDAuMDQ4NSA8YnI+ClAgPSAwLjAwMjMgPSAwLjIzJSA8YnI+CgpMYSBwcm9iYWJpbGlkYWQgZXMgZGUgMC4yMyUgPGJyPgoKYGBge3J9ClBiIDwtIFBhICogUGEKUGIKYGBgCgoqKmMuIMK/RGVudHJvIGRlIHF1w6kgbMOtbWl0ZXMgZXNwZXJhcsOtYSB1c3RlZCBxdWUgc2UgZW5jdWVudHJlbiBsb3MgZGnDoW1ldHJvcyBkZSBiYXNlLCBjb24gcHJvYmFiaWxpZGFkIGRlIDAuOTU/KiogPGJyPgoKPyA9IEzDrW1pdGVzIGRlIGxhIGJhc2UgPGJyPgpTZXLDrWEgY2FsY3VsYXIgbG9zIGV4dHJlbW9zIHF1ZSBxdWVkYW4gYWZ1ZXJhIGRlbCA5NSUgKDIuNSUgeSA5Ny41JSkgPGJyPgoKcDEgPSAwLjAyNSA8YnI+CngxID0gMzUgKyAtMS45NigzKSA8YnI+CngxID0gMjkuMTIgPGJyPgoKcDIgPSAwLjk3NSA8YnI+CngyID0gMzUgKyAxLjk2KDMpIDxicj4KeDIgPSA0MC44OCA8YnI+CgpMb3MgbMOtbWl0ZXMgZW4gbG9zIHF1ZSBzZSBlbmN1ZW50cmFuIGxvcyBkacOhbWV0cm9zIGRlIGxhIGJhc2Ugc29uIDI5LjEgbW0geSA0MC44IG1tLiA8YnI+CgpFc3BlcmFyw61hIHF1ZSBsb3MgZ2lyYXNvbGVzIGNvbiBwcm9iYWJpbGlkYWQgZGUgMC45NSBzZSBlbmN1ZW50cmVuIGRlbnRybyBkZSBsb3MgbMOtbWl0ZXMuIDxicj4KYGBge3J9ClBjMSA8LSBxbm9ybSgwLjAyNSwzNSwzKSAjTMOtbWl0ZSAxClBjMQpQYzIgPC0gcW5vcm0oMC45NzUsMzUsMykgI0zDrW1pdGUgMgpQYzIKCmBgYAoKKipkLiDCv1F1w6kgZGnDoW1ldHJvIHJlcHJlc2VudGEgYWwgOTBhdm8gcGVyY2VudGlsIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZGnDoW1ldHJvcz8qKiA8YnI+CgpwID0gMC45MCA8YnI+CnggPSAzNSArIDEuMjgoMykgPGJyPgp4ID0gMzguODQgPGJyPgoKRWwgOTB2byBwZXJjZW50aWwgZXN0w6EgZW4gdW4gZGnDoW1ldHJvIGRlIDM4LjggbW0uIDxicj4KCmBgYHtyfQpQZCA8LSBxbm9ybSgwLjkwLDM1LDMpClBkCmBgYAoKIyMgU2hpbnkgQXBwCgpgYGB7ciwgZWNobz1GQUxTRX0KCiMiZWNobz1GQUxTRSIgaGFjZSBxdWUgbm8gc2UgdmVhIGVsIGNvZGlnbwoKbGlicmFyeShzaGlueSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHNoaW55dGhlbWVzKQoKc2hpbnlBcHAoCiAgCnVpIDwtIGZsdWlkUGFnZSh0aGVtZT0gc2hpbnl0aGVtZSgic2FuZHN0b25lIiksCiAgICAgICAgICAgICAgICBuYXZiYXJQYWdlKCJBcHBsaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJQYW5lbCgiTm9ybWFsIERpc3RyaWJ1dGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVBhbmVsKCJWaXN1YWxpemF0aW9uIG9mIE5vcm1hbCBEaXN0cmlidXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZWJhckxheW91dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlYmFyUGFuZWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzJGg1ICgiRW50ZXIgdGhlIGZvbGxvd2luZyBkYXRhOiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNJbnB1dCgibWVhbiIsICJNZWFuOiIsICIxIiksICNTZSBwb25lIGVsIHZhbG9yIG8gY29uICIiIG8gY29uICJ2YWx1ZSA9ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNJbnB1dCgieCIsICJWYWx1ZSBvZiB4OiIsICIwIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljSW5wdXQoInNkIiwgIlN0YW5kYXJkIERldmlhdGlvbjoiLCAiMSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uQnV0dG9uKCJwbG90QnV0dG9uIiwgIkdlbmVyYXRlIEdyYXBoIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5QYW5lbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RPdXRwdXQoImRlbnNpdHkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RPdXRwdXQoImRpc3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlBhbmVsKCJUYWIgMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJQYW5lbCgiVGFiIDMiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgKSksCgpzZXJ2ZXIgPC0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgewogIAogIG9ic2VydmVFdmVudChpbnB1dCRwbG90QnV0dG9uLCB7CiAgICBtZWFuX2luIDwtIGlucHV0JG1lYW4KICAgIHNkX2luIDwtIGlucHV0JHNkCiAgICB4X2luIDwtIGlucHV0JHgKICAgIAogICAgIyBGdW5jacOzbiB5IEdyw6FmaWNvIGRlIGRlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCBub3JtYWwKICAgIHhfcmFuZ2UgPC0gc2VxKG1lYW5faW4tMypzZF9pbixtZWFuX2luKzMqc2RfaW4sbGVuZ3RoPTEwMDApCiAgICB5X2RlbnNpdHkgPC0gZG5vcm0oeF9yYW5nZSwgbWVhbiA9IG1lYW5faW4sIHNkID0gc2RfaW4pCiAgICB4X2RlbnNpdHkgPC0gZGF0YS5mcmFtZSh4ID0geF9yYW5nZSwgZGVuc2l0eSA9IHlfZGVuc2l0eSkKICAgIAogICAgcGxvdERlbnNpdHkgPC0gZ2dwbG90KHhfZGVuc2l0eSwgYWVzKHgsIGRlbnNpdHkpKSArCiAgICAgIGdlb21fbGluZSgpICsKICAgICAgZ2d0aXRsZSgiRGVuc2lkYWQgZGUgUHJvYmFiaWxpZGFkIChOb3JtYWwpIikgKwogICAgICB4bGFiKCJ4IikgKyB5bGFiKCJEZW5zaWRhZCIpCiAgICAKICAgICMgQ8OhbGN1bG8geSBHcsOhZmljbyBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZCBub3JtYWwKICAgIHlfZGlzdCA8LSBwbm9ybSh4X3JhbmdlLCBtZWFuID0gbWVhbl9pbiwgc2QgPSBzZF9pbikKICAgIHhfZGlzdCA8LSBkYXRhLmZyYW1lKHggPSB4X3JhbmdlLCBkaXN0cmlidXRpb24gPSB5X2Rpc3QpCiAgICAKCiAgICBwbG90RGlzdHJpYnV0aW9uIDwtIGdncGxvdCh4X2Rpc3QsIGFlcyh4LCBkaXN0cmlidXRpb24pKSArCiAgICAgIGdlb21fbGluZSgpICsKICAgICAgZ2d0aXRsZSgiRGlzdHJpYnVjacOzbiBkZSBQcm9iYWJpbGlkYWQgKE5vcm1hbCkiKSArCiAgICAgIHhsYWIoIngiKSArIHlsYWIoIlByb2JhYmlsaWRhZCIpCiAgICAKICAgIG91dHB1dCRkZW5zaXR5IDwtIHJlbmRlclBsb3QoewogICAgICBwbG90RGVuc2l0eQogICAgfSkKICAgIAogICAgb3V0cHV0JGRpc3QgPC0gcmVuZGVyUGxvdCh7CiAgICAgIHBsb3REaXN0cmlidXRpb24KICAgIH0pCiAgfSkKfQoKKQoKYGBgCgojIyBFamVyY2ljaW8gNQoKVW4gbnVldm8gcHJvY2VzbyBwYXJhIHByb2R1Y2lyIGRpYW1hbnRlcyBzaW50w6l0aWNvcyBlcyByZW50YWJsZSBzw7NsbyBkaSBlbCBwZXNvIGRlIMOpc3RvcyBlcyBtYXlvciBhIDAuNSBxdWlsYXRlcy4gUGFyYSBldmFsdWFybG8gc2UgZ2VuZXJhcm9uIDYgZGlhbWFudGVzIGNvbiBsb3Mgc2lndWllbnRlcyBwZXNvczogPGJyPgoKUGVzb3M6IDAuNDYsIDAuNjEsIDAuNTIsIDAuNDgsIDAuNTcsIDAuNTQgPGJyPgoKKirCv0VsIHByb2Nlc28gZXMgcmVudGFibGU/KiogPGJyPgoKKlNvbHVjacOzbjoqIDxicj4KCjEuIEhvOiDOvCDiiaQgMC41IDxicj4KICAgSGE6IM68ID4gMC41IDxicj4KCjIuIM6xID0gMC4wNSA8YnI+CgozLiBHcmFmaWNhIGRlIHpvbmFzIGRlIGFjZXB0YWNpw7NuL3JlY2hhem8gPGJyPgoKIVtdKC9Vc2Vycy9lc3RlZmFueXZpbGxhbG9ib3MvRGVza3RvcC9TY3JlZW4gU2hvdCAyMDIzLTA4LTMxIGF0IDE1LjMzLjA0LnBuZykKKlZhbG9yIGNyw610aWNvKiA9IDIuMDE1IDxicj4KKkdyYWRvcyBkZSBsaWJlcnRhZCogPSA1IDxicj4KCjQuIEZvcm11bGEgIDxicj4KJCRcZGlzcGxheXN0eWxlIHQgPSBcZnJhY3tcYmFye3h9IC0gXG11fXtcZnJhY3tzfXtcc3FydHtufX19ICQkCgo1LiBQcm9jZWRpbWllbnRvICA8YnI+CmBgYHtyfQojSW5zZXJ0YXIgZm9ybXVsYQoKcGVzb19kaWFtYW50ZSA8LSBjKDAuNDYsIDAuNjEsIDAuNTIsIDAuNDgsIDAuNTcsIDAuNTQpCnByb21lZGlvIDwtIG1lYW4ocGVzb19kaWFtYW50ZSkKcHJvbWVkaW8KCnNkX211ZXN0cmFsIDwtIHNxcnQodmFyKHBlc29fZGlhbWFudGUpKQpzZF9tdWVzdHJhbAoKbiA8LSA2Cm1pdV9vIDwtIDAuNQoKdCA8LSAocHJvbWVkaW8tbWl1X28pLyhzZF9tdWVzdHJhbC9zcXJ0KG4pKQp0CgpgYGAKCjYuICpSZXNwdWVzdGE6KiBObyBzZSByZWNoYXphIEhvLCBsb3MgZGF0b3Mgbm8gcHJlc2VudGFuIHN1ZmljaWVudGUgZXZpZGVuY2lhIHBhcmEgaW5kaWNhciBxdWUgZWwgcGVzbyBtZWRpbyBkZSBsb3MgZGlhbWFudGVzIGV4Y2VkYSBsb3MgMC41IHF1aWxhdGVzLiA8YnI+CgoqKkZ1bmNpw7NuIGRlIERlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCAodCBkZSBTdHVkZW50KSoqIDxicj4KYGBge3J9Cgp4X2RlbiA8LSBzZXEoLTQsNCxsZW5ndGg9MTAwMCkKeV9kZW4gPC0gZHQoeF9kZW4sIGRmPTUpCnBsb3QoeF9kZW4seV9kZW4sdHlwZT0ibCIsbHR5PTEseGxhYj0idCIseWxhYj0iZih0KSIsIG1haW49IkZ1bmNpw7NuIGRlIERlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCAodCBkZSBTdHVkZW50KSIpCnBsb3QKCmBgYAoKKipGdW5jacOzbiBkZSBEaXN0cmlidWNpw7NuIGRlIFByb2JhYmlsaWRhZCAodCBkZSBTdHVkZW50KSoqIDxicj4KYGBge3J9Cgp4X2RlbiA8LSBzZXEoLTQsNCxsZW5ndGg9MTAwMCkKeV9kZW4gPC0gcHQoeF9kZW4sIGRmPTUpCnBsb3QoeF9kZW4seV9kZW4sdHlwZT0ibCIsbHR5PTEseGxhYj0idCIseWxhYj0iZih0KSIsIG1haW49IkZ1bmNpw7NuIGRlIERpc3RyaWJ1Y2nDs24gZGUgUHJvYmFiaWxpZGFkICh0IGRlIFN0dWRlbnQpIikKcGxvdAoKYGBgCgojIyBFamVyY2ljaW8gNiAKCioqQ29udGVuaWRvIGRlIE8yIGRpc3VlbHRvKiogPGJyPgoKTG9zIGRlc2VjaG9zIGluZHVzdHJpYWxlcyB5IHJlc2lkdWFsZXMgZGVzY2FyZ2Fkb3MgZW4gbnVlc3Ryb3MgcsOtb3MgeSBhcnJveW9zIGFic29yYmVuIG94w61nZW5vIHksIHBvciB0YW50bywgcmVkdWNlbiBsYSBjYW50aWRhZCBkZSBveMOtZ2VubyBkaXN1ZWx0byBkaXNwb25pYmxlIHBhcmEgcGVjZXMgeSBvdHJhcyBmb3JtYXMgZGUgZmF1bmEgYWN1w6F0aWNhLiBVbmEgYWdlbmNpYSBlc3RhdGFsIHJlcXVpZXJlIHVuIG3DrW5pbW8gZGUgNSBwYXJ0ZXMgcG9yIG1pbGzDs24gKHBwbSkgZGUgb3jDrWdlbm8gZGlzdWVsdG8gcGFyYSBxdWUgZWwgY29udGVuaWRvIGRlIG94w61nZW5vIHNlYSBzdWZpY2llbnRlIHBhcmEgc29zdGVuZXIgdmlkYSBhY3XDoXRpY2EuIFNlaXMgZXNwZWPDrW1lbmVzIGRlIGFndWEgdG9tYWRvcyBkZSB1biByw61vIGVuIHVuIGx1Z2FyIGVzcGVjw61maWNvIGR1cmFudGUgbGEgZXN0YWNpw7NuIGRlIGFndWFzIGJhamFzIChqdWxpbykgZGlvIGxlY3R1cmFzIGRlIDQuOSwgNS4xLCA0LjksIDUuMCwgNS4wIHkgNC43IGRlIG94w61nZW5vIGRpc3VlbHRvLiA8YnI+CgoqKsK/TG9zIGRhdG9zIGRhbiBzdWZpY2llbnRlIGV2aWRlbmNpYSBwYXJhIGluZGljYXIgcXVlIGVsIGNvbnRlbmlkbyBkZSBveMOtZ2VubyBkaXN1ZWx0byBlcyBtZW5vciBhIDUgcHBtPyoqIFBydWViZSB1c2FuZG8gzrEgPSAwLjA1IDxicj4KCjEuIEhvOiDOvCDiiaQgMC41IDxicj4KICAgSGE6IM68IDwgMC41IDxicj4KCjIuIM6xID0gMC4wNSA8YnI+CgozLiBHcmFmaWNhIGRlIHpvbmFzIGRlIGFjZXB0YWNpw7NuL3JlY2hhem8gPGJyPgohW10oL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1NjcmVlbiBTaG90IDIwMjMtMDgtMzEgYXQgMTUuMzIuNTMucG5nKQoqVmFsb3IgY3LDrXRpY28qID0gLTIuMDE1ICA8YnI+CipHcmFkb3MgZGUgbGliZXJ0YWQqID0gNSAgPGJyPgoKNC4gRm9ybXVsYSAgPGJyPgokJFxkaXNwbGF5c3R5bGUgdCA9IFxmcmFje1xiYXJ7eH0gLSBcbXV9e1xmcmFje3N9e1xzcXJ0e259fX0gJCQKCjUuIFByb2NlZGltaWVudG8gPGJyPgpgYGB7cn0KCnBwbSA8LSBjKDQuOSwgNS4xLCA0LjksIDUuMCwgNS4wLCA0LjcpCnByb21lZGlvIDwtIG1lYW4ocHBtKQpwcm9tZWRpbwoKc2RfbXVlc3RyYSA8LSBzcXJ0KHZhcihwcG0pKQpzZF9tdWVzdHJhCgpuIDwtIDYKbWl1X28gPC0gNQoKdCA8LSAocHJvbWVkaW8tbWl1X28pLyhzZF9tdWVzdHJhL3NxcnQobikpCnQKCmBgYAoKNi4gKlJlc3B1ZXN0YToqIE5vIHNlIHJlY2hhemEgSG8uIDxicj4KCiMgV2luc29yaXppbmcgdnMgVHJpbW1pbmcKCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygiRGVzY1Rvb2xzIikKbGlicmFyeShEZXNjVG9vbHMpCgpwZXNvX2RpYW1hbnRlX2Vycm9yIDwtIGMoMC40NiwgMC42MSwgMC41MiwgMC40OCwgMC41NywgNTQpCmJveHBsb3QocGVzb19kaWFtYW50ZV9lcnJvcixob3Jpem9udGFsPVRSVUUpCgojV2luc29yaXppbmcKcGVzb19kaWFtYW50ZV93aW5zb3JpemFkbyA8LSBXaW5zb3JpemUocGVzb19kaWFtYW50ZV9lcnJvciwwLjEwKSAjZWwgc2VndW5kbyBhcmd1bWVudG8gZXMgZWwgcG9yY2VudGFqZSBhIHF1aXRhcgpwZXNvX2RpYW1hbnRlX3dpbnNvcml6YWRvCgojVHJpbW1pbmcKcGVzb19kaWFtYW50ZV9yZWNvcnRhZG8gPC0gVHJpbShwZXNvX2RpYW1hbnRlX2Vycm9yLDEpCnBlc29fZGlhbWFudGVfcmVjb3J0YWRvCgpgYGAKCg==