Student Details

Priya Krishnamurthi Chandra (s3939191)
Su Myat Noe Yee (s3913797)
Usman Khalid (s3914769)

Problem Statement

The objective of the analysis is to investigate the distribution in data for certain variables related to climate in Melbourne and Sydney.
The variables considered are ‘Maximum temperature’, which records the highest temperature in a day, and ‘Solar exposure’, which records the total solar energy falling on a horizontal surface in a day. Both variables are inspected separately in both cities and the distribution of data is visualized and studied.
The tests of normality include graphical visualizations such as histogram and density plots, QQ-plot and Shapiro-Wilk statistical test.

Load Packages

Loaded the necessary packages needed for the analysis.

    knitr::opts_knit$set(root.dir = normalizePath("~/Desktop/RMIT_Year1_Semester 1/Applied Analytics/Assignments")) 
library(readr) #Used for reading data
library(magrittr) #Used for Forward-pipe operator
library(dplyr) #Used for data manipulation

Data

# This is a chunk for your Data section. 
setwd("~/Desktop/RMIT_Year1_Semester 1/Applied Analytics/Assignments")
mel<- read_csv("Climate data-Melbourne.csv") 
Rows: 90 Columns: 7
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (7): station number, Year, Month, Day, Maximum temperature (Degree C), solar exposure, max wind speed

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
syd<- read_csv("Climate data-Sydney.csv")
Rows: 90 Columns: 7
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (7): station number, Year, Month, Day, Maximum temperature (Degree C), solar exposure, max wind speed

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
mel_subset <- mel %>% select(-7)
syd_subset <- syd %>% select(-7) 
total <- rbind(mel_subset, syd_subset)

Summary Statistics

Calculate descriptive statistics (i.e., mean, median, standard deviation, first and third quartile, interquartile range, minimum and maximum values) of the selected variable grouped by city.

# This is a chunk for your Summary Statistics section
# Summary Statistics of Maximum temperature group by city
total %>%
  group_by(`station number`) %>%
  summarise(`Mean Maximum temperature (Degree C)` = mean(`Maximum temperature (Degree C)`),
            median = median(`Maximum temperature (Degree C)`),
            sd = sd(`Maximum temperature (Degree C)`),
            `First Quantile` = quantile(`Maximum temperature (Degree C)`, 0.25),
            `Third Quantile` = quantile(`Maximum temperature (Degree C)`, 0.75),
            `Inter quartile Range` = `Third Quantile`-`First Quantile`,
            `Minimum Value` = min(`Maximum temperature (Degree C)`),
            `Maximumm Value` = max(`Maximum temperature (Degree C)`)
            )
# Summary Statistics of solar exposure group by city
total %>%
  group_by(`station number`) %>%
  summarise(`Mean solar exposure` = mean(`solar exposure`),
            median = median(`solar exposure`),
            sd = sd(`solar exposure`),
            `First Quantile` = quantile(`solar exposure`, 0.25),
            `Third Quantile` = quantile(`solar exposure`, 0.75),
            `Inter quartile Range` = `Third Quantile`-`First Quantile`,
            `Minimum Value` = min(`solar exposure`),
            `Maximumm Value` = max(`solar exposure`)
            )

Distribution Fitting

# This is a chunk for your Distribution Fitting section. 
mel_temp<-mel_subset$`Maximum temperature (Degree C)` 
mel_solar<-mel_subset$`solar exposure` 
syd_temp<-syd_subset$`Maximum temperature (Degree C)`
syd_solar<-syd_subset$`solar exposure` 

Melbourne Maximum temperature

# Histogram of Melbourne maximum temperature
h<-hist(mel_temp, breaks=15,  col="yellow", xlab="Maximum temperature",
        main="Histogram of Melbourne Maximum temperature", prob=TRUE)
lines(density(mel_temp))
xfit<-seq(min(mel_temp),max(mel_temp),length=40)
yfit<-dnorm(xfit,mean=mean(mel_temp),sd=sd(mel_temp))
lines(xfit, yfit, col="blue", lwd=2)

#Boxplot of Melbourne maximum temperature
boxplot(mel_temp, horizontal = TRUE)

#Shapiro test for Melbourne maximum temperature
shapiro.test(mel_temp)

    Shapiro-Wilk normality test

data:  mel_temp
W = 0.97913, p-value = 0.157
#QQplot test of  Melbourne maximum temperature
qqnorm(mel_temp);
qqline(mel_temp);

Melbourne Solar Exposure

#Histogram of Melbourne solar exposure
h<-hist(mel_solar, breaks=15,  col="tomato", xlab="Solar exposure",
        main="Histogram of Melbourne solar exposure", prob=TRUE)
lines(density(mel_solar))
xfit<-seq(min(mel_solar),max(mel_solar),length=40)
yfit<-dnorm(xfit,mean=mean(mel_solar),sd=sd(mel_solar))
lines(xfit, yfit, col="blue", lwd=2)

#Boxplot of Melbourne solar exposure
boxplot(mel_solar, horizontal = TRUE)

#Shapiro test of Melbourne solar exposure
shapiro.test(mel_solar)

    Shapiro-Wilk normality test

data:  mel_solar
W = 0.93519, p-value = 0.0002275
#QQplot test of Melbourne solar exposure
qqnorm(mel_solar);
qqline(mel_solar);

Sydney Maximum temperature

#Histogram of Sydney maximum temperature 
h<-hist(syd_temp, breaks=15,  col="skyblue", xlab="Maximum temperature",
        main="Histogram of Sydney maximum temperature", prob=TRUE)
lines(density(syd_temp))
xfit<-seq(min(syd_temp),max(syd_temp),length=40)
yfit<-dnorm(xfit,mean=mean(syd_temp),sd=sd(syd_temp))
lines(xfit, yfit, col="blue", lwd=2)

#Boxplot of Sydney maximum temperature
boxplot(syd_temp, horizontal = TRUE)

#Shapiro test of Sydney maximum temperature
shapiro.test(syd_temp)

    Shapiro-Wilk normality test

data:  syd_temp
W = 0.98213, p-value = 0.2533
#QQplot test of Sydney maximum temperature
qqnorm(syd_temp);
qqline(syd_temp);

Sydney Solar exposure

#Histogram of Sydney solar exposure
h<-hist(syd_solar, breaks=15,  col="lightgreen", xlab="Solar exposure",
        main="Histogram of Sydney solar exposure", prob=TRUE)
lines(density(syd_solar))
xfit<-seq(min(syd_solar),max(syd_solar),length=40)
yfit<-dnorm(xfit,mean=mean(syd_solar),sd=sd(syd_solar))
lines(xfit, yfit, col="blue", lwd=2)

#Boxplot test of Sydney solar exposure
boxplot(syd_solar, horizontal = TRUE)

#QQplot test of Sydney solar exposure
qqnorm(syd_solar);
qqline(syd_solar);

#Shapiro test of Sydney solar exposure
shapiro.test(syd_solar)

    Shapiro-Wilk normality test

data:  syd_solar
W = 0.97075, p-value = 0.03994

Interpretation

From descriptive statistics it can be observed that Sydney (station number 66212) and Melbourne (station number 86282) have about the same mean maximum temeratures but tghe stqandard deviation is greater for Melbourne which indicates a slightly higher variability in maximum temperatures observed in Melbourne. The maximum temperature for both the cities follows approximately normal distribution as indicated by the histogram overlays, quantile-quantile plots, and Shapiro-Wilks test ( p-values greater than 0.05).

The mean solar exposure for Melbourne is higher for Melbourne i.e., 21.90 as compared to Sydney (21.90). The box plot of sydney solar explosure indicates that the data is left skewed. Similarly the box plot shows left skewednesss in Melbourne data for solar exposure. The Shapiro-Wilks test also indicates the significat departure from normality with p-values of 0.0002275 for Melbourne solar exposure and 0.03394 for Sydney solar exposure. Thus solar exposure variable doesnot follow the norml distribution. The maximum temperature

