系統參數設定
Sys.setlocale(category = "LC_ALL", locale = "zh_TW.UTF-8") # 避免中文亂碼
[1] "zh_TW.UTF-8/zh_TW.UTF-8/zh_TW.UTF-8/C/zh_TW.UTF-8/zh_TW.UTF-8"
載入套件
require(dplyr)
require(tidytext)
require(jiebaR)
library(stringr)
library(wordcloud2)
library(ggplot2)
library(tidyr)
library(scales)
# 讀入事先抓下來的PTT 資料
like_data = fread('data/ptt_LiKeTaiTai.csv',encoding = 'UTF-8')
# 設定資料清理函式
# 觀察抓下來的討論內容(artContent) 存在貼圖網址及_
clean = function(txt) {
txt = gsub("(http|https)://.*", "", txt) # 去除網址
txt = gsub("_", " ", txt) # 底線換成空白
txt }
# 針對分析的欄位進行資料清理
like_data$artDate = like_data$artDate %>% as.Date("%Y/%m/%d")
like_data$artContent = clean(like_data$artContent)
like_data = like_data %>%
filter(nchar(artContent) > 0) # 去除空字串(有的只貼了一張圖)
like_data
透過jiebar 進行斷詞
# 採用jieba 預設的字典,斷詞後的結果會將部份詞拆開("理科太太" => "理科","太太")
# 故加入自定義的詞彙字典進行調整
jieba_tokenizer <- worker(user="dict/liketaitai.dict")
# 設定斷詞function
like_tokenizer <- function(t) {
lapply(t, function(x) {
tokens <- segment(x, jieba_tokenizer)
return(tokens)
})
}
# 進行斷詞
tokens = like_data %>%
unnest_tokens(word, artContent, token=like_tokenizer)
# 統計字頻
tokens = tokens %>%
select(artDate, word) %>%
group_by(artDate, word) %>%
mutate(count = n()) %>%
ungroup() %>%
distinct() # 己經統計過數量;去除重複資料
tokens
透過文字雲查看斷詞結果
# 文字雲部份,想看的是詞在整個內容出現的數量
# 故需排除日期
tokens %>%
count(word, sort = TRUE) %>%
wordcloud2()
繪製討論數量時序圖 (每天有多少的討論文章)
# 計算要顯示的圖形資料
like_date.plotdata =
like_data %>%
group_by(artDate) %>%
summarise(count = n()) # 計算每天討論數量
# 計算要標示的前n 筆資料
like_data.labels =
like_date.plotdata %>%
mutate(label = format(artDate, "%m-%d")) %>%
arrange(-count) %>% # 倒序排列
top_n(3, count) # 只顯示前n筆資料
# 繪製時序圖
like_date.plotdata %>%
ggplot(aes(x = artDate, y=count)) +
geom_col() +
ggtitle("時間數量序列") +
xlab("日期") +
ylab("數量") +
theme(text = element_text(family = "Heiti TC Light")) +
scale_x_date(date_breaks = "15 day", date_labels = "%m-%d") + # 每15天顯示一個時間
geom_text(data = like_data.labels, aes(x = artDate, y = count, label = label), colour="blue") # 在圖上標示日期

理科太太於2018年6月7日創立YouTube頻道並以「理科太太」為名拍攝影片,號稱擁有170高智商的《理科太太》上傳的第一支影片是2018/06/12,年底則是理科太太人氣大爆發(10月底就有20萬訂閱),於是ppt上第一篇文章落在9/29發文的主題是「理科太太在紅什麼??」 2019/01/08出現高峰是因為與聖結石合作,1/20的高峰是因為理科太太近日時常邀請藝人參加自己的Youtube節目,且發布影片頻率快使曝光率提升(去年12月1日至今年1月20日這51天內她就上傳了23支影片),因此談論文章數增加。3月份因涉及違反藥事法,可惜PPT爬文只能抓到1/20
建立情緒字典
# 採用0319 助教提供的情緒字典
p <- read_file("dict/liwc/positive.txt")
n <- read_file("dict/liwc/negative.txt")
positive <- strsplit(p, ",")[[1]] # strplit 回傳list; 透過[[1]] 取回list 內第一個變量的值
negative <- strsplit(n, ",")[[1]]
positive <- data.frame(word = positive, sentiments = "positive", stringsAsFactors = FALSE) # 轉成dataframe 物件
negative <- data.frame(word = negative, sentiemtns = "negative", stringsAsFactors = FALSE)
colnames(negative) = c("word","sentiment")
colnames(positive) = c("word","sentiment")
LIWC_ch <- rbind(positive, negative) # 結合兩個dataframe
# 進行情緒標�註
tokens = tokens %>%
inner_join(LIWC_ch, by = "word") # 與情緒字典合併,僅保留情緒字典中有的文字
#tokens %>%
# select(artDate, word, count, sentiment.x, sentiment.y) %>%
# distinct(artDate, word)
tokens
繪制每日討論中,positive/negative 的數量
# 準備繪製用的資料(每日的positive, negative 數量)
plot_table_line = tokens %>%
group_by(artDate, sentiment) %>% # 依據artDate, sentiment 作群組化
summarise(count=sum(count)) # 針對群組內的count,進行加總
# 繪製圖形
plot_table_line %>%
ggplot() +
geom_line(aes(x=artDate, y=count, colour=sentiment)) +
scale_x_date(labels = date_format("%m/%d"))

