Author: Nathan Stewart 811847789
1. Initiate the Project
1.1. Set Working Directory
set_wd <- function() {
library(rstudioapi)
current_path <- getActiveDocumentContext()$path
setwd(dirname(current_path ))
print( getwd() )
}
set_wd()
[1] "C:/Users/natha/OneDrive/Documents/KSU stuff/KSU 2020/Evolution"
1.2. Load required packages
#This command loads required packages
library(ggplot2)
2. The Cave Molly and its Ancestors
To wrap our head around some of the basic observations that led Darwin to infer natural selection, we will spend a little bit of time with the cave molly. The cave molly (Poecilia mexicana) is a small species of livebearing fish that occurs in a couple of small caves in Southern Mexico. One of the caves, the Cueva Luna Azufre, has a wetted area of only 39 square meters. Even though the available habitat is really small, there has been an isolated population of cave mollies in this cave for several thousand years. Interestingly, mollies also occur in adjacent surface habitats. On the picture below you can see the a male and a female of the surface (top two pictures) and the cave form (bottom two pictures) side by side.

3. The Struggle for Existence
The first set of observations that led Darwin to infer the process of natural selection related to the imbalance of organisms’ reproductive power and limitations of resource availability. Quantifying the effective reproductive output and resource availability in nature can be incredibly difficult. However, what we can do is to measure proxies for these traits and then use simple mathematical models to test whether our predictions and inferences are valid. Here, we use exponential and logistic population growth models that you have learned about in ecology to explore whether there is really a struggle for existence in cave mollies.
3.1. Observation 1: Populations Have a Huge Reproductive Potential
Even large animals with long generation times have an incredible reproductive potential. Cave mollies–as many other cave organisms–have a comparatively low fecundity, and females only give birth to one or two fully developed young at a time. Life history analyses based on female longevity and fecundity have revealed that the average female gives birth to about 3 offspring over her life; not exactly what I would call huge reproductive potential, right? But in reality, it is not the reproductive potential of individuals that counts, but the reproductive potential of populations. To illustrate, we want you to model population growth for a hypothetical population of cave mollies. Specifically, use the code below to simulate and graph the population growth of an initial cave molly population of 2 individuals (the initial colonizers of the cave).
How many generations would it take for the population to grow to a million? Under what circumstances you might see population growth like this? Do you think Darwin’s observation that “species have great potential fertility” holds true for cave mollies?
#Choose an initial population size
N0 = 2
#Choose the average number of offspring
b = 3
#Choose a range of generations you want to estimate population size for
t = 0:15
#Calculate the population size for each generation
N = N0*b^t
#Merge the results of the simulation into a single table
final.results <- as.data.frame(cbind(t,N))
#You can view the results by just calling the data frame
final.results
#Plot the results, make sure you properly label the axes (see: http://www.sthda.com/english/wiki/ggplot2-scatter-plots-quick-start-guide-r-software-and-data-visualization))
ggplot(final.results, aes(x=t, y=N)) +
geom_point() +
xlab("Generation") +
ylab("Populaiton Size") +
theme_classic()

It would be approximately the 12th generation when the population would grow to 1 million individuals. The population would only grow to this extent with adequate living area and abundant nutrients. I think Darwin’s observation does hold true for cave mollies, as the mollie population definitely explodes past the 5th generation in the model.
3.2. Observation 2: Natural Resources are Limited
As you remember from introductory biology, exponential growth only occurs in very specific circumstances. In a cave that is only the fraction of the size of a football field, you would obviously never find a cave molly population of a million. The logistic model more accurately describes population growth in nature. Based on our past analyses, we estimate lambda (the population growth coefficient) to be around 1.3 and the carrying capacity (K) of the cave around 360 individuals.
How long would it take for the population to reach the carrying capacity if there were two initial colonizers? What do you think determines k for the population of cave mollies in the Cueva Luna Azufre?
#Choose an initial population size
N0 = 2
#Choose population growth rate
lambda = 1.3
#Choose a range of generations you want to estimate population size for
t = range(12,13,14,15)
#Choose a carrying capacity
K = 360
#Calculate the population size for each generation
N = (N0*K)/(N0+(K-N0)*exp(-lambda*t))
#Merge the results of the simulation into a single table
final.results <- as.data.frame(cbind(t,N))
#Use the ggplot function to plot the results, make sure you properly label the axes (see: http://www.sthda.com/english/wiki/ggplot2-scatter-plots-quick-start-guide-r-software-and-data-visualization)
ggplot(final.results, aes(x=t, y=N)) +
geom_point() +
xlab("Generation") +
ylab("Population") +
theme_classic()

It would take approximately 15 generations to reach the carrying capacity. I believe that the amount of resources available, especially food, limits the population oc mollies in the cave.
3.3. Where Do All the Missing Offspring Go?
Compare the two models (exponential and logistic) that were ran with the same initial parameters. What do the different outcomes mean for individual offspring that are born in any given generation? How might this discrepancy important in the context of evolution?
The exponential model is such that all offspring survive and reproduce, which is unrealistic. The logistic model shows that less offspring survive. This means that there will be less chances for evolution to occur, compared to the exponential where there are lots of chances for a mutation to occur.
4. Individuals Vary in Their Traits
Another of Darwin’s key observation was just how variable individuals of the same species are. Let’s explore some of that variation in cave mollies. To do that, we first need to load some data into R. These data were collected as part of my dissertation and include the following variables: habitat (cave or surface), sex (male or female), standard length (in mm, from the snout to the caudal fin base), eye diameter (in mm), head length (in mm), head width (in mm), predorsal length (in mm, from the snout to the insertion of the dorsal fin), and gape with (in mm, from one corner of the mouth to the other).
#Use the read.csv function to import a dataset
morph.data <- read.csv("morphological_variation.csv")
morph.data
4.1. Comparing Body Size Variation Within and Between Populations
A simple way to compare variation within and between populations is to plot a frequency histogram (which represents the raw data counts) along with a density plot (which represents the approximated statistical distribution). You can generate a histogram with the command “geom_histogram” and designate any trait you may want as the x axis. You can calculate the density with the “aes(y=..density..)” function within the “geom_histogram” command and then plot it with “geom_density”. Note that when you have more than two groups (in our case we have samples from a cave and a surface population), you can visualize them separately by designating a different color for each group in the aesthetics (“fill=Habitat”).
When you visualize body size variation in this manner what do you observe? Is there more variation within or between populations?
#Use the ggplot function to graph the histogram (see: http://www.sthda.com/english/wiki/ggplot2-histogram-plot-quick-start-guide-r-software-and-data-visualization)
ggplot(morph.data, aes(x=Standard.length, fill=ï..Habitat)) +
geom_histogram(aes(y=..density..), position="dodge") +
geom_density(alpha=0.5)+
xlab("Standard Length") +
ylab("Density") +
theme_classic()

The graph appears to show that there are similar size variation betwee nthe cave and surface populations. There is more size variation inside the population.
4.2. Comparing Predorsal Length Variation Within and Between Populations
Let’s also compare a second trait, predorsal length. With the previous graph you hopefully saw how variable overall body size is within populations. If we want to compare other traits, we have to account for that. We want to know whether variation in predorsal length is due to variation in size (small fish have small predorsal lengths) or whether other patterns might be at play. To do so, we can calculate relative predorsal length as the ratio between predorsal length and standard length.
When you plot relative predorsal length, what do you observe? How does variation in predorsal length vary within and between populations, and how does it compare to variation in standard length?
#Calculate relative predorsal length by dividing predorsal length by standard length
#We can use the $ sign to call specific columns within a data frame
#We can also add a new column to the morph.data table using the $ sign
morph.data$relative.predorsal.length <- morph.data$Predorsal.length/morph.data$Standard.length
##Use the ggplot function to graph the histogram and color data based on habitat
ggplot(morph.data, aes(x=relative.predorsal.length, fill=ï..Habitat)) +
geom_histogram(aes(y=..density..), position="dodge") +
geom_density(alpha=0.5)+
xlab("Relative Predorsal Length") +
ylab("Density") +
theme_classic()

It appears that the relative predorsal length is similar between the populations. It appears that as population density is low, there is more variation, and it becomes more uniform as the density increases. This is similar to the standard length.
4.3. Comparing Eye Size Variation Within and Between Populations
Using the same approach as for predorsal variation, compare variation in relative eye diameter.
What do you observe? How does variation in eye diameter vary within and between populations, and how does it compare to variation in the other traits?
#Your code goes here
#Calculate relative predorsal length by dividing predorsal length by standard length
morph.data$relative.eye.size <- morph.data$Eye.diameter/morph.data$Standard.length
##Use the ggplot function to graph the histogram and color data based on habitat
ggplot(morph.data, aes(x=relative.eye.size, fill=ï..Habitat)) +
geom_histogram(aes(y=..density..), position="dodge") +
geom_density(alpha=0.5)+
xlab("Relative Eye Diameter") +
ylab("Density") +
theme_classic()

The eye size shows the most variability between populations, where the average sizes are smaller in the cave population, and larger on the surface. This is to be expected due to the lack of light in the cave. Eyesight is not as important when there isn’t enough light to see with, so it would make sense that the size of the other traits remain similar, while eyesight is much different.
5. Variation in Traits is Heritable
An avid breeder of fancy pigeons, Darwin observed that specific traits are passed from parents to offspring, even though he had no clue how this might actually work (genetics was not a thing yet). Even without an ability to conduct molecular genetic analyses, we can estimate heritability of traits by comparing the traits of offspring to the traits of the parents.
Let’s load some data that compares parent and offspring traits in cave mollies. To do this, we brought cave mollies into the lab and bred them under standardized conditions. Data represent the average trait values of the mother and father and of all offspring from a specific brood. The easiest way to compare parent and offspring traits is through a scatter plot, which we already used in Exercise 1. If a trait is heritable, we would expect to see a correlation between parent and offspring traits (e.g., parents with small eyes should have offspring with small eyes).
The following dataset includes measurements of parental and offspring standard length as well as eye size.
#Use the read.csv function to import a dataset
heritability <- read.csv("heritability.csv")
heritability
5.1. Heritability of Standard Length
First, let us explore whether there is evidence for heritability in standard length.
What do you observe? Is standard length a heritable trait?
#Plot the results, make sure you properly label the axes (see: http://www.sthda.com/english/wiki/ggplot2-scatter-plots-quick-start-guide-r-software-and-data-visualization)
ggplot(heritability, aes(x=ï..parent.standard.length, y=offspring.standard.length)) +
geom_point() +
geom_smooth(method = "lm") +
xlab("Parent Standard Length") +
ylab("Offspring Standard Length") +
theme_classic()

