Problem 1

Please enter your github repo address in the space provided below. I’ve added a little example to jog your memory.

Example: My GitHub Link

Enter Here: My Github Link

Problem 2

For this problem, you are asked to create a list of 3 concepts you have learned about so far this semester. Enter the solution below in the space provided.

  1. Include the name of the course as a sub-heading (that is, using ##)

  2. Include the concepts as an unordered list (This should not be done in a chunk of code, but simply inserted using markdown syntax).

  3. Include a link to information about at least one of the concept you listed (for example a link to the Wikipedia page about that concept/topics).

  4. Include an an image that you think represents either one of the concepts or how you feel about one of the concepts.

Remember: you can also scan in and save something you’ve drawn or taken a picture of yourself.

Solution Below:

Concept 1

Discrete Mathematics

In discrete math I learned that functions have a use in just about every type of math, not just programming. Functions in discrete require only one output per input, any more than that invalidates the function. Discrete has helped me improve my logic and reasoning. Wikipedia page for math logic function

Concept 2

Statistics

In Statistics I learned about probability and how it relates to everything. I have always been good at statistics but reinforcing the fundamentals have been fun for me so far. My love for statistics is partly why I went into the data science field. Wikipedia page for probability Coin toss

Concept 3

C++

In my C++ class, I mostly just reinforced what I learned in my C class last year. One interesting concept I learned however was recursion. You can call a function within a function, just have to make sure that its not an infinite loop and theres a control variable to stop it. Wikipedia page for Recursion Recursion

Problem 3

In this problem you will practice some basic R operations. Include solutions to each items by inserting a new R chunk of code (make sure you run the chunk so that the output is displayed)

  1. Create a variable called my_name that contains your preferred name.

{r} # Solution for 3a: my_name <- "Charles Downing"

  1. Create a variable called name_length that holds how many letters are in my_name. Do not just set how many letters you have in your name to this variable, use a built-in function.

{r} # Solution for 3b: namelength <- length(my_name)

  1. Show which value is bigger: \(e^\pi\) or \(\pi^e\).

Hint: R has some built-in functions, exp() being one of them.

{r} # Solution for 3c: etopi <- exp(pi) pitoe <- pi^exp(1) big <- (max(etopi,pitoe)) big

  1. Define a function called add_three that takes a single argument and returns a value with 3 units added to the original input.

{r} # Solution for 3d: add_three <- function(x) { y <- x + 3 y }

  1. Use the colon operator : to create a vector v of numbers from 10 to 49. Find the length of this vector using the length() function.

{r} # Solution for 3e: v = 10:49 length(v)

  1. Use the seq() function to produce a range of number from -5 to 10 in 0.5 increments.

{r} # Solution for 3F: seq(from = -5, to = 10, by = 0.5)

Problem 4

  1. Define a function imperial_to_metric that takes in two arguments: a number of feet and a number of inches. The function should return the equivalent length in meters

To convert a length L from feet (ft) and inches (inches) to meters (m), one can use the relation: L(m) = L(ft) × 0.3048 + L(inches) × 0.0254

```{r}

imperial_to_metric <- function(feet,inches){ meters <- (feet * 0.3048 + inches * 0.0254) meters }



(b) Create a variable `height_in_meters` by passing your height in imperial to the `imperial_to_metric` function.

```{r}
height_in_meters <- imperial_to_metric(5,6)

Problem 5

  1. Create the following vectors in R (see the pattern and use appropriate functions to construct these vectors):

\(a = (5, 10, 15, 20, ..., 160)\)

\(b = (87, 86, 85, ..., 56)\)

```{r}

a = seq(from =5, to = 160, by = 5) b = seq(from = 87, to = 56, by = -1)



(b) Multiply these vectors and call the result `d` (element-wise multiplication). 

```{r}

d <- a*b
  1. What are the 19th, 20th, and 21st elements of d?

```{r}

d[19:21]



(d) What are all of the elements of `d` which are less than 2000?

```{r}

d[d<2000]
  1. How many elements of d are greater than 6000?

```{r}

d[d>6000]



# Problem 6 - Word Problem

Assume that you have several investment choices. For each investment, there are two equally likely end-of-year forecasts: the optimistic value (up_value), and the pessimistic value (down_value). Assume the expected return and risk of each investment is given by:

> expected_end_value = (up_value + down_value) / 2 <br>
  expected_return = (expected_end_value - initial_investment) / initial_investment <br>
  risk = (up_value - down_value) / 2 <br>

a) Write a program that for one investment choice, prompts for three inputs:

- initial investment amount
- optimistic end value (up_value)
- pessimistic end value (down_value)

and then calculates the investment’s expected return and risk. You will need to enter your own chunks for this below:


```{r}
  investment_pro <- function(Amount,up_value,down_value) {
    # Calculation
expected_end_value <- (up_value + down_value) / 2
expected_return <- (expected_end_value - Amount) / Amount
risk = (up_value - down_value) / 2
    #Printing
cat("Results:\n", "Expected End Value: ",expected_end_value, "\n","Expected Return: ",expected_return, "\n","Risk: ",risk)
  }

```{r} #Prompts the user for input Amount <- as.numeric(readline(prompt = “Enter initial investment:”)) up_value <- as.numeric(readline(prompt = “Enter the optimistic value:”)) down_value <- as.numeric(readline(prompt = “Enter the pessimistic value:”)) investment_pro(Amount,up_value,down_value) #For the result below I used: 100,200,150

```

LS0tDQp0aXRsZTogIkZvdW5kYXRpb25zIG9mIERhdGEgQW5hbHl0aWNzIC0gSFcgMSINCmF1dGhvcjogIkNoYXJsZXMgLSBEb3duaW5nIC0gJ0Nkb3duaW5nNzYwNkBmbG9yaWRhcG9seS5lZHUiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIFByb2JsZW0gMQ0KDQpQbGVhc2UgZW50ZXIgeW91ciBnaXRodWIgcmVwbyBhZGRyZXNzIGluIHRoZSBzcGFjZSBwcm92aWRlZCBiZWxvdy4gSSd2ZSBhZGRlZCBhIGxpdHRsZSBleGFtcGxlIHRvIGpvZyB5b3VyIG1lbW9yeS4NCg0KPkV4YW1wbGU6ICBbTXkgR2l0SHViIExpbmtdKFRoZUdpdEh1YkxpbmsuY29tKQ0KDQoNCj4gRW50ZXIgSGVyZTogDQpbTXkgR2l0aHViIExpbmtdKGh0dHBzOi8vZ2l0aHViLmNvbS9DaGFybGVzLUQtRlBVP3RhYj1yZXBvc2l0b3JpZXMpDQoNCg0KIyBQcm9ibGVtIDINCg0KRm9yIHRoaXMgcHJvYmxlbSwgeW91IGFyZSBhc2tlZCB0byBjcmVhdGUgYSBsaXN0IG9mICoqMyBjb25jZXB0cyoqIHlvdSBoYXZlIGxlYXJuZWQgYWJvdXQgc28gZmFyIHRoaXMgc2VtZXN0ZXIuIEVudGVyIHRoZSBzb2x1dGlvbiBiZWxvdyBpbiB0aGUgc3BhY2UgcHJvdmlkZWQuDQoNCmEuIEluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIGNvdXJzZSBhcyBhIHN1Yi1oZWFkaW5nICh0aGF0IGlzLCB1c2luZyBgIyNgKQ0KDQoNCmIuIEluY2x1ZGUgdGhlIGNvbmNlcHRzIGFzIGFuICoqdW5vcmRlcmVkIGxpc3QqKiAoVGhpcyBzaG91bGQgbm90IGJlIGRvbmUgaW4gYSBjaHVuayBvZiBjb2RlLCBidXQgc2ltcGx5IGluc2VydGVkIHVzaW5nIG1hcmtkb3duIHN5bnRheCkuIA0KDQoNCmMuIEluY2x1ZGUgYSBsaW5rIHRvIGluZm9ybWF0aW9uIGFib3V0IGF0IGxlYXN0IG9uZSBvZiB0aGUgY29uY2VwdCB5b3UgbGlzdGVkIChmb3IgZXhhbXBsZSBhIGxpbmsgdG8gdGhlIFdpa2lwZWRpYSBwYWdlIGFib3V0IHRoYXQgY29uY2VwdC90b3BpY3MpLg0KDQoNCg0KZC4gSW5jbHVkZSBhbiBhbiBpbWFnZSB0aGF0IHlvdSB0aGluayByZXByZXNlbnRzIGVpdGhlciBvbmUgb2YgdGhlIGNvbmNlcHRzIG9yIGhvdyB5b3UgZmVlbCBhYm91dCBvbmUgb2YgdGhlIGNvbmNlcHRzLiANCg0KKipSZW1lbWJlcjogeW91IGNhbiBhbHNvIHNjYW4gaW4gYW5kIHNhdmUgc29tZXRoaW5nIHlvdSd2ZSBkcmF3biBvciB0YWtlbiBhIHBpY3R1cmUgb2YgeW91cnNlbGYuKioNCg0KPlNvbHV0aW9uIEJlbG93Og0KDQoNCiMgQ29uY2VwdCAxDQojIyBEaXNjcmV0ZSBNYXRoZW1hdGljcw0KSW4gZGlzY3JldGUgbWF0aCBJIGxlYXJuZWQgdGhhdCBmdW5jdGlvbnMgaGF2ZSBhIHVzZSBpbiBqdXN0IGFib3V0IGV2ZXJ5IHR5cGUgb2YgbWF0aCwgbm90IGp1c3QgcHJvZ3JhbW1pbmcuIEZ1bmN0aW9ucyBpbiBkaXNjcmV0ZSByZXF1aXJlIG9ubHkgb25lIG91dHB1dCBwZXIgaW5wdXQsIGFueSBtb3JlIHRoYW4gdGhhdCBpbnZhbGlkYXRlcyB0aGUgZnVuY3Rpb24uIERpc2NyZXRlIGhhcyBoZWxwZWQgbWUgaW1wcm92ZSBteSBsb2dpYyBhbmQgcmVhc29uaW5nLg0KW1dpa2lwZWRpYSBwYWdlIGZvciBtYXRoIGxvZ2ljXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYXRoZW1hdGljYWxfbG9naWMpDQohW2Z1bmN0aW9uXShaOi9TY2hvb2wvWWVhciAyL1NlbWVzdGVyIDEvRGF0YSBTY2llbmNlL0ludmVyc2VfRnVuY3Rpb24ucG5nKQ0KDQojIENvbmNlcHQgMg0KIyMgU3RhdGlzdGljcw0KSW4gU3RhdGlzdGljcyBJIGxlYXJuZWQgYWJvdXQgcHJvYmFiaWxpdHkgYW5kIGhvdyBpdCByZWxhdGVzIHRvIGV2ZXJ5dGhpbmcuIEkgaGF2ZSBhbHdheXMgYmVlbiBnb29kIGF0IHN0YXRpc3RpY3MgYnV0IHJlaW5mb3JjaW5nIHRoZSBmdW5kYW1lbnRhbHMgaGF2ZSBiZWVuIGZ1biBmb3IgbWUgc28gZmFyLiBNeSBsb3ZlIGZvciBzdGF0aXN0aWNzIGlzIHBhcnRseSB3aHkgSSB3ZW50IGludG8gdGhlIGRhdGEgc2NpZW5jZSBmaWVsZC4NCltXaWtpcGVkaWEgcGFnZSBmb3IgcHJvYmFiaWxpdHldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Byb2JhYmlsaXR5KQ0KIVtDb2luIHRvc3NdKFo6L1NjaG9vbC9ZZWFyIDIvU2VtZXN0ZXIgMS9EYXRhIFNjaWVuY2UvNTAweDMwMC1RdWFydGVycy1Ub3AtSW1hZ2UtdjIucG5nKQ0KDQojIENvbmNlcHQgMw0KIyMgQysrDQpJbiBteSBDKysgY2xhc3MsIEkgbW9zdGx5IGp1c3QgcmVpbmZvcmNlZCB3aGF0IEkgbGVhcm5lZCBpbiBteSBDIGNsYXNzIGxhc3QgeWVhci4gT25lIGludGVyZXN0aW5nIGNvbmNlcHQgSSBsZWFybmVkIGhvd2V2ZXIgd2FzIHJlY3Vyc2lvbi4gWW91IGNhbiBjYWxsIGEgZnVuY3Rpb24gd2l0aGluIGEgZnVuY3Rpb24sIGp1c3QgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBpdHMgbm90IGFuIGluZmluaXRlIGxvb3AgYW5kIHRoZXJlcyBhIGNvbnRyb2wgdmFyaWFibGUgdG8gc3RvcCBpdC4NCltXaWtpcGVkaWEgcGFnZSBmb3IgUmVjdXJzaW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWN1cnNpb25fKGNvbXB1dGVyX3NjaWVuY2UpKQ0KIVtSZWN1cnNpb25dKFo6L1NjaG9vbC9ZZWFyIDIvU2VtZXN0ZXIgMS9EYXRhIFNjaWVuY2UvbWVuZ2VyLWdhZmVlOTA1ZTdfMTkyMC0xNDQweDEwODAud2VicCkNCg0KIyBQcm9ibGVtIDMNCg0KSW4gdGhpcyBwcm9ibGVtIHlvdSB3aWxsIHByYWN0aWNlIHNvbWUgYmFzaWMgUiBvcGVyYXRpb25zLiBJbmNsdWRlIHNvbHV0aW9ucyB0byBlYWNoIGl0ZW1zIGJ5IGluc2VydGluZyBhIG5ldyBSIGNodW5rIG9mIGNvZGUgKG1ha2Ugc3VyZSB5b3UgcnVuIHRoZSBjaHVuayBzbyB0aGF0IHRoZSBvdXRwdXQgaXMgZGlzcGxheWVkKQ0KDQooYSkgQ3JlYXRlIGEgdmFyaWFibGUgY2FsbGVkIGBteV9uYW1lYCB0aGF0IGNvbnRhaW5zIHlvdXIgcHJlZmVycmVkIG5hbWUuDQoNCmBgYHtyfQ0KIyBTb2x1dGlvbiBmb3IgM2E6DQpteV9uYW1lIDwtICJDaGFybGVzIERvd25pbmciDQpgYGANCg0KDQooYikgIENyZWF0ZSBhIHZhcmlhYmxlIGNhbGxlZCBgbmFtZV9sZW5ndGhgIHRoYXQgaG9sZHMgaG93IG1hbnkgbGV0dGVycyBhcmUgaW4gYG15X25hbWVgLiBEbyBub3QganVzdCBzZXQgaG93IG1hbnkgbGV0dGVycyB5b3UgaGF2ZSBpbiB5b3VyIG5hbWUgdG8gdGhpcyB2YXJpYWJsZSwgdXNlIGEgYnVpbHQtaW4gZnVuY3Rpb24uDQoNCmBgYHtyfQ0KIyBTb2x1dGlvbiBmb3IgM2I6DQpuYW1lbGVuZ3RoIDwtIGxlbmd0aChteV9uYW1lKQ0KYGBgDQoNCg0KKGMpIFNob3cgd2hpY2ggdmFsdWUgaXMgYmlnZ2VyOiAkZV5ccGkkIG9yICRccGleZSQuIA0KDQo+IEhpbnQ6IFIgaGFzIHNvbWUgYnVpbHQtaW4gZnVuY3Rpb25zLCBgZXhwKClgIGJlaW5nIG9uZSBvZiB0aGVtLg0KDQpgYGB7cn0NCiMgU29sdXRpb24gZm9yIDNjOg0KZXRvcGkgPC0gZXhwKHBpKQ0KcGl0b2UgPC0gcGleZXhwKDEpDQpiaWcgPC0gKG1heChldG9waSxwaXRvZSkpDQpiaWcNCmBgYA0KDQoNCihkKSBEZWZpbmUgYSAqKmZ1bmN0aW9uKiogY2FsbGVkIGBhZGRfdGhyZWVgIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgYW5kIHJldHVybnMgYSB2YWx1ZSB3aXRoIDMgdW5pdHMgYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGlucHV0Lg0KDQpgYGB7cn0NCiMgU29sdXRpb24gZm9yIDNkOg0KYWRkX3RocmVlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeSA8LSB4ICsgMw0KICB5DQp9DQpgYGANCg0KDQooZSkgIFVzZSB0aGUgY29sb24gb3BlcmF0b3IgYDpgIHRvIGNyZWF0ZSBhIHZlY3RvciBgdmAgb2YgbnVtYmVycyBmcm9tIDEwIHRvIDQ5LiBGaW5kIHRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IgdXNpbmcgdGhlIGBsZW5ndGgoKWAgZnVuY3Rpb24uDQoNCmBgYHtyfQ0KIyBTb2x1dGlvbiBmb3IgM2U6DQp2ID0gMTA6NDkNCmxlbmd0aCh2KQ0KYGBgDQoNCg0KKGYpIFVzZSB0aGUgYHNlcSgpYCBmdW5jdGlvbiB0byBwcm9kdWNlIGEgcmFuZ2Ugb2YgbnVtYmVyIGZyb20gLTUgdG8gMTAgaW4gMC41IGluY3JlbWVudHMuDQoNCmBgYHtyfQ0KIyBTb2x1dGlvbiBmb3IgM0Y6DQpzZXEoZnJvbSA9IC01LCB0byA9IDEwLCBieSA9IDAuNSkNCmBgYA0KDQoNCiMgUHJvYmxlbSA0DQoNCg0KKGEpICoqRGVmaW5lIGEgZnVuY3Rpb24qKiBgaW1wZXJpYWxfdG9fbWV0cmljYCB0aGF0IHRha2VzIGluICoqdHdvIGFyZ3VtZW50cyoqOiBhIG51bWJlciBvZiBmZWV0IGFuZCBhIG51bWJlciBvZiBpbmNoZXMuIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBlcXVpdmFsZW50IGxlbmd0aCBpbiBtZXRlcnMNCg0KPiBUbyBjb252ZXJ0IGEgbGVuZ3RoIGBMYCBmcm9tIGZlZXQgKGBmdGApIGFuZCBpbmNoZXMgKGBpbmNoZXNgKSB0byBtZXRlcnMgKGBtYCksIG9uZSBjYW4gdXNlIHRoZSByZWxhdGlvbjogYEwobSkgPSBMKGZ0KSDDlyAwLjMwNDggKyBMKGluY2hlcykgw5cgMC4wMjU0YA0KDQpgYGB7cn0NCg0KaW1wZXJpYWxfdG9fbWV0cmljIDwtIGZ1bmN0aW9uKGZlZXQsaW5jaGVzKXsNCiAgbWV0ZXJzIDwtIChmZWV0ICogMC4zMDQ4ICsgaW5jaGVzICogMC4wMjU0KQ0KICBtZXRlcnMNCn0NCmBgYA0KDQoNCihiKSBDcmVhdGUgYSB2YXJpYWJsZSBgaGVpZ2h0X2luX21ldGVyc2AgYnkgcGFzc2luZyB5b3VyIGhlaWdodCBpbiBpbXBlcmlhbCB0byB0aGUgYGltcGVyaWFsX3RvX21ldHJpY2AgZnVuY3Rpb24uDQoNCmBgYHtyfQ0KaGVpZ2h0X2luX21ldGVycyA8LSBpbXBlcmlhbF90b19tZXRyaWMoNSw2KQ0KYGBgDQoNCg0KIyBQcm9ibGVtIDUNCg0KKGEpIENyZWF0ZSB0aGUgZm9sbG93aW5nIHZlY3RvcnMgaW4gYFJgIChzZWUgdGhlIHBhdHRlcm4gYW5kIHVzZSBhcHByb3ByaWF0ZSBmdW5jdGlvbnMgdG8gY29uc3RydWN0IHRoZXNlIHZlY3RvcnMpOg0KDQokYSA9ICg1LCAxMCwgMTUsIDIwLCAuLi4sIDE2MCkkDQoNCiRiID0gKDg3LCA4NiwgODUsIC4uLiwgNTYpJA0KDQoNCmBgYHtyfQ0KDQphID0gc2VxKGZyb20gPTUsIHRvID0gMTYwLCBieSA9IDUpDQpiID0gc2VxKGZyb20gPSA4NywgdG8gPSA1NiwgYnkgPSAtMSkNCmBgYA0KDQoNCihiKSBNdWx0aXBseSB0aGVzZSB2ZWN0b3JzIGFuZCBjYWxsIHRoZSByZXN1bHQgYGRgIChlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24pLiANCg0KYGBge3J9DQoNCmQgPC0gYSpiDQpgYGANCg0KDQooYykgV2hhdCBhcmUgdGhlIDE5dGgsIDIwdGgsIGFuZCAyMXN0IGVsZW1lbnRzIG9mIGBkYD8NCg0KYGBge3J9DQoNCmRbMTk6MjFdDQpgYGANCg0KDQooZCkgV2hhdCBhcmUgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiBgZGAgd2hpY2ggYXJlIGxlc3MgdGhhbiAyMDAwPw0KDQpgYGB7cn0NCg0KZFtkPDIwMDBdDQpgYGANCg0KDQooZSkgSG93IG1hbnkgZWxlbWVudHMgb2YgYGRgIGFyZSBncmVhdGVyIHRoYW4gNjAwMD8NCg0KDQpgYGB7cn0NCg0KZFtkPjYwMDBdDQpgYGANCg0KDQojIFByb2JsZW0gNiAtIFdvcmQgUHJvYmxlbQ0KDQpBc3N1bWUgdGhhdCB5b3UgaGF2ZSBzZXZlcmFsIGludmVzdG1lbnQgY2hvaWNlcy4gRm9yIGVhY2ggaW52ZXN0bWVudCwgdGhlcmUgYXJlIHR3byBlcXVhbGx5IGxpa2VseSBlbmQtb2YteWVhciBmb3JlY2FzdHM6IHRoZSBvcHRpbWlzdGljIHZhbHVlICh1cF92YWx1ZSksIGFuZCB0aGUgcGVzc2ltaXN0aWMgdmFsdWUgKGRvd25fdmFsdWUpLiBBc3N1bWUgdGhlIGV4cGVjdGVkIHJldHVybiBhbmQgcmlzayBvZiBlYWNoIGludmVzdG1lbnQgaXMgZ2l2ZW4gYnk6DQoNCj4gZXhwZWN0ZWRfZW5kX3ZhbHVlID0gKHVwX3ZhbHVlICsgZG93bl92YWx1ZSkgLyAyIDxicj4NCiAgZXhwZWN0ZWRfcmV0dXJuID0gKGV4cGVjdGVkX2VuZF92YWx1ZSAtIGluaXRpYWxfaW52ZXN0bWVudCkgLyBpbml0aWFsX2ludmVzdG1lbnQgPGJyPg0KICByaXNrID0gKHVwX3ZhbHVlIC0gZG93bl92YWx1ZSkgLyAyIDxicj4NCg0KYSkgV3JpdGUgYSBwcm9ncmFtIHRoYXQgZm9yIG9uZSBpbnZlc3RtZW50IGNob2ljZSwgcHJvbXB0cyBmb3IgdGhyZWUgaW5wdXRzOg0KDQotIGluaXRpYWwgaW52ZXN0bWVudCBhbW91bnQNCi0gb3B0aW1pc3RpYyBlbmQgdmFsdWUgKHVwX3ZhbHVlKQ0KLSBwZXNzaW1pc3RpYyBlbmQgdmFsdWUgKGRvd25fdmFsdWUpDQoNCmFuZCB0aGVuIGNhbGN1bGF0ZXMgdGhlIGludmVzdG1lbnTigJlzIGV4cGVjdGVkIHJldHVybiBhbmQgcmlzay4gWW91IHdpbGwgbmVlZCB0byBlbnRlciB5b3VyIG93biBjaHVua3MgZm9yIHRoaXMgYmVsb3c6DQoNCg0KYGBge3J9DQogIGludmVzdG1lbnRfcHJvIDwtIGZ1bmN0aW9uKEFtb3VudCx1cF92YWx1ZSxkb3duX3ZhbHVlKSB7DQogICAgIyBDYWxjdWxhdGlvbg0KZXhwZWN0ZWRfZW5kX3ZhbHVlIDwtICh1cF92YWx1ZSArIGRvd25fdmFsdWUpIC8gMg0KZXhwZWN0ZWRfcmV0dXJuIDwtIChleHBlY3RlZF9lbmRfdmFsdWUgLSBBbW91bnQpIC8gQW1vdW50DQpyaXNrID0gKHVwX3ZhbHVlIC0gZG93bl92YWx1ZSkgLyAyDQogICAgI1ByaW50aW5nDQpjYXQoIlJlc3VsdHM6XG4iLCAiRXhwZWN0ZWQgRW5kIFZhbHVlOiAiLGV4cGVjdGVkX2VuZF92YWx1ZSwgIlxuIiwiRXhwZWN0ZWQgUmV0dXJuOiAiLGV4cGVjdGVkX3JldHVybiwgIlxuIiwiUmlzazogIixyaXNrKQ0KICB9DQoNCmBgYA0KDQpgYGB7cn0NCiAgICAjUHJvbXB0cyB0aGUgdXNlciBmb3IgaW5wdXQNCkFtb3VudCA8LSBhcy5udW1lcmljKHJlYWRsaW5lKHByb21wdCA9ICJFbnRlciBpbml0aWFsIGludmVzdG1lbnQ6ICIpKQ0KdXBfdmFsdWUgPC0gYXMubnVtZXJpYyhyZWFkbGluZShwcm9tcHQgPSAiRW50ZXIgdGhlIG9wdGltaXN0aWMgdmFsdWU6ICIpKQ0KZG93bl92YWx1ZSA8LSBhcy5udW1lcmljKHJlYWRsaW5lKHByb21wdCA9ICJFbnRlciB0aGUgcGVzc2ltaXN0aWMgdmFsdWU6ICIpKQ0KaW52ZXN0bWVudF9wcm8oQW1vdW50LHVwX3ZhbHVlLGRvd25fdmFsdWUpDQojRm9yIHRoZSByZXN1bHQgYmVsb3cgSSB1c2VkOiAxMDAsMjAwLDE1MA0KDQpgYGA=