People are arguing a bit about who isn’t getting vaccinated in America. Are the unvaccinated mostly poor people worried about missing work, or are they Republicans who are too contrarian for their own good?

Matt Bruenig posted vaccination statistics from the Census’ Household Pulse Survey that provide some hints. The post was deleted, but here’s a screenshot:

Tweet text: An update on the vaccination situation from the last Census Household Pulse Survey covering the last half of August

The plots show that the unvaccinated are, on average, younger, poorer, less educated, and less white than vaccinated Americans.

Out of curiosity I decided to take a closer look. The Census provides the raw response data (here), so it’s not much trouble to run your own analysis.

The most useful feature in this data, in regard to this debate, is a question asking unvaccinated respondents why they didn’t get a vaccine, allowing respondents to select multiple reasons from a list. The results clearly refute one side of the debate: a measly 2% of respondents say that the vaccine is hard to get, and only 3% are (incorrectly) worried about the cost. The responses are shown below:

The responses to this question show that resistance to vaccination is overwhelmingly driven by doubts about the vaccine and mistrust of vaccine promoters, and that lack of access is almost a negligible issue. A small minority, 8% of respondents, say their doctor doesn’t recommend taking the vaccine.

Another question is what drives the mistrust of vaccines. The obvious answer is right-wing media, but the summary statistics appear to contradict that. Instead, the unvaccinated are more likely to be part of groups (the young, the poor, racial minorities) that tend to vote for Democrats. I don’t see strong reasons for doubting these results– the standard errors of the estimates are small due to the large sample size. Nonresponse bias could also be a problem, but it’s not clear why it would bias the results in these directions.

To get a better handle on this, I trained a random forest model in R to predict vaccination status.1 Using the model, we can look to see which variables best predict vaccine hesitancy. Here’s what R tells us about the trained model:

## 
## Call:
##  randomForest(formula = vaccinated ~ ., data = train) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 12
## 
##         OOB estimate of  error rate: 11.89%
## Confusion matrix:
##       FALSE  TRUE class.error
## FALSE   230  5550 0.960207612
## TRUE    100 41637 0.002395956

What stands out here is that the model isn’t good at predicting lack of vaccination. It correctly predicts the status of the vaccinated nearly 100% of the time, but it only correctly predicts lack of vaccination 4% of the time. This suggests that the Census Pulse Survey is missing important variables. My hunch is that the missing variables are political.

When training this kind of model, it’s a good idea to check for overfitting. The error rates in my training and testing datasets are nearly the same, so it’s not an issue here.

## Prediction error rates (%):
##    train     test 
## 11.89048 11.92283

Now that we’ve checked that the model is OK, we can see what the most important predictors are. I plot them below, starting with the most important:

A few interesting results: State, probably a proxy for politics, has by far the most influence. Race doesn’t seem important after accounting for other demographic variables. (Racial differences in skepticism caused by the Tuskegee experiment, for example, don’t appear to be important.) Although the survey includes a question about health insurance, that question is not an important predictor– directly contradicting recent speculation by Zeynep Tufekci in a NYTimes op-ed.

What jumps out to me about this list of predictors is that they’re nearly all associated with either political leanings or levels of political knowledge (or both). Income and education, in particular, are both associated with political knowledge (see here for example).

We can get further information by looking at the partial effects of each variable. These effects represent the influence each variable has on the predicted outcome, when changed independently of the other variables. In this model, higher values imply a higher probability of getting vaccinated.

The two graphs below show that state partial effects are closely correlated with Donald Trump’s vote share in the 2020 election, suggesting that state is working as a proxy for politics. (Though there are other explanations that could also contribute to this pattern.)

(I got this vote share data from the MIT Election Data and Science Lab.)

Given that lower incomes are associated with voting for Democrats, you might expect lower income to be associated with higher vaccination rates, but the opposite is true:

But let’s take a closer look at that. For reference, here are the vote shares for Trump by income, taken from the Cooperative Congressional Election Study (CCES):

Lower income voters were less likely to vote for Trump in 2020, but the effect isn’t huge, especially for households with incomes between $20,000 and $150,000. It wouldn’t be surprising for this effect to be overshadowed by the association of lower incomes with lower levels of political knowledge.

One oddball predictor, a question about COVID diagnoses, doesn’t seem related to either politics or political knowledge. It turns out that those who have been diagnosed with COVID are less likely to get vaccinated. This suggests that practical concerns may also play a role, with people who think they have lower risks (young people, the previously infected) getting vaccinated at lower rates. That’s consistent with some of the popular reasons given above, “I don’t believe I need a COVID-19 vaccine” and “I don’t think COVID-19 is that big of a threat”.

So to me it doesn’t look like people fail to get vaccinated as a direct result of the hardships of being poor or lack of health insurance or anything like that. Instead it looks like the unvaccinated are poorly informed people making a bad decision. It looks like right-wing political leanings often play into those bad decisions. And it looks like being part of a lower risk group can also play a role.


  1. The random forest method generates a collection of decision trees, and the trees are used to make predictions. Decision trees are much more flexible than tools like linear regression, so I don’t need to make strong assumptions about how vaccine resistance works to get these predictions.↩︎

