系統參數設定

#Sys.setlocale(category = "LC_ALL", locale = "zh_TW.UTF-8") # 避免中文亂碼

安裝需要的packages

packages = c("dplyr", "tidytext", "stringr", "wordcloud2", "ggplot2",'readr','data.table','reshape2','wordcloud','tidyr','scales')
existing = as.character(installed.packages()[,1])
for(pkg in packages[!(packages %in% existing)]) install.packages(pkg)
library(dplyr)
library(stringr)
library(tidytext)
library(wordcloud2)
library(data.table)
library(ggplot2)
library(reshape2)
library(wordcloud)
library(tidyr)
library(readr)
library(scales)

前言 台灣第15任總統、副總統選舉,於2020年1月11日舉行。在競選期間,不同世代的人之間的訴求和輿論,均牽動選情。民眾為了落實公民權的行使,以及表述各方立場,候選人及相關政黨議題不斷被分享,創造網路高聲量。網路取代傳統傳播大幅影響為政治競爭型態。因此,本組欲探究網路的「政治影響力」到底有多大?透過PTT資料進行候選人及政黨的詞頻計算找出關鍵字,以及輿情正向、反向的情緒分析。

載入總統候選人

Tsai_data = fread('Tsai_artWordFreq.csv',encoding = 'UTF-8')  #蔡英文
Hen_data = fread('Hen_artWordFreq.csv',encoding = 'UTF-8')  #韓國瑜
Song_data = fread('Song_artWordFreq.csv',encoding = 'UTF-8')  #宋楚瑜

載入政黨

DPP_data = fread('DPP_artWordFreq.csv',encoding = 'UTF-8') #民進黨
KMT_data = fread('KMT_artWordFreq.csv',encoding = 'UTF-8') #國民黨
NPP_data = fread('NPP_artWordFreq.csv',encoding = 'UTF-8') #時代力量
PFP_data = fread('PFP_artWordFreq.csv',encoding = 'UTF-8') #親民黨
TPP_data = fread('TPP_artWordFreq.csv',encoding = 'UTF-8') #民眾黨

查看資料前幾筆(已經整理成文章-詞彙-詞頻)

head(Tsai_data)
head(Hen_data)
head(Song_data)

##過濾特殊字元

###總統
Tsai_data = Tsai_data %>% 
  filter(!grepl('_',word))
Tsai_data = Tsai_data %>% 
  filter(!(word %in% c("https")))

Hen_data = Hen_data %>% 
  filter(!grepl('_',word))
Hen_data = Hen_data %>% 
  filter(!(word %in% c("https")))

Song_data = Song_data %>% 
  filter(!grepl('_',word))
Song_data = Song_data %>% 
  filter(!(word %in% c("https")))

###政黨
DPP_data = DPP_data %>% 
  filter(!grepl('_',word))
DPP_data = DPP_data %>% 
  filter(!(word %in% c("https")))

KMT_data = KMT_data %>% 
  filter(!grepl('_',word))
KMT_data = KMT_data %>% 
  filter(!(word %in% c("https")))

NPP_data = NPP_data %>% 
  filter(!grepl('_',word))
NPP_data = NPP_data %>% 
  filter(!(word %in% c("https")))

PFP_data = PFP_data %>% 
  filter(!grepl('_',word))
PFP_data = PFP_data %>% 
  filter(!(word %in% c("https")))

TPP_data = TPP_data %>% 
  filter(!grepl('_',word))
TPP_data = TPP_data %>% 
  filter(!(word %in% c("https")))

轉換日期格式

###總統
Tsai_data$artDate= Tsai_data$artDate %>% as.Date("%Y/%m/%d")
Hen_data$artDate= Hen_data$artDate %>% as.Date("%Y/%m/%d")
Song_data$artDate= Song_data$artDate %>% as.Date("%Y/%m/%d")

###政黨
DPP_data$artDate= DPP_data$artDate %>% as.Date("%Y/%m/%d")
KMT_data$artDate= KMT_data$artDate %>% as.Date("%Y/%m/%d")
NPP_data$artDate= NPP_data$artDate %>% as.Date("%Y/%m/%d")
PFP_data$artDate= PFP_data$artDate %>% as.Date("%Y/%m/%d")
TPP_data$artDate= TPP_data$artDate %>% as.Date("%Y/%m/%d")

計算所有字在文集中的總詞頻

###總統
word_count_Tsai <- Tsai_data %>%
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))
word_count_Hen <- Hen_data %>%
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))
word_count_Song <- Song_data %>%
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))

###政黨
word_count_DPP <- DPP_data %>%
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))
word_count_KMT <- KMT_data %>%
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))
word_count_NPP <- NPP_data %>%
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))
word_count_PFP <- PFP_data %>%
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))
word_count_TPP <- TPP_data %>%
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))
word_count_Tsai
word_count_Hen
word_count_Song

詞頻 三筆候選人的資料中可看到最常被提及的關鍵字為候選人的姓名,再者是競爭對手、政黨關鍵詞。蔡英文及韓國瑜常被媒體作為彼此論述的議題,因此可看到兩者的關鍵詞中出現對方的姓名、政黨。而在宋楚瑜則是出現柯文哲此關鍵字,原因可推究為當時親民黨常提出小黨合作等話題。

文字雲

word_count_Tsai %>% wordcloud2()
word_count_Hen %>% wordcloud2()
word_count_Song %>% wordcloud2()

以LIWC字典判斷文集中的word屬於正面字還是負面字

# 正向字典txt檔
# 以,將字分隔
P <- read_file("liwc/positive.txt")

# 負向字典txt檔
N <- read_file("liwc/negative.txt")

將字串依,分割

#strsplit回傳list , 我們取出list中的第一個元素
P = strsplit(P, ",")[[1]]
N = strsplit(N, ",")[[1]]

# 建立dataframe 有兩個欄位word,sentiments,word欄位內容是字典向量
P = data.frame(word = P, sentiment = "positive")
N = data.frame(word = N, sentiment = "negative")
LIWC = rbind(P, N)

總統候選人與LIWC情緒字典做join

word_count_Tsai %>% inner_join(LIWC)

word_count_Hen %>% inner_join(LIWC)

word_count_Song %>% inner_join(LIWC)

候選人正負向情緒字 在候選人正向關鍵字中最常出現的為「支持、希望、自由」,負向關鍵字為「問題、批評」多與選舉相關,而在韓國瑜的負向情緒字中出現「遲到」。

政黨與LIWC情緒字典做join

word_count_DPP %>% inner_join(LIWC)
word_count_KMT %>% inner_join(LIWC)
word_count_NPP %>% inner_join(LIWC)
word_count_PFP %>% inner_join(LIWC)
word_count_TPP %>% inner_join(LIWC)

政黨正負向情緒字 政黨的正負向關鍵字跟候選人相似。在親民黨的資料集中出現「美人」此用詞,經分析後發現為該政黨發言人姓名。另外,在各政黨的關鍵字數量中可以發現以民進黨、時代力量、民眾黨較多,推論為該政黨支持者較常使用網路進行討論,以致關鍵字數量高於國民黨、親民黨。

統計每天的文章正面字的次數與負面字的次數

###總統
sentiment_count_Tsai = Tsai_data %>%
  select(artDate,word,count) %>%
  inner_join(LIWC) %>% 
  group_by(artDate,sentiment) %>%
  summarise(count=sum(count))

sentiment_count_Hen = Hen_data %>%
  select(artDate,word,count) %>%
  inner_join(LIWC) %>% 
  group_by(artDate,sentiment) %>%
  summarise(count=sum(count))

sentiment_count_Song = Song_data %>%
  select(artDate,word,count) %>%
  inner_join(LIWC) %>% 
  group_by(artDate,sentiment) %>%
  summarise(count=sum(count))

###政黨
sentiment_count_DPP = DPP_data %>%
  select(artDate,word,count) %>%
  inner_join(LIWC) %>% 
  group_by(artDate,sentiment) %>%
  summarise(count=sum(count))

sentiment_count_KMT = KMT_data %>%
  select(artDate,word,count) %>%
  inner_join(LIWC) %>% 
  group_by(artDate,sentiment) %>%
  summarise(count=sum(count))

sentiment_count_NPP = NPP_data %>%
  select(artDate,word,count) %>%
  inner_join(LIWC) %>% 
  group_by(artDate,sentiment) %>%
  summarise(count=sum(count))
