Schopnosti ryb překonávat rychlosti proudů

Úvod

Schopnosti ryb překonávat rychlosti proudu jsou klíčovým faktorem při navrhování rybích přechodů. Tyto schopnosti se mění napříč druhy, ale i s velikostí ryby, nebo schopností individua. KRP - odborná skupina AOPK, zřízená k řešení problematiky migrační prostupnosti vodních toků. Součástí zasedání této komise jsou i hodnocení připravovaných projektů, kde se členové vyjadřují k jednotlivým parametrům plánované stavby. Rychlost proudu je jedním z nich.

Data

#### --------  VSTUPNÍ DATA --------- #####

druh=c("pstruh_o","strevle_p","vranka_o","vranka_p","jelec_t","ostroretka_s",
       "parma_o","cejn_v","mnik_j","mihule_p","uhor_o","jelec_p","plotice_o",
       "lipan_p","hrouzek_o","mrenka_m")

velikost=c(30,7,8,8,30,30,35,25,50,18,20,20,20,20,12.3,7.2)

s_rychlost=c(3.1,1.1,0.6,0.6,1.5,1.6,1.8,0.6,1.3,0.5,1.15,
             1.51,1.47,1.66,1.18,0.84)

#m_rychlost_norma = c(0.75,0.55,0,0,0.8,0.85,0.9,0.5,0.8,
#                     0.5)

intervals=seq(from=min(s_rychlost)-0.001,to = max(s_rychlost)+0.001,
              length.out = length(druh)) # Je vhodnější dělit na intervaly rychlost ryb nebo 0-4? ... viz řádek níž

#intervals=seq(from= 0 ,to = 4 ,length.out = length(druh))


#### -------- ÚPRAVY DAT --------- ###

# Data pro graf na základě dat z normy
intervals_norma=seq(from=min(s_rychlost)-0.001,to = max(s_rychlost)+0.001,
                    length.out = 10)

pc_druhu_norma=NULL
for (i in 1:10){
  pc_druhu_norma[i]=sum(s_rychlost[1:10]>intervals_norma[i])
  #print(i)
}


# Data pro Graf procentuálního zastoupení všech druhů v datasetu

pc_druhu=NULL
for (i in 1:length(druh)){
  pc_druhu[i]=sum(s_rychlost>intervals[i])
  #print(i)
}

# procentuální zastoupení množství druhů
prc_druhu=(pc_druhu/length(druh))*100  

Prvních 10 ryb je z normy pro stavění rybích přechodů, zbytek je z literatury (skoková rychlost 11. - 16. druhu je zzískána z publikace: MIGRACE RYB, RYBÍ PŘECHODY A ZPŮSOB JEJICH TESTOVÁNÍ (Slavík O. Vančura Z. a kol. 2012), která cituje další autory) . Pokud je v normě uveden interval je vždy počítáno s nejnižší uvedenou rychlostí. Ze skokové rychlosti je počítáno kolik rybích druhů je ještě schopno překonat danou rychlost proudu rozdělenou do 16 intervalů mezi minimální a maximální skokovou rychlostí.

(Měl bych popřemýšlet jestli vyrovnat se rychlosti proudu znamená ji překonat)

ryby=data.frame(
  druh,
  s_rychlost,
  velikost
  )

ryby

Grafy

plot(pc_druhu_norma~intervals_norma,
     main = c("Závislost počtu druhů ryb Z NORMY na rychlosti proudu,","kterou jsou ještě schopny překonat"),
     ylab = "Počet druhů",
     xlab = "Rychlost proudu v m/s",
     type = "b"
       )
abline(v=c(1,1.2), col=c("green","red"))
GRAF

GRAF

plot(prc_druhu~intervals,
     main = c("Závislost počtu druhů ryb na rychlosti proudu,","kterou jsou ještě schopny překonat"),
     ylab = "Počet druhů [%]",
     xlab = "Rychlost proudu v m/s",
     type = "l"
       )
abline(v=c(1,1.2), col=c("green","red"))
GRAF

GRAF

Hodnocení fragmentace na základě DCI

Úvod

Index DCI (Dendric conectivity index) hodnotí míru fragmentace formou pravděpodobnosti s jakou je organismus schopen se dostat z jednoho náhodného místa na toku do místa druhého. Je schopný hodnotit říční sítě, průchodnost překážek nebo rozdíly mezi potamodromní a anadromní migrací. Podrobně jej popisuje následující článek: A new measure of longitudinal connectivity for stream networks.

Tento index je založen na jednoduchém vzorci: Vzorec

K jeho výpočtu je možné použít nástroj FIPEX, nebo R package s názvem “dci”.

Popis balíčku dci

Ukázka funkce

Databáze profilu, které šly na KRP, a monitoringů na RP

Úvod

Popis databáze Struktura, kterou mám aktuálně v hlavě je popsána následujícím rozpracovaným ER diagramem. Jsou tam uvedeny názvy tabulek, které by dle mého měly obsáhnout celou šíři požadovaných dat. Názvy sloupců jsou spíše orientační (aktuálně v řešení).

Konzultoval jsem, kde by se tyto data daly uchovat, aby byly dostupné a k budoucímu užití. Došel jsem k názoru, že ideální by bylo spojit tuto databázi s databízí migračních bariér, což by mohlo zároveň proběhnout s její plánovanou aktualizací.

Přínosy - Elektronizace záznamů jednání KRP. - Rozšíření databáze migračních bariér o zajímavé a již nasbíraná ale i v budoucnu získaná data - k zobrazení, či analýzám.

Výstupy - zobrazení některých informací v databázi migračních bariér - možnost zobrazení a stažení dat pro pracovníky AOPK - Transfer monitoringů do NDOP

Vstupy - Import shromážděných dat při založení - Formulář z jednání KRP

Fyzická Data

V této kapitole jsou vytvořeny tabulky pro znázornění dostupnosti parametrů v jednotlivývh zdrojích dat, Popis zdrojů dat je dále upřesněn v samostatných kapitolách. V tabulkách jsou uvedeny hodnoty s následujícím významem:

  • 1 - informace tu je
  • 0,99 - informace je ale neví se kde
  • 0,5 - informace občas je
  • 0 - informace není
  • A - informace je ale nevychází z těchto materiálů
  • N - infromace není a nemůže vycházet z těchto materiálů
  • NA - Nezkontrolováno
# List názvů sloupců jednotlivých tabulek

dta_Pritomni_clenove <- c("Id_jednani","cl1_ZdenekMyslik","cl2_Zdenek_Vogl","cl3_NikolaKofentova","cl4_PavelMarek"        ,"cl5_MilosHolub","cl6_PavelVrana","cl7_JiriMusil","cl8_KamilFarsky","cl9_PetrHartich","cl10_KarelVrana","cl11_RadkaJakoubkova","cl12_JanKoutny","cl13_RomanZajicek","cl14_JiriNeudert","cl15_TomasBartusek","cl16_MartinCapek","cl17_PavelMoravec")
dta_Jednani_komise <- c("Id_jednani/Id_radku?","Id_prekazky","Id_RP","Datum","Pocet_clenu","Nazev_profilu","Jmeno_predsedy","Jmeno_tajemnika","Odkaz_na_dokument?","Cislo_jednani = id?","Prezentujici","Projektant","Objednatel","Typ_projednani_!(per-rolam)","Vyjezdni_varianta?!","Naverhovane_parametry_RP?")
dta_Pricna_prekazka <- c("Id_prekazky","Typ_prekazky","Tok","Ricni_km","Pritomnost_RP","GPS_Prekazky","Povodi","Majitel_stavby?","Pritomnost_MVE","zpusob_ochrany_MVE?","Typ_MVE?_dalsi_mve_veci?","Tok_Koncepce","Rybi_pasmo_okoli","MZP?","Katastr","ZCHÚ?")
dta_Rybi_prechod <- c("Id_PR","Id_prekazky","Typ_RP","Delka_RP","Sklon_RP","GPS_RP___?___","Provozovatel","Zrizovatel","Projektant","provedeni_monitoringu","Zdroj_penez?","Obec_s_Rozširenou_P")
dta_Monitoring_RP <- c("Id_PR","Odkaz_na_pdf","Pocet_druhu","Řešitel","Zadavatel","Zpusob_monitoringu","Pritomnost_chranenych_druhu","Pritomnost_druhu")
dta_Druhy <- c("!__Zjištěné druhy a jejich počty__!")
dta_Vlastnosti_druhu <- c("Rybi_pasmo","Skokova_rychlost","Maximalni_rychlost","Typ(y?)_migrace","Stupen_ohrozeni_v_CR")

dta_list_vektors_ColNames <- list(Pritomni_clenove = dta_Pritomni_clenove ,Jednani_komise = dta_Jednani_komise,Pricna_prekazka = dta_Pricna_prekazka,Rybi_prechod = dta_Rybi_prechod,Monitoring_RP = dta_Monitoring_RP,Druhy = dta_Druhy,Vlastnosti_druhu = dta_Vlastnosti_druhu)

# Vektor zdrojů dat
dta_Zdroje_dat <- c("Papir","Pavel_M","OPZP_a_PRZS","Excel","S_disk","DMB")

# List tabulek 
dta_list_tables_ColAvailibility <- NULL
  
for (i in 1:7) {
  mat <- matrix(ncol = length(dta_list_vektors_ColNames[[i]]),nrow = length (dta_Zdroje_dat))
  colnames(mat) <- dta_list_vektors_ColNames[[i]]
  rownames(mat) <- dta_Zdroje_dat
  dta_list_tables_ColAvailibility [[i]] <- as.data.frame(mat)
}

names(dta_list_tables_ColAvailibility) <- names(dta_list_vektors_ColNames)

# Vyplnění přítomných členů ... Chybí EXCEL!!
dta_list_tables_ColAvailibility$Pritomni_clenove[1:5,1]= "A"
dta_list_tables_ColAvailibility$Pritomni_clenove[1,2:18]= "0.5"
dta_list_tables_ColAvailibility$Pritomni_clenove[2,2:18]= "0.5"
dta_list_tables_ColAvailibility$Pritomni_clenove[3,]= "N"
dta_list_tables_ColAvailibility$Pritomni_clenove[4,2:18]= "NA"
dta_list_tables_ColAvailibility$Pritomni_clenove[5,2:18]= "0.5"
dta_list_tables_ColAvailibility$Pritomni_clenove[6,]= "N"

# Vyplnění Jednání
dta_list_tables_ColAvailibility$Jednani_komise[1:6,1] = "A"
dta_list_tables_ColAvailibility$Jednani_komise[1:5,2] = "A"
dta_list_tables_ColAvailibility$Jednani_komise[6,2] = "1"
dta_list_tables_ColAvailibility$Jednani_komise[1:6,3] = "A"
dta_list_tables_ColAvailibility$Jednani_komise[1:2,4] = "1"
dta_list_tables_ColAvailibility$Jednani_komise[5,4] = "1"
dta_list_tables_ColAvailibility$Jednani_komise[6,4] = "A"
dta_list_tables_ColAvailibility$Jednani_komise[,5] = dta_list_tables_ColAvailibility$Pritomni_clenove[,2]
dta_list_tables_ColAvailibility$Jednani_komise[1:6,6] = "1"
dta_list_tables_ColAvailibility$Jednani_komise[1:5,7] = "1"
dta_list_tables_ColAvailibility$Jednani_komise[4,7] = "NA"
dta_list_tables_ColAvailibility$Jednani_komise[6,7] = "A"
dta_list_tables_ColAvailibility$Jednani_komise[1:5,8] = "0.99"
dta_list_tables_ColAvailibility$Jednani_komise[6,8] = "A"
dta_list_tables_ColAvailibility$Jednani_komise[1:6,9] = "A"
dta_list_tables_ColAvailibility$Jednani_komise[1:5,10] = "1"
dta_list_tables_ColAvailibility$Jednani_komise[6,10] = "A"
dta_list_tables_ColAvailibility$Jednani_komise[1,11:13] = "1"
dta_list_tables_ColAvailibility$Jednani_komise[1,15] = "NA"
dta_list_tables_ColAvailibility$Jednani_komise[,16] = dta_list_tables_ColAvailibility$Jednani_komise [,4]

PŘÍTOMNÍ ČLENOVÉ

knitr::kable(dta_list_tables_ColAvailibility[1])
Id_jednani cl1_ZdenekMyslik cl2_Zdenek_Vogl cl3_NikolaKofentova cl4_PavelMarek cl5_MilosHolub cl6_PavelVrana cl7_JiriMusil cl8_KamilFarsky cl9_PetrHartich cl10_KarelVrana cl11_RadkaJakoubkova cl12_JanKoutny cl13_RomanZajicek cl14_JiriNeudert cl15_TomasBartusek cl16_MartinCapek cl17_PavelMoravec
Papir A 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
Pavel_M A 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
OPZP_a_PRZS N N N N N N N N N N N N N N N N N N
Excel A NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
S_disk A 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
DMB N N N N N N N N N N N N N N N N N N

JEDNÁNÍ KRP

knitr::kable(dta_list_tables_ColAvailibility[2])
Id_jednani/Id_radku? Id_prekazky Id_RP Datum Pocet_clenu Nazev_profilu Jmeno_predsedy Jmeno_tajemnika Odkaz_na_dokument? Cislo_jednani = id? Prezentujici Projektant Objednatel Typ_projednani_!(per-rolam) Vyjezdni_varianta?! Naverhovane_parametry_RP?
Papir A A A 1 0.5 1 1 0.99 A 1 1 1 1 NA NA 1
Pavel_M A A A 1 0.5 1 1 0.99 A 1 NA NA NA NA NA 1
OPZP_a_PRZS A A A NA N 1 1 0.99 A 1 NA NA NA NA NA NA
Excel A A A NA NA 1 NA 0.99 A 1 NA NA NA NA NA NA
S_disk A A A 1 0.5 1 1 0.99 A 1 NA NA NA NA NA 1
DMB A 1 A A N 1 A A A A NA NA NA NA NA A

PŘÍČNÁ PŘEKÁŽKA NA TOKU

knitr::kable(dta_list_tables_ColAvailibility[3])
Id_prekazky Typ_prekazky Tok Ricni_km Pritomnost_RP GPS_Prekazky Povodi Majitel_stavby? Pritomnost_MVE zpusob_ochrany_MVE? Typ_MVE?_dalsi_mve_veci? Tok_Koncepce Rybi_pasmo_okoli MZP? Katastr ZCHÚ?
Papir NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Pavel_M NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
OPZP_a_PRZS NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Excel NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
S_disk NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
DMB NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

RYBÍ PŘECHOD

knitr::kable(dta_list_tables_ColAvailibility[4])
Id_PR Id_prekazky Typ_RP Delka_RP Sklon_RP GPS_RP_?_ Provozovatel Zrizovatel Projektant provedeni_monitoringu Zdroj_penez? Obec_s_Rozširenou_P
Papir NA NA NA NA NA NA NA NA NA NA NA NA
Pavel_M NA NA NA NA NA NA NA NA NA NA NA NA
OPZP_a_PRZS NA NA NA NA NA NA NA NA NA NA NA NA
Excel NA NA NA NA NA NA NA NA NA NA NA NA
S_disk NA NA NA NA NA NA NA NA NA NA NA NA
DMB NA NA NA NA NA NA NA NA NA NA NA NA

MONITORING

knitr::kable(dta_list_tables_ColAvailibility[5])
Id_PR Odkaz_na_pdf Pocet_druhu Řešitel Zadavatel Zpusob_monitoringu Pritomnost_chranenych_druhu Pritomnost_druhu
Papir NA NA NA NA NA NA NA NA
Pavel_M NA NA NA NA NA NA NA NA
OPZP_a_PRZS NA NA NA NA NA NA NA NA
Excel NA NA NA NA NA NA NA NA
S_disk NA NA NA NA NA NA NA NA
DMB NA NA NA NA NA NA NA NA

DRUHY

knitr::kable(dta_list_tables_ColAvailibility[6])
!Zjištěné druhy a jejich počty!
Papir NA
Pavel_M NA
OPZP_a_PRZS NA
Excel NA
S_disk NA
DMB NA

VLASTNOSTI DRUHŮ

knitr::kable(dta_list_tables_ColAvailibility[7])
Rybi_pasmo Skokova_rychlost Maximalni_rychlost Typ(y?)_migrace Stupen_ohrozeni_v_CR
Papir NA NA NA NA NA
Pavel_M NA NA NA NA NA
OPZP_a_PRZS NA NA NA NA NA
Excel NA NA NA NA NA
S_disk NA NA NA NA NA
DMB NA NA NA NA NA

Data - papír

Data uložená ve složkách v papírové podobě

  • Kde: Kancelař - PM, Zdeněk - kancl, Police v archivu, Zasedačka SOPK, Kancelář Jitka K. + skříň v chodbičce
  • Styčná osoba: Pavel Marek
  • Od kdy do kdy: do 2008 +-
  • Typy dokumentů: Přihlášky KRP (je vždy! občas může zůstat na regionu, ale od 2008-2016 existovalo “Projednáváno dne”) ; Pozvánky; Mailu; Stanoviska; Projektových dokumentací
  • Číslo jednání:

Data - Pavel M / …

Data na hard-disku PC Pavla Marka - doplněno archivem mailu a papírovýma složkama

  • Kde: PC Pavel Marek, archiv mailu, papírový složky, může být na S u Jirky
  • Styčná osoba: Pavel Marek, Jirka Petřivalský
  • Od kdy do kdy: 2008 - 2016
  • Typy dokumentů: Složky jako na S nyní
  • Číslo jednání:

Data - PRŘS a OPŽP

Data samostatně evidované (cca 20-30 RP v PRŘS) - OPŽP a PRŘS se většinou duplikují s komisí, takže to bude nejspíš jinde.

  • Kde: Podle roku bude uložený dle tajemníka
  • Styčná osoba: všichni tajemníci
  • Od kdy do kdy: od 1996 a od 2008
  • Typy dokumentů: podle tajemníka + info o dotaci
  • Číslo jednání:

Data - excel

Data ve (dvou) excelových tabulkách

  • Kde: Někde u Pavla v PC (můžou být verze)
  • Styčná osoba: Pavel Marek, Zdeněk Vogl
  • Od kdy do kdy: cca do 2010, drůhá možná od Zdeňka
  • Typy dokumentů: Excelová tabulka
  • Číslo jednání:

Data - S

Data ve složkách na S/ob/odd/KRP

  • Kde: společný disk S
  • Styčná osoba: Pavel Marek, Zdeněk Vogl
  • Od kdy do kdy: 2016 - 2023
  • Typy dokumentů:
  • Číslo jednání:

Data - DMB

Data v databázi migračních bariér - třízené podle ř. km - který km ví Zdeněk K.

  • Kde:
  • Styčná osoba: Zdeněk Kučera, Nikola Kofentová, (Zdeněk Vogl)
  • Od kdy do kdy: mapováno 2017, aktualizace … bude
  • Typy dokumentů: databáze
  • Číslo jednání:
LS0tDQp0aXRsZTogIlbDvXBvxI10eSB2b2RhxZlpIg0KYXV0aG9yOiAiQm9yaXMgUHJ1ZMOtayINCmRhdGU6ICJVcGRhdGU6IGByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIg0KICAgIHRvYzogZmFsc2UNCiAgICBudW1iZXIgc2VjdGlvbjogdHJ1ZQ0KICAgIGhpZ2hsaXRlOiB0YW5nbw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQp3ZCA8LSBnZXR3ZCgpDQpgYGANCg0KIyMgU2Nob3Bub3N0aSByeWIgcMWZZWtvbsOhdmF0IHJ5Y2hsb3N0aSBwcm91ZMWvIHsudGFic2V0fQ0KDQojIyMgw5p2b2QNCg0KU2Nob3Bub3N0aSByeWIgcMWZZWtvbsOhdmF0IHJ5Y2hsb3N0aSBwcm91ZHUganNvdSBrbMOtxI1vdsO9bSBmYWt0b3JlbSBwxZlpIG5hdnJob3bDoW7DrSByeWLDrWNoIHDFmWVjaG9kxa8uIFR5dG8gc2Nob3Bub3N0aSBzZSBtxJtuw60gbmFwxZnDrcSNIGRydWh5LCBhbGUgaSBzIHZlbGlrb3N0w60gcnlieSwgbmVibyBzY2hvcG5vc3TDrSBpbmRpdmlkdWEuIFtLUlBdKGh0dHBzOi8vZG90YWNlLm5hdHVyZS5jei93ZWIvY3ovb2Rib3JuYS1za3VwaW5hLWtvbWlzZS1wcm8tcnliaS1wcmVjaG9keSkgLSBvZGJvcm7DoSBza3VwaW5hIEFPUEssIHrFmcOtemVuw6EgayDFmWXFoWVuw60gcHJvYmxlbWF0aWt5IG1pZ3JhxI1uw60gcHJvc3R1cG5vc3RpIHZvZG7DrWNoIHRva8WvLiBTb3XEjcOhc3TDrSB6YXNlZMOhbsOtIHTDqXRvIGtvbWlzZSBqc291IGkgaG9kbm9jZW7DrSBwxZlpcHJhdm92YW7DvWNoIHByb2pla3TFrywga2RlIHNlIMSNbGVub3bDqSB2eWphZMWZdWrDrSBrIGplZG5vdGxpdsO9bSBwYXJhbWV0csWvbSBwbMOhbm92YW7DqSBzdGF2YnkuIFJ5Y2hsb3N0IHByb3VkdSBqZSBqZWRuw61tIHogbmljaC4NCg0KIyMjIERhdGENCg0KYGBge3IgdmVrdG9yeX0NCg0KIyMjIyAtLS0tLS0tLSAgVlNUVVBOw40gREFUQSAtLS0tLS0tLS0gIyMjIyMNCg0KZHJ1aD1jKCJwc3RydWhfbyIsInN0cmV2bGVfcCIsInZyYW5rYV9vIiwidnJhbmthX3AiLCJqZWxlY190Iiwib3N0cm9yZXRrYV9zIiwNCiAgICAgICAicGFybWFfbyIsImNlam5fdiIsIm1uaWtfaiIsIm1paHVsZV9wIiwidWhvcl9vIiwiamVsZWNfcCIsInBsb3RpY2VfbyIsDQogICAgICAgImxpcGFuX3AiLCJocm91emVrX28iLCJtcmVua2FfbSIpDQoNCnZlbGlrb3N0PWMoMzAsNyw4LDgsMzAsMzAsMzUsMjUsNTAsMTgsMjAsMjAsMjAsMjAsMTIuMyw3LjIpDQoNCnNfcnljaGxvc3Q9YygzLjEsMS4xLDAuNiwwLjYsMS41LDEuNiwxLjgsMC42LDEuMywwLjUsMS4xNSwNCiAgICAgICAgICAgICAxLjUxLDEuNDcsMS42NiwxLjE4LDAuODQpDQoNCiNtX3J5Y2hsb3N0X25vcm1hID0gYygwLjc1LDAuNTUsMCwwLDAuOCwwLjg1LDAuOSwwLjUsMC44LA0KIyAgICAgICAgICAgICAgICAgICAgIDAuNSkNCg0KaW50ZXJ2YWxzPXNlcShmcm9tPW1pbihzX3J5Y2hsb3N0KS0wLjAwMSx0byA9IG1heChzX3J5Y2hsb3N0KSswLjAwMSwNCiAgICAgICAgICAgICAgbGVuZ3RoLm91dCA9IGxlbmd0aChkcnVoKSkgIyBKZSB2aG9kbsSbasWhw60gZMSbbGl0IG5hIGludGVydmFseSByeWNobG9zdCByeWIgbmVibyAwLTQ/IC4uLiB2aXogxZnDoWRlayBuw63Fvg0KDQojaW50ZXJ2YWxzPXNlcShmcm9tPSAwICx0byA9IDQgLGxlbmd0aC5vdXQgPSBsZW5ndGgoZHJ1aCkpDQoNCg0KIyMjIyAtLS0tLS0tLSDDmlBSQVZZIERBVCAtLS0tLS0tLS0gIyMjDQoNCiMgRGF0YSBwcm8gZ3JhZiBuYSB6w6FrbGFkxJsgZGF0IHogbm9ybXkNCmludGVydmFsc19ub3JtYT1zZXEoZnJvbT1taW4oc19yeWNobG9zdCktMC4wMDEsdG8gPSBtYXgoc19yeWNobG9zdCkrMC4wMDEsDQogICAgICAgICAgICAgICAgICAgIGxlbmd0aC5vdXQgPSAxMCkNCg0KcGNfZHJ1aHVfbm9ybWE9TlVMTA0KZm9yIChpIGluIDE6MTApew0KICBwY19kcnVodV9ub3JtYVtpXT1zdW0oc19yeWNobG9zdFsxOjEwXT5pbnRlcnZhbHNfbm9ybWFbaV0pDQogICNwcmludChpKQ0KfQ0KDQoNCiMgRGF0YSBwcm8gR3JhZiBwcm9jZW50dcOhbG7DrWhvIHphc3RvdXBlbsOtIHbFoWVjaCBkcnVoxa8gdiBkYXRhc2V0dQ0KDQpwY19kcnVodT1OVUxMDQpmb3IgKGkgaW4gMTpsZW5ndGgoZHJ1aCkpew0KICBwY19kcnVodVtpXT1zdW0oc19yeWNobG9zdD5pbnRlcnZhbHNbaV0pDQogICNwcmludChpKQ0KfQ0KDQojIHByb2NlbnR1w6FsbsOtIHphc3RvdXBlbsOtIG1ub8W+c3R2w60gZHJ1aMWvDQpwcmNfZHJ1aHU9KHBjX2RydWh1L2xlbmd0aChkcnVoKSkqMTAwICANCg0KDQpgYGANCg0KUHJ2bsOtY2ggMTAgcnliIGplIHogbm9ybXkgcHJvIHN0YXbEm27DrSByeWLDrWNoIHDFmWVjaG9kxa8sIHpieXRlayBqZSB6IGxpdGVyYXR1cnkgKHNrb2tvdsOhIHJ5Y2hsb3N0IDExLiAtIDE2LiBkcnVodSBqZSB6esOtc2vDoW5hIHogcHVibGlrYWNlOiBNSUdSQUNFIFJZQiwgUllCw40gUMWYRUNIT0RZIEEgWlDFrlNPQiBKRUpJQ0ggVEVTVE9Ww4FOw40gKFNsYXbDrWsgTy4gVmFuxI11cmEgWi4gYSBrb2wuIDIwMTIpLCBrdGVyw6EgY2l0dWplIGRhbMWhw60gYXV0b3J5KSAuIFBva3VkIGplIHYgbm9ybcSbIHV2ZWRlbiBpbnRlcnZhbCBqZSB2xb5keSBwb8SNw610w6FubyBzIG5lam5pxb7FocOtIHV2ZWRlbm91IHJ5Y2hsb3N0w60uIFplIHNrb2tvdsOpIHJ5Y2hsb3N0aSBqZSBwb8SNw610w6FubyBrb2xpayByeWLDrWNoIGRydWjFryBqZSBqZcWhdMSbIHNjaG9wbm8gcMWZZWtvbmF0IGRhbm91IHJ5Y2hsb3N0IHByb3VkdSByb3pkxJtsZW5vdSBkbyBgciBsZW5ndGgoaW50ZXJ2YWxzKWAgaW50ZXJ2YWzFryBtZXppIG1pbmltw6FsbsOtIGEgbWF4aW3DoWxuw60gc2tva292b3UgcnljaGxvc3TDrS4NCg0KKE3Em2wgYnljaCBwb3DFmWVtw73FoWxldCBqZXN0bGkgdnlyb3ZuYXQgc2UgcnljaGxvc3RpIHByb3VkdSB6bmFtZW7DoSBqaSBwxZlla29uYXQpDQoNCg0KYGBge3IgZGF0YWZyYW1lfQ0KcnlieT1kYXRhLmZyYW1lKA0KICBkcnVoLA0KICBzX3J5Y2hsb3N0LA0KICB2ZWxpa29zdA0KICApDQoNCnJ5YnkNCmBgYA0KDQojIyMgR3JhZnkNCmBgYHtyIGdyYWZ5LCBmaWcuY2FwPSAiR1JBRiJ9DQoNCnBsb3QocGNfZHJ1aHVfbm9ybWF+aW50ZXJ2YWxzX25vcm1hLA0KICAgICBtYWluID0gYygiWsOhdmlzbG9zdCBwb8SNdHUgZHJ1aMWvIHJ5YiBaIE5PUk1ZIG5hIHJ5Y2hsb3N0aSBwcm91ZHUsIiwia3Rlcm91IGpzb3UgamXFoXTEmyBzY2hvcG55IHDFmWVrb25hdCIpLA0KICAgICB5bGFiID0gIlBvxI1ldCBkcnVoxa8iLA0KICAgICB4bGFiID0gIlJ5Y2hsb3N0IHByb3VkdSB2IG0vcyIsDQogICAgIHR5cGUgPSAiYiINCiAgICAgICApDQphYmxpbmUodj1jKDEsMS4yKSwgY29sPWMoImdyZWVuIiwicmVkIikpDQoNCnBsb3QocHJjX2RydWh1fmludGVydmFscywNCiAgICAgbWFpbiA9IGMoIlrDoXZpc2xvc3QgcG/EjXR1IGRydWjFryByeWIgbmEgcnljaGxvc3RpIHByb3VkdSwiLCJrdGVyb3UganNvdSBqZcWhdMSbIHNjaG9wbnkgcMWZZWtvbmF0IiksDQogICAgIHlsYWIgPSAiUG/EjWV0IGRydWjFryBbJV0iLA0KICAgICB4bGFiID0gIlJ5Y2hsb3N0IHByb3VkdSB2IG0vcyIsDQogICAgIHR5cGUgPSAibCINCiAgICAgICApDQphYmxpbmUodj1jKDEsMS4yKSwgY29sPWMoImdyZWVuIiwicmVkIikpDQoNCmBgYA0KDQoNCiMjIEhvZG5vY2Vuw60gZnJhZ21lbnRhY2UgbmEgesOha2xhZMSbIERDSSB7LnRhYnNldH0NCg0KIyMjIMOadm9kDQoNCkluZGV4IERDSSAoRGVuZHJpYyBjb25lY3Rpdml0eSBpbmRleCkgaG9kbm90w60gbcOtcnUgZnJhZ21lbnRhY2UgZm9ybW91IHByYXZkxJtwb2RvYm5vc3RpIHMgamFrb3UgamUgb3JnYW5pc211cyBzY2hvcGVuIHNlIGRvc3RhdCB6IGplZG5vaG8gbsOhaG9kbsOpaG8gbcOtc3RhIG5hIHRva3UgZG8gbcOtc3RhIGRydWjDqWhvLiBKZSBzY2hvcG7DvSBob2Rub3RpdCDFmcOtxI1uw60gc8OtdMSbLCBwcsWvY2hvZG5vc3QgcMWZZWvDocW+ZWsgbmVibyByb3pkw61seSBtZXppIHBvdGFtb2Ryb21uw60gYSBhbmFkcm9tbsOtIG1pZ3JhY8OtLiBQb2Ryb2JuxJsgamVqIHBvcGlzdWplIG7DoXNsZWR1asOtY8OtIMSNbMOhbmVrOiBbQSBuZXcgbWVhc3VyZSBvZiBsb25naXR1ZGluYWwgY29ubmVjdGl2aXR5IGZvciBzdHJlYW0gbmV0d29ya3NdKGh0dHBzOi8vbGluay5zcHJpbmdlci5jb20vYXJ0aWNsZS8xMC4xMDA3L3MxMDk4MC0wMDgtOTI4My15KS4NCg0KVGVudG8gaW5kZXggamUgemFsb8W+ZW4gbmEgamVkbm9kdWNow6ltIHZ6b3JjaToNCiFbVnpvcmVjXShgciBwYXN0ZTAod2QsIi9Wem9yZWNfRENJLkpQRyIpYCkNCg0KSyBqZWhvIHbDvXBvxI10dSBqZSBtb8W+bsOpIHBvdcW+w610IG7DoXN0cm9qIFtGSVBFWF0oaHR0cHM6Ly9nb2xkZm9yZC5naXRodWIuaW8vRklQRVhfd2l0aF9EQ0lfV2Vic2l0ZS8pLCBuZWJvIFIgcGFja2FnZSBzIG7DoXp2ZW0gIltkY2ldKGh0dHBzOi8vZ2l0aHViLmNvbS9hYXJraWxhbmlhbi9kY2kpIi4gDQoNCiMjIyBQb3BpcyBiYWzDrcSNa3UgZGNpDQoNCg0KDQojIyMgVWvDoXprYSBmdW5rY2UNCg0KDQojIyBEYXRhYsOhemUgcHJvZmlsdSwga3RlcsOpIMWhbHkgbmEgS1JQLCBhIG1vbml0b3JpbmfFryBuYSBSUCB7LnRhYnNldH0NCg0KIyMjIMOadm9kDQoNCioqUG9waXMgZGF0YWLDoXplKioNClN0cnVrdHVyYSwga3Rlcm91IG3DoW0gYWt0dcOhbG7EmyB2IGhsYXbEmyBqZSBwb3Bzw6FuYSBuw6FzbGVkdWrDrWPDrW0gcm96cHJhY292YW7DvW0gW0VSIGRpYWdyYW1lbV0oaHR0cHM6Ly9jb2xsYm9hcmQuY29tL216c214dmtvZTRzYWZ0bWQzeW1uKS4gSnNvdSB0YW0gdXZlZGVueSBuw6F6dnkgdGFidWxlaywga3RlcsOpIGJ5IGRsZSBtw6lobyBtxJtseSBvYnPDoWhub3V0IGNlbG91IMWhw63FmWkgcG/FvmFkb3ZhbsO9Y2ggZGF0LiBOw6F6dnkgc2xvdXBjxa8ganNvdSBzcMOtxaFlIG9yaWVudGHEjW7DrSAoYWt0dcOhbG7EmyB2IMWZZcWhZW7DrSkuDQoNCktvbnp1bHRvdmFsIGpzZW0sIGtkZSBieSBzZSB0eXRvIGRhdGEgZGFseSB1Y2hvdmF0LCBhYnkgYnlseSBkb3N0dXBuw6kgYSBrIGJ1ZG91Y8OtbXUgdcW+aXTDrS4gRG/FoWVsIGpzZW0gayBuw6F6b3J1LCDFvmUgaWRlw6FsbsOtIGJ5IGJ5bG8gc3Bvaml0IHR1dG8gZGF0YWLDoXppIHMgZGF0YWLDrXrDrSBtaWdyYcSNbsOtY2ggYmFyacOpciwgY2/FviBieSBtb2hsbyB6w6Fyb3ZlxYggcHJvYsSbaG5vdXQgcyBqZWrDrSBwbMOhbm92YW5vdSBha3R1YWxpemFjw60uDQoNCioqUMWZw61ub3N5KioNCi0gRWxla3Ryb25pemFjZSB6w6F6bmFtxa8gamVkbsOhbsOtIEtSUC4NCi0gUm96xaHDrcWZZW7DrSBkYXRhYsOhemUgbWlncmHEjW7DrWNoIGJhcmnDqXIgbyB6YWrDrW1hdsOpIGEgamnFviBuYXNiw61yYW7DoSBhbGUgaSB2IGJ1ZG91Y251IHrDrXNrYW7DoSBkYXRhIC0gayB6b2JyYXplbsOtLCDEjWkgYW5hbMO9esOhbS4NCg0KKipWw71zdHVweSoqDQotIHpvYnJhemVuw60gbsSba3RlcsO9Y2ggaW5mb3JtYWPDrSB2IGRhdGFiw6F6aSBtaWdyYcSNbsOtY2ggYmFyacOpcg0KLSBtb8W+bm9zdCB6b2JyYXplbsOtIGEgc3Rhxb5lbsOtIGRhdCBwcm8gcHJhY292bsOta3kgQU9QSw0KLSBUcmFuc2ZlciBtb25pdG9yaW5nxa8gZG8gTkRPUA0KDQoqKlZzdHVweSoqDQotIEltcG9ydCBzaHJvbcOhxb5kxJtuw71jaCBkYXQgcMWZaSB6YWxvxb5lbsOtDQotIEZvcm11bMOhxZkgeiBqZWRuw6Fuw60gS1JQDQoNCiMjIyBGeXppY2vDoSBEYXRhDQoNClYgdMOpdG8ga2FwaXRvbGUganNvdSB2eXR2b8WZZW55IHRhYnVsa3kgcHJvIHpuw6F6b3JuxJtuw60gZG9zdHVwbm9zdGkgcGFyYW1ldHLFryB2IGplZG5vdGxpdsO9dmggemRyb2rDrWNoIGRhdCwgUG9waXMgemRyb2rFryBkYXQgamUgZMOhbGUgdXDFmWVzbsSbbiB2IHNhbW9zdGF0bsO9Y2gga2FwaXRvbMOhY2guDQpWIHRhYnVsa8OhY2gganNvdSB1dmVkZW55IGhvZG5vdHkgcyBuw6FzbGVkdWrDrWPDrW0gdsO9em5hbWVtOg0KDQoqIDEgLSBpbmZvcm1hY2UgdHUgamUNCiogMCw5OSAtIGluZm9ybWFjZSBqZSBhbGUgbmV2w60gc2Uga2RlDQoqIDAsNSAtIGluZm9ybWFjZSBvYsSNYXMgamUNCiogMCAtIGluZm9ybWFjZSBuZW7DrQ0KKiBBIC0gaW5mb3JtYWNlIGplIGFsZSBuZXZ5Y2jDoXrDrSB6IHTEm2NodG8gbWF0ZXJpw6Fsxa8NCiogTiAtIGluZnJvbWFjZSBuZW7DrSBhIG5lbcWvxb5lIHZ5Y2jDoXpldCB6IHTEm2NodG8gbWF0ZXJpw6Fsxa8NCiogTkEgLSBOZXprb250cm9sb3bDoW5vDQoNCmBgYHtyIGRhdGEtYXZhaWxhYmlsaXR5fQ0KIyBMaXN0IG7DoXp2xa8gc2xvdXBjxa8gamVkbm90bGl2w71jaCB0YWJ1bGVrDQoNCmR0YV9Qcml0b21uaV9jbGVub3ZlIDwtIGMoIklkX2plZG5hbmkiLCJjbDFfWmRlbmVrTXlzbGlrIiwiY2wyX1pkZW5la19Wb2dsIiwiY2wzX05pa29sYUtvZmVudG92YSIsImNsNF9QYXZlbE1hcmVrIiAgICAgICAgLCJjbDVfTWlsb3NIb2x1YiIsImNsNl9QYXZlbFZyYW5hIiwiY2w3X0ppcmlNdXNpbCIsImNsOF9LYW1pbEZhcnNreSIsImNsOV9QZXRySGFydGljaCIsImNsMTBfS2FyZWxWcmFuYSIsImNsMTFfUmFka2FKYWtvdWJrb3ZhIiwiY2wxMl9KYW5Lb3V0bnkiLCJjbDEzX1JvbWFuWmFqaWNlayIsImNsMTRfSmlyaU5ldWRlcnQiLCJjbDE1X1RvbWFzQmFydHVzZWsiLCJjbDE2X01hcnRpbkNhcGVrIiwiY2wxN19QYXZlbE1vcmF2ZWMiKQ0KZHRhX0plZG5hbmlfa29taXNlIDwtIGMoIklkX2plZG5hbmkvSWRfcmFka3U/IiwiSWRfcHJla2F6a3kiLCJJZF9SUCIsIkRhdHVtIiwiUG9jZXRfY2xlbnUiLCJOYXpldl9wcm9maWx1IiwiSm1lbm9fcHJlZHNlZHkiLCJKbWVub190YWplbW5pa2EiLCJPZGthel9uYV9kb2t1bWVudD8iLCJDaXNsb19qZWRuYW5pID0gaWQ/IiwiUHJlemVudHVqaWNpIiwiUHJvamVrdGFudCIsIk9iamVkbmF0ZWwiLCJUeXBfcHJvamVkbmFuaV8hKHBlci1yb2xhbSkiLCJWeWplemRuaV92YXJpYW50YT8hIiwiTmF2ZXJob3ZhbmVfcGFyYW1ldHJ5X1JQPyIpDQpkdGFfUHJpY25hX3ByZWthemthIDwtIGMoIklkX3ByZWthemt5IiwiVHlwX3ByZWthemt5IiwiVG9rIiwiUmljbmlfa20iLCJQcml0b21ub3N0X1JQIiwiR1BTX1ByZWthemt5IiwiUG92b2RpIiwiTWFqaXRlbF9zdGF2Ynk/IiwiUHJpdG9tbm9zdF9NVkUiLCJ6cHVzb2Jfb2NocmFueV9NVkU/IiwiVHlwX01WRT9fZGFsc2lfbXZlX3ZlY2k/IiwiVG9rX0tvbmNlcGNlIiwiUnliaV9wYXNtb19va29saSIsIk1aUD8iLCJLYXRhc3RyIiwiWkNIw5o/IikNCmR0YV9SeWJpX3ByZWNob2QgPC0gYygiSWRfUFIiLCJJZF9wcmVrYXpreSIsIlR5cF9SUCIsIkRlbGthX1JQIiwiU2tsb25fUlAiLCJHUFNfUlBfX18/X19fIiwiUHJvdm96b3ZhdGVsIiwiWnJpem92YXRlbCIsIlByb2pla3RhbnQiLCJwcm92ZWRlbmlfbW9uaXRvcmluZ3UiLCJaZHJval9wZW5lej8iLCJPYmVjX3NfUm96xaFpcmVub3VfUCIpDQpkdGFfTW9uaXRvcmluZ19SUCA8LSBjKCJJZF9QUiIsIk9ka2F6X25hX3BkZiIsIlBvY2V0X2RydWh1IiwixZhlxaFpdGVsIiwiWmFkYXZhdGVsIiwiWnB1c29iX21vbml0b3Jpbmd1IiwiUHJpdG9tbm9zdF9jaHJhbmVueWNoX2RydWh1IiwiUHJpdG9tbm9zdF9kcnVodSIpDQpkdGFfRHJ1aHkgPC0gYygiIV9fWmppxaF0xJtuw6kgZHJ1aHkgYSBqZWppY2ggcG/EjXR5X18hIikNCmR0YV9WbGFzdG5vc3RpX2RydWh1IDwtIGMoIlJ5YmlfcGFzbW8iLCJTa29rb3ZhX3J5Y2hsb3N0IiwiTWF4aW1hbG5pX3J5Y2hsb3N0IiwiVHlwKHk/KV9taWdyYWNlIiwiU3R1cGVuX29ocm96ZW5pX3ZfQ1IiKQ0KDQpkdGFfbGlzdF92ZWt0b3JzX0NvbE5hbWVzIDwtIGxpc3QoUHJpdG9tbmlfY2xlbm92ZSA9IGR0YV9Qcml0b21uaV9jbGVub3ZlICxKZWRuYW5pX2tvbWlzZSA9IGR0YV9KZWRuYW5pX2tvbWlzZSxQcmljbmFfcHJla2F6a2EgPSBkdGFfUHJpY25hX3ByZWthemthLFJ5YmlfcHJlY2hvZCA9IGR0YV9SeWJpX3ByZWNob2QsTW9uaXRvcmluZ19SUCA9IGR0YV9Nb25pdG9yaW5nX1JQLERydWh5ID0gZHRhX0RydWh5LFZsYXN0bm9zdGlfZHJ1aHUgPSBkdGFfVmxhc3Rub3N0aV9kcnVodSkNCg0KIyBWZWt0b3IgemRyb2rFryBkYXQNCmR0YV9aZHJvamVfZGF0IDwtIGMoIlBhcGlyIiwiUGF2ZWxfTSIsIk9QWlBfYV9QUlpTIiwiRXhjZWwiLCJTX2Rpc2siLCJETUIiKQ0KDQojIExpc3QgdGFidWxlayANCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkgPC0gTlVMTA0KICANCmZvciAoaSBpbiAxOjcpIHsNCiAgbWF0IDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKGR0YV9saXN0X3Zla3RvcnNfQ29sTmFtZXNbW2ldXSksbnJvdyA9IGxlbmd0aCAoZHRhX1pkcm9qZV9kYXQpKQ0KICBjb2xuYW1lcyhtYXQpIDwtIGR0YV9saXN0X3Zla3RvcnNfQ29sTmFtZXNbW2ldXQ0KICByb3duYW1lcyhtYXQpIDwtIGR0YV9aZHJvamVfZGF0DQogIGR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkgW1tpXV0gPC0gYXMuZGF0YS5mcmFtZShtYXQpDQp9DQoNCm5hbWVzKGR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkpIDwtIG5hbWVzKGR0YV9saXN0X3Zla3RvcnNfQ29sTmFtZXMpDQoNCiMgVnlwbG7Em27DrSBwxZnDrXRvbW7DvWNoIMSNbGVuxa8gLi4uIENoeWLDrSBFWENFTCEhDQpkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5JFByaXRvbW5pX2NsZW5vdmVbMTo1LDFdPSAiQSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkUHJpdG9tbmlfY2xlbm92ZVsxLDI6MThdPSAiMC41Ig0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRQcml0b21uaV9jbGVub3ZlWzIsMjoxOF09ICIwLjUiDQpkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5JFByaXRvbW5pX2NsZW5vdmVbMyxdPSAiTiINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkUHJpdG9tbmlfY2xlbm92ZVs0LDI6MThdPSAiTkEiDQpkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5JFByaXRvbW5pX2NsZW5vdmVbNSwyOjE4XT0gIjAuNSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkUHJpdG9tbmlfY2xlbm92ZVs2LF09ICJOIg0KDQojIFZ5cGxuxJtuw60gSmVkbsOhbsOtDQpkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5JEplZG5hbmlfa29taXNlWzE6NiwxXSA9ICJBIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVsxOjUsMl0gPSAiQSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2VbNiwyXSA9ICIxIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVsxOjYsM10gPSAiQSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2VbMToyLDRdID0gIjEiDQpkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5JEplZG5hbmlfa29taXNlWzUsNF0gPSAiMSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2VbNiw0XSA9ICJBIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVssNV0gPSBkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5JFByaXRvbW5pX2NsZW5vdmVbLDJdDQpkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5JEplZG5hbmlfa29taXNlWzE6Niw2XSA9ICIxIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVsxOjUsN10gPSAiMSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2VbNCw3XSA9ICJOQSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2VbNiw3XSA9ICJBIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVsxOjUsOF0gPSAiMC45OSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2VbNiw4XSA9ICJBIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVsxOjYsOV0gPSAiQSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2VbMTo1LDEwXSA9ICIxIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVs2LDEwXSA9ICJBIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVsxLDExOjEzXSA9ICIxIg0KZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eSRKZWRuYW5pX2tvbWlzZVsxLDE1XSA9ICJOQSINCmR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2VbLDE2XSA9IGR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHkkSmVkbmFuaV9rb21pc2UgWyw0XQ0KDQpgYGANCg0KKipQxZjDjVRPTU7DjSDEjExFTk9Ww4kqKg0KYGBge3IgZGF0YS1hdmFpbGFiaWxpdHktQVRFTkRBTlRTfQ0Ka25pdHI6OmthYmxlKGR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHlbMV0pDQpgYGANCg0KKipKRUROw4FOw40gS1JQKioNCg0KYGBge3IgZGF0YS1hdmFpbGFiaWxpdHktU0VTU0lPTn0NCmtuaXRyOjprYWJsZShkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5WzJdKQ0KYGBgDQoNCioqUMWYw43EjE7DgSBQxZhFS8OBxb1LQSBOQSBUT0tVKioNCg0KYGBge3IgZGF0YS1hdmFpbGFiaWxpdHktQkFSUklFUn0NCmtuaXRyOjprYWJsZShkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5WzNdKQ0KYGBgDQoNCioqUllCw40gUMWYRUNIT0QqKg0KDQpgYGB7ciBkYXRhLWF2YWlsYWJpbGl0eS1GSVNILVBBU1NBR0V9DQprbml0cjo6a2FibGUoZHRhX2xpc3RfdGFibGVzX0NvbEF2YWlsaWJpbGl0eVs0XSkNCmBgYA0KDQoqKk1PTklUT1JJTkcqKg0KDQpgYGB7ciBkYXRhLWF2YWlsYWJpbGl0eS1NT05JVE9SSU5HfQ0Ka25pdHI6OmthYmxlKGR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHlbNV0pDQpgYGANCg0KDQoqKkRSVUhZKioNCg0KYGBge3IgZGF0YS1hdmFpbGFiaWxpdHktRklTSEVTfQ0Ka25pdHI6OmthYmxlKGR0YV9saXN0X3RhYmxlc19Db2xBdmFpbGliaWxpdHlbNl0pDQpgYGANCg0KKipWTEFTVE5PU1RJIERSVUjFrioqDQoNCmBgYHtyIGRhdGEtYXZhaWxhYmlsaXR5LUFCSUxJVElFU30NCmtuaXRyOjprYWJsZShkdGFfbGlzdF90YWJsZXNfQ29sQXZhaWxpYmlsaXR5WzddKQ0KYGBgDQoNCg0KIyMjIERhdGEgLSBwYXDDrXINCkRhdGEgdWxvxb5lbsOhIHZlIHNsb8W+a8OhY2ggdiBwYXDDrXJvdsOpIHBvZG9ixJsNCg0KKiBLZGU6IEthbmNlbGHFmSAtIFBNLCBaZGVuxJtrIC0ga2FuY2wsIFBvbGljZSB2IGFyY2hpdnUsIFphc2VkYcSNa2EgU09QSywgS2FuY2Vsw6HFmSBKaXRrYSBLLiArIHNrxZnDrcWIIHYgY2hvZGJpxI1jZSANCiogU3R5xI1uw6Egb3NvYmE6IFBhdmVsIE1hcmVrDQoqIE9kIGtkeSBkbyBrZHk6IGRvIDIwMDggKy0NCiogVHlweSBkb2t1bWVudMWvOiBQxZlpaGzDocWha3kgS1JQIChqZSB2xb5keSEgb2LEjWFzIG3Fr8W+ZSB6xa9zdGF0IG5hIHJlZ2lvbnUsIGFsZSBvZCAyMDA4LTIwMTYgZXhpc3RvdmFsbyAiUHJvamVkbsOhdsOhbm8gZG5lIikgOyBQb3p2w6Fua3k7IE1haWx1OyBTdGFub3Zpc2thOyBQcm9qZWt0b3bDvWNoIGRva3VtZW50YWPDrQ0KKiDEjMOtc2xvIGplZG7DoW7DrToNCg0KIyMjIERhdGEgLSBQYXZlbCBNIC8gLi4uDQpEYXRhIG5hIGhhcmQtZGlza3UgUEMgUGF2bGEgTWFya2EgLSBkb3BsbsSbbm8gYXJjaGl2ZW0gbWFpbHUgYSBwYXDDrXJvdsO9bWEgc2xvxb5rYW1hDQoNCiogS2RlOiBQQyBQYXZlbCBNYXJlaywgYXJjaGl2IG1haWx1LCBwYXDDrXJvdsO9IHNsb8W+a3ksIG3Fr8W+ZSBiw710IG5hIFMgdSBKaXJreQ0KKiBTdHnEjW7DoSBvc29iYTogUGF2ZWwgTWFyZWssIEppcmthIFBldMWZaXZhbHNrw70NCiogT2Qga2R5IGRvIGtkeTogMjAwOCAtIDIwMTYNCiogVHlweSBkb2t1bWVudMWvOiBTbG/Fvmt5IGpha28gbmEgUyBueW7DrQ0KKiDEjMOtc2xvIGplZG7DoW7DrToNCg0KIyMjIERhdGEgLSBQUsWYUyBhIE9Qxb1QIA0KRGF0YSBzYW1vc3RhdG7EmyBldmlkb3ZhbsOpIChjY2EgMjAtMzAgUlAgdiBQUsWYUykgLSBPUMW9UCBhIFBSxZhTIHNlIHbEm3TFoWlub3UgZHVwbGlrdWrDrSBzIGtvbWlzw60sIHRha8W+ZSB0byBidWRlIG5lanNww63FoSBqaW5kZS4NCg0KKiBLZGU6IFBvZGxlIHJva3UgYnVkZSB1bG/FvmVuw70gZGxlIHRhamVtbsOta2ENCiogU3R5xI1uw6Egb3NvYmE6IHbFoWljaG5pIHRhamVtbsOtY2kNCiogT2Qga2R5IGRvIGtkeTogb2QgMTk5NiBhIG9kIDIwMDgNCiogVHlweSBkb2t1bWVudMWvOiBwb2RsZSB0YWplbW7DrWthICsgaW5mbyBvIGRvdGFjaQ0KKiDEjMOtc2xvIGplZG7DoW7DrToNCg0KIyMjIERhdGEgLSBleGNlbA0KRGF0YSB2ZSAoZHZvdSkgZXhjZWxvdsO9Y2ggdGFidWxrw6FjaA0KDQoqIEtkZTogTsSba2RlIHUgUGF2bGEgdiBQQyAobcWvxb5vdSBiw710IHZlcnplKQ0KKiBTdHnEjW7DoSBvc29iYTogUGF2ZWwgTWFyZWssIFpkZW7Em2sgVm9nbA0KKiBPZCBrZHkgZG8ga2R5OiBjY2EgZG8gMjAxMCwgZHLFr2jDoSBtb8W+bsOhIG9kIFpkZcWIa2ENCiogVHlweSBkb2t1bWVudMWvOiBFeGNlbG92w6EgdGFidWxrYQ0KKiDEjMOtc2xvIGplZG7DoW7DrToNCg0KIyMjIERhdGEgLSBTDQpEYXRhIHZlIHNsb8W+a8OhY2ggbmEgUy9vYi9vZGQvS1JQDQoNCiogS2RlOiBzcG9sZcSNbsO9IGRpc2sgUw0KKiBTdHnEjW7DoSBvc29iYTogUGF2ZWwgTWFyZWssIFpkZW7Em2sgVm9nbA0KKiBPZCBrZHkgZG8ga2R5OiAyMDE2IC0gMjAyMw0KKiBUeXB5IGRva3VtZW50xa86ICoqLi4uKioNCiogxIzDrXNsbyBqZWRuw6Fuw606DQoNCiMjIyBEYXRhIC0gRE1CDQpEYXRhIHYgZGF0YWLDoXppIG1pZ3JhxI1uw61jaCBiYXJpw6lyIC0gdMWZw616ZW7DqSBwb2RsZSDFmS4ga20gLSBrdGVyw70ga20gdsOtIFpkZW7Em2sgSy4NCg0KKiBLZGU6ICoqLi4uKioNCiogU3R5xI1uw6Egb3NvYmE6IFpkZW7Em2sgS3XEjWVyYSwgTmlrb2xhIEtvZmVudG92w6EsIChaZGVuxJtrIFZvZ2wpDQoqIE9kIGtkeSBkbyBrZHk6IG1hcG92w6FubyAyMDE3LCBha3R1YWxpemFjZSAuLi4gYnVkZQ0KKiBUeXB5IGRva3VtZW50xa86IGRhdGFiw6F6ZQ0KKiDEjMOtc2xvIGplZG7DoW7DrToNCg==