Aufgabe 3: Zusammenhangshypothese

Datensatz:

Datensatz = “titanic.csv”
Var 1 = Survived
Var 2 = Pclass

Aufgabenstellung

Hypothese

H0: Es gibt keinen Unterschied zwischen Pclass und Survived.
H1: Es gibt einen Unterschied zwischen Pclass und Survived.

Für alle unsere Hypothesen wird ein Alpha von 0.05 angenommen.

Voraussetzungen

3.1) Die Variablen sind nominalskaliert (survived) und ordinal skaliert (Pclass).
3.2) Die Stichprobe ist mit 891 Einträgen grösser als 50 daher ist keine Korrektur nach Yates notwendig, sowie kein exakter Test nach Fisher.

Grundlegende Konzepte: Was ist Pearson Chi-Quadrat-Test?

Der Pearson Chi-Quadrat-Test testet, ob zwischen zwei kategorialen Variablen (Pclass, Survived) ein Zusammenhang besteht. Dabei werden die beobachteten Häufigkeiten mit theoretisch erwarteten Häufigkeiten verglichen. Danach werden die Stärke des Zusammenhangs ermittelt.

Laden des Datensatzes

library(readr)
titanic <- read_csv("titanic.csv")
titanic$Pclass[titanic$Pclass == "1"] <- "1st Class" 
titanic$Pclass[titanic$Pclass == "2"] <- "2nd Class" 
titanic$Pclass[titanic$Pclass == "3"] <- "3rd Class" 

titanic$Survived[titanic$Survived == "1"] <- "Survived"
titanic$Survived[titanic$Survived == "0"] <- "Not Survived" 

Grafische Veranschaulichung

counts<- table( Survived  = titanic$Survived , Class = titanic$Pclass)

barplot(counts, main="Balkendiagramm",
col=c("tomato","deepskyblue"),
ylab="Anzahl Personen",xlab = "Survived und Class",legend=TRUE,
beside=T)

Betrachten wir das Balkendiagramm nach den Passagierklassen unterteilt mit der jeweiligen Anzahl an Überlebenden und Verstorbenen, sieht man auf absoluter Höhe ist die Anzahl der Überlebenden vergleichbar. Relativ betrachtet ergeben sich jedoch hier deutliche Unterschiede (nicht in Grafik enthalten). Die dritte Klasse hat bei einer Anzahl von 119 Überlebenden, im Vergleich zu 136 Überlebenden der ersten Klasse, nur einen relativen Anteil von ~ 24.7% während die erste Klasse einen Anteil von ~ 62.4% hat. Bei einer Überlebenswahrscheinlichkeit von ~38% im Schnitt auf dem Schiff kann man bereits bei der grafischen Analyse davon ausgehen dass es zu einem verwerfen der H0 Hypothese kommen kann.

#install.packages("networkD3")
library(networkD3)
library(dplyr)
#library(shinydashboard)

links <- data.frame(
source=c("1. Class","1. Class","2. Class","2. Class", "3. Class", "3. Class"), 
target=c("Survived_0","Survived_1","Survived_0","Survived_1","Survived_0","Survived_1"),
value=c(counts[1],counts[2], counts[3], counts[4],counts[5], counts[6])
)
links

Die 1. Klasse (1.Class) hat insgesamt 216 Passagiere gehabt, wobei 136 Personen überlebt haben, das ist eine Wahrscheinlichkeit von 62.3%, in der zweiteren Klasse (2.Class) haben wir ingesamt 184 Passagiere wobei wir 87 Überlebende haben, dass sind ~ 47.0%. In der dritten Klasse (3.Class) haben wir die deutlich grösste Klasse mit 491 Passagieren, d.h. die dritte Klasse hat einen Anteil von 55% aller Passagiere an Bord ausgemacht. Die Wahrscheinlichkeit zu überleben betrug für diese Klasse 24.2%.

# From these flows we need to create a node data frame: it lists every entities involved in the flow
nodes <- data.frame(
name=c(as.character(links$source), 
as.character(links$target)) %>% unique()
)

# With networkD3, connection must be provided using id, not using real name like in the links dataframe.. So we need to reformat it.
links$IDsource <- match(links$source, nodes$name)-1 
links$IDtarget <- match(links$target, nodes$name)-1

# Make the Network
p <- sankeyNetwork(Links = links, Nodes = nodes,
Source = "IDsource", 
Target = "IDtarget",
Value = "value", 
NodeID = "name", 
iterations = 0,
nodeWidth=40, fontSize=13, 
sinksRight=TRUE)
p

