library(tidyverse)
library(openintro)
data("fastfood", package='openintro')
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  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
## # ... 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>
mcdonalds <- fastfood %>%
  filter(restaurant == "Mcdonalds")
dairy_queen <- fastfood %>%
  filter(restaurant == "Dairy Queen")

Exercise 1

  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?

For both plots I used a histogram and looking at the data for McDonalds it appears to be left skewed with the most of the items containing 500 calories or less, the data also seems to be have one peak. For dairy queen it seems to be normally distributed with the data spread throughout evenly with no skews so it is symmetric and there is also one peak.

ggplot(data=mcdonalds,aes(x=cal_fat)) +
  geom_histogram() +
  labs(title="Mcdonalds")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data=dairy_queen,aes(x=cal_fat)) + 
  geom_histogram()+
  labs(title="Dairy Queen")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Exercise 2

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

It does appear to follow a nearly normal distribution because the curve helps make it appear symmetric and there is a bell curve shaped.

Exercise 3

  1. 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.)

The points seem to follow the line but the plot seems to show more errant points that tend to divert away from the line than the original plot.

dqmean <- mean(dairy_queen$cal_fat)
dqsd   <- sd(dairy_queen$cal_fat)
sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)
sim_norm1 <-as.data.frame(sim_norm)
ggplot(data=sim_norm1,aes(sample=sim_norm)) + 
  geom_line(stat="qq")

Exercise 4

  1. 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?

The normal probability plot for the calories look somewhat similar to the plots but the plots do provide evidence that the calories are normal since they seem to close follow a diagonal line but with some errants dots.

Exercise 5

The calories from McDonald’s appear to come from a normal distribution if we follow the charts, they seem to follow a mostly diagonal line.

qqnormsim(sample = cal_fat, data = mcdonalds)

Exercise 6

  1. 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 randomly chosen Dairy Queen item has more than 300 calories?

avgdq <- mean(dairy_queen$calories)
sddq <- sd(dairy_queen$calories)

## Theoretical Method:

  1 - pnorm(q=300, mean=avgdq ,sd=sddq)
## [1] 0.8021241
## Empirical Method:

dairy_queen %>% 
  filter(calories > 300) %>%
  summarise(percent = n() / nrow(dairy_queen))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1   0.833

Looking at both methods the probabilities of both are reasonably close with the theoretical method being 80% and the empirical being 83%.

Question 2

What is the probability that a randomly chosen McDonald item has more than 300 calories?

avgmcd <- mean(mcdonalds$calories)
sdmcd <- sd(mcdonalds$calories)


## Theoretical Method
1 - pnorm(q=300,mean=avgmcd,sd=sdmcd)
## [1] 0.7963677
## Empirical Method:

mcdonalds %>% 
  filter(calories > 300) %>%
  summarise(percent = n() / nrow(mcdonalds))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1   0.842

The probabilities of the McDonald item having more than 300 calories using the theoretical method we get the probability being approximately 80% and using the empirical method we get the probability being 84%.

Looking at the 4 probabilities we can see that they both have same agreement between the two methods. With each item having a probability of 80% using the theoretical method and a probability of 84% using the empirical method, despite the slight difference they are pretty close to being normal.

Exercise 7

  1. 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?
##1
ggplot(data = mcdonalds, aes(sample = sodium)) + 
  geom_line(stat = "qq")

##2
ggplot(data = dairy_queen, aes(sample = sodium)) + 
  geom_line(stat = "qq")

##3
ChickFilA <- fastfood %>%
  filter(restaurant == "Chick Fil-A")

ggplot(data = ChickFilA, aes(sample = sodium)) + 
  geom_line(stat = "qq")

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

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

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

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

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

ggplot(data = Burger_King, aes(sample = sodium)) + 
  geom_line(stat = "qq")

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

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

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

ggplot(data = Taco_Bell, aes(sample = sodium)) + 
  geom_line(stat = "qq")

The closest distribution to Normal I would see is Subway even though there is some errant points on the lower tail it seems to mostly resemble a diagonal line.

Exercise 8

  1. 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 wonder if its because the sodium distribution is too high in certain items that it causes the graph to appear this way.But it can also be explained that the data for sodium has many repeated values.

Exercise 9

  1. 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.
ggplot(data=mcdonalds,aes(sample = total_carb)) +
  geom_line(stat="qq")

I think the variable for total carbs for Mcdonalds is right skewed because there is such a deviation at the right tail and its moving forward in a straight line.

ggplot(data = mcdonalds, aes(x = total_carb)) +
        geom_blank() +
        geom_histogram(aes(y = ..density..)) +
        stat_function(fun = dnorm, args = c(mean = mean(mcdonalds$total_carb), sd = sd(mcdonalds$total_carb)), col = "blue")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

You can see that there is a creation of a tail forming on the right hand side, which suggests that the skewness is positive.

LS0tDQp0aXRsZTogIkxhYiA0Ig0KYXV0aG9yOiAiQWwgSGFxdWUiDQpkYXRlOiAiYEZlYiAyNGAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KZGF0YSgiZmFzdGZvb2QiLCBwYWNrYWdlPSdvcGVuaW50cm8nKQ0KaGVhZChmYXN0Zm9vZCkNCmBgYA0KDQpgYGB7cn0NCm1jZG9uYWxkcyA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIk1jZG9uYWxkcyIpDQpkYWlyeV9xdWVlbiA8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KDQoxLiAgTWFrZSBhIHBsb3QgKG9yIHBsb3RzKSB0byB2aXN1YWxpemUgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIGFtb3VudCBvZiBjYWxvcmllcyBmcm9tIGZhdCBvZiB0aGUgb3B0aW9ucyBmcm9tIHRoZXNlIHR3byByZXN0YXVyYW50cy4gIEhvdyBkbyB0aGVpciBjZW50ZXJzLCBzaGFwZXMsIGFuZCBzcHJlYWRzIGNvbXBhcmU/DQoNCkZvciBib3RoIHBsb3RzIEkgdXNlZCBhIGhpc3RvZ3JhbSBhbmQgbG9va2luZyBhdCB0aGUgZGF0YSBmb3IgTWNEb25hbGRzIGl0IGFwcGVhcnMgdG8gYmUgbGVmdCBza2V3ZWQgd2l0aCB0aGUgbW9zdCBvZiB0aGUgaXRlbXMgY29udGFpbmluZyA1MDAgY2Fsb3JpZXMgb3IgbGVzcywgdGhlIGRhdGEgYWxzbyBzZWVtcyB0byBiZSBoYXZlIG9uZSBwZWFrLiBGb3IgZGFpcnkgcXVlZW4gaXQgc2VlbXMgdG8gYmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgZGF0YSBzcHJlYWQgdGhyb3VnaG91dCBldmVubHkgd2l0aCBubyBza2V3cyBzbyBpdCBpcyBzeW1tZXRyaWMgYW5kIHRoZXJlIGlzIGFsc28gb25lIHBlYWsuICANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1tY2RvbmFsZHMsYWVzKHg9Y2FsX2ZhdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oKSArDQogIGxhYnModGl0bGU9Ik1jZG9uYWxkcyIpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhPWRhaXJ5X3F1ZWVuLGFlcyh4PWNhbF9mYXQpKSArIA0KICBnZW9tX2hpc3RvZ3JhbSgpKw0KICBsYWJzKHRpdGxlPSJEYWlyeSBRdWVlbiIpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgMiANCg0KMi4gIEJhc2VkIG9uIHRoZSB0aGlzIHBsb3QsIGRvZXMgaXQgYXBwZWFyIHRoYXQgdGhlIGRhdGEgZm9sbG93IGEgbmVhcmx5IG5vcm1hbCANCiAgICBkaXN0cmlidXRpb24/DQoNCiAgSXQgZG9lcyBhcHBlYXIgdG8gZm9sbG93IGEgbmVhcmx5IG5vcm1hbCBkaXN0cmlidXRpb24gYmVjYXVzZSB0aGUgY3VydmUgaGVscHMgbWFrZSBpdCBhcHBlYXIgc3ltbWV0cmljIGFuZCB0aGVyZSBpcyBhIGJlbGwgY3VydmUgc2hhcGVkLg0KICANCiAgDQoNCg0KIyMjIEV4ZXJjaXNlIDMNCiAgDQozLiAgTWFrZSBhIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IG9mIGBzaW1fbm9ybWAuICBEbyBhbGwgb2YgdGhlIHBvaW50cyBmYWxsIG9uIHRoZSBsaW5lPyAgSG93IGRvZXMgdGhpcyBwbG90IGNvbXBhcmUgdG8gdGhlIHByb2JhYmlsaXR5IHBsb3QgZm9yIHRoZSByZWFsIGRhdGE/IChTaW5jZSBgc2ltX25vcm1gIGlzIG5vdCBhIGRhdGEgZnJhbWUsIGl0IGNhbiBiZSBwdXQgZGlyZWN0bHkgaW50byB0aGUgYHNhbXBsZWAgYXJndW1lbnQgYW5kIHRoZSBgZGF0YWAgYXJndW1lbnQgY2FuIGJlIGRyb3BwZWQuKQ0KDQoNCiBUaGUgcG9pbnRzIHNlZW0gdG8gZm9sbG93IHRoZSBsaW5lIGJ1dCB0aGUgcGxvdCBzZWVtcyB0byBzaG93IG1vcmUgZXJyYW50IHBvaW50cyB0aGF0IHRlbmQgdG8gZGl2ZXJ0IGF3YXkgZnJvbSB0aGUgbGluZSB0aGFuIHRoZSBvcmlnaW5hbCBwbG90LiANCg0KYGBge3J9DQpkcW1lYW4gPC0gbWVhbihkYWlyeV9xdWVlbiRjYWxfZmF0KQ0KZHFzZCAgIDwtIHNkKGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpzaW1fbm9ybSA8LSBybm9ybShuID0gbnJvdyhkYWlyeV9xdWVlbiksIG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCkNCnNpbV9ub3JtMSA8LWFzLmRhdGEuZnJhbWUoc2ltX25vcm0pDQpnZ3Bsb3QoZGF0YT1zaW1fbm9ybTEsYWVzKHNhbXBsZT1zaW1fbm9ybSkpICsgDQogIGdlb21fbGluZShzdGF0PSJxcSIpDQpgYGANCiAgDQojIyMgRXhlcmNpc2UgNA0KDQo0LiAgRG9lcyB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgZm9yIHRoZSBjYWxvcmllcyBmcm9tIGZhdCBsb29rIHNpbWlsYXIgdG8gdGhlIHBsb3RzIA0KICAgIGNyZWF0ZWQgZm9yIHRoZSBzaW11bGF0ZWQgZGF0YT8gIFRoYXQgaXMsIGRvIHRoZSBwbG90cyBwcm92aWRlIGV2aWRlbmNlIHRoYXQgdGhlDQogICAgY2Fsb3JpZXMgYXJlIG5lYXJseSBub3JtYWw/DQoNClRoZSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIGNhbG9yaWVzIGxvb2sgc29tZXdoYXQgc2ltaWxhciB0byB0aGUgcGxvdHMgYnV0IHRoZSBwbG90cyBkbyBwcm92aWRlIGV2aWRlbmNlIHRoYXQgdGhlIGNhbG9yaWVzIGFyZSBub3JtYWwgc2luY2UgdGhleSBzZWVtIHRvIGNsb3NlIGZvbGxvdyBhIGRpYWdvbmFsIGxpbmUgYnV0IHdpdGggc29tZSBlcnJhbnRzIGRvdHMuICANCg0KDQojIyMgRXhlcmNpc2UgNQ0KDQogIFRoZSBjYWxvcmllcyBmcm9tIE1jRG9uYWxkJ3MgYXBwZWFyIHRvIGNvbWUgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24gaWYgd2UgZm9sbG93IHRoZSBjaGFydHMsIHRoZXkgc2VlbSB0byBmb2xsb3cgYSBtb3N0bHkgZGlhZ29uYWwgbGluZS4gDQoNCmBgYHtyfQ0KcXFub3Jtc2ltKHNhbXBsZSA9IGNhbF9mYXQsIGRhdGEgPSBtY2RvbmFsZHMpDQpgYGANCg0KDQoNCiMjIyBFeGVyY2lzZSA2DQoNCjYuICBXcml0ZSBvdXQgdHdvIHByb2JhYmlsaXR5IHF1ZXN0aW9ucyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGFuc3dlciBhYm91dCBhbnkgb2YgdGhlIHJlc3RhdXJhbnRzIGluIHRoaXMgZGF0YXNldC4gIENhbGN1bGF0ZSB0aG9zZSBwcm9iYWJpbGl0aWVzIHVzaW5nIGJvdGggdGhlIHRoZW9yZXRpY2FsIG5vcm1hbCBkaXN0cmlidXRpb24gYXMgd2VsbCBhcyB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiAoZm91ciBwcm9iYWJpbGl0aWVzIGluIGFsbCkuICBXaGljaCBvbmUgaGFkIGEgY2xvc2VyIGFncmVlbWVudCBiZXR3ZWVuIHRoZSB0d28gbWV0aG9kcz8NCg0KIyMjIyMgIFF1ZXN0aW9uIDENCiAgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIHJhbmRvbWx5IGNob3NlbiBEYWlyeSBRdWVlbiBpdGVtIGhhcyBtb3JlIHRoYW4gMzAwIGNhbG9yaWVzPw0KDQpgYGB7cn0NCmF2Z2RxIDwtIG1lYW4oZGFpcnlfcXVlZW4kY2Fsb3JpZXMpDQpzZGRxIDwtIHNkKGRhaXJ5X3F1ZWVuJGNhbG9yaWVzKQ0KDQojIyBUaGVvcmV0aWNhbCBNZXRob2Q6DQoNCiAgMSAtIHBub3JtKHE9MzAwLCBtZWFuPWF2Z2RxICxzZD1zZGRxKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KIyMgRW1waXJpY2FsIE1ldGhvZDoNCg0KZGFpcnlfcXVlZW4gJT4lIA0KICBmaWx0ZXIoY2Fsb3JpZXMgPiAzMDApICU+JQ0KICBzdW1tYXJpc2UocGVyY2VudCA9IG4oKSAvIG5yb3coZGFpcnlfcXVlZW4pKQ0KYGBgDQoNCg0KTG9va2luZyBhdCBib3RoIG1ldGhvZHMgdGhlIHByb2JhYmlsaXRpZXMgb2YgYm90aCBhcmUgcmVhc29uYWJseSBjbG9zZSB3aXRoIHRoZSB0aGVvcmV0aWNhbCBtZXRob2QgYmVpbmcgODAlIGFuZCB0aGUgZW1waXJpY2FsIGJlaW5nIDgzJS4gDQoNCg0KIyMjIyMgUXVlc3Rpb24gMiANCiAgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIHJhbmRvbWx5IGNob3NlbiBNY0RvbmFsZCBpdGVtIGhhcyBtb3JlIHRoYW4gMzAwIGNhbG9yaWVzPw0KICANCmBgYHtyfQ0KYXZnbWNkIDwtIG1lYW4obWNkb25hbGRzJGNhbG9yaWVzKQ0Kc2RtY2QgPC0gc2QobWNkb25hbGRzJGNhbG9yaWVzKQ0KDQoNCiMjIFRoZW9yZXRpY2FsIE1ldGhvZA0KMSAtIHBub3JtKHE9MzAwLG1lYW49YXZnbWNkLHNkPXNkbWNkKQ0KYGBgDQogIA0KDQpgYGB7cn0NCg0KIyMgRW1waXJpY2FsIE1ldGhvZDoNCg0KbWNkb25hbGRzICU+JSANCiAgZmlsdGVyKGNhbG9yaWVzID4gMzAwKSAlPiUNCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBuKCkgLyBucm93KG1jZG9uYWxkcykpDQpgYGANCg0KICBUaGUgcHJvYmFiaWxpdGllcyBvZiB0aGUgTWNEb25hbGQgaXRlbSBoYXZpbmcgbW9yZSB0aGFuIDMwMCBjYWxvcmllcyB1c2luZyB0aGUgdGhlb3JldGljYWwgbWV0aG9kIHdlIGdldCB0aGUgcHJvYmFiaWxpdHkgYmVpbmcgYXBwcm94aW1hdGVseSA4MCUgYW5kIHVzaW5nIHRoZSBlbXBpcmljYWwgbWV0aG9kIHdlIGdldCB0aGUgcHJvYmFiaWxpdHkgYmVpbmcgODQlLg0KICANCg0KICBMb29raW5nIGF0IHRoZSA0IHByb2JhYmlsaXRpZXMgd2UgY2FuIHNlZSB0aGF0IHRoZXkgYm90aCBoYXZlIHNhbWUgYWdyZWVtZW50IGJldHdlZW4gdGhlIHR3byBtZXRob2RzLiBXaXRoIGVhY2ggaXRlbSBoYXZpbmcgYSBwcm9iYWJpbGl0eSBvZiA4MCUgdXNpbmcgdGhlIHRoZW9yZXRpY2FsIG1ldGhvZCBhbmQgYSBwcm9iYWJpbGl0eSBvZiA4NCUgdXNpbmcgdGhlIGVtcGlyaWNhbCBtZXRob2QsIGRlc3BpdGUgdGhlIHNsaWdodCBkaWZmZXJlbmNlIHRoZXkgYXJlIHByZXR0eSBjbG9zZSB0byBiZWluZyBub3JtYWwuIA0KDQoNCiMjIyBFeGVyY2lzZSA3DQoNCjcuICBOb3cgbGV0J3MgY29uc2lkZXIgc29tZSBvZiB0aGUgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBkYXRhc2V0LiAgT3V0IG9mIGFsbCB0aGUgZGlmZmVyZW50IHJlc3RhdXJhbnRzLCB3aGljaCBvbmVzJyBkaXN0cmlidXRpb24gaXMgdGhlIGNsb3Nlc3QgdG8gbm9ybWFsIGZvciBzb2RpdW0/DQoNCmBgYHtyfQ0KIyMxDQpnZ3Bsb3QoZGF0YSA9IG1jZG9uYWxkcywgYWVzKHNhbXBsZSA9IHNvZGl1bSkpICsgDQogIGdlb21fbGluZShzdGF0ID0gInFxIikNCmBgYA0KDQpgYGB7cn0NCiMjMg0KZ2dwbG90KGRhdGEgPSBkYWlyeV9xdWVlbiwgYWVzKHNhbXBsZSA9IHNvZGl1bSkpICsgDQogIGdlb21fbGluZShzdGF0ID0gInFxIikNCmBgYA0KDQpgYGB7cn0NCiMjMw0KQ2hpY2tGaWxBIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiQ2hpY2sgRmlsLUEiKQ0KDQpnZ3Bsb3QoZGF0YSA9IENoaWNrRmlsQSwgYWVzKHNhbXBsZSA9IHNvZGl1bSkpICsgDQogIGdlb21fbGluZShzdGF0ID0gInFxIikNCmBgYA0KDQpgYGB7cn0NCiMjNA0KU29uaWMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJTb25pYyIpDQoNCmdncGxvdChkYXRhID0gU29uaWMsIGFlcyhzYW1wbGUgPSBzb2RpdW0pKSArIA0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KQXJieXMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJBcmJ5cyIpDQoNCmdncGxvdChkYXRhID0gQXJieXMsIGFlcyhzYW1wbGUgPSBzb2RpdW0pKSArIA0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQoNCmBgYA0KDQpgYGB7cn0NCgkNCkJ1cmdlcl9LaW5nIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSJCdXJnZXIgS2luZyIpIA0KDQpnZ3Bsb3QoZGF0YSA9IEJ1cmdlcl9LaW5nLCBhZXMoc2FtcGxlID0gc29kaXVtKSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KDQpgYGANCg0KYGBge3J9DQpTdWJ3YXkgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09IlN1YndheSIpDQoNCmdncGxvdChkYXRhID0gU3Vid2F5LCBhZXMoc2FtcGxlID0gc29kaXVtKSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KVGFjb19CZWxsIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSJUYWNvIEJlbGwiKQ0KDQpnZ3Bsb3QoZGF0YSA9IFRhY29fQmVsbCwgYWVzKHNhbXBsZSA9IHNvZGl1bSkpICsgDQogIGdlb21fbGluZShzdGF0ID0gInFxIikNCmBgYA0KDQogIFRoZSBjbG9zZXN0IGRpc3RyaWJ1dGlvbiB0byBOb3JtYWwgSSB3b3VsZCBzZWUgaXMgU3Vid2F5IGV2ZW4gdGhvdWdoIHRoZXJlIGlzIHNvbWUgZXJyYW50IHBvaW50cyBvbiB0aGUgbG93ZXIgdGFpbCBpdCBzZWVtcyB0byBtb3N0bHkgcmVzZW1ibGUgYSBkaWFnb25hbCBsaW5lLiANCiAgDQoNCg0KIyMjIEV4ZXJjaXNlIDggICANCg0KDQo4LiAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90cyBmb3Igc29kaXVtIGRpc3RyaWJ1dGlvbnMgc2VlbSB0byBoYXZlIGEgc3RlcHdpc2UgcGF0dGVybi4gd2h5IGRvIHlvdSB0aGluayB0aGlzIG1pZ2h0IGJlIHRoZSBjYXNlPw0KICAgIA0KICBJIHdvbmRlciBpZiBpdHMgYmVjYXVzZSB0aGUgc29kaXVtIGRpc3RyaWJ1dGlvbiBpcyB0b28gaGlnaCBpbiBjZXJ0YWluIGl0ZW1zIHRoYXQgaXQgY2F1c2VzIHRoZSBncmFwaCB0byBhcHBlYXIgdGhpcyB3YXkuQnV0IGl0IGNhbiBhbHNvIGJlIGV4cGxhaW5lZCB0aGF0IHRoZSBkYXRhIGZvciBzb2RpdW0gaGFzIG1hbnkgcmVwZWF0ZWQgdmFsdWVzLiANCg0KDQojIyMgRXhlcmNpc2UgOQ0KDQo5LiAgQXMgeW91IGNhbiBzZWUsIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90cyBjYW4gYmUgdXNlZCBib3RoIHRvIGFzc2VzcyBub3JtYWxpdHkgYW5kIHZpc3VhbGl6ZSBza2V3bmVzcy4gIE1ha2UgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIHRvdGFsIGNhcmJvaHlkcmF0ZXMgZnJvbSBhIHJlc3RhdXJhbnQgb2YgeW91ciBjaG9pY2UuICBCYXNlZCBvbiB0aGlzIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90LCBpcyB0aGlzIHZhcmlhYmxlIGxlZnQgc2tld2VkLCBzeW1tZXRyaWMsIG9yIHJpZ2h0IHNrZXdlZD8gVXNlIGEgaGlzdG9ncmFtIHRvIGNvbmZpcm0geW91ciBmaW5kaW5ncy4NCg0KYGBge3J9DQoNCmdncGxvdChkYXRhPW1jZG9uYWxkcyxhZXMoc2FtcGxlID0gdG90YWxfY2FyYikpICsNCiAgZ2VvbV9saW5lKHN0YXQ9InFxIikNCmBgYA0KDQpJIHRoaW5rIHRoZSB2YXJpYWJsZSBmb3IgdG90YWwgY2FyYnMgZm9yIE1jZG9uYWxkcyBpcyByaWdodCBza2V3ZWQgYmVjYXVzZSB0aGVyZSBpcyBzdWNoIGEgZGV2aWF0aW9uIGF0IHRoZSByaWdodCB0YWlsIGFuZCBpdHMgbW92aW5nIGZvcndhcmQgaW4gYSBzdHJhaWdodCBsaW5lLiANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1jZG9uYWxkcywgYWVzKHggPSB0b3RhbF9jYXJiKSkgKw0KICAgICAgICBnZW9tX2JsYW5rKCkgKw0KICAgICAgICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSkgKw0KICAgICAgICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gYyhtZWFuID0gbWVhbihtY2RvbmFsZHMkdG90YWxfY2FyYiksIHNkID0gc2QobWNkb25hbGRzJHRvdGFsX2NhcmIpKSwgY29sID0gImJsdWUiKQ0KYGBgDQoNCiAgWW91IGNhbiBzZWUgdGhhdCB0aGVyZSBpcyBhIGNyZWF0aW9uIG9mIGEgdGFpbCBmb3JtaW5nIG9uIHRoZSByaWdodCBoYW5kIHNpZGUsIHdoaWNoIHN1Z2dlc3RzIHRoYXQgdGhlIHNrZXduZXNzIGlzIHBvc2l0aXZlLiAgIA0K