Exam 4, Fall 2024

ACCT 426 / BUDA 451

Your name: Clayton Hammond

Before submitting, publish your results to rpubs RPubs URL: https://rpubs.com/ClaycanTCode/1258170

Overview

Use the Seatbelts dataset included with r.

Seatbelts is a time series giving the monthly totals of car drivers in Great Britain killed or seriously injured Jan 1969 to Dec 1984. Compulsory wearing of seat belts was introduced on 31 Jan 1983.

See a description of the dataset below:

  • DriversKilled: car drivers killed.
  • front: front-seat passengers killed or seriously injured.
  • rear: rear-seat passengers killed or seriously injured.
  • kms: distance driven.
  • PetrolPrice: petrol price.
  • VanKilled: number of van (‘light goods vehicle’) drivers.
  • l: was the law in effect that month? 1 or 0
# DO NOT EDIT THIS CODE
library(tidyverse)
options(scipen = 10)

data('Seatbelts')
t <- as_tibble(fortify(Seatbelts)) %>% 
  janitor::clean_names() %>% 
  mutate(dt_as_number = time(Seatbelts),
         year = floor(dt_as_number),
         month = (dt_as_number - floor(dt_as_number))*12 + 1,
         people_killed = front + rear + drivers_killed) %>% 
  select(-dt_as_number, -drivers, -van_killed, -drivers_killed,
         -front, -rear, -kms)
  

print(t)
# DO NOT EDIT THIS CODE

Q1: Summarize variables (30%)

Create a graph of each variable in the t tibble.

Then, summarize the data by year and print it out as a table.

Finally, create a correlation matrix chart.

Create a bullet point list describing each variable, and the 2-3 most important relationships.

Add your analysis here

Q2: Time Vis (25%)

Create a time series graph of the number of people killed. Take some time to make it as attractive and well-designed as you can.

Try to answer the question, “does the year and/or month have a major impact on the number of people killed?”

Traffic Deaths can clearly be seen to decrease as years go by, likely to due to better safety technology and regulations

Traffic deaths also demonstrate some seasonality, with a general increase from January to December and peaks in Summer months of July and August, and another peak in December. Both of these peaks are likely due to increased travel during these times.

library(lubridate)

ggplot(data = t2) +
  geom_line(mapping = aes(x = year, y = total_killed)) +
  geom_vline(xintercept = 1982) +
  geom_rect(xmin = 1982, xmax = 1984, ymin = 0, ymax = 20000, fill = 'green', alpha = 0.02) +
  geom_rect(xmin = 1969, xmax = 1982, ymin = 0, ymax = 20000, fill = 'red', alpha = 0.02) +
  labs(title = "Total Drivers Killed in GB Car Accidents Over Time",
       subtitle = "Years in green are after seatbelts were made compulsory.",
       x = "Year",
       y = "Total Killed")


t3 <- t %>% 
  select(month, people_killed) %>% 
  mutate(month = round(month, 0)) %>% 
  group_by(month) %>% 
  summarize(average_killed = mean(people_killed))

ggplot(data = t3) +
  geom_col(aes(x = month, y = average_killed, fill = month)) +
  labs(title = "Average Traffic Deaths by Month",
       subtitle = "Years of data include 1969 to 1984",
       y = "Average Deaths",
       x = "Month")

NA
NA

Q3: Linear Model (25%)

Create a linear regression model that predicts the number of people killed. Explain the quality of your model, as well as the impact of each variable on your results.

Explain the overall results, and well as each variable’s impact. Place Answer here

This model predicts the total traffic deaths in a given month by the variables: petrol_price, law, year, and month. All of these variables are statistically significant within the model, with p values far below .05

The model has an overall r^2 of 0.66, meaning that it explains 66% of the variation in traffic deaths from average.

summary(m1)

Call:
lm(formula = people_killed ~ year + month, data = t)

Residuals:
   Min     1Q Median     3Q    Max 
