manipulate (インタラクティブなプロット)

manipulate関数の書き方``

  • 単一実行スクリプトの場合
manipulate(
  実行スクリプト,
  picker, sliderの情報(複数の場合はカンマで結合)
)
  • 複数実行スクリプトの場合
manipulate(
  {
  複数の実行スクリプト
  },
  picker, sliderの情報(複数の場合はカンマで結合)
)

注意:manipulate関数は、配布Notebookファイルではなく、拡張子”.R”のファイル上で確認すること

ライブラリのインストール

install.packages("manipulate")

ライブラリの読み込み

library(manipulate)

色の選択

title<-"PCH Symbols"
xlabel="x"
ylabel="y"
plot(0,1,pch=8,cex=5,col="blue", main=title, xlab=xlabel, ylab=ylabel)

  • picker()関数
manipulate(plot(0,0,pch=8,cex=5,col=myColors), myColors=picker("red", "violet", "pink", "orange", "yellow", "green", "blue", "cyan") )

プロットマーカーの選択

manipulate(
  plot(0,0,pch=myMarkers,cex=5,col=myColors), myColors=picker("red", "violet", "pink", "orange", "yellow", "green", "blue", "cyan",initial="violet"),
  myMarkers=picker(1,2,3,4,5,6,7,8,initial="5")
)

picker + List

colPalets = c("red", "violet", "pink", "orange", "yellow", "green", "blue", "cyan")
manipulate(
  plot(0,0,pch=myMarkers,cex=5,col=myColors, main=title, xlab=xlabel, ylab=ylabel),
  myColors=picker(as.list(colPalets),initial=colPalets[2]),
  myMarkers=picker(as.list(seq(1,8)),initial="5")
)

プロットサイズの選択

  • slider()関数
manipulate(
  plot(0,0,pch=8,cex=mySize,col="blue"),
  mySize=slider(1,10,initial=5,step=2)
)

軸ラベル表示の選択

  • checkbox()関数
manipulate(
  plot(0,0,pch=8,cex=mySize,col="blue", ann=annFlag, ylab="Y axis",xlab="X axis"),
  mySize=slider(1,11,initial=5,step=2),
  annFlag = checkbox(FALSE, "Show Label")
  )

オンライン記事から情報を取得 (Ref. Lec02)

ライブラリの読み込み

library(httr)
library(rvest)

Mainichi Japan’s Article titled “A sharply divided America decides between Trump and Harris

# URL of the Mainichi Shinbun's article
url <- "https://mainichi.jp/english/articles/20241106/p2g/00m/0in/002000c"

