Raven Shan


Introduction

The objective of this exercise is to utilize the Amelia package to perform multiple imputations as a way of handling missing data. Generating imputed values helps in reducing bias as well as increasing efficiency. For this assignment, I selected a cross-sectional time-series dataset that has a considerable amount of missing values, which could potentially affect the reliability of my results if not properly addressed.

The dataset I will be using, “USSeatBelts” found in the AER package, contains panel data on traffic fatalities for all US states from 1988 to 1997. The outcome variable is fatalities, representing the number of fatalities per 1,000 traffic miles by state. While there are multiple predictors to choose from, this analysis will specifically examine the relationship between fatalities and selected state-level predictors such as seatbelt usage rate and median per capita income. In addition, I will be examining the effect of some mandatory driving-related laws on the number of fatalities per state. The goal is to be able to answer the following questions: What affect does a state’s seatbelt usage rate have on fatalities? What is the relationship between between median per capita income and the the number of fatalities in each state? Do wealthier states have fewer or more vehicular deaths? Thirdly, does the implementation of a maximum .08 blood alcohol content substantially reduce fatalities, and if so, to what extent? Lastly, what impact does having a minimum speed limit of 70 miles per hour have?

First, I will estimate the regression model using listwise deletion, then I will estimate the same model after using Amelia to generate multiple imputed values. Finally, the two sets of results will be compared.


Data and Variables

The variables used in this analysis and their definitions are as follows:

##Viewing the total number of observations and variables 
dim(USSeatBelts2)
[1] 765   7

There are 765 observations.

summary(USSeatBelts2)
     state          year      fatalities        seatbelt      speed70  
 AK     : 15   Min.   : 1   Min.   : 8.327   Min.   :0.0600   no :711  
 AL     : 15   1st Qu.: 4   1st Qu.:17.341   1st Qu.:0.4200   yes: 54  
 AR     : 15   Median : 8   Median :21.199   Median :0.5500            
 AZ     : 15   Mean   : 8   Mean   :21.490   Mean   :0.5289            
 CA     : 15   3rd Qu.:12   3rd Qu.:24.774   3rd Qu.:0.6500            
 CO     : 15   Max.   :15   Max.   :45.470   Max.   :0.8700            
 (Other):675                                 NA's   :209               
     income      alcohol  
 Min.   : 8372   no :676  
 1st Qu.:14266   yes: 89  
 Median :17624            
 Mean   :17993            
 3rd Qu.:21080            
 Max.   :35863            
                          

The above summary output shows 209 N/A’s (missing values) for the variable ‘seatbelt’. This is a considerable amount of missing values in a dataset that has 765 observations. Meanwhile, the remaining variables have no missing observations.

missmap(USSeatBelts2, legend=FALSE)

The above map was generated using the missmmap() function in Amelia. It is an alternative way of demonstrating where missingness occurs in the data. Again, it is clear that all of the missing values occur in the variable seatbelt, while the remaining variables have no missing observations.


Results

Estimating Model with Listwise Deletion

Below, I am estimating a regression model after listwise deletion, which is performed automatically by Zelig. Initially, I began with a simple model that examined the effect of seatbelt usage rate on the number of fatalities per 1,000 traffic miles. Despite the relationship being insignificant, “seatbelt” is included in the model for the sake of this exercise as it was the only variable in the dataset with missing observations. I gradually added additional variables and tested various interactions. Although it would have been ideal, unfortunately, none of the tested interactions were significant. Therefore, the analysis (for both methods) will be based on the best fitting model below.

This model estimates the effect of the variables seatbelt, alcohol, income and speed70 on the total number of fatalities (per 1,000 traffic miles). Contrary to the common assumption, the results indicate one unit increase in seatbelt usage rate to increase the number of fatalities by 1.72, however it is not statistically significant. Nonetheless, the remaining predictors are significant. The results suggest a one unit increase in median income to reduce the number of fatalities by an extremely small margin, .0008 (This value was taken from the summary output, but note that the html table displays the number as -0.00). We can also predict the number of fatalities to drop by 1.98 in states when there is a minimum drinking age of 21, and to increase by 2.24 when there is a 70 mile per hour (or higher) speed limit.

