About this Notebook
The google search data on this notebook comes from a google account archive
The steps outlined here to collect and analyze the data may change at any time
Below are the steps to claim your google account data
Data Analysis: Visualizing Google Searches
To get an overall idea of the search volume, we can plot searches by year
p <- ggplot(search_data, aes(year))
p + geom_bar()

After determine the years with the largest search volume we can plot monthly searches
monthly <- search_data[(search_data$year > 2014 & search_data$year< 2018), ]
ggplot(monthly) + geom_bar(aes(x = month, group = year)) +
theme(axis.text.x = element_text(angle=90)) +
facet_grid(.~year, scales="free")

Another interesting metrict is searches by Hour
p <- ggplot(search_data, aes(hour))
p + geom_bar()

We can also plot the search data by day of the week to determine day are the most active
p <- ggplot(search_data, aes(day))
p + geom_bar()

We can take it an step further and group search time with day of the week.
ggplot(search_data) +
geom_bar(aes(x = hour, group = day) ) +
facet_grid(.~day, scales = "free")

We can group the search data by year and day of the week, to visualize the overall trend
wkday <- group_by(search_data, year, day) %>% summarize(count = n())
p <- ggplot(wkday, aes(day, count, fill = year))
p + geom_bar(stat = "identity") + labs(x = "", y = "Search Volume")

Reporting: A wordcloud from Google Search Data
First we need to extract the text and clean it using regular expressions
search <- tolower(search_data$search)
#search <- iconv(search, "ASCII", "UTF-8", " ")
search <- gsub('(http|https)\\S+\\s*|(#|@)\\S+\\s*|\\n|\\"', " ", search)
search <- gsub("(.*.)\\.com(.*.)\\S+\\s|[^[:alnum:]]", " ", search)
search <- trimws(search)
After cleaning the text we can create a Text Corpus (a large and structured set of texts) and remove some words
search_corpus <- Corpus(VectorSource(search))
search_corpus <- tm_map(search_corpus, content_transformer(removePunctuation))
search_corpus <- tm_map(search_corpus, content_transformer(removeNumbers))
stopwords <- c(stopwords("english"), "chrome", "chicago", "jlroo", "google")
search_corpus <- tm_map(search_corpus, removeWords, stopwords)
search_tdm <- TermDocumentMatrix(search_corpus)
search_matrix <- as.matrix(search_tdm)
Set a threshold for the min frequency of the words to display as well as max frequency
wordcloud(d$word, d$freq, min.freq = 25, scale = c(2 , 0.5), max.words = 200)

LS0tDQp0aXRsZTogIkFuYWx5emluZyBHb29nbGUgU2VhcmNoIEhpc3RvcnkiDQphdXRob3I6ICJBc2hsZXkgS3JlbnoiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KZGF0ZTogIkphbnVhcnkgMzAsIDIwMTgiDQpzdWJ0aXRsZTogIkNNRSBHcm91cCBGb3VuZGF0aW9uIEJ1c2luZXNzIEFuYWx5dGljcyBMYWIiDQotLS0NCg0KPGJyPg0KDQotLS0tLS0tLS0tLS0tLQ0KDQojIyBBYm91dCB0aGlzIE5vdGVib29rDQoNCi0tLS0tLS0tLS0tLS0tDQoNCjxicj4NCg0KKiBUaGUgZ29vZ2xlIHNlYXJjaCBkYXRhIG9uIHRoaXMgbm90ZWJvb2sgY29tZXMgZnJvbSBhIGdvb2dsZSBhY2NvdW50IGFyY2hpdmUNCg0KKiBUaGUgc3RlcHMgb3V0bGluZWQgaGVyZSB0byBjb2xsZWN0IGFuZCBhbmFseXplIHRoZSBkYXRhIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUNCg0KKiBCZWxvdyBhcmUgdGhlIHN0ZXBzIHRvIGNsYWltIHlvdXIgZ29vZ2xlIGFjY291bnQgZGF0YSANCg0KDQo8YnI+DQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIEFuYWx5dGljcyBUb29sa2l0OiBSZXF1aXJlIFBhY2thZ2VzDQoNCi0tLS0tLS0tLS0tLS0tDQoNCjxicj4NCg0KKiBQYWNrYWdlOiB0aWR5dmVyc2UsIGx1YnJpZGF0ZSwgcnZlc3QsIHRtLCB3b3JkY2xvdWQNCg0KYGBge3IsIGVjaG89VFJVRX0NCg0KIyBIZXJlIHdlIGFyZSBjaGVja2luZyBpZiB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQNCmlmKCFyZXF1aXJlKHJ2ZXN0LCBxdWlldGx5ID0gVFJVRSkpIA0KICAjIElmIHRoZSBwYWNrYWdlIGlzIG5vdCBpbiB0aGUgc3lzdGVtIHRoZW4gaXQgd2lsbCBiZSBpbnN0YWxsDQogIGluc3RhbGwucGFja2FnZXMocnZlc3QsIGRlcGVuZGVuY2llcyA9IFRSVUUsIHF1aWV0bHkgPSBUUlVFKQ0KICAjIEhlcmUgd2UgYXJlIGxvYWRpbmcgdGhlIHBhY2thZ2UNCiAgbGlicmFyeShydmVzdCwgcXVpZXRseSA9IFRSVUUpDQoNCmlmKCFyZXF1aXJlKGx1YnJpZGF0ZSwgcXVpZXRseSA9IFRSVUUpKSANCiAgaW5zdGFsbC5wYWNrYWdlcyhsdWJyaWRhdGUsIGRlcGVuZGVuY2llcyA9IFRSVUUsIHF1aWV0bHkgPSBUUlVFKQ0KICBsaWJyYXJ5KGx1YnJpZGF0ZSwgcXVpZXRseSA9IFRSVUUpDQoNCmlmKCFyZXF1aXJlKHdvcmRjbG91ZCwgcXVpZXRseSA9IFRSVUUpKSANCiAgaW5zdGFsbC5wYWNrYWdlcyhsdWJyaWRhdGUsIGRlcGVuZGVuY2llcyA9IFRSVUUsIHF1aWV0bHkgPSBUUlVFKQ0KICBsaWJyYXJ5KHdvcmRjbG91ZCwgcXVpZXRseSA9IFRSVUUpDQoNCmlmKCFyZXF1aXJlKHRtLCBxdWlldGx5ID0gVFJVRSkpIA0KICBpbnN0YWxsLnBhY2thZ2VzKGx1YnJpZGF0ZSwgZGVwZW5kZW5jaWVzID0gVFJVRSwgcXVpZXRseSA9IFRSVUUpDQogIGxpYnJhcnkodG0sIHF1aWV0bHkgPSBUUlVFKQ0KDQppZighcmVxdWlyZSh0aWR5dmVyc2UsIHF1aWV0bHkgPSBUUlVFKSkNCiAgaW5zdGFsbC5wYWNrYWdlcyh0aWR5dmVyc2UsIGRlcGVuZGVuY2llcyA9IFRSVUUsIHF1aWV0bHkgPSBUUlVFKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSwgcXVpZXRseSA9IFRSVUUpDQoNCmBgYA0KDQo8YnI+DQoNCi0tLS0tLS0tLS0tLS0tDQoNCg0KLS0tLS0tLS0tLS0tLS0NCg0KPGJyPg0KDQojIyMjIDEpIFNpZ24gaW50byB5b3VyIGdvb2dsZSBhY2NvdW50LCB0aGVuIEdvIHRvOg0KKiBodHRwczovL215YWNjb3VudC5nb29nbGUuY29tL3ByaXZhY3kNCg0KIyMjIyAyKSBGaW5kIHRoZSBsaW5rIHRvIGRvd25sb2FkIHlvdXIgZGF0YSBhcmNoaXZlIG9yIEdvIHRvOiANCiogaHR0cHM6Ly90YWtlb3V0Lmdvb2dsZS5jb20vc2V0dGluZ3MvdGFrZW91dA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ2ltZ3MvaW1nMDEucG5nJykNCg0KYGBgDQoNCjxicj4NCg0KIyMjIyAzKSBTZWxlY3QgYWxsIEdvb2dsZSBwcm9kdWN0cyB0byBjcmVhdGUgYSBjb21wbGV0ZSBhcmNoaXZlIG9mIHlvdXIgZGF0YQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ2ltZ3MvaW1nMDIucG5nJykNCg0KYGBgDQoNCjxicj4NCg0KIyMjIyA0KSBBZnRlciBzZWxlY3RpbmcgdGhlIHByb2R1Y3RzLCBjaG9vc2UgdGhlIGZpbGUgdHlwZSBhbmQgbWF4IGFyY2hpdmUgc2l6ZSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgeW91ciBhY2NvdW50IGRhdGEgaXMgYXJjaGl2ZQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ2ltZ3MvaW1nMDMucG5nJykNCg0KYGBgDQoNCjxicj4NCg0KLS0tLS0tLS0tLS0tLS0NCg0KIyMgRGF0YSBQcmVwYXJhdGlvbjogRXh0cmFjdGluZyBHb29nbGUgU2VhcmNoIEluZm9ybWF0aW9uDQoNCi0tLS0tLS0tLS0tLS0tDQoNCjxicj4NCg0KIyMjIExvY2F0ZSB0aGUgR29vZ2xlIGFyY2hpdmUsIHRoZW4gZmluZCB0aGUgc2VhcmNoIGRhdGEuIEZvciB0aGlzIGNhc2UsIGl0IGlzIGFuIGh0bWwgZmlsZSBsb2NhdGVkIGluICJNeSBBY3Rpdml0eSIgZm9sZGVyIiB0aGVuIGZpbmQgdGhlICJTZWFyY2giIGZvbGRlciBhbmQgdGhlIGh0bWwgZmlsZSAiTXlBY3Rpdml0eS5odG1sIiBzaG91bGQgYmUgdGhlcmU6DQoNCiogVGFrZW91dCAtPiBNeSBBY3Rpdml0eSAtPiBTZWFyY2ggLT4gTXlBY3Rpdml0eS5odG1sIA0KDQojIyMgVXNpbmcgdGhlIHJ2ZXN0IHBhY2thZ2Ugd2UgY2FuIHJlYWQgdGhlIGh0bWwgZG9jdW1lbnQgdGhhdCBjb250YWlucyB0aGUgcmVsYXRlZCBnb29nbGUgc2VhcmNoIGRhdGENCg0KYGBge3J9DQoNCmRvYyA8LSAiVGFrZW91dC9NeSBBY3Rpdml0eS9TZWFyY2gvTXlBY3Rpdml0eS5odG1sIg0Kc2VhcmNoX2FyY2hpdmUgPC0gcmVhZF9odG1sKGRvYykNCg0KYGBgDQoNCjxicj4NCg0KLS0tLS0tLS0tLS0tLS0NCg0KIyMjIExhdmVyYWdpbmcgcmVndWxhciBleHByZXNzaW9uIHdlIGNhbiBzZWFyY2ggdGhlIGh0bWwgZG9jdW1lbnQgdG8gZXh0cmFjdDoNCg0KPGJyPg0KDQojIyMjIEV4dHJhY3QgU2VhcmNoIFRpbWUNCmBgYHtyfQ0KDQpkYXRlX3NlYXJjaCA8LSBzZWFyY2hfYXJjaGl2ZSAlPiUgDQogIGh0bWxfbm9kZXMoeHBhdGggPSAnLy9kaXZbQGNsYXNzPSJtZGwtZ3JpZCJdL2Rpdi9kaXYnKSAlPiUgDQogIHN0cl9leHRyYWN0KHBhdHRlcm4gPSAiKD88PTxicj4pKC4qKSg/PD1QTXxBTSkiKSAlPiUNCiAgbWR5X2htcygpDQoNCmBgYA0KDQo8YnI+DQoNCiMjIyMgRXh0cmFjdCBTZWFyY2ggVGV4dA0KYGBge3J9DQoNCnRleHRfc2VhcmNoIDwtIHNlYXJjaF9hcmNoaXZlICU+JSANCiAgaHRtbF9ub2Rlcyh4cGF0aCA9ICcvL2RpdltAY2xhc3M9Im1kbC1ncmlkIl0vZGl2L2RpdicpICU+JQ0KICBzdHJfZXh0cmFjdChwYXR0ZXJuID0gJyg/PD08YSkoLiopKD89PC9hPiknKSAlPiUgDQogIHN0cl9leHRyYWN0KHBhdHRlcm4gPSAnKD88PVwiPikoLiopJykNCg0KYGBgDQoNCjxicj4NCg0KIyMjIyBFeHRyYWN0IFNlYXJjaCBUeXBlDQpgYGB7cn0NCg0KdHlwZV9zZWFyY2ggPC0gc2VhcmNoX2FyY2hpdmUgJT4lIA0KICBodG1sX25vZGVzKHhwYXRoID0gJy8vZGl2W0BjbGFzcz0ibWRsLWdyaWQiXS9kaXYvZGl2JykgJT4lIA0KICBzdHJfZXh0cmFjdChwYXR0ZXJuID0gIig/PD1tZGwtdHlwb2dyYXBoeS0tYm9keS0xXCI+KSguKikoPz08YSkiKSAlPiUgDQogIHN0cl9leHRyYWN0KHBhdHRlcm4gPSAiKFxcdyspKD89XFxzKSIpDQoNCmBgYA0KDQo8YnI+DQoNCiMjIyMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB1c2luZyB0aGUgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgaHRtbCBmaWxlDQpgYGB7cn0NCg0Kc2VhcmNoX2RhdGEgPC0gdGliYmxlKHRpbWVzdGFtcCA9IGRhdGVfc2VhcmNoLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGUgPSBhc19kYXRlKGRhdGVfc2VhcmNoKSwNCiAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0geWVhcihkYXRlX3NlYXJjaCksDQogICAgICAgICAgICAgICAgICAgICAgbW9udGggPSBtb250aChkYXRlX3NlYXJjaCwgbGFiZWwgPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICBkYXkgPSB3ZWVrZGF5cyhkYXRlX3NlYXJjaCksDQogICAgICAgICAgICAgICAgICAgICAgaG91ciA9IGhvdXIoZGF0ZV9zZWFyY2gpLA0KICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlX3NlYXJjaCwNCiAgICAgICAgICAgICAgICAgICAgICBzZWFyY2ggPSB0ZXh0X3NlYXJjaCkNCg0Kc2VhcmNoX2RhdGEkZGF5IDwtIGZhY3RvcihzZWFyY2hfZGF0YSRkYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZWRuZXNkYXkiLCJUaHVyc2RheSIsICJGcmlkYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYXR1cmRheSIpKQ0KDQpzZWFyY2hfZGF0YSA8LSBuYS5vbWl0KHNlYXJjaF9kYXRhKQ0KDQpoZWFkKHNlYXJjaF9kYXRhKQ0KDQpgYGANCg0KPGJyPg0KDQotLS0tLS0tLS0tLS0tLQ0KDQojIyBEYXRhIEFuYWx5c2lzOiBWaXN1YWxpemluZyBHb29nbGUgU2VhcmNoZXMNCg0KLS0tLS0tLS0tLS0tLS0NCg0KPGJyPg0KDQojIyMjIFRvIGdldCBhbiBvdmVyYWxsIGlkZWEgb2YgdGhlIHNlYXJjaCB2b2x1bWUsIHdlIGNhbiBwbG90IHNlYXJjaGVzIGJ5IHllYXIgDQoNCmBgYHtyfQ0KDQpwIDwtIGdncGxvdChzZWFyY2hfZGF0YSwgYWVzKHllYXIpKQ0KcCArIGdlb21fYmFyKCkNCg0KYGBgDQoNCjxicj4NCg0KIyMjIyBBZnRlciBkZXRlcm1pbmUgdGhlIHllYXJzIHdpdGggdGhlIGxhcmdlc3Qgc2VhcmNoIHZvbHVtZSB3ZSBjYW4gcGxvdCBtb250aGx5IHNlYXJjaGVzDQpgYGB7cn0NCg0KbW9udGhseSA8LSBzZWFyY2hfZGF0YVsoc2VhcmNoX2RhdGEkeWVhciA+IDIwMTQgJiBzZWFyY2hfZGF0YSR5ZWFyPCAyMDE4KSwgXQ0KDQpnZ3Bsb3QobW9udGhseSkgKyBnZW9tX2JhcihhZXMoeCA9IG1vbnRoLCBncm91cCA9IHllYXIpKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKw0KICBmYWNldF9ncmlkKC5+eWVhciwgc2NhbGVzPSJmcmVlIikNCg0KYGBgDQoNCjxicj4NCg0KIyMjIyBBbm90aGVyIGludGVyZXN0aW5nIG1ldHJpY3QgaXMgc2VhcmNoZXMgYnkgSG91cg0KYGBge3J9DQoNCnAgPC0gZ2dwbG90KHNlYXJjaF9kYXRhLCBhZXMoaG91cikpDQpwICsgZ2VvbV9iYXIoKQ0KDQpgYGANCg0KPGJyPg0KDQojIyMjIFdlIGNhbiBhbHNvIHBsb3QgdGhlIHNlYXJjaCBkYXRhIGJ5IGRheSBvZiB0aGUgd2VlayB0byBkZXRlcm1pbmUgZGF5IGFyZSB0aGUgbW9zdCBhY3RpdmUNCmBgYHtyfQ0KDQpwIDwtIGdncGxvdChzZWFyY2hfZGF0YSwgYWVzKGRheSkpDQpwICsgZ2VvbV9iYXIoKQ0KDQpgYGANCg0KPGJyPg0KDQojIyMjIFdlIGNhbiB0YWtlIGl0IGFuIHN0ZXAgZnVydGhlciBhbmQgZ3JvdXAgc2VhcmNoIHRpbWUgd2l0aCBkYXkgb2YgdGhlIHdlZWsuIA0KYGBge3J9DQoNCmdncGxvdChzZWFyY2hfZGF0YSkgKyANCiAgZ2VvbV9iYXIoYWVzKHggPSBob3VyLCBncm91cCA9IGRheSkgKSArDQogIGZhY2V0X2dyaWQoLn5kYXksIHNjYWxlcyA9ICJmcmVlIikNCg0KYGBgDQoNCjxicj4NCg0KIyMjIyBXZSBjYW4gZ3JvdXAgdGhlIHNlYXJjaCBkYXRhIGJ5IHllYXIgYW5kIGRheSBvZiB0aGUgd2VlaywgdG8gdmlzdWFsaXplIHRoZSBvdmVyYWxsIHRyZW5kIA0KYGBge3J9DQoNCndrZGF5IDwtIGdyb3VwX2J5KHNlYXJjaF9kYXRhLCB5ZWFyLCBkYXkpICU+JSBzdW1tYXJpemUoY291bnQgPSBuKCkpDQpwIDwtIGdncGxvdCh3a2RheSwgYWVzKGRheSwgY291bnQsIGZpbGwgPSB5ZWFyKSkgDQpwICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgbGFicyh4ID0gIiIsIHkgPSAiU2VhcmNoIFZvbHVtZSIpDQoNCmBgYA0KDQo8YnI+DQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIFJlcG9ydGluZzogQSB3b3JkY2xvdWQgZnJvbSBHb29nbGUgU2VhcmNoIERhdGENCg0KLS0tLS0tLS0tLS0tLS0NCg0KPGJyPg0KDQojIyMjIEZpcnN0IHdlIG5lZWQgdG8gZXh0cmFjdCB0aGUgdGV4dCBhbmQgY2xlYW4gaXQgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucw0KYGBge3J9DQoNCnNlYXJjaCA8LSB0b2xvd2VyKHNlYXJjaF9kYXRhJHNlYXJjaCkNCiNzZWFyY2ggPC0gaWNvbnYoc2VhcmNoLCAiQVNDSUkiLCAiVVRGLTgiLCAiICIpDQpzZWFyY2ggPC0gZ3N1YignKGh0dHB8aHR0cHMpXFxTK1xccyp8KCN8QClcXFMrXFxzKnxcXG58XFwiJywgIiAiLCBzZWFyY2gpDQpzZWFyY2ggPC0gZ3N1YigiKC4qLilcXC5jb20oLiouKVxcUytcXHN8W15bOmFsbnVtOl1dIiwgIiAiLCBzZWFyY2gpDQpzZWFyY2ggPC0gdHJpbXdzKHNlYXJjaCkNCg0KYGBgDQoNCjxicj4NCg0KIyMjIyBBZnRlciBjbGVhbmluZyB0aGUgdGV4dCB3ZSBjYW4gY3JlYXRlIGEgVGV4dCBDb3JwdXMgKGEgbGFyZ2UgYW5kIHN0cnVjdHVyZWQgc2V0IG9mIHRleHRzKSBhbmQgcmVtb3ZlIHNvbWUgd29yZHMgDQpgYGB7cn0NCg0Kc2VhcmNoX2NvcnB1cyA8LSAgQ29ycHVzKFZlY3RvclNvdXJjZShzZWFyY2gpKQ0Kc2VhcmNoX2NvcnB1cyA8LSB0bV9tYXAoc2VhcmNoX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQpzZWFyY2hfY29ycHVzIDwtIHRtX21hcChzZWFyY2hfY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHJlbW92ZU51bWJlcnMpKQ0Kc3RvcHdvcmRzIDwtIGMoc3RvcHdvcmRzKCJlbmdsaXNoIiksICJjaHJvbWUiLCAiY2hpY2FnbyIsICJqbHJvbyIsICJnb29nbGUiKQ0Kc2VhcmNoX2NvcnB1cyA8LSB0bV9tYXAoc2VhcmNoX2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcykNCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQoNCnNlYXJjaF90ZG0gPC0gVGVybURvY3VtZW50TWF0cml4KHNlYXJjaF9jb3JwdXMpDQpzZWFyY2hfbWF0cml4IDwtIGFzLm1hdHJpeChzZWFyY2hfdGRtKQ0KDQpgYGANCg0KDQo8YnI+DQoNCiMjIyMgVXNpbmcgdGhlIFRlcm0gRG9jdW1lbnQgbWF0cml4IHdlIGNhbiBjcmVhdGUgYSBkYXRhIGZyYW1lIHdpdGggdGhlIHdvcmRzIGFuZCBpdHMgcmVsYXRlZCBmcmVxdWVuY2llcyANCmBgYHtyfQ0KDQp2IDwtIHNvcnQocm93U3VtcyhzZWFyY2hfbWF0cml4KSwgZGVjcmVhc2luZyA9IFRSVUUpDQp0d19uYW1lcyA8LSBuYW1lcyh2KQ0KZCA8LSBkYXRhLmZyYW1lKHdvcmQgPSB0d19uYW1lcywgZnJlcSA9IHYpDQoNCmBgYA0KDQo8YnI+DQoNCiMjIyMgU2V0IGEgdGhyZXNob2xkIGZvciB0aGUgbWluIGZyZXF1ZW5jeSBvZiB0aGUgd29yZHMgdG8gZGlzcGxheSBhcyB3ZWxsIGFzIG1heCBmcmVxdWVuY3kNCmBgYHtyfQ0KDQp3b3JkY2xvdWQoZCR3b3JkLCBkJGZyZXEsIG1pbi5mcmVxID0gMjUsIHNjYWxlID0gYygyICwgMC41KSwgbWF4LndvcmRzID0gMjAwKQ0KDQpgYGANCg==