Data from Busola Electorala between 11 Nov 2016 - 21 Nov 2016

This document provides descriptive statistics, offering an overwiew of the data we collected through https://pressone.ro/busola/.

The document unfolds as follows:

In the top right, there’s a button called Code. If you press Hide All Code, the R code will disappear and you are left with the results. I suggest doing that, it’s easier to read.

library(foreign)
ro <- read.csv("C:/Users/Irina/Desktop/ro2016vaa/Romania 21.11.csv", header = TRUE)

First things first: we want to know how many people went through all 30 statements. We discard the others.

ro <- subset(ro, answered_all_statements != 0)
length(ro$answered_all_statements)
[1] 10402

That leaves us with 10.402 people who were able to see their position in the political landscape after going through all statements. You can your position even if you fill out the tool partially, but the results won’t be accurate.
All the analysis from now on is based on this sample of 10.402.

Let’s see where the users come from:
This is additional data we collect, not asked in the survey

ro$country[ro$country==""] <- NA
table(ro$country)

                                      Algeria                 Angola              Australia                Austria 
                     0                      1                      1                      5                     32 
               Belarus                Belgium Bosnia and Herzegovina               Bulgaria               Cameroon 
                     1                     88                      0                      7                      1 
                Canada             Cape Verde               Colombia                Croatia                 Cyprus 
                    28                      1                      2                      2                      1 
        Czech Republic                Denmark                Finland                 France                Germany 
                    11                     33                      2                     97                    158 
                Greece               Guernsey              Hong Kong                Hungary                Iceland 
                     0                      1                      2                     21                      2 
                 India              Indonesia                Ireland                 Israel                  Italy 
                     4                      1                     12                      0                     41 
                 Japan                Lebanon                Liberia          Liechtenstein             Luxembourg 
                     1                      1                      1                      1                      7 
             Macedonia               Malaysia                  Malta                 Mexico                 Monaco 
                     2                      1                      2                      1                      1 
               Morocco            Netherlands                Nigeria                 Norway                   Oman 
                     1                     63                      3                      5                      1 
                Poland               Portugal            Puerto Rico                  Qatar      Republic of Korea 
                    11                      9                      1                      2                      1 
 Republic of Lithuania    Republic of Moldova                Romania           Saudi Arabia                 Serbia 
                     2                      9                   9206                      0                      4 
             Singapore        Slovak Republic               Slovenia            South Sudan                  Spain 
                     3                      1                      3                      1                     28 
             Sri Lanka                 Sweden            Switzerland                 Taiwan               Thailand 
                     1                     22                     18                      1                      1 
                Turkey                Ukraine   United Arab Emirates         United Kingdom          United States 
                     2                      3                      3                    258                    105 
               unknown              Venezuela                Vietnam 
                    37                      1                      2 

Now, let’s move on to more interesting stuff:

Let’s have a look at the demographics. We ask these questions in the beginning of the tool, and quite a few people fill in this information. The variables are collected separatelly for people who took the survey on their phone, that’s why there are two variables for gender. You need to look at the last 2 rows, where coded 0 are females, code 1 are males.

ro$male <- ifelse(ro$background_question_0==0, 1,
           ifelse(ro$background_question_0==1, 0,
                NA))
   
ro$malem <- ifelse(ro$background_question_1_is_mobile==0, 1,
            ifelse(ro$background_question_1_is_mobile==1, 0,
                         NA))
ro$male[is.na(ro$male)] <- ro$malem[is.na(ro$male)]
table(ro$male)

   0    1 
1636 3507 

So there are 3507 men and 1636 women. This is quite normal, as men are more interested in politics than women.
Next, age. I’ll create age categories, 18-29 coded 1, 30-49 coded 2, 50-64 coded 3 and 65+ coded 4

ro$age <- 2016 - (ro$background_question_2 + 1910)
ro$age[ro$age < 18] <- NA
ro$age[ro$age >= 18 & ro$age <= 29] <- 1
ro$age[ro$age >= 30 & ro$age <= 49] <- 2
ro$age[ro$age >= 50 & ro$age <= 64] <- 3
ro$age[ro$age >= 65] <- 4
ro$agea <- 2016 - (ro$background_question_3_is_mobile + 1910)
ro$agea[ro$agea < 18] <- NA
ro$agea[ro$agea >= 18 & ro$agea <= 29] <- 1
ro$agea[ro$agea >= 30 & ro$agea <= 49] <- 2
ro$agea[ro$agea >= 50 & ro$agea <= 64] <- 3
ro$agea[ro$agea >= 65] <- 4
ro$age[is.na(ro$age)] <- ro$agea[is.na(ro$age)]
table(ro$age)

   1    2    3    4 
2279 2469  297   84 

I can make smaller age brackets if needed.
We move on to education 0 - no education, 1 - elementary school, 2 - high school, 3 - university degree, master and PhD, 4 - post doctoral studies

ro$edu <- ifelse(ro$background_question_4==0, 0, 
          ifelse(ro$background_question_4==1, 1,
          ifelse(ro$background_question_4==2, 2,
          ifelse(ro$background_question_4==4, 4,
          ifelse(ro$background_question_4=="Facultate\nMasterat/Doctorat", 3,
          ifelse(ro$background_question_4=="Posztgraduális végzettség ", 4,
                 NA))))))
ro$edum <- ifelse(ro$background_question_5_is_mobile==0, 0, 
           ifelse(ro$background_question_5_is_mobile==1, 1,
           ifelse(ro$background_question_5_is_mobile==2, 2,
           ifelse(ro$background_question_5_is_mobile==4, 4,
           ifelse(ro$background_question_5_is_mobile=="Facultate\nMasterat/Doctorat", 3,
           ifelse(ro$background_question_5_is_mobile=="Posztgraduális végzettség ", 4,
                 NA))))))
ro$edu[is.na(ro$edu)] <- ro$edum[is.na(ro$edu)]
table(ro$edu)

   0    1    2    3    4 
  17   61  988 3640  323 

As expected, mostly highly educated people.

Now, we can see the city where people intend to vote (for this type of election, you can only vote in the electoral circumscription you belong to, which is usually the hometown)

ro$location <- 0
ro$location[is.na(ro$background_question_8)] <- NA # overwrite 0's with NA's if background_question_8 is NA
ro$location[ro$background_question_8==0]  <- "Alba"
ro$location[ro$background_question_8==1]  <- "Arad"
ro$location[ro$background_question_8==2]  <- "Arges"
ro$location[ro$background_question_8==3]  <- "Bacau"
ro$location[ro$background_question_8==4]  <- "Bihor"
ro$location[ro$background_question_8==5]  <- "Bistrita-Nasaud"
ro$location[ro$background_question_8==6]  <- "Botosani"
ro$location[ro$background_question_8==7]  <- "Brasov"
ro$location[ro$background_question_8==8]  <- "Braila"
ro$location[ro$background_question_8==9]  <- "Bucuresti"
ro$location[ro$background_question_8==10] <- "Buzau"
ro$location[ro$background_question_8==11] <- "Caras-Severin"
ro$location[ro$background_question_8==12] <- "Calarasi"
ro$location[ro$background_question_8==13] <- "Cluj"
ro$location[ro$background_question_8==14] <- "Constanta"
ro$location[ro$background_question_8==15] <- "Covasna"
ro$location[ro$background_question_8==16] <- "Dambovita"
ro$location[ro$background_question_8==17] <- "Dolj"
ro$location[ro$background_question_8==18] <- "Galati"
ro$location[ro$background_question_8==19] <- "Giurgiu"
ro$location[ro$background_question_8==20] <- "Gorj"
ro$location[ro$background_question_8==21] <- "harghita"
ro$location[ro$background_question_8==22] <- "Hunedoara"
ro$location[ro$background_question_8==23] <- "Ialomita"
ro$location[ro$background_question_8==24] <- "Iasi"
ro$location[ro$background_question_8==25] <- "Ilfov"
ro$location[ro$background_question_8==26] <- "Maramures"
ro$location[ro$background_question_8==27] <- "Mehendinti"
ro$location[ro$background_question_8==28] <- "Mures"
ro$location[ro$background_question_8==29] <- "Neamt"
ro$location[ro$background_question_8==30] <- "Olt"
ro$location[ro$background_question_8==31] <- "Prahova"
ro$location[ro$background_question_8==32] <- "Satu Mare"
ro$location[ro$background_question_8==33] <- "Salaj"
ro$location[ro$background_question_8==34] <- "Sibiu"
ro$location[ro$background_question_8==35] <- "Suceava"
ro$location[ro$background_question_8==36] <- "Teleorman"
ro$location[ro$background_question_8==37] <- "Timis"
ro$location[ro$background_question_8==38] <- "Tulcea"
ro$location[ro$background_question_8==39] <- "Vaslui"
ro$location[ro$background_question_8==40] <- "Valcea"
ro$location[ro$background_question_8==41] <- "Vrancea"
ro$location[ro$background_question_8==42] <- "Strainatate"
ro$locationm <- 0
ro$locationm[is.na(ro$background_question_9_is_mobile)] <- NA # overwrite 0's with NA's if background_question_8 is NA
ro$locationm[ro$background_question_9_is_mobile==0]  <- "Alba"
ro$locationm[ro$background_question_9_is_mobile==1]  <- "Arad"
ro$locationm[ro$background_question_9_is_mobile==2]  <- "Arges"
ro$locationm[ro$background_question_9_is_mobile==3]  <- "Bacau"
ro$locationm[ro$background_question_9_is_mobile==4]  <- "Bihor"
ro$locationm[ro$background_question_9_is_mobile==5]  <- "Bistrita-Nasaud"
ro$locationm[ro$background_question_9_is_mobile==6]  <- "Botosani"
ro$locationm[ro$background_question_9_is_mobile==7]  <- "Brasov"
ro$locationm[ro$background_question_9_is_mobile==8]  <- "Braila"
ro$locationm[ro$background_question_9_is_mobile==9]  <- "Bucuresti"
ro$locationm[ro$background_question_9_is_mobile==10] <- "Buzau"
ro$locationm[ro$background_question_9_is_mobile==11] <- "Caras-Severin"
ro$locationm[ro$background_question_9_is_mobile==12] <- "Calarasi"
ro$locationm[ro$background_question_9_is_mobile==13] <- "Cluj"
ro$locationm[ro$background_question_9_is_mobile==14] <- "Constanta"
ro$locationm[ro$background_question_9_is_mobile==15] <- "Covasna"
ro$locationm[ro$background_question_9_is_mobile==16] <- "Dambovita"
ro$locationm[ro$background_question_9_is_mobile==17] <- "Dolj"
ro$locationm[ro$background_question_9_is_mobile==18] <- "Galati"
ro$locationm[ro$background_question_9_is_mobile==19] <- "Giurgiu"
ro$locationm[ro$background_question_9_is_mobile==20] <- "Gorj"
ro$locationm[ro$background_question_9_is_mobile==21] <- "harghita"
ro$locationm[ro$background_question_9_is_mobile==22] <- "Hunedoara"
ro$locationm[ro$background_question_9_is_mobile==23] <- "Ialomita"
ro$locationm[ro$background_question_9_is_mobile==24] <- "Iasi"
ro$locationm[ro$background_question_9_is_mobile==25] <- "Ilfov"
ro$locationm[ro$background_question_9_is_mobile==26] <- "Maramures"
ro$locationm[ro$background_question_9_is_mobile==27] <- "Mehendinti"
ro$locationm[ro$background_question_9_is_mobile==28] <- "Mures"
ro$locationm[ro$background_question_9_is_mobile==29] <- "Neamt"
ro$locationm[ro$background_question_9_is_mobile==30] <- "Olt"
ro$locationm[ro$background_question_9_is_mobile==31] <- "Prahova"
ro$locationm[ro$background_question_9_is_mobile==32] <- "Satu Mare"
ro$locationm[ro$background_question_9_is_mobile==33] <- "Salaj"
ro$locationm[ro$background_question_9_is_mobile==34] <- "Sibiu"
ro$locationm[ro$background_question_9_is_mobile==35] <- "Suceava"
ro$locationm[ro$background_question_9_is_mobile==36] <- "Teleorman"
ro$locationm[ro$background_question_9_is_mobile==37] <- "Timis"
ro$locationm[ro$background_question_9_is_mobile==38] <- "Tulcea"
ro$locationm[ro$background_question_9_is_mobile==39] <- "Vaslui"
ro$locationm[ro$background_question_9_is_mobile==40] <- "Valcea"
ro$locationm[ro$background_question_9_is_mobile==41] <- "Vrancea"
ro$locationm[ro$background_question_9_is_mobile==42] <- "Strainatate"
ro$location[is.na(ro$location)] <- ro$locationm[is.na(ro$location)]
table(ro$location)

           Alba            Arad           Arges           Bacau           Bihor Bistrita-Nasaud        Botosani          Braila 
             81              54              65              57             109              37              21              23 
         Brasov       Bucuresti           Buzau        Calarasi   Caras-Severin            Cluj       Constanta         Covasna 
            163            1954              53              23              14             532             145              13 
      Dambovita            Dolj          Galati         Giurgiu            Gorj        harghita       Hunedoara        Ialomita 
             45              67              63              12              25              23              42              26 
           Iasi           Ilfov       Maramures      Mehendinti           Mures           Neamt             Olt         Prahova 
            237             115              42              24              60              41              25             113 
          Salaj       Satu Mare           Sibiu     Strainatate         Suceava       Teleorman           Timis          Tulcea 
             20              23              97             330              53              32             243              24 
         Valcea          Vaslui         Vrancea 
             36              30              31 

There are 330 people who will vote abroad. now it’s a small sample, maybe later is worth doing some sort of analysis on them.

We break down the location according to regions (NUTS2). I am doing this because the ultimate goal is to weight the data (using census data, trying to make the data more representative)

ro$regiune <- 0
ro$regiune[is.na(ro$location)] <- NA # overwrite 0's with NA's if background_question_8 is NA
# Nord-Vest - RO11; Bihor, Bistrita-Nasaud, Cluj, Maramures, Satu Mare, Salaj
ro$regiune[ro$location=="Bihor"] <-         "RO11"
ro$regiune[ro$location=="Cluj"] <-          "RO11"
ro$regiune[ro$location=="Bistrita-Nasaud"]<-"RO11"
ro$regiune[ro$location=="Maramures"] <-     "RO11"
ro$regiune[ro$location=="Satu Mare"] <-     "RO11"
ro$regiune[ro$location=="Salaj"] <-         "RO11"
# Centru - RO12; Alba, Brasov, Covasna, Harghita, Mures, Sibiu
ro$regiune[ro$location=="Alba"] <-       "RO12"
ro$regiune[ro$location=="Brasov"] <-     "RO12"
ro$regiune[ro$location=="Covasna"] <-    "RO12"
ro$regiune[ro$location=="Harghita"] <-   "RO12"
ro$regiune[ro$location=="Mures"] <-      "RO12"
ro$regiune[ro$location=="Sibiu"] <-      "RO12"
# Nord-Est - RO21; Bacau, Botosani, Iasi, Neamt, Suceava, Vaslui
ro$regiune[ro$location=="Bacau"] <-      "RO21"
ro$regiune[ro$location=="Botosani"] <-   "RO21"
ro$regiune[ro$location=="Iasi"] <-       "RO21"
ro$regiune[ro$location=="Neamt"] <-      "RO21"
ro$regiune[ro$location=="Suceava"] <-    "RO21"
ro$regiune[ro$location=="Vaslui"] <-     "RO21"
# Sud-Est - RO22;  Braila, Buzau, Constanta, Galati, Tulcea, Vrancea
ro$regiune[ro$location=="Braila"] <-     "RO22"
ro$regiune[ro$location=="Buzau"] <-      "RO22"
ro$regiune[ro$location=="Constanta"] <-  "RO22"
ro$regiune[ro$location=="Galati"] <-     "RO22"
ro$regiune[ro$location=="Tulcea"] <-     "RO22"
ro$regiune[ro$location=="Vrancea"] <-    "RO22"
# Sud - Muntenia - RO31; Arges, Calarasi, Dambovita, Giurgiu, Ialomita, Prahova, Teleorman
ro$regiune[ro$location=="Arges"] <-      "RO31"
ro$regiune[ro$location=="Calarasi"] <-   "RO31"
ro$regiune[ro$location=="Dambovita"] <-  "RO31"
ro$regiune[ro$location=="Giurgiu"] <-    "RO31"
ro$regiune[ro$location=="Ialomita"] <-   "RO31"
ro$regiune[ro$location=="Prahova"] <-    "RO31"
ro$regiune[ro$location=="Teleorman"] <-  "RO31"
# Bucuresti - Ilfov - RO32; Bucuresti, Ilfov
ro$regiune[ro$location=="Bucuresti"] <-  "RO32"
ro$regiune[ro$location=="Ilfov"] <-      "RO32"
# Sud-Vest Oltenia - RO41; Dolj, Gorj, Mehedinti, Olt, Valcea
ro$regiune[ro$location=="Dolj"] <-       "RO41"
ro$regiune[ro$location=="Gorj"] <-       "RO41"
ro$regiune[ro$location=="Mehedinti"] <-  "RO41"
ro$regiune[ro$location=="Olt"] <-        "RO41"
ro$regiune[ro$location=="Valcea"] <-     "RO41"
# Vest - RO42; Arad, Caras-Severin, Hunedoara, Timis
ro$regiune[ro$location=="Arad"] <-        "RO42"
ro$regiune[ro$location=="Caras-Severin"]<-"RO42"
ro$regiune[ro$location=="Hunedoara"] <-   "RO42"
ro$regiune[ro$location=="Timis"] <-       "RO42"
# strainatate = abroad
ro$regiune[ro$location=="Strainatate"] <- "abroad"
ro$regiune[ro$regiune==0] <- NA
table(ro$regiune)

abroad   RO11   RO12   RO21   RO22   RO31   RO32   RO41   RO42 
   330    763    414    439    339    316   2069    153    353 

After we have an idea about who the users are and where they come from, let’s look into their political affilition. Here we see for which coalition they voted for in the last parliamentary elections of 2012. Here we miss quite a few users, because they dont remember who they voted for (tipically).

ro$voterec <- 0
ro$voterec[is.na(ro$background_question_10)] <- NA
ro$voterec <- ifelse(ro$background_question_10==0, "USL",
              ifelse(ro$background_question_10==1, "ARD",
              ifelse(ro$background_question_10==2, "PPDD",
              ifelse(ro$background_question_10==3, "UDMR",
              ifelse(ro$background_question_10==4, "other",
              ifelse(ro$background_question_10==6, "did not vote",
                     NA))))))
ro$voterecm <- 0
ro$voterecm[is.na(ro$background_question_11_is_mobile)] <- NA
ro$voterecm <- ifelse(ro$background_question_11_is_mobile==0, "USL",
               ifelse(ro$background_question_11_is_mobile==1, "ARD",
               ifelse(ro$background_question_11_is_mobile==2, "PPDD",
               ifelse(ro$background_question_11_is_mobile==3, "UDMR",
               ifelse(ro$background_question_11_is_mobile==4, "other",
               ifelse(ro$background_question_11_is_mobile==6, "did not vote",
                         NA))))))
ro$voterec[is.na(ro$voterec)] <- ro$voterecm[is.na(ro$voterec)]
voterec <- ro[c("voterec")]
voterec <- na.omit(voterec)
voterec$voterec <- factor(voterec$voterec, c("ARD", "PPDD", "UDMR", "USL", "other", "did not vote"))
ggplot(voterec, aes(x = factor(voterec))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "Vot la alegerile parlamentare 2012", x="") + theme_minimal() 

We can see who they intend to vote for, which is quite exciting

library(ggplot2)
ro$voteint <- ifelse(ro$popup_question_6==0, "PSD",
              ifelse(ro$popup_question_6==1, "ALDE",
              ifelse(ro$popup_question_6==2, "PNL",
              ifelse(ro$popup_question_6==3, "UDMR",
              ifelse(ro$popup_question_6==4, "USR",
              ifelse(ro$popup_question_6==5, "other",
                            NA))))))
voteint <- ro[c("voteint")]
voteint <- na.omit(voteint)
voteint$voteint <- factor(voteint$voteint, c("ALDE", "PNL", "PSD", "UDMR", "USR", "other"))
ggplot(voteint, aes(x = factor(voteint))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "Intentie de vot la alegerile parlamentare 2016", x="") + theme_minimal() 

I saved the best for the end: we can see how the users answered on the statements. I used percentages

1 means “Completely dissagree, 3,”Neither agree nor disagree“, 5”“Completely agree”, -1 “No opinion”

Free market makes the health system to function better
Competitia economica libera face sistemul de sanatate sa functioneze mai eficient

ro$statement_0[ro$statement_0=="-1"] <- NA
prop.table(table(ro$statement_0)) * 100

        1         2         3         4         5 
 5.273126 13.746013 22.956539 38.925439 19.098884 

The number of employees in the public sector should be reduced
Numarul angajatilor din sectorul public ar trebui redus

ro$statement_1[ro$statement_1=="-1"] <- NA
prop.table(table(ro$statement_1)) * 100

        1         2         3         4         5 
 3.692188 10.425573 15.827827 34.871745 35.182666 

The state should intervene in the economy as little as possible
Statul ar trebui sa intervina cat mai putin posibil in economie

ro$statement_2[ro$statement_2=="-1"] <- NA
prop.table(table(ro$statement_2)) * 100

        1         2         3         4         5 
 6.523005 20.034945 22.005436 33.721607 17.715007 

Romania should adopt a progressive taxation system
Romania ar trebui sa adopte un sistem de taxare progresiva

ro$statement_3[ro$statement_3=="-1"] <- NA
prop.table(table(ro$statement_3)) * 100

       1        2        3        4        5 
11.02409 16.95251 15.21761 38.15803 18.64776 

Foreign investors are a threat to Romania’s national sovereignty
Investitorii straini sunt o amenintare la suveranitatea nationala a Romaniei

ro$statement_4[ro$statement_4=="-1"] <- NA
prop.table(table(ro$statement_4)) * 100

       1        2        3        4        5 
51.28329 29.80145 11.13801  5.03632  2.74092 

VTA should be reduced under 20%
TVA trebuie redus sub pragul de 20%

ro$statement_5[ro$statement_5=="-1"] <- NA
prop.table(table(ro$statement_5)) * 100

        1         2         3         4         5 
 2.125566  8.088959 26.402283 40.267664 23.115528 

Romania should never adopt the euro
Romania ar trebui sa nu adopte niciodata moneda Euro

ro$statement_6[ro$statement_6=="-1"] <- NA
prop.table(table(ro$statement_6)) * 100

        1         2         3         4         5 
27.830605 30.447995 22.046858 11.685129  7.989413 

International actors (such as EU or USA) have the right to intervene in Romania’s internal affairs if the state of democracy is threatend
Partenerii internationali (precum UE sau SUA) pot interveni in afacerile interne ale Romaniei atunci cand exista o amenintare la adresa democratiei

ro$statement_7[ro$statement_7=="-1"] <- NA
prop.table(table(ro$statement_7)) * 100

       1        2        3        4        5 
13.48860 17.40902 16.10869 38.44736 14.54634 

The strategic partnership with USA is essential for Romania’s national security
Parteneriatul strategic cu SUA este esential pentru securitatea nationala

ro$statement_8[ro$statement_8=="-1"] <- NA
prop.table(table(ro$statement_8)) * 100

        1         2         3         4         5 
 3.699388  5.981163 15.671424 41.984659 32.663365 

Women should be able to decide on any matters related to abortion
Femeile ar trebui sa aiba libertatea de a decide asupra chestiunilor legate de avort

ro$statement_9[ro$statement_9=="-1"] <- NA
prop.table(table(ro$statement_9)) * 100

        1         2         3         4         5 
 3.095077  3.211142  5.019828 22.845536 65.828417 

Romania should not receive refugees that try to enter the EU
Romania ar trebui sa accepte mai multi migranti care intra in UE, ca semn de solidaritate

ro$statement_10[ro$statement_10=="-1"] <- NA
prop.table(table(ro$statement_10)) * 100

       1        2        3        4        5 
18.85087 19.70640 26.17150 23.88684 11.38441 

Gay couples should have the same rights as the heterosexual ones
Cuplurile homosexuale ar trebui sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale

library(ggplot2)
table(ro$statement_11)

  -1    1    2    3    4    5 
  90 1326  889 1242 2260 4595 
ro$statement_11[ro$statement_11=="-1"] <- NA
ro$statement_11[ro$statement_11=="1"] <- "Total impotriva"
ro$statement_11[ro$statement_11=="2"] <- "Impotriva"
ro$statement_11[ro$statement_11=="3"] <- "Neutru"
ro$statement_11[ro$statement_11=="4"] <- "De acord"
ro$statement_11[ro$statement_11=="5"] <- "Total de acord"
ro$statement_11 <- factor(ro$statement_11, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
ggplot(ro, aes(x = factor(statement_11))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "", y = "Numar utilizatori") + theme_minimal() 

Smoking should be prohibited in all the public places, even the open-space ones
Fumatul trebuie interzis in toate locurile publice, chiar si cele deschise

ro$statement_12[ro$statement_12=="-1"] <- NA
prop.table(table(ro$statement_12)) * 100

       1        2        3        4        5 
16.05571 25.36029 16.66505 19.29587 22.62308 

Immigrants should adopt the values and culture of Romania
Imigrantii ar trebui sa se adapteze la valorile si cultura Romaniei

ro$statement_13[ro$statement_13=="-1"] <- NA
prop.table(table(ro$statement_13)) * 100

        1         2         3         4         5 
 1.964580  6.242137 16.113423 39.398045 36.281816 

Romania should pursue state unification with Moldova
Romania ar trebui sa urmareasca reunificarea statala cu Republica Moldova

ro$statement_14[ro$statement_14=="-1"] <- NA
prop.table(table(ro$statement_14)) * 100

       1        2        3        4        5 
14.16536 19.63166 30.51528 20.91497 14.77273 

A territorial reform should include the creation of an autonomous Hungarian region
O reforma teritoriala ar trebui sa includa crearea unei regiuni maghiare autonome

ro$statement_15[ro$statement_15=="-1"] <- NA
prop.table(table(ro$statement_15)) * 100

        1         2         3         4         5 
47.310050 30.148847 13.775659  5.798229  2.967215 
ro$statement_15[ro$statement_15=="1"] <- "Total impotriva"
ro$statement_15[ro$statement_15=="2"] <- "Impotriva"
ro$statement_15[ro$statement_15=="3"] <- "Neutru"
ro$statement_15[ro$statement_15=="4"] <- "De acord"
ro$statement_15[ro$statement_15=="5"] <- "Total de acord"
ro$statement_15 <- factor(ro$statement_15, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
ggplot(ro, aes(x = factor(statement_15))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "O reforma teritoriala ar trebui sa includa \n crearea unei regiuni maghiare autonome", x = "", y = "Numar utilizatori")+ theme_minimal() 

The state should give privileged status to the orthodox church
Statul ar trebui sa acorde un statut privilegiat Bisericii Ortodoxe

ro$statement_16[ro$statement_16=="-1"] <- NA
prop.table(table(ro$statement_16)) * 100

        1         2         3         4         5 
71.300145 17.815370  6.331561  2.706622  1.846303 
ro$statement_16[ro$statement_16=="1"] <- "Total impotriva"
ro$statement_16[ro$statement_16=="2"] <- "Impotriva"
ro$statement_16[ro$statement_16=="3"] <- "Neutru"
ro$statement_16[ro$statement_16=="4"] <- "De acord"
ro$statement_16[ro$statement_16=="5"] <- "Total de acord"
ro$statement_16 <- factor(ro$statement_16, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
ggplot(ro, aes(x = factor(statement_16))) + geom_bar(stat = "count", fill="darkblue", colour="black") + labs(title = "Statul ar trebui sa acorde un statut privilegiat Bisericii Ortodoxe", x = "", y = "Numar utilizatori")+ theme_minimal() 

The electoral treshold should be lowered, so smaller parties can gain access to the parliament
Pragul electoral ar trebui redus pentru a permite intrarea partidelor mai mici în parlament

ro$statement_17[ro$statement_17=="-1"] <- NA
prop.table(table(ro$statement_17)) * 100

        1         2         3         4         5 
 7.652614 12.608315 13.815597 35.050141 30.873333 

The electoral reform should include lowering the number of signatures needed for candidacy for all election types
Numarul de semnaturi pentru candidatura la toate tipurile de alegeri ar trebui redus

ro$statement_18[ro$statement_18=="-1"] <- NA
prop.table(table(ro$statement_18)) * 100

        1         2         3         4         5 
 4.997066  9.867006 13.367886 33.835322 37.932721 

The number of polling stations for diaspora should be increased for all election types
Numarul de sectii de votare in diaspora trebuie marit pentru toate tipurile de alegeri

ro$statement_19[ro$statement_19=="-1"] <- NA
prop.table(table(ro$statement_19)) * 100

        1         2         3         4         5 
 1.804424  3.152891  8.886302 34.720605 51.435778 

The postal vote should be introduced for all election types
Votul prin corespondenta ar trebui introdus pentru toate tipurile de alegeri

ro$statement_20[ro$statement_20=="-1"] <- NA
prop.table(table(ro$statement_20)) * 100

        1         2         3         4         5 
 2.557619  3.967714  8.236896 31.800058 53.437713 

The digitalization of the judicial process should be continued by publishing on-line all the decisions
Digitalizarea procesului judiciar trebuie continuata prin publicarea on-line a tuturor hotararilor judecatoresti

ro$statement_21[ro$statement_21=="-1"] <- NA
prop.table(table(ro$statement_21)) * 100

         1          2          3          4          5 
 0.5525933  0.9985458  3.3155599 30.6543868 64.4789142 

Government’s public information must be accessible online
Informatiile publice ale guvernului ar trebui sa fie accesibile on-line

ro$statement_22[ro$statement_22=="-1"] <- NA
prop.table(table(ro$statement_22)) * 100

         1          2          3          4          5 
 0.2795450  0.2795450  0.8193561 23.2022364 75.4193175 

The open vote should be introduced for all decisions made in the parliament
Votul deschis trebuie introdus pentru toate deciziile luate in Parlament

ro$statement_23[ro$statement_23=="-1"] <- NA
prop.table(table(ro$statement_23)) * 100

         1          2          3          4          5 
 0.9170732  3.9317073  7.9902439 26.6243902 60.5365854 

Politicians prosecuted for corruption should give up any public function
Politicienii urmariti penal pentru fapte de coruptie trebuie sa renunte la orice functie publica

ro$statement_24[ro$statement_24=="-1"] <- NA
prop.table(table(ro$statement_24)) * 100

        1         2         3         4         5 
 2.568807  4.751328  6.199903 15.731531 70.748431 

MPs should enjoy immunity rights only for votes and declarations
Parlamentarii ar trebui sa aiba imunitate doar pentru voturi si declaratii

ro$statement_25[ro$statement_25=="-1"] <- NA
prop.table(table(ro$statement_25)) * 100

        1         2         3         4         5 
 3.206256  4.789834  8.905181 28.973607 54.125122 

Governments formed exclusivelly from non-partisan tehnocrats work better than those formed from politicians
Guvernele formate exclusiv din tehnocrati neafiliati politic functioneaza mai bine decat cele formate din politicieni

ro$statement_26[ro$statement_26=="-1"] <- NA
prop.table(table(ro$statement_26)) * 100

        1         2         3         4         5 
 7.786245  8.782728 27.657288 29.591637 26.182102 

Prosecutors have too much power in prosecuting citizens
Procurorii au prea multa putere în ceea ce priveste anchetarea cetatenilor

ro$statement_27[ro$statement_27=="-1"] <- NA
prop.table(table(ro$statement_27)) * 100

        1         2         3         4         5 
13.161058 29.086538 36.498397 14.493189  6.760817 

The Mechanism of Cooperation and Verification, which tracks progress in the judiciary system reform should be maintained
Mecanismul de Cooperare si Verificare, prin care se verifica progresele in reformarea justitiei, ar trebui inlaturat

ro$statement_28[ro$statement_28=="-1"] <- NA
prop.table(table(ro$statement_28)) * 100

        1         2         3         4         5 
25.023420 36.691995 26.345373  7.806808  4.132403 

Romania should work on strengthening its diplomatic relations with Rusia
Romania ar trebui sa isi consolideze relatiile diplomatice cu Rusia

ro$statement_29[ro$statement_29=="-1"] <- NA
prop.table(table(ro$statement_29)) * 100

        1         2         3         4         5 
12.059113 14.748768 33.054187 33.507389  6.630542 

Interest in politics 0 very much, 3 not at all

ro$popup_question_2[ro$popup_question_2==4] <- NA
prop.table(table(ro$popup_question_2)) * 100

        0         1         2         3 
52.217454 39.532666  6.962327  1.287554 

Left-right self-positioning, 0 left 10 right

ro$popup_question_3[ro$popup_question_3==11] <- NA
ro$popup_question_3[ro$popup_question_3==12] <- NA
prop.table(table(ro$popup_question_3)) * 100

        0         1         2         3         4         5         6         7         8         9        10 
 1.436355  1.882120  2.129767  5.250124  5.943536 15.898960 10.698366 19.167905 18.499257  6.587420 12.506191 

Evaluation of Ciolos’ government performance 0 very good, 4 very bad, 5 don’t know

prop.table(table(ro$popup_question_4)) * 100

         0          1          2          3          4          5 
41.2413132 40.9058231  3.4507549  0.7189073  8.8665229  4.8166786 

We can do stacked barplots, looking at age and positions on statements, like this example on the statement on gay marriage

toplot2 <- table(ro$age, ro$statement_11)
toplot2 <- ro[c(67, 109)]
toplot2$age[toplot2$age=="1"] <- "18-29"
toplot2$age[toplot2$age=="2"] <- "30-49"
toplot2$age[toplot2$age=="3"] <- "50-64"
toplot2$age[toplot2$age=="4"] <- "65+"
toplot2$statement_11[toplot2$statement_11=="1"] <- "Total impotriva"
toplot2$statement_11[toplot2$statement_11=="2"] <- "Impotriva"
toplot2$statement_11[toplot2$statement_11=="3"] <- "Neutru"
toplot2$statement_11[toplot2$statement_11=="4"] <- "De acord"
toplot2$statement_11[toplot2$statement_11=="5"] <- "Total de acord"
toplot2$statement_11 <- factor(toplot2$statement_11, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
toplot2 <- na.omit(toplot2) 
library(ggplot2)
library(plyr)
library(reshape2)
library(gridExtra)
k <- ggplot(toplot2, aes(statement_11, fill=age))
k + geom_bar() + scale_fill_brewer() + labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "Opinia utilizatorului", y = "Numar utilizatori") + theme_minimal() 

We can have a look at the same statement, on gay marriage, by eduaction

toplot3 <- ro[c(67, 111)]
# rename factor levels age
toplot3$edu[toplot3$edu=="0"] <- "Nu am fost niciodata la scoala"
toplot3$edu[toplot3$edu=="1"] <- "Scoala generala"
toplot3$edu[toplot3$edu=="2"] <- "Liceu sau scoala profesionala"
toplot3$edu[toplot3$edu=="3"] <- "Facultate/Masterat/Doctorat"
toplot3$edu[toplot3$edu=="4"] <- "Studii postuniversitare"
toplot3$edu <- factor(toplot3$edu, c("Nu am fost niciodata la scoala", "Scoala generala", "Liceu sau Scoala profesionala", "Facultate/Masterat/Doctorat", "Studii postuniversitare"))
toplot3$statement_11[toplot3$statement_11=="1"] <- "Total impotriva"
toplot3$statement_11[toplot3$statement_11=="2"] <- "Impotriva"
toplot3$statement_11[toplot3$statement_11=="3"] <- "Neutru"
toplot3$statement_11[toplot3$statement_11=="4"] <- "De acord"
toplot3$statement_11[toplot3$statement_11=="5"] <- "Total de acord"
toplot3$statement_11 <- factor(toplot3$statement_11, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))
toplot3 <- na.omit(toplot3)
l <- ggplot(toplot3, aes(statement_11, fill=edu))
l + geom_bar() + scale_fill_brewer() + labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "Opinia utilizatorului", y = "Numar utilizatori") + theme_minimal() 

And the possibilities are endless! Just tell me what you would like to see in a graph and I’ll do it.

WE can look at the opinions on statements given the user’s political preferences, more precisely the propensity to vote for the parties (I selected PTV > 7, then the party with the maximum value)

ro$PSD <- ifelse(ro$ptv_option_6_question_32 ==7, 7,
             ifelse(ro$ptv_option_6_question_32 ==8, 8,
             ifelse(ro$ptv_option_6_question_32 ==9, 9,
             ifelse(ro$ptv_option_6_question_32 ==10, 10,
                        NA))))
                    
ro$PNL <- ifelse(ro$ptv_option_7_question_32 ==7, 7,
             ifelse(ro$ptv_option_7_question_32 ==8, 8,
             ifelse(ro$ptv_option_7_question_32 ==9, 9,
             ifelse(ro$ptv_option_7_question_32 ==10, 10,
                    NA))))
ro$ALDE <- ifelse(ro$ptv_option_8_question_32 ==7, 7,
              ifelse(ro$ptv_option_8_question_32 ==8, 8,
              ifelse(ro$ptv_option_8_question_32 ==9, 9,
              ifelse(ro$ptv_option_8_question_32 ==10, 10,
                         NA))))
ro$UDMR <- ifelse(ro$ptv_option_9_question_32 ==7, 7,
              ifelse(ro$ptv_option_9_question_32 ==8, 8,
              ifelse(ro$ptv_option_9_question_32 ==9, 9,
              ifelse(ro$ptv_option_9_question_32 ==10, 10,
                      NA))))
ro$USR <- ifelse(ro$ptv_option_10_question_32 ==7, 7,
             ifelse(ro$ptv_option_10_question_32 ==8, 8,
             ifelse(ro$ptv_option_10_question_32 ==9, 9,
             ifelse(ro$ptv_option_10_question_32 ==10, 10,
                     NA))))
ro$PMP <-  ifelse(ro$ptv_option_11_question_32 ==7, 7,
              ifelse(ro$ptv_option_11_question_32 ==8, 8,
              ifelse(ro$ptv_option_11_question_32 ==9, 9,
              ifelse(ro$ptv_option_11_question_32 ==10, 10,
                    NA))))
ptv <- ro[c(119:124)]
ptv$ptvmax <- apply(ptv, 1, function(x) names (x) [which.max(x)])
ptv$ptvmax[ptv$ptvmax=="character(0)"] <- NA
ptv <-ptv[,7]
ptv <- data.frame(unlist(ptv))
toplotgay <- cbind(ptv, ro[c(67)])
toplotgay <- na.omit(toplotgay)
require(ggplot2)
ggplot(toplotgay, aes(x = factor(statement_11))) + geom_bar(stat = "count", fill="darkblue", colour="black") + facet_grid(~ unlist.ptv.)+ labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "1 - Total impotriva, 2 - Impotriva, 3 - Neutru, 4 - De acord, 5 - Total de acord", y = "Numar utilizatori") + theme_minimal() + theme(text = element_text(size=10))

The same approach, different presentation

toplotgay$statement_11[toplotgay$statement_11=="1"] <- "Total impotriva"
toplotgay$statement_11[toplotgay$statement_11=="2"] <- "Impotriva"
toplotgay$statement_11[toplotgay$statement_11=="3"] <- "Neutru"
toplotgay$statement_11[toplotgay$statement_11=="4"] <- "De acord"
toplotgay$statement_11[toplotgay$statement_11=="5"] <- "Total de acord"
toplotgay$statement_11 <- factor(toplotgay$statement_11, c("Total impotriva", "Impotriva", "Neutru", "De acord", "Total de acord"))                                                                                                                          
p <- ggplot(toplotgay, aes(statement_11, fill=unlist.ptv.))
p + geom_bar() + scale_fill_brewer(palette="Spectral") + labs(title = "Cuplurile homosexuale ar trebui \n sa se bucure de aceleasi drepturi ca si cuplurile heterosexuale", x = "", y = "Numar utilizatori") + guides(fill=guide_legend(title=NULL)) + theme_minimal() 

LS0tDQp0aXRsZTogIlJPIFZBQSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoqRGF0YSBmcm9tIEJ1c29sYSBFbGVjdG9yYWxhIGJldHdlZW4gMTEgTm92IDIwMTYgLSAyMSBOb3YgMjAxNioNCg0KVGhpcyBkb2N1bWVudCBwcm92aWRlcyBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzLCBvZmZlcmluZyBhbiBvdmVyd2lldyBvZiB0aGUgZGF0YSB3ZSBjb2xsZWN0ZWQgdGhyb3VnaCBodHRwczovL3ByZXNzb25lLnJvL2J1c29sYS8uICANCg0KIyMjIyNUaGUgZG9jdW1lbnQgdW5mb2xkcyBhcyBmb2xsb3dzOiANCg0KKiBpdCBzdGFydHMgYnkgc2hvd2luZyB0aGUgbG9jYXRpb24gICAgDQogICAgICAgKyBjb3VudHJ5ICAgDQogICAgICAgKyBzdWJkaXZpc2lvbiAgICANCiAgICAgICArIHBsYXRmb3JtIHVzZWQgdG8gdGFrZSB0aGUgc3VydmV5ICAgIA0KKiBkZW1vZ3JhcGhpYyBpbmZvcm1hdGlvbiAgICANCiAgICAgICArIGFnZSAgIA0KICAgICAgICsgZ2VuZGVyICAgDQogICAgICAgKyBlZHVjYXRpb24gICANCiAgICAgICArIGVsZWN0b3JhbCBjaXJjdW1zY3JpcHRpb24gdGhlIHVzZXJzIGJlbG9uZyB0bw0KICAgICAgICsgdm90ZSByZWNhbGwNCiogdGhlIDMwIHN0YXRlbWVudHMsIHVzZWQgaW4gdGhlIHBvc2l0aW9uaW5nIG9mIHRoZSB1c2VyIGluIHRoZSBwb2xpdGljYWwgbGFuZHNjYXBlIA0KKiBleHRyYSBxdWVzdGlvbnMgYXNrZWQgaW4gdGhlIHBvcHVwIHN1cnZleSwNCiAgICAgICArIHN1Y2ggYXMgZ292ZXJubWVudCBldmFsdWF0aW9uDQogICAgICAgKyB2b3RlIGludGVudGlvbg0KICAgICAgICsgbGVmdC1yaWdodCBzZWxmLXBvc2l0aW9uaW5nIA0KICAgICAgICsgcG9saXRpY2FsIGludGVyZXN0LiAgDQogICAgICAgDQpJbiB0aGUgdG9wIHJpZ2h0LCB0aGVyZSdzIGEgYnV0dG9uIGNhbGxlZCBfX0NvZGVfXy4gSWYgeW91IHByZXNzIF9fSGlkZSBBbGwgQ29kZV9fLCB0aGUgUiBjb2RlIHdpbGwgZGlzYXBwZWFyIGFuZCB5b3UgYXJlIGxlZnQgd2l0aCB0aGUgcmVzdWx0cy4gSSBzdWdnZXN0IGRvaW5nIHRoYXQsIGl0J3MgZWFzaWVyIHRvIHJlYWQuICANCg0KDQpgYGB7ciBsb2FkIGRhdGEgYW5kIGxpYnJhcmllc30NCmxpYnJhcnkoZm9yZWlnbikNCnJvIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9JcmluYS9EZXNrdG9wL3JvMjAxNnZhYS9Sb21hbmlhIDIxLjExLmNzdiIsIGhlYWRlciA9IFRSVUUpDQpgYGANCkZpcnN0IHRoaW5ncyBmaXJzdDogd2Ugd2FudCB0byBrbm93IGhvdyBtYW55IHBlb3BsZSB3ZW50IHRocm91Z2ggYWxsIDMwIHN0YXRlbWVudHMuIFdlIGRpc2NhcmQgdGhlIG90aGVycy4gDQoNCmBgYHtyfQ0Kcm8gPC0gc3Vic2V0KHJvLCBhbnN3ZXJlZF9hbGxfc3RhdGVtZW50cyAhPSAwKQ0KbGVuZ3RoKHJvJGFuc3dlcmVkX2FsbF9zdGF0ZW1lbnRzKQ0KYGBgDQpUaGF0IGxlYXZlcyB1cyB3aXRoIDEwLjQwMiBwZW9wbGUgd2hvIHdlcmUgYWJsZSB0byBzZWUgdGhlaXIgcG9zaXRpb24gaW4gdGhlIHBvbGl0aWNhbCBsYW5kc2NhcGUgYWZ0ZXIgZ29pbmcgdGhyb3VnaCBhbGwgc3RhdGVtZW50cy4gWW91IGNhbiB5b3VyIHBvc2l0aW9uIGV2ZW4gaWYgeW91IGZpbGwgb3V0IHRoZSB0b29sIHBhcnRpYWxseSwgYnV0IHRoZSByZXN1bHRzIHdvbid0IGJlIGFjY3VyYXRlLiAgICAgICANCkFsbCB0aGUgYW5hbHlzaXMgZnJvbSBub3cgb24gaXMgYmFzZWQgb24gdGhpcyBzYW1wbGUgb2YgMTAuNDAyLg0KDQpMZXQncyBzZWUgd2hlcmUgdGhlIHVzZXJzIGNvbWUgZnJvbTogICAgIA0KKlRoaXMgaXMgYWRkaXRpb25hbCBkYXRhIHdlIGNvbGxlY3QsIG5vdCBhc2tlZCBpbiB0aGUgc3VydmV5Kg0KYGBge3J9DQoNCnJvJGNvdW50cnlbcm8kY291bnRyeT09IiJdIDwtIE5BDQp0YWJsZShybyRjb3VudHJ5KQ0KYGBgDQoNCiMjI05vdywgbGV0J3MgbW92ZSBvbiB0byBtb3JlIGludGVyZXN0aW5nIHN0dWZmOiANCkxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSBkZW1vZ3JhcGhpY3MuIFdlIGFzayB0aGVzZSBxdWVzdGlvbnMgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgdG9vbCwgYW5kIHF1aXRlIGEgZmV3IHBlb3BsZSBmaWxsIGluIHRoaXMgaW5mb3JtYXRpb24uIFRoZSB2YXJpYWJsZXMgYXJlIGNvbGxlY3RlZCBzZXBhcmF0ZWxseSBmb3IgcGVvcGxlIHdobyB0b29rIHRoZSBzdXJ2ZXkgb24gdGhlaXIgcGhvbmUsIHRoYXQncyB3aHkgdGhlcmUgYXJlIHR3byB2YXJpYWJsZXMgZm9yIGdlbmRlci4gWW91IG5lZWQgdG8gbG9vayBhdCB0aGUgbGFzdCAyIHJvd3MsIHdoZXJlIGNvZGVkIDAgYXJlIGZlbWFsZXMsIGNvZGUgMSBhcmUgbWFsZXMuIA0KDQpgYGB7cn0NCnJvJG1hbGUgPC0gaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMD09MCwgMSwNCiAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMD09MSwgMCwNCiAgICAgICAgICAgICAgICBOQSkpDQogICANCnJvJG1hbGVtIDwtIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzFfaXNfbW9iaWxlPT0wLCAxLA0KICAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMV9pc19tb2JpbGU9PTEsIDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgTkEpKQ0Kcm8kbWFsZVtpcy5uYShybyRtYWxlKV0gPC0gcm8kbWFsZW1baXMubmEocm8kbWFsZSldDQp0YWJsZShybyRtYWxlKQ0KYGBgDQpTbyB0aGVyZSBhcmUgMzUwNyBtZW4gYW5kIDE2MzYgd29tZW4uIFRoaXMgaXMgcXVpdGUgbm9ybWFsLCBhcyBtZW4gYXJlIG1vcmUgaW50ZXJlc3RlZCBpbiBwb2xpdGljcyB0aGFuIHdvbWVuLiAgIA0KTmV4dCwgYWdlLiBJJ2xsIGNyZWF0ZSBhZ2UgY2F0ZWdvcmllcywgMTgtMjkgY29kZWQgMSwgMzAtNDkgY29kZWQgMiwgNTAtNjQgY29kZWQgMyBhbmQgNjUrIGNvZGVkIDQNCmBgYHtyfQ0Kcm8kYWdlIDwtIDIwMTYgLSAocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8yICsgMTkxMCkNCnJvJGFnZVtybyRhZ2UgPCAxOF0gPC0gTkENCg0Kcm8kYWdlW3JvJGFnZSA+PSAxOCAmIHJvJGFnZSA8PSAyOV0gPC0gMQ0Kcm8kYWdlW3JvJGFnZSA+PSAzMCAmIHJvJGFnZSA8PSA0OV0gPC0gMg0Kcm8kYWdlW3JvJGFnZSA+PSA1MCAmIHJvJGFnZSA8PSA2NF0gPC0gMw0Kcm8kYWdlW3JvJGFnZSA+PSA2NV0gPC0gNA0KDQpybyRhZ2VhIDwtIDIwMTYgLSAocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8zX2lzX21vYmlsZSArIDE5MTApDQpybyRhZ2VhW3JvJGFnZWEgPCAxOF0gPC0gTkENCg0Kcm8kYWdlYVtybyRhZ2VhID49IDE4ICYgcm8kYWdlYSA8PSAyOV0gPC0gMQ0Kcm8kYWdlYVtybyRhZ2VhID49IDMwICYgcm8kYWdlYSA8PSA0OV0gPC0gMg0Kcm8kYWdlYVtybyRhZ2VhID49IDUwICYgcm8kYWdlYSA8PSA2NF0gPC0gMw0Kcm8kYWdlYVtybyRhZ2VhID49IDY1XSA8LSA0DQoNCnJvJGFnZVtpcy5uYShybyRhZ2UpXSA8LSBybyRhZ2VhW2lzLm5hKHJvJGFnZSldDQp0YWJsZShybyRhZ2UpDQpgYGANCkkgY2FuIG1ha2Ugc21hbGxlciBhZ2UgYnJhY2tldHMgaWYgbmVlZGVkLiAgICAgICANCldlIG1vdmUgb24gdG8gZWR1Y2F0aW9uIDAgLSBubyBlZHVjYXRpb24sIDEgLSBlbGVtZW50YXJ5IHNjaG9vbCwgMiAtIGhpZ2ggc2Nob29sLCAzIC0gdW5pdmVyc2l0eSBkZWdyZWUsIG1hc3RlciBhbmQgUGhELCA0IC0gcG9zdCBkb2N0b3JhbCBzdHVkaWVzDQpgYGB7cn0NCnJvJGVkdSA8LSBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl80PT0wLCAwLCANCiAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl80PT0xLCAxLA0KICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzQ9PTIsIDIsDQogICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fND09NCwgNCwNCiAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl80PT0iRmFjdWx0YXRlXG5NYXN0ZXJhdC9Eb2N0b3JhdCIsIDMsDQogICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fND09IlBvc3p0Z3JhZHXDoWxpcyB2w6lnemV0dHPDqWcgIiwgNCwNCiAgICAgICAgICAgICAgICAgTkEpKSkpKSkNCg0Kcm8kZWR1bSA8LSBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl81X2lzX21vYmlsZT09MCwgMCwgDQogICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzVfaXNfbW9iaWxlPT0xLCAxLA0KICAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl81X2lzX21vYmlsZT09MiwgMiwNCiAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fNV9pc19tb2JpbGU9PTQsIDQsDQogICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzVfaXNfbW9iaWxlPT0iRmFjdWx0YXRlXG5NYXN0ZXJhdC9Eb2N0b3JhdCIsIDMsDQogICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzVfaXNfbW9iaWxlPT0iUG9zenRncmFkdcOhbGlzIHbDqWd6ZXR0c8OpZyAiLCA0LA0KICAgICAgICAgICAgICAgICBOQSkpKSkpKQ0KDQpybyRlZHVbaXMubmEocm8kZWR1KV0gPC0gcm8kZWR1bVtpcy5uYShybyRlZHUpXQ0KdGFibGUocm8kZWR1KQ0KYGBgDQpBcyBleHBlY3RlZCwgbW9zdGx5IGhpZ2hseSBlZHVjYXRlZCBwZW9wbGUuDQoNCk5vdywgd2UgY2FuIHNlZSB0aGUgY2l0eSB3aGVyZSBwZW9wbGUgaW50ZW5kIHRvIHZvdGUgKGZvciB0aGlzIHR5cGUgb2YgZWxlY3Rpb24sIHlvdSBjYW4gb25seSB2b3RlIGluICB0aGUgZWxlY3RvcmFsIGNpcmN1bXNjcmlwdGlvbiB5b3UgYmVsb25nIHRvLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBob21ldG93bikNCmBgYHtyfQ0Kcm8kbG9jYXRpb24gPC0gMA0Kcm8kbG9jYXRpb25baXMubmEocm8kYmFja2dyb3VuZF9xdWVzdGlvbl84KV0gPC0gTkEgIyBvdmVyd3JpdGUgMCdzIHdpdGggTkEncyBpZiBiYWNrZ3JvdW5kX3F1ZXN0aW9uXzggaXMgTkENCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MF0gIDwtICJBbGJhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0xXSAgPC0gIkFyYWQiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTJdICA8LSAiQXJnZXMiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTNdICA8LSAiQmFjYXUiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTRdICA8LSAiQmlob3IiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTVdICA8LSAiQmlzdHJpdGEtTmFzYXVkIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT02XSAgPC0gIkJvdG9zYW5pIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT03XSAgPC0gIkJyYXNvdiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09OF0gIDwtICJCcmFpbGEiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTldICA8LSAiQnVjdXJlc3RpIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0xMF0gPC0gIkJ1emF1Ig0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0xMV0gPC0gIkNhcmFzLVNldmVyaW4iDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTEyXSA8LSAiQ2FsYXJhc2kiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTEzXSA8LSAiQ2x1aiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MTRdIDwtICJDb25zdGFudGEiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTE1XSA8LSAiQ292YXNuYSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MTZdIDwtICJEYW1ib3ZpdGEiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTE3XSA8LSAiRG9saiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MThdIDwtICJHYWxhdGkiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTE5XSA8LSAiR2l1cmdpdSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MjBdIDwtICJHb3JqIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yMV0gPC0gImhhcmdoaXRhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yMl0gPC0gIkh1bmVkb2FyYSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MjNdIDwtICJJYWxvbWl0YSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MjRdIDwtICJJYXNpIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yNV0gPC0gIklsZm92Ig0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yNl0gPC0gIk1hcmFtdXJlcyINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MjddIDwtICJNZWhlbmRpbnRpIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yOF0gPC0gIk11cmVzIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0yOV0gPC0gIk5lYW10Ig0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0zMF0gPC0gIk9sdCINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzFdIDwtICJQcmFob3ZhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0zMl0gPC0gIlNhdHUgTWFyZSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzNdIDwtICJTYWxhaiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzRdIDwtICJTaWJpdSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzVdIDwtICJTdWNlYXZhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT0zNl0gPC0gIlRlbGVvcm1hbiINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzddIDwtICJUaW1pcyINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09MzhdIDwtICJUdWxjZWEiDQpybyRsb2NhdGlvbltybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzg9PTM5XSA8LSAiVmFzbHVpIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT00MF0gPC0gIlZhbGNlYSINCnJvJGxvY2F0aW9uW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOD09NDFdIDwtICJWcmFuY2VhIg0Kcm8kbG9jYXRpb25bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl84PT00Ml0gPC0gIlN0cmFpbmF0YXRlIg0KDQpybyRsb2NhdGlvbm0gPC0gMA0Kcm8kbG9jYXRpb25tW2lzLm5hKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGUpXSA8LSBOQSAjIG92ZXJ3cml0ZSAwJ3Mgd2l0aCBOQSdzIGlmIGJhY2tncm91bmRfcXVlc3Rpb25fOCBpcyBOQQ0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTBdICA8LSAiQWxiYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xXSAgPC0gIkFyYWQiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09Ml0gIDwtICJBcmdlcyINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0zXSAgPC0gIkJhY2F1Ig0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTRdICA8LSAiQmlob3IiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09NV0gIDwtICJCaXN0cml0YS1OYXNhdWQiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09Nl0gIDwtICJCb3Rvc2FuaSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT03XSAgPC0gIkJyYXNvdiINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT04XSAgPC0gIkJyYWlsYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT05XSAgPC0gIkJ1Y3VyZXN0aSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xMF0gPC0gIkJ1emF1Ig0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTExXSA8LSAiQ2FyYXMtU2V2ZXJpbiINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xMl0gPC0gIkNhbGFyYXNpIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTEzXSA8LSAiQ2x1aiINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xNF0gPC0gIkNvbnN0YW50YSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0xNV0gPC0gIkNvdmFzbmEiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MTZdIDwtICJEYW1ib3ZpdGEiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MTddIDwtICJEb2xqIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTE4XSA8LSAiR2FsYXRpIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTE5XSA8LSAiR2l1cmdpdSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yMF0gPC0gIkdvcmoiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MjFdIDwtICJoYXJnaGl0YSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yMl0gPC0gIkh1bmVkb2FyYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yM10gPC0gIklhbG9taXRhIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTI0XSA8LSAiSWFzaSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yNV0gPC0gIklsZm92Ig0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTI2XSA8LSAiTWFyYW11cmVzIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTI3XSA8LSAiTWVoZW5kaW50aSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0yOF0gPC0gIk11cmVzIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTI5XSA8LSAiTmVhbXQiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzBdIDwtICJPbHQiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzFdIDwtICJQcmFob3ZhIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTMyXSA8LSAiU2F0dSBNYXJlIg0Kcm8kbG9jYXRpb25tW3JvJGJhY2tncm91bmRfcXVlc3Rpb25fOV9pc19tb2JpbGU9PTMzXSA8LSAiU2FsYWoiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzRdIDwtICJTaWJpdSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0zNV0gPC0gIlN1Y2VhdmEiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzZdIDwtICJUZWxlb3JtYW4iDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09MzddIDwtICJUaW1pcyINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0zOF0gPC0gIlR1bGNlYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT0zOV0gPC0gIlZhc2x1aSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT00MF0gPC0gIlZhbGNlYSINCnJvJGxvY2F0aW9ubVtybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzlfaXNfbW9iaWxlPT00MV0gPC0gIlZyYW5jZWEiDQpybyRsb2NhdGlvbm1bcm8kYmFja2dyb3VuZF9xdWVzdGlvbl85X2lzX21vYmlsZT09NDJdIDwtICJTdHJhaW5hdGF0ZSINCg0Kcm8kbG9jYXRpb25baXMubmEocm8kbG9jYXRpb24pXSA8LSBybyRsb2NhdGlvbm1baXMubmEocm8kbG9jYXRpb24pXQ0KdGFibGUocm8kbG9jYXRpb24pDQpgYGANClRoZXJlIGFyZSAzMzAgcGVvcGxlIHdobyB3aWxsIHZvdGUgYWJyb2FkLiBub3cgaXQncyBhIHNtYWxsIHNhbXBsZSwgbWF5YmUgbGF0ZXIgaXMgd29ydGggZG9pbmcgc29tZSBzb3J0IG9mIGFuYWx5c2lzIG9uIHRoZW0uDQoNCldlIGJyZWFrIGRvd24gdGhlIGxvY2F0aW9uIGFjY29yZGluZyB0byByZWdpb25zIChOVVRTMikuIEkgYW0gZG9pbmcgdGhpcyBiZWNhdXNlIHRoZSB1bHRpbWF0ZSBnb2FsIGlzIHRvIHdlaWdodCB0aGUgZGF0YSAodXNpbmcgY2Vuc3VzIGRhdGEsIHRyeWluZyB0byBtYWtlIHRoZSBkYXRhIG1vcmUgcmVwcmVzZW50YXRpdmUpDQpgYGB7cn0NCnJvJHJlZ2l1bmUgPC0gMA0Kcm8kcmVnaXVuZVtpcy5uYShybyRsb2NhdGlvbildIDwtIE5BICMgb3ZlcndyaXRlIDAncyB3aXRoIE5BJ3MgaWYgYmFja2dyb3VuZF9xdWVzdGlvbl84IGlzIE5BDQojIE5vcmQtVmVzdCAtIFJPMTE7IEJpaG9yLCBCaXN0cml0YS1OYXNhdWQsIENsdWosIE1hcmFtdXJlcywgU2F0dSBNYXJlLCBTYWxhag0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkJpaG9yIl0gPC0gICAgICAgICAiUk8xMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJDbHVqIl0gPC0gICAgICAgICAgIlJPMTEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQmlzdHJpdGEtTmFzYXVkIl08LSJSTzExIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09Ik1hcmFtdXJlcyJdIDwtICAgICAiUk8xMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJTYXR1IE1hcmUiXSA8LSAgICAgIlJPMTEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iU2FsYWoiXSA8LSAgICAgICAgICJSTzExIg0KIyBDZW50cnUgLSBSTzEyOyBBbGJhLCBCcmFzb3YsIENvdmFzbmEsIEhhcmdoaXRhLCBNdXJlcywgU2liaXUNCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJBbGJhIl0gPC0gICAgICAgIlJPMTIiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQnJhc292Il0gPC0gICAgICJSTzEyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkNvdmFzbmEiXSA8LSAgICAiUk8xMiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJIYXJnaGl0YSJdIDwtICAgIlJPMTIiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iTXVyZXMiXSA8LSAgICAgICJSTzEyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlNpYml1Il0gPC0gICAgICAiUk8xMiINCiMgTm9yZC1Fc3QgLSBSTzIxOyBCYWNhdSwgQm90b3NhbmksIElhc2ksIE5lYW10LCBTdWNlYXZhLCBWYXNsdWkNCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJCYWNhdSJdIDwtICAgICAgIlJPMjEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQm90b3NhbmkiXSA8LSAgICJSTzIxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09Iklhc2kiXSA8LSAgICAgICAiUk8yMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJOZWFtdCJdIDwtICAgICAgIlJPMjEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iU3VjZWF2YSJdIDwtICAgICJSTzIxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlZhc2x1aSJdIDwtICAgICAiUk8yMSINCiMgU3VkLUVzdCAtIFJPMjI7ICBCcmFpbGEsIEJ1emF1LCBDb25zdGFudGEsIEdhbGF0aSwgVHVsY2VhLCBWcmFuY2VhDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQnJhaWxhIl0gPC0gICAgICJSTzIyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkJ1emF1Il0gPC0gICAgICAiUk8yMiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJDb25zdGFudGEiXSA8LSAgIlJPMjIiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iR2FsYXRpIl0gPC0gICAgICJSTzIyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlR1bGNlYSJdIDwtICAgICAiUk8yMiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJWcmFuY2VhIl0gPC0gICAgIlJPMjIiDQojIFN1ZCAtIE11bnRlbmlhIC0gUk8zMTsgQXJnZXMsIENhbGFyYXNpLCBEYW1ib3ZpdGEsIEdpdXJnaXUsIElhbG9taXRhLCBQcmFob3ZhLCBUZWxlb3JtYW4NCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJBcmdlcyJdIDwtICAgICAgIlJPMzEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iQ2FsYXJhc2kiXSA8LSAgICJSTzMxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkRhbWJvdml0YSJdIDwtICAiUk8zMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJHaXVyZ2l1Il0gPC0gICAgIlJPMzEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iSWFsb21pdGEiXSA8LSAgICJSTzMxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlByYWhvdmEiXSA8LSAgICAiUk8zMSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJUZWxlb3JtYW4iXSA8LSAgIlJPMzEiDQojIEJ1Y3VyZXN0aSAtIElsZm92IC0gUk8zMjsgQnVjdXJlc3RpLCBJbGZvdg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkJ1Y3VyZXN0aSJdIDwtICAiUk8zMiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJJbGZvdiJdIDwtICAgICAgIlJPMzIiDQojIFN1ZC1WZXN0IE9sdGVuaWEgLSBSTzQxOyBEb2xqLCBHb3JqLCBNZWhlZGludGksIE9sdCwgVmFsY2VhDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iRG9saiJdIDwtICAgICAgICJSTzQxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkdvcmoiXSA8LSAgICAgICAiUk80MSINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJNZWhlZGludGkiXSA8LSAgIlJPNDEiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iT2x0Il0gPC0gICAgICAgICJSTzQxIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlZhbGNlYSJdIDwtICAgICAiUk80MSINCiMgVmVzdCAtIFJPNDI7IEFyYWQsIENhcmFzLVNldmVyaW4sIEh1bmVkb2FyYSwgVGltaXMNCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJBcmFkIl0gPC0gICAgICAgICJSTzQyIg0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IkNhcmFzLVNldmVyaW4iXTwtIlJPNDIiDQpybyRyZWdpdW5lW3JvJGxvY2F0aW9uPT0iSHVuZWRvYXJhIl0gPC0gICAiUk80MiINCnJvJHJlZ2l1bmVbcm8kbG9jYXRpb249PSJUaW1pcyJdIDwtICAgICAgICJSTzQyIg0KIyBzdHJhaW5hdGF0ZSA9IGFicm9hZA0Kcm8kcmVnaXVuZVtybyRsb2NhdGlvbj09IlN0cmFpbmF0YXRlIl0gPC0gImFicm9hZCINCnJvJHJlZ2l1bmVbcm8kcmVnaXVuZT09MF0gPC0gTkENCnRhYmxlKHJvJHJlZ2l1bmUpDQpgYGANCg0KQWZ0ZXIgd2UgaGF2ZSBhbiBpZGVhIGFib3V0IHdobyB0aGUgdXNlcnMgYXJlIGFuZCB3aGVyZSB0aGV5IGNvbWUgZnJvbSwgbGV0J3MgbG9vayBpbnRvIHRoZWlyIHBvbGl0aWNhbCBhZmZpbGl0aW9uLiBIZXJlIHdlIHNlZSBmb3Igd2hpY2ggY29hbGl0aW9uIHRoZXkgdm90ZWQgZm9yIGluIHRoZSBsYXN0IHBhcmxpYW1lbnRhcnkgZWxlY3Rpb25zIG9mIDIwMTIuIEhlcmUgd2UgbWlzcyBxdWl0ZSBhIGZldyB1c2VycywgYmVjYXVzZSB0aGV5IGRvbnQgcmVtZW1iZXIgd2hvIHRoZXkgdm90ZWQgZm9yICh0aXBpY2FsbHkpLiANCmBgYHtyfQ0Kcm8kdm90ZXJlYyA8LSAwDQpybyR2b3RlcmVjW2lzLm5hKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTApXSA8LSBOQQ0Kcm8kdm90ZXJlYyA8LSBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8xMD09MCwgIlVTTCIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzEwPT0xLCAiQVJEIiwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTA9PTIsICJQUEREIiwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTA9PTMsICJVRE1SIiwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTA9PTQsICJvdGhlciIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzEwPT02LCAiZGlkIG5vdCB2b3RlIiwNCiAgICAgICAgICAgICAgICAgICAgIE5BKSkpKSkpDQoNCnJvJHZvdGVyZWNtIDwtIDANCnJvJHZvdGVyZWNtW2lzLm5hKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTFfaXNfbW9iaWxlKV0gPC0gTkENCnJvJHZvdGVyZWNtIDwtIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzExX2lzX21vYmlsZT09MCwgIlVTTCIsDQogICAgICAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8xMV9pc19tb2JpbGU9PTEsICJBUkQiLA0KICAgICAgICAgICAgICAgaWZlbHNlKHJvJGJhY2tncm91bmRfcXVlc3Rpb25fMTFfaXNfbW9iaWxlPT0yLCAiUFBERCIsDQogICAgICAgICAgICAgICBpZmVsc2Uocm8kYmFja2dyb3VuZF9xdWVzdGlvbl8xMV9pc19tb2JpbGU9PTMsICJVRE1SIiwNCiAgICAgICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzExX2lzX21vYmlsZT09NCwgIm90aGVyIiwNCiAgICAgICAgICAgICAgIGlmZWxzZShybyRiYWNrZ3JvdW5kX3F1ZXN0aW9uXzExX2lzX21vYmlsZT09NiwgImRpZCBub3Qgdm90ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpKSkNCg0Kcm8kdm90ZXJlY1tpcy5uYShybyR2b3RlcmVjKV0gPC0gcm8kdm90ZXJlY21baXMubmEocm8kdm90ZXJlYyldDQp2b3RlcmVjIDwtIHJvW2MoInZvdGVyZWMiKV0NCnZvdGVyZWMgPC0gbmEub21pdCh2b3RlcmVjKQ0Kdm90ZXJlYyR2b3RlcmVjIDwtIGZhY3Rvcih2b3RlcmVjJHZvdGVyZWMsIGMoIkFSRCIsICJQUEREIiwgIlVETVIiLCAiVVNMIiwgIm90aGVyIiwgImRpZCBub3Qgdm90ZSIpKQ0KZ2dwbG90KHZvdGVyZWMsIGFlcyh4ID0gZmFjdG9yKHZvdGVyZWMpKSkgKyBnZW9tX2JhcihzdGF0ID0gImNvdW50IiwgZmlsbD0iZGFya2JsdWUiLCBjb2xvdXI9ImJsYWNrIikgKyBsYWJzKHRpdGxlID0gIlZvdCBsYSBhbGVnZXJpbGUgcGFybGFtZW50YXJlIDIwMTIiLCB4PSIiKSArIHRoZW1lX21pbmltYWwoKSANCg0KYGBgDQoNCldlIGNhbiBzZWUgd2hvIHRoZXkgaW50ZW5kIHRvIHZvdGUgZm9yLCB3aGljaCBpcyBxdWl0ZSBleGNpdGluZyANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0Kcm8kdm90ZWludCA8LSBpZmVsc2Uocm8kcG9wdXBfcXVlc3Rpb25fNj09MCwgIlBTRCIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRwb3B1cF9xdWVzdGlvbl82PT0xLCAiQUxERSIsDQogICAgICAgICAgICAgIGlmZWxzZShybyRwb3B1cF9xdWVzdGlvbl82PT0yLCAiUE5MIiwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHBvcHVwX3F1ZXN0aW9uXzY9PTMsICJVRE1SIiwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHBvcHVwX3F1ZXN0aW9uXzY9PTQsICJVU1IiLA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcG9wdXBfcXVlc3Rpb25fNj09NSwgIm90aGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkpKQ0Kdm90ZWludCA8LSByb1tjKCJ2b3RlaW50IildDQp2b3RlaW50IDwtIG5hLm9taXQodm90ZWludCkNCnZvdGVpbnQkdm90ZWludCA8LSBmYWN0b3Iodm90ZWludCR2b3RlaW50LCBjKCJBTERFIiwgIlBOTCIsICJQU0QiLCAiVURNUiIsICJVU1IiLCAib3RoZXIiKSkNCmdncGxvdCh2b3RlaW50LCBhZXMoeCA9IGZhY3Rvcih2b3RlaW50KSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIsIGZpbGw9ImRhcmtibHVlIiwgY29sb3VyPSJibGFjayIpICsgbGFicyh0aXRsZSA9ICJJbnRlbnRpZSBkZSB2b3QgbGEgYWxlZ2VyaWxlIHBhcmxhbWVudGFyZSAyMDE2IiwgeD0iIikgKyB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KIyNJIHNhdmVkIHRoZSBiZXN0IGZvciB0aGUgZW5kOiB3ZSBjYW4gc2VlIGhvdyB0aGUgdXNlcnMgYW5zd2VyZWQgb24gdGhlIHN0YXRlbWVudHMuIEkgdXNlZCBwZXJjZW50YWdlcw0KMSBtZWFucyAiQ29tcGxldGVseSBkaXNzYWdyZWUsIDMsICJOZWl0aGVyIGFncmVlIG5vciBkaXNhZ3JlZSIsIDUgIiJDb21wbGV0ZWx5IGFncmVlIiwgLTEgIk5vIG9waW5pb24iDQoNCl9fRnJlZSBtYXJrZXQgbWFrZXMgdGhlIGhlYWx0aCBzeXN0ZW0gdG8gZnVuY3Rpb24gYmV0dGVyX18gICANCkNvbXBldGl0aWEgZWNvbm9taWNhIGxpYmVyYSBmYWNlIHNpc3RlbXVsIGRlIHNhbmF0YXRlIHNhIGZ1bmN0aW9uZXplIG1haSBlZmljaWVudAkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzBbcm8kc3RhdGVtZW50XzA9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8wKSkgKiAxMDANCmBgYA0KX19UaGUgbnVtYmVyIG9mIGVtcGxveWVlcyBpbiB0aGUgcHVibGljIHNlY3RvciBzaG91bGQgYmUgcmVkdWNlZF9fICAgICAgICAgICANCk51bWFydWwgYW5nYWphdGlsb3IgZGluIHNlY3RvcnVsIHB1YmxpYyBhciB0cmVidWkgcmVkdXMJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8xW3JvJHN0YXRlbWVudF8xPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMSkpICogMTAwDQpgYGANCl9fVGhlIHN0YXRlIHNob3VsZCBpbnRlcnZlbmUgaW4gdGhlIGVjb25vbXkgYXMgbGl0dGxlIGFzIHBvc3NpYmxlX18gICAgICAgDQpTdGF0dWwgYXIgdHJlYnVpIHNhIGludGVydmluYSBjYXQgbWFpIHB1dGluIHBvc2liaWwgaW4gZWNvbm9taWUJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8yW3JvJHN0YXRlbWVudF8yPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMikpICogMTAwDQpgYGANCl9fUm9tYW5pYSBzaG91bGQgYWRvcHQgYSBwcm9ncmVzc2l2ZSB0YXhhdGlvbiBzeXN0ZW1fXyAgICAgICAgICANClJvbWFuaWEgYXIgdHJlYnVpIHNhIGFkb3B0ZSB1biBzaXN0ZW0gZGUgdGF4YXJlIHByb2dyZXNpdmEJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8zW3JvJHN0YXRlbWVudF8zPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMykpICogMTAwDQpgYGANCl9fRm9yZWlnbiBpbnZlc3RvcnMgYXJlIGEgdGhyZWF0IHRvIFJvbWFuaWEncyBuYXRpb25hbCBzb3ZlcmVpZ250eV9fICAgICAgICAgIA0KSW52ZXN0aXRvcmlpIHN0cmFpbmkgc3VudCBvIGFtZW5pbnRhcmUgbGEgc3V2ZXJhbml0YXRlYSBuYXRpb25hbGEgYSBSb21hbmllaQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzRbcm8kc3RhdGVtZW50XzQ9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF80KSkgKiAxMDANCmBgYA0KX19WVEEgc2hvdWxkIGJlIHJlZHVjZWQgdW5kZXIgMjAlX18gICAgICAgDQpUVkEgdHJlYnVpZSByZWR1cyBzdWIgcHJhZ3VsIGRlIDIwJQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzVbcm8kc3RhdGVtZW50XzU9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF81KSkgKiAxMDANCmBgYA0KX19Sb21hbmlhIHNob3VsZCBuZXZlciBhZG9wdCB0aGUgZXVyb19fICAgICAgICAgIA0KUm9tYW5pYSBhciB0cmVidWkgc2EgbnUgYWRvcHRlIG5pY2lvZGF0YSBtb25lZGEgRXVybwkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzZbcm8kc3RhdGVtZW50XzY9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF82KSkgKiAxMDANCmBgYA0KX19JbnRlcm5hdGlvbmFsIGFjdG9ycyAoc3VjaCBhcyBFVSBvciBVU0EpIGhhdmUgdGhlIHJpZ2h0IHRvIGludGVydmVuZSBpbiBSb21hbmlhJ3MgaW50ZXJuYWwgYWZmYWlycyBpZiB0aGUgc3RhdGUgb2YgZGVtb2NyYWN5IGlzIHRocmVhdGVuZF9fICAgICAgICAgDQpQYXJ0ZW5lcmlpIGludGVybmF0aW9uYWxpIChwcmVjdW0gVUUgc2F1IFNVQSkgcG90IGludGVydmVuaSBpbiBhZmFjZXJpbGUgaW50ZXJuZSBhbGUgUm9tYW5pZWkgYXR1bmNpIGNhbmQgZXhpc3RhIG8gYW1lbmludGFyZSBsYSBhZHJlc2EgZGVtb2NyYXRpZWkJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF83W3JvJHN0YXRlbWVudF83PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfNykpICogMTAwDQpgYGANCl9fVGhlIHN0cmF0ZWdpYyBwYXJ0bmVyc2hpcCB3aXRoIFVTQSBpcyBlc3NlbnRpYWwgZm9yIFJvbWFuaWEncyBuYXRpb25hbCBzZWN1cml0eV9fICAgICAgICAgIA0KUGFydGVuZXJpYXR1bCBzdHJhdGVnaWMgY3UgU1VBIGVzdGUgZXNlbnRpYWwgcGVudHJ1IHNlY3VyaXRhdGVhIG5hdGlvbmFsYQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50Xzhbcm8kc3RhdGVtZW50Xzg9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF84KSkgKiAxMDANCmBgYA0KX19Xb21lbiBzaG91bGQgYmUgYWJsZSB0byBkZWNpZGUgb24gYW55IG1hdHRlcnMgcmVsYXRlZCB0byBhYm9ydGlvbl9fICAgICAgICAgIA0KRmVtZWlsZSBhciB0cmVidWkgc2EgYWliYSBsaWJlcnRhdGVhIGRlIGEgZGVjaWRlIGFzdXByYSBjaGVzdGl1bmlsb3IgbGVnYXRlIGRlIGF2b3J0DQpgYGB7cn0NCnJvJHN0YXRlbWVudF85W3JvJHN0YXRlbWVudF85PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfOSkpICogMTAwDQpgYGANCl9fUm9tYW5pYSBzaG91bGQgbm90IHJlY2VpdmUgcmVmdWdlZXMgdGhhdCB0cnkgdG8gZW50ZXIgdGhlIEVVX18gICAgICAgICAgDQpSb21hbmlhIGFyIHRyZWJ1aSBzYSBhY2NlcHRlIG1haSBtdWx0aSBtaWdyYW50aSBjYXJlIGludHJhIGluIFVFLCBjYSBzZW1uIGRlIHNvbGlkYXJpdGF0ZQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzEwW3JvJHN0YXRlbWVudF8xMD09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzEwKSkgKiAxMDANCmBgYA0KX19HYXkgY291cGxlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSByaWdodHMgYXMgdGhlIGhldGVyb3NleHVhbCBvbmVzX18gICAgICAgDQpDdXBsdXJpbGUgaG9tb3NleHVhbGUgYXIgdHJlYnVpIHNhIHNlIGJ1Y3VyZSBkZSBhY2VsZWFzaSBkcmVwdHVyaSBjYSBzaSBjdXBsdXJpbGUgaGV0ZXJvc2V4dWFsZQkNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KdGFibGUocm8kc3RhdGVtZW50XzExKQ0Kcm8kc3RhdGVtZW50XzExW3JvJHN0YXRlbWVudF8xMT09Ii0xIl0gPC0gTkENCg0Kcm8kc3RhdGVtZW50XzExW3JvJHN0YXRlbWVudF8xMT09IjEiXSA8LSAiVG90YWwgaW1wb3RyaXZhIg0Kcm8kc3RhdGVtZW50XzExW3JvJHN0YXRlbWVudF8xMT09IjIiXSA8LSAiSW1wb3RyaXZhIg0Kcm8kc3RhdGVtZW50XzExW3JvJHN0YXRlbWVudF8xMT09IjMiXSA8LSAiTmV1dHJ1Ig0Kcm8kc3RhdGVtZW50XzExW3JvJHN0YXRlbWVudF8xMT09IjQiXSA8LSAiRGUgYWNvcmQiDQpybyRzdGF0ZW1lbnRfMTFbcm8kc3RhdGVtZW50XzExPT0iNSJdIDwtICJUb3RhbCBkZSBhY29yZCINCnJvJHN0YXRlbWVudF8xMSA8LSBmYWN0b3Iocm8kc3RhdGVtZW50XzExLCBjKCJUb3RhbCBpbXBvdHJpdmEiLCAiSW1wb3RyaXZhIiwgIk5ldXRydSIsICJEZSBhY29yZCIsICJUb3RhbCBkZSBhY29yZCIpKQ0KDQpnZ3Bsb3Qocm8sIGFlcyh4ID0gZmFjdG9yKHN0YXRlbWVudF8xMSkpKSArIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLCBmaWxsPSJkYXJrYmx1ZSIsIGNvbG91cj0iYmxhY2siKSArIGxhYnModGl0bGUgPSAiQ3VwbHVyaWxlIGhvbW9zZXh1YWxlIGFyIHRyZWJ1aSBcbiBzYSBzZSBidWN1cmUgZGUgYWNlbGVhc2kgZHJlcHR1cmkgY2Egc2kgY3VwbHVyaWxlIGhldGVyb3NleHVhbGUiLCB4ID0gIiIsIHkgPSAiTnVtYXIgdXRpbGl6YXRvcmkiKSArIHRoZW1lX21pbmltYWwoKSANCmBgYA0KX19TbW9raW5nIHNob3VsZCBiZSBwcm9oaWJpdGVkIGluIGFsbCB0aGUgcHVibGljIHBsYWNlcywgZXZlbiB0aGUgb3Blbi1zcGFjZSBvbmVzX18gICAgICAgICAgICANCkZ1bWF0dWwgdHJlYnVpZSBpbnRlcnppcyBpbiB0b2F0ZSBsb2N1cmlsZSBwdWJsaWNlLCBjaGlhciBzaSBjZWxlIGRlc2NoaXNlCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMTJbcm8kc3RhdGVtZW50XzEyPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMTIpKSAqIDEwMA0KYGBgDQpfX0ltbWlncmFudHMgc2hvdWxkIGFkb3B0IHRoZSB2YWx1ZXMgYW5kIGN1bHR1cmUgb2YgUm9tYW5pYV9fICAgICAgICAgIA0KSW1pZ3JhbnRpaSBhciB0cmVidWkgc2Egc2UgYWRhcHRlemUgbGEgdmFsb3JpbGUgc2kgY3VsdHVyYSBSb21hbmllaQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzEzW3JvJHN0YXRlbWVudF8xMz09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzEzKSkgKiAxMDANCmBgYA0KX19Sb21hbmlhIHNob3VsZCBwdXJzdWUgc3RhdGUgdW5pZmljYXRpb24gd2l0aCBNb2xkb3ZhX18gICAgICAgICANClJvbWFuaWEgYXIgdHJlYnVpIHNhIHVybWFyZWFzY2EgcmV1bmlmaWNhcmVhIHN0YXRhbGEgY3UgUmVwdWJsaWNhIE1vbGRvdmEJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8xNFtybyRzdGF0ZW1lbnRfMTQ9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8xNCkpICogMTAwDQpgYGANCl9fQSB0ZXJyaXRvcmlhbCByZWZvcm0gc2hvdWxkIGluY2x1ZGUgdGhlIGNyZWF0aW9uIG9mIGFuIGF1dG9ub21vdXMgSHVuZ2FyaWFuIHJlZ2lvbl9fICAgICAgICAgDQpPIHJlZm9ybWEgdGVyaXRvcmlhbGEgYXIgdHJlYnVpIHNhIGluY2x1ZGEgY3JlYXJlYSB1bmVpIHJlZ2l1bmkgbWFnaGlhcmUgYXV0b25vbWUJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8xNVtybyRzdGF0ZW1lbnRfMTU9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8xNSkpICogMTAwDQoNCnJvJHN0YXRlbWVudF8xNVtybyRzdGF0ZW1lbnRfMTU9PSIxIl0gPC0gIlRvdGFsIGltcG90cml2YSINCnJvJHN0YXRlbWVudF8xNVtybyRzdGF0ZW1lbnRfMTU9PSIyIl0gPC0gIkltcG90cml2YSINCnJvJHN0YXRlbWVudF8xNVtybyRzdGF0ZW1lbnRfMTU9PSIzIl0gPC0gIk5ldXRydSINCnJvJHN0YXRlbWVudF8xNVtybyRzdGF0ZW1lbnRfMTU9PSI0Il0gPC0gIkRlIGFjb3JkIg0Kcm8kc3RhdGVtZW50XzE1W3JvJHN0YXRlbWVudF8xNT09IjUiXSA8LSAiVG90YWwgZGUgYWNvcmQiDQpybyRzdGF0ZW1lbnRfMTUgPC0gZmFjdG9yKHJvJHN0YXRlbWVudF8xNSwgYygiVG90YWwgaW1wb3RyaXZhIiwgIkltcG90cml2YSIsICJOZXV0cnUiLCAiRGUgYWNvcmQiLCAiVG90YWwgZGUgYWNvcmQiKSkNCg0KZ2dwbG90KHJvLCBhZXMoeCA9IGZhY3RvcihzdGF0ZW1lbnRfMTUpKSkgKyBnZW9tX2JhcihzdGF0ID0gImNvdW50IiwgZmlsbD0iZGFya2JsdWUiLCBjb2xvdXI9ImJsYWNrIikgKyBsYWJzKHRpdGxlID0gIk8gcmVmb3JtYSB0ZXJpdG9yaWFsYSBhciB0cmVidWkgc2EgaW5jbHVkYSBcbiBjcmVhcmVhIHVuZWkgcmVnaXVuaSBtYWdoaWFyZSBhdXRvbm9tZSIsIHggPSAiIiwgeSA9ICJOdW1hciB1dGlsaXphdG9yaSIpKyB0aGVtZV9taW5pbWFsKCkgDQpgYGANCl9fVGhlIHN0YXRlIHNob3VsZCBnaXZlIHByaXZpbGVnZWQgc3RhdHVzIHRvIHRoZSBvcnRob2RveCBjaHVyY2hfXyAgICAgICAgIA0KU3RhdHVsIGFyIHRyZWJ1aSBzYSBhY29yZGUgdW4gc3RhdHV0IHByaXZpbGVnaWF0IEJpc2VyaWNpaSBPcnRvZG94ZQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzE2W3JvJHN0YXRlbWVudF8xNj09Ii0xIl0gPC0gTkENCg0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMTYpKSAqIDEwMA0KDQpybyRzdGF0ZW1lbnRfMTZbcm8kc3RhdGVtZW50XzE2PT0iMSJdIDwtICJUb3RhbCBpbXBvdHJpdmEiDQpybyRzdGF0ZW1lbnRfMTZbcm8kc3RhdGVtZW50XzE2PT0iMiJdIDwtICJJbXBvdHJpdmEiDQpybyRzdGF0ZW1lbnRfMTZbcm8kc3RhdGVtZW50XzE2PT0iMyJdIDwtICJOZXV0cnUiDQpybyRzdGF0ZW1lbnRfMTZbcm8kc3RhdGVtZW50XzE2PT0iNCJdIDwtICJEZSBhY29yZCINCnJvJHN0YXRlbWVudF8xNltybyRzdGF0ZW1lbnRfMTY9PSI1Il0gPC0gIlRvdGFsIGRlIGFjb3JkIg0Kcm8kc3RhdGVtZW50XzE2IDwtIGZhY3RvcihybyRzdGF0ZW1lbnRfMTYsIGMoIlRvdGFsIGltcG90cml2YSIsICJJbXBvdHJpdmEiLCAiTmV1dHJ1IiwgIkRlIGFjb3JkIiwgIlRvdGFsIGRlIGFjb3JkIikpDQoNCmdncGxvdChybywgYWVzKHggPSBmYWN0b3Ioc3RhdGVtZW50XzE2KSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIsIGZpbGw9ImRhcmtibHVlIiwgY29sb3VyPSJibGFjayIpICsgbGFicyh0aXRsZSA9ICJTdGF0dWwgYXIgdHJlYnVpIHNhIGFjb3JkZSB1biBzdGF0dXQgcHJpdmlsZWdpYXQgQmlzZXJpY2lpIE9ydG9kb3hlIiwgeCA9ICIiLCB5ID0gIk51bWFyIHV0aWxpemF0b3JpIikrIHRoZW1lX21pbmltYWwoKSANCmBgYA0KX19UaGUgZWxlY3RvcmFsIHRyZXNob2xkIHNob3VsZCBiZSBsb3dlcmVkLCBzbyBzbWFsbGVyIHBhcnRpZXMgY2FuIGdhaW4gYWNjZXNzIHRvIHRoZSBwYXJsaWFtZW50X18gICAgICAgICANClByYWd1bCBlbGVjdG9yYWwgYXIgdHJlYnVpIHJlZHVzIHBlbnRydSBhIHBlcm1pdGUgaW50cmFyZWEgcGFydGlkZWxvciBtYWkgbWljaSDubiBwYXJsYW1lbnQJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8xN1tybyRzdGF0ZW1lbnRfMTc9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8xNykpICogMTAwDQpgYGANCl9fVGhlIGVsZWN0b3JhbCByZWZvcm0gc2hvdWxkIGluY2x1ZGUgbG93ZXJpbmcgdGhlIG51bWJlciBvZiBzaWduYXR1cmVzIG5lZWRlZCBmb3IgY2FuZGlkYWN5IGZvciBhbGwgZWxlY3Rpb24gdHlwZXNfXyAgICAgICAgICAgIA0KTnVtYXJ1bCBkZSBzZW1uYXR1cmkgcGVudHJ1IGNhbmRpZGF0dXJhIGxhIHRvYXRlIHRpcHVyaWxlIGRlIGFsZWdlcmkgYXIgdHJlYnVpIHJlZHVzCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMThbcm8kc3RhdGVtZW50XzE4PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMTgpKSAqIDEwMA0KYGBgDQpfX1RoZSBudW1iZXIgb2YgcG9sbGluZyBzdGF0aW9ucyBmb3IgZGlhc3BvcmEgc2hvdWxkIGJlIGluY3JlYXNlZCBmb3IgYWxsIGVsZWN0aW9uIHR5cGVzX18gICAgICAgICAgICAgDQpOdW1hcnVsIGRlIHNlY3RpaSBkZSB2b3RhcmUgaW4gZGlhc3BvcmEgdHJlYnVpZSBtYXJpdCBwZW50cnUgdG9hdGUgdGlwdXJpbGUgZGUgYWxlZ2VyaQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzE5W3JvJHN0YXRlbWVudF8xOT09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzE5KSkgKiAxMDANCmBgYA0KX19UaGUgcG9zdGFsIHZvdGUgc2hvdWxkIGJlIGludHJvZHVjZWQgZm9yIGFsbCBlbGVjdGlvbiB0eXBlc19fICAgICAgICAgICAgICANClZvdHVsIHByaW4gY29yZXNwb25kZW50YSBhciB0cmVidWkgaW50cm9kdXMgcGVudHJ1IHRvYXRlIHRpcHVyaWxlIGRlIGFsZWdlcmkJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8yMFtybyRzdGF0ZW1lbnRfMjA9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8yMCkpICogMTAwDQpgYGANCl9fVGhlIGRpZ2l0YWxpemF0aW9uIG9mIHRoZSBqdWRpY2lhbCBwcm9jZXNzIHNob3VsZCBiZSBjb250aW51ZWQgYnkgcHVibGlzaGluZyBvbi1saW5lIGFsbCB0aGUgZGVjaXNpb25zX18gICAgICAgICAgICAgDQpEaWdpdGFsaXphcmVhIHByb2Nlc3VsdWkganVkaWNpYXIgdHJlYnVpZSBjb250aW51YXRhIHByaW4gcHVibGljYXJlYSBvbi1saW5lIGEgdHV0dXJvciBob3RhcmFyaWxvciBqdWRlY2F0b3Jlc3RpCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMjFbcm8kc3RhdGVtZW50XzIxPT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMjEpKSAqIDEwMA0KYGBgDQpfX0dvdmVybm1lbnQncyBwdWJsaWMgaW5mb3JtYXRpb24gbXVzdCBiZSBhY2Nlc3NpYmxlIG9ubGluZV9fICAgICAgICAgICAgDQpJbmZvcm1hdGlpbGUgcHVibGljZSBhbGUgZ3V2ZXJudWx1aSBhciB0cmVidWkgc2EgZmllIGFjY2VzaWJpbGUgb24tbGluZQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzIyW3JvJHN0YXRlbWVudF8yMj09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzIyKSkgKiAxMDANCmBgYA0KX19UaGUgb3BlbiB2b3RlIHNob3VsZCBiZSBpbnRyb2R1Y2VkIGZvciBhbGwgZGVjaXNpb25zIG1hZGUgaW4gdGhlIHBhcmxpYW1lbnRfXyAgICAgICAgICANClZvdHVsIGRlc2NoaXMgdHJlYnVpZSBpbnRyb2R1cyBwZW50cnUgdG9hdGUgZGVjaXppaWxlIGx1YXRlIGluIFBhcmxhbWVudAkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzIzW3JvJHN0YXRlbWVudF8yMz09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzIzKSkgKiAxMDANCmBgYA0KX19Qb2xpdGljaWFucyBwcm9zZWN1dGVkIGZvciBjb3JydXB0aW9uIHNob3VsZCBnaXZlIHVwIGFueSBwdWJsaWMgZnVuY3Rpb25fXyAgICAgICANClBvbGl0aWNpZW5paSB1cm1hcml0aSBwZW5hbCBwZW50cnUgZmFwdGUgZGUgY29ydXB0aWUgdHJlYnVpZSBzYSByZW51bnRlIGxhIG9yaWNlIGZ1bmN0aWUgcHVibGljYQkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzI0W3JvJHN0YXRlbWVudF8yND09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzI0KSkgKiAxMDANCmBgYA0KX19NUHMgc2hvdWxkIGVuam95IGltbXVuaXR5IHJpZ2h0cyBvbmx5IGZvciB2b3RlcyBhbmQgZGVjbGFyYXRpb25zX18gICAgIA0KUGFybGFtZW50YXJpaSBhciB0cmVidWkgc2EgYWliYSBpbXVuaXRhdGUgZG9hciBwZW50cnUgdm90dXJpIHNpIGRlY2xhcmF0aWkJDQpgYGB7cn0NCnJvJHN0YXRlbWVudF8yNVtybyRzdGF0ZW1lbnRfMjU9PSItMSJdIDwtIE5BDQpwcm9wLnRhYmxlKHRhYmxlKHJvJHN0YXRlbWVudF8yNSkpICogMTAwDQpgYGANCl9fR292ZXJubWVudHMgZm9ybWVkIGV4Y2x1c2l2ZWxseSBmcm9tIG5vbi1wYXJ0aXNhbiB0ZWhub2NyYXRzIHdvcmsgYmV0dGVyIHRoYW4gdGhvc2UgZm9ybWVkIGZyb20gcG9saXRpY2lhbnNfXyAgICAgICAgICAgIA0KR3V2ZXJuZWxlIGZvcm1hdGUgZXhjbHVzaXYgZGluIHRlaG5vY3JhdGkgbmVhZmlsaWF0aSBwb2xpdGljIGZ1bmN0aW9uZWF6YSBtYWkgYmluZSBkZWNhdCBjZWxlIGZvcm1hdGUgZGluIHBvbGl0aWNpZW5pCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMjZbcm8kc3RhdGVtZW50XzI2PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMjYpKSAqIDEwMA0KYGBgDQpfX1Byb3NlY3V0b3JzIGhhdmUgdG9vIG11Y2ggcG93ZXIgaW4gcHJvc2VjdXRpbmcgY2l0aXplbnNfXyAgICAgDQpQcm9jdXJvcmlpIGF1IHByZWEgbXVsdGEgcHV0ZXJlIO5uIGNlZWEgY2UgcHJpdmVzdGUgYW5jaGV0YXJlYSBjZXRhdGVuaWxvcgkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzI3W3JvJHN0YXRlbWVudF8yNz09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzI3KSkgKiAxMDANCmBgYA0KX19UaGUgTWVjaGFuaXNtIG9mIENvb3BlcmF0aW9uIGFuZCBWZXJpZmljYXRpb24sIHdoaWNoIHRyYWNrcyBwcm9ncmVzcyBpbiB0aGUganVkaWNpYXJ5IHN5c3RlbSByZWZvcm0gc2hvdWxkIGJlIG1haW50YWluZWRfXyAgDQpNZWNhbmlzbXVsIGRlIENvb3BlcmFyZSBzaSBWZXJpZmljYXJlLCBwcmluIGNhcmUgc2UgdmVyaWZpY2EgcHJvZ3Jlc2VsZSBpbiByZWZvcm1hcmVhIGp1c3RpdGllaSwgYXIgdHJlYnVpIGlubGF0dXJhdAkNCmBgYHtyfQ0Kcm8kc3RhdGVtZW50XzI4W3JvJHN0YXRlbWVudF8yOD09Ii0xIl0gPC0gTkENCnByb3AudGFibGUodGFibGUocm8kc3RhdGVtZW50XzI4KSkgKiAxMDANCmBgYA0KX19Sb21hbmlhIHNob3VsZCB3b3JrIG9uIHN0cmVuZ3RoZW5pbmcgaXRzIGRpcGxvbWF0aWMgcmVsYXRpb25zIHdpdGggUnVzaWFfXyAgICAgDQpSb21hbmlhIGFyIHRyZWJ1aSBzYSBpc2kgY29uc29saWRlemUgcmVsYXRpaWxlIGRpcGxvbWF0aWNlIGN1IFJ1c2lhCQ0KYGBge3J9DQpybyRzdGF0ZW1lbnRfMjlbcm8kc3RhdGVtZW50XzI5PT0iLTEiXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRzdGF0ZW1lbnRfMjkpKSAqIDEwMA0KYGBgDQoNCkludGVyZXN0IGluIHBvbGl0aWNzIDAgdmVyeSBtdWNoLCAzIG5vdCBhdCBhbGwNCmBgYHtyfQ0Kcm8kcG9wdXBfcXVlc3Rpb25fMltybyRwb3B1cF9xdWVzdGlvbl8yPT00XSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRwb3B1cF9xdWVzdGlvbl8yKSkgKiAxMDANCmBgYA0KDQoNCkxlZnQtcmlnaHQgc2VsZi1wb3NpdGlvbmluZywgMCBsZWZ0IDEwIHJpZ2h0DQpgYGB7cn0NCnJvJHBvcHVwX3F1ZXN0aW9uXzNbcm8kcG9wdXBfcXVlc3Rpb25fMz09MTFdIDwtIE5BDQpybyRwb3B1cF9xdWVzdGlvbl8zW3JvJHBvcHVwX3F1ZXN0aW9uXzM9PTEyXSA8LSBOQQ0KcHJvcC50YWJsZSh0YWJsZShybyRwb3B1cF9xdWVzdGlvbl8zKSkgKiAxMDANCmBgYA0KRXZhbHVhdGlvbiBvZiBDaW9sb3MnIGdvdmVybm1lbnQgcGVyZm9ybWFuY2UgMCB2ZXJ5IGdvb2QsIDQgdmVyeSBiYWQsIDUgZG9uJ3Qga25vdw0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKHJvJHBvcHVwX3F1ZXN0aW9uXzQpKSAqIDEwMA0KYGBgDQoNCg0KV2UgY2FuIGRvIHN0YWNrZWQgYmFycGxvdHMsIGxvb2tpbmcgYXQgYWdlIGFuZCBwb3NpdGlvbnMgb24gc3RhdGVtZW50cywgbGlrZSB0aGlzIGV4YW1wbGUgb24gdGhlIHN0YXRlbWVudCBvbiBnYXkgbWFycmlhZ2UNCmBgYHtyfQ0KdG9wbG90MiA8LSB0YWJsZShybyRhZ2UsIHJvJHN0YXRlbWVudF8xMSkNCnRvcGxvdDIgPC0gcm9bYyg2NywgMTA5KV0NCnRvcGxvdDIkYWdlW3RvcGxvdDIkYWdlPT0iMSJdIDwtICIxOC0yOSINCnRvcGxvdDIkYWdlW3RvcGxvdDIkYWdlPT0iMiJdIDwtICIzMC00OSINCnRvcGxvdDIkYWdlW3RvcGxvdDIkYWdlPT0iMyJdIDwtICI1MC02NCINCnRvcGxvdDIkYWdlW3RvcGxvdDIkYWdlPT0iNCJdIDwtICI2NSsiDQoNCnRvcGxvdDIkc3RhdGVtZW50XzExW3RvcGxvdDIkc3RhdGVtZW50XzExPT0iMSJdIDwtICJUb3RhbCBpbXBvdHJpdmEiDQp0b3Bsb3QyJHN0YXRlbWVudF8xMVt0b3Bsb3QyJHN0YXRlbWVudF8xMT09IjIiXSA8LSAiSW1wb3RyaXZhIg0KdG9wbG90MiRzdGF0ZW1lbnRfMTFbdG9wbG90MiRzdGF0ZW1lbnRfMTE9PSIzIl0gPC0gIk5ldXRydSINCnRvcGxvdDIkc3RhdGVtZW50XzExW3RvcGxvdDIkc3RhdGVtZW50XzExPT0iNCJdIDwtICJEZSBhY29yZCINCnRvcGxvdDIkc3RhdGVtZW50XzExW3RvcGxvdDIkc3RhdGVtZW50XzExPT0iNSJdIDwtICJUb3RhbCBkZSBhY29yZCINCnRvcGxvdDIkc3RhdGVtZW50XzExIDwtIGZhY3Rvcih0b3Bsb3QyJHN0YXRlbWVudF8xMSwgYygiVG90YWwgaW1wb3RyaXZhIiwgIkltcG90cml2YSIsICJOZXV0cnUiLCAiRGUgYWNvcmQiLCAiVG90YWwgZGUgYWNvcmQiKSkNCg0KdG9wbG90MiA8LSBuYS5vbWl0KHRvcGxvdDIpIA0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBseXIpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShncmlkRXh0cmEpDQprIDwtIGdncGxvdCh0b3Bsb3QyLCBhZXMoc3RhdGVtZW50XzExLCBmaWxsPWFnZSkpDQprICsgZ2VvbV9iYXIoKSArIHNjYWxlX2ZpbGxfYnJld2VyKCkgKyBsYWJzKHRpdGxlID0gIkN1cGx1cmlsZSBob21vc2V4dWFsZSBhciB0cmVidWkgXG4gc2Egc2UgYnVjdXJlIGRlIGFjZWxlYXNpIGRyZXB0dXJpIGNhIHNpIGN1cGx1cmlsZSBoZXRlcm9zZXh1YWxlIiwgeCA9ICJPcGluaWEgdXRpbGl6YXRvcnVsdWkiLCB5ID0gIk51bWFyIHV0aWxpemF0b3JpIikgKyB0aGVtZV9taW5pbWFsKCkgDQoNCmBgYA0KDQoNCldlIGNhbiBoYXZlIGEgbG9vayBhdCB0aGUgc2FtZSBzdGF0ZW1lbnQsIG9uIGdheSBtYXJyaWFnZSwgYnkgZWR1YWN0aW9uDQpgYGB7cn0NCnRvcGxvdDMgPC0gcm9bYyg2NywgMTExKV0NCg0KIyByZW5hbWUgZmFjdG9yIGxldmVscyBhZ2UNCnRvcGxvdDMkZWR1W3RvcGxvdDMkZWR1PT0iMCJdIDwtICJOdSBhbSBmb3N0IG5pY2lvZGF0YSBsYSBzY29hbGEiDQp0b3Bsb3QzJGVkdVt0b3Bsb3QzJGVkdT09IjEiXSA8LSAiU2NvYWxhIGdlbmVyYWxhIg0KdG9wbG90MyRlZHVbdG9wbG90MyRlZHU9PSIyIl0gPC0gIkxpY2V1IHNhdSBzY29hbGEgcHJvZmVzaW9uYWxhIg0KdG9wbG90MyRlZHVbdG9wbG90MyRlZHU9PSIzIl0gPC0gIkZhY3VsdGF0ZS9NYXN0ZXJhdC9Eb2N0b3JhdCINCnRvcGxvdDMkZWR1W3RvcGxvdDMkZWR1PT0iNCJdIDwtICJTdHVkaWkgcG9zdHVuaXZlcnNpdGFyZSINCnRvcGxvdDMkZWR1IDwtIGZhY3Rvcih0b3Bsb3QzJGVkdSwgYygiTnUgYW0gZm9zdCBuaWNpb2RhdGEgbGEgc2NvYWxhIiwgIlNjb2FsYSBnZW5lcmFsYSIsICJMaWNldSBzYXUgU2NvYWxhIHByb2Zlc2lvbmFsYSIsICJGYWN1bHRhdGUvTWFzdGVyYXQvRG9jdG9yYXQiLCAiU3R1ZGlpIHBvc3R1bml2ZXJzaXRhcmUiKSkNCnRvcGxvdDMkc3RhdGVtZW50XzExW3RvcGxvdDMkc3RhdGVtZW50XzExPT0iMSJdIDwtICJUb3RhbCBpbXBvdHJpdmEiDQp0b3Bsb3QzJHN0YXRlbWVudF8xMVt0b3Bsb3QzJHN0YXRlbWVudF8xMT09IjIiXSA8LSAiSW1wb3RyaXZhIg0KdG9wbG90MyRzdGF0ZW1lbnRfMTFbdG9wbG90MyRzdGF0ZW1lbnRfMTE9PSIzIl0gPC0gIk5ldXRydSINCnRvcGxvdDMkc3RhdGVtZW50XzExW3RvcGxvdDMkc3RhdGVtZW50XzExPT0iNCJdIDwtICJEZSBhY29yZCINCnRvcGxvdDMkc3RhdGVtZW50XzExW3RvcGxvdDMkc3RhdGVtZW50XzExPT0iNSJdIDwtICJUb3RhbCBkZSBhY29yZCINCnRvcGxvdDMkc3RhdGVtZW50XzExIDwtIGZhY3Rvcih0b3Bsb3QzJHN0YXRlbWVudF8xMSwgYygiVG90YWwgaW1wb3RyaXZhIiwgIkltcG90cml2YSIsICJOZXV0cnUiLCAiRGUgYWNvcmQiLCAiVG90YWwgZGUgYWNvcmQiKSkNCnRvcGxvdDMgPC0gbmEub21pdCh0b3Bsb3QzKQ0KDQpsIDwtIGdncGxvdCh0b3Bsb3QzLCBhZXMoc3RhdGVtZW50XzExLCBmaWxsPWVkdSkpDQpsICsgZ2VvbV9iYXIoKSArIHNjYWxlX2ZpbGxfYnJld2VyKCkgKyBsYWJzKHRpdGxlID0gIkN1cGx1cmlsZSBob21vc2V4dWFsZSBhciB0cmVidWkgXG4gc2Egc2UgYnVjdXJlIGRlIGFjZWxlYXNpIGRyZXB0dXJpIGNhIHNpIGN1cGx1cmlsZSBoZXRlcm9zZXh1YWxlIiwgeCA9ICJPcGluaWEgdXRpbGl6YXRvcnVsdWkiLCB5ID0gIk51bWFyIHV0aWxpemF0b3JpIikgKyB0aGVtZV9taW5pbWFsKCkgDQoNCmBgYA0KDQpBbmQgdGhlIHBvc3NpYmlsaXRpZXMgYXJlIGVuZGxlc3MhIEp1c3QgdGVsbCBtZSB3aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHNlZSBpbiBhIGdyYXBoIGFuZCBJJ2xsIGRvIGl0LiANCg0KDQpXRSBjYW4gbG9vayBhdCB0aGUgb3BpbmlvbnMgb24gc3RhdGVtZW50cyBnaXZlbiB0aGUgdXNlcidzIHBvbGl0aWNhbCBwcmVmZXJlbmNlcywgbW9yZSBwcmVjaXNlbHkgdGhlIHByb3BlbnNpdHkgdG8gdm90ZSBmb3IgdGhlIHBhcnRpZXMgKEkgc2VsZWN0ZWQgUFRWID4gNywgdGhlbiB0aGUgcGFydHkgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZSkNCmBgYHtyfQ0Kcm8kUFNEIDwtIGlmZWxzZShybyRwdHZfb3B0aW9uXzZfcXVlc3Rpb25fMzIgPT03LCA3LA0KICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzZfcXVlc3Rpb25fMzIgPT04LCA4LA0KICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzZfcXVlc3Rpb25fMzIgPT05LCA5LA0KICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzZfcXVlc3Rpb25fMzIgPT0xMCwgMTAsDQogICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkNCiAgICAgICAgICAgICAgICAgICAgDQpybyRQTkwgPC0gaWZlbHNlKHJvJHB0dl9vcHRpb25fN19xdWVzdGlvbl8zMiA9PTcsIDcsDQogICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fN19xdWVzdGlvbl8zMiA9PTgsIDgsDQogICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fN19xdWVzdGlvbl8zMiA9PTksIDksDQogICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fN19xdWVzdGlvbl8zMiA9PTEwLCAxMCwNCiAgICAgICAgICAgICAgICAgICAgTkEpKSkpDQoNCnJvJEFMREUgPC0gaWZlbHNlKHJvJHB0dl9vcHRpb25fOF9xdWVzdGlvbl8zMiA9PTcsIDcsDQogICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzhfcXVlc3Rpb25fMzIgPT04LCA4LA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl84X3F1ZXN0aW9uXzMyID09OSwgOSwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fOF9xdWVzdGlvbl8zMiA9PTEwLCAxMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkNCg0Kcm8kVURNUiA8LSBpZmVsc2Uocm8kcHR2X29wdGlvbl85X3F1ZXN0aW9uXzMyID09NywgNywNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fOV9xdWVzdGlvbl8zMiA9PTgsIDgsDQogICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzlfcXVlc3Rpb25fMzIgPT05LCA5LA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl85X3F1ZXN0aW9uXzMyID09MTAsIDEwLA0KICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKQ0KDQpybyRVU1IgPC0gaWZlbHNlKHJvJHB0dl9vcHRpb25fMTBfcXVlc3Rpb25fMzIgPT03LCA3LA0KICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzEwX3F1ZXN0aW9uXzMyID09OCwgOCwNCiAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl8xMF9xdWVzdGlvbl8zMiA9PTksIDksDQogICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fMTBfcXVlc3Rpb25fMzIgPT0xMCwgMTAsDQogICAgICAgICAgICAgICAgICAgICBOQSkpKSkNCg0Kcm8kUE1QIDwtICBpZmVsc2Uocm8kcHR2X29wdGlvbl8xMV9xdWVzdGlvbl8zMiA9PTcsIDcsDQogICAgICAgICAgICAgIGlmZWxzZShybyRwdHZfb3B0aW9uXzExX3F1ZXN0aW9uXzMyID09OCwgOCwNCiAgICAgICAgICAgICAgaWZlbHNlKHJvJHB0dl9vcHRpb25fMTFfcXVlc3Rpb25fMzIgPT05LCA5LA0KICAgICAgICAgICAgICBpZmVsc2Uocm8kcHR2X29wdGlvbl8xMV9xdWVzdGlvbl8zMiA9PTEwLCAxMCwNCiAgICAgICAgICAgICAgICAgICAgTkEpKSkpDQoNCnB0diA8LSByb1tjKDExOToxMjQpXQ0KcHR2JHB0dm1heCA8LSBhcHBseShwdHYsIDEsIGZ1bmN0aW9uKHgpIG5hbWVzICh4KSBbd2hpY2gubWF4KHgpXSkNCnB0diRwdHZtYXhbcHR2JHB0dm1heD09ImNoYXJhY3RlcigwKSJdIDwtIE5BDQpwdHYgPC1wdHZbLDddDQpwdHYgPC0gZGF0YS5mcmFtZSh1bmxpc3QocHR2KSkNCnRvcGxvdGdheSA8LSBjYmluZChwdHYsIHJvW2MoNjcpXSkNCnRvcGxvdGdheSA8LSBuYS5vbWl0KHRvcGxvdGdheSkNCnJlcXVpcmUoZ2dwbG90MikNCmdncGxvdCh0b3Bsb3RnYXksIGFlcyh4ID0gZmFjdG9yKHN0YXRlbWVudF8xMSkpKSArIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLCBmaWxsPSJkYXJrYmx1ZSIsIGNvbG91cj0iYmxhY2siKSArIGZhY2V0X2dyaWQofiB1bmxpc3QucHR2LikrIGxhYnModGl0bGUgPSAiQ3VwbHVyaWxlIGhvbW9zZXh1YWxlIGFyIHRyZWJ1aSBcbiBzYSBzZSBidWN1cmUgZGUgYWNlbGVhc2kgZHJlcHR1cmkgY2Egc2kgY3VwbHVyaWxlIGhldGVyb3NleHVhbGUiLCB4ID0gIjEgLSBUb3RhbCBpbXBvdHJpdmEsIDIgLSBJbXBvdHJpdmEsIDMgLSBOZXV0cnUsIDQgLSBEZSBhY29yZCwgNSAtIFRvdGFsIGRlIGFjb3JkIiwgeSA9ICJOdW1hciB1dGlsaXphdG9yaSIpICsgdGhlbWVfbWluaW1hbCgpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkNCg0KYGBgDQoNClRoZSBzYW1lIGFwcHJvYWNoLCBkaWZmZXJlbnQgcHJlc2VudGF0aW9uDQpgYGB7cn0NCnRvcGxvdGdheSRzdGF0ZW1lbnRfMTFbdG9wbG90Z2F5JHN0YXRlbWVudF8xMT09IjEiXSA8LSAiVG90YWwgaW1wb3RyaXZhIg0KdG9wbG90Z2F5JHN0YXRlbWVudF8xMVt0b3Bsb3RnYXkkc3RhdGVtZW50XzExPT0iMiJdIDwtICJJbXBvdHJpdmEiDQp0b3Bsb3RnYXkkc3RhdGVtZW50XzExW3RvcGxvdGdheSRzdGF0ZW1lbnRfMTE9PSIzIl0gPC0gIk5ldXRydSINCnRvcGxvdGdheSRzdGF0ZW1lbnRfMTFbdG9wbG90Z2F5JHN0YXRlbWVudF8xMT09IjQiXSA8LSAiRGUgYWNvcmQiDQp0b3Bsb3RnYXkkc3RhdGVtZW50XzExW3RvcGxvdGdheSRzdGF0ZW1lbnRfMTE9PSI1Il0gPC0gIlRvdGFsIGRlIGFjb3JkIg0KdG9wbG90Z2F5JHN0YXRlbWVudF8xMSA8LSBmYWN0b3IodG9wbG90Z2F5JHN0YXRlbWVudF8xMSwgYygiVG90YWwgaW1wb3RyaXZhIiwgIkltcG90cml2YSIsICJOZXV0cnUiLCAiRGUgYWNvcmQiLCAiVG90YWwgZGUgYWNvcmQiKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KcCA8LSBnZ3Bsb3QodG9wbG90Z2F5LCBhZXMoc3RhdGVtZW50XzExLCBmaWxsPXVubGlzdC5wdHYuKSkNCnAgKyBnZW9tX2JhcigpICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSArIGxhYnModGl0bGUgPSAiQ3VwbHVyaWxlIGhvbW9zZXh1YWxlIGFyIHRyZWJ1aSBcbiBzYSBzZSBidWN1cmUgZGUgYWNlbGVhc2kgZHJlcHR1cmkgY2Egc2kgY3VwbHVyaWxlIGhldGVyb3NleHVhbGUiLCB4ID0gIiIsIHkgPSAiTnVtYXIgdXRpbGl6YXRvcmkiKSArIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKyB0aGVtZV9taW5pbWFsKCkgDQoNCg0KYGBgDQoNCg==