Ejercicio en R: De la paquetería insuranceData, obtenga los datos de la base AutoClaims, la cual contiene 6,773 observaciones, cada una con cinco variables. La base trata acerca de la ’experiencia en reclamaciones de una aseguradora de propiedad y accidentes del medio oeste (EE. UU.) para pasajeros privados de seguro de automóvil.

ESTADO (STATE): Se utilizan códigos numéricos del 01 al 17. A cada uno se le ha asignado aleatoriamente un estado individual real, mediante un factor con niveles ESTADO 01, ESTADO 02, ESTADO 03, ESTADO 04, ESTADO 05, ESTADO 06, ESTADO 07, ESTADO 08, ESTADO 09, ESTADO 10, ESTADO 11, ESTADO 12, ESTADO s13, ESTADO 14, ESTADO 15, ESTADO 16, ESTADO 17.

CLASE (CLASS): Clasificación clase de operador, basada en edad, sexo, estado civil, uso del vehículo, unfactor con niveles C1, C11, C1A, C1B, C1C, C2, C6, C7, C71, C72, C7A, C7B, C7C, F1, F11, F6, F7, F71.

GÉNERO (GENDER): un factor con niveles F, M.

EDAD (AGE): Edad del operador, un vector numérico.

PAGADO (PAID): Monto pagado para liquidar y cerrar una reclamación, un vector numérico. Las primeras 4 variables son variables independientes (Xi ) y la última de pago es la variable dependiente (Yi ).

llamamos a la base de datos

library(insuranceData) 
data(AutoClaims)

Resumen Datos

str(AutoClaims)
'data.frame':   6773 obs. of  5 variables:
 $ STATE : Factor w/ 13 levels "STATE 01","STATE 02",..: 11 12 12 12 12 12 12 7 11 3 ...
 $ CLASS : Factor w/ 18 levels "C1 ","C11","C1A",..: 7 7 2 16 16 16 2 7 2 2 ...
 $ GENDER: Factor w/ 2 levels "F","M": 2 2 2 1 2 2 2 2 2 2 ...
 $ AGE   : int  97 96 95 95 95 95 94 94 93 93 ...
 $ PAID  : num  1134 3761 7842 2385 650 ...

Todos los incisos e realizan a la variable Yi PAID

PAID=AutoClaims$PAID

I Análisis estadístico descriptivo

Medidas de tendencia centrales

median(PAID) 
[1] 1001.7
summary(PAID)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    9.5   523.7  1001.7  1853.0  2137.4 60000.0 

Inicios de asimetria

Medidas de dispersión

var(PAID)
[1] 7006129
sd(PAID)
[1] 2646.909
range(PAID)
[1]     9.5 60000.0
IQR(PAID)
[1] 1613.67
range(PAID)
[1]     9.5 60000.0
diff(range(PAID))
[1] 59990.5

Medidas de formas

Usamos libreria moments

library(moments)
sesgo=skewness(PAID)
sesgo
[1] 6.235669

sesgo > 0: La curva es asimétricamente positiva por lo que los valores se tienden a reunir más en la parte izquierda que en la derecha de la media.

kurtosis_1=kurtosis(PAID)
kurtosis_1
[1] 87.27753

kurtosis_1 > 3 la distribución es Leptocúrtica principios de asimetria datos sesgados a la derecha

II BLOXPLOT

Realiza un boxplot de la variable de Pago. Adicionalmente, genera tablas de agregación por cada variable explicativa (Xi )

STATE

ggplot(AutoClaims, aes(x=as.factor(STATE), y=PAID, fill=STATE)) +
  geom_boxplot() +
  labs(title="'PAGO ~ ESTADO'.",
       subtitle = "Boxplot",
       x="STATE",
       y="PAID") +
  theme_bw() +
  theme(legend.position="none")

CLASS

ggplot(AutoClaims, aes(x=as.factor(CLASS), y=PAID, fill=CLASS)) +
  geom_boxplot() +
  labs(title="'PAGO ~ CLASE'.",
       subtitle = "Boxplot",
       x="CLASS",
       y="PAID") +
  theme_bw() +
  theme(legend.position="none")

GENDER

ggplot(AutoClaims, aes(x=as.factor(GENDER), y=PAID, fill=GENDER)) +
  geom_boxplot() +
  labs(title="'PAGO ~ GENERO'.",
       subtitle = "Boxplot",
       x="GENDER",
       y="PAID") +
  theme_bw() +
  theme(legend.position="none")

AGE

ggplot(AutoClaims, aes(x=as.factor(AGE), y=PAID, fill=AGE)) +
  geom_boxplot() +
  labs(title="'PAGO ~ EDAD'.",
       subtitle = "Boxplot",
       x="AGE",
       y="PAID") +
  theme_bw() +
  theme(legend.position="none")

