1. The most Nobel of Prizes

The Nobel Prize is perhaps the worlds most well known scientific award. Except for the honor, prestige and substantial prize money the recipient also gets a gold medal showing Alfred Nobel (1833 - 1896) who established the prize. Every year it’s given to scientists and scholars in the categories chemistry, literature, physics, physiology or medicine, economics, and peace. The first Nobel Prize was handed out in 1901, and at that time the Prize was very Eurocentric and male-focused, but nowadays it’s not biased in any way whatsoever. Surely. Right?

Well, we’re going to find out! The Nobel Foundation has made a dataset available of all prize winners from the start of the prize, in 1901, to 2016. Let’s load it in and take a look.

Task 1: Instructions

Load the required libraries and the Nobel Prize dataset.

  • Load the tidyverse library.
  • Use read_csv (not read.csv) to read in datasets/nobel.csv and save it into nobel.
  • Show the head of nobel, that is, the first couple of prize winners.

Make sure to use read_csv (with an underscore) to read in the data. The read.csv function, which is built into R, has a number of problems which the new read_csv function avoids.

Good to know

This Project assumes you have used the dplyr and ggplot2 packages and that you are familiar with the pipe operator (%>%). Before taking on this Project, we recommend that you have completed the course Introduction to the Tidyverse.

RStudio has created some very helpful cheat sheets, including two that will be helpful for this Project: Data Wrangling and Data Visualization with ggplot2. We recommend that you keep them open in a separate tab to make it easy to refer to them.

2. So, who gets the Nobel Prize?

Just looking at the first couple of prize winners, or Nobel laureates as they are also called, we already see a celebrity: Wilhelm Conrad Röntgen, the guy who discovered X-rays. And actually, we see that all of the winners in 1901 were guys that came from Europe. But that was back in 1901, looking at all winners in the dataset, from 1901 to 2016, which sex and which country is the most commonly represented? *** (For country, we will use the birth_country of the winner, as the organization_country is NA for all shared Nobel Prizes.)

Task 2: Instructions

Count up the Nobel Prizes. Also, split by sex and birth_country.

  • Count and display the number of rows/prizes using the count() function.
  • Count and display the number of rows/prizes, grouped by sex.
  • Count the number of rows/prizes, grouped by birth_country. Arrange the result by no. prizes in descending order and display the first 20 rows using head(20). For how to use the group_by function to group by a column check out Group Cases in the dplyr cheat sheet. For how to arrange rows, take a look at Arrange Cases in the same cheat sheet.
# Counting the number of (possibly shared) Nobel Prizes handed
# out between 1901 and 2016
nobel %>% count()
# Counting the number of prizes won by male and female recipients.
nobel %>% 
    count(sex)
# Counting the number of prizes won by different nationalities.
nobel %>%
    group_by(birth_country) %>% count() %>% arrange(desc(n)) %>% head(20)

3. USA dominance

Not so surprising perhaps: the most common Nobel laureate between 1901 and 2016 was a man born in the United States of America. But in 1901 all the laureates were European. When did the USA start to dominate the Nobel Prize charts?

Task 3: Instructions

Calculate the proportion of USA born winners per decade starting from the nobel dataset and put the result into prop_usa_winners.

  • Add a usa_born_winner column to nobel, where the value is TRUE when birth_country is "United States of America".
  • Add a decade column to nobel showing the decade the prize was awarded (1953 should become 1950, for example).
  • Group by decade and use summarize to add the column proportion to nobel. proportion should contain the proportion of usa_born_winners for each decade.
  • Display / print out prop_usa_winners.

You can use mutate for the first two bullet points.

To calculate the proportion of TRUE values you can use the mean function. If the column includes NA values, you would have to use the na.rm argument. Here’s how you could use mean together with summarize:

my_data %>% group_by(my_categorical_variable) %>% summarize(proportion = mean(is_winner, na.rm = TRUE))

# Calculating the proportion of USA born winners per decade
prop_usa_winners <- nobel %>% 
    mutate(usa_born_winner = birth_country == "United States of America")
# Display the proportions of USA born winners per decade
prop_usa_winners <- prop_usa_winners %>% 
        mutate(decade = floor(year / 10) * 10) %>% 
        group_by(decade)  %>% 
        summarize(proportion = mean(usa_born_winner, na.rm = TRUE))
prop_usa_winners

4. USA dominance, visualized

A table is OK, but to see when the USA started to dominate the Nobel charts we need a plot!

Task 4: Instructions

Plot the proportion of USA born winners per decade.

  • Use ggplot to plot prop_usa_winners with decade on the x-axis and proportion on the y-axis as a line-and-dot-plot. That is, add both geom_line() and geom_point().
  • Fix the y-scale to that it shows percentages, its limits go from 0.0 to 1.0, and extra spacing is removed above and below 0.0 and 1.0.

To change the y-axis use scale_y_continuous and set the labels, limits, and expand arguments. Check the ggplot2 documentation for how to use limits and expand. Here is a StackOverflow question that shows how to set labels correctly.

# Setting the size of plots in this notebook
options(repr.plot.width=7, repr.plot.height=4)
# Plotting USA born winners
ggplot(data = prop_usa_winners, aes(x = decade, y = proportion))+
    geom_line()+
    geom_point()+
    scale_y_continuous(labels = scales::percent,
                   limits = 0:1, expand = c(0,0))

5. What is the gender of a typical Nobel Prize winner?

So the USA became the dominating winner of the Nobel Prize first in the 1930s and has kept the leading position ever since. But one group that was in the lead from the start, and never seems to let go, are men. Maybe it shouldn’t come as a shock that there is some imbalance between how many male and female prize winners there are, but how significant is this imbalance? And is it better or worse within specific prize categories like physics, medicine, literature, etc.?

Task 5: Instructions

Plot the proportion of female laureates by decade split by prize category.

  • Add female_winner column, where the value is TRUE when sex is "Female".
  • Add the column decade showing the decade the prize was awarded (1953 should become 1950, for example).
  • Group by decade and category and summarize the proportion of female_winner into the proportion column.
  • Copy and paste your ggplot code from task 4, except plot the prop_female_winners data and map the category variable to the color parameter.

This task can be solved by copying and modifying the code from task 3 and 4.

# Calculating the proportion of female laureates per decade
prop_female_winners <- nobel %>%
        mutate(female_winner = sex == "Female") %>% 
        mutate(decade = floor(year/10)*10) %>% 
        group_by(decade, category) %>% 
        summarize(proportion = mean(female_winner, na.rm = TRUE))
    
# Plotting the proportion of female laureates per decade
ggplot(data = prop_female_winners, aes(x = decade, y = proportion, color = category ))+
    geom_line()+
    geom_point()+
    scale_y_continuous(labels = scales::percent,
                   limits = 0:1, expand = c(0,0))

6. The first woman to win the Nobel Prize

The plot above is a bit messy as the lines are overplotting. But it does show some interesting trends and patterns. Overall the imbalance is pretty large with physics, economics, and chemistry having the largest imbalance. Medicine has a somewhat positive trend, and since the 1990s the literature prize is also now more balanced. The big outlier is the peace prize during the 2010s, but keep in mind that this just covers the years 2010 to 2016.

Given this imbalance, who was the first woman to receive a Nobel Prize? And in what category?

Task 6: Instructions

Extract and display the row showing the first woman to win a Nobel Prize.

  • Use filter to filter away all non-"Female" laureates.
  • Use top_n to pick out the row with the earliest year.

top_n(x, n, wt) is a useful function that takes a table x and picks out the top n rows as ordered by the column wt. By default top_n sort highest-to-lowest so to pick out five best offers in the bargain bin, you would have to use desc():

bargain_bin %>% top_n(5, desc(price))

nobel %>%
    filter(sex == "Female") %>% 
        top_n(1, desc(year))

7. Repeat laureates

