Description
Please answer the following questions as part of the narrative in
your project report. For each question, make sure that the corresponding
code is included along with your results.
What is the average amount of missing data per individual?
library(dartR)
Loading required package: ggplot2
Loading required package: dplyr
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
Loading required package: dartR.data
**** Welcome to dartR.data [Version 1.0.8 ] ****
Registered S3 method overwritten by 'pegas':
method from
print.amova ade4
Registered S3 method overwritten by 'GGally':
method from
+.gg ggplot2
Registered S3 method overwritten by 'genetics':
method from
[.haplotype pegas
**** Welcome to dartR [Version 2.9.7 ] ****
Be aware that owing to CRAN requirements and compatibility reasons not all functions of the package may run after the basic installation, as some packages could still be missing. Hence for a most enjoyable experience we recommend to run the function
gl.install.vanilla.dartR()
This installs all missing and required packages for your version of dartR. In case something fails during installation please refer to this tutorial: https://github.com/green-striped-gecko/dartR/wiki/Installation-tutorial.
For information how to cite dartR, please use:
citation('dartR')
Global verbosity is set to: 2
**** Have fun using dartR! ****
Attaching package: ‘dartR’
The following objects are masked from ‘package:dartR.data’:
bandicoot.gl, possums.gl, testset.gl, testset.gs
Setting the work directory
print(genlight_obj)
/// GENLIGHT OBJECT /////////
// 77 genotypes, 5,308 binary SNPs, size: 2.2 Mb
226944 (55.53 %) missing data
// Basic content
@gen: list of 77 SNPbin
@ploidy: ploidy of each individual (range: 2-2)
// Optional content
@ind.names: 77 individual labels
@loc.names: 5308 locus labels
@loc.all: 5308 alleles
@chromosome: factor storing chromosomes of the SNPs
@position: integer storing positions of the SNPs
@pop: population of each individual (group size range: 77-77)
@other: a list containing: loc.metrics loc.metrics.flags verbose history ind.metrics
Questions:
Q1:
How many individuals are in the dataset? There are
77 individuals after filtering them (see the {sh} below for the command
line) The average missing data per individual in the matrix is 0.5553 At
the very least 25 individual are candidate for exclusion under 50% of
missing data per individuals.
vcftools --vcf temp_filtered.vcf --minDP 10 --max-meanDP 40 --max-missing 0.2 --min-alleles 2 --max-alleles 2 --remove-indels --recode --out final_filtered_variants
print(id_indiv_discard)
AC1-AC16_0509_023.q10.sorted.bam
25
Q2:
How did you choose to filter your data, and how many SNPs do
you retain after filtering? Filtered data with a threshold of
80%, meaning individual with 80% of data are retain and others are
excluded. After filters, 333 SNPs are retained.
Why did you choose to use the filters that you did with these
data? The filter threshold was selected to prevent low-quality
SNPs where significant missing data can mislead the results and
interpretations.
What are we trying to mitigate by using these
filters? The 80% filter threshold remove any individual that
does not have 80% of data, creating high quality of individuals data.
The monomorph filter seems to remove SNPs with no variants, which could
be ideal to understand only those individuals that contribute to genetic
diversity.
print(paste("# of SNPs retained aftered filteres:", num_snps_retained))
[1] "# of SNPs retained aftered filteres: 333"
Q3
Are there any individuals that seem to have elevated
heterozygosity in the sampled population? Please provide a plot that
demonstrates this. At least three individuals have elevated
heterozygosity on the data frame.
Why might an individual with elevated heterozygosity be
concerning? Unusual elevated heterozygosity might be due to
contaminants, external genetic influences and/or biases on the outcomes
if ot accounted for.
#1. We calculate the heterogeneity (het) per individuals
het_data <- gl.report.heterozygosity(genlight_obj)
Starting gl.report.heterozygosity
Processing genlight object with SNP data
Calculating Observed Heterozygosities, averaged across
loci, for each population
Calculating Expected Heterozygosities
Completed: gl.report.heterozygosity

Q4
How diverse is the sampled population? Please provide an
estimate of genetic diversity and a brief explanation of the measure of
diversity that you chose to use. The expected heterozygosity
average is 0.137.
Would you make a management recommendation based solely on
this diversity estimate? The expected and observed genetic
diversity might not be enough to make management decision, but it is a
good base line to make decision on what kind of data to collect.
Why or why not? If not, what further information would you
want before making a recommendation? We should know more about
the population size, the structure of the population and environmental
factors. Those threats and pressures would define the
ggplot(diversity_df, aes(x = Heterozygosity)) +
geom_histogram(binwidth = 0.05, fill = "steelblue", color = "black") +
labs(title = "Distribution of Genetic Diversity (Obv. Het)",
x = "Heterozygosity",
y = "Frequency")
Error in `geom_histogram()`:
! Problem while computing aesthetics.
ℹ Error occurred in the 1st layer.
Caused by error:
! object 'Heterozygosity' not found
Backtrace:
1. base (local) `<fn>`(x)
2. ggplot2:::print.ggplot(x)
4. ggplot2:::ggplot_build.ggplot(x)
5. ggplot2:::by_layer(...)
12. ggplot2 (local) f(l = layers[[i]], d = data[[i]])
13. l$compute_aesthetics(d, plot)
14. ggplot2 (local) compute_aesthetics(..., self = self)
15. base::lapply(aesthetics, eval_tidy, data = data, env = env)
16. rlang (local) FUN(X[[i]], ...)

Q5:
Are the majority of loci in this population in Hardy-Weinberg
equilibrium (HWE) overall? The majority of the loci tested are
distal of the HWE. It could be a issue in the data or from the filter
function of p-value 0.05. The filter function was set with colunm “Prob”
for p-value.
If not, how do you interpret its departure from HWE? What
could this mean about the population or sampling scheme? If it
is actually an outcome of the dataset, we can consider the population to
be highly inbreeding and perhaps the population size decline. The
environmental structure factors in for the lack of heterozygosity. On
the other hand, sampling randomization could influence in the outcome if
the bioinformatics are process carefully. Both are possibilities for the
distal from HWE.
print(paste("loci distal from HWE:", num_hwe_loci))
[1] "loci distal from HWE: 1153"
Q6:
Please provide a PCA plot visualizing the genetic relatedness
among individuals. What stands out to you in this
visualization? We have three clear clusters, two of the three
more packed, while the third has some deviation. The two more packed
suggested genetic similarity and perhaps it comes from the same
ecosystem. Also, it coud suggest shared ancestry.
There are a couple of outlines that might have some interesting
genetic diversity or fragmented by phisical varries with little
migration opportunities.

Q7:
What additional question(s) do you have about this dataset that would
aid in your interpretation of these data? Yes: here are three that come
to mind: (they might be incorrect or out of the scoepe) 1. Is there
evidence of population structure within the dataset? k-mean cluster
assigment test suggests population structuring with the available
data.
- How does inbreeding affect the genetic diversity observed in this
population? This analysis could help to understand the clustering of the
individuals that has been presented on previous question answer.

LS0tCnRpdGxlOiAiUG9yamVjdCAxIgpzdWJ0aXRsZTogIkJpb2luZm9ybWF0aWNzIGZvciBDb3NlcnZhdGlvbiIKYXV0aG9yOiAiTmt3aSBGbG9yZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMgRGVzY3JpcHRpb24KUGxlYXNlIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucyBhcyBwYXJ0IG9mIHRoZSBuYXJyYXRpdmUgaW4geW91ciBwcm9qZWN0IHJlcG9ydC4gRm9yIGVhY2ggcXVlc3Rpb24sIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaXMgaW5jbHVkZWQgYWxvbmcgd2l0aCB5b3VyIHJlc3VsdHMuCgoKV2hhdCBpcyB0aGUgYXZlcmFnZSBhbW91bnQgb2YgbWlzc2luZyBkYXRhIHBlciBpbmRpdmlkdWFsPwpgYGB7cn0KIyBJbnN0YWxsIG5lY2Vzc2FyeSBwYWNrYWdlcyAoaWYgbm90IGFscmVhZHkgaW5zdGFsbGVkKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkYXJ0UikKbGlicmFyeShhZGVnZW5ldCkKCmBgYApTZXR0aW5nIHRoZSB3b3JrIGRpcmVjdG9yeQpgYGB7cn0Kc2V0d2QoIn4vTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtVW5pdmVyc2l0eW9mQXJpem9uYS9Eb2N1bWVudHMvc2FuZGJveC9iaW9pbmZvcm1hdGljcy9kYXRhLyIpCgojTG9hZCB0aGUgdmNmIGZpbGUgImZpbmFsX2ZpbHRlcmVkX3ZhcmlhbnRzLnJlY29kZS52Y2YiCiNXZSB1c2UgdGhlIHRvb2wgZ2VubGlnaHRfb2JqCnZjZl9maWxlIDwtICIvVXNlcnMvbmtmL0xpYnJhcnkvQ2xvdWRTdG9yYWdlL09uZURyaXZlLVVuaXZlcnNpdHlvZkFyaXpvbmEvRG9jdW1lbnRzL3NhbmRib3gvYmlvaW5mb3JtYXRpY3MvZGF0YS9maW5hbF9maWx0ZXJlZF92YXJpYW50cy5yZWNvZGUudmNmIgpnZW5saWdodF9vYmogPC0gZ2wucmVhZC52Y2YodmNmX2ZpbGUpCgpwcmludChnZW5saWdodF9vYmopCgpgYGAKCiMgUXVlc3Rpb25zOgojIyMgUTE6CioqSG93IG1hbnkgaW5kaXZpZHVhbHMgYXJlIGluIHRoZSBkYXRhc2V0PyoqClRoZXJlIGFyZSA3NyBpbmRpdmlkdWFscyBhZnRlciBmaWx0ZXJpbmcgdGhlbSAoc2VlIHRoZSB7c2h9IGJlbG93IGZvciB0aGUgY29tbWFuZCBsaW5lKQpUaGUgYXZlcmFnZSBtaXNzaW5nIGRhdGEgcGVyIGluZGl2aWR1YWwgaW4gdGhlIG1hdHJpeCBpcyAwLjU1NTMKQXQgdGhlIHZlcnkgbGVhc3QgMjUgaW5kaXZpZHVhbCBhcmUgY2FuZGlkYXRlIGZvciBleGNsdXNpb24gdW5kZXIgNTAlIG9mIG1pc3NpbmcgZGF0YSBwZXIgaW5kaXZpZHVhbHMuCmBgYHtzaH0KdmNmdG9vbHMgLS12Y2YgdGVtcF9maWx0ZXJlZC52Y2YgLS1taW5EUCAxMCAtLW1heC1tZWFuRFAgNDAgLS1tYXgtbWlzc2luZyAwLjIgLS1taW4tYWxsZWxlcyAyIC0tbWF4LWFsbGVsZXMgMiAtLXJlbW92ZS1pbmRlbHMgLS1yZWNvZGUgLS1vdXQgZmluYWxfZmlsdGVyZWRfdmFyaWFudHMKYGBgCgpgYGB7ciwgbGFiZWwgPSBRMX0KIzEuIFdlIGNvdW50IHRoZSBudW1iZXIgb2YgaW5pZHZpZHVhbHMKbnVtX2luZGl2IDwtIG5JbmQoZ2VubGlnaHRfb2JqKQpwcmludChwYXN0ZSgibnVtYmVyIG9mIGluZGl2aWR1YWxzIiwgbnVtX2luZGl2KSkKCiMyLiBXZSBleHRyYWN0ZWQgdGhlIGdlbm90eXBlIGFzIGEgbWF0cml4IGJlY2F1c2Ugc29tZSBmdW5jdGlvbnMgbm90IHdvcmtpbmcgZm9yIHRoaXMgdmVyc2lvbiBvZiBSLgpnZW5vdHlwZV9tYXRyaXggPC0gYXMubWF0cml4KGdlbmxpZ2h0X29iaikKIzMuIFdlIHRyeSB0byBjYWxjdWxhdGUgdGhlIG1pc3NpbmcgZGF0YSBwZXIgaW5kaXZpZHVhbAptaXNzaW5nX2RhdGFfaW5kaXZpZHVhbCA8LSBhcHBseShnZW5vdHlwZV9tYXRyaXgsIDEsIGZ1bmN0aW9uKHgpIG1lYW4oaXMubmEoeCkpKQojNC4gV2UgZXN0aW1hdGVkIHRoZSBhdmVyYWdlIG1pc3NpbmcgZGF0YSBvbiB0aGUgbWF0cml4CmF2Z19taXNzaW5nX2RhdGEgPC1tZWFuKG1pc3NpbmdfZGF0YV9pbmRpdmlkdWFsKQpwcmludChwYXN0ZSgiYXZlcmFnZSBtaXNzaW5nIGRhdGEgcGVyIGluZGl2aWR1YWwgaW4gdGhlIG1hdHJpeDoiLCByb3VuZChhdmdfbWlzc2luZ19kYXRhLCA0KSkpCgojNS4gd2UgdHJ5IHRvIGlkIGluZGl2aWR1YWxzIHRvIGRpc2NhcmQgZHVlIHRvIG1pc3NpbmcgZGF0YS4gV2Ugc2V0IHRoZSB0aHJlc2hvbGQgbG93IGF0IDUwJSBtaXNzaW5nIGRhdGEgCnRocmVzaG9sZCA8LSAwLjUKaWRfaW5kaXZfZGlzY2FyZCA8LSB3aGljaChtaXNzaW5nX2RhdGFfaW5kaXZpZHVhbCA+IHRocmVzaG9sZCkKcHJpbnQoImluZGl2aWR1YWwgd2l0aCBtb3JlIHRoZSAlIG1pc3NpbmcgZGF0YSIpCnByaW50KGlkX2luZGl2X2Rpc2NhcmQpCgpgYGAKYGBge3J9CgpgYGAKCiMjIyBRMjoKKipIb3cgZGlkIHlvdSBjaG9vc2UgdG8gZmlsdGVyIHlvdXIgZGF0YSwgYW5kIGhvdyBtYW55IFNOUHMgZG8geW91IHJldGFpbiBhZnRlciBmaWx0ZXJpbmc/KioKRmlsdGVyZWQgZGF0YSB3aXRoIGEgdGhyZXNob2xkIG9mIDgwJSwgbWVhbmluZyBpbmRpdmlkdWFsIHdpdGggODAlIG9mIGRhdGEgYXJlIHJldGFpbiBhbmQgb3RoZXJzIGFyZSBleGNsdWRlZC4KQWZ0ZXIgZmlsdGVycywgMzMzIFNOUHMgYXJlIHJldGFpbmVkLgoKKipXaHkgZGlkIHlvdSBjaG9vc2UgdG8gdXNlIHRoZSBmaWx0ZXJzIHRoYXQgeW91IGRpZCB3aXRoIHRoZXNlIGRhdGE/KioKVGhlIGZpbHRlciB0aHJlc2hvbGQgd2FzIHNlbGVjdGVkIHRvIHByZXZlbnQgbG93LXF1YWxpdHkgU05QcyB3aGVyZSBzaWduaWZpY2FudCBtaXNzaW5nIGRhdGEgY2FuIG1pc2xlYWQgdGhlIHJlc3VsdHMgYW5kIGludGVycHJldGF0aW9ucy4KCioqV2hhdCBhcmUgd2UgdHJ5aW5nIHRvIG1pdGlnYXRlIGJ5IHVzaW5nIHRoZXNlIGZpbHRlcnM/KioKVGhlIDgwJSBmaWx0ZXIgdGhyZXNob2xkIHJlbW92ZSBhbnkgaW5kaXZpZHVhbCB0aGF0IGRvZXMgbm90IGhhdmUgODAlIG9mIGRhdGEsIGNyZWF0aW5nIGhpZ2ggcXVhbGl0eSBvZiBpbmRpdmlkdWFscyBkYXRhLiBUaGUgbW9ub21vcnBoIGZpbHRlciBzZWVtcyB0byByZW1vdmUgU05QcyB3aXRoIG5vIHZhcmlhbnRzLCB3aGljaCBjb3VsZCBiZSBpZGVhbCB0byB1bmRlcnN0YW5kIG9ubHkgdGhvc2UgaW5kaXZpZHVhbHMgdGhhdCBjb250cmlidXRlIHRvIGdlbmV0aWMgZGl2ZXJzaXR5LgoKYGBge3IsIGxhYmUgPSBRMn0KIzEuIHJldGFpbiBpbmRpdmlkdWFscyB3aXRoIGVub3VnaCBkYXRhLiBzZXQgdGhyZXNob2xkIGF0IDgwJS4KZ2VubGlnaHRfZmlsdGVyZWQgPC0gZ2wuZmlsdGVyLmNhbGxyYXRlKGdlbmxpZ2h0X29iaiwgdGhyZXNob2xkID0gMC44KQpnZW5saWdodF9maWx0ZXJlZCA8LSBnbC5maWx0ZXIubW9ub21vcnBocyhnZW5saWdodF9maWx0ZXJlZCkKIzIuIENvdW50IHJldGFpbiBTTlBzCm51bV9zbnBzX3JldGFpbmVkIDwtIG5Mb2MoZ2VubGlnaHRfZmlsdGVyZWQpCnByaW50KHBhc3RlKCIjIG9mIFNOUHMgcmV0YWluZWQgYWZ0ZXJlZCBmaWx0ZXJlczoiLCBudW1fc25wc19yZXRhaW5lZCkpCmBgYAojIyMgUTMKKipBcmUgdGhlcmUgYW55IGluZGl2aWR1YWxzIHRoYXQgc2VlbSB0byBoYXZlIGVsZXZhdGVkIGhldGVyb3p5Z29zaXR5IGluIHRoZSBzYW1wbGVkIHBvcHVsYXRpb24/IFBsZWFzZSBwcm92aWRlIGEgcGxvdCB0aGF0IGRlbW9uc3RyYXRlcyB0aGlzLioqCkF0IGxlYXN0IHRocmVlIGluZGl2aWR1YWxzIGhhdmUgZWxldmF0ZWQgaGV0ZXJvenlnb3NpdHkgb24gdGhlIGRhdGEgZnJhbWUuCgoqKldoeSBtaWdodCBhbiBpbmRpdmlkdWFsIHdpdGggZWxldmF0ZWQgaGV0ZXJvenlnb3NpdHkgYmUgY29uY2VybmluZz8qKgpVbnVzdWFsIGVsZXZhdGVkIGhldGVyb3p5Z29zaXR5IG1pZ2h0IGJlIGR1ZSB0byBjb250YW1pbmFudHMsIGV4dGVybmFsIGdlbmV0aWMgaW5mbHVlbmNlcyBhbmQvb3IgYmlhc2VzIG9uIHRoZSBvdXRjb21lcyBpZiBvdCBhY2NvdW50ZWQgZm9yLgoKYGBge3IsIGxhYmVsID0gUTN9CiMxLiBXZSBjYWxjdWxhdGUgdGhlIGhldGVyb2dlbmVpdHkgKGhldCkgcGVyIGluZGl2aWR1YWxzCmhldF9kYXRhIDwtIGdsLnJlcG9ydC5oZXRlcm96eWdvc2l0eShnZW5saWdodF9vYmopCgojMi4gd2UgY29udmVydCB0aGlzIGhldF9kYXRhIHRvIGRhdGEgZnJhbWUgCmhldF9kZiA8LSBhcy5kYXRhLmZyYW1lKGhldF9kYXRhKQpjb2xuYW1lcyhoZXRfZGYpIDwtIGMoIkluZGl2aWR1YWwiLCAiSGV0ZXJvenlnb3NpdHkiKQoKIzMuIFBsb3QgdGhlIGhldF9kZiAoaGV0ZXJvenlnb3NpdHkgZGF0YSBmcmFtZSkKZ2dwbG90KGhldF9kZiwgYWVzKHggPSBJbmRpdmlkdWFsLCB5ID0gSGV0ZXJvenlnb3NpdHkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBsYWJzKHRpdGxlID0gIkhldGVyb3p5Z29zaXR5IHBlciBJbmRpdmlkdWFsIiwKICAgICAgIHggPSAiSW5kaXZpZHVhbCIsCiAgICAgICB5ID0gIkhldGVyb3p5Z29zaXR5IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCgojNC4gdGFnIHRoZSBpbmRpdmlkdWFsIHdpdGggdW51c3VhbCBoZXRlcm96eWdvc2l0eQptZWFuX2hldCA8LSBtZWFuKGhldF9kZiRIZXRlcm96eWdvc2l0eSkKc2RfaGV0IDwtIHNkKGhldF9kZiRIZXRlcm96eWdvc2l0eSkKdGhyZXNob2xkIDwtIG1lYW5faGV0ICsgMiAqIHNkX2hldCAjc2V0cyB0aGUgdGhyZXNob2xkIHRvIGlkIHRoZSBlbGV2YXRlZCBoZXRlcm96eWdvc2l0eSBwZXIgaW5kaXZpZHVhbAoKY29sbmFtZXMoaGV0X2RmKQoKIzUuIGlkIGluZGl2aWR1YWwgd2l0aCBhYm92ZSB0aHJlc2hvbGQgaGV0ZXJvenlnb3NpdHkKZWxldmF0ZWRfaGV0IDwtIGhldF9kZiAlPiUKICBmaWx0ZXIoSGV0ZXJvenlnb3NpdHkgPiB0aHJlc2hvbGQpCnByaW50KCJpbmRpdmlkdWFsIHdpdGggZWxldmF0ZWQgaGV0ZXJvenlnb3N5IikKcHJpbnQoZWxldmF0ZWRfaGV0KQpgYGAKIyMjIFE0CioqSG93IGRpdmVyc2UgaXMgdGhlIHNhbXBsZWQgcG9wdWxhdGlvbj8gUGxlYXNlIHByb3ZpZGUgYW4gZXN0aW1hdGUgb2YgZ2VuZXRpYyBkaXZlcnNpdHkgYW5kIGEgYnJpZWYgZXhwbGFuYXRpb24gb2YgdGhlIG1lYXN1cmUgb2YgZGl2ZXJzaXR5IHRoYXQgeW91IGNob3NlIHRvIHVzZS4qKgpUaGUgZXhwZWN0ZWQgaGV0ZXJvenlnb3NpdHkgYXZlcmFnZSBpcyAwLjEzNy4gCgoqKldvdWxkIHlvdSBtYWtlIGEgbWFuYWdlbWVudCByZWNvbW1lbmRhdGlvbiBiYXNlZCBzb2xlbHkgb24gdGhpcyBkaXZlcnNpdHkgZXN0aW1hdGU/KioKVGhlIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBnZW5ldGljIGRpdmVyc2l0eSBtaWdodCBub3QgYmUgZW5vdWdoIHRvIG1ha2UgbWFuYWdlbWVudCBkZWNpc2lvbiwgYnV0IGl0IGlzIGEgZ29vZCBiYXNlIGxpbmUgdG8gbWFrZSBkZWNpc2lvbiBvbiB3aGF0IGtpbmQgb2YgZGF0YSB0byBjb2xsZWN0LgoKKipXaHkgb3Igd2h5IG5vdD8gSWYgbm90LCB3aGF0IGZ1cnRoZXIgaW5mb3JtYXRpb24gd291bGQgeW91IHdhbnQgYmVmb3JlIG1ha2luZyBhIHJlY29tbWVuZGF0aW9uPyoqCldlIHNob3VsZCBrbm93IG1vcmUgYWJvdXQgdGhlIHBvcHVsYXRpb24gc2l6ZSwgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcG9wdWxhdGlvbiBhbmQgZW52aXJvbm1lbnRhbCBmYWN0b3JzLiBUaG9zZSB0aHJlYXRzIGFuZCBwcmVzc3VyZXMgd291bGQgZGVmaW5lIHRoZSAKCmBgYHtyLCBsYWJlbCA9IFE0fQojMS4gR2VuZXRpYyBkaXZlcnNpdHkgY2FsY3VsYXRpb24uIEhvID0gb2JzZXJ2ZWQgaGV0ZXJvenlnb3NpdHksIHdoaWNoIGlzIHRoZSBwcm9wb3J0aW9uIG9mIG1lYXN1cmUgZ2VuZXRpYyBkaXZlcnNpdHkuCmdlbmV0aWNfZGl2ZXJzaXR5IDwtIGdsLmJhc2ljLnN0YXRzKGdlbmxpZ2h0X29iaikkSG8KI3ByaW50KGdlbmV0aWNfZGl2ZXJzaXR5KQoKIzIuIEFsdGVybmF0aXZlIGV4cGVjdGVkIGhldCBjYWxjdWxhdGlvbi4gSGUgPSBleHBlY3RlZCBoZXRlcm96eWdvc2l0eSBpcyB3aGF0IGlzIGV4cGVjdGVkIHVuZGVyIHRoZSBIYXJkeS1XZWluYmVyZy4KZXhwZWN0ZWRfaGV0IDwtIG1lYW4oZ2wuYmFzaWMuc3RhdHMoZ2VubGlnaHRfb2JqKSRIcywgbmEucm0gPSBUUlVFKQpwcmludChwYXN0ZSgiZXhwZWN0ZWQgaGV0ZXJvenlzb3NpdHkgKGhldCk6Iiwgcm91bmQoZXhwZWN0ZWRfaGV0LCA0KSkpCgojMy4gdHJ5IHRvIHZpc3VhbGl6ZSB0aGUgZGF0YSBhcyBkYXRhIGZyYW1lLgpkaXZlcnNpdHlfZGYgPC0gZGF0YS5mcmFtZShIZXRlcm96eWdvc2l0eSA9IGdlbmV0aWNfZGl2ZXJzaXR5KQpnZ3Bsb3QoZGl2ZXJzaXR5X2RmLCBhZXMoeCA9IEhldGVyb3p5Z29zaXR5KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wNSwgZmlsbCA9ICJzdGVlbGJsdWUiLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBHZW5ldGljIERpdmVyc2l0eSAoT2J2LiBIZXQpIiwKICAgICAgIHggPSAiSGV0ZXJvenlnb3NpdHkiLAogICAgICAgeSA9ICJGcmVxdWVuY3kiKQpgYGAKIyMgUTU6CioqQXJlIHRoZSBtYWpvcml0eSBvZiBsb2NpIGluIHRoaXMgcG9wdWxhdGlvbiBpbiBIYXJkeS1XZWluYmVyZyBlcXVpbGlicml1bSAoSFdFKSBvdmVyYWxsPyoqClRoZSBtYWpvcml0eSBvZiB0aGUgbG9jaSB0ZXN0ZWQgYXJlIGRpc3RhbCBvZiB0aGUgSFdFLiBJdCBjb3VsZCBiZSBhIGlzc3VlIGluIHRoZSBkYXRhIG9yIGZyb20gdGhlIGZpbHRlciBmdW5jdGlvbiBvZiBwLXZhbHVlIDAuMDUuIFRoZSBmaWx0ZXIgZnVuY3Rpb24gd2FzIHNldCB3aXRoIGNvbHVubSAiUHJvYiIgZm9yIHAtdmFsdWUuCgoqKklmIG5vdCwgaG93IGRvIHlvdSBpbnRlcnByZXQgaXRzIGRlcGFydHVyZSBmcm9tIEhXRT8gV2hhdCBjb3VsZCB0aGlzIG1lYW4gYWJvdXQgdGhlIHBvcHVsYXRpb24gb3Igc2FtcGxpbmcgc2NoZW1lPyoqCklmIGl0IGlzIGFjdHVhbGx5IGFuIG91dGNvbWUgb2YgdGhlIGRhdGFzZXQsIHdlIGNhbiBjb25zaWRlciB0aGUgcG9wdWxhdGlvbiB0byBiZSBoaWdobHkgaW5icmVlZGluZyBhbmQgcGVyaGFwcyB0aGUgcG9wdWxhdGlvbiBzaXplIGRlY2xpbmUuIFRoZSBlbnZpcm9ubWVudGFsIHN0cnVjdHVyZSBmYWN0b3JzIGluIGZvciB0aGUgbGFjayBvZiBoZXRlcm96eWdvc2l0eS4gCk9uIHRoZSBvdGhlciBoYW5kLCBzYW1wbGluZyByYW5kb21pemF0aW9uIGNvdWxkIGluZmx1ZW5jZSBpbiB0aGUgb3V0Y29tZSBpZiB0aGUgYmlvaW5mb3JtYXRpY3MgYXJlIHByb2Nlc3MgY2FyZWZ1bGx5LiBCb3RoIGFyZSBwb3NzaWJpbGl0aWVzIGZvciB0aGUgZGlzdGFsIGZyb20gSFdFLgpgYGB7ciwgbGFiZWwgPSBRNX0KIzEuIHRlc3QgZm9yIHRoZSBoYXJkeS1XZWluYmVyZyBlcXVpbGlicml1bS4gSXQgaXMgYSByZXN1bHQgZm9yIGVhY2ggbG9jaSBpbiB0aGUgcG9wdWxhdGlvbiB3aXRoIGEgZGVmYXVsdCBwLXZhbHVlIG9mIDAuMDUuIApod2VfcmVzdWx0cyA8LSBnbC5yZXBvcnQuaHdlKGdlbmxpZ2h0X29iaikKCiMyLiB3ZSBjb3VudCBmb3IgdGhlIG51bWJlciBvZiBsb2NpIGRpc3RhbCBmcm9tIGhhcmR5LXdlaWdoYnJpZGdlIApod2VfZGV2aWF0aW9uIDwtIGh3ZV9yZXN1bHRzICU+JQogIGZpbHRlcihQcm9iIDwgMC4wNSkKCiMzLiBDb3VudGluZyB0aGUgbnVtYmVyIG9mIEhXRSBwZXIgbG9jaSB0aGF0IGFyZSBkaXN0YWwgCm51bV90b3RhbF9sb2NpIDwtIG5yb3coaHdlX3Jlc3VsdHMpCm51bV9od2VfbG9jaSA8LSBucm93KGh3ZV9kZXZpYXRpb24pCm51bV9pbl9od2UgPC0gbnVtX3RvdGFsX2xvY2kgLSBudW1faHdlX2xvY2kKCnByaW50KHBhc3RlKCJ0b3RhbCBsb2NpIHRlc3RlZDoiLCBudW1fdG90YWxfbG9jaSkpCnByaW50KHBhc3RlKCJsb2NpIGluIEhXRToiLCBudW1faW5faHdlKSkKcHJpbnQocGFzdGUoImxvY2kgZGlzdGFsIGZyb20gSFdFOiIsIG51bV9od2VfbG9jaSkpCmBgYAojIyBRNjoKKipQbGVhc2UgcHJvdmlkZSBhIFBDQSBwbG90IHZpc3VhbGl6aW5nIHRoZSBnZW5ldGljIHJlbGF0ZWRuZXNzIGFtb25nIGluZGl2aWR1YWxzLiBXaGF0IHN0YW5kcyBvdXQgdG8geW91IGluIHRoaXMgdmlzdWFsaXphdGlvbj8qKgpXZSBoYXZlIHRocmVlIGNsZWFyIGNsdXN0ZXJzLCB0d28gb2YgdGhlIHRocmVlIG1vcmUgcGFja2VkLCB3aGlsZSB0aGUgdGhpcmQgaGFzIHNvbWUgZGV2aWF0aW9uLiBUaGUgdHdvIG1vcmUgcGFja2VkIHN1Z2dlc3RlZCBnZW5ldGljIHNpbWlsYXJpdHkgYW5kIHBlcmhhcHMgaXQgY29tZXMgZnJvbSB0aGUgc2FtZSBlY29zeXN0ZW0uIEFsc28sIGl0IGNvdWQgc3VnZ2VzdCBzaGFyZWQgYW5jZXN0cnkuCgpUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3V0bGluZXMgdGhhdCBtaWdodCBoYXZlIHNvbWUgaW50ZXJlc3RpbmcgZ2VuZXRpYyBkaXZlcnNpdHkgb3IgZnJhZ21lbnRlZCBieSBwaGlzaWNhbCB2YXJyaWVzIHdpdGggbGl0dGxlIG1pZ3JhdGlvbiBvcHBvcnR1bml0aWVzLiAKCmBgYHtyLCBsYWJlbCA9IFE2fQojbG9hZGluZyBhZGRpdGlvbmFsIGxpYnJhcnkgCmxpYnJhcnkoZ2dwbG90MikKCiMxLiBQcmluY2lwYWwgY29vcmRpbmF0ZXMgYW5hbHlzaXMgKFBDQSkKIyBQQ0Egc3VtbWFyeSB0aGUgZ2VuZXRpYyB2YXJpYXRpb24gYW1vbmcgaW5kaXZpZHVhbHMKcGNhX3Jlc3VsdCA8LSBnbC5wY29hKGdlbmxpZ2h0X29iaikKCiMyLiBwbG90dGluZyBQQ0EgZnJvbSB0aGUgZXh0cmFjdCBhbmQgcHJlcGFyZWQgZGF0YSAKcGNhX2RmIDwtIGFzLmRhdGEuZnJhbWUocGNhX3Jlc3VsdCRzY29yZXMpICNjb3ZlcnNlIHRoZSBQQ0Egc2NvcmVzIHRvIGRhdGEgZnJhbWVzIHdpdGggZWFjaCByb3cgZm9yIGVhY2ggaW5kaXZpZHVhbApjb2xuYW1lcyhwY2FfZGYpIDwtIGMoIlBDMSIsICJQQzIiKSAjcmVuYW1lIGNvbHVtbnMgZm9yIGVhc3kgcGxvdHRpbmcgKFByaW5jaXBhbCBDb21wb25lbnQpCnBjYV9kZiRJbmRpdmlkdWFsIDwtIHJvd25hbWVzKHBjYV9kZikgI2FkZGVkIGluZGl2aWR1YWwgaWRlbnRpZmllcnMgCgojMy4gcGxvdHRpbmcgdGhlIGdlbmV0aWMgcmVsYXRlZG5lc3MgYW1vbmcgaW5kaXZpZHVhbHMKZ2dwbG90KHBjYV9kZiwgYWVzKHggPSBQQzEsIHkgPSBQQzIsIGxhYmVsID0gSW5kaXZpZHVhbCkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiLCBzaXplID0gMykgKwogICNnZW9tX3RleHQodmp1c3QgPSAtMC41LCBoanVzdCA9IDAuNSwgc2l6ZSA9IDMpICsKICBsYWJzKHRpdGxlID0gIlBDQSBvZiBnZW5ldGljIHJlbGF0ZWRuZXNzIGFtb25nIGluZGl2aWR1YWxzIiwKICAgICAgIHggPSAiUEMxIiwKICAgICAgIHkgPSAiUEMyIikKYGBgCiMjIFE3OgpXaGF0IGFkZGl0aW9uYWwgcXVlc3Rpb24ocykgZG8geW91IGhhdmUgYWJvdXQgdGhpcyBkYXRhc2V0IHRoYXQgd291bGQgYWlkIGluIHlvdXIgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgZGF0YT8KWWVzOiBoZXJlIGFyZSB0aHJlZSB0aGF0IGNvbWUgdG8gbWluZDogKHRoZXkgbWlnaHQgYmUgaW5jb3JyZWN0IG9yIG91dCBvZiB0aGUgc2NvZXBlKQoxLiAgSXMgdGhlcmUgZXZpZGVuY2Ugb2YgcG9wdWxhdGlvbiBzdHJ1Y3R1cmUgd2l0aGluIHRoZSBkYXRhc2V0PwprLW1lYW4gY2x1c3RlciBhc3NpZ21lbnQgdGVzdCBzdWdnZXN0cyBwb3B1bGF0aW9uIHN0cnVjdHVyaW5nIHdpdGggdGhlIGF2YWlsYWJsZSBkYXRhLgoKMi4gSG93IGRvZXMgaW5icmVlZGluZyBhZmZlY3QgdGhlIGdlbmV0aWMgZGl2ZXJzaXR5IG9ic2VydmVkIGluIHRoaXMgcG9wdWxhdGlvbj8KVGhpcyBhbmFseXNpcyBjb3VsZCBoZWxwIHRvIHVuZGVyc3RhbmQgdGhlIGNsdXN0ZXJpbmcgb2YgdGhlIGluZGl2aWR1YWxzIHRoYXQgaGFzIGJlZW4gcHJlc2VudGVkIG9uIHByZXZpb3VzIHF1ZXN0aW9uIGFuc3dlci4KYGBge3IsIGxhYmVsID0gUTd9CiMxLiBVc2UgdGhlIHBjYV9kZiBmcm9tIHF1ZXN0aW9uIDYuIFRoZSBrLW1lYW4gY2x1c3RlcmVkIGJhc2VkIG9uIGsgPSAyCmttZWFuX3Jlc3VsdCA8LSBrbWVhbnMocGNhX2RmWywgYygiUEMxIiwgIlBDMiIpXSwgY2VudGVycyA9IDIpCgojIGNsdXN0ZXIgYWRkZWQgdG8gZGF0ZSBmcmFtZQpwY2FfZGYkQ2x1c3RlciA8LSBhcy5mYWN0b3Ioa21lYW5fcmVzdWx0JGNsdXN0ZXIpCgojIHBsb3QgdGhlIHBjYV9kZiBhc3NpZ25lZCB0byBjbHVzdGVyCmdncGxvdChwY2FfZGYsIGFlcyh4ID0gUEMxLCB5ID0gUEMyLCBjb2xvciA9IENsdXN0ZXIpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGxhYnModGl0bGUgPSAiSy1tZWFuIGNsdXN0ZXIgZnJvbSBQQ0EiLAogICAgICAgeCA9ICJQQzEiLAogICAgICAgeSA9ICJQQzIiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojMi4gaW5icmVlZGluZyBjb2VmZmljaWVudCAoRmlzKQpvYnNfaGV0IDwtIGdsLmJhc2ljLnN0YXRzKGdlbmxpZ2h0X29iaikkSG8KZXhwdF9oZXQgPC0gZ2wuYmFzaWMuc3RhdHMoZ2VubGlnaHRfb2JqKSRIcwpmaXNfdmFsdWVzIDwtIDEgLSAob2JzX2hldCAvIGV4cHRfaGV0KQoKI3JlcGxhY2UgTmFOIHZhbHVlcyAoZGl2aWRlZCBieSB6ZXJvKSB3aXRoIE5BIGZvciBjbGFyaXR5IApmaXNfdmFsdWVzW2lzLm5hbihmaXNfdmFsdWVzKV0gPC0gTkEKI2xlbmd0aChmaXNfdmFsdWVzKQojaGVhZChmaXNfdmFsdWVzKQojbmFtZXMoZmlzX3ZhbHVlcykgPC0gbmFtZXMob2JzX2hldCkKI25hbWVzKGZpc192YWx1ZXMpIDwtIG5hbWVzKGV4cHRfaGV0KQojIGNyZWF0ZSB0aGUgZGF0ZSBmcmFtZSBmb3IgYW5hbHlzaXMgCmZpc192YWx1ZXMgPC0gYXMudmVjdG9yKGZpc192YWx1ZXMpCm5hbWVzKGZpc192YWx1ZXMpIDwtIG5hbWVzKG9ic19oZXQpCmZpc19kZiA8LSBkYXRhLmZyYW1lKExvY3VzID0gbmFtZXMoZmlzX3ZhbHVlcyksIEZpcyA9IGZpc192YWx1ZXMpCmhlYWQoZmlzX2RmKQpgYGAKCgo=