ford <- read.csv("ford.csv")
ford<-ford[ford$model !=" B-MAX",]
ford<-ford[ford$model !=" Ka+" ,]
ford<-ford[ford$model !=" S-MAX",]
ford<-ford[ford$model !=" C-MAX",]
ford<-ford[ford$model !=" Fusion",]
ford<-ford[ford$model !=" Kuga",]
ford<-ford[ford$model !=" Streetka",]
ford<-ford[ford$model != " EcoSport",]
ford<-ford[ford$model !=" Galaxy",]
ford<-ford[ford$model !=" Mondeo",]
ford<-ford[ford$model !=" Tourneo Connect",]
ford<-ford[ford$model !=" Edge" ,]
ford<-ford[ford$model !=" Grand C-MAX" ,]
ford<-ford[ford$model !=" Mustang" ,]
ford<-ford[ford$model !=" Tourneo Custom" ,]
ford<-ford[ford$model != " Escort" ,]
ford<-ford[ford$model !=" Grand Tourneo Connect" ,]
ford<-ford[ford$model !=" Puma" ,]
ford<-ford[ford$model !=" Transit Tourneo" ,]
ford<-ford[ford$model !=" KA" ,]
ford<-ford[ford$model !=" Ranger" ,]
ford<-ford[ford$year !=1996,]
ford<-ford[ford$year !=1998,]
ford<-ford[ford$year !=2000,]
ford<-ford[ford$year !=2002,]
ford<-ford[ford$year !=2003,]
ford<-ford[ford$year !=2004,]
ford<-ford[ford$year !=2005,]
ford<-ford[ford$year !=2006,]
ford<-ford[ford$year !=2007,]
ford<-ford[ford$year !=2008,]
ford<-ford[ford$year !=2009,]
ford<-ford[ford$year !=2060,]

baujahr<-unique(ford$year)
sort(baujahr)
 [1] 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
unique(ford$fuelType)
[1] "Petrol" "Diesel"

** Mehrfaktorielle Varianzanalyse ohne Messwiederholung **

(ANOVA Multi Factor with Replication)

Hypothese

Haupteffekt A

\(H_0\):Es gibt KEINEN Unterschied zwischen den Getriebevarianten und dem Preis. \(H_1\):Es gibt EINEN Unterschied zwischen den Getriebevarianten und dem Preis. #### Haupteffekt B
\(H_0\):Es gibt KEINEN Unterschied zwischen den Treibstoffvarianten und dem Preis. \(H_1\):Es gibt EINEN Unterschied zwischen den Treibstoffvarianten und dem Preis. #### Interaktion AxB
\(H_0\): Es gibt KEINEN Unterschied zwischen den Getriebevarianten, bzw. den Treibstoffvarianten und dem Preis. \(H_1\): Es gibt EINEN Unterschied zwischen den Getriebevarianten, bzw. den Treibstoffvarianten und dem Preis.

Voraussetzungen

Die abhängige Variable ist mindestens intervallskaliert -> Preis ist gegeben, sogar Ratioskaliert.

Die unabhängigen Variablen (Getriebe und Treibstoff) sind kategorial (nominal- oder ordinalskaliert) -> sind sie. Die durch die Faktoren gebildeten Gruppen sind unabhängig -> Entweder hat das Auto automatische / manuelle / semiautomatische Getriebe, bzw. der Treibstoff ist entweder Petrol / Diesel.

Die abhängige Variablen ist normalverteilt innerhalb jeder der Gruppen. Ab 25 Probanden pro Gruppe sind Verletzungen dieser Voraussetzung unproblematisch-> siehe Histogramm

Homogenität der Varianzen: Die Gruppen stammen aus Grundgesamtheiten mit annähernd identischen Varianzen der abhängigen Variablen -> siehe Levene-Test

Deskriptive Statistiken + Prüfung der Voraussetzung

Histogramm zur Prüfung der Normalvertweilung

Treibstoff
library(dplyr)

Attache Paket: ‘dplyr’

Die folgenden Objekte sind maskiert von ‘package:stats’:

    filter, lag

Die folgenden Objekte sind maskiert von ‘package:base’:

    intersect, setdiff, setequal, union
library(ggplot2)
Need help getting started? Try the R Graphics Cookbook:
https://r-graphics.org
ford %>%
  group_by(fuelType) %>%
  ggplot(aes(price, color=fuelType)) + 
  geom_histogram(aes(fill = fuelType), binwidth = 1500) +
  facet_wrap(~fuelType) +
  theme_grey()+
  scale_color_manual(values=c("olivedrab3", "maroon2", "royalblue2"))+
  scale_fill_manual(values=c("olivedrab3", "maroon2", "royalblue2"))+
  theme(axis.text.x = element_text(angle = 45))+
  labs(x= "Preise",y = "Anzahl" )

Die Daten sind normalverteilt innerhalb der Gruppe Treibstoff in Bezug auf die Preise ##### Getriebe

library(ggpubr)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
gghistogram(ford, x = "price", bins = 50,
   add = "mean", rug = TRUE,
   color = "transmission", fill = "transmission",
   palette = c("violetred1", "#00AFBB", "olivedrab3"))

# library
library(ggplot2)
library(ggExtra)

 
# classic plot :
p <- ggplot(ford, aes(x=price, y=transmission, color=fuelType, size=fuelType)) +
      geom_point() +
      theme(legend.position="right")
 
# Set relative size of marginal plots (main plot 10x bigger than marginals)
 
# Custom marginal plots:
p2 <- ggMarginal(p, type="histogram", fill = "slateblue", xparams = list(  bins=10))
Warning: Using size for a discrete variable is not advised.
Warning: Using size for a discrete variable is not advised.
Warning in `[<-.mapped_discrete`(`*tmp*`, finite & x < range[1], value = "Automatic") :
  NAs introduced by coercion
Warning in `[<-.mapped_discrete`(`*tmp*`, finite & x > range[2], value = "Manual") :
  NAs introduced by coercion
Warning: Removed 11007 rows containing non-finite values (stat_bin).
 
# Show only marginal plot for x axis

p2

# 
# ford %>%
#   group_by(transmission) %>%
#   ggplot(aes(price, color=transmission)) + 
#   geom_histogram(aes(fill = transmission), binwidth = 1500) +
#   scale_color_manual(values=c("olivedrab3", "maroon2", "royalblue2"))+
#   scale_fill_manual(values=c("olivedrab3", "maroon2", "royalblue2"))+
#   facet_wrap(~transmission) +
#   theme_grey()+
#   theme(axis.text.x = element_text(angle = 45))+
#   labs(x= "Preis",y = "Anzahl" )

Die Daten sind normalverteilt innerhalb der Gruppe Getriebe in Bezug auf die Preise

ggplot(ford, aes(x=price))+
geom_histogram()+
scale_color_manual(values=c("olivedrab3", "maroon2", "royalblue2"))+
scale_fill_manual(values=c("olivedrab3", "maroon2", "royalblue2"))+
facet_wrap(transmission~fuelType, ncol = 2)
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Ab 25 Teilnehmer pro Gruppe ist das Testverfahren robust.

Boxplot

ggplot(ford, aes(transmission, price, fill=factor(fuelType))) +
geom_boxplot() +
theme_minimal()+
scale_fill_manual(values=c("maroon2", "royalblue2"))+
labs(fill = "Treibstoff", x="Getriebe", y="price")

Bei Manuell tauchen viele Ausreißer auf, da die jeweiligen n hier am größten sind. Mehr Daten bedeutet mehr Ausreißer.

Deskriptive Statistiken

ford %>%
group_by(fuelType) %>%
  summarize(Anzahl = n(), Mittelwert = mean(price), Median = median(price), Standardabweichung = sd(price)) %>%
  mutate_if(is.numeric, round, 2)

Beim Diesel Treibstoff ist der Mittelwert 11621.83 (SD = 4310.33, n = 1975). Beim Benzin Treibstoff ist der Mittelwert 11512.95 (SD = 3720.79, n = 9032). der sehr geringe Unterschied lässt vermuten, dass keine Signifikanz vorliegt.

ford %>%
group_by(transmission) %>%
  summarize(Anzahl = n(), Mittelwert = mean(price), Median = median(price), Standardabweichung = sd(price)) %>%
  mutate_if(is.numeric, round, 2)

Automatic hat 14511.60 als Mittelwert von Preis.
Manual hat 11344.09 als Mittelwert von Preis.
Semi-Auto hat 11830.83 als Mittelwert von Preis.

Es sind größere Unterschiede zu sehen als beim Treibstoff, was eher eine Signifikanz vermuten lässt. Die folgende Analyse wird das näher erläutern.

ford %>%
group_by(transmission, fuelType) %>%
  summarize(Anzahl = n(), Mittelwert = mean(price), Median = median(price), Standardabweichung = sd(price)) %>%
  mutate_if(is.numeric, round, 2)
`summarise()` has grouped output by 'transmission'. You can override using the `.groups` argument.
`mutate_if()` ignored the following grouping variables:
Column `transmission`

Bei den Automatic Diesel (M = 17633.69, SD = 3339.23) Autos ist der Mittelwert vom Preis am höchsten. Automatic Benzin (M = 13235.74, SD = 3994.54) hat den zweithöchsten, gefolgt von Semi-Auto Diesel (M = 12755.83). Die letzten drei sind in der Reihenfolge Semi-Auto Benzin(M = 11734.91, SD = 2881.74), Manuell Benzin (M = 11414.72, SD = 3721.70) und Manuell Diesel (M = 11015.11, SD = 3950.84)

Alternative

mittel <-tapply(ford$price, list(ford$fuelType, ford$transmission), mean, na.rm=TRUE)
mittel
       Automatic   Manual Semi-Auto
Diesel  17633.69 11015.11  12755.83
Petrol  13235.74 11414.72  11734.91
sd <-tapply(ford$price, list(ford$fuelType, ford$transmission), sd, na.rm=TRUE)
sd
       Automatic   Manual Semi-Auto
Diesel  3339.231 3950.843  3275.499
Petrol  3994.540 3721.701  2881.742
anzahlprogruppe <- tapply(ford$price, list(ford$fuelType, ford$transmission), function(x) sum(!is.na(x)))
anzahlprogruppe 
       Automatic Manual Semi-Auto
Diesel       170   1763        42
Petrol       416   8211       405

Profildiagramm

unique(ford$transmission)
[1] "Automatic" "Manual"    "Semi-Auto"
ford$transmission <- factor(ford$transmission, levels=c("Manual", "Semi-Auto", "Automatic")) 
unique(ford$transmission)
[1] Automatic Manual    Semi-Auto
Levels: Manual Semi-Auto Automatic
ggplot(ford, aes(x=transmission, y=price, group=fuelType, color= fuelType))+
  stat_summary(fun.y = mean, geom="point", size=3)+
  stat_summary(fun.y = mean, geom="line")+
  stat_summary(fun.data = mean_cl_normal, geom="errorbar",width=.2, size=.25)+
  labs(x="transmission", y="Price")+
  theme_classic()
Warning: `fun.y` is deprecated. Use `fun` instead.
Warning: `fun.y` is deprecated. Use `fun` instead.
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio


## Charge libraries:
#library(ggplot2)
#library(gganimate)
 
# Make a ggplot, but add frame=year: one image per year
##ggplot(ford, aes(price, transmission, size = model, color = fuelType)) +
#  geom_point() +
#  scale_x_log10() +
#  theme_bw() +
#  # gganimate specific bits:
#  labs(title = 'Price: {frame_time}', x = 'Price', y = 'transmission') +
#  transition_time(price) +
#  ease_aes('linear')

## Save at gif:
#anim_save("Year.gif")

Levene -Test

Der Levene-Test prüft die Nullhypothese, dass die Varianzen der Gruppen sich nicht unterscheiden. Ist der Levene-Test nicht signifikant, so kann von homogenen Varianzen ausgegangen. Wäre der Levene-Test jedoch signifikant, so wäre eine der Grundvoraussetzungen der Varianzanalyse verletzt. Gegen leichte Verletzungen gilt die Varianzanalyse als robust; vor allem bei genügend grossen und etwa gleich grossen Gruppen sind Verletzungen nicht problematisch. Bei ungleich grossen Gruppen führt eine starke Verletzung der Varianzhomogenität zu einer Verzerrung des F-Tests. Alternativ können dann auf den Brown-Forsythe-Test oder den Welch-Test zurückgegriffen werden. Dabei handelt es sich um adjustierte F-Tests.

