library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.2
## Warning: package 'tibble' was built under R version 4.0.2
## Warning: package 'tidyr' was built under R version 4.0.2
## Warning: package 'dplyr' was built under R version 4.0.2
library(openintro)
## Warning: package 'openintro' was built under R version 4.0.2
## Warning: package 'airports' was built under R version 4.0.2
## Warning: package 'cherryblossom' was built under R version 4.0.2
## Warning: package 'usdata' was built under R version 4.0.2
write.csv (fastfood, "fastfood.csv")
getwd()
## [1] "C:/Users/Jerome/Documents/Math_217_Week_4_RLab"
fastfood
## # A tibble: 515 x 17
##    restaurant item  calories cal_fat total_fat sat_fat trans_fat cholesterol
##    <chr>      <chr>    <dbl>   <dbl>     <dbl>   <dbl>     <dbl>       <dbl>
##  1 Mcdonalds  Arti~      380      60         7       2       0            95
##  2 Mcdonalds  Sing~      840     410        45      17       1.5         130
##  3 Mcdonalds  Doub~     1130     600        67      27       3           220
##  4 Mcdonalds  Gril~      750     280        31      10       0.5         155
##  5 Mcdonalds  Cris~      920     410        45      12       0.5         120
##  6 Mcdonalds  Big ~      540     250        28      10       1            80
##  7 Mcdonalds  Chee~      300     100        12       5       0.5          40
##  8 Mcdonalds  Clas~      510     210        24       4       0            65
##  9 Mcdonalds  Doub~      430     190        21      11       1            85
## 10 Mcdonalds  Doub~      770     400        45      21       2.5         175
## # ... with 505 more rows, and 9 more variables: sodium <dbl>, total_carb <dbl>,
## #   fiber <dbl>, sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>,
## #   calcium <dbl>, salad <chr>

Exercise 0

Insert any text here.

head(fastfood)
## # A tibble: 6 x 17
##   restaurant item  calories cal_fat total_fat sat_fat trans_fat cholesterol
##   <chr>      <chr>    <dbl>   <dbl>     <dbl>   <dbl>     <dbl>       <dbl>
## 1 Mcdonalds  Arti~      380      60         7       2       0            95
## 2 Mcdonalds  Sing~      840     410        45      17       1.5         130
## 3 Mcdonalds  Doub~     1130     600        67      27       3           220
## 4 Mcdonalds  Gril~      750     280        31      10       0.5         155
## 5 Mcdonalds  Cris~      920     410        45      12       0.5         120
## 6 Mcdonalds  Big ~      540     250        28      10       1            80
## # ... with 9 more variables: sodium <dbl>, total_carb <dbl>, fiber <dbl>,
## #   sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>, calcium <dbl>,
## #   salad <chr>
glimpse(fastfood)
## Rows: 515
## Columns: 17
## $ restaurant  <chr> "Mcdonalds", "Mcdonalds", "Mcdonalds", "Mcdonalds", "Mc...
## $ item        <chr> "Artisan Grilled Chicken Sandwich", "Single Bacon Smoke...
## $ calories    <dbl> 380, 840, 1130, 750, 920, 540, 300, 510, 430, 770, 380,...
## $ cal_fat     <dbl> 60, 410, 600, 280, 410, 250, 100, 210, 190, 400, 170, 3...
## $ total_fat   <dbl> 7, 45, 67, 31, 45, 28, 12, 24, 21, 45, 18, 34, 20, 34, ...
## $ sat_fat     <dbl> 2.0, 17.0, 27.0, 10.0, 12.0, 10.0, 5.0, 4.0, 11.0, 21.0...
## $ trans_fat   <dbl> 0.0, 1.5, 3.0, 0.5, 0.5, 1.0, 0.5, 0.0, 1.0, 2.5, 0.0, ...
## $ cholesterol <dbl> 95, 130, 220, 155, 120, 80, 40, 65, 85, 175, 40, 95, 12...
## $ sodium      <dbl> 1110, 1580, 1920, 1940, 1980, 950, 680, 1040, 1040, 129...
## $ total_carb  <dbl> 44, 62, 63, 62, 81, 46, 33, 49, 35, 42, 38, 48, 48, 67,...
## $ fiber       <dbl> 3, 2, 3, 2, 4, 3, 2, 3, 2, 3, 2, 3, 3, 5, 2, 2, 3, 3, 5...
## $ sugar       <dbl> 11, 18, 18, 18, 18, 9, 7, 6, 7, 10, 5, 11, 11, 11, 6, 3...
## $ protein     <dbl> 37, 46, 70, 55, 46, 25, 15, 25, 25, 51, 15, 32, 42, 33,...
## $ vit_a       <dbl> 4, 6, 10, 6, 6, 10, 10, 0, 20, 20, 2, 10, 10, 10, 2, 4,...
## $ vit_c       <dbl> 20, 20, 20, 25, 20, 2, 2, 4, 4, 6, 0, 10, 20, 15, 2, 6,...
## $ calcium     <dbl> 20, 20, 50, 20, 20, 15, 10, 2, 15, 20, 15, 35, 35, 35, ...
## $ salad       <chr> "Other", "Other", "Other", "Other", "Other", "Other", "...
mcdonalds <- fastfood %>%
  filter(restaurant == "Mcdonalds")
dairy_queen <- fastfood %>%
  filter(restaurant == "Dairy Queen")

Exercise 1

dqmean <- mean(dairy_queen$cal_fat)
dqsd <- sd(dairy_queen$cal_fat)
ggplot(data = dairy_queen, aes(x = cal_fat)) +
  geom_blank() +
  geom_histogram(aes(y = ..density..)) +
  stat_function(fun = dnorm, args = c(mean = dqmean, sd = dqsd), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Exercise 2

ggplot(data = dairy_queen, aes(sample = cal_fat)) +
  geom_line(stat = "qq")

### Exercise 3

sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)
qqnormsim(sample = cal_fat, data = dairy_queen)

### Exercise 4

The plot using actual DQ data looks much different than all 8 simulated plots. In the DQ data, there is a marked sharp rise at x = 1.45; none of the simulated plots show that pattern. Sim 6 comes close, but it doesn’t have the steep rise the DQ data have.

Exercise 5

mcdmean <- mean(mcdonalds$cal_fat)
mcdsd <- sd(mcdonalds$cal_fat)
mcdmean
## [1] 285.614
ggplot(data = mcdonalds, aes(x = cal_fat)) +
  geom_blank() +
  geom_histogram(aes(y = ..density..)) +
  stat_function(fun = dnorm, args = c(mean = mcdmean, sd = mcdsd), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = mcdonalds, aes(sample = cal_fat)) +
  geom_line(stat = "qq")

Normal Probabilities

pnorm(q = 600, mean = dqmean, sd = dqsd)
## [1] 0.9849848
1-pnorm(q = 600, mean =dqmean, sd = dqsd)
## [1] 0.01501523