It doesn’t look like there is any rhyme or reason to the points in the graph, therefor, it appears that standard length is not heritable
5.2. Heritability of Eye Size
Now let us explore whether there is any heritability in eye size. Remember, there is substantial variation in body size, and in such cases, we want to control for body size by calculating relative eye size first.
What do you observe? Is standard length a heritable trait?
#Calculate relative eye sizes
morph.data$heritability$relative.parent.eye.size <- morph.data$parent.eye.size/morph.data$ï..parent.standard.length
morph.data$heritability$relative.offspring.eye.size <- morph.data$offspring.eye.size/morph.data$offspring.standard.length
Error in `$<-.data.frame`(`*tmp*`, heritability, value = list(relative.parent.eye.size = numeric(0), :
replacement has 498 rows, data has 497
I believe that here is heritability based off of what I assume to be data points that follow the trend line.
6. What Would Happen If…?
Imagine for a moment that smaller fish have a higher likelihood of survival in the cave. Would you expect evolution of body size upon cave colonization?
Imagine for a moment that fish with smaller eyes have a higher likelihood of survival in the cave. Would you expect evolution of body size upon cave colonization?
Justify your response.
I imagine that body size would decrease. I think this because if a smaller body means higher survival, the smaller the body on the fish, the more likely it is to reproduce, thus driving the average body size down. If smaller eye size meant a higher chance of survival I would imagine body size wouldn’t change that much, as eye size is not necessarily directly tied to body length
7. Resources
7.2 Resources You Consulted
Consulting additional resources to solve this assignment is absolutely allowed, but failure to disclose those resources is plagiarism. Please list any collaborators you worked with and resources you used below or state that you have not used any.
Your answer goes here.
LS0tDQp0aXRsZTogIkludHJvZHVjdGlvbiB0byBSIE5vdGVib29rIGFuZCBEYXJ3aW4ncyBMb2dpYyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICczJw0KICBodG1sX2RvY3VtZW50Og0KICAgIGtlZXBfbWQ6IFRSVUUNCi0tLQ0KDQojIyBBdXRob3I6IE5hdGhhbiBTdGV3YXJ0IDgxMTg0Nzc4OQ0KDQojIDEuIEluaXRpYXRlIHRoZSBQcm9qZWN0DQojIyAxLjEuIFNldCBXb3JraW5nIERpcmVjdG9yeQ0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCnNldF93ZCA8LSBmdW5jdGlvbigpIHsNCiAgbGlicmFyeShyc3R1ZGlvYXBpKQ0KICBjdXJyZW50X3BhdGggPC0gZ2V0QWN0aXZlRG9jdW1lbnRDb250ZXh0KCkkcGF0aCANCiAgc2V0d2QoZGlybmFtZShjdXJyZW50X3BhdGggKSkNCiAgcHJpbnQoIGdldHdkKCkgKQ0KfQ0Kc2V0X3dkKCkNCmBgYA0KDQojIyAxLjIuIExvYWQgcmVxdWlyZWQgcGFja2FnZXMNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQojVGhpcyBjb21tYW5kIGxvYWRzIHJlcXVpcmVkIHBhY2thZ2VzDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KDQojIDIuIFRoZSBDYXZlIE1vbGx5IGFuZCBpdHMgQW5jZXN0b3JzDQpUbyB3cmFwIG91ciBoZWFkIGFyb3VuZCBzb21lIG9mIHRoZSBiYXNpYyBvYnNlcnZhdGlvbnMgdGhhdCBsZWQgRGFyd2luIHRvIGluZmVyIG5hdHVyYWwgc2VsZWN0aW9uLCB3ZSB3aWxsIHNwZW5kIGEgbGl0dGxlIGJpdCBvZiB0aW1lIHdpdGggdGhlIGNhdmUgbW9sbHkuIFRoZSBjYXZlIG1vbGx5ICgqUG9lY2lsaWEgbWV4aWNhbmEqKSBpcyBhIHNtYWxsIHNwZWNpZXMgb2YgbGl2ZWJlYXJpbmcgZmlzaCB0aGF0IG9jY3VycyBpbiBhIGNvdXBsZSBvZiBzbWFsbCBjYXZlcyBpbiBTb3V0aGVybiBNZXhpY28uIE9uZSBvZiB0aGUgY2F2ZXMsIHRoZSBDdWV2YSBMdW5hIEF6dWZyZSwgaGFzIGEgd2V0dGVkIGFyZWEgb2Ygb25seSAzOSBzcXVhcmUgbWV0ZXJzLiBFdmVuIHRob3VnaCB0aGUgYXZhaWxhYmxlIGhhYml0YXQgaXMgcmVhbGx5IHNtYWxsLCB0aGVyZSBoYXMgYmVlbiBhbiBpc29sYXRlZCBwb3B1bGF0aW9uIG9mIGNhdmUgbW9sbGllcyBpbiB0aGlzIGNhdmUgZm9yIHNldmVyYWwgdGhvdXNhbmQgeWVhcnMuIEludGVyZXN0aW5nbHksIG1vbGxpZXMgYWxzbyBvY2N1ciBpbiBhZGphY2VudCBzdXJmYWNlIGhhYml0YXRzLiBPbiB0aGUgcGljdHVyZSBiZWxvdyB5b3UgY2FuIHNlZSB0aGUgYSBtYWxlIGFuZCBhIGZlbWFsZSBvZiB0aGUgc3VyZmFjZSAodG9wIHR3byBwaWN0dXJlcykgYW5kIHRoZSBjYXZlIGZvcm0gKGJvdHRvbSB0d28gcGljdHVyZXMpIHNpZGUgYnkgc2lkZS4gDQoNCiFbXShtb2xsaWVzLnBuZykNCg0KIyAzLiBUaGUgU3RydWdnbGUgZm9yIEV4aXN0ZW5jZQ0KVGhlIGZpcnN0IHNldCBvZiBvYnNlcnZhdGlvbnMgdGhhdCBsZWQgRGFyd2luIHRvIGluZmVyIHRoZSBwcm9jZXNzIG9mIG5hdHVyYWwgc2VsZWN0aW9uIHJlbGF0ZWQgdG8gdGhlIGltYmFsYW5jZSBvZiBvcmdhbmlzbXMnIHJlcHJvZHVjdGl2ZSBwb3dlciBhbmQgbGltaXRhdGlvbnMgb2YgcmVzb3VyY2UgYXZhaWxhYmlsaXR5LiBRdWFudGlmeWluZyB0aGUgZWZmZWN0aXZlIHJlcHJvZHVjdGl2ZSBvdXRwdXQgYW5kIHJlc291cmNlIGF2YWlsYWJpbGl0eSBpbiBuYXR1cmUgY2FuIGJlIGluY3JlZGlibHkgZGlmZmljdWx0LiBIb3dldmVyLCB3aGF0IHdlIGNhbiBkbyBpcyB0byBtZWFzdXJlIHByb3hpZXMgZm9yIHRoZXNlIHRyYWl0cyBhbmQgdGhlbiB1c2Ugc2ltcGxlIG1hdGhlbWF0aWNhbCBtb2RlbHMgdG8gdGVzdCB3aGV0aGVyIG91ciBwcmVkaWN0aW9ucyBhbmQgaW5mZXJlbmNlcyBhcmUgdmFsaWQuIEhlcmUsIHdlIHVzZSBleHBvbmVudGlhbCBhbmQgbG9naXN0aWMgcG9wdWxhdGlvbiBncm93dGggbW9kZWxzIHRoYXQgeW91IGhhdmUgbGVhcm5lZCBhYm91dCBpbiBlY29sb2d5IHRvIGV4cGxvcmUgd2hldGhlciB0aGVyZSBpcyByZWFsbHkgYSBzdHJ1Z2dsZSBmb3IgZXhpc3RlbmNlIGluIGNhdmUgbW9sbGllcy4NCg0KIyMgMy4xLiBPYnNlcnZhdGlvbiAxOiBQb3B1bGF0aW9ucyBIYXZlIGEgSHVnZSBSZXByb2R1Y3RpdmUgUG90ZW50aWFsDQpFdmVuIGxhcmdlIGFuaW1hbHMgd2l0aCBsb25nIGdlbmVyYXRpb24gdGltZXMgaGF2ZSBhbiBpbmNyZWRpYmxlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwuIENhdmUgbW9sbGllcy0tYXMgbWFueSBvdGhlciBjYXZlIG9yZ2FuaXNtcy0taGF2ZSBhIGNvbXBhcmF0aXZlbHkgbG93IGZlY3VuZGl0eSwgYW5kIGZlbWFsZXMgb25seSBnaXZlIGJpcnRoIHRvIG9uZSBvciB0d28gZnVsbHkgZGV2ZWxvcGVkIHlvdW5nIGF0IGEgdGltZS4gTGlmZSBoaXN0b3J5IGFuYWx5c2VzIGJhc2VkIG9uIGZlbWFsZSBsb25nZXZpdHkgYW5kIGZlY3VuZGl0eSBoYXZlIHJldmVhbGVkIHRoYXQgdGhlIGF2ZXJhZ2UgZmVtYWxlIGdpdmVzIGJpcnRoIHRvIGFib3V0IDMgb2Zmc3ByaW5nIG92ZXIgaGVyIGxpZmU7IG5vdCBleGFjdGx5IHdoYXQgSSB3b3VsZCBjYWxsIGh1Z2UgcmVwcm9kdWN0aXZlIHBvdGVudGlhbCwgcmlnaHQ/IEJ1dCBpbiByZWFsaXR5LCBpdCBpcyBub3QgdGhlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwgb2YgaW5kaXZpZHVhbHMgdGhhdCBjb3VudHMsIGJ1dCB0aGUgcmVwcm9kdWN0aXZlIHBvdGVudGlhbCBvZiBwb3B1bGF0aW9ucy4gVG8gaWxsdXN0cmF0ZSwgd2Ugd2FudCB5b3UgdG8gbW9kZWwgcG9wdWxhdGlvbiBncm93dGggZm9yIGEgaHlwb3RoZXRpY2FsIHBvcHVsYXRpb24gb2YgY2F2ZSBtb2xsaWVzLiBTcGVjaWZpY2FsbHksIHVzZSB0aGUgY29kZSBiZWxvdyB0byBzaW11bGF0ZSBhbmQgZ3JhcGggdGhlIHBvcHVsYXRpb24gZ3Jvd3RoIG9mIGFuIGluaXRpYWwgY2F2ZSBtb2xseSBwb3B1bGF0aW9uIG9mIDIgaW5kaXZpZHVhbHMgKHRoZSBpbml0aWFsIGNvbG9uaXplcnMgb2YgdGhlIGNhdmUpLiANCg0KSG93IG1hbnkgZ2VuZXJhdGlvbnMgd291bGQgaXQgdGFrZSBmb3IgdGhlIHBvcHVsYXRpb24gdG8gZ3JvdyB0byBhIG1pbGxpb24/IFVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB5b3UgbWlnaHQgc2VlIHBvcHVsYXRpb24gZ3Jvd3RoIGxpa2UgdGhpcz8gRG8geW91IHRoaW5rIERhcndpbidzIG9ic2VydmF0aW9uIHRoYXQgInNwZWNpZXMgaGF2ZSBncmVhdCBwb3RlbnRpYWwgZmVydGlsaXR5IiBob2xkcyB0cnVlIGZvciBjYXZlIG1vbGxpZXM/DQoNCmBgYHtyfQ0KI0Nob29zZSBhbiBpbml0aWFsIHBvcHVsYXRpb24gc2l6ZQ0KTjAgPSAyDQoNCiNDaG9vc2UgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG9mZnNwcmluZw0KYiA9IDMNCg0KI0Nob29zZSBhIHJhbmdlIG9mIGdlbmVyYXRpb25zIHlvdSB3YW50IHRvIGVzdGltYXRlIHBvcHVsYXRpb24gc2l6ZSBmb3INCnQgPSAwOjE1DQoNCiNDYWxjdWxhdGUgdGhlIHBvcHVsYXRpb24gc2l6ZSBmb3IgZWFjaCBnZW5lcmF0aW9uDQpOID0gTjAqYl50DQoNCiNNZXJnZSB0aGUgcmVzdWx0cyBvZiB0aGUgc2ltdWxhdGlvbiBpbnRvIGEgc2luZ2xlIHRhYmxlDQpmaW5hbC5yZXN1bHRzIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQodCxOKSkNCg0KI1lvdSBjYW4gdmlldyB0aGUgcmVzdWx0cyBieSBqdXN0IGNhbGxpbmcgdGhlIGRhdGEgZnJhbWUNCmZpbmFsLnJlc3VsdHMNCg0KI1Bsb3QgdGhlIHJlc3VsdHMsIG1ha2Ugc3VyZSB5b3UgcHJvcGVybHkgbGFiZWwgdGhlIGF4ZXMgKHNlZTogaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL2dncGxvdDItc2NhdHRlci1wbG90cy1xdWljay1zdGFydC1ndWlkZS1yLXNvZnR3YXJlLWFuZC1kYXRhLXZpc3VhbGl6YXRpb24pKQ0KZ2dwbG90KGZpbmFsLnJlc3VsdHMsIGFlcyh4PXQsIHk9TikpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICB4bGFiKCJHZW5lcmF0aW9uIikgKyANCiAgeWxhYigiUG9wdWxhaXRvbiBTaXplIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCg0KYGBgDQoNCipJdCB3b3VsZCBiZSBhcHByb3hpbWF0ZWx5IHRoZSAxMnRoIGdlbmVyYXRpb24gd2hlbiB0aGUgcG9wdWxhdGlvbiB3b3VsZCBncm93IHRvIDEgbWlsbGlvbiBpbmRpdmlkdWFscy4gVGhlIHBvcHVsYXRpb24gd291bGQgb25seSBncm93IHRvIHRoaXMgZXh0ZW50IHdpdGggYWRlcXVhdGUgbGl2aW5nIGFyZWEgYW5kIGFidW5kYW50IG51dHJpZW50cy4gSSB0aGluayBEYXJ3aW4ncyBvYnNlcnZhdGlvbiBkb2VzIGhvbGQgdHJ1ZSBmb3IgY2F2ZSBtb2xsaWVzLCBhcyB0aGUgbW9sbGllIHBvcHVsYXRpb24gZGVmaW5pdGVseSBleHBsb2RlcyBwYXN0IHRoZSA1dGggZ2VuZXJhdGlvbiBpbiB0aGUgbW9kZWwuKg0KDQojIyAzLjIuIE9ic2VydmF0aW9uIDI6IE5hdHVyYWwgUmVzb3VyY2VzIGFyZSBMaW1pdGVkDQpBcyB5b3UgcmVtZW1iZXIgZnJvbSBpbnRyb2R1Y3RvcnkgYmlvbG9neSwgZXhwb25lbnRpYWwgZ3Jvd3RoIG9ubHkgb2NjdXJzIGluIHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcy4gSW4gYSBjYXZlIHRoYXQgaXMgb25seSB0aGUgZnJhY3Rpb24gb2YgdGhlIHNpemUgb2YgYSBmb290YmFsbCBmaWVsZCwgeW91IHdvdWxkIG9idmlvdXNseSBuZXZlciBmaW5kIGEgY2F2ZSBtb2xseSBwb3B1bGF0aW9uIG9mIGEgbWlsbGlvbi4gVGhlIGxvZ2lzdGljIG1vZGVsIG1vcmUgYWNjdXJhdGVseSBkZXNjcmliZXMgcG9wdWxhdGlvbiBncm93dGggaW4gbmF0dXJlLiBCYXNlZCBvbiBvdXIgcGFzdCBhbmFseXNlcywgd2UgZXN0aW1hdGUgbGFtYmRhICh0aGUgcG9wdWxhdGlvbiBncm93dGggY29lZmZpY2llbnQpIHRvIGJlIGFyb3VuZCAxLjMgYW5kIHRoZSBjYXJyeWluZyBjYXBhY2l0eSAoSykgb2YgdGhlIGNhdmUgYXJvdW5kIDM2MCBpbmRpdmlkdWFscy4gDQoNCkhvdyBsb25nIHdvdWxkIGl0IHRha2UgZm9yIHRoZSBwb3B1bGF0aW9uIHRvIHJlYWNoIHRoZSBjYXJyeWluZyBjYXBhY2l0eSBpZiB0aGVyZSB3ZXJlIHR3byBpbml0aWFsIGNvbG9uaXplcnM/IFdoYXQgZG8geW91IHRoaW5rIGRldGVybWluZXMgayBmb3IgdGhlIHBvcHVsYXRpb24gb2YgY2F2ZSBtb2xsaWVzIGluIHRoZSBDdWV2YSBMdW5hIEF6dWZyZT8NCg0KYGBge3J9DQojQ2hvb3NlIGFuIGluaXRpYWwgcG9wdWxhdGlvbiBzaXplDQpOMCA9IDINCiNDaG9vc2UgcG9wdWxhdGlvbiBncm93dGggcmF0ZQ0KbGFtYmRhID0gMS4zDQojQ2hvb3NlIGEgcmFuZ2Ugb2YgZ2VuZXJhdGlvbnMgeW91IHdhbnQgdG8gZXN0aW1hdGUgcG9wdWxhdGlvbiBzaXplIGZvcg0KdCA9IHJhbmdlKDEyLDEzLDE0LDE1KQ0KI0Nob29zZSBhIGNhcnJ5aW5nIGNhcGFjaXR5DQpLID0gMzYwDQojQ2FsY3VsYXRlIHRoZSBwb3B1bGF0aW9uIHNpemUgZm9yIGVhY2ggZ2VuZXJhdGlvbg0KTiA9IChOMCpLKS8oTjArKEstTjApKmV4cCgtbGFtYmRhKnQpKQ0KI01lcmdlIHRoZSByZXN1bHRzIG9mIHRoZSBzaW11bGF0aW9uIGludG8gYSBzaW5nbGUgdGFibGUNCmZpbmFsLnJlc3VsdHMgPC0gYXMuZGF0YS5mcmFtZShjYmluZCh0LE4pKQ0KI1VzZSB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIHBsb3QgdGhlIHJlc3VsdHMsIG1ha2Ugc3VyZSB5b3UgcHJvcGVybHkgbGFiZWwgdGhlIGF4ZXMgKHNlZTogaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL2dncGxvdDItc2NhdHRlci1wbG90cy1xdWljay1zdGFydC1ndWlkZS1yLXNvZnR3YXJlLWFuZC1kYXRhLXZpc3VhbGl6YXRpb24pDQpnZ3Bsb3QoZmluYWwucmVzdWx0cywgYWVzKHg9dCwgeT1OKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIHhsYWIoIkdlbmVyYXRpb24iKSArIA0KICB5bGFiKCJQb3B1bGF0aW9uIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KDQoqSXQgd291bGQgdGFrZSBhcHByb3hpbWF0ZWx5IDE1IGdlbmVyYXRpb25zIHRvIHJlYWNoIHRoZSBjYXJyeWluZyBjYXBhY2l0eS4gSSBiZWxpZXZlIHRoYXQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgYXZhaWxhYmxlLCBlc3BlY2lhbGx5IGZvb2QsIGxpbWl0cyB0aGUgcG9wdWxhdGlvbiBvYyBtb2xsaWVzIGluIHRoZSBjYXZlLioNCg0KIyMgMy4zLiBXaGVyZSBEbyBBbGwgdGhlIE1pc3NpbmcgT2Zmc3ByaW5nIEdvPw0KQ29tcGFyZSB0aGUgdHdvIG1vZGVscyAoZXhwb25lbnRpYWwgYW5kIGxvZ2lzdGljKSB0aGF0IHdlcmUgcmFuIHdpdGggdGhlIHNhbWUgaW5pdGlhbCBwYXJhbWV0ZXJzLiBXaGF0IGRvIHRoZSBkaWZmZXJlbnQgb3V0Y29tZXMgbWVhbiBmb3IgaW5kaXZpZHVhbCBvZmZzcHJpbmcgdGhhdCBhcmUgYm9ybiBpbiBhbnkgZ2l2ZW4gZ2VuZXJhdGlvbj8gSG93IG1pZ2h0IHRoaXMgZGlzY3JlcGFuY3kgaW1wb3J0YW50IGluIHRoZSBjb250ZXh0IG9mIGV2b2x1dGlvbj8NCg0KKlRoZSBleHBvbmVudGlhbCBtb2RlbCBpcyBzdWNoIHRoYXQgYWxsIG9mZnNwcmluZyBzdXJ2aXZlIGFuZCByZXByb2R1Y2UsIHdoaWNoIGlzIHVucmVhbGlzdGljLiBUaGUgbG9naXN0aWMgbW9kZWwgc2hvd3MgdGhhdCBsZXNzIG9mZnNwcmluZyBzdXJ2aXZlLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgd2lsbCBiZSBsZXNzIGNoYW5jZXMgZm9yIGV2b2x1dGlvbiB0byBvY2N1ciwgY29tcGFyZWQgdG8gdGhlIGV4cG9uZW50aWFsIHdoZXJlIHRoZXJlIGFyZSBsb3RzIG9mIGNoYW5jZXMgZm9yIGEgbXV0YXRpb24gdG8gb2NjdXIuKg0KDQojIDQuIEluZGl2aWR1YWxzIFZhcnkgaW4gVGhlaXIgVHJhaXRzDQpBbm90aGVyIG9mIERhcndpbidzIGtleSBvYnNlcnZhdGlvbiB3YXMganVzdCBob3cgdmFyaWFibGUgaW5kaXZpZHVhbHMgb2YgdGhlIHNhbWUgc3BlY2llcyBhcmUuIExldCdzIGV4cGxvcmUgc29tZSBvZiB0aGF0IHZhcmlhdGlvbiBpbiBjYXZlIG1vbGxpZXMuIFRvIGRvIHRoYXQsIHdlIGZpcnN0IG5lZWQgdG8gbG9hZCBzb21lIGRhdGEgaW50byBSLiBUaGVzZSBkYXRhIHdlcmUgY29sbGVjdGVkIGFzIHBhcnQgb2YgbXkgZGlzc2VydGF0aW9uIGFuZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOiBoYWJpdGF0IChjYXZlIG9yIHN1cmZhY2UpLCBzZXggKG1hbGUgb3IgZmVtYWxlKSwgc3RhbmRhcmQgbGVuZ3RoIChpbiBtbSwgZnJvbSB0aGUgc25vdXQgdG8gdGhlIGNhdWRhbCBmaW4gYmFzZSksIGV5ZSBkaWFtZXRlciAoaW4gbW0pLCBoZWFkIGxlbmd0aCAoaW4gbW0pLCBoZWFkIHdpZHRoIChpbiBtbSksIHByZWRvcnNhbCBsZW5ndGggKGluIG1tLCBmcm9tIHRoZSBzbm91dCB0byB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBkb3JzYWwgZmluKSwgYW5kIGdhcGUgd2l0aCAoaW4gbW0sIGZyb20gb25lIGNvcm5lciBvZiB0aGUgbW91dGggdG8gdGhlIG90aGVyKS4NCg0KYGBge3J9DQojVXNlIHRoZSByZWFkLmNzdiBmdW5jdGlvbiB0byBpbXBvcnQgYSBkYXRhc2V0DQptb3JwaC5kYXRhIDwtIHJlYWQuY3N2KCJtb3JwaG9sb2dpY2FsX3ZhcmlhdGlvbi5jc3YiKQ0KbW9ycGguZGF0YQ0KYGBgDQoNCiMjIDQuMS4gQ29tcGFyaW5nIEJvZHkgU2l6ZSBWYXJpYXRpb24gV2l0aGluIGFuZCBCZXR3ZWVuIFBvcHVsYXRpb25zDQpBIHNpbXBsZSB3YXkgdG8gY29tcGFyZSB2YXJpYXRpb24gd2l0aGluIGFuZCBiZXR3ZWVuIHBvcHVsYXRpb25zIGlzIHRvIHBsb3QgYSBbZnJlcXVlbmN5IGhpc3RvZ3JhbV0oaHR0cHM6Ly9hc3Eub3JnL3F1YWxpdHktcmVzb3VyY2VzL2hpc3RvZ3JhbSkgKHdoaWNoIHJlcHJlc2VudHMgdGhlIHJhdyBkYXRhIGNvdW50cykgYWxvbmcgd2l0aCBhIGRlbnNpdHkgcGxvdCAod2hpY2ggcmVwcmVzZW50cyB0aGUgYXBwcm94aW1hdGVkIHN0YXRpc3RpY2FsIGRpc3RyaWJ1dGlvbikuIFlvdSBjYW4gZ2VuZXJhdGUgYSBoaXN0b2dyYW0gd2l0aCB0aGUgY29tbWFuZCAiZ2VvbV9oaXN0b2dyYW0iIGFuZCBkZXNpZ25hdGUgYW55IHRyYWl0IHlvdSBtYXkgd2FudCBhcyB0aGUgeCBheGlzLiBZb3UgY2FuIGNhbGN1bGF0ZSB0aGUgZGVuc2l0eSB3aXRoIHRoZSAiYWVzKHk9Li5kZW5zaXR5Li4pIiBmdW5jdGlvbiB3aXRoaW4gdGhlICJnZW9tX2hpc3RvZ3JhbSIgY29tbWFuZCBhbmQgdGhlbiBwbG90IGl0IHdpdGggImdlb21fZGVuc2l0eSIuIE5vdGUgdGhhdCB3aGVuIHlvdSBoYXZlIG1vcmUgdGhhbiB0d28gZ3JvdXBzIChpbiBvdXIgY2FzZSB3ZSBoYXZlIHNhbXBsZXMgZnJvbSBhIGNhdmUgYW5kIGEgc3VyZmFjZSBwb3B1bGF0aW9uKSwgeW91IGNhbiB2aXN1YWxpemUgdGhlbSBzZXBhcmF0ZWx5IGJ5IGRlc2lnbmF0aW5nIGEgZGlmZmVyZW50IGNvbG9yIGZvciBlYWNoIGdyb3VwIGluIHRoZSBhZXN0aGV0aWNzICgiZmlsbD1IYWJpdGF0IikuIA0KDQpXaGVuIHlvdSB2aXN1YWxpemUgYm9keSBzaXplIHZhcmlhdGlvbiBpbiB0aGlzIG1hbm5lciB3aGF0IGRvIHlvdSBvYnNlcnZlPyBJcyB0aGVyZSBtb3JlIHZhcmlhdGlvbiB3aXRoaW4gb3IgYmV0d2VlbiBwb3B1bGF0aW9ucz8NCg0KYGBge3J9DQojVXNlIHRoZSBnZ3Bsb3QgZnVuY3Rpb24gdG8gZ3JhcGggdGhlIGhpc3RvZ3JhbSAoc2VlOiBodHRwOi8vd3d3LnN0aGRhLmNvbS9lbmdsaXNoL3dpa2kvZ2dwbG90Mi1oaXN0b2dyYW0tcGxvdC1xdWljay1zdGFydC1ndWlkZS1yLXNvZnR3YXJlLWFuZC1kYXRhLXZpc3VhbGl6YXRpb24pDQpnZ3Bsb3QobW9ycGguZGF0YSwgYWVzKHg9U3RhbmRhcmQubGVuZ3RoLCBmaWxsPcOvLi5IYWJpdGF0KSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBwb3NpdGlvbj0iZG9kZ2UiKSArDQogIGdlb21fZGVuc2l0eShhbHBoYT0wLjUpKw0KICB4bGFiKCJTdGFuZGFyZCBMZW5ndGgiKSArIA0KICB5bGFiKCJEZW5zaXR5IikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KDQoqVGhlIGdyYXBoIGFwcGVhcnMgdG8gc2hvdyB0aGF0IHRoZXJlIGFyZSBzaW1pbGFyIHNpemUgdmFyaWF0aW9uIGJldHdlZSBudGhlIGNhdmUgYW5kIHN1cmZhY2UgcG9wdWxhdGlvbnMuIFRoZXJlIGlzIG1vcmUgc2l6ZSB2YXJpYXRpb24gaW5zaWRlIHRoZSBwb3B1bGF0aW9uLioNCg0KIyMgNC4yLiBDb21wYXJpbmcgUHJlZG9yc2FsIExlbmd0aCBWYXJpYXRpb24gV2l0aGluIGFuZCBCZXR3ZWVuIFBvcHVsYXRpb25zDQpMZXQncyBhbHNvIGNvbXBhcmUgYSBzZWNvbmQgdHJhaXQsIHByZWRvcnNhbCBsZW5ndGguIFdpdGggdGhlIHByZXZpb3VzIGdyYXBoIHlvdSBob3BlZnVsbHkgc2F3IGhvdyB2YXJpYWJsZSBvdmVyYWxsIGJvZHkgc2l6ZSBpcyB3aXRoaW4gcG9wdWxhdGlvbnMuIElmIHdlIHdhbnQgdG8gY29tcGFyZSBvdGhlciB0cmFpdHMsIHdlIGhhdmUgdG8gYWNjb3VudCBmb3IgdGhhdC4gV2Ugd2FudCB0byBrbm93IHdoZXRoZXIgdmFyaWF0aW9uIGluIHByZWRvcnNhbCBsZW5ndGggaXMgZHVlIHRvIHZhcmlhdGlvbiBpbiBzaXplIChzbWFsbCBmaXNoIGhhdmUgc21hbGwgcHJlZG9yc2FsIGxlbmd0aHMpIG9yIHdoZXRoZXIgb3RoZXIgcGF0dGVybnMgbWlnaHQgYmUgYXQgcGxheS4gVG8gZG8gc28sIHdlIGNhbiBjYWxjdWxhdGUgcmVsYXRpdmUgcHJlZG9yc2FsIGxlbmd0aCBhcyB0aGUgcmF0aW8gYmV0d2VlbiBwcmVkb3JzYWwgbGVuZ3RoIGFuZCBzdGFuZGFyZCBsZW5ndGguIA0KDQpXaGVuIHlvdSBwbG90IHJlbGF0aXZlIHByZWRvcnNhbCBsZW5ndGgsIHdoYXQgZG8geW91IG9ic2VydmU/IEhvdyBkb2VzIHZhcmlhdGlvbiBpbiBwcmVkb3JzYWwgbGVuZ3RoIHZhcnkgd2l0aGluIGFuZCBiZXR3ZWVuIHBvcHVsYXRpb25zLCBhbmQgaG93IGRvZXMgaXQgY29tcGFyZSB0byB2YXJpYXRpb24gaW4gc3RhbmRhcmQgbGVuZ3RoPw0KDQpgYGB7cn0NCiNDYWxjdWxhdGUgcmVsYXRpdmUgcHJlZG9yc2FsIGxlbmd0aCBieSBkaXZpZGluZyBwcmVkb3JzYWwgbGVuZ3RoIGJ5IHN0YW5kYXJkIGxlbmd0aA0KI1dlIGNhbiB1c2UgdGhlICQgc2lnbiB0byBjYWxsIHNwZWNpZmljIGNvbHVtbnMgd2l0aGluIGEgZGF0YSBmcmFtZQ0KI1dlIGNhbiBhbHNvIGFkZCBhIG5ldyBjb2x1bW4gdG8gdGhlIG1vcnBoLmRhdGEgdGFibGUgdXNpbmcgdGhlICQgc2lnbg0KbW9ycGguZGF0YSRyZWxhdGl2ZS5wcmVkb3JzYWwubGVuZ3RoIDwtIG1vcnBoLmRhdGEkUHJlZG9yc2FsLmxlbmd0aC9tb3JwaC5kYXRhJFN0YW5kYXJkLmxlbmd0aA0KDQojI1VzZSB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIGdyYXBoIHRoZSBoaXN0b2dyYW0gYW5kIGNvbG9yIGRhdGEgYmFzZWQgb24gaGFiaXRhdA0KZ2dwbG90KG1vcnBoLmRhdGEsIGFlcyh4PXJlbGF0aXZlLnByZWRvcnNhbC5sZW5ndGgsIGZpbGw9w68uLkhhYml0YXQpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSwgcG9zaXRpb249ImRvZGdlIikgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGE9MC41KSsNCiAgeGxhYigiUmVsYXRpdmUgUHJlZG9yc2FsIExlbmd0aCIpICsgDQogIHlsYWIoIkRlbnNpdHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCipJdCBhcHBlYXJzIHRoYXQgdGhlIHJlbGF0aXZlIHByZWRvcnNhbCBsZW5ndGggaXMgc2ltaWxhciBiZXR3ZWVuIHRoZSBwb3B1bGF0aW9ucy4gSXQgYXBwZWFycyB0aGF0IGFzIHBvcHVsYXRpb24gZGVuc2l0eSBpcyBsb3csIHRoZXJlIGlzIG1vcmUgdmFyaWF0aW9uLCBhbmQgaXQgYmVjb21lcyBtb3JlIHVuaWZvcm0gYXMgdGhlIGRlbnNpdHkgaW5jcmVhc2VzLiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIGxlbmd0aC4qDQoNCiMjIDQuMy4gQ29tcGFyaW5nIEV5ZSBTaXplIFZhcmlhdGlvbiBXaXRoaW4gYW5kIEJldHdlZW4gUG9wdWxhdGlvbnMNClVzaW5nIHRoZSBzYW1lIGFwcHJvYWNoIGFzIGZvciBwcmVkb3JzYWwgdmFyaWF0aW9uLCBjb21wYXJlIHZhcmlhdGlvbiBpbiByZWxhdGl2ZSBleWUgZGlhbWV0ZXIuIA0KDQpXaGF0IGRvIHlvdSBvYnNlcnZlPyBIb3cgZG9lcyB2YXJpYXRpb24gaW4gZXllIGRpYW1ldGVyIHZhcnkgd2l0aGluIGFuZCBiZXR3ZWVuIHBvcHVsYXRpb25zLCBhbmQgaG93IGRvZXMgaXQgY29tcGFyZSB0byB2YXJpYXRpb24gaW4gdGhlIG90aGVyIHRyYWl0cz8NCg0KYGBge3J9DQojWW91ciBjb2RlIGdvZXMgaGVyZQ0KI0NhbGN1bGF0ZSByZWxhdGl2ZSBwcmVkb3JzYWwgbGVuZ3RoICBieSBkaXZpZGluZyBwcmVkb3JzYWwgbGVuZ3RoIGJ5IHN0YW5kYXJkIGxlbmd0aA0KbW9ycGguZGF0YSRyZWxhdGl2ZS5leWUuc2l6ZSA8LSBtb3JwaC5kYXRhJEV5ZS5kaWFtZXRlci9tb3JwaC5kYXRhJFN0YW5kYXJkLmxlbmd0aA0KDQojI1VzZSB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIGdyYXBoIHRoZSBoaXN0b2dyYW0gYW5kIGNvbG9yIGRhdGEgYmFzZWQgb24gaGFiaXRhdA0KZ2dwbG90KG1vcnBoLmRhdGEsIGFlcyh4PXJlbGF0aXZlLmV5ZS5zaXplLCBmaWxsPcOvLi5IYWJpdGF0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksIHBvc2l0aW9uPSJkb2RnZSIpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuNSkrDQogIHhsYWIoIlJlbGF0aXZlIEV5ZSBEaWFtZXRlciIpICsgDQogIHlsYWIoIkRlbnNpdHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCipUaGUgZXllIHNpemUgc2hvd3MgdGhlIG1vc3QgdmFyaWFiaWxpdHkgYmV0d2VlbiBwb3B1bGF0aW9ucywgd2hlcmUgdGhlIGF2ZXJhZ2Ugc2l6ZXMgYXJlIHNtYWxsZXIgaW4gdGhlIGNhdmUgcG9wdWxhdGlvbiwgYW5kIGxhcmdlciBvbiB0aGUgc3VyZmFjZS4gVGhpcyBpcyB0byBiZSBleHBlY3RlZCBkdWUgdG8gdGhlIGxhY2sgb2YgbGlnaHQgaW4gdGhlIGNhdmUuIEV5ZXNpZ2h0IGlzIG5vdCBhcyBpbXBvcnRhbnQgd2hlbiB0aGVyZSBpc24ndCBlbm91Z2ggbGlnaHQgdG8gc2VlIHdpdGgsIHNvIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgb3RoZXIgdHJhaXRzIHJlbWFpbiBzaW1pbGFyLCB3aGlsZSBleWVzaWdodCBpcyBtdWNoIGRpZmZlcmVudC4qDQoNCg0KIyA1LiBWYXJpYXRpb24gaW4gVHJhaXRzIGlzIEhlcml0YWJsZQ0KQW4gYXZpZCBicmVlZGVyIG9mIGZhbmN5IHBpZ2VvbnMsIERhcndpbiBvYnNlcnZlZCB0aGF0IHNwZWNpZmljIHRyYWl0cyBhcmUgcGFzc2VkIGZyb20gcGFyZW50cyB0byBvZmZzcHJpbmcsIGV2ZW4gdGhvdWdoIGhlIGhhZCBubyBjbHVlIGhvdyB0aGlzIG1pZ2h0IGFjdHVhbGx5IHdvcmsgKGdlbmV0aWNzIHdhcyBub3QgYSB0aGluZyB5ZXQpLiBFdmVuIHdpdGhvdXQgYW4gYWJpbGl0eSB0byBjb25kdWN0IG1vbGVjdWxhciBnZW5ldGljIGFuYWx5c2VzLCB3ZSBjYW4gZXN0aW1hdGUgaGVyaXRhYmlsaXR5IG9mIHRyYWl0cyBieSBjb21wYXJpbmcgdGhlIHRyYWl0cyBvZiBvZmZzcHJpbmcgdG8gdGhlIHRyYWl0cyBvZiB0aGUgcGFyZW50cy4NCg0KTGV0J3MgbG9hZCBzb21lIGRhdGEgdGhhdCBjb21wYXJlcyBwYXJlbnQgYW5kIG9mZnNwcmluZyB0cmFpdHMgaW4gY2F2ZSBtb2xsaWVzLiBUbyBkbyB0aGlzLCB3ZSBicm91Z2h0IGNhdmUgbW9sbGllcyBpbnRvIHRoZSBsYWIgYW5kIGJyZWQgdGhlbSB1bmRlciBzdGFuZGFyZGl6ZWQgY29uZGl0aW9ucy4gRGF0YSByZXByZXNlbnQgdGhlIGF2ZXJhZ2UgdHJhaXQgdmFsdWVzIG9mIHRoZSBtb3RoZXIgYW5kIGZhdGhlciBhbmQgb2YgYWxsIG9mZnNwcmluZyBmcm9tIGEgc3BlY2lmaWMgYnJvb2QuIFRoZSBlYXNpZXN0IHdheSB0byBjb21wYXJlIHBhcmVudCBhbmQgb2Zmc3ByaW5nIHRyYWl0cyBpcyB0aHJvdWdoIGEgc2NhdHRlciBwbG90LCB3aGljaCB3ZSBhbHJlYWR5IHVzZWQgaW4gRXhlcmNpc2UgMS4gSWYgYSB0cmFpdCBpcyBoZXJpdGFibGUsIHdlIHdvdWxkIGV4cGVjdCB0byBzZWUgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgb2Zmc3ByaW5nIHRyYWl0cyAoZS5nLiwgcGFyZW50cyB3aXRoIHNtYWxsIGV5ZXMgc2hvdWxkIGhhdmUgb2Zmc3ByaW5nIHdpdGggc21hbGwgZXllcykuDQoNClRoZSBmb2xsb3dpbmcgZGF0YXNldCBpbmNsdWRlcyBtZWFzdXJlbWVudHMgb2YgcGFyZW50YWwgYW5kIG9mZnNwcmluZyBzdGFuZGFyZCBsZW5ndGggYXMgd2VsbCBhcyBleWUgc2l6ZS4NCg0KYGBge3J9DQojVXNlIHRoZSByZWFkLmNzdiBmdW5jdGlvbiB0byBpbXBvcnQgYSBkYXRhc2V0DQpoZXJpdGFiaWxpdHkgPC0gcmVhZC5jc3YoImhlcml0YWJpbGl0eS5jc3YiKQ0KaGVyaXRhYmlsaXR5DQpgYGANCg0KDQojIyA1LjEuIEhlcml0YWJpbGl0eSBvZiBTdGFuZGFyZCBMZW5ndGggDQpGaXJzdCwgbGV0IHVzIGV4cGxvcmUgd2hldGhlciB0aGVyZSBpcyBldmlkZW5jZSBmb3IgaGVyaXRhYmlsaXR5IGluIHN0YW5kYXJkIGxlbmd0aC4gDQoNCldoYXQgZG8geW91IG9ic2VydmU/IElzIHN0YW5kYXJkIGxlbmd0aCBhIGhlcml0YWJsZSB0cmFpdD8NCg0KYGBge3J9DQojUGxvdCB0aGUgcmVzdWx0cywgbWFrZSBzdXJlIHlvdSBwcm9wZXJseSBsYWJlbCB0aGUgYXhlcyAoc2VlOiBodHRwOi8vd3d3LnN0aGRhLmNvbS9lbmdsaXNoL3dpa2kvZ2dwbG90Mi1zY2F0dGVyLXBsb3RzLXF1aWNrLXN0YXJ0LWd1aWRlLXItc29mdHdhcmUtYW5kLWRhdGEtdmlzdWFsaXphdGlvbikNCmdncGxvdChoZXJpdGFiaWxpdHksIGFlcyh4PcOvLi5wYXJlbnQuc3RhbmRhcmQubGVuZ3RoLCB5PW9mZnNwcmluZy5zdGFuZGFyZC5sZW5ndGgpKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKw0KICB4bGFiKCJQYXJlbnQgU3RhbmRhcmQgTGVuZ3RoIikgKyANCiAgeWxhYigiT2Zmc3ByaW5nIFN0YW5kYXJkIExlbmd0aCIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQpgYGANCg0KKkl0IGRvZXNuJ3QgbG9vayBsaWtlIHRoZXJlIGlzIGFueSByaHltZSBvciByZWFzb24gdG8gdGhlIHBvaW50cyBpbiB0aGUgZ3JhcGgsIHRoZXJlZm9yLCBpdCBhcHBlYXJzIHRoYXQgc3RhbmRhcmQgbGVuZ3RoIGlzIG5vdCBoZXJpdGFibGUqDQoNCiMjIDUuMi4gSGVyaXRhYmlsaXR5IG9mIEV5ZSBTaXplDQpOb3cgbGV0IHVzIGV4cGxvcmUgd2hldGhlciB0aGVyZSBpcyBhbnkgaGVyaXRhYmlsaXR5IGluIGV5ZSBzaXplLiBSZW1lbWJlciwgdGhlcmUgaXMgc3Vic3RhbnRpYWwgdmFyaWF0aW9uIGluIGJvZHkgc2l6ZSwgYW5kIGluIHN1Y2ggY2FzZXMsIHdlIHdhbnQgdG8gY29udHJvbCBmb3IgYm9keSBzaXplIGJ5IGNhbGN1bGF0aW5nIHJlbGF0aXZlIGV5ZSBzaXplIGZpcnN0LiANCg0KV2hhdCBkbyB5b3Ugb2JzZXJ2ZT8gSXMgc3RhbmRhcmQgbGVuZ3RoIGEgaGVyaXRhYmxlIHRyYWl0Pw0KDQpgYGB7cn0NCiNDYWxjdWxhdGUgcmVsYXRpdmUgZXllIHNpemVzDQptb3JwaC5kYXRhJGhlcml0YWJpbGl0eSRyZWxhdGl2ZS5wYXJlbnQuZXllLnNpemUgPC0gbW9ycGguZGF0YSRwYXJlbnQuZXllLnNpemUvbW9ycGguZGF0YSTDry4ucGFyZW50LnN0YW5kYXJkLmxlbmd0aA0KbW9ycGguZGF0YSRoZXJpdGFiaWxpdHkkcmVsYXRpdmUub2Zmc3ByaW5nLmV5ZS5zaXplIDwtIG1vcnBoLmRhdGEkb2Zmc3ByaW5nLmV5ZS5zaXplL21vcnBoLmRhdGEkb2Zmc3ByaW5nLnN0YW5kYXJkLmxlbmd0aA0KDQojUGxvdCB0aGUgcmVzdWx0cywgbWFrZSBzdXJlIHlvdSBwcm9wZXJseSBsYWJlbCB0aGUgYXhlcyAoc2VlOiBodHRwOi8vd3d3LnN0aGRhLmNvbS9lbmdsaXNoL3dpa2kvZ2dwbG90Mi1zY2F0dGVyLXBsb3RzLXF1aWNrLXN0YXJ0LWd1aWRlLXItc29mdHdhcmUtYW5kLWRhdGEtdmlzdWFsaXphdGlvbikNCmdncGxvdChoZXJpdGFiaWxpdHksIGFlcyh4PXJlbGF0aXZlLnBhcmVudC5leWUuc2l6ZSwgeT1yZWxhdGl2ZS5vZmZzcHJpbmcuZXllLnNpemUpKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKw0KICB4bGFiKCJyZWxhdGl2ZSBwYXJlbnQgZXllIHNpemUiKSArIA0KICB5bGFiKCJyZWxhdGl2ZSBvZmZzcHJpbmcgZXllIHNpemUiKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCipJIGJlbGlldmUgdGhhdCBoZXJlIGlzIGhlcml0YWJpbGl0eSBiYXNlZCBvZmYgb2Ygd2hhdCBJIGFzc3VtZSB0byBiZSBkYXRhIHBvaW50cyB0aGF0IGZvbGxvdyB0aGUgdHJlbmQgbGluZS4qDQoNCiMgNi4gV2hhdCBXb3VsZCBIYXBwZW4gSWYuLi4/DQpJbWFnaW5lIGZvciBhIG1vbWVudCB0aGF0IHNtYWxsZXIgZmlzaCBoYXZlIGEgaGlnaGVyIGxpa2VsaWhvb2Qgb2Ygc3Vydml2YWwgaW4gdGhlIGNhdmUuIFdvdWxkIHlvdSBleHBlY3QgZXZvbHV0aW9uIG9mIGJvZHkgc2l6ZSB1cG9uIGNhdmUgY29sb25pemF0aW9uPw0KDQpJbWFnaW5lIGZvciBhIG1vbWVudCB0aGF0IGZpc2ggd2l0aCBzbWFsbGVyIGV5ZXMgaGF2ZSBhIGhpZ2hlciBsaWtlbGlob29kIG9mIHN1cnZpdmFsIGluIHRoZSBjYXZlLiBXb3VsZCB5b3UgZXhwZWN0IGV2b2x1dGlvbiBvZiBib2R5IHNpemUgdXBvbiBjYXZlIGNvbG9uaXphdGlvbj8NCg0KSnVzdGlmeSB5b3VyIHJlc3BvbnNlLg0KDQoqSSBpbWFnaW5lIHRoYXQgYm9keSBzaXplIHdvdWxkIGRlY3JlYXNlLiBJIHRoaW5rIHRoaXMgYmVjYXVzZSBpZiBhIHNtYWxsZXIgYm9keSBtZWFucyBoaWdoZXIgc3Vydml2YWwsIHRoZSBzbWFsbGVyIHRoZSBib2R5IG9uIHRoZSBmaXNoLCB0aGUgbW9yZSBsaWtlbHkgaXQgaXMgdG8gcmVwcm9kdWNlLCB0aHVzIGRyaXZpbmcgdGhlIGF2ZXJhZ2UgYm9keSBzaXplIGRvd24uIElmIHNtYWxsZXIgZXllIHNpemUgbWVhbnQgYSBoaWdoZXIgY2hhbmNlIG9mIHN1cnZpdmFsIEkgd291bGQgaW1hZ2luZSBib2R5IHNpemUgd291bGRuJ3QgY2hhbmdlIHRoYXQgbXVjaCwgYXMgZXllIHNpemUgaXMgbm90IG5lY2Vzc2FyaWx5IGRpcmVjdGx5IHRpZWQgdG8gYm9keSBsZW5ndGgqDQoNCiMgNy4gUmVzb3VyY2VzDQojIyA3LjEuIERhdGEgUmVmZXJlbmNlcw0KVGhlIGV5ZSBzaXplIGRhdGEgd2FzIHB1Ymxpc2hlZCBpbiB0aGUgZm9sbG93aW5nIHBhcGVyLiBPdGhlciBtZWFzdXJlbWVudHMgYXJlIHVucHVibGlzaGVkIGRhdGEgYnkgTS4gVG9ibGVyLg0KDQpNY0dvd2FuLCBLLiBMLiwgQy4gTi4gUGFzc293LCBMLiBBcmlhcyBSb2RyaWd1ZXosIE0uIFRvYmxlciAmIEouIEwuIEtlbGxleSAoMjAxOSk6IFtFeHByZXNzaW9uIGFuYWx5c2VzIG9mIGNhdmUgbW9sbGllcyAoKlBvZWNpbGlhIG1leGljYW5hKikgcmV2ZWFsIGtleSBnZW5lcyBpbnZvbHZlZCBpbiB0aGUgZWFybHkgZXZvbHV0aW9uIG9mIGV5ZSByZWdyZXNzaW9uXShodHRwczovL3JveWFsc29jaWV0eXB1Ymxpc2hpbmcub3JnL2RvaS8xMC4xMDk4L3JzYmwuMjAxOS4wNTU0KS4gQmlvbG9neSBMZXR0ZXJzIDE1ICgxMCk6IDIwMTkwNTU0Lg0KDQojIyA3LjIgUmVzb3VyY2VzIFlvdSBDb25zdWx0ZWQNCkNvbnN1bHRpbmcgYWRkaXRpb25hbCByZXNvdXJjZXMgdG8gc29sdmUgdGhpcyBhc3NpZ25tZW50IGlzIGFic29sdXRlbHkgYWxsb3dlZCwgYnV0IGZhaWx1cmUgdG8gZGlzY2xvc2UgdGhvc2UgcmVzb3VyY2VzIGlzIHBsYWdpYXJpc20uIFBsZWFzZSBsaXN0IGFueSBjb2xsYWJvcmF0b3JzIHlvdSB3b3JrZWQgd2l0aCBhbmQgcmVzb3VyY2VzIHlvdSB1c2VkIGJlbG93IG9yIHN0YXRlIHRoYXQgeW91IGhhdmUgbm90IHVzZWQgYW55Lg0KDQoqWW91ciBhbnN3ZXIgZ29lcyBoZXJlLio=