-354.4 -107.6   -5.7   93.3  393.9 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 63989.065   4838.959   13.22   <2e-16 ***
year          -31.814      2.448  -12.99   <2e-16 ***
month          38.992      3.269   11.93   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 156.4 on 189 degrees of freedom
Multiple R-squared:  0.6221,    Adjusted R-squared:  0.6181 
F-statistic: 155.6 on 2 and 189 DF,  p-value: < 2.2e-16

Q3: Other Model (20%)

Use a different model to analyze the number of people killed. Explain the quality of your model, as well as the impact of each variable in your results.

Explain the overall results, and well as each variable’s impact. Place Answer here

I used a decision tree model based on year, month, and petrol price. The decision tree first groups data into before and after 1975.

On the left side, it then naturally creates a split for the seatbelt law being passed by splitting on the year being 1983 or higher. After that, it splits on month to reach a numeric prediction.

On the right side, for years 1975 and prior, it splits on month being April or sooner before splitting on petrol prices to reach its final prediction.

Later months, earlier years, and lower petrol prices led to higher predicted deaths. The model had an overall r2 of 0.79

library(rpart)
library(rpart.plot)

m_dt <- rpart(people_killed ~ year+ month + petrol_price, data = t)

rpart.plot(m_dt)


output <- predict(m_dt, t)

t4 <- t %>% 
  mutate(predicted = output) %>% 
  mutate(residual = predicted - people_killed)

rss <- sum(t4$residual ^ 2)
total_variation <- t4$people_killed - mean(t4$people_killed)
total_sum_squares <- sum(total_variation ^ 2)
r2 <- 1 - (rss / total_sum_squares)

