AUTHORS - Carla Parrucci, cp113330 (Student Leader). Contribution to
the creation of the Code and Report - Marina Gabriela Mititelu,
mm113327. Contribution to the creation of the Code
STATEMENT OF NON-INFRINGEMENT OF COPYRIGHT. The Work shall not
violate or infringe upon the rights of any third party, including,
without limitation, any patent rights, copyright rights, trademark
rights, trade secret rights, or other proprietary rights of any
kind.
CC LICENSE STATEMENT FOR THE PROJECT This work is licensed under a
Creative Commons Attribution 4.0 International License. This license
allows a work to be copied, modified, distributed, presented, and
performed only if the author is credited.
CLASS Auditing Course, year 2022, spring semester, Warsaw School of
Economics (SGH), Warsaw (PL).
Load necessary packages
require(rvest)#read data from webpage
require(dplyr)#library required for data frame manipulation
require(tm)#text mining
require(wordcloud)#word-cloud generator
require(RColorBrewer)#color palettes
require(syuzhet)#sentiment analysis
require(ggplot2)#plot graph
Load HTML pages to analyze 10 External Audit Reports.
After the analysis of the results, it is possible to assume whether
the Audit reports are Optimistic or Pessimistic
sample1<-read_html("https://annualreport.dsm.com/ar2020/other-information/independent-auditor-s-report.html")
audit_report1<-sample1 %>% html_nodes("p") %>% html_text()
# %>% is multiple times to "chain" functions together
sample2<-read_html("http://www.pta.wa.gov.au/Portals/0/annualreports/2011/pta2011v4/independent-audit-opinion.html")
audit_report2<-sample2 %>% html_nodes("p") %>% html_text()
sample3<-read_html("https://report.basf.com/2021/en/financial-statements/audit/auditors-report.html")
audit_report3<-sample3 %>% html_nodes("p") %>% html_text()
sample4<-read_html("https://coca-colafemsa.com/reportes/reporte-anual-2016/eng/independent-auditors.html")
audit_report4<-sample4 %>% html_nodes("p") %>% html_text()
sample5<-read_html("https://www.canada.ca/en/revenue-agency/corporate/about-canada-revenue-agency-cra/departmental-performance-reports/2018-19-departmental-results-report/iar-agency-activities.html")
audit_report5<-sample5 %>% html_nodes("p") %>% html_text()
sample6<-read_html("https://2020.annualreport.sbmoffshore.com/corporate-statements-2020/other-information/independent-auditor-s-report")
audit_report6<-sample6 %>% html_nodes("p") %>% html_text()
sample7<-read_html("https://annual-report.puma.com/2020/en/consolidated-financial-statement/independent-auditor-s-report.html")
audit_report7<-sample7 %>% html_nodes("p") %>% html_text()
sample8<-read_html("https://www.remgro.com/ar2021/financial-report/report-independent-auditor.php")
audit_report8<-sample8 %>% html_nodes("p") %>% html_text()
sample9<-read_html("https://www.vodacom-reports.co.za/integrated-reports/ir-2018/independent-auditors-report-on-the-consolidated-annual-financial-statements.php")
audit_report9<-sample9 %>% html_nodes("p") %>% html_text()
sample10<-read_html("https://www.massmart.co.za/iar2020/our-performance/independent-auditors-report/")
audit_report10<-sample10 %>% html_nodes("p") %>% html_text()
Convertion of Vectors to Corpus of each Audit Report
audit_document1<- Corpus(VectorSource(audit_report1))#create corpus by converting vector;
audit_document2<- Corpus(VectorSource(audit_report2))
audit_document3<- Corpus(VectorSource(audit_report3))
audit_document4<- Corpus(VectorSource(audit_report4))
audit_document5<- Corpus(VectorSource(audit_report5))
audit_document6<- Corpus(VectorSource(audit_report6))
audit_document7<- Corpus(VectorSource(audit_report7))
audit_document8<- Corpus(VectorSource(audit_report8))
audit_document9<- Corpus(VectorSource(audit_report9))
audit_document10<- Corpus(VectorSource(audit_report10))
To perform the sentiment analysis, it is necessary to correct the
text of each Audit Report by converting all sentences to lower case,
removing numbers from the documents, stop words, punctuation and extra
spaces. In this way R Studio is able to evaluate the meaning of each
word
audit_document1<-tm_map(audit_document1, content_transformer(tolower))#convert all text to lower case
audit_document1<-tm_map(audit_document1, removeNumbers)#remove numbers from document
audit_document1<-tm_map(audit_document1,removeWords,stopwords(kind = "en"))#remove stop words in English
audit_document1<-tm_map(audit_document1,removePunctuation)#remove punctuation
audit_document1<- tm_map(audit_document1,stripWhitespace)#eliminate extra spaces
audit_document2<-tm_map(audit_document2, content_transformer(tolower))
audit_document2<-tm_map(audit_document2, removeNumbers)
audit_document2<-tm_map(audit_document2,removeWords,stopwords(kind = "en"))
audit_document2<-tm_map(audit_document2,removePunctuation)
audit_document2<- tm_map(audit_document2,stripWhitespace)
audit_document3<-tm_map(audit_document3, content_transformer(tolower))
audit_document3<-tm_map(audit_document3, removeNumbers)
audit_document3<-tm_map(audit_document3,removeWords,stopwords(kind = "en"))
audit_document3<-tm_map(audit_document3,removePunctuation)
audit_document3<- tm_map(audit_document3,stripWhitespace)
audit_document4<-tm_map(audit_document4, content_transformer(tolower))
audit_document4<-tm_map(audit_document4, removeNumbers)
audit_document4<-tm_map(audit_document4,removeWords,stopwords(kind = "en"))
audit_document4<-tm_map(audit_document4,removePunctuation)
audit_document4<- tm_map(audit_document4,stripWhitespace)
audit_document5<-tm_map(audit_document5, content_transformer(tolower))
audit_document5<-tm_map(audit_document5, removeNumbers)
audit_document5<-tm_map(audit_document5,removeWords,stopwords(kind = "en"))
audit_document5<-tm_map(audit_document5,removePunctuation)
audit_document5<- tm_map(audit_document5,stripWhitespace)
audit_document6<-tm_map(audit_document6, content_transformer(tolower))
audit_document6<-tm_map(audit_document6, removeNumbers)
audit_document6<-tm_map(audit_document6,removeWords,stopwords(kind = "en"))
audit_document6<-tm_map(audit_document6,removePunctuation)
audit_document6<- tm_map(audit_document6,stripWhitespace)
audit_document7<-tm_map(audit_document7, content_transformer(tolower))
audit_document7<-tm_map(audit_document7, removeNumbers)
audit_document7<-tm_map(audit_document7,removeWords,stopwords(kind = "en"))
audit_document7<-tm_map(audit_document7,removePunctuation)
audit_document7<- tm_map(audit_document7,stripWhitespace)
audit_document8<-tm_map(audit_document8, content_transformer(tolower))
audit_document8<-tm_map(audit_document8, removeNumbers)
audit_document8<-tm_map(audit_document8,removeWords,stopwords(kind = "en"))
audit_document8<-tm_map(audit_document8,removePunctuation)
audit_document8<- tm_map(audit_document8,stripWhitespace)
audit_document9<-tm_map(audit_document9, content_transformer(tolower))
audit_document9<-tm_map(audit_document9, removeNumbers)
audit_document9<-tm_map(audit_document9,removeWords,stopwords(kind = "en"))
audit_document9<-tm_map(audit_document9,removePunctuation)
audit_document9<- tm_map(audit_document9,stripWhitespace)
audit_document10<-tm_map(audit_document10, content_transformer(tolower))
audit_document10<-tm_map(audit_document10, removeNumbers)
audit_document10<-tm_map(audit_document10,removeWords,stopwords(kind = "en"))
audit_document10<-tm_map(audit_document10,removePunctuation)
audit_document10<- tm_map(audit_document10,stripWhitespace)
To perform a sensitivity analysis, it is necessary the computation of
the frequency of each word. Using this code, we built a table with the
words and frequency of each Audit Report analyzed.
dtm1<-TermDocumentMatrix(audit_document1)#term-matrix, it computes the words in the Report and their frequency
m1<-as.matrix(dtm1)#convert terms in the matrix
v1<-sort(rowSums(m1),decreasing = TRUE)#convert matrix in vector
d1<-data.frame(frequency=v1)#convert vector in data frame
d1<-data.frame(word=names(v1),frequency=v1) #add the variable names to the data frame
head(d1,20) #visualize the 20 words most used in the first Audit Report
dtm2<-TermDocumentMatrix(audit_document2)
m2<-as.matrix(dtm2)
v2<-sort(rowSums(m2),decreasing = TRUE)
d2<-data.frame(word=names(v2),frequency=v2)
head(d2,20)
dtm3<-TermDocumentMatrix(audit_document3)
m3<-as.matrix(dtm3)
v3<-sort(rowSums(m3),decreasing = TRUE)
d3<-data.frame(word=names(v3),frequency=v3)
head(d3,20)
dtm4<-TermDocumentMatrix(audit_document4)
m4<-as.matrix(dtm4)
v4<-sort(rowSums(m4),decreasing = TRUE)
d4<-data.frame(word=names(v4),frequency=v4)
head(d4,20)
dtm5<-TermDocumentMatrix(audit_document5)
m5<-as.matrix(dtm5)
v5<-sort(rowSums(m5),decreasing = TRUE)
d5<-data.frame(word=names(v5),frequency=v5)
head(d5,20)
dtm6<-TermDocumentMatrix(audit_document6)
m6<-as.matrix(dtm6)
v6<-sort(rowSums(m6),decreasing = TRUE)
d6<-data.frame(word=names(v6),frequency=v6)
head(d6,20)
dtm7<-TermDocumentMatrix(audit_document7)
m7<-as.matrix(dtm7)
v7<-sort(rowSums(m7),decreasing = TRUE)
d7<-data.frame(word=names(v7),frequency=v7)
head(d7,20)
dtm8<-TermDocumentMatrix(audit_document8)
m8<-as.matrix(dtm8)
v8<-sort(rowSums(m8),decreasing = TRUE)
d8<-data.frame(word=names(v8),frequency=v8)
head(d8,20)
dtm9<-TermDocumentMatrix(audit_document9)
m9<-as.matrix(dtm9)
v9<-sort(rowSums(m9),decreasing = TRUE)
d9<-data.frame(word=names(v9),frequency=v9)
head(d9,20)
dtm10<-TermDocumentMatrix(audit_document10)
m10<-as.matrix(dtm10)
v10<-sort(rowSums(m10),decreasing = TRUE)
d10<-data.frame(word=names(v10),frequency=v10)
head(d10,20)
From the 10 different Data Frames is observable that the most used
words are “Audit”, “Financial”, “Statements”, “Report”, “Consolidated”.
To perform the analysis we chose Audit Reports with different lengths,
as observable from the frequency of the words.
Audit Report 1: The most frequent words have a neutral meaning,
except for the word “Fraud”. However the word is not used with a
negative connotation since the auditors completed an analysis specific
to fraud risks for this Company. Therefore, the word “Fraud” is
frequent. Based on the first 20 words, our opinion about Report 1 is
Neutral. To increase the number of words displayed, we can use the code:
head(d1,40)
Audit Report 2: Differently from Report 1, the words have lower
frequency and within the first 20 most frequent words appear the word
“Fair”. Opinion: Neutral/Optimistic
Audit Report 3: The report lead to very optimistic outcome since
three of the 20 most frequent words are: “appropriate”, “material”,
“accordance”, “assurance”. Opinion: Optimistic
Audit Report 4: As well as Report 1, the listed words have neutral
meaning. For this reason is suggested to implement the number of words
visualized. Opinion: Neutral
Audit Report 5: As well as Report 3, the report used several positive
words such as: “accordance”, “material”, “assurance”. Opinion:
Optimistic
Audit Report 6: Visualization of more words suggested.
Opinion:Neutral.
Audit Report 7: Visualization of more words suggested.
Opinion:Neutral.
Audit Report 8: Opinion: Neutral/Optimistic
Audit Report 9: Opinion: Neutral/Optimistic
Audit Report 10: Opinion: Neutral/Optimistic
To visualize words with different frequency, we used the ‘subset()’
function. We used d1 data frame as Corpus and we considered words
frequencies to create the subset.
subset(d1, with(d1, frequency %in% names(which(table(frequency)<=15))))
subset(d2, with(d2, frequency %in% names(which(table(frequency)<=15))))
subset(d3, with(d3, frequency %in% names(which(table(frequency)<=15))))
subset(d4, with(d4, frequency %in% names(which(table(frequency)<=15))))
subset(d5, with(d5, frequency %in% names(which(table(frequency)<=15))))
subset(d6, with(d6, frequency %in% names(which(table(frequency)<=15))))
subset(d7, with(d7, frequency %in% names(which(table(frequency)<=15))))
subset(d8, with(d8, frequency %in% names(which(table(frequency)<=15))))
subset(d9, with(d9, frequency %in% names(which(table(frequency)<=15))))
subset(d10, with(d10, frequency %in% names(which(table(frequency)<=15))))
To visualize every words of Audit Reports we used the ‘names()’
function
names(v1)
names(v2)
names(v3)
names(v4)
names(v5)
names(v6)
names(v7)
names(v8)
names(v9)
names(v10)
In order to find frequent terms, we used the findFreqTerms function,
imposing the number 10 as threshold. In this way, words repeated more
than 10 times are classified as frequent.
findFreqTerms(dtm1,lowfreq = 10)
findFreqTerms(dtm2,lowfreq = 10)
findFreqTerms(dtm3,lowfreq = 10)
findFreqTerms(dtm4,lowfreq = 10)
findFreqTerms(dtm5,lowfreq = 10)
findFreqTerms(dtm6,lowfreq = 10)
findFreqTerms(dtm7,lowfreq = 10)
findFreqTerms(dtm8,lowfreq = 10)
findFreqTerms(dtm9,lowfreq = 10)
findFreqTerms(dtm10,lowfreq = 10)
For the Analysis, it is also interesting to examine the association
between frequent terms. Since the most important part of the Audit
Report is the Opinion and the documents fairness, we will visualize
which words are usually associated with the words “Opinion” and
“Fair”.
findAssocs(dtm1,terms="opinion", corlimit = 0.4)
findAssocs(dtm1,terms="fair", corlimit = 0.4)
findAssocs(dtm2,terms="opinion", corlimit = 0.4)
findAssocs(dtm2,terms="fair", corlimit = 0.4)
findAssocs(dtm3,terms="opinion", corlimit = 0.4)
findAssocs(dtm3,terms="fair", corlimit = 0.4)
findAssocs(dtm4,terms="opinion", corlimit = 0.4)
findAssocs(dtm4,terms="fair", corlimit = 0.4)
findAssocs(dtm5,terms="opinion", corlimit = 0.4)
findAssocs(dtm5,terms="fair", corlimit = 0.4)
findAssocs(dtm6,terms="opinion", corlimit = 0.4)
findAssocs(dtm6,terms="fair", corlimit = 0.4)
findAssocs(dtm7,terms="opinion", corlimit = 0.4)
findAssocs(dtm7,terms="fair", corlimit = 0.4)
findAssocs(dtm8,terms="opinion", corlimit = 0.4)
findAssocs(dtm8,terms="fair", corlimit = 0.4)
findAssocs(dtm9,terms="opinion", corlimit = 0.4)
findAssocs(dtm9,terms="fair", corlimit = 0.4)
findAssocs(dtm10,terms="opinion", corlimit = 0.4)
findAssocs(dtm10,terms="fair", corlimit = 0.4)
From the association is observable that usually the word “opinion” is
followed by Positive words such as: “sufficient”, “appropriate”,
“assurance”, “reasonable”, “fairly”, “significance”, “fulfilled.”
Associated with the word “Opinion”, some of the basic features of the
Audit Process are outlined. In fact, “opinion” is also associated with:
“independent”, “material”, “standard”, “statement”, “responsibility”,
“evidence”. The words associated with “Fair” are: “presentation”,
“preparation”, “reporting”, “control”, “considerations”, “assumptions”,
“value”. In Audit Report number 6, the word “Fair” is not used, for this
reason the function gives the output: ‘numeric(0)’.
To visualize the most frequent words of each report we used a Bar
Plot
barplot(d1[1:10,]$frequency, las=2,names.arg=d1[1:10,]$word,
col = "lightblue",main = "Most frequent words in auditing report 1",
ylab = "word frequencies")
barplot(d2[1:10,]$frequency, las=2,names.arg=d2[1:10,]$word,
col = "lightyellow",main = "Most frequent words in auditing report 2",
ylab = "word frequencies")
barplot(d3[1:10,]$frequency, las=2,names.arg=d3[1:10,]$word,
col = "red",main = "Most frequent words in auditing report 3",
ylab = "word frequencies")
barplot(d4[1:10,]$frequency, las=2,names.arg=d4[1:10,]$word,
col = "lightgreen",main = "Most frequent words in auditing report 4",
ylab = "word frequencies")
barplot(d5[1:10,]$frequency, las=2,names.arg=d5[1:10,]$word,
col = "lightgrey",main = "Most frequent words in auditing report 5",
ylab = "word frequencies")
barplot(d6[1:10,]$frequency, las=2,names.arg=d6[1:10,]$word,
col = "orange",main = "Most frequent words in auditing report 6",
ylab = "word frequencies")
barplot(d7[1:10,]$frequency, las=2,names.arg=d7[1:10,]$word,
col = "Green",main = "Most frequent words in auditing report 7",
ylab = "word frequencies")
barplot(d8[1:10,]$frequency, las=2,names.arg=d8[1:10,]$word,
col = "blue",main = "Most frequent words in auditing report 8",
ylab = "word frequencies")
barplot(d9[1:10,]$frequency, las=2,names.arg=d9[1:10,]$word,
col = "purple",main = "Most frequent words in auditing report 9",
ylab = "word frequencies")
barplot(d10[1:10,]$frequency, las=2,names.arg=d10[1:10,]$word,
col = "pink",main = "Most frequent words in auditing report 10",
ylab = "word frequencies")
Thanks to the word frequencies, it is possible to create Word
Clouds
set.seed(1234)
wordcloud(words = d1$word,freq = d1$freq,min.freq = 5,
max.words = 100,random.order = FALSE,rot.per = 0.40,
colors = brewer.pal(4,"Spectral"))
wordcloud(words = d2$word,freq = d2$freq,min.freq = 5,
max.words = 100,random.order = FALSE,rot.per = 0.40,
colors = brewer.pal(4,"Blues"))
wordcloud(words = d3$word,freq = d3$freq,min.freq = 11,
max.words = 100,random.order = FALSE,rot.per = 0.40,
colors = brewer.pal(4,"Accent"))
wordcloud(words = d4$word,freq = d4$freq,min.freq = 5,
max.words = 100,random.order = FALSE,rot.per = 0.40,
colors = brewer.pal(4,"Set3"))
wordcloud(words = d5$word,freq = d5$freq,min.freq = 3,
max.words = 100,random.order = FALSE,rot.per = 0.4,
colors = brewer.pal(4,"Set2"))
wordcloud(words = d6$word,freq = d6$freq,min.freq = 5,
max.words = 100,random.order = FALSE,rot.per = 0.40,
colors = brewer.pal(4,"Oranges"))
wordcloud(words = d7$word,freq = d7$freq,min.freq = 8,
max.words = 100,random.order = FALSE,rot.per = 0.40,
colors = brewer.pal(4,"Pastel2"))
wordcloud(words = d8$word,freq = d8$freq,min.freq = 3,
max.words = 100,random.order = FALSE,rot.per = 0.30,
colors = brewer.pal(4,"Pastel1"))
wordcloud(words = d9$word,freq = d9$freq,min.freq = 5,
max.words = 100,random.order = FALSE,rot.per = 0.40,
colors = brewer.pal(4,"Dark2"))
wordcloud(words = d10$word,freq = d10$freq,min.freq = 5,
max.words = 100,random.order = FALSE,rot.per = 0.5,
colors = brewer.pal(4,"BrBG"))
Several methods can be used, with different scales, to asses whether
the intrinsic sentiment of each Audit Report is positive or negative. If
the computed mean is POSITIVE, the overall sentiment expressed in the
audit report is OPTIMISTIC. The three methods used are Syuzhet, Bing and
Afinn.
syuzhet_vector1<-get_sentiment(d1,method = "syuzhet") #analyze text based on syuzhet
summary(syuzhet_vector1)#see summary statistics of the vector
bing_vector1<-get_sentiment(audit_report1,method="bing")#analyze text based on bing
summary(bing_vector1)#see summary statistics of the vector
afinn_vector1<-get_sentiment(audit_report1,method="afinn")#analyze text based on afinn, min of -5 (most neg) to 5 (most pos)
summary(afinn_vector1)#see summary statistics of the vector
syuzhet_vector2<-get_sentiment(d2,method = "syuzhet")
summary(syuzhet_vector2)
bing_vector2<-get_sentiment(audit_report2,method="bing")
summary(bing_vector2)
afinn_vector2<-get_sentiment(audit_report2,method="afinn")
summary(afinn_vector2)
syuzhet_vector3<-get_sentiment(d3,method = "syuzhet")
summary(syuzhet_vector3)
bing_vector3<-get_sentiment(audit_report3,method="bing")
summary(bing_vector3)
afinn_vector3<-get_sentiment(audit_report3,method="afinn")
summary(afinn_vector3)
syuzhet_vector4<-get_sentiment(d4,method = "syuzhet")
summary(syuzhet_vector4)
bing_vector4<-get_sentiment(audit_report4,method="bing")
summary(bing_vector4)
afinn_vector4<-get_sentiment(audit_report4,method="afinn")
summary(afinn_vector4)
syuzhet_vector5<-get_sentiment(d5,method = "syuzhet")
summary(syuzhet_vector5)
bing_vector5<-get_sentiment(audit_report5,method="bing")
summary(bing_vector5)
afinn_vector5<-get_sentiment(audit_report5,method="afinn")
summary(afinn_vector5)
syuzhet_vector6<-get_sentiment(d6,method = "syuzhet")
summary(syuzhet_vector6)
bing_vector6<-get_sentiment(audit_report6,method="bing")
summary(bing_vector6)
afinn_vector6<-get_sentiment(audit_report6,method="afinn")
summary(afinn_vector6)
syuzhet_vector7<-get_sentiment(d7,method = "syuzhet")
summary(syuzhet_vector7)
bing_vector7<-get_sentiment(audit_report7,method="bing")
summary(bing_vector7)
afinn_vector7<-get_sentiment(audit_report7,method="afinn")
summary(afinn_vector7)
syuzhet_vector8<-get_sentiment(d8,method = "syuzhet")
summary(syuzhet_vector8)
bing_vector8<-get_sentiment(audit_report8,method="bing")
summary(bing_vector8)
afinn_vector8<-get_sentiment(audit_report8,method="afinn")
summary(afinn_vector8)
syuzhet_vector9<-get_sentiment(d9,method = "syuzhet")
summary(syuzhet_vector9)
bing_vector9<-get_sentiment(audit_report9,method="bing")
summary(bing_vector9)
afinn_vector9<-get_sentiment(audit_report9,method="afinn")
summary(afinn_vector9)
syuzhet_vector10<-get_sentiment(d10,method = "syuzhet")
summary(syuzhet_vector10)
bing_vector10<-get_sentiment(audit_report10,method="bing")
summary(bing_vector10)
afinn_vector10<-get_sentiment(audit_report10,method="afinn")
summary(afinn_vector10)
As we can see from the results, the Mean of each Audit Report is
Positive, meaning that the overall sentiment is Optimistic.
To asses if the words used in each report have a positive or negative
meaning we use ‘get_nrc_sentiment()’. After the creation of a database
with the function ‘rowSumus()’ is possible to address each word to a
given sentiment.
vector.nrc1<-get_nrc_sentiment(audit_report1)#analyze text based on nrc
df.nrc1<-data.frame(t(vector.nrc1))#transpose to create database. It shows how many words were seen in each line
#the function row Sums computes column sums across rows for each level of groups
td_new1<-data.frame(rowSums(df.nrc1[6:87]))#specify the range based on number of columns of data
vector.nrc2<-get_nrc_sentiment(audit_report2)
df.nrc2<-data.frame(t(vector.nrc2))
td_new2<-data.frame(rowSums(df.nrc2[1:20]))
vector.nrc3<-get_nrc_sentiment(audit_report3)
df.nrc3<-data.frame(t(vector.nrc3))
td_new3<-data.frame(rowSums(df.nrc3[1:69]))
vector.nrc4<-get_nrc_sentiment(audit_report4)
df.nrc4<-data.frame(t(vector.nrc4))
td_new4<-data.frame(rowSums(df.nrc4[1:44]))
vector.nrc5<-get_nrc_sentiment(audit_report5)
df.nrc5<-data.frame(t(vector.nrc5))
td_new5<-data.frame(rowSums(df.nrc5[1:18]))
vector.nrc6<-get_nrc_sentiment(audit_report6)
df.nrc6<-data.frame(t(vector.nrc6))
td_new6<-data.frame(rowSums(df.nrc6[1:136]))
vector.nrc7<-get_nrc_sentiment(audit_report7)
df.nrc7<-data.frame(t(vector.nrc7))
td_new7<-data.frame(rowSums(df.nrc7[1:51]))
vector.nrc8<-get_nrc_sentiment(audit_report8)
df.nrc8<-data.frame(t(vector.nrc8))
td_new8<-data.frame(rowSums(df.nrc8[1:11]))
vector.nrc9<-get_nrc_sentiment(audit_report9)
df.nrc9<-data.frame(t(vector.nrc9))
td_new9<-data.frame(rowSums(df.nrc9[1:51]))
vector.nrc10<-get_nrc_sentiment(audit_report10)
df.nrc10<-data.frame(t(vector.nrc10))
td_new10<-data.frame(rowSums(df.nrc10[1:33]))
To visualize the result of our Sensitivity Analysis we create a plot
for each Audit Report. In this way we observe the frequency of each
sentiment for every report.
names(td_new1)[1]<-"count"
td_new1<-cbind("sentiment"=rownames(td_new1),td_new1)
rownames(td_new1)<-NULL
td_1<-td_new1[1:10,]
#plot count of words associated with each sentiment
quickplot(sentiment,data = td_1,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new2)[1]<-"count"
td_new2<-cbind("sentiment"=rownames(td_new2),td_new2)
rownames(td_new2)<-NULL
td_2<-td_new2[1:10,]
quickplot(sentiment,data = td_2,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new3)[1]<-"count"
td_new3<-cbind("sentiment"=rownames(td_new3),td_new3)
rownames(td_new3)<-NULL
td_3<-td_new3[1:10,]
quickplot(sentiment,data = td_3,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new4)[1]<-"count"
td_new4<-cbind("sentiment"=rownames(td_new4),td_new4)
rownames(td_new4)<-NULL
td_4<-td_new4[1:10,]
quickplot(sentiment,data = td_4,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new5)[1]<-"count"
td_new5<-cbind("sentiment"=rownames(td_new5),td_new5)
rownames(td_new5)<-NULL
td_5<-td_new5[1:10,]
quickplot(sentiment,data = td_5,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new6)[1]<-"count"
td_new6<-cbind("sentiment"=rownames(td_new6),td_new6)
rownames(td_new6)<-NULL
td_6<-td_new6[1:10,]
quickplot(sentiment,data = td_6,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new7)[1]<-"count"
td_new7<-cbind("sentiment"=rownames(td_new7),td_new7)
rownames(td_new7)<-NULL
td_7<-td_new7[1:10,]
quickplot(sentiment,data = td_7,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new8)[1]<-"count"
td_new8<-cbind("sentiment"=rownames(td_new8),td_new8)
rownames(td_new8)<-NULL
td_8<-td_new8[1:10,]
quickplot(sentiment,data = td_8,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new9)[1]<-"count"
td_new9<-cbind("sentiment"=rownames(td_new9),td_new9)
rownames(td_new9)<-NULL
td_9<-td_new9[1:10,]
quickplot(sentiment,data = td_9,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
names(td_new10)[1]<-"count"
td_new10<-cbind("sentiment"=rownames(td_new10),td_new10)
rownames(td_new10)<-NULL
td_10<-td_new10[1:10,]
quickplot(sentiment,data = td_10,weight=count, geom = "bar", fill=sentiment, ylab = "count")+ggtitle("Audit Report sentiments")
From the plots is observable that the two most frequent sentiments
are “Positive” and “Trust.” Therefore, we can assume that most of the
analyzed Audit Reports are optimistic. Considering the presence of other
sentiments, we conclude that the auditors were not overly optimistic.
For this reason, the results of each report can be considered objective
and realistic. However, in the second, eight and tenth report, the
frequency of “trust” is high (almost equal to “positive” frequency). An
auditor who gives too much “trust” to a company could lead to bias and
errors in his further analysis. Therefore, the auditor should always
respect the principles of integrity, objectiveness and independence in
order to work properly.
Inherent risk can be defined as the risk posed by omission or error
in a financial statement. This risk does not occur due to failure of
internal control. The most common inherent risk factors are the
susceptibility to obsolescence and fraudulent reporting, difficulty in
creating disclosure and the need of judgment. For this reason we can
assume that the second Audit Report is more susceptible to inherent
risk.
REFERENCES Budhiraja G., Gupta S., Sharma C., Rastogi Y., “Latent
Topic Analysis”. 2016, 20 March. Retrived from: http://rstudio-pubs-static.s3.amazonaws.com/163169_c79385802d2c4448aae913abb3e0dd9e.html
Data Centric Inc. (video), “How to create natural language processing
in r on Web page data”. 2021, 28 October. Retrived from Youtube: https://www.youtube.com/watch?v=onacC9OTYv8
Edureka (video), “Introduction to Sentiment Analysis in R”. 2021.
Retrived from Youtube: https://www.youtube.com/watch?v=tFPk5Nln3aA
finnstats, “Sentiment analysis in R”. 2021, 16 May. Retrieved from
R-bloggers: https://www.r-bloggers.com/2021/05/sentiment-analysis-in-r-3/
Feuerriegel S.& Proellochs N., “SentimentAnalysis Vignette”.
2021, 18 February. Retrived from Cran.R-Project: https://cran.r-project.org/web/packages/SentimentAnalysis/vignettes/SentimentAnalysis.html
“Math of tm::findAssocs how does this function work?”. 2013. Retrived
from stackoverflow: https://stackoverflow.com/questions/14267199/math-of-tmfindassocs-how-does-this-function-work
Mhatre S., “Text Mining and Sentiment Analysis: Analysis with R”.
2020, 13 May. Retrived from RedGate: https://www.red-gate.com/simple-talk/databases/sql-server/bi-sql-server/text-mining-and-sentiment-analysis-with-r/
Schweinberger M., “Sentiment Analysis in R”.2022, 3 April. Retrieved
from LADL: https://slcladal.github.io/sentiment.html
Silge J. & Robinson D., “Text Mining with R: A Tidy Approach”,
2022, May 3. Retrieved from https://www.tidytextmining.com/sentiment.html
LS0tDQp0aXRsZTogIlRhc2sgMiINCkNyZWF0b3I6IENhcmxhIFBhcnJ1Y2NpIChjcDExMzMzMCkgJiBNYXJpbmEgR2FicmllbGEgTWl0aXRlbHUgKG1tMTEzMzI3KQ0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCkFVVEhPUlMNCi0gQ2FybGEgUGFycnVjY2ksIGNwMTEzMzMwIChTdHVkZW50IExlYWRlcikuIENvbnRyaWJ1dGlvbiB0byB0aGUgY3JlYXRpb24gb2YgdGhlIENvZGUgYW5kIFJlcG9ydA0KLSBNYXJpbmEgR2FicmllbGEgTWl0aXRlbHUsIG1tMTEzMzI3LiBDb250cmlidXRpb24gdG8gdGhlIGNyZWF0aW9uIG9mIHRoZSBDb2RlDQoNClNUQVRFTUVOVCBPRiBOT04tSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVC4NClRoZSBXb3JrIHNoYWxsIG5vdCB2aW9sYXRlIG9yIGluZnJpbmdlIHVwb24gdGhlIHJpZ2h0cyBvZiBhbnkgdGhpcmQgcGFydHksIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgcGF0ZW50IHJpZ2h0cywgY29weXJpZ2h0IHJpZ2h0cywgdHJhZGVtYXJrIHJpZ2h0cywgdHJhZGUgc2VjcmV0IHJpZ2h0cywgb3Igb3RoZXIgcHJvcHJpZXRhcnkgcmlnaHRzIG9mIGFueSBraW5kLg0KDQpDQyBMSUNFTlNFIFNUQVRFTUVOVCBGT1IgVEhFIFBST0pFQ1QNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVGhpcyBsaWNlbnNlIGFsbG93cyBhIHdvcmsgdG8gYmUgY29waWVkLCBtb2RpZmllZCwgZGlzdHJpYnV0ZWQsIHByZXNlbnRlZCwgYW5kIHBlcmZvcm1lZCBvbmx5IGlmIHRoZSBhdXRob3IgaXMgY3JlZGl0ZWQuDQoNCkNMQVNTDQpBdWRpdGluZyBDb3Vyc2UsIHllYXIgMjAyMiwgc3ByaW5nIHNlbWVzdGVyLCBXYXJzYXcgU2Nob29sIG9mIEVjb25vbWljcyAoU0dIKSwgV2Fyc2F3IChQTCkuDQoNCkxvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzDQpgYGB7cn0NCg0KcmVxdWlyZShydmVzdCkjcmVhZCBkYXRhIGZyb20gd2VicGFnZQ0KcmVxdWlyZShkcGx5cikjbGlicmFyeSByZXF1aXJlZCBmb3IgZGF0YSBmcmFtZSBtYW5pcHVsYXRpb24NCnJlcXVpcmUodG0pI3RleHQgbWluaW5nDQpyZXF1aXJlKHdvcmRjbG91ZCkjd29yZC1jbG91ZCBnZW5lcmF0b3INCnJlcXVpcmUoUkNvbG9yQnJld2VyKSNjb2xvciBwYWxldHRlcw0KcmVxdWlyZShzeXV6aGV0KSNzZW50aW1lbnQgYW5hbHlzaXMNCnJlcXVpcmUoZ2dwbG90MikjcGxvdCBncmFwaA0KDQpgYGANCkxvYWQgSFRNTCBwYWdlcyB0byBhbmFseXplIDEwIEV4dGVybmFsIEF1ZGl0IFJlcG9ydHMuDQoNCkFmdGVyIHRoZSBhbmFseXNpcyBvZiB0aGUgcmVzdWx0cywgaXQgaXMgcG9zc2libGUgdG8gYXNzdW1lIHdoZXRoZXIgdGhlIEF1ZGl0IHJlcG9ydHMgYXJlIE9wdGltaXN0aWMgb3IgUGVzc2ltaXN0aWMNCmBgYHtyfQ0Kc2FtcGxlMTwtcmVhZF9odG1sKCJodHRwczovL2FubnVhbHJlcG9ydC5kc20uY29tL2FyMjAyMC9vdGhlci1pbmZvcm1hdGlvbi9pbmRlcGVuZGVudC1hdWRpdG9yLXMtcmVwb3J0Lmh0bWwiKQ0KYXVkaXRfcmVwb3J0MTwtc2FtcGxlMSAlPiUgIGh0bWxfbm9kZXMoInAiKSAlPiUgIGh0bWxfdGV4dCgpDQojICU+JSBpcyBtdWx0aXBsZSB0aW1lcyB0byAiY2hhaW4iIGZ1bmN0aW9ucyB0b2dldGhlcg0KDQpzYW1wbGUyPC1yZWFkX2h0bWwoImh0dHA6Ly93d3cucHRhLndhLmdvdi5hdS9Qb3J0YWxzLzAvYW5udWFscmVwb3J0cy8yMDExL3B0YTIwMTF2NC9pbmRlcGVuZGVudC1hdWRpdC1vcGluaW9uLmh0bWwiKQ0KYXVkaXRfcmVwb3J0Mjwtc2FtcGxlMiAlPiUgIGh0bWxfbm9kZXMoInAiKSAlPiUgIGh0bWxfdGV4dCgpDQoNCnNhbXBsZTM8LXJlYWRfaHRtbCgiaHR0cHM6Ly9yZXBvcnQuYmFzZi5jb20vMjAyMS9lbi9maW5hbmNpYWwtc3RhdGVtZW50cy9hdWRpdC9hdWRpdG9ycy1yZXBvcnQuaHRtbCIpDQphdWRpdF9yZXBvcnQzPC1zYW1wbGUzICU+JSAgaHRtbF9ub2RlcygicCIpICU+JSAgaHRtbF90ZXh0KCkNCg0Kc2FtcGxlNDwtcmVhZF9odG1sKCJodHRwczovL2NvY2EtY29sYWZlbXNhLmNvbS9yZXBvcnRlcy9yZXBvcnRlLWFudWFsLTIwMTYvZW5nL2luZGVwZW5kZW50LWF1ZGl0b3JzLmh0bWwiKQ0KYXVkaXRfcmVwb3J0NDwtc2FtcGxlNCAlPiUgIGh0bWxfbm9kZXMoInAiKSAlPiUgIGh0bWxfdGV4dCgpDQoNCnNhbXBsZTU8LXJlYWRfaHRtbCgiaHR0cHM6Ly93d3cuY2FuYWRhLmNhL2VuL3JldmVudWUtYWdlbmN5L2NvcnBvcmF0ZS9hYm91dC1jYW5hZGEtcmV2ZW51ZS1hZ2VuY3ktY3JhL2RlcGFydG1lbnRhbC1wZXJmb3JtYW5jZS1yZXBvcnRzLzIwMTgtMTktZGVwYXJ0bWVudGFsLXJlc3VsdHMtcmVwb3J0L2lhci1hZ2VuY3ktYWN0aXZpdGllcy5odG1sIikNCmF1ZGl0X3JlcG9ydDU8LXNhbXBsZTUgJT4lICBodG1sX25vZGVzKCJwIikgJT4lICBodG1sX3RleHQoKQ0KDQpzYW1wbGU2PC1yZWFkX2h0bWwoImh0dHBzOi8vMjAyMC5hbm51YWxyZXBvcnQuc2Jtb2Zmc2hvcmUuY29tL2NvcnBvcmF0ZS1zdGF0ZW1lbnRzLTIwMjAvb3RoZXItaW5mb3JtYXRpb24vaW5kZXBlbmRlbnQtYXVkaXRvci1zLXJlcG9ydCIpDQphdWRpdF9yZXBvcnQ2PC1zYW1wbGU2ICU+JSAgaHRtbF9ub2RlcygicCIpICU+JSAgaHRtbF90ZXh0KCkNCg0Kc2FtcGxlNzwtcmVhZF9odG1sKCJodHRwczovL2FubnVhbC1yZXBvcnQucHVtYS5jb20vMjAyMC9lbi9jb25zb2xpZGF0ZWQtZmluYW5jaWFsLXN0YXRlbWVudC9pbmRlcGVuZGVudC1hdWRpdG9yLXMtcmVwb3J0Lmh0bWwiKQ0KYXVkaXRfcmVwb3J0Nzwtc2FtcGxlNyAlPiUgIGh0bWxfbm9kZXMoInAiKSAlPiUgIGh0bWxfdGV4dCgpDQoNCnNhbXBsZTg8LXJlYWRfaHRtbCgiaHR0cHM6Ly93d3cucmVtZ3JvLmNvbS9hcjIwMjEvZmluYW5jaWFsLXJlcG9ydC9yZXBvcnQtaW5kZXBlbmRlbnQtYXVkaXRvci5waHAiKQ0KYXVkaXRfcmVwb3J0ODwtc2FtcGxlOCAlPiUgIGh0bWxfbm9kZXMoInAiKSAlPiUgIGh0bWxfdGV4dCgpDQoNCnNhbXBsZTk8LXJlYWRfaHRtbCgiaHR0cHM6Ly93d3cudm9kYWNvbS1yZXBvcnRzLmNvLnphL2ludGVncmF0ZWQtcmVwb3J0cy9pci0yMDE4L2luZGVwZW5kZW50LWF1ZGl0b3JzLXJlcG9ydC1vbi10aGUtY29uc29saWRhdGVkLWFubnVhbC1maW5hbmNpYWwtc3RhdGVtZW50cy5waHAiKQ0KYXVkaXRfcmVwb3J0OTwtc2FtcGxlOSAlPiUgIGh0bWxfbm9kZXMoInAiKSAlPiUgIGh0bWxfdGV4dCgpDQoNCnNhbXBsZTEwPC1yZWFkX2h0bWwoImh0dHBzOi8vd3d3Lm1hc3NtYXJ0LmNvLnphL2lhcjIwMjAvb3VyLXBlcmZvcm1hbmNlL2luZGVwZW5kZW50LWF1ZGl0b3JzLXJlcG9ydC8iKQ0KYXVkaXRfcmVwb3J0MTA8LXNhbXBsZTEwICU+JSAgaHRtbF9ub2RlcygicCIpICU+JSAgaHRtbF90ZXh0KCkNCmBgYA0KDQpDb252ZXJ0aW9uIG9mIFZlY3RvcnMgdG8gQ29ycHVzIG9mIGVhY2ggQXVkaXQgUmVwb3J0DQpgYGB7cn0NCmF1ZGl0X2RvY3VtZW50MTwtIENvcnB1cyhWZWN0b3JTb3VyY2UoYXVkaXRfcmVwb3J0MSkpI2NyZWF0ZSBjb3JwdXMgYnkgY29udmVydGluZyB2ZWN0b3I7DQphdWRpdF9kb2N1bWVudDI8LSBDb3JwdXMoVmVjdG9yU291cmNlKGF1ZGl0X3JlcG9ydDIpKQ0KYXVkaXRfZG9jdW1lbnQzPC0gQ29ycHVzKFZlY3RvclNvdXJjZShhdWRpdF9yZXBvcnQzKSkNCmF1ZGl0X2RvY3VtZW50NDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoYXVkaXRfcmVwb3J0NCkpDQphdWRpdF9kb2N1bWVudDU8LSBDb3JwdXMoVmVjdG9yU291cmNlKGF1ZGl0X3JlcG9ydDUpKQ0KYXVkaXRfZG9jdW1lbnQ2PC0gQ29ycHVzKFZlY3RvclNvdXJjZShhdWRpdF9yZXBvcnQ2KSkNCmF1ZGl0X2RvY3VtZW50NzwtIENvcnB1cyhWZWN0b3JTb3VyY2UoYXVkaXRfcmVwb3J0NykpDQphdWRpdF9kb2N1bWVudDg8LSBDb3JwdXMoVmVjdG9yU291cmNlKGF1ZGl0X3JlcG9ydDgpKQ0KYXVkaXRfZG9jdW1lbnQ5PC0gQ29ycHVzKFZlY3RvclNvdXJjZShhdWRpdF9yZXBvcnQ5KSkNCmF1ZGl0X2RvY3VtZW50MTA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGF1ZGl0X3JlcG9ydDEwKSkNCmBgYA0KDQpUbyBwZXJmb3JtIHRoZSBzZW50aW1lbnQgYW5hbHlzaXMsIGl0IGlzIG5lY2Vzc2FyeSB0byBjb3JyZWN0IHRoZSB0ZXh0IG9mIGVhY2ggQXVkaXQgUmVwb3J0IGJ5IGNvbnZlcnRpbmcgYWxsIHNlbnRlbmNlcyB0byBsb3dlciBjYXNlLCByZW1vdmluZyBudW1iZXJzIGZyb20gdGhlIGRvY3VtZW50cywgc3RvcCB3b3JkcywgcHVuY3R1YXRpb24gYW5kIGV4dHJhIHNwYWNlcy4gSW4gdGhpcyB3YXkgUiBTdHVkaW8gaXMgYWJsZSB0byBldmFsdWF0ZSB0aGUgbWVhbmluZyBvZiBlYWNoIHdvcmQgDQpgYGB7cn0NCmF1ZGl0X2RvY3VtZW50MTwtdG1fbWFwKGF1ZGl0X2RvY3VtZW50MSwgY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkjY29udmVydCBhbGwgdGV4dCB0byBsb3dlciBjYXNlDQphdWRpdF9kb2N1bWVudDE8LXRtX21hcChhdWRpdF9kb2N1bWVudDEsIHJlbW92ZU51bWJlcnMpI3JlbW92ZSBudW1iZXJzIGZyb20gZG9jdW1lbnQNCmF1ZGl0X2RvY3VtZW50MTwtdG1fbWFwKGF1ZGl0X2RvY3VtZW50MSxyZW1vdmVXb3JkcyxzdG9wd29yZHMoa2luZCA9ICJlbiIpKSNyZW1vdmUgc3RvcCB3b3JkcyBpbiBFbmdsaXNoDQphdWRpdF9kb2N1bWVudDE8LXRtX21hcChhdWRpdF9kb2N1bWVudDEscmVtb3ZlUHVuY3R1YXRpb24pI3JlbW92ZSBwdW5jdHVhdGlvbg0KYXVkaXRfZG9jdW1lbnQxPC0gdG1fbWFwKGF1ZGl0X2RvY3VtZW50MSxzdHJpcFdoaXRlc3BhY2UpI2VsaW1pbmF0ZSBleHRyYSBzcGFjZXMNCg0KYXVkaXRfZG9jdW1lbnQyPC10bV9tYXAoYXVkaXRfZG9jdW1lbnQyLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KYXVkaXRfZG9jdW1lbnQyPC10bV9tYXAoYXVkaXRfZG9jdW1lbnQyLCByZW1vdmVOdW1iZXJzKQ0KYXVkaXRfZG9jdW1lbnQyPC10bV9tYXAoYXVkaXRfZG9jdW1lbnQyLHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDI8LXRtX21hcChhdWRpdF9kb2N1bWVudDIscmVtb3ZlUHVuY3R1YXRpb24pDQphdWRpdF9kb2N1bWVudDI8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQyLHN0cmlwV2hpdGVzcGFjZSkNCg0KYXVkaXRfZG9jdW1lbnQzPC10bV9tYXAoYXVkaXRfZG9jdW1lbnQzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KYXVkaXRfZG9jdW1lbnQzPC10bV9tYXAoYXVkaXRfZG9jdW1lbnQzLCByZW1vdmVOdW1iZXJzKQ0KYXVkaXRfZG9jdW1lbnQzPC10bV9tYXAoYXVkaXRfZG9jdW1lbnQzLHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDM8LXRtX21hcChhdWRpdF9kb2N1bWVudDMscmVtb3ZlUHVuY3R1YXRpb24pDQphdWRpdF9kb2N1bWVudDM8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQzLHN0cmlwV2hpdGVzcGFjZSkNCg0KYXVkaXRfZG9jdW1lbnQ0PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ0LCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KYXVkaXRfZG9jdW1lbnQ0PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ0LCByZW1vdmVOdW1iZXJzKQ0KYXVkaXRfZG9jdW1lbnQ0PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ0LHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDQ8LXRtX21hcChhdWRpdF9kb2N1bWVudDQscmVtb3ZlUHVuY3R1YXRpb24pDQphdWRpdF9kb2N1bWVudDQ8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQ0LHN0cmlwV2hpdGVzcGFjZSkNCg0KYXVkaXRfZG9jdW1lbnQ1PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ1LCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KYXVkaXRfZG9jdW1lbnQ1PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ1LCByZW1vdmVOdW1iZXJzKQ0KYXVkaXRfZG9jdW1lbnQ1PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ1LHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDU8LXRtX21hcChhdWRpdF9kb2N1bWVudDUscmVtb3ZlUHVuY3R1YXRpb24pDQphdWRpdF9kb2N1bWVudDU8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQ1LHN0cmlwV2hpdGVzcGFjZSkNCg0KYXVkaXRfZG9jdW1lbnQ2PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ2LCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KYXVkaXRfZG9jdW1lbnQ2PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ2LCByZW1vdmVOdW1iZXJzKQ0KYXVkaXRfZG9jdW1lbnQ2PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ2LHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDY8LXRtX21hcChhdWRpdF9kb2N1bWVudDYscmVtb3ZlUHVuY3R1YXRpb24pDQphdWRpdF9kb2N1bWVudDY8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQ2LHN0cmlwV2hpdGVzcGFjZSkNCg0KYXVkaXRfZG9jdW1lbnQ3PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ3LCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KYXVkaXRfZG9jdW1lbnQ3PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ3LCByZW1vdmVOdW1iZXJzKQ0KYXVkaXRfZG9jdW1lbnQ3PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ3LHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDc8LXRtX21hcChhdWRpdF9kb2N1bWVudDcscmVtb3ZlUHVuY3R1YXRpb24pDQphdWRpdF9kb2N1bWVudDc8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQ3LHN0cmlwV2hpdGVzcGFjZSkNCg0KYXVkaXRfZG9jdW1lbnQ4PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ4LCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KYXVkaXRfZG9jdW1lbnQ4PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ4LCByZW1vdmVOdW1iZXJzKQ0KYXVkaXRfZG9jdW1lbnQ4PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ4LHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDg8LXRtX21hcChhdWRpdF9kb2N1bWVudDgscmVtb3ZlUHVuY3R1YXRpb24pDQphdWRpdF9kb2N1bWVudDg8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQ4LHN0cmlwV2hpdGVzcGFjZSkNCg0KYXVkaXRfZG9jdW1lbnQ5PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ5LCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQ0KYXVkaXRfZG9jdW1lbnQ5PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ5LCByZW1vdmVOdW1iZXJzKQ0KYXVkaXRfZG9jdW1lbnQ5PC10bV9tYXAoYXVkaXRfZG9jdW1lbnQ5LHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDk8LXRtX21hcChhdWRpdF9kb2N1bWVudDkscmVtb3ZlUHVuY3R1YXRpb24pDQphdWRpdF9kb2N1bWVudDk8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQ5LHN0cmlwV2hpdGVzcGFjZSkNCg0KYXVkaXRfZG9jdW1lbnQxMDwtdG1fbWFwKGF1ZGl0X2RvY3VtZW50MTAsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpDQphdWRpdF9kb2N1bWVudDEwPC10bV9tYXAoYXVkaXRfZG9jdW1lbnQxMCwgcmVtb3ZlTnVtYmVycykNCmF1ZGl0X2RvY3VtZW50MTA8LXRtX21hcChhdWRpdF9kb2N1bWVudDEwLHJlbW92ZVdvcmRzLHN0b3B3b3JkcyhraW5kID0gImVuIikpDQphdWRpdF9kb2N1bWVudDEwPC10bV9tYXAoYXVkaXRfZG9jdW1lbnQxMCxyZW1vdmVQdW5jdHVhdGlvbikNCmF1ZGl0X2RvY3VtZW50MTA8LSB0bV9tYXAoYXVkaXRfZG9jdW1lbnQxMCxzdHJpcFdoaXRlc3BhY2UpDQpgYGANCg0KVG8gcGVyZm9ybSBhIHNlbnNpdGl2aXR5IGFuYWx5c2lzLCBpdCBpcyBuZWNlc3NhcnkgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCB3b3JkLg0KVXNpbmcgdGhpcyBjb2RlLCB3ZSBidWlsdCBhIHRhYmxlIHdpdGggdGhlIHdvcmRzIGFuZCBmcmVxdWVuY3kgb2YgZWFjaCBBdWRpdCBSZXBvcnQgYW5hbHl6ZWQuDQpgYGB7cn0NCmR0bTE8LVRlcm1Eb2N1bWVudE1hdHJpeChhdWRpdF9kb2N1bWVudDEpI3Rlcm0tbWF0cml4LCBpdCBjb21wdXRlcyB0aGUgd29yZHMgaW4gdGhlIFJlcG9ydCBhbmQgdGhlaXIgZnJlcXVlbmN5DQptMTwtYXMubWF0cml4KGR0bTEpI2NvbnZlcnQgdGVybXMgaW4gdGhlIG1hdHJpeCANCnYxPC1zb3J0KHJvd1N1bXMobTEpLGRlY3JlYXNpbmcgPSBUUlVFKSNjb252ZXJ0IG1hdHJpeCBpbiB2ZWN0b3INCmQxPC1kYXRhLmZyYW1lKGZyZXF1ZW5jeT12MSkjY29udmVydCB2ZWN0b3IgaW4gZGF0YSBmcmFtZQ0KZDE8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2MSksZnJlcXVlbmN5PXYxKSAjYWRkIHRoZSB2YXJpYWJsZSBuYW1lcyB0byB0aGUgZGF0YSBmcmFtZQ0KaGVhZChkMSwyMCkgI3Zpc3VhbGl6ZSB0aGUgMjAgd29yZHMgbW9zdCB1c2VkIGluIHRoZSBmaXJzdCBBdWRpdCBSZXBvcnQNCg0KZHRtMjwtVGVybURvY3VtZW50TWF0cml4KGF1ZGl0X2RvY3VtZW50MikNCm0yPC1hcy5tYXRyaXgoZHRtMikNCnYyPC1zb3J0KHJvd1N1bXMobTIpLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDI8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2MiksZnJlcXVlbmN5PXYyKQ0KaGVhZChkMiwyMCkNCg0KZHRtMzwtVGVybURvY3VtZW50TWF0cml4KGF1ZGl0X2RvY3VtZW50MykNCm0zPC1hcy5tYXRyaXgoZHRtMykNCnYzPC1zb3J0KHJvd1N1bXMobTMpLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDM8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2MyksZnJlcXVlbmN5PXYzKQ0KaGVhZChkMywyMCkNCg0KZHRtNDwtVGVybURvY3VtZW50TWF0cml4KGF1ZGl0X2RvY3VtZW50NCkNCm00PC1hcy5tYXRyaXgoZHRtNCkNCnY0PC1zb3J0KHJvd1N1bXMobTQpLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDQ8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2NCksZnJlcXVlbmN5PXY0KQ0KaGVhZChkNCwyMCkNCg0KZHRtNTwtVGVybURvY3VtZW50TWF0cml4KGF1ZGl0X2RvY3VtZW50NSkNCm01PC1hcy5tYXRyaXgoZHRtNSkNCnY1PC1zb3J0KHJvd1N1bXMobTUpLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDU8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2NSksZnJlcXVlbmN5PXY1KQ0KaGVhZChkNSwyMCkNCg0KZHRtNjwtVGVybURvY3VtZW50TWF0cml4KGF1ZGl0X2RvY3VtZW50NikNCm02PC1hcy5tYXRyaXgoZHRtNikNCnY2PC1zb3J0KHJvd1N1bXMobTYpLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDY8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2NiksZnJlcXVlbmN5PXY2KQ0KaGVhZChkNiwyMCkNCg0KZHRtNzwtVGVybURvY3VtZW50TWF0cml4KGF1ZGl0X2RvY3VtZW50NykNCm03PC1hcy5tYXRyaXgoZHRtNykNCnY3PC1zb3J0KHJvd1N1bXMobTcpLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDc8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2NyksZnJlcXVlbmN5PXY3KQ0KaGVhZChkNywyMCkNCg0KZHRtODwtVGVybURvY3VtZW50TWF0cml4KGF1ZGl0X2RvY3VtZW50OCkNCm04PC1hcy5tYXRyaXgoZHRtOCkNCnY4PC1zb3J0KHJvd1N1bXMobTgpLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDg8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2OCksZnJlcXVlbmN5PXY4KQ0KaGVhZChkOCwyMCkNCg0KZHRtOTwtVGVybURvY3VtZW50TWF0cml4KGF1ZGl0X2RvY3VtZW50OSkNCm05PC1hcy5tYXRyaXgoZHRtOSkNCnY5PC1zb3J0KHJvd1N1bXMobTkpLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDk8LWRhdGEuZnJhbWUod29yZD1uYW1lcyh2OSksZnJlcXVlbmN5PXY5KQ0KaGVhZChkOSwyMCkNCg0KZHRtMTA8LVRlcm1Eb2N1bWVudE1hdHJpeChhdWRpdF9kb2N1bWVudDEwKQ0KbTEwPC1hcy5tYXRyaXgoZHRtMTApDQp2MTA8LXNvcnQocm93U3VtcyhtMTApLGRlY3JlYXNpbmcgPSBUUlVFKQ0KZDEwPC1kYXRhLmZyYW1lKHdvcmQ9bmFtZXModjEwKSxmcmVxdWVuY3k9djEwKQ0KaGVhZChkMTAsMjApDQpgYGANCkZyb20gdGhlIDEwIGRpZmZlcmVudCBEYXRhIEZyYW1lcyBpcyBvYnNlcnZhYmxlIHRoYXQgdGhlIG1vc3QgdXNlZCB3b3JkcyBhcmUgIkF1ZGl0IiwgIkZpbmFuY2lhbCIsICJTdGF0ZW1lbnRzIiwgIlJlcG9ydCIsICJDb25zb2xpZGF0ZWQiLiBUbyBwZXJmb3JtIHRoZSBhbmFseXNpcyB3ZSBjaG9zZSBBdWRpdCBSZXBvcnRzIHdpdGggZGlmZmVyZW50IGxlbmd0aHMsIGFzIG9ic2VydmFibGUgZnJvbSB0aGUgZnJlcXVlbmN5IG9mIHRoZSB3b3Jkcy4gDQoNCkF1ZGl0IFJlcG9ydCAxOiBUaGUgbW9zdCBmcmVxdWVudCB3b3JkcyBoYXZlIGEgbmV1dHJhbCBtZWFuaW5nLCBleGNlcHQgZm9yIHRoZSB3b3JkICJGcmF1ZCIuIEhvd2V2ZXIgdGhlIHdvcmQgaXMgbm90IHVzZWQgd2l0aCBhIG5lZ2F0aXZlIGNvbm5vdGF0aW9uIHNpbmNlIHRoZSBhdWRpdG9ycyBjb21wbGV0ZWQgYW4gYW5hbHlzaXMgc3BlY2lmaWMgdG8gZnJhdWQgcmlza3MgZm9yIHRoaXMgQ29tcGFueS4gVGhlcmVmb3JlLCB0aGUgd29yZCAiRnJhdWQiIGlzIGZyZXF1ZW50LiBCYXNlZCBvbiB0aGUgZmlyc3QgMjAgd29yZHMsIG91ciBvcGluaW9uIGFib3V0IFJlcG9ydCAxIGlzIE5ldXRyYWwuDQpUbyBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzIGRpc3BsYXllZCwgd2UgY2FuIHVzZSB0aGUgY29kZTogaGVhZChkMSw0MCkNCg0KQXVkaXQgUmVwb3J0IDI6IERpZmZlcmVudGx5IGZyb20gUmVwb3J0IDEsIHRoZSB3b3JkcyBoYXZlIGxvd2VyIGZyZXF1ZW5jeSBhbmQgd2l0aGluIHRoZSBmaXJzdCAyMCBtb3N0IGZyZXF1ZW50IHdvcmRzIGFwcGVhciB0aGUgd29yZCAiRmFpciIuIE9waW5pb246IE5ldXRyYWwvT3B0aW1pc3RpYw0KDQpBdWRpdCBSZXBvcnQgMzogVGhlIHJlcG9ydCBsZWFkIHRvIHZlcnkgb3B0aW1pc3RpYyBvdXRjb21lIHNpbmNlIHRocmVlIG9mIHRoZSAyMCBtb3N0IGZyZXF1ZW50IHdvcmRzIGFyZTogImFwcHJvcHJpYXRlIiwgIm1hdGVyaWFsIiwgImFjY29yZGFuY2UiLCAiYXNzdXJhbmNlIi4gT3BpbmlvbjogT3B0aW1pc3RpYw0KDQpBdWRpdCBSZXBvcnQgNDogQXMgd2VsbCBhcyBSZXBvcnQgMSwgdGhlIGxpc3RlZCB3b3JkcyBoYXZlIG5ldXRyYWwgbWVhbmluZy4gRm9yIHRoaXMgcmVhc29uIGlzIHN1Z2dlc3RlZCB0byBpbXBsZW1lbnQgdGhlIG51bWJlciBvZiB3b3JkcyB2aXN1YWxpemVkLiBPcGluaW9uOiBOZXV0cmFsDQoNCkF1ZGl0IFJlcG9ydCA1OiBBcyB3ZWxsIGFzIFJlcG9ydCAzLCB0aGUgcmVwb3J0IHVzZWQgc2V2ZXJhbCBwb3NpdGl2ZSB3b3JkcyBzdWNoIGFzOiAiYWNjb3JkYW5jZSIsICJtYXRlcmlhbCIsICJhc3N1cmFuY2UiLiBPcGluaW9uOiBPcHRpbWlzdGljDQoNCkF1ZGl0IFJlcG9ydCA2OiBWaXN1YWxpemF0aW9uIG9mIG1vcmUgd29yZHMgc3VnZ2VzdGVkLiBPcGluaW9uOk5ldXRyYWwuDQoNCkF1ZGl0IFJlcG9ydCA3OiBWaXN1YWxpemF0aW9uIG9mIG1vcmUgd29yZHMgc3VnZ2VzdGVkLiBPcGluaW9uOk5ldXRyYWwuDQoNCkF1ZGl0IFJlcG9ydCA4OiBPcGluaW9uOiBOZXV0cmFsL09wdGltaXN0aWMNCg0KQXVkaXQgUmVwb3J0IDk6IE9waW5pb246IE5ldXRyYWwvT3B0aW1pc3RpYw0KDQpBdWRpdCBSZXBvcnQgMTA6IE9waW5pb246IE5ldXRyYWwvT3B0aW1pc3RpYw0KDQpUbyB2aXN1YWxpemUgd29yZHMgd2l0aCBkaWZmZXJlbnQgZnJlcXVlbmN5LCB3ZSB1c2VkIHRoZSAnc3Vic2V0KCknIGZ1bmN0aW9uLiBXZSB1c2VkIGQxIGRhdGEgZnJhbWUgYXMgQ29ycHVzIGFuZCB3ZSBjb25zaWRlcmVkIHdvcmRzIGZyZXF1ZW5jaWVzIHRvIGNyZWF0ZSB0aGUgc3Vic2V0Lg0KYGBge3J9DQpzdWJzZXQoZDEsIHdpdGgoZDEsIGZyZXF1ZW5jeSAlaW4lIG5hbWVzKHdoaWNoKHRhYmxlKGZyZXF1ZW5jeSk8PTE1KSkpKQ0Kc3Vic2V0KGQyLCB3aXRoKGQyLCBmcmVxdWVuY3kgJWluJSBuYW1lcyh3aGljaCh0YWJsZShmcmVxdWVuY3kpPD0xNSkpKSkNCnN1YnNldChkMywgd2l0aChkMywgZnJlcXVlbmN5ICVpbiUgbmFtZXMod2hpY2godGFibGUoZnJlcXVlbmN5KTw9MTUpKSkpDQpzdWJzZXQoZDQsIHdpdGgoZDQsIGZyZXF1ZW5jeSAlaW4lIG5hbWVzKHdoaWNoKHRhYmxlKGZyZXF1ZW5jeSk8PTE1KSkpKQ0Kc3Vic2V0KGQ1LCB3aXRoKGQ1LCBmcmVxdWVuY3kgJWluJSBuYW1lcyh3aGljaCh0YWJsZShmcmVxdWVuY3kpPD0xNSkpKSkNCnN1YnNldChkNiwgd2l0aChkNiwgZnJlcXVlbmN5ICVpbiUgbmFtZXMod2hpY2godGFibGUoZnJlcXVlbmN5KTw9MTUpKSkpDQpzdWJzZXQoZDcsIHdpdGgoZDcsIGZyZXF1ZW5jeSAlaW4lIG5hbWVzKHdoaWNoKHRhYmxlKGZyZXF1ZW5jeSk8PTE1KSkpKQ0Kc3Vic2V0KGQ4LCB3aXRoKGQ4LCBmcmVxdWVuY3kgJWluJSBuYW1lcyh3aGljaCh0YWJsZShmcmVxdWVuY3kpPD0xNSkpKSkNCnN1YnNldChkOSwgd2l0aChkOSwgZnJlcXVlbmN5ICVpbiUgbmFtZXMod2hpY2godGFibGUoZnJlcXVlbmN5KTw9MTUpKSkpDQpzdWJzZXQoZDEwLCB3aXRoKGQxMCwgZnJlcXVlbmN5ICVpbiUgbmFtZXMod2hpY2godGFibGUoZnJlcXVlbmN5KTw9MTUpKSkpDQpgYGANClRvIHZpc3VhbGl6ZSBldmVyeSB3b3JkcyBvZiBBdWRpdCBSZXBvcnRzIHdlIHVzZWQgdGhlICduYW1lcygpJyBmdW5jdGlvbiANCmBgYHtyfQ0KbmFtZXModjEpDQpuYW1lcyh2MikNCm5hbWVzKHYzKQ0KbmFtZXModjQpDQpuYW1lcyh2NSkNCm5hbWVzKHY2KQ0KbmFtZXModjcpDQpuYW1lcyh2OCkNCm5hbWVzKHY5KQ0KbmFtZXModjEwKQ0KYGBgDQpJbiBvcmRlciB0byBmaW5kIGZyZXF1ZW50IHRlcm1zLCB3ZSB1c2VkIHRoZSBmaW5kRnJlcVRlcm1zIGZ1bmN0aW9uLCBpbXBvc2luZyB0aGUgbnVtYmVyIDEwIGFzIHRocmVzaG9sZC4gSW4gdGhpcyB3YXksIHdvcmRzIHJlcGVhdGVkIG1vcmUgdGhhbiAxMCB0aW1lcyBhcmUgY2xhc3NpZmllZCBhcyBmcmVxdWVudC4NCmBgYHtyfQ0KZmluZEZyZXFUZXJtcyhkdG0xLGxvd2ZyZXEgPSAxMCkNCmZpbmRGcmVxVGVybXMoZHRtMixsb3dmcmVxID0gMTApDQpmaW5kRnJlcVRlcm1zKGR0bTMsbG93ZnJlcSA9IDEwKQ0KZmluZEZyZXFUZXJtcyhkdG00LGxvd2ZyZXEgPSAxMCkNCmZpbmRGcmVxVGVybXMoZHRtNSxsb3dmcmVxID0gMTApDQpmaW5kRnJlcVRlcm1zKGR0bTYsbG93ZnJlcSA9IDEwKQ0KZmluZEZyZXFUZXJtcyhkdG03LGxvd2ZyZXEgPSAxMCkNCmZpbmRGcmVxVGVybXMoZHRtOCxsb3dmcmVxID0gMTApDQpmaW5kRnJlcVRlcm1zKGR0bTksbG93ZnJlcSA9IDEwKQ0KZmluZEZyZXFUZXJtcyhkdG0xMCxsb3dmcmVxID0gMTApDQpgYGANCkZvciB0aGUgQW5hbHlzaXMsIGl0IGlzIGFsc28gaW50ZXJlc3RpbmcgdG8gZXhhbWluZSB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBmcmVxdWVudCB0ZXJtcy4NClNpbmNlIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoZSBBdWRpdCBSZXBvcnQgaXMgdGhlIE9waW5pb24gYW5kIHRoZSBkb2N1bWVudHMgZmFpcm5lc3MsIHdlIHdpbGwgdmlzdWFsaXplIHdoaWNoIHdvcmRzIGFyZSB1c3VhbGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgd29yZHMgIk9waW5pb24iIGFuZCAiRmFpciIuDQpgYGB7cn0NCmZpbmRBc3NvY3MoZHRtMSx0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG0xLHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtMix0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG0yLHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtMyx0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG0zLHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtNCx0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG00LHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtNSx0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG01LHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtNix0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG02LHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtNyx0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG03LHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtOCx0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG04LHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtOSx0ZXJtcz0ib3BpbmlvbiIsIGNvcmxpbWl0ID0gMC40KQ0KZmluZEFzc29jcyhkdG05LHRlcm1zPSJmYWlyIiwgY29ybGltaXQgPSAwLjQpDQoNCmZpbmRBc3NvY3MoZHRtMTAsdGVybXM9Im9waW5pb24iLCBjb3JsaW1pdCA9IDAuNCkNCmZpbmRBc3NvY3MoZHRtMTAsdGVybXM9ImZhaXIiLCBjb3JsaW1pdCA9IDAuNCkNCmBgYA0KRnJvbSB0aGUgYXNzb2NpYXRpb24gaXMgb2JzZXJ2YWJsZSB0aGF0IHVzdWFsbHkgIHRoZSB3b3JkICJvcGluaW9uIiBpcyBmb2xsb3dlZCBieSBQb3NpdGl2ZSB3b3JkcyBzdWNoIGFzOiAic3VmZmljaWVudCIsICJhcHByb3ByaWF0ZSIsICJhc3N1cmFuY2UiLCAicmVhc29uYWJsZSIsICJmYWlybHkiLCAic2lnbmlmaWNhbmNlIiwgImZ1bGZpbGxlZC4iIEFzc29jaWF0ZWQgd2l0aCB0aGUgd29yZCAiT3BpbmlvbiIsIHNvbWUgb2YgdGhlIGJhc2ljIGZlYXR1cmVzIG9mIHRoZSBBdWRpdCBQcm9jZXNzIGFyZSBvdXRsaW5lZC4gSW4gZmFjdCwgIm9waW5pb24iIGlzIGFsc28gYXNzb2NpYXRlZCB3aXRoOiAiaW5kZXBlbmRlbnQiLCAibWF0ZXJpYWwiLCAic3RhbmRhcmQiLCAic3RhdGVtZW50IiwgInJlc3BvbnNpYmlsaXR5IiwgImV2aWRlbmNlIi4NClRoZSB3b3JkcyBhc3NvY2lhdGVkIHdpdGggIkZhaXIiIGFyZTogInByZXNlbnRhdGlvbiIsICJwcmVwYXJhdGlvbiIsICJyZXBvcnRpbmciLCAiY29udHJvbCIsICJjb25zaWRlcmF0aW9ucyIsICJhc3N1bXB0aW9ucyIsICJ2YWx1ZSIuDQpJbiBBdWRpdCBSZXBvcnQgbnVtYmVyIDYsIHRoZSB3b3JkICJGYWlyIiBpcyBub3QgdXNlZCwgZm9yIHRoaXMgcmVhc29uIHRoZSBmdW5jdGlvbiBnaXZlcyB0aGUgb3V0cHV0OiAnbnVtZXJpYygwKScuDQoNClRvIHZpc3VhbGl6ZSB0aGUgbW9zdCBmcmVxdWVudCB3b3JkcyBvZiBlYWNoIHJlcG9ydCB3ZSB1c2VkIGEgQmFyIFBsb3QNCmBgYHtyfQ0KYmFycGxvdChkMVsxOjEwLF0kZnJlcXVlbmN5LCBsYXM9MixuYW1lcy5hcmc9ZDFbMToxMCxdJHdvcmQsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiLG1haW4gPSAiTW9zdCBmcmVxdWVudCB3b3JkcyBpbiBhdWRpdGluZyByZXBvcnQgMSIsDQogICAgICAgIHlsYWIgPSAid29yZCBmcmVxdWVuY2llcyIpDQoNCmJhcnBsb3QoZDJbMToxMCxdJGZyZXF1ZW5jeSwgbGFzPTIsbmFtZXMuYXJnPWQyWzE6MTAsXSR3b3JkLA0KICAgICAgICBjb2wgPSAibGlnaHR5ZWxsb3ciLG1haW4gPSAiTW9zdCBmcmVxdWVudCB3b3JkcyBpbiBhdWRpdGluZyByZXBvcnQgMiIsDQogICAgICAgIHlsYWIgPSAid29yZCBmcmVxdWVuY2llcyIpDQoNCmJhcnBsb3QoZDNbMToxMCxdJGZyZXF1ZW5jeSwgbGFzPTIsbmFtZXMuYXJnPWQzWzE6MTAsXSR3b3JkLA0KICAgICAgICBjb2wgPSAicmVkIixtYWluID0gIk1vc3QgZnJlcXVlbnQgd29yZHMgaW4gYXVkaXRpbmcgcmVwb3J0IDMiLA0KICAgICAgICB5bGFiID0gIndvcmQgZnJlcXVlbmNpZXMiKQ0KDQpiYXJwbG90KGQ0WzE6MTAsXSRmcmVxdWVuY3ksIGxhcz0yLG5hbWVzLmFyZz1kNFsxOjEwLF0kd29yZCwNCiAgICAgICAgY29sID0gImxpZ2h0Z3JlZW4iLG1haW4gPSAiTW9zdCBmcmVxdWVudCB3b3JkcyBpbiBhdWRpdGluZyByZXBvcnQgNCIsDQogICAgICAgIHlsYWIgPSAid29yZCBmcmVxdWVuY2llcyIpDQoNCmJhcnBsb3QoZDVbMToxMCxdJGZyZXF1ZW5jeSwgbGFzPTIsbmFtZXMuYXJnPWQ1WzE6MTAsXSR3b3JkLA0KICAgICAgICBjb2wgPSAibGlnaHRncmV5IixtYWluID0gIk1vc3QgZnJlcXVlbnQgd29yZHMgaW4gYXVkaXRpbmcgcmVwb3J0IDUiLA0KICAgICAgICB5bGFiID0gIndvcmQgZnJlcXVlbmNpZXMiKQ0KDQpiYXJwbG90KGQ2WzE6MTAsXSRmcmVxdWVuY3ksIGxhcz0yLG5hbWVzLmFyZz1kNlsxOjEwLF0kd29yZCwNCiAgICAgICAgY29sID0gIm9yYW5nZSIsbWFpbiA9ICJNb3N0IGZyZXF1ZW50IHdvcmRzIGluIGF1ZGl0aW5nIHJlcG9ydCA2IiwNCiAgICAgICAgeWxhYiA9ICJ3b3JkIGZyZXF1ZW5jaWVzIikNCg0KYmFycGxvdChkN1sxOjEwLF0kZnJlcXVlbmN5LCBsYXM9MixuYW1lcy5hcmc9ZDdbMToxMCxdJHdvcmQsDQogICAgICAgIGNvbCA9ICJHcmVlbiIsbWFpbiA9ICJNb3N0IGZyZXF1ZW50IHdvcmRzIGluIGF1ZGl0aW5nIHJlcG9ydCA3IiwNCiAgICAgICAgeWxhYiA9ICJ3b3JkIGZyZXF1ZW5jaWVzIikNCg0KYmFycGxvdChkOFsxOjEwLF0kZnJlcXVlbmN5LCBsYXM9MixuYW1lcy5hcmc9ZDhbMToxMCxdJHdvcmQsDQogICAgICAgIGNvbCA9ICJibHVlIixtYWluID0gIk1vc3QgZnJlcXVlbnQgd29yZHMgaW4gYXVkaXRpbmcgcmVwb3J0IDgiLA0KICAgICAgICB5bGFiID0gIndvcmQgZnJlcXVlbmNpZXMiKQ0KDQpiYXJwbG90KGQ5WzE6MTAsXSRmcmVxdWVuY3ksIGxhcz0yLG5hbWVzLmFyZz1kOVsxOjEwLF0kd29yZCwNCiAgICAgICAgY29sID0gInB1cnBsZSIsbWFpbiA9ICJNb3N0IGZyZXF1ZW50IHdvcmRzIGluIGF1ZGl0aW5nIHJlcG9ydCA5IiwNCiAgICAgICAgeWxhYiA9ICJ3b3JkIGZyZXF1ZW5jaWVzIikNCg0KYmFycGxvdChkMTBbMToxMCxdJGZyZXF1ZW5jeSwgbGFzPTIsbmFtZXMuYXJnPWQxMFsxOjEwLF0kd29yZCwNCiAgICAgICAgY29sID0gInBpbmsiLG1haW4gPSAiTW9zdCBmcmVxdWVudCB3b3JkcyBpbiBhdWRpdGluZyByZXBvcnQgMTAiLA0KICAgICAgICB5bGFiID0gIndvcmQgZnJlcXVlbmNpZXMiKQ0KDQpgYGANClRoYW5rcyB0byB0aGUgd29yZCBmcmVxdWVuY2llcywgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIFdvcmQgQ2xvdWRzDQpgYGB7cn0NCnNldC5zZWVkKDEyMzQpDQp3b3JkY2xvdWQod29yZHMgPSBkMSR3b3JkLGZyZXEgPSBkMSRmcmVxLG1pbi5mcmVxID0gNSwNCiAgICAgICAgICBtYXgud29yZHMgPSAxMDAscmFuZG9tLm9yZGVyID0gRkFMU0Uscm90LnBlciA9IDAuNDAsDQogICAgICAgICAgY29sb3JzID0gYnJld2VyLnBhbCg0LCJTcGVjdHJhbCIpKQ0KDQp3b3JkY2xvdWQod29yZHMgPSBkMiR3b3JkLGZyZXEgPSBkMiRmcmVxLG1pbi5mcmVxID0gNSwNCiAgICAgICAgICBtYXgud29yZHMgPSAxMDAscmFuZG9tLm9yZGVyID0gRkFMU0Uscm90LnBlciA9IDAuNDAsDQogICAgICAgICAgY29sb3JzID0gYnJld2VyLnBhbCg0LCJCbHVlcyIpKQ0KDQp3b3JkY2xvdWQod29yZHMgPSBkMyR3b3JkLGZyZXEgPSBkMyRmcmVxLG1pbi5mcmVxID0gMTEsDQogICAgICAgICAgbWF4LndvcmRzID0gMTAwLHJhbmRvbS5vcmRlciA9IEZBTFNFLHJvdC5wZXIgPSAwLjQwLA0KICAgICAgICAgIGNvbG9ycyA9IGJyZXdlci5wYWwoNCwiQWNjZW50IikpDQoNCndvcmRjbG91ZCh3b3JkcyA9IGQ0JHdvcmQsZnJlcSA9IGQ0JGZyZXEsbWluLmZyZXEgPSA1LA0KICAgICAgICAgIG1heC53b3JkcyA9IDEwMCxyYW5kb20ub3JkZXIgPSBGQUxTRSxyb3QucGVyID0gMC40MCwNCiAgICAgICAgICBjb2xvcnMgPSBicmV3ZXIucGFsKDQsIlNldDMiKSkNCg0Kd29yZGNsb3VkKHdvcmRzID0gZDUkd29yZCxmcmVxID0gZDUkZnJlcSxtaW4uZnJlcSA9IDMsDQogICAgICAgICAgbWF4LndvcmRzID0gMTAwLHJhbmRvbS5vcmRlciA9IEZBTFNFLHJvdC5wZXIgPSAwLjQsDQogICAgICAgICAgY29sb3JzID0gYnJld2VyLnBhbCg0LCJTZXQyIikpDQoNCndvcmRjbG91ZCh3b3JkcyA9IGQ2JHdvcmQsZnJlcSA9IGQ2JGZyZXEsbWluLmZyZXEgPSA1LA0KICAgICAgICAgIG1heC53b3JkcyA9IDEwMCxyYW5kb20ub3JkZXIgPSBGQUxTRSxyb3QucGVyID0gMC40MCwNCiAgICAgICAgICBjb2xvcnMgPSBicmV3ZXIucGFsKDQsIk9yYW5nZXMiKSkNCg0Kd29yZGNsb3VkKHdvcmRzID0gZDckd29yZCxmcmVxID0gZDckZnJlcSxtaW4uZnJlcSA9IDgsDQogICAgICAgICAgbWF4LndvcmRzID0gMTAwLHJhbmRvbS5vcmRlciA9IEZBTFNFLHJvdC5wZXIgPSAwLjQwLA0KICAgICAgICAgIGNvbG9ycyA9IGJyZXdlci5wYWwoNCwiUGFzdGVsMiIpKQ0KDQp3b3JkY2xvdWQod29yZHMgPSBkOCR3b3JkLGZyZXEgPSBkOCRmcmVxLG1pbi5mcmVxID0gMywNCiAgICAgICAgICBtYXgud29yZHMgPSAxMDAscmFuZG9tLm9yZGVyID0gRkFMU0Uscm90LnBlciA9IDAuMzAsDQogICAgICAgICAgY29sb3JzID0gYnJld2VyLnBhbCg0LCJQYXN0ZWwxIikpDQoNCndvcmRjbG91ZCh3b3JkcyA9IGQ5JHdvcmQsZnJlcSA9IGQ5JGZyZXEsbWluLmZyZXEgPSA1LA0KICAgICAgICAgIG1heC53b3JkcyA9IDEwMCxyYW5kb20ub3JkZXIgPSBGQUxTRSxyb3QucGVyID0gMC40MCwNCiAgICAgICAgICBjb2xvcnMgPSBicmV3ZXIucGFsKDQsIkRhcmsyIikpDQoNCndvcmRjbG91ZCh3b3JkcyA9IGQxMCR3b3JkLGZyZXEgPSBkMTAkZnJlcSxtaW4uZnJlcSA9IDUsDQogICAgICAgICAgbWF4LndvcmRzID0gMTAwLHJhbmRvbS5vcmRlciA9IEZBTFNFLHJvdC5wZXIgPSAwLjUsDQogICAgICAgICAgY29sb3JzID0gYnJld2VyLnBhbCg0LCJCckJHIikpDQpgYGANClNldmVyYWwgbWV0aG9kcyBjYW4gYmUgdXNlZCwgd2l0aCBkaWZmZXJlbnQgc2NhbGVzLCB0byBhc3NlcyB3aGV0aGVyIHRoZSBpbnRyaW5zaWMgc2VudGltZW50IG9mIGVhY2ggQXVkaXQgUmVwb3J0IGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLiBJZiB0aGUgY29tcHV0ZWQgbWVhbiBpcyBQT1NJVElWRSwgdGhlIG92ZXJhbGwgc2VudGltZW50IGV4cHJlc3NlZCBpbiB0aGUgYXVkaXQgcmVwb3J0IGlzIE9QVElNSVNUSUMuDQpUaGUgdGhyZWUgbWV0aG9kcyB1c2VkIGFyZSBTeXV6aGV0LCBCaW5nIGFuZCBBZmlubi4NCmBgYHtyfQ0Kc3l1emhldF92ZWN0b3IxPC1nZXRfc2VudGltZW50KGQxLG1ldGhvZCA9ICJzeXV6aGV0IikgI2FuYWx5emUgdGV4dCBiYXNlZCBvbiBzeXV6aGV0DQpzdW1tYXJ5KHN5dXpoZXRfdmVjdG9yMSkjc2VlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgdmVjdG9yDQoNCmJpbmdfdmVjdG9yMTwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQxLG1ldGhvZD0iYmluZyIpI2FuYWx5emUgdGV4dCBiYXNlZCBvbiBiaW5nDQpzdW1tYXJ5KGJpbmdfdmVjdG9yMSkjc2VlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgdmVjdG9yDQoNCmFmaW5uX3ZlY3RvcjE8LWdldF9zZW50aW1lbnQoYXVkaXRfcmVwb3J0MSxtZXRob2Q9ImFmaW5uIikjYW5hbHl6ZSB0ZXh0IGJhc2VkIG9uIGFmaW5uLCBtaW4gb2YgLTUgKG1vc3QgbmVnKSB0byA1IChtb3N0IHBvcykNCnN1bW1hcnkoYWZpbm5fdmVjdG9yMSkjc2VlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgdmVjdG9yDQoNCnN5dXpoZXRfdmVjdG9yMjwtZ2V0X3NlbnRpbWVudChkMixtZXRob2QgPSAic3l1emhldCIpIA0Kc3VtbWFyeShzeXV6aGV0X3ZlY3RvcjIpDQoNCmJpbmdfdmVjdG9yMjwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQyLG1ldGhvZD0iYmluZyIpDQpzdW1tYXJ5KGJpbmdfdmVjdG9yMikNCg0KYWZpbm5fdmVjdG9yMjwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQyLG1ldGhvZD0iYWZpbm4iKQ0Kc3VtbWFyeShhZmlubl92ZWN0b3IyKQ0KDQpzeXV6aGV0X3ZlY3RvcjM8LWdldF9zZW50aW1lbnQoZDMsbWV0aG9kID0gInN5dXpoZXQiKSANCnN1bW1hcnkoc3l1emhldF92ZWN0b3IzKQ0KDQpiaW5nX3ZlY3RvcjM8LWdldF9zZW50aW1lbnQoYXVkaXRfcmVwb3J0MyxtZXRob2Q9ImJpbmciKQ0Kc3VtbWFyeShiaW5nX3ZlY3RvcjMpDQoNCmFmaW5uX3ZlY3RvcjM8LWdldF9zZW50aW1lbnQoYXVkaXRfcmVwb3J0MyxtZXRob2Q9ImFmaW5uIikNCnN1bW1hcnkoYWZpbm5fdmVjdG9yMykNCg0Kc3l1emhldF92ZWN0b3I0PC1nZXRfc2VudGltZW50KGQ0LG1ldGhvZCA9ICJzeXV6aGV0IikgDQpzdW1tYXJ5KHN5dXpoZXRfdmVjdG9yNCkNCg0KYmluZ192ZWN0b3I0PC1nZXRfc2VudGltZW50KGF1ZGl0X3JlcG9ydDQsbWV0aG9kPSJiaW5nIikNCnN1bW1hcnkoYmluZ192ZWN0b3I0KQ0KDQphZmlubl92ZWN0b3I0PC1nZXRfc2VudGltZW50KGF1ZGl0X3JlcG9ydDQsbWV0aG9kPSJhZmlubiIpDQpzdW1tYXJ5KGFmaW5uX3ZlY3RvcjQpDQoNCnN5dXpoZXRfdmVjdG9yNTwtZ2V0X3NlbnRpbWVudChkNSxtZXRob2QgPSAic3l1emhldCIpIA0Kc3VtbWFyeShzeXV6aGV0X3ZlY3RvcjUpDQoNCmJpbmdfdmVjdG9yNTwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQ1LG1ldGhvZD0iYmluZyIpDQpzdW1tYXJ5KGJpbmdfdmVjdG9yNSkNCg0KYWZpbm5fdmVjdG9yNTwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQ1LG1ldGhvZD0iYWZpbm4iKQ0Kc3VtbWFyeShhZmlubl92ZWN0b3I1KQ0KDQpzeXV6aGV0X3ZlY3RvcjY8LWdldF9zZW50aW1lbnQoZDYsbWV0aG9kID0gInN5dXpoZXQiKSANCnN1bW1hcnkoc3l1emhldF92ZWN0b3I2KQ0KDQpiaW5nX3ZlY3RvcjY8LWdldF9zZW50aW1lbnQoYXVkaXRfcmVwb3J0NixtZXRob2Q9ImJpbmciKQ0Kc3VtbWFyeShiaW5nX3ZlY3RvcjYpDQoNCmFmaW5uX3ZlY3RvcjY8LWdldF9zZW50aW1lbnQoYXVkaXRfcmVwb3J0NixtZXRob2Q9ImFmaW5uIikNCnN1bW1hcnkoYWZpbm5fdmVjdG9yNikNCg0Kc3l1emhldF92ZWN0b3I3PC1nZXRfc2VudGltZW50KGQ3LG1ldGhvZCA9ICJzeXV6aGV0IikgDQpzdW1tYXJ5KHN5dXpoZXRfdmVjdG9yNykNCg0KYmluZ192ZWN0b3I3PC1nZXRfc2VudGltZW50KGF1ZGl0X3JlcG9ydDcsbWV0aG9kPSJiaW5nIikNCnN1bW1hcnkoYmluZ192ZWN0b3I3KQ0KDQphZmlubl92ZWN0b3I3PC1nZXRfc2VudGltZW50KGF1ZGl0X3JlcG9ydDcsbWV0aG9kPSJhZmlubiIpDQpzdW1tYXJ5KGFmaW5uX3ZlY3RvcjcpDQoNCnN5dXpoZXRfdmVjdG9yODwtZ2V0X3NlbnRpbWVudChkOCxtZXRob2QgPSAic3l1emhldCIpIA0Kc3VtbWFyeShzeXV6aGV0X3ZlY3RvcjgpDQoNCmJpbmdfdmVjdG9yODwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQ4LG1ldGhvZD0iYmluZyIpDQpzdW1tYXJ5KGJpbmdfdmVjdG9yOCkNCg0KYWZpbm5fdmVjdG9yODwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQ4LG1ldGhvZD0iYWZpbm4iKQ0Kc3VtbWFyeShhZmlubl92ZWN0b3I4KQ0KDQpzeXV6aGV0X3ZlY3Rvcjk8LWdldF9zZW50aW1lbnQoZDksbWV0aG9kID0gInN5dXpoZXQiKSANCnN1bW1hcnkoc3l1emhldF92ZWN0b3I5KQ0KDQpiaW5nX3ZlY3Rvcjk8LWdldF9zZW50aW1lbnQoYXVkaXRfcmVwb3J0OSxtZXRob2Q9ImJpbmciKQ0Kc3VtbWFyeShiaW5nX3ZlY3RvcjkpDQoNCmFmaW5uX3ZlY3Rvcjk8LWdldF9zZW50aW1lbnQoYXVkaXRfcmVwb3J0OSxtZXRob2Q9ImFmaW5uIikNCnN1bW1hcnkoYWZpbm5fdmVjdG9yOSkNCg0Kc3l1emhldF92ZWN0b3IxMDwtZ2V0X3NlbnRpbWVudChkMTAsbWV0aG9kID0gInN5dXpoZXQiKSANCnN1bW1hcnkoc3l1emhldF92ZWN0b3IxMCkNCg0KYmluZ192ZWN0b3IxMDwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQxMCxtZXRob2Q9ImJpbmciKQ0Kc3VtbWFyeShiaW5nX3ZlY3RvcjEwKQ0KDQphZmlubl92ZWN0b3IxMDwtZ2V0X3NlbnRpbWVudChhdWRpdF9yZXBvcnQxMCxtZXRob2Q9ImFmaW5uIikNCnN1bW1hcnkoYWZpbm5fdmVjdG9yMTApDQpgYGANCkFzIHdlIGNhbiBzZWUgZnJvbSB0aGUgcmVzdWx0cywgdGhlIE1lYW4gb2YgZWFjaCBBdWRpdCBSZXBvcnQgaXMgUG9zaXRpdmUsIG1lYW5pbmcgdGhhdCB0aGUgb3ZlcmFsbCBzZW50aW1lbnQgaXMgT3B0aW1pc3RpYy4gDQoNClRvIGFzc2VzIGlmIHRoZSB3b3JkcyB1c2VkIGluIGVhY2ggcmVwb3J0IGhhdmUgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBtZWFuaW5nIHdlIHVzZSAnZ2V0X25yY19zZW50aW1lbnQoKScuIEFmdGVyIHRoZSBjcmVhdGlvbiBvZiBhIGRhdGFiYXNlIHdpdGggdGhlIGZ1bmN0aW9uICdyb3dTdW11cygpJyBpcyBwb3NzaWJsZSB0byBhZGRyZXNzIGVhY2ggd29yZCB0byBhIGdpdmVuIHNlbnRpbWVudC4NCmBgYHtyfQ0KdmVjdG9yLm5yYzE8LWdldF9ucmNfc2VudGltZW50KGF1ZGl0X3JlcG9ydDEpI2FuYWx5emUgdGV4dCBiYXNlZCBvbiBucmMNCmRmLm5yYzE8LWRhdGEuZnJhbWUodCh2ZWN0b3IubnJjMSkpI3RyYW5zcG9zZSB0byBjcmVhdGUgZGF0YWJhc2UuIEl0IHNob3dzIGhvdyBtYW55IHdvcmRzIHdlcmUgc2VlbiBpbiBlYWNoIGxpbmUNCiN0aGUgZnVuY3Rpb24gcm93IFN1bXMgY29tcHV0ZXMgY29sdW1uIHN1bXMgYWNyb3NzIHJvd3MgZm9yIGVhY2ggbGV2ZWwgb2YgZ3JvdXBzDQp0ZF9uZXcxPC1kYXRhLmZyYW1lKHJvd1N1bXMoZGYubnJjMVs2Ojg3XSkpI3NwZWNpZnkgdGhlIHJhbmdlIGJhc2VkIG9uIG51bWJlciBvZiBjb2x1bW5zIG9mIGRhdGENCg0KdmVjdG9yLm5yYzI8LWdldF9ucmNfc2VudGltZW50KGF1ZGl0X3JlcG9ydDIpDQpkZi5ucmMyPC1kYXRhLmZyYW1lKHQodmVjdG9yLm5yYzIpKQ0KdGRfbmV3MjwtZGF0YS5mcmFtZShyb3dTdW1zKGRmLm5yYzJbMToyMF0pKQ0KDQp2ZWN0b3IubnJjMzwtZ2V0X25yY19zZW50aW1lbnQoYXVkaXRfcmVwb3J0MykNCmRmLm5yYzM8LWRhdGEuZnJhbWUodCh2ZWN0b3IubnJjMykpDQp0ZF9uZXczPC1kYXRhLmZyYW1lKHJvd1N1bXMoZGYubnJjM1sxOjY5XSkpDQoNCnZlY3Rvci5ucmM0PC1nZXRfbnJjX3NlbnRpbWVudChhdWRpdF9yZXBvcnQ0KQ0KZGYubnJjNDwtZGF0YS5mcmFtZSh0KHZlY3Rvci5ucmM0KSkNCnRkX25ldzQ8LWRhdGEuZnJhbWUocm93U3VtcyhkZi5ucmM0WzE6NDRdKSkNCg0KdmVjdG9yLm5yYzU8LWdldF9ucmNfc2VudGltZW50KGF1ZGl0X3JlcG9ydDUpDQpkZi5ucmM1PC1kYXRhLmZyYW1lKHQodmVjdG9yLm5yYzUpKQ0KdGRfbmV3NTwtZGF0YS5mcmFtZShyb3dTdW1zKGRmLm5yYzVbMToxOF0pKQ0KDQp2ZWN0b3IubnJjNjwtZ2V0X25yY19zZW50aW1lbnQoYXVkaXRfcmVwb3J0NikNCmRmLm5yYzY8LWRhdGEuZnJhbWUodCh2ZWN0b3IubnJjNikpDQp0ZF9uZXc2PC1kYXRhLmZyYW1lKHJvd1N1bXMoZGYubnJjNlsxOjEzNl0pKQ0KDQp2ZWN0b3IubnJjNzwtZ2V0X25yY19zZW50aW1lbnQoYXVkaXRfcmVwb3J0NykNCmRmLm5yYzc8LWRhdGEuZnJhbWUodCh2ZWN0b3IubnJjNykpDQp0ZF9uZXc3PC1kYXRhLmZyYW1lKHJvd1N1bXMoZGYubnJjN1sxOjUxXSkpDQoNCnZlY3Rvci5ucmM4PC1nZXRfbnJjX3NlbnRpbWVudChhdWRpdF9yZXBvcnQ4KQ0KZGYubnJjODwtZGF0YS5mcmFtZSh0KHZlY3Rvci5ucmM4KSkNCnRkX25ldzg8LWRhdGEuZnJhbWUocm93U3VtcyhkZi5ucmM4WzE6MTFdKSkNCg0KdmVjdG9yLm5yYzk8LWdldF9ucmNfc2VudGltZW50KGF1ZGl0X3JlcG9ydDkpDQpkZi5ucmM5PC1kYXRhLmZyYW1lKHQodmVjdG9yLm5yYzkpKQ0KdGRfbmV3OTwtZGF0YS5mcmFtZShyb3dTdW1zKGRmLm5yYzlbMTo1MV0pKQ0KDQp2ZWN0b3IubnJjMTA8LWdldF9ucmNfc2VudGltZW50KGF1ZGl0X3JlcG9ydDEwKQ0KZGYubnJjMTA8LWRhdGEuZnJhbWUodCh2ZWN0b3IubnJjMTApKQ0KdGRfbmV3MTA8LWRhdGEuZnJhbWUocm93U3VtcyhkZi5ucmMxMFsxOjMzXSkpDQpgYGANClRvIHZpc3VhbGl6ZSB0aGUgcmVzdWx0IG9mIG91ciBTZW5zaXRpdml0eSBBbmFseXNpcyB3ZSBjcmVhdGUgYSBwbG90IGZvciBlYWNoIEF1ZGl0IFJlcG9ydC4gSW4gdGhpcyB3YXkgd2Ugb2JzZXJ2ZSB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggc2VudGltZW50IGZvciBldmVyeSByZXBvcnQuDQpgYGB7cn0NCm5hbWVzKHRkX25ldzEpWzFdPC0iY291bnQiDQp0ZF9uZXcxPC1jYmluZCgic2VudGltZW50Ij1yb3duYW1lcyh0ZF9uZXcxKSx0ZF9uZXcxKQ0Kcm93bmFtZXModGRfbmV3MSk8LU5VTEwNCnRkXzE8LXRkX25ldzFbMToxMCxdDQojcGxvdCBjb3VudCBvZiB3b3JkcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBzZW50aW1lbnQNCnF1aWNrcGxvdChzZW50aW1lbnQsZGF0YSA9IHRkXzEsd2VpZ2h0PWNvdW50LCBnZW9tID0gImJhciIsIGZpbGw9c2VudGltZW50LCB5bGFiID0gImNvdW50IikrZ2d0aXRsZSgiQXVkaXQgUmVwb3J0IHNlbnRpbWVudHMiKQ0KDQpuYW1lcyh0ZF9uZXcyKVsxXTwtImNvdW50Ig0KdGRfbmV3MjwtY2JpbmQoInNlbnRpbWVudCI9cm93bmFtZXModGRfbmV3MiksdGRfbmV3MikNCnJvd25hbWVzKHRkX25ldzIpPC1OVUxMDQp0ZF8yPC10ZF9uZXcyWzE6MTAsXQ0KcXVpY2twbG90KHNlbnRpbWVudCxkYXRhID0gdGRfMix3ZWlnaHQ9Y291bnQsIGdlb20gPSAiYmFyIiwgZmlsbD1zZW50aW1lbnQsIHlsYWIgPSAiY291bnQiKStnZ3RpdGxlKCJBdWRpdCBSZXBvcnQgc2VudGltZW50cyIpDQoNCm5hbWVzKHRkX25ldzMpWzFdPC0iY291bnQiDQp0ZF9uZXczPC1jYmluZCgic2VudGltZW50Ij1yb3duYW1lcyh0ZF9uZXczKSx0ZF9uZXczKQ0Kcm93bmFtZXModGRfbmV3Myk8LU5VTEwNCnRkXzM8LXRkX25ldzNbMToxMCxdDQpxdWlja3Bsb3Qoc2VudGltZW50LGRhdGEgPSB0ZF8zLHdlaWdodD1jb3VudCwgZ2VvbSA9ICJiYXIiLCBmaWxsPXNlbnRpbWVudCwgeWxhYiA9ICJjb3VudCIpK2dndGl0bGUoIkF1ZGl0IFJlcG9ydCBzZW50aW1lbnRzIikNCg0KbmFtZXModGRfbmV3NClbMV08LSJjb3VudCINCnRkX25ldzQ8LWNiaW5kKCJzZW50aW1lbnQiPXJvd25hbWVzKHRkX25ldzQpLHRkX25ldzQpDQpyb3duYW1lcyh0ZF9uZXc0KTwtTlVMTA0KdGRfNDwtdGRfbmV3NFsxOjEwLF0NCnF1aWNrcGxvdChzZW50aW1lbnQsZGF0YSA9IHRkXzQsd2VpZ2h0PWNvdW50LCBnZW9tID0gImJhciIsIGZpbGw9c2VudGltZW50LCB5bGFiID0gImNvdW50IikrZ2d0aXRsZSgiQXVkaXQgUmVwb3J0IHNlbnRpbWVudHMiKQ0KDQpuYW1lcyh0ZF9uZXc1KVsxXTwtImNvdW50Ig0KdGRfbmV3NTwtY2JpbmQoInNlbnRpbWVudCI9cm93bmFtZXModGRfbmV3NSksdGRfbmV3NSkNCnJvd25hbWVzKHRkX25ldzUpPC1OVUxMDQp0ZF81PC10ZF9uZXc1WzE6MTAsXQ0KcXVpY2twbG90KHNlbnRpbWVudCxkYXRhID0gdGRfNSx3ZWlnaHQ9Y291bnQsIGdlb20gPSAiYmFyIiwgZmlsbD1zZW50aW1lbnQsIHlsYWIgPSAiY291bnQiKStnZ3RpdGxlKCJBdWRpdCBSZXBvcnQgc2VudGltZW50cyIpDQoNCm5hbWVzKHRkX25ldzYpWzFdPC0iY291bnQiDQp0ZF9uZXc2PC1jYmluZCgic2VudGltZW50Ij1yb3duYW1lcyh0ZF9uZXc2KSx0ZF9uZXc2KQ0Kcm93bmFtZXModGRfbmV3Nik8LU5VTEwNCnRkXzY8LXRkX25ldzZbMToxMCxdDQpxdWlja3Bsb3Qoc2VudGltZW50LGRhdGEgPSB0ZF82LHdlaWdodD1jb3VudCwgZ2VvbSA9ICJiYXIiLCBmaWxsPXNlbnRpbWVudCwgeWxhYiA9ICJjb3VudCIpK2dndGl0bGUoIkF1ZGl0IFJlcG9ydCBzZW50aW1lbnRzIikNCg0KbmFtZXModGRfbmV3NylbMV08LSJjb3VudCINCnRkX25ldzc8LWNiaW5kKCJzZW50aW1lbnQiPXJvd25hbWVzKHRkX25ldzcpLHRkX25ldzcpDQpyb3duYW1lcyh0ZF9uZXc3KTwtTlVMTA0KdGRfNzwtdGRfbmV3N1sxOjEwLF0NCnF1aWNrcGxvdChzZW50aW1lbnQsZGF0YSA9IHRkXzcsd2VpZ2h0PWNvdW50LCBnZW9tID0gImJhciIsIGZpbGw9c2VudGltZW50LCB5bGFiID0gImNvdW50IikrZ2d0aXRsZSgiQXVkaXQgUmVwb3J0IHNlbnRpbWVudHMiKQ0KDQpuYW1lcyh0ZF9uZXc4KVsxXTwtImNvdW50Ig0KdGRfbmV3ODwtY2JpbmQoInNlbnRpbWVudCI9cm93bmFtZXModGRfbmV3OCksdGRfbmV3OCkNCnJvd25hbWVzKHRkX25ldzgpPC1OVUxMDQp0ZF84PC10ZF9uZXc4WzE6MTAsXQ0KcXVpY2twbG90KHNlbnRpbWVudCxkYXRhID0gdGRfOCx3ZWlnaHQ9Y291bnQsIGdlb20gPSAiYmFyIiwgZmlsbD1zZW50aW1lbnQsIHlsYWIgPSAiY291bnQiKStnZ3RpdGxlKCJBdWRpdCBSZXBvcnQgc2VudGltZW50cyIpDQoNCm5hbWVzKHRkX25ldzkpWzFdPC0iY291bnQiDQp0ZF9uZXc5PC1jYmluZCgic2VudGltZW50Ij1yb3duYW1lcyh0ZF9uZXc5KSx0ZF9uZXc5KQ0Kcm93bmFtZXModGRfbmV3OSk8LU5VTEwNCnRkXzk8LXRkX25ldzlbMToxMCxdDQpxdWlja3Bsb3Qoc2VudGltZW50LGRhdGEgPSB0ZF85LHdlaWdodD1jb3VudCwgZ2VvbSA9ICJiYXIiLCBmaWxsPXNlbnRpbWVudCwgeWxhYiA9ICJjb3VudCIpK2dndGl0bGUoIkF1ZGl0IFJlcG9ydCBzZW50aW1lbnRzIikNCg0KbmFtZXModGRfbmV3MTApWzFdPC0iY291bnQiDQp0ZF9uZXcxMDwtY2JpbmQoInNlbnRpbWVudCI9cm93bmFtZXModGRfbmV3MTApLHRkX25ldzEwKQ0Kcm93bmFtZXModGRfbmV3MTApPC1OVUxMDQp0ZF8xMDwtdGRfbmV3MTBbMToxMCxdDQpxdWlja3Bsb3Qoc2VudGltZW50LGRhdGEgPSB0ZF8xMCx3ZWlnaHQ9Y291bnQsIGdlb20gPSAiYmFyIiwgZmlsbD1zZW50aW1lbnQsIHlsYWIgPSAiY291bnQiKStnZ3RpdGxlKCJBdWRpdCBSZXBvcnQgc2VudGltZW50cyIpDQpgYGANCkZyb20gdGhlIHBsb3RzIGlzIG9ic2VydmFibGUgdGhhdCB0aGUgdHdvIG1vc3QgZnJlcXVlbnQgc2VudGltZW50cyBhcmUgIlBvc2l0aXZlIiBhbmQgIlRydXN0LiIgVGhlcmVmb3JlLCB3ZSBjYW4gYXNzdW1lIHRoYXQgbW9zdCBvZiB0aGUgYW5hbHl6ZWQgQXVkaXQgUmVwb3J0cyBhcmUgb3B0aW1pc3RpYy4gQ29uc2lkZXJpbmcgdGhlIHByZXNlbmNlIG9mIG90aGVyIHNlbnRpbWVudHMsIHdlIGNvbmNsdWRlIHRoYXQgdGhlIGF1ZGl0b3JzIHdlcmUgbm90IG92ZXJseSBvcHRpbWlzdGljLiBGb3IgdGhpcyByZWFzb24sIHRoZSByZXN1bHRzIG9mIGVhY2ggcmVwb3J0IGNhbiBiZSBjb25zaWRlcmVkIG9iamVjdGl2ZSBhbmQgcmVhbGlzdGljLiBIb3dldmVyLCBpbiB0aGUgc2Vjb25kLCBlaWdodCBhbmQgdGVudGggcmVwb3J0LCB0aGUgZnJlcXVlbmN5IG9mICJ0cnVzdCIgaXMgaGlnaCAoYWxtb3N0IGVxdWFsIHRvICJwb3NpdGl2ZSIgZnJlcXVlbmN5KS4gQW4gYXVkaXRvciB3aG8gZ2l2ZXMgdG9vIG11Y2ggInRydXN0IiB0byBhIGNvbXBhbnkgY291bGQgbGVhZCB0byBiaWFzIGFuZCBlcnJvcnMgaW4gaGlzIGZ1cnRoZXIgYW5hbHlzaXMuIFRoZXJlZm9yZSwgdGhlIGF1ZGl0b3Igc2hvdWxkIGFsd2F5cyByZXNwZWN0IHRoZSBwcmluY2lwbGVzIG9mIGludGVncml0eSwgb2JqZWN0aXZlbmVzcyBhbmQgaW5kZXBlbmRlbmNlIGluIG9yZGVyIHRvIHdvcmsgcHJvcGVybHkuDQoNCkluaGVyZW50IHJpc2sgY2FuIGJlIGRlZmluZWQgYXMgdGhlIHJpc2sgcG9zZWQgYnkgb21pc3Npb24gb3IgZXJyb3IgaW4gYSBmaW5hbmNpYWwgc3RhdGVtZW50LiBUaGlzIHJpc2sgZG9lcyBub3Qgb2NjdXIgZHVlIHRvIGZhaWx1cmUgb2YgaW50ZXJuYWwgY29udHJvbC4gVGhlIG1vc3QgY29tbW9uIGluaGVyZW50IHJpc2sgZmFjdG9ycyBhcmUgdGhlIHN1c2NlcHRpYmlsaXR5IHRvIG9ic29sZXNjZW5jZSBhbmQgZnJhdWR1bGVudCByZXBvcnRpbmcsIGRpZmZpY3VsdHkgaW4gY3JlYXRpbmcgZGlzY2xvc3VyZSBhbmQgdGhlIG5lZWQgb2YganVkZ21lbnQuIEZvciB0aGlzIHJlYXNvbiB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHNlY29uZCBBdWRpdCBSZXBvcnQgaXMgbW9yZSBzdXNjZXB0aWJsZSB0byBpbmhlcmVudCByaXNrLg0KDQoNCg0KUkVGRVJFTkNFUw0KQnVkaGlyYWphIEcuLCBHdXB0YSBTLiwgU2hhcm1hIEMuLCBSYXN0b2dpIFkuLCAiTGF0ZW50IFRvcGljIEFuYWx5c2lzIi4gMjAxNiwgMjAgTWFyY2guIFJldHJpdmVkIGZyb206IGh0dHA6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMTYzMTY5X2M3OTM4NTgwMmQyYzQ0NDhhYWU5MTNhYmIzZTBkZDllLmh0bWwNCg0KRGF0YSBDZW50cmljIEluYy4gKHZpZGVvKSwgIkhvdyB0byBjcmVhdGUgbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nIGluIHIgb24gV2ViIHBhZ2UgZGF0YSIuIDIwMjEsIDI4IE9jdG9iZXIuIFJldHJpdmVkIGZyb20gWW91dHViZTogaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1vbmFjQzlPVFl2OA0KDQpFZHVyZWthICh2aWRlbyksICJJbnRyb2R1Y3Rpb24gdG8gU2VudGltZW50IEFuYWx5c2lzIGluIFIiLiAyMDIxLiBSZXRyaXZlZCBmcm9tIFlvdXR1YmU6IGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9dEZQazVObG4zYUENCg0KZmlubnN0YXRzLCAiU2VudGltZW50IGFuYWx5c2lzIGluIFIiLiAyMDIxLCAxNiBNYXkuIFJldHJpZXZlZCBmcm9tIFItYmxvZ2dlcnM6IGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tLzIwMjEvMDUvc2VudGltZW50LWFuYWx5c2lzLWluLXItMy8NCg0KRmV1ZXJyaWVnZWwgUy4mIFByb2VsbG9jaHMgTi4sICJTZW50aW1lbnRBbmFseXNpcyBWaWduZXR0ZSIuIDIwMjEsIDE4IEZlYnJ1YXJ5LiBSZXRyaXZlZCBmcm9tIENyYW4uUi1Qcm9qZWN0OiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvU2VudGltZW50QW5hbHlzaXMvdmlnbmV0dGVzL1NlbnRpbWVudEFuYWx5c2lzLmh0bWwNCg0KIk1hdGggb2YgdG06OmZpbmRBc3NvY3MgaG93IGRvZXMgdGhpcyBmdW5jdGlvbiB3b3JrPyIuIDIwMTMuIFJldHJpdmVkIGZyb20gc3RhY2tvdmVyZmxvdzogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQyNjcxOTkvbWF0aC1vZi10bWZpbmRhc3NvY3MtaG93LWRvZXMtdGhpcy1mdW5jdGlvbi13b3JrDQoNCk1oYXRyZSBTLiwgIlRleHQgTWluaW5nIGFuZCBTZW50aW1lbnQgQW5hbHlzaXM6IEFuYWx5c2lzIHdpdGggUiIuIDIwMjAsIDEzIE1heS4gUmV0cml2ZWQgZnJvbSBSZWRHYXRlOiBodHRwczovL3d3dy5yZWQtZ2F0ZS5jb20vc2ltcGxlLXRhbGsvZGF0YWJhc2VzL3NxbC1zZXJ2ZXIvYmktc3FsLXNlcnZlci90ZXh0LW1pbmluZy1hbmQtc2VudGltZW50LWFuYWx5c2lzLXdpdGgtci8NCg0KU2Nod2VpbmJlcmdlciBNLiwgIlNlbnRpbWVudCBBbmFseXNpcyBpbiBSIi4yMDIyLCAzIEFwcmlsLiBSZXRyaWV2ZWQgZnJvbSBMQURMOiBodHRwczovL3NsY2xhZGFsLmdpdGh1Yi5pby9zZW50aW1lbnQuaHRtbA0KDQpTaWxnZSBKLiAmIFJvYmluc29uIEQuLCAiVGV4dCBNaW5pbmcgd2l0aCBSOiBBIFRpZHkgQXBwcm9hY2giLCAyMDIyLCBNYXkgMy4gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly93d3cudGlkeXRleHRtaW5pbmcuY29tL3NlbnRpbWVudC5odG1sDQo=