LS0tCnRpdGxlOiAiV2hvJ3Mgbm90IHZhY2NpbmF0ZWQgYW5kIHdoeT8gKENlbnN1cyBIb3VzZWhvbGQgUHVsc2UgU3VydmV5KSIKYXV0aG9yOiAiV2lsbGlhbSBNYXkiCmRhdGU6ICI5LzEyLzIwMjEiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYpCmxpYnJhcnkocmFuZG9tRm9yZXN0KQpsaWJyYXJ5KHBsb3RseSkKCiMgc3VydmV5IHJlc3BvbnNlcwpwdWxzZSA9IHJlYWQuY3N2KCdkYXRhL3B1bHNlMjAyMV9wdWZfMzUuY3N2JykKbmFtZXMocHVsc2UpID0gdG9sb3dlcihuYW1lcyhwdWxzZSkpCgojIGdldCBkYXRhIGRpY3Rpb25hcnkgZnJvbSBleGNlbCBmaWxlIHdpdGggbm9uc3RhbmRhcmQgZm9ybWF0dGluZwpkZGljdCA9IHJlYWQuY3N2KCdkYXRhL3B1bHNlMjAyMV9kYXRhLmRpY3Rpb25hcnlfQ1NWXzM1LmNzdicsIHNraXAgPSA0LAogICAgICAgICAgICAgICAgIG5hLnN0cmluZ3MgPSAnJywgY2hlY2submFtZXMgPSBGKQpkZGljdCA9IHN1YnNldChkZGljdCwgIWlzLm5hKFZhcmlhYmxlKSkKIyBmaXggd2VpcmQgY29sdW1uIGlzc3VlLCBhbiBhcnRpZmFjdCBvZiB0aGUgZm9ybWF0IGluIGV4Y2VsCmRkaWN0JERlc2NyaXB0aW9uID0gZGRpY3RbLCA0XQpkZGljdCA9IGRkaWN0WywgLTRdCmBgYAoKUGVvcGxlIGFyZSBhcmd1aW5nIGEgYml0IGFib3V0IHdobyBpc24ndCBnZXR0aW5nIHZhY2NpbmF0ZWQgaW4gQW1lcmljYS4gQXJlIHRoZQp1bnZhY2NpbmF0ZWQgbW9zdGx5IHBvb3IgcGVvcGxlIHdvcnJpZWQgYWJvdXQgbWlzc2luZyB3b3JrLCBvciBhcmUgdGhleQpSZXB1YmxpY2FucyB3aG8gYXJlIHRvbyBjb250cmFyaWFuIGZvciB0aGVpciBvd24gZ29vZD8KCk1hdHQgQnJ1ZW5pZyBwb3N0ZWQgdmFjY2luYXRpb24gc3RhdGlzdGljcyBmcm9tIHRoZSBDZW5zdXMnIEhvdXNlaG9sZCBQdWxzZQpTdXJ2ZXkgdGhhdCBwcm92aWRlIHNvbWUgaGludHMuIFRoZSBwb3N0IHdhcyBkZWxldGVkLCBidXQgaGVyZSdzIGEgc2NyZWVuc2hvdDoKCiFbVHdlZXQgdGV4dDogQW4gdXBkYXRlIG9uIHRoZSB2YWNjaW5hdGlvbiBzaXR1YXRpb24gZnJvbSB0aGUgbGFzdCBDZW5zdXMKSG91c2Vob2xkIFB1bHNlIFN1cnZleSBjb3ZlcmluZyB0aGUgbGFzdCBoYWxmIG9mIEF1Z3VzdF0oaW1nL2JydWVuaWdfcHVsc2UucG5nKQogXAoKVGhlIHBsb3RzIHNob3cgdGhhdCB0aGUgdW52YWNjaW5hdGVkIGFyZSwgb24gYXZlcmFnZSwgeW91bmdlciwgcG9vcmVyLCBsZXNzCmVkdWNhdGVkLCBhbmQgbGVzcyB3aGl0ZSB0aGFuIHZhY2NpbmF0ZWQgQW1lcmljYW5zLgoKT3V0IG9mIGN1cmlvc2l0eSBJIGRlY2lkZWQgdG8gdGFrZSBhIGNsb3NlciBsb29rLiBUaGUgQ2Vuc3VzIHByb3ZpZGVzIHRoZSByYXcKcmVzcG9uc2UgZGF0YQooW2hlcmVdKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9ob3VzZWhvbGQtcHVsc2Utc3VydmV5L2RhdGFzZXRzLmh0bWwpKSwKc28gaXQncyBub3QgbXVjaCB0cm91YmxlIHRvIHJ1biB5b3VyIG93biBhbmFseXNpcy4KCmBgYHtyIHJlYXNvbnMsIGluY2x1ZGU9RkFMU0V9CnVudmFjYyA9IHB1bHNlW3B1bHNlJGRvc2VzcnYgPT0gMyB8IHB1bHNlJGdldHZhY3J2ICVpbiUgMjo1LCBdCndoeW5vdCA9IGFzLm1hdHJpeCh1bnZhY2NbLCBncmVwKCd3aHlub3J2JywgbmFtZXMocHVsc2UpKV0pID09IDEKd2h5bm90X3BjdCA9IDEwMCAqIGNvbFN1bXMod2h5bm90ICogdW52YWNjJHB3ZWlnaHQpIC8gc3VtKHVudmFjYyRwd2VpZ2h0KQp3aHlub3Rfc3RyID0gYXMuY2hhcmFjdGVyKHJvdW5kKHdoeW5vdF9wY3QpKQpgYGAKClRoZSBtb3N0IHVzZWZ1bCBmZWF0dXJlIGluIHRoaXMgZGF0YSwgaW4gcmVnYXJkIHRvIHRoaXMgZGViYXRlLCBpcyBhIHF1ZXN0aW9uCmFza2luZyB1bnZhY2NpbmF0ZWQgcmVzcG9uZGVudHMgd2h5IHRoZXkgZGlkbid0IGdldCBhIHZhY2NpbmUsIGFsbG93aW5nCnJlc3BvbmRlbnRzIHRvIHNlbGVjdCBtdWx0aXBsZSByZWFzb25zIGZyb20gYSBsaXN0LiBUaGUgcmVzdWx0cyBjbGVhcmx5IHJlZnV0ZQpvbmUgc2lkZSBvZiB0aGUgZGViYXRlOiBhIG1lYXNseSBgciB3aHlub3Rfc3RyWzEwXWAlIG9mIHJlc3BvbmRlbnRzIHNheSB0aGF0CnRoZSB2YWNjaW5lIGlzIGhhcmQgdG8gZ2V0LCBhbmQgb25seSBgciB3aHlub3Rfc3RyWzZdYCUgYXJlIChpbmNvcnJlY3RseSkKd29ycmllZCBhYm91dCB0aGUgY29zdC4gVGhlIHJlc3BvbnNlcyBhcmUgc2hvd24gYmVsb3c6CgoKYGBge3IgcmVhc29uc3Bsb3QsIGZpZy5oZWlnaHQgPSA3LjgsIGZpZy53aWR0aCA9IDd9CnJlYXNvbnMgPSBjKAogICAgIkkgYW0gY29uY2VybmVkIGFib3V0IHBvc3NpYmxlIHNpZGUgZWZmZWN0cyBvZiBhIENPVklELTE5IHZhY2NpbmUiLAogICAgIkkgZG9uJ3Qga25vdyBpZiBhIENPVklELTE5IHZhY2NpbmUgd2lsbCBwcm90ZWN0IG1lIiwKICAgICJJIGRvbid0IGJlbGlldmUgSSBuZWVkIGEgQ09WSUQtMTkgdmFjY2luZSIsCiAgICAiTXkgZG9jdG9yIGhhcyBub3QgcmVjb21tZW5kZWQgaXQiLAogICAgIkkgcGxhbiB0byB3YWl0IGFuZCBzZWUgaWYgaXQgaXMgc2FmZSBhbmQgbWF5IGdldCBpdCBsYXRlciIsCiAgICAiSSBhbSBjb25jZXJuZWQgYWJvdXQgdGhlIGNvc3Qgb2YgYSBDT1ZJRC0xOSB2YWNjaW5lIiwKICAgICJJIGRvbid0IHRydXN0IENPVklELTE5IHZhY2NpbmVzIiwKICAgICJJIGRvbid0IHRydXN0IHRoZSBnb3Zlcm5tZW50IiwKICAgICJJIGRvbid0IHRoaW5rIENPVklELTE5IGlzIHRoYXQgYmlnIG9mIGEgdGhyZWF0IiwKICAgICJJdCdzIGhhcmQgZm9yIG1lIHRvIGdldCBhIENPVklELTE5IHZhY2NpbmUiLAogICAgIkkgYmVsaWV2ZSBvbmUgZG9zZSBpcyBlbm91Z2ggdG8gcHJvdGVjdCBtZSIsCiAgICAiSSBleHBlcmllbmNlZCBzaWRlIGVmZmVjdHMgZnJvbSB0aGUgZG9zZSBvZiBDT1ZJRC0xOSB2YWNjaW5lIEkgcmVjZWl2ZWQiLAogICAgIm90aGVyIgopCm5hbWVzKHdoeW5vdF9wY3QpID0gcmVhc29ucwp3aHlub3RfcGN0ID0gc29ydCh3aHlub3RfcGN0KQoKcGFyKG1hciA9IGMoNS4xLCAxNi4xLCA0LjEsIDIuMSkpCmxhYmVscyA9IHNhcHBseShzdHJ3cmFwKG5hbWVzKHdoeW5vdF9wY3QpLCB3aWR0aCA9IDQwLCBzaW1wbGlmeSA9IEYpLCBwYXN0ZSwKICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gJ1xuJykKYmFycGxvdCh3aHlub3RfcGN0LCBuYW1lcy5hcmcgPSBsYWJlbHMsIGhvcml6ID0gVCwgY29sID0gTkEsIGJvcmRlciA9IE5BLAogICAgICAgIG1haW4gPSAnUmVhc29ucyBmb3Igbm90IGdldHRpbmcgZnVsbHkgdmFjY2luYXRlZCcsCiAgICAgICAgeGxhYiA9ICclIG9mIHJlc3BvbmRlbnRzJywgeGxpbSA9IGMoMCwgMS4xICogbWF4KHdoeW5vdF9wY3QpKSwgbGFzID0gMSkKZ3JpZChueSA9IE5BKQpiYXJwbG90KHdoeW5vdF9wY3QsIG5hbWVzLmFyZyA9ICcnLCBob3JpeiA9IFQsIGF4ZXMgPSBGLCBsYXMgPSAxLCBhZGQgPSBUKQpgYGAKClRoZSByZXNwb25zZXMgdG8gdGhpcyBxdWVzdGlvbiBzaG93IHRoYXQgcmVzaXN0YW5jZSB0byB2YWNjaW5hdGlvbiBpcwpvdmVyd2hlbG1pbmdseSBkcml2ZW4gYnkgZG91YnRzIGFib3V0IHRoZSB2YWNjaW5lIGFuZCBtaXN0cnVzdCBvZiB2YWNjaW5lCnByb21vdGVycywgYW5kIHRoYXQgbGFjayBvZiBhY2Nlc3MgaXMgYWxtb3N0IGEgbmVnbGlnaWJsZSBpc3N1ZS4gQSBzbWFsbAptaW5vcml0eSwgYHIgd2h5bm90X3N0cls0XWAlIG9mIHJlc3BvbmRlbnRzLCBzYXkgdGhlaXIgZG9jdG9yIGRvZXNuJ3QgcmVjb21tZW5kCnRha2luZyB0aGUgdmFjY2luZS4KCkFub3RoZXIgcXVlc3Rpb24gaXMgd2hhdCBkcml2ZXMgdGhlIG1pc3RydXN0IG9mIHZhY2NpbmVzLiBUaGUgb2J2aW91cyBhbnN3ZXIgaXMKcmlnaHQtd2luZyBtZWRpYSwgYnV0IHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYXBwZWFyIHRvIGNvbnRyYWRpY3QgdGhhdC4gSW5zdGVhZCwKdGhlIHVudmFjY2luYXRlZCBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgcGFydCBvZiBncm91cHMgKHRoZSB5b3VuZywgdGhlIHBvb3IsCnJhY2lhbCBtaW5vcml0aWVzKSB0aGF0IHRlbmQgdG8gdm90ZSBmb3IgRGVtb2NyYXRzLiBJIGRvbid0IHNlZSBzdHJvbmcgcmVhc29ucwpmb3IgZG91YnRpbmcgdGhlc2UgcmVzdWx0cy0tIHRoZSBzdGFuZGFyZCBlcnJvcnMgb2YgdGhlIGVzdGltYXRlcyBhcmUgc21hbGwgZHVlCnRvIHRoZSBsYXJnZSBzYW1wbGUgc2l6ZS4gTm9ucmVzcG9uc2UgYmlhcyBjb3VsZCBhbHNvIGJlIGEgcHJvYmxlbSwgYnV0IGl0J3Mgbm90CmNsZWFyIHdoeSBpdCB3b3VsZCBiaWFzIHRoZSByZXN1bHRzIGluIHRoZXNlIGRpcmVjdGlvbnMuCgpUbyBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHRoaXMsIEkgdHJhaW5lZCBhIHJhbmRvbSBmb3Jlc3QgbW9kZWwgaW4gUiB0byBwcmVkaWN0CnZhY2NpbmF0aW9uIHN0YXR1cy5bXnJhbmRvbWZvcmVzdF0gVXNpbmcgdGhlIG1vZGVsLCB3ZSBjYW4gbG9vayB0byBzZWUgd2hpY2gKdmFyaWFibGVzIGJlc3QgcHJlZGljdCB2YWNjaW5lIGhlc2l0YW5jeS4gSGVyZSdzIHdoYXQgUiB0ZWxscyB1cyBhYm91dCB0aGUKdHJhaW5lZCBtb2RlbDoKCltecmFuZG9tZm9yZXN0XTogVGhlIHJhbmRvbSBmb3Jlc3QgbWV0aG9kIGdlbmVyYXRlcyBhIGNvbGxlY3Rpb24gb2YgZGVjaXNpb24KdHJlZXMsIGFuZCB0aGUgdHJlZXMgYXJlIHVzZWQgdG8gbWFrZSBwcmVkaWN0aW9ucy4gRGVjaXNpb24gdHJlZXMgYXJlIG11Y2ggbW9yZQpmbGV4aWJsZSB0aGFuIHRvb2xzIGxpa2UgbGluZWFyIHJlZ3Jlc3Npb24sIHNvIEkgZG9uJ3QgbmVlZCB0byBtYWtlIHN0cm9uZwphc3N1bXB0aW9ucyBhYm91dCBob3cgdmFjY2luZSByZXNpc3RhbmNlIHdvcmtzIHRvIGdldCB0aGVzZSBwcmVkaWN0aW9ucy4KCmBgYHtyIHJhbmRvbWZvcmVzdCwgY2FjaGU9VFJVRX0KIyBtYWtlIGEgYmluYXJ5IHZhY2NpbmF0ZWQgdmFyaWFibGUKcHVsc2UkdmFjY2luYXRlZCA9IHB1bHNlJHJlY3ZkdmFjYyA9PSAxCnB1bHNlJHZhY2NpbmF0ZWRbIXB1bHNlJHJlY3ZkdmFjYyAlaW4lIDE6Ml0gPSBOQQojIHJlbW92ZSBjb2x1bW5zIHRoYXQgZG9uJ3QgbWFrZSBzZW5zZSBhcyB2YWNjaW5lIHByZWRpY3RvcnMgb3IgdGhhdCBhcmUKIyByZWR1bmRhbnQKdW53YW50ZWQgPSBjKCdzY3JhbScsICd3ZWVrJywgJ2h3ZWlnaHQnLCAncHdlaWdodCcsICdyZWN2ZHZhY2MnLCAnZG9zZXNydicsCiAgICAgICAgICAgICAnZ2V0dmFjcnYnLCAna2lkZG9zZXMnLCAna2lkZ2V0dmFjJykKa2VlcGNvbCA9ICFuYW1lcyhwdWxzZSkgJWluJSB1bndhbnRlZCAmICFncmVwbCgnd2h5bm9ydnxraWR3aHlubycsIG5hbWVzKHB1bHNlKSkKcHVsc2VyZiA9IHB1bHNlWyFpcy5uYShwdWxzZSR2YWNjaW5hdGVkKSwga2VlcGNvbF0KIyBzb21lIHJlc3BvbmRlbnRzIGFyZW4ndCBpbiBtZXRyb3BvbGl0YW4gYXJlYXMgYW5kIHRoYXQncyBmaW5lCnB1bHNlcmYkZXN0X21zYVtpcy5uYShwdWxzZXJmJGVzdF9tc2EpXSA9ICdOQScKIyBtb3N0IGNvbHVtbnMgc2hvdWxkIGJlIGZhY3RvcnMKZm9yIChjb2wgaW4gbmFtZXMocHVsc2VyZikpIHsKICBpZiAoY29sICE9ICd0YmlydGhfeWVhcicgJiYgIXN0YXJ0c1dpdGgoY29sLCAndGhobGRfbnVtJykpIHsKICAgIHB1bHNlcmZbLCBjb2xdID0gYXMuZmFjdG9yKHB1bHNlcmZbLCBjb2xdKQogIH0KfQojIHNwbGl0IGludG8gdHJhaW5pbmcgYW5kIHRlc3RpbmcgZGF0YXNldHMKc2V0LnNlZWQoNTAwKQppbmQgPSBzYW1wbGUoMiwgbnJvdyhwdWxzZXJmKSwgcmVwbGFjZSA9IFQsIHByb2IgPSBjKDAuNywgMC4zKSkKdHJhaW4gPSBwdWxzZXJmW2luZCA9PSAxLCBdCnRlc3QgPSBwdWxzZXJmW2luZCA9PSAyLCBdCiMgQmUgcHJlcGFyZWQgdG8gd2FpdCBhYm91dCA0IG1pbnV0ZXMgZm9yIHRoaXMuCnJmID0gcmFuZG9tRm9yZXN0KHZhY2NpbmF0ZWQgfiAuLCBkYXRhID0gdHJhaW4pCnJmCmBgYAoKYGBge3IgcmZhY2N1cmFjeX0KY29ycmVjdF9mYWxzZV9wY3QgPSAxMDAgKiAoMSAtIHJmJGNvbmZ1c2lvblsnRkFMU0UnLCAnY2xhc3MuZXJyb3InXSkKY29ycmVjdF9mYWxzZV9zdHIgPSBhcy5jaGFyYWN0ZXIocm91bmQoY29ycmVjdF9mYWxzZV9wY3QpKQpgYGAKCldoYXQgc3RhbmRzIG91dCBoZXJlIGlzIHRoYXQgdGhlIG1vZGVsIGlzbid0IGdvb2QgYXQgcHJlZGljdGluZyBsYWNrIG9mCnZhY2NpbmF0aW9uLiBJdCBjb3JyZWN0bHkgcHJlZGljdHMgdGhlIHN0YXR1cyBvZiB0aGUgdmFjY2luYXRlZCBuZWFybHkgMTAwJSBvZgp0aGUgdGltZSwgYnV0IGl0IG9ubHkgY29ycmVjdGx5IHByZWRpY3RzIGxhY2sgb2YgdmFjY2luYXRpb24KYHIgY29ycmVjdF9mYWxzZV9zdHJgJSBvZiB0aGUgdGltZS4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSBDZW5zdXMgUHVsc2UgU3VydmV5IGlzCm1pc3NpbmcgaW1wb3J0YW50IHZhcmlhYmxlcy4gTXkgaHVuY2ggaXMgdGhhdCB0aGUgbWlzc2luZyB2YXJpYWJsZXMgYXJlCnBvbGl0aWNhbC4KCldoZW4gdHJhaW5pbmcgdGhpcyBraW5kIG9mIG1vZGVsLCBpdCdzIGEgZ29vZCBpZGVhIHRvIGNoZWNrIGZvciBvdmVyZml0dGluZy4gVGhlCmVycm9yIHJhdGVzIGluIG15IHRyYWluaW5nIGFuZCB0ZXN0aW5nIGRhdGFzZXRzIGFyZSBuZWFybHkgdGhlIHNhbWUsIHNvIGl0J3Mgbm90CmFuIGlzc3VlIGhlcmUuCgpgYGB7ciBvdmVyZml0LCBjb2xsYXBzZT1UUlVFLCByZXN1bHRzPSJob2xkIn0KIyBjaGVjayB0cmFpbiB2cyB0ZXN0IGFjY3VyYWNpZXMKcHRlc3QgPSBwcmVkaWN0KHJmLCB0ZXN0KQp0ZXN0X2Vycm9yID0gbWVhbihwdGVzdCAhPSB0ZXN0JHZhY2NpbmF0ZWQpICogMTAwCnRyYWluX2Vycm9yID0gcmYkZXJyLnJhdGVbcmYkbnRyZWUsICJPT0IiXSAqIDEwMApvb2JfZXJyb3IgPSBzZXROYW1lcyhjKHRyYWluX2Vycm9yLCB0ZXN0X2Vycm9yKSwgYygndHJhaW4nLCAndGVzdCcpKQptZXNzYWdlKCdQcmVkaWN0aW9uIGVycm9yIHJhdGVzICglKTonKQpwcmludChvb2JfZXJyb3IpCmBgYAoKTm93IHRoYXQgd2UndmUgY2hlY2tlZCB0aGF0IHRoZSBtb2RlbCBpcyBPSywgd2UgY2FuIHNlZSB3aGF0IHRoZSBtb3N0IGltcG9ydGFudApwcmVkaWN0b3JzIGFyZS4gSSBwbG90IHRoZW0gYmVsb3csIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgaW1wb3J0YW50OgoKYGBge3IgaW1wb3J0YW5jZSwgZmlnLmhlaWdodD01LjUsIGZpZy53aWR0aD04LjV9CiMgdXNlIHZhcmlhYmxlIGRlc2NyaXB0aW9uIGZvciBsYWJlbHMKbi52YXIgPSAxNQp0b3BfdmFycyA9CiAgcm93Lm5hbWVzKHJmJGltcG9ydGFuY2UpW29yZGVyKHJmJGltcG9ydGFuY2UsIGRlY3JlYXNpbmcgPSBUKVsxOm4udmFyXV0KbGFiZWxzID0gZGRpY3QkRGVzY3JpcHRpb25bbWF0Y2godG9wX3ZhcnMsIHRvbG93ZXIoZGRpY3QkVmFyaWFibGUpKV0KdmFySW1wUGxvdChyZiwgbi52YXIgPSAxNSwgbWFpbiA9ICdSYW5kb20gZm9yZXN0IHZhcmlhYmxlIGltcG9ydGFuY2UnLAogICAgICAgICAgIGxhYmVscyA9IHJldihsYWJlbHMpKQpgYGAKCkEgZmV3IGludGVyZXN0aW5nIHJlc3VsdHM6IFN0YXRlLCBwcm9iYWJseSBhIHByb3h5IGZvciBwb2xpdGljcywgaGFzIGJ5IGZhciB0aGUKbW9zdCBpbmZsdWVuY2UuIFJhY2UgZG9lc24ndCBzZWVtIGltcG9ydGFudCBhZnRlciBhY2NvdW50aW5nIGZvciBvdGhlcgpkZW1vZ3JhcGhpYyB2YXJpYWJsZXMuIChSYWNpYWwgZGlmZmVyZW5jZXMgaW4gc2tlcHRpY2lzbSBjYXVzZWQgYnkgdGhlIFR1c2tlZ2VlCmV4cGVyaW1lbnQsIGZvciBleGFtcGxlLCBkb24ndCBhcHBlYXIgdG8gYmUgaW1wb3J0YW50LikgQWx0aG91Z2ggdGhlIHN1cnZleQppbmNsdWRlcyBhIHF1ZXN0aW9uIGFib3V0IGhlYWx0aCBpbnN1cmFuY2UsIHRoYXQgcXVlc3Rpb24gaXMgbm90IGFuIGltcG9ydGFudApwcmVkaWN0b3ItLSBkaXJlY3RseSBjb250cmFkaWN0aW5nIHJlY2VudCBzcGVjdWxhdGlvbiBieSBaZXluZXAgVHVmZWtjaSBpbiBbYQpOWVRpbWVzCm9wLWVkXShodHRwczovL3d3dy5ueXRpbWVzLmNvbS8yMDIxLzEwLzE1L29waW5pb24vY292aWQtdmFjY2luZXMtdW52YWNjaW5hdGVkLmh0bWwpLgoKV2hhdCBqdW1wcyBvdXQgdG8gbWUgYWJvdXQgdGhpcyBsaXN0IG9mIHByZWRpY3RvcnMgaXMgdGhhdCB0aGV5J3JlIG5lYXJseSBhbGwKYXNzb2NpYXRlZCB3aXRoIGVpdGhlciBwb2xpdGljYWwgbGVhbmluZ3Mgb3IgbGV2ZWxzIG9mIHBvbGl0aWNhbCBrbm93bGVkZ2UgKG9yCmJvdGgpLiBJbmNvbWUgYW5kIGVkdWNhdGlvbiwgaW4gcGFydGljdWxhciwgYXJlIGJvdGggYXNzb2NpYXRlZCB3aXRoIHBvbGl0aWNhbAprbm93bGVkZ2UgKHNlZQpbaGVyZV0oaHR0cHM6Ly9taXRzbG9hbi5taXQuZWR1L2lkZWFzLW1hZGUtdG8tbWF0dGVyL3ZvdGVycy1rbm93bGVkZ2UtcG9saXRpY2FsLW5ld3MtdmFyaWVzLXdpZGVseS1zdHVkeS1zaG93cykKZm9yIGV4YW1wbGUpLgoKV2UgY2FuIGdldCBmdXJ0aGVyIGluZm9ybWF0aW9uIGJ5IGxvb2tpbmcgYXQgdGhlIHBhcnRpYWwgZWZmZWN0cyBvZiBlYWNoCnZhcmlhYmxlLiBUaGVzZSBlZmZlY3RzIHJlcHJlc2VudCB0aGUgaW5mbHVlbmNlIGVhY2ggdmFyaWFibGUgaGFzIG9uIHRoZQpwcmVkaWN0ZWQgb3V0Y29tZSwgd2hlbiBjaGFuZ2VkIGluZGVwZW5kZW50bHkgb2YgdGhlIG90aGVyIHZhcmlhYmxlcy4gSW4gdGhpcwptb2RlbCwgaGlnaGVyIHZhbHVlcyBpbXBseSBhIGhpZ2hlciBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nIHZhY2NpbmF0ZWQuCgpUaGUgdHdvIGdyYXBocyBiZWxvdyBzaG93IHRoYXQgc3RhdGUgcGFydGlhbCBlZmZlY3RzIGFyZSBjbG9zZWx5IGNvcnJlbGF0ZWQgd2l0aApEb25hbGQgVHJ1bXAncyB2b3RlIHNoYXJlIGluIHRoZSAyMDIwIGVsZWN0aW9uLCBzdWdnZXN0aW5nIHRoYXQgc3RhdGUgaXMgd29ya2luZwphcyBhIHByb3h5IGZvciBwb2xpdGljcy4gKFRob3VnaCB0aGVyZSBhcmUgb3RoZXIgZXhwbGFuYXRpb25zIHRoYXQgY291bGQgYWxzbwpjb250cmlidXRlIHRvIHRoaXMgcGF0dGVybi4pCgpgYGB7ciBzdGF0ZXMsIGNhY2hlPVRSVUV9CnN0YXRlX3BhcnRpYWxzID0gYXMuZGF0YS5mcmFtZShwYXJ0aWFsUGxvdChyZiwgdHJhaW4sIGVzdF9zdCwgJ1RSVUUnLCBwbG90ID0gRikpCm5hbWVzKHN0YXRlX3BhcnRpYWxzKSA9IGMoJ2ZpcHMnLCAndmFsdWUnKQpgYGAKCmBgYHtyIGNob3JvcGxldGgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnN0YXRlcyA9IHJlYWQuY3N2KCdkYXRhL3N0YXRlLnR4dCcsIHNlcCA9ICd8JykKbmFtZXMoc3RhdGVzKSA9IHRvbG93ZXIobmFtZXMoc3RhdGVzKSkKCnN0YXRlX3BhcnRpYWxzJHN0YXRlID0gc3RhdGVzJHN0YXRlX25hbWVbbWF0Y2goc3RhdGVfcGFydGlhbHMkZmlwcywgc3RhdGVzJHN0YXRlKV0Kc3RhdGVfcGFydGlhbHMkYWJiciA9IHN0YXRlcyRzdHVzYWJbbWF0Y2goc3RhdGVfcGFydGlhbHMkZmlwcywgc3RhdGVzJHN0YXRlKV0KCmcgPSBsaXN0KHNjb3BlID0gJ3VzYScsIHByb2plY3Rpb24gPSBsaXN0KHR5cGUgPSAnYWxiZXJzIHVzYScpKQpwbG90X2dlbyhzdGF0ZV9wYXJ0aWFscywgbG9jYXRpb25tb2RlID0gJ1VTQS1zdGF0ZXMnKSAlPiUKICBhZGRfdHJhY2UoeiA9IH52YWx1ZSwgbG9jYXRpb25zID0gfmFiYnIsIGNvbG9yID0gfnZhbHVlLAogICAgICAgICAgICBjb2xvcnMgPSAnWWxHbkJ1JykgJT4lCiAgY29sb3JiYXIodGl0bGUgPSAncGFydGlhbCBlZmZlY3QnKSAlPiUKICBsYXlvdXQodGl0bGUgPSAnU3RhdGUgcGFydGlhbCBlZmZlY3RzIG9uIHZhY2NpbmF0aW9uJywKICAgICAgICAgZ2VvID0gZykKYGBgCgpgYGB7ciB2b3RlcywgbWVzc2FnZT1GQUxTRX0KcHJlcyA9IHJlYWQuY3N2KCdkYXRhLzE5NzYtMjAyMC1wcmVzaWRlbnQuY3N2JykKdHJ1bXAyMDIwID0gc3Vic2V0KHByZXMsIHllYXIgPT0gMjAyMCAmIGNhbmRpZGF0ZSA9PSAnVFJVTVAsIERPTkFMRCBKLicpCnRydW1wMjAyMCRzaGFyZSA9IHdpdGgodHJ1bXAyMDIwLCBjYW5kaWRhdGV2b3RlcyAvIHRvdGFsdm90ZXMpCgpzdGF0ZV9wYXJ0aWFscyR0cnVtcF9zaGFyZSA9CiAgdHJ1bXAyMDIwJHNoYXJlW21hdGNoKHN0YXRlX3BhcnRpYWxzJGZpcHMsIHRydW1wMjAyMCRzdGF0ZV9maXBzKV0KCnBsb3RfbHkoc3RhdGVfcGFydGlhbHMsIHggPSB+dHJ1bXBfc2hhcmUsIHkgPSB+dmFsdWUsIHRleHQgPSB+c3RhdGUpICU+JQogIGxheW91dCh0aXRsZSA9ICdTdGF0ZSBlZmZlY3RzIHZzIDIwMjAgVHJ1bXAgdm90ZSBzaGFyZScsCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdwYXJ0aWFsIGVmZmVjdCcpLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnMjAyMCBUcnVtcCB2b3RlIHNoYXJlJykpCmBgYAoKKEkgZ290IHRoaXMgdm90ZSBzaGFyZSBkYXRhIGZyb20gdGhlIFtNSVQgRWxlY3Rpb24gRGF0YSBhbmQgU2NpZW5jZQpMYWJdKGh0dHBzOi8vZGF0YXZlcnNlLmhhcnZhcmQuZWR1L2RhdGFzZXQueGh0bWw/cGVyc2lzdGVudElkPWRvaToxMC43OTEwL0RWTi80Mk1WRFgpLikKCkdpdmVuIHRoYXQgbG93ZXIgaW5jb21lcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHZvdGluZyBmb3IgRGVtb2NyYXRzLCB5b3UgbWlnaHQKZXhwZWN0IGxvd2VyIGluY29tZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggKmhpZ2hlciogdmFjY2luYXRpb24gcmF0ZXMsIGJ1dCB0aGUKb3Bwb3NpdGUgaXMgdHJ1ZToKCmBgYHtyIGluY29tZXBhcnRpYWwsIGNhY2hlPVRSVUV9CmluY29tZV9wYXJ0aWFscyA9IGFzLmRhdGEuZnJhbWUocGFydGlhbFBsb3QocmYsIHRyYWluLCBpbmNvbWUsICdUUlVFJywgcGxvdCA9IEYpKQppbmNvbWVfcGFydGlhbHMgPSBpbmNvbWVfcGFydGlhbHNbLSgxOjIpLCBdCmluY29tZV9sYWJlbHMgPSBjKAogICAgJ0xlc3MgdGhhbiAyNWsnLAogICAgJzI1IC0gMzVrJywKICAgICczNSAtIDUwaycsCiAgICAnNTAgLSA3NWsnLAogICAgJzc1IC0gMTAwaycsCiAgICAnMTAwIC0gMTUwaycsCiAgICAnMTUwIC0gMjAwaycsCiAgICAnMjAwaysnCikKcGFyKG1hciA9IGMoOS4xLCA0LjEsIDQuMSwgMi4xKSkKcGxvdChpbmNvbWVfcGFydGlhbHMsIHR5cGUgPSAnYicsIHhheHQgPSAnbicsIG1haW4gPSAnSW5jb21lIGVmZmVjdHMnLAogICAgIHhsYWIgPSAnJywgeWxhYiA9ICdwYXJ0aWFsIGVmZmVjdCcpCmF4aXMoMSwgYXQgPSAxOm5yb3coaW5jb21lX3BhcnRpYWxzKSwgbGFiZWxzID0gaW5jb21lX2xhYmVscywgbGFzID0gMikKYGBgCgpCdXQgbGV0J3MgdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoYXQuIEZvciByZWZlcmVuY2UsIGhlcmUgYXJlIHRoZSB2b3RlIHNoYXJlcwpmb3IgVHJ1bXAgYnkgaW5jb21lLCB0YWtlbiBmcm9tIHRoZSBbQ29vcGVyYXRpdmUgQ29uZ3Jlc3Npb25hbCBFbGVjdGlvbgpTdHVkeV0oaHR0cHM6Ly9jY2VzLmdvdi5oYXJ2YXJkLmVkdS8pIChDQ0VTKToKCmBgYHtyIGNjZXN0cnVtcH0KIyBkYXRhIGZyb20gdGhlIENDRVMgQ3J1bmNoIHRvb2w6IGh0dHBzOi8vY2Nlcy5nb3YuaGFydmFyZC5lZHUvZXhwbG9yZQpjY2VzID0gcmVhZC5jc3YoJ2RhdGEvY2Nlc19wcmVzX2J5X2luY29tZS5jc3YnLCBjaGVjay5uYW1lcyA9IEYpCiMgcmVtb3ZlICdwcmVmZXIgbm90IHRvIHNheScgb3B0aW9uCmNjZXMgPSBjY2VzWywgLW5jb2woY2NlcyldCnBhcihtYXIgPSBjKDguMSwgNC4xLCA0LjEsIDIuMSkpCnBsb3QuZGVmYXVsdChhcy5udW1lcmljKGNjZXNbJ0RvbmFsZCBUcnVtcCcsXSksIHR5cGUgPSAnYicsIHhheHQgPSAnbicsCiAgICAgICAgICAgICBtYWluID0gJ1RydW1wIHZvdGUgJSBieSBpbmNvbWUnLCB4bGFiID0gJycsIHlsYWIgPSAnJSBvZiB2b3RlJykKYXhpcygxLCBhdCA9IDE6bmNvbChjY2VzKSwgbGFiZWxzID0gbmFtZXMoY2NlcyksIGxhcyA9IDIpCmdyaWQobnggPSBOQSwgbnkgPSBOVUxMKQpgYGAKCkxvd2VyIGluY29tZSB2b3RlcnMgd2VyZSBsZXNzIGxpa2VseSB0byB2b3RlIGZvciBUcnVtcCBpbiAyMDIwLCBidXQgdGhlIGVmZmVjdAppc24ndCBodWdlLCBlc3BlY2lhbGx5IGZvciBob3VzZWhvbGRzIHdpdGggaW5jb21lcyBiZXR3ZWVuICQyMCwwMDAgYW5kCiQxNTAsMDAwLiBJdCB3b3VsZG4ndCBiZSBzdXJwcmlzaW5nIGZvciB0aGlzIGVmZmVjdCB0byBiZSBvdmVyc2hhZG93ZWQgYnkgdGhlCmFzc29jaWF0aW9uIG9mIGxvd2VyIGluY29tZXMgd2l0aCBsb3dlciBsZXZlbHMgb2YgcG9saXRpY2FsIGtub3dsZWRnZS4KCk9uZSBvZGRiYWxsIHByZWRpY3RvciwgYSBxdWVzdGlvbiBhYm91dCBDT1ZJRCBkaWFnbm9zZXMsIGRvZXNuJ3Qgc2VlbSByZWxhdGVkIHRvCmVpdGhlciBwb2xpdGljcyBvciBwb2xpdGljYWwga25vd2xlZGdlLiBJdCB0dXJucyBvdXQgdGhhdCB0aG9zZSB3aG8gaGF2ZSBiZWVuCmRpYWdub3NlZCB3aXRoIENPVklEIGFyZSBsZXNzIGxpa2VseSB0byBnZXQgdmFjY2luYXRlZC4gVGhpcyBzdWdnZXN0cyB0aGF0CnByYWN0aWNhbCBjb25jZXJucyBtYXkgYWxzbyBwbGF5IGEgcm9sZSwgd2l0aCBwZW9wbGUgd2hvIHRoaW5rIHRoZXkgaGF2ZSBsb3dlcgpyaXNrcyAoeW91bmcgcGVvcGxlLCB0aGUgcHJldmlvdXNseSBpbmZlY3RlZCkgZ2V0dGluZyB2YWNjaW5hdGVkIGF0IGxvd2VyCnJhdGVzLiBUaGF0J3MgY29uc2lzdGVudCB3aXRoIHNvbWUgb2YgdGhlIHBvcHVsYXIgcmVhc29ucyBnaXZlbiBhYm92ZSwgIkkgZG9u4oCZdApiZWxpZXZlIEkgbmVlZCBhIENPVklELTE5IHZhY2NpbmUiIGFuZCAiSSBkb24ndCB0aGluayBDT1ZJRC0xOSBpcyB0aGF0IGJpZyBvZiBhCnRocmVhdCIuCgpgYGB7ciBoYWRjb3ZpZHBhcnRpYWwsIGNhY2hlPVRSVUV9CmhhZGNvdmlkX3BhcnRpYWxzID0gYXMuZGF0YS5mcmFtZShwYXJ0aWFsUGxvdChyZiwgdHJhaW4sIGhhZGNvdmlkLCAnVFJVRScsIHBsb3QgPSBGKSkKaGFkY292aWRfcGFydGlhbHMgPSBoYWRjb3ZpZF9wYXJ0aWFsc1stKDE6MiksICd5J10KaGFkY292aWRfbGFiZWxzID0gYygKICAgICdZZXMnLAogICAgJ05vJywKICAgICdOb3Qgc3VyZScKKQpiYXJwbG90KGhhZGNvdmlkX3BhcnRpYWxzLCBuYW1lcy5hcmcgPSBoYWRjb3ZpZF9sYWJlbHMsCiAgICAgICAgbWFpbiA9ICdFZmZlY3RzIG9mIGEgQ09WSUQgZGlhZ25vc2lzJywKICAgICAgICB4bGFiID0gJ0RvY3RvciBvciBwcm92aWRlciB0b2xkIHlvdSB0aGF0IHlvdSBoYXZlIENPVklEJywKICAgICAgICB5bGFiID0gJ3BhcnRpYWwgZWZmZWN0JywgeWxpbSA9IGMoMCwgMS4xICogbWF4KGhhZGNvdmlkX3BhcnRpYWxzKSkpCmBgYAoKU28gdG8gbWUgaXQgZG9lc24ndCBsb29rIGxpa2UgcGVvcGxlIGZhaWwgdG8gZ2V0IHZhY2NpbmF0ZWQgYXMgYSBkaXJlY3QgcmVzdWx0Cm9mIHRoZSBoYXJkc2hpcHMgb2YgYmVpbmcgcG9vciBvciBsYWNrIG9mIGhlYWx0aCBpbnN1cmFuY2Ugb3IgYW55dGhpbmcgbGlrZQp0aGF0LiBJbnN0ZWFkIGl0IGxvb2tzIGxpa2UgdGhlIHVudmFjY2luYXRlZCBhcmUgcG9vcmx5IGluZm9ybWVkIHBlb3BsZSBtYWtpbmcgYQpiYWQgZGVjaXNpb24uIEl0IGxvb2tzIGxpa2UgcmlnaHQtd2luZyBwb2xpdGljYWwgbGVhbmluZ3Mgb2Z0ZW4gcGxheSBpbnRvIHRob3NlCmJhZCBkZWNpc2lvbnMuIEFuZCBpdCBsb29rcyBsaWtlIGJlaW5nIHBhcnQgb2YgYSBsb3dlciByaXNrIGdyb3VwIGNhbiBhbHNvIHBsYXkKYSByb2xlLgo=