演習

以下の指標の中から、二つを選択して、データの概要(description)を記録し、データを WDI で取得し、以下の分析をする。

  1. 各年毎のデータの数の棒グラフ
  2. 国または地域を選択
  3. それぞれの経年変化を表す折れ線グラフ
    1. 日本
    2. 選択した国または地域
  4. 二つのデータの散布図-必要に応じて log10 スケールを用いる
    1. すべての値の散布図
    2. NA ではない値の散布図、近似(回帰)直線を表示
    3. 地域を除き国のみの散布図、近似(回帰)直線を表示
    4. 最近の年を選択し、地域を除き国のもの散布図、近似(回帰)直線を表示

それぞれについて考察(気づいたこと、疑問など)を記す

データ情報

  • CO2 emissions (metric tons per capita) :EN.ATM.CO2E.PC [Link] (co2pcap)

  • Forest area (% of land area):AG.LND.FRST.ZS [Link] (forest)

  • Renewable electricity output (% of total electricity output):EG.ELC.RNEW.ZS [Link] (renewable)

  • Electricity production from oil, gas and coal sources (% of total):EG.ELC.FOSL.ZS [Link] (fossil)

  • Electricity production from nuclear sources (% of total):EG.ELC.NUCL.ZS [Link] (nuclear)

確認作業

  • Preview で確認。

  • Web Browser で、w5_c123456.nb.html など、R Notebook を見て確認。

  • もし、問題があれば、Run ボタンの右の三角から、Run All を選択し、エラーがでないか確認。

  • 最初にもどる。

途中でのエラー

  • 入力したときには、例を参照して、スペルなどを確認してください。全角になっていると問題がおきます。() がペアでマッチしているか、確認してください。
  • 引用符が入っていなかったり、== のところが、= だったり、いろいろな可能性があります。Error message を読むこともたいせつです。エラーがでた、Code Chunk と、Error message を、ChatGPT や、Google Bard, Google Search に入れると、解決方法を教えてくれることもあります。
  • File not found の、エラーがでたときには、上から順に、Run (Code Chunk の右上の三角印を押して実行)してみてください。または、エラーが出たところに、カーソルを置き、上の、Run ボタンの右の三角から、Run All Chunks Above を選択すると、そこまでのすべての Code Chunk を実行してくれます。
  • 上の方法でうまくいかないときは、data フォルダに、データ(***.csv)が入っているかを確認、なければ、data フォルダがあることを確認して、最初のデータ読み込みのところを実行してみてください。
  • 実行できていても、結果が見えないこともあります。そのときは、Code Chunk の下にある、山二つの記号を押してみてください。これは、結果を表示、非表示にします。それが原因で隠れている場合があります。

例:二酸化炭素排出量と森林面積

データ

データ情報

  • データ1:一人当たりの二酸化炭素排出量 (CO2 emissions (metric tons per capita))、“EN.ATM.CO2E.PC”、co2pcap [Link]

  • 概要:Carbon dioxide emissions are those stemming from the burning of fossil fuels and the manufacture of cement. They include carbon dioxide produced during consumption of solid, liquid, and gas fuels and gas flaring.

  • データ2:森林面積(%)(Forest area (% of land area))、“AG.LND.FRST.ZS”、forest [Link]

  • 概要:Forest area is land under natural or planted stands of trees of at least 5 meters in situ, whether productive or not, and excludes tree stands in agricultural production systems (for example, in fruit plantations and agroforestry systems) and trees in urban parks and gardens.

データの取得

準備

library(tidyverse)
library(WDI)

データのダウンロードと保存:コードと変数名を指定。

df_w6eda <- WDI(indicator = c(co2pcap = "EN.ATM.CO2E.PC",
                              forest = "AG.LND.FRST.ZS"),
                extra = TRUE)

2回目からは、data から読み込めるようにしておく ファイル (Rmd) の保存場所に data フォルダがあることを確認

write_csv(df_w6eda, "data/w6eda.csv")
df_w6eda <- read_csv("data/w6eda.csv")
Rows: 16758 Columns: 14── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): country, iso2c, iso3c, region, capital, income, lending
dbl  (5): year, co2pcap, forest, longitude, latitude
lgl  (1): status
date (1): lastupdated
ℹ 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.

データの確認

df_w6eda
str(df_w6eda)
spc_tbl_ [16,758 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country    : chr [1:16758] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ iso2c      : chr [1:16758] "AF" "AF" "AF" "AF" ...
 $ iso3c      : chr [1:16758] "AFG" "AFG" "AFG" "AFG" ...
 $ year       : num [1:16758] 2014 1971 2006 2013 1995 ...
 $ status     : logi [1:16758] NA NA NA NA NA NA ...
 $ lastupdated: Date[1:16758], format: "2023-12-18" "2023-12-18" ...
 $ co2pcap    : num [1:16758] 0.2837 NA 0.0898 0.2981 0.0888 ...
 $ forest     : num [1:16758] 1.85 NA 1.85 1.85 1.85 ...
 $ region     : chr [1:16758] "South Asia" "South Asia" "South Asia" "South Asia" ...
 $ capital    : chr [1:16758] "Kabul" "Kabul" "Kabul" "Kabul" ...
 $ longitude  : num [1:16758] 69.2 69.2 69.2 69.2 69.2 ...
 $ latitude   : num [1:16758] 34.5 34.5 34.5 34.5 34.5 ...
 $ income     : chr [1:16758] "Low income" "Low income" "Low income" "Low income" ...
 $ lending    : chr [1:16758] "IDA" "IDA" "IDA" "IDA" ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   status = col_logical(),
  ..   lastupdated = col_date(format = ""),
  ..   co2pcap = col_double(),
  ..   forest = col_double(),
  ..   region = col_character(),
  ..   capital = col_character(),
  ..   longitude = col_double(),
  ..   latitude = col_double(),
  ..   income = col_character(),
  ..   lending = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 

変数の選択(selecting)

df_w6 <- df_w6eda |> 
  select(country, iso2c, year, co2pcap, forest, region, income)
df_w6

各年毎のデータの数の棒グラフ

df_w6eda |> drop_na(co2pcap, forest) |>
  ggplot(aes(year)) + geom_bar()

国と地域

country には、国と地域両方が入っています。地域の iso2c は以下のものです。

REGION <- c("1A", "1W", "4E", "6F", "6N", "6X", "7E", "8S", "A4", "A5", 
"A9", "B1", "B2", "B3", "B4", "B6", "B7", "B8", "C4", "C5", "C6", 
"C7", "C8", "C9", "D2", "D3", "D4", "D5", "D6", "D7", "EU", "F1", 
"F6", "M1", "M2", "N6", "OE", "R6", "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", "ZB", "ZF", "ZG", "ZH", "ZI", 
"ZJ", "ZQ", "ZT")

地域のリストを表示

df_w6eda |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

国名とその地域・所得レベルを表示

df_w6eda |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c, region, income)

分析する国のリスト

BRICS を選択します。

BRICS <- c("Brazil", "Russian Federation", "India", "China", "South Africa")

経年変化

a. 日本

df_w6 |> drop_na(co2pcap) |> filter(country == "Japan") |>
  ggplot(aes(year, co2pcap)) + geom_line() + 
  labs(title = "日本の一人当たりの二酸化炭素排出量")

気づいたこと・疑問

  • 9トン前後で推移している。
  • 2020年に落ちているのは、コロナのせいかもしれないので、このあとの変化が重要。
df_w6 |> drop_na(forest) |> filter(country == "Japan") |>
  ggplot(aes(year, forest)) + geom_line() + 
  labs(title = "日本の森林面積(%)")

気づいたこと・疑問

  • 0.25% 程度の幅で推移している。
  • 日本の国土が、380,000 平方キロとすると、0.25% は、950 平方キロなので、だいたい、30km x 30km の森林が増減しているということか。やはり、原因を知りたい。

b. 選択した国・地域

df_w6 |> drop_na(co2pcap) |> filter(country %in% BRICS) |>
  ggplot(aes(year, co2pcap, linetype = country)) + geom_line() + 
  labs(title = "BRICS の一人当たりの二酸化炭素排出量")

気づいたこと・疑問

  • 中国が急激に増加している。1990年の三倍程度。
  • ロシアは、1993年のソ連崩壊以後、しばらく減少。
df_w6 |> drop_na(forest) |> filter(country %in% BRICS) |>
  ggplot(aes(year, forest, linetype = country)) + geom_line() + 
  labs(title = "BRICSの森林面積(%)")

気づいたこと・疑問

  • 中国とインドは、森林面積も増加している。
  • ブラジルの1990年から2010年の間の、森林面積の減少は10%程度あるようだ。

二つのデータの散布図

必要に応じて log10 スケール (+ scale_y_log10)

a. すべての値の散布図

df_w6 |> ggplot(aes(forest, co2pcap, col = region)) + geom_point()

b. NA ではない値の散布図、近似(回帰)直線を表示