library(car)
Lade nötiges Paket: carData

Attache Paket: ‘car’

Das folgende Objekt ist maskiert ‘package:dplyr’:

    recode
library(carData)
leveneTest(price ~ fuelType*transmission, data = ford, center = "mean")
Levene's Test for Homogeneity of Variance (center = "mean")
         Df F value    Pr(>F)    
group     5  12.516 3.854e-12 ***
      11001                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Im vorliegenden Beispiel ist der Levene-Test signifikant (F(5,11001) = 12.516, p < .000 ), sodass von Varianzheterogenität ausgegangen werden kann. Da die Varianzen nicht gleich sind, ist es zu empfehlen eine Korrektur mithilfe des Welch-Tests durchzuführen.

Entscheiungsregeln

Mit Welch-Korrektur: p < 0.05 => Ergebnis Signifikant –> Varianzen heterogen

Ohne Welch-Korrektur: p > 0.05 => Ergebnis nicht Signifikant –> Varianzen homogen –> H0 mit Annahme Var1=Var2=… -> Var_n wird angenommen

Ergebnisse der mehrfaktorielle Varianzanalyse (ohne Messwiederholung)

Keine Welch-Korrektur - ist der Standard

mehrAnova1 <- lm(price~transmission*fuelType, data = ford)
myAnova <- Anova(mehrAnova1, type = 3)
myAnova
Anova Table (Type III tests)

Response: price
                          Sum Sq    Df   F value    Pr(>F)    
(Intercept)           2.1391e+11     1 15328.251 < 2.2e-16 ***
transmission          6.8472e+09     2   245.327 < 2.2e-16 ***
fuelType              2.3176e+08     1    16.608 4.629e-05 ***
transmission:fuelType 2.6056e+09     2    93.355 < 2.2e-16 ***
Residuals             1.5352e+11 11001                        
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

mit Welch-Korrektur ist zur Kontrolle gedacht

Es liegt eine Verletzung der Varianzhomogenität vor(siehe Levene-Test). Daher sollte ein robusterer Test berücksichtigt werden (* mit welch* ). Allerdings bieten sich hier keine weitgehend akzeptierten Verfahren an. Daher wird der Standard weitergeführt.

transmissionwelch <- oneway.test(price~transmission, data = ford, var.equal = F)
transmissionwelch

    One-way analysis of means (not assuming equal variances)

data:  price and transmission
F = 154.66, num df = 2.0, denom df = 755.1, p-value < 2.2e-16

Für den Faktor transmission wird EIN Haupteffekt ersichtlich. Der Preis scheint demnach abhängig vom Getriebe zu sein (F(2,755.1) = 154.66, p < .000).

fuelwelch <- oneway.test(price~fuelType, data = ford, var.equal = F)
fuelwelch

    One-way analysis of means (not assuming equal variances)

data:  price and fuelType
F = 1.0836, num df = 1.0, denom df = 2654.3, p-value = 0.298

Für den Faktor Treibstoff wird KEIN Haupteffekt ersichtlich. Der Preis scheint demnach unabhängig vom Treibstoff zu sein (F(1,2654.3) = 1.0836, p = .298).

AXBwelch <- oneway.test(price~fuelType*transmission, data = ford, var.equal = F)
AXBwelch 

    One-way analysis of means (not assuming equal variances)

data:  price and fuelType * transmission
F = 136.67, num df = 5.00, denom df = 336.12, p-value < 2.2e-16

Der Interaktionsterm von Treibstoff und Getriebe auf den Preis ist signifikant (F(5,336.12) = 136.67, p = .000). Der Effekt von der Getriebe hängt demnach zu einem gewissen Teil vom Treibstoff ab.

Post-Hoc-Test

Ist ein Haupteffekt oder eine Interaktion signifikant, so ist zwar bestätigt, dass ein Effekt vorliegt, doch ist nach wie vor unklar, welche Faktorstufen sich unterscheiden, sobald ein Faktor mehr als zwei Ausprägungen aufweist. (Bei zwei Ausprägungen unterscheiden sich eben diese zwei Ausprägungen voneinander, sonst wäre der F-Test nicht signifikant.) Im vorliegenden Beispiel liegen ein Effekt der Getriebe sowie ein Interaktionseffekt vor. Post-hoc-Tests können einfach eingesetzt werden, um zu prüfen, welche Levels der Getriebe sich unterscheiden. Für die Interaktion ist dies in SPSS nicht implementiert.

Wie bereits erwähnt wurde, beinhaltet der Faktor Getriebe drei Stufen. Aus dem signifikanten Haupteffekt lässt sich nicht ableiten, welche der Faktorstufen einen signifikant unterschiedlichen Einfluss auf die abhängige Variable haben. Zu diesem Zweck werden Tukey-korrigierte Mehrfachvergleiche berechnet.

Bei der Berechnung von Post-hoc-Tests wird im Prinzip für jede Kombination von zwei Mittelwerten ein t-Test durchgeführt. Im aktuellen Beispiel der Getriebe mit drei Gruppen, bzw. zwei Gruppen sind dies 15 Tests. Multiple Tests sind jedoch problematisch, da der Alpha-Fehler (die fälschliche Ablehnung der Nullhypothese) mit der Anzahl der Vergleiche steigt. Wird nur ein t-Test mit einem Signifikanzlevel von .05 durchgeführt, so beträgt die Wahrscheinlichkeit des Nicht-Eintreffens des Alpha-Fehlers 95%. Werden jedoch 15 solcher Paarvergleiche vorgenommen, so beträgt die Nicht-Eintreffens-Wahrscheinlichkeit des Alpha-Fehlers (.95)15 = .4632. Um die Wahrscheinlichkeit des Eintreffens des Alpha-Fehlers zu bestimmen, wird 1 -.4632 = .5367 gerechnet. Die Wahrscheinlichkeit des Eintreffens des Alpha-Fehlers liegt somit bei 53.67%. Diese Fehlerwahrscheinlichkeit wird als “Familywise Error Rate” bezeichnet.

Um dieses Problem zu beheben, kann zum Beispiel die Tukey-Korrektur angewendet werden. Hierbei wird α durch die Anzahl der Paarvergleiche dividiert. Im hier aufgeführten Fall ist dies .05/15 = .00333. Bei diesem Konzept handelt es sich um eine allgemeine Information.

Die Tukey berücksichtigt die Korrektur, daher kann weiter gegen 0.05 getestet werden.

PostHoc <- aov(price ~ transmission*fuelType, data=ford) 
#Alternativ auch der Name des Zwischenspeichers "mehr" - PostHoc <- aov(mehr)  
TukeyHSD(PostHoc)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = price ~ transmission * fuelType, data = ford)

$transmission
                         diff        lwr       upr     p adj
Semi-Auto-Manual     486.7479   63.40129  910.0946 0.0193049
Automatic-Manual    3167.5090 2795.30736 3539.7107 0.0000000
Automatic-Semi-Auto 2680.7611 2130.86905 3230.6532 0.0000000

$fuelType
                 diff       lwr      upr    p adj
Petrol-Diesel 6.40114 -175.4951 188.2974 0.945006

$`transmission:fuelType`
                                        diff         lwr        upr
Semi-Auto:Diesel-Manual:Diesel     1740.7199    78.32838  3403.1114
Automatic:Diesel-Manual:Diesel     6618.5748  5763.48677  7473.6628
Manual:Petrol-Manual:Diesel         399.6075   120.12415   679.0909
Semi-Auto:Petrol-Manual:Diesel      719.7952   133.08791  1306.5025
Automatic:Petrol-Manual:Diesel     2220.6269  1640.26182  2800.9921
Automatic:Diesel-Semi-Auto:Diesel  4877.8549  3043.15797  6712.5518
Manual:Petrol-Semi-Auto:Diesel    -1341.1123 -2988.24570   306.0210
Semi-Auto:Petrol-Semi-Auto:Diesel -1020.9247 -2746.94982   705.1004
Automatic:Petrol-Semi-Auto:Diesel   479.9071 -1243.97258  2203.7867
Manual:Petrol-Automatic:Diesel    -6218.9673 -7043.99954 -5393.9350
Semi-Auto:Petrol-Automatic:Diesel -5898.7796 -6871.81235 -4925.7468
Automatic:Petrol-Automatic:Diesel -4397.9479 -5367.16969 -3428.7260
Semi-Auto:Petrol-Manual:Petrol      320.1877  -221.77931   862.1546
Automatic:Petrol-Manual:Petrol     1821.0194  1285.92462  2356.1142
Automatic:Petrol-Semi-Auto:Petrol  1500.8317   757.56806  2244.0954
                                      p adj
Semi-Auto:Diesel-Manual:Diesel    0.0338695
Automatic:Diesel-Manual:Diesel    0.0000000
Manual:Petrol-Manual:Diesel       0.0006589
Semi-Auto:Petrol-Manual:Diesel    0.0062914
Automatic:Petrol-Manual:Diesel    0.0000000
Automatic:Diesel-Semi-Auto:Diesel 0.0000000
Manual:Petrol-Semi-Auto:Diesel    0.1856985
Semi-Auto:Petrol-Semi-Auto:Diesel 0.5411891
Automatic:Petrol-Semi-Auto:Diesel 0.9687149
Manual:Petrol-Automatic:Diesel    0.0000000
Semi-Auto:Petrol-Automatic:Diesel 0.0000000
Automatic:Petrol-Automatic:Diesel 0.0000000
Semi-Auto:Petrol-Manual:Petrol    0.5425235
Automatic:Petrol-Manual:Petrol    0.0000000
Automatic:Petrol-Semi-Auto:Petrol 0.0000001

Wie vermutet, zeichnet sich bei Treibstoff KEINE Signifikanz ab. Die Getriebekombinationen unterscheiden sich signifikant.

Für das vorliegende Beispiel wird ersichtlich, dass sich der fuelType und das transmission bezüglich der Preis signifikant unterscheiden (p < .05).

Was ist sig und was nicht? 11 von 15 Vergleichen sind sig. (p < .05). Nicht sig. sind
Semi-Auto:Petrol-Manual:Petrol (p = 0.5425235),
Semi-Auto:Petrol-Semi-Auto:Diesel (p = 0.5411891),
Automatic:Petrol-Semi-Auto:Diesel (p = 0.9687149),
Manual:Petrol-Semi-Auto:Diesel (p = 0.1856985),

Generalisierbarkeit /Unabhängigkeit - global?

Beide Haupteffekte sind global.
Mit steigendem Automatisierungsgrad des Getriebes steigt der Preis für beide Varianten von Treibstoff.

Manual Diesel, Auto Diesel sind unabhaengig / generalisierbar.

Gruppenbildung?

Eine Regruppierung wird nicht empfohlen und die sechs Gruppen sollten beibehalten werden.
Durch die breite Streuung von Semi-Auto:Diesel übergreift diese Faktorkombination drei - andernfalls unabhängige - Kombinationen.

ford %>%
group_by(transmission, fuelType) %>%
  summarize(Anzahl = n(), Mittelwert = mean(price), Median = median(price), Standardabweichung = sd(price)) %>%
  mutate_if(is.numeric, round, 2)
`summarise()` has grouped output by 'transmission'. You can override using the `.groups` argument.
`mutate_if()` ignored the following grouping variables:
Column `transmission`

Interaktion?

Für Manuelle Fahrzeuge ist Benzin (M = 11414,72, SD = 3721,7, n = 8211) die teurere Alternative im Vergleich zu Diesel (M = 11015,11, SD = 3950,84, n = 1763). Der Unterschied ist jedoch nicht signifikant ausgefallen im Post-Hoc-Test.

Für Semiautomatische Getriebe sind die Diesel (M = 12755,83, SD = 3275,5, n = 42) teurer als Benziner (M = 11734,91, SD = 2881,74, n = 405). Auch dieser Unterschied ist nicht signifikantausgefallen im Post-Hoc-Test, was hauptsächlich an der vergleichsweise kleinen Samplesize n = 42 für Semi-Auto:Diesel liegt. Mehr Werte hätten diesen Bereich vermutlich mehr geschärft.

Für automatische Getriebe sind ebenfalls Dieselfahrzeuge (M = 17633,69, SD = 3339,23, n = 170) teurer als Benziner (M = 13235,74, SD = 3994,54, n = 416). Dieser Unterschied ist signifikant ausgefallen im Post-Hoc-Test.

Alternativ

Bonferroni und Tukey: sehr strenge Kontrolle des Fehlers 1. Art, zu geringe Teststärke, deshalb zu konservativ. Bei wenigen Paarvergleichen hat Bonferroni mehr Teststärke, bei vielen Paarvergleichen hat Tukey mehr Teststärke.

pairwise.t.test(ford$price, ford$transmission, data=ford, pool.sd=T,var.equal=FALSE)

    Pairwise comparisons using t tests with pooled SD 

data:  ford$price and ford$transmission 

          Manual Semi-Auto
Semi-Auto 0.0075 -        
Automatic <2e-16 <2e-16   

P value adjustment method: holm 
pairwise.t.test(ford$price, ford$fuelType, data=ford, pool.sd=T,var.equal=F)

    Pairwise comparisons using t tests with pooled SD 

data:  ford$price and ford$fuelType 

       Diesel
Petrol 0.25  

P value adjustment method: holm 

Bei diesem Testverfahren muss der aplhawert korrigiert werden.

newalpha<-  0.05/15
newalpha
[1] 0.003333333
interaktion=paste(ford$transmission, ford$fuelType, sep=".") 

pairwise.t.test(ford$price, interaktion, data=ford, var.equal=FALSE)

    Pairwise comparisons using t tests with pooled SD 

data:  ford$price and interaktion 

                 Automatic.Diesel Automatic.Petrol Manual.Diesel
Automatic.Petrol < 2e-16          -                -            
Manual.Diesel    < 2e-16          < 2e-16          -            
Manual.Petrol    < 2e-16          < 2e-16          0.00032      
Semi-Auto.Diesel 3.4e-13          0.42753          0.01423      
Semi-Auto.Petrol < 2e-16          7.1e-08          0.00284      
                 Manual.Petrol Semi-Auto.Diesel
Automatic.Petrol -             -               
Manual.Diesel    -             -               
Manual.Petrol    -             -               
Semi-Auto.Diesel 0.08129       -               
Semi-Auto.Petrol 0.27555       0.27555         

P value adjustment method: holm 

Games - Howell

interaktion=paste(ford$transmission, ford$fuelType, sep=".") 

ford["interaktion"] <- interaktion

View(ford)
#Faktor A
ford$transmission <- as.factor(ford$transmission)
ANOVA <- aov(price~transmission, ford)
erg <- PMCMRplus::gamesHowellTest(ANOVA)
summary (erg)

    Pairwise comparisons using Games-Howell test

data: price by transmission
alternative hypothesis: two.sided
P value adjustment method: none
H0
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Faktor B
ford$fuelType <- as.factor(ford$fuelType)
ANOVA <- aov(price~fuelType, ford)
erg <- PMCMRplus::gamesHowellTest(ANOVA)
summary (erg)

    Pairwise comparisons using Games-Howell test

data: price by fuelType
alternative hypothesis: two.sided
P value adjustment method: none
H0
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Interaktion

ford$interaktion <- as.factor(ford$interaktion)
ANOVA <- aov(price~interaktion, ford)
erg <- PMCMRplus::gamesHowellTest(ANOVA)
summary (erg)

    Pairwise comparisons using Games-Howell test

data: price by interaktion
alternative hypothesis: two.sided
P value adjustment method: none
H0
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Die Kontrolltests ergaben eine Bestätigung der Ergebnisse aus dem Tukey-Test.

Das par. Eta-Quadrat

Das partielle Eta-Quadrat (partielles η2) ist in Abbildung ausgegeben.

$$ {partialA}^2=\ {partialB}^2=\

_{partialA*B}^2=\ _A=\

_B=\

_{A*B}=\ $$

eta <- effectsize::eta_squared(mehrAnova1, partial = TRUE)
eta
# Effect Size for ANOVA (Type I)

Parameter             | Eta2 (partial) |       95% CI
-----------------------------------------------------
transmission          |           0.04 | [0.03, 1.00]
fuelType              |       4.35e-07 | [0.00, 1.00]
transmission:fuelType |           0.02 | [0.01, 1.00]

- One-sided CIs: upper bound fixed at (1).

Im vorliegenden Beispiel ist der Effekt für Treibstoff nicht signifikant. Daher wird dessen partielles Eta-Quadrat nicht betrachtet.

Für die Getriebeart beträgt das partielle Eta-Quadrat 0,04. Das heisst, die Getriebart erklärt 4% derjenigen Fehlervariation, die das Modell hätte, wäre die Getriebart nicht im Modell.

Das partielle Eta-Quadrat der Interaktion beträgt 0,02 und erklärt daher 2% der ohne die Interaktion ungeklärten Variation.

Berechnung der Effektstärke

\[ f = \sqrt\frac{\eta^2}{1-\eta^2} \] #### Effektstärke für Getriebe

eta$Eta2_partial[1]
[1] 0.03516053
eta$Eta2_partial[2]
[1] 4.353649e-07
eta$Eta2_partial[3]
[1] 0.01668892
efftrns <- sqrt(eta$Eta2_partial[1]/(1-eta$Eta2_partial[1]))

sprintf("Effektstärke fürs Getriebe: f= %.3f", efftrns)
[1] "Effektstärke fürs Getriebe: f= 0.191"

Effektstärke fürs Treibstoff

efffuel <- sqrt(eta$Eta2_partial[2]/(1-eta$Eta2_partial[2]))

sprintf("Effektstärke fürs Treibstoff: f= %.3f",efffuel)
[1] "Effektstärke fürs Treibstoff: f= 0.001"

Effektstärke für die Interaktion


effAxB <- sqrt(eta$Eta2_partial[3]/(1-eta$Eta2_partial[3]))

sprintf("Effektstärke für die Interaktion: f= %.3f",effAxB)
[1] "Effektstärke für die Interaktion: f= 0.130"

Um zu beurteilen, wie gross dieser Effekt ist, kann man sich an der Einteilung von Cohen (1988) orientieren:

\[\begin{align} \text{Schwacher Effekt: } 0.10 &< ||f|| < 0.25 \\ \text{Schwacher bis mittlerer Effekt: } 0.25 &= ||f|| \\ \text{Mittlerer Effekt: } 0.25 &< ||f|| < 0.40 \\ \text{Mittlerer bis starker Effekt: }0.40 &= ||f|| \\ \text{Starker Effekt: } 0.40 &< ||f|| \end{align}\]

Für den Treibstoff beträgt die Effektstärke f = 0,001 und bestätigt die Nicht-Signifikanz des Tukey-Tests durch keinen Effekt nach Cohen (1988).

Für die Art des Getriebes beträgt die Effektstärke f = 0,191 und bestätigt die Signifikanz des Tukey-Tests durch einen schwachen Effekt nach Cohen (1988).

Für die Interaktion beträgt die Effektstärke f = 0,13 und bestätigt die Signifikanz des Tukey-Tests durch einen schwachen Effekt nach Cohen (1988).

Eine Aussage

Hypothesen

Es zeigt sich, dass es EINEN Unterschied zwichen dem Getriebe und Preis gibt (F(2,755.1) = 154.66, p < .000). H0 für den Haupteffekt A wird entworfen.

Allerdings je nach Treibstoff gibt es KEINEN Unterschied zwischen den Preisen (F(1,2654.3) = 1.0836, p = .298). H0 für den Haupteffekt B wird angenommen.

Der Interaktionsterm von Treibstoff und Getriebe auf den Preis ist signifikant (F(5,336.12) = 136.67, p = .000). Der Effekt von der Getriebe hängt demnach zu einem gewissen Teil vom Treibstoff ab. H0 für die Interaktion wird verworfen.

Post- Hoc - Test

Der PostHoc wurde mit Tukey durchgeführt. Für Treibstoff zeigte sich KEINE signifikant ab (p = 0.945006). Es zeigt, dass sich alle Gruppen für Getriebe signifikant unterscheiden: Automatic (M = 14511.60 ,SD = 4304.75, N=586), Manual (M = 11344.09, SD = 3766.10, n=9974) und Semi-Auto (M = 11830.83, SD = 2932.17, n=447).

Zudem zeigt sich eine signifikante Interaktion von Getriebe und Treibstoff auf die Preis.Dies weist darauf hin, dass sich Treibstoff je nach Getriebe unterschiedlich auswirkt.

Beim Automatic und Semi-Auto lag Diesel höher als Petrol, beim Manual ist es umgekehrt.

####Effektstärke Die Effektstärken sind sowohl für den Haupteffekt des Getriebes (f = 0.191) als auch für die Interaktion (f = 0.130) nach Cohen (1988) ein schwacher Effekt. Der Treibstoff hat KEIN Effekt auf Preis (f = 0.001)

LS0tDQp0aXRsZTogIk1laHJmYWt0b3JpZWxsZSBWYXJpYW56YW5hbHlzZSBvaG5lIE1lc3N3aWVkZXJob2x1bmciDQpvdXRwdXQ6DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpgYGB7cn0NCmZvcmQgPC0gcmVhZC5jc3YoImZvcmQuY3N2IikNCg0KYGBgDQoNCmBgYHtyfQ0KZm9yZDwtZm9yZFtmb3JkJG1vZGVsICE9IiBCLU1BWCIsXQ0KZm9yZDwtZm9yZFtmb3JkJG1vZGVsICE9IiBLYSsiICxdDQpmb3JkPC1mb3JkW2ZvcmQkbW9kZWwgIT0iIFMtTUFYIixdDQpmb3JkPC1mb3JkW2ZvcmQkbW9kZWwgIT0iIEMtTUFYIixdDQpmb3JkPC1mb3JkW2ZvcmQkbW9kZWwgIT0iIEZ1c2lvbiIsXQ0KZm9yZDwtZm9yZFtmb3JkJG1vZGVsICE9IiBLdWdhIixdDQpmb3JkPC1mb3JkW2ZvcmQkbW9kZWwgIT0iIFN0cmVldGthIixdDQpmb3JkPC1mb3JkW2ZvcmQkbW9kZWwgIT0gIiBFY29TcG9ydCIsXQ0KZm9yZDwtZm9yZFtmb3JkJG1vZGVsICE9IiBHYWxheHkiLF0NCmZvcmQ8LWZvcmRbZm9yZCRtb2RlbCAhPSIgTW9uZGVvIixdDQpmb3JkPC1mb3JkW2ZvcmQkbW9kZWwgIT0iIFRvdXJuZW8gQ29ubmVjdCIsXQ0KZm9yZDwtZm9yZFtmb3JkJG1vZGVsICE9IiBFZGdlIiAsXQ0KZm9yZDwtZm9yZFtmb3JkJG1vZGVsICE9IiBHcmFuZCBDLU1BWCIgLF0NCmZvcmQ8LWZvcmRbZm9yZCRtb2RlbCAhPSIgTXVzdGFuZyIgLF0NCmZvcmQ8LWZvcmRbZm9yZCRtb2RlbCAhPSIgVG91cm5lbyBDdXN0b20iICxdDQpmb3JkPC1mb3JkW2ZvcmQkbW9kZWwgIT0gIiBFc2NvcnQiICxdDQpmb3JkPC1mb3JkW2ZvcmQkbW9kZWwgIT0iIEdyYW5kIFRvdXJuZW8gQ29ubmVjdCIgLF0NCmZvcmQ8LWZvcmRbZm9yZCRtb2RlbCAhPSIgUHVtYSIgLF0NCmZvcmQ8LWZvcmRbZm9yZCRtb2RlbCAhPSIgVHJhbnNpdCBUb3VybmVvIiAsXQ0KZm9yZDwtZm9yZFtmb3JkJG1vZGVsICE9IiBLQSIgLF0NCmZvcmQ8LWZvcmRbZm9yZCRtb2RlbCAhPSIgUmFuZ2VyIiAsXQ0KYGBgDQoNCmBgYHtyfQ0KZm9yZDwtZm9yZFtmb3JkJHllYXIgIT0xOTk2LF0NCmZvcmQ8LWZvcmRbZm9yZCR5ZWFyICE9MTk5OCxdDQpmb3JkPC1mb3JkW2ZvcmQkeWVhciAhPTIwMDAsXQ0KZm9yZDwtZm9yZFtmb3JkJHllYXIgIT0yMDAyLF0NCmZvcmQ8LWZvcmRbZm9yZCR5ZWFyICE9MjAwMyxdDQpmb3JkPC1mb3JkW2ZvcmQkeWVhciAhPTIwMDQsXQ0KZm9yZDwtZm9yZFtmb3JkJHllYXIgIT0yMDA1LF0NCmZvcmQ8LWZvcmRbZm9yZCR5ZWFyICE9MjAwNixdDQpmb3JkPC1mb3JkW2ZvcmQkeWVhciAhPTIwMDcsXQ0KZm9yZDwtZm9yZFtmb3JkJHllYXIgIT0yMDA4LF0NCmZvcmQ8LWZvcmRbZm9yZCR5ZWFyICE9MjAwOSxdDQpmb3JkPC1mb3JkW2ZvcmQkeWVhciAhPTIwNjAsXQ0KDQpiYXVqYWhyPC11bmlxdWUoZm9yZCR5ZWFyKQ0Kc29ydChiYXVqYWhyKQ0KYGBgDQpgYGB7cn0NCnVuaXF1ZShmb3JkJGZ1ZWxUeXBlKQ0KYGBgDQoNCg0KIyMgKiogTWVocmZha3RvcmllbGxlIFZhcmlhbnphbmFseXNlIG9obmUgTWVzc3dpZWRlcmhvbHVuZyAqKg0KKEFOT1ZBIE11bHRpIEZhY3RvciB3aXRoIFJlcGxpY2F0aW9uKQ0KDQojIyMgSHlwb3RoZXNlDQojIyMjIEhhdXB0ZWZmZWt0IEE8YnI+DQokSF8wJDpFcyBnaWJ0IEtFSU5FTiBVbnRlcnNjaGllZCB6d2lzY2hlbiBkZW4gR2V0cmllYmV2YXJpYW50ZW4gdW5kIGRlbSBQcmVpcy4NCiRIXzEkOkVzIGdpYnQgRUlORU4gVW50ZXJzY2hpZWQgendpc2NoZW4gZGVuIEdldHJpZWJldmFyaWFudGVuIHVuZCBkZW0gUHJlaXMuDQojIyMjIEhhdXB0ZWZmZWt0IEI8YnI+DQokSF8wJDpFcyBnaWJ0IEtFSU5FTiBVbnRlcnNjaGllZCB6d2lzY2hlbiBkZW4gVHJlaWJzdG9mZnZhcmlhbnRlbiB1bmQgZGVtIFByZWlzLg0KJEhfMSQ6RXMgZ2lidCBFSU5FTiBVbnRlcnNjaGllZCB6d2lzY2hlbiBkZW4gVHJlaWJzdG9mZnZhcmlhbnRlbiB1bmQgZGVtIFByZWlzLg0KIyMjIyBJbnRlcmFrdGlvbiBBeEI8YnI+DQokSF8wJDogRXMgZ2lidCBLRUlORU4gVW50ZXJzY2hpZWQgendpc2NoZW4gZGVuIEdldHJpZWJldmFyaWFudGVuLCBiencuIGRlbiBUcmVpYnN0b2ZmdmFyaWFudGVuIHVuZCBkZW0gUHJlaXMuDQokSF8xJDogRXMgZ2lidCBFSU5FTiBVbnRlcnNjaGllZCB6d2lzY2hlbiBkZW4gR2V0cmllYmV2YXJpYW50ZW4sIGJ6dy4gZGVuIFRyZWlic3RvZmZ2YXJpYW50ZW4gdW5kIGRlbSBQcmVpcy4NCg0KDQojIyMgVm9yYXVzc2V0enVuZ2VuDQpEaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBpc3QgbWluZGVzdGVucyBpbnRlcnZhbGxza2FsaWVydCAtPiBQcmVpcyBpc3QgZ2VnZWJlbiwgc29nYXIgUmF0aW9za2FsaWVydC4NCg0KRGllIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIChHZXRyaWViZSB1bmQgVHJlaWJzdG9mZikgc2luZCBrYXRlZ29yaWFsIChub21pbmFsLSBvZGVyIG9yZGluYWxza2FsaWVydCkgLT4gc2luZCBzaWUuIERpZSBkdXJjaCBkaWUgRmFrdG9yZW4gZ2ViaWxkZXRlbiBHcnVwcGVuIHNpbmQgdW5hYmjDpG5naWcgLT4gRW50d2VkZXIgaGF0IGRhcyBBdXRvIGF1dG9tYXRpc2NoZSAvIG1hbnVlbGxlIC8gc2VtaWF1dG9tYXRpc2NoZSBHZXRyaWViZSwgYnp3LiBkZXIgVHJlaWJzdG9mZiBpc3QgZW50d2VkZXIgUGV0cm9sIC8gRGllc2VsLg0KDQpEaWUgYWJow6RuZ2lnZSBWYXJpYWJsZW4gaXN0IG5vcm1hbHZlcnRlaWx0IGlubmVyaGFsYiBqZWRlciBkZXIgR3J1cHBlbi4gQWIgMjUgUHJvYmFuZGVuIHBybyBHcnVwcGUgc2luZCBWZXJsZXR6dW5nZW4gZGllc2VyIFZvcmF1c3NldHp1bmcgdW5wcm9ibGVtYXRpc2NoLT4gc2llaGUgSGlzdG9ncmFtbQ0KDQpIb21vZ2VuaXTDpHQgZGVyIFZhcmlhbnplbjogRGllIEdydXBwZW4gc3RhbW1lbiBhdXMgR3J1bmRnZXNhbXRoZWl0ZW4gbWl0IGFubsOkaGVybmQgaWRlbnRpc2NoZW4gVmFyaWFuemVuIGRlciBhYmjDpG5naWdlbiBWYXJpYWJsZW4gLT4gc2llaGUgTGV2ZW5lLVRlc3QNCg0KIyMjIERlc2tyaXB0aXZlIFN0YXRpc3Rpa2VuICsgUHLDvGZ1bmcgZGVyIFZvcmF1c3NldHp1bmcNCg0KIyMjIyBIaXN0b2dyYW1tIHp1ciBQcsO8ZnVuZyBkZXIgTm9ybWFsdmVydHdlaWx1bmcNCiMjIyMjIFRyZWlic3RvZmYNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQpgYGB7cn0NCmZvcmQgJT4lDQogIGdyb3VwX2J5KGZ1ZWxUeXBlKSAlPiUNCiAgZ2dwbG90KGFlcyhwcmljZSwgY29sb3I9ZnVlbFR5cGUpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbCA9IGZ1ZWxUeXBlKSwgYmlud2lkdGggPSAxNTAwKSArDQogIGZhY2V0X3dyYXAofmZ1ZWxUeXBlKSArDQogIHRoZW1lX2dyZXkoKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJvbGl2ZWRyYWIzIiwgIm1hcm9vbjIiLCAicm95YWxibHVlMiIpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIm9saXZlZHJhYjMiLCAibWFyb29uMiIsICJyb3lhbGJsdWUyIikpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSkrDQogIGxhYnMoeD0gIlByZWlzZSIseSA9ICJBbnphaGwiICkNCmBgYA0KRGllIERhdGVuIHNpbmQgbm9ybWFsdmVydGVpbHQgaW5uZXJoYWxiIGRlciBHcnVwcGUgVHJlaWJzdG9mZiBpbiBCZXp1ZyBhdWYgZGllIFByZWlzZQ0KIyMjIyMgR2V0cmllYmUNCg0KYGBge3J9DQpsaWJyYXJ5KGdncHVicikNCmdnaGlzdG9ncmFtKGZvcmQsIHggPSAicHJpY2UiLCBiaW5zID0gNTAsDQogICBhZGQgPSAibWVhbiIsIHJ1ZyA9IFRSVUUsDQogICBjb2xvciA9ICJ0cmFuc21pc3Npb24iLCBmaWxsID0gInRyYW5zbWlzc2lvbiIsDQogICBwYWxldHRlID0gYygidmlvbGV0cmVkMSIsICIjMDBBRkJCIiwgIm9saXZlZHJhYjMiKSkNCiMgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ0V4dHJhKQ0KDQogDQojIGNsYXNzaWMgcGxvdCA6DQpwIDwtIGdncGxvdChmb3JkLCBhZXMoeD1wcmljZSwgeT10cmFuc21pc3Npb24sIGNvbG9yPWZ1ZWxUeXBlLCBzaXplPWZ1ZWxUeXBlKSkgKw0KICAgICAgZ2VvbV9wb2ludCgpICsNCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKQ0KIA0KIyBTZXQgcmVsYXRpdmUgc2l6ZSBvZiBtYXJnaW5hbCBwbG90cyAobWFpbiBwbG90IDEweCBiaWdnZXIgdGhhbiBtYXJnaW5hbHMpDQogDQojIEN1c3RvbSBtYXJnaW5hbCBwbG90czoNCnAyIDwtIGdnTWFyZ2luYWwocCwgdHlwZT0iaGlzdG9ncmFtIiwgZmlsbCA9ICJzbGF0ZWJsdWUiLCB4cGFyYW1zID0gbGlzdCggIGJpbnM9MTApKQ0KIA0KIyBTaG93IG9ubHkgbWFyZ2luYWwgcGxvdCBmb3IgeCBheGlzDQoNCnAyDQoNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCiMgDQojIGZvcmQgJT4lDQojICAgZ3JvdXBfYnkodHJhbnNtaXNzaW9uKSAlPiUNCiMgICBnZ3Bsb3QoYWVzKHByaWNlLCBjb2xvcj10cmFuc21pc3Npb24pKSArIA0KIyAgIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsID0gdHJhbnNtaXNzaW9uKSwgYmlud2lkdGggPSAxNTAwKSArDQojICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJvbGl2ZWRyYWIzIiwgIm1hcm9vbjIiLCAicm95YWxibHVlMiIpKSsNCiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygib2xpdmVkcmFiMyIsICJtYXJvb24yIiwgInJveWFsYmx1ZTIiKSkrDQojICAgZmFjZXRfd3JhcCh+dHJhbnNtaXNzaW9uKSArDQojICAgdGhlbWVfZ3JleSgpKw0KIyAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUpKSsNCiMgICBsYWJzKHg9ICJQcmVpcyIseSA9ICJBbnphaGwiICkNCmBgYA0KRGllIERhdGVuIHNpbmQgbm9ybWFsdmVydGVpbHQgaW5uZXJoYWxiIGRlciBHcnVwcGUgR2V0cmllYmUgaW4gQmV6dWcgYXVmIGRpZSBQcmVpc2UNCmBgYHtyfQ0KZ2dwbG90KGZvcmQsIGFlcyh4PXByaWNlKSkrDQpnZW9tX2hpc3RvZ3JhbSgpKw0Kc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJvbGl2ZWRyYWIzIiwgIm1hcm9vbjIiLCAicm95YWxibHVlMiIpKSsNCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJvbGl2ZWRyYWIzIiwgIm1hcm9vbjIiLCAicm95YWxibHVlMiIpKSsNCmZhY2V0X3dyYXAodHJhbnNtaXNzaW9ufmZ1ZWxUeXBlLCBuY29sID0gMikNCg0KYGBgDQoNCg0KDQpBYiAyNSBUZWlsbmVobWVyIHBybyBHcnVwcGUgaXN0IGRhcyBUZXN0dmVyZmFocmVuIHJvYnVzdC4NCg0KIyMjIyBCb3hwbG90DQoNCmBgYHtyfQ0KZ2dwbG90KGZvcmQsIGFlcyh0cmFuc21pc3Npb24sIHByaWNlLCBmaWxsPWZhY3RvcihmdWVsVHlwZSkpKSArDQpnZW9tX2JveHBsb3QoKSArDQp0aGVtZV9taW5pbWFsKCkrDQpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygibWFyb29uMiIsICJyb3lhbGJsdWUyIikpKw0KbGFicyhmaWxsID0gIlRyZWlic3RvZmYiLCB4PSJHZXRyaWViZSIsIHk9InByaWNlIikNCmBgYA0KQmVpIE1hbnVlbGwgdGF1Y2hlbiB2aWVsZSBBdXNyZWnDn2VyIGF1ZiwgZGEgZGllIGpld2VpbGlnZW4gbiBoaWVyIGFtIGdyw7bDn3RlbiBzaW5kLiBNZWhyIERhdGVuIGJlZGV1dGV0IG1laHIgQXVzcmVpw59lci4NCg0KIyMjIERlc2tyaXB0aXZlIFN0YXRpc3Rpa2VuDQoNCmBgYHtyfQ0KZm9yZCAlPiUNCmdyb3VwX2J5KGZ1ZWxUeXBlKSAlPiUNCiAgc3VtbWFyaXplKEFuemFobCA9IG4oKSwgTWl0dGVsd2VydCA9IG1lYW4ocHJpY2UpLCBNZWRpYW4gPSBtZWRpYW4ocHJpY2UpLCBTdGFuZGFyZGFid2VpY2h1bmcgPSBzZChwcmljZSkpICU+JQ0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpDQpgYGANCg0KQmVpbSBEaWVzZWwgVHJlaWJzdG9mZiBpc3QgZGVyIE1pdHRlbHdlcnQgMTE2MjEuODMgKFNEID0gNDMxMC4zMywgbiA9IDE5NzUpLiBCZWltIEJlbnppbiBUcmVpYnN0b2ZmIGlzdCBkZXIgTWl0dGVsd2VydCAxMTUxMi45NSAoU0QgPSAzNzIwLjc5LCBuID0gOTAzMikuIGRlciBzZWhyIGdlcmluZ2UgVW50ZXJzY2hpZWQgbMOkc3N0IHZlcm11dGVuLCBkYXNzIGtlaW5lIFNpZ25pZmlrYW56IHZvcmxpZWd0Lg0KDQpgYGB7cn0NCmZvcmQgJT4lDQpncm91cF9ieSh0cmFuc21pc3Npb24pICU+JQ0KICBzdW1tYXJpemUoQW56YWhsID0gbigpLCBNaXR0ZWx3ZXJ0ID0gbWVhbihwcmljZSksIE1lZGlhbiA9IG1lZGlhbihwcmljZSksIFN0YW5kYXJkYWJ3ZWljaHVuZyA9IHNkKHByaWNlKSkgJT4lDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikNCmBgYA0KDQpBdXRvbWF0aWMgaGF0IDE0NTExLjYwIGFscyBNaXR0ZWx3ZXJ0IHZvbiBQcmVpcy48YnI+DQpNYW51YWwgaGF0IDExMzQ0LjA5IGFscyBNaXR0ZWx3ZXJ0IHZvbiBQcmVpcy48YnI+DQpTZW1pLUF1dG8gaGF0IDExODMwLjgzIGFscyBNaXR0ZWx3ZXJ0IHZvbiBQcmVpcy48YnI+DQoNCkVzIHNpbmQgZ3LDtsOfZXJlIFVudGVyc2NoaWVkZSB6dSBzZWhlbiBhbHMgYmVpbSBUcmVpYnN0b2ZmLCB3YXMgZWhlciBlaW5lIFNpZ25pZmlrYW56IHZlcm11dGVuIGzDpHNzdC4gRGllIGZvbGdlbmRlIEFuYWx5c2Ugd2lyZCBkYXMgbsOkaGVyIGVybMOkdXRlcm4uDQoNCmBgYHtyfQ0KZm9yZCAlPiUNCmdyb3VwX2J5KHRyYW5zbWlzc2lvbiwgZnVlbFR5cGUpICU+JQ0KICBzdW1tYXJpemUoQW56YWhsID0gbigpLCBNaXR0ZWx3ZXJ0ID0gbWVhbihwcmljZSksIE1lZGlhbiA9IG1lZGlhbihwcmljZSksIFN0YW5kYXJkYWJ3ZWljaHVuZyA9IHNkKHByaWNlKSkgJT4lDQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikNCmBgYA0KDQpCZWkgZGVuICoqQXV0b21hdGljIERpZXNlbCAoTSA9IDE3NjMzLjY5LCBTRCA9IDMzMzkuMjMpKiogQXV0b3MgaXN0IGRlciBNaXR0ZWx3ZXJ0IHZvbSBQcmVpcyBhbSBow7ZjaHN0ZW4uICoqQXV0b21hdGljIEJlbnppbiAoTSA9IDEzMjM1Ljc0LCBTRCA9IDM5OTQuNTQpKiogaGF0IGRlbiB6d2VpdGjDtmNoc3RlbiwgZ2Vmb2xndCB2b24gKipTZW1pLUF1dG8gRGllc2VsIChNID0gMTI3NTUuODMpKiouIERpZSBsZXR6dGVuIGRyZWkgc2luZCBpbiBkZXIgUmVpaGVuZm9sZ2UgU2VtaS1BdXRvIEJlbnppbihNID0gMTE3MzQuOTEsIFNEID0gMjg4MS43NCksIE1hbnVlbGwgQmVuemluIChNID0gMTE0MTQuNzIsIFNEID0gMzcyMS43MCkgdW5kIE1hbnVlbGwgRGllc2VsIChNID0gMTEwMTUuMTEsIFNEID0gMzk1MC44NCkNCg0KDQojIyMgQWx0ZXJuYXRpdmUNCg0KYGBge3J9DQptaXR0ZWwgPC10YXBwbHkoZm9yZCRwcmljZSwgbGlzdChmb3JkJGZ1ZWxUeXBlLCBmb3JkJHRyYW5zbWlzc2lvbiksIG1lYW4sIG5hLnJtPVRSVUUpDQptaXR0ZWwNCmBgYA0KDQpgYGB7cn0NCnNkIDwtdGFwcGx5KGZvcmQkcHJpY2UsIGxpc3QoZm9yZCRmdWVsVHlwZSwgZm9yZCR0cmFuc21pc3Npb24pLCBzZCwgbmEucm09VFJVRSkNCnNkDQpgYGANCg0KYGBge3J9DQphbnphaGxwcm9ncnVwcGUgPC0gdGFwcGx5KGZvcmQkcHJpY2UsIGxpc3QoZm9yZCRmdWVsVHlwZSwgZm9yZCR0cmFuc21pc3Npb24pLCBmdW5jdGlvbih4KSBzdW0oIWlzLm5hKHgpKSkNCmFuemFobHByb2dydXBwZSANCmBgYA0KDQojIyMgUHJvZmlsZGlhZ3JhbW0NCmBgYHtyfQ0KdW5pcXVlKGZvcmQkdHJhbnNtaXNzaW9uKQ0KYGBgDQpgYGB7cn0NCmZvcmQkdHJhbnNtaXNzaW9uIDwtIGZhY3Rvcihmb3JkJHRyYW5zbWlzc2lvbiwgbGV2ZWxzPWMoIk1hbnVhbCIsICJTZW1pLUF1dG8iLCAiQXV0b21hdGljIikpIA0KdW5pcXVlKGZvcmQkdHJhbnNtaXNzaW9uKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZm9yZCwgYWVzKHg9dHJhbnNtaXNzaW9uLCB5PXByaWNlLCBncm91cD1mdWVsVHlwZSwgY29sb3I9IGZ1ZWxUeXBlKSkrDQogIHN0YXRfc3VtbWFyeShmdW4ueSA9IG1lYW4sIGdlb209InBvaW50Iiwgc2l6ZT0zKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1bi55ID0gbWVhbiwgZ2VvbT0ibGluZSIpKw0KICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX2NsX25vcm1hbCwgZ2VvbT0iZXJyb3JiYXIiLHdpZHRoPS4yLCBzaXplPS4yNSkrDQogIGxhYnMoeD0idHJhbnNtaXNzaW9uIiwgeT0iUHJpY2UiKSsNCiAgdGhlbWVfY2xhc3NpYygpDQpgYGANCg0KYGBge3J9DQoNCiMjIENoYXJnZSBsaWJyYXJpZXM6DQojbGlicmFyeShnZ3Bsb3QyKQ0KI2xpYnJhcnkoZ2dhbmltYXRlKQ0KIA0KIyBNYWtlIGEgZ2dwbG90LCBidXQgYWRkIGZyYW1lPXllYXI6IG9uZSBpbWFnZSBwZXIgeWVhcg0KIyNnZ3Bsb3QoZm9yZCwgYWVzKHByaWNlLCB0cmFuc21pc3Npb24sIHNpemUgPSBtb2RlbCwgY29sb3IgPSBmdWVsVHlwZSkpICsNCiMgIGdlb21fcG9pbnQoKSArDQojICBzY2FsZV94X2xvZzEwKCkgKw0KIyAgdGhlbWVfYncoKSArDQojICAjIGdnYW5pbWF0ZSBzcGVjaWZpYyBiaXRzOg0KIyAgbGFicyh0aXRsZSA9ICdQcmljZToge2ZyYW1lX3RpbWV9JywgeCA9ICdQcmljZScsIHkgPSAndHJhbnNtaXNzaW9uJykgKw0KIyAgdHJhbnNpdGlvbl90aW1lKHByaWNlKSArDQojICBlYXNlX2FlcygnbGluZWFyJykNCg0KIyMgU2F2ZSBhdCBnaWY6DQojYW5pbV9zYXZlKCJZZWFyLmdpZiIpDQpgYGANCg0KDQojIyMgTGV2ZW5lIC1UZXN0DQpEZXIgTGV2ZW5lLVRlc3QgcHLDvGZ0IGRpZSBOdWxsaHlwb3RoZXNlLCBkYXNzIGRpZSBWYXJpYW56ZW4gZGVyIEdydXBwZW4gc2ljaCBuaWNodCB1bnRlcnNjaGVpZGVuLiBJc3QgZGVyIExldmVuZS1UZXN0IG5pY2h0IHNpZ25pZmlrYW50LCBzbyBrYW5uIHZvbiBob21vZ2VuZW4gVmFyaWFuemVuIGF1c2dlZ2FuZ2VuLiBXw6RyZSBkZXIgTGV2ZW5lLVRlc3QgamVkb2NoIHNpZ25pZmlrYW50LCBzbyB3w6RyZSBlaW5lIGRlciBHcnVuZHZvcmF1c3NldHp1bmdlbiBkZXIgVmFyaWFuemFuYWx5c2UgdmVybGV0enQuIEdlZ2VuIGxlaWNodGUgVmVybGV0enVuZ2VuIGdpbHQgZGllIFZhcmlhbnphbmFseXNlIGFscyByb2J1c3Q7IHZvciBhbGxlbSBiZWkgZ2Vuw7xnZW5kIGdyb3NzZW4gdW5kIGV0d2EgZ2xlaWNoIGdyb3NzZW4gR3J1cHBlbiBzaW5kIFZlcmxldHp1bmdlbiBuaWNodCBwcm9ibGVtYXRpc2NoLiBCZWkgdW5nbGVpY2ggZ3Jvc3NlbiBHcnVwcGVuIGbDvGhydCBlaW5lIHN0YXJrZSBWZXJsZXR6dW5nIGRlciBWYXJpYW56aG9tb2dlbml0w6R0IHp1IGVpbmVyIFZlcnplcnJ1bmcgZGVzIEYtVGVzdHMuIEFsdGVybmF0aXYga8O2bm5lbiBkYW5uIGF1ZiBkZW4gQnJvd24tRm9yc3l0aGUtVGVzdCBvZGVyIGRlbiBXZWxjaC1UZXN0IHp1csO8Y2tnZWdyaWZmZW4gd2VyZGVuLiBEYWJlaSBoYW5kZWx0IGVzIHNpY2ggdW0gYWRqdXN0aWVydGUgRi1UZXN0cy4NCg0KYGBge3J9DQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoY2FyRGF0YSkNCmxldmVuZVRlc3QocHJpY2UgfiBmdWVsVHlwZSp0cmFuc21pc3Npb24sIGRhdGEgPSBmb3JkLCBjZW50ZXIgPSAibWVhbiIpDQpgYGANCg0KSW0gdm9ybGllZ2VuZGVuIEJlaXNwaWVsIGlzdCBkZXIgKipMZXZlbmUtVGVzdCBzaWduaWZpa2FudCAoRig1LDExMDAxKSA9IDEyLjUxNiwgcCA8IC4wMDAgKSoqLCBzb2Rhc3Mgdm9uIFZhcmlhbnpoZXRlcm9nZW5pdMOkdCBhdXNnZWdhbmdlbiB3ZXJkZW4ga2Fubi4gRGEgZGllIFZhcmlhbnplbiBuaWNodCBnbGVpY2ggc2luZCwgaXN0IGVzIHp1IGVtcGZlaGxlbiBlaW5lIEtvcnJla3R1ciBtaXRoaWxmZSBkZXMgV2VsY2gtVGVzdHMgZHVyY2h6dWbDvGhyZW4uDQoNCiMjIyMgRW50c2NoZWl1bmdzcmVnZWxuDQpNaXQgV2VsY2gtS29ycmVrdHVyOiBwIDwgMC4wNSA9PiBFcmdlYm5pcyBTaWduaWZpa2FudCDigJM+IFZhcmlhbnplbiBoZXRlcm9nZW4NCg0KT2huZSBXZWxjaC1Lb3JyZWt0dXI6IHAgPiAwLjA1ID0+IEVyZ2VibmlzIG5pY2h0IFNpZ25pZmlrYW50IOKAkz4gVmFyaWFuemVuIGhvbW9nZW4g4oCTPiBIMCBtaXQgQW5uYWhtZSBWYXIxPVZhcjI94oCmIC0+IFZhcl9uIHdpcmQgYW5nZW5vbW1lbg0KDQojIyMgRXJnZWJuaXNzZSBkZXIgbWVocmZha3RvcmllbGxlIFZhcmlhbnphbmFseXNlIChvaG5lIE1lc3N3aWVkZXJob2x1bmcpDQoNCktlaW5lIFdlbGNoLUtvcnJla3R1ciAtIGlzdCBkZXIgU3RhbmRhcmQNCg0KYGBge3J9DQptZWhyQW5vdmExIDwtIGxtKHByaWNlfnRyYW5zbWlzc2lvbipmdWVsVHlwZSwgZGF0YSA9IGZvcmQpDQpteUFub3ZhIDwtIEFub3ZhKG1laHJBbm92YTEsIHR5cGUgPSAzKQ0KbXlBbm92YQ0KYGBgDQoNCm1pdCBXZWxjaC1Lb3JyZWt0dXIgaXN0IHp1ciBLb250cm9sbGUgZ2VkYWNodA0KDQpFcyBsaWVndCBlaW5lIFZlcmxldHp1bmcgZGVyIFZhcmlhbnpob21vZ2VuaXTDpHQgdm9yKHNpZWhlIExldmVuZS1UZXN0KS4gRGFoZXIgc29sbHRlIGVpbiByb2J1c3RlcmVyIFRlc3QgYmVyw7xja3NpY2h0aWd0IHdlcmRlbiAoKiBtaXQgd2VsY2gqICkuIEFsbGVyZGluZ3MgYmlldGVuIHNpY2ggaGllciBrZWluZSB3ZWl0Z2VoZW5kIGFremVwdGllcnRlbiBWZXJmYWhyZW4gYW4uIERhaGVyIHdpcmQgZGVyIFN0YW5kYXJkIHdlaXRlcmdlZsO8aHJ0Lg0KDQpgYGB7cn0NCnRyYW5zbWlzc2lvbndlbGNoIDwtIG9uZXdheS50ZXN0KHByaWNlfnRyYW5zbWlzc2lvbiwgZGF0YSA9IGZvcmQsIHZhci5lcXVhbCA9IEYpDQp0cmFuc21pc3Npb253ZWxjaA0KYGBgDQoNCkbDvHIgZGVuIEZha3RvciB0cmFuc21pc3Npb24gd2lyZCBFSU4gSGF1cHRlZmZla3QgZXJzaWNodGxpY2guIERlciBQcmVpcyBzY2hlaW50IGRlbW5hY2ggYWJow6RuZ2lnIHZvbSBHZXRyaWViZSB6dSBzZWluIChGKDIsNzU1LjEpID0gMTU0LjY2LCBwIDwgLjAwMCkuDQoNCmBgYHtyfQ0KZnVlbHdlbGNoIDwtIG9uZXdheS50ZXN0KHByaWNlfmZ1ZWxUeXBlLCBkYXRhID0gZm9yZCwgdmFyLmVxdWFsID0gRikNCmZ1ZWx3ZWxjaA0KYGBgDQoNCkbDvHIgZGVuIEZha3RvciBUcmVpYnN0b2ZmIHdpcmQgS0VJTiBIYXVwdGVmZmVrdCBlcnNpY2h0bGljaC4gRGVyIFByZWlzIHNjaGVpbnQgZGVtbmFjaCB1bmFiaMOkbmdpZyB2b20gVHJlaWJzdG9mZiB6dSBzZWluIChGKDEsMjY1NC4zKSA9IDEuMDgzNiwgcCA9IC4yOTgpLg0KDQpgYGB7cn0NCkFYQndlbGNoIDwtIG9uZXdheS50ZXN0KHByaWNlfmZ1ZWxUeXBlKnRyYW5zbWlzc2lvbiwgZGF0YSA9IGZvcmQsIHZhci5lcXVhbCA9IEYpDQpBWEJ3ZWxjaCANCmBgYA0KDQpEZXIgSW50ZXJha3Rpb25zdGVybSB2b24gVHJlaWJzdG9mZiB1bmQgR2V0cmllYmUgYXVmIGRlbiBQcmVpcyBpc3Qgc2lnbmlmaWthbnQgKEYoNSwzMzYuMTIpID0gMTM2LjY3LCBwID0gLjAwMCkuIERlciBFZmZla3Qgdm9uIGRlciBHZXRyaWViZSBow6RuZ3QgZGVtbmFjaCB6dSBlaW5lbSBnZXdpc3NlbiBUZWlsIHZvbSBUcmVpYnN0b2ZmIGFiLg0KDQojIyMgUG9zdC1Ib2MtVGVzdA0KDQpJc3QgZWluIEhhdXB0ZWZmZWt0IG9kZXIgZWluZSBJbnRlcmFrdGlvbiBzaWduaWZpa2FudCwgc28gaXN0IHp3YXIgYmVzdMOkdGlndCwgZGFzcyBlaW4gRWZmZWt0IHZvcmxpZWd0LCBkb2NoIGlzdCBuYWNoIHdpZSB2b3IgdW5rbGFyLCB3ZWxjaGUgRmFrdG9yc3R1ZmVuIHNpY2ggdW50ZXJzY2hlaWRlbiwgc29iYWxkIGVpbiBGYWt0b3IgbWVociBhbHMgendlaSBBdXNwcsOkZ3VuZ2VuIGF1ZndlaXN0LiAoQmVpIHp3ZWkgQXVzcHLDpGd1bmdlbiB1bnRlcnNjaGVpZGVuIHNpY2ggZWJlbiBkaWVzZSB6d2VpIEF1c3Byw6RndW5nZW4gdm9uZWluYW5kZXIsIHNvbnN0IHfDpHJlIGRlciBGLVRlc3QgbmljaHQgc2lnbmlmaWthbnQuKSBJbSB2b3JsaWVnZW5kZW4gQmVpc3BpZWwgbGllZ2VuIGVpbiBFZmZla3QgZGVyIEdldHJpZWJlIHNvd2llIGVpbiBJbnRlcmFrdGlvbnNlZmZla3Qgdm9yLiBQb3N0LWhvYy1UZXN0cyBrw7ZubmVuIGVpbmZhY2ggZWluZ2VzZXR6dCB3ZXJkZW4sIHVtIHp1IHByw7xmZW4sIHdlbGNoZSBMZXZlbHMgZGVyIEdldHJpZWJlIHNpY2ggdW50ZXJzY2hlaWRlbi4gRsO8ciBkaWUgSW50ZXJha3Rpb24gaXN0IGRpZXMgaW4gU1BTUyBuaWNodCBpbXBsZW1lbnRpZXJ0Lg0KDQpXaWUgYmVyZWl0cyBlcnfDpGhudCB3dXJkZSwgYmVpbmhhbHRldCBkZXIgRmFrdG9yIEdldHJpZWJlIGRyZWkgU3R1ZmVuLiBBdXMgZGVtIHNpZ25pZmlrYW50ZW4gSGF1cHRlZmZla3QgbMOkc3N0IHNpY2ggbmljaHQgYWJsZWl0ZW4sIHdlbGNoZSBkZXIgRmFrdG9yc3R1ZmVuIGVpbmVuIHNpZ25pZmlrYW50IHVudGVyc2NoaWVkbGljaGVuIEVpbmZsdXNzIGF1ZiBkaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBoYWJlbi4gWnUgZGllc2VtIFp3ZWNrIHdlcmRlbiBUdWtleS1rb3JyaWdpZXJ0ZSBNZWhyZmFjaHZlcmdsZWljaGUgYmVyZWNobmV0Lg0KDQpCZWkgZGVyIEJlcmVjaG51bmcgdm9uIFBvc3QtaG9jLVRlc3RzIHdpcmQgaW0gUHJpbnppcCBmw7xyIGplZGUgS29tYmluYXRpb24gdm9uIHp3ZWkgTWl0dGVsd2VydGVuIGVpbiB0LVRlc3QgZHVyY2hnZWbDvGhydC4gSW0gYWt0dWVsbGVuIEJlaXNwaWVsIGRlciBHZXRyaWViZSBtaXQgZHJlaSBHcnVwcGVuLCBiencuIHp3ZWkgR3J1cHBlbiBzaW5kIGRpZXMgMTUgVGVzdHMuIE11bHRpcGxlIFRlc3RzIHNpbmQgamVkb2NoIHByb2JsZW1hdGlzY2gsIGRhIGRlciBBbHBoYS1GZWhsZXIgKGRpZSBmw6Rsc2NobGljaGUgQWJsZWhudW5nIGRlciBOdWxsaHlwb3RoZXNlKSBtaXQgZGVyIEFuemFobCBkZXIgVmVyZ2xlaWNoZSBzdGVpZ3QuIFdpcmQgbnVyIGVpbiB0LVRlc3QgbWl0IGVpbmVtIFNpZ25pZmlrYW56bGV2ZWwgdm9uIC4wNSBkdXJjaGdlZsO8aHJ0LCBzbyBiZXRyw6RndCBkaWUgV2FocnNjaGVpbmxpY2hrZWl0IGRlcyBOaWNodC1FaW50cmVmZmVucyBkZXMgQWxwaGEtRmVobGVycyA5NSUuIFdlcmRlbiBqZWRvY2ggMTUgc29sY2hlciBQYWFydmVyZ2xlaWNoZSB2b3JnZW5vbW1lbiwgc28gYmV0csOkZ3QgZGllIE5pY2h0LUVpbnRyZWZmZW5zLVdhaHJzY2hlaW5saWNoa2VpdCBkZXMgQWxwaGEtRmVobGVycyAoLjk1KTE1ID0gLjQ2MzIuIFVtIGRpZSBXYWhyc2NoZWlubGljaGtlaXQgZGVzIEVpbnRyZWZmZW5zIGRlcyBBbHBoYS1GZWhsZXJzIHp1IGJlc3RpbW1lbiwgd2lyZCAxIC0uNDYzMiA9IC41MzY3IGdlcmVjaG5ldC4gRGllIFdhaHJzY2hlaW5saWNoa2VpdCBkZXMgRWludHJlZmZlbnMgZGVzIEFscGhhLUZlaGxlcnMgbGllZ3Qgc29taXQgYmVpIDUzLjY3JS4gRGllc2UgRmVobGVyd2FocnNjaGVpbmxpY2hrZWl0IHdpcmQgYWxzIOKAnEZhbWlseXdpc2UgRXJyb3IgUmF0ZeKAnSBiZXplaWNobmV0Lg0KDQpVbSBkaWVzZXMgUHJvYmxlbSB6dSBiZWhlYmVuLCBrYW5uIHp1bSBCZWlzcGllbCBkaWUgVHVrZXktS29ycmVrdHVyIGFuZ2V3ZW5kZXQgd2VyZGVuLiBIaWVyYmVpIHdpcmQgzrEgZHVyY2ggZGllIEFuemFobCBkZXIgUGFhcnZlcmdsZWljaGUgZGl2aWRpZXJ0LiBJbSBoaWVyIGF1ZmdlZsO8aHJ0ZW4gRmFsbCBpc3QgZGllcyAuMDUvMTUgPSAuMDAzMzMuIEJlaSBkaWVzZW0gS29uemVwdCBoYW5kZWx0IGVzIHNpY2ggdW0gZWluZSBhbGxnZW1laW5lIEluZm9ybWF0aW9uLg0KDQpEaWUgVHVrZXkgYmVyw7xja3NpY2h0aWd0IGRpZSBLb3JyZWt0dXIsIGRhaGVyIGthbm4gd2VpdGVyIGdlZ2VuIDAuMDUgZ2V0ZXN0ZXQgd2VyZGVuLg0KDQpgYGB7cn0NClBvc3RIb2MgPC0gYW92KHByaWNlIH4gdHJhbnNtaXNzaW9uKmZ1ZWxUeXBlLCBkYXRhPWZvcmQpIA0KI0FsdGVybmF0aXYgYXVjaCBkZXIgTmFtZSBkZXMgWndpc2NoZW5zcGVpY2hlcnMgIm1laHIiIC0gUG9zdEhvYyA8LSBhb3YobWVocikgIA0KVHVrZXlIU0QoUG9zdEhvYykNCmBgYA0KDQpXaWUgdmVybXV0ZXQsIHplaWNobmV0IHNpY2ggYmVpIFRyZWlic3RvZmYgS0VJTkUgU2lnbmlmaWthbnogYWIuIERpZSBHZXRyaWViZWtvbWJpbmF0aW9uZW4gdW50ZXJzY2hlaWRlbiBzaWNoIHNpZ25pZmlrYW50Lg0KDQpGw7xyIGRhcyB2b3JsaWVnZW5kZSBCZWlzcGllbCB3aXJkIGVyc2ljaHRsaWNoLCBkYXNzIHNpY2ggZGVyIGZ1ZWxUeXBlIHVuZCBkYXMgdHJhbnNtaXNzaW9uIGJlesO8Z2xpY2ggZGVyIFByZWlzIHNpZ25pZmlrYW50IHVudGVyc2NoZWlkZW4gKHAgPCAuMDUpLiANCg0KV2FzIGlzdCBzaWcgdW5kIHdhcyBuaWNodD8gMTEgdm9uIDE1IFZlcmdsZWljaGVuIHNpbmQgc2lnLiAocCA8IC4wNSkuIE5pY2h0IHNpZy4gc2luZCA8YnI+DQpTZW1pLUF1dG86UGV0cm9sLU1hbnVhbDpQZXRyb2wgKHAgPSAwLjU0MjUyMzUpLDxicj4gDQpTZW1pLUF1dG86UGV0cm9sLVNlbWktQXV0bzpEaWVzZWwgKHAgPSAwLjU0MTE4OTEpLDxicj4NCkF1dG9tYXRpYzpQZXRyb2wtU2VtaS1BdXRvOkRpZXNlbCAocCA9IDAuOTY4NzE0OSksPGJyPg0KTWFudWFsOlBldHJvbC1TZW1pLUF1dG86RGllc2VsICAgIChwID0gMC4xODU2OTg1KSw8YnI+DQoNCg0KDQpHZW5lcmFsaXNpZXJiYXJrZWl0IC9VbmFiaMOkbmdpZ2tlaXQgLSBnbG9iYWw/DQoNCkJlaWRlIEhhdXB0ZWZmZWt0ZSBzaW5kIGdsb2JhbC4gPGJyPg0KTWl0IHN0ZWlnZW5kZW0gQXV0b21hdGlzaWVydW5nc2dyYWQgZGVzIEdldHJpZWJlcyBzdGVpZ3QgZGVyIFByZWlzIGbDvHIgYmVpZGUgVmFyaWFudGVuIHZvbiBUcmVpYnN0b2ZmLg0KDQpNYW51YWwgRGllc2VsLCBBdXRvIERpZXNlbCBzaW5kIHVuYWJoYWVuZ2lnIC8gZ2VuZXJhbGlzaWVyYmFyLg0KDQoNCkdydXBwZW5iaWxkdW5nPw0KDQpFaW5lIFJlZ3J1cHBpZXJ1bmcgd2lyZCBuaWNodCBlbXBmb2hsZW4gdW5kIGRpZSBzZWNocyBHcnVwcGVuIHNvbGx0ZW4gYmVpYmVoYWx0ZW4gd2VyZGVuLjxicj4NCkR1cmNoIGRpZSBicmVpdGUgU3RyZXV1bmcgdm9uIFNlbWktQXV0bzpEaWVzZWwgw7xiZXJncmVpZnQgZGllc2UgRmFrdG9ya29tYmluYXRpb24gZHJlaSAtIGFuZGVybmZhbGxzIHVuYWJow6RuZ2lnZSAtIEtvbWJpbmF0aW9uZW4uDQoNCg0KYGBge3J9DQpmb3JkICU+JQ0KZ3JvdXBfYnkodHJhbnNtaXNzaW9uLCBmdWVsVHlwZSkgJT4lDQogIHN1bW1hcml6ZShBbnphaGwgPSBuKCksIE1pdHRlbHdlcnQgPSBtZWFuKHByaWNlKSwgTWVkaWFuID0gbWVkaWFuKHByaWNlKSwgU3RhbmRhcmRhYndlaWNodW5nID0gc2QocHJpY2UpKSAlPiUNCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKQ0KYGBgDQpJbnRlcmFrdGlvbj8NCg0KRsO8ciBNYW51ZWxsZSBGYWhyemV1Z2UgaXN0IEJlbnppbiAoTSA9IDExNDE0LDcyLCBTRCA9IDM3MjEsNywgbiA9IDgyMTEpIGRpZSB0ZXVyZXJlIEFsdGVybmF0aXZlIGltIFZlcmdsZWljaCB6dSBEaWVzZWwgKE0gPSAxMTAxNSwxMSwgU0QgPSAzOTUwLDg0LCBuID0gMTc2MykuIERlciBVbnRlcnNjaGllZCBpc3QgamVkb2NoIG5pY2h0IHNpZ25pZmlrYW50IGF1c2dlZmFsbGVuIGltIFBvc3QtSG9jLVRlc3QuIA0KDQpGw7xyIFNlbWlhdXRvbWF0aXNjaGUgR2V0cmllYmUgc2luZCBkaWUgRGllc2VsIChNID0gMTI3NTUsODMsIFNEID0gMzI3NSw1LCBuID0gNDIpIHRldXJlciBhbHMgQmVuemluZXIgKE0gPSAxMTczNCw5MSwgU0QgPSAyODgxLDc0LCBuID0gNDA1KS4gQXVjaCBkaWVzZXIgVW50ZXJzY2hpZWQgaXN0IG5pY2h0IHNpZ25pZmlrYW50YXVzZ2VmYWxsZW4gaW0gUG9zdC1Ib2MtVGVzdCwgd2FzIGhhdXB0c8OkY2hsaWNoIGFuIGRlciB2ZXJnbGVpY2hzd2Vpc2Uga2xlaW5lbiBTYW1wbGVzaXplIG4gPSA0MiBmw7xyIFNlbWktQXV0bzpEaWVzZWwgbGllZ3QuIE1laHIgV2VydGUgaMOkdHRlbiBkaWVzZW4gQmVyZWljaCB2ZXJtdXRsaWNoIG1laHIgZ2VzY2jDpHJmdC4NCg0KRsO8ciBhdXRvbWF0aXNjaGUgR2V0cmllYmUgc2luZCBlYmVuZmFsbHMgRGllc2VsZmFocnpldWdlIChNID0gMTc2MzMsNjksIFNEID0gMzMzOSwyMywgbiA9IDE3MCkgdGV1cmVyIGFscyBCZW56aW5lciAoTSA9IDEzMjM1LDc0LCBTRCA9IDM5OTQsNTQsIG4gPSA0MTYpLiBEaWVzZXIgVW50ZXJzY2hpZWQgaXN0IHNpZ25pZmlrYW50IGF1c2dlZmFsbGVuIGltIFBvc3QtSG9jLVRlc3QuDQoNCiMjIyMgQWx0ZXJuYXRpdg0KDQpCb25mZXJyb25pIHVuZCBUdWtleTogc2VociBzdHJlbmdlIEtvbnRyb2xsZSBkZXMgRmVobGVycyAxLiBBcnQsIHp1IGdlcmluZ2UgVGVzdHN0w6Rya2UsIGRlc2hhbGIgenUga29uc2VydmF0aXYuIEJlaSB3ZW5pZ2VuIFBhYXJ2ZXJnbGVpY2hlbiBoYXQgQm9uZmVycm9uaSBtZWhyIFRlc3RzdMOkcmtlLCBiZWkgdmllbGVuIFBhYXJ2ZXJnbGVpY2hlbiBoYXQgVHVrZXkgbWVociBUZXN0c3TDpHJrZS4NCg0KYGBge3J9DQpwYWlyd2lzZS50LnRlc3QoZm9yZCRwcmljZSwgZm9yZCR0cmFuc21pc3Npb24sIGRhdGE9Zm9yZCwgcG9vbC5zZD1ULHZhci5lcXVhbD1GQUxTRSkNCmBgYA0KDQpgYGB7cn0NCnBhaXJ3aXNlLnQudGVzdChmb3JkJHByaWNlLCBmb3JkJGZ1ZWxUeXBlLCBkYXRhPWZvcmQsIHBvb2wuc2Q9VCx2YXIuZXF1YWw9RikNCmBgYA0KDQoNCkJlaSBkaWVzZW0gVGVzdHZlcmZhaHJlbiBtdXNzIGRlciBhcGxoYXdlcnQga29ycmlnaWVydCB3ZXJkZW4uDQoNCmBgYHtyfQ0KbmV3YWxwaGE8LSAgMC4wNS8xNQ0KbmV3YWxwaGENCmBgYA0KDQoNCmBgYHtyfQ0KaW50ZXJha3Rpb249cGFzdGUoZm9yZCR0cmFuc21pc3Npb24sIGZvcmQkZnVlbFR5cGUsIHNlcD0iLiIpIA0KDQpwYWlyd2lzZS50LnRlc3QoZm9yZCRwcmljZSwgaW50ZXJha3Rpb24sIGRhdGE9Zm9yZCwgdmFyLmVxdWFsPUZBTFNFKQ0KYGBgDQoNCg0KIyMjIEdhbWVzIC0gSG93ZWxsDQoNCmBgYHtyfQ0KaW50ZXJha3Rpb249cGFzdGUoZm9yZCR0cmFuc21pc3Npb24sIGZvcmQkZnVlbFR5cGUsIHNlcD0iLiIpIA0KDQpmb3JkWyJpbnRlcmFrdGlvbiJdIDwtIGludGVyYWt0aW9uDQoNClZpZXcoZm9yZCkNCmBgYA0KDQpgYGB7cn0NCiNGYWt0b3IgQQ0KZm9yZCR0cmFuc21pc3Npb24gPC0gYXMuZmFjdG9yKGZvcmQkdHJhbnNtaXNzaW9uKQ0KQU5PVkEgPC0gYW92KHByaWNlfnRyYW5zbWlzc2lvbiwgZm9yZCkNCmVyZyA8LSBQTUNNUnBsdXM6OmdhbWVzSG93ZWxsVGVzdChBTk9WQSkNCnN1bW1hcnkgKGVyZykNCmBgYA0KDQpgYGB7cn0NCiMgRmFrdG9yIEINCmZvcmQkZnVlbFR5cGUgPC0gYXMuZmFjdG9yKGZvcmQkZnVlbFR5cGUpDQpBTk9WQSA8LSBhb3YocHJpY2V+ZnVlbFR5cGUsIGZvcmQpDQplcmcgPC0gUE1DTVJwbHVzOjpnYW1lc0hvd2VsbFRlc3QoQU5PVkEpDQpzdW1tYXJ5IChlcmcpDQpgYGANCg0KYGBge3J9DQojSW50ZXJha3Rpb24NCg0KZm9yZCRpbnRlcmFrdGlvbiA8LSBhcy5mYWN0b3IoZm9yZCRpbnRlcmFrdGlvbikNCkFOT1ZBIDwtIGFvdihwcmljZX5pbnRlcmFrdGlvbiwgZm9yZCkNCmVyZyA8LSBQTUNNUnBsdXM6OmdhbWVzSG93ZWxsVGVzdChBTk9WQSkNCnN1bW1hcnkgKGVyZykNCmBgYA0KDQpEaWUgS29udHJvbGx0ZXN0cyBlcmdhYmVuIGVpbmUgQmVzdMOkdGlndW5nIGRlciBFcmdlYm5pc3NlIGF1cyBkZW0gVHVrZXktVGVzdC4NCg0KIyMjIERhcyBwYXIuIEV0YS1RdWFkcmF0DQoNCkRhcyBwYXJ0aWVsbGUgRXRhLVF1YWRyYXQgKHBhcnRpZWxsZXMgzrcyKSBpc3QgaW4gQWJiaWxkdW5nIGF1c2dlZ2ViZW4uDQoNCiQkDQpcZXRhX3twYXJ0aWFsQX1eMj1cZnJhY3tRU19BfXtRU19BICsgUVNfe2lubn19XFwNClxldGFfe3BhcnRpYWxCfV4yPVxmcmFje1FTX0J9e1FTX0IgKyBRU197aW5ufX1cXA0KDQpcZXRhX3twYXJ0aWFsQSpCfV4yPVxmcmFje1FTX3tBKkJ9fXtRU197QSpCfSArIFFTX3tpbm59fVxcDQpcZXRhX0E9XGZyYWN7UVNfQX17UVNfe3RvdGFsfX1cXA0KDQpcZXRhX0I9XGZyYWN7UVNfQn17UVNfe3RvdGFsfX1cXA0KDQpcZXRhX3tBKkJ9PVxmcmFje1FTX3tBKkJ9fXtRU197dG90YWx9fVxcDQokJA0KYGBge3J9DQpldGEgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobWVockFub3ZhMSwgcGFydGlhbCA9IFRSVUUpDQpldGENCmBgYA0KDQpJbSB2b3JsaWVnZW5kZW4gQmVpc3BpZWwgaXN0IGRlciBFZmZla3QgZsO8ciBUcmVpYnN0b2ZmIG5pY2h0IHNpZ25pZmlrYW50LiBEYWhlciB3aXJkIGRlc3NlbiBwYXJ0aWVsbGVzIEV0YS1RdWFkcmF0IG5pY2h0IGJldHJhY2h0ZXQuIA0KDQpGw7xyIGRpZSBHZXRyaWViZWFydCBiZXRyw6RndCBkYXMgcGFydGllbGxlIEV0YS1RdWFkcmF0IDAsMDQuIERhcyBoZWlzc3QsIGRpZSBHZXRyaWViYXJ0IGVya2zDpHJ0IDQlIGRlcmplbmlnZW4gRmVobGVydmFyaWF0aW9uLCBkaWUgZGFzIE1vZGVsbCBow6R0dGUsIHfDpHJlIGRpZSBHZXRyaWViYXJ0IG5pY2h0IGltIE1vZGVsbC4NCg0KRGFzIHBhcnRpZWxsZSBFdGEtUXVhZHJhdCBkZXIgSW50ZXJha3Rpb24gYmV0csOkZ3QgMCwwMiB1bmQgZXJrbMOkcnQgZGFoZXIgMiUgZGVyIG9obmUgZGllIEludGVyYWt0aW9uIHVuZ2VrbMOkcnRlbiBWYXJpYXRpb24uDQoNCiMjIyBCZXJlY2hudW5nIGRlciBFZmZla3RzdMOkcmtlDQoNCiQkDQpmID0gXHNxcnRcZnJhY3tcZXRhXjJ9ezEtXGV0YV4yfQ0KJCQNCiMjIyMgRWZmZWt0c3TDpHJrZSBmw7xyIEdldHJpZWJlDQpgYGB7cn0NCmV0YSRFdGEyX3BhcnRpYWxbMV0NCmV0YSRFdGEyX3BhcnRpYWxbMl0NCmV0YSRFdGEyX3BhcnRpYWxbM10NCmBgYA0KDQoNCmBgYHtyfQ0KZWZmdHJucyA8LSBzcXJ0KGV0YSRFdGEyX3BhcnRpYWxbMV0vKDEtZXRhJEV0YTJfcGFydGlhbFsxXSkpDQoNCnNwcmludGYoIkVmZmVrdHN0w6Rya2UgZsO8cnMgR2V0cmllYmU6IGY9ICUuM2YiLCBlZmZ0cm5zKQ0KYGBgDQoNCiMjIyMgRWZmZWt0c3TDpHJrZSBmw7xycyBUcmVpYnN0b2ZmDQoNCmBgYHtyfQ0KZWZmZnVlbCA8LSBzcXJ0KGV0YSRFdGEyX3BhcnRpYWxbMl0vKDEtZXRhJEV0YTJfcGFydGlhbFsyXSkpDQoNCnNwcmludGYoIkVmZmVrdHN0w6Rya2UgZsO8cnMgVHJlaWJzdG9mZjogZj0gJS4zZiIsZWZmZnVlbCkNCmBgYA0KDQojIyMjIEVmZmVrdHN0w6Rya2UgZsO8ciBkaWUgSW50ZXJha3Rpb24NCg0KYGBge3J9DQoNCmVmZkF4QiA8LSBzcXJ0KGV0YSRFdGEyX3BhcnRpYWxbM10vKDEtZXRhJEV0YTJfcGFydGlhbFszXSkpDQoNCnNwcmludGYoIkVmZmVrdHN0w6Rya2UgZsO8ciBkaWUgSW50ZXJha3Rpb246IGY9ICUuM2YiLGVmZkF4QikNCmBgYA0KVW0genUgYmV1cnRlaWxlbiwgd2llIGdyb3NzIGRpZXNlciBFZmZla3QgaXN0LCBrYW5uIG1hbiBzaWNoIGFuIGRlciBFaW50ZWlsdW5nIHZvbiBDb2hlbiAoMTk4OCkgb3JpZW50aWVyZW46DQoNCiQkXGJlZ2lue2FsaWdufQ0KXHRleHR7U2Nod2FjaGVyIEVmZmVrdDogfSAwLjEwICY8IHx8Znx8IDwgMC4yNSAgICAgICAgICAgICBcXA0KXHRleHR7U2Nod2FjaGVyIGJpcyBtaXR0bGVyZXIgRWZmZWt0OiB9IDAuMjUgJj0gfHxmfHwgICAgICBcXA0KXHRleHR7TWl0dGxlcmVyIEVmZmVrdDogfSAwLjI1ICY8IHx8Znx8IDwgMC40MCAgICAgICAgICAgICBcXA0KXHRleHR7TWl0dGxlcmVyIGJpcyBzdGFya2VyIEVmZmVrdDogfTAuNDAgJj0gfHxmfHwgICAgICAgICBcXA0KXHRleHR7U3RhcmtlciBFZmZla3Q6IH0gMC40MCAmPCB8fGZ8fCAgICAgICAgDQpcZW5ke2FsaWdufSQkDQoNCkbDvHIgZGVuIFRyZWlic3RvZmYgYmV0csOkZ3QgZGllIEVmZmVrdHN0w6Rya2UgZiA9IDAsMDAxIHVuZCBiZXN0w6R0aWd0IGRpZSBOaWNodC1TaWduaWZpa2FueiBkZXMgVHVrZXktVGVzdHMgZHVyY2gga2VpbmVuIEVmZmVrdCBuYWNoIENvaGVuICgxOTg4KS4gDQoNCkbDvHIgZGllIEFydCBkZXMgR2V0cmllYmVzIGJldHLDpGd0IGRpZSBFZmZla3RzdMOkcmtlIGYgPSAwLDE5MSB1bmQgYmVzdMOkdGlndCBkaWUgU2lnbmlmaWthbnogZGVzIFR1a2V5LVRlc3RzIGR1cmNoIGVpbmVuIHNjaHdhY2hlbiBFZmZla3QgbmFjaCBDb2hlbiAoMTk4OCkuIA0KDQpGw7xyIGRpZSBJbnRlcmFrdGlvbiBiZXRyw6RndCBkaWUgRWZmZWt0c3TDpHJrZSBmID0gMCwxMyB1bmQgYmVzdMOkdGlndCBkaWUgU2lnbmlmaWthbnogZGVzIFR1a2V5LVRlc3RzIGR1cmNoIGVpbmVuIHNjaHdhY2hlbiBFZmZla3QgbmFjaCBDb2hlbiAoMTk4OCkuIA0KDQojIyMgRWluZSBBdXNzYWdlDQoNCiMjIyMgSHlwb3RoZXNlbg0KRXMgemVpZ3Qgc2ljaCwgZGFzcyBlcyBFSU5FTiBVbnRlcnNjaGllZCB6d2ljaGVuIGRlbSBHZXRyaWViZSB1bmQgUHJlaXMgZ2lidCAoRigyLDc1NS4xKSA9IDE1NC42NiwgcCA8IC4wMDApLiBIMCBmw7xyIGRlbiBIYXVwdGVmZmVrdCBBIHdpcmQgZW50d29yZmVuLg0KDQpBbGxlcmRpbmdzIGplIG5hY2ggVHJlaWJzdG9mZiBnaWJ0IGVzIEtFSU5FTiBVbnRlcnNjaGllZCB6d2lzY2hlbiBkZW4gUHJlaXNlbiAoRigxLDI2NTQuMykgPSAxLjA4MzYsIHAgPSAuMjk4KS4gSDAgZsO8ciBkZW4gSGF1cHRlZmZla3QgQiB3aXJkIGFuZ2Vub21tZW4uDQoNCkRlciBJbnRlcmFrdGlvbnN0ZXJtIHZvbiBUcmVpYnN0b2ZmIHVuZCBHZXRyaWViZSBhdWYgZGVuIFByZWlzIGlzdCBzaWduaWZpa2FudCAoRig1LDMzNi4xMikgPSAxMzYuNjcsIHAgPSAuMDAwKS4gRGVyIEVmZmVrdCB2b24gZGVyIEdldHJpZWJlIGjDpG5ndCBkZW1uYWNoIHp1IGVpbmVtIGdld2lzc2VuIFRlaWwgdm9tIFRyZWlic3RvZmYgYWIuIEgwIGbDvHIgZGllIEludGVyYWt0aW9uIHdpcmQgdmVyd29yZmVuLg0KDQojIyMjIFBvc3QtIEhvYyAtIFRlc3QNCg0KRGVyIFBvc3RIb2Mgd3VyZGUgbWl0IFR1a2V5IGR1cmNoZ2Vmw7xocnQuIEbDvHIgVHJlaWJzdG9mZiB6ZWlndGUgc2ljaCBLRUlORSBzaWduaWZpa2FudCBhYiAocCA9IDAuOTQ1MDA2KS4gRXMgemVpZ3QsIGRhc3Mgc2ljaCBhbGxlIEdydXBwZW4gZsO8ciBHZXRyaWViZSBzaWduaWZpa2FudCB1bnRlcnNjaGVpZGVuOiBBdXRvbWF0aWMgKE0gPSAxNDUxMS42MCAsU0QgPSA0MzA0Ljc1LCBOPTU4NiksIE1hbnVhbCAgKE0gPSAxMTM0NC4wOSwgU0QgPSAzNzY2LjEwLCBuPTk5NzQpIHVuZCBTZW1pLUF1dG8gKE0gPSAxMTgzMC44MywgU0QgPSAyOTMyLjE3LCBuPTQ0NykuDQoNClp1ZGVtIHplaWd0IHNpY2ggZWluZSBzaWduaWZpa2FudGUgSW50ZXJha3Rpb24gdm9uIEdldHJpZWJlIHVuZCBUcmVpYnN0b2ZmIGF1ZiBkaWUgUHJlaXMuRGllcyB3ZWlzdCBkYXJhdWYgaGluLCBkYXNzIHNpY2ggVHJlaWJzdG9mZiBqZSBuYWNoIEdldHJpZWJlIHVudGVyc2NoaWVkbGljaCBhdXN3aXJrdC4NCg0KQmVpbSBBdXRvbWF0aWMgdW5kIFNlbWktQXV0byBsYWcgRGllc2VsIGjDtmhlciBhbHMgUGV0cm9sLCBiZWltIE1hbnVhbCBpc3QgZXMgdW1nZWtlaHJ0Lg0KDQojIyMjRWZmZWt0c3TDpHJrZQ0KRGllIEVmZmVrdHN0w6Rya2VuIHNpbmQgc293b2hsIGbDvHIgZGVuIEhhdXB0ZWZmZWt0IGRlcyBHZXRyaWViZXMgKGYgPSAwLjE5MSkgYWxzIGF1Y2ggZsO8ciBkaWUgSW50ZXJha3Rpb24gKGYgPSAwLjEzMCkgbmFjaCBDb2hlbiAoMTk4OCkgZWluIHNjaHdhY2hlciBFZmZla3QuIERlciBUcmVpYnN0b2ZmIGhhdCBLRUlOIEVmZmVrdCBhdWYgUHJlaXMgKGYgPSAwLjAwMSkNCg0K