LS0tCnRpdGxlOiAiTUFUSDEzMjQgQXNzaWdubWVudCAxIgpzdWJ0aXRsZTogU3RhdGlzdGljYWwgYW5hbHlzaXMgb2YgQ2xpbWF0ZSBkYXRhCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKIyMgU3R1ZGVudCBEZXRhaWxzClByaXlhIEtyaXNobmFtdXJ0aGkgQ2hhbmRyYSAoczM5MzkxOTEpICAKU3UgTXlhdCBOb2UgWWVlIChzMzkxMzc5NykgIApVc21hbiBLaGFsaWQgKHMzOTE0NzY5KSAgCgoKIyMgUHJvYmxlbSBTdGF0ZW1lbnQKVGhlIG9iamVjdGl2ZSBvZiB0aGUgYW5hbHlzaXMgaXMgdG8gaW52ZXN0aWdhdGUgdGhlIGRpc3RyaWJ1dGlvbiBpbiBkYXRhIGZvciBjZXJ0YWluIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNsaW1hdGUgaW4gTWVsYm91cm5lIGFuZCBTeWRuZXkuICAKVGhlIHZhcmlhYmxlcyBjb25zaWRlcmVkIGFyZSAnTWF4aW11bSB0ZW1wZXJhdHVyZScsIHdoaWNoIHJlY29yZHMgdGhlIGhpZ2hlc3QgdGVtcGVyYXR1cmUgaW4gYSBkYXksIGFuZCAnU29sYXIgZXhwb3N1cmUnLCB3aGljaCByZWNvcmRzIHRoZSB0b3RhbCBzb2xhciBlbmVyZ3kgZmFsbGluZyBvbiBhIGhvcml6b250YWwgc3VyZmFjZSBpbiBhIGRheS4gQm90aCB2YXJpYWJsZXMgYXJlIGluc3BlY3RlZCBzZXBhcmF0ZWx5IGluIGJvdGggY2l0aWVzIGFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRhdGEgaXMgdmlzdWFsaXplZCBhbmQgc3R1ZGllZC4gIApUaGUgdGVzdHMgb2Ygbm9ybWFsaXR5IGluY2x1ZGUgZ3JhcGhpY2FsIHZpc3VhbGl6YXRpb25zIHN1Y2ggYXMgaGlzdG9ncmFtIGFuZCBkZW5zaXR5IHBsb3RzLCBRUS1wbG90IGFuZCBTaGFwaXJvLVdpbGsgc3RhdGlzdGljYWwgdGVzdC4KCiMjIExvYWQgUGFja2FnZXMKTG9hZGVkIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMgbmVlZGVkIGZvciB0aGUgYW5hbHlzaXMuCgpgYGB7ciBzZXR1cH0KICAgIGtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gbm9ybWFsaXplUGF0aCgifi9EZXNrdG9wL1JNSVRfWWVhcjFfU2VtZXN0ZXIgMS9BcHBsaWVkIEFuYWx5dGljcy9Bc3NpZ25tZW50cyIpKSAKYGBgCgpgYGB7cn0KbGlicmFyeShyZWFkcikgI1VzZWQgZm9yIHJlYWRpbmcgZGF0YQpsaWJyYXJ5KG1hZ3JpdHRyKSAjVXNlZCBmb3IgRm9yd2FyZC1waXBlIG9wZXJhdG9yCmxpYnJhcnkoZHBseXIpICNVc2VkIGZvciBkYXRhIG1hbmlwdWxhdGlvbgpgYGAKCiMjIERhdGEKKiBJbXBvcnRlZCB0aGUgY2xpbWF0ZSBkYXRhCiogU3Vic2V0IHRoZSBpbXBvcnRlZCBkYXRhIHRvIGNvbnNpZGVyIG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdC0gTWF4aW11bSB0ZW1wZXJhdHVyZSBhbmQgU29sYXIgZXhwb3N1cmUKCgpgYGB7cn0KIyBUaGlzIGlzIGEgY2h1bmsgZm9yIHlvdXIgRGF0YSBzZWN0aW9uLiAKc2V0d2QoIn4vRGVza3RvcC9STUlUX1llYXIxX1NlbWVzdGVyIDEvQXBwbGllZCBBbmFseXRpY3MvQXNzaWdubWVudHMiKQptZWw8LSByZWFkX2NzdigiQ2xpbWF0ZSBkYXRhLU1lbGJvdXJuZS5jc3YiKSAKc3lkPC0gcmVhZF9jc3YoIkNsaW1hdGUgZGF0YS1TeWRuZXkuY3N2IikKCm1lbF9zdWJzZXQgPC0gbWVsICU+JSBzZWxlY3QoLTcpCnN5ZF9zdWJzZXQgPC0gc3lkICU+JSBzZWxlY3QoLTcpIAp0b3RhbCA8LSByYmluZChtZWxfc3Vic2V0LCBzeWRfc3Vic2V0KQpgYGAKCgojIyBTdW1tYXJ5IFN0YXRpc3RpY3MKQ2FsY3VsYXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgKGkuZS4sIG1lYW4sIG1lZGlhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBmaXJzdCBhbmQgdGhpcmQgcXVhcnRpbGUsIGludGVycXVhcnRpbGUgcmFuZ2UsIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzKSBvZiB0aGUgc2VsZWN0ZWQgdmFyaWFibGUgZ3JvdXBlZCBieSBjaXR5LgoKYGBge3J9CiMgVGhpcyBpcyBhIGNodW5rIGZvciB5b3VyIFN1bW1hcnkgU3RhdGlzdGljcyBzZWN0aW9uCiMgU3VtbWFyeSBTdGF0aXN0aWNzIG9mIE1heGltdW0gdGVtcGVyYXR1cmUgZ3JvdXAgYnkgY2l0eQp0b3RhbCAlPiUKICBncm91cF9ieShgc3RhdGlvbiBudW1iZXJgKSAlPiUKICBzdW1tYXJpc2UoYE1lYW4gTWF4aW11bSB0ZW1wZXJhdHVyZSAoRGVncmVlIEMpYCA9IG1lYW4oYE1heGltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKWApLAogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYE1heGltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKWApLAogICAgICAgICAgICBzZCA9IHNkKGBNYXhpbXVtIHRlbXBlcmF0dXJlIChEZWdyZWUgQylgKSwKICAgICAgICAgICAgYEZpcnN0IFF1YW50aWxlYCA9IHF1YW50aWxlKGBNYXhpbXVtIHRlbXBlcmF0dXJlIChEZWdyZWUgQylgLCAwLjI1KSwKICAgICAgICAgICAgYFRoaXJkIFF1YW50aWxlYCA9IHF1YW50aWxlKGBNYXhpbXVtIHRlbXBlcmF0dXJlIChEZWdyZWUgQylgLCAwLjc1KSwKICAgICAgICAgICAgYEludGVyIHF1YXJ0aWxlIFJhbmdlYCA9IGBUaGlyZCBRdWFudGlsZWAtYEZpcnN0IFF1YW50aWxlYCwKICAgICAgICAgICAgYE1pbmltdW0gVmFsdWVgID0gbWluKGBNYXhpbXVtIHRlbXBlcmF0dXJlIChEZWdyZWUgQylgKSwKICAgICAgICAgICAgYE1heGltdW1tIFZhbHVlYCA9IG1heChgTWF4aW11bSB0ZW1wZXJhdHVyZSAoRGVncmVlIEMpYCkKICAgICAgICAgICAgKQojIFN1bW1hcnkgU3RhdGlzdGljcyBvZiBzb2xhciBleHBvc3VyZSBncm91cCBieSBjaXR5CnRvdGFsICU+JQogIGdyb3VwX2J5KGBzdGF0aW9uIG51bWJlcmApICU+JQogIHN1bW1hcmlzZShgTWVhbiBzb2xhciBleHBvc3VyZWAgPSBtZWFuKGBzb2xhciBleHBvc3VyZWApLAogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYHNvbGFyIGV4cG9zdXJlYCksCiAgICAgICAgICAgIHNkID0gc2QoYHNvbGFyIGV4cG9zdXJlYCksCiAgICAgICAgICAgIGBGaXJzdCBRdWFudGlsZWAgPSBxdWFudGlsZShgc29sYXIgZXhwb3N1cmVgLCAwLjI1KSwKICAgICAgICAgICAgYFRoaXJkIFF1YW50aWxlYCA9IHF1YW50aWxlKGBzb2xhciBleHBvc3VyZWAsIDAuNzUpLAogICAgICAgICAgICBgSW50ZXIgcXVhcnRpbGUgUmFuZ2VgID0gYFRoaXJkIFF1YW50aWxlYC1gRmlyc3QgUXVhbnRpbGVgLAogICAgICAgICAgICBgTWluaW11bSBWYWx1ZWAgPSBtaW4oYHNvbGFyIGV4cG9zdXJlYCksCiAgICAgICAgICAgIGBNYXhpbXVtbSBWYWx1ZWAgPSBtYXgoYHNvbGFyIGV4cG9zdXJlYCkKICAgICAgICAgICAgKQpgYGAKIyMgRGlzdHJpYnV0aW9uIEZpdHRpbmcKKiBDb21wYXJlZCB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiBvZiBzZWxlY3RlZCB2YXJpYWJsZXMgdG8gbm9ybWFsIGRpc3RyaWJ1dGlvbiBzZXBhcmF0ZWx5IGluIE1lbGJvdXJuZSBhbmQgU3lkbmV5LgoqIFBsb3R0ZWQgdGhlIGhpc3RvZ3JhbSB3aXRoIG5vcm1hbCBkaXN0cmlidXRpb24gb3ZlcmxheS4KKiBBbHNvIHBlcmZvcm1lZCB0aGUgc2hhcGlyby13aWxrIHRlc3Qgb24gdmFyaWFibGVzIHRvIHNlZSBpZiB0aGUgZm9sbG93IHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uICggQSBwLXZhbHVlIGxlc3MgdGhhbiAwLjA1IGluZGljYXRlcyB0aGF0IHRoZSB2YXJpYWJsZSBkb2Vzbm90IGZvbGxvdyB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbikKKiBRdWFudGlsZSBxdWFudGlsZSBwbG90cyB3ZXJlIGFsc28gZHJhd24gdG8gb2JzZXJ2ZSBpZiB0aGUgcXVhbnRpbGVzIG9mIGVtcGlyaWNhbCBvYnNlcnZhdGlvbiBwbG90dGVkIGFnYWluc3QgcXVhbnRpbGVzIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIGdpdmVzIGRhdGEgcG9pbnRzIGx5aW5nIG9uIHRoZSA0NSBkZWdyZWUgbGluZS4gSWYgdGhlIHBvaW50cyBsaWUgYWxvbmcgdGhhdCBsaW5lIHRoZW4gdGhlIGRpc3RyaWJ1dGlvbiBmb2xsb3dlZCBieSB0aGUgc2FtcGxlIHZhcmlhYmxlIGlzIG5vcm1hbC4KCiogQ2hlY2tpbmcgTm9ybWFsaXR5IG9mIE1heGltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKSB2YXJpYWJsZSBvZiBNZWxib3VybmUgZGF0YXNldAoKCmBgYHtyfQojIFRoaXMgaXMgYSBjaHVuayBmb3IgeW91ciBEaXN0cmlidXRpb24gRml0dGluZyBzZWN0aW9uLiAKbWVsX3RlbXA8LW1lbF9zdWJzZXQkYE1heGltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKWAgCm1lbF9zb2xhcjwtbWVsX3N1YnNldCRgc29sYXIgZXhwb3N1cmVgIApzeWRfdGVtcDwtc3lkX3N1YnNldCRgTWF4aW11bSB0ZW1wZXJhdHVyZSAoRGVncmVlIEMpYApzeWRfc29sYXI8LXN5ZF9zdWJzZXQkYHNvbGFyIGV4cG9zdXJlYCAKYGBgCgojIyBNZWxib3VybmUgTWF4aW11bSB0ZW1wZXJhdHVyZQoKYGBge3J9CiMgSGlzdG9ncmFtIG9mIE1lbGJvdXJuZSBtYXhpbXVtIHRlbXBlcmF0dXJlCmg8LWhpc3QobWVsX3RlbXAsIGJyZWFrcz0xNSwgIGNvbD0ieWVsbG93IiwgeGxhYj0iTWF4aW11bSB0ZW1wZXJhdHVyZSIsCiAgICAgICAgbWFpbj0iSGlzdG9ncmFtIG9mIE1lbGJvdXJuZSBNYXhpbXVtIHRlbXBlcmF0dXJlIiwgcHJvYj1UUlVFKQpsaW5lcyhkZW5zaXR5KG1lbF90ZW1wKSkKeGZpdDwtc2VxKG1pbihtZWxfdGVtcCksbWF4KG1lbF90ZW1wKSxsZW5ndGg9NDApCnlmaXQ8LWRub3JtKHhmaXQsbWVhbj1tZWFuKG1lbF90ZW1wKSxzZD1zZChtZWxfdGVtcCkpCmxpbmVzKHhmaXQsIHlmaXQsIGNvbD0iYmx1ZSIsIGx3ZD0yKQpgYGAKCmBgYHtyfQojQm94cGxvdCBvZiBNZWxib3VybmUgbWF4aW11bSB0ZW1wZXJhdHVyZQpib3hwbG90KG1lbF90ZW1wLCBob3Jpem9udGFsID0gVFJVRSkKYGBgCgpgYGB7cn0KI1NoYXBpcm8gdGVzdCBmb3IgTWVsYm91cm5lIG1heGltdW0gdGVtcGVyYXR1cmUKc2hhcGlyby50ZXN0KG1lbF90ZW1wKQpgYGAKYGBge3J9CiNRUXBsb3QgdGVzdCBvZiAgTWVsYm91cm5lIG1heGltdW0gdGVtcGVyYXR1cmUKcXFub3JtKG1lbF90ZW1wKTsKcXFsaW5lKG1lbF90ZW1wKTsKYGBgCgojIyBNZWxib3VybmUgU29sYXIgRXhwb3N1cmUKYGBge3J9CiNIaXN0b2dyYW0gb2YgTWVsYm91cm5lIHNvbGFyIGV4cG9zdXJlCmg8LWhpc3QobWVsX3NvbGFyLCBicmVha3M9MTUsICBjb2w9InRvbWF0byIsIHhsYWI9IlNvbGFyIGV4cG9zdXJlIiwKICAgICAgICBtYWluPSJIaXN0b2dyYW0gb2YgTWVsYm91cm5lIHNvbGFyIGV4cG9zdXJlIiwgcHJvYj1UUlVFKQpsaW5lcyhkZW5zaXR5KG1lbF9zb2xhcikpCnhmaXQ8LXNlcShtaW4obWVsX3NvbGFyKSxtYXgobWVsX3NvbGFyKSxsZW5ndGg9NDApCnlmaXQ8LWRub3JtKHhmaXQsbWVhbj1tZWFuKG1lbF9zb2xhciksc2Q9c2QobWVsX3NvbGFyKSkKbGluZXMoeGZpdCwgeWZpdCwgY29sPSJibHVlIiwgbHdkPTIpCmBgYApgYGB7cn0KI0JveHBsb3Qgb2YgTWVsYm91cm5lIHNvbGFyIGV4cG9zdXJlCmJveHBsb3QobWVsX3NvbGFyLCBob3Jpem9udGFsID0gVFJVRSkKYGBgCmBgYHtyfQojU2hhcGlybyB0ZXN0IG9mIE1lbGJvdXJuZSBzb2xhciBleHBvc3VyZQpzaGFwaXJvLnRlc3QobWVsX3NvbGFyKQpgYGAKYGBge3J9CiNRUXBsb3QgdGVzdCBvZiBNZWxib3VybmUgc29sYXIgZXhwb3N1cmUKcXFub3JtKG1lbF9zb2xhcik7CnFxbGluZShtZWxfc29sYXIpOwpgYGAKCiMjIFN5ZG5leSBNYXhpbXVtIHRlbXBlcmF0dXJlCmBgYHtyfQojSGlzdG9ncmFtIG9mIFN5ZG5leSBtYXhpbXVtIHRlbXBlcmF0dXJlIApoPC1oaXN0KHN5ZF90ZW1wLCBicmVha3M9MTUsICBjb2w9InNreWJsdWUiLCB4bGFiPSJNYXhpbXVtIHRlbXBlcmF0dXJlIiwKICAgICAgICBtYWluPSJIaXN0b2dyYW0gb2YgU3lkbmV5IG1heGltdW0gdGVtcGVyYXR1cmUiLCBwcm9iPVRSVUUpCmxpbmVzKGRlbnNpdHkoc3lkX3RlbXApKQp4Zml0PC1zZXEobWluKHN5ZF90ZW1wKSxtYXgoc3lkX3RlbXApLGxlbmd0aD00MCkKeWZpdDwtZG5vcm0oeGZpdCxtZWFuPW1lYW4oc3lkX3RlbXApLHNkPXNkKHN5ZF90ZW1wKSkKbGluZXMoeGZpdCwgeWZpdCwgY29sPSJibHVlIiwgbHdkPTIpCmBgYApgYGB7cn0KI0JveHBsb3Qgb2YgU3lkbmV5IG1heGltdW0gdGVtcGVyYXR1cmUKYm94cGxvdChzeWRfdGVtcCwgaG9yaXpvbnRhbCA9IFRSVUUpCmBgYApgYGB7cn0KI1NoYXBpcm8gdGVzdCBvZiBTeWRuZXkgbWF4aW11bSB0ZW1wZXJhdHVyZQpzaGFwaXJvLnRlc3Qoc3lkX3RlbXApCmBgYApgYGB7cn0KI1FRcGxvdCB0ZXN0IG9mIFN5ZG5leSBtYXhpbXVtIHRlbXBlcmF0dXJlCnFxbm9ybShzeWRfdGVtcCk7CnFxbGluZShzeWRfdGVtcCk7CmBgYAoKIyMgU3lkbmV5IFNvbGFyIGV4cG9zdXJlCmBgYHtyfQojSGlzdG9ncmFtIG9mIFN5ZG5leSBzb2xhciBleHBvc3VyZQpoPC1oaXN0KHN5ZF9zb2xhciwgYnJlYWtzPTE1LCAgY29sPSJsaWdodGdyZWVuIiwgeGxhYj0iU29sYXIgZXhwb3N1cmUiLAogICAgICAgIG1haW49Ikhpc3RvZ3JhbSBvZiBTeWRuZXkgc29sYXIgZXhwb3N1cmUiLCBwcm9iPVRSVUUpCmxpbmVzKGRlbnNpdHkoc3lkX3NvbGFyKSkKeGZpdDwtc2VxKG1pbihzeWRfc29sYXIpLG1heChzeWRfc29sYXIpLGxlbmd0aD00MCkKeWZpdDwtZG5vcm0oeGZpdCxtZWFuPW1lYW4oc3lkX3NvbGFyKSxzZD1zZChzeWRfc29sYXIpKQpsaW5lcyh4Zml0LCB5Zml0LCBjb2w9ImJsdWUiLCBsd2Q9MikKYGBgCmBgYHtyfQojQm94cGxvdCB0ZXN0IG9mIFN5ZG5leSBzb2xhciBleHBvc3VyZQpib3hwbG90KHN5ZF9zb2xhciwgaG9yaXpvbnRhbCA9IFRSVUUpCmBgYApgYGB7cn0KI1FRcGxvdCB0ZXN0IG9mIFN5ZG5leSBzb2xhciBleHBvc3VyZQpxcW5vcm0oc3lkX3NvbGFyKTsKcXFsaW5lKHN5ZF9zb2xhcik7CmBgYApgYGB7cn0KI1NoYXBpcm8gdGVzdCBvZiBTeWRuZXkgc29sYXIgZXhwb3N1cmUKc2hhcGlyby50ZXN0KHN5ZF9zb2xhcikKYGBgCgojIyBJbnRlcnByZXRhdGlvbgpGcm9tIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgaXQgY2FuIGJlIG9ic2VydmVkIHRoYXQgU3lkbmV5IChzdGF0aW9uIG51bWJlciA2NjIxMikgYW5kIE1lbGJvdXJuZSAoc3RhdGlvbiBudW1iZXIgODYyODIpIGhhdmUgYWJvdXQgdGhlIHNhbWUgbWVhbiBtYXhpbXVtIHRlbWVyYXR1cmVzIGJ1dCB0Z2hlIHN0cWFuZGFyZCBkZXZpYXRpb24gaXMgZ3JlYXRlciBmb3IgTWVsYm91cm5lIHdoaWNoIGluZGljYXRlcyBhIHNsaWdodGx5IGhpZ2hlciB2YXJpYWJpbGl0eSBpbiBtYXhpbXVtIHRlbXBlcmF0dXJlcyBvYnNlcnZlZCBpbiBNZWxib3VybmUuIApUaGUgbWF4aW11bSB0ZW1wZXJhdHVyZSBmb3IgYm90aCB0aGUgY2l0aWVzIGZvbGxvd3MgYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uIGFzIGluZGljYXRlZCBieSB0aGUgaGlzdG9ncmFtIG92ZXJsYXlzLCBxdWFudGlsZS1xdWFudGlsZSBwbG90cywgYW5kIFNoYXBpcm8tV2lsa3MgdGVzdCAoIHAtdmFsdWVzIGdyZWF0ZXIgdGhhbiAwLjA1KS4gCgpUaGUgbWVhbiBzb2xhciBleHBvc3VyZSBmb3IgTWVsYm91cm5lIGlzIGhpZ2hlciBmb3IgTWVsYm91cm5lIGkuZS4sIDIxLjkwIGFzIGNvbXBhcmVkIHRvIFN5ZG5leSAoMjEuOTApLiBUaGUgYm94IHBsb3Qgb2Ygc3lkbmV5IHNvbGFyIGV4cGxvc3VyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBsZWZ0IHNrZXdlZC4gU2ltaWxhcmx5IHRoZSBib3ggcGxvdCBzaG93cyBsZWZ0IHNrZXdlZG5lc3NzIGluIE1lbGJvdXJuZSBkYXRhIGZvciBzb2xhciBleHBvc3VyZS4gVGhlIFNoYXBpcm8tV2lsa3MgdGVzdCBhbHNvIGluZGljYXRlcyB0aGUgc2lnbmlmaWNhdCBkZXBhcnR1cmUgZnJvbSBub3JtYWxpdHkgd2l0aCBwLXZhbHVlcyBvZiAwLjAwMDIyNzUgZm9yIE1lbGJvdXJuZSBzb2xhciBleHBvc3VyZSBhbmQgIDAuMDMzOTQgZm9yIFN5ZG5leSBzb2xhciBleHBvc3VyZS4gVGh1cyBzb2xhciBleHBvc3VyZSB2YXJpYWJsZSBkb2Vzbm90IGZvbGxvdyB0aGUgbm9ybWwgZGlzdHJpYnV0aW9uLgpUaGUgbWF4aW11bSB0ZW1wZXJhdHVyZQoKCg==