Loading data and packages

library(tidyverse)
library(openintro)

Data

data("fastfood", package='openintro')
head(fastfood)
## # A tibble: 6 × 17
##   restaurant item       calories cal_fat total_fat sat_fat trans_fat cholesterol
##   <chr>      <chr>         <dbl>   <dbl>     <dbl>   <dbl>     <dbl>       <dbl>
## 1 Mcdonalds  Artisan G…      380      60         7       2       0            95
## 2 Mcdonalds  Single Ba…      840     410        45      17       1.5         130
## 3 Mcdonalds  Double Ba…     1130     600        67      27       3           220
## 4 Mcdonalds  Grilled B…      750     280        31      10       0.5         155
## 5 Mcdonalds  Crispy Ba…      920     410        45      12       0.5         120
## 6 Mcdonalds  Big Mac         540     250        28      10       1            80
## # ℹ 9 more variables: sodium <dbl>, total_carb <dbl>, fiber <dbl>, sugar <dbl>,
## #   protein <dbl>, vit_a <dbl>, vit_c <dbl>, calcium <dbl>, salad <chr>

Let’s first focus on just products from McDonalds and Dairy Queen.

mcdonalds <- fastfood %>%
  filter(restaurant == "Mcdonalds")
dairy_queen <- fastfood %>%
  filter(restaurant == "Dairy Queen")

Exercise 1

Make a plot (or plots) to visualize the distributions of the amount of calories from fat of the options from these two restaurants. How do their centers, shapes, and spreads compare?

mcdonalds <- fastfood %>%
  filter(restaurant == "Mcdonalds")
dairy_queen <- fastfood %>%
  filter(restaurant == "Dairy Queen")

summary(mcdonalds$cal_fat)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    50.0   160.0   240.0   285.6   320.0  1270.0
hist(mcdonalds$cal_fat)

summary(dairy_queen$cal_fat)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0   160.0   220.0   260.5   310.0   670.0
hist(dairy_queen$cal_fat)

The normal distribution

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")
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Exercise 2

Based on the this plot, does it appear that the data follow a nearly normal distribution?

I think it does appear to have a normal distribution but some width spaces and a little peak at the end.

Evaluating the normal distribution

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

sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)

Exercise 3

Make a normal probability plot of sim_norm. Do all of the points fall on the line? How does this plot compare to the probability plot for the real data? (Since sim_norm is not a data frame, it can be put directly into the sample argument and the data argument can be dropped.).

ggplot(data = NULL, aes(sample = sim_norm)) +
  geom_line(stat = "qq")

qqnormsim(sample = cal_fat, data = dairy_queen)

Exercise 4

Does the normal probability plot for the calories from fat look similar to the plots created for the simulated data? That is, do the plots provide evidence that the calories are nearly normal?.

It does give an initial impression of looking very similar. If we look at the sims closely we will some variations but besides that it looks pretty similar.

Exercise 5

Using the same technique, determine whether or not the calories from McDonald’s menu appear to come from a normal distribution.

Looking at the McDonalds plot we can see that it has a right skew.

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

### Normal probabilities

1 - pnorm(q = 600, mean = dqmean, sd = dqsd)
## [1] 0.01501523
dairy_queen %>% 
  filter(cal_fat > 600) %>%
  summarise(percent = n() / nrow(dairy_queen))
## # A tibble: 1 × 1
##   percent
##     <dbl>
## 1  0.0476

Exercise 6

Write out two probability questions that you would like to answer about any of the restaurants in this dataset. Calculate those probabilities using both the theoretical normal distribution as well as the empirical distribution (four probabilities in all). Which one had a closer agreement between the two methods?.

Question 1: What is the probability that a random item from any of the fast food restaurants has less than 500 calories?

Recommended amount fo calories for: Breakfast: 300-400 calories. Lunch or dinner: 400-500 calories

fastf_mean <- mean(fastfood$calories)
fastf_sd <- sd(fastfood$calories)