df_w6 |> drop_na(co2pcap, forest) |> 
  ggplot(aes(forest, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

c. 地域を除き国のみの散布図、近似(回帰)直線を表示

df_w6 |> filter(!(iso2c %in% REGION)) |> drop_na(co2pcap, forest) |> 
  ggplot(aes(forest, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

d. 最近の年を選択し、地域を除き国のもの散布図、近似(回帰)直線を表示

df_w6 |> filter(!(iso2c %in% REGION)) |> filter(year == 2020) |> drop_na(co2pcap, forest) |> 
  ggplot(aes(forest, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

  • 森林面積が10% よりも少ない国が多い
  • 弱い負の相関があるようだ
  • 授業で求めた相関係数は、-0.1832374。これは、四つの指標すべての値があり(NA ではなく)国地域も分けず、すべての年のデータでの相関をとったもの。傾向はある程度わかる。
df_w6 |> filter(!(iso2c %in% REGION)) |> filter(year == 2020) |> drop_na(co2pcap, forest) |> 
  select(co2pcap, forest) |> cor() 
            co2pcap      forest
co2pcap  1.00000000 -0.09914706
forest  -0.09914706  1.00000000

実習

例:二酸化炭素排出量と[選択した指標]

データ

データ情報

  • データ1:一人当たりの二酸化炭素排出量 (CO2 emissions (metric tons per capita))、“EN.ATM.CO2E.PC”、co2pcap [Link]

  • 概要:Carbon dioxide emissions are those stemming from the burning of fossil fuels and the manufacture of cement. They include carbon dioxide produced during consumption of solid, liquid, and gas fuels and gas flaring.

  • データ2:名前、コード、変数名、リンク

  • 概要:

データの取得

準備

library(tidyverse)
library(WDI)

データのダウンロードと保存:コードと変数名を指定。

データの名前は、変えたほうがよいので、例でも、df_w6eda_1 や、df_w6_1 に変えてあります。

df_w6eda_1 <- WDI(indicator = c(co2pcap = "EN.ATM.CO2E.PC",
                              forest = "AG.LND.FRST.ZS"),
                extra = TRUE)

2回目からは、data から読み込めるようにしておく ファイル (Rmd) の保存場所に data フォルダがあることを確認

write_csv(df_w6eda_1, "data/w6eda_1.csv")
df_w6eda_1 <- read_csv("data/w6eda_1.csv")

データの確認

df_w6eda_1
df_w6eda_1
Error: object 'df_w6eda_1' not found
str(df_w6eda_1)

変数の選択(selecting)

df_w6_1 <- df_w6eda_1 |> 
  select(country, iso2c, year, co2pcap, forest, region, income)
df_w6_1

各年毎のデータの数の棒グラフ

df_w6eda_1 |> drop_na(co2pcap, forest) |>
  ggplot(aes(year)) + geom_bar()

国と地域

country には、国と地域両方が入っています。地域の iso2c は以下のものです。

REGION <- c("1A", "1W", "4E", "6F", "6N", "6X", "7E", "8S", "A4", "A5", 
"A9", "B1", "B2", "B3", "B4", "B6", "B7", "B8", "C4", "C5", "C6", 
"C7", "C8", "C9", "D2", "D3", "D4", "D5", "D6", "D7", "EU", "F1", 
"F6", "M1", "M2", "N6", "OE", "R6", "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", "ZB", "ZF", "ZG", "ZH", "ZI", 
"ZJ", "ZQ", "ZT")

地域のリストを表示

df_w6eda_1 |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

国名とその地域・所得レベルを表示

df_w6eda_1 |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c, region, income)

分析する国のリスト

BRICS <- c("Brazil", "Russian Federation", "India", "China", "South Africa")

経年変化

a. 日本

df_w6_1 |> drop_na(co2pcap) |> filter(country == "Japan") |>
  ggplot(aes(year, co2pcap)) + geom_line() + 
  labs(title = "日本の一人当たりの二酸化炭素排出量")

気づいたこと・疑問

df_w6_1 |> drop_na(forest) |> filter(country == "Japan") |>
  ggplot(aes(year, forest)) + geom_line() + 
  labs(title = "日本の森林面積(%)")

気づいたこと・疑問

b. 選択した国・地域

df_w6_1 |> drop_na(co2pcap) |> filter(country %in% BRICS) |>
  ggplot(aes(year, co2pcap, col = country)) + geom_line() + 
  labs(title = "BRICS の一人当たりの二酸化炭素排出量")

気づいたこと・疑問

df_w6_1 |> drop_na(forest) |> filter(country %in% BRICS) |>
  ggplot(aes(year, forest, col = country)) + geom_line() + 
  labs(title = "BRICSの森林面積(%)")

気づいたこと・疑問

二つのデータの散布図

必要に応じて log10 スケール

a. すべての値の散布図

df_w6_1 |> ggplot(aes(forest, co2pcap, col = region)) + geom_point()

b. NA ではない値の散布図、近似(回帰)直線を表示

df_w6_1 |> drop_na(co2pcap, forest) |> 
  ggplot(aes(forest, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

c. 地域を除き国のみの散布図、近似(回帰)直線を表示

df_w6_1 |> filter(!(iso2c %in% REGION)) |> drop_na(co2pcap, forest) |> 
  ggplot(aes(forest, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

d. 最近の年を選択し、地域を除き国のもの散布図、近似(回帰)直線を表示

df_w6_1 |> filter(!(iso2c %in% REGION)) |> filter(year == 2020) |> drop_na(co2pcap, forest) |> 
  ggplot(aes(forest, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

df_w6_1 |> filter(!(iso2c %in% REGION)) |> filter(year == 2020) |> drop_na(co2pcap, forest) |> 
  select(co2pcap, forest) |> cor() 

気づいたこと・疑問

LS0tCnRpdGxlOiAi56ysNumAsSDmjqLntKLnmoTjg4fjg7zjgr/liIbmnpAgLSBFREEsIFBhcnQgSSIKYXV0aG9yOiAiSUQsIExhc3QsIEZpcnN0IgpkYXRlOiAiMjAyNOW5tDHmnIgzMOaXpSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgojIyDmvJTnv5IKCuS7peS4i+OBruaMh+aomeOBruS4reOBi+OCieOAgeS6jOOBpOOCkumBuOaKnuOBl+OBpuOAgeODh+ODvOOCv+OBruamguimge+8iGRlc2NyaXB0aW9u77yJ44KS6KiY6Yyy44GX44CB44OH44O844K/44KSIFdESSDjgaflj5blvpfjgZfjgIHku6XkuIvjga7liIbmnpDjgpLjgZnjgovjgIIKCjEuICDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKMi4gIOWbveOBvuOBn+OBr+WcsOWfn+OCkumBuOaKngozLiAg44Gd44KM44Ge44KM44Gu57WM5bm05aSJ5YyW44KS6KGo44GZ5oqY44KM57ea44Kw44Op44OVCiAgICBhLiAg5pel5pysCiAgICBiLiAg6YG45oqe44GX44Gf5Zu944G+44Gf44Gv5Zyw5Z+fCjQuICDkuozjgaTjga7jg4fjg7zjgr/jga7mlaPluIPlm7Mt5b+F6KaB44Gr5b+c44GY44GmIGxvZzEwIOOCueOCseODvOODq+OCkueUqOOBhOOCiwogICAgYS4gIOOBmeOBueOBpuOBruWApOOBruaVo+W4g+WbswogICAgYi4gIE5BIOOBp+OBr+OBquOBhOWApOOBruaVo+W4g+Wbs+OAgei/keS8vO+8iOWbnuW4sO+8ieebtOe3muOCkuihqOekugogICAgYy4gIOWcsOWfn+OCkumZpOOBjeWbveOBruOBv+OBruaVo+W4g+Wbs+OAgei/keS8vO+8iOWbnuW4sO+8ieebtOe3muOCkuihqOekugogICAgZC4gIOacgOi/keOBruW5tOOCkumBuOaKnuOBl+OAgeWcsOWfn+OCkumZpOOBjeWbveOBruOCguOBruaVo+W4g+Wbs+OAgei/keS8vO+8iOWbnuW4sO+8ieebtOe3muOCkuihqOekugoK44Gd44KM44Ge44KM44Gr44Gk44GE44Gm6ICD5a+f77yI5rCX44Gl44GE44Gf44GT44Go44CB55aR5ZWP44Gq44Gp77yJ44KS6KiY44GZCgo8IS0tICoqMjAyMy4yLjMuMjM6NTkqKiDjgb7jgafjgasgTW9vZGxlIOOBrua8lOe/kuOBruiqsumhjOODnOODg+OCr+OCueOBq+aPkOWHuuOBl+OBn+OCguOBruOBq+OBpOOBhOOBpuOBr+OAgeOBquOCi+OBueOBj+OAgeaXqeOBj+imi+OBpuOAgeODleOCo+ODvOODieODkOODg+OCr+OCkuabuOOBjeOBvuOBmeOAguOBneOCjOS7pemZjeOBq+aPkOWHuuOBleOCjOOBn+OCguOBruOCguimi+OBvuOBmeOBjOOAgeODleOCo+ODvOODieODkOODg+OCr+OBr+mBheOBj+OBquOCi+OBqOaAneOBo+OBpuOBj+OBoOOBleOBhOOAgiAtLT4KCgoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIENPMiBlbWlzc2lvbnMgKG1ldHJpYyB0b25zIHBlciBjYXBpdGEpIO+8mkVOLkFUTS5DTzJFLlBDIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDKV0gKGNvMnBjYXApCgotICAgRm9yZXN0IGFyZWEgKCUgb2YgbGFuZCBhcmVhKe+8mkFHLkxORC5GUlNULlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0FHLkxORC5GUlNULlpTKV0gKGZvcmVzdCkKCi0gICBSZW5ld2FibGUgZWxlY3RyaWNpdHkgb3V0cHV0ICglIG9mIHRvdGFsIGVsZWN0cmljaXR5IG91dHB1dCnvvJpFRy5FTEMuUk5FVy5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FRy5FTEMuUk5FVy5aUyldIChyZW5ld2FibGUpCgotICAgRWxlY3RyaWNpdHkgcHJvZHVjdGlvbiBmcm9tIG9pbCwgZ2FzIGFuZCBjb2FsIHNvdXJjZXMgKCUgb2YgdG90YWwp77yaRUcuRUxDLkZPU0wuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRUcuRUxDLkZPU0wuWlMpXSAoZm9zc2lsKQoKLSAgIEVsZWN0cmljaXR5IHByb2R1Y3Rpb24gZnJvbSBudWNsZWFyIHNvdXJjZXMgKCUgb2YgdG90YWwp77yaRUcuRUxDLk5VQ0wuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRUcuRUxDLk5VQ0wuWlMpXSAgKG51Y2xlYXIpCgoKIyMjIOeiuuiqjeS9nOalrQoKLSAgIFByZXZpZXcg44Gn56K66KqN44CCCgotICAgV2ViIEJyb3dzZXIg44Gn44CBdzVfYzEyMzQ1Ni5uYi5odG1sIOOBquOBqeOAgVIgTm90ZWJvb2sg44KS6KaL44Gm56K66KqN44CCCgotICAg44KC44GX44CB5ZWP6aGM44GM44GC44KM44Gw44CBUnVuIOODnOOCv+ODs+OBruWPs+OBruS4ieinkuOBi+OCieOAgVJ1biBBbGwg44KS6YG45oqe44GX44CB44Ko44Op44O844GM44Gn44Gq44GE44GL56K66KqN44CCCgotICAg5pyA5Yid44Gr44KC44Gp44KL44CCCgoKCiMjIyDpgJTkuK3jgafjga7jgqjjg6njg7wKCi0gICDlhaXlipvjgZfjgZ/jgajjgY3jgavjga/jgIHkvovjgpLlj4LnhafjgZfjgabjgIHjgrnjg5rjg6vjgarjganjgpLnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgILlhajop5LjgavjgarjgaPjgabjgYTjgovjgajllY/poYzjgYzjgYrjgY3jgb7jgZnjgIIoKSDjgYzjg5rjgqLjgafjg57jg4Pjg4HjgZfjgabjgYTjgovjgYvjgIHnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgIIKLSAgIOW8leeUqOespuOBjOWFpeOBo+OBpuOBhOOBquOBi+OBo+OBn+OCiuOAgT09IOOBruOBqOOBk+OCjeOBjOOAgT0g44Gg44Gj44Gf44KK44CB44GE44KN44GE44KN44Gq5Y+v6IO95oCn44GM44GC44KK44G+44GZ44CCRXJyb3IgbWVzc2FnZSDjgpLoqq3jgoDjgZPjgajjgoLjgZ/jgYTjgZvjgaTjgafjgZnjgILjgqjjg6njg7zjgYzjgafjgZ/jgIFDb2RlIENodW5rIOOBqOOAgUVycm9yIG1lc3NhZ2Ug44KS44CBQ2hhdEdQVCDjgoTjgIFHb29nbGUgQmFyZCwgR29vZ2xlIFNlYXJjaCDjgavlhaXjgozjgovjgajjgIHop6Pmsbrmlrnms5XjgpLmlZnjgYjjgabjgY/jgozjgovjgZPjgajjgoLjgYLjgorjgb7jgZnjgIIKLSAgIEZpbGUgbm90IGZvdW5kIOOBruOAgeOCqOODqeODvOOBjOOBp+OBn+OBqOOBjeOBq+OBr+OAgeS4iuOBi+OCiemghuOBq+OAgVJ1biDvvIhDb2RlIENodW5rIOOBruWPs+S4iuOBruS4ieinkuWNsOOCkuaKvOOBl+OBpuWun+ihjO+8ieOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAguOBvuOBn+OBr+OAgeOCqOODqeODvOOBjOWHuuOBn+OBqOOBk+OCjeOBq+OAgeOCq+ODvOOCveODq+OCkue9ruOBjeOAgeS4iuOBruOAgVJ1biDjg5zjgr/jg7Pjga7lj7Pjga7kuInop5LjgYvjgonjgIFSdW4gQWxsIENodW5rcyBBYm92ZSDjgpLpgbjmip7jgZnjgovjgajjgIHjgZ3jgZPjgb7jgafjga7jgZnjgbnjgabjga7jgIBDb2RlIENodW5rIOOCkuWun+ihjOOBl+OBpuOBj+OCjOOBvuOBmeOAggotICAg5LiK44Gu5pa55rOV44Gn44GG44G+44GP44GE44GL44Gq44GE44Go44GN44Gv44CBZGF0YSDjg5Xjgqnjg6vjg4DjgavjgIHjg4fjg7zjgr/vvIhcKlwqXCouY3N277yJ44GM5YWl44Gj44Gm44GE44KL44GL44KS56K66KqN44CB44Gq44GR44KM44Gw44CBZGF0YSDjg5Xjgqnjg6vjg4DjgYzjgYLjgovjgZPjgajjgpLnorroqo3jgZfjgabjgIHmnIDliJ3jga7jg4fjg7zjgr/oqq3jgb/ovrzjgb/jga7jgajjgZPjgo3jgpLlrp/ooYzjgZfjgabjgb/jgabjgY/jgaDjgZXjgYTjgIIKLSAgIOWun+ihjOOBp+OBjeOBpuOBhOOBpuOCguOAgee1kOaenOOBjOimi+OBiOOBquOBhOOBk+OBqOOCguOBguOCiuOBvuOBmeOAguOBneOBruOBqOOBjeOBr+OAgUNvZGUgQ2h1bmsg44Gu5LiL44Gr44GC44KL44CB5bGx5LqM44Gk44Gu6KiY5Y+344KS5oq844GX44Gm44G/44Gm44GP44Gg44GV44GE44CC44GT44KM44Gv44CB57WQ5p6c44KS6KGo56S644CB6Z2e6KGo56S644Gr44GX44G+44GZ44CC44Gd44KM44GM5Y6f5Zug44Gn6Zqg44KM44Gm44GE44KL5aC05ZCI44GM44GC44KK44G+44GZ44CCCgoKIyDkvovvvJrkuozphbjljJbngq3ntKDmjpLlh7rph4/jgajmo67mnpfpnaLnqY0KCiMjIOODh+ODvOOCvwoKIyMjIOODh+ODvOOCv+aDheWgsQoKLSAgIOODh+ODvOOCv++8ke+8muS4gOS6uuW9k+OBn+OCiuOBruS6jOmFuOWMlueCree0oOaOkuWHuumHjyAoQ08yIGVtaXNzaW9ucyAobWV0cmljIHRvbnMgcGVyIGNhcGl0YSkp44CBIkVOLkFUTS5DTzJFLlBDIuOAgWNvMnBjYXAgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uQVRNLkNPMkUuUEMpXQoKLSAgIOamguimge+8mkNhcmJvbiBkaW94aWRlIGVtaXNzaW9ucyBhcmUgdGhvc2Ugc3RlbW1pbmcgZnJvbSB0aGUgYnVybmluZyBvZiBmb3NzaWwgZnVlbHMgYW5kIHRoZSBtYW51ZmFjdHVyZSBvZiBjZW1lbnQuIFRoZXkgaW5jbHVkZSBjYXJib24gZGlveGlkZSBwcm9kdWNlZCBkdXJpbmcgY29uc3VtcHRpb24gb2Ygc29saWQsIGxpcXVpZCwgYW5kIGdhcyBmdWVscyBhbmQgZ2FzIGZsYXJpbmcuCgotICAg44OH44O844K/77yS77ya5qOu5p6X6Z2i56mN77yI77yF77yJKEZvcmVzdCBhcmVhICglIG9mIGxhbmQgYXJlYSkp44CBIkFHLkxORC5GUlNULlpTIuOAgWZvcmVzdCBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9BRy5MTkQuRlJTVC5aUyldCgotICAg5qaC6KaB77yaRm9yZXN0IGFyZWEgaXMgbGFuZCB1bmRlciBuYXR1cmFsIG9yIHBsYW50ZWQgc3RhbmRzIG9mIHRyZWVzIG9mIGF0IGxlYXN0IDUgbWV0ZXJzIGluIHNpdHUsIHdoZXRoZXIgcHJvZHVjdGl2ZSBvciBub3QsIGFuZCBleGNsdWRlcyB0cmVlIHN0YW5kcyBpbiBhZ3JpY3VsdHVyYWwgcHJvZHVjdGlvbiBzeXN0ZW1zIChmb3IgZXhhbXBsZSwgaW4gZnJ1aXQgcGxhbnRhdGlvbnMgYW5kIGFncm9mb3Jlc3RyeSBzeXN0ZW1zKSBhbmQgdHJlZXMgaW4gdXJiYW4gcGFya3MgYW5kIGdhcmRlbnMuCgoKCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCuODh+ODvOOCv+OBruODgOOCpuODs+ODreODvOODieOBqOS/neWtmO+8muOCs+ODvOODieOBqOWkieaVsOWQjeOCkuaMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl93NmVkYSA8LSBXREkoaW5kaWNhdG9yID0gYyhjbzJwY2FwID0gIkVOLkFUTS5DTzJFLlBDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZXN0ID0gIkFHLkxORC5GUlNULlpTIiksCiAgICAgICAgICAgICAgICBleHRyYSA9IFRSVUUpCmBgYAoKKu+8kuWbnuebruOBi+OCieOBr+OAgWRhdGEg44GL44KJ6Kqt44G/6L6844KB44KL44KI44GG44Gr44GX44Gm44GK44GPIOODleOCoeOCpOODqyAoUm1kKSDjga7kv53lrZjloLTmiYDjgasgZGF0YSDjg5Xjgqnjg6vjg4DjgYzjgYLjgovjgZPjgajjgpLnorroqo0qCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl93NmVkYSwgImRhdGEvdzZlZGEuY3N2IikKYGBgCgpgYGB7cn0KZGZfdzZlZGEgPC0gcmVhZF9jc3YoImRhdGEvdzZlZGEuY3N2IikKYGBgCgoKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl93NmVkYQpgYGAKCmBgYHtyfQpzdHIoZGZfdzZlZGEpCmBgYAoKCgojIyMjIOWkieaVsOOBrumBuOaKnu+8iHNlbGVjdGluZ++8iQoKYGBge3J9CmRmX3c2IDwtIGRmX3c2ZWRhIHw+IAogIHNlbGVjdChjb3VudHJ5LCBpc28yYywgeWVhciwgY28ycGNhcCwgZm9yZXN0LCByZWdpb24sIGluY29tZSkKZGZfdzYKYGBgCgoKCiMjIyDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl93NmVkYSB8PiBkcm9wX25hKGNvMnBjYXAsIGZvcmVzdCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgoKCiMjIyDlm73jgajlnLDln58KCmNvdW50cnkg44Gr44Gv44CB5Zu944Go5Zyw5Z+f5Lih5pa544GM5YWl44Gj44Gm44GE44G+44GZ44CC5Zyw5Z+f44GuIGlzbzJjIOOBr+S7peS4i+OBruOCguOBruOBp+OBmeOAggoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI2RiIsICI2TiIsICI2WCIsICI3RSIsICI4UyIsICJBNCIsICJBNSIsIAoiQTkiLCAiQjEiLCAiQjIiLCAiQjMiLCAiQjQiLCAiQjYiLCAiQjciLCAiQjgiLCAiQzQiLCAiQzUiLCAiQzYiLCAKIkM3IiwgIkM4IiwgIkM5IiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IiwgIkVVIiwgIkYxIiwgCiJGNiIsICJNMSIsICJNMiIsICJONiIsICJPRSIsICJSNiIsICJTMSIsICJTMiIsICJTMyIsICJTNCIsICJUMiIsIAoiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAiVjMiLCAiVjQiLCAiWEMiLCAiWEQiLCAKIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgCiJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaQiIsICJaRiIsICJaRyIsICJaSCIsICJaSSIsIAoiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCgoKIyMjIyDlnLDln5/jga7jg6rjgrnjg4jjgpLooajnpLoKCmBgYHtyfQpkZl93NmVkYSB8PiBmaWx0ZXIoaXNvMmMgJWluJSBSRUdJT04pIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjKQpgYGAKCgoKIyMjIyDlm73lkI3jgajjgZ3jga7lnLDln5/jg7vmiYDlvpfjg6zjg5njg6vjgpLooajnpLoKCmBgYHtyfQpkZl93NmVkYSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjLCByZWdpb24sIGluY29tZSkKYGBgCgoKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCkJSSUNTIOOCkumBuOaKnuOBl+OBvuOBmeOAggoKYGBge3J9CkJSSUNTIDwtIGMoIkJyYXppbCIsICJSdXNzaWFuIEZlZGVyYXRpb24iLCAiSW5kaWEiLCAiQ2hpbmEiLCAiU291dGggQWZyaWNhIikKYGBgCgoKCiMjIyDntYzlubTlpInljJYKCiMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl93NiB8PiBkcm9wX25hKGNvMnBjYXApIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBjbzJwY2FwKSkgKyBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAi5pel5pys44Gu5LiA5Lq65b2T44Gf44KK44Gu5LqM6YW45YyW54Kt57Sg5o6S5Ye66YePIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgOeODiOODs+WJjeW+jOOBp+aOqOenu+OBl+OBpuOBhOOCi+OAggotICAgMjAyMOW5tOOBq+iQveOBoeOBpuOBhOOCi+OBruOBr+OAgeOCs+ODreODiuOBruOBm+OBhOOBi+OCguOBl+OCjOOBquOBhOOBruOBp+OAgeOBk+OBruOBguOBqOOBruWkieWMluOBjOmHjeimgeOAggoKYGBge3J9CmRmX3c2IHw+IGRyb3BfbmEoZm9yZXN0KSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PgogIGdncGxvdChhZXMoeWVhciwgZm9yZXN0KSkgKyBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAi5pel5pys44Gu5qOu5p6X6Z2i56mN77yI77yF77yJIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAgMC4yNSUg56iL5bqm44Gu5bmF44Gn5o6o56e744GX44Gm44GE44KL44CCCi0gICDml6XmnKzjga7lm73lnJ/jgYzjgIEzODAsMDAwIOW5s+aWueOCreODreOBqOOBmeOCi+OBqOOAgTAuMjUlIOOBr+OAgTk1MCDlubPmlrnjgq3jg63jgarjga7jgafjgIHjgaDjgYTjgZ/jgYTjgIEzMGttIHggMzBrbSDjga7mo67mnpfjgYzlopfmuJvjgZfjgabjgYTjgovjgajjgYTjgYbjgZPjgajjgYvjgILjgoTjga/jgorjgIHljp/lm6DjgpLnn6XjgorjgZ/jgYTjgIIKCiMjIyBiLiDpgbjmip7jgZfjgZ/lm73jg7vlnLDln58KCmBgYHtyfQpkZl93NiB8PiBkcm9wX25hKGNvMnBjYXApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQlJJQ1MpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBjbzJwY2FwLCBsaW5ldHlwZSA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9ICJCUklDUyDjga7kuIDkurrlvZPjgZ/jgorjga7kuozphbjljJbngq3ntKDmjpLlh7rph48iKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICDkuK3lm73jgYzmgKXmv4DjgavlopfliqDjgZfjgabjgYTjgovjgIIxOTkw5bm044Gu5LiJ5YCN56iL5bqm44CCCi0gICDjg63jgrfjgqLjga/jgIExOTkz5bm044Gu44K96YCj5bSp5aOK5Lul5b6M44CB44GX44Gw44KJ44GP5rib5bCR44CCCgpgYGB7cn0KZGZfdzYgfD4gZHJvcF9uYShmb3Jlc3QpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQlJJQ1MpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmb3Jlc3QsIGxpbmV0eXBlID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIkJSSUNT44Gu5qOu5p6X6Z2i56mN77yI77yF77yJIikKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgotICAg5Lit5Zu944Go44Kk44Oz44OJ44Gv44CB5qOu5p6X6Z2i56mN44KC5aKX5Yqg44GX44Gm44GE44KL44CCCi0gICDjg5bjg6njgrjjg6vjga4xOTkw5bm044GL44KJMjAxMOW5tOOBrumWk+OBruOAgeajruael+mdouepjeOBrua4m+WwkeOBrzEwJeeoi+W6puOBguOCi+OCiOOBhuOBoOOAggoKIyMjIOS6jOOBpOOBruODh+ODvOOCv+OBruaVo+W4g+WbswoK5b+F6KaB44Gr5b+c44GY44GmIGxvZzEwIOOCueOCseODvOODqyAoYCsgc2NhbGVfeV9sb2cxMGApCgojIyMjIGEuIOOBmeOBueOBpuOBruWApOOBruaVo+W4g+WbswoKYGBge3J9CmRmX3c2IHw+IGdncGxvdChhZXMoZm9yZXN0LCBjbzJwY2FwLCBjb2wgPSByZWdpb24pKSArIGdlb21fcG9pbnQoKQpgYGAKCiMjIyMgYi4gTkEg44Gn44Gv44Gq44GE5YCk44Gu5pWj5biD5Zuz44CB6L+R5Ly877yI5Zue5biw77yJ55u057ea44KS6KGo56S6CgpgYGB7cn0KZGZfdzYgfD4gZHJvcF9uYShjbzJwY2FwLCBmb3Jlc3QpIHw+IAogIGdncGxvdChhZXMoZm9yZXN0LCBjbzJwY2FwKSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSByZWdpb24pKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCgoKIyMjIyBjLiDlnLDln5/jgpLpmaTjgY3lm73jga7jgb/jga7mlaPluIPlm7PjgIHov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLoKCmBgYHtyfQpkZl93NiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRyb3BfbmEoY28ycGNhcCwgZm9yZXN0KSB8PiAKICBnZ3Bsb3QoYWVzKGZvcmVzdCwgY28ycGNhcCkpICsgZ2VvbV9wb2ludChhZXMoY29sID0gcmVnaW9uKSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkKYGBgCgoKCiMjIyMgZC4g5pyA6L+R44Gu5bm044KS6YG45oqe44GX44CB5Zyw5Z+f44KS6Zmk44GN5Zu944Gu44KC44Gu5pWj5biD5Zuz44CB6L+R5Ly877yI5Zue5biw77yJ55u057ea44KS6KGo56S6CgpgYGB7cn0KZGZfdzYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGNvMnBjYXAsIGZvcmVzdCkgfD4gCiAgZ2dwbG90KGFlcyhmb3Jlc3QsIGNvMnBjYXApKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IHJlZ2lvbikpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOajruael+mdouepjeOBjDEw77yFIOOCiOOCiuOCguWwkeOBquOBhOWbveOBjOWkmuOBhAotICAg5byx44GE6LKg44Gu55u46Zai44GM44GC44KL44KI44GG44GgCi0gICDmjojmpa3jgafmsYLjgoHjgZ/nm7jplqLkv4LmlbDjga/jgIEtMC4xODMyMzc044CC44GT44KM44Gv44CB5Zub44Gk44Gu5oyH5qiZ44GZ44G544Gm44Gu5YCk44GM44GC44KK77yITkEg44Gn44Gv44Gq44GP77yJ5Zu95Zyw5Z+f44KC5YiG44GR44Ga44CB44GZ44G544Gm44Gu5bm044Gu44OH44O844K/44Gn44Gu55u46Zai44KS44Go44Gj44Gf44KC44Gu44CC5YK+5ZCR44Gv44GC44KL56iL5bqm44KP44GL44KL44CCCgpgYGB7cn0KZGZfdzYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGNvMnBjYXAsIGZvcmVzdCkgfD4gCiAgc2VsZWN0KGNvMnBjYXAsIGZvcmVzdCkgfD4gY29yKCkgCmBgYAoKCiMg5a6f57+SCgojIOS+i++8muS6jOmFuOWMlueCree0oOaOkuWHuumHj+OBqFvpgbjmip7jgZfjgZ/mjIfmqJldCgojIyDjg4fjg7zjgr8KCiMjIyDjg4fjg7zjgr/mg4XloLEKCi0gICDjg4fjg7zjgr/vvJHvvJrkuIDkurrlvZPjgZ/jgorjga7kuozphbjljJbngq3ntKDmjpLlh7rph48gKENPMiBlbWlzc2lvbnMgKG1ldHJpYyB0b25zIHBlciBjYXBpdGEpKeOAgSJFTi5BVE0uQ08yRS5QQyLjgIFjbzJwY2FwIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDKV0KCi0gICDmpoLopoHvvJpDYXJib24gZGlveGlkZSBlbWlzc2lvbnMgYXJlIHRob3NlIHN0ZW1taW5nIGZyb20gdGhlIGJ1cm5pbmcgb2YgZm9zc2lsIGZ1ZWxzIGFuZCB0aGUgbWFudWZhY3R1cmUgb2YgY2VtZW50LiBUaGV5IGluY2x1ZGUgY2FyYm9uIGRpb3hpZGUgcHJvZHVjZWQgZHVyaW5nIGNvbnN1bXB0aW9uIG9mIHNvbGlkLCBsaXF1aWQsIGFuZCBnYXMgZnVlbHMgYW5kIGdhcyBmbGFyaW5nLgoKLSAgIOODh+ODvOOCv++8ku+8muWQjeWJjeOAgeOCs+ODvOODieOAgeWkieaVsOWQjeOAgeODquODs+OCrwoKLSAgIOamguimge+8mgoKCgojIyMg44OH44O844K/44Gu5Y+W5b6XCgojIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgrjg4fjg7zjgr/jga7jg4Djgqbjg7Pjg63jg7zjg4njgajkv53lrZjvvJrjgrPjg7zjg4njgajlpInmlbDlkI3jgpLmjIflrprjgIIKCl/jg4fjg7zjgr/jga7lkI3liY3jga/jgIHlpInjgYjjgZ/jgbvjgYbjgYzjgojjgYTjga7jgafjgIHkvovjgafjgoLjgIFkZl93NmVkYV8xIOOChOOAgWRmX3c2XzEg44Gr5aSJ44GI44Gm44GC44KK44G+44GZ44CCXwoKYGBgCmRmX3c2ZWRhXzEgPC0gV0RJKGluZGljYXRvciA9IGMoY28ycGNhcCA9ICJFTi5BVE0uQ08yRS5QQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVzdCA9ICJBRy5MTkQuRlJTVC5aUyIpLAogICAgICAgICAgICAgICAgZXh0cmEgPSBUUlVFKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0KCgpgYGAKCirvvJLlm57nm67jgYvjgonjga/jgIFkYXRhIOOBi+OCieiqreOBv+i+vOOCgeOCi+OCiOOBhuOBq+OBl+OBpuOBiuOBjyDjg5XjgqHjgqTjg6sgKFJtZCkg44Gu5L+d5a2Y5aC05omA44GrIGRhdGEg44OV44Kp44Or44OA44GM44GC44KL44GT44Go44KS56K66KqNKgoKYGBgCndyaXRlX2NzdihkZl93NmVkYV8xLCAiZGF0YS93NmVkYV8xLmNzdiIpCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQoKYGBgCgpgYGAKZGZfdzZlZGFfMSA8LSByZWFkX2NzdigiZGF0YS93NmVkYV8xLmNzdiIpCmBgYAoKYGBge3J9CgpgYGAKCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYApkZl93NmVkYV8xCmBgYAoKYGBge3J9CmRmX3c2ZWRhXzEKYGBgCgpgYGAKc3RyKGRmX3c2ZWRhXzEpCmBgYAoKYGBge3J9CgpgYGAKCiMjIyMg5aSJ5pWw44Gu6YG45oqe77yIc2VsZWN0aW5n77yJCgpgYGAKZGZfdzZfMSA8LSBkZl93NmVkYV8xIHw+IAogIHNlbGVjdChjb3VudHJ5LCBpc28yYywgeWVhciwgY28ycGNhcCwgZm9yZXN0LCByZWdpb24sIGluY29tZSkKZGZfdzZfMQpgYGAKCmBgYHtyfQoKCmBgYAoKIyMjIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoKYGBgCmRmX3c2ZWRhXzEgfD4gZHJvcF9uYShjbzJwY2FwLCBmb3Jlc3QpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKYGBge3J9CgoKYGBgCgoKIyMjIOWbveOBqOWcsOWfnwoKY291bnRyeSDjgavjga/jgIHlm73jgajlnLDln5/kuKHmlrnjgYzlhaXjgaPjgabjgYTjgb7jgZnjgILlnLDln5/jga4gaXNvMmMg44Gv5Lul5LiL44Gu44KC44Gu44Gn44GZ44CCCgpgYGB7cn0KUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjZGIiwgIjZOIiwgIjZYIiwgIjdFIiwgIjhTIiwgIkE0IiwgIkE1IiwgCiJBOSIsICJCMSIsICJCMiIsICJCMyIsICJCNCIsICJCNiIsICJCNyIsICJCOCIsICJDNCIsICJDNSIsICJDNiIsIAoiQzciLCAiQzgiLCAiQzkiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciLCAiRVUiLCAiRjEiLCAKIkY2IiwgIk0xIiwgIk0yIiwgIk42IiwgIk9FIiwgIlI2IiwgIlMxIiwgIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgCiJUMyIsICJUNCIsICJUNSIsICJUNiIsICJUNyIsICJWMSIsICJWMiIsICJWMyIsICJWNCIsICJYQyIsICJYRCIsIAoiWEUiLCAiWEYiLCAiWEciLCAiWEgiLCAiWEkiLCAiWEoiLCAiWEwiLCAiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAKIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpCIiwgIlpGIiwgIlpHIiwgIlpIIiwgIlpJIiwgCiJaSiIsICJaUSIsICJaVCIpCmBgYAoKCgojIyMjIOWcsOWfn+OBruODquOCueODiOOCkuihqOekugoKYGBgCmRmX3c2ZWRhXzEgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KCmBgYAoKIyMjIyDlm73lkI3jgajjgZ3jga7lnLDln5/jg7vmiYDlvpfjg6zjg5njg6vjgpLooajnpLoKCmBgYApkZl93NmVkYV8xIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMsIHJlZ2lvbiwgaW5jb21lKQpgYGAKCmBgYHtyfQoKYGBgCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgpgYGAKQlJJQ1MgPC0gYygiQnJhemlsIiwgIlJ1c3NpYW4gRmVkZXJhdGlvbiIsICJJbmRpYSIsICJDaGluYSIsICJTb3V0aCBBZnJpY2EiKQpgYGAKCmBgYHtyfQoKYGBgCgojIyMg57WM5bm05aSJ5YyWCgojIyMgYS4g5pel5pysCgpgYGAKZGZfdzZfMSB8PiBkcm9wX25hKGNvMnBjYXApIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBjbzJwY2FwKSkgKyBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAi5pel5pys44Gu5LiA5Lq65b2T44Gf44KK44Gu5LqM6YW45YyW54Kt57Sg5o6S5Ye66YePIikKYGBgCgpgYGB7cn0KCgpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCmBgYApkZl93Nl8xIHw+IGRyb3BfbmEoZm9yZXN0KSB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PgogIGdncGxvdChhZXMoeWVhciwgZm9yZXN0KSkgKyBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAi5pel5pys44Gu5qOu5p6X6Z2i56mN77yI77yF77yJIikKYGBgCgpgYGB7cn0KCgpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCiMjIyBiLiDpgbjmip7jgZfjgZ/lm73jg7vlnLDln58KCmBgYApkZl93Nl8xIHw+IGRyb3BfbmEoY28ycGNhcCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBCUklDUykgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGNvMnBjYXAsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9ICJCUklDUyDjga7kuIDkurrlvZPjgZ/jgorjga7kuozphbjljJbngq3ntKDmjpLlh7rph48iKQpgYGAKCmBgYHtyfQoKCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKYGBgCmRmX3c2XzEgfD4gZHJvcF9uYShmb3Jlc3QpIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQlJJQ1MpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBmb3Jlc3QsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9ICJCUklDU+OBruajruael+mdouepje+8iO+8he+8iSIpCmBgYAoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMg5LqM44Gk44Gu44OH44O844K/44Gu5pWj5biD5ZuzCgrlv4XopoHjgavlv5zjgZjjgaYgbG9nMTAg44K544Kx44O844OrCgojIyMjIGEuIOOBmeOBueOBpuOBruWApOOBruaVo+W4g+WbswoKYGBgCmRmX3c2XzEgfD4gZ2dwbG90KGFlcyhmb3Jlc3QsIGNvMnBjYXAsIGNvbCA9IHJlZ2lvbikpICsgZ2VvbV9wb2ludCgpCmBgYAoKYGBge3J9CgpgYGAKCiMjIyMgYi4gTkEg44Gn44Gv44Gq44GE5YCk44Gu5pWj5biD5Zuz44CB6L+R5Ly877yI5Zue5biw77yJ55u057ea44KS6KGo56S6CgpgYGAKZGZfdzZfMSB8PiBkcm9wX25hKGNvMnBjYXAsIGZvcmVzdCkgfD4gCiAgZ2dwbG90KGFlcyhmb3Jlc3QsIGNvMnBjYXApKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IHJlZ2lvbikpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CgoKYGBgCgojIyMjIGMuIOWcsOWfn+OCkumZpOOBjeWbveOBruOBv+OBruaVo+W4g+Wbs+OAgei/keS8vO+8iOWbnuW4sO+8ieebtOe3muOCkuihqOekugoKYGBgCmRmX3c2XzEgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkcm9wX25hKGNvMnBjYXAsIGZvcmVzdCkgfD4gCiAgZ2dwbG90KGFlcyhmb3Jlc3QsIGNvMnBjYXApKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IHJlZ2lvbikpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CgoKYGBgCgojIyMjIGQuIOacgOi/keOBruW5tOOCkumBuOaKnuOBl+OAgeWcsOWfn+OCkumZpOOBjeWbveOBruOCguOBruaVo+W4g+Wbs+OAgei/keS8vO+8iOWbnuW4sO+8ieebtOe3muOCkuihqOekugoKYGBgCmRmX3c2XzEgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGNvMnBjYXAsIGZvcmVzdCkgfD4gCiAgZ2dwbG90KGFlcyhmb3Jlc3QsIGNvMnBjYXApKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IHJlZ2lvbikpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CgoKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgoKCmBgYApkZl93Nl8xIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShjbzJwY2FwLCBmb3Jlc3QpIHw+IAogIHNlbGVjdChjbzJwY2FwLCBmb3Jlc3QpIHw+IGNvcigpIApgYGAKCgpgYGB7cn0KCgpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioK