Paso 1: Importar base de datos

#file.choose()

seguros <- read.csv("C:\\Users\\danyc\\OneDrive - Instituto Tecnologico y de Estudios Superiores de Monterrey\\Desktop\\Excel y CSV\\seguros.csv")

Paso 1.5:Entender la base de datos

resumen <- summary(seguros)
resumen 
##     ClaimID           TotalPaid       TotalReserves     TotalRecovery      
##  Min.   :  777632   Min.   :      0   Min.   :      0   Min.   :     0.00  
##  1st Qu.:  800748   1st Qu.:     83   1st Qu.:      0   1st Qu.:     0.00  
##  Median :  812128   Median :    271   Median :      0   Median :     0.00  
##  Mean   : 1864676   Mean   :  10404   Mean   :   3368   Mean   :    66.05  
##  3rd Qu.:  824726   3rd Qu.:   1122   3rd Qu.:      0   3rd Qu.:     0.00  
##  Max.   :62203364   Max.   :4527291   Max.   :1529053   Max.   :100000.00  
##                                                                            
##  IndemnityPaid      OtherPaid       TotalIncurredCost ClaimStatus       
##  Min.   :     0   Min.   :      0   Min.   : -10400   Length:31619      
##  1st Qu.:     0   1st Qu.:     80   1st Qu.:     80   Class :character  
##  Median :     0   Median :    265   Median :    266   Mode  :character  
##  Mean   :  4977   Mean   :   5427   Mean   :  13706                     
##  3rd Qu.:     0   3rd Qu.:   1023   3rd Qu.:   1098                     
##  Max.   :640732   Max.   :4129915   Max.   :4734750                     
##                                                                         
##  IncidentDate       IncidentDescription ReturnToWorkDate   ClaimantOpenedDate
##  Length:31619       Length:31619        Length:31619       Length:31619      
##  Class :character   Class :character    Class :character   Class :character  
##  Mode  :character   Mode  :character    Mode  :character   Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##  ClaimantClosedDate EmployerNotificationDate ReceivedDate      
##  Length:31619       Length:31619             Length:31619      
##  Class :character   Class :character         Class :character  
##  Mode  :character   Mode  :character         Mode  :character  
##                                                                
##                                                                
##                                                                
##                                                                
##     IsDenied       Transaction_Time Procesing_Time     ClaimantAge_at_DOI
##  Min.   :0.00000   Min.   :    0    Min.   :    0.00   Min.   :14.0      
##  1st Qu.:0.00000   1st Qu.:  211    1st Qu.:    4.00   1st Qu.:33.0      
##  Median :0.00000   Median :  780    Median :   10.00   Median :42.0      
##  Mean   :0.04463   Mean   : 1004    Mean   :   62.99   Mean   :41.6      
##  3rd Qu.:0.00000   3rd Qu.: 1440    3rd Qu.:   24.00   3rd Qu.:50.0      
##  Max.   :1.00000   Max.   :16428    Max.   :11558.00   Max.   :94.0      
##                    NA's   :614                                           
##     Gender          ClaimantType       InjuryNature       BodyPartRegion    
##  Length:31619       Length:31619       Length:31619       Length:31619      
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##    BodyPart         AverageWeeklyWage1    ClaimID1        BillReviewALE    
##  Length:31619       Min.   : 100.0     Min.   :  777632   Min.   : -448.0  
##  Class :character   1st Qu.: 492.0     1st Qu.:  800748   1st Qu.:   16.0  
##  Mode  :character   Median : 492.0     Median :  812128   Median :   24.0  
##                     Mean   : 536.5     Mean   : 1864676   Mean   :  188.7  
##                     3rd Qu.: 492.0     3rd Qu.:  824726   3rd Qu.:   64.1  
##                     Max.   :8613.5     Max.   :62203364   Max.   :46055.3  
##                                                           NA's   :14912    
##     Hospital         PhysicianOutpatient       Rx          
##  Min.   : -12570.4   Min.   :   -549.5   Min.   :  -160.7  
##  1st Qu.:    210.5   1st Qu.:    105.8   1st Qu.:    22.9  
##  Median :    613.9   Median :    218.0   Median :    61.5  
##  Mean   :   5113.2   Mean   :   1813.2   Mean   :  1695.2  
##  3rd Qu.:   2349.1   3rd Qu.:    680.6   3rd Qu.:   189.0  
##  Max.   :2759604.0   Max.   :1219766.6   Max.   :631635.5  
##  NA's   :19655       NA's   :2329        NA's   :20730

Herramienta “El Generador de Valor de Datos”

Paso 1. Definir el área del negocio que buscamos impactar o mejorar y su KPI Dentro de los seguros, se busca el eficientizar o buscar mejorar el manejo de gastos que la aseguradora incurre al subsidiar los gastos de hospitales.

Los KPI´s a impactar son:

a. Gasto promedio del cliente/paciente
b. Estadía promedio de cliente hospitalizado

Paso 2. Seleccionar plantilla(-s) para crear valor a partir de los datos de los clientes. Visión / Segmentación / Personalización / Contextualización

Paso 3. Generar ideas o conceptos específicos. Generar un modelo de negocios predictivo que defina cuanto se está gastando actualmente en que lesiones y ver como es que se puede disminuir ese costo.

Paso 4. Reunir los datos requeridos. Necesito: Tipo de lesión, genero, parte del cuerpo, hospital, entre otros.

Paso 5. Plan de ejecución. Trabajar una base de datos o un CRM donde se recopile información continuamente y se busquen nuevos proveedores de la salúd para variar los precios y que la aseguradora pueda ganar un porcentaje de lo que gasta en promedio por paciente sin dejar de dar la atención necesaria para lo cual se contrata a la hora del siniestro/accidente.

Paso 2: Limpiar la base de datos

Después de limpiar la base de datos, se vuelve a correr el resumen para ver los cambios.

#library("janitor")
#clean_names(seguros)
resumen <- summary(seguros)
resumen
##     ClaimID           TotalPaid       TotalReserves     TotalRecovery      
##  Min.   :  777632   Min.   :      0   Min.   :      0   Min.   :     0.00  
##  1st Qu.:  800748   1st Qu.:     83   1st Qu.:      0   1st Qu.:     0.00  
##  Median :  812128   Median :    271   Median :      0   Median :     0.00  
##  Mean   : 1864676   Mean   :  10404   Mean   :   3368   Mean   :    66.05  
##  3rd Qu.:  824726   3rd Qu.:   1122   3rd Qu.:      0   3rd Qu.:     0.00  
##  Max.   :62203364   Max.   :4527291   Max.   :1529053   Max.   :100000.00  
##                                                                            
##  IndemnityPaid      OtherPaid       TotalIncurredCost ClaimStatus       
##  Min.   :     0   Min.   :      0   Min.   : -10400   Length:31619      
##  1st Qu.:     0   1st Qu.:     80   1st Qu.:     80   Class :character  
##  Median :     0   Median :    265   Median :    266   Mode  :character  
##  Mean   :  4977   Mean   :   5427   Mean   :  13706                     
##  3rd Qu.:     0   3rd Qu.:   1023   3rd Qu.:   1098                     
##  Max.   :640732   Max.   :4129915   Max.   :4734750                     
##                                                                         
##  IncidentDate       IncidentDescription ReturnToWorkDate   ClaimantOpenedDate
##  Length:31619       Length:31619        Length:31619       Length:31619      
##  Class :character   Class :character    Class :character   Class :character  
##  Mode  :character   Mode  :character    Mode  :character   Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##  ClaimantClosedDate EmployerNotificationDate ReceivedDate      
##  Length:31619       Length:31619             Length:31619      
##  Class :character   Class :character         Class :character  
##  Mode  :character   Mode  :character         Mode  :character  
##                                                                
##                                                                
##                                                                
##                                                                
##     IsDenied       Transaction_Time Procesing_Time     ClaimantAge_at_DOI
##  Min.   :0.00000   Min.   :    0    Min.   :    0.00   Min.   :14.0      
##  1st Qu.:0.00000   1st Qu.:  211    1st Qu.:    4.00   1st Qu.:33.0      
##  Median :0.00000   Median :  780    Median :   10.00   Median :42.0      
##  Mean   :0.04463   Mean   : 1004    Mean   :   62.99   Mean   :41.6      
##  3rd Qu.:0.00000   3rd Qu.: 1440    3rd Qu.:   24.00   3rd Qu.:50.0      
##  Max.   :1.00000   Max.   :16428    Max.   :11558.00   Max.   :94.0      
##                    NA's   :614                                           
##     Gender          ClaimantType       InjuryNature       BodyPartRegion    
##  Length:31619       Length:31619       Length:31619       Length:31619      
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##    BodyPart         AverageWeeklyWage1    ClaimID1        BillReviewALE    
##  Length:31619       Min.   : 100.0     Min.   :  777632   Min.   : -448.0  
##  Class :character   1st Qu.: 492.0     1st Qu.:  800748   1st Qu.:   16.0  
##  Mode  :character   Median : 492.0     Median :  812128   Median :   24.0  
##                     Mean   : 536.5     Mean   : 1864676   Mean   :  188.7  
##                     3rd Qu.: 492.0     3rd Qu.:  824726   3rd Qu.:   64.1  
##                     Max.   :8613.5     Max.   :62203364   Max.   :46055.3  
##                                                           NA's   :14912    
##     Hospital         PhysicianOutpatient       Rx          
##  Min.   : -12570.4   Min.   :   -549.5   Min.   :  -160.7  
##  1st Qu.:    210.5   1st Qu.:    105.8   1st Qu.:    22.9  
##  Median :    613.9   Median :    218.0   Median :    61.5  
##  Mean   :   5113.2   Mean   :   1813.2   Mean   :  1695.2  
##  3rd Qu.:   2349.1   3rd Qu.:    680.6   3rd Qu.:   189.0  
##  Max.   :2759604.0   Max.   :1219766.6   Max.   :631635.5  
##  NA's   :19655       NA's   :2329        NA's   :20730

Notas:

Agregar columna de días de incapacidad en Excel (ReturnToWorkDate-IncidentDate).

Paso 3: Revisar las variables de carácter

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
#count(seguros, IncidentDescription, sort=TRUE)
#count(seguros, ClaimantType, sort=TRUE)
#count(seguros, InjuryNature, sort=TRUE)
#count(seguros, BodyPartRegion, sort=TRUE)
#count(seguros, AverageWeeklyWage1, sort=TRUE)

Paso 4: Crear regresión líneal

#regresion <- lm (TotalIncurredCost ~   ClaimantAge_at_DOI + Gender + ClaimantType + InjuryNature + BodyPartRegion + BodyPart + AverageWeeklyWage1 + BillReviewALE + Hospital + PhysicianOutpatient + Rx , data=seguros)

#summary (regresion) 

Paso 4.5: Modificar la regresión líneal

#regresion <- lm (TotalIncurredCost ~   ClaimantAge_at_DOI + Gender + ClaimantType + InjuryNature + BodyPartRegion + BodyPart + AverageWeeklyWage1 , data=seguros)
#summary (regresion)

Paso 5: Construir modelo predictivo

datos_nuevos <-data.frame(ClaimantAge_at_DOI = c(20,30,40,50,60,70,80,90), Gender= "Male", ClaimantType= "Medical Only", InjuryNature = "Amputation", BodyPartRegion = "Multiple Body Parts", BodyPart= "Brain", AverageWeeklyWage1=537)
predict(regresion,datos_nuevos)
## Warning in predict.lm(regresion, datos_nuevos): prediction from a rank-deficient
## fit may be misleading
##        1        2        3        4        5        6        7        8 
## 673115.3 674677.3 676239.3 677801.3 679363.3 680925.3 682487.3 684049.4

Conclusión y Aprendizaje

Según los datos recabados en la regresión líneal, se pudo ver que realmente en lo que se necesitaba poner más atención o que tenía una variable más dependiente eran las de tipos de genero, tipo de siniestro, naturaleza de lesión, región de cuerpo, parte del cuerpo y el promedio del pago semanal de la escuela junto con la edad. Esto puesto a que son las áreas en las que dependiendo de lo que sea, se gasta más y puede significar un gasto extra para la aseguradora lo cual de igual manera le podría afectar si es que no incrementa la prima que se le cobra a los asegurados cada que se accidentan dependiendo de sus comorbilidades, edad y historial vitalicio dentro de la vida del asegurado, ya que según nuestra regresión se puede ver que entre más edad, significa un mayor gasto justamente por la reduntante comorbilidad de la edad y propensión a accidentes que aquí marca una diferencia de un poco más de $10,000 dolares que se va incrementando entre el primer grupo y el último.

La regresión líneal en general, nos sirve para saber la dependencia de una variable para que afecte a otras y es bueno saber como usarlo en R, ya que se puede desarrollar de manera más gráfica si así lo quisieramos presentar al adicionar nuestro codigo con un ggplot y ver el crecimiento de los años para presentarselos a nuestro cliente.

LS0tDQp0aXRsZTogPHNwYW4gc3R5bGU9IkNvbG9yOnJlZCI+IE1vZGVsbyBQcmVkaWN0aXZvICJTZWd1cm9zIiA8L3NwYW4+DQphdXRob3I6ICJEYW5pZWxhIEPDoXJkZW5hcyBaIC8vIEEwMTcyMDUzNSINCmRhdGU6ICIyMDIyLTA5LTA4Ig0Kb3V0cHV0OiANCiAgICAgIGh0bWxfZG9jdW1lbnQ6DQogICAgICAgIHRvYzogdHJ1ZQ0KICAgICAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICAgICAgY29kZV9mb2xkaW5nOiAiaGlkZSINCiAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCioqKg0KIyA8aW1nIHNyYz0gIkM6XFxVc2Vyc1xcZGFueWNcXERvd25sb2Fkc1xcaW5zdXJhbmNlLmdpZiIgLz4gDQoNCiMgPHNwYW4gc3R5bGU9IkNvbG9yOiAjMzhiNmZmIj4gUGFzbyAxOiBJbXBvcnRhciBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KI2ZpbGUuY2hvb3NlKCkNCg0Kc2VndXJvcyA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxkYW55Y1xcT25lRHJpdmUgLSBJbnN0aXR1dG8gVGVjbm9sb2dpY28geSBkZSBFc3R1ZGlvcyBTdXBlcmlvcmVzIGRlIE1vbnRlcnJleVxcRGVza3RvcFxcRXhjZWwgeSBDU1ZcXHNlZ3Vyb3MuY3N2IikNCg0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJDb2xvcjpncmVlbiI+IFBhc28gMS41OkVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3MgPC9zcGFuPiANCmBgYHtyfQ0KcmVzdW1lbiA8LSBzdW1tYXJ5KHNlZ3Vyb3MpDQpyZXN1bWVuIA0KYGBgDQojIDxzcGFuIHN0eWxlPSJDb2xvcjojMzhiNmZmIj4gSGVycmFtaWVudGEg4oCcRWwgR2VuZXJhZG9yIGRlIFZhbG9yIGRlIERhdG9z4oCdIDwvc3Bhbj4NCjxzdHlsZT4NCmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojNTg5ODFmOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQ0KPC9zdHlsZT4NCjxkaXYgY2xhc3MgPSAiYmx1ZSI+DQoNCipQYXNvIDEuKiBEZWZpbmlyIGVsIMOhcmVhIGRlbCBuZWdvY2lvIHF1ZSBidXNjYW1vcyBpbXBhY3RhciBvIG1lam9yYXIgeSBzdSBLUEkNCkRlbnRybyBkZSBsb3Mgc2VndXJvcywgc2UgYnVzY2EgZWwgZWZpY2llbnRpemFyIG8gYnVzY2FyIG1lam9yYXIgZWwgbWFuZWpvIGRlIGdhc3RvcyBxdWUgbGEgYXNlZ3VyYWRvcmEgaW5jdXJyZSBhbCBzdWJzaWRpYXIgbG9zIGdhc3RvcyBkZSBob3NwaXRhbGVzLg0KDQpMb3MgS1BJwrRzIGEgaW1wYWN0YXIgc29uOiAgDQoNCioqYS4gR2FzdG8gcHJvbWVkaW8gZGVsIGNsaWVudGUvcGFjaWVudGUgIA0KICBiLiBFc3RhZMOtYSBwcm9tZWRpbyBkZSBjbGllbnRlIGhvc3BpdGFsaXphZG8qKg0KDQoqUGFzbyAyLiogU2VsZWNjaW9uYXIgcGxhbnRpbGxhKC1zKSBwYXJhIGNyZWFyIHZhbG9yIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBkZSBsb3MgY2xpZW50ZXMuIA0KVmlzacOzbiAvICoqU2VnbWVudGFjacOzbioqIC8gUGVyc29uYWxpemFjacOzbiAvIENvbnRleHR1YWxpemFjacOzbiANCg0KKlBhc28gMy4qIEdlbmVyYXIgaWRlYXMgbyBjb25jZXB0b3MgZXNwZWPDrWZpY29zLg0KR2VuZXJhciB1biBtb2RlbG8gZGUgbmVnb2Npb3MgcHJlZGljdGl2byBxdWUgZGVmaW5hIGN1YW50byBzZSBlc3TDoSBnYXN0YW5kbyBhY3R1YWxtZW50ZSBlbiBxdWUgbGVzaW9uZXMgeSB2ZXIgY29tbyBlcyBxdWUgc2UgcHVlZGUgZGlzbWludWlyIGVzZSBjb3N0by4NCg0KKlBhc28gNC4qIFJldW5pciBsb3MgZGF0b3MgcmVxdWVyaWRvcy4NCk5lY2VzaXRvOg0KVGlwbyBkZSBsZXNpw7NuLCBnZW5lcm8sIHBhcnRlIGRlbCBjdWVycG8sIGhvc3BpdGFsLCBlbnRyZSBvdHJvcy4NCg0KKlBhc28gNS4qIFBsYW4gZGUgZWplY3VjacOzbi4NClRyYWJhamFyIHVuYSBiYXNlIGRlIGRhdG9zIG8gdW4gQ1JNIGRvbmRlIHNlIHJlY29waWxlIGluZm9ybWFjacOzbiBjb250aW51YW1lbnRlIHkgc2UgYnVzcXVlbiBudWV2b3MgcHJvdmVlZG9yZXMgZGUgbGEgc2Fsw7pkIHBhcmEgdmFyaWFyIGxvcyBwcmVjaW9zIHkgcXVlIGxhIGFzZWd1cmFkb3JhIHB1ZWRhIGdhbmFyIHVuIHBvcmNlbnRhamUgZGUgbG8gcXVlIGdhc3RhIGVuIHByb21lZGlvIHBvciBwYWNpZW50ZSBzaW4gZGVqYXIgZGUgZGFyIGxhIGF0ZW5jacOzbiBuZWNlc2FyaWEgcGFyYSBsbyBjdWFsIHNlIGNvbnRyYXRhIGEgbGEgaG9yYSBkZWwgc2luaWVzdHJvL2FjY2lkZW50ZS4NCg0KPC9kaXY+DQoNCiMgPHNwYW4gc3R5bGU9IkNvbG9yOiMzOGI2ZmYiPiBQYXNvIDI6IExpbXBpYXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpEZXNwdcOpcyBkZSBsaW1waWFyIGxhIGJhc2UgZGUgZGF0b3MsIHNlIHZ1ZWx2ZSBhIGNvcnJlciBlbCByZXN1bWVuIHBhcmEgdmVyIGxvcyBjYW1iaW9zLg0KYGBge3J9DQojbGlicmFyeSgiamFuaXRvciIpDQojY2xlYW5fbmFtZXMoc2VndXJvcykNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoImphbml0b3IiKQ0KY2xlYW5fbmFtZXMoc2VndXJvcykNCmBgYA0KDQoNCmBgYHtyfQ0KcmVzdW1lbiA8LSBzdW1tYXJ5KHNlZ3Vyb3MpDQpyZXN1bWVuDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSJDb2xvcjojZ3JlZW4iPiBOb3RhczogPC9zcGFuPiANCkFncmVnYXIgY29sdW1uYSBkZSBkw61hcyBkZSBpbmNhcGFjaWRhZCBlbiBFeGNlbCAoUmV0dXJuVG9Xb3JrRGF0ZS1JbmNpZGVudERhdGUpLg0KDQojIDxzcGFuIHN0eWxlPSJDb2xvcjojMzhiNmZmIj4gUGFzbyAzOiBSZXZpc2FyIGxhcyB2YXJpYWJsZXMgZGUgY2Fyw6FjdGVyIDwvc3Bhbj4NCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCiNjb3VudChzZWd1cm9zLCBJbmNpZGVudERlc2NyaXB0aW9uLCBzb3J0PVRSVUUpDQojY291bnQoc2VndXJvcywgQ2xhaW1hbnRUeXBlLCBzb3J0PVRSVUUpDQojY291bnQoc2VndXJvcywgSW5qdXJ5TmF0dXJlLCBzb3J0PVRSVUUpDQojY291bnQoc2VndXJvcywgQm9keVBhcnRSZWdpb24sIHNvcnQ9VFJVRSkNCiNjb3VudChzZWd1cm9zLCBBdmVyYWdlV2Vla2x5V2FnZTEsIHNvcnQ9VFJVRSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJDb2xvcjojMzhiNmZmIj4gUGFzbyA0OiBDcmVhciByZWdyZXNpw7NuIGzDrW5lYWwgPC9zcGFuPg0KYGBge3J9DQojcmVncmVzaW9uIDwtIGxtIChUb3RhbEluY3VycmVkQ29zdCB+ICAgQ2xhaW1hbnRBZ2VfYXRfRE9JICsgR2VuZGVyICsgQ2xhaW1hbnRUeXBlICsgSW5qdXJ5TmF0dXJlICsgQm9keVBhcnRSZWdpb24gKyBCb2R5UGFydCArIEF2ZXJhZ2VXZWVrbHlXYWdlMSArIEJpbGxSZXZpZXdBTEUgKyBIb3NwaXRhbCArIFBoeXNpY2lhbk91dHBhdGllbnQgKyBSeCAsIGRhdGE9c2VndXJvcykNCg0KI3N1bW1hcnkgKHJlZ3Jlc2lvbikgDQpgYGANCg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnJlZ3Jlc2lvbiA8LSBsbSAoVG90YWxJbmN1cnJlZENvc3QgfiAgIENsYWltYW50QWdlX2F0X0RPSSArIEdlbmRlciArIENsYWltYW50VHlwZSArIEluanVyeU5hdHVyZSArIEJvZHlQYXJ0UmVnaW9uICsgQm9keVBhcnQgKyBBdmVyYWdlV2Vla2x5V2FnZTEgKyBCaWxsUmV2aWV3QUxFICsgSG9zcGl0YWwgKyBQaHlzaWNpYW5PdXRwYXRpZW50ICsgUnggLCBkYXRhPXNlZ3Vyb3MpDQpzdW1tYXJ5IChyZWdyZXNpb24pIA0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJDb2xvcjpncmVlbiI+IFBhc28gNC41OiBNb2RpZmljYXIgbGEgcmVncmVzacOzbiBsw61uZWFsIDwvc3Bhbj4gDQpgYGB7cn0NCiNyZWdyZXNpb24gPC0gbG0gKFRvdGFsSW5jdXJyZWRDb3N0IH4gICBDbGFpbWFudEFnZV9hdF9ET0kgKyBHZW5kZXIgKyBDbGFpbWFudFR5cGUgKyBJbmp1cnlOYXR1cmUgKyBCb2R5UGFydFJlZ2lvbiArIEJvZHlQYXJ0ICsgQXZlcmFnZVdlZWtseVdhZ2UxICwgZGF0YT1zZWd1cm9zKQ0KI3N1bW1hcnkgKHJlZ3Jlc2lvbikNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnJlZ3Jlc2lvbiA8LSBsbSAoVG90YWxJbmN1cnJlZENvc3QgfiAgIENsYWltYW50QWdlX2F0X0RPSSArIEdlbmRlciArIENsYWltYW50VHlwZSArIEluanVyeU5hdHVyZSArIEJvZHlQYXJ0UmVnaW9uICsgQm9keVBhcnQgKyBBdmVyYWdlV2Vla2x5V2FnZTEgLCBkYXRhPXNlZ3Vyb3MpDQpzdW1tYXJ5IChyZWdyZXNpb24pIA0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9IkNvbG9yOiMzOGI2ZmYiPiBQYXNvIDU6IENvbnN0cnVpciBtb2RlbG8gcHJlZGljdGl2byA8L3NwYW4+IA0KYGBge3J9DQpkYXRvc19udWV2b3MgPC1kYXRhLmZyYW1lKENsYWltYW50QWdlX2F0X0RPSSA9IGMoMjAsMzAsNDAsNTAsNjAsNzAsODAsOTApLCBHZW5kZXI9ICJNYWxlIiwgQ2xhaW1hbnRUeXBlPSAiTWVkaWNhbCBPbmx5IiwgSW5qdXJ5TmF0dXJlID0gIkFtcHV0YXRpb24iLCBCb2R5UGFydFJlZ2lvbiA9ICJNdWx0aXBsZSBCb2R5IFBhcnRzIiwgQm9keVBhcnQ9ICJCcmFpbiIsIEF2ZXJhZ2VXZWVrbHlXYWdlMT01MzcpDQpwcmVkaWN0KHJlZ3Jlc2lvbixkYXRvc19udWV2b3MpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iQ29sb3I6IzM4YjZmZiI+IENvbmNsdXNpw7NuIHkgQXByZW5kaXphamUgPC9zcGFuPg0KDQo8c3R5bGU+DQpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2xpZ2h0Z3JlZW47IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJibHVlIj4NClNlZ8O6biBsb3MgZGF0b3MgcmVjYWJhZG9zIGVuIGxhIHJlZ3Jlc2nDs24gbMOtbmVhbCwgc2UgcHVkbyB2ZXIgcXVlIHJlYWxtZW50ZSBlbiBsbyBxdWUgc2UgbmVjZXNpdGFiYSBwb25lciBtw6FzIGF0ZW5jacOzbiBvIHF1ZSB0ZW7DrWEgdW5hIHZhcmlhYmxlIG3DoXMgZGVwZW5kaWVudGUgZXJhbiBsYXMgZGUgdGlwb3MgZGUgZ2VuZXJvLCB0aXBvIGRlIHNpbmllc3RybywgbmF0dXJhbGV6YSBkZSBsZXNpw7NuLCByZWdpw7NuIGRlIGN1ZXJwbywgcGFydGUgZGVsIGN1ZXJwbyB5IGVsIHByb21lZGlvIGRlbCBwYWdvIHNlbWFuYWwgZGUgbGEgZXNjdWVsYSBqdW50byBjb24gbGEgZWRhZC4gRXN0byBwdWVzdG8gYSBxdWUgc29uIGxhcyDDoXJlYXMgZW4gbGFzIHF1ZSBkZXBlbmRpZW5kbyBkZSBsbyBxdWUgc2VhLCBzZSBnYXN0YSBtw6FzIHkgcHVlZGUgc2lnbmlmaWNhciB1biBnYXN0byBleHRyYSBwYXJhIGxhIGFzZWd1cmFkb3JhIGxvIGN1YWwgZGUgaWd1YWwgbWFuZXJhIGxlIHBvZHLDrWEgYWZlY3RhciBzaSBlcyBxdWUgbm8gaW5jcmVtZW50YSBsYSBwcmltYSBxdWUgc2UgbGUgY29icmEgYSBsb3MgYXNlZ3VyYWRvcyBjYWRhIHF1ZSBzZSBhY2NpZGVudGFuIGRlcGVuZGllbmRvIGRlIHN1cyBjb21vcmJpbGlkYWRlcywgZWRhZCB5IGhpc3RvcmlhbCB2aXRhbGljaW8gZGVudHJvIGRlIGxhIHZpZGEgZGVsIGFzZWd1cmFkbywgeWEgcXVlIHNlZ8O6biBudWVzdHJhIHJlZ3Jlc2nDs24gc2UgcHVlZGUgdmVyIHF1ZSBlbnRyZSBtw6FzIGVkYWQsIHNpZ25pZmljYSB1biBtYXlvciBnYXN0byBqdXN0YW1lbnRlIHBvciBsYSByZWR1bnRhbnRlIGNvbW9yYmlsaWRhZCBkZSBsYSBlZGFkIHkgcHJvcGVuc2nDs24gYSBhY2NpZGVudGVzIHF1ZSBhcXXDrSBtYXJjYSB1bmEgZGlmZXJlbmNpYSBkZSB1biBwb2NvIG3DoXMgZGUgJDEwLDAwMCBkb2xhcmVzIHF1ZSBzZSB2YSBpbmNyZW1lbnRhbmRvIGVudHJlIGVsIHByaW1lciBncnVwbyB5IGVsIMO6bHRpbW8uDQoNCkxhIHJlZ3Jlc2nDs24gbMOtbmVhbCBlbiBnZW5lcmFsLCBub3Mgc2lydmUgcGFyYSBzYWJlciBsYSBkZXBlbmRlbmNpYSBkZSB1bmEgdmFyaWFibGUgcGFyYSBxdWUgYWZlY3RlIGEgb3RyYXMgeSBlcyBidWVubyBzYWJlciBjb21vIHVzYXJsbyBlbiBSLCB5YSBxdWUgc2UgcHVlZGUgZGVzYXJyb2xsYXIgZGUgbWFuZXJhIG3DoXMgZ3LDoWZpY2Egc2kgYXPDrSBsbyBxdWlzaWVyYW1vcyBwcmVzZW50YXIgYWwgYWRpY2lvbmFyIG51ZXN0cm8gY29kaWdvIGNvbiB1biBnZ3Bsb3QgeSB2ZXIgZWwgY3JlY2ltaWVudG8gZGUgbG9zIGHDsW9zIHBhcmEgcHJlc2VudGFyc2Vsb3MgYSBudWVzdHJvIGNsaWVudGUuDQoNCjwvZGl2Pg0KDQo=