Background and Objective:

A nationwide survey of hospital costs conducted by the US Agency for Healthcare consists of hospital records of inpatient samples. The given data is restricted to the city of Wisconsin and relates to patients in the age group 0-17 years. The agency wants to analyze the data to research on healthcare costs and their utilization.

Import dataset

setwd("C:/Learning/Data Analytics/Datasicence with R/Project/Healthcare - cost analysis")
HospitalCosts=read.csv("hospital_costs.csv", header=TRUE)
head(HospitalCosts)
names(HospitalCosts)
[1] "ï..AGE" "FEMALE" "LOS"    "RACE"   "TOTCHG" "APRDRG"
names(HospitalCosts)[1] = "AGE"
names(HospitalCosts)
[1] "AGE"    "FEMALE" "LOS"    "RACE"   "TOTCHG" "APRDRG"

1. Record patient statistics:

The agency wants to find the age category of people who frequently visit the hospital and has the maximum expenditure.

summary(HospitalCosts)
      AGE           FEMALE          LOS          RACE         TOTCHG          APRDRG   
 Min.   : 0.0   Min.   :0.00   Min.   : 0   Min.   :1.0   Min.   :  532   Min.   : 21  
 1st Qu.: 0.0   1st Qu.:0.00   1st Qu.: 2   1st Qu.:1.0   1st Qu.: 1216   1st Qu.:640  
 Median : 0.0   Median :1.00   Median : 2   Median :1.0   Median : 1536   Median :640  
 Mean   : 5.1   Mean   :0.51   Mean   : 3   Mean   :1.1   Mean   : 2774   Mean   :616  
 3rd Qu.:13.0   3rd Qu.:1.00   3rd Qu.: 3   3rd Qu.:1.0   3rd Qu.: 2530   3rd Qu.:751  
 Max.   :17.0   Max.   :1.00   Max.   :41   Max.   :6.0   Max.   :48388   Max.   :952  
                                            NA's   :1                                  

Get number of hospital visits based on age

summary(as.factor(HospitalCosts$AGE))
  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17 
307  10   1   3   2   2   2   3   2   2   4   8  15  18  25  29  29  38 
  • Total number of hospital for 0-1 age group is 307
hist(HospitalCosts$AGE, main="Histogram of Age Group and their hospital visits",
     xlab="Age group", border="black", col=c("light green", "dark green"), xlim=c(0,20), ylim=c(0,350))

  • As can be seen here, the maximum number of hospital visits are for age group is 0-1 years

Summarize expenditure based on age group

ExpenseBasedOnAge = aggregate(TOTCHG ~ AGE, FUN=sum, data=HospitalCosts)

Get the maximum expense and its age group

which.max(tapply(ExpenseBasedOnAge$TOTCHG, ExpenseBasedOnAge$TOTCHG, FUN=sum))
678118 
    18 
barplot(tapply(ExpenseBasedOnAge$TOTCHG, ExpenseBasedOnAge$AGE, FUN=sum))

  • Maximum expenditure for 0-1 yr is 678118

4. To properly utilize the costs, the agency has to analyze the severity of the hospital costs by age and gender for the proper allocation of resources.

summary(HospitalCosts$FEMALE)
  0   1 
244 255 
summary(ageGenderInflModel)

Call:
lm(formula = TOTCHG ~ AGE + FEMALE, data = HospitalCosts)

Residuals:
   Min     1Q Median     3Q    Max 
 -3403  -1444   -873   -156  44950 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   2719.4      261.4   10.40  < 2e-16 ***
AGE             86.0       25.5    3.37  0.00081 ***
FEMALE1       -744.2      354.7   -2.10  0.03638 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3850 on 496 degrees of freedom
Multiple R-squared:  0.0259,    Adjusted R-squared:  0.0219 
F-statistic: 6.58 on 2 and 496 DF,  p-value: 0.00151

5. Since the length of stay is the crucial factor for inpatients, the agency wants to find if the length of stay can be predicted from age, gender, and race.

summary(ageGenderRaceInflModel)

Call:
lm(formula = LOS ~ AGE + FEMALE + RACE, data = HospitalCostsNA)

Residuals:
   Min     1Q Median     3Q    Max 
 -3.21  -1.21  -0.86   0.14  37.79 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   2.8569     0.2316   12.34   <2e-16 ***
AGE          -0.0394     0.0226   -1.74    0.082 .  
FEMALE        0.3539     0.3129    1.13    0.259    
RACE2        -0.3750     1.3957   -0.27    0.788    
RACE3         0.7892     3.3858    0.23    0.816    
RACE4         0.5949     1.9572    0.30    0.761    
RACE5        -0.8569     1.9627   -0.44    0.663    
RACE6        -0.7188     2.3929   -0.30    0.764    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.4 on 491 degrees of freedom
Multiple R-squared:  0.0087,    Adjusted R-squared:  -0.00543 
F-statistic: 0.616 on 7 and 491 DF,  p-value: 0.743
  • The p-value is higher than 0.05 for age, gender and race, indicating there is no linear relationship between these variables and length of stay.
  • Hence, age, gender and race cannot be used to predict the length of stay of inpatients.

6. Complete analysis

The agency wants to find the variable that mainly affects hospital costs.

Significance method - build a model using all independent variables vs dependent variable

summary(hospitalCostModel)

Call:
lm(formula = TOTCHG ~ ., data = HospitalCosts)

Residuals:
   Min     1Q Median     3Q    Max 
 -6377   -700   -174    122  43378 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 5218.677    507.647   10.28   <2e-16 ***
AGE          134.695     17.471    7.71    7e-14 ***
FEMALE1     -390.692    247.739   -1.58     0.12    
LOS          743.152     34.923   21.28   <2e-16 ***
RACE        -212.429    227.933   -0.93     0.35    
APRDRG        -7.791      0.682  -11.43   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2610 on 493 degrees of freedom
Multiple R-squared:  0.554, Adjusted R-squared:  0.549 
F-statistic:  122 on 5 and 493 DF,  p-value: <2e-16
  • As it is apparent from the coefficient values, Age, Length of stay (LOS) and patient refined diagnosis related groups(APRDRG) have three stars (***) next to it. So they are the ones with statistical significance
  • Also, RACE is the least significant. build a model after removing RACE
summary(hcm1)

Call:
lm(formula = TOTCHG ~ AGE + FEMALE + LOS + APRDRG, data = HospitalCostsNA)

Residuals:
   Min     1Q Median     3Q    Max 
 -6344   -687   -168    132  43387 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 4971.980    433.116   11.48  < 2e-16 ***
AGE          134.241     17.462    7.69  8.2e-14 ***
FEMALE      -383.082    247.571   -1.55     0.12    
LOS          743.618     34.914   21.30  < 2e-16 ***
APRDRG        -7.767      0.681  -11.40  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2610 on 494 degrees of freedom
Multiple R-squared:  0.553, Adjusted R-squared:  0.549 
F-statistic:  153 on 4 and 494 DF,  p-value: <2e-16
summary(hcm2)

Call:
lm(formula = TOTCHG ~ AGE + LOS + APRDRG, data = HospitalCostsNA)

Residuals:
   Min     1Q Median     3Q    Max 
 -6603   -719   -169    124  43350 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 4960.170    433.658   11.44  < 2e-16 ***
AGE          128.552     17.095    7.52  2.6e-13 ***
LOS          740.806     34.916   21.22  < 2e-16 ***
APRDRG        -8.006      0.664  -12.05  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2620 on 495 degrees of freedom
Multiple R-squared:  0.551, Adjusted R-squared:  0.548 
F-statistic:  202 on 3 and 495 DF,  p-value: <2e-16
  • Since APRDRG has -ve t-value, dropping it.
summary(hcm3)

Call:
lm(formula = TOTCHG ~ AGE + LOS, data = HospitalCostsNA)

Residuals:
   Min     1Q Median     3Q    Max 
 -4783  -1103   -458   -133  41382 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)    200.7      203.5    0.99     0.32    
AGE             98.0       19.2    5.10  4.8e-07 ***
LOS            734.3       39.7   18.51  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2970 on 496 degrees of freedom
Multiple R-squared:  0.419, Adjusted R-squared:  0.416 
F-statistic:  179 on 2 and 496 DF,  p-value: <2e-16

Comparing Models

Data Approach Model Name Detail R2 adj R2 std err R2 - adj R2 p-value
HospitalCosts Ap1:significance hospitalCostModel signifi, all independent variables 0.554 0.549 2610 0.005 <2e-16
HospitalCosts Ap1:significance hcm1 -RACE 0.553 0.549 2610 0.004 <2e-16
HospitalCosts Ap1:significance hcm2 -RACE - FEMALE (gender) 0.551 0.548 2620 0.003 <2e-16
HospitalCosts Ap1:significance hcm3 AGE + LOS 0.419 0.416 2970 0.003 <2e-16

Analysis Conclusion:

  1. Healthcare cost is the most for patients in the 0-1 yrs age group category
  1. Maximum expenditure for 0-1 yr is 678118
  1. Length of Stay increases the hospital cost

  2. All Patient Refined Diagnosis Related Groups also affects healthcare costs

  1. 640 diagnosis related group had a max cost of 437978
  1. Race or gender doesn’t have that much impact on hospital cost
LS0tDQp0aXRsZTogIkhlYWx0aGNhcmUgQ29zdCBBbmFseXNpcyINCg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMjIEJhY2tncm91bmQgYW5kIE9iamVjdGl2ZToNCg0KQSBuYXRpb253aWRlIHN1cnZleSBvZiBob3NwaXRhbCBjb3N0cyBjb25kdWN0ZWQgYnkgdGhlIFVTIEFnZW5jeSBmb3IgSGVhbHRoY2FyZSBjb25zaXN0cyBvZiBob3NwaXRhbCByZWNvcmRzIG9mIGlucGF0aWVudCBzYW1wbGVzLiBUaGUgZ2l2ZW4gZGF0YSBpcyByZXN0cmljdGVkIHRvIHRoZSBjaXR5IG9mIFdpc2NvbnNpbiBhbmQgcmVsYXRlcyB0byBwYXRpZW50cyBpbiB0aGUgYWdlIGdyb3VwIDAtMTcgeWVhcnMuIFRoZSBhZ2VuY3kgd2FudHMgdG8gYW5hbHl6ZSB0aGUgZGF0YSB0byByZXNlYXJjaCBvbiBoZWFsdGhjYXJlIGNvc3RzIGFuZCB0aGVpciB1dGlsaXphdGlvbi4NCg0KDQojIyBJbXBvcnQgZGF0YXNldA0KYGBge3J9DQpzZXR3ZCgiQzovTGVhcm5pbmcvRGF0YSBBbmFseXRpY3MvRGF0YXNpY2VuY2Ugd2l0aCBSL1Byb2plY3QvSGVhbHRoY2FyZSAtIGNvc3QgYW5hbHlzaXMiKQ0KSG9zcGl0YWxDb3N0cz1yZWFkLmNzdigiaG9zcGl0YWxfY29zdHMuY3N2IiwgaGVhZGVyPVRSVUUpDQpoZWFkKEhvc3BpdGFsQ29zdHMpDQpuYW1lcyhIb3NwaXRhbENvc3RzKQ0KYGBgDQoNCg0KYGBge3J9DQpuYW1lcyhIb3NwaXRhbENvc3RzKVsxXSA9ICJBR0UiDQpgYGANCmBgYHtyfQ0KbmFtZXMoSG9zcGl0YWxDb3N0cykNCmBgYA0KDQojIyAxLiBSZWNvcmQgcGF0aWVudCBzdGF0aXN0aWNzOg0KVGhlIGFnZW5jeSB3YW50cyB0byBmaW5kIHRoZSBhZ2UgY2F0ZWdvcnkgb2YgcGVvcGxlIHdobyBmcmVxdWVudGx5IHZpc2l0IHRoZSBob3NwaXRhbCBhbmQgaGFzIHRoZSBtYXhpbXVtIGV4cGVuZGl0dXJlLg0KDQoqICpBZ2UqOiBBZ2Ugb2YgdGhlIHBhdGllbnQgZGlzY2hhcmdlZA0KKiAqVG90Y2hnKjogSG9zcGl0YWwgZGlzY2hhcmdlIGNvc3RzDQpgYGB7cn0NCnN1bW1hcnkoSG9zcGl0YWxDb3N0cykNCmBgYA0KDQojIyMgR2V0IG51bWJlciBvZiBob3NwaXRhbCB2aXNpdHMgYmFzZWQgb24gYWdlDQpgYGB7cn0NCnN1bW1hcnkoYXMuZmFjdG9yKEhvc3BpdGFsQ29zdHMkQUdFKSkNCmBgYA0KKiBUb3RhbCBudW1iZXIgb2YgaG9zcGl0YWwgZm9yIDAtMSBhZ2UgZ3JvdXAgaXMgMzA3DQpgYGB7cn0NCmhpc3QoSG9zcGl0YWxDb3N0cyRBR0UsIG1haW49Ikhpc3RvZ3JhbSBvZiBBZ2UgR3JvdXAgYW5kIHRoZWlyIGhvc3BpdGFsIHZpc2l0cyIsDQogICAgIHhsYWI9IkFnZSBncm91cCIsIGJvcmRlcj0iYmxhY2siLCBjb2w9YygibGlnaHQgZ3JlZW4iLCAiZGFyayBncmVlbiIpLCB4bGltPWMoMCwyMCksIHlsaW09YygwLDM1MCkpDQpgYGANCiogQXMgY2FuIGJlIHNlZW4gaGVyZSwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGhvc3BpdGFsIHZpc2l0cyBhcmUgZm9yIGFnZSBncm91cCBpcyAwLTEgeWVhcnMNCg0KIyMjIFN1bW1hcml6ZSBleHBlbmRpdHVyZSBiYXNlZCBvbiBhZ2UgZ3JvdXANCmBgYHtyfQ0KRXhwZW5zZUJhc2VkT25BZ2UgPSBhZ2dyZWdhdGUoVE9UQ0hHIH4gQUdFLCBGVU49c3VtLCBkYXRhPUhvc3BpdGFsQ29zdHMpDQpgYGANCiMjIyMgIEdldCB0aGUgbWF4aW11bSBleHBlbnNlIGFuZCBpdHMgYWdlIGdyb3VwDQpgYGB7cn0NCndoaWNoLm1heCh0YXBwbHkoRXhwZW5zZUJhc2VkT25BZ2UkVE9UQ0hHLCBFeHBlbnNlQmFzZWRPbkFnZSRUT1RDSEcsIEZVTj1zdW0pKQ0KYmFycGxvdCh0YXBwbHkoRXhwZW5zZUJhc2VkT25BZ2UkVE9UQ0hHLCBFeHBlbnNlQmFzZWRPbkFnZSRBR0UsIEZVTj1zdW0pKQ0KYGBgDQoqIE1heGltdW0gZXhwZW5kaXR1cmUgZm9yIDAtMSB5ciBpcyA2NzgxMTgNCg0KDQoNCiMjIDIuIERpYWdub3Npcy1yZWxhdGVkIGdyb3VwIHRoYXQgaGFzIG1heGltdW0gaG9zcGl0YWxpemF0aW9uIGFuZCBleHBlbmRpdHVyZQ0KIyMjIEluIG9yZGVyIG9mIHNldmVyaXR5IG9mIHRoZSBkaWFnbm9zaXMgYW5kIHRyZWF0bWVudHMgYW5kIHRvIGZpbmQgb3V0IHRoZSBleHBlbnNpdmUgdHJlYXRtZW50cywgdGhlIGFnZW5jeSB3YW50cyB0byBmaW5kIHRoZSBkaWFnbm9zaXMtcmVsYXRlZCBncm91cCB0aGF0IGhhcyBtYXhpbXVtIGhvc3BpdGFsaXphdGlvbiBhbmQgZXhwZW5kaXR1cmUuDQoqIEFwcmRyZzogQWxsIFBhdGllbnQgUmVmaW5lZCBEaWFnbm9zaXMgUmVsYXRlZCBHcm91cHMNCiogVG90Y2hnOiBIb3NwaXRhbCBkaXNjaGFyZ2UgY29zdHMNCmBgYHtyfQ0Kc3VtbWFyeShhcy5mYWN0b3IoSG9zcGl0YWxDb3N0cyRBUFJEUkcpKQ0KYGBgDQoNCkdldCB0aGUgZGlhZ25vc2lzLXJlbGF0ZWQgZ3JvdXAgYW5kIGl0cyBob3NwaXRhbGl6YXRpb24gZXhwZW5kaXR1cmUNCmBgYHtyfQ0KRGlhZ25vc2lzQ29zdCA9IGFnZ3JlZ2F0ZShUT1RDSEcgfiBBUFJEUkcsIEZVTiA9IHN1bSwgZGF0YSA9IEhvc3BpdGFsQ29zdHMpDQpgYGANCg0KR2V0IHRoZSBtYXggZGlhZ25vc3RpYyBjb3N0DQpgYGB7cn0NCkRpYWdub3Npc0Nvc3Rbd2hpY2gubWF4KERpYWdub3Npc0Nvc3QkVE9UQ0hHKSwgXQ0KYGBgDQoqIEFzIGNhbiBiZSBzZWVuIGhlcmUgKio2NDAqKiBkaWFnbm9zaXMgcmVsYXRlZCBncm91cCBoYWQgYSBtYXggY29zdCBvZiAqKjQzNzk3OCoqDQoNCiMjIyAzLiBSYWNlIHZzIEhvc3BpdGFsaXphdGlvbiBjb3N0cw0KIyMjIyBUbyBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBtYWxwcmFjdGljZSwgdGhlIGFnZW5jeSBuZWVkcyB0byBhbmFseXplIGlmIHRoZSByYWNlIG9mIHRoZSBwYXRpZW50IGlzIHJlbGF0ZWQgdG8gdGhlIGhvc3BpdGFsaXphdGlvbiBjb3N0cy4NCiNIbyAoTnVsbCBoeXBvdGhlc2lzKTpJbmRlcGVuZGVudCB2YXJpYWJsZSAoUkFDRSkgaXMgbm90IGluZmx1ZW5jaW5nIGRlcGVuZGVudCB2YXJpYWJsZSAoQ09TVFMpDQojSDA6dGhlcmUgaXMgbm8gbm8gY29ycmVsYXRpb24gYW1vbmcgcmVzaWR1YWxzLCANCiMgIHAtdmFsdWUgPSAwLjczOTQgPD09IHRoaXMgaXMgPiAwLjUNCiNpLmUuIHRoZXkgYXJlIGluZGVwZW5kZW50DQojaW4gY2FzZSBvZiByZWdyZXNzaW9uLCB3ZSBuZWVkIGhpZ2ggcCB2YWx1ZSBzbyB0aGF0IHdlIGNhbm5vdCByZWplY3QgdGhlIG51bGwNCmBgYHtyfQ0Kc3VtbWFyeShhcy5mYWN0b3IoSG9zcGl0YWxDb3N0cyRSQUNFKSkNCmBgYA0KKiBUaGVyZSBpcyBvbmUgbnVsbCB2YWx1ZS4gVGhpcyBuZWVkcyB0byBiZSByZW1vdmVkDQpgYGB7cn0NCkhvc3BpdGFsQ29zdHMgPSBuYS5vbWl0KEhvc3BpdGFsQ29zdHMpDQpzdW1tYXJ5KGFzLmZhY3RvcihIb3NwaXRhbENvc3RzJFJBQ0UpKQ0KYGBgDQoqIEFzIGNhbiBiZSBzZWVuIDQ4NCBwYXRpZW50cyBvdXQgb2YgNDk5IGZhbGwgdW5kZXIgZ3JvdXAgMSwgc2hvd2luZyB0aGF0IHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGZvciAxIGNhdGVnb3J5IGlzIHdheSBoaWdoZXIgdGhhbiBvdGhlcnMgLSBoZW5jZSBkYXRhIGlzIHNrZXdlZC4gVGhpcyB3aWxsIG9ubHkgYWZmZWN0IHRoZSByZXN1bHRzIGZyb20gbGluZWFyIHJlZ3Jlc3Npb24gb3IgQU5PVkEgYW5hbHlzaXMNCmBgYHtyfQ0KcmFjZUluZmx1ZW5jZT1sbShUT1RDSEd+IFJBQ0UsIGRhdGE9SG9zcGl0YWxDb3N0cykNCnN1bW1hcnkocmFjZUluZmx1ZW5jZSkNCmBgYA0KKiBwVmFsdWUgaXMgKiowLjY5KiogaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiAqMC41Kg0KKiBXZSBjYW4gc2F5IHRoYXQgcmFjZSBkb2Vzbid0IGFmZmVjdCB0aGUgaG9zcGl0YWxpemF0aW9uIGNvc3RzDQoNCiMjIyBBbmF5c2lzIHVzaW5nIEFOT1ZBDQpXZSBjYW4gYWxzbyB1c2UgYW5vdmEgc3RhdGlzdGljYWwgdGVzdCBmb3IgZXN0aW1hdGluZyBob3cgZGVwZW5kZW50IHZhcmlhYmxlLCBpbiB0aGlzIGNhc2UgUkFDRSwgYWZmZWN0cyB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUsIHRoZSBob3NwaXRhbGl6YXRpb24gY29zdA0KYGBge3J9DQpyYWNlSW5mbHVlbmNlQU9WIDwtIGFvdihUT1RDSEcgfiBSQUNFLCBkYXRhPUhvc3BpdGFsQ29zdHMpDQpyYWNlSW5mbHVlbmNlQU9WDQpgYGANCg0KDQpgYGB7cn0NCnN1bW1hcnkocmFjZUluZmx1ZW5jZUFPVikNCmBgYA0KKiBUaGUgcmVzaWR1YWwgdmFyaWFuY2UgKGRldmlhdGlvbiBmcm9tIG9yaWdpbmFsKSAob2YgYWxsIG90aGVyIHZhcmlhYmxlcykgaXMgdmVyeSBoaWdoLg0KVGhpcyBpbXBsaWVzIHRoYXQgdGhlcmUgaXMgdmVyeSBsaXR0bGUgaW5mbHVlbmNlIGZyb20gUkFDRSBvbiBob3NwaXRhbGl6YXRpb24gY29zdHMNCiogQXMgY2FuIGJlIHNlZW4sIHRoZSBkZWdyZWUgb2YgZnJlZWRvbSAoRGYpIGZvciBSQUNFIGlzIDEgYW5kIHRoYXQgb2YgcmVzaWR1YWxzIGlzIDQ5NyBvYnNlcnZhdGlvbnMNCiogVGhlIEYtVmFsdWUsIHRoZSB0ZXN0IHN0YXRpc3RpYyBpcyAwLjE2IHdoaWNoIGlzIG11Y2ggbGVzcyB0aGFuIDAuNSBzaG93aW5nIHRoYXQgUkFDRSBkb2Vzbid0IGFmZmVjdCB0ZWggaG9zcGl0YWxpemF0aW9uIGNvc3QuDQoqIFRoZSBQcig+RiksIHRoZSBwX3ZhbHVlIG9mIDAuNjkgaXMgaGlnaCBjb25maXJtaW5nIHRoYXQgUkFDRSBkb2VzIG5vdCBhZmZlY3QgaG9zcGl0YWxpemF0aW9uIGNvc3QuDQoNCg0KIyMgNC4gVG8gcHJvcGVybHkgdXRpbGl6ZSB0aGUgY29zdHMsIHRoZSBhZ2VuY3kgaGFzIHRvIGFuYWx5emUgdGhlIHNldmVyaXR5IG9mIHRoZSBob3NwaXRhbCBjb3N0cyBieSBhZ2UgYW5kIGdlbmRlciBmb3IgdGhlIHByb3BlciBhbGxvY2F0aW9uIG9mIHJlc291cmNlcy4NCmBgYHtyfQ0KSG9zcGl0YWxDb3N0cyRGRU1BTEUgPC0gYXMuZmFjdG9yKEhvc3BpdGFsQ29zdHMkRkVNQUxFKQ0Kc3VtbWFyeShIb3NwaXRhbENvc3RzJEZFTUFMRSkNCmBgYA0KKiBBcyBjYW4gYmUgc2VlbiBoZXJlLCB0aGVyZSBpcyBlcXVhbCBkaXN0cmlidXRpb24gb2YgbWFsZSBhbmQgZmVtYWxlIGluIHRoZSBncm91cA0KDQpgYGB7cn0NCmFnZUdlbmRlckluZmxNb2RlbD1sbShUT1RDSEd+IEFHRStGRU1BTEUsIGRhdGE9SG9zcGl0YWxDb3N0cykNCnN1bW1hcnkoYWdlR2VuZGVySW5mbE1vZGVsKQ0KYGBgDQoqIFNpbmNlIHRoZSBwVmFsdWVzIG9mIEFHRSBpcyBtdWNoIGxlc3NlciB0aGFuIDAuMDUsIHRoZSBpZGVhbCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgbGV2ZWwsIGFuZCBpdCBhbHNvIGhhcyB0aHJlZSBzdGFycyAoKioqKSBuZXh0IHRvIGl0LCBpdCBtZWFucyBBR0UgaGFzIHRoZSBtb3N0IHN0YXRpdGljYWwgc2lnbmlmaWNhbmNlDQoqIFNpbWlsYXJseSwgZ2VuZGVyIGlzIGFsc28gbGVzcyB0aGFuIDAuMDUuDQoqIEhlbmNlLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGUgbW9kZWwgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudA0KDQojIyMgNS4gU2luY2UgdGhlIGxlbmd0aCBvZiBzdGF5IGlzIHRoZSBjcnVjaWFsIGZhY3RvciBmb3IgaW5wYXRpZW50cywgdGhlIGFnZW5jeSB3YW50cyB0byBmaW5kIGlmIHRoZSBsZW5ndGggb2Ygc3RheSBjYW4gYmUgcHJlZGljdGVkIGZyb20gYWdlLCBnZW5kZXIsIGFuZCByYWNlLg0KYGBge3J9DQpIb3NwaXRhbENvc3RzTkEkUkFDRSA8LSBhcy5mYWN0b3IoSG9zcGl0YWxDb3N0c05BJFJBQ0UpDQoNCmFnZUdlbmRlclJhY2VJbmZsTW9kZWw9bG0oTE9TIH4gQUdFK0ZFTUFMRStSQUNFLCBkYXRhPUhvc3BpdGFsQ29zdHNOQSkNCnN1bW1hcnkoYWdlR2VuZGVyUmFjZUluZmxNb2RlbCkNCmBgYA0KKiBUaGUgcC12YWx1ZSBpcyBoaWdoZXIgdGhhbiAwLjA1IGZvciBhZ2UsIGdlbmRlciBhbmQgcmFjZSwgaW5kaWNhdGluZyB0aGVyZSBpcyBubyBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdmFyaWFibGVzIGFuZCBsZW5ndGggb2Ygc3RheS4NCiogSGVuY2UsIGFnZSwgZ2VuZGVyIGFuZCByYWNlIGNhbm5vdCBiZSB1c2VkIHRvIHByZWRpY3QgdGhlIGxlbmd0aCBvZiBzdGF5IG9mIGlucGF0aWVudHMuDQoNCiMjIyA2LiBDb21wbGV0ZSBhbmFseXNpcyANCiMjIyMgVGhlIGFnZW5jeSB3YW50cyB0byBmaW5kIHRoZSB2YXJpYWJsZSB0aGF0IG1haW5seSBhZmZlY3RzIGhvc3BpdGFsIGNvc3RzLg0KKipTaWduaWZpY2FuY2UgbWV0aG9kKiogLSBidWlsZCBhIG1vZGVsIHVzaW5nIGFsbCBpbmRlcGVuZGVudCB2YXJpYWJsZXMgdnMgZGVwZW5kZW50IHZhcmlhYmxlDQpgYGB7cn0NCmhvc3BpdGFsQ29zdE1vZGVsPWxtKFRPVENIRyB+IC4gLCBkYXRhPUhvc3BpdGFsQ29zdHMpDQpzdW1tYXJ5KGhvc3BpdGFsQ29zdE1vZGVsKQ0KYGBgDQoqIEFzIGl0IGlzIGFwcGFyZW50IGZyb20gdGhlIGNvZWZmaWNpZW50IHZhbHVlcywgQWdlLCBMZW5ndGggb2Ygc3RheSAoTE9TKSBhbmQgcGF0aWVudCByZWZpbmVkIGRpYWdub3NpcyByZWxhdGVkIGdyb3VwcyhBUFJEUkcpIGhhdmUgdGhyZWUgc3RhcnMgKCoqKikgbmV4dCB0byBpdC4gU28gdGhleSBhcmUgdGhlIG9uZXMgd2l0aCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UNCiogQWxzbywgUkFDRSBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQuIGJ1aWxkIGEgbW9kZWwgYWZ0ZXIgcmVtb3ZpbmcgUkFDRQ0KYGBge3J9DQpoY20xPWxtKFRPVENIRyB+IEFHRStGRU1BTEUrTE9TK0FQUkRSRyAsIGRhdGE9SG9zcGl0YWxDb3N0c05BKQ0Kc3VtbWFyeShoY20xKQ0KYGBgDQpgYGB7cn0NCmhjbTI9bG0oVE9UQ0hHIH4gQUdFK0xPUytBUFJEUkcgLCBkYXRhPUhvc3BpdGFsQ29zdHNOQSkNCnN1bW1hcnkoaGNtMikNCmBgYA0KKiBTaW5jZSBBUFJEUkcgaGFzIC12ZSB0LXZhbHVlLCBkcm9wcGluZyBpdC4NCmBgYHtyfQ0KaGNtMz1sbShUT1RDSEcgfiBBR0UrTE9TICwgZGF0YT1Ib3NwaXRhbENvc3RzTkEpDQpzdW1tYXJ5KGhjbTMpDQpgYGANCiMjIENvbXBhcmluZyBNb2RlbHMNCnxEYXRhCXwgQXBwcm9hY2ggfAlNb2RlbCBOYW1lIHwJRGV0YWlsfAlSMnxhZGogUjJ8c3RkIGVycgl8UjIgLSBhZGogUjJ8cC12YWx1ZXwNCnw6LS0tLS0tOnwtLS0tLXw6LS0tLS06fC0tLS0tLS0tLXw6LS0tLS0tOnw6LS0tLS0tOnw6LS0tLS06fC0tLS0tLS0tLXw6LS0tLS0tOnwNCnxIb3NwaXRhbENvc3RzIHwJQXAxOnNpZ25pZmljYW5jZXwJaG9zcGl0YWxDb3N0TW9kZWx8CXNpZ25pZmksIGFsbCBpbmRlcGVuZGVudCB2YXJpYWJsZXMJfDAuNTU0fAkwLjU0OXwJMjYxMHwJMC4wMDV8CTwyZS0xNnwNCnxIb3NwaXRhbENvc3RzfAlBcDE6c2lnbmlmaWNhbmNlfAloY20xfAkgLVJBQ0V8CTAuNTUzCXwwLjU0OXwJMjYxMHwwLjAwNHw8MmUtMTZ8DQp8SG9zcGl0YWxDb3N0c3wJQXAxOnNpZ25pZmljYW5jZXwJaGNtMnwJIC1SQUNFIC0gRkVNQUxFIChnZW5kZXIpfAkwLjU1MQl8MC41NDgJfDI2MjB8CTAuMDAzIHwJPDJlLTE2fA0KfEhvc3BpdGFsQ29zdHN8CUFwMTpzaWduaWZpY2FuY2V8CWhjbTN8CUFHRSArIExPUwl8MC40MTkJfDAuNDE2CXwyOTcwfAkwLjAwM3wJPDJlLTE2fA0KDQoqIFJlbW92aW5nIFJhY2UgYW5kIGdlbmRlciBkb2Vzbid0IGNoYW5nZSB0aGUgUjIgdmFsdWUuIEl0IGRvZXNuJ3QgaW1wYWN0IGNvc3QNCiogUmVtb3ZpbmcgQVBSRFJHIGluIG1vZGVsIGhjbTMgaW5jcmVhc2VzIHRoZSBzdGFuZGFyZCBlcnJvci4gSGVuY2UgbW9kZWwgaGNtMiANCnNlZW1zIHRvIGJlIGJldHRlci4NCg0KIyMgQW5hbHlzaXMgQ29uY2x1c2lvbjoNCiogQXMgaXMgZXZpZGVudCBpbiB0aGUgbXVsdGlwbGUgbW9kZWxzIGFib3ZlLCBoZWFsdGggY2FyZSBjb3N0cyBpcyBkZXBlbmRlbnQgb24gYWdlLCBsZW5ndGggb2Ygc3RheSBhbmQgdGhlIGRpYWdub3NpcyB0eXBlLg0KMS4gSGVhbHRoY2FyZSBjb3N0IGlzIHRoZSBtb3N0IGZvciBwYXRpZW50cyBpbiB0aGUgMC0xIHlycyBhZ2UgZ3JvdXAgY2F0ZWdvcnkNCiBpKSBNYXhpbXVtIGV4cGVuZGl0dXJlIGZvciAwLTEgeXIgaXMgKjY3ODExOCoNCjIuIExlbmd0aCBvZiBTdGF5IGluY3JlYXNlcyB0aGUgaG9zcGl0YWwgY29zdA0KDQozLiBBbGwgUGF0aWVudCBSZWZpbmVkIERpYWdub3NpcyBSZWxhdGVkIEdyb3VwcyBhbHNvIGFmZmVjdHMgaGVhbHRoY2FyZSBjb3N0cw0KIGkpIDY0MCBkaWFnbm9zaXMgcmVsYXRlZCBncm91cCBoYWQgYSBtYXggY29zdCBvZiA0Mzc5NzggDQoNCjQuIFJhY2Ugb3IgZ2VuZGVyIGRvZXNuJ3QgaGF2ZSB0aGF0IG11Y2ggaW1wYWN0IG9uIGhvc3BpdGFsIGNvc3QNCg==