Climate scientists have measured the concentration of carbon dioxide (CO2) in the Earth’s atmosphere dating back thousands of years. In this project, we will investigate two datasets containing information about the carbon dioxide levels in the atmosphere. We will specifically look at the increase in carbon dioxide levels over the past hundred years relative to the variability in levels of CO2 in the atmosphere over eight millennia.

These data are calculated by analyzing ice cores. Over time, gas gets trapped in the ice of Antarctica. Scientists can take samples of that ice and see how much carbon is in it. The deeper you go into the ice, the farther back in time you can analyze!

1.The first dataset comes from World Data Center for Paleoclimatology, Boulder and NOAA Paleoclimatology Program and describes the carbon dioxide levels back thousands of years “Before Present” (BP) or before January 1, 1950.

2.The second dataset explores carbon dioxide starting at year zero up until the recent year of 2014. This dataset was compiled by the Institute for Atmospheric and Climate Science (IAC) at Eidgenössische Technische Hochschule in Zürich, Switzerland.

In order to understand the information in these datasets, it’s important to understand two key facts about the data:

The metric for carbon dioxide level is measured as parts per million or CO2 ppmv. This number describes the number of carbon dioxide molecules per one million gas molecules in our atmosphere.

The second metric describes years before present, which is “a time scale used mainly in … scientific disciplines to specify when events occurred in the past… standard practice is to use 1 January 1950 as the commencement date of the age scale, reflecting the origin of practical radiocarbon dating in the 1950s. The abbreviation “BP” has alternatively been interpreted as “Before Physics” that is, before nuclear weapons testing artificially altered the proportion of the carbon isotopes in the atmosphere, making dating after that time likely to be unreliable.” This means that saying “the year 20 BP” would be the equivalent of saying “The year 1930.”

1.Carbon Dioxide over Time Line Graph

# load libraries and data
library(readr)
library(dplyr)
library(ggplot2)

1.Let’s first explore the dataset containing the data from the World Data Center for Paleoclimatology, Boulder and NOAA Paleoclimatology Program. Import the “carbon_dioxide_levels.csv” and save it to a new variable named noaa_data.

noaa_data <- read_csv("carbon_dioxide_levels.csv")
noaa_data

2.Inspect the head of the data frame. What are the names of the two columns? What types of values are in each?

head(noaa_data)

3.Let’s visualize this data. First, create a new variable named noaa_viz that is equal to a new ggplot() object and assign noaa_data as its data argument. Be sure to state the name of the variable after you define it so that it is rendered to the R notebook.

options(scipen=10000) #removes scientific notation
#Create NOAA Visualization here:
noaa_viz <- ggplot(noaa_data)
noaa_viz

4.Define your scales by creating an aesthetic mapping that maps Age_yrBP on the x-axis and CO2_ppmv on the y-axis as part of the canvas.

noaa_viz <- ggplot(noaa_data, aes(x = Age_yrBP, y = CO2_ppmv))
noaa_viz

5.In climate science, it’s common to create line graphs to best portray the fluctuations in the levels of carbon dioxide. Add a geom_line() layer to the noaa_viz plot.


noaa_viz <- ggplot(noaa_data, aes(x = Age_yrBP, y = CO2_ppmv)) + geom_line()
noaa_viz

6.Let’s add context to the plot and improve its legibility. Title the plot “Carbon Dioxide Levels From 8,000 to 136 Years BP” and add a subtitle that cites the data “From World Data Center for Paleoclimatology and NOAA Paleoclimatology Program”.

noaa_viz <- ggplot(noaa_data, aes(x = Age_yrBP, y = CO2_ppmv)) + geom_line() + labs(title =  "Carbon Dioxide Levels From 8,000 to 136 Years BP", subtitle =  "From World Data Center for Paleoclimatology and NOAA Paleoclimatology Program")

noaa_viz

7.Tweak the axis labels so they are more descriptive than the column headers. The x-axis should read “Years Before Today (0=1950)” and the y-axis should read “Carbon Dioxide Level (Parts Per Million)”

noaa_viz <- ggplot(noaa_data, aes(x = Age_yrBP, y = CO2_ppmv)) + geom_line() + labs(title =  "Carbon Dioxide Levels From 8,000 to 136 Years BP", subtitle =  "From World Data Center for Paleoclimatology and NOAA Paleoclimatology Program", x = "Years Before Today (0=1950)", y = "Carbon Dioxide Level (Parts Per Million)")

noaa_viz

8.Currently, the order of the years is counterintuitive. Since the most recent date is the date closest to 0, or 1950 as Before Physics is described, we want the years on the x-axis arranged in descending order. Add this to noaa_viz:

noaa_viz + scale_x_reverse(lim=c(800000,0)) 

noaa_viz <- noaa_viz + scale_x_reverse(lim=c(800000,0)) 

noaa_viz

2.Carbon Dioxide Levels in the last Two Millennia

9.In the second code block, let’s explore the second dataset containing the data for the last 2014 years. Import the “yearly_co2.csv” file and save it to a new variable named iac_data.

#Create IAC Visualization
iac_data <- read_csv( "yearly_co2.csv")
iac_data

10.Inspect the head. What are the names of the four columns? What types of values are in each? Note that the data_mean_global is an equivalent metric to CO2_ppmv. We will not be using the other two columns in this project. What’s different about the year column in this dataset?

head(iac_data)

11.Again, let’s create a new ggplot() object named iac_viz and associate iac_data as its data argument. Let’s make a new variable named iac_viz. Be sure to state the name of the variable after you define it so that it is rendered to the R notebook.

iac_viz <- ggplot(iac_data)
iac_viz

12.Define your scales by creating an aesthetic mapping that maps year on the x-axis and data_mean_global on the y-axis as part of the canvas.

Note: The dataset column headers are different than the ones in the previous data frame. Years are chornological starting from 0 up to 2014, not in terms of BP. The data_mean_global references the same metric as C02_ppmv for carbon dioxide average parts per million in the earth’s atmosphere.

iac_viz <- ggplot(iac_data, aes(x = year, y = data_mean_global))
iac_viz

13.A line graph also makes sense for these data. Let’s explore how much carbon dioxide was stored in the atmosphere over the past two millennia by adding a geom_line() layer to the iac_viz plot.

iac_viz <- iac_viz + geom_line()
iac_viz

14.This plot still needs labels to add context to the plot. Title the plot “Carbon Dioxide Levels over Time” and add a subtitle that cites the data “From Institute for Atmospheric and Climate Science (IAC).”

iac_viz <- iac_viz + labs(title = "Carbon Dioxide Levels over Time", subtitle = "From Institute for Atmospheric and Climate Science (IAC).")
iac_viz

15.Tweak the axis labels so they are more descriptive than the column headers. The x-axis should read “Year” and the y-axis should read “Carbon Dioxide Level (Parts Per Million)”

iac_viz <- iac_viz + labs(x = "year", y = "Carbon Dioxide Level (Parts Per Million)")
iac_viz

16.Let’s highlight the rise in carbon dioxide levels by adding a horizontal line that represents the maximum level in the first chart spanning over 8,000 years of carbon dioxide data. On a new line of code in the block, create a new variable named millennia_max and retrieve the maximum value of the CO2_ppmv column in the noaa_data. Print the value so you can see what it is.

millennia_max <- max(noaa_data$CO2_ppmv, na.rm = TRUE)

millennia_max
[1] 298.6

17.Now that we have the maximum number in the noaa_data let’s map it on our iac_data plot. There’s a geom in ggolot called geom_hline() that plots a horizontal line. Add a geom_hline() layer to iac_viz that has a yintercept value in its aesthetic mapping of millennia_max.

iac_viz <- iac_viz + geom_hline(yintercept = millennia_max)

iac_viz

18.Add one more argument to the horizontal line’s aesthetic mapping so that the legend can display information about what the line represents. Assign the value of the linetype argument as “Historical CO2 Peak before 1950”

What do you notice has happened in the last 100 years relative to the last 8 millennia?

iac_viz <- iac_viz + geom_hline(aes(yintercept = millennia_max, linetype = "Historical CO2 Peak before 1950")) 

iac_viz

19.Add color

iac_viz <- iac_viz + geom_hline(aes(yintercept = millennia_max, linetype = "Historical CO2 Peak before 1950", color = "Historical CO2 Peak before 1950"))  

iac_viz

20.Change color

iac_viz <- iac_viz  + scale_color_manual(values = c("Historical CO2 Peak before 1950" = "blue")) 
iac_viz