print(r2)
[1] 0.7941876
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIEV4YW0gNCwgRmFsbCAyMDI0DQojIEFDQ1QgNDI2IC8gQlVEQSA0NTENCg0KDQpZb3VyIG5hbWU6IENsYXl0b24gSGFtbW9uZA0KDQpCZWZvcmUgc3VibWl0dGluZywgKnB1Ymxpc2ggeW91ciByZXN1bHRzIHRvIHJwdWJzKiANClJQdWJzIFVSTDogaHR0cHM6Ly9ycHVicy5jb20vQ2xheWNhblRDb2RlLzEyNTgxNzANCg0KDQojIyBPdmVydmlldw0KDQpVc2UgdGhlIFNlYXRiZWx0cyBkYXRhc2V0IGluY2x1ZGVkIHdpdGggci4NCg0KU2VhdGJlbHRzIGlzIGEgdGltZSBzZXJpZXMgZ2l2aW5nIHRoZSBtb250aGx5IHRvdGFscyBvZiBjYXIgZHJpdmVycyBpbiBHcmVhdCBCcml0YWluIGtpbGxlZCBvciBzZXJpb3VzbHkgaW5qdXJlZCBKYW4gMTk2OSB0byBEZWMgMTk4NC4gQ29tcHVsc29yeSB3ZWFyaW5nIG9mIHNlYXQgYmVsdHMgd2FzIGludHJvZHVjZWQgb24gMzEgSmFuIDE5ODMuDQoNClNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhc2V0IGJlbG93Og0KDQotIERyaXZlcnNLaWxsZWQ6IGNhciBkcml2ZXJzIGtpbGxlZC4NCi0gZnJvbnQ6IGZyb250LXNlYXQgcGFzc2VuZ2VycyBraWxsZWQgb3Igc2VyaW91c2x5IGluanVyZWQuDQotIHJlYXI6IHJlYXItc2VhdCBwYXNzZW5nZXJzIGtpbGxlZCBvciBzZXJpb3VzbHkgaW5qdXJlZC4NCi0ga21zOiBkaXN0YW5jZSBkcml2ZW4uDQotIFBldHJvbFByaWNlOiBwZXRyb2wgcHJpY2UuDQotIFZhbktpbGxlZDogbnVtYmVyIG9mIHZhbiAo4oCYbGlnaHQgZ29vZHMgdmVoaWNsZeKAmSkgZHJpdmVycy4NCi0gbDogd2FzIHRoZSBsYXcgaW4gZWZmZWN0IHRoYXQgbW9udGg/IDEgb3IgMA0KDQpgYGB7ciBlY2hvPVRSVUV9DQojIERPIE5PVCBFRElUIFRISVMgQ09ERQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpvcHRpb25zKHNjaXBlbiA9IDEwKQ0KDQpkYXRhKCdTZWF0YmVsdHMnKQ0KdCA8LSBhc190aWJibGUoZm9ydGlmeShTZWF0YmVsdHMpKSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBtdXRhdGUoZHRfYXNfbnVtYmVyID0gdGltZShTZWF0YmVsdHMpLA0KICAgICAgICAgeWVhciA9IGZsb29yKGR0X2FzX251bWJlciksDQogICAgICAgICBtb250aCA9IChkdF9hc19udW1iZXIgLSBmbG9vcihkdF9hc19udW1iZXIpKSoxMiArIDEsDQogICAgICAgICBwZW9wbGVfa2lsbGVkID0gZnJvbnQgKyByZWFyICsgZHJpdmVyc19raWxsZWQpICU+JSANCiAgc2VsZWN0KC1kdF9hc19udW1iZXIsIC1kcml2ZXJzLCAtdmFuX2tpbGxlZCwgLWRyaXZlcnNfa2lsbGVkLA0KICAgICAgICAgLWZyb250LCAtcmVhciwgLWttcykNCiAgDQoNCnByaW50KHQpDQojIERPIE5PVCBFRElUIFRISVMgQ09ERQ0KYGBgDQoNCiMjIFExOiBTdW1tYXJpemUgdmFyaWFibGVzICgzMCUpDQoNCkNyZWF0ZSBhIGdyYXBoIG9mIGVhY2ggdmFyaWFibGUgaW4gdGhlIHQgdGliYmxlLiANCg0KVGhlbiwgc3VtbWFyaXplIHRoZSBkYXRhIGJ5IHllYXIgYW5kIHByaW50IGl0IG91dCBhcyBhIHRhYmxlLg0KDQpGaW5hbGx5LCBjcmVhdGUgYSBjb3JyZWxhdGlvbiBtYXRyaXggY2hhcnQuDQoNCkNyZWF0ZSBhIGJ1bGxldCBwb2ludCBsaXN0IGRlc2NyaWJpbmcgZWFjaCB2YXJpYWJsZSwgYW5kDQp0aGUgMi0zIG1vc3QgaW1wb3J0YW50IHJlbGF0aW9uc2hpcHMuDQoNCipBZGQgeW91ciBhbmFseXNpcyBoZXJlKg0KDQojIyBUaGUgdHdvIG1vc3QgaW1wb3J0YW50IHZhcmlhYmxlcyBmb3IgZGVjcmVhc2luZyB2ZWhpY2xlIGFjY2lkZW50IGRlYXRocyBhcHBlYXIgdG8gYmUgeWVhciBhbmQgdGhlIHBhc3NhZ2Ugb2YgdGhlIHNlYXRiZWx0IGxhdy4gV2hpbGUgdHJhZmZpYyBkZWF0aHMgZHJhc3RpY2FsbHkgZmVsbCBhZnRlciB0aGUgcGFzc2FnZSBvZiB0aGUgc2VhdGJlbHQgbGF3LCB0aGV5IHdlcmUgYWxyZWFkeSB0cmVuZGluZyBkb3duIG92ZXIgdGltZS4NCg0KKkJ1bGxldCBsaXN0IGZvciBlYWNoIHZhcmlhYmxlKg0KDQoqIHBldHJvbCBwcmljZS0gdGhpcyBoYXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IG5lZ2F0aXZlIGNvcnJlbGF0aW9uIHdpdGggdmVoaWNsZSBkZWF0aHMuIFRoZSBsaWtlbHkgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgcHJpY2VzIGdlbmVyYWxseSBpbmNyZWFzZSBvdmVyIHRpbWUsIHdoaWxlIHRyYWZmaWMgZGVhdGhzIGFyZSBzZWVuIHRvIGhhdmUgZmFsbGVuIG92ZXIgdGltZS4gVGhlcmUgY291bGQgYmUgc29tZSBpbXBhY3Qgb2YgaGlnaGVyIHByaWNlcyBjYXVzaW5nIGxlc3MgZHJpdmluZyBhcyB3ZWxsLg0KDQoqIGxhdy0gdGhpcyBoYXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGNvcnJlbGF0aW9uIHdpdGggdHJhZmZpYyBkZWF0aHMsIGFuZCBpdCBjYW4gYmUgaW5mZXJyZWQgdGhhdCBpdCBpcyBhIGNhdXNhbCByZWxhdGlvbnNoaXAgYmVjYXVzZSBzZWF0YmVsdHMgYXJlIG1lYW50IHRvIHByb3RlY3QgcGFzc2VuZ2Vycy4NCg0KKiB5ZWFyLSB0aGlzIGhhcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgbmVnYXRpdmUgY29ycmVsYXRpb24gd2l0aCB0cmFmZmljIGRlYXRocywgbGlrZWx5IGR1ZSB0byBpbXByb3ZlbWVudHMgaW4gY2FyIHNhZmV0eSB0ZWNobm9sb2d5IG92ZXIgdGltZS4gUGFydCBvZiB0aGUgY29ycmVsYXRpb24gaXMgYWxzbyBsaWtlbHkgYXR0cmlidXRhYmxlIHRvIHRoZSBzZWF0YmVsdCBsYXcgYmVpbmcgcGFzc2VkIGluIHRoZSBsYXRlciB5ZWFycyBvZiB0aGUgZGF0YXNldC4NCg0KKiBtb250aC0gdGhpcyBoYXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHBvc2l0aXZlIGNvcnJlbGF0aW9uIHdpdGggdHJhZmZpYyBkZWF0aHMuIFRoaXMgaXMgbGlrZWx5IGJlY2F1c2UgbGF0ZXIgbW9udGhzIGxpa2UgTm92ZW1iZXIgYW5kIERlY2VtYmVyIGluY2x1ZGUgaG9saWRheXMgdGhhdCBwZW9wbGUgZ2VuZXJhbGx5IHRyYXZlbCBmb3Igc3VjaCBhcyBDaHJpc3RtYXMuIFdpbnRlciBhbHNvIHN0YXJ0cyBhcm91bmQgdGhpcyB0aW1lLg0KDQoqQnVsbGV0IGxpc3QgZm9yIHRoZSB0b3AgMi0zIGtleSByZWxhdGlvbnNoaXBzKg0KDQoqIFllYXItIHRoZXJlIGlzIGEgdmVyeSBjbGVhciBkb3dud2FyZCB0cmVuZCBpbiB0cmFmZmljIGRlYXRocyBvdmVyIHRpbWUuDQoNCiogTGF3LSB0aGUgcGFzc2FnZSBvZiB0aGUgc2VhdGJlbHQgbGF3IHNob3dzIGEgZHJhc3RpYyBkZWNyZWFzZSBpbiB0cmFmZmljIGRlYXRocy4NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ2NvcnJwbG90KQ0KDQpjb3IodCkNCmdnY29ycnBsb3QodCkNCmNvci50ZXN0KHQkcGV0cm9sX3ByaWNlLCB0JHBlb3BsZV9raWxsZWQpDQpjb3IudGVzdCh0JHBldHJvbF9wcmljZSwgdCRwZW9wbGVfa2lsbGVkKQ0KY29yLnRlc3QodCR5ZWFyLCB0JHBlb3BsZV9raWxsZWQpDQpjb3IudGVzdCh0JG1vbnRoLCB0JHBlb3BsZV9raWxsZWQpDQoNCnQyIDwtIHQgJT4lIA0KICBzZWxlY3QocGV0cm9sX3ByaWNlLCBsYXcsIHllYXIsIG1vbnRoLCBwZW9wbGVfa2lsbGVkKSAlPiUgDQogIGdyb3VwX2J5KHllYXIpICU+JSANCiAgc3VtbWFyaXplKHRvdGFsX2tpbGxlZCA9IHN1bShwZW9wbGVfa2lsbGVkKSwNCiAgICAgICAgICAgIGF2ZXJhZ2VfcGV0cm9sX3ByaWNlID0gbWVhbihwZXRyb2xfcHJpY2UpLA0KICAgICAgICAgICAgbGF3ID0gbWF4KGxhdyksDQogICAgICAgICAgICB5ZWFyc19zaW5jZV8xOTY5ID0gbWVhbih5ZWFyIC0gMTk2OSkpDQoNCmdnY29ycnBsb3QodDIpDQoNCnByaW50KHQyKQ0KYGBgDQoNCg0KDQojIyBRMjogVGltZSBWaXMgKDI1JSkNCg0KQ3JlYXRlIGEgdGltZSBzZXJpZXMgZ3JhcGggb2YgdGhlIG51bWJlciBvZiBwZW9wbGUga2lsbGVkLiBUYWtlIHNvbWUgdGltZSB0byBtYWtlIGl0IGFzIGF0dHJhY3RpdmUgYW5kIHdlbGwtZGVzaWduZWQgYXMgeW91IGNhbi4NCg0KVHJ5IHRvIGFuc3dlciB0aGUgcXVlc3Rpb24sICJkb2VzIHRoZSB5ZWFyIGFuZC9vciBtb250aCBoYXZlIGEgbWFqb3IgaW1wYWN0IG9uIHRoZSBudW1iZXIgb2YgcGVvcGxlIGtpbGxlZD8iDQoNCiMjIFRyYWZmaWMgRGVhdGhzIGNhbiBjbGVhcmx5IGJlIHNlZW4gdG8gZGVjcmVhc2UgYXMgeWVhcnMgZ28gYnksIGxpa2VseSB0byBkdWUgdG8gYmV0dGVyIHNhZmV0eSB0ZWNobm9sb2d5IGFuZCByZWd1bGF0aW9ucw0KDQojIyMgVHJhZmZpYyBkZWF0aHMgYWxzbyBkZW1vbnN0cmF0ZSBzb21lIHNlYXNvbmFsaXR5LCB3aXRoIGEgZ2VuZXJhbCBpbmNyZWFzZSBmcm9tIEphbnVhcnkgdG8gRGVjZW1iZXIgYW5kIHBlYWtzIGluIFN1bW1lciBtb250aHMgb2YgSnVseSBhbmQgQXVndXN0LCBhbmQgYW5vdGhlciBwZWFrIGluIERlY2VtYmVyLiBCb3RoIG9mIHRoZXNlIHBlYWtzIGFyZSBsaWtlbHkgZHVlIHRvIGluY3JlYXNlZCB0cmF2ZWwgZHVyaW5nIHRoZXNlIHRpbWVzLiAgDQoNCmBgYCB7cn0NCmxpYnJhcnkobHVicmlkYXRlKQ0KDQpnZ3Bsb3QoZGF0YSA9IHQyKSArDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB5ZWFyLCB5ID0gdG90YWxfa2lsbGVkKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTgyKSArDQogIGdlb21fcmVjdCh4bWluID0gMTk4MiwgeG1heCA9IDE5ODQsIHltaW4gPSAwLCB5bWF4ID0gMjAwMDAsIGZpbGwgPSAnZ3JlZW4nLCBhbHBoYSA9IDAuMDIpICsNCiAgZ2VvbV9yZWN0KHhtaW4gPSAxOTY5LCB4bWF4ID0gMTk4MiwgeW1pbiA9IDAsIHltYXggPSAyMDAwMCwgZmlsbCA9ICdyZWQnLCBhbHBoYSA9IDAuMDIpICsNCiAgbGFicyh0aXRsZSA9ICJUb3RhbCBEcml2ZXJzIEtpbGxlZCBpbiBHQiBDYXIgQWNjaWRlbnRzIE92ZXIgVGltZSIsDQogICAgICAgc3VidGl0bGUgPSAiWWVhcnMgaW4gZ3JlZW4gYXJlIGFmdGVyIHNlYXRiZWx0cyB3ZXJlIG1hZGUgY29tcHVsc29yeS4iLA0KICAgICAgIHggPSAiWWVhciIsDQogICAgICAgeSA9ICJUb3RhbCBLaWxsZWQiKQ0KDQp0MyA8LSB0ICU+JSANCiAgc2VsZWN0KG1vbnRoLCBwZW9wbGVfa2lsbGVkKSAlPiUgDQogIG11dGF0ZShtb250aCA9IHJvdW5kKG1vbnRoLCAwKSkgJT4lIA0KICBncm91cF9ieShtb250aCkgJT4lIA0KICBzdW1tYXJpemUoYXZlcmFnZV9raWxsZWQgPSBtZWFuKHBlb3BsZV9raWxsZWQpKQ0KDQpnZ3Bsb3QoZGF0YSA9IHQzKSArDQogIGdlb21fY29sKGFlcyh4ID0gbW9udGgsIHkgPSBhdmVyYWdlX2tpbGxlZCwgZmlsbCA9IG1vbnRoKSkgKw0KICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgVHJhZmZpYyBEZWF0aHMgYnkgTW9udGgiLA0KICAgICAgIHN1YnRpdGxlID0gIlllYXJzIG9mIGRhdGEgaW5jbHVkZSAxOTY5IHRvIDE5ODQiLA0KICAgICAgIHkgPSAiQXZlcmFnZSBEZWF0aHMiLA0KICAgICAgIHggPSAiTW9udGgiKQ0KDQoNCmBgYA0KDQoNCg0KIyMgUTM6IExpbmVhciBNb2RlbCAoMjUlKQ0KDQpDcmVhdGUgYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB0aGF0IHByZWRpY3RzIHRoZSBudW1iZXIgb2YgcGVvcGxlIGtpbGxlZC4gRXhwbGFpbiB0aGUgcXVhbGl0eSBvZiB5b3VyIG1vZGVsLCBhcyB3ZWxsIGFzIHRoZSBpbXBhY3Qgb2YgZWFjaCB2YXJpYWJsZSBvbiB5b3VyIHJlc3VsdHMuIA0KDQoqRXhwbGFpbiB0aGUgb3ZlcmFsbCByZXN1bHRzLCBhbmQgd2VsbCBhcyBlYWNoIHZhcmlhYmxlJ3MgaW1wYWN0LioNCipQbGFjZSBBbnN3ZXIgaGVyZSoNCg0KIyMgVGhpcyBtb2RlbCBwcmVkaWN0cyB0aGUgdG90YWwgdHJhZmZpYyBkZWF0aHMgaW4gYSBnaXZlbiBtb250aCBieSB0aGUgdmFyaWFibGVzOiBwZXRyb2xfcHJpY2UsIGxhdywgeWVhciwgYW5kIG1vbnRoLiBBbGwgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdpdGhpbiB0aGUgbW9kZWwsIHdpdGggcCB2YWx1ZXMgZmFyIGJlbG93IC4wNQ0KDQojIyBUaGUgbW9kZWwgaGFzIGFuIG92ZXJhbGwgcl4yIG9mIDAuNjYsIG1lYW5pbmcgdGhhdCBpdCBleHBsYWlucyA2NiUgb2YgdGhlIHZhcmlhdGlvbiBpbiB0cmFmZmljIGRlYXRocyBmcm9tIGF2ZXJhZ2UuDQoNCg0KYGBgIHtyfQ0KbTEgPC0gbG0ocGVvcGxlX2tpbGxlZCB+IC4sIGRhdGEgPSB0KQ0KDQpzdW1tYXJ5KG0xKQ0KDQpgYGANCg0KDQoNCiMjIFEzOiBPdGhlciBNb2RlbCAoMjAlKQ0KDQpVc2UgYSBkaWZmZXJlbnQgbW9kZWwgdG8gYW5hbHl6ZSB0aGUgbnVtYmVyIG9mIHBlb3BsZSBraWxsZWQuIEV4cGxhaW4gdGhlIHF1YWxpdHkgb2YgeW91ciBtb2RlbCwgYXMgd2VsbCBhcyB0aGUgaW1wYWN0IG9mIGVhY2ggdmFyaWFibGUgaW4geW91ciByZXN1bHRzLg0KDQoqRXhwbGFpbiB0aGUgb3ZlcmFsbCByZXN1bHRzLCBhbmQgd2VsbCBhcyBlYWNoIHZhcmlhYmxlJ3MgaW1wYWN0LioNCipQbGFjZSBBbnN3ZXIgaGVyZSoNCg0KIyMgSSB1c2VkIGEgZGVjaXNpb24gdHJlZSBtb2RlbCBiYXNlZCBvbiB5ZWFyLCBtb250aCwgYW5kIHBldHJvbCBwcmljZS4gVGhlIGRlY2lzaW9uIHRyZWUgZmlyc3QgZ3JvdXBzIGRhdGEgaW50byBiZWZvcmUgYW5kIGFmdGVyIDE5NzUuIA0KDQojIyBPbiB0aGUgbGVmdCBzaWRlLCBpdCB0aGVuIG5hdHVyYWxseSBjcmVhdGVzIGEgc3BsaXQgZm9yIHRoZSBzZWF0YmVsdCBsYXcgYmVpbmcgcGFzc2VkIGJ5IHNwbGl0dGluZyBvbiB0aGUgeWVhciBiZWluZyAxOTgzIG9yIGhpZ2hlci4gQWZ0ZXIgdGhhdCwgaXQgc3BsaXRzIG9uIG1vbnRoIHRvIHJlYWNoIGEgbnVtZXJpYyBwcmVkaWN0aW9uLg0KDQojIyBPbiB0aGUgcmlnaHQgc2lkZSwgZm9yIHllYXJzIDE5NzUgYW5kIHByaW9yLCBpdCBzcGxpdHMgb24gbW9udGggYmVpbmcgQXByaWwgb3Igc29vbmVyIGJlZm9yZSBzcGxpdHRpbmcgb24gcGV0cm9sIHByaWNlcyB0byByZWFjaCBpdHMgZmluYWwgcHJlZGljdGlvbi4gDQoNCkxhdGVyIG1vbnRocywgZWFybGllciB5ZWFycywgYW5kIGxvd2VyIHBldHJvbCBwcmljZXMgbGVkIHRvIGhpZ2hlciBwcmVkaWN0ZWQgZGVhdGhzLiBUaGUgbW9kZWwgaGFkIGFuIG92ZXJhbGwgcjIgb2YgMC43OQ0KDQpgYGAge3J9DQpsaWJyYXJ5KHJwYXJ0KQ0KbGlicmFyeShycGFydC5wbG90KQ0KDQptX2R0IDwtIHJwYXJ0KHBlb3BsZV9raWxsZWQgfiB5ZWFyKyBtb250aCArIHBldHJvbF9wcmljZSwgZGF0YSA9IHQpDQoNCnJwYXJ0LnBsb3QobV9kdCkNCg0Kb3V0cHV0IDwtIHByZWRpY3QobV9kdCwgdCkNCg0KdDQgPC0gdCAlPiUgDQogIG11dGF0ZShwcmVkaWN0ZWQgPSBvdXRwdXQpICU+JSANCiAgbXV0YXRlKHJlc2lkdWFsID0gcHJlZGljdGVkIC0gcGVvcGxlX2tpbGxlZCkNCg0KcnNzIDwtIHN1bSh0NCRyZXNpZHVhbCBeIDIpDQp0b3RhbF92YXJpYXRpb24gPC0gdDQkcGVvcGxlX2tpbGxlZCAtIG1lYW4odDQkcGVvcGxlX2tpbGxlZCkNCnRvdGFsX3N1bV9zcXVhcmVzIDwtIHN1bSh0b3RhbF92YXJpYXRpb24gXiAyKQ0KcjIgPC0gMSAtIChyc3MgLyB0b3RhbF9zdW1fc3F1YXJlcykNCg0KcHJpbnQocjIpDQoNCg0KYGBg