準備
自分のPCまたは教室のPC
ログイン
ウェッブ・ブラウザー(Google Chrome など)を起動
RStudio を起動
第2週
12/14(TH) 所得と富の不平等の現状1
所得と富の不平等の現状2
講義では、第2週、第3週とWorld Inequality report
2022を使って、所得と富の不平等について議論します。
12/19(TU) Rでデータサイエンス2:人口の少子高齢化 [Main]
講義 12月14日(木)所得と富の不平等
World Inequality Report 2022 [Link]
Executive Summary [Link]・[みんなのデータサイエンスへのリンク]
Introduction [Link]
Chapter 1 Global economic inequality: insights: [Link]
Chapter 2 Global inequality from 1820 to now: the persistence and
mutation of extreme inequality [Link]
Chapter 3 Rich countries, poor governments [Link]
Chapter 4 Global wealth inequality: the rise of multimillionaires
[Link]
演習 12月19日(木)人口と少子高齢化
世界開発指標(World Development Indicators)[Link]
練習1. WDI のサイトで、興味のある指標の、名前と、WDI
コードを選んでください。できれば、選択した理由も記録してください。
人々(People)- 人口動態(Population
dynamics)
総人口 Population, total:SP.POP.TOTL [Link]
出生率(千人)Birth rate, crude (per 1,000 people):SP.DYN.CBRT.IN
[Link]
死亡率(千人)Death rate, crude (per 1,000 people):SP.DYN.CDRT.IN
[Link]
若年労働人口率 Age dependency ratio, young (% of working-age
population):SP.POP.DPND.YG [Link]
高齢者労働人口率 Age dependency ratio, old (% of working-age
population):SP.POP.DPND.OL [Link]
演習の内容
パッケージ(Package)インストール(コンピュータに入れておく)
パッケージのロード(すぐ使えるようにする):tidyverse, WDI,
showtext
データの取得:WDI()
特定の条件にあった行を選択:filter()
順番に、変形、視覚化などをするためのパイプ:|>
(または、%>%
)
折れ線グラフ:ggplot(…) + geom_point()
パッケージとそのインストール
R のパッケージは、R
の機能を拡張するもので、コード(プログラム)や、データなどが収められています。インストール(install:
コンピュータに入れて使えるようにすること)と、ロード(load:
いつでも使えるようにすること)が必要です。
パッケージのロード
- パッケージに収められている、コード(プログラム、命令)や、データをすぐに使えるようにします。
library(パッケージ名)
とします。
毎回 tidyverse と WDI を使いますから、R Notebook
の最初には、次のコードチャンクを作成し、実行(Run)します。
library(tidyverse)
library(WDI)
#library(showtext)
日本語表示のために
図のタイトルなどが、日本語で文字化けしないようにおまじないです。
R Notebook の Preview
で図のタイトルが小さい場合には、2行目(showtext_auto()
)を
# で、コメントアウト。
#showtext_auto(FALSE)
#showtext_auto() # for slides etc remove #
データの読み込み(1)
データの読み込み方法はデータの種類などにより何種類もありますが、まず、WDI
パッケージの、WDI
という名前のデータ取得のコード(命令、プログラム)を使って、総人口のデータを読み込みます。それには、WDI
コードと呼ばれる、SP.POP.TOTL を使います。
総人口 Population, total:SP.POP.TOTL
取得した、データをそのあとで、呼び出して使うために、<-
を使って、名前をつけ(assign)ます。データの形式が、data frame
と呼ばれるものなので、わたしは、いつも、最初に df
として、簡単な名前をつけます。名前はなんでも良いのですが、覚えやすいように、また、日本語も受け付けますが、扱いが複雑になるので、英数のみ、スペースや、ハイフンは使えないので、区切りには、_
を使っています。
読み込みには、少し時間がかかります。
df_pop <- WDI(indicator = c(pop = "SP.POP.TOTL"))
Rows: 16758 Columns: 5── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, pop
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
REGION
地域名に対応する iso2c コードの取得
REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1",
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2",
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL",
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF",
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
地域名の確認
df_pop |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
国名確認
df_pop |> filter(!(iso2c %in% REGION)) |>
distinct(country, iso2c) |> arrange(country)
行の選択(filter()
)
filter
(条件)
:条件にあった行を選択抽出します。
filter
(変数 ==
“文字列”) :変数が文字列と一致するものを抽出(= ではなく、==
に注意)
filter
(変数
%in% c
(“文字列1”, …, “文字列n”) : 変数が文字列1
から 文字列n のどれかに一致したものを抽出
filter
(!
条件)
:条件と一致しないものを抽出。
filter
(条件1, 条件2):条件1
に一致するもののなかで、条件2 に一致するものを抽出。
filter
(条件1 | 条件2):条件1
に一致するか、条件2 に一致するものを抽出。
filter
(変数 <
数値):数値のときは、引用符なし。<=, >, >=
も同様。
distinct
(変数):変数の値が異なるもののみ抽出
drop_na
(変数):変数の値が NA
のものは、削除
パイプ・折れ線グラフ
df_pop |> filter(country == "World") |>
ggplot(aes(year, pop)) + geom_line() +
labs(title = "世界の総人口")
df_pop |> filter(country == "Japan") |>
ggplot(aes(year, pop)) + geom_line() +
labs(title = "日本の総人口")
練習1:Germany と
ドイツの部分を他の国名に変えてみてください。
COUNTRY <- "Germany"
df_pop |> filter(country == COUNTRY) |>
ggplot(aes(year, pop)) + geom_line() +
labs(title = "ドイツの総人口")
COUNTRY <- "France"
df_pop |> filter(country == COUNTRY) |>
ggplot(aes(year, pop)) + geom_line() +
labs(title = "フランスの総人口")
COUNTRY <- "Korea, Rep."
df_pop |> filter(country == COUNTRY) |>
ggplot(aes(year, pop)) + geom_line() +
labs(title = paste0(COUNTRY,"の総人口"))
COUNTRY <- "Sub-Saharan Africa"
df_pop |> filter(country == COUNTRY) |>
ggplot(aes(year, pop)) + geom_line() +
labs(title = paste(COUNTRY,"の総人口"))
練習2. COUNTRIES
を編集して、イギリスとドイツとフランスと日本を他の国に変えてみてください。
COUNTRIES <- c("United Kingdom", "Germany", "France", "Japan")
df_pop |> filter(country %in% COUNTRIES) |>
ggplot(aes(year, pop, col = country)) + geom_line() +
labs(title = "イギリスとドイツとフランスと日本の総人口")
COUNTRIES <- c("Brazil", "Russian Federation", "India", "China", "South Africa")
df_pop |> filter(country %in% COUNTRIES) |>
ggplot(aes(year, pop, col = country)) + geom_line() +
labs(title = "BRICS の総人口")
2022年の総人口の多い順
df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |>
arrange(desc(pop))
2022年の総人口の TOP 11
pop_top11 <- df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |>
arrange(desc(pop)) |> slice_head(n=11) |> pull(iso2c)
pop_top11
[1] "IN" "CN" "US" "ID" "PK" "NG" "BR" "BD" "RU" "MX" "JP"
dput(pop_top11)
c("IN", "CN", "US", "ID", "PK", "NG", "BR", "BD", "RU", "MX",
"JP")
練習4.
1960年の総人口が多い順に五番目までリストしてください。
pop_top5 <- df_pop |> filter(!(iso2c %in% REGION)) |>
filter(year == 1960) |>
arrange(desc(pop)) |> slice_head(n=5) |> pull(iso2c)
pop_top5
[1] "CN" "IN" "US" "RU" "JP"
dput(pop_top5)
c("CN", "IN", "US", "RU", "JP")
df_pop |> filter(!(iso2c %in% REGION)) |>
filter(year == 1960) |>
arrange(desc(pop)) |> slice_head(n=5)
TOP11 の人口推移
df_pop |> filter(iso2c %in% pop_top11) |>
ggplot(aes(year, pop, color = iso2c)) + geom_line() + labs(title = "TOP11の総人口")
中国とインド以外のTOP11 の人口推移
df_pop |> filter(iso2c %in% pop_top11) |>
filter(!(iso2c %in% c("CN", "IN"))) |>
ggplot(aes(year, pop, color = country)) + geom_line() +
labs(title = "中国とインド以外のTOP11の総人口")
地域ごとの人口推移
df_pop |> filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa",
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |>
ggplot(aes(year, pop, color = country)) + geom_line() + labs(title = "地域ごとの総人口")
LS0tCnRpdGxlOiAiR0VTIDAwMSDmvJTnv5IyIgphdXRob3I6ICJJRCwgWW91ciBOYW1lIgpkYXRlOiAiMjAyM+W5tDEy5pyIMTnml6UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIOa6luWCmQoKLSAgIOiHquWIhuOBrlBD44G+44Gf44Gv5pWZ5a6k44GuUEMKCiAgICAxLiAg44Ot44Kw44Kk44OzCgogICAgMi4gIOOCpuOCp+ODg+ODluODu+ODluODqeOCpuOCtuODvO+8iEdvb2dsZSBDaHJvbWUg44Gq44Gp77yJ44KS6LW35YuVCgogICAgICAgIC0gICBNb29kbGUg44GuIEdFUzAwMSDntYzmuIjjgajntYzmuIjlrabjga7jgrXjgqTjg4jjgYvjgonjgIHjgZPjga7jgrnjg6njgqTjg4njga7jg5rjg7zjgrjjgpLooajnpLrvvIjjg6rjg7Pjgq/jgIxS44Gn44OH44O844K/44K144Kk44Ko44Oz44K544CN44Gu56ysMumAse+8iQoKICAgICAgICAtICAg77yI5Yil44Gu44K/44OW44G+44Gf44GvIOOCpuOCo+ODs+ODieOCpuOBp++8iVBvc2l0Q2xvdWQg44Gr44Ot44Kw44Kk44Oz77yI44Ki44Kr44Km44Oz44OI44Gu44Gq44GE5Lq644Gv44K144Kk44Oz44O744Ki44OD44OX77yJCgogICAgMy4gIFJTdHVkaW8g44KS6LW35YuVCgogICAgICAgIC0gICDoh6rliIbjga5QQ+OBq1Ig44GoIFJTdHVkaW8g44KS44Kk44Oz44K544OI44O844Or44GX44Gm44GE44Gq44GE44Gy44Go44Gv5LiN6KaB44CCCgogICAgICAgIC0gICDmnIDlvozjgavmmYLplpPjgYzjgYLjgozjgbDjgIHjgqTjg7Pjgrnjg4jjg7zjg6vjgavjgaTjgYTjgaboqqzmmI7jgZfjgb7jgZnjgIIKCiMjIOesrDLpgLEKCjEyLzE0KFRIKeOAgOaJgOW+l+OBqOWvjOOBruS4jeW5s+etieOBruePvueKtu+8kQoK44CA44CA44CA44CA44CAIMKg5omA5b6X44Go5a+M44Gu5LiN5bmz562J44Gu54++54q277ySCgrorJvnvqnjgafjga/jgIHnrKwy6YCx44CB56ysM+mAseOBqFdvcmxkIEluZXF1YWxpdHkgcmVwb3J0IDIwMjLjgpLkvb/jgaPjgabjgIHmiYDlvpfjgajlr4zjga7kuI3lubPnrYnjgavjgaTjgYTjgaborbDoq5bjgZfjgb7jgZnjgIIKCjEyLzE5KFRVKeOAgFLjgafjg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrnvvJLvvJrkurrlj6Pjga7lsJHlrZDpq5jpvaLljJbjgIAgW1tNYWluXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9pbmRleC5odG1sKV0KCiMjIOism+e+qSAxMuaciDE05pel77yI5pyo77yJ5omA5b6X44Go5a+M44Gu5LiN5bmz562JCgojIyMgV29ybGQgSW5lcXVhbGl0eSBSZXBvcnQgMjAyMiBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQpXQoKLSAgIEV4ZWN1dGl2ZSBTdW1tYXJ5IFtbTGlua10oaHR0cHM6Ly93aXIyMDIyLndpZC53b3JsZC9leGVjdXRpdmUtc3VtbWFyeS8pXeODu1tb44G/44KT44Gq44Gu44OH44O844K/44K144Kk44Ko44Oz44K544G444Gu44Oq44Oz44KvXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai93aWQuaHRtbCN3aWQpXQoKLSAgIEludHJvZHVjdGlvbiBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvaW50cm9kdWN0aW9uLyldCgotICAgQ2hhcHRlciAxIEdsb2JhbCBlY29ub21pYyBpbmVxdWFsaXR5OiBpbnNpZ2h0czogW1tMaW5rXShodHRwczovL3dpcjIwMjIud2lkLndvcmxkL2NoYXB0ZXItMS8pXQoKLSAgIENoYXB0ZXIgMiBHbG9iYWwgaW5lcXVhbGl0eSBmcm9tIDE4MjAgdG8gbm93OiB0aGUgcGVyc2lzdGVuY2UgYW5kIG11dGF0aW9uIG9mIGV4dHJlbWUgaW5lcXVhbGl0eSBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvY2hhcHRlci0yLyldCgotICAgQ2hhcHRlciAzIFJpY2ggY291bnRyaWVzLCBwb29yIGdvdmVybm1lbnRzIFtbTGlua10oaHR0cHM6Ly93aXIyMDIyLndpZC53b3JsZC9jaGFwdGVyLTMvKV0KCi0gICBDaGFwdGVyIDQgR2xvYmFsIHdlYWx0aCBpbmVxdWFsaXR5OiB0aGUgcmlzZSBvZiBtdWx0aW1pbGxpb25haXJlcyBbW0xpbmtdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvY2hhcHRlci00LyldCgojIyDmvJTnv5IgMTLmnIgxOeaXpe+8iOacqO+8ieS6uuWPo+OBqOWwkeWtkOmrmOm9ouWMlgoKIyMjIOS4lueVjOmWi+eZuuaMh+aome+8iFdvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnPvvIlbW0xpbmtdKGh0dHBzOi8vZGF0YXRvcGljcy53b3JsZGJhbmsub3JnL3dvcmxkLWRldmVsb3BtZW50LWluZGljYXRvcnMvKV0KCioq57e057+SMS4qKiBXREkg44Gu44K144Kk44OI44Gn44CB6IiI5ZGz44Gu44GC44KL5oyH5qiZ44Gu44CB5ZCN5YmN44Go44CBV0RJIOOCs+ODvOODieOCkumBuOOCk+OBp+OBj+OBoOOBleOBhOOAguOBp+OBjeOCjOOBsOOAgemBuOaKnuOBl+OBn+eQhueUseOCguiomOmMsuOBl+OBpuOBj+OBoOOBleOBhOOAggoKIyMjIyAqKuS6uuOAhe+8iFBlb3BsZe+8iS0g5Lq65Y+j5YuV5oWL77yIUG9wdWxhdGlvbiBkeW5hbWljc++8iSoqCgrnt4/kurrlj6PjgIBQb3B1bGF0aW9uLCB0b3RhbO+8mlNQLlBPUC5UT1RMIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLlBPUC5UT1RMKV0KCuWHuueUn+eOh++8iOWNg+S6uu+8iUJpcnRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DQlJULklOIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DQlJULklOKV0KCuatu+S6oeeOh++8iOWNg+S6uu+8iURlYXRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKe+8mlNQLkRZTi5DRFJULklOIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DRFJULklOKV0KCuiLpeW5tOWKtOWDjeS6uuWPo+eOh+OAgEFnZSBkZXBlbmRlbmN5IHJhdGlvLCB5b3VuZyAoJSBvZiB3b3JraW5nLWFnZSBwb3B1bGF0aW9uKe+8mlNQLlBPUC5EUE5ELllHIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLlBPUC5EUE5ELllHKV0KCumrmOm9ouiAheWKtOWDjeS6uuWPo+eOh+OAgEFnZSBkZXBlbmRlbmN5IHJhdGlvLCBvbGQgKCUgb2Ygd29ya2luZy1hZ2UgcG9wdWxhdGlvbinvvJpTUC5QT1AuRFBORC5PTCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5QT1AuRFBORC5PTCldCgojIyDmvJTnv5Ljga7lhoXlrrkKCi0gICDjg5Hjg4PjgrHjg7zjgrjvvIhQYWNrYWdl77yJ44Kk44Oz44K544OI44O844Or77yI44Kz44Oz44OU44Ol44O844K/44Gr5YWl44KM44Gm44GK44GP77yJCgotICAg44OR44OD44Kx44O844K444Gu44Ot44O844OJ77yI44GZ44GQ5L2/44GI44KL44KI44GG44Gr44GZ44KL77yJ77yadGlkeXZlcnNlLCBXREksIHNob3d0ZXh0CgotICAg44OH44O844K/44Gu5Y+W5b6X77yaV0RJKCkKCi0gICDnibnlrprjga7mnaHku7bjgavjgYLjgaPjgZ/ooYzjgpLpgbjmip7vvJpmaWx0ZXIoKQoKLSAgIOmghueVquOBq+OAgeWkieW9ouOAgeimluimmuWMluOBquOBqeOCkuOBmeOCi+OBn+OCgeOBruODkeOCpOODl++8mmB8PmAg77yI44G+44Gf44Gv44CBYCU+JWDvvIkKCi0gICDmipjjgoznt5rjgrDjg6njg5XvvJpnZ3Bsb3QoLi4uKSArIGdlb21fcG9pbnQoKQoKIyMg44OR44OD44Kx44O844K444Go44Gd44Gu44Kk44Oz44K544OI44O844OrCgo+IFIg44Gu44OR44OD44Kx44O844K444Gv44CBUiDjga7mqZ/og73jgpLmi6HlvLXjgZnjgovjgoLjga7jgafjgIHjgrPjg7zjg4nvvIjjg5fjg63jgrDjg6njg6DvvInjgoTjgIHjg4fjg7zjgr/jgarjganjgYzlj47jgoHjgonjgozjgabjgYTjgb7jgZnjgILjgqTjg7Pjgrnjg4jjg7zjg6vvvIhpbnN0YWxsOiDjgrPjg7Pjg5Tjg6Xjg7zjgr/jgavlhaXjgozjgabkvb/jgYjjgovjgojjgYbjgavjgZnjgovjgZPjgajvvInjgajjgIHjg63jg7zjg4nvvIhsb2FkOiDjgYTjgaTjgafjgoLkvb/jgYjjgovjgojjgYbjgavjgZnjgovjgZPjgajvvInjgYzlv4XopoHjgafjgZnjgIIKCiMjIyDjgqTjg7Pjgrnjg4jjg7zjg6sKCi0gICBSU3R1ZGlvIO+8iOOBvuOBn+OBr+OAgVBvc2l0IENsb3Vk77yJ44Gu44CB5LiK44Gu44Oh44OL44Ol44O844O744OQ44O844Gu44CBVG9vbHMg44GuIFB1bGwgZG93biDjgYvjgonjgIFJbnN0YWxsIFBhY2thZ2VzIOOCkumBuOOBs+OAgVBhY2thZ2VzIOOBq+ODkeODg+OCseODvOOCuOWQjeOCkuWFpeOCjOOBpuOAgeOCpOODs+OCueODiOODvOODq+OAgumAlOS4reOBvuOBp+OAgeODkeODg+OCseODvOOCuOWQjeOCkuWFpeOCjOOCi+OBqOS4i+OBq+WAmeijnOOBjOOBp+OCi+OBruOBp+OAgXRhYiDjgq3jg7zjgpLmirzjgZnjgajjgIHoh6rli5XlhaXlipvjgavjgarjgorjgIHjgrnjg5rjg6vjg5/jgrnjgYzpmLLjgZLjgb7jgZnjgILvvIjlj7PkuIvjga7nqpPmnqDvvIhQYW5l77yJ44Gu44CBUGFja2FnZXMg44K/44OW44Gu44CB5bem5LiK44Gu44CASW5zdGFsbCDjgpLmirzjgZfjgabjgoLjgIHlkIzjgZjjgoLjga7jgYzlh7rjgb7jgZnjgILvvIkKCiAgICAtICAgYGluc3RhbGwucGFja2FnZXMoIuODkeODg+OCseODvOOCuOWQjSIpYCDjgafjgoLjgIHjgqTjg7Pjgrnjg4jjg7zjg6vjgafjgY3jgb7jgZnjgIIKCiMjIOODkeODg+OCseODvOOCuOOBruODreODvOODiQoKLSAgIOODkeODg+OCseODvOOCuOOBq+WPjuOCgeOCieOCjOOBpuOBhOOCi+OAgeOCs+ODvOODie+8iOODl+ODreOCsOODqeODoOOAgeWRveS7pO+8ieOChOOAgeODh+ODvOOCv+OCkuOBmeOBkOOBq+S9v+OBiOOCi+OCiOOBhuOBq+OBl+OBvuOBmeOAgmBsaWJyYXJ5KOODkeODg+OCseODvOOCuOWQjSlgIOOBqOOBl+OBvuOBmeOAggoK5q+O5ZueIHRpZHl2ZXJzZSDjgaggV0RJIOOCkuS9v+OBhOOBvuOBmeOBi+OCieOAgVIgTm90ZWJvb2sg44Gu5pyA5Yid44Gr44Gv44CB5qyh44Gu44Kz44O844OJ44OB44Oj44Oz44Kv44KS5L2c5oiQ44GX44CB5a6f6KGM77yIUnVu77yJ44GX44G+44GZ44CCCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQojbGlicmFyeShzaG93dGV4dCkKYGBgCgojIyDml6XmnKzoqp7ooajnpLrjga7jgZ/jgoHjgasKCuWbs+OBruOCv+OCpOODiOODq+OBquOBqeOBjOOAgeaXpeacrOiqnuOBp+aWh+Wtl+WMluOBkeOBl+OBquOBhOOCiOOBhuOBq+OBiuOBvuOBmOOBquOBhOOBp+OBmeOAggoKUiBOb3RlYm9vayDjga4gUHJldmlldyDjgaflm7Pjga7jgr/jgqTjg4jjg6vjgYzlsI/jgZXjgYTloLTlkIjjgavjga/jgIHvvJLooYznm67vvIhgc2hvd3RleHRfYXV0bygpYO+8ieOCkiBcIyDjgafjgIHjgrPjg6Hjg7Pjg4jjgqLjgqbjg4jjgIIKCmBgYHtyfQojc2hvd3RleHRfYXV0byhGQUxTRSkgCiNzaG93dGV4dF9hdXRvKCkgIyBmb3Igc2xpZGVzIGV0YyByZW1vdmUgIyAKYGBgCgojIyDjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/vvIgx77yJCgrjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/mlrnms5Xjga/jg4fjg7zjgr/jga7nqK7poZ7jgarjganjgavjgojjgorkvZXnqK7poZ7jgoLjgYLjgorjgb7jgZnjgYzjgIHjgb7jgZrjgIFXREkg44OR44OD44Kx44O844K444Gu44CBV0RJIOOBqOOBhOOBhuWQjeWJjeOBruODh+ODvOOCv+WPluW+l+OBruOCs+ODvOODie+8iOWRveS7pOOAgeODl+ODreOCsOODqeODoO+8ieOCkuS9v+OBo+OBpuOAgee3j+S6uuWPo+OBruODh+ODvOOCv+OCkuiqreOBv+i+vOOBv+OBvuOBmeOAguOBneOCjOOBq+OBr+OAgVdESSDjgrPjg7zjg4njgajlkbzjgbDjgozjgovjgIFTUC5QT1AuVE9UTCDjgpLkvb/jgYTjgb7jgZnjgIIKCue3j+S6uuWPo+OAgFBvcHVsYXRpb24sIHRvdGFs77yaU1AuUE9QLlRPVEwKCuWPluW+l+OBl+OBn+OAgeODh+ODvOOCv+OCkuOBneOBruOBguOBqOOBp+OAgeWRvOOBs+WHuuOBl+OBpuS9v+OBhuOBn+OCgeOBq+OAgWA8LWAg44KS5L2/44Gj44Gm44CB5ZCN5YmN44KS44Gk44GR77yIYXNzaWdu77yJ44G+44GZ44CC44OH44O844K/44Gu5b2i5byP44GM44CBZGF0YSBmcmFtZSDjgajlkbzjgbDjgozjgovjgoLjga7jgarjga7jgafjgIHjgo/jgZ/jgZfjga/jgIHjgYTjgaTjgoLjgIHmnIDliJ3jgasgZGYg44Go44GX44Gm44CB57Ch5Y2Y44Gq5ZCN5YmN44KS44Gk44GR44G+44GZ44CC5ZCN5YmN44Gv44Gq44KT44Gn44KC6Imv44GE44Gu44Gn44GZ44GM44CB6Kaa44GI44KE44GZ44GE44KI44GG44Gr44CB44G+44Gf44CB5pel5pys6Kqe44KC5Y+X44GR5LuY44GR44G+44GZ44GM44CB5omx44GE44GM6KSH6ZuR44Gr44Gq44KL44Gu44Gn44CB6Iux5pWw44Gu44G/44CB44K544Oa44O844K544KE44CB44OP44Kk44OV44Oz44Gv5L2/44GI44Gq44GE44Gu44Gn44CB5Yy65YiH44KK44Gr44Gv44CBXF8g44KS5L2/44Gj44Gm44GE44G+44GZ44CCCgroqq3jgb/ovrzjgb/jgavjga/jgIHlsJHjgZfmmYLplpPjgYzjgYvjgYvjgorjgb7jgZnjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfcG9wIDwtIFdESShpbmRpY2F0b3IgPSBjKHBvcCA9ICJTUC5QT1AuVE9UTCIpKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CndyaXRlX2NzdihkZl9wb3AsICJkYXRhL3BvcC5jc3YiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmRmX3BvcCA8LSByZWFkX2NzdigiZGF0YS9wb3AuY3N2IikKYGBgCgojIyDjg4fjg7zjgr/jgpLopovjgabjgb/jgb7jgZfjgofjgYYKCmBgYHtyfQpkZl9wb3AKYGBgCgojIyBgUkVHSU9OYAoK5Zyw5Z+f5ZCN44Gr5a++5b+c44GZ44KLIGlzbzJjIOOCs+ODvOODieOBruWPluW+lwoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCiMjIOWcsOWfn+WQjeOBrueiuuiqjQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCiMjIOWbveWQjeeiuuiqjQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IAogIGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKSB8PiBhcnJhbmdlKGNvdW50cnkpCmBgYAoKIyMg6KGM44Gu6YG45oqe77yIYGZpbHRlcigpYO+8iQoKLSAgIGBmaWx0ZXJgKCrmnaHku7YqKSDvvJrmnaHku7bjgavjgYLjgaPjgZ/ooYzjgpLpgbjmip7mir3lh7rjgZfjgb7jgZnjgIIKCiAgICAtICAgYGZpbHRlcmAoKuWkieaVsCogYD09YCAiKuaWh+Wtl+WIlyoiKSDvvJrlpInmlbDjgYzmloflrZfliJfjgajkuIDoh7TjgZnjgovjgoLjga7jgpLmir3lh7rvvIg9IOOBp+OBr+OBquOBj+OAgT09IOOBq+azqOaEj++8iQoKICAgIC0gICBgZmlsdGVyYCgq5aSJ5pWwKiBgJWluJSBjYCgqIuaWh+Wtl+WIlzEiLCAuLi4sICLmloflrZfliJduIiopIO+8miDlpInmlbDjgYzmloflrZfliJcxIOOBi+OCiSDmloflrZfliJduIOOBruOBqeOCjOOBi+OBq+S4gOiHtOOBl+OBn+OCguOBruOCkuaKveWHugoKICAgIC0gICBgZmlsdGVyYChgIWAq5p2h5Lu2Kikg77ya5p2h5Lu244Go5LiA6Ie044GX44Gq44GE44KC44Gu44KS5oq95Ye644CCCgogICAgLSAgIGBmaWx0ZXJgKCrmnaHku7YxLCDmnaHku7YyKinvvJrmnaHku7YxIOOBq+S4gOiHtOOBmeOCi+OCguOBruOBruOBquOBi+OBp+OAgeadoeS7tjIg44Gr5LiA6Ie044GZ44KL44KC44Gu44KS5oq95Ye644CCCgogICAgLSAgIGBmaWx0ZXJgKCrmnaHku7YxIFx8IOadoeS7tjIqKe+8muadoeS7tjEg44Gr5LiA6Ie044GZ44KL44GL44CB5p2h5Lu2MiDjgavkuIDoh7TjgZnjgovjgoLjga7jgpLmir3lh7rjgIIKCiAgICAtICAgYGZpbHRlcmAoKuWkieaVsCogYDxgICrmlbDlgKQqKe+8muaVsOWApOOBruOBqOOBjeOBr+OAgeW8leeUqOespuOBquOBl+OAgmA8PSwgPiwgPj1gIOOCguWQjOanmOOAggoKLSAgIGBkaXN0aW5jdGAo5aSJ5pWwKe+8muWkieaVsOOBruWApOOBjOeVsOOBquOCi+OCguOBruOBruOBv+aKveWHugoKLSAgIGBkcm9wX25hYCjlpInmlbAp77ya5aSJ5pWw44Gu5YCk44GMICpOQSog44Gu44KC44Gu44Gv44CB5YmK6ZmkCgojIyDjg5HjgqTjg5fjg7vmipjjgoznt5rjgrDjg6njg5UKCi0gICBgfD5gIDog44OR44Kk44OX77yIcGlwZSBvcGVyYXRvcu+8ieasoeOAheOBq+ODh+ODvOOCv+OCkumAgeOBo+OBpuWun+ihjOOBleOBm+OCi+OBn+OCgeOBq+S9v+OBhOOBvuOBmeOAggoKICAgIC0gICBgZGF0YSB8PiBmaWx0ZXIo5p2h5Lu2KWAg44Gv44CBYGZpbHRlcihkYXRhLCDmnaHku7YpYCDjgajlkIzjgZgKCiAgICAtICAgYGRhdGEgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKWAg44Gv44CBYGZpbHRlcihkYXRhLCBpc28yYyAlaW4lIFJFR0lPTilgIOOBqOWQjOOBmOOAggoKLSAgIGBnZ3Bsb3QoYWVzKHllYXIsIHBvcCkpICsgZ2VvbV9saW5lKClg77ya5oqY44KM57ea44Kw44Op44OV44KS5o+P55S744GX44G+44GZ44CCCgogICAgLSAgIGBhZXMoeWVhciwgcG9wKWDvvJp5ZWFyIOOBjCB4IOi7uOOAgXBvcO+8iOe3j+S6uuWPo++8ieOCkiB5IOi7uOOBq+aMh+WumuOBl+OBvuOBmeOAggoKICAgICAgICAtICAgYGFlcyh4ID0geWVhciwgeSA9IHBvcClgIOOBruecgeeVpeW9ouOAggoKICAgIC0gICDjgrDjg6njg5Xjga7mj4/nlLvjgavjgaTjgYTjgabjga/jgIHmrKHlm57ku6XpmY3jgavlsJHjgZfjgZrjgaToqqzmmI7jgIIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoY291bnRyeSA9PSAiV29ybGQiKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIHBvcCkpICsgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIuS4lueVjOOBrue3j+S6uuWPoyIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLml6XmnKzjga7nt4/kurrlj6MiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKirnt7Tnv5Ix77yaR2VybWFueSDjgagg44OJ44Kk44OE44Gu6YOo5YiG44KS5LuW44Gu5Zu95ZCN44Gr5aSJ44GI44Gm44G/44Gm44GP44Gg44GV44GE44CCKioKCmBgYHtyfQpDT1VOVFJZIDwtICJHZXJtYW55IgpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgPT0gQ09VTlRSWSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3ApKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuODieOCpOODhOOBrue3j+S6uuWPoyIpCmBgYAoKYGBge3J9CkNPVU5UUlkgPC0gIkZyYW5jZSIKZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ID09IENPVU5UUlkpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjg5Xjg6njg7Pjgrnjga7nt4/kurrlj6MiKQpgYGAKCmBgYHtyfQpDT1VOVFJZIDwtICJLb3JlYSwgUmVwLiIKZGZfcG9wIHw+IGZpbHRlcihjb3VudHJ5ID09IENPVU5UUlkpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMChDT1VOVFJZLCLjga7nt4/kurrlj6MiKSkKYGBgCgpgYGB7cn0KQ09VTlRSWSA8LSAiU3ViLVNhaGFyYW4gQWZyaWNhIgpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgPT0gQ09VTlRSWSkgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3ApKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoQ09VTlRSWSwi44Gu57eP5Lq65Y+jIikpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKue3tOe/kjIuIENPVU5UUklFUyDjgpLnt6jpm4bjgZfjgabjgIHjgqTjgq7jg6rjgrnjgajjg4njgqTjg4Tjgajjg5Xjg6njg7Pjgrnjgajml6XmnKzjgpLku5bjga7lm73jgavlpInjgYjjgabjgb/jgabjgY/jgaDjgZXjgYTjgIIqKgoKYGBge3J9CkNPVU5UUklFUyA8LSBjKCJVbml0ZWQgS2luZ2RvbSIsICJHZXJtYW55IiwgIkZyYW5jZSIsICJKYXBhbiIpCmRmX3BvcCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIENPVU5UUklFUykgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3AsIGNvbCA9ICBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICLjgqTjgq7jg6rjgrnjgajjg4njgqTjg4Tjgajjg5Xjg6njg7Pjgrnjgajml6XmnKzjga7nt4/kurrlj6MiKQpgYGAKCmBgYHtyfQpDT1VOVFJJRVMgPC0gYygiQnJhemlsIiwgIlJ1c3NpYW4gRmVkZXJhdGlvbiIsICJJbmRpYSIsICJDaGluYSIsICJTb3V0aCBBZnJpY2EiKQpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDT1VOVFJJRVMpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wLCBjb2wgPSAgY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiQlJJQ1Mg44Gu57eP5Lq65Y+jIikKYGBgCgojIyAyMDIy5bm044Gu57eP5Lq65Y+j44Gu5aSa44GE6aCGCgpgYGB7cn0KZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpCmBgYAoKIyMgMjAyMuW5tOOBrue3j+S6uuWPo+OBriBUT1AgMTEKCmBgYHtyfQpwb3BfdG9wMTEgPC0gZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMikgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpIHw+IHNsaWNlX2hlYWQobj0xMSkgfD4gcHVsbChpc28yYykKcG9wX3RvcDExCmRwdXQocG9wX3RvcDExKQpgYGAKCioq57e057+SNC4gMTk2MOW5tOOBrue3j+S6uuWPo+OBjOWkmuOBhOmghuOBq+S6lOeVquebruOBvuOBp+ODquOCueODiOOBl+OBpuOBj+OBoOOBleOBhOOAgioqCgpgYGB7cn0KcG9wX3RvcDUgPC0gZGZfcG9wIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gCiAgZmlsdGVyKHllYXIgPT0gMTk2MCkgfD4gCiAgYXJyYW5nZShkZXNjKHBvcCkpIHw+IHNsaWNlX2hlYWQobj01KSB8PiBwdWxsKGlzbzJjKQpwb3BfdG9wNQpkcHV0KHBvcF90b3A1KQpgYGAKCmBgYHtyfQpkZl9wb3AgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiAKICBmaWx0ZXIoeWVhciA9PSAxOTYwKSB8PiAKICBhcnJhbmdlKGRlc2MocG9wKSkgfD4gc2xpY2VfaGVhZChuPTUpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBUT1AxMSDjga7kurrlj6Pmjqjnp7sKCmBgYHtyfQpkZl9wb3AgfD4gZmlsdGVyKGlzbzJjICVpbiUgcG9wX3RvcDExKSB8PgogIGdncGxvdChhZXMoeWVhciwgcG9wLCBjb2xvciA9IGlzbzJjKSkgKyBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAiVE9QMTHjga7nt4/kurrlj6MiKQpgYGAKCiMjIOS4reWbveOBqOOCpOODs+ODieS7peWkluOBrlRPUDExIOOBruS6uuWPo+aOqOenuwoKYGBge3J9CmRmX3BvcCB8PiBmaWx0ZXIoaXNvMmMgJWluJSBwb3BfdG9wMTEpIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgYygiQ04iLCAiSU4iKSkpIHw+IAogIGdncGxvdChhZXMoeWVhciwgcG9wLCBjb2xvciA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIuS4reWbveOBqOOCpOODs+ODieS7peWkluOBrlRPUDEx44Gu57eP5Lq65Y+jIikKYGBgCgojIyDlnLDln5/jgZTjgajjga7kurrlj6Pmjqjnp7sKCmBgYHtyfQpkZl9wb3AgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBjKCJTb3V0aCBBc2lhIiwgIkV1cm9wZSAmIENlbnRyYWwgQXNpYSIsICJNaWRkbGUgRWFzdCAmIE5vcnRoIEFmcmljYSIsIAoiRWFzdCBBc2lhICYgUGFjaWZpYyIsICJTdWItU2FoYXJhbiBBZnJpY2EiLCAiTGF0aW4gQW1lcmljYSAmIENhcmliYmVhbiIsICJOb3J0aCBBbWVyaWNhIikpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBwb3AsIGNvbG9yID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIuWcsOWfn+OBlOOBqOOBrue3j+S6uuWPoyIpCmBgYAo=