LS0tDQp0aXRsZTogIlZpc3VhbGl6aW5nIENhcmJvbiBEaW94aWRlIExldmVscyINCmF1dGhvcjogIkFubmFiZWwgS3VvIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJVktJW0tJWQgJUg6JU0nKWAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpDbGltYXRlIHNjaWVudGlzdHMgaGF2ZSBtZWFzdXJlZCB0aGUgY29uY2VudHJhdGlvbiBvZiBjYXJib24gZGlveGlkZSAoQ08yKSBpbiB0aGUgRWFydGjigJlzIGF0bW9zcGhlcmUgZGF0aW5nIGJhY2sgdGhvdXNhbmRzIG9mIHllYXJzLiBJbiB0aGlzIHByb2plY3QsIHdlIHdpbGwgaW52ZXN0aWdhdGUgdHdvIGRhdGFzZXRzIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmJvbiBkaW94aWRlIGxldmVscyBpbiB0aGUgYXRtb3NwaGVyZS4gV2Ugd2lsbCBzcGVjaWZpY2FsbHkgbG9vayBhdCB0aGUgaW5jcmVhc2UgaW4gY2FyYm9uIGRpb3hpZGUgbGV2ZWxzIG92ZXIgdGhlIHBhc3QgaHVuZHJlZCB5ZWFycyByZWxhdGl2ZSB0byB0aGUgdmFyaWFiaWxpdHkgaW4gbGV2ZWxzIG9mIENPMiBpbiB0aGUgYXRtb3NwaGVyZSBvdmVyIGVpZ2h0IG1pbGxlbm5pYS4NCg0KVGhlc2UgZGF0YSBhcmUgY2FsY3VsYXRlZCBieSBhbmFseXppbmcgaWNlIGNvcmVzLiBPdmVyIHRpbWUsIGdhcyBnZXRzIHRyYXBwZWQgaW4gdGhlIGljZSBvZiBBbnRhcmN0aWNhLiBTY2llbnRpc3RzIGNhbiB0YWtlIHNhbXBsZXMgb2YgdGhhdCBpY2UgYW5kIHNlZSBob3cgbXVjaCBjYXJib24gaXMgaW4gaXQuIFRoZSBkZWVwZXIgeW91IGdvIGludG8gdGhlIGljZSwgdGhlIGZhcnRoZXIgYmFjayBpbiB0aW1lIHlvdSBjYW4gYW5hbHl6ZSENCg0KMS5UaGUgZmlyc3QgZGF0YXNldCBjb21lcyBmcm9tIFdvcmxkIERhdGEgQ2VudGVyIGZvciBQYWxlb2NsaW1hdG9sb2d5LCBCb3VsZGVyIGFuZCBOT0FBIFBhbGVvY2xpbWF0b2xvZ3kgUHJvZ3JhbSBhbmQgZGVzY3JpYmVzIHRoZSBjYXJib24gZGlveGlkZSBsZXZlbHMgYmFjayB0aG91c2FuZHMgb2YgeWVhcnMg4oCcQmVmb3JlIFByZXNlbnTigJ0gKEJQKSBvciBiZWZvcmUgSmFudWFyeSAxLCAxOTUwLg0KDQoyLlRoZSBzZWNvbmQgZGF0YXNldCBleHBsb3JlcyBjYXJib24gZGlveGlkZSBzdGFydGluZyBhdCB5ZWFyIHplcm8gdXAgdW50aWwgdGhlIHJlY2VudCB5ZWFyIG9mIDIwMTQuIFRoaXMgZGF0YXNldCB3YXMgY29tcGlsZWQgYnkgdGhlIEluc3RpdHV0ZSBmb3IgQXRtb3NwaGVyaWMgYW5kIENsaW1hdGUgU2NpZW5jZSAoSUFDKSBhdCBFaWRnZW7DtnNzaXNjaGUgVGVjaG5pc2NoZSBIb2Noc2NodWxlIGluIFrDvHJpY2gsIFN3aXR6ZXJsYW5kLg0KDQpJbiBvcmRlciB0byB1bmRlcnN0YW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBkYXRhc2V0cywgaXTigJlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHR3byBrZXkgZmFjdHMgYWJvdXQgdGhlIGRhdGE6DQoNClRoZSBtZXRyaWMgZm9yIGNhcmJvbiBkaW94aWRlIGxldmVsIGlzIG1lYXN1cmVkIGFzIHBhcnRzIHBlciBtaWxsaW9uIG9yIENPMiBwcG12LiBUaGlzIG51bWJlciBkZXNjcmliZXMgdGhlIG51bWJlciBvZiBjYXJib24gZGlveGlkZSBtb2xlY3VsZXMgcGVyIG9uZSBtaWxsaW9uIGdhcyBtb2xlY3VsZXMgaW4gb3VyIGF0bW9zcGhlcmUuDQoNClRoZSBzZWNvbmQgbWV0cmljIGRlc2NyaWJlcyB5ZWFycyBiZWZvcmUgcHJlc2VudCwgd2hpY2ggaXMg4oCcYSB0aW1lIHNjYWxlIHVzZWQgbWFpbmx5IGluIOKApiBzY2llbnRpZmljIGRpc2NpcGxpbmVzIHRvIHNwZWNpZnkgd2hlbiBldmVudHMgb2NjdXJyZWQgaW4gdGhlIHBhc3TigKYgc3RhbmRhcmQgcHJhY3RpY2UgaXMgdG8gdXNlIDEgSmFudWFyeSAxOTUwIGFzIHRoZSBjb21tZW5jZW1lbnQgZGF0ZSBvZiB0aGUgYWdlIHNjYWxlLCByZWZsZWN0aW5nIHRoZSBvcmlnaW4gb2YgcHJhY3RpY2FsIHJhZGlvY2FyYm9uIGRhdGluZyBpbiB0aGUgMTk1MHMuIFRoZSBhYmJyZXZpYXRpb24g4oCcQlDigJ0gaGFzIGFsdGVybmF0aXZlbHkgYmVlbiBpbnRlcnByZXRlZCBhcyDigJxCZWZvcmUgUGh5c2ljc+KAnSB0aGF0IGlzLCBiZWZvcmUgbnVjbGVhciB3ZWFwb25zIHRlc3RpbmcgYXJ0aWZpY2lhbGx5IGFsdGVyZWQgdGhlIHByb3BvcnRpb24gb2YgdGhlIGNhcmJvbiBpc290b3BlcyBpbiB0aGUgYXRtb3NwaGVyZSwgbWFraW5nIGRhdGluZyBhZnRlciB0aGF0IHRpbWUgbGlrZWx5IHRvIGJlIHVucmVsaWFibGUu4oCdIFRoaXMgbWVhbnMgdGhhdCBzYXlpbmcg4oCcdGhlIHllYXIgMjAgQlDigJ0gd291bGQgYmUgdGhlIGVxdWl2YWxlbnQgb2Ygc2F5aW5nIOKAnFRoZSB5ZWFyIDE5MzAu4oCdDQoNCiMgMS5DYXJib24gRGlveGlkZSBvdmVyIFRpbWUgTGluZSBHcmFwaA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPVRSVUV9DQojIGxvYWQgbGlicmFyaWVzIGFuZCBkYXRhDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQoxLkxldOKAmXMgZmlyc3QgZXhwbG9yZSB0aGUgZGF0YXNldCBjb250YWluaW5nIHRoZSBkYXRhIGZyb20gdGhlIFdvcmxkIERhdGEgQ2VudGVyIGZvciBQYWxlb2NsaW1hdG9sb2d5LCBCb3VsZGVyIGFuZCBOT0FBIFBhbGVvY2xpbWF0b2xvZ3kgUHJvZ3JhbS4gSW1wb3J0IHRoZSAiY2FyYm9uX2Rpb3hpZGVfbGV2ZWxzLmNzdiIgYW5kIHNhdmUgaXQgdG8gYSBuZXcgdmFyaWFibGUgbmFtZWQgbm9hYV9kYXRhLg0KDQpgYGB7Un0NCm5vYWFfZGF0YSA8LSByZWFkX2NzdigiY2FyYm9uX2Rpb3hpZGVfbGV2ZWxzLmNzdiIpDQpub2FhX2RhdGENCmBgYA0KDQoyLkluc3BlY3QgdGhlIGhlYWQgb2YgdGhlIGRhdGEgZnJhbWUuIFdoYXQgYXJlIHRoZSBuYW1lcyBvZiB0aGUgdHdvIGNvbHVtbnM/IFdoYXQgdHlwZXMgb2YgdmFsdWVzIGFyZSBpbiBlYWNoPw0KYGBge3J9DQpoZWFkKG5vYWFfZGF0YSkNCmBgYA0KDQozLkxldOKAmXMgdmlzdWFsaXplIHRoaXMgZGF0YS4gRmlyc3QsIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSBuYW1lZCBub2FhX3ZpeiB0aGF0IGlzIGVxdWFsIHRvIGEgbmV3IGdncGxvdCgpIG9iamVjdCBhbmQgYXNzaWduIG5vYWFfZGF0YSBhcyBpdHMgZGF0YSBhcmd1bWVudC4gQmUgc3VyZSB0byBzdGF0ZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgYWZ0ZXIgeW91IGRlZmluZSBpdCBzbyB0aGF0IGl0IGlzIHJlbmRlcmVkIHRvIHRoZSBSIG5vdGVib29rLg0KDQpgYGB7ciBlcnJvcj1UUlVFfQ0Kb3B0aW9ucyhzY2lwZW49MTAwMDApICNyZW1vdmVzIHNjaWVudGlmaWMgbm90YXRpb24NCiNDcmVhdGUgTk9BQSBWaXN1YWxpemF0aW9uIGhlcmU6DQpub2FhX3ZpeiA8LSBnZ3Bsb3Qobm9hYV9kYXRhKQ0Kbm9hYV92aXoNCmBgYA0KDQo0LkRlZmluZSB5b3VyIHNjYWxlcyBieSBjcmVhdGluZyBhbiBhZXN0aGV0aWMgbWFwcGluZyB0aGF0IG1hcHMgQWdlX3lyQlAgb24gdGhlIHgtYXhpcyBhbmQgQ08yX3BwbXYgb24gdGhlIHktYXhpcyBhcyBwYXJ0IG9mIHRoZSBjYW52YXMuDQoNCmBgYHtyfQ0Kbm9hYV92aXogPC0gZ2dwbG90KG5vYWFfZGF0YSwgYWVzKHggPSBBZ2VfeXJCUCwgeSA9IENPMl9wcG12KSkNCm5vYWFfdml6DQpgYGANCg0KNS5JbiBjbGltYXRlIHNjaWVuY2UsIGl04oCZcyBjb21tb24gdG8gY3JlYXRlIGxpbmUgZ3JhcGhzIHRvIGJlc3QgcG9ydHJheSB0aGUgZmx1Y3R1YXRpb25zIGluIHRoZSBsZXZlbHMgb2YgY2FyYm9uIGRpb3hpZGUuIEFkZCBhIGdlb21fbGluZSgpIGxheWVyIHRvIHRoZSBub2FhX3ZpeiBwbG90Lg0KDQpgYGB7cn0NCg0Kbm9hYV92aXogPC0gZ2dwbG90KG5vYWFfZGF0YSwgYWVzKHggPSBBZ2VfeXJCUCwgeSA9IENPMl9wcG12KSkgKyBnZW9tX2xpbmUoKQ0Kbm9hYV92aXoNCmBgYA0KDQo2LkxldOKAmXMgYWRkIGNvbnRleHQgdG8gdGhlIHBsb3QgYW5kIGltcHJvdmUgaXRzIGxlZ2liaWxpdHkuIFRpdGxlIHRoZSBwbG90ICJDYXJib24gRGlveGlkZSBMZXZlbHMgRnJvbSA4LDAwMCB0byAxMzYgWWVhcnMgQlAiIGFuZCBhZGQgYSBzdWJ0aXRsZSB0aGF0IGNpdGVzIHRoZSBkYXRhICJGcm9tIFdvcmxkIERhdGEgQ2VudGVyIGZvciBQYWxlb2NsaW1hdG9sb2d5IGFuZCBOT0FBIFBhbGVvY2xpbWF0b2xvZ3kgUHJvZ3JhbSIuDQoNCmBgYHtSfQ0Kbm9hYV92aXogPC0gZ2dwbG90KG5vYWFfZGF0YSwgYWVzKHggPSBBZ2VfeXJCUCwgeSA9IENPMl9wcG12KSkgKyBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAgIkNhcmJvbiBEaW94aWRlIExldmVscyBGcm9tIDgsMDAwIHRvIDEzNiBZZWFycyBCUCIsIHN1YnRpdGxlID0gICJGcm9tIFdvcmxkIERhdGEgQ2VudGVyIGZvciBQYWxlb2NsaW1hdG9sb2d5IGFuZCBOT0FBIFBhbGVvY2xpbWF0b2xvZ3kgUHJvZ3JhbSIpDQoNCm5vYWFfdml6DQpgYGANCg0KNy5Ud2VhayB0aGUgYXhpcyBsYWJlbHMgc28gdGhleSBhcmUgbW9yZSBkZXNjcmlwdGl2ZSB0aGFuIHRoZSBjb2x1bW4gaGVhZGVycy4gVGhlIHgtYXhpcyBzaG91bGQgcmVhZCAiWWVhcnMgQmVmb3JlIFRvZGF5ICgwPTE5NTApIiBhbmQgdGhlIHktYXhpcyBzaG91bGQgcmVhZCAiQ2FyYm9uIERpb3hpZGUgTGV2ZWwgKFBhcnRzIFBlciBNaWxsaW9uKSINCg0KYGBge1J9DQpub2FhX3ZpeiA8LSBnZ3Bsb3Qobm9hYV9kYXRhLCBhZXMoeCA9IEFnZV95ckJQLCB5ID0gQ08yX3BwbXYpKSArIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICAiQ2FyYm9uIERpb3hpZGUgTGV2ZWxzIEZyb20gOCwwMDAgdG8gMTM2IFllYXJzIEJQIiwgc3VidGl0bGUgPSAgIkZyb20gV29ybGQgRGF0YSBDZW50ZXIgZm9yIFBhbGVvY2xpbWF0b2xvZ3kgYW5kIE5PQUEgUGFsZW9jbGltYXRvbG9neSBQcm9ncmFtIiwgeCA9ICJZZWFycyBCZWZvcmUgVG9kYXkgKDA9MTk1MCkiLCB5ID0gIkNhcmJvbiBEaW94aWRlIExldmVsIChQYXJ0cyBQZXIgTWlsbGlvbikiKQ0KDQpub2FhX3Zpeg0KYGBgDQoNCjguQ3VycmVudGx5LCB0aGUgb3JkZXIgb2YgdGhlIHllYXJzIGlzIGNvdW50ZXJpbnR1aXRpdmUuIFNpbmNlIHRoZSBtb3N0IHJlY2VudCBkYXRlIGlzIHRoZSBkYXRlIGNsb3Nlc3QgdG8gMCwgb3IgMTk1MCBhcyBCZWZvcmUgUGh5c2ljcyBpcyBkZXNjcmliZWQsIHdlIHdhbnQgdGhlIHllYXJzIG9uIHRoZSB4LWF4aXMgYXJyYW5nZWQgaW4gZGVzY2VuZGluZyBvcmRlci4gQWRkIHRoaXMgdG8gbm9hYV92aXo6DQpgYGB7cn0NCm5vYWFfdml6ICsgc2NhbGVfeF9yZXZlcnNlKGxpbT1jKDgwMDAwMCwwKSkgDQoNCmBgYA0KYGBge1J9DQpub2FhX3ZpeiA8LSBub2FhX3ZpeiArIHNjYWxlX3hfcmV2ZXJzZShsaW09Yyg4MDAwMDAsMCkpIA0KDQpub2FhX3Zpeg0KYGBgDQoNCiMgMi5DYXJib24gRGlveGlkZSBMZXZlbHMgaW4gdGhlIGxhc3QgVHdvIE1pbGxlbm5pYQ0KDQo5LkluIHRoZSBzZWNvbmQgY29kZSBibG9jaywgbGV04oCZcyBleHBsb3JlIHRoZSBzZWNvbmQgZGF0YXNldCBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgbGFzdCAyMDE0IHllYXJzLiBJbXBvcnQgdGhlICJ5ZWFybHlfY28yLmNzdiIgZmlsZSBhbmQgc2F2ZSBpdCB0byBhIG5ldyB2YXJpYWJsZSBuYW1lZCBpYWNfZGF0YS4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRX0NCiNDcmVhdGUgSUFDIFZpc3VhbGl6YXRpb24NCmlhY19kYXRhIDwtIHJlYWRfY3N2KCAieWVhcmx5X2NvMi5jc3YiKQ0KaWFjX2RhdGENCmBgYA0KDQoxMC5JbnNwZWN0IHRoZSBoZWFkLiBXaGF0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZvdXIgY29sdW1ucz8gV2hhdCB0eXBlcyBvZiB2YWx1ZXMgYXJlIGluIGVhY2g/IE5vdGUgdGhhdCB0aGUgZGF0YV9tZWFuX2dsb2JhbCBpcyBhbiBlcXVpdmFsZW50IG1ldHJpYyB0byBDTzJfcHBtdi4gV2Ugd2lsbCBub3QgYmUgdXNpbmcgdGhlIG90aGVyIHR3byBjb2x1bW5zIGluIHRoaXMgcHJvamVjdC4gV2hhdOKAmXMgZGlmZmVyZW50IGFib3V0IHRoZSB5ZWFyIGNvbHVtbiBpbiB0aGlzIGRhdGFzZXQ/DQoNCmBgYHtyfQ0KaGVhZChpYWNfZGF0YSkNCmBgYA0KDQoxMS5BZ2FpbiwgbGV04oCZcyBjcmVhdGUgYSBuZXcgZ2dwbG90KCkgb2JqZWN0IG5hbWVkIGlhY192aXogYW5kIGFzc29jaWF0ZSBpYWNfZGF0YSBhcyBpdHMgZGF0YSBhcmd1bWVudC4gTGV04oCZcyBtYWtlIGEgbmV3IHZhcmlhYmxlIG5hbWVkIGlhY192aXouIEJlIHN1cmUgdG8gc3RhdGUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGFmdGVyIHlvdSBkZWZpbmUgaXQgc28gdGhhdCBpdCBpcyByZW5kZXJlZCB0byB0aGUgUiBub3RlYm9vay4NCg0KYGBge1J9DQppYWNfdml6IDwtIGdncGxvdChpYWNfZGF0YSkNCmlhY192aXoNCmBgYA0KDQoxMi5EZWZpbmUgeW91ciBzY2FsZXMgYnkgY3JlYXRpbmcgYW4gYWVzdGhldGljIG1hcHBpbmcgdGhhdCBtYXBzIHllYXIgb24gdGhlIHgtYXhpcyBhbmQgZGF0YV9tZWFuX2dsb2JhbCBvbiB0aGUgeS1heGlzIGFzIHBhcnQgb2YgdGhlIGNhbnZhcy4NCg0KTm90ZTogVGhlIGRhdGFzZXQgY29sdW1uIGhlYWRlcnMgYXJlIGRpZmZlcmVudCB0aGFuIHRoZSBvbmVzIGluIHRoZSBwcmV2aW91cyBkYXRhIGZyYW1lLiBZZWFycyBhcmUgY2hvcm5vbG9naWNhbCBzdGFydGluZyBmcm9tIDAgdXAgdG8gMjAxNCwgbm90IGluIHRlcm1zIG9mIEJQLiBUaGUgZGF0YV9tZWFuX2dsb2JhbCByZWZlcmVuY2VzIHRoZSBzYW1lIG1ldHJpYyBhcyBDMDJfcHBtdiBmb3IgY2FyYm9uIGRpb3hpZGUgYXZlcmFnZSBwYXJ0cyBwZXIgbWlsbGlvbiBpbiB0aGUgZWFydGjigJlzIGF0bW9zcGhlcmUuDQoNCmBgYHtSfQ0KaWFjX3ZpeiA8LSBnZ3Bsb3QoaWFjX2RhdGEsIGFlcyh4ID0geWVhciwgeSA9IGRhdGFfbWVhbl9nbG9iYWwpKQ0KaWFjX3Zpeg0KYGBgDQoNCjEzLkEgbGluZSBncmFwaCBhbHNvIG1ha2VzIHNlbnNlIGZvciB0aGVzZSBkYXRhLiBMZXTigJlzIGV4cGxvcmUgaG93IG11Y2ggY2FyYm9uIGRpb3hpZGUgd2FzIHN0b3JlZCBpbiB0aGUgYXRtb3NwaGVyZSBvdmVyIHRoZSBwYXN0IHR3byBtaWxsZW5uaWEgYnkgYWRkaW5nIGEgZ2VvbV9saW5lKCkgbGF5ZXIgdG8gdGhlIGlhY192aXogcGxvdC4NCg0KYGBge3J9DQppYWNfdml6IDwtIGlhY192aXogKyBnZW9tX2xpbmUoKQ0KaWFjX3Zpeg0KYGBgDQoNCjE0LlRoaXMgcGxvdCBzdGlsbCBuZWVkcyBsYWJlbHMgdG8gYWRkIGNvbnRleHQgdG8gdGhlIHBsb3QuIFRpdGxlIHRoZSBwbG90ICJDYXJib24gRGlveGlkZSBMZXZlbHMgb3ZlciBUaW1lIiBhbmQgYWRkIGEgc3VidGl0bGUgdGhhdCBjaXRlcyB0aGUgZGF0YSAiRnJvbSBJbnN0aXR1dGUgZm9yIEF0bW9zcGhlcmljIGFuZCBDbGltYXRlIFNjaWVuY2UgKElBQykuIg0KDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiArIGxhYnModGl0bGUgPSAiQ2FyYm9uIERpb3hpZGUgTGV2ZWxzIG92ZXIgVGltZSIsIHN1YnRpdGxlID0gIkZyb20gSW5zdGl0dXRlIGZvciBBdG1vc3BoZXJpYyBhbmQgQ2xpbWF0ZSBTY2llbmNlIChJQUMpLiIpDQppYWNfdml6DQpgYGANCg0KMTUuVHdlYWsgdGhlIGF4aXMgbGFiZWxzIHNvIHRoZXkgYXJlIG1vcmUgZGVzY3JpcHRpdmUgdGhhbiB0aGUgY29sdW1uIGhlYWRlcnMuIFRoZSB4LWF4aXMgc2hvdWxkIHJlYWQgIlllYXIiIGFuZCB0aGUgeS1heGlzIHNob3VsZCByZWFkICJDYXJib24gRGlveGlkZSBMZXZlbCAoUGFydHMgUGVyIE1pbGxpb24pIg0KDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiArIGxhYnMoeCA9ICJ5ZWFyIiwgeSA9ICJDYXJib24gRGlveGlkZSBMZXZlbCAoUGFydHMgUGVyIE1pbGxpb24pIikNCmlhY192aXoNCmBgYA0KDQoxNi5MZXTigJlzIGhpZ2hsaWdodCB0aGUgcmlzZSBpbiBjYXJib24gZGlveGlkZSBsZXZlbHMgYnkgYWRkaW5nIGEgaG9yaXpvbnRhbCBsaW5lIHRoYXQgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBsZXZlbCBpbiB0aGUgZmlyc3QgY2hhcnQgc3Bhbm5pbmcgb3ZlciA4LDAwMCB5ZWFycyBvZiBjYXJib24gZGlveGlkZSBkYXRhLiBPbiBhIG5ldyBsaW5lIG9mIGNvZGUgaW4gdGhlIGJsb2NrLCBjcmVhdGUgYSBuZXcgdmFyaWFibGUgbmFtZWQgbWlsbGVubmlhX21heCBhbmQgcmV0cmlldmUgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIENPMl9wcG12IGNvbHVtbiBpbiB0aGUgbm9hYV9kYXRhLiBQcmludCB0aGUgdmFsdWUgc28geW91IGNhbiBzZWUgd2hhdCBpdCBpcy4NCg0KYGBge3J9DQptaWxsZW5uaWFfbWF4IDwtIG1heChub2FhX2RhdGEkQ08yX3BwbXYsIG5hLnJtID0gVFJVRSkNCg0KbWlsbGVubmlhX21heA0KYGBgDQoNCjE3Lk5vdyB0aGF0IHdlIGhhdmUgdGhlIG1heGltdW0gbnVtYmVyIGluIHRoZSBub2FhX2RhdGEgbGV04oCZcyBtYXAgaXQgb24gb3VyIGlhY19kYXRhIHBsb3QuIFRoZXJl4oCZcyBhIGdlb20gaW4gZ2dvbG90IGNhbGxlZCBnZW9tX2hsaW5lKCkgdGhhdCBwbG90cyBhIGhvcml6b250YWwgbGluZS4gQWRkIGEgZ2VvbV9obGluZSgpIGxheWVyIHRvIGlhY192aXogdGhhdCBoYXMgYSB5aW50ZXJjZXB0IHZhbHVlIGluIGl0cyBhZXN0aGV0aWMgbWFwcGluZyBvZiBtaWxsZW5uaWFfbWF4Lg0KDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1pbGxlbm5pYV9tYXgpDQoNCmlhY192aXoNCmBgYA0KDQoxOC5BZGQgb25lIG1vcmUgYXJndW1lbnQgdG8gdGhlIGhvcml6b250YWwgbGluZeKAmXMgYWVzdGhldGljIG1hcHBpbmcgc28gdGhhdCB0aGUgbGVnZW5kIGNhbiBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHdoYXQgdGhlIGxpbmUgcmVwcmVzZW50cy4gQXNzaWduIHRoZSB2YWx1ZSBvZiB0aGUgbGluZXR5cGUgYXJndW1lbnQgYXMgIkhpc3RvcmljYWwgQ08yIFBlYWsgYmVmb3JlIDE5NTAiDQoNCldoYXQgZG8geW91IG5vdGljZSBoYXMgaGFwcGVuZWQgaW4gdGhlIGxhc3QgMTAwIHllYXJzIHJlbGF0aXZlIHRvIHRoZSBsYXN0IDggbWlsbGVubmlhPw0KYGBge3J9DQppYWNfdml6IDwtIGlhY192aXogKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWlsbGVubmlhX21heCwgbGluZXR5cGUgPSAiSGlzdG9yaWNhbCBDTzIgUGVhayBiZWZvcmUgMTk1MCIpKSANCg0KaWFjX3Zpeg0KYGBgDQoNCjE5LkFkZCBjb2xvcg0KDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtaWxsZW5uaWFfbWF4LCBsaW5ldHlwZSA9ICJIaXN0b3JpY2FsIENPMiBQZWFrIGJlZm9yZSAxOTUwIiwgY29sb3IgPSAiSGlzdG9yaWNhbCBDTzIgUGVhayBiZWZvcmUgMTk1MCIpKSAgDQoNCmlhY192aXoNCmBgYA0KMjAuQ2hhbmdlIGNvbG9yDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiAgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiSGlzdG9yaWNhbCBDTzIgUGVhayBiZWZvcmUgMTk1MCIgPSAiYmx1ZSIpKSANCmlhY192aXoNCmBgYA0KDQo=