Created by Riley Kearney. Updated 12/8/2024
Thesis
Counties that have higher bachelor degree rates tend to have higher
science proficiency scores.
Data
The data used this project includes unemployment demographics, county
revenues and spending, and proficiency scores for various counties.
These data sets were provided by Professor Garrett. Additionally, I
incorporated median family income, region data for each county, bachelor
degree rate, poverty rate, population rate for under 18 year olds, and
foreign population of each county.
Key Variables Included:
poverty_rate: poverty rate of each county
under_18_rate: population of 18 and younger for each
county
med_income: median family income in each county
bachelors_pop: bachelor degree rate attainment of each
county
proficiency: science proficiency score in each county
Methods
Correlations

Above is a correlation graph for me to see the different correlations
between the variables in my data set.
Linear Regression
Call:
lm(formula = proficiency ~ med_income + bachelors_pop + poverty_rate +
under_18_rate, data = numeric_data)
Residuals:
Min 1Q Median 3Q Max
-7.9331 -2.8643 -0.1598 2.8148 8.8230
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.889e+01 8.074e+00 2.340 0.0233 *
med_income 1.238e-04 9.788e-05 1.265 0.2119
bachelors_pop 3.041e-01 1.308e-01 2.326 0.0241 *
poverty_rate -1.279e-01 2.136e-01 -0.599 0.5522
under_18_rate -2.983e-01 3.410e-01 -0.875 0.3858
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.24 on 50 degrees of freedom
Multiple R-squared: 0.5082, Adjusted R-squared: 0.4688
F-statistic: 12.92 on 4 and 50 DF, p-value: 2.704e-07
The regression model above shows that there is a positive correlation
between median family income and population of people with their
bachelors degree with proficiency scores. There is a negative
correlation with poverty rate and population of people under the age of
18 with proficiency scores. The overall model has a 0.47 adjusted
R-squared which I’m happy with considering a good R-squared is 0.5 and
greater. The p-value is also a good number because it is under 0.05.
Bachelors population is a significant predictor when predicting
proficiency for all grades.
K-means

The visualization above shows counties grouped based on demographics
as median family income, bachelor degree rate, poverty rate,
proficiency, and population of children (18 and younger). The clusters
reveal patterns where counties with higher bachelor degree rates tend to
have higher proficiency scores. The red cluster shows counties that may
be economically disadvantaged with lower educational attainment, the
green cluster represents counties that have higher educational
attainment and outcomes, and the blue cluster represents the counties
that fall in a middle of the two extremes.
Decision Tree

The decision tree above predicts proficiency based on the key
demographic variables I’ve been working with throughout this project.
This visualization shows once again that the bachelors degree rate in
each county has a significant impact on proficiency scores, because in
this decision tree it is the first and most important split. As well as
the population of children in each county has an impact on proficiency
scores as well. Overall the tree shows how education levels and
socioeconomic factors play a role in children’s proficiency scores.
Neural Network

The visualization above represents the structure of the neural
network, which predicts proficiency scores based on inputs like median
income, bachelor degree rates, poverty rates, and population rate of 18
and younger. The error value is 0.010113 which indicates that the
network has learned the relationships effectively capturing complex
patterns.

When looking at the actual and predicted proficiency generated by the
neural network, the plot shows that the model captures general trends,
as many points are close to the red line. However there is still
noticeable variability, indicating that the predictions are not
perfectly accurate. This suggests the model performs reasonably well but
may require further refinement to improve accuracy.
Prediction
Based on all my visualizations, I’ve come to the prediction that
percentage of people with bachelor degrees and poverty rates in a
county. Counties with higher bachelor’s degree attainment tend to have
higher proficiency scores, while those with higher poverty rates
generally see lower proficiency. The decision tree and k-means
clustering show distinct groups based on these patterns, highlighting
the importance of these socioeconomic variables. The neural network
predictions align with these trends as well, with little variability.
Overall, if I was presenting this to a school board I would recommend to
encourage furthing education after k-12 to their students, so that in
the future those proficiency scores will increase.
Limitations
One limitation of this project is that it does not provide immediate
solutions for improving proficiency scores, as factors identified, such
as bachelor’s degree attainment and poverty, require long term efforts
to address. Additionally, only including socioeconimic variables and
leaving out funding or school resources data could have potentially
skewed the predictions. In the future, I would expand the data to
included funding variables as well to try to improve the model’s
accuracy and provide more insight.
Resources
Sources Included:
LS0tCnRpdGxlOiAiUHJvamVjdCAzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCkNyZWF0ZWQgYnkgUmlsZXkgS2Vhcm5leS4gVXBkYXRlZCAxMi84LzIwMjQKCiMjIyBUaGVzaXMgCkNvdW50aWVzIHRoYXQgaGF2ZSBoaWdoZXIgYmFjaGVsb3IgZGVncmVlIHJhdGVzIHRlbmQgdG8gaGF2ZSBoaWdoZXIgc2NpZW5jZSBwcm9maWNpZW5jeSBzY29yZXMuIAoKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShjYXJldCkKbGlicmFyeShycGFydCkKbGlicmFyeShyZWFkeGwpCmFzc2Vzc21lbnRfcGF0aCA8LSAnLi93diBlZCBzdHVkZW50IGFjaGlldmVtZW50L0hpc3RvcmljYWxfQXNzZXNzbWVudFJlc3VsdHNfU1kxNS10by1TWTIxLnhsc3gnCgoKdF9hc3Nlc3NfcmF3X3NjaG9vbCA8LSByZWFkX2V4Y2VsKHBhdGggPSBhc3Nlc3NtZW50X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gJ1NZMjEgU2Nob29sICYgRGlzdHJpY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9ICdiMjpmNzMxMicpCgoKdF9hc3Nlc3NfcmF3X3NjaWVuY2UgPC0gcmVhZF9leGNlbChwYXRoID0gYXNzZXNzbWVudF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICdTWTIxIFNjaG9vbCAmIERpc3RyaWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSAnZGIzOmRiNzMxMicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjKCdzY2llbmNlX3Byb2ZpY2llbmN5JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hID0gJyoqJykKCnRfYXNzZXNzX3JhdyA8LSB0X2Fzc2Vzc19yYXdfc2Nob29sICU+JQogIGJpbmRfY29scyh0X2Fzc2Vzc19yYXdfc2NpZW5jZSkgJT4lIAogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgIAoKCiMgUmVtb3ZlIHN1Ymdyb3Vwcwp0X2Fzc2VzcyA8LSB0X2Fzc2Vzc19yYXcgJT4lIAogIGZpbHRlcihzY2hvb2wgPT0gOTk5KSAlPiUgCiAgZmlsdGVyKHBvcHVsYXRpb25fZ3JvdXAgPT0gJ1RvdGFsIFBvcHVsYXRpb24nKSAlPiUgCiAgZmlsdGVyKGNvdW50eSAhPSAnU3RhdGV3aWRlJykgJT4lIAogIG11dGF0ZShwcm9maWNpZW5jeSA9IHNjaWVuY2VfcHJvZmljaWVuY3kpICAKCiMgQWRkIHJlZ2lvbnMKcmVnaW9ucyA8LSByZWFkX2Nzdignd3ZfcmVnaW9ucy5jc3YnKQp0X2Fzc2VzcyA8LSBsZWZ0X2pvaW4odF9hc3Nlc3MsIHJlZ2lvbnMsIGJ5ID0gJ2NvdW50eScpCgojIEFzc2lnbiBudW1iZXIgdG8gZWFjaCByZWdpb24KdF9hc3Nlc3MgPC0gdF9hc3Nlc3MgJT4lIAogIG11dGF0ZShyZWdpb25fbnVtYmVyID0gYXMubnVtZXJpYyhmYWN0b3IocmVnaW9uKSkpCgpwcmludCh0X2Fzc2VzcykKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnNwZW5kaW5nX3BhdGggPC0gJy4vdXMgY2Vuc3VzIGVkIHNwZW5kaW5nL2Vsc2VjMjJ0LnhscycKCnRfc3BlbmRpbmdfcmF3IDwtIHJlYWRfZXhjZWwocGF0aCA9IHNwZW5kaW5nX3BhdGgsLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICdlbHNlYzIydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gJ2ExOmdiMTQxMDYnKSAlPiUgCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKQoKCmNvb3BlcmF0ZXMgPC0gYygnTU9VTlRBSU4gU1RBVEUgRURVQ0FUSU9OQUwgU0VSVklDRVMgQ09PUEVSQVRJVkUnLAogICAgICAgICAgICAgICAgJ0VBU1RFUk4gUEFOSEFORExFIElOU1RSVUNUSU9OQUwgQ09PUEVSQVRJVkUnLAogICAgICAgICAgICAgICAgJ1NPVVRIRVJOIEVEVUNBVElPTkFMIFNFUlZJQ0VTIENPT1BFUkFUSVZFJykKCnRfc3BlbmRpbmcgPC0gdF9zcGVuZGluZ19yYXcgJT4lIAogIGZpbHRlcihzdGF0ZSA9PSA0OSkgJT4lIAogIGZpbHRlcighbmFtZSAlaW4lIGNvb3BlcmF0ZXMpICU+JSAKICBzZWxlY3QobmFtZSwgZW5yb2xsLCB0ZmVkcmV2LCB0c3RyZXYsIHRsb2NyZXYsIHRvdGFsZXhwLCBwcGNzdG90KSAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IHN0cl90b190aXRsZShzdHJfc3BsaXRfaShuYW1lLCAnICcsMSkpLAogICAgICAgICBjb3VudHkgPSBpZmVsc2UoY291bnR5ID09ICdNYycsICdNY0Rvd2VsbCcsIGNvdW50eSkpCgoKcHJpbnQodF9zcGVuZGluZykKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CgogIAoKdF91bmVtcGxveWVkX3JhdyA8LSByZWFkX2NzdignLi9kZW1vZ3JhcGhpY3MvdW5lbXBsb3llZC5jc3YnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEgPSAnTi9BJykgCgp0X3VuZW1wbG95ZWQgPC0gdF91bmVtcGxveWVkX3JhdyAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IENvdW50eSwgCiAgICAgICAgIHVuZW1wbG95ZWRfcG9wID0gYFZhbHVlIChQZXJjZW50KWApICU+JSAKICBzZWxlY3QoY291bnR5LCB1bmVtcGxveWVkX3BvcCkKCnRfdW5lbXBsb3llZCA8LSB0X3VuZW1wbG95ZWQgJT4lIAogIGZpbHRlcighaXMubmEodW5lbXBsb3llZF9wb3ApLCAKICAgICAgICAgY291bnR5ICE9ICdXZXN0IFZpcmdpbmlhJywKICAgICAgICAgY291bnR5ICE9ICdVbml0ZWQgU3RhdGVzJykKCnRfdW5lbXBsb3llZCRjb3VudHkgPC0gc3RyX3JlcGxhY2UodF91bmVtcGxveWVkJGNvdW50eSwgIiBDb3VudHkiLCAiIikKCgp0X3VuZW1wbG95ZWQkY291bnR5IDwtIHN0cl9yZXBsYWNlKHRfdW5lbXBsb3llZCRjb3VudHksICIgQ291bnR5IiwgIiIpCgpwcmludCh0X3VuZW1wbG95ZWQpCgoKYmFjaGVsb3JfZGVncmVlX3JhdyA8LSByZWFkX2NzdigiYmFjaGVsb3JfZGVncmVlLmNzdiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDUpCgpiYWNoZWxvcl9kZWdyZWUgPC0gYmFjaGVsb3JfZGVncmVlX3JhdyAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IENvdW50eSwgCiAgICAgICAgIGJhY2hlbG9yc19wb3AgPSBgVmFsdWUgKFBlcmNlbnQpYCkgJT4lIAogIHNlbGVjdChjb3VudHksIGJhY2hlbG9yc19wb3ApCgpiYWNoZWxvcl9kZWdyZWUgPC0gYmFjaGVsb3JfZGVncmVlICU+JSAKICBmaWx0ZXIoIWlzLm5hKGJhY2hlbG9yc19wb3ApLCAKICAgICAgICAgY291bnR5ICE9ICdXZXN0IFZpcmdpbmlhJywKICAgICAgICAgY291bnR5ICE9ICdVbml0ZWQgU3RhdGVzJykKCmJhY2hlbG9yX2RlZ3JlZSRjb3VudHkgPC0gc3RyX3JlcGxhY2UoYmFjaGVsb3JfZGVncmVlJGNvdW50eSwgIiBDb3VudHkiLCAiIikKCmZvcmVpZ25fYm9ybl9yYXcgPC0gcmVhZF9jc3YoImZvcmVpZ25fYm9ybi5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSA0KQpmb3JlaWduX2Jvcm4gPC0gZm9yZWlnbl9ib3JuX3JhdyAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IENvdW50eSwgCiAgICAgICAgIGZvcmVpZ25fcG9wID0gYFZhbHVlIChQZXJjZW50KWApICU+JSAKICBmaWx0ZXIoIWlzLm5hKGZvcmVpZ25fcG9wKSwgCiAgICAgICAgIGNvdW50eSAhPSAnV2VzdCBWaXJnaW5pYScsIAogICAgICAgICBjb3VudHkgIT0gJ1VuaXRlZCBTdGF0ZXMnKSAlPiUgCiAgc2VsZWN0KGNvdW50eSwgZm9yZWlnbl9wb3ApCgpmb3JlaWduX2Jvcm4kY291bnR5IDwtIHN0cl9yZXBsYWNlKGZvcmVpZ25fYm9ybiRjb3VudHksICIgQ291bnR5IiwgIiIpCgogcG92ZXJ0eV9yYXRlIDwtIHJlYWRfY3N2KCJwb3ZlcnR5X3JhdGUuY3N2Iiwgc2tpcCA9IDMpICU+JSAKICAgICBtdXRhdGUoY291bnR5ID0gQ291bnR5LCAKICAgICAgICAgcG92ZXJ0eV9yYXRlID0gYFZhbHVlIChQZXJjZW50KWApICU+JSAKICBmaWx0ZXIoIWlzLm5hKHBvdmVydHlfcmF0ZSksIAogICAgICAgICBjb3VudHkgIT0gJ1dlc3QgVmlyZ2luaWEnLCAKICAgICAgICAgY291bnR5ICE9ICdVbml0ZWQgU3RhdGVzJykgJT4lIAogIHNlbGVjdChjb3VudHksIHBvdmVydHlfcmF0ZSkKCiBwb3ZlcnR5X3JhdGUkY291bnR5IDwtIHN0cl9yZXBsYWNlKHBvdmVydHlfcmF0ZSRjb3VudHksICIgQ291bnR5IiwgIiIpCiAKdW5kZXJfMThfcG9wIDwtIHJlYWRfY3N2KCJ1bmRlcl8xOF9wb3AuY3N2IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMykgJT4lIAogIG11dGF0ZShjb3VudHkgPSBDb3VudHksIAogICAgICAgICB1bmRlcl8xOF9yYXRlID0gYFZhbHVlIChQZXJjZW50KWApICU+JSAKICBmaWx0ZXIoIWlzLm5hKHVuZGVyXzE4X3JhdGUpLCAKICAgICAgICAgY291bnR5ICE9ICdXZXN0IFZpcmdpbmlhJywgCiAgICAgICAgIGNvdW50eSAhPSAnVW5pdGVkIFN0YXRlcycpICU+JSAKICBzZWxlY3QoY291bnR5LCB1bmRlcl8xOF9yYXRlKQogCiB1bmRlcl8xOF9wb3AkY291bnR5IDwtIHN0cl9yZXBsYWNlKHVuZGVyXzE4X3BvcCRjb3VudHksICIgQ291bnR5IiwgIiIpCiAKIApgYGAKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShzdHJpbmdyKQppbmNvbWVfcmF3IDwtIHJlYWRfY3N2KCdIRFB1bHNlX2RhdGFfZXhwb3J0LmNzdicsIAogICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSA2KQpob3VzZWhvbGRfaW5jb21lIDwtIGluY29tZV9yYXcgJT4lIAogIHJlbmFtZShjb3VudHkgPSAnVW5pdGVkIFN0YXRlcycsIAogICAgICAgICBtZWRfaW5jb21lID0gJzkyLDY0NicpICU+JSAKICBmaWx0ZXIoIWlzLm5hKG1lZF9pbmNvbWUpKSAlPiUgCiAgc2VsZWN0KGNvdW50eSwgbWVkX2luY29tZSkKCmhvdXNlaG9sZF9pbmNvbWUkY291bnR5IDwtIHN0cl9yZXBsYWNlKGhvdXNlaG9sZF9pbmNvbWUkY291bnR5LCAiIENvdW50eSIsICIiKQoKcHJpbnQoaG91c2Vob2xkX2luY29tZSkKCmRlbW9ncmFwaGljcyA8LSBmb3JlaWduX2Jvcm4gJT4lIAogIGxlZnRfam9pbihiYWNoZWxvcl9kZWdyZWUsIGJ5ID0gImNvdW50eSIpICU+JSAKICBsZWZ0X2pvaW4odF91bmVtcGxveWVkLCBieSA9ICJjb3VudHkiKSAlPiUgCiAgbGVmdF9qb2luKGhvdXNlaG9sZF9pbmNvbWUsIGJ5ID0gImNvdW50eSIpICU+JSAKICBsZWZ0X2pvaW4odW5kZXJfMThfcG9wLCBieSA9ICJjb3VudHkiKSAlPiUgCiAgbGVmdF9qb2luKHBvdmVydHlfcmF0ZSwgYnkgPSAiY291bnR5IikKCgoKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CgojIE1lcmdlIGRhdGEKdCA8LSB0X2Fzc2VzcyAlPiUgCiAgbGVmdF9qb2luKGRlbW9ncmFwaGljcywgYnkgPSAiY291bnR5IikgJT4lIAogIGxlZnRfam9pbih0X3NwZW5kaW5nLCBieSA9ICJjb3VudHkiKQogIAoKcHJpbnQodCkKYGBgCgojIyMgRGF0YQoKVGhlIGRhdGEgdXNlZCB0aGlzIHByb2plY3QgaW5jbHVkZXMgdW5lbXBsb3ltZW50IGRlbW9ncmFwaGljcywgY291bnR5IHJldmVudWVzIGFuZCBzcGVuZGluZywgYW5kIHByb2ZpY2llbmN5IHNjb3JlcyBmb3IgdmFyaW91cyBjb3VudGllcy4gVGhlc2UgZGF0YSBzZXRzIHdlcmUgcHJvdmlkZWQgYnkgUHJvZmVzc29yIEdhcnJldHQuIEFkZGl0aW9uYWxseSwgSSBpbmNvcnBvcmF0ZWQgbWVkaWFuIGZhbWlseSBpbmNvbWUsIHJlZ2lvbiBkYXRhIGZvciBlYWNoIGNvdW50eSwgYmFjaGVsb3IgZGVncmVlIHJhdGUsIHBvdmVydHkgcmF0ZSwgcG9wdWxhdGlvbiByYXRlIGZvciB1bmRlciAxOCB5ZWFyIG9sZHMsIGFuZCBmb3JlaWduIHBvcHVsYXRpb24gb2YgZWFjaCBjb3VudHkuIAoKS2V5IFZhcmlhYmxlcyBJbmNsdWRlZDoKCi0gcG92ZXJ0eV9yYXRlOiBwb3ZlcnR5IHJhdGUgb2YgZWFjaCBjb3VudHkKCi0gdW5kZXJfMThfcmF0ZTogcG9wdWxhdGlvbiBvZiAxOCBhbmQgeW91bmdlciBmb3IgZWFjaCBjb3VudHkKCi0gbWVkX2luY29tZTogbWVkaWFuIGZhbWlseSBpbmNvbWUgaW4gZWFjaCBjb3VudHkKCi0gYmFjaGVsb3JzX3BvcDogYmFjaGVsb3IgZGVncmVlIHJhdGUgYXR0YWlubWVudCBvZiBlYWNoIGNvdW50eQoKLSBwcm9maWNpZW5jeTogc2NpZW5jZSBwcm9maWNpZW5jeSBzY29yZSBpbiBlYWNoIGNvdW50eQoKCiMjIyBNZXRob2RzCgojIyMjIENvcnJlbGF0aW9ucwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmxpYnJhcnkoZ2djb3JycGxvdCkKCm51bWVyaWNfZGF0YSA8LSB0ICU+JSAKICBzZWxlY3Qod2hlcmUoaXMubnVtZXJpYykpCmNvcnJfZGF0YSA8LSBudW1lcmljX2RhdGEgJT4lIAogIHNlbGVjdChwcm9maWNpZW5jeSwgbWVkX2luY29tZSwgZm9yZWlnbl9wb3AsIGJhY2hlbG9yc19wb3AsIHVuZW1wbG95ZWRfcG9wLCBlbnJvbGwsIHVuZGVyXzE4X3JhdGUsIHBvdmVydHlfcmF0ZSkKY29yX21hdHJpeCA8LSBjb3IoY29ycl9kYXRhLCB1c2UgPSAiY29tcGxldGUub2JzIikKCmdnY29ycnBsb3QoY29yKGNvcnJfZGF0YSkpCgpgYGAKQWJvdmUgaXMgYSBjb3JyZWxhdGlvbiBncmFwaCBmb3IgbWUgdG8gc2VlIHRoZSBkaWZmZXJlbnQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIHZhcmlhYmxlcyBpbiBteSBkYXRhIHNldC4gCgoKIyMjIyBMaW5lYXIgUmVncmVzc2lvbgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCm1vZGVsIDwtIGxtKHByb2ZpY2llbmN5IH4gbWVkX2luY29tZSArIGJhY2hlbG9yc19wb3AgKyBwb3ZlcnR5X3JhdGUgKyB1bmRlcl8xOF9yYXRlLCBkYXRhID0gbnVtZXJpY19kYXRhKQoKc3VtbWFyeShtb2RlbCkKCgpgYGAKClRoZSByZWdyZXNzaW9uIG1vZGVsIGFib3ZlIHNob3dzIHRoYXQgdGhlcmUgaXMgYSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIG1lZGlhbiBmYW1pbHkgaW5jb21lIGFuZCBwb3B1bGF0aW9uIG9mIHBlb3BsZSB3aXRoIHRoZWlyIGJhY2hlbG9ycyBkZWdyZWUgd2l0aCBwcm9maWNpZW5jeSBzY29yZXMuIFRoZXJlIGlzIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gd2l0aCBwb3ZlcnR5IHJhdGUgYW5kIHBvcHVsYXRpb24gb2YgcGVvcGxlIHVuZGVyIHRoZSBhZ2Ugb2YgMTggd2l0aCBwcm9maWNpZW5jeSBzY29yZXMuIFRoZSBvdmVyYWxsIG1vZGVsIGhhcyBhIDAuNDcgYWRqdXN0ZWQgUi1zcXVhcmVkIHdoaWNoIEknbSBoYXBweSB3aXRoIGNvbnNpZGVyaW5nIGEgZ29vZCBSLXNxdWFyZWQgaXMgMC41IGFuZCBncmVhdGVyLiBUaGUgcC12YWx1ZSBpcyBhbHNvIGEgZ29vZCBudW1iZXIgYmVjYXVzZSBpdCBpcyB1bmRlciAwLjA1LiBCYWNoZWxvcnMgcG9wdWxhdGlvbiBpcyBhIHNpZ25pZmljYW50IHByZWRpY3RvciB3aGVuIHByZWRpY3RpbmcgcHJvZmljaWVuY3kgZm9yIGFsbCBncmFkZXMuIAoKIyMjIyBLLW1lYW5zCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprX2RhdGEgPC0gbnVtZXJpY19kYXRhICU+JSAKICBzZWxlY3QocHJvZmljaWVuY3ksIG1lZF9pbmNvbWUsIGJhY2hlbG9yc19wb3AsIHBvdmVydHlfcmF0ZSwgdW5kZXJfMThfcmF0ZSkKCnNjYWxlZF9kYXRhIDwtIGtfZGF0YSAlPiUgCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIHNjYWxlKSkKCmtfcmVzdWx0IDwtIGttZWFucygKICB4ID0gc2NhbGVkX2RhdGEsIAogIGNlbnRlcnMgPSAzLCAKICBuc3RhcnQgPSAyNQopCgpudW1lcmljX2RhdGEgPC0gbnVtZXJpY19kYXRhICU+JSAKICBtdXRhdGUoa21lYW5zX2NsdXN0ZXIgPSBrX3Jlc3VsdCRjbHVzdGVyKQoKZ2dwbG90KGRhdGEgPSBudW1lcmljX2RhdGEpICsgCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBiYWNoZWxvcnNfcG9wLCB5ID0gcHJvZmljaWVuY3ksIGNvbG9yID0gZmFjdG9yKGttZWFuc19jbHVzdGVyKSkpICsKICBsYWJzKGNvbG9yID0gIkNsdXN0ZXIiLCB0aXRsZSA9ICJLLW1lYW5zIENsdXN0ZXJpbmciLCB4ID0gIkJhY2hlbG9yIERlZ3JlZSBSYXRlIiwgeSA9ICJQcm9maWNpZW5jeSIpICsKICB0aGVtZV9taW5pbWFsKCkKCgpgYGAKVGhlIHZpc3VhbGl6YXRpb24gYWJvdmUgc2hvd3MgY291bnRpZXMgZ3JvdXBlZCBiYXNlZCBvbiBkZW1vZ3JhcGhpY3MgYXMgbWVkaWFuIGZhbWlseSBpbmNvbWUsIGJhY2hlbG9yIGRlZ3JlZSByYXRlLCBwb3ZlcnR5IHJhdGUsIHByb2ZpY2llbmN5LCBhbmQgcG9wdWxhdGlvbiBvZiBjaGlsZHJlbiAoMTggYW5kIHlvdW5nZXIpLiBUaGUgY2x1c3RlcnMgcmV2ZWFsIHBhdHRlcm5zIHdoZXJlIGNvdW50aWVzIHdpdGggaGlnaGVyIGJhY2hlbG9yIGRlZ3JlZSByYXRlcyB0ZW5kIHRvIGhhdmUgaGlnaGVyIHByb2ZpY2llbmN5IHNjb3Jlcy4gVGhlIHJlZCBjbHVzdGVyIHNob3dzIGNvdW50aWVzIHRoYXQgbWF5IGJlIGVjb25vbWljYWxseSBkaXNhZHZhbnRhZ2VkIHdpdGggbG93ZXIgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCwgdGhlIGdyZWVuIGNsdXN0ZXIgcmVwcmVzZW50cyBjb3VudGllcyB0aGF0IGhhdmUgaGlnaGVyIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIG91dGNvbWVzLCBhbmQgdGhlIGJsdWUgY2x1c3RlciByZXByZXNlbnRzIHRoZSBjb3VudGllcyB0aGF0IGZhbGwgaW4gYSBtaWRkbGUgb2YgdGhlIHR3byBleHRyZW1lcy4gCgoKIyMjIyBEZWNpc2lvbiBUcmVlCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShycGFydC5wbG90KQpsaWJyYXJ5KHJwYXJ0KQoKdHJlZV9tb2RlbCA8LSBycGFydChwcm9maWNpZW5jeSB+IG1lZF9pbmNvbWUgKyBiYWNoZWxvcnNfcG9wICsgcG92ZXJ0eV9yYXRlICsgdW5kZXJfMThfcmF0ZSwgCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG51bWVyaWNfZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImFub3ZhIiwgCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluYnVja2V0ID0gNSkpCgpycGFydC5wbG90KHRyZWVfbW9kZWwpCgpgYGAKVGhlIGRlY2lzaW9uIHRyZWUgYWJvdmUgcHJlZGljdHMgcHJvZmljaWVuY3kgYmFzZWQgb24gdGhlIGtleSBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMgSSd2ZSBiZWVuIHdvcmtpbmcgd2l0aCB0aHJvdWdob3V0IHRoaXMgcHJvamVjdC4gVGhpcyB2aXN1YWxpemF0aW9uIHNob3dzIG9uY2UgYWdhaW4gdGhhdCB0aGUgYmFjaGVsb3JzIGRlZ3JlZSByYXRlIGluIGVhY2ggY291bnR5IGhhcyBhIHNpZ25pZmljYW50IGltcGFjdCBvbiBwcm9maWNpZW5jeSBzY29yZXMsIGJlY2F1c2UgaW4gdGhpcyBkZWNpc2lvbiB0cmVlIGl0IGlzIHRoZSBmaXJzdCBhbmQgbW9zdCBpbXBvcnRhbnQgc3BsaXQuIEFzIHdlbGwgYXMgdGhlIHBvcHVsYXRpb24gb2YgY2hpbGRyZW4gaW4gZWFjaCBjb3VudHkgaGFzIGFuIGltcGFjdCBvbiBwcm9maWNpZW5jeSBzY29yZXMgYXMgd2VsbC4gT3ZlcmFsbCB0aGUgdHJlZSBzaG93cyBob3cgZWR1Y2F0aW9uIGxldmVscyBhbmQgc29jaW9lY29ub21pYyBmYWN0b3JzIHBsYXkgYSByb2xlIGluIGNoaWxkcmVuJ3MgcHJvZmljaWVuY3kgc2NvcmVzLiAKCgoKIyMjIE5ldXJhbCBOZXR3b3JrIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmxpYnJhcnkobmV1cmFsbmV0KQoKCnNldC5zZWVkKDEpCgpzY2FsZWRfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlZF9kYXRhKQp0cmFpbl9pbmRleCA8LSBzYW1wbGUoc2VxX2xlbihucm93KHNjYWxlZF9kYXRhKSksIHNpemUgPSAwLjggKiBucm93KHNjYWxlZF9kYXRhKSkKdHJhaW5fZGF0YSA8LSBzY2FsZWRfZGF0YVt0cmFpbl9pbmRleCwgXQp0ZXN0X2RhdGEgPC0gIHNjYWxlZF9kYXRhWy10cmFpbl9pbmRleCwgXQoKbm5fbW9kZWwgPC0gbmV1cmFsbmV0KHByb2ZpY2llbmN5IH4gbWVkX2luY29tZSArIGJhY2hlbG9yc19wb3AgKyBwb3ZlcnR5X3JhdGUgKyB1bmRlcl8xOF9yYXRlLCAKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0cmFpbl9kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IGMoMTAsIDUpLCAKICAgICAgICAgICAgICAgICAgICAgIGxpbmVhci5vdXRwdXQgPSBUUlVFKQoKcGxvdChubl9tb2RlbCkKCnRlc3RfcHJlZGljdGlvbnMgPC0gY29tcHV0ZShubl9tb2RlbCwgdGVzdF9kYXRhWywgYygibWVkX2luY29tZSIsICJiYWNoZWxvcnNfcG9wIiwgInBvdmVydHlfcmF0ZSIsICJ1bmRlcl8xOF9yYXRlIildKQp0ZXN0X3ByZWRpY3Rpb25zIDwtIHRlc3RfcHJlZGljdGlvbnMkbmV0LnJlc3VsdAoKYWN0dWFsX3ZhbHVlcyA8LSB0ZXN0X2RhdGEkcHJvZmljaWVuY3kKcm1zZSA8LSBtZWFuKChhY3R1YWxfdmFsdWVzLXRlc3RfcHJlZGljdGlvbnMpXjIpCgoKCmBgYApUaGUgdmlzdWFsaXphdGlvbiBhYm92ZSByZXByZXNlbnRzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG5ldXJhbCBuZXR3b3JrLCB3aGljaCBwcmVkaWN0cyBwcm9maWNpZW5jeSBzY29yZXMgYmFzZWQgb24gaW5wdXRzIGxpa2UgbWVkaWFuIGluY29tZSwgYmFjaGVsb3IgZGVncmVlIHJhdGVzLCBwb3ZlcnR5IHJhdGVzLCBhbmQgcG9wdWxhdGlvbiByYXRlIG9mIDE4IGFuZCB5b3VuZ2VyLiBUaGUgZXJyb3IgdmFsdWUgaXMgMC4wMTAxMTMgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIG5ldHdvcmsgaGFzIGxlYXJuZWQgdGhlIHJlbGF0aW9uc2hpcHMgZWZmZWN0aXZlbHkgY2FwdHVyaW5nIGNvbXBsZXggcGF0dGVybnMuIAoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KCnBsb3QoYWN0dWFsX3ZhbHVlcywgdGVzdF9wcmVkaWN0aW9ucywgbWFpbiA9ICJBY3R1YWwgdnMgUHJlZGljdGVkIFByb2ZpY2llbmN5IiwKICAgICB4bGFiID0gIkFjdHVhbCBQcm9maWNpZW5jeSIsIAogICAgIHlsYWIgPSAiUHJlZGljdGQgUHJvZmljaWVuY3kiKQphYmxpbmUoMCwxLGNvbCA9ICJyZWQiKQoKCgpgYGAKV2hlbiBsb29raW5nIGF0IHRoZSBhY3R1YWwgYW5kIHByZWRpY3RlZCBwcm9maWNpZW5jeSBnZW5lcmF0ZWQgYnkgdGhlIG5ldXJhbCBuZXR3b3JrLCB0aGUgcGxvdCBzaG93cyB0aGF0IHRoZSBtb2RlbCBjYXB0dXJlcyBnZW5lcmFsIHRyZW5kcywgYXMgbWFueSBwb2ludHMgYXJlIGNsb3NlIHRvIHRoZSByZWQgbGluZS4gSG93ZXZlciB0aGVyZSBpcyBzdGlsbCBub3RpY2VhYmxlIHZhcmlhYmlsaXR5LCBpbmRpY2F0aW5nIHRoYXQgdGhlIHByZWRpY3Rpb25zIGFyZSBub3QgcGVyZmVjdGx5IGFjY3VyYXRlLiBUaGlzIHN1Z2dlc3RzIHRoZSBtb2RlbCBwZXJmb3JtcyByZWFzb25hYmx5IHdlbGwgYnV0IG1heSByZXF1aXJlIGZ1cnRoZXIgcmVmaW5lbWVudCB0byBpbXByb3ZlIGFjY3VyYWN5LiAKCgoKCgoKCgoKCgojIyMgUHJlZGljdGlvbgoKQmFzZWQgb24gYWxsIG15IHZpc3VhbGl6YXRpb25zLCBJJ3ZlIGNvbWUgdG8gdGhlIHByZWRpY3Rpb24gdGhhdCBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoIGJhY2hlbG9yIGRlZ3JlZXMgYW5kIHBvdmVydHkgcmF0ZXMgaW4gYSBjb3VudHkuIENvdW50aWVzIHdpdGggaGlnaGVyIGJhY2hlbG9yJ3MgZGVncmVlIGF0dGFpbm1lbnQgdGVuZCB0byBoYXZlIGhpZ2hlciBwcm9maWNpZW5jeSBzY29yZXMsIHdoaWxlIHRob3NlIHdpdGggaGlnaGVyIHBvdmVydHkgcmF0ZXMgZ2VuZXJhbGx5IHNlZSBsb3dlciBwcm9maWNpZW5jeS4gVGhlIGRlY2lzaW9uIHRyZWUgYW5kIGstbWVhbnMgY2x1c3RlcmluZyBzaG93IGRpc3RpbmN0IGdyb3VwcyBiYXNlZCBvbiB0aGVzZSBwYXR0ZXJucywgaGlnaGxpZ2h0aW5nIHRoZSBpbXBvcnRhbmNlIG9mIHRoZXNlIHNvY2lvZWNvbm9taWMgdmFyaWFibGVzLiBUaGUgbmV1cmFsIG5ldHdvcmsgcHJlZGljdGlvbnMgYWxpZ24gd2l0aCB0aGVzZSB0cmVuZHMgYXMgd2VsbCwgd2l0aCBsaXR0bGUgdmFyaWFiaWxpdHkuIE92ZXJhbGwsIGlmIEkgd2FzIHByZXNlbnRpbmcgdGhpcyB0byBhIHNjaG9vbCBib2FyZCBJIHdvdWxkIHJlY29tbWVuZCB0byBlbmNvdXJhZ2UgZnVydGhpbmcgZWR1Y2F0aW9uIGFmdGVyIGstMTIgdG8gdGhlaXIgc3R1ZGVudHMsIHNvIHRoYXQgaW4gdGhlIGZ1dHVyZSB0aG9zZSBwcm9maWNpZW5jeSBzY29yZXMgd2lsbCBpbmNyZWFzZS4gCgojIyMgTGltaXRhdGlvbnMKCk9uZSBsaW1pdGF0aW9uIG9mIHRoaXMgcHJvamVjdCBpcyB0aGF0IGl0IGRvZXMgbm90IHByb3ZpZGUgaW1tZWRpYXRlIHNvbHV0aW9ucyBmb3IgaW1wcm92aW5nIHByb2ZpY2llbmN5IHNjb3JlcywgYXMgZmFjdG9ycyBpZGVudGlmaWVkLCBzdWNoIGFzIGJhY2hlbG9yJ3MgZGVncmVlIGF0dGFpbm1lbnQgYW5kIHBvdmVydHksIHJlcXVpcmUgbG9uZyB0ZXJtIGVmZm9ydHMgdG8gYWRkcmVzcy4gQWRkaXRpb25hbGx5LCBvbmx5IGluY2x1ZGluZyBzb2Npb2Vjb25pbWljIHZhcmlhYmxlcyBhbmQgbGVhdmluZyBvdXQgZnVuZGluZyBvciBzY2hvb2wgcmVzb3VyY2VzIGRhdGEgY291bGQgaGF2ZSBwb3RlbnRpYWxseSBza2V3ZWQgdGhlIHByZWRpY3Rpb25zLiBJbiB0aGUgZnV0dXJlLCBJIHdvdWxkIGV4cGFuZCB0aGUgZGF0YSB0byBpbmNsdWRlZCBmdW5kaW5nIHZhcmlhYmxlcyBhcyB3ZWxsIHRvIHRyeSB0byBpbXByb3ZlIHRoZSBtb2RlbCdzIGFjY3VyYWN5IGFuZCBwcm92aWRlIG1vcmUgaW5zaWdodC4gCgoKIyMjIFJlc291cmNlcwoKU291cmNlcyBJbmNsdWRlZDogCgotIENoYXRHUFQgZm9yIGNvZGUgZXJyb3JzCgotIGh0dHBzOi8vaGRwdWxzZS5uaW1oZC5uaWguZ292L2RhdGEtcG9ydGFsL3NvY2lhbC9tYXA/c29jaWFsdG9waWM9MDMwJnNvY2lhbHRvcGljX29wdGlvbnM9c29jaWFsXzYmZGVtbz0wMDAxMCZkZW1vX29wdGlvbnM9aW5jb21lXzMmcmFjZT0wMCZyYWNlX29wdGlvbnM9cmFjZV83JnNleD0wJnNleF9vcHRpb25zPXNleGJvdGhfMSZhZ2U9MDAxJmFnZV9vcHRpb25zPWFnZWFsbF8xJnN0YXRlZmlwcz01NCZzdGF0ZWZpcHNfb3B0aW9ucz1hcmVhX3N0YXRlcwoKLSBodHRwczovL3d3dy5kcm9wYm94LmNvbS9zY2wvZm8vczI5eHd3ZzIxaXJja3o5Z3pqeDM5L0FDM1c4bTAyS0xBZ0l0RGZlam1tdnJVP3Jsa2V5PTRoMjI2aWRtZDBuNjk2enlqY3JrMmtlZ2ImZT0xJmRsPTAKCgoKCgoKCgoKCgoKCgoKCgo=