library(tidyverse)
library(skimr)
library(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  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>

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")
mcd_cal <- mcdonalds %>%
  select (item, cal_fat)
ggplot(data = mcd_cal, aes(x = cal_fat)) +
  geom_bar()

skim(mcd_cal)
Data summary
Name mcd_cal
Number of rows 57
Number of columns 2
_______________________
Column type frequency:
character 1
numeric 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
item 0 1 5 49 0 57 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
cal_fat 0 1 285.61 220.9 50 160 240 320 1270 ▇▃▁▁▁
dq_cal <- dairy_queen %>%
  select (item, cal_fat)
ggplot(data = dq_cal, aes(x = cal_fat)) +
  geom_bar()

skim(dq_cal)
Data summary
Name dq_cal
Number of rows 42
Number of columns 2
_______________________
Column type frequency:
character 1
numeric 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
item 0 1 7 45 0 42 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
cal_fat 0 1 260.48 156.49 0 160 220 310 670 ▃▇▃▂▁
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

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

Based on the histogram for Dairy Queen, the data doesn’t seem to follow a normal distribution

mcdonaldscal<- mcdonalds%>%
  ggplot(aes(item, cal_fat)) + 
  geom_point(aes(item, cal_fat, color=cal_fat)) +
  geom_smooth(method = "lm", se=FALSE, color="blue", size=.010) +
  ggtitle("Calories from Fat") 
mcdonaldscal
## `geom_smooth()` using formula 'y ~ x'

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 dataframe, it can be put directly into the sample argument and the data argument can be dropped.)

No, all the points don’t fall on the line, the plot curves upward.

qqnorm(sim_norm)
qqline(sim_norm, col = "steelblue", lwd = 2)

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 female heights are nearly normal?

The plot looks similar to the simulated data therefore this is evidence that the data is normally distributed. The amount of variability in the simulated data is similar to the variability observed in the data.

Exercise 5

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

The plots don’t look similar to the simulated data from Mcdonalds therefore this is evidence that the data is not normally distributed. The amount of variability in the simulated data is not similar to the variability observed in the data.

mcmean <- mean(mcdonalds$cal_fat)
mcsd   <- sd(mcdonalds$cal_fat)

sim_norm <- rnorm(n = nrow(mcdonalds), mean = mcmean, sd = mcsd)
qqnorm(sim_norm)
qqline(sim_norm, col = "steelblue", lwd = 2)

qqnormsim(sample = cal_fat, data = mcdonalds)

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 x 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?

What is the probability that a randomly selected item in mcdonalds has calories higher than 800 cal? 9.94%

What is the probability that a randomly selected item in Dairyquee has calories higher than 800 call? 2%

1 - pnorm(800, mean = mcmean, sd = mcsd)
## [1] 0.009940144
1 - pnorm(800, mean = dqmean, sd = dqsd)
## [1] 0.0002826221
1 - pnorm(800, 0, 1)
## [1] 0
1 - pnorm(800, 0, 1)
## [1] 0

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?

Mcdonalds nor Dairy queen are normal but out of the two Dairy queen looks closer to a normal distribution

mcmean <- mean(mcdonalds$sodium)
mcsd   <- sd(mcdonalds$sodium)

sim_norm <- rnorm(n = nrow(mcdonalds), mean = mcmean, sd = mcsd)
qqnorm(sim_norm)
qqline(sim_norm, col = "steelblue", lwd = 2) 
mtext("MC Sodium")

dqmean <- mean(dairy_queen$sodium)
dqsd   <- sd(dairy_queen$sodium)

sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)
qqnorm(sim_norm)
qqline(sim_norm, col = "steelblue", lwd = 2)

qqnormsim(sample = sodium, data = mcdonalds)

qqnormsim(sample = sodium, data = dairy_queen)

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 believe that this may be becacuse it varies per type of product. For example it goes from soda to burger.

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.

It looks like the Subway distribution of carbohydrates is not normal. Based on the histrogram it is skewed to the right

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

submean <- mean(subway$total_carb)
subsd   <- sd(subway$total_carb)

sim_norm <- rnorm(n = nrow(subway), mean = submean, sd = subsd)
qqnorm(sim_norm)
qqline(sim_norm, col = "steelblue", lwd = 2)

qqnormsim(sample = total_carb, data = subway)

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