`

dairy_queen %>%
  filter(cal_fat > 600) %>%
  summarize(percent = n() / nrow (dairy_queen))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1  0.0476
getwd()
## [1] "C:/Users/Jerome/Documents/Math_217_Week_4_RLab"

Exercise 6

TWo questions I would like to answer about any of the restaurants.

  1. What is the probability of getting an item w/ a cholesterol level < 50 at Subway?
  2. What is the probability of getting an item w/ a cal_faat level > 150 at Subway?

Step 1 - Filter on Subway, calculate means and standard deviations of cholesterol and cal_fat.

subway <- fastfood %>%
  filter(restaurant == "Subway")

subwaymean <- mean(subway$cal_fat)
subwaysd <- sd(subway$cal_fat)
ggplot(data = subway, aes(x = cal_fat)) +
  geom_blank() +
  geom_histogram(aes(y = ..density..)) +
  stat_function(fun = dnorm, args = c(mean = subwaymean, sd = subwaysd), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

subwaymean2 <- mean(subway$cholesterol)
subwaysd2 <- sd(subway$cholesterol)
ggplot(data = subway, aes(x = cholesterol)) +
  geom_blank() +
  geom_histogram(aes(y = ..density..)) +
  stat_function(fun = dnorm, args = c(mean = subwaymean2, sd = subwaysd2), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Step 2 - Calculate the theoretical probability and the empirical probability of getting an item w/ > 150 calories of fat at Subway.

pnorm(q = 150, mean = subwaymean, sd = subwaysd)
## [1] 0.455404
1-pnorm(q = 150, mean =subwaymean, sd = subwaysd)
## [1] 0.544596
subway %>%
  filter (cal_fat > 150) %>%
  summarise (percent = n() / nrow(subway))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1   0.427

Therefore, the probability of getting an item at Subway w/ > 150 calories of fat (Pr (Y > 150) is somewhere between 0.43 and 0.54. The theoretical probability is 0.54; the empirical probability is 0.43.

Step 3 - Calculate the theoretical probability and empirical probability of getting an item w/ < 50 (mg?) of cholesterol at Subway.

pnorm(q = 50, mean = subwaymean2, sd = subwaysd2)
## [1] 0.3912274
subway %>%
  filter (cholesterol < 50) %>%
  summarise (percent = n() / nrow(subway))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1   0.438

Therefore, the probability of getting an item at Subway w/ < (mg?) of cholesterol is somewhere between 0.39 and 0.44. The theoretical probability is 0.39; the empirical probability is 0.43.

Exercise 7 - Which restaurant is closest to normal for sodium?

1st - calculate what’s normal for sodium

allmean <- mean(fastfood$sodium)
allsd <- sd(fastfood$sodium)
ggplot(data = fastfood, aes(x = sodium)) +
  geom_blank() +
  geom_histogram(aes(y = ..density..)) +
  stat_function(fun = dnorm, args = c(mean = allmean, sd = allsd), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

pnorm(nrow(fastfood),allmean,allsd)
## [1] 0.144445
sim_norm <- rnorm(n = nrow(fastfood), mean = allmean, sd = allsd)
qqnormsim(sample = sodium, data = fastfood)

Calculate Normal for each of the individual restaurants. Begin by creating subsets for each restaurant.

arbys <- fastfood %>%
  filter(restaurant == "Arbys")

bk <- fastfood %>%
  filter(restaurant == "Burger King")

chick <- fastfood %>%
  filter(restaurant == "Chick Fil-A")

sonic <- fastfood %>%
  filter(restaurant == "Sonic")

tb <- fastfood %>%
  filter(restaurant == "Taco Bell")

Calculate the Shapiro-Wilks coefficient for each restaurant.

shapiro.test(subway$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  subway$sodium
## W = 0.92175, p-value = 2.515e-05
shapiro.test (dairy_queen$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  dairy_queen$sodium
## W = 0.84504, p-value = 4.715e-05
shapiro.test(fastfood$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  fastfood$sodium
## W = 0.88668, p-value < 2.2e-16
shapiro.test(bk$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  bk$sodium
## W = 0.97291, p-value = 0.1331
shapiro.test(arbys$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  arbys$sodium
## W = 0.97073, p-value = 0.1985
shapiro.test(mcdonalds$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  mcdonalds$sodium
## W = 0.76922, p-value = 4.458e-08
shapiro.test(tb$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  tb$sodium
## W = 0.95501, p-value = 0.000699
shapiro.test(sonic$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  sonic$sodium
## W = 0.82286, p-value = 1.784e-06
shapiro.test(chick$sodium)
## 
##  Shapiro-Wilk normality test
## 
## data:  chick$sodium
## W = 0.86663, p-value = 0.002503

Based on the Shapiro-Wilks test, it appears Arbys has the highest non-normal sodium levels, followed by Burger King. Overall, the entire dataset shows normal levels of sodium; the other 6 restaurants all show levels of sodium well within normal range, given the probabilities of the Shapiro-Wilks tests on those respective datasets.

Exercise 8 - Stepwise patterns

Calculate the means and standard deviations for each restaurant.

arbysmean <- mean(arbys$sodium)
arbyssd <- sd(arbys$sodium)


bkmean <- mean(fastfood$sodium)
bksd <- sd(fastfood$sodium)


allmean <- mean(bk$sodium)
allsd <- sd(bk$sodium)



chickmean <- mean(chick$sodium)
chicksd <- sd(chick$sodium)

sonicmean <- mean(sonic$sodium)
sonicsd <- sd(sonic$sodium)


tbmean <- mean(tb$sodium)
tbsd <- sd(tb$sodium)

Now produce the QQ plots

ggplot (data = arbys, aes(sample = sodium)) +
  geom_line(stat = "qq") +
labs(title = "Arbys")

ggplot (data = bk, aes(sample = sodium)) +
 geom_line(stat= "qq") +
labs(title = "Burger King")

ggplot (data = chick, aes(sample = sodium)) +
  geom_line(stat= "qq") +
  labs(title = "Chick Fil-A")

ggplot (data = dairy_queen, aes(sample = sodium)) +
  geom_line(stat= "qq") +
  labs(title = "Dairy Queen")

ggplot (data = mcdonalds, aes(sample = sodium)) +
  geom_line(stat= "qq") +
  labs(title = "McDonalds")

ggplot (data = sonic, aes(sample = sodium)) +
  geom_line(stat= "qq") +
  labs(title = "Sonic")

ggplot (data = subway, aes(sample = sodium)) +
  geom_line(stat= "qq") +
  labs(title = "Subway")

ggplot (data = tb, aes(sample = sodium)) +
  geom_line(stat= "qq") +
  labs(title = "Taco Bell")

ggplot (data = fastfood, aes(sample = sodium)) +
  geom_line(stat= "qq") +
  labs(title = "All")

The stepwise pattern may be caused by the sodium levels in the different items. If an item has a much greatere sodium level than the previous item, that will cause the line to “jump.”

Exercise 9 - Total Carbs, Normal Probability Plot and Histogram

ggplot (data = subway, aes(sample = total_carb)) +
  geom_line(stat= "qq") +
  labs(title = "Subway")

This appears to be skewed to the left; the tail will be long to the origin, with most of the bars to the right of the histogram

hist (subway$total_carb, main = "Total Carbs in Selected Subway Items", xlab = "Total Carbs")

I guess I missed my guess; the distribution is somewhat bi-modal, with tails (sort of) at either end.

LS0tDQp0aXRsZTogIkxhYiBOYW1lIg0KYXV0aG9yOiAiQXV0aG9yIE5hbWUiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KYGBgDQpgYGB7cn0NCndyaXRlLmNzdiAoZmFzdGZvb2QsICJmYXN0Zm9vZC5jc3YiKQ0KZ2V0d2QoKQ0KZmFzdGZvb2QNCmBgYA0KDQojIyMgRXhlcmNpc2UgMA0KDQpJbnNlcnQgYW55IHRleHQgaGVyZS4NCg0KYGBge3J9DQpoZWFkKGZhc3Rmb29kKQ0KZ2xpbXBzZShmYXN0Zm9vZCkNCm1jZG9uYWxkcyA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIk1jZG9uYWxkcyIpDQpkYWlyeV9xdWVlbiA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikNCiAgDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDENCg0KYGBge3J9DQoNCmRxbWVhbiA8LSBtZWFuKGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpkcXNkIDwtIHNkKGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpnZ3Bsb3QoZGF0YSA9IGRhaXJ5X3F1ZWVuLCBhZXMoeCA9IGNhbF9mYXQpKSArDQogIGdlb21fYmxhbmsoKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBjKG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCksIGNvbCA9ICJ0b21hdG8iKQ0KDQoNCg0KYGBgDQoNCiMjIyBFeGVyY2lzZSAyDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoZGF0YSA9IGRhaXJ5X3F1ZWVuLCBhZXMoc2FtcGxlID0gY2FsX2ZhdCkpICsNCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KDQoNCg0KYGBgDQojIyMgRXhlcmNpc2UgMw0KDQpgYGB7cn0NCg0Kc2ltX25vcm0gPC0gcm5vcm0obiA9IG5yb3coZGFpcnlfcXVlZW4pLCBtZWFuID0gZHFtZWFuLCBzZCA9IGRxc2QpDQpxcW5vcm1zaW0oc2FtcGxlID0gY2FsX2ZhdCwgZGF0YSA9IGRhaXJ5X3F1ZWVuKQ0KDQpgYGANCiMjIyBFeGVyY2lzZSA0DQoNClRoZSBwbG90IHVzaW5nIGFjdHVhbCBEUSBkYXRhIGxvb2tzIG11Y2ggZGlmZmVyZW50IHRoYW4gYWxsIDggc2ltdWxhdGVkIHBsb3RzLiBJbiB0aGUgRFEgZGF0YSwgdGhlcmUgaXMgYSBtYXJrZWQgc2hhcnAgcmlzZSBhdCB4ID0gMS40NTsgbm9uZSBvZiB0aGUgc2ltdWxhdGVkIHBsb3RzIHNob3cgdGhhdCBwYXR0ZXJuLiBTaW0gNiBjb21lcyBjbG9zZSwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0aGUgc3RlZXAgcmlzZSB0aGUgRFEgZGF0YSBoYXZlLiAgDQoNCiMjIyBFeGVyY2lzZSA1DQoNCg0KYGBge3J9DQoNCm1jZG1lYW4gPC0gbWVhbihtY2RvbmFsZHMkY2FsX2ZhdCkNCm1jZHNkIDwtIHNkKG1jZG9uYWxkcyRjYWxfZmF0KQ0KbWNkbWVhbg0KDQoNCg0KDQoNCg0KDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbWNkb25hbGRzLCBhZXMoeCA9IGNhbF9mYXQpKSArDQogIGdlb21fYmxhbmsoKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBjKG1lYW4gPSBtY2RtZWFuLCBzZCA9IG1jZHNkKSwgY29sID0gInRvbWF0byIpDQoNCg0KZ2dwbG90KGRhdGEgPSBtY2RvbmFsZHMsIGFlcyhzYW1wbGUgPSBjYWxfZmF0KSkgKw0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQoNCg0KDQoNCg0KYGBgDQoNCiMjIyBOb3JtYWwgUHJvYmFiaWxpdGllcw0KDQoNCmBgYHtyfQ0KDQpwbm9ybShxID0gNjAwLCBtZWFuID0gZHFtZWFuLCBzZCA9IGRxc2QpDQoNCjEtcG5vcm0ocSA9IDYwMCwgbWVhbiA9ZHFtZWFuLCBzZCA9IGRxc2QpDQoNCmBgYA0KDQoNCmANCmBgYHtyfQ0KDQpkYWlyeV9xdWVlbiAlPiUNCiAgZmlsdGVyKGNhbF9mYXQgPiA2MDApICU+JQ0KICBzdW1tYXJpemUocGVyY2VudCA9IG4oKSAvIG5yb3cgKGRhaXJ5X3F1ZWVuKSkNCg0KDQpgYGANCmBgYHtyfQ0KZ2V0d2QoKQ0KDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDYNCg0KDQojIyMjIFRXbyBxdWVzdGlvbnMgSSB3b3VsZCBsaWtlIHRvIGFuc3dlciBhYm91dCBhbnkgb2YgdGhlIHJlc3RhdXJhbnRzLiANCg0KMS4gIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgYW4gaXRlbSB3LyAgYSBjaG9sZXN0ZXJvbCBsZXZlbCA8IDUwIGF0IFN1YndheT8NCjIuICBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nIGFuIGl0ZW0gdy8gYSBjYWxfZmFhdCBsZXZlbCA+IDE1MCBhdCBTdWJ3YXk/IA0KDQojIyMgU3RlcCAxIC0gRmlsdGVyIG9uIFN1YndheSwgY2FsY3VsYXRlIG1lYW5zIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIGNob2xlc3Rlcm9sIGFuZCBjYWxfZmF0Lg0KDQpgYGB7cn0NCg0Kc3Vid2F5IDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiU3Vid2F5IikNCg0Kc3Vid2F5bWVhbiA8LSBtZWFuKHN1YndheSRjYWxfZmF0KQ0Kc3Vid2F5c2QgPC0gc2Qoc3Vid2F5JGNhbF9mYXQpDQpnZ3Bsb3QoZGF0YSA9IHN1YndheSwgYWVzKHggPSBjYWxfZmF0KSkgKw0KICBnZW9tX2JsYW5rKCkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gYyhtZWFuID0gc3Vid2F5bWVhbiwgc2QgPSBzdWJ3YXlzZCksIGNvbCA9ICJ0b21hdG8iKQ0KDQpgYGANCg0KDQpgYGB7cn0NCnN1YndheW1lYW4yIDwtIG1lYW4oc3Vid2F5JGNob2xlc3Rlcm9sKQ0Kc3Vid2F5c2QyIDwtIHNkKHN1YndheSRjaG9sZXN0ZXJvbCkNCmdncGxvdChkYXRhID0gc3Vid2F5LCBhZXMoeCA9IGNob2xlc3Rlcm9sKSkgKw0KICBnZW9tX2JsYW5rKCkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gYyhtZWFuID0gc3Vid2F5bWVhbjIsIHNkID0gc3Vid2F5c2QyKSwgY29sID0gInRvbWF0byIpDQoNCg0KDQoNCg0KYGBgDQoNCiMjIyBTdGVwIDIgLSBDYWxjdWxhdGUgdGhlIHRoZW9yZXRpY2FsIHByb2JhYmlsaXR5IGFuZCB0aGUgZW1waXJpY2FsIHByb2JhYmlsaXR5ICBvZiBnZXR0aW5nIGFuIGl0ZW0gdy8gPiAxNTAgY2Fsb3JpZXMgb2YgZmF0IGF0IFN1YndheS4gDQoNCg0KYGBge3J9DQpwbm9ybShxID0gMTUwLCBtZWFuID0gc3Vid2F5bWVhbiwgc2QgPSBzdWJ3YXlzZCkNCg0KMS1wbm9ybShxID0gMTUwLCBtZWFuID1zdWJ3YXltZWFuLCBzZCA9IHN1YndheXNkKQ0KDQoNCg0KYGBgDQpgYGB7cn0NCg0Kc3Vid2F5ICU+JQ0KICBmaWx0ZXIgKGNhbF9mYXQgPiAxNTApICU+JQ0KICBzdW1tYXJpc2UgKHBlcmNlbnQgPSBuKCkgLyBucm93KHN1YndheSkpDQoNCg0KYGBgDQojIyMjIFRoZXJlZm9yZSwgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgYW4gaXRlbSBhdCBTdWJ3YXkgdy8gPiAxNTAgY2Fsb3JpZXMgb2YgZmF0IChQciAoWSA+IDE1MCkgaXMgc29tZXdoZXJlIGJldHdlZW4gMC40MyBhbmQgMC41NC4gIFRoZSB0aGVvcmV0aWNhbCAgcHJvYmFiaWxpdHkgaXMgMC41NDsgdGhlIGVtcGlyaWNhbCBwcm9iYWJpbGl0eSBpcyAwLjQzLiAgIA0KDQojIyMgU3RlcCAzIC0gQ2FsY3VsYXRlIHRoZSB0aGVvcmV0aWNhbCBwcm9iYWJpbGl0eSBhbmQgZW1waXJpY2FsIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgYW4gaXRlbSB3LyA8IDUwIChtZz8pIG9mIGNob2xlc3Rlcm9sIGF0IFN1YndheS4gDQoNCmBgYHtyfQ0KDQpwbm9ybShxID0gNTAsIG1lYW4gPSBzdWJ3YXltZWFuMiwgc2QgPSBzdWJ3YXlzZDIpDQoNCg0KDQoNCg0KYGBgDQoNCmBgYHtyfQ0Kc3Vid2F5ICU+JQ0KICBmaWx0ZXIgKGNob2xlc3Rlcm9sIDwgNTApICU+JQ0KICBzdW1tYXJpc2UgKHBlcmNlbnQgPSBuKCkgLyBucm93KHN1YndheSkpDQoNCg0KDQpgYGANCiMjIyMgVGhlcmVmb3JlLCB0aGUgcHJvYmFiaWxpdHkgb2YgZ2V0dGluZyBhbiBpdGVtIGF0IFN1YndheSB3LyA8IChtZz8pIG9mIGNob2xlc3Rlcm9sIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDAuMzkgYW5kIDAuNDQuIFRoZSB0aGVvcmV0aWNhbCBwcm9iYWJpbGl0eSBpcyAwLjM5OyB0aGUgZW1waXJpY2FsIHByb2JhYmlsaXR5IGlzIDAuNDMuIA0KDQoNCiMjIyBFeGVyY2lzZSA3IC0gV2hpY2ggcmVzdGF1cmFudCBpcyBjbG9zZXN0IHRvIG5vcm1hbCBmb3Igc29kaXVtPw0KDQojIyMjIDFzdCAtIGNhbGN1bGF0ZSB3aGF0J3Mgbm9ybWFsIGZvciBzb2RpdW0NCg0KYGBge3J9DQoNCmFsbG1lYW4gPC0gbWVhbihmYXN0Zm9vZCRzb2RpdW0pDQphbGxzZCA8LSBzZChmYXN0Zm9vZCRzb2RpdW0pDQpnZ3Bsb3QoZGF0YSA9IGZhc3Rmb29kLCBhZXMoeCA9IHNvZGl1bSkpICsNCiAgZ2VvbV9ibGFuaygpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLikpICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGMobWVhbiA9IGFsbG1lYW4sIHNkID0gYWxsc2QpLCBjb2wgPSAidG9tYXRvIikNCg0KYGBgDQoNCg0KYGBge3J9DQpwbm9ybShucm93KGZhc3Rmb29kKSxhbGxtZWFuLGFsbHNkKQ0KYGBgDQoNCmBgYHtyfQ0Kc2ltX25vcm0gPC0gcm5vcm0obiA9IG5yb3coZmFzdGZvb2QpLCBtZWFuID0gYWxsbWVhbiwgc2QgPSBhbGxzZCkNCnFxbm9ybXNpbShzYW1wbGUgPSBzb2RpdW0sIGRhdGEgPSBmYXN0Zm9vZCkNCg0KDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KIyMjIENhbGN1bGF0ZSBOb3JtYWwgZm9yIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgcmVzdGF1cmFudHMuIEJlZ2luIGJ5IGNyZWF0aW5nIHN1YnNldHMgZm9yIGVhY2ggcmVzdGF1cmFudC4gDQoNCmBgYHtyfQ0KYXJieXMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJBcmJ5cyIpDQoNCmJrIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiQnVyZ2VyIEtpbmciKQ0KDQpjaGljayA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkNoaWNrIEZpbC1BIikNCg0Kc29uaWMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJTb25pYyIpDQoNCnRiIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiVGFjbyBCZWxsIikNCg0KDQoNCmBgYA0KDQojIyMgQ2FsY3VsYXRlIHRoZSBTaGFwaXJvLVdpbGtzIGNvZWZmaWNpZW50ICBmb3IgZWFjaCByZXN0YXVyYW50Lg0KDQoNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3Qoc3Vid2F5JHNvZGl1bSkNCnNoYXBpcm8udGVzdCAoZGFpcnlfcXVlZW4kc29kaXVtKQ0Kc2hhcGlyby50ZXN0KGZhc3Rmb29kJHNvZGl1bSkNCnNoYXBpcm8udGVzdChiayRzb2RpdW0pDQpzaGFwaXJvLnRlc3QoYXJieXMkc29kaXVtKQ0Kc2hhcGlyby50ZXN0KG1jZG9uYWxkcyRzb2RpdW0pDQpzaGFwaXJvLnRlc3QodGIkc29kaXVtKQ0Kc2hhcGlyby50ZXN0KHNvbmljJHNvZGl1bSkNCnNoYXBpcm8udGVzdChjaGljayRzb2RpdW0pDQoNCg0KDQoNCg0KYGBgDQojIyMjIEJhc2VkIG9uIHRoZSBTaGFwaXJvLVdpbGtzIHRlc3QsIGl0IGFwcGVhcnMgQXJieXMgaGFzIHRoZSBoaWdoZXN0IG5vbi1ub3JtYWwgc29kaXVtIGxldmVscywgZm9sbG93ZWQgYnkgQnVyZ2VyIEtpbmcuIE92ZXJhbGwsIHRoZSBlbnRpcmUgZGF0YXNldCBzaG93cyBub3JtYWwgbGV2ZWxzIG9mIHNvZGl1bTsgdGhlIG90aGVyIDYgcmVzdGF1cmFudHMgYWxsIHNob3cgbGV2ZWxzIG9mIHNvZGl1bSB3ZWxsIHdpdGhpbiBub3JtYWwgcmFuZ2UsIGdpdmVuIHRoZSBwcm9iYWJpbGl0aWVzIG9mIHRoZSBTaGFwaXJvLVdpbGtzIHRlc3RzIG9uIHRob3NlIHJlc3BlY3RpdmUgZGF0YXNldHMuIA0KDQoNCiMjIyBFeGVyY2lzZSA4ICAtIFN0ZXB3aXNlIHBhdHRlcm5zDQoNCiMjIyMgQ2FsY3VsYXRlIHRoZSBtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgZWFjaCByZXN0YXVyYW50LiANCg0KYGBge3J9DQoNCg0KYXJieXNtZWFuIDwtIG1lYW4oYXJieXMkc29kaXVtKQ0KYXJieXNzZCA8LSBzZChhcmJ5cyRzb2RpdW0pDQoNCg0KYmttZWFuIDwtIG1lYW4oZmFzdGZvb2Qkc29kaXVtKQ0KYmtzZCA8LSBzZChmYXN0Zm9vZCRzb2RpdW0pDQoNCg0KYWxsbWVhbiA8LSBtZWFuKGJrJHNvZGl1bSkNCmFsbHNkIDwtIHNkKGJrJHNvZGl1bSkNCg0KDQoNCmNoaWNrbWVhbiA8LSBtZWFuKGNoaWNrJHNvZGl1bSkNCmNoaWNrc2QgPC0gc2QoY2hpY2skc29kaXVtKQ0KDQpzb25pY21lYW4gPC0gbWVhbihzb25pYyRzb2RpdW0pDQpzb25pY3NkIDwtIHNkKHNvbmljJHNvZGl1bSkNCg0KDQp0Ym1lYW4gPC0gbWVhbih0YiRzb2RpdW0pDQp0YnNkIDwtIHNkKHRiJHNvZGl1bSkNCg0KDQoNCg0KDQoNCg0KYGBgDQoNCg0KIyMjIyBOb3cgcHJvZHVjZSB0aGUgIFFRIHBsb3RzDQoNCmBgYHtyfQ0KDQoNCmdncGxvdCAoZGF0YSA9IGFyYnlzLCBhZXMoc2FtcGxlID0gc29kaXVtKSkgKw0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpICsNCmxhYnModGl0bGUgPSAiQXJieXMiKQ0KDQoNCmdncGxvdCAoZGF0YSA9IGJrLCBhZXMoc2FtcGxlID0gc29kaXVtKSkgKw0KIGdlb21fbGluZShzdGF0PSAicXEiKSArDQpsYWJzKHRpdGxlID0gIkJ1cmdlciBLaW5nIikNCg0KZ2dwbG90IChkYXRhID0gY2hpY2ssIGFlcyhzYW1wbGUgPSBzb2RpdW0pKSArDQogIGdlb21fbGluZShzdGF0PSAicXEiKSArDQogIGxhYnModGl0bGUgPSAiQ2hpY2sgRmlsLUEiKQ0KDQpnZ3Bsb3QgKGRhdGEgPSBkYWlyeV9xdWVlbiwgYWVzKHNhbXBsZSA9IHNvZGl1bSkpICsNCiAgZ2VvbV9saW5lKHN0YXQ9ICJxcSIpICsNCiAgbGFicyh0aXRsZSA9ICJEYWlyeSBRdWVlbiIpDQoNCmdncGxvdCAoZGF0YSA9IG1jZG9uYWxkcywgYWVzKHNhbXBsZSA9IHNvZGl1bSkpICsNCiAgZ2VvbV9saW5lKHN0YXQ9ICJxcSIpICsNCiAgbGFicyh0aXRsZSA9ICJNY0RvbmFsZHMiKQ0KDQoNCmdncGxvdCAoZGF0YSA9IHNvbmljLCBhZXMoc2FtcGxlID0gc29kaXVtKSkgKw0KICBnZW9tX2xpbmUoc3RhdD0gInFxIikgKw0KICBsYWJzKHRpdGxlID0gIlNvbmljIikNCg0KDQpnZ3Bsb3QgKGRhdGEgPSBzdWJ3YXksIGFlcyhzYW1wbGUgPSBzb2RpdW0pKSArDQogIGdlb21fbGluZShzdGF0PSAicXEiKSArDQogIGxhYnModGl0bGUgPSAiU3Vid2F5IikNCg0KDQpnZ3Bsb3QgKGRhdGEgPSB0YiwgYWVzKHNhbXBsZSA9IHNvZGl1bSkpICsNCiAgZ2VvbV9saW5lKHN0YXQ9ICJxcSIpICsNCiAgbGFicyh0aXRsZSA9ICJUYWNvIEJlbGwiKQ0KDQpnZ3Bsb3QgKGRhdGEgPSBmYXN0Zm9vZCwgYWVzKHNhbXBsZSA9IHNvZGl1bSkpICsNCiAgZ2VvbV9saW5lKHN0YXQ9ICJxcSIpICsNCiAgbGFicyh0aXRsZSA9ICJBbGwiKQ0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCmBgYA0KDQojIyMjIFRoZSBzdGVwd2lzZSBwYXR0ZXJuIG1heSBiZSBjYXVzZWQgYnkgIHRoZSBzb2RpdW0gbGV2ZWxzIGluIHRoZSBkaWZmZXJlbnQgaXRlbXMuIElmIGFuIGl0ZW0gaGFzIGEgbXVjaCBncmVhdGVyZSBzb2RpdW0gbGV2ZWwgdGhhbiB0aGUgcHJldmlvdXMgaXRlbSwgdGhhdCB3aWxsIGNhdXNlIHRoZSBsaW5lIHRvICJqdW1wLiINCg0KDQoNCiMjIyBFeGVyY2lzZSA5ICAtIFRvdGFsIENhcmJzLCBOb3JtYWwgUHJvYmFiaWxpdHkgUGxvdCBhbmQgSGlzdG9ncmFtDQoNCg0KYGBge3J9DQoNCmdncGxvdCAoZGF0YSA9IHN1YndheSwgYWVzKHNhbXBsZSA9IHRvdGFsX2NhcmIpKSArDQogIGdlb21fbGluZShzdGF0PSAicXEiKSArDQogIGxhYnModGl0bGUgPSAiU3Vid2F5IikNCg0KDQoNCg0KDQpgYGANCg0KVGhpcyBhcHBlYXJzIHRvIGJlIHNrZXdlZCB0byB0aGUgbGVmdDsgdGhlIHRhaWwgd2lsbCBiZSBsb25nIHRvICB0aGUgb3JpZ2luLCB3aXRoIG1vc3Qgb2YgdGhlIGJhcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBoaXN0b2dyYW0NCg0KDQpgYGB7cn0NCg0KaGlzdCAoc3Vid2F5JHRvdGFsX2NhcmIsIG1haW4gPSAiVG90YWwgQ2FyYnMgaW4gU2VsZWN0ZWQgU3Vid2F5IEl0ZW1zIiwgeGxhYiA9ICJUb3RhbCBDYXJicyIpDQpgYGANCg0KIyMjIyBJIGd1ZXNzIEkgbWlzc2VkIG15IGd1ZXNzOyB0aGUgZGlzdHJpYnV0aW9uIGlzIHNvbWV3aGF0IGJpLW1vZGFsLCB3aXRoIHRhaWxzIChzb3J0IG9mKSBhdCBlaXRoZXIgZW5kLiA=