sentiment_count_PFP = PFP_data %>%
  select(artDate,word,count) %>%
  inner_join(LIWC) %>% 
  group_by(artDate,sentiment) %>%
  summarise(count=sum(count))
sentiment_count_TPP = TPP_data %>%
  select(artDate,word,count) %>%
  inner_join(LIWC) %>% 
  group_by(artDate,sentiment) %>%
  summarise(count=sum(count))
sentiment_count_Tsai %>%
  ggplot()+
  geom_line(aes(x=artDate,y=count,colour=sentiment))+
  scale_x_date(labels = date_format("%m/%d")) 

sentiment_count_Hen %>%
  ggplot()+
  geom_line(aes(x=artDate,y=count,colour=sentiment))+
  scale_x_date(labels = date_format("%m/%d")) 

sentiment_count_Song %>%
  ggplot()+
  geom_line(aes(x=artDate,y=count,colour=sentiment))+
  scale_x_date(labels = date_format("%m/%d")) 

候選人正負向情緒 三位候選人的正負向情緒可以看出多數以正向情緒較高,可推究為選舉期間多數議題雖為爭議性取向,但在選詞上乃為正向。因此,整題觀察下可看到多為正向情緒。另外,蔡英文及韓國瑜較早提出參選計畫,網路討論聲量相較於宋楚瑜較早出現。

sentiment_count_Tsai %>%
  ggplot()+
  geom_line(aes(x=artDate,y=count,colour=sentiment))+
  scale_x_date(labels = date_format("%m/%d"))+
  geom_vline(aes(xintercept = as.numeric(artDate[which(sentiment_count_Tsai$artDate == as.Date('2019/08/05'))[1]])),colour = "yellow",size=1)+
  geom_vline(aes(xintercept = as.numeric(artDate[which(sentiment_count_Tsai$artDate == as.Date('2020/01/11'))[1]])),colour = "yellow",size=1)

##8月5日負面情緒飆升

蔡英文正負向情緒 2019/8/5柯文哲組新政黨後,指控蔡英文總統身邊的人「每個人都貪汙」,引起與論譁然,總統府也立即要求柯文哲釐清及道歉。因此,當日出現較高的負向情緒。而2020/1/11當日蔡英文贏得該屆總統選舉,並且以高得票率打破先前競選紀錄。因此,正向情緒比負向情緒高出許多。

Tsai_data %>% 
  filter(artDate == as.Date('2019/08/05')) %>% 
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>20) %>%   ####過濾出現太少次的字
  wordcloud2()
##柯文哲表示蔡英文身邊的人都貪汙
sentiment_count_TPP %>%
  ggplot()+
  geom_line(aes(x=artDate,y=count,colour=sentiment))+
  scale_x_date(labels = date_format("%m/%d"))+
  geom_vline(aes(xintercept = as.numeric(artDate[which(sentiment_count_Hen$artDate == as.Date('2019/08/05'))
[1]])),colour = "yellow",size=1) 
###同日台民黨、柯文哲的討論度也提高 

民眾黨正負向情緒 柯文哲組織「台灣民眾黨」搶攻立法院席次,然而是否有意要參選總統、會不會有「郭柯配」、「柯郭配」引起大家關注。以及柯文哲在2019/8/5上午先大罵韓國瑜發大財是喊口號,又批評蔡英文沒貪汙,但身邊每個人都貪汙,甚至砲轟深綠團體是假義和團。使得此日讓民眾黨輿論聲量達到最高峰。

sentiment_count_Hen %>%
  ggplot()+
  geom_line(aes(x=artDate,y=count,colour=sentiment))+
  scale_x_date(labels = date_format("%m/%d"))+
  geom_vline(aes(xintercept = as.numeric(artDate[which(sentiment_count_Hen$artDate == as.Date('2019/12/29'))
[1]])),colour = "yellow",size=1) 

韓國瑜正負情緒 2019/12/29韓國瑜參與台灣總統大選電視辯論會,以及當日晚上參加台中造勢晚會,在大雨造勢、辯論會火力全開,聲量創一年新高。首度拋出「台灣六塊肌」政策,韓國瑜表示,台灣分為六大區塊,發展不同區域特色與產業,要讓台灣重新被國際社會重視,以及提出「滿天星」計劃,培養年輕人出國交換一年,軍公教警消每年帶職帶薪出國進修。然而,網友認為這些政策內容較為空泛。因此,當日出現負向情緒最高。

Hen_data %>% 
  filter(artDate == as.Date('2019/12/29')) %>% 
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>20) %>%   ####過濾出現太少次的字
  wordcloud2()
###辯論會導致韓國瑜的聲量變高
sentiment_count_Song %>%
  ggplot()+
  geom_line(aes(x=artDate,y=count,colour=sentiment))+
  scale_x_date(labels = date_format("%m/%d"))+
  geom_vline(aes(xintercept = as.numeric(artDate[which(sentiment_count_Song$artDate == as.Date('2019/11/12'))
[1]])),colour = "yellow",size=1)

宋楚瑜正負向情緒 2019/11/12宋楚瑜提出參選2020總統,引發網路一片熱議,而對於宋楚瑜5度參選一事,許多網友表示真的是「活到老選到老」、「有選舉那年,就有宋楚瑜,這就是年年有瑜」、「用參選陪伴著我們長大」、「遲到但永不缺席的男子」。讓正向情緒達到高點。

Song_data %>% 
  filter(artDate == as.Date('2019/11/12')) %>% 
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count))  %>%
  filter(count>10) %>%   # 過濾出現太少次的字
  wordcloud2()

## 11/13 宋楚瑜宣布參選總統
sentiment_count_TPP %>%
  ggplot()+
  geom_line(aes(x=artDate,y=count,colour=sentiment))+
  scale_x_date(labels = date_format("%m/%d"))+
  geom_vline(aes(xintercept = as.numeric(artDate[which(sentiment_count_TPP$artDate == as.Date('2019/10/03'))
[1]])),colour = "yellow",size=1)

民眾黨正負向情緒 2019/10/3民眾黨提出推出不分區立委海選計畫,然而區域立委候選人名單被質疑具有「綠營背景」,遭郭台銘拒絕合照。因此,當日的負面情緒較高。