pnorm(q = 500, mean = fastf_mean, sd = fastf_sd)
## [1] 0.4564228
fastfood %>% 
  filter(calories < 500) %>%
  summarise(percent = n() / nrow(fastfood))
## # A tibble: 1 × 1
##   percent
##     <dbl>
## 1   0.513

Question 2: What is the probability that a random item from any og the restaurants has less than 13 grams of saturated fat?

The American Heart Association recommends aiming for a dietary pattern that achieves 5% to 6% of calories from saturated fat. For example, if you need about 2,000 calories a day, no more than 120 of them should come from saturated fat. That’s about 13 grams of saturated fat per day.

ffs_mean <- mean(fastfood$sat_fat)
ffs_sd <- sd(fastfood$sat_fat)

pnorm(q = 13, mean = ffs_mean, sd = ffs_sd)
## [1] 0.7748942
fastfood %>% 
  filter(sat_fat < 13) %>%
  summarise(percent = n() / nrow(fastfood))
## # A tibble: 1 × 1
##   percent
##     <dbl>
## 1   0.837

Exercise 7

Now let’s consider some of the other variables in the dataset. Out of all the different restaurants, which ones’ distribution is the closest to normal for sodium?.

Arbys

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

qqnorm(Arbys$sodium, main = "Arbys")

Burger King

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

qqnorm(Burgerk$sodium, main = "Burger King")

Chick Fil-A

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

qqnorm(ChickF$sodium, main = "Chick Fil-A")

Dairy Queen

DairyQ <- fastfood %>%
  filter(restaurant == "Dairy Queen")

qqnorm(DairyQ$sodium, main = "Dairy Queen")

McDonalds

McD <- fastfood %>%
  filter(restaurant == "Mcdonalds")

qqnorm(McD$sodium, main = "McDonald's")

Sonic

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

qqnorm(Sonic$sodium, main = "Sonic")

Subway

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

qqnorm(Subway$sodium, main = "Subway")

Taco Bell

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

qqnorm(TacoB$sodium, main = "Taco Bell")

Burger King appears to a normal distribution for Sodium.

Exercise 8

Note that some of the normal probability plots for sodium distributions seem to have a stepwise pattern. why do you think this might be the case? I think it is beacuse of the multiple item in the menu that contains sodium.

Exercise 9

As you can see, normal probability plots can be used both to assess normality and visualize skewness. Make a normal probability plot for the total carbohydrates from a restaurant of your choice. Based on this normal probability plot, is this variable left skewed, symmetric, or right skewed? Use a histogram to confirm your findings.

Subway.

I picked Subway because I thought that it would be the “healthy” option but I can see that the distribution is asymmetric, it has skewed zones in both sides. I think the menu is the main why the distribution looks different.

hist(Subway$total_carb)

qqnorm(Subway$total_carb, main="Subway")

