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
II BLOXPLOT
Realiza un boxplot de la variable de Pago. Adicionalmente, genera tablas de agregación por cada variable explicativa (Xi )
PAID
a = boxplot(PAID,col="darkblue",main="PAGO",col.main="BLUE",lwd=2)

Datos sesgados a la derecha Datos atipicos a la derecha
Tablas de agregación por cada variable explicativa Xi
library(ggplot2)
library(dplyr)
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==