由於曲線型的圖,不易看出確切的數量;
繪製長條圖進行查看
# 基本上與plot_table_bar 相同
# 但由於不想看沒有資料的日期,故先將日期轉成factor
plot_table_bar = tokens %>%
mutate(artDate = factor(format(artDate, format = '%Y-%m-%d'))) %>% # 將日期轉成factor. 不顯示中間無資料的日期
group_by(artDate, sentiment) %>% # 依據artDate, sentiment 作群組化
mutate(count=sum(count)) # 計算每天正負情緒各有多少筆
# 繪製圖形
plot_table_bar %>%
ggplot(aes(x = artDate)) +
geom_bar(aes(fill = sentiment)) +
theme(text = element_text(family = "Heiti TC Light")) +
theme(axis.text.x=element_text(angle = 90)) # 旋轉x 軸文字. 避免都連在一起看不見

由上圖看來,在有討論的發言中,正負評是差不多的狀況 但有數個負評較高的可能事推測如下 《理科太太》網路負面口碑的上一個高點出現在網友爆料曾悔婚,當時引來網友群起批評,但事後被發現是胡亂造謠。 1月19日部落客發表五大理由打臉文章,《理科太太》僅在IG上簡短回應「我的智商應該是沒有問題」,並無正面回應,文章持續在> 網路上發酵後,1月20日創下PPT負面聲量最高峰
觀察pasitive and negative 中較常出現的詞
tokens %>%
count(word, sentiment, sort = TRUE) %>%
group_by(sentiment) %>%
top_n(10, n) %>% # 保留前10筆資料 (若有相同的值,則會一起保留)
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(y = "Contribution to sentiment",
x = NULL) +
coord_flip() +
theme(text = element_text(family = "Heiti TC Light"))

