# Do not edit this chunk, but *do* press the green button to the answer key for the quiz info (the unreadable string below)
tot = 0
answer.key = "eJytVsGO2zYQvfsrBr7sbmswtuQkvRTBJjm0QJug2QWKXgrQ0tgiTJFaklrV+foMh5ItrS5B6stiaZLDee/Nm5F4Mm29Q7cRG/gV6O9CFNY5LIKQxnfDxvLDciEqZUK/fOiwRAOV9CB3tg2wWUOttFbWQIO20QjBlvJEt5TxwbVFoC3f3/6CjZYFHakQPt1Dp0IFJ9s6SE/CLYqDWMHN/Q0oA0+tDejvKBT+R/eMjKH6SBn+vH4DNdJFyOAnSuPfNyvoKlVUgE+t1PHnPjEKcAabMdhsDjabguXlWqw3oDxsCJor0IQZquxqqDjSP+gF/G4KRRwHqfVpBRIOznYU0cmAYPewFq+HdJIMC1HadqeVOUBQNZ/ppdmu4YTSUczbj5MjhIlJIq1A28NtdgevFuKLuIMHCx2Cr2yrSwr/TP8j6e1se6j0iTgd3vID20WFxdEn1AR6IQ5ONlXMorFNqxkeVMoH605iLEXOUuRzKfKpFLx8dCeiEwiNVkRpSWTMxMivJgZHuq/lVwJKqPGZKAhV5IDjjoB1pICvSSp0K94bZKqtIwVVOKUjlig4VPGIJGHevs3By44vxN/RB0i0xKslylD5CVdb5mo752o75Wr7vVxtr8bVdsJVIsFLKrL4LhD2BuXxQscIVsZWzuatJ20s3/ew+uUHWzfSxWypfBttQ+Qq0t0XX3x4wDxsF7Y1wb9An12tGfWRHilCcGhKH0+mlMhCHXkrOg5dTZoW5Bok1xCGoAqqH0eVJfe0C5tfXq8FTKOkzCECLqzZ06rEEnanlwWoTOFQepzwmjGvsy6XTbtcv/zD2iPsrUvKNeqI8X1m4mxlxvRuxuO12l8f6XGcwMVAtGDHRCM9IxW3r6RrJoBzBjzrJWljVEi8/Fu62AENlUjMOR2dYbtWN+kjRWyMYi9rKgQGI6GQQdKjtqFWym0mCLg3nEqjXFI4SvOn1KFq/Y2P1W+OZLV3I/w5l2E+N1LaWH7s8edDuVKIs6orJiKVWxw+lNVOljw4qMNTt+r6WdA0aF6WQH41K/WRzu/HOUW5cS8cXM6JOOURbpMLvAqKRhSPoDt6rBy+QdJR+WwVT7E4+IpK6ZLs1d91zPbl9oTOjOmc+SdtjOg8V21pO9NJR9b12jY8QLuor8GD5EccJr/6SjUCfos9303ARaNL722haFkmCrWN5O2UG06JGf0zB958IpJ/TACO1ad2cd8lvdgV4ufEKLmF2CO1s8vBMYs5szgzZd6P1zOLvHxAhL9iEUQV6Z9sBnVmyP8BlWN9bnk4ytgMqMd6+kaJH1Uc8WI4+haTaWxTuHNljlWBPWrNeY8Fddbjin8dLh+sHW6PD55vj0PG22L5DeepzpE="
library(quizify)
source.coded.txt(answer.key)
Overview
Sweden has the longest historical series of reliable vital statistics in the world. The Human Mortality Database, founded at Berkeley, has records for counts of births, deaths, and population size since 1751, well before the demographic transition.
Malthus visited Norway and Sweden and describes his travels in his 2nd edition of (An Essay on the Principle of Population). [http://www.econlib.org/library/Malthus/malPlong7.html#Bk.II.Ch.I]. Please read these two chapters (Book II, Chapter I, “On the Checks to Population in Norway” paragraphs II.I.1 through II.I.8; and Chapter II, “On the Checks to Population in Sweden” paragraphs II.II.1 through II.II.9) for a better understanding about Malthus’s thinking on how the environment and human custom interact to produce demographic outcomes.
In this lab, our goals are:
To assess if the 18th century Swedish series of births and deaths is consistent with Malthusian theory and see if we can detect a weakening of Malthusian regime in the 19th and 20th centuries.
To learn how to use custom functions like malthus.plot.fun() by changing their arguments (without rewriting the functions themselves).
To use the non-graded interactive questions we have written for you (e.g., Q.1.1, Q.1.2).
Note: there are TWO types of questions in Lab 2. First, we have the non-graded interactive questions in the special code chunks (which we did not have in Lab 1). These you do in RStudio. The goal of these is to help your learning of the material, not to assess you. Second, as in Lab 1, we have questions at the end that will be graded. These you do in Gradescope.
Part 0: Import the data
## Note: you need to run this code to do the lab. But understanding it
## is optional.
## Read in the data from a file on our server
df <- read.table("/data175/SWE_pop_birth_death.txt", header =T)
## Display the first few rows of the object "df"
head(df)
## Create a separate object for population size, births, deaths, and year.
## Note: "read.table()" imports as a "data.frame", which stores each
## column of a data set as a separate element, which can be accessed
## with the dollar-sign, as below.
N <- df$N # population size
B <- df$B # births
D <- df$D # deaths
year <- rownames(df)
## Note: N, B, D, and year are vectors. In the last lab we used ".vec" in the names of the vectors. Here we omit this to make our code more readable.
Part 1: Inspect and understand the data
Plot the history of Swedish population size, counts of births, and counts of deaths.
plot(year, N, type = "l")

Q1.1 How big is the population of Sweden in 1800
about 20 thousand
about 200 thousand
about 2 million
about 20 million
## "Replace the NA with your answer (e.g., 'A' in quotes)"
answer1.1 = 'C'
quiz.check(answer1.1)
Your answer1.1 : C
Correct.
Explanation: 2e+06 means 2 * 10^6, which equals 2 million
To get a more readable plot we can change units
million = 1000000
N.millions <- N/million
plot(year, N.millions, type = "l")

Q1.2 What is the average (exponential) growth rate of Sweden from 1751 to 2014.
( log(N[year == "2014"]) - log(N[year == "1751"]) )/ (2014 - 1751)
[1] 0.006452649
Which value is this closest to?
1 percent
6 percent
0.5 percent
0.005 percent.
## "Replace the NA with your answer (e.g., 'A' in quotes)"
answer1.2 = 'C'
quiz.check(answer1.2)
Your answer1.2 : C
Correct.
Explanation: Yes. Incidentally, a growth rate of 0.5 percent has a
.doubling time of about 140 years. (Doubling time is equal to log(2) /
.R.) So we should have seen roughly 2 doublings, which checks with our
.graph of population history.
# plot of Deaths by year, with type = "line"
plot(x = year, y = D, type = "l")

Q1.3. In what year did Sweden have the most deaths?
In about 2000, because the population age structure shifted to older ages.
In about 1850
In 1773
## "Replace the NA with your answer (e.g., 'A' in quotes)"
answer1.3 = 'C'
quiz.check(answer1.3)
Your answer1.3 : C
Correct.
Explanation: Amazingly even though the population was smaller, the rate of mortality was so high, that 1773 saw the highest number of deaths.
Plot the births using code similar the code for deaths, which is given below. (Hint: You just need to replace the “y” variable.)
# This is the code for deaths by year (modify it slightly).
plot(x = year, y = B, type = "l")

Q1.4 When were births at their low?
In the great depression (1930s)
In the low fertility of the economic recession at the end of the 1990s.
In about 1773
## "Replace the NA with your answer (e.g., 'A' in quotes)"
answer1.4 = 'C'
quiz.check(answer1.4)
Your answer1.4 : C
Correct.
Explanation: Amazingly, the same date as peak mortality.
Part 2: Time trends in crude rates (per capita births and deaths)
Let’s get the births and deaths on a per capita basis. Demographers call these crude rates. (“Crude” because we don’t refine the population at risk – for example, we include women and men in the denominator of the birth rate.)
cbr = B/N # crude birth rate
cdr = D/N # crude death rate
par(mfrow = c(2,1)) # two panels in one plot
plot(year, cbr, type = "l", main = "Crude birth rates, Sweden")
plot(year, cdr, type = "l", main = "Crude death rates, Sweden")

Q2.1 The time trends in this plot are:
Basically the same as the counts
Quite different from the counts
## "Replace the NA with your answer (e.g., 'A' in quotes)"
answer2.1 = 'B'
quiz.check(answer2.1)
Your answer2.1 : B
Correct.
Explanation: The trends in rates show long term declines, particularly after 1850. The trends in counts are confounded by the population increase.
Q2.2. In what year was the peak death rate
In the same year as the peak number of births
In the the most recent year
In 1773, the same year as the peak number of deaths
## "Replace the NA with your answer (e.g., 'A' in quotes)"
answer2.2 = 'C'
quiz.check(answer2.2)
Your answer2.2 : C
Correct.
Explanation: The spike in mortality in 1773 was very sharp.
Q2.3 Google “1773 Sweden”. What happened in this year?
There was a war
There was a famine
The borders of Sweden changed.
## "Replace the NA with your answer (e.g., 'A' in quotes)"
answer2.3 = 'B'
quiz.check(answer2.3)
Your answer2.3 : B
Correct.
Explanation: The 1773 famine was a catastrophic event. An
.inspiration for Malthus's thinking?.
Part 3: Detecting Malthusian dynamics
In class, we showed the two-panel graphical explanation of the Malthusian model. In the upper panel, we showed the relationship between wages and birth and death rates. In the lower panel, we showed the relationship between population size and wages. Together, these two panels create the feedback loop for a very low growth Malthusian economy and population.
Here, we will look at whether one part of the Malthusian world appears to hold: that births and deaths go in opposite directions in good and bad times. We don’t have a measure of wages, so our inference is going to be indirect, looking at the relationship between births and deaths by year.
Q3.1. What relationship between births and deaths would be consistent with a Malthusian economy
As births go up, deaths go up
As birth rates go up, deaths rates go up
As births go down, deaths go up
As birth rates go down, death rates go up.
## "Replace the NA with your answer (e.g., 'A' in quotes)"
answer3.1 = 'D'
quiz.check(answer3.1)
Your answer3.1 : D
Correct.
Explanation: In a bad times, death rates would rise (the positive check) and people would avoid having children (the preventive check).
malthus.plot.fun <- function(from.year, to.year)
{
## a scatter plot of crude birth and death rates
## note: this function assumes that cdr and cbr already exist.
## If you're having problems, try running the code chunk above
## that creates the cbr and cdr
my.years <- from.year:to.year
s <- year %in% my.years
plot(cdr[s], cbr[s], type = "n",
xlab = "Crude death rate", ylab = "Crude birth rate")
abline(lm(cbr ~ cdr, subset = s))
text(cdr[s], cbr[s], year[s], cex = .5)
my.cor <- round(cor(cdr[s], cbr[s]), 2)
title(paste("Birth and Death Rates in Sweden, from", from.year,
"to", to.year, "\n Correlation:", my.cor))
}
## now let's plot the first 50 years
malthus.plot.fun(from.year = 1751, to.year = 1800)

Q3.2 Which of the patterns in Q3.1 (A,B,C,or,D) does this match most closely?
## "Replace the 'NA' with your answer (e.g., 'A' in quotes)"
answer3.2 = 'D'
quiz.check(answer3.2)
Your answer3.2 : D
Correct.
Explanation: Higher mortality rates are in years with lower
.fertility rates
Q3.3 Is the pattern seen from 1751 to 1800 consistent with Malthusian theory?
A. Yes
B. No
## "Replace the 'NA' with your answer (e.g., 'A' in quotes)"
answer3.3 = 'A'
quiz.check(answer3.3)
Your answer3.3 : A
Correct.
Explanation: Our data is consistent with Malthus's idea that in bad times birth rates fell and death rates rose, and that in good times death rates fell and birth rates rose.
We see that birth rates are low when death rates are high (e.g., in 1772 and 1773). Even if we ignore these unusual years, there is a generally negative relationship. Now plot the relationship for the following time periods.
1801-1850
## Modify the code we used for 1751 to 100 appropriately.
malthus.plot.fun(from.year = 1801, to.year = 1850)

1851-1900
## Modify the code we used for 1751 to 100 appropriately.
malthus.plot.fun(from.year = 1851, to.year = 1900)

1901-2014
## Modify the code we used for 1751 to 100 appropriately.
malthus.plot.fun(from.year = 1901, to.year = 2014)

Part 4: Lab write up. Please limit each answer to 50 words or less.
- Turn in your plot of the relationship between birth and death rates from 1801-1850. (Note: to save a graph from your RStudio notebook, right click on it with your mouse and “Save image as …”)
Completely optional: for those familiar with R, you can add your name to the plot using the text() function in R. Try adding it in the lower right of the plot.
- In which of the periods you explored above does the Malthusian relationship first break down? What is your basis for judging? What happens to the time trend in birth and death rates that makes the Malthusian relationship go away?
Malthusian’s theory first breaks down in 1851-1900 because that is the first time the correlation is positive
- What does Malthus say is the main determinant of birth rates in Norway? (Hint: see II.I.3 and subsequent paragraphs in the reading). Would this suggest that births would fall in the same year as deaths would rise, or a year or two after?
Malthus says the main determinant of birth rates in Norway are the marriage checks, because marriages are so low due to the approval needed by peasants from the officer and minister of sufficient funds, the birth rate is also low. Following this code, this would suggest birth rates would fall a year or two after in order for the effects of the marriage codes to kick in.
Questions 4 and 5: Ireland and the Potato
Potatoes are relatively easy to grow and can be stored year-round to provide a nutritious source of food even in wintertime. In the late 18th century, the introduction of the potato as a staple crop changed the agricultural economy of Ireland by increasing the amount of food that farmers could produce and store. In Malthusian terms, this can be represented as an increase in the wage at every population size – a shift in the wage curve. (If it’s helpful, think of “wage” as calories – at a given population size, the land can now provide more calories per person.)
In the Malthus app found at http://shiny.demog.berkeley.edu/josh/new_malthus/, we can simulate this by moving the wage level from its default of 1 to a higher level, such as 1.18. Do this, and then click “play” (small blue triangle at the bottom of the page). Note that in the app, the “short term” consequences of a shift begin at the vertical dotted line at time zero. Use the simulation to answer the following questions:
- Describe in words what happens in the short term as a result of the introduction of the potato. What happens to wages immediately after the potato is introduced? What happens to birth and death rates? (Describe the direction of change – you don’t have to give precise numbers.)
In the short run, after the potato is introduced the wages and therefore standard of living will increase as farmers are able to produce and sell potatoes but as time goes on, due to increased wages the birth rates will go up, and death rates will go down, therefore population in long run will increase.
- According to Malthus, in the long term, should the population of Ireland return to its initial size? Why or why not?
In the long run the population will now be larger due to this technological advancement. The technology leads to a temporary increase in standard of living and because wages increase so does population and becomes the new equilibrium, wages in the long run go back to equilibrium.
Questions 6 to 8: pen-and-paper questions
- On a separate sheet of paper, draw your own Malthusian graph system. (We recommend drawing by hand, as you may be asked to draw this kind of graph on the exams without the aid of a computer.) The top graph should show birth and death rates as a function of wages; the bottom graph should show population size as a function of wages. Label all of the axes and mark the equilibrium state on both graphs by marking b, d, w, and N (equilibrium birth rate, death rate, wage rate, and population size) on the appropriate axes.
- Imagine that marriage norms change and people start getting married at later ages. This results in a lower birth rate at every wage level. Show this change on your graph by drawing a second, dotted, birth rate line. Mark the new equilibria as b’, d’, w’, and P’. Describe in words what happened to the equilibrium wage level and population size:
- Imagine that a new group of immigrants arrives. Their technologies and social behaviors are identical to the natives. Describe in words what affect this would have. Would it cause a curve to shift, or a temporary move along one of the curves? Which curve, and in which direction would the shift or move be?
- [non-graded] About how many hours did it take you to complete this lab?
90 minutes
Congratulations! You have completed Lab 2.
LS0tCnRpdGxlOiAiRWNvbi9EZW1vZyBDMTc1IExhYiAyOiBNYWx0aHVzIGluIFN3ZWRlbiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CiMgRG8gbm90IGVkaXQgdGhpcyBjaHVuaywgYnV0ICpkbyogcHJlc3MgdGhlIGdyZWVuIGJ1dHRvbiB0byB0aGUgYW5zd2VyIGtleSBmb3IgdGhlIHF1aXogaW5mbyAodGhlIHVucmVhZGFibGUgc3RyaW5nIGJlbG93KQp0b3QgPSAwCmFuc3dlci5rZXkgPSAiZUp5dFZzR08yellRdmZzckJyN3NibXN3dHVRa3ZSVEJKam0wUUp1ZzJRV0tYZ3JRMHRnaVRKRmFrbHJWK2ZvTWg1SXRyUzVCNnN0aWFaTERlZS9ObTVGNE1tMjlRN2NSRy9nVjZPOUNGTlk1TElLUXhuZkR4dkxEY2lFcVpVSy9mT2l3UkFPVjlDQjN0ZzJ3V1VPdHRGYldRSU8yMFFqQmx2SkV0NVR4d2JWRm9DM2YzLzZDalpZRkhha1FQdDFEcDBJRko5czZTRS9DTFlxRFdNSE4vUTBvQTArdERlanZLQlQrUi9lTWpLSDZTQm4rdkg0RE5kSkZ5T0FuU3VQZk55dm9LbFZVZ0UrdDFQSG5QakVLY0FhYk1kaHNEamFiZ3VYbFdxdzNvRHhzQ0pvcjBJUVpxdXhxcURqU1ArZ0YvRzRLUlJ3SHFmVnBCUklPem5ZVTBjbUFZUGV3RnErSGRKSU1DMUhhZHFlVk9VQlFOWi9wcGRtdTRZVFNVY3piajVNamhJbEpJcTFBMjhOdGRnZXZGdUtMdUlNSEN4MkNyMnlyU3dyL1RQOGo2ZTFzZTZqMGlUZ2QzdklEMjBXRnhkRW4xQVI2SVE1T05sWE1vckZOcXhrZVZNb0g2MDVpTEVYT1V1UnpLZktwRkx4OGRDZWlFd2lOVmtScFNXVE14TWl2SmdaSHVxL2xWd0pLcVBHWktBaFY1SURqam9CMXBJQ3ZTU3AwSzk0YlpLcXRJd1ZWT0tVamxpZzRWUEdJSkdIZXZzM0J5NDR2eE4vUkIwaTB4S3NseWxENUNWZGI1bW83NTJvNzVXcjd2Vnh0cjhiVmRzSlZJc0ZMS3JMNExoRDJCdVh4UXNjSVZzWld6dWF0SjIwczMvZXcrdVVIV3pmU3hXeXBmQnR0UStRcTB0MFhYM3g0d0R4c0Y3WTF3YjlBbjEydEdmV1JIaWxDY0doS0gwK21sTWhDSFhrck9nNWRUWm9XNUJvazF4Q0dvQXFxSDBlVkpmZTBDNXRmWHE4RlRLT2t6Q0VDTHF6WjA2ckVFbmFubHdXb1RPRlFlcHp3bWpHdnN5NlhUYnRjdi96RDJpUHNyVXZLTmVxSThYMW00bXhseHZSdXh1TzEybDhmNlhHY3dNVkF0R0RIUkNNOUl4VzNyNlJySm9CekJqenJKV2xqVkVpOC9GdTYyQUVObFVqTU9SMmRZYnRXTitralJXeU1ZaTlyS2dRR0k2R1FRZEtqdHFGV3ltMG1DTGczbkVxalhGSTRTdk9uMUtGcS9ZMlAxVytPWkxWM0kvdzVsMkUrTjFMYVdIN3M4ZWREdVZLSXM2b3JKaUtWV3h3K2xOVk9sanc0cU1OVHQrcjZXZEEwYUY2V1FINDFLL1dSenUvSE9VVzVjUzhjWE02Sk9PVVJicE1MdkFxS1JoU1BvRHQ2ckJ5K1FkSlIrV3dWVDdFNCtJcEs2WkxzMWQ5MXpQYmw5b1RPak9tYytTZHRqT2c4VjIxcE85TkpSOWIxMmpZOFFMdW9yOEdENUVjY0pyLzZTalVDZm9zOTMwM0FSYU5MNzIyaGFGa21DcldONU8yVUcwNkpHZjB6Qjk1OElwSi9UQUNPMWFkMmNkOGx2ZGdWNHVmRUtMbUYyQ08xczh2Qk1ZczVzemd6WmQ2UDF6T0x2SHhBaEw5aUVVUVY2WjlzQm5WbXlQOEJsV045Ym5rNHl0Z01xTWQ2K2thSkgxVWM4V0k0K2hhVGFXeFR1SE5samxXQlBXck5lWThGZGRiamluOGRMaCtzSFc2UEQ1NXZqMFBHMjJMNURlZXB6cEU9IgpsaWJyYXJ5KHF1aXppZnkpCnNvdXJjZS5jb2RlZC50eHQoYW5zd2VyLmtleSkKYGBgCgoKIyBPdmVydmlldwoKU3dlZGVuIGhhcyB0aGUgbG9uZ2VzdCBoaXN0b3JpY2FsIHNlcmllcyBvZiByZWxpYWJsZSB2aXRhbCBzdGF0aXN0aWNzCmluIHRoZSB3b3JsZC4gVGhlIEh1bWFuIE1vcnRhbGl0eSBEYXRhYmFzZSwgZm91bmRlZCBhdCBCZXJrZWxleSwgaGFzCnJlY29yZHMgZm9yIGNvdW50cyBvZiBiaXJ0aHMsIGRlYXRocywgYW5kIHBvcHVsYXRpb24gc2l6ZSBzaW5jZSAxNzUxLAp3ZWxsIGJlZm9yZSB0aGUgZGVtb2dyYXBoaWMgdHJhbnNpdGlvbi4KCgpNYWx0aHVzIHZpc2l0ZWQgTm9yd2F5IGFuZCBTd2VkZW4gYW5kIGRlc2NyaWJlcyBoaXMgdHJhdmVscyBpbiBoaXMgMm5kCmVkaXRpb24gb2YgKEFuIEVzc2F5IG9uIHRoZSBQcmluY2lwbGUgb2YKUG9wdWxhdGlvbikuIFtodHRwOi8vd3d3LmVjb25saWIub3JnL2xpYnJhcnkvTWFsdGh1cy9tYWxQbG9uZzcuaHRtbCNCay5JSS5DaC5JXS4gUGxlYXNlCnJlYWQgdGhlc2UgdHdvIGNoYXB0ZXJzIChCb29rIElJLCBDaGFwdGVyIEksICJPbiB0aGUgQ2hlY2tzIHRvClBvcHVsYXRpb24gaW4gTm9yd2F5IiBwYXJhZ3JhcGhzIElJLkkuMSB0aHJvdWdoIElJLkkuODsgYW5kIENoYXB0ZXIKSUksICJPbiB0aGUgQ2hlY2tzIHRvIFBvcHVsYXRpb24gaW4gU3dlZGVuIiBwYXJhZ3JhcGhzIElJLklJLjEgdGhyb3VnaApJSS5JSS45KSBmb3IgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBhYm91dCBNYWx0aHVzJ3MgdGhpbmtpbmcgb24gaG93CnRoZSBlbnZpcm9ubWVudCBhbmQgaHVtYW4gY3VzdG9tIGludGVyYWN0IHRvIHByb2R1Y2UgZGVtb2dyYXBoaWMKb3V0Y29tZXMuCgoKSW4gdGhpcyBsYWIsIG91ciBnb2FscyBhcmU6CgoxLiBUbyBhc3Nlc3MgaWYgdGhlIDE4dGggY2VudHVyeSBTd2VkaXNoIHNlcmllcyBvZiBiaXJ0aHMgYW5kIGRlYXRocyBpcwpjb25zaXN0ZW50IHdpdGggTWFsdGh1c2lhbiB0aGVvcnkgYW5kIHNlZSBpZiB3ZSBjYW4gZGV0ZWN0IGEgd2Vha2VuaW5nCm9mIE1hbHRodXNpYW4gcmVnaW1lIGluIHRoZSAxOXRoIGFuZCAyMHRoIGNlbnR1cmllcy4KCjIuIFRvIGxlYXJuIGhvdyB0byB1c2UgY3VzdG9tIGZ1bmN0aW9ucyBsaWtlIG1hbHRodXMucGxvdC5mdW4oKSBieQogICBjaGFuZ2luZyB0aGVpciBhcmd1bWVudHMgKHdpdGhvdXQgcmV3cml0aW5nIHRoZSBmdW5jdGlvbnMgdGhlbXNlbHZlcykuCgozLiBUbyB1c2UgdGhlIG5vbi1ncmFkZWQgaW50ZXJhY3RpdmUgcXVlc3Rpb25zIHdlIGhhdmUgd3JpdHRlbiBmb3IgeW91CihlLmcuLCBRLjEuMSwgUS4xLjIpLgoKTm90ZTogdGhlcmUgYXJlIFRXTyB0eXBlcyBvZiBxdWVzdGlvbnMgaW4gTGFiIDIuIEZpcnN0LCB3ZSBoYXZlIHRoZQpub24tZ3JhZGVkIGludGVyYWN0aXZlIHF1ZXN0aW9ucyBpbiB0aGUgc3BlY2lhbCBjb2RlIGNodW5rcyAod2hpY2ggd2UKZGlkIG5vdCBoYXZlIGluIExhYiAxKS4gVGhlc2UgeW91IGRvIGluIFJTdHVkaW8uIFRoZSBnb2FsIG9mIHRoZXNlIGlzCnRvIGhlbHAgeW91ciBsZWFybmluZyBvZiB0aGUgbWF0ZXJpYWwsIG5vdCB0byBhc3Nlc3MgeW91LiBTZWNvbmQsIGFzCmluIExhYiAxLCB3ZSBoYXZlIHF1ZXN0aW9ucyBhdCB0aGUgZW5kIHRoYXQgd2lsbCBiZSBncmFkZWQuIFRoZXNlIHlvdQpkbyBpbiBHcmFkZXNjb3BlLgoKCgoKIyBQYXJ0IDA6IEltcG9ydCB0aGUgZGF0YQoKCmBgYHtyfQoKIyMgTm90ZTogeW91IG5lZWQgdG8gcnVuIHRoaXMgY29kZSB0byBkbyB0aGUgbGFiLiBCdXQgdW5kZXJzdGFuZGluZyBpdAojIyBpcyBvcHRpb25hbC4KCiMjIFJlYWQgaW4gdGhlIGRhdGEgZnJvbSBhIGZpbGUgb24gb3VyIHNlcnZlcgpkZiA8LSByZWFkLnRhYmxlKCIvZGF0YTE3NS9TV0VfcG9wX2JpcnRoX2RlYXRoLnR4dCIsIGhlYWRlciA9VCkKCiMjIERpc3BsYXkgdGhlIGZpcnN0IGZldyByb3dzIG9mIHRoZSBvYmplY3QgImRmIgpoZWFkKGRmKQoKIyMgQ3JlYXRlIGEgc2VwYXJhdGUgb2JqZWN0IGZvciBwb3B1bGF0aW9uIHNpemUsIGJpcnRocywgZGVhdGhzLCBhbmQgeWVhci4KIyMgTm90ZTogInJlYWQudGFibGUoKSIgaW1wb3J0cyBhcyBhICJkYXRhLmZyYW1lIiwgd2hpY2ggc3RvcmVzIGVhY2gKIyMgY29sdW1uIG9mIGEgZGF0YSBzZXQgYXMgYSBzZXBhcmF0ZSBlbGVtZW50LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQKIyMgd2l0aCB0aGUgZG9sbGFyLXNpZ24sIGFzIGJlbG93LgpOIDwtIGRmJE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3B1bGF0aW9uIHNpemUKQiA8LSBkZiRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYmlydGhzCkQgPC0gZGYkRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlYXRocwp5ZWFyIDwtIHJvd25hbWVzKGRmKQojIyBOb3RlOiBOLCBCLCBELCBhbmQgeWVhciBhcmUgdmVjdG9ycy4gSW4gdGhlIGxhc3QgbGFiIHdlIHVzZWQgIi52ZWMiIGluIHRoZSBuYW1lcyBvZiB0aGUgdmVjdG9ycy4gSGVyZSB3ZSBvbWl0IHRoaXMgdG8gbWFrZSBvdXIgY29kZSBtb3JlIHJlYWRhYmxlLgoKYGBgCgojIFBhcnQgMTogSW5zcGVjdCBhbmQgdW5kZXJzdGFuZCB0aGUgZGF0YQoKUGxvdCB0aGUgaGlzdG9yeSBvZiBTd2VkaXNoIHBvcHVsYXRpb24gc2l6ZSwgY291bnRzIG9mIGJpcnRocywgYW5kIGNvdW50cyBvZiBkZWF0aHMuCgpgYGB7cn0KcGxvdCh5ZWFyLCBOLCB0eXBlID0gImwiKQpgYGAKClExLjEgSG93IGJpZyBpcyB0aGUgcG9wdWxhdGlvbiBvZiBTd2VkZW4gaW4gMTgwMAoKQS4gIGFib3V0IDIwIHRob3VzYW5kCgpCLiAgYWJvdXQgMjAwIHRob3VzYW5kCgpDLiAgYWJvdXQgMiBtaWxsaW9uCgpELiAgYWJvdXQgMjAgbWlsbGlvbgoKYGBge3J9CiMjICAiUmVwbGFjZSB0aGUgTkEgd2l0aCB5b3VyIGFuc3dlciAoZS5nLiwgJ0EnIGluIHF1b3RlcykiCmFuc3dlcjEuMSA9ICdDJwpxdWl6LmNoZWNrKGFuc3dlcjEuMSkKYGBgCgpUbyBnZXQgYSBtb3JlIHJlYWRhYmxlIHBsb3Qgd2UgY2FuIGNoYW5nZSB1bml0cwpgYGB7cn0KbWlsbGlvbiA9IDEwMDAwMDAKTi5taWxsaW9ucyA8LSBOL21pbGxpb24KcGxvdCh5ZWFyLCBOLm1pbGxpb25zLCB0eXBlID0gImwiKQpgYGAKClExLjIgV2hhdCBpcyB0aGUgYXZlcmFnZSAoZXhwb25lbnRpYWwpIGdyb3d0aCByYXRlIG9mIFN3ZWRlbiBmcm9tIDE3NTEKdG8gMjAxNC4KYGBge3J9CiggbG9nKE5beWVhciA9PSAiMjAxNCJdKSAtIGxvZyhOW3llYXIgPT0gIjE3NTEiXSkgKS8gKDIwMTQgLSAxNzUxKQpgYGAKV2hpY2ggdmFsdWUgaXMgdGhpcyBjbG9zZXN0IHRvPwoKQS4gIDEgcGVyY2VudAoKQi4gIDYgcGVyY2VudAoKQy4gIDAuNSBwZXJjZW50CgpELiAgMC4wMDUgcGVyY2VudC4KCmBgYHtyfQojIyAgIlJlcGxhY2UgdGhlIE5BIHdpdGggeW91ciBhbnN3ZXIgKGUuZy4sICdBJyBpbiBxdW90ZXMpIgphbnN3ZXIxLjIgPSAnQycKcXVpei5jaGVjayhhbnN3ZXIxLjIpCmBgYAoKCmBgYHtyfQojIHBsb3Qgb2YgRGVhdGhzIGJ5IHllYXIsIHdpdGggdHlwZSA9ICJsaW5lIgpwbG90KHggPSB5ZWFyLCB5ID0gRCwgdHlwZSA9ICJsIikKYGBgCgpRMS4zLiBJbiB3aGF0IHllYXIgZGlkIFN3ZWRlbiBoYXZlIHRoZSBtb3N0IGRlYXRocz8KCkEuICBJbiBhYm91dCAyMDAwLCBiZWNhdXNlIHRoZSBwb3B1bGF0aW9uIGFnZSBzdHJ1Y3R1cmUgc2hpZnRlZCB0byBvbGRlciBhZ2VzLgoKQi4gIEluIGFib3V0IDE4NTAKCkMuICBJbiAxNzczCgpgYGB7cn0KIyMgICJSZXBsYWNlIHRoZSBOQSB3aXRoIHlvdXIgYW5zd2VyIChlLmcuLCAnQScgaW4gcXVvdGVzKSIKYW5zd2VyMS4zID0gJ0MnCnF1aXouY2hlY2soYW5zd2VyMS4zKQpgYGAKCgpQbG90IHRoZSBiaXJ0aHMgdXNpbmcgY29kZSBzaW1pbGFyIHRoZSBjb2RlIGZvciBkZWF0aHMsIHdoaWNoIGlzIGdpdmVuCmJlbG93LiAoSGludDogWW91IGp1c3QgbmVlZCB0byByZXBsYWNlIHRoZSAieSIgdmFyaWFibGUuKQpgYGB7cn0KIyBUaGlzIGlzIHRoZSBjb2RlIGZvciBkZWF0aHMgYnkgeWVhciAobW9kaWZ5IGl0IHNsaWdodGx5KS4KcGxvdCh4ID0geWVhciwgeSA9IEIsIHR5cGUgPSAibCIpCmBgYAoKUTEuNCBXaGVuIHdlcmUgYmlydGhzIGF0IHRoZWlyIGxvdz8KCkEuICBJbiB0aGUgZ3JlYXQgZGVwcmVzc2lvbiAoMTkzMHMpCgpCLiAgSW4gdGhlIGxvdyBmZXJ0aWxpdHkgb2YgdGhlIGVjb25vbWljIHJlY2Vzc2lvbiBhdCB0aGUgZW5kIG9mIHRoZSAxOTkwcy4KCkMuICBJbiBhYm91dCAxNzczCgpgYGB7cn0KIyMgICJSZXBsYWNlIHRoZSBOQSB3aXRoIHlvdXIgYW5zd2VyIChlLmcuLCAnQScgaW4gcXVvdGVzKSIKYW5zd2VyMS40ID0gJ0MnCnF1aXouY2hlY2soYW5zd2VyMS40KQpgYGAKCgoKIyBQYXJ0IDI6IFRpbWUgdHJlbmRzIGluIGNydWRlIHJhdGVzIChwZXIgY2FwaXRhIGJpcnRocyBhbmQgZGVhdGhzKQoKTGV0J3MgZ2V0IHRoZSBiaXJ0aHMgYW5kIGRlYXRocyBvbiBhIHBlciBjYXBpdGEgYmFzaXMuIERlbW9ncmFwaGVycyBjYWxsIHRoZXNlIGNydWRlIHJhdGVzLiAoIkNydWRlIiBiZWNhdXNlIHdlIGRvbid0IHJlZmluZSB0aGUgcG9wdWxhdGlvbiBhdCByaXNrIC0tIGZvciBleGFtcGxlLCB3ZSBpbmNsdWRlIHdvbWVuIGFuZCBtZW4gaW4gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBiaXJ0aCByYXRlLikKCmBgYHtyIGdldC5yYXRlcywgZmlnLmhlaWdodD01fQpjYnIgPSBCL04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjcnVkZSBiaXJ0aCByYXRlCmNkciA9IEQvTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNydWRlIGRlYXRoIHJhdGUKcGFyKG1mcm93ID0gYygyLDEpKSAgICAgICAgICAgICAgICAgICAgICMgdHdvIHBhbmVscyBpbiBvbmUgcGxvdApwbG90KHllYXIsIGNiciwgdHlwZSA9ICJsIiwgbWFpbiA9ICJDcnVkZSBiaXJ0aCByYXRlcywgU3dlZGVuIikKcGxvdCh5ZWFyLCBjZHIsIHR5cGUgPSAibCIsIG1haW4gPSAiQ3J1ZGUgZGVhdGggcmF0ZXMsIFN3ZWRlbiIpCmBgYAoKUTIuMSBUaGUgdGltZSB0cmVuZHMgaW4gdGhpcyBwbG90IGFyZToKCkEuICBCYXNpY2FsbHkgdGhlIHNhbWUgYXMgdGhlIGNvdW50cwoKQi4gIFF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBjb3VudHMKCmBgYHtyfQojIyAgIlJlcGxhY2UgdGhlIE5BIHdpdGggeW91ciBhbnN3ZXIgKGUuZy4sICdBJyBpbiBxdW90ZXMpIgphbnN3ZXIyLjEgPSAnQicKcXVpei5jaGVjayhhbnN3ZXIyLjEpCmBgYAoKUTIuMi4gSW4gd2hhdCB5ZWFyIHdhcyB0aGUgcGVhayBkZWF0aCByYXRlCgpBLiAgSW4gdGhlIHNhbWUgeWVhciBhcyB0aGUgcGVhayBudW1iZXIgb2YgYmlydGhzCgpCLiAgSW4gdGhlIHRoZSBtb3N0IHJlY2VudCB5ZWFyCgpDLiAgSW4gMTc3MywgdGhlIHNhbWUgeWVhciBhcyB0aGUgcGVhayBudW1iZXIgb2YgZGVhdGhzCgpgYGB7cn0KIyMgICJSZXBsYWNlIHRoZSBOQSB3aXRoIHlvdXIgYW5zd2VyIChlLmcuLCAnQScgaW4gcXVvdGVzKSIKYW5zd2VyMi4yID0gJ0MnCnF1aXouY2hlY2soYW5zd2VyMi4yKQpgYGAKClEyLjMgR29vZ2xlICIxNzczIFN3ZWRlbiIuIFdoYXQgaGFwcGVuZWQgaW4gdGhpcyB5ZWFyPwoKQS4gIFRoZXJlIHdhcyBhIHdhcgoKQi4gIFRoZXJlIHdhcyBhIGZhbWluZQoKQy4gIFRoZSBib3JkZXJzIG9mIFN3ZWRlbiBjaGFuZ2VkLgoKYGBge3J9CiMjICAiUmVwbGFjZSB0aGUgTkEgd2l0aCB5b3VyIGFuc3dlciAoZS5nLiwgJ0EnIGluIHF1b3RlcykiCmFuc3dlcjIuMyA9ICdCJwpxdWl6LmNoZWNrKGFuc3dlcjIuMykKYGBgCgoKIyBQYXJ0IDM6IERldGVjdGluZyBNYWx0aHVzaWFuIGR5bmFtaWNzCgpJbiBjbGFzcywgd2Ugc2hvd2VkIHRoZSB0d28tcGFuZWwgZ3JhcGhpY2FsIGV4cGxhbmF0aW9uIG9mIHRoZSBNYWx0aHVzaWFuCm1vZGVsLiBJbiB0aGUgdXBwZXIgcGFuZWwsIHdlIHNob3dlZCAgdGhlCnJlbGF0aW9uc2hpcCBiZXR3ZWVuIHdhZ2VzIGFuZCBiaXJ0aCBhbmQgZGVhdGggcmF0ZXMuIEluIHRoZSBsb3dlcgpwYW5lbCwgd2Ugc2hvd2VkIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3B1bGF0aW9uIHNpemUgYW5kCndhZ2VzLiBUb2dldGhlciwgdGhlc2UgdHdvIHBhbmVscyBjcmVhdGUgdGhlIGZlZWRiYWNrIGxvb3AgZm9yIGEgdmVyeQpsb3cgZ3Jvd3RoIE1hbHRodXNpYW4gZWNvbm9teSBhbmQgcG9wdWxhdGlvbi4KCkhlcmUsIHdlIHdpbGwgbG9vayBhdCB3aGV0aGVyIG9uZSBwYXJ0IG9mIHRoZSBNYWx0aHVzaWFuIHdvcmxkIGFwcGVhcnMKdG8gaG9sZDogdGhhdCBiaXJ0aHMgYW5kIGRlYXRocyBnbyBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zIGluIGdvb2QgYW5kCmJhZCB0aW1lcy4gV2UgZG9uJ3QgaGF2ZSBhIG1lYXN1cmUgb2Ygd2FnZXMsIHNvIG91ciBpbmZlcmVuY2UgaXMgZ29pbmcKdG8gYmUgaW5kaXJlY3QsIGxvb2tpbmcgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJpcnRocyBhbmQgZGVhdGhzCmJ5IHllYXIuCgpRMy4xLiBXaGF0IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJpcnRocyBhbmQgZGVhdGhzIHdvdWxkIGJlIGNvbnNpc3RlbnQKd2l0aCBhIE1hbHRodXNpYW4gZWNvbm9teQoKQS4gIEFzIGJpcnRocyBnbyB1cCwgZGVhdGhzIGdvIHVwCgpCLiAgQXMgYmlydGggcmF0ZXMgZ28gdXAsIGRlYXRocyByYXRlcyBnbyB1cAoKQy4gIEFzIGJpcnRocyBnbyBkb3duLCBkZWF0aHMgZ28gdXAKCkQuICBBcyBiaXJ0aCByYXRlcyBnbyBkb3duLCBkZWF0aCByYXRlcyBnbyB1cC4KCmBgYHtyfQojIyAgIlJlcGxhY2UgdGhlIE5BIHdpdGggeW91ciBhbnN3ZXIgKGUuZy4sICdBJyBpbiBxdW90ZXMpIgphbnN3ZXIzLjEgPSAnRCcKcXVpei5jaGVjayhhbnN3ZXIzLjEpCmBgYAoKYGBge3J9Cm1hbHRodXMucGxvdC5mdW4gPC0gZnVuY3Rpb24oZnJvbS55ZWFyLCB0by55ZWFyKQp7CiAgIyMgYSBzY2F0dGVyIHBsb3Qgb2YgY3J1ZGUgYmlydGggYW5kIGRlYXRoIHJhdGVzCiAgIyMgbm90ZTogdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgY2RyIGFuZCBjYnIgYWxyZWFkeSBleGlzdC4KICAjIyBJZiB5b3UncmUgaGF2aW5nIHByb2JsZW1zLCB0cnkgcnVubmluZyB0aGUgY29kZSBjaHVuayBhYm92ZQogICMjIHRoYXQgY3JlYXRlcyB0aGUgY2JyIGFuZCBjZHIKICBteS55ZWFycyA8LSBmcm9tLnllYXI6dG8ueWVhcgogIHMgPC0geWVhciAlaW4lIG15LnllYXJzCiAgcGxvdChjZHJbc10sIGNicltzXSwgdHlwZSA9ICJuIiwKICAgICAgIHhsYWIgPSAiQ3J1ZGUgZGVhdGggcmF0ZSIsIHlsYWIgPSAiQ3J1ZGUgYmlydGggcmF0ZSIpCiAgYWJsaW5lKGxtKGNiciB+IGNkciwgc3Vic2V0ID0gcykpCiAgdGV4dChjZHJbc10sIGNicltzXSwgeWVhcltzXSwgY2V4ID0gLjUpCiAgbXkuY29yIDwtIHJvdW5kKGNvcihjZHJbc10sIGNicltzXSksIDIpCiAgdGl0bGUocGFzdGUoIkJpcnRoIGFuZCBEZWF0aCBSYXRlcyBpbiBTd2VkZW4sIGZyb20iLCBmcm9tLnllYXIsCiAgICAgICAgICAgICAgInRvIiwgdG8ueWVhciwgIlxuIENvcnJlbGF0aW9uOiIsIG15LmNvcikpCn0KCiMjIG5vdyBsZXQncyBwbG90IHRoZSBmaXJzdCA1MCB5ZWFycwptYWx0aHVzLnBsb3QuZnVuKGZyb20ueWVhciA9IDE3NTEsIHRvLnllYXIgPSAxODAwKQpgYGAKUTMuMiBXaGljaCBvZiB0aGUgcGF0dGVybnMgaW4gUTMuMSAoQSxCLEMsb3IsRCkgZG9lcyB0aGlzIG1hdGNoIG1vc3QgY2xvc2VseT8KCmBgYHtyfQojIyAgIlJlcGxhY2UgdGhlICdOQScgd2l0aCB5b3VyIGFuc3dlciAoZS5nLiwgJ0EnIGluIHF1b3RlcykiCmFuc3dlcjMuMiA9ICdEJwpxdWl6LmNoZWNrKGFuc3dlcjMuMikKYGBgCgoKUTMuMyBJcyB0aGUgcGF0dGVybiBzZWVuIGZyb20gMTc1MSB0byAxODAwIGNvbnNpc3RlbnQgd2l0aCBNYWx0aHVzaWFuIHRoZW9yeT8KCkEuIFllcwoKQi4gTm8KCmBgYHtyfQojIyAgIlJlcGxhY2UgdGhlICdOQScgd2l0aCB5b3VyIGFuc3dlciAoZS5nLiwgJ0EnIGluIHF1b3RlcykiCmFuc3dlcjMuMyA9ICdBJwpxdWl6LmNoZWNrKGFuc3dlcjMuMykKYGBgCgpXZSBzZWUgdGhhdCBiaXJ0aCByYXRlcyBhcmUgbG93IHdoZW4gZGVhdGggcmF0ZXMgYXJlIGhpZ2ggKGUuZy4sCmluIDE3NzIgYW5kIDE3NzMpLiBFdmVuIGlmIHdlIGlnbm9yZSB0aGVzZSB1bnVzdWFsIHllYXJzLAp0aGVyZSBpcyBhIGdlbmVyYWxseSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAuIE5vdyBwbG90IHRoZSByZWxhdGlvbnNoaXAKZm9yIHRoZSBmb2xsb3dpbmcgdGltZSBwZXJpb2RzLgoKMTgwMS0xODUwCmBgYHtyfQojIyBNb2RpZnkgdGhlIGNvZGUgd2UgdXNlZCBmb3IgMTc1MSB0byAxMDAgYXBwcm9wcmlhdGVseS4KbWFsdGh1cy5wbG90LmZ1bihmcm9tLnllYXIgPSAxODAxLCB0by55ZWFyID0gMTg1MCkKYGBgCjE4NTEtMTkwMApgYGB7cn0KIyMgTW9kaWZ5IHRoZSBjb2RlIHdlIHVzZWQgZm9yIDE3NTEgdG8gMTAwIGFwcHJvcHJpYXRlbHkuCm1hbHRodXMucGxvdC5mdW4oZnJvbS55ZWFyID0gMTg1MSwgdG8ueWVhciA9IDE5MDApCmBgYAoxOTAxLTIwMTQKYGBge3J9CiMjIE1vZGlmeSB0aGUgY29kZSB3ZSB1c2VkIGZvciAxNzUxIHRvIDEwMCBhcHByb3ByaWF0ZWx5LgptYWx0aHVzLnBsb3QuZnVuKGZyb20ueWVhciA9IDE5MDEsIHRvLnllYXIgPSAyMDE0KQpgYGAKCiMgUGFydCA0OiBMYWIgd3JpdGUgdXAuIFBsZWFzZSBsaW1pdCBlYWNoIGFuc3dlciB0byA1MCB3b3JkcyBvciBsZXNzLgoKPiAxLiBUdXJuIGluIHlvdXIgcGxvdCBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYmlydGggYW5kIGRlYXRoIHJhdGVzIGZyb20gMTgwMS0xODUwLiAgKE5vdGU6IHRvIHNhdmUgYSBncmFwaCBmcm9tIHlvdXIgUlN0dWRpbyBub3RlYm9vaywgcmlnaHQgY2xpY2sgb24gaXQgd2l0aCB5b3VyIG1vdXNlIGFuZCAiU2F2ZSBpbWFnZSBhcyAuLi4iKQoKPiBDb21wbGV0ZWx5IG9wdGlvbmFsOiBmb3IgdGhvc2UgZmFtaWxpYXIgd2l0aCBSLCB5b3UgY2FuIGFkZCB5b3VyIG5hbWUgdG8gdGhlIHBsb3QgdXNpbmcgdGhlIHRleHQoKSBmdW5jdGlvbiBpbiBSLiBUcnkgYWRkaW5nIGl0IGluIHRoZSBsb3dlciByaWdodCBvZiB0aGUgcGxvdC4KCj4gMi4gSW4gd2hpY2ggb2YgdGhlIHBlcmlvZHMgeW91IGV4cGxvcmVkIGFib3ZlIGRvZXMgdGhlIE1hbHRodXNpYW4gcmVsYXRpb25zaGlwIGZpcnN0IGJyZWFrIGRvd24/IFdoYXQgaXMgeW91ciBiYXNpcyBmb3IganVkZ2luZz8gV2hhdCBoYXBwZW5zIHRvIHRoZSBfdGltZSB0cmVuZF8gaW4gYmlydGggYW5kIGRlYXRoIHJhdGVzIHRoYXQgbWFrZXMgdGhlIE1hbHRodXNpYW4gcmVsYXRpb25zaGlwIGdvIGF3YXk/CgpNYWx0aHVzaWFu4oCZcyB0aGVvcnkgZmlyc3QgYnJlYWtzIGRvd24gaW4gMTg1MS0xOTAwIGJlY2F1c2UgdGhhdCBpcyB0aGUgZmlyc3QgdGltZSB0aGUgY29ycmVsYXRpb24gaXMgcG9zaXRpdmUgIAoKPiAzLiBXaGF0IGRvZXMgTWFsdGh1cyBzYXkgaXMgdGhlIG1haW4gZGV0ZXJtaW5hbnQgb2YgYmlydGggcmF0ZXMgaW4gKk5vcndheSo/IChIaW50OiBzZWUgSUkuSS4zIGFuZCBzdWJzZXF1ZW50IHBhcmFncmFwaHMgaW4gdGhlIHJlYWRpbmcpLiBXb3VsZCB0aGlzIHN1Z2dlc3QgdGhhdCBiaXJ0aHMgd291bGQgZmFsbCBpbiB0aGUgKnNhbWUqIHllYXIgYXMgZGVhdGhzIHdvdWxkIHJpc2UsIG9yIGEgeWVhciBvciB0d28gYWZ0ZXI/CgpNYWx0aHVzIHNheXMgdGhlIG1haW4gZGV0ZXJtaW5hbnQgb2YgYmlydGggcmF0ZXMgaW4gTm9yd2F5IGFyZSB0aGUgbWFycmlhZ2UgY2hlY2tzLCBiZWNhdXNlIG1hcnJpYWdlcyBhcmUgc28gbG93IGR1ZSB0byB0aGUgYXBwcm92YWwgbmVlZGVkIGJ5IHBlYXNhbnRzIGZyb20gdGhlIG9mZmljZXIgYW5kIG1pbmlzdGVyIG9mIHN1ZmZpY2llbnQgZnVuZHMsIHRoZSBiaXJ0aCByYXRlIGlzIGFsc28gbG93LiBGb2xsb3dpbmcgdGhpcyBjb2RlLCB0aGlzIHdvdWxkIHN1Z2dlc3QgYmlydGggcmF0ZXMgd291bGQgZmFsbCBhIHllYXIgb3IgdHdvIGFmdGVyIGluIG9yZGVyIGZvciB0aGUgZWZmZWN0cyBvZiB0aGUgbWFycmlhZ2UgY29kZXMgdG8ga2ljayBpbi4KCj4gUXVlc3Rpb25zIDQgYW5kIDU6IElyZWxhbmQgYW5kIHRoZSBQb3RhdG8KCj4gUG90YXRvZXMgYXJlIHJlbGF0aXZlbHkgZWFzeSB0byBncm93IGFuZCBjYW4gYmUgc3RvcmVkIHllYXItcm91bmQgdG8gcHJvdmlkZSBhIG51dHJpdGlvdXMgc291cmNlIG9mIGZvb2QgZXZlbiBpbiB3aW50ZXJ0aW1lLiBJbiB0aGUgbGF0ZSAxOHRoIGNlbnR1cnksIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIHBvdGF0byBhcyBhIHN0YXBsZSBjcm9wIGNoYW5nZWQgdGhlIGFncmljdWx0dXJhbCBlY29ub215IG9mIElyZWxhbmQgYnkgaW5jcmVhc2luZyB0aGUgYW1vdW50IG9mIGZvb2QgdGhhdCBmYXJtZXJzIGNvdWxkIHByb2R1Y2UgYW5kIHN0b3JlLiBJbiBNYWx0aHVzaWFuIHRlcm1zLCB0aGlzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhbiBpbmNyZWFzZSBpbiB0aGUgd2FnZSBhdCBldmVyeSBwb3B1bGF0aW9uIHNpemUg4oCTIGEgc2hpZnQgaW4gdGhlIHdhZ2UgY3VydmUuIChJZiBpdOKAmXMgaGVscGZ1bCwgdGhpbmsgb2Yg4oCcd2FnZeKAnSBhcyBjYWxvcmllcyDigJMgYXQgYSBnaXZlbiBwb3B1bGF0aW9uIHNpemUsIHRoZSBsYW5kIGNhbiBub3cgcHJvdmlkZSBtb3JlIGNhbG9yaWVzIHBlciBwZXJzb24uKQoKPiBJbiB0aGUgTWFsdGh1cyBhcHAgZm91bmQgYXQgaHR0cDovL3NoaW55LmRlbW9nLmJlcmtlbGV5LmVkdS9qb3NoL25ld19tYWx0aHVzLywgd2UgY2FuIHNpbXVsYXRlIHRoaXMgYnkgbW92aW5nIHRoZSB3YWdlIGxldmVsIGZyb20gaXRzIGRlZmF1bHQgb2YgMSB0byBhIGhpZ2hlciBsZXZlbCwgc3VjaCBhcyAxLjE4LiBEbyB0aGlzLCBhbmQgdGhlbiBjbGljayDigJxwbGF54oCdIChzbWFsbCBibHVlIHRyaWFuZ2xlIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLiBOb3RlIHRoYXQgaW4gdGhlIGFwcCwgdGhlIOKAnHNob3J0IHRlcm3igJ0gY29uc2VxdWVuY2VzIG9mIGEgc2hpZnQgYmVnaW4gYXQgdGhlIHZlcnRpY2FsIGRvdHRlZCBsaW5lIGF0IHRpbWUgemVyby4gVXNlIHRoZSBzaW11bGF0aW9uIHRvIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczoKCj4gNC4gRGVzY3JpYmUgaW4gd29yZHMgd2hhdCBoYXBwZW5zIGluIHRoZSAqc2hvcnQgdGVybSogYXMgYSByZXN1bHQgb2YgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgcG90YXRvLiBXaGF0IGhhcHBlbnMgdG8gd2FnZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHBvdGF0byBpcyBpbnRyb2R1Y2VkPyBXaGF0IGhhcHBlbnMgdG8gYmlydGggYW5kIGRlYXRoIHJhdGVzPyAoRGVzY3JpYmUgdGhlIGRpcmVjdGlvbiBvZiBjaGFuZ2Ug4oCTIHlvdSBkb27igJl0IGhhdmUgdG8gZ2l2ZSBwcmVjaXNlIG51bWJlcnMuKQoKSW4gdGhlIHNob3J0IHJ1biwgYWZ0ZXIgdGhlIHBvdGF0byBpcyBpbnRyb2R1Y2VkIHRoZSB3YWdlcyBhbmQgdGhlcmVmb3JlIHN0YW5kYXJkIG9mIGxpdmluZyB3aWxsIGluY3JlYXNlIGFzIGZhcm1lcnMgYXJlIGFibGUgdG8gcHJvZHVjZSBhbmQgc2VsbCBwb3RhdG9lcyBidXQgYXMgdGltZSBnb2VzIG9uLCBkdWUgdG8gaW5jcmVhc2VkIHdhZ2VzIHRoZSBiaXJ0aCByYXRlcyB3aWxsIGdvIHVwLCBhbmQgZGVhdGggcmF0ZXMgd2lsbCBnbyBkb3duLCB0aGVyZWZvcmUgcG9wdWxhdGlvbiBpbiBsb25nIHJ1biB3aWxsIGluY3JlYXNlLiAKCj4gNS4gQWNjb3JkaW5nIHRvIE1hbHRodXMsIGluIHRoZSBsb25nIHRlcm0sIHNob3VsZCB0aGUgcG9wdWxhdGlvbiBvZiBJcmVsYW5kIHJldHVybiB0byBpdHMgaW5pdGlhbCBzaXplPyBXaHkgb3Igd2h5IG5vdD8KCkluIHRoZSBsb25nIHJ1biB0aGUgcG9wdWxhdGlvbiB3aWxsIG5vdyBiZSBsYXJnZXIgZHVlIHRvIHRoaXMgdGVjaG5vbG9naWNhbCBhZHZhbmNlbWVudC4gVGhlIHRlY2hub2xvZ3kgbGVhZHMgdG8gYSB0ZW1wb3JhcnkgaW5jcmVhc2UgaW4gc3RhbmRhcmQgb2YgbGl2aW5nIGFuZCBiZWNhdXNlIHdhZ2VzIGluY3JlYXNlIHNvIGRvZXMgcG9wdWxhdGlvbiBhbmQgYmVjb21lcyB0aGUgbmV3IGVxdWlsaWJyaXVtLCB3YWdlcyBpbiB0aGUgbG9uZyBydW4gZ28gYmFjayB0byBlcXVpbGlicml1bS4gCgo+IFF1ZXN0aW9ucyA2IHRvIDg6IHBlbi1hbmQtcGFwZXIgcXVlc3Rpb25zCgkKPiA2LiBPbiBhIHNlcGFyYXRlIHNoZWV0IG9mIHBhcGVyLCBkcmF3IHlvdXIgb3duIE1hbHRodXNpYW4gZ3JhcGggc3lzdGVtLiAoV2UgcmVjb21tZW5kIGRyYXdpbmcgYnkgaGFuZCwgYXMgeW91IG1heSBiZSBhc2tlZCB0byBkcmF3IHRoaXMga2luZCBvZiBncmFwaCBvbiB0aGUgZXhhbXMgd2l0aG91dCB0aGUgYWlkIG9mIGEgY29tcHV0ZXIuKSBUaGUgdG9wIGdyYXBoIHNob3VsZCBzaG93IGJpcnRoIGFuZCBkZWF0aCByYXRlcyBhcyBhIGZ1bmN0aW9uIG9mIHdhZ2VzOyB0aGUgYm90dG9tIGdyYXBoIHNob3VsZCBzaG93IHBvcHVsYXRpb24gc2l6ZSBhcyBhIGZ1bmN0aW9uIG9mIHdhZ2VzLiBMYWJlbCBhbGwgb2YgdGhlIGF4ZXMgYW5kIG1hcmsgdGhlIGVxdWlsaWJyaXVtIHN0YXRlIG9uIGJvdGggZ3JhcGhzIGJ5IG1hcmtpbmcgYiosIGQqLCB3KiwgYW5kIE4qIChlcXVpbGlicml1bSBiaXJ0aCByYXRlLCBkZWF0aCByYXRlLCB3YWdlIHJhdGUsIGFuZCBwb3B1bGF0aW9uIHNpemUpIG9uIHRoZSBhcHByb3ByaWF0ZSBheGVzLgoKPiA3LiBJbWFnaW5lIHRoYXQgbWFycmlhZ2Ugbm9ybXMgY2hhbmdlIGFuZCBwZW9wbGUgc3RhcnQgZ2V0dGluZyBtYXJyaWVkIGF0IGxhdGVyIGFnZXMuIFRoaXMgcmVzdWx0cyBpbiBhIGxvd2VyIGJpcnRoIHJhdGUgYXQgZXZlcnkgd2FnZSBsZXZlbC4gU2hvdyB0aGlzIGNoYW5nZSBvbiB5b3VyIGdyYXBoIGJ5IGRyYXdpbmcgYSBzZWNvbmQsIGRvdHRlZCwgYmlydGggcmF0ZSBsaW5lLiBNYXJrIHRoZSBuZXcgZXF1aWxpYnJpYSBhcyBi4oCZLCBk4oCZLCB34oCZLCBhbmQgUOKAmS4gRGVzY3JpYmUgaW4gd29yZHMgd2hhdCBoYXBwZW5lZCB0byB0aGUgZXF1aWxpYnJpdW0gd2FnZSBsZXZlbCBhbmQgcG9wdWxhdGlvbiBzaXplOgoJCj4gOC4gSW1hZ2luZSB0aGF0IGEgbmV3IGdyb3VwIG9mIGltbWlncmFudHMgYXJyaXZlcy4gVGhlaXIgdGVjaG5vbG9naWVzIGFuZCBzb2NpYWwgYmVoYXZpb3JzIGFyZSBpZGVudGljYWwgdG8gdGhlIG5hdGl2ZXMuIERlc2NyaWJlIGluIHdvcmRzIHdoYXQgYWZmZWN0IHRoaXMgd291bGQgaGF2ZS4gV291bGQgaXQgY2F1c2UgYSBjdXJ2ZSB0byBzaGlmdCwgb3IgYSB0ZW1wb3JhcnkgbW92ZSBhbG9uZyBvbmUgb2YgdGhlIGN1cnZlcz8gV2hpY2ggY3VydmUsIGFuZCBpbiB3aGljaCBkaXJlY3Rpb24gd291bGQgdGhlIHNoaWZ0IG9yIG1vdmUgYmU/Cgo+IDkuIFtub24tZ3JhZGVkXSBBYm91dCBob3cgbWFueSBob3VycyBkaWQgaXQgdGFrZSB5b3UgdG8gY29tcGxldGUgdGhpcyBsYWI/Cgo5MCBtaW51dGVzCgpDb25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIGNvbXBsZXRlZCBMYWIgMi4KCgoKCgo=