For most scientists/writers/activists a Nobel Prize would be the crowning achievement of a long career. But for some people, one is just not enough, and there are few that have gotten it more than once. Who are these lucky few? (Having won no Nobel Prize myself, I’ll assume it’s just about luck.)

Task 7: Instructions

Extract and display the names of repeat Nobel Prize winners.

  • Use count to count the number of wins grouped by full_name.
  • Filter away all winners that “only” won one time.
# Selecting the laureates that have received 2 or more prizes.
nobel %>%
    group_by(full_name) %>% 
        count() %>% 
            filter(n>1) %>% arrange(desc(n))

8. How old are you when you get the prize?

The list of repeat winners contains some illustrious names! We again meet Marie Curie, who got the prize in physics for discovering radiation and in chemistry for isolating radium and polonium. John Bardeen got it twice in physics for transistors and superconductivity, Frederick Sanger got it twice in chemistry, and Linus Carl Pauling got it first in chemistry and later in peace for his work in promoting nuclear disarmament. We also learn that organizations also get the prize as both the Red Cross and the UNHCR have gotten it twice.

But how old are you generally when you get the prize?

Task 8: Instructions

Calculate and plot the age of each winner when they won their Nobel Prize.

  • Load the lubridate package (you’ll find the year() function useful).
  • mutate the nobel table to include the column age which should be how old people were when they got their price. Assign the resulting table to nobel_age.
  • Use ggplot to plot age as a function of year as a scatter plot (geom_point()) with a smooth trend (geom_smooth()).

The year() function from lubridate takes a date and extracts the year:

dates <- as.Date( c(“1985-04-02”, “1988-07-25”)) year(dates) ## [1] 1985 1988

# Loading the lubridate package
library(lubridate)
package <U+393C><U+3E31>lubridate<U+393C><U+3E32> was built under R version 3.5.1
Attaching package: <U+393C><U+3E31>lubridate<U+393C><U+3E32>

The following object is masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    date
# Calculating the age of Nobel Prize winners
nobel_age <- nobel %>%
    mutate(age = year - year(birth_date))
# Plotting the age of Nobel Prize winners
ggplot(data = nobel_age, aes(x = year, y = age))+
    geom_point()+
    geom_smooth()

9. Age differences between prize categories

The plot above shows us a lot! We see that people use to be around 55 when they received the price, but nowadays the average is closer to 65. But there is a large spread in the laureates’ ages, and while most are 50+, some are very young.

We also see that the density of points is much high nowadays than in the early 1900s – nowadays many more of the prizes are shared, and so there are many more winners. We also see that there was a disruption in awarded prizes around the Second World War (1939 - 1945).

Let’s look at age trends within different prize categories.

Task 9: Instructions

Plot how old winners are within the different price categories.

  • Use ggplot to plot age as a function of year as a scatter plot (geom_point()) with a smooth trend (geom_smooth()) and facet by category using facet_wrap.
  • Optional: Remove the confidence band in geom_smooth by setting se = FALSE.

This is the same plot as in task 8, except faceted by category.

Removing the confidence band in geom_smooth is not strictly necessary, but the bands are not that meaningful and removing them makes the plot more focused.

If you don’t remember how facet_wrap works then look under Faceting on the second page of the ggplot2 cheat sheet.

# Same plot as above, but faceted by the category of the Nobel Prize
ggplot(data = nobel_age, aes(x = year, y = age))+
    geom_point()+
    geom_smooth(se = FALSE)+
    facet_wrap(~ category)

10. Oldest and youngest winners

Another plot with lots of exciting stuff going on! We see that both winners of the chemistry, medicine, and physics prize have gotten older over time. The trend is strongest for physics: the average age used to be below 50, and now it’s almost 70. Literature and economics are more stable, and we also see that economics is a newer category. But peace shows an opposite trend where winners are getting younger!

In the peace category we also a winner around 2010 that seems exceptionally young. This begs the questions, who are the oldest and youngest people ever to have won a Nobel Prize?

Task 10: Instructions

Pick out the rows of the oldest and the youngest winner of a Nobel Prize.

  • Use top_n to pick out and display the row of the oldest winner.
  • Use top_n to pick out and display the row of the youngest winner. Remember that you can use desc to reverse the sorting:

The most expensive item

bargain_bin %>% top_n(1, price)

The cheapest item

bargain_bin %>% top_n(1, desc(price))

# The oldest winner of a Nobel Prize as of 2016
nobel_age %>% top_n(1, age)
# The youngest winner of a Nobel Prize as of 2016
nobel_age %>% top_n(1, desc(age))

11. You get a prize!

Hey! You get a prize for making it to the very end of this notebook! It might not be a Nobel Prize, but I made it myself in paint so it should count for something. But don’t despair, Leonid Hurwicz was 90 years old when he got his prize, so it might not be too late for you. Who knows.

Before you leave, what was again the name of the youngest winner ever who in 2014 got the prize for “[her] struggle against the suppression of children and young people and for the right of all children to education”?

Task 11: Instructions

  • Assign the name of the youngest winner of a Nobel Prize to youngest_winner. The first name will suffice.

If you want to know more The Nobel Prize dataset is rich and there and this Project just scratched the surface – there is much more to explore! After you have completed this Project you can download it and continue exploring on your own computer! To do that you will have to install Jupyter notebooks with support for R. Here are instructions for how to install the Jupyter Notebook interface and here are instructions for how to add support for R. Good luck!