# Send a GET request with a user agent
response <- GET(url, user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 14_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15"))
page <- read_html(response)

Extract the content

article_content <- html_text(html_nodes(page, "p.txt"), trim = TRUE)
article_content[9]
[1] "\"This truly represents the best of who we are,\" Harris told a room of cheering staffers. She was handed a cellphone by supporters doing phone banking, and when asked by reporters how she was feeling, the vice president held up a phone and responded, \"Gotta talk to voters.\""

Text Cleaning

#cleaned_content <- gsub("\\r|\\n", "", article_content)
cleaned_content <- trimws(article_content)
cleaned_content <- paste(cleaned_content, collapse = "")
substring(cleaned_content, 1, 100)
[1] "WASHINGTON (AP) -- A divided America weighed a stark choice for the nation's future Tuesday as a pre"

出現単語頻度表の作成(高頻度順)

wordLst<-strsplit(cleaned_content,"[[:space:]]|[[:punct:]]")
wordLst<-unlist(wordLst)
wordLst<-tolower(wordLst)
wordLst<- wordLst[wordLst != ""]
freq <- table(wordLst)
freq_data<-sort(freq, decreasing=TRUE)

paste("Tokens", sum(freq_data), sep = ": ")
paste("Types", length(freq_data), sep = ": ")
length(sub_freq_data)
[1] 30

las: label style

las = 0 : XYの両軸とも目盛り文字は軸方向(デフォルト)
las = 1 : XYの両軸とも目盛り文字は水平方向
las = 2 : XYの両軸とも目盛り文字は軸方向と直角
las = 3 : XYの両軸とも目盛り文字は垂直方向
barplot(sub_freq_data, las=3,col=colPalets,ylab="Frequency")

練習:freq_dataを棒グラフで表示し、manipulate関数を使用して、以下の2点をインタラクティブに変更できるようにしてください。

-軸ラベルの向き -freq_dataの最低頻度値(最小値=1,最大値=6,Step=1)

  • 実行結果例は、配布資料の動画を参照

RColorBrewer Package

ライブラリの読み込み

library(wordcloud)
Loading required package: RColorBrewer

パレット情報

binfo<-brewer.pal.info[]
head(binfo)

パレットの抽出

palets <-rownames(binfo[binfo$maxcolors>10,])
palets
 [1] "BrBG"     "PiYG"     "PRGn"     "PuOr"     "RdBu"     "RdGy"     "RdYlBu"  
 [8] "RdYlGn"   "Spectral" "Paired"   "Set3"    

using a brewer.palet

palets[10]#"Paired"
[1] "Paired"
barplot(sub_freq_data, las=3,col=brewer.pal(10,palets[1]),ylab="Frequency")

Wordcloud2

ライブラリのインストール

install.packages("wordcloud2")
library(wordcloud2)
wordcloud2(freq_data)
wordcloud2(freq_data, size = 0.7, shape = 'star')
LS0tCnRpdGxlOiAiTGVjMDU6IE1hbmlwdWxhdGUiCm91dHB1dDogaHRtbF9ub3RlYm9vawplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KIyBtYW5pcHVsYXRlICjjgqTjg7Pjgr/jg6njgq/jg4bjgqPjg5bjgarjg5fjg63jg4Pjg4gpCiogPGEgaHJlZj0iaHR0cHM6Ly9zdXBwb3J0LnBvc2l0LmNvL2hjL2VuLXVzL2FydGljbGVzLzIwMDU1MTkwNi1JbnRlcmFjdGl2ZS1QbG90dGluZy13aXRoLU1hbmlwdWxhdGUtaW4tdGhlLVJTdHVkaW8tSURFIiB0YXJnZXQ9Il9ibGFuayI+UG9zaXQgc3VwcG9ydCBwYWdlOiBJbnRlcmFjdGl2ZSBQbG90dGluZyB3aXRoIE1hbmlwdWxhdGU8L2E+CgojIyBtYW5pcHVsYXRl6Zai5pWw44Gu5pu444GN5pa5YGAKCiog5Y2Y5LiA5a6f6KGM44K544Kv44Oq44OX44OI44Gu5aC05ZCICmBgYAptYW5pcHVsYXRlKAogIOWun+ihjOOCueOCr+ODquODl+ODiCwKICBwaWNrZXIsIHNsaWRlcuOBruaDheWgse+8iOikh+aVsOOBruWgtOWQiOOBr+OCq+ODs+ODnuOBp+e1kOWQiO+8iQopCmBgYAoKKiDopIfmlbDlrp/ooYzjgrnjgq/jg6rjg5fjg4jjga7loLTlkIgKYGBgCm1hbmlwdWxhdGUoCiAgewogIOikh+aVsOOBruWun+ihjOOCueOCr+ODquODl+ODiAogIH0sCiAgcGlja2VyLCBzbGlkZXLjga7mg4XloLHvvIjopIfmlbDjga7loLTlkIjjga/jgqvjg7Pjg57jgafntZDlkIjvvIkKKQpgYGAKCiMjIyDms6jmhI/vvJptYW5pcHVsYXRl6Zai5pWw44Gv44CB6YWN5biDTm90ZWJvb2vjg5XjgqHjgqTjg6vjgafjga/jgarjgY/jgIHmi6HlvLXlrZDigJ0uUuKAneOBruODleOCoeOCpOODq+S4iuOBp+eiuuiqjeOBmeOCi+OBk+OBqAoKIyMjIOODqeOCpOODluODqeODquOBruOCpOODs+OCueODiOODvOODqwpgYGB7ciwgZXZhbD1GQUxTRX0KaW5zdGFsbC5wYWNrYWdlcygibWFuaXB1bGF0ZSIpCmBgYAoKIyMjIOODqeOCpOODluODqeODquOBruiqreOBv+i+vOOBvwpgYGB7cn0KbGlicmFyeShtYW5pcHVsYXRlKQpgYGAKCiMjIyA8YSBocmVmPSJodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvZ3JhcGhpY3MvdmVyc2lvbnMvMy42LjIvdG9waWNzL3Bsb3QiIHRhcmdldD0iX2JsYW5rIj5GdW5jdGlvbjogcGxvdDwvYT4KLSA8YSBocmVmPSJodHRwczovL2h0c3VkYS5uZXQvc3RhdHMvcGxvdC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+cGNoOiBwbG90IGNoYXJhY3RlcjwvYT4KLSA8YSBocmVmPSJodHRwczovL2h0c3VkYS5uZXQvc3RhdHMvcGxvdC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+bGFzOiBsYWJlbCBzdHlsZTwvYT4KCiMjIyDoibLjga7pgbjmip4KYGBge3J9CnRpdGxlPC0iUENIIFN5bWJvbHMiCnhsYWJlbD0ieCIKeWxhYmVsPSJ5IgpwbG90KDAsMSxwY2g9OCxjZXg9NSxjb2w9ImJsdWUiLCBtYWluPXRpdGxlLCB4bGFiPXhsYWJlbCwgeWxhYj15bGFiZWwpCmBgYAoKKiBwaWNrZXIoKemWouaVsApgYGB7cixlcnJvcj1GQUxTRSxldmFsPUZBTFNFfQptYW5pcHVsYXRlKHBsb3QoMCwwLHBjaD04LGNleD01LGNvbD1teUNvbG9ycyksIG15Q29sb3JzPXBpY2tlcigicmVkIiwgInZpb2xldCIsICJwaW5rIiwgIm9yYW5nZSIsICJ5ZWxsb3ciLCAiZ3JlZW4iLCAiYmx1ZSIsICJjeWFuIikgKQpgYGAKCiMjIyDjg5fjg63jg4Pjg4jjg57jg7zjgqvjg7zjga7pgbjmip4KKiA8YSBocmVmPSJodHRwOi8vY3NlLm5hcm8uYWZmcmMuZ28uanAvdGFrZXphd2Evci10aXBzL3IvNTMuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPuODnuODvOOCq+ODvDwvYT4KKiBwaWNrZXIoKemWouaVsApgYGB7cixlcnJvcj1GQUxTRSxldmFsPUZBTFNFfQptYW5pcHVsYXRlKAogIHBsb3QoMCwwLHBjaD1teU1hcmtlcnMsY2V4PTUsY29sPW15Q29sb3JzKSwgbXlDb2xvcnM9cGlja2VyKCJyZWQiLCAidmlvbGV0IiwgInBpbmsiLCAib3JhbmdlIiwgInllbGxvdyIsICJncmVlbiIsICJibHVlIiwgImN5YW4iLGluaXRpYWw9InZpb2xldCIpLAogIG15TWFya2Vycz1waWNrZXIoMSwyLDMsNCw1LDYsNyw4LGluaXRpYWw9IjUiKQopCmBgYAoKIyMjIHBpY2tlciArIExpc3QKYGBge3IsZXJyb3I9RkFMU0UsZXZhbD1GQUxTRX0KY29sUGFsZXRzID0gYygicmVkIiwgInZpb2xldCIsICJwaW5rIiwgIm9yYW5nZSIsICJ5ZWxsb3ciLCAiZ3JlZW4iLCAiYmx1ZSIsICJjeWFuIikKbWFuaXB1bGF0ZSgKICBwbG90KDAsMCxwY2g9bXlNYXJrZXJzLGNleD01LGNvbD1teUNvbG9ycywgbWFpbj10aXRsZSwgeGxhYj14bGFiZWwsIHlsYWI9eWxhYmVsKSwKICBteUNvbG9ycz1waWNrZXIoYXMubGlzdChjb2xQYWxldHMpLGluaXRpYWw9Y29sUGFsZXRzWzJdKSwKICBteU1hcmtlcnM9cGlja2VyKGFzLmxpc3Qoc2VxKDEsOCkpLGluaXRpYWw9IjUiKQopCmBgYAoKIyMjIOODl+ODreODg+ODiOOCteOCpOOCuuOBrumBuOaKngoqIHNsaWRlcigp6Zai5pWwCmBgYHtyLGVycm9yPUZBTFNFLGV2YWw9RkFMU0V9Cm1hbmlwdWxhdGUoCiAgcGxvdCgwLDAscGNoPTgsY2V4PW15U2l6ZSxjb2w9ImJsdWUiKSwKICBteVNpemU9c2xpZGVyKDEsMTAsaW5pdGlhbD01LHN0ZXA9MikKKQpgYGAKCiMjIyDou7jjg6njg5njg6vooajnpLrjga7pgbjmip4KKiBjaGVja2JveCgp6Zai5pWwCmBgYHtyLGVycm9yPUZBTFNFLGV2YWw9RkFMU0V9Cm1hbmlwdWxhdGUoCiAgcGxvdCgwLDAscGNoPTgsY2V4PW15U2l6ZSxjb2w9ImJsdWUiLCBhbm49YW5uRmxhZywgeWxhYj0iWSBheGlzIix4bGFiPSJYIGF4aXMiKSwKICBteVNpemU9c2xpZGVyKDEsMTEsaW5pdGlhbD01LHN0ZXA9MiksCiAgYW5uRmxhZyA9IGNoZWNrYm94KEZBTFNFLCAiU2hvdyBMYWJlbCIpCiAgKQpgYGAKCiMjIOOCquODs+ODqeOCpOODs+iomOS6i+OBi+OCieaDheWgseOCkuWPluW+lyAoUmVmLiBMZWMwMikKIyMjIOODqeOCpOODluODqeODquOBruiqreOBv+i+vOOBvwpgYGB7cn0KbGlicmFyeShodHRyKQpsaWJyYXJ5KHJ2ZXN0KQpgYGAKIyMjIDxhIGhyZWY9Imh0dHBzOi8vbWFpbmljaGkuanAvZW5nbGlzaC9hcnRpY2xlcy8yMDI0MTEwNi9wMmcvMDBtLzBpbi8wMDIwMDBjIiB0YXJnZXQ9Il9ibGFuayI+TWFpbmljaGkgSmFwYW4ncyBBcnRpY2xlIHRpdGxlZCAiQSBzaGFycGx5IGRpdmlkZWQgQW1lcmljYSBkZWNpZGVzIGJldHdlZW4gVHJ1bXAgYW5kIEhhcnJpczwvYT4KYGBge3J9CiMgVVJMIG9mIHRoZSBNYWluaWNoaSBTaGluYnVuJ3MgYXJ0aWNsZQp1cmwgPC0gImh0dHBzOi8vbWFpbmljaGkuanAvZW5nbGlzaC9hcnRpY2xlcy8yMDI0MTEwNi9wMmcvMDBtLzBpbi8wMDIwMDBjIgoKIyBTZW5kIGEgR0VUIHJlcXVlc3Qgd2l0aCBhIHVzZXIgYWdlbnQKcmVzcG9uc2UgPC0gR0VUKHVybCwgdXNlcl9hZ2VudCgiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTRfNykgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE4LjAgU2FmYXJpLzYwNS4xLjE1IikpCnBhZ2UgPC0gcmVhZF9odG1sKHJlc3BvbnNlKQpgYGAKCiMjIyBFeHRyYWN0IHRoZSBjb250ZW50CmBgYHtyfQphcnRpY2xlX2NvbnRlbnQgPC0gaHRtbF90ZXh0KGh0bWxfbm9kZXMocGFnZSwgInAudHh0IiksIHRyaW0gPSBUUlVFKQpgYGAKCmBgYHtyfQphcnRpY2xlX2NvbnRlbnRbOV0KYGBgCgojIyMgVGV4dCBDbGVhbmluZwotIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9iYXNlL3ZlcnNpb25zLzMuNi4yL3RvcGljcy90cmltd3MiIHRhcmdldD0iX2JsYW5rIj50cmltd3M6IFJlbW92ZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gY2hhcmFjdGVyIHN0cmluZ3M8L2E+Ci0gPGEgaHJlZj0iaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL2Jhc2UvdmVyc2lvbnMvMy42LjIvdG9waWNzL2dyZXAiIHRhcmdldD0iX2JsYW5rIj5nc3ViOiBQYXR0ZXJuIE1hdGNoaW5nIGFuZCBSZXBsYWNlbWVudDwvYT4KLSA8YSBocmVmPSJodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvYmFzZS92ZXJzaW9ucy8zLjYuMi90b3BpY3MvcGFzdGUiIHRhcmdldD0iX2JsYW5rIj5wYXN0ZTogQ29uY2F0ZW5hdGUgU3RyaW5nczwvYT4KCmBgYHtyfQojY2xlYW5lZF9jb250ZW50IDwtIGdzdWIoIlxccnxcXG4iLCAiIiwgYXJ0aWNsZV9jb250ZW50KQpjbGVhbmVkX2NvbnRlbnQgPC0gdHJpbXdzKGFydGljbGVfY29udGVudCkKY2xlYW5lZF9jb250ZW50IDwtIHBhc3RlKGNsZWFuZWRfY29udGVudCwgY29sbGFwc2UgPSAiIikKc3Vic3RyaW5nKGNsZWFuZWRfY29udGVudCwgMSwgMTAwKQpgYGAKCiMjIyDlh7rnj77ljZjoqp7poLvluqbooajjga7kvZzmiJDvvIjpq5jpoLvluqbpoIbvvIkKYGBge3J9CndvcmRMc3Q8LXN0cnNwbGl0KGNsZWFuZWRfY29udGVudCwiW1s6c3BhY2U6XV18W1s6cHVuY3Q6XV0iKQp3b3JkTHN0PC11bmxpc3Qod29yZExzdCkKd29yZExzdDwtdG9sb3dlcih3b3JkTHN0KQp3b3JkTHN0PC0gd29yZExzdFt3b3JkTHN0ICE9ICIiXQpmcmVxIDwtIHRhYmxlKHdvcmRMc3QpCmZyZXFfZGF0YTwtc29ydChmcmVxLCBkZWNyZWFzaW5nPVRSVUUpCmBgYAoKIyMjIApgYGB7cn0KcGFzdGUoIlRva2VucyIsIHN1bShmcmVxX2RhdGEpLCBzZXAgPSAiOiAiKQpwYXN0ZSgiVHlwZXMiLCBsZW5ndGgoZnJlcV9kYXRhKSwgc2VwID0gIjogIikKYGBgCgoKYGBge3J9CnN1Yl9mcmVxX2RhdGEgPC0gZnJlcV9kYXRhW2ZyZXFfZGF0YT49Nl0KbGVuZ3RoKHN1Yl9mcmVxX2RhdGEpCmBgYAoKIyMjIDxhIGhyZWY9Imh0dHBzOi8vaHRzdWRhLm5ldC9zdGF0cy9wbG90Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj5sYXM6IGxhYmVsIHN0eWxlPC9hPgpgYGAKbGFzID0gMCA6IFhZ44Gu5Lih6Lu444Go44KC55uu55ub44KK5paH5a2X44Gv6Lu45pa55ZCR77yI44OH44OV44Kp44Or44OI77yJCmxhcyA9IDEgOiBYWeOBruS4oei7uOOBqOOCguebruebm+OCiuaWh+Wtl+OBr+awtOW5s+aWueWQkQpsYXMgPSAyIDogWFnjga7kuKHou7jjgajjgoLnm67nm5vjgormloflrZfjga/ou7jmlrnlkJHjgajnm7Top5IKbGFzID0gMyA6IFhZ44Gu5Lih6Lu444Go44KC55uu55ub44KK5paH5a2X44Gv5Z6C55u05pa55ZCRCmBgYApgYGB7cn0KYmFycGxvdChzdWJfZnJlcV9kYXRhLCBsYXM9Myxjb2w9Y29sUGFsZXRzLHlsYWI9IkZyZXF1ZW5jeSIpCmBgYAojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7ICI+57e057+SPC9zcGFuPjpmcmVxX2RhdGHjgpLmo5LjgrDjg6njg5XjgafooajnpLrjgZfjgIFtYW5pcHVsYXRl6Zai5pWw44KS5L2/55So44GX44Gm44CB5Lul5LiL44GuMueCueOCkuOCpOODs+OCv+ODqeOCr+ODhuOCo+ODluOBq+WkieabtOOBp+OBjeOCi+OCiOOBhuOBq+OBl+OBpuOBj+OBoOOBleOBhOOAggoKLei7uOODqeODmeODq+OBruWQkeOBjQotZnJlcV9kYXRh44Gu5pyA5L2O6aC75bqm5YCk77yI5pyA5bCP5YCkPTEs5pyA5aSn5YCkPTYsU3RlcD0x77yJCgoqIOWun+ihjOe1kOaenOS+i+OBr+OAgemFjeW4g+izh+aWmeOBruWLleeUu+OCkuWPgueFpwoKIyMgPGEgaHJlZj0iaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL1JDb2xvckJyZXdlci9SQ29sb3JCcmV3ZXIucGRmIiB0YXJnZXQ9Il9ibGFuayI+UkNvbG9yQnJld2VyIFBhY2thZ2U8L2E+CiMjIyDjg6njgqTjg5bjg6njg6rjga7oqq3jgb/ovrzjgb8KYGBge3J9CmxpYnJhcnkod29yZGNsb3VkKQpgYGAKCiMjIyDjg5Hjg6zjg4Pjg4jmg4XloLEKYGBge3J9CmJpbmZvPC1icmV3ZXIucGFsLmluZm9bXQpoZWFkKGJpbmZvKQpgYGAKCiMjIyDjg5Hjg6zjg4Pjg4jjga7mir3lh7oKYGBge3J9CnBhbGV0cyA8LXJvd25hbWVzKGJpbmZvW2JpbmZvJG1heGNvbG9ycz4xMCxdKQpwYWxldHMKYGBgCgojIyMgdXNpbmcgYSBicmV3ZXIucGFsZXQKYGBge3J9CnBhbGV0c1sxMF0jIlBhaXJlZCIKYmFycGxvdChzdWJfZnJlcV9kYXRhLCBsYXM9Myxjb2w9YnJld2VyLnBhbCgxMCxwYWxldHNbMV0pLHlsYWI9IkZyZXF1ZW5jeSIpCmBgYAoKIyMgPGEgaHJlZj0iaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3dvcmRjbG91ZC93b3JkY2xvdWQucGRmIiB0YXJnZXQ9Il9ibGFuayI+V29yZGNsb3VkPC9hPgpgYGB7cn0KbGlicmFyeSh3b3JkY2xvdWQpCndvcmRjbG91ZChuYW1lcyhzdWJfZnJlcV9kYXRhKSwgc3ViX2ZyZXFfZGF0YSwgY29sb3JzPWJyZXdlci5wYWwoMTAscGFsZXRzWzFdKSwgbWluLmZyZXE9NikKYGBgCgojIyA8YSBocmVmPSJodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvd29yZGNsb3VkL3dvcmRjbG91ZC5wZGZodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvd29yZGNsb3VkMi93b3JkY2xvdWQyLnBkZiIgdGFyZ2V0PSJfYmxhbmsiPldvcmRjbG91ZDI8L2E+CgojIyMg44Op44Kk44OW44Op44Oq44Gu44Kk44Oz44K544OI44O844OrCmBgYHtyLCBldmFsPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzKCJ3b3JkY2xvdWQyIikKYGBgCmBgYHtyfQpsaWJyYXJ5KHdvcmRjbG91ZDIpCndvcmRjbG91ZDIoZnJlcV9kYXRhKQpgYGAKYGBge3J9CndvcmRjbG91ZDIoZnJlcV9kYXRhLCBzaXplID0gMC43LCBzaGFwZSA9ICdzdGFyJykKYGBgCgoK