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=