LS0tCnRpdGxlOiAiVGhlIG5vcm1hbCBkaXN0cmlidXRpb24iCmF1dGhvcjogIk1hcmlhIFR1cGFjIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc2tpbXIpCmxpYnJhcnkob3BlbmludHJvKQpoZWFkKGZhc3Rmb29kKQpgYGAKCiMjIyBFeGVyY2lzZSAxCiMjIyBNYWtlIGEgcGxvdCAob3IgcGxvdHMpIHRvIHZpc3VhbGl6ZSB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgYW1vdW50IG9mIGNhbG9yaWVzIGZyb20gZmF0IG9mIHRoZSBvcHRpb25zIGZyb20gdGhlc2UgdHdvIHJlc3RhdXJhbnRzLiBIb3cgZG8gdGhlaXIgY2VudGVycywgc2hhcGVzLCBhbmQgc3ByZWFkcyBjb21wYXJlPwoKYGBge3IgY29kZS1jaHVuay1sYWJlbH0KbWNkb25hbGRzIDwtIGZhc3Rmb29kICU+JQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJNY2RvbmFsZHMiKQpkYWlyeV9xdWVlbiA8LSBmYXN0Zm9vZCAlPiUKICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiRGFpcnkgUXVlZW4iKQpgYGAKCmBgYHtyfQptY2RfY2FsIDwtIG1jZG9uYWxkcyAlPiUKICBzZWxlY3QgKGl0ZW0sIGNhbF9mYXQpCmdncGxvdChkYXRhID0gbWNkX2NhbCwgYWVzKHggPSBjYWxfZmF0KSkgKwogIGdlb21fYmFyKCkKc2tpbShtY2RfY2FsKQoKYGBgCmBgYHtyfQpkcV9jYWwgPC0gZGFpcnlfcXVlZW4gJT4lCiAgc2VsZWN0IChpdGVtLCBjYWxfZmF0KQpnZ3Bsb3QoZGF0YSA9IGRxX2NhbCwgYWVzKHggPSBjYWxfZmF0KSkgKwogIGdlb21fYmFyKCkKc2tpbShkcV9jYWwpCgpgYGAKCmBgYHtyfQpkcW1lYW4gPC0gbWVhbihkYWlyeV9xdWVlbiRjYWxfZmF0KQpkcXNkICAgPC0gc2QoZGFpcnlfcXVlZW4kY2FsX2ZhdCkKZ2dwbG90KGRhdGEgPSBkYWlyeV9xdWVlbiwgYWVzKHggPSBjYWxfZmF0KSkgKwogICAgICAgIGdlb21fYmxhbmsoKSArCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLikpICsKICAgICAgICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gYyhtZWFuID0gZHFtZWFuLCBzZCA9IGRxc2QpLCBjb2wgPSAidG9tYXRvIikKYGBgCiAKIyMjIEV4ZXJjaXNlIDIKIyMjIEJhc2VkIG9uIHRoZSB0aGlzIHBsb3QsIGRvZXMgaXQgYXBwZWFyIHRoYXQgdGhlIGRhdGEgZm9sbG93IGEgbmVhcmx5IG5vcm1hbCBkaXN0cmlidXRpb24/CiMjIyBCYXNlZCBvbiB0aGUgaGlzdG9ncmFtIGZvciBEYWlyeSBRdWVlbiwgdGhlIGRhdGEgZG9lc24ndCBzZWVtIHRvIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24gCmBgYHtyfQptY2RvbmFsZHNjYWw8LSBtY2RvbmFsZHMlPiUKICBnZ3Bsb3QoYWVzKGl0ZW0sIGNhbF9mYXQpKSArIAogIGdlb21fcG9pbnQoYWVzKGl0ZW0sIGNhbF9mYXQsIGNvbG9yPWNhbF9mYXQpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RkFMU0UsIGNvbG9yPSJibHVlIiwgc2l6ZT0uMDEwKSArCiAgZ2d0aXRsZSgiQ2Fsb3JpZXMgZnJvbSBGYXQiKSAKbWNkb25hbGRzY2FsCgpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGRhaXJ5X3F1ZWVuLCBhZXMoc2FtcGxlID0gY2FsX2ZhdCkpICsgCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQpgYGAKCmBgYHtyfQpzaW1fbm9ybSA8LSBybm9ybShuID0gbnJvdyhkYWlyeV9xdWVlbiksIG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCkKCmBgYAoKIyMjIEV4ZXJjaXNlIDMKIyMjIE1ha2UgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBvZiBzaW1fbm9ybS4gRG8gYWxsIG9mIHRoZSBwb2ludHMgZmFsbCBvbiB0aGUgbGluZT8gSG93IGRvZXMgdGhpcyBwbG90IGNvbXBhcmUgdG8gdGhlIHByb2JhYmlsaXR5IHBsb3QgZm9yIHRoZSByZWFsIGRhdGE/IChTaW5jZSBzaW1fbm9ybSBpcyBub3QgYSBkYXRhZnJhbWUsIGl0IGNhbiBiZSBwdXQgZGlyZWN0bHkgaW50byB0aGUgc2FtcGxlIGFyZ3VtZW50IGFuZCB0aGUgZGF0YSBhcmd1bWVudCBjYW4gYmUgZHJvcHBlZC4pCiMjIyBObywgYWxsIHRoZSBwb2ludHMgZG9uJ3QgZmFsbCBvbiB0aGUgbGluZSwgdGhlIHBsb3QgY3VydmVzIHVwd2FyZC4gCgpgYGB7cn0KcXFub3JtKHNpbV9ub3JtKQpxcWxpbmUoc2ltX25vcm0sIGNvbCA9ICJzdGVlbGJsdWUiLCBsd2QgPSAyKQpgYGAKCgpgYGB7cn0KcXFub3Jtc2ltKHNhbXBsZSA9IGNhbF9mYXQsIGRhdGEgPSBkYWlyeV9xdWVlbikKYGBgCgojIyMgRXhlcmNpc2UgNCAKIyMjIERvZXMgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IGZvciB0aGUgY2Fsb3JpZXMgZnJvbSBmYXQgbG9vayBzaW1pbGFyIHRvIHRoZSBwbG90cyBjcmVhdGVkIGZvciB0aGUgc2ltdWxhdGVkIGRhdGE/IFRoYXQgaXMsIGRvIHRoZSBwbG90cyBwcm92aWRlIGV2aWRlbmNlIHRoYXQgdGhlIGZlbWFsZSBoZWlnaHRzIGFyZSBuZWFybHkgbm9ybWFsPwojIyMgVGhlIHBsb3QgbG9va3Mgc2ltaWxhciB0byB0aGUgc2ltdWxhdGVkIGRhdGEgdGhlcmVmb3JlIHRoaXMgaXMgZXZpZGVuY2UgdGhhdCB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZC4gVGhlIGFtb3VudCBvZiB2YXJpYWJpbGl0eSBpbiB0aGUgc2ltdWxhdGVkIGRhdGEgaXMgc2ltaWxhciB0byB0aGUgdmFyaWFiaWxpdHkgb2JzZXJ2ZWQgaW4gdGhlIGRhdGEuCgojIyMgRXhlcmNpc2UgNQojIyMgVXNpbmcgdGhlIHNhbWUgdGVjaG5pcXVlLCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGNhbG9yaWVzIGZyb20gTWNEb25hbGTigJlzIG1lbnUgYXBwZWFyIHRvIGNvbWUgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24KCiMjIyBUaGUgcGxvdHMgZG9uJ3QgbG9vayBzaW1pbGFyIHRvIHRoZSBzaW11bGF0ZWQgZGF0YSBmcm9tIE1jZG9uYWxkcyB0aGVyZWZvcmUgdGhpcyBpcyBldmlkZW5jZSB0aGF0IHRoZSBkYXRhIGlzIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZC4gVGhlIGFtb3VudCBvZiB2YXJpYWJpbGl0eSBpbiB0aGUgc2ltdWxhdGVkIGRhdGEgaXMgbm90IHNpbWlsYXIgdG8gdGhlIHZhcmlhYmlsaXR5IG9ic2VydmVkIGluIHRoZSBkYXRhLgoKCmBgYHtyfQptY21lYW4gPC0gbWVhbihtY2RvbmFsZHMkY2FsX2ZhdCkKbWNzZCAgIDwtIHNkKG1jZG9uYWxkcyRjYWxfZmF0KQoKc2ltX25vcm0gPC0gcm5vcm0obiA9IG5yb3cobWNkb25hbGRzKSwgbWVhbiA9IG1jbWVhbiwgc2QgPSBtY3NkKQpxcW5vcm0oc2ltX25vcm0pCnFxbGluZShzaW1fbm9ybSwgY29sID0gInN0ZWVsYmx1ZSIsIGx3ZCA9IDIpCmBgYAoKYGBge3J9CnFxbm9ybXNpbShzYW1wbGUgPSBjYWxfZmF0LCBkYXRhID0gbWNkb25hbGRzKQpgYGAKCmBgYHtyfQoxIC0gcG5vcm0ocSA9IDYwMCwgbWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKQoKYGBgCgpgYGB7cn0KZGFpcnlfcXVlZW4gJT4lIAogIGZpbHRlcihjYWxfZmF0ID4gNjAwKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG4oKSAvIG5yb3coZGFpcnlfcXVlZW4pKQpgYGAKIyMjIEV4ZXJjaXNlIDYKIyMjIFdyaXRlIG91dCB0d28gcHJvYmFiaWxpdHkgcXVlc3Rpb25zIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gYW5zd2VyIGFib3V0IGFueSBvZiB0aGUgcmVzdGF1cmFudHMgaW4gdGhpcyBkYXRhc2V0LiBDYWxjdWxhdGUgdGhvc2UgcHJvYmFiaWxpdGllcyB1c2luZyBib3RoIHRoZSB0aGVvcmV0aWNhbCBub3JtYWwgZGlzdHJpYnV0aW9uIGFzIHdlbGwgYXMgdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24gKGZvdXIgcHJvYmFiaWxpdGllcyBpbiBhbGwpLiBXaGljaCBvbmUgaGFkIGEgY2xvc2VyIGFncmVlbWVudCBiZXR3ZWVuIHRoZSB0d28gbWV0aG9kcz8KIyMjIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSByYW5kb21seSBzZWxlY3RlZCBpdGVtIGluIG1jZG9uYWxkcyBoYXMgY2Fsb3JpZXMgaGlnaGVyIHRoYW4gODAwIGNhbD8gOS45NCUKIyMjIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSByYW5kb21seSBzZWxlY3RlZCBpdGVtIGluIERhaXJ5cXVlZSBoYXMgY2Fsb3JpZXMgaGlnaGVyIHRoYW4gODAwIGNhbGw/IDIlCgpgYGB7cn0KMSAtIHBub3JtKDgwMCwgbWVhbiA9IG1jbWVhbiwgc2QgPSBtY3NkKQoxIC0gcG5vcm0oODAwLCBtZWFuID0gZHFtZWFuLCBzZCA9IGRxc2QpCjEgLSBwbm9ybSg4MDAsIDAsIDEpCjEgLSBwbm9ybSg4MDAsIDAsIDEpCgpgYGAKCgojIyMgRXhlcmNpc2UgNwojIyMgTm93IGxldOKAmXMgY29uc2lkZXIgc29tZSBvZiB0aGUgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBkYXRhc2V0LiBPdXQgb2YgYWxsIHRoZSBkaWZmZXJlbnQgcmVzdGF1cmFudHMsIHdoaWNoIG9uZXPigJkgZGlzdHJpYnV0aW9uIGlzIHRoZSBjbG9zZXN0IHRvIG5vcm1hbCBmb3Igc29kaXVtPyAKIyMjIE1jZG9uYWxkcyBub3IgRGFpcnkgcXVlZW4gYXJlIG5vcm1hbCBidXQgb3V0IG9mIHRoZSB0d28gRGFpcnkgcXVlZW4gbG9va3MgY2xvc2VyIHRvIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbgoKYGBge3J9Cm1jbWVhbiA8LSBtZWFuKG1jZG9uYWxkcyRzb2RpdW0pCm1jc2QgICA8LSBzZChtY2RvbmFsZHMkc29kaXVtKQoKc2ltX25vcm0gPC0gcm5vcm0obiA9IG5yb3cobWNkb25hbGRzKSwgbWVhbiA9IG1jbWVhbiwgc2QgPSBtY3NkKQpxcW5vcm0oc2ltX25vcm0pCnFxbGluZShzaW1fbm9ybSwgY29sID0gInN0ZWVsYmx1ZSIsIGx3ZCA9IDIpIAptdGV4dCgiTUMgU29kaXVtIikKCgoKZHFtZWFuIDwtIG1lYW4oZGFpcnlfcXVlZW4kc29kaXVtKQpkcXNkICAgPC0gc2QoZGFpcnlfcXVlZW4kc29kaXVtKQoKc2ltX25vcm0gPC0gcm5vcm0obiA9IG5yb3coZGFpcnlfcXVlZW4pLCBtZWFuID0gZHFtZWFuLCBzZCA9IGRxc2QpCnFxbm9ybShzaW1fbm9ybSkKcXFsaW5lKHNpbV9ub3JtLCBjb2wgPSAic3RlZWxibHVlIiwgbHdkID0gMikKCmBgYAoKCmBgYHtyfQpxcW5vcm1zaW0oc2FtcGxlID0gc29kaXVtLCBkYXRhID0gbWNkb25hbGRzKQoKYGBgCgpgYGB7cn0KcXFub3Jtc2ltKHNhbXBsZSA9IHNvZGl1bSwgZGF0YSA9IGRhaXJ5X3F1ZWVuKQpgYGAKCiMjIyBFeGVyY2lzZSA4CiMjIyBOb3RlIHRoYXQgc29tZSBvZiB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3RzIGZvciBzb2RpdW0gZGlzdHJpYnV0aW9ucyBzZWVtIHRvIGhhdmUgYSBzdGVwd2lzZSBwYXR0ZXJuLiB3aHkgZG8geW91IHRoaW5rIHRoaXMgbWlnaHQgYmUgdGhlIGNhc2U/CiMjIyBJIGJlbGlldmUgdGhhdCB0aGlzIG1heSBiZSBiZWNhY3VzZSBpdCB2YXJpZXMgcGVyIHR5cGUgb2YgcHJvZHVjdC4gRm9yIGV4YW1wbGUgaXQgZ29lcyBmcm9tIHNvZGEgdG8gYnVyZ2VyLiAKCgojIyMgRXhlcmNpc2UgOQojIyMgQXMgeW91IGNhbiBzZWUsIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90cyBjYW4gYmUgdXNlZCBib3RoIHRvIGFzc2VzcyBub3JtYWxpdHkgYW5kIHZpc3VhbGl6ZSBza2V3bmVzcy4gTWFrZSBhIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IGZvciB0aGUgdG90YWwgY2FyYm9oeWRyYXRlcyBmcm9tIGEgcmVzdGF1cmFudCBvZiB5b3VyIGNob2ljZS4gQmFzZWQgb24gdGhpcyBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCwgaXMgdGhpcyB2YXJpYWJsZSBsZWZ0IHNrZXdlZCwgc3ltbWV0cmljLCBvciByaWdodCBza2V3ZWQ/IFVzZSBhIGhpc3RvZ3JhbSB0byBjb25maXJtIHlvdXIgZmluZGluZ3MuCiMjIyBJdCBsb29rcyBsaWtlIHRoZSBTdWJ3YXkgZGlzdHJpYnV0aW9uIG9mIGNhcmJvaHlkcmF0ZXMgaXMgbm90IG5vcm1hbC4gIEJhc2VkIG9uIHRoZSBoaXN0cm9ncmFtIGl0IGlzIHNrZXdlZCB0byB0aGUgcmlnaHQKCmBgYHtyfQpmYXN0Zm9vZCA8LSBmYXN0Zm9vZApzdWJ3YXkgPC0gZmFzdGZvb2QgJT4lCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIlN1YndheSIpCgpzdWJtZWFuIDwtIG1lYW4oc3Vid2F5JHRvdGFsX2NhcmIpCnN1YnNkICAgPC0gc2Qoc3Vid2F5JHRvdGFsX2NhcmIpCgpzaW1fbm9ybSA8LSBybm9ybShuID0gbnJvdyhzdWJ3YXkpLCBtZWFuID0gc3VibWVhbiwgc2QgPSBzdWJzZCkKcXFub3JtKHNpbV9ub3JtKQpxcWxpbmUoc2ltX25vcm0sIGNvbCA9ICJzdGVlbGJsdWUiLCBsd2QgPSAyKQpgYGAKYGBge3J9CnFxbm9ybXNpbShzYW1wbGUgPSB0b3RhbF9jYXJiLCBkYXRhID0gc3Vid2F5KQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHN1YndheSwgYWVzKHggPSB0b3RhbF9jYXJiKSkgKwogICAgICAgIGdlb21fYmxhbmsoKSArCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLikpICsKICAgICAgICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gYyhtZWFuID0gc3VibWVhbiwgc2QgPSBzdWJzZCksIGNvbCA9ICJ0b21hdG8iKQpgYGAKCg==