LS0tDQp0aXRsZTogIkxhYiA0OiBUaGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiINCmF1dGhvcjogIkxhdXJhIEIiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQojIyMgTG9hZGluZyBkYXRhIGFuZCBwYWNrYWdlcw0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmBgYA0KDQoNCiMjIyMgRGF0YQ0KDQpgYGB7cn0NCmRhdGEoImZhc3Rmb29kIiwgcGFja2FnZT0nb3BlbmludHJvJykNCmhlYWQoZmFzdGZvb2QpDQpgYGANCkxldCdzIGZpcnN0IGZvY3VzIG9uIGp1c3QgcHJvZHVjdHMgZnJvbSBNY0RvbmFsZHMgYW5kIERhaXJ5IFF1ZWVuLg0KDQpgYGB7cn0NCm1jZG9uYWxkcyA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIk1jZG9uYWxkcyIpDQpkYWlyeV9xdWVlbiA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikNCmBgYA0KDQoNCiMjIyBFeGVyY2lzZSAxDQoNCk1ha2UgYSBwbG90IChvciBwbG90cykgdG8gdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSBhbW91bnQgb2YgY2Fsb3JpZXMgZnJvbSBmYXQgb2YgdGhlIG9wdGlvbnMgZnJvbSB0aGVzZSB0d28gcmVzdGF1cmFudHMuIEhvdyBkbyB0aGVpciBjZW50ZXJzLCBzaGFwZXMsIGFuZCBzcHJlYWRzIGNvbXBhcmU/DQoNCmBgYHtyfQ0KbWNkb25hbGRzIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiTWNkb25hbGRzIikNCmRhaXJ5X3F1ZWVuIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiRGFpcnkgUXVlZW4iKQ0KDQpzdW1tYXJ5KG1jZG9uYWxkcyRjYWxfZmF0KQ0KaGlzdChtY2RvbmFsZHMkY2FsX2ZhdCkNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoZGFpcnlfcXVlZW4kY2FsX2ZhdCkNCmhpc3QoZGFpcnlfcXVlZW4kY2FsX2ZhdCkNCmBgYA0KDQojIyMgVGhlIG5vcm1hbCBkaXN0cmlidXRpb24NCg0KYGBge3J9DQpkcW1lYW4gPC0gbWVhbihkYWlyeV9xdWVlbiRjYWxfZmF0KQ0KZHFzZCAgIDwtIHNkKGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGRhaXJ5X3F1ZWVuLCBhZXMoeCA9IGNhbF9mYXQpKSArDQogICAgICAgIGdlb21fYmxhbmsoKSArDQogICAgICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pKSArDQogICAgICAgIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBjKG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCksIGNvbCA9ICJ0b21hdG8iKQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDINCg0KQmFzZWQgb24gdGhlIHRoaXMgcGxvdCwgZG9lcyBpdCBhcHBlYXIgdGhhdCB0aGUgZGF0YSBmb2xsb3cgYSBuZWFybHkgbm9ybWFsIGRpc3RyaWJ1dGlvbj8NCg0KSSB0aGluayBpdCBkb2VzIGFwcGVhciB0byBoYXZlIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBidXQgc29tZSB3aWR0aCBzcGFjZXMgYW5kIGEgbGl0dGxlIHBlYWsgYXQgdGhlIGVuZC4gDQoNCiMjIyBFdmFsdWF0aW5nIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uDQoNCg0KYGBge3IgdHJlbmQtZ2lybHN9DQpnZ3Bsb3QoZGF0YSA9IGRhaXJ5X3F1ZWVuLCBhZXMoc2FtcGxlID0gY2FsX2ZhdCkpICsgDQogIGdlb21fbGluZShzdGF0ID0gInFxIikNCmBgYA0KDQpgYGB7cn0NCnNpbV9ub3JtIDwtIHJub3JtKG4gPSBucm93KGRhaXJ5X3F1ZWVuKSwgbWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDMNCg0KTWFrZSBhIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IG9mIHNpbV9ub3JtLiBEbyBhbGwgb2YgdGhlIHBvaW50cyBmYWxsIG9uIHRoZSBsaW5lPyBIb3cgZG9lcyB0aGlzIHBsb3QgY29tcGFyZSB0byB0aGUgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIHJlYWwgZGF0YT8gKFNpbmNlIHNpbV9ub3JtIGlzIG5vdCBhIGRhdGEgZnJhbWUsIGl0IGNhbiBiZSBwdXQgZGlyZWN0bHkgaW50byB0aGUgc2FtcGxlIGFyZ3VtZW50IGFuZCB0aGUgZGF0YSBhcmd1bWVudCBjYW4gYmUgZHJvcHBlZC4pLg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gTlVMTCwgYWVzKHNhbXBsZSA9IHNpbV9ub3JtKSkgKw0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQpgYGANCg0KYGBge3J9DQpxcW5vcm1zaW0oc2FtcGxlID0gY2FsX2ZhdCwgZGF0YSA9IGRhaXJ5X3F1ZWVuKQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDQNCg0KRG9lcyB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgZm9yIHRoZSBjYWxvcmllcyBmcm9tIGZhdCBsb29rIHNpbWlsYXIgdG8gdGhlIHBsb3RzIGNyZWF0ZWQgZm9yIHRoZSBzaW11bGF0ZWQgZGF0YT8gVGhhdCBpcywgZG8gdGhlIHBsb3RzIHByb3ZpZGUgZXZpZGVuY2UgdGhhdCB0aGUgY2Fsb3JpZXMgYXJlIG5lYXJseSBub3JtYWw/Lg0KDQpJdCBkb2VzIGdpdmUgYW4gaW5pdGlhbCBpbXByZXNzaW9uIG9mIGxvb2tpbmcgdmVyeSBzaW1pbGFyLiBJZiB3ZSBsb29rIGF0IHRoZSBzaW1zIGNsb3NlbHkgd2Ugd2lsbCBzb21lIHZhcmlhdGlvbnMgYnV0IGJlc2lkZXMgdGhhdCBpdCBsb29rcyBwcmV0dHkgc2ltaWxhci4gDQoNCg0KIyMjIEV4ZXJjaXNlIDUNCg0KVXNpbmcgdGhlIHNhbWUgdGVjaG5pcXVlLCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGNhbG9yaWVzIGZyb20gTWNEb25hbGTigJlzIG1lbnUgYXBwZWFyIHRvIGNvbWUgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uDQoNCkxvb2tpbmcgYXQgdGhlIE1jRG9uYWxkcyBwbG90IHdlIGNhbiBzZWUgdGhhdCBpdCBoYXMgYSByaWdodCBza2V3LiANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1jZG9uYWxkcywgYWVzKHNhbXBsZSA9IGNhbG9yaWVzKSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KYGBgDQojIyMgTm9ybWFsIHByb2JhYmlsaXRpZXMNCg0KYGBge3J9DQoxIC0gcG5vcm0ocSA9IDYwMCwgbWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKQ0KYGBgDQpgYGB7cn0NCmRhaXJ5X3F1ZWVuICU+JSANCiAgZmlsdGVyKGNhbF9mYXQgPiA2MDApICU+JQ0KICBzdW1tYXJpc2UocGVyY2VudCA9IG4oKSAvIG5yb3coZGFpcnlfcXVlZW4pKQ0KYGBgDQoNCg0KDQoNCiMjIyBFeGVyY2lzZSA2DQoNCldyaXRlIG91dCB0d28gcHJvYmFiaWxpdHkgcXVlc3Rpb25zIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gYW5zd2VyIGFib3V0IGFueSBvZiB0aGUgcmVzdGF1cmFudHMgaW4gdGhpcyBkYXRhc2V0LiBDYWxjdWxhdGUgdGhvc2UgcHJvYmFiaWxpdGllcyB1c2luZyBib3RoIHRoZSB0aGVvcmV0aWNhbCBub3JtYWwgZGlzdHJpYnV0aW9uIGFzIHdlbGwgYXMgdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24gKGZvdXIgcHJvYmFiaWxpdGllcyBpbiBhbGwpLiBXaGljaCBvbmUgaGFkIGEgY2xvc2VyIGFncmVlbWVudCBiZXR3ZWVuIHRoZSB0d28gbWV0aG9kcz8uDQoNClF1ZXN0aW9uIDE6IFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSByYW5kb20gaXRlbSBmcm9tIGFueSBvZiB0aGUgZmFzdCBmb29kIHJlc3RhdXJhbnRzIGhhcyBsZXNzIHRoYW4gNTAwIGNhbG9yaWVzPw0KDQpSZWNvbW1lbmRlZCBhbW91bnQgZm8gY2Fsb3JpZXMgZm9yOg0KQnJlYWtmYXN0OiAzMDAtNDAwIGNhbG9yaWVzLiBMdW5jaCBvciBkaW5uZXI6IDQwMC01MDAgY2Fsb3JpZXMNCg0KYGBge3J9DQpmYXN0Zl9tZWFuIDwtIG1lYW4oZmFzdGZvb2QkY2Fsb3JpZXMpDQpmYXN0Zl9zZCA8LSBzZChmYXN0Zm9vZCRjYWxvcmllcykNCg0KcG5vcm0ocSA9IDUwMCwgbWVhbiA9IGZhc3RmX21lYW4sIHNkID0gZmFzdGZfc2QpDQoNCmZhc3Rmb29kICU+JSANCiAgZmlsdGVyKGNhbG9yaWVzIDwgNTAwKSAlPiUNCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBuKCkgLyBucm93KGZhc3Rmb29kKSkNCmBgYA0KDQpRdWVzdGlvbiAyOiBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGEgcmFuZG9tIGl0ZW0gZnJvbSBhbnkgb2cgdGhlIHJlc3RhdXJhbnRzIGhhcyBsZXNzIHRoYW4gMTMgZ3JhbXMgb2Ygc2F0dXJhdGVkIGZhdD8NCg0KVGhlIEFtZXJpY2FuIEhlYXJ0IEFzc29jaWF0aW9uIHJlY29tbWVuZHMgYWltaW5nIGZvciBhIGRpZXRhcnkgcGF0dGVybiB0aGF0IGFjaGlldmVzIDUlIHRvIDYlIG9mIGNhbG9yaWVzIGZyb20gc2F0dXJhdGVkIGZhdC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBuZWVkIGFib3V0IDIsMDAwIGNhbG9yaWVzIGEgZGF5LCBubyBtb3JlIHRoYW4gMTIwIG9mIHRoZW0gc2hvdWxkIGNvbWUgZnJvbSBzYXR1cmF0ZWQgZmF0LiBUaGF0J3MgYWJvdXQgMTMgZ3JhbXMgb2Ygc2F0dXJhdGVkIGZhdCBwZXIgZGF5Lg0KDQpgYGB7cn0NCmZmc19tZWFuIDwtIG1lYW4oZmFzdGZvb2Qkc2F0X2ZhdCkNCmZmc19zZCA8LSBzZChmYXN0Zm9vZCRzYXRfZmF0KQ0KDQpwbm9ybShxID0gMTMsIG1lYW4gPSBmZnNfbWVhbiwgc2QgPSBmZnNfc2QpDQoNCmZhc3Rmb29kICU+JSANCiAgZmlsdGVyKHNhdF9mYXQgPCAxMykgJT4lDQogIHN1bW1hcmlzZShwZXJjZW50ID0gbigpIC8gbnJvdyhmYXN0Zm9vZCkpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgNw0KDQpOb3cgbGV04oCZcyBjb25zaWRlciBzb21lIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIGRhdGFzZXQuIE91dCBvZiBhbGwgdGhlIGRpZmZlcmVudCByZXN0YXVyYW50cywgd2hpY2ggb25lc+KAmSBkaXN0cmlidXRpb24gaXMgdGhlIGNsb3Nlc3QgdG8gbm9ybWFsIGZvciBzb2RpdW0/Lg0KDQpBcmJ5cw0KDQpgYGB7cn0NCg0KQXJieXMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJBcmJ5cyIpDQoNCnFxbm9ybShBcmJ5cyRzb2RpdW0sIG1haW4gPSAiQXJieXMiKQ0KYGBgDQpCdXJnZXIgS2luZw0KDQpgYGB7cn0NCkJ1cmdlcmsgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJCdXJnZXIgS2luZyIpDQoNCnFxbm9ybShCdXJnZXJrJHNvZGl1bSwgbWFpbiA9ICJCdXJnZXIgS2luZyIpDQpgYGANCg0KQ2hpY2sgRmlsLUENCg0KYGBge3J9DQpDaGlja0YgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJDaGljayBGaWwtQSIpDQoNCnFxbm9ybShDaGlja0Ykc29kaXVtLCBtYWluID0gIkNoaWNrIEZpbC1BIikNCmBgYA0KDQpEYWlyeSBRdWVlbg0KDQpgYGB7cn0NCkRhaXJ5USA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikNCg0KcXFub3JtKERhaXJ5USRzb2RpdW0sIG1haW4gPSAiRGFpcnkgUXVlZW4iKQ0KYGBgDQoNCk1jRG9uYWxkcw0KDQpgYGB7cn0NCk1jRCA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIk1jZG9uYWxkcyIpDQoNCnFxbm9ybShNY0Qkc29kaXVtLCBtYWluID0gIk1jRG9uYWxkJ3MiKQ0KYGBgDQoNClNvbmljDQoNCmBgYHtyfQ0KU29uaWMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJTb25pYyIpDQoNCnFxbm9ybShTb25pYyRzb2RpdW0sIG1haW4gPSAiU29uaWMiKQ0KYGBgDQoNCg0KU3Vid2F5IA0KDQpgYGB7cn0NClN1YndheSA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIlN1YndheSIpDQoNCnFxbm9ybShTdWJ3YXkkc29kaXVtLCBtYWluID0gIlN1YndheSIpDQpgYGANCg0KVGFjbyBCZWxsDQoNCmBgYHtyfQ0KVGFjb0IgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJUYWNvIEJlbGwiKQ0KDQpxcW5vcm0oVGFjb0Ikc29kaXVtLCBtYWluID0gIlRhY28gQmVsbCIpDQpgYGANCg0KQnVyZ2VyIEtpbmcgYXBwZWFycyB0byBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIFNvZGl1bS4NCg0KDQojIyMgRXhlcmNpc2UgOA0KTm90ZSB0aGF0IHNvbWUgb2YgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90cyBmb3Igc29kaXVtIGRpc3RyaWJ1dGlvbnMgc2VlbSB0byBoYXZlIGEgc3RlcHdpc2UgcGF0dGVybi4gd2h5IGRvIHlvdSB0aGluayB0aGlzIG1pZ2h0IGJlIHRoZSBjYXNlPw0KSSB0aGluayBpdCBpcyBiZWFjdXNlIG9mIHRoZSBtdWx0aXBsZSBpdGVtIGluIHRoZSBtZW51IHRoYXQgY29udGFpbnMgc29kaXVtLg0KDQojIyMgRXhlcmNpc2UgOQ0KDQpBcyB5b3UgY2FuIHNlZSwgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3RzIGNhbiBiZSB1c2VkIGJvdGggdG8gYXNzZXNzIG5vcm1hbGl0eSBhbmQgdmlzdWFsaXplIHNrZXduZXNzLiBNYWtlIGEgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgZm9yIHRoZSB0b3RhbCBjYXJib2h5ZHJhdGVzIGZyb20gYSByZXN0YXVyYW50IG9mIHlvdXIgY2hvaWNlLiBCYXNlZCBvbiB0aGlzIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90LCBpcyB0aGlzIHZhcmlhYmxlIGxlZnQgc2tld2VkLCBzeW1tZXRyaWMsIG9yIHJpZ2h0IHNrZXdlZD8gVXNlIGEgaGlzdG9ncmFtIHRvIGNvbmZpcm0geW91ciBmaW5kaW5ncy4NCg0KU3Vid2F5Lg0KDQpJIHBpY2tlZCBTdWJ3YXkgYmVjYXVzZSBJIHRob3VnaHQgdGhhdCBpdCB3b3VsZCBiZSB0aGUgImhlYWx0aHkiIG9wdGlvbiBidXQgSSBjYW4gc2VlIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBhc3ltbWV0cmljLCBpdCBoYXMgc2tld2VkIHpvbmVzIGluIGJvdGggc2lkZXMuIEkgdGhpbmsgdGhlIG1lbnUgaXMgdGhlIG1haW4gd2h5IHRoZSBkaXN0cmlidXRpb24gbG9va3MgZGlmZmVyZW50LiANCg0KYGBge3J9DQpoaXN0KFN1YndheSR0b3RhbF9jYXJiKQ0KYGBgDQoNCg0KYGBge3J9DQpxcW5vcm0oU3Vid2F5JHRvdGFsX2NhcmIsIG1haW49IlN1YndheSIpDQpgYGANCg0K