LS0tCnRpdGxlOiAiUFRUIOS4iumXnOaWvOeQhuenkeWkquWkqueahOaWh+eroOaDhee3kuWIhuaekCIKYXV0aG9yOiAiTjA0NDAyMDAxMiDmnZznkYvojLk8YnIvPk4wNDQwMjAwMjYg5by16ZuF5am3PGJyLz5OMDY0MDIwMDE1IOmQmOaYjuW/lzxici8+TjA2NDIyMDAwNyDpmbPmhaflgKk8YnIvPk4wNjQyMjAwMDkg6Kyd5Yex5aiBPGJyLz5OMDY0MjIwMDI2IOWKieW/l+aUvyIKZGF0ZTogIjIwMTkvMDMvMzEiCm91dHB1dDogaHRtbF9ub3RlYm9vawphYnN0cmFjdDogIiIKLS0tCgojIOezu+e1seWPg+aVuOioreWumgpgYGB7cn0KU3lzLnNldGxvY2FsZShjYXRlZ29yeSA9ICJMQ19BTEwiLCBsb2NhbGUgPSAiemhfVFcuVVRGLTgiKSAjIOmBv+WFjeS4reaWh+S6gueivApgYGAKCiMg6LyJ5YWl5aWX5Lu2CmBgYHtyfQpyZXF1aXJlKGRwbHlyKQpyZXF1aXJlKHRpZHl0ZXh0KQpyZXF1aXJlKGppZWJhUikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHdvcmRjbG91ZDIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0aWR5cikKbGlicmFyeShzY2FsZXMpCmBgYAoKYGBge3J9CiMg6K6A5YWl5LqL5YWI5oqT5LiL5L6G55qEUFRUIOizh+aWmQpsaWtlX2RhdGEgPSBmcmVhZCgnZGF0YS9wdHRfTGlLZVRhaVRhaS5jc3YnLGVuY29kaW5nID0gJ1VURi04JykKCiMg6Kit5a6a6LOH5paZ5riF55CG5Ye95byPCiMg6KeA5a+f5oqT5LiL5L6G55qE6KiO6KuW5YWn5a65KGFydENvbnRlbnQpIOWtmOWcqOiyvOWclue2suWdgOWPil8KY2xlYW4gPSBmdW5jdGlvbih0eHQpIHsKICB0eHQgPSBnc3ViKCIoaHR0cHxodHRwcyk6Ly8uKiIsICIiLCB0eHQpICMg5Y676Zmk57ay5Z2ACiAgdHh0ID0gZ3N1YigiXyIsICIgIiwgdHh0KSAjIOW6lee3muaPm+aIkOepuueZvSAgCiAgdHh0IH0gCgojIOmHneWwjeWIhuaekOeahOashOS9jemAsuihjOizh+aWmea4heeQhgpsaWtlX2RhdGEkYXJ0RGF0ZSA9IGxpa2VfZGF0YSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpCmxpa2VfZGF0YSRhcnRDb250ZW50ID0gY2xlYW4obGlrZV9kYXRhJGFydENvbnRlbnQpCmxpa2VfZGF0YSA9IGxpa2VfZGF0YSAlPiUKICBmaWx0ZXIobmNoYXIoYXJ0Q29udGVudCkgPiAwKSAjIOWOu+mZpOepuuWtl+S4sijmnInnmoTlj6rosrzkuobkuIDlvLXlnJYpCgpsaWtlX2RhdGEKYGBgCgojIOmAj+mBjmppZWJhciDpgLLooYzmlrfoqZ4KYGBge3J9CiMg5o6h55SoamllYmEg6aCQ6Kit55qE5a2X5YW477yM5pa36Kme5b6M55qE57WQ5p6c5pyD5bCH6YOo5Lu96Kme5ouG6ZaLKCLnkIbnp5HlpKrlpKoiID0+ICLnkIbnp5Ei77yMIuWkquWkqiIpCiMg5pWF5Yqg5YWl6Ieq5a6a576p55qE6Kme5b2Z5a2X5YW46YCy6KGM6Kq/5pW0CmppZWJhX3Rva2VuaXplciA8LSB3b3JrZXIodXNlcj0iZGljdC9saWtldGFpdGFpLmRpY3QiKQojIOioreWumuaWt+ipnmZ1bmN0aW9uCmxpa2VfdG9rZW5pemVyIDwtIGZ1bmN0aW9uKHQpIHsKICBsYXBwbHkodCwgZnVuY3Rpb24oeCkgewogICAgdG9rZW5zIDwtIHNlZ21lbnQoeCwgamllYmFfdG9rZW5pemVyKQogICAgcmV0dXJuKHRva2VucykKICB9KQp9CgojIOmAsuihjOaWt+ipngp0b2tlbnMgPSBsaWtlX2RhdGEgJT4lIAogIHVubmVzdF90b2tlbnMod29yZCwgYXJ0Q29udGVudCwgdG9rZW49bGlrZV90b2tlbml6ZXIpCgojIOe1seioiOWtl+mguwp0b2tlbnMgPSB0b2tlbnMgJT4lCiAgc2VsZWN0KGFydERhdGUsIHdvcmQpICU+JQogIGdyb3VwX2J5KGFydERhdGUsIHdvcmQpICU+JQogIG11dGF0ZShjb3VudCA9IG4oKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgIyDlt7HntpPntbHoqIjpgY7mlbjph4/vvJvljrvpmaTph43opIfos4fmlpkKICAKdG9rZW5zCmBgYAoKIyDpgI/pgY7mloflrZfpm7Lmn6XnnIvmlrfoqZ7ntZDmnpwKYGBge3J9CiMg5paH5a2X6Zuy6YOo5Lu977yM5oOz55yL55qE5piv6Kme5Zyo5pW05YCL5YWn5a655Ye654++55qE5pW46YePCiMg5pWF5o6S6Zmk5pel5pyfCnRva2VucyAlPiUKICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lCiAgd29yZGNsb3VkMigpCmBgYAoKIyDnuaroo73oqI7oq5bmlbjph4/mmYLluo/lnJYgKOavj+WkqeacieWkmuWwkeeahOiojuirluaWh+eroCkKYGBge3J9CiMg6KiI566X6KaB6aGv56S655qE5ZyW5b2i6LOH5paZCmxpa2VfZGF0ZS5wbG90ZGF0YSA9IAogIGxpa2VfZGF0YSAlPiUgCiAgZ3JvdXBfYnkoYXJ0RGF0ZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgIyDoqIjnrpfmr4/lpKnoqI7oq5bmlbjph48KCiMg6KiI566X6KaB5qiZ56S655qE5YmNbiDnrYbos4fmlpkKbGlrZV9kYXRhLmxhYmVscyA9IAogIGxpa2VfZGF0ZS5wbG90ZGF0YSAlPiUgCiAgbXV0YXRlKGxhYmVsID0gZm9ybWF0KGFydERhdGUsICIlbS0lZCIpKSAlPiUKICBhcnJhbmdlKC1jb3VudCkgJT4lICMg5YCS5bqP5o6S5YiXCiAgdG9wX24oMywgY291bnQpICMg5Y+q6aGv56S65YmNbuethuizh+aWmQogIAojIOe5quijveaZguW6j+WclgpsaWtlX2RhdGUucGxvdGRhdGEgJT4lIAogIGdncGxvdChhZXMoeCA9IGFydERhdGUsIHk9Y291bnQpKSArCiAgZ2VvbV9jb2woKSArIAogIGdndGl0bGUoIuaZgumWk+aVuOmHj+W6j+WIlyIpICsgCiAgeGxhYigi5pel5pyfIikgKyAKICB5bGFiKCLmlbjph48iKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSkgKyAKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMTUgZGF5IiwgZGF0ZV9sYWJlbHMgPSAiJW0tJWQiKSArICMg5q+PMTXlpKnpoa/npLrkuIDlgIvmmYLplpMKICBnZW9tX3RleHQoZGF0YSA9IGxpa2VfZGF0YS5sYWJlbHMsIGFlcyh4ID0gYXJ0RGF0ZSwgeSA9IGNvdW50LCBsYWJlbCA9IGxhYmVsKSwgY29sb3VyPSJibHVlIikgIyDlnKjlnJbkuIrmqJnnpLrml6XmnJ8KCmBgYAoKPiDnkIbnp5HlpKrlpKrmlrwyMDE45bm0NuaciDfml6XlibXnq4tZb3VUdWJl6aC76YGT5Lim5Lul44CM55CG56eR5aSq5aSq44CN54K65ZCN5ouN5pSd5b2x54mH77yM6Jmf56ix5pOB5pyJMTcw6auY5pm65ZWG55qE44CK55CG56eR5aSq5aSq44CL5LiK5YKz55qE56ys5LiA5pSv5b2x54mH5pivMjAxOC8wNi8xMu+8jOW5tOW6leWJh+aYr+eQhuenkeWkquWkquS6uuawo+Wkp+eIhueZvCgxMOaciOW6leWwseaciTIw6JCs6KiC6ZaxKe+8jOaWvOaYr3BwdOS4iuesrOS4gOevh+aWh+eroOiQveWcqDkvMjnnmbzmlofnmoTkuLvpoYzmmK/jgIznkIbnp5HlpKrlpKrlnKjntIXku4Dpurw/P+OAjQoyMDE5LzAxLzA45Ye654++6auY5bOw5piv5Zug54K66IiH6IGW57WQ55+z5ZCI5L2c77yMMS8yMOeahOmrmOWzsOaYr+WboOeCuueQhuenkeWkquWkqui/keaXpeaZguW4uOmCgOiri+iXneS6uuWPg+WKoOiHquW3seeahFlvdXR1YmXnr4Dnm67vvIzkuJTnmbzluIPlvbHniYfpoLvnjoflv6vkvb/mm53lhYnnjofmj5DljYco5Y675bm0MTLmnIgx5pel6Iez5LuK5bm0MeaciDIw5pel6YCZNTHlpKnlhaflpbnlsLHkuIrlgrPkuoYyM+aUr+W9seeJhynvvIzlm6DmraToq4foq5bmlofnq6Dmlbjlop7liqDjgIIz5pyI5Lu95Zug5raJ5Y+K6YGV5Y+N6Jel5LqL5rOV77yM5Y+v5oOcUFBU54is5paH5Y+q6IO95oqT5YiwMS8yMAoKIyDlu7rnq4vmg4Xnt5LlrZflhbgKYGBge3J9CiMg5o6h55SoMDMxOSDliqnmlZnmj5DkvpvnmoTmg4Xnt5LlrZflhbgKcCA8LSByZWFkX2ZpbGUoImRpY3QvbGl3Yy9wb3NpdGl2ZS50eHQiKQpuIDwtIHJlYWRfZmlsZSgiZGljdC9saXdjL25lZ2F0aXZlLnR4dCIpCgpwb3NpdGl2ZSA8LSBzdHJzcGxpdChwLCAiLCIpW1sxXV0gIyBzdHJwbGl0IOWbnuWCs2xpc3Q7IOmAj+mBjltbMV1dIOWPluWbnmxpc3Qg5YWn56ys5LiA5YCL6K6K6YeP55qE5YC8Cm5lZ2F0aXZlIDwtIHN0cnNwbGl0KG4sICIsIilbWzFdXQpwb3NpdGl2ZSA8LSBkYXRhLmZyYW1lKHdvcmQgPSBwb3NpdGl2ZSwgc2VudGltZW50cyA9ICJwb3NpdGl2ZSIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkgIyDovYnmiJBkYXRhZnJhbWUg54mp5Lu2Cm5lZ2F0aXZlIDwtIGRhdGEuZnJhbWUod29yZCA9IG5lZ2F0aXZlLCBzZW50aWVtdG5zID0gIm5lZ2F0aXZlIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpjb2xuYW1lcyhuZWdhdGl2ZSkgPSBjKCJ3b3JkIiwic2VudGltZW50IikKY29sbmFtZXMocG9zaXRpdmUpID0gYygid29yZCIsInNlbnRpbWVudCIpCkxJV0NfY2ggPC0gcmJpbmQocG9zaXRpdmUsIG5lZ2F0aXZlKSAjIOe1kOWQiOWFqeWAi2RhdGFmcmFtZQoKIyDpgLLooYzmg4Xnt5LmqJnvv73oqLsKdG9rZW5zID0gdG9rZW5zICU+JQogIGlubmVyX2pvaW4oTElXQ19jaCwgYnkgPSAid29yZCIpICMg6IiH5oOF57eS5a2X5YW45ZCI5L2177yM5YOF5L+d55WZ5oOF57eS5a2X5YW45Lit5pyJ55qE5paH5a2XCgojdG9rZW5zICU+JQojICBzZWxlY3QoYXJ0RGF0ZSwgd29yZCwgY291bnQsIHNlbnRpbWVudC54LCBzZW50aW1lbnQueSkgJT4lCiMgIGRpc3RpbmN0KGFydERhdGUsIHdvcmQpCnRva2VucwpgYGAKCiMg57mq5Yi25q+P5pel6KiO6KuW5Lit77yMcG9zaXRpdmUvbmVnYXRpdmUg55qE5pW46YePCmBgYHtyfQojIOa6luWCmee5quijveeUqOeahOizh+aWme+8iOavj+aXpeeahHBvc2l0aXZlLCBuZWdhdGl2ZSDmlbjph4/vvIkKcGxvdF90YWJsZV9saW5lID0gdG9rZW5zICU+JQogIGdyb3VwX2J5KGFydERhdGUsIHNlbnRpbWVudCkgJT4lICMg5L6d5pOaYXJ0RGF0ZSwgc2VudGltZW50IOS9nOe+pOe1hOWMlgogIHN1bW1hcmlzZShjb3VudD1zdW0oY291bnQpKSAjIOmHneWwjee+pOe1hOWFp+eahGNvdW5077yM6YCy6KGM5Yqg57i9CgojIOe5quijveWcluW9ogpwbG90X3RhYmxlX2xpbmUgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fbGluZShhZXMoeD1hcnREYXRlLCB5PWNvdW50LCBjb2xvdXI9c2VudGltZW50KSkgKwogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkKCmBgYAoKIyDnlLHmlrzmm7Lnt5rlnovnmoTlnJbvvIzkuI3mmJPnnIvlh7rnorrliIfnmoTmlbjph4/vvJsKIyDnuaroo73plbfmop3lnJbpgLLooYzmn6XnnIsKYGBge3J9CiMg5Z+65pys5LiK6IiHcGxvdF90YWJsZV9iYXIg55u45ZCMCiMg5L2G55Sx5pa85LiN5oOz55yL5rKS5pyJ6LOH5paZ55qE5pel5pyf77yM5pWF5YWI5bCH5pel5pyf6L2J5oiQZmFjdG9yCnBsb3RfdGFibGVfYmFyID0gdG9rZW5zICU+JQogIG11dGF0ZShhcnREYXRlID0gZmFjdG9yKGZvcm1hdChhcnREYXRlLCBmb3JtYXQgPSAnJVktJW0tJWQnKSkpICU+JSAjIOWwh+aXpeacn+i9ieaIkGZhY3Rvci4g5LiN6aGv56S65Lit6ZaT54Sh6LOH5paZ55qE5pel5pyfCiAgZ3JvdXBfYnkoYXJ0RGF0ZSwgc2VudGltZW50KSAlPiUgIyDkvp3mk5phcnREYXRlLCBzZW50aW1lbnQg5L2c576k57WE5YyWCiAgbXV0YXRlKGNvdW50PXN1bShjb3VudCkpICMg6KiI566X5q+P5aSp5q2j6LKg5oOF57eS5ZCE5pyJ5aSa5bCR562GCgojIOe5quijveWcluW9ogpwbG90X3RhYmxlX2JhciAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcnREYXRlKSkgKwogIGdlb21fYmFyKGFlcyhmaWxsID0gc2VudGltZW50KSkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IikpICsgCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSAjIOaXi+i9iXgg6Lu45paH5a2XLiDpgb/lhY3pg73pgKPlnKjkuIDotbfnnIvkuI3oposKCmBgYAoKPiDnlLHkuIrlnJbnnIvkvobvvIzlnKjmnInoqI7oq5bnmoTnmbzoqIDkuK3vvIzmraPosqDoqZXmmK/lt67kuI3lpJrnmoTni4Dms4EKPiDkvYbmnInmlbjlgIvosqDoqZXovIPpq5jnmoTlj6/og73kuovmjqjmuKzlpoLkuIsKPiDjgIrnkIbnp5HlpKrlpKrjgIvntrLot6/osqDpnaLlj6PnopHnmoTkuIrkuIDlgIvpq5jpu57lh7rnj77lnKjntrLlj4vniIbmlpnmm77mgpTlqZrvvIznlbbmmYLlvJXkvobntrLlj4vnvqTotbfmibnoqZXvvIzkvYbkuovlvozooqvnmbznj77mmK/og6HkuoLpgKDorKDjgIIKPiAx5pyIMTnml6Xpg6jokL3lrqLnmbzooajkupTlpKfnkIbnlLHmiZPoh4nmlofnq6DvvIzjgIrnkIbnp5HlpKrlpKrjgIvlg4XlnKhJR+S4iuewoeefreWbnuaHieOAjOaIkeeahOaZuuWVhuaHieipsuaYr+aykuacieWVj+mhjOOAje+8jOS4pueEoeato+mdouWbnuaHie+8jOaWh+eroOaMgee6jOWcqD4g57ay6Lev5LiK55m86YW15b6M77yMMeaciDIw5pel5Ym15LiLUFBU6LKg6Z2i6IGy6YeP5pyA6auY5bOwCgojIOingOWvn3Bhc2l0aXZlIGFuZCBuZWdhdGl2ZSDkuK3ovIPluLjlh7rnj77nmoToqZ4KYGBge3J9CnRva2VucyAlPiUKICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPSBUUlVFKSAlPiUKICBncm91cF9ieShzZW50aW1lbnQpICU+JQogIHRvcF9uKDEwLCBuKSAlPiUgIyDkv53nlZnliY0xMOethuizh+aWmSAo6Iul5pyJ55u45ZCM55qE5YC877yM5YmH5pyD5LiA6LW35L+d55WZKQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQogIGdncGxvdChhZXMod29yZCwgbiwgZmlsbCA9IHNlbnRpbWVudCkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGxhYnMoeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwKICAgICAgIHggPSBOVUxMKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKQoKYGBgCgoKCg==