Überblick
head(wilcoxen, 6) # Ersten sechs Zeilen
summary(wilcoxen)
ID Vorher Nachher Differenz
Min. : 1.00 Min. :17.00 Min. :23.00 Min. :-14.00
1st Qu.: 9.25 1st Qu.:30.00 1st Qu.:31.25 1st Qu.: -7.75
Median :17.50 Median :31.00 Median :34.00 Median : -3.50
Mean :17.50 Mean :30.68 Mean :34.18 Mean : -3.50
3rd Qu.:25.75 3rd Qu.:32.00 3rd Qu.:37.75 3rd Qu.: 0.75
Max. :34.00 Max. :39.00 Max. :44.00 Max. : 5.00
str(wilcoxen)
'data.frame': 34 obs. of 4 variables:
$ ID : num 1 2 3 4 5 6 7 8 9 10 ...
$ Vorher : num 30 31 32 31 29 39 32 31 29 30 ...
$ Nachher : num 40 30 33 33 33 35 37 34 32 40 ...
$ Differenz: num -10 1 -1 -2 -4 4 -5 -3 -3 -10 ...
#Spalte Differenz anlegen
differenz <- wilcoxen$Vorher -wilcoxen$Nachher
wilcoxen <- cbind(wilcoxen, "Differenz" = differenz)
View(wilcoxen)
# Eine Spalte löschen
#wilcoxen$Differenz <- NULL
#View(Wilcoxon)
Hypothese
H1: Es gibt einen Unterschied in den Verkaufszahlen für die Aktionfigur “Held2000”vor dem Rabatt und nach dem Rabatt. \(M_{vorher} \ne M_{nacher}\)
H01: Es gibt keinen Unterschied in den Verkaufszahlen für die Aktionfigur “Held2000” vor dem Rabatt und nach dem Rabatt. \(M_{vorher} = M_{nachher}\)
Voraussetzungen für den Wilcoxon-Test
Die abhängige Variable ist mindestens ordinalskaliert -> Die Variable ist eigentlich metrisch.
Es liegen zwei verbundene Stichproben oder Gruppen vor, aber die verschiedenen Messwertpaare sind voneinander unabhängig - 1) Verbunden, weil wir den gleichen Store pro Zeile vergleichen 2) z.B Store A und Store B sind unabhängig
Boxplots zur Darstellung der Werte
boxplot(wilcoxen$Vorher , main = "Boxplot vor dem Rabatt", xlab = "Vorher", col = "hotpink3")

Vor dem Rabatt zeigt sich, dass drei Ausreißer auftraten (Median = 31). Jedoch da ein Wicoxen-Test für abhängige Stichproben durch geführt wird, können diese vernachlässigt werden.
boxplot(wilcoxen$Nachher , main = "Boxplot nach dem Rabatt", xlab = "Nach", col = "deepskyblue")

Der Median der Variable „Nachher“ liegt bei 34. Auf den ersten Blick könnte der Boxplot nahelegen, dass ein t-Test für abhängige Stichproben geeignet wäre. Bei genauerer Betrachtung zeigt sich jedoch, dass dies keine sinnvolle Wahl ist: Die Varianzen unterscheiden sich deutlich, und es sind sowohl große als auch kleine Stores vertreten. Aus diesem Grund ist der Wilcoxon-Test die passendere Methode.
ALTERNATIV - Vor und Vach dem Rabatt
boxplot(wilcoxen$Vorher, wilcoxen$Nachher, main = "Boxplots zu den Verkaufszahlen",col = c("hotpink3", "deepskyblue"), names = c("(links) vorher", "(rechts) nachher"), ylab = "Anzahl der verkauften Aktionfiguren ")