Statistical models
Model 1
(Intercept) 35.23***
(0.69)
seatbelt 1.72
(1.16)
income -0.00***
(0.00)
alcoholyes -1.98***
(0.46)
speed70yes 2.24***
(0.53)
R2 0.51
Adj. R2 0.51
Num. obs. 556
RMSE 3.54
p < 0.001, p < 0.01, p < 0.05
zlist3$setx()
zlist3$sim()
plot(zlist3)


Estimating the Model with Multiple Imputation

Creating Multiple Imputations with Amelia

##Imputation output excluded due to length 

a.out <- amelia(USSeatBelts2, m=10, ts="year", cs = "state", logs = "income", 
                noms = c("speed70", "alcohol"),
                polytime = 2, intercs=TRUE)
summary(a.out)

Amelia output with 10 imputed datasets.
Return code:  1 
Message:  Normal EM convergence. 

Chain Lengths:
--------------
Imputation 1:  1934
Imputation 2:  2
Imputation 3:  2
Imputation 4:  2
Imputation 5:  2
Imputation 6:  1431
Imputation 7:  5029
Imputation 8:  2
Imputation 9:  4625
Imputation 10:  2

Rows after Listwise Deletion:  556 
Rows after Imputation:  765 
Patterns of missingness in the data:  2 

Fraction Missing for original variables: 
-----------------------------------------

           Fraction Missing
state             0.0000000
year              0.0000000
fatalities        0.0000000
seatbelt          0.2732026
speed70           0.0000000
income            0.0000000
alcohol           0.0000000

MI model Results

With multiple imputation, the results below indicate that a one unit increase in seatbelt usage rate decreases fatalities by .95, however the variable is not significant. Note that it was the other way around in the listwise deletion method, in which an increase in seatbelt use increased the number of fatalities. One unit increase in median income reduces the number of fatalities by .0008. We can also predict the number of fatalities to drop by 1.91 in states when there is a minimum drinking age of 21 in effect, and to increase by 2.34 when there is a 70 mile per hour (or higher) speed limit in place. I will later compare these results with those of the listwise deletion model.

z.out$zelig(fatalities ~ seatbelt + income + alcohol + speed70, data = a.out)
summary(z.out)
Model: Combined Imputations 

             Estimate Std.Error z value Pr(>|z|)
(Intercept) 37.863550  0.646498   58.57  < 2e-16
seatbelt    -0.950882  1.532796   -0.62  0.53502
income      -0.000883  0.000056  -15.78  < 2e-16
alcoholyes  -1.915860  0.515520   -3.72  0.00020
speed70yes   2.343042  0.642672    3.65  0.00027

For results from individual imputed datasets, use summary(x, subset = i:j)
Next step: Use 'setx' method
z.out$setx()
z.out$sim()
plot(z.out)


Comparing Results By Missing Data Methods: Listwise Deletion vs MI Method

The results from the two methods show interesting differences, specifically in the variable ‘seatbelt’(representing seatbelt usage rate per state) as this is the only variable with missing values. Despite the relationship being insignificant in both methods, the listwise deletion method shows an increase in seatbelt usage rates to increase fatalities, whereas the multiple imputation method shows an increase in seatbelt usage rates to decrease fatalities, which is indeed more logical. This is a substantially different story, and further attests to why the MI method is preferred. As for the remaining independent variables, the differences in coefficients were negligible as there were no missing observations in these variables to begin with. Ultimately, the multiple imputation method produces much more reliable results as it considers multiple predicted values and their distribution. Comparatively, the listwise deletion method simply disregards cases that could contain important information, making the findings much less convincing.

LS0tDQp0aXRsZTogIlNvYyA3MTIgSG9tZXdvcmsgIzExIC0gTWlzc2luZyBEYXRhIGFuZCBNdWx0aXBsZSBJbXB1dGF0aW9uIHdpdGggQW1lbGlhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCipSYXZlbiBTaGFuKg0KDQotLS0NCg0KIyNJbnRyb2R1Y3Rpb24NCg0KVGhlIG9iamVjdGl2ZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHV0aWxpemUgdGhlICpBbWVsaWEqIHBhY2thZ2UgdG8gcGVyZm9ybSBtdWx0aXBsZSBpbXB1dGF0aW9ucyBhcyBhIHdheSBvZiBoYW5kbGluZyBtaXNzaW5nIGRhdGEuIEdlbmVyYXRpbmcgaW1wdXRlZCB2YWx1ZXMgaGVscHMgaW4gcmVkdWNpbmcgYmlhcyBhcyB3ZWxsIGFzIGluY3JlYXNpbmcgZWZmaWNpZW5jeS4gRm9yIHRoaXMgYXNzaWdubWVudCwgSSBzZWxlY3RlZCBhIGNyb3NzLXNlY3Rpb25hbCB0aW1lLXNlcmllcyBkYXRhc2V0IHRoYXQgaGFzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBtaXNzaW5nIHZhbHVlcywgd2hpY2ggY291bGQgcG90ZW50aWFsbHkgYWZmZWN0IHRoZSByZWxpYWJpbGl0eSBvZiBteSByZXN1bHRzIGlmIG5vdCBwcm9wZXJseSBhZGRyZXNzZWQuDQoNClRoZSBkYXRhc2V0IEkgd2lsbCBiZSB1c2luZywgIlVTU2VhdEJlbHRzIiBmb3VuZCBpbiB0aGUgQUVSIHBhY2thZ2UsIGNvbnRhaW5zIHBhbmVsIGRhdGEgb24gdHJhZmZpYyBmYXRhbGl0aWVzIGZvciBhbGwgVVMgc3RhdGVzIGZyb20gMTk4OCB0byAxOTk3LiBUaGUgb3V0Y29tZSB2YXJpYWJsZSBpcyBmYXRhbGl0aWVzLCByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIHBlciAxLDAwMCB0cmFmZmljIG1pbGVzIGJ5IHN0YXRlLiBXaGlsZSB0aGVyZSBhcmUgbXVsdGlwbGUgcHJlZGljdG9ycyB0byBjaG9vc2UgZnJvbSwgdGhpcyBhbmFseXNpcyB3aWxsIHNwZWNpZmljYWxseSBleGFtaW5lIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBmYXRhbGl0aWVzIGFuZCBzZWxlY3RlZCBzdGF0ZS1sZXZlbCBwcmVkaWN0b3JzIHN1Y2ggYXMgc2VhdGJlbHQgdXNhZ2UgcmF0ZSBhbmQgbWVkaWFuIHBlciBjYXBpdGEgaW5jb21lLiBJbiBhZGRpdGlvbiwgSSB3aWxsIGJlIGV4YW1pbmluZyB0aGUgZWZmZWN0IG9mIHNvbWUgbWFuZGF0b3J5IGRyaXZpbmctcmVsYXRlZCBsYXdzIG9uIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBwZXIgc3RhdGUuIFRoZSBnb2FsIGlzIHRvIGJlIGFibGUgdG8gYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOiBXaGF0IGFmZmVjdCBkb2VzIGEgc3RhdGUncyBzZWF0YmVsdCB1c2FnZSByYXRlIGhhdmUgb24gZmF0YWxpdGllcz8gV2hhdCBpcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYmV0d2VlbiBtZWRpYW4gcGVyIGNhcGl0YSBpbmNvbWUgYW5kIHRoZSB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgaW4gZWFjaCBzdGF0ZT8gRG8gd2VhbHRoaWVyIHN0YXRlcyBoYXZlIGZld2VyIG9yIG1vcmUgdmVoaWN1bGFyIGRlYXRocz8gVGhpcmRseSwgZG9lcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtYXhpbXVtIC4wOCBibG9vZCBhbGNvaG9sIGNvbnRlbnQgc3Vic3RhbnRpYWxseSByZWR1Y2UgZmF0YWxpdGllcywgYW5kIGlmIHNvLCB0byB3aGF0IGV4dGVudD8gTGFzdGx5LCB3aGF0IGltcGFjdCBkb2VzIGhhdmluZyBhIG1pbmltdW0gc3BlZWQgbGltaXQgb2YgNzAgbWlsZXMgcGVyIGhvdXIgaGF2ZT8NCg0KRmlyc3QsIEkgd2lsbCBlc3RpbWF0ZSB0aGUgcmVncmVzc2lvbiBtb2RlbCB1c2luZyBsaXN0d2lzZSBkZWxldGlvbiwgdGhlbiBJIHdpbGwgZXN0aW1hdGUgdGhlIHNhbWUgbW9kZWwgYWZ0ZXIgdXNpbmcgKkFtZWxpYSogdG8gZ2VuZXJhdGUgbXVsdGlwbGUgaW1wdXRlZCB2YWx1ZXMuIEZpbmFsbHksIHRoZSB0d28gc2V0cyBvZiByZXN1bHRzIHdpbGwgYmUgY29tcGFyZWQuIA0KDQotLS0NCg0KIyNEYXRhIGFuZCBWYXJpYWJsZXMgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShBbWVsaWEpDQpsaWJyYXJ5KFplbGlnKQ0KbGlicmFyeSh0ZXhyZWcpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KEFFUikNCmRhdGEoIlVTU2VhdEJlbHRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NClVTU2VhdEJlbHRzMiA8LSBkcGx5cjo6c2VsZWN0IChVU1NlYXRCZWx0cywgc3RhdGUsIHllYXIsIGZhdGFsaXRpZXMsIHNlYXRiZWx0LCBzcGVlZDcwLCBpbmNvbWUsIGFsY29ob2wpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpVU1NlYXRCZWx0czIkeWVhciA8LSBhcy5udW1lcmljKFVTU2VhdEJlbHRzMiR5ZWFyKQ0KVVNTZWF0QmVsdHMyJHN0YXRlIDwtIGFzLmZhY3RvcihVU1NlYXRCZWx0czIkc3RhdGUpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojI211bHRpcGx5aW5nIGJ5IDEsMDAwIHRvIGdldCBiZXR0ZXIgdW5pdHMNClVTU2VhdEJlbHRzMiRmYXRhbGl0aWVzIDwtIFVTU2VhdEJlbHRzMiRmYXRhbGl0aWVzKjEwMDANCmBgYA0KDQpUaGUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBhbmFseXNpcyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMgYXJlIGFzIGZvbGxvd3M6DQoNCiogKipmYXRhbGl0aWVzKio6IEZhdGFsaXRpZXMgd2lsbCBzZXJ2ZSBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGluIHRoaXMgYW5hbHlzaXMuIFRoaXMgY29udGFpbnMgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIHBlciAxLDAwMCB0cmFmZmljIG1pbGVzIGluIGVhY2ggc3RhdGUuIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgdmFyaWFibGUgd2FzIG11bHRpcGxpZWQgYnkgMSwwMDAgZm9yIGEgbW9yZSBjb252ZW5pZW50IHVuaXQuIA0KKiAqKnNlYXRiZWx0Kio6IFRoaXMgaXMgc2VhdCBiZWx0IHVzYWdlIHJhdGUsIGFzIHNlbGYtcmVwb3J0ZWQgYnkgc3RhdGUgcG9wdWxhdGlvbiBzdXJ2ZXkgDQoqICoqaW5jb21lKio6IFRoaXMgbWVhc3VyZXMgbWVkaWFuIHBlciBjYXBpdGEgaW5jb21lIGZvciBlYWNoIHN0YXRlDQoqICoqYWxjb2hvbCoqOiBUaGlzIGlzIGEgYmluYXJ5IHZhcmlhYmxlIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIG1heGltdW0gb2YgMC4wOCBibG9vZCBhbGNvaG9sIGNvbnRlbnQgZm9yIGVhY2ggc3RhdGUgKCJZZXMiLyJObyIpLg0KKiAqKnNwZWVkNzAqKjogVGhpcyBpcyBhIGJpbmFyeSB2YXJpYWJsZSByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlcmUgaXMgYSA3MCAob3IgaGlnaGVyKSBtaWxlIHBlciBob3VyIHNwZWVkIGxpbWl0DQoNCmBgYHtyfQ0KIyNWaWV3aW5nIHRoZSB0b3RhbCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGFuZCB2YXJpYWJsZXMgDQpkaW0oVVNTZWF0QmVsdHMyKQ0KYGBgDQpUaGVyZSBhcmUgKio3NjUqKiBvYnNlcnZhdGlvbnMuIA0KDQpgYGB7cn0NCnN1bW1hcnkoVVNTZWF0QmVsdHMyKQ0KYGBgDQoNClRoZSBhYm92ZSBzdW1tYXJ5IG91dHB1dCBzaG93cyAyMDkgTi9BJ3MgKG1pc3NpbmcgdmFsdWVzKSBmb3IgdGhlIHZhcmlhYmxlICdzZWF0YmVsdCcuIFRoaXMgaXMgYSBjb25zaWRlcmFibGUgYW1vdW50IG9mIG1pc3NpbmcgdmFsdWVzIGluIGEgZGF0YXNldCB0aGF0IGhhcyA3NjUgb2JzZXJ2YXRpb25zLiBNZWFud2hpbGUsIHRoZSByZW1haW5pbmcgdmFyaWFibGVzIGhhdmUgbm8gbWlzc2luZyBvYnNlcnZhdGlvbnMuICANCg0KYGBge3J9DQptaXNzbWFwKFVTU2VhdEJlbHRzMiwgbGVnZW5kPUZBTFNFKQ0KYGBgDQpUaGUgYWJvdmUgbWFwIHdhcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIG1pc3NtbWFwKCkgZnVuY3Rpb24gaW4gKkFtZWxpYSouIEl0IGlzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBkZW1vbnN0cmF0aW5nIHdoZXJlIG1pc3NpbmduZXNzIG9jY3VycyBpbiB0aGUgZGF0YS4gQWdhaW4sIGl0IGlzIGNsZWFyIHRoYXQgYWxsIG9mIHRoZSBtaXNzaW5nIHZhbHVlcyBvY2N1ciBpbiB0aGUgdmFyaWFibGUgc2VhdGJlbHQsIHdoaWxlIHRoZSByZW1haW5pbmcgdmFyaWFibGVzIGhhdmUgbm8gbWlzc2luZyBvYnNlcnZhdGlvbnMuDQoNCi0tLQ0KDQojUmVzdWx0cyANCg0KIyNFc3RpbWF0aW5nIE1vZGVsIHdpdGggTGlzdHdpc2UgRGVsZXRpb24NCg0KQmVsb3csIEkgYW0gZXN0aW1hdGluZyBhIHJlZ3Jlc3Npb24gbW9kZWwgYWZ0ZXIgbGlzdHdpc2UgZGVsZXRpb24sIHdoaWNoIGlzIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IGJ5IFplbGlnLiBJbml0aWFsbHksIEkgYmVnYW4gd2l0aCBhIHNpbXBsZSBtb2RlbCB0aGF0IGV4YW1pbmVkIHRoZSBlZmZlY3Qgb2Ygc2VhdGJlbHQgdXNhZ2UgcmF0ZSBvbiB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIDEsMDAwIHRyYWZmaWMgbWlsZXMuIERlc3BpdGUgdGhlIHJlbGF0aW9uc2hpcCBiZWluZyBpbnNpZ25pZmljYW50LCAic2VhdGJlbHQiIGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBmb3IgdGhlIHNha2Ugb2YgdGhpcyBleGVyY2lzZSBhcyBpdCB3YXMgdGhlIG9ubHkgdmFyaWFibGUgaW4gdGhlIGRhdGFzZXQgd2l0aCBtaXNzaW5nIG9ic2VydmF0aW9ucy4gSSBncmFkdWFsbHkgYWRkZWQgYWRkaXRpb25hbCB2YXJpYWJsZXMgYW5kIHRlc3RlZCB2YXJpb3VzIGludGVyYWN0aW9ucy4gQWx0aG91Z2ggaXQgd291bGQgaGF2ZSBiZWVuIGlkZWFsLCB1bmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSB0ZXN0ZWQgaW50ZXJhY3Rpb25zIHdlcmUgc2lnbmlmaWNhbnQuIFRoZXJlZm9yZSwgdGhlIGFuYWx5c2lzIChmb3IgYm90aCBtZXRob2RzKSB3aWxsIGJlIGJhc2VkIG9uIHRoZSBiZXN0IGZpdHRpbmcgbW9kZWwgYmVsb3cuIA0KDQpUaGlzIG1vZGVsIGVzdGltYXRlcyB0aGUgZWZmZWN0IG9mIHRoZSB2YXJpYWJsZXMgKipzZWF0YmVsdCoqLCAqKmFsY29ob2wqKiwgKippbmNvbWUqKiBhbmQgKipzcGVlZDcwKiogb24gdGhlIHRvdGFsIG51bWJlciBvZiBmYXRhbGl0aWVzIChwZXIgMSwwMDAgdHJhZmZpYyBtaWxlcykuICBDb250cmFyeSB0byB0aGUgY29tbW9uIGFzc3VtcHRpb24sIHRoZSByZXN1bHRzIGluZGljYXRlIG9uZSB1bml0IGluY3JlYXNlIGluIHNlYXRiZWx0IHVzYWdlIHJhdGUgdG8gKmluY3JlYXNlKiB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYnkgMS43MiwgaG93ZXZlciBpdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gTm9uZXRoZWxlc3MsIHRoZSByZW1haW5pbmcgcHJlZGljdG9ycyBhcmUgc2lnbmlmaWNhbnQuIFRoZSByZXN1bHRzIHN1Z2dlc3QgYSBvbmUgdW5pdCBpbmNyZWFzZSBpbiBtZWRpYW4gaW5jb21lIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYnkgYW4gZXh0cmVtZWx5IHNtYWxsIG1hcmdpbiwgLjAwMDggKFRoaXMgdmFsdWUgd2FzIHRha2VuIGZyb20gdGhlIHN1bW1hcnkgb3V0cHV0LCBidXQgbm90ZSB0aGF0IHRoZSBodG1sIHRhYmxlIGRpc3BsYXlzIHRoZSBudW1iZXIgYXMgLTAuMDApLiBXZSBjYW4gYWxzbyBwcmVkaWN0IHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyB0byBkcm9wIGJ5IDEuOTggaW4gc3RhdGVzIHdoZW4gdGhlcmUgaXMgYSBtaW5pbXVtIGRyaW5raW5nIGFnZSBvZiAyMSwgYW5kIHRvIGluY3JlYXNlIGJ5IDIuMjQgd2hlbiB0aGVyZSBpcyBhIDcwIG1pbGUgcGVyIGhvdXIgKG9yIGhpZ2hlcikgc3BlZWQgbGltaXQuIA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnpsaXN0MyA8LSB6ZWxpZyhmYXRhbGl0aWVzIH4gc2VhdGJlbHQgKyBpbmNvbWUgKyBhbGNvaG9sICsgc3BlZWQ3MCwgbW9kZWwgPSAibHMiLCBkYXRhID0gVVNTZWF0QmVsdHMyLCBjaXRlID0gRikNCmBgYA0KDQpgYGB7ciByZXN1bHRzPSdhc2lzJywgZWNobz1GQUxTRX0NCmxpYnJhcnkodGV4cmVnKQ0KaHRtbHJlZyAoemxpc3QzKQ0KYGBgDQoNCg0KYGBge3J9DQp6bGlzdDMkc2V0eCgpDQp6bGlzdDMkc2ltKCkNCnBsb3Qoemxpc3QzKQ0KYGBgDQoNCi0tLQ0KDQojI0VzdGltYXRpbmcgdGhlIE1vZGVsIHdpdGggTXVsdGlwbGUgSW1wdXRhdGlvbg0KDQojIyNDcmVhdGluZyBNdWx0aXBsZSBJbXB1dGF0aW9ucyB3aXRoICpBbWVsaWEqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShBbWVsaWEpDQpsaWJyYXJ5KFplbGlnKQ0KYGBgDQoNCg0KYGBge3J9DQojI0ltcHV0YXRpb24gb3V0cHV0IGV4Y2x1ZGVkIGR1ZSB0byBsZW5ndGggDQoNCmEub3V0IDwtIGFtZWxpYShVU1NlYXRCZWx0czIsIG09MTAsIHRzPSJ5ZWFyIiwgY3MgPSAic3RhdGUiLCBsb2dzID0gImluY29tZSIsIA0KICAgICAgICAgICAgICAgIG5vbXMgPSBjKCJzcGVlZDcwIiwgImFsY29ob2wiKSwNCiAgICAgICAgICAgICAgICBwb2x5dGltZSA9IDIsIGludGVyY3M9VFJVRSkNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoYS5vdXQpDQpgYGANCg0KLS0tDQoNCiMjI01JIG1vZGVsIFJlc3VsdHMgDQoNCldpdGggbXVsdGlwbGUgaW1wdXRhdGlvbiwgdGhlIHJlc3VsdHMgYmVsb3cgaW5kaWNhdGUgdGhhdCBhIG9uZSB1bml0IGluY3JlYXNlIGluIHNlYXRiZWx0IHVzYWdlIHJhdGUgZGVjcmVhc2VzIGZhdGFsaXRpZXMgYnkgLjk1LCBob3dldmVyIHRoZSB2YXJpYWJsZSBpcyBub3Qgc2lnbmlmaWNhbnQuIE5vdGUgdGhhdCBpdCB3YXMgdGhlIG90aGVyIHdheSBhcm91bmQgaW4gdGhlIGxpc3R3aXNlIGRlbGV0aW9uIG1ldGhvZCwgaW4gd2hpY2ggYW4gaW5jcmVhc2UgaW4gc2VhdGJlbHQgdXNlIGluY3JlYXNlZCB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMuIE9uZSB1bml0IGluY3JlYXNlIGluIG1lZGlhbiBpbmNvbWUgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYnkgLjAwMDguIFdlIGNhbiBhbHNvIHByZWRpY3QgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIHRvIGRyb3AgYnkgMS45MSBpbiBzdGF0ZXMgd2hlbiB0aGVyZSBpcyBhIG1pbmltdW0gZHJpbmtpbmcgYWdlIG9mIDIxIGluIGVmZmVjdCwgYW5kIHRvIGluY3JlYXNlIGJ5IDIuMzQgd2hlbiB0aGVyZSBpcyBhIDcwIG1pbGUgcGVyIGhvdXIgKG9yIGhpZ2hlcikgc3BlZWQgbGltaXQgaW4gcGxhY2UuIEkgd2lsbCBsYXRlciBjb21wYXJlIHRoZXNlIHJlc3VsdHMgd2l0aCB0aG9zZSBvZiB0aGUgbGlzdHdpc2UgZGVsZXRpb24gbW9kZWwuIA0KDQpgYGB7cn0NCnoub3V0JHplbGlnKGZhdGFsaXRpZXMgfiBzZWF0YmVsdCArIGluY29tZSArIGFsY29ob2wgKyBzcGVlZDcwLCBkYXRhID0gYS5vdXQpDQpzdW1tYXJ5KHoub3V0KQ0KYGBgDQoNCmBgYHtyfQ0Kei5vdXQkc2V0eCgpDQp6Lm91dCRzaW0oKQ0KcGxvdCh6Lm91dCkNCmBgYA0KDQotLS0NCg0KIyNDb21wYXJpbmcgUmVzdWx0cyBCeSBNaXNzaW5nIERhdGEgTWV0aG9kczogTGlzdHdpc2UgRGVsZXRpb24gdnMgTUkgTWV0aG9kICAgDQoNClRoZSByZXN1bHRzIGZyb20gdGhlIHR3byBtZXRob2RzIHNob3cgaW50ZXJlc3RpbmcgZGlmZmVyZW5jZXMsIHNwZWNpZmljYWxseSBpbiB0aGUgdmFyaWFibGUgJ3NlYXRiZWx0JyhyZXByZXNlbnRpbmcgc2VhdGJlbHQgdXNhZ2UgcmF0ZSBwZXIgc3RhdGUpIGFzIHRoaXMgaXMgdGhlIG9ubHkgdmFyaWFibGUgd2l0aCBtaXNzaW5nIHZhbHVlcy4gRGVzcGl0ZSB0aGUgcmVsYXRpb25zaGlwIGJlaW5nIGluc2lnbmlmaWNhbnQgaW4gYm90aCBtZXRob2RzLCB0aGUgbGlzdHdpc2UgZGVsZXRpb24gbWV0aG9kIHNob3dzIGFuIGluY3JlYXNlIGluIHNlYXRiZWx0IHVzYWdlIHJhdGVzIHRvICppbmNyZWFzZSogZmF0YWxpdGllcywgd2hlcmVhcyB0aGUgbXVsdGlwbGUgaW1wdXRhdGlvbiBtZXRob2Qgc2hvd3MgYW4gaW5jcmVhc2UgaW4gc2VhdGJlbHQgdXNhZ2UgcmF0ZXMgdG8gKmRlY3JlYXNlKiBmYXRhbGl0aWVzLCB3aGljaCBpcyBpbmRlZWQgbW9yZSBsb2dpY2FsLiBUaGlzIGlzIGEgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQgc3RvcnksIGFuZCBmdXJ0aGVyIGF0dGVzdHMgdG8gd2h5IHRoZSBNSSBtZXRob2QgaXMgcHJlZmVycmVkLiBBcyBmb3IgdGhlIHJlbWFpbmluZyBpbmRlcGVuZGVudCB2YXJpYWJsZXMsIHRoZSBkaWZmZXJlbmNlcyBpbiBjb2VmZmljaWVudHMgd2VyZSBuZWdsaWdpYmxlIGFzIHRoZXJlIHdlcmUgbm8gbWlzc2luZyBvYnNlcnZhdGlvbnMgaW4gdGhlc2UgdmFyaWFibGVzIHRvIGJlZ2luIHdpdGguIFVsdGltYXRlbHksIHRoZSBtdWx0aXBsZSBpbXB1dGF0aW9uIG1ldGhvZCBwcm9kdWNlcyBtdWNoIG1vcmUgcmVsaWFibGUgcmVzdWx0cyBhcyBpdCBjb25zaWRlcnMgbXVsdGlwbGUgcHJlZGljdGVkIHZhbHVlcyBhbmQgdGhlaXIgZGlzdHJpYnV0aW9uLiBDb21wYXJhdGl2ZWx5LCB0aGUgbGlzdHdpc2UgZGVsZXRpb24gbWV0aG9kIHNpbXBseSBkaXNyZWdhcmRzIGNhc2VzIHRoYXQgY291bGQgY29udGFpbiBpbXBvcnRhbnQgaW5mb3JtYXRpb24sIG1ha2luZyB0aGUgZmluZGluZ3MgbXVjaCBsZXNzIGNvbnZpbmNpbmcuIA0K