Betrachten wir das “Sankey” Diagramm, dann sehen wir wie im Balkendiagramm zuvor dass bei der ersten und zweiteren Klasse wir in der ersten Klasse eine etwas höhere Wahrscheinlichkeit haben zu überleben. Bei der zweiteren Klassen kann man ca. von einer Wahrscheinlichkeit von 50% sprechen. In der dritten Klasse sehen bereits ein deutliches unverhältnis. Hier ist der Anteil der Personen welche überleben deutlich unter 50%. Das Sankey Diagramm verdeutlicht somit noch einmal den Effekt welchen wir bei dem Balkendiagramm bereits gesehen haben.

Ergebnisse der Kreuztabellenanalyse


Tabelle der realisierten Häufigkeiten

counts<- table( Survived  = titanic$Survived , Class = titanic$Pclass)
head(counts)
              Class
Survived       1st Class 2nd Class 3rd Class
  Not Survived        80        97       372
  Survived           136        87       119


Tabelle der erwarteten Häufigkeiten

ch1 <- chisq.test(counts, correct = F)
round(ch1$expected,2)
              Class
Survived       1st Class 2nd Class 3rd Class
  Not Survived    133.09    113.37    302.54
  Survived         82.91     70.63    188.46

Stellen wir im folgenden die Tabelle mit den realisierten Werten und die Tabelle der erwarteten Werten gegenüber, so erwarten wir z.B. in der ersten Klasse 133 Verstorbene, die realisierten Werte zeigen jedoch nur 80. Das ist somit eine Differenz von 53 Personen zwischen der Realisation nur für die erste Klasse. Dies ist ein relativer Unterschied von ~ 24.3% welche wir nur innerhalb der Klasse erwarten. Etwas vergleichbares lässt sich für die dritte Klasse erkennen, hier hätten wir nur ~ 302 Verstorbene erwartet, hatten aber 372 Personen in der echten Realisiation, dass ist eine Abweichung von ~ 23.18%. Wir erkennen somit auch bereits bei der Differenz dieser Matrizen einen Unterschied, was auf eine unterschiedliche Überlebenswahrscheinlichkeit zwischen den Klassen schliessen lässt.