ALTERNATIV
#Median der Var. Vorher und Nachher
sprintf("Median für Vor dem Rabatt : %.2f", median(wilcoxen$Vorher))
[1] "Median für Vor dem Rabatt : 31.00"
sprintf("Median für Nach dem Rabatt : %.2f", median(wilcoxen$Nachher))
[1] "Median für Nach dem Rabatt : 34.00"
sprintf("Anzahl der Daten: %.f", nrow(wilcoxen))
[1] "Anzahl der Daten: 34"
Es gibt einen Unterschied in der zentralen Tendenz zwischen zwei Messzeitpunkten. Vorher dem Rabatt wurden 31 Artikel gekauft (n=34); nach dem Rabatt wurden 34 Artikel verkauft (n=34).
Ergebnisse des Wilcoxon-Tests
Ist die Stichprobe hinreichend gross (n > 20), so ist der kritische Wert asymptotisch normalverteilt.
test<- wilcox.test(wilcoxen$Vorher, wilcoxen$Nachher,alternative = "two.sided",paired = TRUE, exact = FALSE)
test
Wilcoxon signed rank test with continuity correction
data: wilcoxen$Vorher and wilcoxen$Nachher
V = 69.5, p-value = 0.000817
alternative hypothesis: true location shift is not equal to 0
Ist dies nicht der Fall, so wird die exakte Signifikanz verwendet.
test<- wilcox.test(wilcoxen$Vorher, wilcoxen$Nachher,alternative = "two.sided",paired = TRUE, exact = TRUE)
Warning in wilcox.test.default(wilcoxen$Vorher, wilcoxen$Nachher, alternative = "two.sided", :
cannot compute exact p-value with ties
Warning in wilcox.test.default(wilcoxen$Vorher, wilcoxen$Nachher, alternative = "two.sided", :
cannot compute exact p-value with zeroes
test
Wilcoxon signed rank test with continuity correction
data: wilcoxen$Vorher and wilcoxen$Nachher
V = 69.5, p-value = 0.000817
alternative hypothesis: true location shift is not equal to 0
doppelt vorkommende Daten
" cannot compute exact p-value with zeroes"- Da in diesem Datensatz doppelte Messwerte vorkommen, kann kein exakter p-Wert berechnet werden. Folgende zwei Funktionen können herangezogen werden zur Berechnung des p-Wertes.
Var 1: mit der Funktion:wilcox.exact
#library(coin)
#library(exactRankTests)
var1test<- wilcox.exact(wilcoxen$Vorher, wilcoxen$Nachher ,alternative = "two.sided",paired = TRUE, exact = TRUE)
var1test
Exact Wilcoxon signed rank test
data: wilcoxen$Vorher and wilcoxen$Nachher
V = 69.5, p-value = 0.0004196
alternative hypothesis: true mu is not equal to 0
Var 2: mit der Funktion:wilcoxsign_test
#library(coin)
var2test<- coin::wilcoxsign_test(wilcoxen$Vorher~ wilcoxen$Nachher ,distribution = "exact",alternative = "two.sided", paired = T)
var2test
Exact Wilcoxon-Pratt Signed-Rank Test
data: y by x (pos, neg)
stratified by block
Z = -3.2036, p-value = 0.0008935
alternative hypothesis: true mu is not equal to 0
Die Teststatistik beträgt V = 69.5 und der zugehörige Signifikanzwert p = .000. Damit ist der Unterschied signifikant: Die zentralen Tendenzen der beiden Messzeitpunkte unterscheiden sich (Wilcoxon-Test: V = 69.5, Z = -3.20, p = .000, n = 34).
Berechnung der Effektstärke
\[r=\left| \frac{z}{\sqrt{n}} \right|\]
Der z - Wert
#var 1: Zstat1<-qnorm(var1test$p.value /2)
#var 2: Zstat1<-var2test@statistic@teststatistic
Zstat1<-var2test@statistic@teststatistic
sprintf("Z-Wert für den WSR: %.2f", Zstat1)
[1] "Z-Wert für den WSR: -3.20"
Anzahl der Daten aus dem Datensatz
nk<-nrow(wilcoxen[wilcoxen$Vorher!=wilcoxen$Nachher,])
sprintf("Anzahl ohne Null: %.f", nk)
[1] "Anzahl ohne Null: 30"
Die Anzahl kann auch unter Datenmartix ausgelesen werden. In dem vorliegenden Beispiel sind es 30 Datensätze.
eff <-round(abs(Zstat1)/sqrt(nk),1)
sprintf("Effektstärke: %.1f", eff)
[1] "Effektstärke: 0.6"
Zur Beurteilung der Grösse des Effektes dient die Einteilung von Cohen (1988):
\[
\begin{align}
\text{Schwacher Effekt: } 0.10 &< ||r|| < 0.25 \\
\text{Schwacher bis mittlerer Effekt: } 0.25 &= ||r|| \\
\text{Mittlerer Effekt: } 0.25 &< ||r|| < 0.40 \\
\text{Mittlerer bis starker Effekt: }0.40 &= ||r|| \\
\text{Starker Effekt: } 0.40 &< ||r||
\end{align}
\]
Damit entspricht die Effektstärke von .6 einem starken Effekt.
Eine Aussage
Die Verkaufszahlen der Aktionfigur “Held2000” sind nach der Gewährung eines Rabattes signifikant höher (Median = 34.00) als davor (Median = 31.00; Wilcoxon-Test: z-Wert: -3.2036, p = .000, n = 34). Die Effektstärke nach Cohen (1988) liegt bei r = .6 und entspricht einem starken Effekt. H0 kann verworfen werden.
LS0tDQp0aXRsZTogIldpbGNveG9uLVRlc3QgZsO8ciBhYmjDpG5naWdlIFN0aWNocHJvYmVuIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQojIyBCZXJlY2huZW4gZGVyIFRlc3RzdGF0aXN0aWsNCg0KRGVyIFdpbGNveG9uLVRlc3QgYmFzaWVydCBhdWYgZGVyIElkZWUgZGVyIFJhbmdpZXJ1bmcgZGVyIERhdGVuLiBEYXMgaGVpc3N0LCBlcyB3aXJkIG5pY2h0IG1pdCBkZW4gRGlmZmVyZW56ZW4gZGVyIE1lc3N3ZXJ0ZSBzZWxic3QgZ2VyZWNobmV0LCBzb25kZXJuIGRpZXNlIHdlcmRlbiBkdXJjaCBSw6RuZ2UgZXJzZXR6dCwgbWl0IHdlbGNoZW4gZGVyIGVpZ2VudGxpY2hlIFRlc3QgZHVyY2hnZWbDvGhydCB3aXJkLiBEYW1pdCBiZXJ1aHQgZGllIEJlcmVjaG51bmcgZGVzIFRlc3RzIGF1c3NjaGxpZXNzbGljaCBhdWYgZGVyIE9yZG51bmcgZGVyIERpZmZlcmVuemVuIChncsO2c3NlciBhbHMsIGtsZWluZXIgYWxzKS4gRGllIGFic29sdXRlbiBBYnN0w6RuZGUgendpc2NoZW4gZGVuIERpZmZlcmVuemVuIHdlcmRlbiBuaWNodCBiZXLDvGNrc2ljaHRpZ3QuDQoNClp1bsOkY2hzdCB3aXJkIGbDvHIgamVkZXMgTWVzc3dlcnRwYWFyIGRpZSBEaWZmZXJlbnogZGVyIGJlaWRlbiBNZXNzdW5nZW4gYmVyZWNobmV0IChOYWNoaGVyIOKAkyBWb3JoZXIpIHVuZCBlcyB3ZXJkZW4gc293b2hsIGRlciBCZXRyYWcgZGVyIERpZmZlcmVueiAoc2llaGUgU3BhbHRlICJEaWZmZXJlbnoiIGluIEFiYmlsZHVuZyAxKSBhbHMgYXVjaCBkYXMgVm9yemVpY2hlbiBkZXIgRGlmZmVyZW56IG5vdGllcnQgKFNwYWx0ZSAiVm9yemVpY2hlbiIpLg0KDQpEaWVzZSBhYnNvbHV0ZW4gRGlmZmVyZW56ZW4gd2VyZGVuIG1pdCBSw6RuZ2VuIHZlcnNlaGVuLiBCZXRyw6RndCBkaWUgRGlmZmVyZW56IGVpbmVzIERhdGVucGFhcmVzIDAsIHNvIHdpcmQgZGllc2VzIFBhYXIgdm9uIGRlciBSYW5naWVydW5nIGF1c2dlc2NobG9zc2VuLiBFcyB3aXJkIHVuYWJow6RuZ2lnIHZvbSBWb3J6ZWljaGVuIG1pdCBkZXIga2xlaW5zdGVuIERpZmZlcmVueiBiZWdvbm5lbiB1bmQgYXVmd8OkcnRzIG51bW1lcmllcnQuIEtvbW10IGVpbiBNZXNzd2VydCBtZWhyZmFjaCB2b3IgKGVuZ2wuICJ0aWVzIiksIHNvIHdlcmRlbiBzb2dlbmFubnRlICJ2ZXJidW5kZW5lIFLDpG5nZSIgZ2ViaWxkZXQuIEltIEJlaXNwaWVsIGlzdCBkaWUgRGlmZmVyZW56IDEgZGVyIGtsZWluc3RlIFdlcnQgdW5kIGtvbW10IGluc2dlc2FtdCB2aWVybWFsIHZvci4gRGFzIGVudHNwcmljaHQgZGVuIHBvdGVuemllbGxlbiBSw6RuZ2VuIDEgYmlzIDQuIE51biB3aXJkIGRlciBEdXJjaHNjaG5pdHQgZGllc2VyIFLDpG5nZSAkKFxmcmFjezErMiszKzR9ezR9ID0gMi41KSQgYmVyZWNobmV0LiBEZXIgRGlmZmVyZW56d2VydCAkMSQgZXJow6RsdCBzb21pdCBkZW4gUmFuZyAkMi41JCAoc2llaGUgU3BhbHRlICJSYW5nIikuDQoNCklzdCBhbGxlbiBQYWFyZGlmZmVyZW56ZW4gZWluIFJhbmcgenVnZW9yZG5ldCwgc28gd2VyZGVuIGRpZSBwb3NpdGl2ZW4gdW5kIGRpZSBuZWdhdGl2ZW4gUmFuZ3Bsw6R0emUgc2VwYXJhdCBub3RpZXJ0IChTcGFsdGVuICJQb3NpdGl2ZSBSw6RuZ2UiOyAiTmVnYXRpdmUgUsOkbmdlIikgdW5kIGF1ZnN1bW1pZXJ0IChaZWlsZSAiVG90YWwiKS4NCg0KWndpc2NoZW4gZGllc2VuIFJhbmdzdW1tZW4gYmVzdGVodCBkZXIgZm9sZ2VuZGUgWnVzYW1tZW5oYW5nOg0KDQokJA0KVF8rICsgVF97LX0gPSBcZnJhY3tuKG4rMSl9ezJ9ID0gXGZyYWN7MzAoMzArMSl9ezJ9PTQ2NSANCiQkDQptaXQNCg0KKiAkVF8rID17fSRTdW1tZSBkZXIgcG9zaXRpdmVuIFLDpG5nZQ0KDQoqICRUX3stfSA9e30kU3VtbWUgZGVyIG5lZ2F0aXZlbiBSw6RuZ2UNCg0KKiAkbiA9IHt9JEFuemFobCBkZXIgdm9uIE51bGwgdmVyc2NoaWVkZW5lbiBQYWFyZGlmZmVyZW56ZW4NCg0KDQpBbHMgVGVzdHN0YXRpc3RpayAkVyQgd2lyZCBudW4gZGVyIGtsZWluZXJlIGRlciBiZWlkZW4gV2VydGUgYmVudXR6dCBtaXQ6DQoNCiQkVyA9IG1pbihUXys7IFRfey19KSA9IDY5LjUkJA0KDQpKZSBnZXJpbmdlciBkaWUgVW50ZXJzY2hpZWRlIGRlciB6ZW50cmFsZW4gVGVuZGVuemVuIHNpbmQsIGRlc3RvIG7DpGhlciBsaWVndCBkZXIgV2VydCBkZXIgVGVzdHN0YXRpc3RpayBiZWkgZGVtIFdlcnQsIGRlciBzaWNoIGVyZ2lidCwgd2VubiBlcyBrZWluZSBVbnRlcnNjaGllZGUgZ8OkYmUgKGRlciBFcndhcnR1bmdzd2VydCBmw7xyIGRpZSBSYW5nc3VtbWVuIHVudGVyIEfDvGx0aWdrZWl0IGRlciBOdWxsaHlwb3RoZXNlKS4gRGllc2VyIFdlcnQgZXJyZWNobmV0IHNpY2ggYWxzIEjDpGxmdGUgZGVyIFN1bW1lIGRlciBiZWlkZW4gUmFuZ3N1bW1lbi4gPGJyPg0KRsO8ciBkYXMgQmVpc3BpZWwgc2luZCAzMCBkZXIgMzQgUGFhcmRpZmZlcmVuemVuIOKJoCAwLiBBbHNvIGVyZ2lidCBkaWVzOiANCg0KRGllc2VyIFdlcnQgZXJyZWNobmV0IHNpY2ggYWxzIEjDpGxmdGUgZGVyIFN1bW1lIGRlciBiZWlkZW4gUmFuZ3N1bW1lbi4NCg0KJCRcbXVfdyA9IFxmcmFje24obisxKX17NH09XGZyYWN7MzAoMzArMSl9ezR9ID0gMjMyLjUkJA0KDQptaXQgDQoNCiogJG4gPXt9JEFuemFobCBkZXIgdm9uIE5VbGwgdmVyc2NoaWVkZW5lbiBQYWFyZGlmZmVyZW56ZW4NCg0KDQoNCg0KIyMgU2lnbmlmaWthbnogZGVyIFRlc3RzdGF0aXN0aWsNCg0KRGVyIGJlcmVjaG5ldGUgV2VydCBtdXNzIG51biBhdWYgU2lnbmlmaWthbnogZ2VwcsO8ZnQgd2VyZGVuLiBEYXp1IHdpcmQgZGllIFRlc3RzdGF0aXN0aWsgbWl0IGVpbmVtIGtyaXRpc2NoZW4gV2VydCB2ZXJnbGljaGVuLiBJc3QgZGllIFN0aWNocHJvYmUgaGlucmVpY2hlbmQgZ3Jvc3MgJChuID4gMjApJCwgc28gaXN0IGRlciBrcml0aXNjaGUgV2VydCBhc3ltcHRvdGlzY2ggbm9ybWFsdmVydGVpbHQgdW5kIGRpZSBTaWduaWZpa2FueiBrYW5uIGdlcHLDvGZ0IHdlcmRlbiwgaW5kZW0gZGVyIGViZW4gYmVyZWNobmV0ZSBXLVdlcnQgd2llIGZvbGd0IHotc3RhbmRhcmRpc2llcnQgd2lyZDoNCg0KJCQNClogPSBcZnJhY3tXIC0gXG11X3d9e1xzaWdtYV93fSA9IFxmcmFje1cgLSAgXGZyYWN7blxjZG90KG4rMSl9ezR9fXtcc3FydHtcZnJhY3tuXGNkb3QobisxKVxjZG90KDJcY2RvdCBuKzEpfXsyNH19fSA9IFxmcmFjezY5LjUgLSAgMjMyLjV9e1xzcXJ0e1xmcmFjezMwXGNkb3QoMzArMSlcY2RvdCgyXGNkb3QgMzArMSl9ezI0fX19PSBcZnJhY3stMTYzfXs0OC42MTg0MX09IC0zLjM1Mg0KJCQNCm1pdA0KKiAkXG11X3cgPXt9JEVyd2FydHVuZ3N3ZXJ0IGRlcyBXLVdlcnRlcyB1bnRlciBHw7xsdGlna2VpdCBkZXIgTnVsbGh5cG90aGVzZSAoImtlaW4gVW50ZXJzY2hpZWQiKS4NCg0KKiAkXHNpZ21hX3cgPXt9JFN0YW5kYXJkZmVobGVyIGRlcyBXLVdlcnRlcy4NCg0KKiAkbiA9e30kQW56YWhsIGRlciB2b24gTnVsbCB2ZXJzY2hpZWRlbmVuIFBhYXJkaWZmZXJlbnplbi4NCg0KRGllc2VyIHotV2VydCBrYW5uIG51biBhdWYgU2lnbmlmaWthbnogZ2VwcsO8ZnQgd2VyZGVuLCBpbmRlbSBlciBtaXQgZGVtIGtyaXRpc2NoZW4gV2VydCBkZXIgU3RhbmRhcmRub3JtYWx2ZXJ0ZWlsdW5nICh6LVZlcnRlaWx1bmcpIHZlcmdsaWNoZW4gd2lyZC4gRGllc2VyIGtyaXRpc2NoZSBXZXJ0IGthbm4gVGFiZWxsZW4gZW50bm9tbWVuIHdlcmRlbi4gDQoNCg0KIyMgU2lnbmlmaWthbnogZGVyIFRlc3RzdGF0aXN0aWsNCg0KRGllc2VyIHotV2VydCBrYW5uIG51biBhdWYgU2lnbmlmaWthbnogZ2VwcsO8ZnQgd2VyZGVuLCBpbmRlbSBlciBtaXQgZGVtIGtyaXRpc2NoZW4gV2VydCBkZXIgU3RhbmRhcmRub3JtYWx2ZXJ0ZWlsdW5nICh6LVZlcnRlaWx1bmcpIHZlcmdsaWNoZW4gd2lyZC4gRGllc2VyIGtyaXRpc2NoZSBXZXJ0IGthbm4gVGFiZWxsZW4gZW50bm9tbWVuIHdlcmRlbi4gRsO8ciBkYXMgendlaXNlaXRpZ2UgU2lnbmlmaWthbnpuaXZlYXUgLjA1IGJldHLDpGd0IGVyIMKxMS45Ni4gSXN0IGRlciBCZXRyYWcgZGVyIFRlc3RzdGF0aXN0aWsgaMO2aGVyIGFscyBkZXIga3JpdGlzY2hlIFdlcnQsIHNvIGlzdCBkZXIgVW50ZXJzY2hpZWQgc2lnbmlmaWthbnQuIERpZXMgaXN0IGbDvHIgZGFzIEJlaXNwaWVsIGRlciBGYWxsICh8LTMuMzUyfCA+IDEuOTYpLiBFcyBrYW5uIGFsc28gZGF2b24gYXVzZ2VnYW5nZW4gd2VyZGVuLCBkYXNzIHNpY2ggZGllIHplbnRyYWxlbiBUZW5kZW56ZW4gdW50ZXJzY2hlaWRlbiAoV2lsY294b24tVGVzdDogVyA9IDY5LjUsIHAgPCAuMDUsIG4gPSAzNCkuIA0KDQojIyDDnGJlcmJsaWNrDQoNCg0KYGBge3J9DQpoZWFkKHdpbGNveGVuLCA2KSAjIEVyc3RlbiBzZWNocyBaZWlsZW4gDQpgYGANCg0KDQoNCmBgYHtyfQ0Kc3VtbWFyeSh3aWxjb3hlbikNCmBgYA0KDQoNCmBgYHtyfQ0Kc3RyKHdpbGNveGVuKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KI1NwYWx0ZSBEaWZmZXJlbnogYW5sZWdlbiANCg0KZGlmZmVyZW56IDwtIHdpbGNveGVuJFZvcmhlciAtd2lsY294ZW4kTmFjaGhlciANCg0Kd2lsY294ZW4gPC0gY2JpbmQod2lsY294ZW4sICJEaWZmZXJlbnoiID0gZGlmZmVyZW56KQ0KVmlldyh3aWxjb3hlbikNCg0KYGBgDQoNCmBgYHtyfQ0KIyBFaW5lIFNwYWx0ZSBsw7ZzY2hlbg0KDQojd2lsY294ZW4kRGlmZmVyZW56IDwtIE5VTEwNCiNWaWV3KFdpbGNveG9uKQ0KYGBgDQoNCg0KDQoNCg0KDQojIEh5cG90aGVzZSANCkgxOiBFcyBnaWJ0IGVpbmVuIFVudGVyc2NoaWVkIGluIGRlbiBWZXJrYXVmc3phaGxlbiBmw7xyIGRpZSBBa3Rpb25maWd1ciAiSGVsZDIwMDAidm9yIGRlbSBSYWJhdHQgdW5kIG5hY2ggZGVtIFJhYmF0dC4gJE1fe3Zvcmhlcn0gXG5lIE1fe25hY2hlcn0kDQoNCkgwMTogRXMgZ2lidCBrZWluZW4gVW50ZXJzY2hpZWQgaW4gZGVuIFZlcmthdWZzemFobGVuIGbDvHIgZGllIEFrdGlvbmZpZ3VyICJIZWxkMjAwMCIgdm9yIGRlbSBSYWJhdHQgdW5kIG5hY2ggZGVtIFJhYmF0dC4NCiRNX3t2b3JoZXJ9ID0gTV97bmFjaGhlcn0kDQoNCiMgVm9yYXVzc2V0enVuZ2VuIGbDvHIgZGVuIFdpbGNveG9uLVRlc3QgICANCg0KDQpEaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBpc3QgbWluZGVzdGVucyBvcmRpbmFsc2thbGllcnQgDQotPiBEaWUgVmFyaWFibGUgaXN0IGVpZ2VudGxpY2ggbWV0cmlzY2guDQoNCkVzIGxpZWdlbiB6d2VpIHZlcmJ1bmRlbmUgU3RpY2hwcm9iZW4gb2RlciBHcnVwcGVuIHZvciwNCmFiZXIgZGllIHZlcnNjaGllZGVuZW4gTWVzc3dlcnRwYWFyZSBzaW5kIHZvbmVpbmFuZGVyIHVuYWJow6RuZ2lnIC0gDQoxKSBWZXJidW5kZW4sIHdlaWwgd2lyIGRlbiBnbGVpY2hlbiBTdG9yZSBwcm8gWmVpbGUgdmVyZ2xlaWNoZW4NCjIpIHouQiBTdG9yZSBBIHVuZCBTdG9yZSBCIHNpbmQgdW5hYmjDpG5naWcNCg0KDQoNCg0KIyBCb3hwbG90cyB6dXIgRGFyc3RlbGx1bmcgZGVyIFdlcnRlDQoNCg0KDQpgYGB7cn0NCg0KYm94cGxvdCh3aWxjb3hlbiRWb3JoZXIgLCBtYWluID0gIkJveHBsb3Qgdm9yIGRlbSBSYWJhdHQiLCB4bGFiID0gIlZvcmhlciIsIGNvbCA9ICJob3RwaW5rMyIpDQoNCmBgYA0KDQpWb3IgZGVtIFJhYmF0dCB6ZWlndCBzaWNoLCBkYXNzIGRyZWkgQXVzcmVpw59lciBhdWZ0cmF0ZW4gKE1lZGlhbiA9IDMxKS4gSmVkb2NoIGRhIGVpbiBXaWNveGVuLVRlc3QgZsO8ciBhYmjDpG5naWdlIFN0aWNocHJvYmVuIGR1cmNoIGdlZsO8aHJ0IHdpcmQsIGvDtm5uZW4gZGllc2UgdmVybmFjaGzDpHNzaWd0IHdlcmRlbi4NCg0KYGBge3J9DQoNCmJveHBsb3Qod2lsY294ZW4kTmFjaGhlciAsIG1haW4gPSAiQm94cGxvdCBuYWNoIGRlbSBSYWJhdHQiLCB4bGFiID0gIk5hY2giLCBjb2wgPSAiZGVlcHNreWJsdWUiKQ0KDQpgYGANCg0KRGVyIE1lZGlhbiBmw7xyIGRpZSBWYXIuICJOYWNoaGVyIiBsaWVndCBiZWkgMzQuIEFuaGFuZCBkZXMgQm94cGxvdHMga8O2bm50ZSBtYW4gYXVmIGRpZSBJZGVlIGtvbW1lbiwgZGFzcyBlaW4gdC1UZXN0IGbDvHIgYWJow6RuZ2lnZSBpbiBGcmFnZSBrb21tZW4ga8O2bm50ZS4gQWxsZXJkaW5ncyBiZWkgZ2VuYXVlciBCZXRyYWNodHVuZyBpc3QgZGFzIGVoZXIgZWluZSBndXRlIElkZWUuIERpZSBWYXJpYW56ZW4gc2luZCBzZWhyIHVudGVyc2NoaWVkbGljaCB2ZXJ0ZWlsdC4gRGFyw7xiZXIgaGluYXVzIHdlcmRlbiBzb3dvaGwgZ3Jvc3MgYWxzIGF1Y2gga2xlaW5lIFN0b3JlIGJlcsO8Y2tzaWNodGlndC4gRGFoZXIgaXN0IGRlciBXaWxjb3hvbiB6dSBiZXZvcnp1Z2VuLiAgDQoNCg0KDQojIEFMVEVSTkFUSVYgLSBWb3IgdW5kIFZhY2ggZGVtIFJhYmF0dCAgDQoNCmBgYHtyfQ0KYm94cGxvdCh3aWxjb3hlbiRWb3JoZXIsIHdpbGNveGVuJE5hY2hoZXIsIG1haW4gPSAiQm94cGxvdHMgenUgZGVuIFZlcmthdWZzemFobGVuIixjb2wgPSBjKCJob3RwaW5rMyIsICJkZWVwc2t5Ymx1ZSIpLCBuYW1lcyA9IGMoIihsaW5rcykgdm9yaGVyIiwgIihyZWNodHMpIG5hY2hoZXIiKSwgeWxhYiA9ICJBbnphaGwgZGVyIHZlcmthdWZ0ZW4gQWt0aW9uZmlndXJlbiAiKQ0KDQpgYGANCg0KDQojIEJlcmVjaG51bmcgZGVyIE1lZGlhbmUNCg0KDQpgYGB7cn0NCmxpYnJhcnkocHN5Y2gpDQp6dXNhbW1lbmZhc3N1bmcgPC1kZXNjcmliZSh3aWxjb3hlbikNCnp1c2FtbWVuZmFzc3VuZw0KYGBgDQoNCg0KDQojIEFMVEVSTkFUSVYNCg0KDQpgYGB7cn0NCiNNZWRpYW4gZGVyIFZhci4gVm9yaGVyIHVuZCBOYWNoaGVyDQoNCnNwcmludGYoIk1lZGlhbiBmw7xyIFZvciBkZW0gUmFiYXR0IDogJS4yZiIsIG1lZGlhbih3aWxjb3hlbiRWb3JoZXIpKQ0KDQpzcHJpbnRmKCJNZWRpYW4gZsO8ciBOYWNoIGRlbSBSYWJhdHQgOiAlLjJmIiwgbWVkaWFuKHdpbGNveGVuJE5hY2hoZXIpKQ0Kc3ByaW50ZigiQW56YWhsIGRlciBEYXRlbjogJS5mIiwgbnJvdyh3aWxjb3hlbikpDQpgYGANCg0KDQpFcyBnaWJ0IGVpbmVuIFVudGVyc2NoaWVkIGluIGRlciB6ZW50cmFsZW4gVGVuZGVueiB6d2lzY2hlbiB6d2VpIE1lc3N6ZWl0cHVua3Rlbi4gVm9yaGVyIGRlbSBSYWJhdHQgd3VyZGVuIDMxIEFydGlrZWwgZ2VrYXVmdCAobj0zNCk7IG5hY2ggZGVtIFJhYmF0dCB3dXJkZW4gMzQgQXJ0aWtlbCB2ZXJrYXVmdCAobj0zNCkuDQoNCg0KIyBFcmdlYm5pc3NlIGRlcyBXaWxjb3hvbi1UZXN0cw0KDQojIyMgSXN0IGRpZSBTdGljaHByb2JlIGhpbnJlaWNoZW5kIGdyb3NzIChuID4gMjApLCBzbyBpc3QgZGVyIGtyaXRpc2NoZSBXZXJ0IGFzeW1wdG90aXNjaCBub3JtYWx2ZXJ0ZWlsdC4NCmBgYHtyfQ0KDQp0ZXN0PC0gd2lsY294LnRlc3Qod2lsY294ZW4kVm9yaGVyLCB3aWxjb3hlbiROYWNoaGVyLGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIscGFpcmVkID0gVFJVRSwgZXhhY3QgPSBGQUxTRSkNCnRlc3QNCg0KYGBgDQoNCiMjIyBJc3QgZGllcyBuaWNodCBkZXIgRmFsbCwgc28gd2lyZCBkaWUgZXhha3RlIFNpZ25pZmlrYW56IHZlcndlbmRldC4NCg0KDQpgYGB7cn0NCg0KdGVzdDwtIHdpbGNveC50ZXN0KHdpbGNveGVuJFZvcmhlciwgd2lsY294ZW4kTmFjaGhlcixhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLHBhaXJlZCA9IFRSVUUsIGV4YWN0ID0gVFJVRSkNCnRlc3QNCg0KYGBgDQoNCg0KIyMjIGRvcHBlbHQgdm9ya29tbWVuZGUgRGF0ZW4NCiIgY2Fubm90IGNvbXB1dGUgZXhhY3QgcC12YWx1ZSB3aXRoIHplcm9lcyItICBEYSBpbiBkaWVzZW0gRGF0ZW5zYXR6IGRvcHBlbHRlIE1lc3N3ZXJ0ZSB2b3Jrb21tZW4sIGthbm4ga2VpbiBleGFrdGVyIHAtV2VydCBiZXJlY2huZXQgd2VyZGVuLiBGb2xnZW5kZSB6d2VpIEZ1bmt0aW9uZW4ga8O2bm5lbiBoZXJhbmdlem9nZW4gd2VyZGVuIHp1ciBCZXJlY2hudW5nIGRlcyBwLVdlcnRlcy4NCg0KIyMjIyBWYXIgMTogbWl0IGRlciBGdW5rdGlvbjp3aWxjb3guZXhhY3QNCg0KYGBge3J9DQojbGlicmFyeShjb2luKQ0KI2xpYnJhcnkoZXhhY3RSYW5rVGVzdHMpDQp2YXIxdGVzdDwtIHdpbGNveC5leGFjdCh3aWxjb3hlbiRWb3JoZXIsIHdpbGNveGVuJE5hY2hoZXIgLGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIscGFpcmVkID0gVFJVRSwgZXhhY3QgPSBUUlVFKQ0KdmFyMXRlc3QNCmBgYA0KDQojIyMjIFZhciAyOiBtaXQgZGVyIEZ1bmt0aW9uOndpbGNveHNpZ25fdGVzdA0KDQpgYGB7cn0NCiNsaWJyYXJ5KGNvaW4pDQp2YXIydGVzdDwtIGNvaW46OndpbGNveHNpZ25fdGVzdCh3aWxjb3hlbiRWb3JoZXJ+IHdpbGNveGVuJE5hY2hoZXIgLGRpc3RyaWJ1dGlvbiA9ICJleGFjdCIsYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVCkNCnZhcjJ0ZXN0DQoNCmBgYA0KRGllIFRlc3RzdGF0aXN0aWsgYmV0csOkZ3QgViA9IDY5LjUgdW5kIGRlciB6dWdlaMO2cmlnZSBTaWduaWZpa2FuendlcnQgcCA9IC4wMDAuIERhbWl0IGlzdCBkZXIgVW50ZXJzY2hpZWQgc2lnbmlmaWthbnQ6IERpZSB6ZW50cmFsZW4gVGVuZGVuemVuIGRlciBiZWlkZW4gTWVzc3plaXRwdW5rdGUgdW50ZXJzY2hlaWRlbiBzaWNoIChXaWxjb3hvbi1UZXN0OiBWID0gNjkuNSwgWiA9IC0zLjIwLCBwID0gLjAwMCwgbiA9IDM0KS4NCg0KDQoNCiMgQmVyZWNobnVuZyBkZXIgRWZmZWt0c3TDpHJrZQ0KDQoNCiQkcj1cbGVmdHwgXGZyYWN7en17XHNxcnR7bn19IFxyaWdodHwkJA0KDQoNCiMjIyBEZXIgeiAtIFdlcnQNCmBgYHtyfQ0KI3ZhciAxOiBac3RhdDE8LXFub3JtKHZhcjF0ZXN0JHAudmFsdWUgLzIpDQojdmFyIDI6IFpzdGF0MTwtdmFyMnRlc3RAc3RhdGlzdGljQHRlc3RzdGF0aXN0aWMNCg0KWnN0YXQxPC12YXIydGVzdEBzdGF0aXN0aWNAdGVzdHN0YXRpc3RpYw0Kc3ByaW50ZigiWi1XZXJ0IGbDvHIgZGVuIFdTUjogJS4yZiIsIFpzdGF0MSkNCg0KYGBgDQoNCg0KIyMjIEFuemFobCBkZXIgRGF0ZW4gYXVzIGRlbSBEYXRlbnNhdHoNCmBgYHtyfQ0Kbms8LW5yb3cod2lsY294ZW5bd2lsY294ZW4kVm9yaGVyIT13aWxjb3hlbiROYWNoaGVyLF0pDQpzcHJpbnRmKCJBbnphaGwgb2huZSBOdWxsOiAlLmYiLCBuaykNCmBgYA0KDQpEaWUgQW56YWhsIGthbm4gYXVjaCB1bnRlciBEYXRlbm1hcnRpeCBhdXNnZWxlc2VuIHdlcmRlbi4gSW4gZGVtIHZvcmxpZWdlbmRlbiBCZWlzcGllbCBzaW5kIGVzIDMwIERhdGVuc8OkdHplLg0KDQpgYGB7cn0NCmVmZiA8LXJvdW5kKGFicyhac3RhdDEpL3NxcnQobmspLDEpDQpzcHJpbnRmKCJFZmZla3RzdMOkcmtlOiAlLjFmIiwgZWZmKQ0KYGBgDQoNClp1ciBCZXVydGVpbHVuZyBkZXIgR3LDtnNzZSBkZXMgRWZmZWt0ZXMgZGllbnQgZGllIEVpbnRlaWx1bmcgdm9uIENvaGVuICgxOTg4KToNCg0KJCQNClxiZWdpbnthbGlnbn0NClx0ZXh0e1NjaHdhY2hlciBFZmZla3Q6IH0gMC4xMCAmPCB8fHJ8fCA8IDAuMjUgICAgICAgICAgICAgXFwNClx0ZXh0e1NjaHdhY2hlciBiaXMgbWl0dGxlcmVyIEVmZmVrdDogfSAwLjI1ICY9IHx8cnx8ICAgICAgXFwNClx0ZXh0e01pdHRsZXJlciBFZmZla3Q6IH0gMC4yNSAmPCB8fHJ8fCA8IDAuNDAgICAgICAgICAgICAgXFwNClx0ZXh0e01pdHRsZXJlciBiaXMgc3RhcmtlciBFZmZla3Q6IH0wLjQwICY9IHx8cnx8ICAgICAgICAgXFwNClx0ZXh0e1N0YXJrZXIgRWZmZWt0OiB9IDAuNDAgJjwgfHxyfHwgICAgICAgIA0KXGVuZHthbGlnbn0NCiQkDQoNCkRhbWl0IGVudHNwcmljaHQgZGllIEVmZmVrdHN0w6Rya2Ugdm9uIC42IGVpbmVtIHN0YXJrZW4gRWZmZWt0Lg0KDQojIEVpbmUgQXVzc2FnZQ0KDQpEaWUgVmVya2F1ZnN6YWhsZW4gZGVyIEFrdGlvbmZpZ3VyIOKAnEhlbGQyMDAw4oCdIHNpbmQgbmFjaCBkZXIgR2V3w6RocnVuZyBlaW5lcyBSYWJhdHRlcyBzaWduaWZpa2FudCBow7ZoZXIgKE1lZGlhbiA9IDM0LjAwKSBhbHMgZGF2b3IgKE1lZGlhbiA9IDMxLjAwOyBXaWxjb3hvbi1UZXN0OiB6LVdlcnQ6IC0zLjIwMzYsIHAgPSAuMDAwLCBuID0gMzQpLiBEaWUgRWZmZWt0c3TDpHJrZSBuYWNoIENvaGVuICgxOTg4KSBsaWVndCBiZWkgciA9IC42IHVuZCBlbnRzcHJpY2h0IGVpbmVtIHN0YXJrZW4gRWZmZWt0LiBIMCBrYW5uIHZlcndvcmZlbiB3ZXJkZW4uDQoNCg==