朝日新聞は6月27日の朝刊で(デジタル版では26日夜に)、「熱中症、涼しい地域ほど注意 暑さ慣れず、同じ35度でも搬送2倍」との記事を掲載した。東京大の橋爪真弘教授(疫学)に監修してもらいながら、熱中症搬送数と気温との関係を、科学みらい部の市野塊記者と小宮山が分析した。

この文書では、どこからどんなデータを持ってきて、どのように分析したか、Rのコードとともに説明する。

必要なパッケージ読み込み

tidyverseとかlubridateといったあたりは定番選手。modelsummary以下の三つは(たしか)回帰分析のためのパッケージ。

library(tidyverse)
library(readxl)
library(lubridate)
library(modelsummary)
library(leaps)
library(MASS)

熱中症の搬送数データ

総務省消防庁のウェブサイトにあるデータを読み込んで整形する。データは熱中症で運ばれた人の都道府県別、日別の合計人数のほか、搬送者の年齢、症状の重さ、発生場所の内訳の数字がある。なお、発生場所の記録があるのは2017年以降のみ。

hs08 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h20.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h20.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h20.xlsx",sheet=3))

hs09 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h21.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h21.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h21.xlsx",sheet=3))

hs10 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h22.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h22.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h22.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h22.xlsx",sheet=4))

hs11 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h23.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h23.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h23.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h23.xlsx",sheet=4))

hs12 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h24.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h24.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h24.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h24.xlsx",sheet=4))

hs13 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h25.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h25.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h25.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h25.xlsx",sheet=4))

hs14 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h26.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h26.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h26.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h26.xlsx",sheet=4))

hs15 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h27.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h27.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h27.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h27.xlsx",sheet=4),
                  read_xlsx("data/hs/heatstroke003_data_h27.xlsx",sheet=5))

hs16 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h28.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h28.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h28.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h28.xlsx",sheet=4),
                  read_xlsx("data/hs/heatstroke003_data_h28.xlsx",sheet=5))

# この年以降に発生場所の情報が加わる
hs17 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h29.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h29.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h29.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h29.xlsx",sheet=4),
                  read_xlsx("data/hs/heatstroke003_data_h29.xlsx",sheet=5))

hs18 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_h30.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_h30.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_h30.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_h30.xlsx",sheet=4),
                  read_xlsx("data/hs/heatstroke003_data_h30.xlsx",sheet=5))

hs19 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_r1.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_r1.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_r1.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_r1.xlsx",sheet=4),
                  read_xlsx("data/hs/heatstroke003_data_r1.xlsx",sheet=5))

hs20 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_r2.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_r2.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_r2.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_r2.xlsx",sheet=4))

hs21 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_r3.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_r3.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_r3.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_r3.xlsx",sheet=4),
                  read_xlsx("data/hs/heatstroke003_data_r3.xlsx",sheet=5))

hs22 <- bind_rows(read_xlsx("data/hs/heatstroke003_data_r4.xlsx",sheet=1),
                  read_xlsx("data/hs/heatstroke003_data_r4.xlsx",sheet=2),
                  read_xlsx("data/hs/heatstroke003_data_r4.xlsx",sheet=3),
                  read_xlsx("data/hs/heatstroke003_data_r4.xlsx",sheet=4),
                  read_xlsx("data/hs/heatstroke003_data_r4.xlsx",sheet=5))

hs <- bind_rows(hs08,
                hs09,
                hs10,
                hs11,
                hs12,
                hs13,
                hs14,
                hs15,
                hs16,
                hs17,
                hs18,
                hs19,
                hs20,
                hs21,
                hs22)

hs[is.na(hs)] <- 0

hs <- hs %>% 
  rename(date=日付,
         prefID=都道府県コード,
         cases=`搬送人員(計)`,
         age_newborn=`年齢区分:新生児`,
         age_infant=`年齢区分:乳幼児`,
         age_youth=`年齢区分:少年`,
         age_adult=`年齢区分:成人`,
         age_elder=`年齢区分:高齢者`,
         age_unknown=`年齢区分:不明`,
         severity_dead=`傷病程度:死亡`,
         severity_serious=`傷病程度:重症`,
         severity_moderate=`傷病程度:中等症`,
         severity_mild=`傷病程度:軽症`,
         severity_other=`傷病程度:その他`,
         place_house=`発生場所:住居`,
         place_work1=`発生場所:仕事場①`,
         place_work2=`発生場所:仕事場②`,
         place_school=`発生場所:教育機関`,
         place_public_inside=`発生場所:公衆(屋内)`,
         place_public_outside=`発生場所:公衆(屋外)`,
         place_road=`発生場所:道路`,
         place_other=`発生場所:その他`) %>% 
  mutate(date=as.Date(date)) %>% 
  left_join(read_csv("data/pref.csv")) %>% 
  mutate(year=as.double(year(date)),month=as.double(month(date)))
hs

気温データを読み込む

各都道府県庁所在地における5~9月の日ごと最高気温と平均気温のデータを読み込んで整形する。出典は気象庁