III Densidad Empírica Yi PAID

Realiza un gráfico de la densidad empírica de los datos de la variable dependiente (Yi) PAID ¿Tiene forma de alguna distribución teórica conocida? ¿Con qué parámetro(s)? Densidad empirica Limitamos el rango de 0 a 20,000 para apreciar mejor las graficas Parece una variable aleatoria de perdida de cola pesada Gamma, Lognormal, Weibull, pareto

library(actuar)
hist(AutoClaims$PAID,freq=F,breaks = 200,col="yellow",main="Histograma de Pagos",col.main="BLUE",xlim = c(0,20000))
d<-density(PAID)
lines(d,col="black",lwd=1.5)
curve(dgamma(x,0.5,0),0,20000,add=T,col="darkorange",lwd=1.5)
curve(dlnorm(x,7,1),0,20000,add=T,col="deeppink",lwd=1.5)
curve(dweibull(x,1,180),0,20000,add=T,col="blue",lwd=1.5)
curve(dpareto1(x,5,682),0,20000,add=T,col="purple",lwd=1.5)
legend("topright",c("densidad","gamma(1,1)","lognormal(7,1)","weibull(1,180)","pareto(5,682)"),
       col=c("black","darkorange","deeppink","blue","purple"),
       lwd=c(1.5,1.5,1.5,1.5,1.5,1.5))

Carga la paquetería fitdistrplus (la estarás utilizando en varios incisos posteriores).

library(fitdistrplus)
library(MASS)
library(survival)

IV Diagrama de Cullen and Frey

IV Investiga acerca del diagrama de Cullen and Frey y su aplicación dentro del ajuste de distribuciones.

Utilizando la función descdist, genera un diagrama de este tipo con los datos de la variable de pago y da suinterpretación.

Para determinar el modelo de distribución que puede seguir este conjunto de datos se creo el grafico de Cullen and Frey que muestra a qué tipo de distribución los datos se asemejan más. Por lo que se genero 800 valores de arranque para determinar la ubicación de las observaciones (punto azul) y su aproximacion a la distribucion mas cercana

Grafica el sesgo vs curtosis

descdist(PAID,boot = 800)
summary statistics
------
min:  9.5   max:  60000 
median:  1001.7 
mean:  1853.035 
estimated sd:  2646.909 
estimated skewness:  6.23705 
estimated kurtosis:  87.34067 

El gráfico señala que la distribución de los datos experimentales siguen la distribución gamma, una weibull, lognormal puesto que el conjunto de datos se encuentran cerca a las formas que indican dichas distribuciones.

V Ajuste de datos

V Utiliza ahora un ajuste considerando la(s) distribución(es) obtenida(s) en el inciso anterior con respecto ala función fitdist (individualmente por distribución) de la paquetería ya cargada y guardar cada ajuste en una variable diferente (en caso de ser más de un ajuste).

LOGNORMAL

Segun el qqplot tendriamos un buen ajuste

f1<-fitdist(PAID,"lnorm")
$start.arg
$start.arg$meanlog
[1] 6.955611

$start.arg$sdlog
[1] 1.070953


$fix.arg
NULL
plot(f1)

f1
Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters:

Segun el qqplot tendriamos seria un buen ajuste

GAMMA

f2 = fitdist(PAID,"gamma",method="mme")
$start.arg
$start.arg$shape
[1] 0.4901772

$start.arg$rate
[1] 0.0002645267


$fix.arg
NULL
plot(f2)

f2
Fitting of the distribution ' gamma ' by matching moments 
Parameters:

Segun el qqplot tendriamos no seria un buen ajuste

WEIBULL

f3<-fitdist(PAID,"weibull")
$start.arg
$start.arg$shape
[1] 1.120414

$start.arg$scale
[1] 1747.84


$fix.arg
NULL
plot(f3)

f3
Fitting of the distribution ' weibull ' by maximum likelihood 
Parameters:

Segun el qqplot tendriamos no seria un buen ajuste

VI Criterio de Akaike (AIC) y Criterio Bayesiano (BIC)

Investiga acerca del ‘Criterio de Akaike (AIC) y Criterio Bayesiano (BIC)’ y posteriormente genera una tabla de comparación con los AIC o BIC (como tú prefieras) obtenidos para los ajustes. Con base en la tabla anterior determina cuál es la distribución con mejor ajuste ¿Es la misma distribución que tú propusisteen en incisos anteriores? En caso ser diferente a la propuesta, ¿por qué crees que fue así? (simplemente queremos tu opinión).

tabla_AIC_BIC = data.frame(c(f1$aic,f1$bic),c(f2$aic,f2$bic),c(f3$aic,f3$bic))
rownames(tabla_AIC_BIC) = c("AIC","BIC")
colnames(tabla_AIC_BIC) = c("LOGNORMAL","GAMMA","WEIBULL")
#imprimir resultado
tabla_AIC_BIC