Somit ist es lohnenswertzur Bestätigung der Hypothesen einen Chi²-Test durchzuführen. Bei dem Chi²-Test können wir auf die Korrektur von Yates verzichten, Insgesamt haben wir einen Datensatz mit 891 Personen. Aufgrund der Anzahl an möglichen Kategorien haben wir einen Freiheitsgrad von (#Passagierklassen -1)(#Überlebensgruppe -1 ) = (3-1)(2-1) = 2, für alle Zellen haben wir eine erwartete Häufigkeit von >50, sodass wir den Test durchführen können ohne eine Anpassung vornehmen zu müssen.

Chi² - Test

ch1

    Pearson's Chi-squared test

data:  counts
X-squared = 102.89, df = 2, p-value < 2.2e-16

Führen wir nun den Chi² Test durch erhalten wir für folgende Rahmenbedingungen (df =2, X² = 102.89) einen P-Value von 4.549251e-23. Bei einem Alphaniveau von 0.05 ist der P-Value somit kleiner als unsere Irrtumswahrscheinlichkeit. Wir können somit unsere H0 Hypothese, dass es keinen Unterscheid in der Überlebenswahrscheinlichkeit der Klassen gibt verwerfen, es gibt somit einen signifikanten Unterschied zwischen der Überlebenswahrscheinlichkeit zweichen mindestens zwei dieser Klassen.

library("sjPlot")
library("sjmisc")

sjt.xtab(titanic$Survived, titanic$Pclass)
ch1

    Pearson's Chi-squared test

data:  counts
X-squared = 102.89, df = 2, p-value < 2.2e-16
sprintf("kritischer Prüfwert: %.2f",qchisq(0.95, df=2))
[1] "kritischer Prüfwert: 5.99"

\[kritische \thinspace Prüfwert < empirsche \thinspace Prüfwert \rightarrow sig. \\ 5.99 < 102.89 \rightarrow sig\] Es zeigt sich, dass ein sig. Ergebnis vorliegt (X-squared = 102.89, df = 2, n = 891). Damit gibt es einen Zusammenhang zwischen dem Survived und dem Class.

Berechnung der Effektstärke

cramersV <- sqrt(( ch1$statistic)/(nrow(titanic)*(2-1)))
sprintf("Die Effektstärke liegt bei %.2f.",cramersV)
[1] "Die Effektstärke liegt bei 0.34."

\[\begin{align} \text{Schwacher Effekt: } 0.1 &< ||Cramers V|| \leq 0.3 \\ \text{Schwacher bis mittlerer Effekt: }0.3 &< ||Cramers V|| \leq 0.4 \\ \text{Mittlerer Effekt: } 0.4 &< ||Cramers V|| < 0.5 \\ \text{Mittlerer bis starker Effekt: }0.5 &= ||Cramers V|| \\ \text{Starker Effekt: } 0.5 &< ||Cramers V|| \end{align}\]

Wenn wir jetzt mit cramersV die Effektstärke berechnen erhalten wir eine Effektstärke von 0.3398, dies ist gemäss der Tabelle von CramersV ein schwacher bis mittlerer Effekt. Es zeigt sich für unsere Auswertung, dass ein mittlerer Zusammenhang besteht.

Fazit

Abschliessend können wir somit sagen das wir unsere H0 Hypothese verwerfen können, sodass wir von einem Unterschied bei der Überlebenswahrscheinlichkeit zwischen den Klassen ausgehen können.

LS0tDQp0aXRsZTogIkNoaSBRdWFkcmF0IC0gQ3JhbWVycyBWIg0KIyBydW50aW1lOiBzaGlueQ0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IFRSVUUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCi0tLQ0KDQo8aDE+QXVmZ2FiZSAzOiBadXNhbW1lbmhhbmdzaHlwb3RoZXNlIDwvaDE+DQo8Yj5EYXRlbnNhdHo6PC9iPiANCg0KRGF0ZW5zYXR6ID0gInRpdGFuaWMuY3N2IiA8YnI+DQpWYXIgMSA9IFN1cnZpdmVkIDxicj4NClZhciAyID0gUGNsYXNzDQoNCjxoMT5BdWZnYWJlbnN0ZWxsdW5nPC9oMT4gDQo8Yj5IeXBvdGhlc2U8L2I+IA0KDQpIMDogRXMgZ2lidCBrZWluZW4gVW50ZXJzY2hpZWQgendpc2NoZW4gUGNsYXNzIHVuZCBTdXJ2aXZlZC48YnI+DQpIMTogRXMgZ2lidCBlaW5lbiBVbnRlcnNjaGllZCB6d2lzY2hlbiBQY2xhc3MgdW5kIFN1cnZpdmVkLiANCg0KRsO8ciBhbGxlIHVuc2VyZSBIeXBvdGhlc2VuIHdpcmQgZWluIEFscGhhIHZvbiAwLjA1IGFuZ2Vub21tZW4uDQoNCjxoMT5Wb3JhdXNzZXR6dW5nZW48L2gxPg0KDQogIDMuMSkgRGllIFZhcmlhYmxlbiBzaW5kIG5vbWluYWxza2FsaWVydCAoc3Vydml2ZWQpIHVuZCBvcmRpbmFsIHNrYWxpZXJ0IChQY2xhc3MpLjxicj4NCiAgMy4yKSBEaWUgU3RpY2hwcm9iZSBpc3QgbWl0IDg5MSBFaW50csOkZ2VuIGdyw7Zzc2VyIGFscyA1MCBkYWhlciBpc3Qga2VpbmUgS29ycmVrdHVyIG5hY2ggWWF0ZXMgbm90d2VuZGlnLCBzb3dpZSBrZWluIGV4YWt0ZXIgVGVzdCBuYWNoIEZpc2hlci4NCg0KPGgxPkdydW5kbGVnZW5kZSBLb256ZXB0ZTogV2FzIGlzdCBQZWFyc29uIENoaS1RdWFkcmF0LVRlc3Q/PC9oMT4NCg0KRGVyIFBlYXJzb24gQ2hpLVF1YWRyYXQtVGVzdCB0ZXN0ZXQsIG9iIHp3aXNjaGVuIHp3ZWkga2F0ZWdvcmlhbGVuIFZhcmlhYmxlbiAoUGNsYXNzLCBTdXJ2aXZlZCkgZWluIFp1c2FtbWVuaGFuZyBiZXN0ZWh0LiBEYWJlaSB3ZXJkZW4gZGllIGJlb2JhY2h0ZXRlbiBIw6R1Zmlna2VpdGVuIG1pdCB0aGVvcmV0aXNjaCBlcndhcnRldGVuIEjDpHVmaWdrZWl0ZW4gdmVyZ2xpY2hlbi4gRGFuYWNoIHdlcmRlbiBkaWUgU3TDpHJrZSBkZXMgWnVzYW1tZW5oYW5ncyBlcm1pdHRlbHQuDQoNCjxoMT5MYWRlbiBkZXMgRGF0ZW5zYXR6ZXM8L2gxPg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJ30NCmxpYnJhcnkocmVhZHIpDQp0aXRhbmljIDwtIHJlYWRfY3N2KCJ0aXRhbmljLmNzdiIpDQp0aXRhbmljJFBjbGFzc1t0aXRhbmljJFBjbGFzcyA9PSAiMSJdIDwtICIxc3QgQ2xhc3MiIA0KdGl0YW5pYyRQY2xhc3NbdGl0YW5pYyRQY2xhc3MgPT0gIjIiXSA8LSAiMm5kIENsYXNzIiANCnRpdGFuaWMkUGNsYXNzW3RpdGFuaWMkUGNsYXNzID09ICIzIl0gPC0gIjNyZCBDbGFzcyIgDQoNCnRpdGFuaWMkU3Vydml2ZWRbdGl0YW5pYyRTdXJ2aXZlZCA9PSAiMSJdIDwtICJTdXJ2aXZlZCINCnRpdGFuaWMkU3Vydml2ZWRbdGl0YW5pYyRTdXJ2aXZlZCA9PSAiMCJdIDwtICJOb3QgU3Vydml2ZWQiIA0KDQoNCmBgYA0KDQo8aDE+R3JhZmlzY2hlIFZlcmFuc2NoYXVsaWNodW5nPC9oMT4NCmBgYHtyfQ0KY291bnRzPC0gdGFibGUoIFN1cnZpdmVkICA9IHRpdGFuaWMkU3Vydml2ZWQgLCBDbGFzcyA9IHRpdGFuaWMkUGNsYXNzKQ0KDQpiYXJwbG90KGNvdW50cywgbWFpbj0iQmFsa2VuZGlhZ3JhbW0iLA0KY29sPWMoInRvbWF0byIsImRlZXBza3libHVlIiksDQp5bGFiPSJBbnphaGwgUGVyc29uZW4iLHhsYWIgPSAiU3Vydml2ZWQgdW5kIENsYXNzIixsZWdlbmQ9VFJVRSwNCmJlc2lkZT1UKQ0KYGBgDQpCZXRyYWNodGVuIHdpciBkYXMgQmFsa2VuZGlhZ3JhbW0gbmFjaCBkZW4gUGFzc2FnaWVya2xhc3NlbiB1bnRlcnRlaWx0IG1pdCBkZXIgamV3ZWlsaWdlbiBBbnphaGwgYW4gw5xiZXJsZWJlbmRlbiB1bmQgVmVyc3RvcmJlbmVuLCBzaWVodCBtYW4gYXVmIGFic29sdXRlciBIw7ZoZSBpc3QgZGllIEFuemFobCBkZXIgw5xiZXJsZWJlbmRlbiB2ZXJnbGVpY2hiYXIuIFJlbGF0aXYgYmV0cmFjaHRldCBlcmdlYmVuIHNpY2ggamVkb2NoIGhpZXIgZGV1dGxpY2hlIFVudGVyc2NoaWVkZSAobmljaHQgaW4gR3JhZmlrIGVudGhhbHRlbikuIERpZSBkcml0dGUgS2xhc3NlIGhhdCBiZWkgZWluZXIgQW56YWhsIHZvbiAxMTkgw5xiZXJsZWJlbmRlbiwgaW0gVmVyZ2xlaWNoIHp1IDEzNiDDnGJlcmxlYmVuZGVuIGRlciBlcnN0ZW4gS2xhc3NlLCBudXIgZWluZW4gcmVsYXRpdmVuIEFudGVpbCB2b24gfiAyNC43JSB3w6RocmVuZCBkaWUgZXJzdGUgS2xhc3NlIGVpbmVuIEFudGVpbCB2b24gfiA2Mi40JSBoYXQuIEJlaSBlaW5lciDDnGJlcmxlYmVuc3dhaHJzY2hlaW5saWNoa2VpdCB2b24gfjM4JSBpbSBTY2huaXR0IGF1ZiBkZW0gU2NoaWZmIGthbm4gbWFuIGJlcmVpdHMgYmVpIGRlciBncmFmaXNjaGVuIEFuYWx5c2UgZGF2b24gYXVzZ2VoZW4gZGFzcyBlcyB6dSBlaW5lbSB2ZXJ3ZXJmZW4gZGVyIEgwIEh5cG90aGVzZSBrb21tZW4ga2Fubi4NCg0KYGBge3Igd2FybmluZyA9IEZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoIm5ldHdvcmtEMyIpDQpsaWJyYXJ5KG5ldHdvcmtEMykNCmxpYnJhcnkoZHBseXIpDQojbGlicmFyeShzaGlueWRhc2hib2FyZCkNCg0KbGlua3MgPC0gZGF0YS5mcmFtZSgNCnNvdXJjZT1jKCIxLiBDbGFzcyIsIjEuIENsYXNzIiwiMi4gQ2xhc3MiLCIyLiBDbGFzcyIsICIzLiBDbGFzcyIsICIzLiBDbGFzcyIpLCANCnRhcmdldD1jKCJTdXJ2aXZlZF8wIiwiU3Vydml2ZWRfMSIsIlN1cnZpdmVkXzAiLCJTdXJ2aXZlZF8xIiwiU3Vydml2ZWRfMCIsIlN1cnZpdmVkXzEiKSwNCnZhbHVlPWMoY291bnRzWzFdLGNvdW50c1syXSwgY291bnRzWzNdLCBjb3VudHNbNF0sY291bnRzWzVdLCBjb3VudHNbNl0pDQopDQpsaW5rcw0KYGBgDQpEaWUgMS4gS2xhc3NlICgxLkNsYXNzKSBoYXQgaW5zZ2VzYW10IDIxNiBQYXNzYWdpZXJlIGdlaGFidCwgd29iZWkgMTM2IFBlcnNvbmVuIMO8YmVybGVidCBoYWJlbiwgZGFzIGlzdCBlaW5lIFdhaHJzY2hlaW5saWNoa2VpdCB2b24gNjIuMyUsIGluIGRlciB6d2VpdGVyZW4gS2xhc3NlICgyLkNsYXNzKSBoYWJlbiB3aXIgaW5nZXNhbXQgMTg0IFBhc3NhZ2llcmUgd29iZWkgd2lyIDg3IMOcYmVybGViZW5kZSBoYWJlbiwgZGFzcyBzaW5kIH4gNDcuMCUuIEluIGRlciBkcml0dGVuIEtsYXNzZSAoMy5DbGFzcykgaGFiZW4gd2lyIGRpZSBkZXV0bGljaCBncsO2c3N0ZSBLbGFzc2UgbWl0IDQ5MSBQYXNzYWdpZXJlbiwgZC5oLiBkaWUgZHJpdHRlIEtsYXNzZSBoYXQgZWluZW4gQW50ZWlsIHZvbiA1NSUgYWxsZXIgUGFzc2FnaWVyZSBhbiBCb3JkIGF1c2dlbWFjaHQuIERpZSBXYWhyc2NoZWlubGljaGtlaXQgenUgw7xiZXJsZWJlbiBiZXRydWcgZsO8ciBkaWVzZSBLbGFzc2UgMjQuMiUuDQoNCmBgYHtyIHdhcm5pbmcgPSBGQUxTRX0NCiMgRnJvbSB0aGVzZSBmbG93cyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5vZGUgZGF0YSBmcmFtZTogaXQgbGlzdHMgZXZlcnkgZW50aXRpZXMgaW52b2x2ZWQgaW4gdGhlIGZsb3cNCm5vZGVzIDwtIGRhdGEuZnJhbWUoDQpuYW1lPWMoYXMuY2hhcmFjdGVyKGxpbmtzJHNvdXJjZSksIA0KYXMuY2hhcmFjdGVyKGxpbmtzJHRhcmdldCkpICU+JSB1bmlxdWUoKQ0KKQ0KDQojIFdpdGggbmV0d29ya0QzLCBjb25uZWN0aW9uIG11c3QgYmUgcHJvdmlkZWQgdXNpbmcgaWQsIG5vdCB1c2luZyByZWFsIG5hbWUgbGlrZSBpbiB0aGUgbGlua3MgZGF0YWZyYW1lLi4gU28gd2UgbmVlZCB0byByZWZvcm1hdCBpdC4NCmxpbmtzJElEc291cmNlIDwtIG1hdGNoKGxpbmtzJHNvdXJjZSwgbm9kZXMkbmFtZSktMSANCmxpbmtzJElEdGFyZ2V0IDwtIG1hdGNoKGxpbmtzJHRhcmdldCwgbm9kZXMkbmFtZSktMQ0KDQojIE1ha2UgdGhlIE5ldHdvcmsNCnAgPC0gc2Fua2V5TmV0d29yayhMaW5rcyA9IGxpbmtzLCBOb2RlcyA9IG5vZGVzLA0KU291cmNlID0gIklEc291cmNlIiwgDQpUYXJnZXQgPSAiSUR0YXJnZXQiLA0KVmFsdWUgPSAidmFsdWUiLCANCk5vZGVJRCA9ICJuYW1lIiwgDQppdGVyYXRpb25zID0gMCwNCm5vZGVXaWR0aD00MCwgZm9udFNpemU9MTMsIA0Kc2lua3NSaWdodD1UUlVFKQ0KcA0KYGBgDQpCZXRyYWNodGVuIHdpciBkYXMgIlNhbmtleSIgRGlhZ3JhbW0sIGRhbm4gc2VoZW4gd2lyIHdpZSBpbSBCYWxrZW5kaWFncmFtbSB6dXZvciBkYXNzIGJlaSBkZXIgZXJzdGVuIHVuZCB6d2VpdGVyZW4gS2xhc3NlIHdpciBpbiBkZXIgZXJzdGVuIEtsYXNzZSBlaW5lIGV0d2FzIGjDtmhlcmUgV2FocnNjaGVpbmxpY2hrZWl0IGhhYmVuIHp1IMO8YmVybGViZW4uIEJlaSBkZXIgendlaXRlcmVuIEtsYXNzZW4ga2FubiBtYW4gY2EuIHZvbiBlaW5lciBXYWhyc2NoZWlubGljaGtlaXQgdm9uIDUwJSBzcHJlY2hlbi4gSW4gZGVyIGRyaXR0ZW4gS2xhc3NlIHNlaGVuIGJlcmVpdHMgZWluIGRldXRsaWNoZXMgdW52ZXJow6RsdG5pcy4gSGllciBpc3QgZGVyIEFudGVpbCBkZXIgUGVyc29uZW4gd2VsY2hlIMO8YmVybGViZW4gZGV1dGxpY2ggdW50ZXIgNTAlLiBEYXMgU2Fua2V5IERpYWdyYW1tIHZlcmRldXRsaWNodCBzb21pdCBub2NoIGVpbm1hbCBkZW4gRWZmZWt0IHdlbGNoZW4gd2lyIGJlaSBkZW0gQmFsa2VuZGlhZ3JhbW0gYmVyZWl0cyBnZXNlaGVuIGhhYmVuLiANCg0KPGgxPkVyZ2Vibmlzc2UgZGVyIEtyZXV6dGFiZWxsZW5hbmFseXNlPC9oMT4NCg0KPGJyPiBUYWJlbGxlIGRlciByZWFsaXNpZXJ0ZW4gSMOkdWZpZ2tlaXRlbiA8L2JyPg0KDQpgYGB7cn0NCmNvdW50czwtIHRhYmxlKCBTdXJ2aXZlZCAgPSB0aXRhbmljJFN1cnZpdmVkICwgQ2xhc3MgPSB0aXRhbmljJFBjbGFzcykNCmhlYWQoY291bnRzKQ0KYGBgDQo8YnI+IFRhYmVsbGUgZGVyIGVyd2FydGV0ZW4gSMOkdWZpZ2tlaXRlbiA8L2JyPg0KDQpgYGB7cn0NCmNoMSA8LSBjaGlzcS50ZXN0KGNvdW50cywgY29ycmVjdCA9IEYpDQpyb3VuZChjaDEkZXhwZWN0ZWQsMikNCg0KYGBgDQoNClN0ZWxsZW4gd2lyIGltIGZvbGdlbmRlbiBkaWUgVGFiZWxsZSBtaXQgZGVuIHJlYWxpc2llcnRlbiBXZXJ0ZW4gdW5kIGRpZSBUYWJlbGxlIGRlciBlcndhcnRldGVuIFdlcnRlbiBnZWdlbsO8YmVyLCBzbyBlcndhcnRlbiB3aXIgei5CLiBpbiBkZXIgZXJzdGVuIEtsYXNzZSAxMzMgVmVyc3RvcmJlbmUsIGRpZSByZWFsaXNpZXJ0ZW4gV2VydGUgemVpZ2VuIGplZG9jaCBudXIgODAuIERhcyBpc3Qgc29taXQgZWluZSBEaWZmZXJlbnogdm9uIDUzIFBlcnNvbmVuIHp3aXNjaGVuIGRlciBSZWFsaXNhdGlvbiBudXIgZsO8ciBkaWUgZXJzdGUgS2xhc3NlLiBEaWVzIGlzdCBlaW4gcmVsYXRpdmVyIFVudGVyc2NoaWVkIHZvbiB+IDI0LjMlIHdlbGNoZSB3aXIgbnVyIGlubmVyaGFsYiBkZXIgS2xhc3NlIGVyd2FydGVuLiBFdHdhcyB2ZXJnbGVpY2hiYXJlcyBsw6Rzc3Qgc2ljaCBmw7xyIGRpZSBkcml0dGUgS2xhc3NlIGVya2VubmVuLCBoaWVyIGjDpHR0ZW4gd2lyIG51ciB+IDMwMiBWZXJzdG9yYmVuZSBlcndhcnRldCwgaGF0dGVuIGFiZXIgMzcyIFBlcnNvbmVuIGluIGRlciBlY2h0ZW4gUmVhbGlzaWF0aW9uLCBkYXNzIGlzdCBlaW5lIEFid2VpY2h1bmcgdm9uIH4gMjMuMTglLiBXaXIgZXJrZW5uZW4gc29taXQgYXVjaCBiZXJlaXRzIGJlaSBkZXIgRGlmZmVyZW56IGRpZXNlciBNYXRyaXplbiBlaW5lbiBVbnRlcnNjaGllZCwgd2FzIGF1ZiBlaW5lIHVudGVyc2NoaWVkbGljaGUgw5xiZXJsZWJlbnN3YWhyc2NoZWlubGljaGtlaXQgendpc2NoZW4gZGVuIEtsYXNzZW4gc2NobGllc3NlbiBsw6Rzc3QuDQoNClNvbWl0IGlzdCBlcyBsb2huZW5zd2VydHp1ciBCZXN0w6R0aWd1bmcgZGVyIEh5cG90aGVzZW4gZWluZW4gQ2hpwrItVGVzdCBkdXJjaHp1ZsO8aHJlbi4gQmVpIGRlbSBDaGnCsi1UZXN0IGvDtm5uZW4gd2lyIGF1ZiBkaWUgS29ycmVrdHVyIHZvbiBZYXRlcyB2ZXJ6aWNodGVuLCBJbnNnZXNhbXQgaGFiZW4gd2lyIGVpbmVuIERhdGVuc2F0eiBtaXQgODkxIFBlcnNvbmVuLiBBdWZncnVuZCBkZXIgQW56YWhsIGFuIG3DtmdsaWNoZW4gS2F0ZWdvcmllbiBoYWJlbiB3aXIgZWluZW4gRnJlaWhlaXRzZ3JhZCB2b24gKCNQYXNzYWdpZXJrbGFzc2VuIC0xKSooI8OcYmVybGViZW5zZ3J1cHBlIC0xICkgPSAoMy0xKSooMi0xKSA9IDIsIGbDvHIgYWxsZSBaZWxsZW4gaGFiZW4gd2lyIGVpbmUgZXJ3YXJ0ZXRlIEjDpHVmaWdrZWl0IHZvbiA+NTAsIHNvZGFzcyB3aXIgZGVuIFRlc3QgZHVyY2hmw7xocmVuIGvDtm5uZW4gb2huZSBlaW5lIEFucGFzc3VuZyB2b3JuZWhtZW4genUgbcO8c3Nlbi4NCg0KDQo8aDE+Q2hpwrIgLSBUZXN0IDwvaDE+DQoNCmBgYHtyfQ0KY2gxDQpgYGANCkbDvGhyZW4gd2lyIG51biBkZW4gQ2hpwrIgVGVzdCBkdXJjaCBlcmhhbHRlbiB3aXIgZsO8ciBmb2xnZW5kZSBSYWhtZW5iZWRpbmd1bmdlbiAoZGYgPTIsIFjCsiA9IDEwMi44OSkgZWluZW4gUC1WYWx1ZSB2b24gNC41NDkyNTFlLTIzLiBCZWkgZWluZW0gQWxwaGFuaXZlYXUgdm9uIDAuMDUgaXN0IGRlciBQLVZhbHVlIHNvbWl0IGtsZWluZXIgYWxzIHVuc2VyZSBJcnJ0dW1zd2FocnNjaGVpbmxpY2hrZWl0LiBXaXIga8O2bm5lbiBzb21pdCB1bnNlcmUgSDAgSHlwb3RoZXNlLCBkYXNzIGVzIGtlaW5lbiBVbnRlcnNjaGVpZCBpbiBkZXIgw5xiZXJsZWJlbnN3YWhyc2NoZWlubGljaGtlaXQgZGVyIEtsYXNzZW4gZ2lidCB2ZXJ3ZXJmZW4sIGVzIGdpYnQgc29taXQgZWluZW4gc2lnbmlmaWthbnRlbiBVbnRlcnNjaGllZCB6d2lzY2hlbiBkZXIgw5xiZXJsZWJlbnN3YWhyc2NoZWlubGljaGtlaXQgendlaWNoZW4gbWluZGVzdGVucyB6d2VpIGRpZXNlciBLbGFzc2VuLg0KDQoNCmBgYHtyfQ0KbGlicmFyeSgic2pQbG90IikNCmxpYnJhcnkoInNqbWlzYyIpDQoNCnNqdC54dGFiKHRpdGFuaWMkU3Vydml2ZWQsIHRpdGFuaWMkUGNsYXNzKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmNoMQ0Kc3ByaW50Zigia3JpdGlzY2hlciBQcsO8ZndlcnQ6ICUuMmYiLHFjaGlzcSgwLjk1LCBkZj0yKSkNCmBgYA0KJCRrcml0aXNjaGUgXHRoaW5zcGFjZSBQcsO8ZndlcnQgPCBlbXBpcnNjaGUgXHRoaW5zcGFjZSBQcsO8ZndlcnQgIFxyaWdodGFycm93IHNpZy4gXFwgNS45OSA8IDEwMi44OSBccmlnaHRhcnJvdyBzaWckJA0KRXMgemVpZ3Qgc2ljaCwgZGFzcyBlaW4gc2lnLiBFcmdlYm5pcyB2b3JsaWVndCAoWC1zcXVhcmVkID0gMTAyLjg5LCBkZiA9IDIsIG4gPSA4OTEpLiBEYW1pdCBnaWJ0IGVzIGVpbmVuIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZW0gU3Vydml2ZWQgdW5kIGRlbSBDbGFzcy4NCg0KPGgxPiBCZXJlY2hudW5nIGRlciBFZmZla3RzdMOkcmtlIDwvaDE+DQoNCmBgYHtyfQ0KY3JhbWVyc1YgPC0gc3FydCgoIGNoMSRzdGF0aXN0aWMpLyhucm93KHRpdGFuaWMpKigyLTEpKSkNCnNwcmludGYoIkRpZSBFZmZla3RzdMOkcmtlIGxpZWd0IGJlaSAlLjJmLiIsY3JhbWVyc1YpDQpgYGANCiQkXGJlZ2lue2FsaWdufQ0KXHRleHR7U2Nod2FjaGVyIEVmZmVrdDogfSAwLjEgJjwgfHxDcmFtZXJzIFZ8fCBcbGVxIDAuMyBcXA0KXHRleHR7U2Nod2FjaGVyIGJpcyBtaXR0bGVyZXIgRWZmZWt0OiB9MC4zICY8IHx8Q3JhbWVycyBWfHwgXGxlcSAwLjQgXFwNClx0ZXh0e01pdHRsZXJlciBFZmZla3Q6IH0gMC40ICY8IHx8Q3JhbWVycyBWfHwgPCAwLjUgXFwNClx0ZXh0e01pdHRsZXJlciBiaXMgc3RhcmtlciBFZmZla3Q6IH0wLjUgJj0gfHxDcmFtZXJzIFZ8fCBcXA0KXHRleHR7U3RhcmtlciBFZmZla3Q6IH0gMC41ICY8IHx8Q3JhbWVycyBWfHwgDQpcZW5ke2FsaWdufSQkDQoNCldlbm4gd2lyIGpldHp0IG1pdCBjcmFtZXJzViBkaWUgRWZmZWt0c3TDpHJrZSBiZXJlY2huZW4gZXJoYWx0ZW4gd2lyIGVpbmUgRWZmZWt0c3TDpHJrZSB2b24gMC4zMzk4LCBkaWVzIGlzdCBnZW3DpHNzIGRlciBUYWJlbGxlIHZvbiBDcmFtZXJzViBlaW4gc2Nod2FjaGVyIGJpcyBtaXR0bGVyZXIgRWZmZWt0LiBFcyB6ZWlndCBzaWNoIGbDvHIgdW5zZXJlIEF1c3dlcnR1bmcsIGRhc3MgZWluIG1pdHRsZXJlciBadXNhbW1lbmhhbmcgYmVzdGVodC4NCg0KPGgxPiBGYXppdCAgPC9oMT4NCg0KQWJzY2hsaWVzc2VuZCBrw7ZubmVuIHdpciBzb21pdCBzYWdlbiBkYXMgd2lyIHVuc2VyZSBIMCBIeXBvdGhlc2UgdmVyd2VyZmVuIGvDtm5uZW4sIHNvZGFzcyB3aXIgdm9uIGVpbmVtIFVudGVyc2NoaWVkIGJlaSBkZXIgw5xiZXJsZWJlbnN3YWhyc2NoZWlubGljaGtlaXQgendpc2NoZW4gZGVuIEtsYXNzZW4gYXVzZ2VoZW4ga8O2bm5lbi4NCg==