Tsai_data %>%
  inner_join(LIWC) %>%
  group_by(word,sentiment) %>%
  summarise(count = n()) %>% 
  data.frame() %>% 
  top_n(30,wt = count) %>%
  ungroup() %>% 
  mutate(word = reorder(word, count)) %>%
  ggplot(aes(word, count, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~sentiment, scales = "free_y") +
  labs(y = "Contribution to sentiment",
       x = NULL) +
  theme(text=element_text(size=12))+
  coord_flip()

Hen_data %>%
  inner_join(LIWC) %>%
  group_by(word,sentiment) %>%
  summarise(count = n()) %>% 
  data.frame() %>% 
  top_n(30,wt = count) %>%
  ungroup() %>% 
  mutate(word = reorder(word, count)) %>%
  ggplot(aes(word, count, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~sentiment, scales = "free_y") +
  labs(y = "Contribution to sentiment",
       x = NULL) +
  theme(text=element_text(size=12))+
  coord_flip()


Song_data %>%
  inner_join(LIWC) %>%
  group_by(word,sentiment) %>%
  summarise(count = n()) %>% 
  data.frame() %>% 
  top_n(30,wt = count) %>%
  ungroup() %>% 
  mutate(word = reorder(word, count)) %>%
  ggplot(aes(word, count, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~sentiment, scales = "free_y") +
  labs(y = "Contribution to sentiment",
       x = NULL) +
  theme(text=element_text(size=12))+
  coord_flip()

總統候選人標題及留言數分析

## 載入總統候選人標題文
Tsai_article = fread('Tsai_articleMetaData.csv',encoding = 'UTF-8')
Hen_article = fread('Hen_articleMetaData.csv',encoding = 'UTF-8')
commentNum_Tsai <- Tsai_article %>%
  filter(!is.na(as.numeric(commentNum)))%>%
 group_by(artDate) %>%
 summarise(comment_Tsai = sum(as.numeric(commentNum)))

articleNum_Tsai <- Tsai_article %>%
  filter(!is.na(as.numeric(commentNum))) %>%
  group_by(artDate) %>%
 summarise(article_Tsai = n())

commentNum_Hen <- Hen_article %>%
  filter(!is.na(as.numeric(commentNum)))%>%
 group_by(artDate) %>%
 summarise(comment_Hen = sum(as.numeric(commentNum)))

articleNum_Hen <- Hen_article %>%
  filter(!is.na(as.numeric(commentNum))) %>%
  group_by(artDate) %>%
 summarise(article_Hen = n())
commentNum_Hen %>%
  inner_join(articleNum_Hen) %>% 
  inner_join(commentNum_Tsai) %>%
  inner_join(articleNum_Tsai) %>%
  ggplot()+
  geom_line(aes(x=as.Date(artDate),y=(comment_Tsai),color="蔡英文留言數"))+
  geom_line(aes(x=as.Date(artDate),y=(comment_Hen),color="韓國瑜留言數"))+
  geom_line(aes(x=as.Date(artDate),y=(article_Tsai),color="蔡英文文章數"))+
  geom_line(aes(x=as.Date(artDate),y=(article_Hen),color="韓國瑜文章數"))+
  scale_colour_manual(values=c("#15851c","#ffb940","#0d31bf","#5dc2fc"))+
  scale_x_date(labels = date_format("%m/%d"))+
  scale_y_log10()
###韓國瑜文章的留言數明顯多於蔡英文,討論度較高

候選人網路聲量 整體觀察下,網路聲量大小與選舉結果不成正比,韓國瑜的總留言數、總文章數大多超過蔡英文,依舊是政治人物中的聲量王,然而選舉的結果卻是敗選,可推竟網路聲量能居高不下,可能是由爭議造成的負面聲量堆疊而成。

commentNum_Hen %>%
  inner_join(articleNum_Hen) %>% 
  inner_join(commentNum_Tsai) %>%
  inner_join(articleNum_Tsai) %>%
  ggplot()+ 
  geom_line(aes(x=as.Date(artDate),y=(comment_Tsai / article_Tsai),color="Tsai"))+
  geom_line(aes(x=as.Date(artDate),y=(comment_Hen / article_Hen),color="Hen"))+
  scale_x_date(labels = date_format("%m/%d"))
###但也因為討論韓國瑜的文章較多,因此韓國瑜文章的平均留言數並沒有比較多

候選人網路聲量 當我們用總言數/總文章數來看,韓國瑜的文章平均留言數並沒有比較多。雖然討論韓國瑜的文章較多,但留言數量並不多。

LS0tDQp0aXRsZTog56S+576k5aqS6auU5YiG5p6Q56ys5YWr57WE6K6A5pu45pyDDQphdXRob3I6IOeOi+WTgeWgr+OAgemZs+iKk+WDruOAgem7g+aZn+iCsuOAgeiUoeWwmuS6qOOAgeiOiuWtkOmchuOAgem7g+e3r+e/lOOAgea4uOaZr+etkQ0KZGF0ZTogIjIwMjAvMDMvMzEiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQojIOezu+e1seWPg+aVuOioreWumg0KYGBge3J9DQojU3lzLnNldGxvY2FsZShjYXRlZ29yeSA9ICJMQ19BTEwiLCBsb2NhbGUgPSAiemhfVFcuVVRGLTgiKSAjIOmBv+WFjeS4reaWh+S6gueivA0KYGBgDQoNCiMjIOWuieijnemcgOimgeeahHBhY2thZ2VzDQpgYGB7cn0NCnBhY2thZ2VzID0gYygiZHBseXIiLCAidGlkeXRleHQiLCAic3RyaW5nciIsICJ3b3JkY2xvdWQyIiwgImdncGxvdDIiLCdyZWFkcicsJ2RhdGEudGFibGUnLCdyZXNoYXBlMicsJ3dvcmRjbG91ZCcsJ3RpZHlyJywnc2NhbGVzJykNCmV4aXN0aW5nID0gYXMuY2hhcmFjdGVyKGluc3RhbGxlZC5wYWNrYWdlcygpWywxXSkNCmZvcihwa2cgaW4gcGFja2FnZXNbIShwYWNrYWdlcyAlaW4lIGV4aXN0aW5nKV0pIGluc3RhbGwucGFja2FnZXMocGtnKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KHdvcmRjbG91ZDIpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeSh3b3JkY2xvdWQpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoc2NhbGVzKQ0KYGBgDQoNCioq5YmN6KiAKioNCuWPsOeBo+esrDE15Lu757i957Wx44CB5Ymv57i957Wx6YG46IiJ77yM5pa8MjAyMOW5tDHmnIgxMeaXpeiIieihjOOAguWcqOertumBuOacn+mWk++8jOS4jeWQjOS4luS7o+eahOS6uuS5i+mWk+eahOiotOaxguWSjOi8v+irlu+8jOWdh+eJveWLlemBuOaDheOAguawkeecvueCuuS6huiQveWvpuWFrOawkeasiueahOihjOS9v++8jOS7peWPiuihqOi/sOWQhOaWueeri+WgtO+8jOWAmemBuOS6uuWPiuebuOmXnOaUv+m7qOitsOmhjOS4jeaWt+iiq+WIhuS6q++8jOWJtemAoOe2sui3r+mrmOiBsumHj+OAgue2sui3r+WPluS7o+WCs+e1seWCs+aSreWkp+W5heW9semfv+eCuuaUv+ayu+ertueIreWei+aFi+OAguWboOatpO+8jOacrOe1hOassuaOoueptue2sui3r+eahOOAjOaUv+ayu+W9semfv+WKm+OAjeWIsOW6leacieWkmuWkp++8n+mAj+mBjlBUVOizh+aWmemAsuihjOWAmemBuOS6uuWPiuaUv+m7qOeahOipnumgu+ioiOeul+aJvuWHuumXnOmNteWtl++8jOS7peWPiui8v+aDheato+WQkeOAgeWPjeWQkeeahOaDhee3kuWIhuaekOOAgg0KDQojIyDovInlhaXnuL3ntbHlgJnpgbjkuroNCmBgYHtyfQ0KVHNhaV9kYXRhID0gZnJlYWQoJ1RzYWlfYXJ0V29yZEZyZXEuY3N2JyxlbmNvZGluZyA9ICdVVEYtOCcpICAj6JSh6Iux5paHDQpIZW5fZGF0YSA9IGZyZWFkKCdIZW5fYXJ0V29yZEZyZXEuY3N2JyxlbmNvZGluZyA9ICdVVEYtOCcpICAj6Z+T5ZyL55GcDQpTb25nX2RhdGEgPSBmcmVhZCgnU29uZ19hcnRXb3JkRnJlcS5jc3YnLGVuY29kaW5nID0gJ1VURi04JykgICPlrovmpZrnkZwNCmBgYA0KDQojIyDovInlhaXmlL/pu6gNCmBgYHtyfQ0KRFBQX2RhdGEgPSBmcmVhZCgnRFBQX2FydFdvcmRGcmVxLmNzdicsZW5jb2RpbmcgPSAnVVRGLTgnKSAj5rCR6YCy6buoDQpLTVRfZGF0YSA9IGZyZWFkKCdLTVRfYXJ0V29yZEZyZXEuY3N2JyxlbmNvZGluZyA9ICdVVEYtOCcpICPlnIvmsJHpu6gNCk5QUF9kYXRhID0gZnJlYWQoJ05QUF9hcnRXb3JkRnJlcS5jc3YnLGVuY29kaW5nID0gJ1VURi04JykgI+aZguS7o+WKm+mHjw0KUEZQX2RhdGEgPSBmcmVhZCgnUEZQX2FydFdvcmRGcmVxLmNzdicsZW5jb2RpbmcgPSAnVVRGLTgnKSAj6Kaq5rCR6buoDQpUUFBfZGF0YSA9IGZyZWFkKCdUUFBfYXJ0V29yZEZyZXEuY3N2JyxlbmNvZGluZyA9ICdVVEYtOCcpICPmsJHnnL7pu6gNCmBgYA0KDQoNCiMjIOafpeeci+izh+aWmeWJjeW5vuethijlt7LntpPmlbTnkIbmiJDmlofnq6At6Kme5b2ZLeipnumguykNCmBgYHtyfQ0KaGVhZChUc2FpX2RhdGEpDQpoZWFkKEhlbl9kYXRhKQ0KaGVhZChTb25nX2RhdGEpDQpgYGANCg0KIyPpgY7mv77nibnmrorlrZflhYMNCmBgYHtyfQ0KIyMj57i957WxDQpUc2FpX2RhdGEgPSBUc2FpX2RhdGEgJT4lIA0KICBmaWx0ZXIoIWdyZXBsKCdfJyx3b3JkKSkNClRzYWlfZGF0YSA9IFRzYWlfZGF0YSAlPiUgDQogIGZpbHRlcighKHdvcmQgJWluJSBjKCJodHRwcyIpKSkNCg0KSGVuX2RhdGEgPSBIZW5fZGF0YSAlPiUgDQogIGZpbHRlcighZ3JlcGwoJ18nLHdvcmQpKQ0KSGVuX2RhdGEgPSBIZW5fZGF0YSAlPiUgDQogIGZpbHRlcighKHdvcmQgJWluJSBjKCJodHRwcyIpKSkNCg0KU29uZ19kYXRhID0gU29uZ19kYXRhICU+JSANCiAgZmlsdGVyKCFncmVwbCgnXycsd29yZCkpDQpTb25nX2RhdGEgPSBTb25nX2RhdGEgJT4lIA0KICBmaWx0ZXIoISh3b3JkICVpbiUgYygiaHR0cHMiKSkpDQoNCiMjI+aUv+m7qA0KRFBQX2RhdGEgPSBEUFBfZGF0YSAlPiUgDQogIGZpbHRlcighZ3JlcGwoJ18nLHdvcmQpKQ0KRFBQX2RhdGEgPSBEUFBfZGF0YSAlPiUgDQogIGZpbHRlcighKHdvcmQgJWluJSBjKCJodHRwcyIpKSkNCg0KS01UX2RhdGEgPSBLTVRfZGF0YSAlPiUgDQogIGZpbHRlcighZ3JlcGwoJ18nLHdvcmQpKQ0KS01UX2RhdGEgPSBLTVRfZGF0YSAlPiUgDQogIGZpbHRlcighKHdvcmQgJWluJSBjKCJodHRwcyIpKSkNCg0KTlBQX2RhdGEgPSBOUFBfZGF0YSAlPiUgDQogIGZpbHRlcighZ3JlcGwoJ18nLHdvcmQpKQ0KTlBQX2RhdGEgPSBOUFBfZGF0YSAlPiUgDQogIGZpbHRlcighKHdvcmQgJWluJSBjKCJodHRwcyIpKSkNCg0KUEZQX2RhdGEgPSBQRlBfZGF0YSAlPiUgDQogIGZpbHRlcighZ3JlcGwoJ18nLHdvcmQpKQ0KUEZQX2RhdGEgPSBQRlBfZGF0YSAlPiUgDQogIGZpbHRlcighKHdvcmQgJWluJSBjKCJodHRwcyIpKSkNCg0KVFBQX2RhdGEgPSBUUFBfZGF0YSAlPiUgDQogIGZpbHRlcighZ3JlcGwoJ18nLHdvcmQpKQ0KVFBQX2RhdGEgPSBUUFBfZGF0YSAlPiUgDQogIGZpbHRlcighKHdvcmQgJWluJSBjKCJodHRwcyIpKSkNCg0KYGBgDQoNCiMjIOi9ieaPm+aXpeacn+agvOW8jw0KYGBge3J9DQojIyPnuL3ntbENClRzYWlfZGF0YSRhcnREYXRlPSBUc2FpX2RhdGEkYXJ0RGF0ZSAlPiUgYXMuRGF0ZSgiJVkvJW0vJWQiKQ0KSGVuX2RhdGEkYXJ0RGF0ZT0gSGVuX2RhdGEkYXJ0RGF0ZSAlPiUgYXMuRGF0ZSgiJVkvJW0vJWQiKQ0KU29uZ19kYXRhJGFydERhdGU9IFNvbmdfZGF0YSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpDQoNCiMjI+aUv+m7qA0KRFBQX2RhdGEkYXJ0RGF0ZT0gRFBQX2RhdGEkYXJ0RGF0ZSAlPiUgYXMuRGF0ZSgiJVkvJW0vJWQiKQ0KS01UX2RhdGEkYXJ0RGF0ZT0gS01UX2RhdGEkYXJ0RGF0ZSAlPiUgYXMuRGF0ZSgiJVkvJW0vJWQiKQ0KTlBQX2RhdGEkYXJ0RGF0ZT0gTlBQX2RhdGEkYXJ0RGF0ZSAlPiUgYXMuRGF0ZSgiJVkvJW0vJWQiKQ0KUEZQX2RhdGEkYXJ0RGF0ZT0gUEZQX2RhdGEkYXJ0RGF0ZSAlPiUgYXMuRGF0ZSgiJVkvJW0vJWQiKQ0KVFBQX2RhdGEkYXJ0RGF0ZT0gVFBQX2RhdGEkYXJ0RGF0ZSAlPiUgYXMuRGF0ZSgiJVkvJW0vJWQiKQ0KYGBgDQoNCiMjIyDoqIjnrpfmiYDmnInlrZflnKjmlofpm4bkuK3nmoTnuL3oqZ7poLsNCmBgYHtyfQ0KIyMj57i957WxDQp3b3JkX2NvdW50X1RzYWkgPC0gVHNhaV9kYXRhICU+JQ0KICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIA0KICBncm91cF9ieSh3b3JkKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICAlPiUNCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcNCiAgYXJyYW5nZShkZXNjKGNvdW50KSkNCndvcmRfY291bnRfSGVuIDwtIEhlbl9kYXRhICU+JQ0KICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIA0KICBncm91cF9ieSh3b3JkKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICAlPiUNCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcNCiAgYXJyYW5nZShkZXNjKGNvdW50KSkNCndvcmRfY291bnRfU29uZyA8LSBTb25nX2RhdGEgJT4lDQogIHNlbGVjdCh3b3JkLGNvdW50KSAlPiUgDQogIGdyb3VwX2J5KHdvcmQpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gc3VtKGNvdW50KSkgICU+JQ0KICBmaWx0ZXIoY291bnQ+MykgJT4lICAjIOmBjua/vuWHuuePvuWkquWwkeasoeeahOWtlw0KICBhcnJhbmdlKGRlc2MoY291bnQpKQ0KDQojIyPmlL/pu6gNCndvcmRfY291bnRfRFBQIDwtIERQUF9kYXRhICU+JQ0KICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIA0KICBncm91cF9ieSh3b3JkKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICAlPiUNCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcNCiAgYXJyYW5nZShkZXNjKGNvdW50KSkNCndvcmRfY291bnRfS01UIDwtIEtNVF9kYXRhICU+JQ0KICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIA0KICBncm91cF9ieSh3b3JkKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICAlPiUNCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcNCiAgYXJyYW5nZShkZXNjKGNvdW50KSkNCndvcmRfY291bnRfTlBQIDwtIE5QUF9kYXRhICU+JQ0KICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIA0KICBncm91cF9ieSh3b3JkKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICAlPiUNCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcNCiAgYXJyYW5nZShkZXNjKGNvdW50KSkNCndvcmRfY291bnRfUEZQIDwtIFBGUF9kYXRhICU+JQ0KICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIA0KICBncm91cF9ieSh3b3JkKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICAlPiUNCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcNCiAgYXJyYW5nZShkZXNjKGNvdW50KSkNCndvcmRfY291bnRfVFBQIDwtIFRQUF9kYXRhICU+JQ0KICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIA0KICBncm91cF9ieSh3b3JkKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICAlPiUNCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcNCiAgYXJyYW5nZShkZXNjKGNvdW50KSkNCmBgYA0KDQpgYGB7cn0NCndvcmRfY291bnRfVHNhaQ0Kd29yZF9jb3VudF9IZW4NCndvcmRfY291bnRfU29uZw0KYGBgDQoqKuipnumguyoqDQrkuInnrYblgJnpgbjkurrnmoTos4fmlpnkuK3lj6/nnIvliLDmnIDluLjooqvmj5Dlj4rnmoTpl5zpjbXlrZfngrrlgJnpgbjkurrnmoTlp5PlkI3vvIzlho3ogIXmmK/nq7bniK3lsI3miYvjgIHmlL/pu6jpl5zpjbXoqZ7jgILolKHoi7Hmloflj4rpn5PlnIvnkZzluLjooqvlqpLpq5TkvZzngrrlvbzmraToq5bov7DnmoTorbDpoYzvvIzlm6DmraTlj6/nnIvliLDlhanogIXnmoTpl5zpjbXoqZ7kuK3lh7rnj77lsI3mlrnnmoTlp5PlkI3jgIHmlL/pu6jjgILogIzlnKjlrovmpZrnkZzliYfmmK/lh7rnj77mn6/mloflk7LmraTpl5zpjbXlrZfvvIzljp/lm6Dlj6/mjqjnqbbngrrnlbbmmYLopqrmsJHpu6jluLjmj5Dlh7rlsI/pu6jlkIjkvZznrYnoqbHpoYzjgIINCg0KIyMg5paH5a2X6ZuyDQpgYGB7cn0NCndvcmRfY291bnRfVHNhaSAlPiUgd29yZGNsb3VkMigpDQp3b3JkX2NvdW50X0hlbiAlPiUgd29yZGNsb3VkMigpDQp3b3JkX2NvdW50X1NvbmcgJT4lIHdvcmRjbG91ZDIoKQ0KYGBgDQoNCiMjIyDku6VMSVdD5a2X5YW45Yik5pa35paH6ZuG5Lit55qEd29yZOWxrOaWvOato+mdouWtl+mChOaYr+iyoOmdouWtlw0KYGBge3J9DQojIOato+WQkeWtl+WFuHR4dOaqlA0KIyDku6Us5bCH5a2X5YiG6ZqUDQpQIDwtIHJlYWRfZmlsZSgibGl3Yy9wb3NpdGl2ZS50eHQiKQ0KDQojIOiyoOWQkeWtl+WFuHR4dOaqlA0KTiA8LSByZWFkX2ZpbGUoImxpd2MvbmVnYXRpdmUudHh0IikNCmBgYA0KDQoNCiMjIOWwh+Wtl+S4suS+nSzliIblibINCmBgYHtyfQ0KI3N0cnNwbGl05Zue5YKzbGlzdCAsIOaIkeWAkeWPluWHumxpc3TkuK3nmoTnrKzkuIDlgIvlhYPntKANClAgPSBzdHJzcGxpdChQLCAiLCIpW1sxXV0NCk4gPSBzdHJzcGxpdChOLCAiLCIpW1sxXV0NCg0KIyDlu7rnq4tkYXRhZnJhbWUg5pyJ5YWp5YCL5qyE5L2Nd29yZCxzZW50aW1lbnRz77yMd29yZOashOS9jeWFp+WuueaYr+Wtl+WFuOWQkemHjw0KUCA9IGRhdGEuZnJhbWUod29yZCA9IFAsIHNlbnRpbWVudCA9ICJwb3NpdGl2ZSIpDQpOID0gZGF0YS5mcmFtZSh3b3JkID0gTiwgc2VudGltZW50ID0gIm5lZ2F0aXZlIikNCmBgYA0KDQpgYGB7cn0NCkxJV0MgPSByYmluZChQLCBOKQ0KYGBgDQoNCg0KIyMjIOe4vee1seWAmemBuOS6uuiIh0xJV0Pmg4Xnt5LlrZflhbjlgZpqb2luDQoNCmBgYHtyfQ0Kd29yZF9jb3VudF9Uc2FpICU+JSBpbm5lcl9qb2luKExJV0MpDQoNCndvcmRfY291bnRfSGVuICU+JSBpbm5lcl9qb2luKExJV0MpDQoNCndvcmRfY291bnRfU29uZyAlPiUgaW5uZXJfam9pbihMSVdDKQ0KYGBgDQoNCioq5YCZ6YG45Lq65q2j6LKg5ZCR5oOF57eS5a2XKioNCuWcqOWAmemBuOS6uuato+WQkemXnOmNteWtl+S4reacgOW4uOWHuuePvueahOeCuuOAjOaUr+aMgeOAgeW4jOacm+OAgeiHqueUseOAje+8jOiyoOWQkemXnOmNteWtl+eCuuOAjOWVj+mhjOOAgeaJueipleOAjeWkmuiIh+mBuOiIieebuOmXnO+8jOiAjOWcqOmfk+Wci+eRnOeahOiyoOWQkeaDhee3kuWtl+S4reWHuuePvuOAjOmBsuWIsOOAjeOAgg0KDQojIyMg5pS/6buo6IiHTElXQ+aDhee3kuWtl+WFuOWBmmpvaW4NCg0KYGBge3J9DQp3b3JkX2NvdW50X0RQUCAlPiUgaW5uZXJfam9pbihMSVdDKQ0Kd29yZF9jb3VudF9LTVQgJT4lIGlubmVyX2pvaW4oTElXQykNCndvcmRfY291bnRfTlBQICU+JSBpbm5lcl9qb2luKExJV0MpDQp3b3JkX2NvdW50X1BGUCAlPiUgaW5uZXJfam9pbihMSVdDKQ0Kd29yZF9jb3VudF9UUFAgJT4lIGlubmVyX2pvaW4oTElXQykNCmBgYA0KDQoqKuaUv+m7qOato+iyoOWQkeaDhee3kuWtlyoqDQrmlL/pu6jnmoTmraPosqDlkJHpl5zpjbXlrZfot5/lgJnpgbjkurrnm7jkvLzjgILlnKjopqrmsJHpu6jnmoTos4fmlpnpm4bkuK3lh7rnj77jgIznvo7kurrjgI3mraTnlKjoqZ7vvIzntpPliIbmnpDlvoznmbznj77ngrroqbLmlL/pu6jnmbzoqIDkurrlp5PlkI3jgILlj6blpJbvvIzlnKjlkITmlL/pu6jnmoTpl5zpjbXlrZfmlbjph4/kuK3lj6/ku6Xnmbznj77ku6XmsJHpgLLpu6jjgIHmmYLku6Plipvph4/jgIHmsJHnnL7pu6jovIPlpJrvvIzmjqjoq5bngrroqbLmlL/pu6jmlK/mjIHogIXovIPluLjkvb/nlKjntrLot6/pgLLooYzoqI7oq5bvvIzku6Xoh7Tpl5zpjbXlrZfmlbjph4/pq5jmlrzlnIvmsJHpu6jjgIHopqrmsJHpu6jjgIINCg0KIyMg57Wx6KiI5q+P5aSp55qE5paH56ug5q2j6Z2i5a2X55qE5qyh5pW46IiH6LKg6Z2i5a2X55qE5qyh5pW4DQpgYGB7cn0NCiMjI+e4vee1sQ0Kc2VudGltZW50X2NvdW50X1RzYWkgPSBUc2FpX2RhdGEgJT4lDQogIHNlbGVjdChhcnREYXRlLHdvcmQsY291bnQpICU+JQ0KICBpbm5lcl9qb2luKExJV0MpICU+JSANCiAgZ3JvdXBfYnkoYXJ0RGF0ZSxzZW50aW1lbnQpICU+JQ0KICBzdW1tYXJpc2UoY291bnQ9c3VtKGNvdW50KSkNCg0Kc2VudGltZW50X2NvdW50X0hlbiA9IEhlbl9kYXRhICU+JQ0KICBzZWxlY3QoYXJ0RGF0ZSx3b3JkLGNvdW50KSAlPiUNCiAgaW5uZXJfam9pbihMSVdDKSAlPiUgDQogIGdyb3VwX2J5KGFydERhdGUsc2VudGltZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50PXN1bShjb3VudCkpDQoNCnNlbnRpbWVudF9jb3VudF9Tb25nID0gU29uZ19kYXRhICU+JQ0KICBzZWxlY3QoYXJ0RGF0ZSx3b3JkLGNvdW50KSAlPiUNCiAgaW5uZXJfam9pbihMSVdDKSAlPiUgDQogIGdyb3VwX2J5KGFydERhdGUsc2VudGltZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50PXN1bShjb3VudCkpDQoNCiMjI+aUv+m7qA0Kc2VudGltZW50X2NvdW50X0RQUCA9IERQUF9kYXRhICU+JQ0KICBzZWxlY3QoYXJ0RGF0ZSx3b3JkLGNvdW50KSAlPiUNCiAgaW5uZXJfam9pbihMSVdDKSAlPiUgDQogIGdyb3VwX2J5KGFydERhdGUsc2VudGltZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50PXN1bShjb3VudCkpDQoNCnNlbnRpbWVudF9jb3VudF9LTVQgPSBLTVRfZGF0YSAlPiUNCiAgc2VsZWN0KGFydERhdGUsd29yZCxjb3VudCkgJT4lDQogIGlubmVyX2pvaW4oTElXQykgJT4lIA0KICBncm91cF9ieShhcnREYXRlLHNlbnRpbWVudCkgJT4lDQogIHN1bW1hcmlzZShjb3VudD1zdW0oY291bnQpKQ0KDQpzZW50aW1lbnRfY291bnRfTlBQID0gTlBQX2RhdGEgJT4lDQogIHNlbGVjdChhcnREYXRlLHdvcmQsY291bnQpICU+JQ0KICBpbm5lcl9qb2luKExJV0MpICU+JSANCiAgZ3JvdXBfYnkoYXJ0RGF0ZSxzZW50aW1lbnQpICU+JQ0KICBzdW1tYXJpc2UoY291bnQ9c3VtKGNvdW50KSkNCnNlbnRpbWVudF9jb3VudF9QRlAgPSBQRlBfZGF0YSAlPiUNCiAgc2VsZWN0KGFydERhdGUsd29yZCxjb3VudCkgJT4lDQogIGlubmVyX2pvaW4oTElXQykgJT4lIA0KICBncm91cF9ieShhcnREYXRlLHNlbnRpbWVudCkgJT4lDQogIHN1bW1hcmlzZShjb3VudD1zdW0oY291bnQpKQ0Kc2VudGltZW50X2NvdW50X1RQUCA9IFRQUF9kYXRhICU+JQ0KICBzZWxlY3QoYXJ0RGF0ZSx3b3JkLGNvdW50KSAlPiUNCiAgaW5uZXJfam9pbihMSVdDKSAlPiUgDQogIGdyb3VwX2J5KGFydERhdGUsc2VudGltZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50PXN1bShjb3VudCkpDQpgYGANCg0KYGBge3J9DQpzZW50aW1lbnRfY291bnRfVHNhaSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeD1hcnREYXRlLHk9Y291bnQsY29sb3VyPXNlbnRpbWVudCkpKw0KICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVtLyVkIikpIA0KDQpzZW50aW1lbnRfY291bnRfSGVuICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9saW5lKGFlcyh4PWFydERhdGUseT1jb3VudCxjb2xvdXI9c2VudGltZW50KSkrDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkgDQoNCnNlbnRpbWVudF9jb3VudF9Tb25nICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9saW5lKGFlcyh4PWFydERhdGUseT1jb3VudCxjb2xvdXI9c2VudGltZW50KSkrDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkgDQpgYGANCg0KKirlgJnpgbjkurrmraPosqDlkJHmg4Xnt5IqKg0K5LiJ5L2N5YCZ6YG45Lq655qE5q2j6LKg5ZCR5oOF57eS5Y+v5Lul55yL5Ye65aSa5pW45Lul5q2j5ZCR5oOF57eS6LyD6auY77yM5Y+v5o6o56m254K66YG46IiJ5pyf6ZaT5aSa5pW46K2w6aGM6ZuW54K654it6K2w5oCn5Y+W5ZCR77yM5L2G5Zyo6YG46Kme5LiK5LmD54K65q2j5ZCR44CC5Zug5q2k77yM5pW06aGM6KeA5a+f5LiL5Y+v55yL5Yiw5aSa54K65q2j5ZCR5oOF57eS44CC5Y+m5aSW77yM6JSh6Iux5paH5Y+K6Z+T5ZyL55Gc6LyD5pep5o+Q5Ye65Y+D6YG46KiI55Wr77yM57ay6Lev6KiO6KuW6IGy6YeP55u46LyD5pa85a6L5qWa55Gc6LyD5pep5Ye654++44CCDQoNCmBgYHtyfQ0Kc2VudGltZW50X2NvdW50X1RzYWkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHg9YXJ0RGF0ZSx5PWNvdW50LGNvbG91cj1zZW50aW1lbnQpKSsNCiAgc2NhbGVfeF9kYXRlKGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlbS8lZCIpKSsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXJ0RGF0ZVt3aGljaChzZW50aW1lbnRfY291bnRfVHNhaSRhcnREYXRlID09IGFzLkRhdGUoJzIwMTkvMDgvMDUnKSlbMV1dKSksY29sb3VyID0gInllbGxvdyIsc2l6ZT0xKSsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXJ0RGF0ZVt3aGljaChzZW50aW1lbnRfY291bnRfVHNhaSRhcnREYXRlID09IGFzLkRhdGUoJzIwMjAvMDEvMTEnKSlbMV1dKSksY29sb3VyID0gInllbGxvdyIsc2l6ZT0xKQ0KDQojIzjmnIg15pel6LKg6Z2i5oOF57eS6aOG5Y2HDQpgYGANCg0KKirolKHoi7HmlofmraPosqDlkJHmg4Xnt5IqKg0KMjAxOS84LzXmn6/mloflk7LntYTmlrDmlL/pu6jlvozvvIzmjIfmjqfolKHoi7HmlofnuL3ntbHouqvpgornmoTkurrjgIzmr4/lgIvkurrpg73osqrmsZnjgI3vvIzlvJXotbfoiIfoq5borYHnhLbvvIznuL3ntbHlupzkuZ/nq4vljbPopoHmsYLmn6/mloflk7Lph5DmuIXlj4rpgZPmrYnjgILlm6DmraTvvIznlbbml6Xlh7rnj77ovIPpq5jnmoTosqDlkJHmg4Xnt5LjgILogIwyMDIwLzEvMTHnlbbml6XolKHoi7HmlofotI/lvpfoqbLlsYbnuL3ntbHpgbjoiInvvIzkuKbkuJTku6Xpq5jlvpfnpajnjofmiZPnoLTlhYjliY3nq7bpgbjntIDpjITjgILlm6DmraTvvIzmraPlkJHmg4Xnt5Lmr5TosqDlkJHmg4Xnt5Lpq5jlh7roqLHlpJrjgIINCg0KYGBge3J9DQpUc2FpX2RhdGEgJT4lIA0KICBmaWx0ZXIoYXJ0RGF0ZSA9PSBhcy5EYXRlKCcyMDE5LzA4LzA1JykpICU+JSANCiAgc2VsZWN0KHdvcmQsY291bnQpICU+JSANCiAgZ3JvdXBfYnkod29yZCkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpKSAgJT4lDQogIGZpbHRlcihjb3VudD4yMCkgJT4lICAgIyMjI+mBjua/vuWHuuePvuWkquWwkeasoeeahOWtlw0KICB3b3JkY2xvdWQyKCkNCiMj5p+v5paH5ZOy6KGo56S66JSh6Iux5paH6Lqr6YKK55qE5Lq66YO96LKq5rGZDQpgYGANCg0KYGBge3J9DQpzZW50aW1lbnRfY291bnRfVFBQICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9saW5lKGFlcyh4PWFydERhdGUseT1jb3VudCxjb2xvdXI9c2VudGltZW50KSkrDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkrDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFydERhdGVbd2hpY2goc2VudGltZW50X2NvdW50X0hlbiRhcnREYXRlID09IGFzLkRhdGUoJzIwMTkvMDgvMDUnKSkNClsxXV0pKSxjb2xvdXIgPSAieWVsbG93IixzaXplPTEpIA0KIyMj5ZCM5pel5Y+w5rCR6buo44CB5p+v5paH5ZOy55qE6KiO6KuW5bqm5Lmf5o+Q6auYIA0KYGBgDQoNCioq5rCR55y+6buo5q2j6LKg5ZCR5oOF57eSKioNCuafr+aWh+WTsue1hOe5lOOAjOWPsOeBo+awkeecvum7qOOAjeaQtuaUu+eri+azlemZouW4reasoe+8jOeEtuiAjOaYr+WQpuacieaEj+imgeWPg+mBuOe4vee1seOAgeacg+S4jeacg+acieOAjOmDreafr+mFjeOAjeOAgeOAjOafr+mDremFjeOAjeW8lei1t+Wkp+WutumXnOazqOOAguS7peWPiuafr+aWh+WTsuWcqDIwMTkvOC815LiK5Y2I5YWI5aSn57216Z+T5ZyL55Gc55m85aSn6LKh5piv5ZaK5Y+j6Jmf77yM5Y+I5om56KmV6JSh6Iux5paH5rKS6LKq5rGZ77yM5L2G6Lqr6YKK5q+P5YCL5Lq66YO96LKq5rGZ77yM55Sa6Iez56Cy6L2f5rex57ag5ZyY6auU5piv5YGH576p5ZKM5ZyY44CC5L2/5b6X5q2k5pel6K6T5rCR55y+6buo6Ly/6KuW6IGy6YeP6YGU5Yiw5pyA6auY5bOw44CCDQoNCmBgYHtyfQ0Kc2VudGltZW50X2NvdW50X0hlbiAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeD1hcnREYXRlLHk9Y291bnQsY29sb3VyPXNlbnRpbWVudCkpKw0KICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVtLyVkIikpKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcnREYXRlW3doaWNoKHNlbnRpbWVudF9jb3VudF9IZW4kYXJ0RGF0ZSA9PSBhcy5EYXRlKCcyMDE5LzEyLzI5JykpDQpbMV1dKSksY29sb3VyID0gInllbGxvdyIsc2l6ZT0xKSANCmBgYA0KDQoqKumfk+Wci+eRnOato+iyoOaDhee3kioqDQoyMDE5LzEyLzI56Z+T5ZyL55Gc5Y+D6IiH5Y+w54Gj57i957Wx5aSn6YG46Zu76KaW6L6v6KuW5pyD77yM5Lul5Y+K55W25pel5pma5LiK5Y+D5Yqg5Y+w5Lit6YCg5Yui5pma5pyD77yM5Zyo5aSn6Zuo6YCg5Yui44CB6L6v6KuW5pyD54Gr5Yqb5YWo6ZaL77yM6IGy6YeP5Ym15LiA5bm05paw6auY44CC6aaW5bqm5ouL5Ye644CM5Y+w54Gj5YWt5aGK6IKM44CN5pS/562W77yM6Z+T5ZyL55Gc6KGo56S677yM5Y+w54Gj5YiG54K65YWt5aSn5Y2A5aGK77yM55m85bGV5LiN5ZCM5Y2A5Z+f54m56Imy6IiH55Si5qWt77yM6KaB6K6T5Y+w54Gj6YeN5paw6KKr5ZyL6Zqb56S+5pyD6YeN6KaW77yM5Lul5Y+K5o+Q5Ye644CM5ru/5aSp5pif44CN6KiI5YqD77yM5Z+56aSK5bm06LyV5Lq65Ye65ZyL5Lqk5o+b5LiA5bm077yM6LuN5YWs5pWZ6K2m5raI5q+P5bm05bi26IG35bi26Jaq5Ye65ZyL6YCy5L+u44CC54S26ICM77yM57ay5Y+L6KqN54K66YCZ5Lqb5pS/562W5YWn5a656LyD54K656m65rOb44CC5Zug5q2k77yM55W25pel5Ye654++6LKg5ZCR5oOF57eS5pyA6auY44CCDQoNCmBgYHtyfQ0KSGVuX2RhdGEgJT4lIA0KICBmaWx0ZXIoYXJ0RGF0ZSA9PSBhcy5EYXRlKCcyMDE5LzEyLzI5JykpICU+JSANCiAgc2VsZWN0KHdvcmQsY291bnQpICU+JSANCiAgZ3JvdXBfYnkod29yZCkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpKSAgJT4lDQogIGZpbHRlcihjb3VudD4yMCkgJT4lICAgIyMjI+mBjua/vuWHuuePvuWkquWwkeasoeeahOWtlw0KICB3b3JkY2xvdWQyKCkNCiMjI+i+r+irluacg+WwjuiHtOmfk+Wci+eRnOeahOiBsumHj+iuiumrmA0KYGBgDQoNCmBgYHtyfQ0Kc2VudGltZW50X2NvdW50X1NvbmcgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHg9YXJ0RGF0ZSx5PWNvdW50LGNvbG91cj1zZW50aW1lbnQpKSsNCiAgc2NhbGVfeF9kYXRlKGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlbS8lZCIpKSsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXJ0RGF0ZVt3aGljaChzZW50aW1lbnRfY291bnRfU29uZyRhcnREYXRlID09IGFzLkRhdGUoJzIwMTkvMTEvMTInKSkNClsxXV0pKSxjb2xvdXIgPSAieWVsbG93IixzaXplPTEpDQpgYGANCg0KKirlrovmpZrnkZzmraPosqDlkJHmg4Xnt5IqKg0KMjAxOS8xMS8xMuWui+almueRnOaPkOWHuuWPg+mBuDIwMjDnuL3ntbHvvIzlvJXnmbzntrLot6/kuIDniYfnhrHorbDvvIzogIzlsI3mlrzlrovmpZrnkZw15bqm5Y+D6YG45LiA5LqL77yM6Kix5aSa57ay5Y+L6KGo56S655yf55qE5piv44CM5rS75Yiw6ICB6YG45Yiw6ICB44CN44CB44CM5pyJ6YG46IiJ6YKj5bm077yM5bCx5pyJ5a6L5qWa55Gc77yM6YCZ5bCx5piv5bm05bm05pyJ55Gc44CN44CB44CM55So5Y+D6YG46Zmq5Ly06JGX5oiR5YCR6ZW35aSn44CN44CB44CM6YGy5Yiw5L2G5rC45LiN57y65bit55qE55S35a2Q44CN44CC6K6T5q2j5ZCR5oOF57eS6YGU5Yiw6auY6bue44CCDQoNCmBgYHtyfQ0KU29uZ19kYXRhICU+JSANCiAgZmlsdGVyKGFydERhdGUgPT0gYXMuRGF0ZSgnMjAxOS8xMS8xMicpKSAlPiUgDQogIHNlbGVjdCh3b3JkLGNvdW50KSAlPiUgDQogIGdyb3VwX2J5KHdvcmQpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gc3VtKGNvdW50KSkgICU+JQ0KICBmaWx0ZXIoY291bnQ+MTApICU+JSAgICMg6YGO5r++5Ye654++5aSq5bCR5qyh55qE5a2XDQogIHdvcmRjbG91ZDIoKQ0KDQojIyAxMS8xMyDlrovmpZrnkZzlrqPluIPlj4PpgbjnuL3ntbENCmBgYA0KDQpgYGB7cn0NCnNlbnRpbWVudF9jb3VudF9UUFAgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHg9YXJ0RGF0ZSx5PWNvdW50LGNvbG91cj1zZW50aW1lbnQpKSsNCiAgc2NhbGVfeF9kYXRlKGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlbS8lZCIpKSsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXJ0RGF0ZVt3aGljaChzZW50aW1lbnRfY291bnRfVFBQJGFydERhdGUgPT0gYXMuRGF0ZSgnMjAxOS8xMC8wMycpKQ0KWzFdXSkpLGNvbG91ciA9ICJ5ZWxsb3ciLHNpemU9MSkNCmBgYA0KDQoqKuawkeecvum7qOato+iyoOWQkeaDhee3kioqDQoyMDE5LzEwLzPmsJHnnL7pu6jmj5Dlh7rmjqjlh7rkuI3liIbljYDnq4vlp5TmtbfpgbjoqIjnlavvvIznhLbogIzljYDln5/nq4vlp5TlgJnpgbjkurrlkI3llq7ooqvos6rnlpHlhbfmnInjgIzntqDnh5/og4zmma/jgI3vvIzpga3pg63lj7Dpipjmi5LntZXlkIjnhafjgILlm6DmraTvvIznlbbml6XnmoTosqDpnaLmg4Xnt5LovIPpq5jjgIINCg0KYGBge3J9DQpUc2FpX2RhdGEgJT4lDQogIGlubmVyX2pvaW4oTElXQykgJT4lDQogIGdyb3VwX2J5KHdvcmQsc2VudGltZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgDQogIGRhdGEuZnJhbWUoKSAlPiUgDQogIHRvcF9uKDMwLHd0ID0gY291bnQpICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgY291bnQpKSAlPiUNCiAgZ2dwbG90KGFlcyh3b3JkLCBjb3VudCwgZmlsbCA9IHNlbnRpbWVudCkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIGxhYnMoeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCkgKw0KICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkrDQogIGNvb3JkX2ZsaXAoKQ0KDQpIZW5fZGF0YSAlPiUNCiAgaW5uZXJfam9pbihMSVdDKSAlPiUNCiAgZ3JvdXBfYnkod29yZCxzZW50aW1lbnQpICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiAgZGF0YS5mcmFtZSgpICU+JSANCiAgdG9wX24oMzAsd3QgPSBjb3VudCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBjb3VudCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIGNvdW50LCBmaWxsID0gc2VudGltZW50KSkgKw0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgbGFicyh5ID0gIkNvbnRyaWJ1dGlvbiB0byBzZW50aW1lbnQiLA0KICAgICAgIHggPSBOVUxMKSArDQogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpKSsNCiAgY29vcmRfZmxpcCgpDQoNCg0KU29uZ19kYXRhICU+JQ0KICBpbm5lcl9qb2luKExJV0MpICU+JQ0KICBncm91cF9ieSh3b3JkLHNlbnRpbWVudCkgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIA0KICBkYXRhLmZyYW1lKCkgJT4lIA0KICB0b3BfbigzMCx3dCA9IGNvdW50KSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIGNvdW50KSkgJT4lDQogIGdncGxvdChhZXMod29yZCwgY291bnQsIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICBsYWJzKHkgPSAiQ29udHJpYnV0aW9uIHRvIHNlbnRpbWVudCIsDQogICAgICAgeCA9IE5VTEwpICsNCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMikpKw0KICBjb29yZF9mbGlwKCkNCg0KYGBgDQoNCg0KKirnuL3ntbHlgJnpgbjkurrmqJnpoYzlj4rnlZnoqIDmlbjliIbmnpAqKg0KYGBge3J9DQojIyDovInlhaXnuL3ntbHlgJnpgbjkurrmqJnpoYzmlocNClRzYWlfYXJ0aWNsZSA9IGZyZWFkKCdUc2FpX2FydGljbGVNZXRhRGF0YS5jc3YnLGVuY29kaW5nID0gJ1VURi04JykNCkhlbl9hcnRpY2xlID0gZnJlYWQoJ0hlbl9hcnRpY2xlTWV0YURhdGEuY3N2JyxlbmNvZGluZyA9ICdVVEYtOCcpDQoNCmBgYA0KDQpgYGB7cn0NCmNvbW1lbnROdW1fVHNhaSA8LSBUc2FpX2FydGljbGUgJT4lDQogIGZpbHRlcighaXMubmEoYXMubnVtZXJpYyhjb21tZW50TnVtKSkpJT4lDQogZ3JvdXBfYnkoYXJ0RGF0ZSkgJT4lDQogc3VtbWFyaXNlKGNvbW1lbnRfVHNhaSA9IHN1bShhcy5udW1lcmljKGNvbW1lbnROdW0pKSkNCg0KYXJ0aWNsZU51bV9Uc2FpIDwtIFRzYWlfYXJ0aWNsZSAlPiUNCiAgZmlsdGVyKCFpcy5uYShhcy5udW1lcmljKGNvbW1lbnROdW0pKSkgJT4lDQogIGdyb3VwX2J5KGFydERhdGUpICU+JQ0KIHN1bW1hcmlzZShhcnRpY2xlX1RzYWkgPSBuKCkpDQoNCmNvbW1lbnROdW1fSGVuIDwtIEhlbl9hcnRpY2xlICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGFzLm51bWVyaWMoY29tbWVudE51bSkpKSU+JQ0KIGdyb3VwX2J5KGFydERhdGUpICU+JQ0KIHN1bW1hcmlzZShjb21tZW50X0hlbiA9IHN1bShhcy5udW1lcmljKGNvbW1lbnROdW0pKSkNCg0KYXJ0aWNsZU51bV9IZW4gPC0gSGVuX2FydGljbGUgJT4lDQogIGZpbHRlcighaXMubmEoYXMubnVtZXJpYyhjb21tZW50TnVtKSkpICU+JQ0KICBncm91cF9ieShhcnREYXRlKSAlPiUNCiBzdW1tYXJpc2UoYXJ0aWNsZV9IZW4gPSBuKCkpDQpgYGANCg0KYGBge3J9DQpjb21tZW50TnVtX0hlbiAlPiUNCiAgaW5uZXJfam9pbihhcnRpY2xlTnVtX0hlbikgJT4lIA0KICBpbm5lcl9qb2luKGNvbW1lbnROdW1fVHNhaSkgJT4lDQogIGlubmVyX2pvaW4oYXJ0aWNsZU51bV9Uc2FpKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeD1hcy5EYXRlKGFydERhdGUpLHk9KGNvbW1lbnRfVHNhaSksY29sb3I9IuiUoeiLseaWh+eVmeiogOaVuCIpKSsNCiAgZ2VvbV9saW5lKGFlcyh4PWFzLkRhdGUoYXJ0RGF0ZSkseT0oY29tbWVudF9IZW4pLGNvbG9yPSLpn5PlnIvnkZznlZnoqIDmlbgiKSkrDQogIGdlb21fbGluZShhZXMoeD1hcy5EYXRlKGFydERhdGUpLHk9KGFydGljbGVfVHNhaSksY29sb3I9IuiUoeiLseaWh+aWh+eroOaVuCIpKSsNCiAgZ2VvbV9saW5lKGFlcyh4PWFzLkRhdGUoYXJ0RGF0ZSkseT0oYXJ0aWNsZV9IZW4pLGNvbG9yPSLpn5PlnIvnkZzmlofnq6DmlbgiKSkrDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiMxNTg1MWMiLCIjZmZiOTQwIiwiIzBkMzFiZiIsIiM1ZGMyZmMiKSkrDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkrDQogIHNjYWxlX3lfbG9nMTAoKQ0KIyMj6Z+T5ZyL55Gc5paH56ug55qE55WZ6KiA5pW45piO6aGv5aSa5pa86JSh6Iux5paH77yM6KiO6KuW5bqm6LyD6auYDQpgYGANCg0KKirlgJnpgbjkurrntrLot6/ogbLph48qKg0K5pW06auU6KeA5a+f5LiL77yM57ay6Lev6IGy6YeP5aSn5bCP6IiH6YG46IiJ57WQ5p6c5LiN5oiQ5q2j5q+U77yM6Z+T5ZyL55Gc55qE57i955WZ6KiA5pW444CB57i95paH56ug5pW45aSn5aSa6LaF6YGO6JSh6Iux5paH77yM5L6d6IiK5piv5pS/5rK75Lq654mp5Lit55qE6IGy6YeP546L77yM54S26ICM6YG46IiJ55qE57WQ5p6c5Y275piv5pWX6YG477yM5Y+v5o6o56uf57ay6Lev6IGy6YeP6IO95bGF6auY5LiN5LiL77yM5Y+v6IO95piv55Sx54it6K2w6YCg5oiQ55qE6LKg6Z2i6IGy6YeP5aCG55aK6ICM5oiQ44CCDQoNCg0KYGBge3J9DQpjb21tZW50TnVtX0hlbiAlPiUNCiAgaW5uZXJfam9pbihhcnRpY2xlTnVtX0hlbikgJT4lIA0KICBpbm5lcl9qb2luKGNvbW1lbnROdW1fVHNhaSkgJT4lDQogIGlubmVyX2pvaW4oYXJ0aWNsZU51bV9Uc2FpKSAlPiUNCiAgZ2dwbG90KCkrIA0KICBnZW9tX2xpbmUoYWVzKHg9YXMuRGF0ZShhcnREYXRlKSx5PShjb21tZW50X1RzYWkgLyBhcnRpY2xlX1RzYWkpLGNvbG9yPSJUc2FpIikpKw0KICBnZW9tX2xpbmUoYWVzKHg9YXMuRGF0ZShhcnREYXRlKSx5PShjb21tZW50X0hlbiAvIGFydGljbGVfSGVuKSxjb2xvcj0iSGVuIikpKw0KICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVtLyVkIikpDQojIyPkvYbkuZ/lm6DngrroqI7oq5bpn5PlnIvnkZznmoTmlofnq6DovIPlpJrvvIzlm6DmraTpn5PlnIvnkZzmlofnq6DnmoTlubPlnYfnlZnoqIDmlbjkuKbmspLmnInmr5TovIPlpJoNCmBgYA0KDQoqKuWAmemBuOS6uue2sui3r+iBsumHjyoqDQrnlbbmiJHlgJHnlKjnuL3oqIDmlbgv57i95paH56ug5pW45L6G55yL77yM6Z+T5ZyL55Gc55qE5paH56ug5bmz5Z2H55WZ6KiA5pW45Lim5rKS5pyJ5q+U6LyD5aSa44CC6ZuW54S26KiO6KuW6Z+T5ZyL55Gc55qE5paH56ug6LyD5aSa77yM5L2G55WZ6KiA5pW46YeP5Lim5LiN5aSa44CC