El AIC mide el desajuste entre una distribución hipotética y una distribución teórica

Elegir como función depérdida (o criterio de especificación) el mínimo del criterio de información AIC

Tomamos aquella con el AIC y BIC mas pequeño, para tener el menor desajuste

En este caso seria l modeo f1, una lognoormal (6.95,1.07)

No es la misma distribucion, los parametros son distintos

VII Comparacion entre densidad empirica y densidad ajustada

VII Con la distribución ajustada, danos los parámetros del modelo y además genera una gráfica en donde tengas tu densidad empírica y la función de distribución acumulada empalmadas, y por último comparalas y justifica.

log normal parametros Mean=6.955611, Sd=1.070953 lo recortamos hasta 20000 para tener una mejor aprecviacion de las grafgicas

hist(AutoClaims$PAID,freq=F,breaks = 200,col="yellow",main="Comparacion entre densidad empirica y densidad ajustada",col.main="BLUE",xlim = c(0,20000))
# densidad empirica
densidad_empirica=density(PAID)
lines(densidad_empirica,col="red",lwd=2)
# log normal parametros Mean=6.955611, Sd=1.070953 
curve(dlnorm(x,f1$estimate[1],f1$estimate[2]),0,20000,add=TRUE,col="blue",lwd=2)
legend("topright",c("densidad empirica","lognormal(6.9561,1.0709)"),
       col=c("red","blue"),
       lwd=c(2,2))

Aparentemente es un buen ajuste de no ser por los datos apiticos del 1000 a 2000 Al trabajar con datos reales pasa esto