climate <- bind_rows(read_csv("data/climate/hokkaido.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="北海道",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/aomori.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="青森県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),                    
                     read_csv("data/climate/iwate.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="岩手県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/miyagi.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="宮城県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/akita.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="秋田県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/yamagata.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="山形県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/fukushima.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="福島県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/ibaraki.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="茨城県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/tochigi.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="栃木県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/gunma.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="群馬県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/saitama.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="埼玉県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/chiba.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="千葉県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/tokyo.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="東京都",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/kanagawa.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="神奈川県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/niigata.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="新潟県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/toyama.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="富山県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/ishikawa.csv", 
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="石川県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/fukui.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="福井県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/yamanashi.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="山梨県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/nagano.csv", 
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="長野県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/gifu.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="岐阜県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/shizuoka.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="静岡県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/aichi.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="愛知県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/mie.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="三重県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),                  
                     read_csv("data/climate/shiga.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="滋賀県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/kyoto.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="京都府",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/osaka.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="大阪府",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/hyogo.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="兵庫県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/nara.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="奈良県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/wakayama.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="和歌山県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/tottori.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="鳥取県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/shimane.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="島根県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/okayama.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="岡山県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/hiroshima.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="広島県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/yamaguchi.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="山口県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/tokushima.csv", 
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="徳島県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/kagawa.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="香川県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/ehime.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="愛媛県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/kochi.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="高知県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/fukuoka.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="福岡県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/saga.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="佐賀県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/nagasaki.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="長崎県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/kumamoto.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="熊本県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/oita.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="大分県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity), 
                     read_csv("data/climate/miyazaki.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="宮崎県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/kagoshima.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="鹿児島県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity),
                     read_csv("data/climate/okinawa.csv",
                              skip=3,
                              locale = locale(encoding = "shift-jis"))[,c(1,2,5,8)] %>%
                       filter(!is.na(年月日)) %>%
                       mutate(pref="沖縄県",
                              date=as.Date(年月日),
                              max_temp=`最高気温(℃)...2`,
                              avg_temp=`平均気温(℃)...5` ,
                              humidity=`平均湿度(%)...8`) %>%
                       dplyr::select(pref,date,max_temp,avg_temp,humidity)) %>% 
  mutate(year=as.double(year(date)),month=as.double(month(date)))
climate

いよいよ分析

夏(5~9月)の平均気温を都道府県別に計算する。今回は2020年以降の3年間にしぼった。

avg_temp_summer <- climate %>%
  filter(as.double(year(date))>=2020) %>%
  group_by(pref) %>%
  summarize(avg_temp_summer=mean(avg_temp)) %>%
  left_join(read_csv("data/pref.csv")) %>%
  arrange(prefID)
avg_temp_summer

最高気温と搬送数の関係をグラフにする

各地の日別最高気温と熱中症搬送数の関係をグラフにする。平均気温が①22度以下の涼しい地域②22~23度のやや涼しい地域③23度超の涼しくはない地域、の3パターンに分けて描く。

1つめのグラフは散布図で、2つめはその近似曲線。

hs %>%
  mutate(year2=ifelse(year<2010,2005,
               ifelse(year<2015,2010,
               ifelse(year<2020,2015,2020)))) %>% # 5年ごとに行われる国勢調査の人口データを突合する「基準年」を決める
  left_join(read_csv("data/population.csv")) %>% # 国勢調査の都道府県別人口データを突合する
  left_join(climate) %>%  # 気温データを突合する
  left_join(avg_temp_summer) %>%  # 夏場の平均気温データを突合する
  mutate(cases_pop=100000*cases/population) %>%  # 人口10万人あたりの搬送数を計算する
  mutate(夏場の平均気温=ifelse(avg_temp_summer>23,"23度超",
                        ifelse(avg_temp_summer>22,"23~22度",
                        ifelse(avg_temp_summer<=22,"22度以下",NA)))) %>%
  ggplot(aes(max_temp,cases_pop,color=夏場の平均気温)) +
  geom_point(alpha=.5) +
  labs(title="人口10万人あたりの搬送件数と日別最高気温の関係",
       x="その日の最高気温(度)",
       y="救急搬送数(人口10万人当たり)")
Rows: 235 Columns: 3── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): pref
dbl (2): year2, population
ℹ 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.Joining, by = c("pref", "year2")Joining, by = c("date", "pref", "year", "month")Joining, by = c("prefID", "pref", "prefEN")

hs %>%
  mutate(year2=ifelse(year<2010,2005,
               ifelse(year<2015,2010,
               ifelse(year<2020,2015,2020)))) %>%
  left_join(read_csv("data/population.csv")) %>%
  left_join(climate) %>%
  left_join(avg_temp_summer) %>%
  mutate(cases_pop=100000*cases/population) %>%
  mutate(夏場の平均気温=ifelse(avg_temp_summer>23,"23度超",
                        ifelse(avg_temp_summer>22,"23~22度",
                        ifelse(avg_temp_summer<=22,"22度以下",NA)))) %>%
  ggplot(aes(max_temp,cases_pop,color=夏場の平均気温)) +
  geom_smooth(method="gam",se=FALSE) +
  labs(title="人口10万人あたりの搬送件数と日別最高気温の関係",
       subtitle="一般化加法モデルによる近似曲線",
       x="その日の最高気温(度)",
       y="救急搬送数(人口10万人当たり)")
Rows: 235 Columns: 3── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): pref
dbl (2): year2, population
ℹ 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.Joining, by = c("pref", "year2")Joining, by = c("date", "pref", "year", "month")Joining, by = c("prefID", "pref", "prefEN")

以下は予備的にやった分析

涼しい地域ほど搬送数が増えやすいというのは、私たちが始めから知っていたことではなく、以下のような分析をしたら分かったこと。

搬送数の増減にどんな要素が効いているのかを知るため、もっとも当てはまりの良い重回帰分析のモデルをステップワイズ法で探した。説明変数の候補として、都道府県別の気温や平均収入、ジニ係数、エアコン保有台数などを用意した。目的変数としては、搬送数の合計だけではなく、搬送者の年齢や発生場所などに分けた件数も検討した。

regs <- list()
indices <- c(3:8, 10:22)

for (i in indices) {
x <- colnames(hs)[i]
modelname <- paste0("model_",x)

hs_analysis <- hs %>%
  rename(x=x) %>% 
  mutate(year=year(date)) %>%
  filter(year %in% c("2018","2019","2020","2021","2022")) %>%
  group_by(date,pref) %>%
  summarize(x=sum(x)) %>%
  left_join(read_csv("data/population2020.csv")) %>%
  mutate(x_pop=x*100000/population2020) %>%
  mutate(rate_elder=over65/population2020) %>%
  left_join(read_csv("data/variables3.csv")) %>% 
  left_join(climate %>% dplyr::select(pref,date,max_temp,humidity)) %>% 
  ungroup() %>% 
  dplyr::select(-date,-pref) %>% 
  scale() %>% 
  as_tibble()

hs_analysis <- hs_analysis[,6:23] %>% 
  na.omit()

full_model <- lm(x_pop ~., data = hs_analysis)

step_model <- full_model %>%
  stepAIC(direction = "both", trace = TRUE)

model <- modelsummary(step_model,stars=TRUE,title=paste(x))

assign(modelname,model)
}

全搬送件数を説明する最良のモデルは以下の通りで、結局、日ごとの最高気温の影響が圧倒的に大きい(これは当たり前)。つぎに影響が大きいのは夏場の平均気温で、暑い地域ほど搬送数が少なくなることがわかった。目的変数を別のものにしたモデルでもこれは同様で、かなりロバストなものと考えられた。「涼しい地域の人ほど暑さに慣れておらず、熱中症になりやすい」という専門家の知見とも矛盾しないとわかったため、このデータを記事の中核に据えることを決めた。

このほか、生活保護を受けている人の多い地域ほど搬送数が増える、などの傾向も見えたが、効果量はあまり大きいとは言えず、記事に盛り込むのは見送った。

model_cases
cases
(1)
(Intercept) 0.003
(0.004)
rate_elder 0.067***
(0.015)
平均気温_夏 -0.109***
(0.010)
年間収入 0.022
(0.015)
実収入 -0.016*
(0.007)
光熱水道費割合 -0.039***
(0.006)
ルームエアコン所有数量 0.037***
(0.009)
ジニ係数 -0.011
(0.007)
生活保護被保護実人員 0.060***
(0.013)
一般病院の1日平均在院患者数 -0.037***
(0.008)
緑地割合 0.021*
(0.010)
都市公園数 -0.099***
(0.012)
第1次産業就業者比率 0.027**
(0.010)
第2次産業就業者比率 -0.059***
(0.009)
65歳以上世帯員の単独世帯の割合 -0.039**
(0.013)
max_temp 0.681***
(0.004)
humidity -0.018***
(0.004)
Num.Obs. 33214
R2 0.441
R2 Adj. 0.441
AIC 75065.1
BIC 75216.5
Log.Lik. -37514.538
RMSE 0.75
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
NA

すでに書いたように、搬送数のデータには搬送者の年齢のほか、症状の重さと発生場所の内訳の数字もあるが、これらは今回の記事にはまったく盛り込まなかった。まだ味わえる余地のあるデータかも。

おしまい。

LS0tDQp0aXRsZTogIuacneaXpeaWsOiBnuOBrueGseS4reeXh+WIhuaekOOBq+OBpOOBhOOBpiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KZGF0ZTogMjAyMy82LzI3DQphdXRob3I6IOacneaXpeaWsOiBnuODh+OCuOOCv+ODq+S8geeUu+WgsemBk+mDqOOAgOWwj+WuruWxseS6ruejqCBAcnlvbWFrb20NCi0tLQ0KDQrmnJ3ml6XmlrDogZ7jga825pyIMjfml6Xjga7mnJ3liIrjgafvvIjjg4fjgrjjgr/jg6vniYjjgafjga8yNuaXpeWknOOBq++8ieOAgeOAjOeGseS4reeXh+OAgea2vOOBl+OBhOWcsOWfn+OBu+OBqeazqOaEj+OAgOaakeOBleaFo+OCjOOBmuOAgeWQjOOBmDM15bqm44Gn44KC5pCs6YCBMuWAjeOAjeOBqOOBrlvoqJjkuovjgpLmjrLovInjgZfjgZ9dKGh0dHBzOi8vZGlnaXRhbC5hc2FoaS5jb20vYXJ0aWNsZXMvQVNSNlY1VFJKUjZGVUxCSDAwRC5odG1sKeOAguadseS6rOWkp+OBruapi+eIquecn+W8mOaVmeaOiO+8iOeWq+Wtpu+8ieOBq+ebo+S/ruOBl+OBpuOCguOCieOBhOOBquOBjOOCieOAgeeGseS4reeXh+aQrOmAgeaVsOOBqOawl+a4qeOBqOOBrumWouS/guOCkuOAgeenkeWtpuOBv+OCieOBhOmDqOOBruW4gumHjuWhiuiomOiAheOBqOWwj+WuruWxseOBjOWIhuaekOOBl+OBn+OAgg0KDQrjgZPjga7mlofmm7jjgafjga/jgIHjganjgZPjgYvjgonjganjgpPjgarjg4fjg7zjgr/jgpLmjIHjgaPjgabjgY3jgabjgIHjganjga7jgojjgYbjgavliIbmnpDjgZfjgZ/jgYvjgIFS44Gu44Kz44O844OJ44Go44Go44KC44Gr6Kqs5piO44GZ44KL44CCDQoNCiMjIOW/heimgeOBquODkeODg+OCseODvOOCuOiqreOBv+i+vOOBvw0KDQp0aWR5dmVyc2XjgajjgYtsdWJyaWRhdGXjgajjgYTjgaPjgZ/jgYLjgZ/jgorjga/lrprnlarpgbjmiYvjgIJtb2RlbHN1bW1hcnnku6XkuIvjga7kuInjgaTjga/vvIjjgZ/jgZfjgYvvvInlm57luLDliIbmnpDjga7jgZ/jgoHjga7jg5Hjg4PjgrHjg7zjgrjjgIINCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KG1vZGVsc3VtbWFyeSkNCmxpYnJhcnkobGVhcHMpDQpsaWJyYXJ5KE1BU1MpDQpgYGANCg0KIyMg54ax5Lit55eH44Gu5pCs6YCB5pWw44OH44O844K/DQoNCue3j+WLmeecgea2iOmYsuW6geOBrlvjgqbjgqfjg5bjgrXjgqTjg4hdKGh0dHBzOi8vd3d3LmZkbWEuZ28uanAvZGlzYXN0ZXIvaGVhdHN0cm9rZS9wb3N0NC5odG1sKeOBq+OBguOCi+ODh+ODvOOCv+OCkuiqreOBv+i+vOOCk+OBp+aVtOW9ouOBmeOCi+OAguODh+ODvOOCv+OBr+eGseS4reeXh+OBp+mBi+OBsOOCjOOBn+S6uuOBrumDvemBk+W6nOecjOWIpeOAgeaXpeWIpeOBruWQiOioiOS6uuaVsOOBruOBu+OBi+OAgeaQrOmAgeiAheOBruW5tOm9ouOAgeeXh+eKtuOBrumHjeOBleOAgeeZuueUn+WgtOaJgOOBruWGheios+OBruaVsOWtl+OBjOOBguOCi+OAguOBquOBiuOAgeeZuueUn+WgtOaJgOOBruiomOmMsuOBjOOBguOCi+OBruOBrzIwMTflubTku6XpmY3jga7jgb/jgIINCg0KYGBge3IgZXZhbD1GQUxTRX0NCmhzMDggPC0gYmluZF9yb3dzKHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDIwLnhsc3giLHNoZWV0PTEpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjAueGxzeCIsc2hlZXQ9MiksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyMC54bHN4IixzaGVldD0zKSkNCg0KaHMwOSA8LSBiaW5kX3Jvd3MocmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjEueGxzeCIsc2hlZXQ9MSksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyMS54bHN4IixzaGVldD0yKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDIxLnhsc3giLHNoZWV0PTMpKQ0KDQpoczEwIDwtIGJpbmRfcm93cyhyZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyMi54bHN4IixzaGVldD0xKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDIyLnhsc3giLHNoZWV0PTIpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjIueGxzeCIsc2hlZXQ9MyksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyMi54bHN4IixzaGVldD00KSkNCg0KaHMxMSA8LSBiaW5kX3Jvd3MocmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjMueGxzeCIsc2hlZXQ9MSksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyMy54bHN4IixzaGVldD0yKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDIzLnhsc3giLHNoZWV0PTMpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjMueGxzeCIsc2hlZXQ9NCkpDQoNCmhzMTIgPC0gYmluZF9yb3dzKHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI0Lnhsc3giLHNoZWV0PTEpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjQueGxzeCIsc2hlZXQ9MiksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyNC54bHN4IixzaGVldD0zKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI0Lnhsc3giLHNoZWV0PTQpKQ0KDQpoczEzIDwtIGJpbmRfcm93cyhyZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyNS54bHN4IixzaGVldD0xKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI1Lnhsc3giLHNoZWV0PTIpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjUueGxzeCIsc2hlZXQ9MyksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyNS54bHN4IixzaGVldD00KSkNCg0KaHMxNCA8LSBiaW5kX3Jvd3MocmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjYueGxzeCIsc2hlZXQ9MSksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyNi54bHN4IixzaGVldD0yKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI2Lnhsc3giLHNoZWV0PTMpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjYueGxzeCIsc2hlZXQ9NCkpDQoNCmhzMTUgPC0gYmluZF9yb3dzKHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI3Lnhsc3giLHNoZWV0PTEpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjcueGxzeCIsc2hlZXQ9MiksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyNy54bHN4IixzaGVldD0zKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI3Lnhsc3giLHNoZWV0PTQpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjcueGxzeCIsc2hlZXQ9NSkpDQoNCmhzMTYgPC0gYmluZF9yb3dzKHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI4Lnhsc3giLHNoZWV0PTEpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjgueGxzeCIsc2hlZXQ9MiksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyOC54bHN4IixzaGVldD0zKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI4Lnhsc3giLHNoZWV0PTQpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjgueGxzeCIsc2hlZXQ9NSkpDQoNCiMg44GT44Gu5bm05Lul6ZmN44Gr55m655Sf5aC05omA44Gu5oOF5aCx44GM5Yqg44KP44KLDQpoczE3IDwtIGJpbmRfcm93cyhyZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyOS54bHN4IixzaGVldD0xKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI5Lnhsc3giLHNoZWV0PTIpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMjkueGxzeCIsc2hlZXQ9MyksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gyOS54bHN4IixzaGVldD00KSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDI5Lnhsc3giLHNoZWV0PTUpKQ0KDQpoczE4IDwtIGJpbmRfcm93cyhyZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gzMC54bHN4IixzaGVldD0xKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDMwLnhsc3giLHNoZWV0PTIpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9oMzAueGxzeCIsc2hlZXQ9MyksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX2gzMC54bHN4IixzaGVldD00KSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfaDMwLnhsc3giLHNoZWV0PTUpKQ0KDQpoczE5IDwtIGJpbmRfcm93cyhyZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX3IxLnhsc3giLHNoZWV0PTEpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9yMS54bHN4IixzaGVldD0yKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfcjEueGxzeCIsc2hlZXQ9MyksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX3IxLnhsc3giLHNoZWV0PTQpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9yMS54bHN4IixzaGVldD01KSkNCg0KaHMyMCA8LSBiaW5kX3Jvd3MocmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9yMi54bHN4IixzaGVldD0xKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfcjIueGxzeCIsc2hlZXQ9MiksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX3IyLnhsc3giLHNoZWV0PTMpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9yMi54bHN4IixzaGVldD00KSkNCg0KaHMyMSA8LSBiaW5kX3Jvd3MocmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9yMy54bHN4IixzaGVldD0xKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfcjMueGxzeCIsc2hlZXQ9MiksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX3IzLnhsc3giLHNoZWV0PTMpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9yMy54bHN4IixzaGVldD00KSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfcjMueGxzeCIsc2hlZXQ9NSkpDQoNCmhzMjIgPC0gYmluZF9yb3dzKHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfcjQueGxzeCIsc2hlZXQ9MSksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX3I0Lnhsc3giLHNoZWV0PTIpLA0KICAgICAgICAgICAgICAgICAgcmVhZF94bHN4KCJkYXRhL2hzL2hlYXRzdHJva2UwMDNfZGF0YV9yNC54bHN4IixzaGVldD0zKSwNCiAgICAgICAgICAgICAgICAgIHJlYWRfeGxzeCgiZGF0YS9ocy9oZWF0c3Ryb2tlMDAzX2RhdGFfcjQueGxzeCIsc2hlZXQ9NCksDQogICAgICAgICAgICAgICAgICByZWFkX3hsc3goImRhdGEvaHMvaGVhdHN0cm9rZTAwM19kYXRhX3I0Lnhsc3giLHNoZWV0PTUpKQ0KDQpocyA8LSBiaW5kX3Jvd3MoaHMwOCwNCiAgICAgICAgICAgICAgICBoczA5LA0KICAgICAgICAgICAgICAgIGhzMTAsDQogICAgICAgICAgICAgICAgaHMxMSwNCiAgICAgICAgICAgICAgICBoczEyLA0KICAgICAgICAgICAgICAgIGhzMTMsDQogICAgICAgICAgICAgICAgaHMxNCwNCiAgICAgICAgICAgICAgICBoczE1LA0KICAgICAgICAgICAgICAgIGhzMTYsDQogICAgICAgICAgICAgICAgaHMxNywNCiAgICAgICAgICAgICAgICBoczE4LA0KICAgICAgICAgICAgICAgIGhzMTksDQogICAgICAgICAgICAgICAgaHMyMCwNCiAgICAgICAgICAgICAgICBoczIxLA0KICAgICAgICAgICAgICAgIGhzMjIpDQoNCmhzW2lzLm5hKGhzKV0gPC0gMA0KDQpocyA8LSBocyAlPiUgDQogIHJlbmFtZShkYXRlPeaXpeS7mCwNCiAgICAgICAgIHByZWZJRD3pg73pgZPlupznnIzjgrPjg7zjg4ksDQogICAgICAgICBjYXNlcz1g5pCs6YCB5Lq65ZOh77yI6KiI77yJYCwNCiAgICAgICAgIGFnZV9uZXdib3JuPWDlubTpvaLljLrliIbvvJrmlrDnlJ/lhZBgLA0KICAgICAgICAgYWdlX2luZmFudD1g5bm06b2i5Yy65YiG77ya5Lmz5bm85YWQYCwNCiAgICAgICAgIGFnZV95b3V0aD1g5bm06b2i5Yy65YiG77ya5bCR5bm0YCwNCiAgICAgICAgIGFnZV9hZHVsdD1g5bm06b2i5Yy65YiG77ya5oiQ5Lq6YCwNCiAgICAgICAgIGFnZV9lbGRlcj1g5bm06b2i5Yy65YiG77ya6auY6b2i6ICFYCwNCiAgICAgICAgIGFnZV91bmtub3duPWDlubTpvaLljLrliIbvvJrkuI3mmI5gLA0KICAgICAgICAgc2V2ZXJpdHlfZGVhZD1g5YK355eF56iL5bqm77ya5q275LqhYCwNCiAgICAgICAgIHNldmVyaXR5X3NlcmlvdXM9YOWCt+eXheeoi+W6pu+8mumHjeeXh2AsDQogICAgICAgICBzZXZlcml0eV9tb2RlcmF0ZT1g5YK355eF56iL5bqm77ya5Lit562J55eHYCwNCiAgICAgICAgIHNldmVyaXR5X21pbGQ9YOWCt+eXheeoi+W6pu+8mui7veeXh2AsDQogICAgICAgICBzZXZlcml0eV9vdGhlcj1g5YK355eF56iL5bqm77ya44Gd44Gu5LuWYCwNCiAgICAgICAgIHBsYWNlX2hvdXNlPWDnmbrnlJ/loLTmiYDvvJrkvY/lsYVgLA0KICAgICAgICAgcGxhY2Vfd29yazE9YOeZuueUn+WgtOaJgO+8muS7leS6i+WgtOKRoGAsDQogICAgICAgICBwbGFjZV93b3JrMj1g55m655Sf5aC05omA77ya5LuV5LqL5aC04pGhYCwNCiAgICAgICAgIHBsYWNlX3NjaG9vbD1g55m655Sf5aC05omA77ya5pWZ6IKy5qmf6ZaiYCwNCiAgICAgICAgIHBsYWNlX3B1YmxpY19pbnNpZGU9YOeZuueUn+WgtOaJgO+8muWFrOihhijlsYvlhoUpYCwNCiAgICAgICAgIHBsYWNlX3B1YmxpY19vdXRzaWRlPWDnmbrnlJ/loLTmiYDvvJrlhazooYYo5bGL5aSWKWAsDQogICAgICAgICBwbGFjZV9yb2FkPWDnmbrnlJ/loLTmiYDvvJrpgZPot69gLA0KICAgICAgICAgcGxhY2Vfb3RoZXI9YOeZuueUn+WgtOaJgO+8muOBneOBruS7lmApICU+JSANCiAgbXV0YXRlKGRhdGU9YXMuRGF0ZShkYXRlKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVhZF9jc3YoImRhdGEvcHJlZi5jc3YiKSkgJT4lIA0KICBtdXRhdGUoeWVhcj1hcy5kb3VibGUoeWVhcihkYXRlKSksbW9udGg9YXMuZG91YmxlKG1vbnRoKGRhdGUpKSkNCg0KYGBgDQoNCmBgYHtyfQ0KaHMNCmBgYA0KDQojIyDmsJfmuKnjg4fjg7zjgr/jgpLoqq3jgb/ovrzjgoANCg0K5ZCE6YO96YGT5bqc55yM5bqB5omA5Zyo5Zyw44Gr44GK44GR44KLNe+9njnmnIjjga7ml6XjgZTjgajmnIDpq5jmsJfmuKnjgajlubPlnYfmsJfmuKnjga7jg4fjg7zjgr/jgpLoqq3jgb/ovrzjgpPjgafmlbTlvaLjgZnjgovjgILlh7rlhbjjga9b5rCX6LGh5bqBXShodHRwczovL3d3dy5kYXRhLmptYS5nby5qcC9vYmQvc3RhdHMvZXRybi8p44CCDQoNCmBgYHtyIGV2YWw9RkFMU0V9DQoNCg0KY2xpbWF0ZSA8LSBiaW5kX3Jvd3MocmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9ob2trYWlkby5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLljJfmtbfpgZMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9hb21vcmkuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i6Z2S5qOu55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9pd2F0ZS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLlsqnmiYvnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9taXlhZ2kuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i5a6u5Z+O55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvYWtpdGEuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i56eL55Sw55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUveWFtYWdhdGEuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i5bGx5b2i55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvZnVrdXNoaW1hLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9Iuemj+WztuecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL2liYXJha2kuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i6Iyo5Z+O55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvdG9jaGlnaS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLmoIPmnKjnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9ndW5tYS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLnvqTppqznnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9zYWl0YW1hLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuWfvOeOieecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL2NoaWJhLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuWNg+iRieecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL3Rva3lvLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuadseS6rOmDvSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL2thbmFnYXdhLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuelnuWliOW3neecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL25paWdhdGEuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i5paw5r2f55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvdG95YW1hLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuWvjOWxseecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL2lzaGlrYXdhLmNzdiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLnn7Plt53nnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9mdWt1aS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLnpo/kupXnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS95YW1hbmFzaGkuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i5bGx5qKo55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvbmFnYW5vLmNzdiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLplbfph47nnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9naWZ1LmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuWykOmYnOecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL3NoaXp1b2thLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IumdmeWyoeecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL2FpY2hpLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuaEm+efpeecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL21pZS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLkuInph43nnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLCAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9zaGlnYS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLmu4vos4DnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9reW90by5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLkuqzpg73lupwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9vc2FrYS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLlpKfpmKrlupwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9oeW9nby5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLlhbXluqvnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9uYXJhLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuWliOiJr+ecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL3dha2F5YW1hLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuWSjOatjOWxseecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL3RvdHRvcmkuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i6bOl5Y+W55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvc2hpbWFuZS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLls7bmoLnnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9va2F5YW1hLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuWyoeWxseecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL2hpcm9zaGltYS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLluoPls7bnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS95YW1hZ3VjaGkuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i5bGx5Y+j55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvdG9rdXNoaW1hLmNzdiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLlvrPls7bnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9rYWdhd2EuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i6aaZ5bed55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvZWhpbWUuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i5oSb5aqb55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUva29jaGkuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i6auY55+l55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwNCiAgICAgICAgICAgICAgICAgICAgIHJlYWRfY3N2KCJkYXRhL2NsaW1hdGUvZnVrdW9rYS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLnpo/lsqHnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9zYWdhLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuS9kOizgOecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL25hZ2FzYWtpLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IumVt+W0juecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL2t1bWFtb3RvLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IueGiuacrOecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL29pdGEuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJzaGlmdC1qaXMiKSlbLGMoMSwyLDUsOCldICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKOW5tOaciOaXpSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZj0i5aSn5YiG55yMIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9YXMuRGF0ZSjlubTmnIjml6UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXA9YOacgOmrmOawl+a4qSjihIMpLi4uMmAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfdGVtcD1g5bmz5Z2H5rCX5ripKOKEgykuLi41YCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1pZGl0eT1g5bmz5Z2H5rm/5bqmKO+8hSkuLi44YCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QocHJlZixkYXRlLG1heF90ZW1wLGF2Z190ZW1wLGh1bWlkaXR5KSwgDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL21peWF6YWtpLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9IuWuruW0juecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSksDQogICAgICAgICAgICAgICAgICAgICByZWFkX2NzdigiZGF0YS9jbGltYXRlL2thZ29zaGltYS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gInNoaWZ0LWppcyIpKVssYygxLDIsNSw4KV0gJT4lDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighaXMubmEo5bm05pyI5pelKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShwcmVmPSLpub/lhZDls7bnnIwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1hcy5EYXRlKOW5tOaciOaXpSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcD1g5pyA6auY5rCX5ripKOKEgykuLi4yYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z190ZW1wPWDlubPlnYfmsJfmuKko4oSDKS4uLjVgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bWlkaXR5PWDlubPlnYfmub/luqYo77yFKS4uLjhgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChwcmVmLGRhdGUsbWF4X3RlbXAsYXZnX3RlbXAsaHVtaWRpdHkpLA0KICAgICAgICAgICAgICAgICAgICAgcmVhZF9jc3YoImRhdGEvY2xpbWF0ZS9va2luYXdhLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAic2hpZnQtamlzIikpWyxjKDEsMiw1LDgpXSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYSjlubTmnIjml6UpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWY9Iuaylue4hOecjCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWFzLkRhdGUo5bm05pyI5pelKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wPWDmnIDpq5jmsJfmuKko4oSDKS4uLjJgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3RlbXA9YOW5s+Wdh+awl+a4qSjihIMpLi4uNWAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtaWRpdHk9YOW5s+Wdh+a5v+W6pijvvIUpLi4uOGApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxhdmdfdGVtcCxodW1pZGl0eSkpICU+JSANCiAgbXV0YXRlKHllYXI9YXMuZG91YmxlKHllYXIoZGF0ZSkpLG1vbnRoPWFzLmRvdWJsZShtb250aChkYXRlKSkpDQoNCmBgYA0KDQpgYGB7cn0NCmNsaW1hdGUNCmBgYA0KDQojIyDjgYTjgojjgYTjgojliIbmnpANCg0K5aSP77yINe+9njnmnIjvvInjga7lubPlnYfmsJfmuKnjgpLpg73pgZPlupznnIzliKXjgavoqIjnrpfjgZnjgovjgILku4rlm57jga8yMDIw5bm05Lul6ZmN44GuM+W5tOmWk+OBq+OBl+OBvOOBo+OBn+OAgg0KDQpgYGB7ciBldmFsPUZBTFNFfQ0KYXZnX3RlbXBfc3VtbWVyIDwtIGNsaW1hdGUgJT4lDQogIGZpbHRlcihhcy5kb3VibGUoeWVhcihkYXRlKSk+PTIwMjApICU+JQ0KICBncm91cF9ieShwcmVmKSAlPiUNCiAgc3VtbWFyaXplKGF2Z190ZW1wX3N1bW1lcj1tZWFuKGF2Z190ZW1wKSkgJT4lDQogIGxlZnRfam9pbihyZWFkX2NzdigiZGF0YS9wcmVmLmNzdiIpKSAlPiUNCiAgYXJyYW5nZShwcmVmSUQpDQoNCmBgYA0KDQpgYGB7cn0NCmF2Z190ZW1wX3N1bW1lcg0KYGBgDQoNCiMjIOacgOmrmOawl+a4qeOBqOaQrOmAgeaVsOOBrumWouS/guOCkuOCsOODqeODleOBq+OBmeOCiw0KDQrlkITlnLDjga7ml6XliKXmnIDpq5jmsJfmuKnjgajnhrHkuK3nl4fmkKzpgIHmlbDjga7plqLkv4LjgpLjgrDjg6njg5XjgavjgZnjgovjgILlubPlnYfmsJfmuKnjgYzikaAyMuW6puS7peS4i+OBrua2vOOBl+OBhOWcsOWfn+KRoTIy772eMjPluqbjga7jgoTjgoTmtrzjgZfjgYTlnLDln5/ikaIyM+W6pui2heOBrua2vOOBl+OBj+OBr+OBquOBhOWcsOWfn+OAgeOBrjPjg5Hjgr/jg7zjg7PjgavliIbjgZHjgabmj4/jgY/jgIINCg0KMeOBpOOCgeOBruOCsOODqeODleOBr+aVo+W4g+Wbs+OBp+OAgTLjgaTjgoHjga/jgZ3jga7ov5HkvLzmm7Lnt5rjgIINCg0KYGBge3J9DQpocyAlPiUNCiAgbXV0YXRlKHllYXIyPWlmZWxzZSh5ZWFyPDIwMTAsMjAwNSwNCiAgICAgICAgICAgICAgIGlmZWxzZSh5ZWFyPDIwMTUsMjAxMCwNCiAgICAgICAgICAgICAgIGlmZWxzZSh5ZWFyPDIwMjAsMjAxNSwyMDIwKSkpKSAlPiUgIyA15bm044GU44Go44Gr6KGM44KP44KM44KL5Zu95Yui6Kq/5p+744Gu5Lq65Y+j44OH44O844K/44KS56qB5ZCI44GZ44KL44CM5Z+65rqW5bm044CN44KS5rG644KB44KLDQogIGxlZnRfam9pbihyZWFkX2NzdigiZGF0YS9wb3B1bGF0aW9uLmNzdiIpKSAlPiUgIyDlm73li6Loqr/mn7vjga7pg73pgZPlupznnIzliKXkurrlj6Pjg4fjg7zjgr/jgpLnqoHlkIjjgZnjgosNCiAgbGVmdF9qb2luKGNsaW1hdGUpICU+JSAgIyDmsJfmuKnjg4fjg7zjgr/jgpLnqoHlkIjjgZnjgosNCiAgbGVmdF9qb2luKGF2Z190ZW1wX3N1bW1lcikgJT4lICAjIOWkj+WgtOOBruW5s+Wdh+awl+a4qeODh+ODvOOCv+OCkueqgeWQiOOBmeOCiw0KICBtdXRhdGUoY2FzZXNfcG9wPTEwMDAwMCpjYXNlcy9wb3B1bGF0aW9uKSAlPiUgICMg5Lq65Y+jMTDkuIfkurrjgYLjgZ/jgorjga7mkKzpgIHmlbDjgpLoqIjnrpfjgZnjgosNCiAgbXV0YXRlKOWkj+WgtOOBruW5s+Wdh+awl+a4qT1pZmVsc2UoYXZnX3RlbXBfc3VtbWVyPjIzLCIyM+W6pui2hSIsDQogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXZnX3RlbXBfc3VtbWVyPjIyLCIyM34yMuW6piIsDQogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXZnX3RlbXBfc3VtbWVyPD0yMiwiMjLluqbku6XkuIsiLE5BKSkpKSAlPiUNCiAgZ2dwbG90KGFlcyhtYXhfdGVtcCxjYXNlc19wb3AsY29sb3I95aSP5aC044Gu5bmz5Z2H5rCX5ripKSkgKw0KICBnZW9tX3BvaW50KGFscGhhPS41KSArDQogIGxhYnModGl0bGU9IuS6uuWPo++8ke+8kOS4h+S6uuOBguOBn+OCiuOBruaQrOmAgeS7tuaVsOOBqOaXpeWIpeacgOmrmOawl+a4qeOBrumWouS/giIsDQogICAgICAgeD0i44Gd44Gu5pel44Gu5pyA6auY5rCX5rip77yI5bqm77yJIiwNCiAgICAgICB5PSLmlZHmgKXmkKzpgIHmlbDvvIjkurrlj6MxMOS4h+S6uuW9k+OBn+OCiu+8iSIpDQoNCg0KaHMgJT4lDQogIG11dGF0ZSh5ZWFyMj1pZmVsc2UoeWVhcjwyMDEwLDIwMDUsDQogICAgICAgICAgICAgICBpZmVsc2UoeWVhcjwyMDE1LDIwMTAsDQogICAgICAgICAgICAgICBpZmVsc2UoeWVhcjwyMDIwLDIwMTUsMjAyMCkpKSkgJT4lDQogIGxlZnRfam9pbihyZWFkX2NzdigiZGF0YS9wb3B1bGF0aW9uLmNzdiIpKSAlPiUNCiAgbGVmdF9qb2luKGNsaW1hdGUpICU+JQ0KICBsZWZ0X2pvaW4oYXZnX3RlbXBfc3VtbWVyKSAlPiUNCiAgbXV0YXRlKGNhc2VzX3BvcD0xMDAwMDAqY2FzZXMvcG9wdWxhdGlvbikgJT4lDQogIG11dGF0ZSjlpI/loLTjga7lubPlnYfmsJfmuKk9aWZlbHNlKGF2Z190ZW1wX3N1bW1lcj4yMywiMjPluqbotoUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGF2Z190ZW1wX3N1bW1lcj4yMiwiMjN+MjLluqYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGF2Z190ZW1wX3N1bW1lcjw9MjIsIjIy5bqm5Lul5LiLIixOQSkpKSkgJT4lDQogIGdncGxvdChhZXMobWF4X3RlbXAsY2FzZXNfcG9wLGNvbG9yPeWkj+WgtOOBruW5s+Wdh+awl+a4qSkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJnYW0iLHNlPUZBTFNFKSArDQogIGxhYnModGl0bGU9IuS6uuWPo++8ke+8kOS4h+S6uuOBguOBn+OCiuOBruaQrOmAgeS7tuaVsOOBqOaXpeWIpeacgOmrmOawl+a4qeOBrumWouS/giIsDQogICAgICAgc3VidGl0bGU9IuS4gOiIrOWMluWKoOazleODouODh+ODq+OBq+OCiOOCi+i/keS8vOabsue3miIsDQogICAgICAgeD0i44Gd44Gu5pel44Gu5pyA6auY5rCX5rip77yI5bqm77yJIiwNCiAgICAgICB5PSLmlZHmgKXmkKzpgIHmlbDvvIjkurrlj6MxMOS4h+S6uuW9k+OBn+OCiu+8iSIpDQoNCmBgYA0KDQojIyDku6XkuIvjga/kuojlgpnnmoTjgavjgoTjgaPjgZ/liIbmnpANCg0K5ra844GX44GE5Zyw5Z+f44G744Gp5pCs6YCB5pWw44GM5aKX44GI44KE44GZ44GE44Go44GE44GG44Gu44Gv44CB56eB44Gf44Gh44GM5aeL44KB44GL44KJ55+l44Gj44Gm44GE44Gf44GT44Go44Gn44Gv44Gq44GP44CB5Lul5LiL44Gu44KI44GG44Gq5YiG5p6Q44KS44GX44Gf44KJ5YiG44GL44Gj44Gf44GT44Go44CCDQoNCuaQrOmAgeaVsOOBruWil+a4m+OBq+OBqeOCk+OBquimgee0oOOBjOWKueOBhOOBpuOBhOOCi+OBruOBi+OCkuefpeOCi+OBn+OCgeOAgeOCguOBo+OBqOOCguW9k+OBpuOBr+OBvuOCiuOBruiJr+OBhOmHjeWbnuW4sOWIhuaekOOBruODouODh+ODq+OCkuOCueODhuODg+ODl+ODr+OCpOOCuuazleOBp+aOouOBl+OBn+OAguiqrOaYjuWkieaVsOOBruWAmeijnOOBqOOBl+OBpuOAgemDvemBk+W6nOecjOWIpeOBruawl+a4qeOChOW5s+Wdh+WPjuWFpeOAgeOCuOODi+S/guaVsOOAgeOCqOOCouOCs+ODs+S/neacieWPsOaVsOOBquOBqeOCkueUqOaEj+OBl+OBn+OAguebrueahOWkieaVsOOBqOOBl+OBpuOBr+OAgeaQrOmAgeaVsOOBruWQiOioiOOBoOOBkeOBp+OBr+OBquOBj+OAgeaQrOmAgeiAheOBruW5tOm9ouOChOeZuueUn+WgtOaJgOOBquOBqeOBq+WIhuOBkeOBn+S7tuaVsOOCguaknOiojuOBl+OBn+OAgg0KDQpgYGB7ciBldmFsPUZBTFNFfQ0KcmVncyA8LSBsaXN0KCkNCmluZGljZXMgPC0gYygzOjgsIDEwOjIyKQ0KDQpmb3IgKGkgaW4gaW5kaWNlcykgew0KeCA8LSBjb2xuYW1lcyhocylbaV0NCm1vZGVsbmFtZSA8LSBwYXN0ZTAoIm1vZGVsXyIseCkNCg0KaHNfYW5hbHlzaXMgPC0gaHMgJT4lDQogIHJlbmFtZSh4PXgpICU+JSANCiAgbXV0YXRlKHllYXI9eWVhcihkYXRlKSkgJT4lDQogIGZpbHRlcih5ZWFyICVpbiUgYygiMjAxOCIsIjIwMTkiLCIyMDIwIiwiMjAyMSIsIjIwMjIiKSkgJT4lDQogIGdyb3VwX2J5KGRhdGUscHJlZikgJT4lDQogIHN1bW1hcml6ZSh4PXN1bSh4KSkgJT4lDQogIGxlZnRfam9pbihyZWFkX2NzdigiZGF0YS9wb3B1bGF0aW9uMjAyMC5jc3YiKSkgJT4lDQogIG11dGF0ZSh4X3BvcD14KjEwMDAwMC9wb3B1bGF0aW9uMjAyMCkgJT4lDQogIG11dGF0ZShyYXRlX2VsZGVyPW92ZXI2NS9wb3B1bGF0aW9uMjAyMCkgJT4lDQogIGxlZnRfam9pbihyZWFkX2NzdigiZGF0YS92YXJpYWJsZXMzLmNzdiIpKSAlPiUgDQogIGxlZnRfam9pbihjbGltYXRlICU+JSBkcGx5cjo6c2VsZWN0KHByZWYsZGF0ZSxtYXhfdGVtcCxodW1pZGl0eSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtZGF0ZSwtcHJlZikgJT4lIA0KICBzY2FsZSgpICU+JSANCiAgYXNfdGliYmxlKCkNCg0KaHNfYW5hbHlzaXMgPC0gaHNfYW5hbHlzaXNbLDY6MjNdICU+JSANCiAgbmEub21pdCgpDQoNCmZ1bGxfbW9kZWwgPC0gbG0oeF9wb3Agfi4sIGRhdGEgPSBoc19hbmFseXNpcykNCg0Kc3RlcF9tb2RlbCA8LSBmdWxsX21vZGVsICU+JQ0KICBzdGVwQUlDKGRpcmVjdGlvbiA9ICJib3RoIiwgdHJhY2UgPSBUUlVFKQ0KDQptb2RlbCA8LSBtb2RlbHN1bW1hcnkoc3RlcF9tb2RlbCxzdGFycz1UUlVFLHRpdGxlPXBhc3RlKHgpKQ0KDQphc3NpZ24obW9kZWxuYW1lLG1vZGVsKQ0KfQ0KDQpgYGANCg0K5YWo5pCs6YCB5Lu25pWw44KS6Kqs5piO44GZ44KL5pyA6Imv44Gu44Oi44OH44Or44Gv5Lul5LiL44Gu6YCa44KK44Gn44CB57WQ5bGA44CB5pel44GU44Go44Gu5pyA6auY5rCX5rip44Gu5b2x6Z+/44GM5Zyn5YCS55qE44Gr5aSn44GN44GE77yI44GT44KM44Gv5b2T44Gf44KK5YmN77yJ44CC44Gk44GO44Gr5b2x6Z+/44GM5aSn44GN44GE44Gu44Gv5aSP5aC044Gu5bmz5Z2H5rCX5rip44Gn44CB5pqR44GE5Zyw5Z+f44G744Gp5pCs6YCB5pWw44GM5bCR44Gq44GP44Gq44KL44GT44Go44GM44KP44GL44Gj44Gf44CC55uu55qE5aSJ5pWw44KS5Yil44Gu44KC44Gu44Gr44GX44Gf44Oi44OH44Or44Gn44KC44GT44KM44Gv5ZCM5qeY44Gn44CB44GL44Gq44KK44Ot44OQ44K544OI44Gq44KC44Gu44Go6ICD44GI44KJ44KM44Gf44CC44CM5ra844GX44GE5Zyw5Z+f44Gu5Lq644G744Gp5pqR44GV44Gr5oWj44KM44Gm44GK44KJ44Ga44CB54ax5Lit55eH44Gr44Gq44KK44KE44GZ44GE44CN44Go44GE44GG5bCC6ZaA5a6244Gu55+l6KaL44Go44KC55+b55u+44GX44Gq44GE44Go44KP44GL44Gj44Gf44Gf44KB44CB44GT44Gu44OH44O844K/44KS6KiY5LqL44Gu5Lit5qC444Gr5o2u44GI44KL44GT44Go44KS5rG644KB44Gf44CCDQoNCuOBk+OBruOBu+OBi+OAgeeUn+a0u+S/neitt+OCkuWPl+OBkeOBpuOBhOOCi+S6uuOBruWkmuOBhOWcsOWfn+OBu+OBqeaQrOmAgeaVsOOBjOWil+OBiOOCi+OAgeOBquOBqeOBruWCvuWQkeOCguimi+OBiOOBn+OBjOOAgeWKueaenOmHj+OBr+OBguOBvuOCiuWkp+OBjeOBhOOBqOOBr+iogOOBiOOBmuOAgeiomOS6i+OBq+ebm+OCiui+vOOCgOOBruOBr+imi+mAgeOBo+OBn+OAgg0KDQpgYGB7cn0NCm1vZGVsX2Nhc2VzDQoNCmBgYA0KDQrjgZnjgafjgavmm7jjgYTjgZ/jgojjgYbjgavjgIHmkKzpgIHmlbDjga7jg4fjg7zjgr/jgavjga/mkKzpgIHogIXjga7lubTpvaLjga7jgbvjgYvjgIHnl4fnirbjga7ph43jgZXjgajnmbrnlJ/loLTmiYDjga7lhoXoqLPjga7mlbDlrZfjgoLjgYLjgovjgYzjgIHjgZPjgozjgonjga/ku4rlm57jga7oqJjkuovjgavjga/jgb7jgaPjgZ/jgY/nm5vjgorovrzjgb7jgarjgYvjgaPjgZ/jgILjgb7jgaDlkbPjgo/jgYjjgovkvZnlnLDjga7jgYLjgovjg4fjg7zjgr/jgYvjgoLjgIINCg0K44GK44GX44G+44GE44CCDQo=