Required packages
Provide the packages required to reproduce the report. Make sure you fulfilled the minimum requirement #10.
# This is the R chunk for the required packages
library(readr)
library(xlsx)
library(readxl)
library(forcats)
library(foreign)
library(gdata)
library(rvest)
library(dplyr)
library(tidyr)
library(deductive)
library(validate)
library(Hmisc)
library(stringr)
library(lubridate)
library(ggplot2)
library(knitr)
Executive Summary
This data set was preprocessed for the purpose of undertaking analysis to see if there is a relationship between election results of Australian political parties in the 2019 federal election and voting results for the 2017 marriage equality plebiscite.
Two data sets were merged, one showing voting results for the 2019 Australian Federal Election of the House of Representatives, the other showing the voting results of the 2017 Australian plebiscite on marriage equality by House of Representative electorates. The two data sets were merged, variables assigned correctly and data was tidied. A new variable was added to more easily see how an electorate voted in the plebiscite.
11 observations were found to be missing values for plebiscite data variables. These were left as NA as 9 out of 11 of them were in electorates won by the Labor party and re-coding with median values or otherwise may bias analysis results. More investigation is needed before potential further action is taken.
One significant outlier was found in the swing variable. This was investigated and found to be due to no Liberal party candidate running in the 2019 election. This value was re-coded to NA to prevent it impacting analysis results.
The values of the variable, ‘percentage of yes support’, had a mild left skew. A mathematical operation of a square root was used to correct the skew.
Data
A clear description of data sets, their sources, and variable descriptions should be provided. In this section, you must also provide the R codes with outputs (head of data sets) that you used to import/read/scrape the data set. You need to fulfil the minimum requirement #1 and merge at least two data sets to create the one you are going to work on. In addition to the R codes and outputs, you need to explain the steps that you have taken.
The two data sets relate to voting results in the 2019 Australian federal election, and 2019 Australian Bureau of Statistics data on household income, household ownership, and rent and mortgage costs. Both data sets are grouped by federal electorate geographical areas. The election results are on a two party preferred basis, minor parties are not included.
There are a total of 17 variables and 151 observations.
The variables are as follows: electorate - electorate name DivisionID - unique ID number for each electorate (allocated by the Aust. Electorate Commission) StateAB - Australian State abbreviation PartyAB - Political party abbreviation. ALP = Aust. Labor Party; LP = Liberal Party; NP = National Party; LNP = Liberal National Party (Amalgamation of Liberal Party and National Party in QLD) Liberal/National Coalition Votes Liberal/National Coalition Percentage Australian Labor Party Votes Australian Labor Party Percentage TotalVotes - Total number of votes cast in the electorate Swing - Percentage swing for winning party from previous election yes_votes - tally of yes votes yes_percentage - of total legible votes no_votes - tally of no votes no_percentage - of total legible votes total_votes - tally of legible votes difference - percentage difference between yes and no. Positive value is yes, negative value is no.
The election result data set was retrieved from the Australian Electoral Commission website: https://results.aec.gov.au/24310/Website/HouseDownloadsMenu-24310-Csv.htm
The marriage equality plebiscite data set was retrieved from the Australian Bureau of Statistics website: https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/1800.02017?OpenDocument
# This is the R chunk for the Data Section
tpp1 <- read_csv("HouseTppByDivisionDownload-24310.csv", skip=1)
Parsed with column specification:
cols(
DivisionNm = col_character(),
DivisionID = col_double(),
StateAb = col_character(),
PartyAb = col_character(),
`Liberal/National Coalition Votes` = col_double(),
`Liberal/National Coalition Percentage` = col_double(),
`Australian Labor Party Votes` = col_double(),
`Australian Labor Party Percentage` = col_double(),
TotalVotes = col_double(),
Swing = col_double()
)
head(tpp1)
marriage1 <- read_excel("australian_marriage_law_postal_survey_2017_-_response_final.xls", sheet=3, skip= 5)
New names:
* `` -> ...1
* `` -> ...3
* `` -> ...5
* Total -> Total...6
* `` -> ...7
* ...
head(marriage1)
marriage2 <- rename(marriage1, electorate =...1, yes_votes = Yes, yes_percentage=...3, no_votes= No, no_percentage = ...5, total_votes = Total...6, total_percentage = ...7)
head(marriage2)
tpp2 <- rename(tpp1,electorate=DivisionNm)
head(tpp2)
marriage3 <- marriage2 %>% select(electorate,yes_votes,yes_percentage,no_votes,no_percentage,total_votes)
voting1 <- tpp2 %>% left_join(marriage3)
Joining, by = "electorate"
head(voting1)
Understand
Summarise the types of variables and data structures, check the attributes in the data and apply proper data type conversions. In addition to the R codes and outputs, explain briefly the steps that you have taken. In this section, show that you have fulfilled minimum requirements 2-4.
There is a mix of variables, including characters, factors and numerical.
Both StateAb and PartyAb were imported as character variables. These were assigned as factors. The marriage equality plebiscite data was imported as characters, so these were re-assigned as numerical variables.
Tidy & Manipulate Data I
The data base had branched variables, with the ‘no’ header including both vote tally and proportion. To ensure tidy data, the data was imported with the branch headers dropped. The variables then were renamed to ensure accuracy and consistency.
# This is the R chunk for the Tidy & Manipulate Data I
Tidy & Manipulate Data II
So as to more easily assess the difference in levels of support for marriage equality, a new variable was created - difference. This took the yes_proportion and subtracted the no_proportion. A positive value indicated majority support for marriage equality, while a negative value indicated minority, with the proportional difference between the two being the numerical value. This variable will later aid analysis when looking into the relationship between political party support and marriage equality support, and the level of such support.
Scan I
The data was scanned for missing data. There are 11 observations with all data missing relating to the marriage equality plebiscite. It constitutes 7.28% of the total 151 observations. Furthermore, nine of the eleven were seats help by the ALP, with one each held by the NP and LP. All three electorates in the ACT have plebiscite data missing, one of the NT’s two seats, five of Victoria’s thirty-eight seats, and one of SA’s ten seats.
This is data set is to be used in an analysis to see if there is a relationship between support for marriage equality in the 2017 plebiscite, and voting support for particular political parties in the 2019 federal election. Therefore, more analysis is needed before action is taken. If the missing values were re-coded with median values or other values this could impact analysis results. The decision was made to leave the missing data as NA until more analysis was undertaken. Such analysis might include analysing the support for marriage equality in electorates with comparable political party support, or other metrics.
# This is the R chunk for the Scan I
colSums(is.na(voting2))
electorate DivisionID
0 0
StateAb PartyAb
0 0
Liberal/National Coalition Votes Liberal/National Coalition Percentage
0 0
Australian Labor Party Votes Australian Labor Party Percentage
0 0
TotalVotes Swing
0 0
yes_votes yes_percentage
11 11
no_votes no_percentage
11 11
total_votes difference
11 11
Scan II
Several univariate scans were undertaken to check for outliers. There were no obvious outliers except for one observation of the variable ‘swing’. The Whitlam electorate observation had a swing value of 39%. Considering the other outliers were in the 11-12% range this was a significant outlier that required investigation. Upon researching the previous election result, for which swing is derived from in relation to the most recent election, it was found that in the previous election a Liberal party candidate had run but not in this election, hence the swing figure was not an accurate reflection, as the was no Liberal candidate for voters to swing against. The decision was made to change this observation to NA, and remove it for calculations. It was changed to NA so as to not alter other calculations and analysis.
# This is the R chunk for the Scan II
voting2$difference %>% boxplot(main="Box Plot of support difference for marriage equality", ylab="support difference", col="grey")

voting2$Swing %>% boxplot(main="Box Plot of winning party swing", ylab="swing", col="grey")

voting2$yes_percentage %>% boxplot(main="Box plot of Marriage equality plebiscite yes vote by electorate", ylab= "proportion", col="grey")

voting2$`Liberal/National Coalition Percentage` %>% boxplot(main="Box plot of LNP vote percentage by electorate", ylab= "vote percentage", col="grey")

voting2$`Australian Labor Party Percentage` %>% boxplot(main="Box plot of Labor vote percentage by electorate", ylab= "vote percentage", col="grey")

voting2$Swing[148] <- NA
LS0tCnRpdGxlOiAiTUFUSDIzNDkgRGF0YSBXcmFuZ2xpbmciCmF1dGhvcjogR2F2aW4gSGVpZ2h0IDM4NzM5NTkKc3VidGl0bGU6IEFzc2lnbm1lbnQgMgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCgoKIyMgUmVxdWlyZWQgcGFja2FnZXMgCgoKUHJvdmlkZSB0aGUgcGFja2FnZXMgcmVxdWlyZWQgdG8gcmVwcm9kdWNlIHRoZSByZXBvcnQuIE1ha2Ugc3VyZSB5b3UgZnVsZmlsbGVkIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50ICMxMC4KCmBgYHtyfQojIFRoaXMgaXMgdGhlIFIgY2h1bmsgZm9yIHRoZSByZXF1aXJlZCBwYWNrYWdlcwpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHhsc3gpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkoZm9yZWlnbikKbGlicmFyeShnZGF0YSkKbGlicmFyeShydmVzdCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShkZWR1Y3RpdmUpCmxpYnJhcnkodmFsaWRhdGUpCmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShrbml0cikKYGBgCgoKIyMgRXhlY3V0aXZlIFN1bW1hcnkgCgotIFRoaXMgZGF0YSBzZXQgd2FzIHByZXByb2Nlc3NlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgdW5kZXJ0YWtpbmcgYW5hbHlzaXMgdG8gc2VlIGlmIHRoZXJlIGlzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gZWxlY3Rpb24gcmVzdWx0cyBvZiBBdXN0cmFsaWFuIHBvbGl0aWNhbCBwYXJ0aWVzIGluIHRoZSAyMDE5IGZlZGVyYWwgZWxlY3Rpb24gYW5kIHZvdGluZyByZXN1bHRzIGZvciB0aGUgMjAxNyBtYXJyaWFnZSBlcXVhbGl0eSBwbGViaXNjaXRlLgoKLSBUd28gZGF0YSBzZXRzIHdlcmUgbWVyZ2VkLCBvbmUgc2hvd2luZyB2b3RpbmcgcmVzdWx0cyBmb3IgdGhlIDIwMTkgQXVzdHJhbGlhbiBGZWRlcmFsIEVsZWN0aW9uIG9mIHRoZSBIb3VzZSBvZiBSZXByZXNlbnRhdGl2ZXMsIHRoZSBvdGhlciBzaG93aW5nIHRoZSB2b3RpbmcgcmVzdWx0cyBvZiB0aGUgMjAxNyBBdXN0cmFsaWFuIHBsZWJpc2NpdGUgb24gbWFycmlhZ2UgZXF1YWxpdHkgYnkgSG91c2Ugb2YgUmVwcmVzZW50YXRpdmUgZWxlY3RvcmF0ZXMuIFRoZSB0d28gZGF0YSBzZXRzIHdlcmUgbWVyZ2VkLCB2YXJpYWJsZXMgYXNzaWduZWQgY29ycmVjdGx5IGFuZCBkYXRhIHdhcyB0aWRpZWQuIEEgbmV3IHZhcmlhYmxlIHdhcyBhZGRlZCB0byBtb3JlIGVhc2lseSBzZWUgaG93IGFuIGVsZWN0b3JhdGUgdm90ZWQgaW4gdGhlIHBsZWJpc2NpdGUuCgotICAxMSBvYnNlcnZhdGlvbnMgd2VyZSBmb3VuZCB0byBiZSBtaXNzaW5nIHZhbHVlcyBmb3IgcGxlYmlzY2l0ZSBkYXRhIHZhcmlhYmxlcy4gVGhlc2Ugd2VyZSBsZWZ0IGFzIE5BIGFzIDkgb3V0IG9mIDExIG9mIHRoZW0gd2VyZSBpbiBlbGVjdG9yYXRlcyB3b24gYnkgdGhlIExhYm9yIHBhcnR5IGFuZCByZS1jb2Rpbmcgd2l0aCBtZWRpYW4gdmFsdWVzIG9yIG90aGVyd2lzZSBtYXkgYmlhcyBhbmFseXNpcyByZXN1bHRzLiBNb3JlIGludmVzdGlnYXRpb24gaXMgbmVlZGVkIGJlZm9yZSBwb3RlbnRpYWwgZnVydGhlciBhY3Rpb24gaXMgdGFrZW4uCgotICBPbmUgc2lnbmlmaWNhbnQgb3V0bGllciB3YXMgZm91bmQgaW4gdGhlIHN3aW5nIHZhcmlhYmxlLiBUaGlzIHdhcyBpbnZlc3RpZ2F0ZWQgYW5kIGZvdW5kIHRvIGJlIGR1ZSB0byBubyBMaWJlcmFsIHBhcnR5IGNhbmRpZGF0ZSBydW5uaW5nIGluIHRoZSAyMDE5IGVsZWN0aW9uLiBUaGlzIHZhbHVlIHdhcyByZS1jb2RlZCB0byBOQSB0byBwcmV2ZW50IGl0IGltcGFjdGluZyBhbmFseXNpcyByZXN1bHRzLgoKLSAgVGhlIHZhbHVlcyBvZiB0aGUgdmFyaWFibGUsICdwZXJjZW50YWdlIG9mIHllcyBzdXBwb3J0JywgaGFkIGEgbWlsZCBsZWZ0IHNrZXcuIEEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvZiBhIHNxdWFyZSByb290IHdhcyB1c2VkIHRvIGNvcnJlY3QgdGhlIHNrZXcuCgoKIyMgRGF0YSAKCkEgY2xlYXIgZGVzY3JpcHRpb24gb2YgZGF0YSBzZXRzLCB0aGVpciBzb3VyY2VzLCBhbmQgdmFyaWFibGUgZGVzY3JpcHRpb25zIHNob3VsZCBiZSBwcm92aWRlZC4gSW4gdGhpcyBzZWN0aW9uLCB5b3UgbXVzdCBhbHNvIHByb3ZpZGUgdGhlIFIgY29kZXMgd2l0aCBvdXRwdXRzIChoZWFkIG9mIGRhdGEgc2V0cykgdGhhdCB5b3UgdXNlZCB0byBpbXBvcnQvcmVhZC9zY3JhcGUgdGhlIGRhdGEgc2V0LiBZb3UgbmVlZCB0byBmdWxmaWwgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgIzEgYW5kIG1lcmdlIGF0IGxlYXN0IHR3byBkYXRhIHNldHMgdG8gY3JlYXRlIHRoZSBvbmUgeW91IGFyZSBnb2luZyB0byB3b3JrIG9uLiBJbiBhZGRpdGlvbiB0byB0aGUgUiBjb2RlcyBhbmQgb3V0cHV0cywgeW91IG5lZWQgdG8gZXhwbGFpbiB0aGUgc3RlcHMgdGhhdCB5b3UgaGF2ZSB0YWtlbi4KClRoZSB0d28gZGF0YSBzZXRzIHJlbGF0ZSB0byB2b3RpbmcgcmVzdWx0cyBpbiB0aGUgMjAxOSBBdXN0cmFsaWFuIGZlZGVyYWwgZWxlY3Rpb24sIGFuZCAyMDE5IEF1c3RyYWxpYW4gQnVyZWF1IG9mIFN0YXRpc3RpY3MgZGF0YSBvbiBob3VzZWhvbGQgaW5jb21lLCBob3VzZWhvbGQgb3duZXJzaGlwLCBhbmQgcmVudCBhbmQgbW9ydGdhZ2UgY29zdHMuIEJvdGggZGF0YSBzZXRzIGFyZSBncm91cGVkIGJ5IGZlZGVyYWwgZWxlY3RvcmF0ZSBnZW9ncmFwaGljYWwgYXJlYXMuClRoZSBlbGVjdGlvbiByZXN1bHRzIGFyZSBvbiBhIHR3byBwYXJ0eSBwcmVmZXJyZWQgYmFzaXMsIG1pbm9yIHBhcnRpZXMgYXJlIG5vdCBpbmNsdWRlZC4KClRoZXJlIGFyZSBhIHRvdGFsIG9mIDE3IHZhcmlhYmxlcyBhbmQgMTUxIG9ic2VydmF0aW9ucy4KClRoZSB2YXJpYWJsZXMgYXJlIGFzIGZvbGxvd3M6CmVsZWN0b3JhdGUgLSBlbGVjdG9yYXRlIG5hbWUKRGl2aXNpb25JRCAtIHVuaXF1ZSBJRCBudW1iZXIgZm9yIGVhY2ggZWxlY3RvcmF0ZSAoYWxsb2NhdGVkIGJ5IHRoZSBBdXN0LiBFbGVjdG9yYXRlIENvbW1pc3Npb24pClN0YXRlQUIgLSBBdXN0cmFsaWFuIFN0YXRlIGFiYnJldmlhdGlvbgpQYXJ0eUFCIC0gUG9saXRpY2FsIHBhcnR5IGFiYnJldmlhdGlvbi4gQUxQID0gQXVzdC4gTGFib3IgUGFydHk7IExQID0gTGliZXJhbCBQYXJ0eTsgTlAgPSBOYXRpb25hbCBQYXJ0eTsgTE5QID0gTGliZXJhbCBOYXRpb25hbCBQYXJ0eSAoQW1hbGdhbWF0aW9uIG9mIExpYmVyYWwgUGFydHkgYW5kIE5hdGlvbmFsIFBhcnR5IGluIFFMRCkKTGliZXJhbC9OYXRpb25hbCBDb2FsaXRpb24gVm90ZXMKTGliZXJhbC9OYXRpb25hbCBDb2FsaXRpb24gUGVyY2VudGFnZQpBdXN0cmFsaWFuIExhYm9yIFBhcnR5IFZvdGVzCkF1c3RyYWxpYW4gTGFib3IgUGFydHkgUGVyY2VudGFnZQpUb3RhbFZvdGVzIC0gVG90YWwgbnVtYmVyIG9mIHZvdGVzIGNhc3QgaW4gdGhlIGVsZWN0b3JhdGUKU3dpbmcgLSBQZXJjZW50YWdlIHN3aW5nIGZvciB3aW5uaW5nIHBhcnR5IGZyb20gcHJldmlvdXMgZWxlY3Rpb24KeWVzX3ZvdGVzIC0gdGFsbHkgb2YgeWVzIHZvdGVzCnllc19wZXJjZW50YWdlIC0gb2YgdG90YWwgbGVnaWJsZSB2b3Rlcwpub192b3RlcyAtIHRhbGx5IG9mIG5vIHZvdGVzCm5vX3BlcmNlbnRhZ2UgLSBvZiB0b3RhbCBsZWdpYmxlIHZvdGVzCnRvdGFsX3ZvdGVzIC0gdGFsbHkgb2YgbGVnaWJsZSB2b3RlcwpkaWZmZXJlbmNlIC0gcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4geWVzIGFuZCBuby4gUG9zaXRpdmUgdmFsdWUgaXMgeWVzLCBuZWdhdGl2ZSB2YWx1ZSBpcyBuby4KCgoKClRoZSBlbGVjdGlvbiByZXN1bHQgZGF0YSBzZXQgd2FzIHJldHJpZXZlZCBmcm9tIHRoZSBBdXN0cmFsaWFuIEVsZWN0b3JhbCBDb21taXNzaW9uIHdlYnNpdGU6Cmh0dHBzOi8vcmVzdWx0cy5hZWMuZ292LmF1LzI0MzEwL1dlYnNpdGUvSG91c2VEb3dubG9hZHNNZW51LTI0MzEwLUNzdi5odG0KClRoZSBtYXJyaWFnZSBlcXVhbGl0eSBwbGViaXNjaXRlIGRhdGEgc2V0IHdhcyByZXRyaWV2ZWQgZnJvbSB0aGUgQXVzdHJhbGlhbiBCdXJlYXUgb2YgU3RhdGlzdGljcyB3ZWJzaXRlOgpodHRwczovL3d3dy5hYnMuZ292LmF1L0FVU1NUQVRTL2Fic0AubnNmL0RldGFpbHNQYWdlLzE4MDAuMDIwMTc/T3BlbkRvY3VtZW50CgoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIERhdGEgU2VjdGlvbgoKdHBwMSA8LSByZWFkX2NzdigiSG91c2VUcHBCeURpdmlzaW9uRG93bmxvYWQtMjQzMTAuY3N2Iiwgc2tpcD0xKQpoZWFkKHRwcDEpCm1hcnJpYWdlMSA8LSByZWFkX2V4Y2VsKCJhdXN0cmFsaWFuX21hcnJpYWdlX2xhd19wb3N0YWxfc3VydmV5XzIwMTdfLV9yZXNwb25zZV9maW5hbC54bHMiLCBzaGVldD0zLCBza2lwPSA1KQpoZWFkKG1hcnJpYWdlMSkKbWFycmlhZ2UyIDwtIHJlbmFtZShtYXJyaWFnZTEsIGVsZWN0b3JhdGUgPS4uLjEsIHllc192b3RlcyA9IFllcywgeWVzX3BlcmNlbnRhZ2U9Li4uMywgbm9fdm90ZXM9IE5vLCBub19wZXJjZW50YWdlID0gLi4uNSwgdG90YWxfdm90ZXMgPSBUb3RhbC4uLjYsIHRvdGFsX3BlcmNlbnRhZ2UgPSAuLi43KQpoZWFkKG1hcnJpYWdlMikKdHBwMiA8LSByZW5hbWUodHBwMSxlbGVjdG9yYXRlPURpdmlzaW9uTm0pCmhlYWQodHBwMikKbWFycmlhZ2UzIDwtIG1hcnJpYWdlMiAlPiUgc2VsZWN0KGVsZWN0b3JhdGUseWVzX3ZvdGVzLHllc19wZXJjZW50YWdlLG5vX3ZvdGVzLG5vX3BlcmNlbnRhZ2UsdG90YWxfdm90ZXMpCnZvdGluZzEgPC0gdHBwMiAlPiUgbGVmdF9qb2luKG1hcnJpYWdlMykKaGVhZCh2b3RpbmcxKQpgYGAKCiMjIFVuZGVyc3RhbmQgCgpTdW1tYXJpc2UgdGhlIHR5cGVzIG9mIHZhcmlhYmxlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLCBjaGVjayB0aGUgYXR0cmlidXRlcyBpbiB0aGUgZGF0YSBhbmQgYXBwbHkgcHJvcGVyIGRhdGEgdHlwZSBjb252ZXJzaW9ucy4gSW4gYWRkaXRpb24gdG8gdGhlIFIgY29kZXMgYW5kIG91dHB1dHMsIGV4cGxhaW4gYnJpZWZseSB0aGUgc3RlcHMgdGhhdCB5b3UgaGF2ZSB0YWtlbi4gSW4gdGhpcyBzZWN0aW9uLCBzaG93IHRoYXQgeW91IGhhdmUgZnVsZmlsbGVkIG1pbmltdW0gcmVxdWlyZW1lbnRzIDItNC4KClRoZXJlIGlzIGEgbWl4IG9mIHZhcmlhYmxlcywgaW5jbHVkaW5nIGNoYXJhY3RlcnMsIGZhY3RvcnMgYW5kIG51bWVyaWNhbC4KCkJvdGggU3RhdGVBYiBhbmQgUGFydHlBYiB3ZXJlIGltcG9ydGVkIGFzIGNoYXJhY3RlciB2YXJpYWJsZXMuIFRoZXNlIHdlcmUgYXNzaWduZWQgYXMgZmFjdG9ycy4KVGhlIG1hcnJpYWdlIGVxdWFsaXR5IHBsZWJpc2NpdGUgZGF0YSB3YXMgaW1wb3J0ZWQgYXMgY2hhcmFjdGVycywgc28gdGhlc2Ugd2VyZSByZS1hc3NpZ25lZCBhcyBudW1lcmljYWwgdmFyaWFibGVzLgoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFVuZGVyc3RhbmQgU2VjdGlvbgoKdm90aW5nMSRTdGF0ZUFiIDwtIHZvdGluZzEkU3RhdGVBYiU+JSBhcy5mYWN0b3IoKQp2b3RpbmcxJFBhcnR5QWIgPC0gIHZvdGluZzEkUGFydHlBYiAlPiUgYXMuZmFjdG9yKCkKdm90aW5nMSR5ZXNfdm90ZXMgPC0gdm90aW5nMSR5ZXNfdm90ZXMgJT4lIGFzLmRvdWJsZSgpCnZvdGluZzEkeWVzX3BlcmNlbnRhZ2UgPC0gdm90aW5nMSR5ZXNfcGVyY2VudGFnZSAlPiUgYXMuZG91YmxlKCkKdm90aW5nMSRub192b3RlcyA8LSB2b3RpbmcxJG5vX3ZvdGVzICU+JSBhcy5kb3VibGUoKQp2b3RpbmcxJG5vX3BlcmNlbnRhZ2UgPC0gdm90aW5nMSRub19wZXJjZW50YWdlICU+JSBhcy5kb3VibGUoKQp2b3RpbmcxJHRvdGFsX3ZvdGVzIDwtIHZvdGluZzEkdG90YWxfdm90ZXMgJT4lIGFzLmRvdWJsZSgpCmhlYWQodm90aW5nMSkKCmBgYAoKCiMjCVRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSSAKCgpUaGUgZGF0YSBiYXNlIGhhZCBicmFuY2hlZCB2YXJpYWJsZXMsIHdpdGggdGhlICdubycgaGVhZGVyIGluY2x1ZGluZyBib3RoIHZvdGUgdGFsbHkgYW5kIHByb3BvcnRpb24uIFRvIGVuc3VyZSB0aWR5IGRhdGEsIHRoZSBkYXRhIHdhcyBpbXBvcnRlZCB3aXRoIHRoZSBicmFuY2ggaGVhZGVycyBkcm9wcGVkLiBUaGUgdmFyaWFibGVzIHRoZW4gd2VyZSByZW5hbWVkIHRvIGVuc3VyZSBhY2N1cmFjeSBhbmQgY29uc2lzdGVuY3kuCgoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSSAKCmBgYAoKIyMJVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSSAKCgpTbyBhcyB0byBtb3JlIGVhc2lseSBhc3Nlc3MgdGhlIGRpZmZlcmVuY2UgaW4gbGV2ZWxzIG9mIHN1cHBvcnQgZm9yIG1hcnJpYWdlIGVxdWFsaXR5LCBhIG5ldyB2YXJpYWJsZSB3YXMgY3JlYXRlZCAtIGRpZmZlcmVuY2UuIFRoaXMgdG9vayB0aGUgeWVzX3Byb3BvcnRpb24gYW5kIHN1YnRyYWN0ZWQgdGhlIG5vX3Byb3BvcnRpb24uIEEgcG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVkIG1ham9yaXR5IHN1cHBvcnQgZm9yIG1hcnJpYWdlIGVxdWFsaXR5LCB3aGlsZSBhIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlZCBtaW5vcml0eSwgd2l0aCB0aGUgcHJvcG9ydGlvbmFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGJlaW5nIHRoZSBudW1lcmljYWwgdmFsdWUuIFRoaXMgdmFyaWFibGUgd2lsbCBsYXRlciBhaWQgYW5hbHlzaXMgd2hlbiBsb29raW5nIGludG8gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvbGl0aWNhbCBwYXJ0eSBzdXBwb3J0IGFuZCBtYXJyaWFnZSBlcXVhbGl0eSBzdXBwb3J0LCBhbmQgdGhlIGxldmVsIG9mIHN1Y2ggc3VwcG9ydC4KCmBgYHtyfQojIFRoaXMgaXMgdGhlIFIgY2h1bmsgZm9yIHRoZSBUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIElJIAp2b3RpbmcyIDwtIG11dGF0ZSh2b3RpbmcxLCBkaWZmZXJlbmNlID0geWVzX3BlcmNlbnRhZ2UgLSBub19wZXJjZW50YWdlKQpoZWFkKHZvdGluZzIpCgpgYGAKCgojIwlTY2FuIEkgCgoKVGhlIGRhdGEgd2FzIHNjYW5uZWQgZm9yIG1pc3NpbmcgZGF0YS4gVGhlcmUgYXJlIDExIG9ic2VydmF0aW9ucyB3aXRoIGFsbCBkYXRhIG1pc3NpbmcgcmVsYXRpbmcgdG8gdGhlIG1hcnJpYWdlIGVxdWFsaXR5IHBsZWJpc2NpdGUuIEl0IGNvbnN0aXR1dGVzIDcuMjglIG9mIHRoZSB0b3RhbCAxNTEgb2JzZXJ2YXRpb25zLiBGdXJ0aGVybW9yZSwgbmluZSBvZiB0aGUgZWxldmVuIHdlcmUgc2VhdHMgaGVscCBieSB0aGUgQUxQLCB3aXRoIG9uZSBlYWNoIGhlbGQgYnkgdGhlIE5QIGFuZCBMUC4gQWxsIHRocmVlIGVsZWN0b3JhdGVzIGluIHRoZSBBQ1QgaGF2ZSBwbGViaXNjaXRlIGRhdGEgbWlzc2luZywgb25lIG9mIHRoZSBOVCdzIHR3byBzZWF0cywgZml2ZSBvZiBWaWN0b3JpYSdzIHRoaXJ0eS1laWdodCBzZWF0cywgYW5kIG9uZSBvZiBTQSdzIHRlbiBzZWF0cy4KClRoaXMgaXMgZGF0YSBzZXQgaXMgdG8gYmUgdXNlZCBpbiBhbiBhbmFseXNpcyB0byBzZWUgaWYgdGhlcmUgaXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzdXBwb3J0IGZvciBtYXJyaWFnZSBlcXVhbGl0eSBpbiB0aGUgMjAxNyBwbGViaXNjaXRlLCBhbmQgdm90aW5nIHN1cHBvcnQgZm9yIHBhcnRpY3VsYXIgcG9saXRpY2FsIHBhcnRpZXMgaW4gdGhlIDIwMTkgZmVkZXJhbCBlbGVjdGlvbi4gVGhlcmVmb3JlLCBtb3JlIGFuYWx5c2lzIGlzIG5lZWRlZCBiZWZvcmUgYWN0aW9uIGlzIHRha2VuLiBJZiB0aGUgbWlzc2luZyB2YWx1ZXMgd2VyZSByZS1jb2RlZCB3aXRoIG1lZGlhbiB2YWx1ZXMgb3Igb3RoZXIgdmFsdWVzIHRoaXMgY291bGQgaW1wYWN0IGFuYWx5c2lzIHJlc3VsdHMuIFRoZSBkZWNpc2lvbiB3YXMgbWFkZSB0byBsZWF2ZSB0aGUgbWlzc2luZyBkYXRhIGFzIE5BIHVudGlsIG1vcmUgYW5hbHlzaXMgd2FzIHVuZGVydGFrZW4uIFN1Y2ggYW5hbHlzaXMgbWlnaHQgaW5jbHVkZSBhbmFseXNpbmcgdGhlIHN1cHBvcnQgZm9yIG1hcnJpYWdlIGVxdWFsaXR5IGluIGVsZWN0b3JhdGVzIHdpdGggY29tcGFyYWJsZSBwb2xpdGljYWwgcGFydHkgc3VwcG9ydCwgb3Igb3RoZXIgbWV0cmljcy4gCgoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFNjYW4gSQoKY29sU3Vtcyhpcy5uYSh2b3RpbmcyKSkKCmBgYAoKCiMjCVNjYW4gSUkKCgpTZXZlcmFsIHVuaXZhcmlhdGUgc2NhbnMgd2VyZSB1bmRlcnRha2VuIHRvIGNoZWNrIGZvciBvdXRsaWVycy4gVGhlcmUgd2VyZSBubyBvYnZpb3VzIG91dGxpZXJzIGV4Y2VwdCBmb3Igb25lIG9ic2VydmF0aW9uIG9mIHRoZSB2YXJpYWJsZSAnc3dpbmcnLiBUaGUgV2hpdGxhbSBlbGVjdG9yYXRlIG9ic2VydmF0aW9uIGhhZCBhIHN3aW5nIHZhbHVlIG9mIDM5JS4gQ29uc2lkZXJpbmcgdGhlIG90aGVyIG91dGxpZXJzIHdlcmUgaW4gdGhlIDExLTEyJSByYW5nZSB0aGlzIHdhcyBhIHNpZ25pZmljYW50IG91dGxpZXIgdGhhdCByZXF1aXJlZCBpbnZlc3RpZ2F0aW9uLiBVcG9uIHJlc2VhcmNoaW5nIHRoZSBwcmV2aW91cyBlbGVjdGlvbiByZXN1bHQsIGZvciB3aGljaCBzd2luZyBpcyBkZXJpdmVkIGZyb20gaW4gcmVsYXRpb24gdG8gdGhlIG1vc3QgcmVjZW50IGVsZWN0aW9uLCBpdCB3YXMgZm91bmQgdGhhdCBpbiB0aGUgcHJldmlvdXMgZWxlY3Rpb24gYSBMaWJlcmFsIHBhcnR5IGNhbmRpZGF0ZSBoYWQgcnVuIGJ1dCBub3QgaW4gdGhpcyBlbGVjdGlvbiwgaGVuY2UgdGhlIHN3aW5nIGZpZ3VyZSB3YXMgbm90IGFuIGFjY3VyYXRlIHJlZmxlY3Rpb24sIGFzIHRoZSB3YXMgbm8gTGliZXJhbCBjYW5kaWRhdGUgZm9yIHZvdGVycyB0byBzd2luZyBhZ2FpbnN0LiBUaGUgZGVjaXNpb24gd2FzIG1hZGUgdG8gY2hhbmdlIHRoaXMgb2JzZXJ2YXRpb24gdG8gTkEsIGFuZCByZW1vdmUgaXQgZm9yIGNhbGN1bGF0aW9ucy4gSXQgd2FzIGNoYW5nZWQgdG8gTkEgc28gYXMgdG8gbm90IGFsdGVyIG90aGVyIGNhbGN1bGF0aW9ucyBhbmQgYW5hbHlzaXMuCgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgU2NhbiBJSQoKdm90aW5nMiRkaWZmZXJlbmNlICU+JSBib3hwbG90KG1haW49IkJveCBQbG90IG9mIHN1cHBvcnQgZGlmZmVyZW5jZSBmb3IgbWFycmlhZ2UgZXF1YWxpdHkiLCB5bGFiPSJzdXBwb3J0IGRpZmZlcmVuY2UiLCBjb2w9ImdyZXkiKQoKdm90aW5nMiRTd2luZyAlPiUgYm94cGxvdChtYWluPSJCb3ggUGxvdCBvZiB3aW5uaW5nIHBhcnR5IHN3aW5nIiwgeWxhYj0ic3dpbmciLCBjb2w9ImdyZXkiKQoKdm90aW5nMiR5ZXNfcGVyY2VudGFnZSAlPiUgYm94cGxvdChtYWluPSJCb3ggcGxvdCBvZiBNYXJyaWFnZSBlcXVhbGl0eSBwbGViaXNjaXRlIHllcyB2b3RlIGJ5IGVsZWN0b3JhdGUiLCB5bGFiPSAicHJvcG9ydGlvbiIsIGNvbD0iZ3JleSIpCgp2b3RpbmcyJGBMaWJlcmFsL05hdGlvbmFsIENvYWxpdGlvbiBQZXJjZW50YWdlYCAlPiUgYm94cGxvdChtYWluPSJCb3ggcGxvdCBvZiBMTlAgdm90ZSBwZXJjZW50YWdlIGJ5IGVsZWN0b3JhdGUiLCB5bGFiPSAidm90ZSBwZXJjZW50YWdlIiwgY29sPSJncmV5IikKCnZvdGluZzIkYEF1c3RyYWxpYW4gTGFib3IgUGFydHkgUGVyY2VudGFnZWAgJT4lIGJveHBsb3QobWFpbj0iQm94IHBsb3Qgb2YgTGFib3Igdm90ZSBwZXJjZW50YWdlIGJ5IGVsZWN0b3JhdGUiLCB5bGFiPSAidm90ZSBwZXJjZW50YWdlIiwgY29sPSJncmV5IikKCnZvdGluZzIkU3dpbmdbMTQ4XSA8LSBOQQoKYGBgCgoKIyMJVHJhbnNmb3JtIAoKClNldmVyYWwgdmFyaWFibGVzIHdlcmUgY2hlY2tlZCBmb3IgZGlzdHJpYnV0aW9uIHNrZXcuIFRoZSB5ZXMgcGVyY2VudGFnZSB2YXJpYWJsZSBoYWQgYSBtaWxkIGxlZnQgc2tldy4gVGhlIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gb2YgYSBzcXVhcmUgcm9vdCB0cmFuc2Zvcm1hdGlvbiB3YXMgdXNlZCBhdCBpdCB3YXMgYSBsZWZ0IHNrZXcuIFRoZSByZXN1bHRpbmcgb2JqZWN0LCB0cmFuc195ZXMxLCBoYXMgYSBtdWNoIHJlZHVjZWQgc2tldy4KCgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgVHJhbnNmb3JtIFNlY3Rpb24KCnZvdGluZzIkYEF1c3RyYWxpYW4gTGFib3IgUGFydHkgUGVyY2VudGFnZWAgJT4lIGhpc3QoeGxhYj0ibGFib3IgcGVyY2VudGFnZSIsIG1haW4gPSAibGFib3Igc3VwcG9ydCIsIGNvbCA9ICJncmV5IiApCgp2b3RpbmcyJHllc19wZXJjZW50YWdlICU+JSBoaXN0KHhsYWI9InllcyBwZXJjZW50YWdlIiwgbWFpbiA9ICJ5ZXMgc3VwcG9ydCBieSBlbGVjdG9yYXRlIiwgY29sPSJncmV5IikKCnRyYW5zX3llczEgPC0gdm90aW5nMiR5ZXNfcGVyY2VudGFnZV4yCmhpc3QodHJhbnNfeWVzMSkKCgpgYGAKCgpOT1RFOiBOb3RlIHRoYXQgc29tZXRpbWVzIHRoZSBvcmRlciBvZiB0aGUgdGFza3MgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBvcmRlciBnaXZlbiBoZXJlLiBGb3IgZXhhbXBsZSwgeW91IG1heSBuZWVkIHRvIHRpZHkgdGhlIGRhdGEgc2V0cyBmaXJzdCB0byBiZSBhYmxlIHRvIGNyZWF0ZSB0aGUgY29tbW9uIGtleSB0byBtZXJnZS4gVGhlcmVmb3JlLCBmb3Igc3VjaCBjYXNlcyB5b3UgbWF5IGhhdmUgYSBkaWZmZXJlbnQgb3JkZXJpbmcgb2YgdGhlIHNlY3Rpb25zLlwgIAoKQW55IGZ1cnRoZXIgb3Igb3B0aW9uYWwgcHJlLXByb2Nlc3NpbmcgdGFza3MgY2FuIGJlIGFkZGVkIHRvIHRoZSB0ZW1wbGF0ZSB1c2luZyBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gaW4gdGhlIFIgTWFya2Rvd24gZmlsZS4gTWFrZSBzdXJlIHlvdXIgY29kZSBpcyB2aXNpYmxlICh3aXRoaW4gdGhlIG1hcmdpbiBvZiB0aGUgcGFnZSkuIERvIG5vdCB1c2UgVmlldygpIHRvIHNob3cgeW91ciBkYXRhLCBpbnN0ZWFkIGdpdmUgaGVhZGVycyAodXNpbmcgaGVhZCgpICkKCjxicj4KPGJyPgo=