# The name of the youngest winner of the Nobel Prize as of 2016
youngest_winner <- "Malala Yousafzai"
youngest_winner
[1] "Malala Yousafzai"
LS0tDQp0aXRsZTogIkEgVklTVUFMIEhJU1RPUlkgT0YgTk9CRUwgUFJJWkUgV0lOTkVSUyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojMS4gVGhlIG1vc3QgTm9iZWwgb2YgUHJpemVzDQoNCg0KVGhlIE5vYmVsIFByaXplIGlzIHBlcmhhcHMgdGhlIHdvcmxkcyBtb3N0IHdlbGwga25vd24gc2NpZW50aWZpYyBhd2FyZC4gRXhjZXB0IGZvciB0aGUgaG9ub3IsIHByZXN0aWdlIGFuZCBzdWJzdGFudGlhbCBwcml6ZSBtb25leSB0aGUgcmVjaXBpZW50IGFsc28gZ2V0cyBhIGdvbGQgbWVkYWwgc2hvd2luZyBBbGZyZWQgTm9iZWwgKDE4MzMgLSAxODk2KSB3aG8gZXN0YWJsaXNoZWQgdGhlIHByaXplLiBFdmVyeSB5ZWFyIGl0J3MgZ2l2ZW4gdG8gc2NpZW50aXN0cyBhbmQgc2Nob2xhcnMgaW4gdGhlIGNhdGVnb3JpZXMgY2hlbWlzdHJ5LCBsaXRlcmF0dXJlLCBwaHlzaWNzLCBwaHlzaW9sb2d5IG9yIG1lZGljaW5lLCBlY29ub21pY3MsIGFuZCBwZWFjZS4gVGhlIGZpcnN0IE5vYmVsIFByaXplIHdhcyBoYW5kZWQgb3V0IGluIDE5MDEsIGFuZCBhdCB0aGF0IHRpbWUgdGhlIFByaXplIHdhcyB2ZXJ5IEV1cm9jZW50cmljIGFuZCBtYWxlLWZvY3VzZWQsIGJ1dCBub3dhZGF5cyBpdCdzIG5vdCBiaWFzZWQgaW4gYW55IHdheSB3aGF0c29ldmVyLiBTdXJlbHkuIFJpZ2h0Pw0KDQpXZWxsLCB3ZSdyZSBnb2luZyB0byBmaW5kIG91dCEgVGhlIE5vYmVsIEZvdW5kYXRpb24gaGFzIG1hZGUgYSBkYXRhc2V0IGF2YWlsYWJsZSBvZiBhbGwgcHJpemUgd2lubmVycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcHJpemUsIGluIDE5MDEsIHRvIDIwMTYuIExldCdzIGxvYWQgaXQgaW4gYW5kIHRha2UgYSBsb29rLg0KDQojI1Rhc2sgMTogSW5zdHJ1Y3Rpb25zDQpMb2FkIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMgYW5kIHRoZSBOb2JlbCBQcml6ZSBkYXRhc2V0Lg0KDQoqIExvYWQgdGhlIGB0aWR5dmVyc2VgIGxpYnJhcnkuDQoqIFVzZSBgcmVhZF9jc3ZgIChub3QgYHJlYWQuY3N2YCkgdG8gcmVhZCBpbiBkYXRhc2V0cy9ub2JlbC5jc3YgYW5kIHNhdmUgaXQgaW50byBgbm9iZWxgLg0KKiBTaG93IHRoZSBgaGVhZGAgb2YgYG5vYmVsYCwgdGhhdCBpcywgdGhlIGZpcnN0IGNvdXBsZSBvZiBwcml6ZSB3aW5uZXJzLg0KDQoqKioNCk1ha2Ugc3VyZSB0byB1c2UgcmVhZF9jc3YgKHdpdGggYW4gdW5kZXJzY29yZSkgdG8gcmVhZCBpbiB0aGUgZGF0YS4gVGhlIGByZWFkLmNzdmAgZnVuY3Rpb24sIHdoaWNoIGlzIGJ1aWx0IGludG8gUiwgaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdoaWNoIHRoZSBuZXcgYHJlYWRfY3N2YCBmdW5jdGlvbiBhdm9pZHMuDQoNCiMjR29vZCB0byBrbm93DQpUaGlzIFByb2plY3QgYXNzdW1lcyB5b3UgaGF2ZSB1c2VkIHRoZSBgZHBseXJgIGFuZCBgZ2dwbG90MmAgcGFja2FnZXMgYW5kIHRoYXQgeW91IGFyZSBmYW1pbGlhciB3aXRoIHRoZSBwaXBlIG9wZXJhdG9yIChgJT4lYCkuIEJlZm9yZSB0YWtpbmcgb24gdGhpcyBQcm9qZWN0LCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlIGNvdXJzZSBJbnRyb2R1Y3Rpb24gdG8gdGhlIFRpZHl2ZXJzZS4NCg0KUlN0dWRpbyBoYXMgY3JlYXRlZCBzb21lIHZlcnkgaGVscGZ1bCBjaGVhdCBzaGVldHMsIGluY2x1ZGluZyB0d28gdGhhdCB3aWxsIGJlIGhlbHBmdWwgZm9yIHRoaXMgUHJvamVjdDogRGF0YSBXcmFuZ2xpbmcgYW5kIERhdGEgVmlzdWFsaXphdGlvbiB3aXRoIGBnZ3Bsb3QyYC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IGtlZXAgdGhlbSBvcGVuIGluIGEgc2VwYXJhdGUgdGFiIHRvIG1ha2UgaXQgZWFzeSB0byByZWZlciB0byB0aGVtLg0KDQpgYGB7cn0NCiMgTG9hZGluZyBpbiByZXF1aXJlZCBsaWJyYXJpZXMNCiMgLi4uLiBZT1VSIENPREUgRk9SIFRBU0sgMSAuLi4uDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiMgUmVhZGluZyBpbiB0aGUgTm9iZWwgUHJpemUgZGF0YQ0Kbm9iZWwgPC0gcmVhZF9jc3YoIm5vYmVsLmNzdiIpDQoNCiMgVGFraW5nIGEgbG9vayBhdCB0aGUgZmlyc3QgY291cGxlIG9mIHdpbm5lcnMNCiMgLi4uLiBZT1VSIENPREUgRk9SIFRBU0sgMSAuLi4uDQoNCm5hbWVzKG5vYmVsKSA8LSBjKCJ5ZWFyIiwgImNhdGVnb3J5IiwgInByaXplIiwgIm1vdGl2YXRpb24iLCAicHJpemVfc2hhcmUiLCAibGF1cmVhdGVfSUQiLCAibGF1cmVhdGVfdHlwZSIsICAiZnVsbF9uYW1lIiwgImJpcnRoX2RhdGUiLCAiYmlydGhfY2l0eSIsICJiaXJ0aF9jb3VudHJ5IiwgInNleCIsICJvcmdhbml6YXRpb25fbmFtZSIsICJvcmdhbml6YXRpb25fY2l0eSIsICJvcmdhbml6YXRpb25fY291bnRyeSIsICJkZWF0aF9kYXRlIiwgImRlYXRoX2NpdHkiLCAiZGVhdGhfY291bnRyeSIpDQoNCmhlYWQobm9iZWwpDQoNCmBgYA0KDQojMi4gU28sIHdobyBnZXRzIHRoZSBOb2JlbCBQcml6ZT8NCkp1c3QgbG9va2luZyBhdCB0aGUgZmlyc3QgY291cGxlIG9mIHByaXplIHdpbm5lcnMsIG9yIE5vYmVsIGxhdXJlYXRlcyBhcyB0aGV5IGFyZSBhbHNvIGNhbGxlZCwgd2UgYWxyZWFkeSBzZWUgYSBjZWxlYnJpdHk6IFdpbGhlbG0gQ29ucmFkIFL2bnRnZW4sIHRoZSBndXkgd2hvIGRpc2NvdmVyZWQgWC1yYXlzLiBBbmQgYWN0dWFsbHksIHdlIHNlZSB0aGF0IGFsbCBvZiB0aGUgd2lubmVycyBpbiAxOTAxIHdlcmUgZ3V5cyB0aGF0IGNhbWUgZnJvbSBFdXJvcGUuIEJ1dCB0aGF0IHdhcyBiYWNrIGluIDE5MDEsIGxvb2tpbmcgYXQgYWxsIHdpbm5lcnMgaW4gdGhlIGRhdGFzZXQsIGZyb20gMTkwMSB0byAyMDE2LCB3aGljaCBzZXggYW5kIHdoaWNoIGNvdW50cnkgaXMgdGhlIG1vc3QgY29tbW9ubHkgcmVwcmVzZW50ZWQ/DQoqKioNCihGb3IgY291bnRyeSwgd2Ugd2lsbCB1c2UgdGhlIGBiaXJ0aF9jb3VudHJ5YCBvZiB0aGUgd2lubmVyLCBhcyB0aGUgYG9yZ2FuaXphdGlvbl9jb3VudHJ5YCBpcyBgTkFgIGZvciBhbGwgc2hhcmVkIE5vYmVsIFByaXplcy4pDQoNCiMjVGFzayAyOiBJbnN0cnVjdGlvbnMNCkNvdW50IHVwIHRoZSBOb2JlbCBQcml6ZXMuIEFsc28sIHNwbGl0IGJ5IGBzZXhgIGFuZCBgYmlydGhfY291bnRyeWAuDQoNCiogQ291bnQgYW5kIGRpc3BsYXkgdGhlIG51bWJlciBvZiByb3dzL3ByaXplcyB1c2luZyB0aGUgYGNvdW50KClgIGZ1bmN0aW9uLg0KKiBDb3VudCBhbmQgZGlzcGxheSB0aGUgbnVtYmVyIG9mIHJvd3MvcHJpemVzLCBncm91cGVkIGJ5IGBzZXhgLg0KKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MvcHJpemVzLCBncm91cGVkIGJ5IGBiaXJ0aF9jb3VudHJ5YC4gQXJyYW5nZSB0aGUgcmVzdWx0IGJ5IG5vLiBwcml6ZXMgaW4gZGVzY2VuZGluZyBvcmRlciBhbmQgZGlzcGxheSB0aGUgZmlyc3QgMjAgcm93cyB1c2luZyBgaGVhZCgyMClgLg0KRm9yIGhvdyB0byB1c2UgdGhlIGBncm91cF9ieWAgZnVuY3Rpb24gdG8gZ3JvdXAgYnkgYSBjb2x1bW4gY2hlY2sgb3V0IEdyb3VwIENhc2VzIGluIHRoZSBgZHBseXJgIGNoZWF0IHNoZWV0LiBGb3IgaG93IHRvIGBhcnJhbmdlYCByb3dzLCB0YWtlIGEgbG9vayBhdCBBcnJhbmdlIENhc2VzIGluIHRoZSBzYW1lIGNoZWF0IHNoZWV0Lg0KDQoNCmBgYHtyfQ0KIyBDb3VudGluZyB0aGUgbnVtYmVyIG9mIChwb3NzaWJseSBzaGFyZWQpIE5vYmVsIFByaXplcyBoYW5kZWQNCiMgb3V0IGJldHdlZW4gMTkwMSBhbmQgMjAxNg0Kbm9iZWwgJT4lIGNvdW50KCkNCg0KIyBDb3VudGluZyB0aGUgbnVtYmVyIG9mIHByaXplcyB3b24gYnkgbWFsZSBhbmQgZmVtYWxlIHJlY2lwaWVudHMuDQpub2JlbCAlPiUgDQogICAgY291bnQoc2V4KQ0KDQojIENvdW50aW5nIHRoZSBudW1iZXIgb2YgcHJpemVzIHdvbiBieSBkaWZmZXJlbnQgbmF0aW9uYWxpdGllcy4NCm5vYmVsICU+JQ0KICAgIGdyb3VwX2J5KGJpcnRoX2NvdW50cnkpICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpICU+JSBoZWFkKDIwKQ0KYGBgDQoNCiMzLiBVU0EgZG9taW5hbmNlDQpOb3Qgc28gc3VycHJpc2luZyBwZXJoYXBzOiB0aGUgbW9zdCBjb21tb24gTm9iZWwgbGF1cmVhdGUgYmV0d2VlbiAxOTAxIGFuZCAyMDE2IHdhcyBhIG1hbiBib3JuIGluIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIEJ1dCBpbiAxOTAxIGFsbCB0aGUgbGF1cmVhdGVzIHdlcmUgRXVyb3BlYW4uIFdoZW4gZGlkIHRoZSBVU0Egc3RhcnQgdG8gZG9taW5hdGUgdGhlIE5vYmVsIFByaXplIGNoYXJ0cz8NCg0KIyNUYXNrIDM6IEluc3RydWN0aW9ucw0KQ2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIFVTQSBib3JuIHdpbm5lcnMgcGVyIGRlY2FkZSBzdGFydGluZyBmcm9tIHRoZSBgbm9iZWxgIGRhdGFzZXQgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gYHByb3BfdXNhX3dpbm5lcnNgLg0KDQoqIEFkZCBhIGB1c2FfYm9ybl93aW5uZXJgIGNvbHVtbiB0byBgbm9iZWxgLCB3aGVyZSB0aGUgdmFsdWUgaXMgYFRSVUVgIHdoZW4gYGJpcnRoX2NvdW50cnlgIGlzIGAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhImAuDQoqIEFkZCBhIGBkZWNhZGVgIGNvbHVtbiB0byBgbm9iZWxgIHNob3dpbmcgdGhlIGRlY2FkZSB0aGUgcHJpemUgd2FzIGF3YXJkZWQgKGAxOTUzYCBzaG91bGQgYmVjb21lIGAxOTUwYCwgZm9yIGV4YW1wbGUpLg0KKiBHcm91cCBieSBgZGVjYWRlYCBhbmQgdXNlIGBzdW1tYXJpemVgIHRvIGFkZCB0aGUgY29sdW1uIGBwcm9wb3J0aW9uYCB0byBgbm9iZWxgLiBgcHJvcG9ydGlvbmAgc2hvdWxkIGNvbnRhaW4gdGhlIHByb3BvcnRpb24gb2YgYHVzYV9ib3JuX3dpbm5lcnNgIGZvciBlYWNoIGRlY2FkZS4NCiogRGlzcGxheSAvIHByaW50IG91dCBgcHJvcF91c2Ffd2lubmVyc2AuDQoNCioqKg0KWW91IGNhbiB1c2UgYG11dGF0ZWAgZm9yIHRoZSBmaXJzdCB0d28gYnVsbGV0IHBvaW50cy4NCg0KVG8gY2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIGBUUlVFYCB2YWx1ZXMgeW91IGNhbiB1c2UgdGhlIGBtZWFuYCBmdW5jdGlvbi4gSWYgdGhlIGNvbHVtbiBpbmNsdWRlcyBgTkFgIHZhbHVlcywgeW91IHdvdWxkIGhhdmUgdG8gdXNlIHRoZSBgbmEucm1gIGFyZ3VtZW50LiBIZXJlJ3MgaG93IHlvdSBjb3VsZCB1c2UgYG1lYW5gIHRvZ2V0aGVyIHdpdGggYHN1bW1hcml6ZWA6DQoNCj5teV9kYXRhICAlPiUgDQogIGdyb3VwX2J5KG15X2NhdGVnb3JpY2FsX3ZhcmlhYmxlKSAgJT4lIA0KICBzdW1tYXJpemUocHJvcG9ydGlvbiA9IA0KICAgICAgbWVhbihpc193aW5uZXIsIG5hLnJtID0gVFJVRSkpDQogICAgICANCmBgYHtyfQ0KIyBDYWxjdWxhdGluZyB0aGUgcHJvcG9ydGlvbiBvZiBVU0EgYm9ybiB3aW5uZXJzIHBlciBkZWNhZGUNCnByb3BfdXNhX3dpbm5lcnMgPC0gbm9iZWwgJT4lIA0KICAgIG11dGF0ZSh1c2FfYm9ybl93aW5uZXIgPSBiaXJ0aF9jb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQ0KDQojIERpc3BsYXkgdGhlIHByb3BvcnRpb25zIG9mIFVTQSBib3JuIHdpbm5lcnMgcGVyIGRlY2FkZQ0KcHJvcF91c2Ffd2lubmVycyA8LSBwcm9wX3VzYV93aW5uZXJzICU+JSANCiAgICAgICAgbXV0YXRlKGRlY2FkZSA9IGZsb29yKHllYXIgLyAxMCkgKiAxMCkgJT4lIA0KICAgICAgICBncm91cF9ieShkZWNhZGUpICAlPiUgDQogICAgICAgIHN1bW1hcml6ZShwcm9wb3J0aW9uID0gbWVhbih1c2FfYm9ybl93aW5uZXIsIG5hLnJtID0gVFJVRSkpDQpwcm9wX3VzYV93aW5uZXJzDQoNCmBgYA0KDQojNC4gVVNBIGRvbWluYW5jZSwgdmlzdWFsaXplZA0KQSB0YWJsZSBpcyBPSywgYnV0IHRvIHNlZSB3aGVuIHRoZSBVU0Egc3RhcnRlZCB0byBkb21pbmF0ZSB0aGUgTm9iZWwgY2hhcnRzIHdlIG5lZWQgYSBwbG90IQ0KDQojI1Rhc2sgNDogSW5zdHJ1Y3Rpb25zDQpQbG90IHRoZSBwcm9wb3J0aW9uIG9mIFVTQSBib3JuIHdpbm5lcnMgcGVyIGRlY2FkZS4NCg0KKiBVc2UgZ2dwbG90IHRvIHBsb3QgcHJvcF91c2Ffd2lubmVycyB3aXRoIGRlY2FkZSBvbiB0aGUgeC1heGlzIGFuZCBwcm9wb3J0aW9uIG9uIHRoZSB5LWF4aXMgYXMgYSBsaW5lLWFuZC1kb3QtcGxvdC4gVGhhdCBpcywgYWRkIGJvdGggZ2VvbV9saW5lKCkgYW5kIGdlb21fcG9pbnQoKS4NCiogRml4IHRoZSB5LXNjYWxlIHRvIHRoYXQgaXQgc2hvd3MgcGVyY2VudGFnZXMsIGl0cyBsaW1pdHMgZ28gZnJvbSAwLjAgdG8gMS4wLCBhbmQgZXh0cmEgc3BhY2luZyBpcyByZW1vdmVkIGFib3ZlIGFuZCBiZWxvdyAwLjAgYW5kIDEuMC4NCg0KKioqDQpUbyBjaGFuZ2UgdGhlIHktYXhpcyB1c2Ugc2NhbGVfeV9jb250aW51b3VzIGFuZCBzZXQgdGhlIGxhYmVscywgbGltaXRzLCBhbmQgZXhwYW5kIGFyZ3VtZW50cy4gQ2hlY2sgdGhlIGdncGxvdDIgZG9jdW1lbnRhdGlvbiBmb3IgaG93IHRvIHVzZSBsaW1pdHMgYW5kIGV4cGFuZC4gSGVyZSBpcyBhIFN0YWNrT3ZlcmZsb3cgcXVlc3Rpb24gdGhhdCBzaG93cyBob3cgdG8gc2V0IGxhYmVscyBjb3JyZWN0bHkuDQoNCmBgYHtyfQ0KIyBTZXR0aW5nIHRoZSBzaXplIG9mIHBsb3RzIGluIHRoaXMgbm90ZWJvb2sNCm9wdGlvbnMocmVwci5wbG90LndpZHRoPTcsIHJlcHIucGxvdC5oZWlnaHQ9NCkNCg0KIyBQbG90dGluZyBVU0EgYm9ybiB3aW5uZXJzDQpnZ3Bsb3QoZGF0YSA9IHByb3BfdXNhX3dpbm5lcnMsIGFlcyh4ID0gZGVjYWRlLCB5ID0gcHJvcG9ydGlvbikpKw0KICAgIGdlb21fbGluZSgpKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LA0KICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IDA6MSwgZXhwYW5kID0gYygwLDApKQ0KYGBgDQoNCiM1LiBXaGF0IGlzIHRoZSBnZW5kZXIgb2YgYSB0eXBpY2FsIE5vYmVsIFByaXplIHdpbm5lcj8NClNvIHRoZSBVU0EgYmVjYW1lIHRoZSBkb21pbmF0aW5nIHdpbm5lciBvZiB0aGUgTm9iZWwgUHJpemUgZmlyc3QgaW4gdGhlIDE5MzBzIGFuZCBoYXMga2VwdCB0aGUgbGVhZGluZyBwb3NpdGlvbiBldmVyIHNpbmNlLiBCdXQgb25lIGdyb3VwIHRoYXQgd2FzIGluIHRoZSBsZWFkIGZyb20gdGhlIHN0YXJ0LCBhbmQgbmV2ZXIgc2VlbXMgdG8gbGV0IGdvLCBhcmUgbWVuLiBNYXliZSBpdCBzaG91bGRuJ3QgY29tZSBhcyBhIHNob2NrIHRoYXQgdGhlcmUgaXMgc29tZSBpbWJhbGFuY2UgYmV0d2VlbiBob3cgbWFueSBtYWxlIGFuZCBmZW1hbGUgcHJpemUgd2lubmVycyB0aGVyZSBhcmUsIGJ1dCBob3cgc2lnbmlmaWNhbnQgaXMgdGhpcyBpbWJhbGFuY2U/IEFuZCBpcyBpdCBiZXR0ZXIgb3Igd29yc2Ugd2l0aGluIHNwZWNpZmljIHByaXplIGNhdGVnb3JpZXMgbGlrZSBwaHlzaWNzLCBtZWRpY2luZSwgbGl0ZXJhdHVyZSwgZXRjLj8NCg0KIyNUYXNrIDU6IEluc3RydWN0aW9ucw0KUGxvdCB0aGUgcHJvcG9ydGlvbiBvZiBmZW1hbGUgbGF1cmVhdGVzIGJ5IGRlY2FkZSBzcGxpdCBieSBwcml6ZSBjYXRlZ29yeS4NCg0KKiBBZGQgYGZlbWFsZV93aW5uZXJgIGNvbHVtbiwgd2hlcmUgdGhlIHZhbHVlIGlzIGBUUlVFYCB3aGVuIGBzZXhgIGlzIGAiRmVtYWxlImAuDQoqIEFkZCB0aGUgY29sdW1uIGBkZWNhZGVgIHNob3dpbmcgdGhlIGRlY2FkZSB0aGUgcHJpemUgd2FzIGF3YXJkZWQgKGAxOTUzYCBzaG91bGQgYmVjb21lIGAxOTUwYCwgZm9yIGV4YW1wbGUpLg0KKiBHcm91cCBieSBgZGVjYWRlYCBhbmQgYGNhdGVnb3J5YCBhbmQgc3VtbWFyaXplIHRoZSBwcm9wb3J0aW9uIG9mIGBmZW1hbGVfd2lubmVyYCBpbnRvIHRoZSBgcHJvcG9ydGlvbmAgY29sdW1uLg0KKiBDb3B5IGFuZCBwYXN0ZSB5b3VyIGdncGxvdCBjb2RlIGZyb20gdGFzayA0LCBleGNlcHQgcGxvdCB0aGUgYHByb3BfZmVtYWxlX3dpbm5lcnNgIGRhdGEgYW5kIG1hcCB0aGUgY2F0ZWdvcnkgdmFyaWFibGUgdG8gdGhlIGBjb2xvcmAgcGFyYW1ldGVyLg0KDQoqKioNClRoaXMgdGFzayBjYW4gYmUgc29sdmVkIGJ5IGNvcHlpbmcgYW5kIG1vZGlmeWluZyB0aGUgY29kZSBmcm9tIHRhc2sgMyBhbmQgNC4NCg0KDQpgYGB7cn0NCiMgQ2FsY3VsYXRpbmcgdGhlIHByb3BvcnRpb24gb2YgZmVtYWxlIGxhdXJlYXRlcyBwZXIgZGVjYWRlDQpwcm9wX2ZlbWFsZV93aW5uZXJzIDwtIG5vYmVsICU+JQ0KICAgICAgICBtdXRhdGUoZmVtYWxlX3dpbm5lciA9IHNleCA9PSAiRmVtYWxlIikgJT4lIA0KICAgICAgICBtdXRhdGUoZGVjYWRlID0gZmxvb3IoeWVhci8xMCkqMTApICU+JSANCiAgICAgICAgZ3JvdXBfYnkoZGVjYWRlLCBjYXRlZ29yeSkgJT4lIA0KICAgICAgICBzdW1tYXJpemUocHJvcG9ydGlvbiA9IG1lYW4oZmVtYWxlX3dpbm5lciwgbmEucm0gPSBUUlVFKSkNCiAgICANCg0KIyBQbG90dGluZyB0aGUgcHJvcG9ydGlvbiBvZiBmZW1hbGUgbGF1cmVhdGVzIHBlciBkZWNhZGUNCmdncGxvdChkYXRhID0gcHJvcF9mZW1hbGVfd2lubmVycywgYWVzKHggPSBkZWNhZGUsIHkgPSBwcm9wb3J0aW9uLCBjb2xvciA9IGNhdGVnb3J5ICkpKw0KICAgIGdlb21fbGluZSgpKw0KICAgIGdlb21fcG9pbnQoKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LA0KICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IDA6MSwgZXhwYW5kID0gYygwLDApKQ0KYGBgDQoNCiM2LiBUaGUgZmlyc3Qgd29tYW4gdG8gd2luIHRoZSBOb2JlbCBQcml6ZQ0KVGhlIHBsb3QgYWJvdmUgaXMgYSBiaXQgbWVzc3kgYXMgdGhlIGxpbmVzIGFyZSBvdmVycGxvdHRpbmcuIEJ1dCBpdCBkb2VzIHNob3cgc29tZSBpbnRlcmVzdGluZyB0cmVuZHMgYW5kIHBhdHRlcm5zLiBPdmVyYWxsIHRoZSBpbWJhbGFuY2UgaXMgcHJldHR5IGxhcmdlIHdpdGggcGh5c2ljcywgZWNvbm9taWNzLCBhbmQgY2hlbWlzdHJ5IGhhdmluZyB0aGUgbGFyZ2VzdCBpbWJhbGFuY2UuIE1lZGljaW5lIGhhcyBhIHNvbWV3aGF0IHBvc2l0aXZlIHRyZW5kLCBhbmQgc2luY2UgdGhlIDE5OTBzIHRoZSBsaXRlcmF0dXJlIHByaXplIGlzIGFsc28gbm93IG1vcmUgYmFsYW5jZWQuIFRoZSBiaWcgb3V0bGllciBpcyB0aGUgcGVhY2UgcHJpemUgZHVyaW5nIHRoZSAyMDEwcywgYnV0IGtlZXAgaW4gbWluZCB0aGF0IHRoaXMganVzdCBjb3ZlcnMgdGhlIHllYXJzIDIwMTAgdG8gMjAxNi4NCg0KR2l2ZW4gdGhpcyBpbWJhbGFuY2UsIHdobyB3YXMgdGhlIGZpcnN0IHdvbWFuIHRvIHJlY2VpdmUgYSBOb2JlbCBQcml6ZT8gQW5kIGluIHdoYXQgY2F0ZWdvcnk/DQoNCiMjVGFzayA2OiBJbnN0cnVjdGlvbnMNCkV4dHJhY3QgYW5kIGRpc3BsYXkgdGhlIHJvdyBzaG93aW5nIHRoZSBmaXJzdCB3b21hbiB0byB3aW4gYSBOb2JlbCBQcml6ZS4NCg0KKiBVc2UgYGZpbHRlcmAgdG8gZmlsdGVyIGF3YXkgYWxsIG5vbi1gIkZlbWFsZSJgIGxhdXJlYXRlcy4NCiogVXNlIGB0b3BfbmAgdG8gcGljayBvdXQgdGhlIHJvdyB3aXRoIHRoZSBlYXJsaWVzdCB5ZWFyLg0KDQoqKioNCmB0b3Bfbih4LCBuLCB3dClgIGlzIGEgdXNlZnVsIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB0YWJsZSBgeGAgYW5kIHBpY2tzIG91dCB0aGUgdG9wIGBuYCByb3dzIGFzIG9yZGVyZWQgYnkgdGhlIGNvbHVtbiBgd3RgLiBCeSBkZWZhdWx0IGB0b3BfbmAgc29ydCBoaWdoZXN0LXRvLWxvd2VzdCBzbyB0byBwaWNrIG91dCBmaXZlIGJlc3Qgb2ZmZXJzIGluIHRoZSBiYXJnYWluIGJpbiwgeW91IHdvdWxkIGhhdmUgdG8gdXNlIGBkZXNjKClgOg0KDQo+YmFyZ2Fpbl9iaW4gICU+JSANCiAgICB0b3Bfbig1LCBkZXNjKHByaWNlKSkNCiAgICANCmBgYHtyfQ0Kbm9iZWwgJT4lDQogICAgZmlsdGVyKHNleCA9PSAiRmVtYWxlIikgJT4lIA0KICAgICAgICB0b3BfbigxLCBkZXNjKHllYXIpKQ0KYGBgDQogICAgDQojNy4gUmVwZWF0IGxhdXJlYXRlcw0KRm9yIG1vc3Qgc2NpZW50aXN0cy93cml0ZXJzL2FjdGl2aXN0cyBhIE5vYmVsIFByaXplIHdvdWxkIGJlIHRoZSBjcm93bmluZyBhY2hpZXZlbWVudCBvZiBhIGxvbmcgY2FyZWVyLiBCdXQgZm9yIHNvbWUgcGVvcGxlLCBvbmUgaXMganVzdCBub3QgZW5vdWdoLCBhbmQgdGhlcmUgYXJlIGZldyB0aGF0IGhhdmUgZ290dGVuIGl0IG1vcmUgdGhhbiBvbmNlLiBXaG8gYXJlIHRoZXNlIGx1Y2t5IGZldz8gKEhhdmluZyB3b24gbm8gTm9iZWwgUHJpemUgbXlzZWxmLCBJJ2xsIGFzc3VtZSBpdCdzIGp1c3QgYWJvdXQgbHVjay4pDQoNCiMjVGFzayA3OiBJbnN0cnVjdGlvbnMNCkV4dHJhY3QgYW5kIGRpc3BsYXkgdGhlIG5hbWVzIG9mIHJlcGVhdCBOb2JlbCBQcml6ZSB3aW5uZXJzLg0KDQoqIFVzZSBgY291bnRgIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygd2lucyBncm91cGVkIGJ5IGBmdWxsX25hbWVgLg0KKiBGaWx0ZXIgYXdheSBhbGwgd2lubmVycyB0aGF0ICJvbmx5IiB3b24gb25lIHRpbWUuDQoNCmBgYHtyfQ0KIyBTZWxlY3RpbmcgdGhlIGxhdXJlYXRlcyB0aGF0IGhhdmUgcmVjZWl2ZWQgMiBvciBtb3JlIHByaXplcy4NCm5vYmVsICU+JQ0KICAgIGdyb3VwX2J5KGZ1bGxfbmFtZSkgJT4lIA0KICAgICAgICBjb3VudCgpICU+JSANCiAgICAgICAgICAgIGZpbHRlcihuPjEpICU+JSBhcnJhbmdlKGRlc2MobikpDQpgYGANCg0KIzguIEhvdyBvbGQgYXJlIHlvdSB3aGVuIHlvdSBnZXQgdGhlIHByaXplPw0KVGhlIGxpc3Qgb2YgcmVwZWF0IHdpbm5lcnMgY29udGFpbnMgc29tZSBpbGx1c3RyaW91cyBuYW1lcyEgV2UgYWdhaW4gbWVldCBNYXJpZSBDdXJpZSwgd2hvIGdvdCB0aGUgcHJpemUgaW4gcGh5c2ljcyBmb3IgZGlzY292ZXJpbmcgcmFkaWF0aW9uIGFuZCBpbiBjaGVtaXN0cnkgZm9yIGlzb2xhdGluZyByYWRpdW0gYW5kIHBvbG9uaXVtLiBKb2huIEJhcmRlZW4gZ290IGl0IHR3aWNlIGluIHBoeXNpY3MgZm9yIHRyYW5zaXN0b3JzIGFuZCBzdXBlcmNvbmR1Y3Rpdml0eSwgRnJlZGVyaWNrIFNhbmdlciBnb3QgaXQgdHdpY2UgaW4gY2hlbWlzdHJ5LCBhbmQgTGludXMgQ2FybCBQYXVsaW5nIGdvdCBpdCBmaXJzdCBpbiBjaGVtaXN0cnkgYW5kIGxhdGVyIGluIHBlYWNlIGZvciBoaXMgd29yayBpbiBwcm9tb3RpbmcgbnVjbGVhciBkaXNhcm1hbWVudC4gV2UgYWxzbyBsZWFybiB0aGF0IG9yZ2FuaXphdGlvbnMgYWxzbyBnZXQgdGhlIHByaXplIGFzIGJvdGggdGhlIFJlZCBDcm9zcyBhbmQgdGhlIFVOSENSIGhhdmUgZ290dGVuIGl0IHR3aWNlLg0KDQpCdXQgaG93IG9sZCBhcmUgeW91IGdlbmVyYWxseSB3aGVuIHlvdSBnZXQgdGhlIHByaXplPw0KDQojI1Rhc2sgODogSW5zdHJ1Y3Rpb25zDQpDYWxjdWxhdGUgYW5kIHBsb3QgdGhlIGFnZSBvZiBlYWNoIHdpbm5lciB3aGVuIHRoZXkgd29uIHRoZWlyIE5vYmVsIFByaXplLg0KDQoqIExvYWQgdGhlIGBsdWJyaWRhdGVgIHBhY2thZ2UgKHlvdSdsbCBmaW5kIHRoZSBgeWVhcigpYCBmdW5jdGlvbiB1c2VmdWwpLg0KKiBgbXV0YXRlYCB0aGUgYG5vYmVsYCB0YWJsZSB0byBpbmNsdWRlIHRoZSBjb2x1bW4gYGFnZWAgd2hpY2ggc2hvdWxkIGJlIGhvdyBvbGQgcGVvcGxlIHdlcmUgd2hlbiB0aGV5IGdvdCB0aGVpciBwcmljZS4gQXNzaWduIHRoZSByZXN1bHRpbmcgdGFibGUgdG8gYG5vYmVsX2FnZWAuDQoqIFVzZSBgZ2dwbG90YCB0byBwbG90IGBhZ2VgIGFzIGEgZnVuY3Rpb24gb2YgYHllYXJgIGFzIGEgc2NhdHRlciBwbG90IChgZ2VvbV9wb2ludCgpYCkgd2l0aCBhIHNtb290aCB0cmVuZCAoYGdlb21fc21vb3RoKClgKS4NCg0KKioqDQpUaGUgYHllYXIoKWAgZnVuY3Rpb24gZnJvbSBsdWJyaWRhdGUgdGFrZXMgYSBkYXRlIGFuZCBleHRyYWN0cyB0aGUgeWVhcjoNCg0KPmRhdGVzIDwtIGFzLkRhdGUoDQogICAgYygiMTk4NS0wNC0wMiIsDQogICAgICAiMTk4OC0wNy0yNSIpKQ0KeWVhcihkYXRlcykNCiMjIFsxXSAxOTg1IDE5ODgNCiAgICAgIA0KYGBge3J9DQojIExvYWRpbmcgdGhlIGx1YnJpZGF0ZSBwYWNrYWdlDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCg0KIyBDYWxjdWxhdGluZyB0aGUgYWdlIG9mIE5vYmVsIFByaXplIHdpbm5lcnMNCm5vYmVsX2FnZSA8LSBub2JlbCAlPiUNCiAgICBtdXRhdGUoYWdlID0geWVhciAtIHllYXIoYmlydGhfZGF0ZSkpDQoNCiMgUGxvdHRpbmcgdGhlIGFnZSBvZiBOb2JlbCBQcml6ZSB3aW5uZXJzDQpnZ3Bsb3QoZGF0YSA9IG5vYmVsX2FnZSwgYWVzKHggPSB5ZWFyLCB5ID0gYWdlKSkrDQogICAgZ2VvbV9wb2ludCgpKw0KICAgIGdlb21fc21vb3RoKCkNCmBgYA0KICAgICAgDQojOS4gQWdlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJpemUgY2F0ZWdvcmllcw0KVGhlIHBsb3QgYWJvdmUgc2hvd3MgdXMgYSBsb3QhIFdlIHNlZSB0aGF0IHBlb3BsZSB1c2UgdG8gYmUgYXJvdW5kIDU1IHdoZW4gdGhleSByZWNlaXZlZCB0aGUgcHJpY2UsIGJ1dCBub3dhZGF5cyB0aGUgYXZlcmFnZSBpcyBjbG9zZXIgdG8gNjUuIEJ1dCB0aGVyZSBpcyBhIGxhcmdlIHNwcmVhZCBpbiB0aGUgbGF1cmVhdGVzJyBhZ2VzLCBhbmQgd2hpbGUgbW9zdCBhcmUgNTArLCBzb21lIGFyZSB2ZXJ5IHlvdW5nLg0KDQpXZSBhbHNvIHNlZSB0aGF0IHRoZSBkZW5zaXR5IG9mIHBvaW50cyBpcyBtdWNoIGhpZ2ggbm93YWRheXMgdGhhbiBpbiB0aGUgZWFybHkgMTkwMHMgLS0gbm93YWRheXMgbWFueSBtb3JlIG9mIHRoZSBwcml6ZXMgYXJlIHNoYXJlZCwgYW5kIHNvIHRoZXJlIGFyZSBtYW55IG1vcmUgd2lubmVycy4gV2UgYWxzbyBzZWUgdGhhdCB0aGVyZSB3YXMgYSBkaXNydXB0aW9uIGluIGF3YXJkZWQgcHJpemVzIGFyb3VuZCB0aGUgU2Vjb25kIFdvcmxkIFdhciAoMTkzOSAtIDE5NDUpLg0KDQpMZXQncyBsb29rIGF0IGFnZSB0cmVuZHMgd2l0aGluIGRpZmZlcmVudCBwcml6ZSBjYXRlZ29yaWVzLg0KDQojI1Rhc2sgOTogSW5zdHJ1Y3Rpb25zDQpQbG90IGhvdyBvbGQgd2lubmVycyBhcmUgd2l0aGluIHRoZSBkaWZmZXJlbnQgcHJpY2UgY2F0ZWdvcmllcy4NCg0KKiBVc2UgYGdncGxvdGAgdG8gcGxvdCBgYWdlYCBhcyBhIGZ1bmN0aW9uIG9mIGB5ZWFyYCBhcyBhIHNjYXR0ZXIgcGxvdCAoYGdlb21fcG9pbnQoKWApIHdpdGggYSBzbW9vdGggdHJlbmQgKGBnZW9tX3Ntb290aCgpYCkgYW5kIGBmYWNldGAgYnkgYGNhdGVnb3J5YCB1c2luZyBgZmFjZXRfd3JhcGAuDQoqIE9wdGlvbmFsOiBSZW1vdmUgdGhlIGNvbmZpZGVuY2UgYmFuZCBpbiBgZ2VvbV9zbW9vdGhgIGJ5IHNldHRpbmcgYHNlID0gRkFMU0VgLg0KDQoqKioNClRoaXMgaXMgdGhlIHNhbWUgcGxvdCBhcyBpbiB0YXNrIDgsIGV4Y2VwdCBmYWNldGVkIGJ5IGBjYXRlZ29yeWAuDQoNClJlbW92aW5nIHRoZSBjb25maWRlbmNlIGJhbmQgaW4gYGdlb21fc21vb3RoYCBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgdGhlIGJhbmRzIGFyZSBub3QgdGhhdCBtZWFuaW5nZnVsIGFuZCByZW1vdmluZyB0aGVtIG1ha2VzIHRoZSBwbG90IG1vcmUgZm9jdXNlZC4NCg0KSWYgeW91IGRvbid0IHJlbWVtYmVyIGhvdyBgZmFjZXRfd3JhcGAgd29ya3MgdGhlbiBsb29rIHVuZGVyIEZhY2V0aW5nIG9uIHRoZSBzZWNvbmQgcGFnZSBvZiB0aGUgYGdncGxvdDJgIGNoZWF0IHNoZWV0Lg0KDQoNCmBgYHtyfQ0KIyBTYW1lIHBsb3QgYXMgYWJvdmUsIGJ1dCBmYWNldGVkIGJ5IHRoZSBjYXRlZ29yeSBvZiB0aGUgTm9iZWwgUHJpemUNCmdncGxvdChkYXRhID0gbm9iZWxfYWdlLCBhZXMoeCA9IHllYXIsIHkgPSBhZ2UpKSsNCiAgICBnZW9tX3BvaW50KCkrDQogICAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSkrDQogICAgZmFjZXRfd3JhcCh+IGNhdGVnb3J5KQ0KYGBgDQoNCiMxMC4gT2xkZXN0IGFuZCB5b3VuZ2VzdCB3aW5uZXJzDQpBbm90aGVyIHBsb3Qgd2l0aCBsb3RzIG9mIGV4Y2l0aW5nIHN0dWZmIGdvaW5nIG9uISBXZSBzZWUgdGhhdCBib3RoIHdpbm5lcnMgb2YgdGhlIGNoZW1pc3RyeSwgbWVkaWNpbmUsIGFuZCBwaHlzaWNzIHByaXplIGhhdmUgZ290dGVuIG9sZGVyIG92ZXIgdGltZS4gVGhlIHRyZW5kIGlzIHN0cm9uZ2VzdCBmb3IgcGh5c2ljczogdGhlIGF2ZXJhZ2UgYWdlIHVzZWQgdG8gYmUgYmVsb3cgNTAsIGFuZCBub3cgaXQncyBhbG1vc3QgNzAuIExpdGVyYXR1cmUgYW5kIGVjb25vbWljcyBhcmUgbW9yZSBzdGFibGUsIGFuZCB3ZSBhbHNvIHNlZSB0aGF0IGVjb25vbWljcyBpcyBhIG5ld2VyIGNhdGVnb3J5LiBCdXQgcGVhY2Ugc2hvd3MgYW4gb3Bwb3NpdGUgdHJlbmQgd2hlcmUgd2lubmVycyBhcmUgZ2V0dGluZyB5b3VuZ2VyIQ0KDQpJbiB0aGUgcGVhY2UgY2F0ZWdvcnkgd2UgYWxzbyBhIHdpbm5lciBhcm91bmQgMjAxMCB0aGF0IHNlZW1zIGV4Y2VwdGlvbmFsbHkgeW91bmcuIFRoaXMgYmVncyB0aGUgcXVlc3Rpb25zLCB3aG8gYXJlIHRoZSBvbGRlc3QgYW5kIHlvdW5nZXN0IHBlb3BsZSBldmVyIHRvIGhhdmUgd29uIGEgTm9iZWwgUHJpemU/DQoNCiMjVGFzayAxMDogSW5zdHJ1Y3Rpb25zDQpQaWNrIG91dCB0aGUgcm93cyBvZiB0aGUgb2xkZXN0IGFuZCB0aGUgeW91bmdlc3Qgd2lubmVyIG9mIGEgTm9iZWwgUHJpemUuDQoNCiogVXNlIGB0b3BfbmAgdG8gcGljayBvdXQgYW5kIGRpc3BsYXkgdGhlIHJvdyBvZiB0aGUgb2xkZXN0IHdpbm5lci4NCiogVXNlIGB0b3BfbmAgdG8gcGljayBvdXQgYW5kIGRpc3BsYXkgdGhlIHJvdyBvZiB0aGUgeW91bmdlc3Qgd2lubmVyLg0KUmVtZW1iZXIgdGhhdCB5b3UgY2FuIHVzZSBkZXNjIHRvIHJldmVyc2UgdGhlIHNvcnRpbmc6DQoNCj4jIFRoZSBtb3N0IGV4cGVuc2l2ZSBpdGVtDQpiYXJnYWluX2JpbiAgJT4lIHRvcF9uKDEsIHByaWNlKQ0KDQo+IyBUaGUgY2hlYXBlc3QgaXRlbQ0KYmFyZ2Fpbl9iaW4gICU+JSB0b3BfbigxLCBkZXNjKHByaWNlKSkNCg0KDQpgYGB7cn0NCiMgVGhlIG9sZGVzdCB3aW5uZXIgb2YgYSBOb2JlbCBQcml6ZSBhcyBvZiAyMDE2DQpub2JlbF9hZ2UgJT4lIHRvcF9uKDEsIGFnZSkNCg0KIyBUaGUgeW91bmdlc3Qgd2lubmVyIG9mIGEgTm9iZWwgUHJpemUgYXMgb2YgMjAxNg0Kbm9iZWxfYWdlICU+JSB0b3BfbigxLCBkZXNjKGFnZSkpDQpgYGANCg0KIzExLiBZb3UgZ2V0IGEgcHJpemUhDQoNCg0KSGV5ISBZb3UgZ2V0IGEgcHJpemUgZm9yIG1ha2luZyBpdCB0byB0aGUgdmVyeSBlbmQgb2YgdGhpcyBub3RlYm9vayEgSXQgbWlnaHQgbm90IGJlIGEgTm9iZWwgUHJpemUsIGJ1dCBJIG1hZGUgaXQgbXlzZWxmIGluIHBhaW50IHNvIGl0IHNob3VsZCBjb3VudCBmb3Igc29tZXRoaW5nLiBCdXQgZG9uJ3QgZGVzcGFpciwgTGVvbmlkIEh1cndpY3ogd2FzIDkwIHllYXJzIG9sZCB3aGVuIGhlIGdvdCBoaXMgcHJpemUsIHNvIGl0IG1pZ2h0IG5vdCBiZSB0b28gbGF0ZSBmb3IgeW91LiBXaG8ga25vd3MuDQoNCkJlZm9yZSB5b3UgbGVhdmUsIHdoYXQgd2FzIGFnYWluIHRoZSBuYW1lIG9mIHRoZSB5b3VuZ2VzdCB3aW5uZXIgZXZlciB3aG8gaW4gMjAxNCBnb3QgdGhlIHByaXplIGZvciAiW2hlcl0gc3RydWdnbGUgYWdhaW5zdCB0aGUgc3VwcHJlc3Npb24gb2YgY2hpbGRyZW4gYW5kIHlvdW5nIHBlb3BsZSBhbmQgZm9yIHRoZSByaWdodCBvZiBhbGwgY2hpbGRyZW4gdG8gZWR1Y2F0aW9uIj8NCg0KIyNUYXNrIDExOiBJbnN0cnVjdGlvbnMNCiogQXNzaWduIHRoZSBuYW1lIG9mIHRoZSB5b3VuZ2VzdCB3aW5uZXIgb2YgYSBOb2JlbCBQcml6ZSB0byBgeW91bmdlc3Rfd2lubmVyYC4gVGhlIGZpcnN0IG5hbWUgd2lsbCBzdWZmaWNlLg0KDQoqKioNCklmIHlvdSB3YW50IHRvIGtub3cgbW9yZQ0KVGhlIE5vYmVsIFByaXplIGRhdGFzZXQgaXMgcmljaCBhbmQgdGhlcmUgYW5kIHRoaXMgUHJvamVjdCBqdXN0IHNjcmF0Y2hlZCB0aGUgc3VyZmFjZSAtLSB0aGVyZSBpcyBtdWNoIG1vcmUgdG8gZXhwbG9yZSEgQWZ0ZXIgeW91IGhhdmUgY29tcGxldGVkIHRoaXMgUHJvamVjdCB5b3UgY2FuIGRvd25sb2FkIGl0IGFuZCBjb250aW51ZSBleHBsb3Jpbmcgb24geW91ciBvd24gY29tcHV0ZXIhIFRvIGRvIHRoYXQgeW91IHdpbGwgaGF2ZSB0byBpbnN0YWxsIEp1cHl0ZXIgbm90ZWJvb2tzIHdpdGggc3VwcG9ydCBmb3IgUi4gSGVyZSBhcmUgaW5zdHJ1Y3Rpb25zIGZvciBob3cgdG8gaW5zdGFsbCB0aGUgSnVweXRlciBOb3RlYm9vayBpbnRlcmZhY2UgYW5kIGhlcmUgYXJlIGluc3RydWN0aW9ucyBmb3IgaG93IHRvIGFkZCBzdXBwb3J0IGZvciBSLiBHb29kIGx1Y2shDQoNCmBgYHtyfQ0KIyBUaGUgbmFtZSBvZiB0aGUgeW91bmdlc3Qgd2lubmVyIG9mIHRoZSBOb2JlbCBQcml6ZSBhcyBvZiAyMDE2DQp5b3VuZ2VzdF93aW5uZXIgPC0gIk1hbGFsYSBZb3VzYWZ6YWkiDQp5b3VuZ2VzdF93aW5uZXINCmBgYA0KDQo=