LS0tDQp0aXRsZTogIlRlb3JpYSBkZWwgUmllc2dvIFRhcmVhIDEgRWplcmNpY2lvIDEzIg0KYXV0aG9yOiAiRXF1aXBvIDIgQ2FzdHJlasOzbiBSYW3DrXJleiBMYXVyYSBQYXRyaWNpYV9fQ3J1eiBNYXRlbyBEYXZpZF9fTWVuZG96YSBWZW5jZXMgVmljdG9yIEh1Z28gX19Sb21lcm8gU2FuZG92YWwgVmFsZXJpYSBFbGl6YWJldGhfX1NhbGFzIENhbXBvcyBBbGV4aXMgRmVybmFuZG8iDQpkYXRlOiAiIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb29vdGhfc2Nyb2xsOiB0cnVlDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCmxhbmc6IGVzLUVTDQotLS0NCkVqZXJjaWNpbyBlbiBSOiBEZSBsYSBwYXF1ZXRlcsOtYSBpbnN1cmFuY2VEYXRhLCBvYnRlbmdhIGxvcyBkYXRvcyBkZSBsYSBiYXNlIEF1dG9DbGFpbXMsIGxhIGN1YWwgY29udGllbmUgNiw3NzMgb2JzZXJ2YWNpb25lcywgY2FkYSB1bmEgY29uIGNpbmNvIHZhcmlhYmxlcy4gTGEgYmFzZSB0cmF0YSBhY2VyY2EgZGUgbGEgJ2V4cGVyaWVuY2lhIGVuIHJlY2xhbWFjaW9uZXMgZGUgdW5hIGFzZWd1cmFkb3JhIGRlIHByb3BpZWRhZCB5IGFjY2lkZW50ZXMgZGVsIG1lZGlvIG9lc3RlIChFRS4gVVUuKSBwYXJhIHBhc2FqZXJvcyBwcml2YWRvcyBkZSBzZWd1cm8gZGUgYXV0b23Ds3ZpbC4NCg0KRVNUQURPIChTVEFURSk6IFNlIHV0aWxpemFuIGPDs2RpZ29zIG51bcOpcmljb3MgZGVsIDAxIGFsIDE3LiBBIGNhZGEgdW5vIHNlIGxlIGhhIGFzaWduYWRvIGFsZWF0b3JpYW1lbnRlIHVuIGVzdGFkbyBpbmRpdmlkdWFsIHJlYWwsIG1lZGlhbnRlIHVuIGZhY3RvciBjb24gbml2ZWxlcyBFU1RBRE8gMDEsIEVTVEFETyAwMiwgRVNUQURPIDAzLCBFU1RBRE8gMDQsIEVTVEFETyAwNSwgRVNUQURPIDA2LCBFU1RBRE8gMDcsIEVTVEFETyAwOCwgRVNUQURPIDA5LCBFU1RBRE8gMTAsIEVTVEFETyAxMSwgRVNUQURPIDEyLCBFU1RBRE8gczEzLCBFU1RBRE8gMTQsIEVTVEFETyAxNSwgRVNUQURPIDE2LCBFU1RBRE8gMTcuDQoNCkNMQVNFIChDTEFTUyk6IENsYXNpZmljYWNpw7NuIGNsYXNlIGRlIG9wZXJhZG9yLCBiYXNhZGEgZW4gZWRhZCwgc2V4bywgZXN0YWRvIGNpdmlsLCB1c28gZGVsIHZlaMOtY3VsbywgdW5mYWN0b3IgY29uIG5pdmVsZXMgQzEsIEMxMSwgQzFBLCBDMUIsIEMxQywgQzIsIEM2LCBDNywgQzcxLCBDNzIsIEM3QSwgQzdCLCBDN0MsIEYxLCBGMTEsIEY2LCBGNywgRjcxLg0KDQpHw4lORVJPIChHRU5ERVIpOiB1biBmYWN0b3IgY29uIG5pdmVsZXMgRiwgTS4NCg0KRURBRCAoQUdFKTogRWRhZCBkZWwgb3BlcmFkb3IsIHVuIHZlY3RvciBudW3DqXJpY28uDQoNClBBR0FETyAoUEFJRCk6IE1vbnRvIHBhZ2FkbyBwYXJhIGxpcXVpZGFyIHkgY2VycmFyIHVuYSByZWNsYW1hY2nDs24sIHVuIHZlY3RvciBudW3DqXJpY28uDQpMYXMgcHJpbWVyYXMgNCB2YXJpYWJsZXMgc29uIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyAoWGkgKSB5IGxhIMO6bHRpbWEgZGUgcGFnbyBlcyBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAoWWkgKS4NCg0KbGxhbWFtb3MgYSBsYSBiYXNlIGRlIGRhdG9zDQpgYGB7cn0NCmxpYnJhcnkoaW5zdXJhbmNlRGF0YSkgDQpkYXRhKEF1dG9DbGFpbXMpDQpgYGANClJlc3VtZW4gRGF0b3MNCmBgYHtyfQ0Kc3RyKEF1dG9DbGFpbXMpDQoNCmBgYA0KVG9kb3MgbG9zIGluY2lzb3MgZSByZWFsaXphbiBhIGxhIHZhcmlhYmxlIFlpIFBBSUQNCmBgYHtyfQ0KUEFJRD1BdXRvQ2xhaW1zJFBBSUQNCmBgYA0KIyBJIEFuw6FsaXNpcyBlc3RhZMOtc3RpY28gZGVzY3JpcHRpdm8NCg0KIyMgTWVkaWRhcyBkZSB0ZW5kZW5jaWEgY2VudHJhbGVzDQpgYGB7cn0NCm1lZGlhbihQQUlEKSANCnN1bW1hcnkoUEFJRCkNCmBgYA0KSW5pY2lvcyBkZSBhc2ltZXRyaWENCg0KIyMgTWVkaWRhcyBkZSBkaXNwZXJzacOzbg0KYGBge3J9DQp2YXIoUEFJRCkNCnNkKFBBSUQpDQpyYW5nZShQQUlEKQ0KSVFSKFBBSUQpDQpyYW5nZShQQUlEKQ0KZGlmZihyYW5nZShQQUlEKSkNCmBgYA0KIyMgTWVkaWRhcyBkZSBmb3JtYXMNClVzYW1vcyBsaWJyZXJpYSBtb21lbnRzDQpgYGB7cn0NCmxpYnJhcnkobW9tZW50cykNCnNlc2dvPXNrZXduZXNzKFBBSUQpDQpzZXNnbw0KYGBgDQpzZXNnbyA+IDA6IExhIGN1cnZhIGVzIGFzaW3DqXRyaWNhbWVudGUgcG9zaXRpdmEgcG9yIGxvIHF1ZSBsb3MgdmFsb3JlcyBzZSB0aWVuZGVuIGEgcmV1bmlyIG3DoXMgZW4gbGEgcGFydGUgaXpxdWllcmRhIHF1ZSBlbiBsYSBkZXJlY2hhIGRlIGxhIG1lZGlhLg0KYGBge3J9DQprdXJ0b3Npc18xPWt1cnRvc2lzKFBBSUQpDQprdXJ0b3Npc18xDQpgYGANCmt1cnRvc2lzXzEgPiAzIGxhIGRpc3RyaWJ1Y2nDs24gZXMgTGVwdG9jw7pydGljYQ0KcHJpbmNpcGlvcyBkZSBhc2ltZXRyaWENCmRhdG9zIHNlc2dhZG9zIGEgbGEgZGVyZWNoYQ0KDQojIElJIEJMT1hQTE9UDQpSZWFsaXphIHVuIGJveHBsb3QgZGUgbGEgdmFyaWFibGUgZGUgUGFnby4gQWRpY2lvbmFsbWVudGUsIGdlbmVyYSB0YWJsYXMgZGUgYWdyZWdhY2nDs24gcG9yIGNhZGEgdmFyaWFibGUgZXhwbGljYXRpdmEgKFhpICkNCg0KIyMgUEFJRA0KYGBge3J9DQphID0gYm94cGxvdChQQUlELGNvbD0iZGFya2JsdWUiLG1haW49IlBBR08iLGNvbC5tYWluPSJCTFVFIixsd2Q9MikNCmBgYA0KRGF0b3Mgc2VzZ2Fkb3MgYSBsYSBkZXJlY2hhDQpEYXRvcyBhdGlwaWNvcyBhIGxhIGRlcmVjaGENCg0KVGFibGFzIGRlIGFncmVnYWNpw7NuIHBvciBjYWRhIHZhcmlhYmxlIGV4cGxpY2F0aXZhIFhpDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KIyMgU1RBVEUNCmBgYHtyfQ0KZ2dwbG90KEF1dG9DbGFpbXMsIGFlcyh4PWFzLmZhY3RvcihTVEFURSksIHk9UEFJRCwgZmlsbD1TVEFURSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlPSInUEFHTyB+IEVTVEFETycuIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJCb3hwbG90IiwNCiAgICAgICB4PSJTVEFURSIsDQogICAgICAgeT0iUEFJRCIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpDQpgYGANCg0KIyMgQ0xBU1MNCmBgYHtyfQ0KZ2dwbG90KEF1dG9DbGFpbXMsIGFlcyh4PWFzLmZhY3RvcihDTEFTUyksIHk9UEFJRCwgZmlsbD1DTEFTUykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlPSInUEFHTyB+IENMQVNFJy4iLA0KICAgICAgIHN1YnRpdGxlID0gIkJveHBsb3QiLA0KICAgICAgIHg9IkNMQVNTIiwNCiAgICAgICB5PSJQQUlEIikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikNCmBgYA0KDQojIyBHRU5ERVINCmBgYHtyfQ0KZ2dwbG90KEF1dG9DbGFpbXMsIGFlcyh4PWFzLmZhY3RvcihHRU5ERVIpLCB5PVBBSUQsIGZpbGw9R0VOREVSKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGU9IidQQUdPIH4gR0VORVJPJy4iLA0KICAgICAgIHN1YnRpdGxlID0gIkJveHBsb3QiLA0KICAgICAgIHg9IkdFTkRFUiIsDQogICAgICAgeT0iUEFJRCIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpDQoNCmBgYA0KDQojIyBBR0UNCmBgYHtyfQ0KZ2dwbG90KEF1dG9DbGFpbXMsIGFlcyh4PWFzLmZhY3RvcihBR0UpLCB5PVBBSUQsIGZpbGw9QUdFKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGU9IidQQUdPIH4gRURBRCcuIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJCb3hwbG90IiwNCiAgICAgICB4PSJBR0UiLA0KICAgICAgIHk9IlBBSUQiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQ0KYGBgDQoNCiMgSUlJIERlbnNpZGFkIEVtcMOtcmljYSBZaSBQQUlEDQoNClJlYWxpemEgdW4gZ3LDoWZpY28gZGUgbGEgZGVuc2lkYWQgZW1ww61yaWNhIGRlIGxvcyBkYXRvcyBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAoWWkpIFBBSUQgwr9UaWVuZSBmb3JtYSBkZSBhbGd1bmEgZGlzdHJpYnVjacOzbiB0ZcOzcmljYSBjb25vY2lkYT8gwr9Db24gcXXDqSBwYXLDoW1ldHJvKHMpPw0KRGVuc2lkYWQgZW1waXJpY2ENCkxpbWl0YW1vcyBlbCByYW5nbyBkZSAwIGEgMjAsMDAwIHBhcmEgYXByZWNpYXIgbWVqb3IgbGFzIGdyYWZpY2FzDQpQYXJlY2UgdW5hIHZhcmlhYmxlIGFsZWF0b3JpYSBkZSBwZXJkaWRhIGRlIGNvbGEgcGVzYWRhIEdhbW1hLCBMb2dub3JtYWwsIFdlaWJ1bGwsIHBhcmV0bw0KDQpgYGB7cn0NCmxpYnJhcnkoYWN0dWFyKQ0KaGlzdChBdXRvQ2xhaW1zJFBBSUQsZnJlcT1GLGJyZWFrcyA9IDIwMCxjb2w9InllbGxvdyIsbWFpbj0iSGlzdG9ncmFtYSBkZSBQYWdvcyIsY29sLm1haW49IkJMVUUiLHhsaW0gPSBjKDAsMjAwMDApKQ0KZDwtZGVuc2l0eShQQUlEKQ0KbGluZXMoZCxjb2w9ImJsYWNrIixsd2Q9MS41KQ0KY3VydmUoZGdhbW1hKHgsMC41LDApLDAsMjAwMDAsYWRkPVQsY29sPSJkYXJrb3JhbmdlIixsd2Q9MS41KQ0KY3VydmUoZGxub3JtKHgsNywxKSwwLDIwMDAwLGFkZD1ULGNvbD0iZGVlcHBpbmsiLGx3ZD0xLjUpDQpjdXJ2ZShkd2VpYnVsbCh4LDEsMTgwKSwwLDIwMDAwLGFkZD1ULGNvbD0iYmx1ZSIsbHdkPTEuNSkNCmN1cnZlKGRwYXJldG8xKHgsNSw2ODIpLDAsMjAwMDAsYWRkPVQsY29sPSJwdXJwbGUiLGx3ZD0xLjUpDQpsZWdlbmQoInRvcHJpZ2h0IixjKCJkZW5zaWRhZCIsImdhbW1hKDEsMSkiLCJsb2dub3JtYWwoNywxKSIsIndlaWJ1bGwoMSwxODApIiwicGFyZXRvKDUsNjgyKSIpLA0KICAgICAgIGNvbD1jKCJibGFjayIsImRhcmtvcmFuZ2UiLCJkZWVwcGluayIsImJsdWUiLCJwdXJwbGUiKSwNCiAgICAgICBsd2Q9YygxLjUsMS41LDEuNSwxLjUsMS41LDEuNSkpDQpgYGANCkNhcmdhIGxhIHBhcXVldGVyw61hIGZpdGRpc3RycGx1cyAobGEgZXN0YXLDoXMgdXRpbGl6YW5kbyBlbiB2YXJpb3MgaW5jaXNvcyBwb3N0ZXJpb3JlcykuDQpgYGB7cn0NCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KbGlicmFyeShNQVNTKQ0KbGlicmFyeShzdXJ2aXZhbCkNCmBgYA0KDQojIElWIERpYWdyYW1hIGRlIEN1bGxlbiBhbmQgRnJleQ0KDQpJViBJbnZlc3RpZ2EgYWNlcmNhIGRlbCBkaWFncmFtYSBkZSBDdWxsZW4gYW5kIEZyZXkgeSBzdSBhcGxpY2FjacOzbiBkZW50cm8gZGVsIGFqdXN0ZSBkZSBkaXN0cmlidWNpb25lcy4gDQoNClV0aWxpemFuZG8gbGEgZnVuY2nDs24gZGVzY2Rpc3QsIGdlbmVyYSB1biBkaWFncmFtYSBkZSBlc3RlIHRpcG8gY29uIGxvcyBkYXRvcyBkZSBsYSB2YXJpYWJsZSBkZSBwYWdvIHkgZGEgc3VpbnRlcnByZXRhY2nDs24uDQogDQpQYXJhIGRldGVybWluYXIgZWwgbW9kZWxvIGRlIGRpc3RyaWJ1Y2nDs24gcXVlIHB1ZWRlIHNlZ3VpciBlc3RlIGNvbmp1bnRvIGRlIGRhdG9zIHNlIGNyZW8gZWwgZ3JhZmljbyBkZSBDdWxsZW4gYW5kIEZyZXkgcXVlIG11ZXN0cmEgYSBxdcOpIHRpcG8gZGUgZGlzdHJpYnVjacOzbiBsb3MgZGF0b3Mgc2UgYXNlbWVqYW4gbcOhcy4gDQpQb3IgbG8gcXVlIHNlIGdlbmVybyA4MDAgdmFsb3JlcyBkZSBhcnJhbnF1ZSBwYXJhIGRldGVybWluYXIgbGEgdWJpY2FjacOzbiBkZSBsYXMgb2JzZXJ2YWNpb25lcyAocHVudG8gYXp1bCkgeSBzdSBhcHJveGltYWNpb24gYSBsYSBkaXN0cmlidWNpb24gbWFzIGNlcmNhbmENCg0KR3JhZmljYSBlbCBzZXNnbyB2cyBjdXJ0b3Npcw0KDQpgYGB7cn0NCmRlc2NkaXN0KFBBSUQsYm9vdCA9IDgwMCkNCmBgYA0KDQpFbCBncsOhZmljbyBzZcOxYWxhIHF1ZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBkYXRvcyBleHBlcmltZW50YWxlcyBzaWd1ZW4gbGEgZGlzdHJpYnVjacOzbiBnYW1tYSwgdW5hIHdlaWJ1bGwsIGxvZ25vcm1hbCBwdWVzdG8gcXVlIGVsIGNvbmp1bnRvIGRlIGRhdG9zIHNlIGVuY3VlbnRyYW4gY2VyY2EgYSBsYXMgZm9ybWFzIHF1ZSBpbmRpY2FuIGRpY2hhcyBkaXN0cmlidWNpb25lcy4NCg0KIyBWIEFqdXN0ZSBkZSBkYXRvcw0KViBVdGlsaXphIGFob3JhIHVuIGFqdXN0ZSBjb25zaWRlcmFuZG8gbGEocykgZGlzdHJpYnVjacOzbihlcykgb2J0ZW5pZGEocykgZW4gZWwgaW5jaXNvIGFudGVyaW9yIGNvbiByZXNwZWN0byBhbGEgZnVuY2nDs24gZml0ZGlzdCAoaW5kaXZpZHVhbG1lbnRlIHBvciBkaXN0cmlidWNpw7NuKSBkZSBsYSBwYXF1ZXRlcsOtYSB5YSBjYXJnYWRhIHkgZ3VhcmRhciBjYWRhIGFqdXN0ZSBlbiB1bmEgdmFyaWFibGUgZGlmZXJlbnRlIChlbiBjYXNvIGRlIHNlciBtw6FzIGRlIHVuIGFqdXN0ZSkuDQoNCiMjIExPR05PUk1BTA0KU2VndW4gZWwgcXFwbG90IHRlbmRyaWFtb3MgdW4gYnVlbiBhanVzdGUNCmBgYHtyfQ0KZjE8LWZpdGRpc3QoUEFJRCwibG5vcm0iKQ0KcGxvdChmMSkNCmYxDQpgYGANClNlZ3VuIGVsIHFxcGxvdCB0ZW5kcmlhbW9zIHNlcmlhIHVuIGJ1ZW4gYWp1c3RlDQoNCiMjIEdBTU1BDQpgYGB7cn0NCmYyID0gZml0ZGlzdChQQUlELCJnYW1tYSIsbWV0aG9kPSJtbWUiKQ0KcGxvdChmMikNCmYyDQpgYGANClNlZ3VuIGVsIHFxcGxvdCB0ZW5kcmlhbW9zIG5vIHNlcmlhIHVuIGJ1ZW4gYWp1c3RlDQoNCiMjIFdFSUJVTEwNCmBgYHtyfQ0KZjM8LWZpdGRpc3QoUEFJRCwid2VpYnVsbCIpDQpwbG90KGYzKQ0KZjMNCmBgYA0KDQpTZWd1biBlbCBxcXBsb3QgdGVuZHJpYW1vcyBubyBzZXJpYSB1biBidWVuIGFqdXN0ZQ0KDQojIFZJIENyaXRlcmlvIGRlIEFrYWlrZSAoQUlDKSB5IENyaXRlcmlvIEJheWVzaWFubyAoQklDKQ0KDQpJbnZlc3RpZ2EgYWNlcmNhIGRlbCAnQ3JpdGVyaW8gZGUgQWthaWtlIChBSUMpIHkgQ3JpdGVyaW8gQmF5ZXNpYW5vIChCSUMpJyB5IHBvc3Rlcmlvcm1lbnRlIGdlbmVyYSB1bmEgdGFibGEgZGUgY29tcGFyYWNpw7NuIGNvbiBsb3MgQUlDIG8gQklDIChjb21vIHTDuiBwcmVmaWVyYXMpIG9idGVuaWRvcyBwYXJhIGxvcyBhanVzdGVzLiBDb24gYmFzZSBlbiBsYSB0YWJsYSBhbnRlcmlvciBkZXRlcm1pbmEgY3XDoWwgZXMgbGEgZGlzdHJpYnVjacOzbiBjb24gbWVqb3IgYWp1c3RlIMK/RXMgbGEgbWlzbWEgZGlzdHJpYnVjacOzbiBxdWUgdMO6IHByb3B1c2lzdGVlbiBlbiBpbmNpc29zIGFudGVyaW9yZXM/IEVuIGNhc28gc2VyIGRpZmVyZW50ZSBhIGxhIHByb3B1ZXN0YSwgwr9wb3IgcXXDqSBjcmVlcyBxdWUgZnVlIGFzw60/IChzaW1wbGVtZW50ZSBxdWVyZW1vcyB0dSBvcGluacOzbikuDQoNCmBgYHtyfQ0KdGFibGFfQUlDX0JJQyA9IGRhdGEuZnJhbWUoYyhmMSRhaWMsZjEkYmljKSxjKGYyJGFpYyxmMiRiaWMpLGMoZjMkYWljLGYzJGJpYykpDQpyb3duYW1lcyh0YWJsYV9BSUNfQklDKSA9IGMoIkFJQyIsIkJJQyIpDQpjb2xuYW1lcyh0YWJsYV9BSUNfQklDKSA9IGMoIkxPR05PUk1BTCIsIkdBTU1BIiwiV0VJQlVMTCIpDQojaW1wcmltaXIgcmVzdWx0YWRvDQp0YWJsYV9BSUNfQklDDQpgYGANCg0KRWwgQUlDIG1pZGUgZWwgZGVzYWp1c3RlIGVudHJlIHVuYSBkaXN0cmlidWNpw7NuIGhpcG90w6l0aWNhIHkgdW5hIGRpc3RyaWJ1Y2nDs24gdGXDs3JpY2ENCg0KRWxlZ2lyIGNvbW8gZnVuY2nDs24gZGVww6lyZGlkYSAobyBjcml0ZXJpbyBkZSBlc3BlY2lmaWNhY2nDs24pIGVsIG3DrW5pbW8gZGVsIGNyaXRlcmlvIGRlIGluZm9ybWFjacOzbiBBSUMNCg0KVG9tYW1vcyBhcXVlbGxhIGNvbiBlbCBBSUMgeSBCSUMgbWFzIHBlcXVlw7FvLCBwYXJhIHRlbmVyIGVsIG1lbm9yIGRlc2FqdXN0ZQ0KDQpFbiBlc3RlIGNhc28gc2VyaWEgbCBtb2RlbyBmMSwgdW5hIGxvZ25vb3JtYWwgKDYuOTUsMS4wNykNCg0KTm8gZXMgbGEgbWlzbWEgZGlzdHJpYnVjaW9uLCBsb3MgcGFyYW1ldHJvcyBzb24gZGlzdGludG9zDQoNCiMgVklJIENvbXBhcmFjaW9uIGVudHJlIGRlbnNpZGFkIGVtcGlyaWNhIHkgZGVuc2lkYWQgYWp1c3RhZGENClZJSSBDb24gbGEgZGlzdHJpYnVjacOzbiBhanVzdGFkYSwgZGFub3MgbG9zIHBhcsOhbWV0cm9zIGRlbCBtb2RlbG8geSBhZGVtw6FzIGdlbmVyYSB1bmEgZ3LDoWZpY2EgZW4gZG9uZGUgdGVuZ2FzIHR1IGRlbnNpZGFkIGVtcMOtcmljYSB5IGxhIGZ1bmNpw7NuIGRlIGRpc3RyaWJ1Y2nDs24gYWN1bXVsYWRhIGVtcGFsbWFkYXMsIHkgcG9yIMO6bHRpbW8gY29tcGFyYWxhcyB5IGp1c3RpZmljYS4NCg0KbG9nIG5vcm1hbCBwYXJhbWV0cm9zIE1lYW49Ni45NTU2MTEsIFNkPTEuMDcwOTUzIA0KbG8gcmVjb3J0YW1vcyBoYXN0YSAyMDAwMCBwYXJhIHRlbmVyIHVuYSBtZWpvciBhcHJlY3ZpYWNpb24gZGUgbGFzIGdyYWZnaWNhcw0KDQpgYGB7cn0NCmhpc3QoQXV0b0NsYWltcyRQQUlELGZyZXE9RixicmVha3MgPSAyMDAsY29sPSJ5ZWxsb3ciLG1haW49IkNvbXBhcmFjaW9uIGVudHJlIGRlbnNpZGFkIGVtcGlyaWNhIHkgZGVuc2lkYWQgYWp1c3RhZGEiLGNvbC5tYWluPSJCTFVFIix4bGltID0gYygwLDIwMDAwKSkNCiMgZGVuc2lkYWQgZW1waXJpY2ENCmRlbnNpZGFkX2VtcGlyaWNhPWRlbnNpdHkoUEFJRCkNCmxpbmVzKGRlbnNpZGFkX2VtcGlyaWNhLGNvbD0icmVkIixsd2Q9MikNCiMgbG9nIG5vcm1hbCBwYXJhbWV0cm9zIE1lYW49Ni45NTU2MTEsIFNkPTEuMDcwOTUzIA0KY3VydmUoZGxub3JtKHgsZjEkZXN0aW1hdGVbMV0sZjEkZXN0aW1hdGVbMl0pLDAsMjAwMDAsYWRkPVRSVUUsY29sPSJibHVlIixsd2Q9MikNCmxlZ2VuZCgidG9wcmlnaHQiLGMoImRlbnNpZGFkIGVtcGlyaWNhIiwibG9nbm9ybWFsKDYuOTU2MSwxLjA3MDkpIiksDQogICAgICAgY29sPWMoInJlZCIsImJsdWUiKSwNCiAgICAgICBsd2Q9YygyLDIpKQ0KYGBgDQpBcGFyZW50ZW1lbnRlIGVzIHVuIGJ1ZW4gYWp1c3RlIGRlIG5vIHNlciBwb3IgbG9zIGRhdG9zIGFwaXRpY29zIGRlbCAxMDAwIGEgMjAwMA0KQWwgdHJhYmFqYXIgY29uIGRhdG9zIHJlYWxlcyBwYXNhIGVzdG8NCg==