Aufgabe 5-6: Zusammenhangshypothese
Datensatz: titanic.csv UV = Pclass, Embarked AV = Age
Hypothesen
H0_Pclass: Die Passagierklasse hat keinen Einfluss auf das Alter der Personen. H1_Pclass: Die Passagierklasse hat einen Einfluss auf das Alter der Personen.
H0_harbor: Der Einschiffungshafen hat keinen Einfluss auf das Alter der Personen. H1_harbor: Der Einschiffungshafender hat einen Einfluss auf das Alter der Personen.
H0_interaction: Die Passagierklasse und der Einschiffungshafen, oder die Kombination hat keinen Einfluss auf das Alter der Personen. H1_interaction: Die Passagierklasse und der Einschiffungshafen, oder die Kombination hat einen Einfluss auf das Alter der Personen.
Voraussetzungen für die mehrfaktorielle Varianzanalyse (ohne Messwiederholung)
Die abhängige Variable ist intervallskaliert -> Dies ist gegeben, für das Alter liegt eine Ratioskala vor.
Die unabhängigen Variablen (Passagierklasse und Einschiffungshafen) sind kategoriel -> Erfüllt.
Die unabhängigen Variablen (Passagierklasse und Einschiffungshafen) sind kategorial (nominal- oder ordinalskaliert) -> Dies ist gegeben.
Die abhängigen Variablen ist normalverteilt innerhalb jeder Gruppe. -> Dies ist gerpüft und es wurden Gruppen wie z.B. Queenstown wegen der Verletzung n < 25 entfernt.
Homogenität der Varianzen -> Siehe Levene-Test
Grundlegende Konzepte
Die mehrfaktorielle Varianzanalyse untersucht, ob sich die Mittelwerte mehrerer unabhängiger Gruppenunterscheiden, die durch mehrere kategoriale unabhängige Variable definiert werden. Diese UV werden bei der ANOVA als “Faktoren” bezeichnet. Die Ausprägungen der unabhängigen Variable werden “Faktorstufen” genannt (eng.“Treatments”)
Die “mehrfaktoriell” oder mindestens zweifaktoriell Varianzanalyse wird bei mehr als einen Faktor, also mehrere Gruppierungsvariablen, verwendet (vgl. einfaktorielle Varianzanalyse). Der Begriff “Varianzanalyse” wird auch“ANOVA” abgekürzt, da sie in Englisch mit “Analysis of variance” steht.
Die Idee der Varianzanalyse besteht in der Zerlegung der Varianz der abhängigen Variable. Die Gesamtvarianz setzt sich aus der “Varianz innerhalb der Gruppen” und der “Varianz zwischen den Gruppen” zusammen.
Bei einer mehrfaktoriellen Varianzanalyse wird die Varianz zwischen den Gruppen weiter aufgegliedert, und zwar in die Varianz der einzelnen Faktoren und die Varianz der Interaktion(en) der Faktoren. Im Rahmen einer Varianzanalyse wird die Varianz zwischen den Gruppen mit der Varianz innerhalb der Gruppen verglichen.Die Fragestellung der mehrfaktoriellen Varianzanalyse könnte sein: “Unterscheiden sich die Mittelwerte einer abhängigen Variable zwischen mehreren Gruppen? Welche Faktorstufen unterscheiden sich? Gibt es Effekte?”
Deskriptive Statistiken und Normalverteilung
library(readr)
library(dplyr)
library(ggplot2)
library(Hmisc)
titanic <- read_csv("titanic.csv")
titanic <- titanic[!is.na(titanic$Embarked) & !is.na(titanic$Age),]
# titanic <- titanic[titanic$Embarked != "Q",]
titanic$Embarked[titanic$Embarked == "C"] <- "Cherbourg"
titanic$Embarked[titanic$Embarked == "S"] <- "Southampton"
titanic$Embarked[titanic$Embarked == "Q"] <- "Queenstown"
titanic$Pclass[titanic$Pclass == "1"] <- "1st Class"
titanic$Pclass[titanic$Pclass == "2"] <- "2nd Class"
titanic$Pclass[titanic$Pclass == "3"] <- "3rd Class"
titanic %>%
group_by(Embarked) %>%
summarise(Anzahl = n(), Mittelwert = mean(Age), Median = median(Age), Standardabweichung = sd(Age)) %>%
mutate_if(is.numeric, round, 2)
titanic %>%
group_by(Embarked) %>%
ggplot(aes(Age, color=Embarked)) +
geom_histogram(aes(fill = Embarked), bins = 20) +
facet_wrap(~Embarked) +
theme_grey()+
labs(x= "Anzahl der Age",y = "Anzahl" )

Wir betrachten nun ein Histogramm unterteilt nach den drei Häfen. Man kann bereits erkennen das in Southampton die meisten Personen zugestiegen sind, aber an jedem Hafen haben wir die gesamte Altersbreite von 0 - 80 vertreten. Alle haben einen starke Häufung im Bereich zwischen 20 und 30. Der Grossteil der Passagiere ist in Southampton (England, nahe London) eingestiegen, dem ersten Hafen der Titanic. Hier sind 554 Passagiere der 891 Passagiere zugestiegen. Die kleinste Anzahl von Personen ist in Queenstown (Irland) zugestiegen mit nur 28 Personen. 130 Personen sind in Cherbourg (England) zugestiegen. Für das Alter der Personen sehen wir bereits verschiedene Alterswerte haben bei den Einstiegsorten. Diese unterscheiden sich nicht sehr stark und wir haben bei allen eine grosse Standardabweichung. Daher gehen wir davon aus dass sich die Altersgruppen, gruppiert nach Einschiffungshafen, stark überlappen werden. Man kann anhand der Histogramme sehen, dass die Annahme einer Normalverteilung gerechtfertigt ist.
titanic %>%
group_by(Pclass) %>%
summarise(Anzahl = n(), Mittelwert = mean(Age), Median = median(Age), Standardabweichung = sd(Age)) %>%
mutate_if(is.numeric, round, 2)
titanic %>%
group_by(Pclass) %>%
ggplot(aes(Age, color=Pclass)) +
geom_histogram(aes(fill = Pclass), bins = 20) +
facet_wrap(~Pclass) +
theme_grey()+
labs(x= "Anzahl der Pclass",y = "Anzahl" )

Wenn wir jetzt das Histogramm für die Passagierklassen betrachten, dann erkennen wir dass die zweite Klassen auch in den unteren Altersbereichen ausgeprägte Bin´s haben, während hingegen die erste Klasse in diesem Bereich keine bis nur minimale Bin´s hat. Auch kann man in der ersten Klasse erkennen dass wir hier einen Häufungspunkt haben der weiter rechts liegt als bei den anderen Klassen. Wir vermuten daher eher einen Einfluss der Passagierklassen auf die Altersverteilung als einen Einfluss der Einschiffungsorte. Man kann anhand der Histogramme sehen, dass die Annahme einer Normalverteilung gerechtfertigt ist.
titanic %>%
group_by(Embarked, Pclass) %>%
summarise(Anzahl = n(), Mittelwert = mean(Age), Median = median(Age), Standardabweichung = sd(Age)) %>%
mutate_if(is.numeric, round, 2)
`summarise()` has grouped output by 'Embarked'. You can override using the `.groups` argument.
`mutate_if()` ignored the following grouping variables:
Column `Embarked`
Betrachten wir im Folgenden nun die Kreuzmatrix mit den Kombinationen von Klasse und Einschiffungsort. Wir können hier bereits erkennen dass unsere Stichproben in der Kombination Cherbourg (3. Klasse, 2. Klasse), Queenstown (1. Klasse + 2. Klasse + 3.Klasse) weniger als 25 Personen beinhalten. Das bedeutet das wir in diesen Gruppen bei der Berechnung des Mittelwertes nicht vom zentralen Grenzwertsatz ausgehen können. Die Berechnung des Mittelwertes, welcher für den Vergleich der Gruppen herangezogen wird ist reiner Zufall und nicht aufgrund der Struktur zu erkennen. Aus diesem Grund wird für die weitere Analyse der Hafen “Queenstown” herausgelöscht, weil hier die Anzahl an Daten zu klein ist um eine Aussage zu treffen. Wir beschränken uns im Folgenden somit nur auf die beiden Häfen Cherbourg und Southampton, und die drei Klassen.
ggplot(titanic, aes(x=Age))+
geom_histogram(bins = 25)+
theme_grey()+
facet_wrap(Embarked~Pclass, ncol = 3)

Bei den kombinierten Histogramplots sehen wir die selben Effekte wie bereits oben in der Tabelle erkannt. Der Queenstown Hafen ist zu dünn besetzt. Der Southampton Hafen ist aufgrund der Grösse der Passagieranzahlen der beste Hafen in den Daten. Bei der ersten und der zweiten Klasse sehen wir auch eine nahezu normalverteilte Verteilung in der dritten Klassen haben wir jedoch eine rechtsschiefe Verteilung. Da wir jedoch in diesen Klassen einen ausreichend grossen Datensatz haben, können wir den zentralen Grenzwertsatz verwenden und damit von einer Normalverteilung ausgehen für die Berechnung des Mittelwerts.
Bei Cherbourg sehen die Daten innerhalb der Klassen normalverteilt aus. Die zweite Klasse in Cherbourg ist jedoch weiterhin zu schwach besetzt, wir lassen diese aber im weiteren Schritt drinnen um für die Southampton 2. Klasse einen Vergleichswert zu haben.
Boxplot
titanic <- titanic[titanic$Embarked != "Queenstown",]
ggplot(titanic, aes(Embarked, Age, fill=factor(Pclass))) +
geom_boxplot() +
theme_minimal()+
labs(fill = "Class", x="Port", y="Anzahl Age")

Wenn wir uns nun die verbleibenden Daten im Boxplot anschauen, dann können wir erkennen dass wir zwischen den Passagierklassen einen Unterschied in den Daten haben, d.h. wir vermuten auch in dieser Darstellung bei den Passagierklassen einen Unterschied. Vergleichen wir aber die Häfen miteinander, dann können wir z.B. bei der ersten Klasse sehen das wir hier sehr grosse Schnittmengen haben auch bei den zweiten und dritten Klasse liegen die Werte ineinander, sie weichen in der Verteilung untereinander zwar ab, aber überlappen etwas. Ob der Effekt ausreicht um von einem Unterschied hier zu sprechen müssen wir noch herausfinden.
Zwischenfazit
Bisher konnten wir folgende Punkte herausfinden: Wir haben den Queenstown Hafen aus unserem Datensatz gestrichen aufgrund der mangelnde Menge an Daten innerhalb der Klasse. Zudem konnten wir bereits herausfinden dass wir einen Unterschied zwischen den Passagierklassen vermuten, nicht aber zwischen den Häfen.
Profildiagramm
#titanic$Embarked
library(htmltools)
library(ggplot2)
titanic$Pclass <- as.factor(titanic$Pclass )
ggplot(titanic,
aes(x=Embarked,
y=Age,
group = Pclass,
color = Pclass,
aesthetics = "fill"
)
)+
stat_summary(fun = mean,
geom="point",
size=3
)+
stat_summary(fun = mean,
geom="line",
size= 1.5
)+
stat_summary(fun.data = mean_cl_normal, geom="errorbar",width=.25, size=1)+
stat_summary(aes(label=round(..y..)),
fun ='mean',
geom="text",
size=4,
position = position_nudge(x = -0.15, y = 0.75)
)+
labs(title = "Durschnittsalter der Passagiere am jeweiligen Zustiegshafen",
x="Klasse",
y="Age")+
theme(panel.background = element_rect(size = 0.5, fill = "gray91", colour = "black", linetype='solid'),
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "darkgray"),
panel.grid.minor = element_line(size = 0.5, linetype = 'solid', colour = "gray"),
)

Betrachten wir das Profidiagramm der verschiedenen Klassen und und des Einschiffungsortes, dann erkennen wir dass wir grundsätzlich in Cherbourg einen deutlich geringeres Alter beim Einstieg haben als in Southampton. Für die erste Klasse ist der Mittelwert am geringsten. Was wir ebenso sehen ist jedoch eine sehr starke Überlagerung bezüglich der Spannbreite bei der Altersklasse. In Southampton haben wir dann wieder eine schöne Trennung, sodass wir wenn wir nur Southampton betrachten auch von einem Altersunterschied der Klassen ausgehen könnten. Betrachten wir Cherbourg wird die Unterscheidung für die zweite und dritte Klasse schwer, aber eine Unterscheidung zwischen der ersten und der zweiten und dritten Klasse zusammen sieht gut aus.
Zur Durchführung unseres Testes müssen wir nun die Vorraussetzung der Varianzhomogenität prüfen. Dies machen wir mit dem Levene-Test.
Levene -Test
library(car)
leveneTest(Age ~ Embarked*Pclass, data = titanic, center = "mean")
Levene's Test for Homogeneity of Variance (center = "mean")
Df F value Pr(>F)
group 5 3.3477 0.005388 **
678
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Der Levene Test liefert uns mit einem empirischen Wert von 3,3477 und einem DF = 5 einen p-Wert von 0.005388, d.h. der Unterschied der Varianzen ist bei unserer Irrtumswahrscheinlichkeit von 0.05 kleiner, sodass wir davon ausgehen müssen dass die Varianzen zwischen den Gruppen nicht identisch sind. Die Varianzen sind somit heterogen, sodass wir dies in unserer ANOVA beachten “müssten”. Da die Varianzen leider nicht gleich sind, ist es zu empfehlen eine Korrektur mithilfe des Welch-Tests durchzuführen.
Ergebnisse der mehrfaktorielle Varianzanalyse
mehrAnova1 <- lm(Age ~ Embarked*Pclass, data = titanic)
myAnova <- Anova(mehrAnova1 , type = 3)
myAnova
Anova Table (Type III tests)
Response: Age
Sum Sq Df F value Pr(>F)
(Intercept) 107008 1 604.7606 < 2.2e-16 ***
Embarked 1 1 0.0039 0.9504
Pclass 8981 2 25.3775 2.353e-11 ***
Embarked:Pclass 792 2 2.2373 0.1075
Residuals 119967 678
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
embarkedwelch <- oneway.test(Age~Embarked, data = titanic, var.equal = F)
embarkedwelch
One-way analysis of means (not assuming equal variances)
data: Age and Embarked
F = 0.85483, num df = 1.00, denom df = 183.18, p-value = 0.3564
Der F-Test für die Abhängigkeit der Analyse bezüglich des Einflusses des Alters und dem Einschiffungsort bei ungleichen Varianzen ist nicht signifikant. D.h. bei F(1,183.18) = 0.85483 erhalten wir einen p-value = 0.3564, dieser Wert ist grösser als unsere Irrtumswahrscheinlichkeit von 0.05, sodass wir hier von keinem signifikanten Test ausgehen können. Der Einschiffungsort, hat keinen Einfluss auf das Alter unserer Passagiere.
pclasswelch <- oneway.test(Age~Pclass, data = titanic, var.equal = F)
pclasswelch
One-way analysis of means (not assuming equal variances)
data: Age and Pclass
F = 51.453, num df = 2.00, denom df = 352.23, p-value < 2.2e-16
Der F-Test für die Abhängigkeit der Analyse bezüglich des Einflusses des Alters und der Passagierklasse bei ungleichen Varianzen ist signifikant. D.h. bei F(2,352.23) = 51.453 erhalten wir einen p-value < 2.2e-16, dieser Wert ist kleiner als unsere Irrtumswahrscheinlichkeit von 0.05, sodass wir hier von einem signifikanten Test ausgehen können. Die Passagierklasse, hat somit einen Einfluss auf das Alter unserer Passagiere.
AXBwelch <- oneway.test(Age~Embarked*Pclass, data = titanic, var.equal = F)
AXBwelch
One-way analysis of means (not assuming equal variances)
data: Age and Embarked * Pclass
F = 22.808, num df = 5.00, denom df = 104.56, p-value = 2.051e-15
Der F-Test für die Abhängigkeit der Analyse bezüglich des Einflusses des Alters und der Kombination aus Einschiffungsort & Passagierklasse bei ungleichen Varianzen ist signifikant. D.h. bei F(5,104.56) = 22.808 erhalten wir einen p-value = 2.051e-15. Dieser Wert ist kleiner als unsere Irrtumswahrscheinlichkeit von 0.05, sodass wir hier von einem signifikanten Test ausgehen können. Die Passagierklasse in Kombination mit dem Einschiffungsort hat somit einen Einfluss auf das Alter unserer Passagiere.
Post-Hoc-Test
Bis hier her haben wir herausgefunden dass die Passagierklasse und die Interaktion der Passagierklasse mit dem Einschiffungsort signifikant sind in ihrem Einfluss auf das Alter der Passagiere. Im Folgenden wollen wir herausfinden welche Passagierklasse einen Einfluss hat auf das Alter hat. Hierfür führen wir einen TukeyHSD Test durch. Zu diesem Zweck werden Tukey-korrigierte Mehrfachvergleiche berechnet.
Da wir beim TukeyHSD Testverfahren mehrere t-Test durchführen welche nicht unabhängig voneinander sind, d.h. wir haben das Risiko den identischen Zufallsfehler mehrmals zu messen korrigieren wir beim TukeyHSD Test automatisch die Irrumswahrscheinlichkeit. Hierbei wird α durch die Anzahl der Paarvergleiche dividiert. Wir können also somit den adjustierten p-Value gegen unsere Irrtumswahrscheinlichkeit von Alpha = 0.05 testen. In diesem Fall ist n = 15, sodass wir alpha/15 teilen werden.
PostHoc <- aov(Age~Embarked*Pclass, data=titanic)
TukeyHSD(PostHoc)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = Age ~ Embarked * Pclass, data = titanic)
$Embarked
diff lwr upr p adj
Southampton-Cherbourg -1.369372 -3.91469 1.175946 0.2911894
$Pclass
diff lwr upr p adj
2nd Class-1st Class -7.946247 -11.273829 -4.618666 0.0000001
3rd Class-1st Class -12.631211 -15.514473 -9.747950 0.0000000
3rd Class-2nd Class -4.684964 -7.627453 -1.742475 0.0005846
$`Embarked:Pclass`
diff lwr upr p adj
Southampton:1st Class-Cherbourg:1st Class 0.125010 -5.611787 5.8618070 0.9999999
Cherbourg:2nd Class-Cherbourg:1st Class -15.260360 -26.024890 -4.4958311 0.0008029
Southampton:2nd Class-Cherbourg:1st Class -7.640296 -13.006254 -2.2743380 0.0007468
Cherbourg:3rd Class-Cherbourg:1st Class -17.285076 -24.686285 -9.8838670 0.0000000
Southampton:3rd Class-Cherbourg:1st Class -12.330475 -17.281526 -7.3794248 0.0000000
Cherbourg:2nd Class-Southampton:1st Class -15.385370 -25.860432 -4.9103090 0.0004373
Southampton:2nd Class-Southampton:1st Class -7.765306 -12.524017 -3.0065955 0.0000549
Cherbourg:3rd Class-Southampton:1st Class -17.410086 -24.383587 -10.4365850 0.0000000
Southampton:3rd Class-Southampton:1st Class -12.455485 -16.740893 -8.1700772 0.0000000
Southampton:2nd Class-Cherbourg:2nd Class 7.620064 -2.656588 17.8967162 0.2785619
Cherbourg:3rd Class-Cherbourg:2nd Class -2.024715 -13.496157 9.4467257 0.9960072
Southampton:3rd Class-Cherbourg:2nd Class 2.929885 -7.136344 12.9961143 0.9615646
Cherbourg:3rd Class-Southampton:2nd Class -9.644780 -16.316540 -2.9730196 0.0005773
Southampton:3rd Class-Southampton:2nd Class -4.690179 -8.464751 -0.9156075 0.0054712
Southampton:3rd Class-Cherbourg:3rd Class 4.954601 -1.388252 11.2974528 0.2242481
Wie wir bereits vermutet haben, hat der Einschiffungshafen keinen signifkanten Einfluss auf das Alter der Passagiere. Hingegen können wir erkennen das alle Passagierklassen einen globalen Effekt auf das Alter der Passagiere haben. Hier können wir sogar von einem globalen Effekt sprechen. D.h. die Passagierklassen haben immer einen Effekt auf das Alter unserer Passagiere. Wenn wir uns den Boxplot und den Mittelwertplot wieder in Erinnerung rufen, kann man sagen dass in der ersten Klasse immer die älteren Personen mitfahren im Vergleich zu den anderen und dass wir auch in der zweiten Klasse ältere Passagiere haben als in der dritten Klasse.
Betrachten wir im nächsten Schritt die Kombination der Passagierklasse mit dem Einschiffungshafen. Hier sehen wir dass folgende Kombinationen keinen Effekt haben:
Southampton:1 Class-Cherbourg:1 Class
Southampton:2 Class-Cherbourg:2 Class
Cherbourg:3 Class-Cherbourg:2 Class
Southampton:3 Class-Cherbourg:2 Class
Southampton:3 Class-Cherbourg:3 Class
Aufgrund der Liste können wir auch schnell erkennen dass wir keinen globalen Effekt haben bei der Kombinatorik der Daten. Wir können somit nicht pauschal sagen dass eine Kombination einen globalen Effekt hat und somit pauschal einen Effekt hat auf das Alter der Passagiere.
Partielles Eta-Quadrat
Das partielle Eta-Quadrat (partielles η2) ist ein Mass für die Effektgrösse: Es setzt die Variation, die durch einen Faktor erklärt wird, in Bezug mit jener Variation, die nicht durch andere Faktoren im Modell erklärt wird. Das heisst, es wird ausschliesslich jene Variation betrachtet, welche nicht durch die anderen Faktoren im Modell erklärt wird. Das partielle Eta-Quadrat zeigt, welchen Anteil davon ein Faktor erklärt:
library(sjstats)
eta <- effectsize::eta_squared(mehrAnova1, partial = TRUE)
eta
Parameter | Eta2 (partial) | 90% CI
-----------------------------------------------
Embarked | 1.64e-03 | [0.00, 0.01]
Pclass | 0.15 | [0.11, 0.19]
Embarked:Pclass | 6.56e-03 | [0.00, 0.02]
Berechnung der Effektstärke
Effektstärke für den Einschiffungshafen
effembarked <- sqrt(eta$Eta2[1]/(1-eta$Eta2[1]))
sprintf("Effektstärke für den Einschiffungshafen: f= %.3f", effembarked)
[1] "Effektstärke für den Einschiffungshafen: f= 0.041"
Zur Abrundung des Ganzen Themas, zeigt auch die Effektstärke des Einschiffungshafen keinen Einfluss auf das Alter der Passagiere.Hier liegt kein Effekt vor.
f = .10 entspricht einem schwachen Effekt f = .25 entspricht einem mittleren Effekt f = .40 entspricht einem starken Effekt
Effektstärke für die Passagierklasse
effpclass <- sqrt(eta$Eta2[2]/(1-eta$Eta2[2]))
sprintf("Effektstärke fürs Class: f= %.3f", effpclass)
[1] "Effektstärke fürs Class: f= 0.414"
Bei der Passagierklasse liegt mit f = 0.414 ein sehr starker Effekt vor.
f = .10 entspricht einem schwachen Effekt f = .25 entspricht einem mittleren Effekt f = .40 entspricht einem starken Effekt
Effektstärke für die Interaktion
effAxB <- sqrt(eta$Eta2[3]/(1-eta$Eta2[3]))
sprintf("Effektstärke der Interaktion zwischen Klasse und Hafen: f= %.3f", effAxB)
[1] "Effektstärke der Interaktion zwischen Klasse und Hafen: f= 0.081"
Auch haben wir bei der Interaktion der Kategorien keinen Effekt, da der Wert von f = 0.081 < 0.10 liegt.
f = .10 entspricht einem schwachen Effekt f = .25 entspricht einem mittleren Effekt f = .40 entspricht einem starken Effekt
Eine Aussage
Die Mittelwerte der Gruppen lassen sich nur durch die Passagierklasse erklären und dies auch mit einem starken Effekt, der Einschiffungshafen hat keinen Einfluss auf die Altersverteilung auf dem Schiff. Somit wird die Hypothese H1_Pclass bestätigt, während H1_harbor und H1_interaction verworfen werden.
LS0tDQp0aXRsZTogIkRpZSBtZWhyZmFrdG9yaWVsbGUgVmFyaWFuemFuYWx5c2Ugb2huZSBNZXNzd2llZGVyaG9sdW5nIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCiMgQXVmZ2FiZSA1LTY6IFp1c2FtbWVuaGFuZ3NoeXBvdGhlc2UgDQoNCkRhdGVuc2F0ejogdGl0YW5pYy5jc3YNClVWID0gUGNsYXNzLCBFbWJhcmtlZA0KQVYgPSBBZ2UNCg0KIyBIeXBvdGhlc2VuIA0KDQpIMF9QY2xhc3M6IERpZSBQYXNzYWdpZXJrbGFzc2UgaGF0IGtlaW5lbiBFaW5mbHVzcyBhdWYgZGFzIEFsdGVyIGRlciBQZXJzb25lbi4gDQpIMV9QY2xhc3M6IERpZSBQYXNzYWdpZXJrbGFzc2UgaGF0IGVpbmVuIEVpbmZsdXNzIGF1ZiBkYXMgQWx0ZXIgZGVyIFBlcnNvbmVuLg0KDQoNCkgwX2hhcmJvcjogRGVyIEVpbnNjaGlmZnVuZ3NoYWZlbiBoYXQga2VpbmVuIEVpbmZsdXNzIGF1ZiBkYXMgQWx0ZXIgZGVyIFBlcnNvbmVuLiANCkgxX2hhcmJvcjogRGVyIEVpbnNjaGlmZnVuZ3NoYWZlbmRlciBoYXQgZWluZW4gRWluZmx1c3MgYXVmIGRhcyBBbHRlciBkZXIgUGVyc29uZW4uDQoNCg0KSDBfaW50ZXJhY3Rpb246IERpZSBQYXNzYWdpZXJrbGFzc2UgdW5kIGRlciBFaW5zY2hpZmZ1bmdzaGFmZW4sIG9kZXIgZGllIEtvbWJpbmF0aW9uIGhhdCBrZWluZW4gRWluZmx1c3MgYXVmIGRhcyBBbHRlciBkZXIgUGVyc29uZW4uIA0KSDFfaW50ZXJhY3Rpb246IERpZSBQYXNzYWdpZXJrbGFzc2UgdW5kIGRlciBFaW5zY2hpZmZ1bmdzaGFmZW4sIG9kZXIgZGllIEtvbWJpbmF0aW9uIGhhdCBlaW5lbiBFaW5mbHVzcyBhdWYgZGFzIEFsdGVyIGRlciBQZXJzb25lbi4gDQoNCiMgVm9yYXVzc2V0enVuZ2VuIGbDvHIgZGllIG1laHJmYWt0b3JpZWxsZSBWYXJpYW56YW5hbHlzZSAob2huZSBNZXNzd2llZGVyaG9sdW5nKSANCg0KPGI+IERpZSBhYmjDpG5naWdlIFZhcmlhYmxlIGlzdCBpbnRlcnZhbGxza2FsaWVydCAtPiBEaWVzIGlzdCBnZWdlYmVuLCBmw7xyIGRhcyBBbHRlciBsaWVndCBlaW5lIFJhdGlvc2thbGEgdm9yLjwvYj48YnI+DQo8Yj4gRGllIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIChQYXNzYWdpZXJrbGFzc2UgdW5kIEVpbnNjaGlmZnVuZ3NoYWZlbikgc2luZCBrYXRlZ29yaWVsIC0+IEVyZsO8bGx0LjwvYj48YnI+DQoNCjxiPiBEaWUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gKFBhc3NhZ2llcmtsYXNzZSB1bmQgRWluc2NoaWZmdW5nc2hhZmVuKSBzaW5kIGthdGVnb3JpYWwgKG5vbWluYWwtIG9kZXIgb3JkaW5hbHNrYWxpZXJ0KSAtPiBEaWVzIGlzdCBnZWdlYmVuLjwvYj48YnI+DQo8Yj4gRGllIGFiaMOkbmdpZ2VuIFZhcmlhYmxlbiBpc3Qgbm9ybWFsdmVydGVpbHQgaW5uZXJoYWxiIGplZGVyIEdydXBwZS4gLT4gRGllcyBpc3QgZ2VycMO8ZnQgdW5kIGVzIHd1cmRlbiBHcnVwcGVuIHdpZSB6LkIuIFF1ZWVuc3Rvd24gd2VnZW4gZGVyIFZlcmxldHp1bmcgbiA8IDI1IGVudGZlcm50LjwvYj48YnI+DQo8Yj4gSG9tb2dlbml0w6R0IGRlciBWYXJpYW56ZW4gLT4gU2llaGUgTGV2ZW5lLVRlc3QgPC9iPjxicj4NCg0KIyBHcnVuZGxlZ2VuZGUgS29uemVwdGUNCg0KRGllIG1laHJmYWt0b3JpZWxsZSBWYXJpYW56YW5hbHlzZSB1bnRlcnN1Y2h0LCBvYiBzaWNoIGRpZSBNaXR0ZWx3ZXJ0ZSBtZWhyZXJlciB1bmFiaMOkbmdpZ2VyIEdydXBwZW51bnRlcnNjaGVpZGVuLCBkaWUgZHVyY2ggbWVocmVyZSBrYXRlZ29yaWFsZSB1bmFiaMOkbmdpZ2UgVmFyaWFibGUgZGVmaW5pZXJ0IHdlcmRlbi4NCkRpZXNlIFVWIHdlcmRlbiBiZWkgZGVyIEFOT1ZBIGFscyAiRmFrdG9yZW4iIGJlemVpY2huZXQuIERpZSBBdXNwcsOkZ3VuZ2VuIGRlciB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlIHdlcmRlbiAiRmFrdG9yc3R1ZmVuIiBnZW5hbm50IChlbmcuIlRyZWF0bWVudHMiKQ0KDQpEaWUgIm1laHJmYWt0b3JpZWxsIiBvZGVyIG1pbmRlc3RlbnMgendlaWZha3RvcmllbGwgVmFyaWFuemFuYWx5c2Ugd2lyZCBiZWkgbWVociBhbHMgZWluZW4gRmFrdG9yLCBhbHNvIG1laHJlcmUgR3J1cHBpZXJ1bmdzdmFyaWFibGVuLCB2ZXJ3ZW5kZXQgKHZnbC4gZWluZmFrdG9yaWVsbGUgVmFyaWFuemFuYWx5c2UpLiBEZXIgQmVncmlmZiAiVmFyaWFuemFuYWx5c2UiIHdpcmQgYXVjaCJBTk9WQSIgYWJnZWvDvHJ6dCwgZGEgc2llIGluIEVuZ2xpc2NoIG1pdCAiQW5hbHlzaXMgb2YgdmFyaWFuY2UiIHN0ZWh0Lg0KDQpEaWUgSWRlZSBkZXIgVmFyaWFuemFuYWx5c2UgYmVzdGVodCBpbiBkZXIgWmVybGVndW5nIGRlciBWYXJpYW56IGRlciBhYmjDpG5naWdlbiBWYXJpYWJsZS4gRGllIEdlc2FtdHZhcmlhbnogc2V0enQgc2ljaCBhdXMgZGVyICJWYXJpYW56IGlubmVyaGFsYiBkZXIgR3J1cHBlbiIgdW5kIGRlciAiVmFyaWFueiB6d2lzY2hlbiBkZW4gR3J1cHBlbiIgenVzYW1tZW4uDQoNCkJlaSBlaW5lciBtZWhyZmFrdG9yaWVsbGVuIFZhcmlhbnphbmFseXNlIHdpcmQgZGllIFZhcmlhbnogendpc2NoZW4gZGVuIEdydXBwZW4gd2VpdGVyIGF1ZmdlZ2xpZWRlcnQsIHVuZCB6d2FyIGluIGRpZSBWYXJpYW56IGRlciBlaW56ZWxuZW4gRmFrdG9yZW4gdW5kIGRpZSBWYXJpYW56IGRlciBJbnRlcmFrdGlvbihlbikgZGVyIEZha3RvcmVuLg0KSW0gUmFobWVuIGVpbmVyIFZhcmlhbnphbmFseXNlIHdpcmQgZGllIFZhcmlhbnogendpc2NoZW4gZGVuIEdydXBwZW4gbWl0IGRlciBWYXJpYW56IGlubmVyaGFsYiBkZXIgR3J1cHBlbiB2ZXJnbGljaGVuLkRpZSBGcmFnZXN0ZWxsdW5nIGRlciBtZWhyZmFrdG9yaWVsbGVuIFZhcmlhbnphbmFseXNlIGvDtm5udGUgc2VpbjogIlVudGVyc2NoZWlkZW4gc2ljaCBkaWUgTWl0dGVsd2VydGUgZWluZXIgYWJow6RuZ2lnZW4gVmFyaWFibGUgendpc2NoZW4gbWVocmVyZW4gR3J1cHBlbj8gV2VsY2hlIEZha3RvcnN0dWZlbiB1bnRlcnNjaGVpZGVuIHNpY2g/IEdpYnQgZXMgRWZmZWt0ZT8iDQoNCg0KIyBEZXNrcmlwdGl2ZSBTdGF0aXN0aWtlbiB1bmQgTm9ybWFsdmVydGVpbHVuZw0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShIbWlzYykNCmBgYA0KDQoNCg0KYGBge3IgcmVzdWx0cz0naGlkZSd9DQp0aXRhbmljIDwtIHJlYWRfY3N2KCJ0aXRhbmljLmNzdiIpDQoNCnRpdGFuaWMgPC0gdGl0YW5pY1shaXMubmEodGl0YW5pYyRFbWJhcmtlZCkgJiAhaXMubmEodGl0YW5pYyRBZ2UpLF0NCiMgdGl0YW5pYyA8LSB0aXRhbmljW3RpdGFuaWMkRW1iYXJrZWQgIT0gIlEiLF0NCg0KdGl0YW5pYyRFbWJhcmtlZFt0aXRhbmljJEVtYmFya2VkID09ICJDIl0gPC0gIkNoZXJib3VyZyIgDQp0aXRhbmljJEVtYmFya2VkW3RpdGFuaWMkRW1iYXJrZWQgPT0gIlMiXSA8LSAiU291dGhhbXB0b24iIA0KdGl0YW5pYyRFbWJhcmtlZFt0aXRhbmljJEVtYmFya2VkID09ICJRIl0gPC0gIlF1ZWVuc3Rvd24iIA0KDQp0aXRhbmljJFBjbGFzc1t0aXRhbmljJFBjbGFzcyA9PSAiMSJdIDwtICIxc3QgQ2xhc3MiIA0KdGl0YW5pYyRQY2xhc3NbdGl0YW5pYyRQY2xhc3MgPT0gIjIiXSA8LSAiMm5kIENsYXNzIiANCnRpdGFuaWMkUGNsYXNzW3RpdGFuaWMkUGNsYXNzID09ICIzIl0gPC0gIjNyZCBDbGFzcyIgDQpgYGANCg0KYGBge3J9DQp0aXRhbmljICU+JQ0KZ3JvdXBfYnkoRW1iYXJrZWQpICU+JQ0Kc3VtbWFyaXNlKEFuemFobCA9IG4oKSwgTWl0dGVsd2VydCA9IG1lYW4oQWdlKSwgTWVkaWFuID0gbWVkaWFuKEFnZSksIFN0YW5kYXJkYWJ3ZWljaHVuZyA9IHNkKEFnZSkpICU+JQ0KbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKQ0KYGBgDQoNCg0KYGBge3J9DQp0aXRhbmljICU+JQ0KICBncm91cF9ieShFbWJhcmtlZCkgJT4lDQogIGdncGxvdChhZXMoQWdlLCBjb2xvcj1FbWJhcmtlZCkpICsgDQogIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsID0gRW1iYXJrZWQpLCBiaW5zID0gMjApICsNCiAgZmFjZXRfd3JhcCh+RW1iYXJrZWQpICsNCiAgdGhlbWVfZ3JleSgpKw0KICBsYWJzKHg9ICJBbnphaGwgZGVyIEFnZSIseSA9ICJBbnphaGwiICkNCmBgYA0KV2lyIGJldHJhY2h0ZW4gbnVuIGVpbiBIaXN0b2dyYW1tIHVudGVydGVpbHQgbmFjaCBkZW4gZHJlaSBIw6RmZW4uIE1hbiBrYW5uIGJlcmVpdHMgZXJrZW5uZW4gZGFzIGluIFNvdXRoYW1wdG9uIGRpZSBtZWlzdGVuIFBlcnNvbmVuIHp1Z2VzdGllZ2VuIHNpbmQsIGFiZXIgYW4gamVkZW0gSGFmZW4gaGFiZW4gd2lyIGRpZSBnZXNhbXRlIEFsdGVyc2JyZWl0ZSB2b24gMCAtIDgwIHZlcnRyZXRlbi4gQWxsZSBoYWJlbiBlaW5lbiBzdGFya2UgSMOkdWZ1bmcgaW0gQmVyZWljaCB6d2lzY2hlbiAyMCB1bmQgMzAuIERlciBHcm9zc3RlaWwgZGVyIFBhc3NhZ2llcmUgaXN0IGluIFNvdXRoYW1wdG9uIChFbmdsYW5kLCBuYWhlIExvbmRvbikgZWluZ2VzdGllZ2VuLCBkZW0gZXJzdGVuIEhhZmVuIGRlciBUaXRhbmljLiBIaWVyIHNpbmQgNTU0IFBhc3NhZ2llcmUgZGVyIDg5MSBQYXNzYWdpZXJlIHp1Z2VzdGllZ2VuLiBEaWUga2xlaW5zdGUgQW56YWhsIHZvbiBQZXJzb25lbiBpc3QgaW4gUXVlZW5zdG93biAoSXJsYW5kKSB6dWdlc3RpZWdlbiBtaXQgbnVyIDI4IFBlcnNvbmVuLiAxMzAgUGVyc29uZW4gc2luZCBpbiBDaGVyYm91cmcgKEVuZ2xhbmQpIHp1Z2VzdGllZ2VuLiBGw7xyIGRhcyBBbHRlciBkZXIgUGVyc29uZW4gc2VoZW4gd2lyIGJlcmVpdHMgdmVyc2NoaWVkZW5lIEFsdGVyc3dlcnRlIGhhYmVuIGJlaSBkZW4gRWluc3RpZWdzb3J0ZW4uIERpZXNlIHVudGVyc2NoZWlkZW4gc2ljaCBuaWNodCBzZWhyIHN0YXJrIHVuZCB3aXIgaGFiZW4gYmVpIGFsbGVuIGVpbmUgZ3Jvc3NlIFN0YW5kYXJkYWJ3ZWljaHVuZy4gRGFoZXIgZ2VoZW4gd2lyIGRhdm9uIGF1cyBkYXNzIHNpY2ggZGllIEFsdGVyc2dydXBwZW4sIGdydXBwaWVydCBuYWNoIEVpbnNjaGlmZnVuZ3NoYWZlbiwgc3Rhcmsgw7xiZXJsYXBwZW4gd2VyZGVuLiBNYW4ga2FubiBhbmhhbmQgZGVyIEhpc3RvZ3JhbW1lIHNlaGVuLCBkYXNzIGRpZSBBbm5haG1lIGVpbmVyIE5vcm1hbHZlcnRlaWx1bmcgZ2VyZWNodGZlcnRpZ3QgaXN0Lg0KDQoNCg0KYGBge3J9DQp0aXRhbmljICU+JQ0KZ3JvdXBfYnkoUGNsYXNzKSAlPiUNCnN1bW1hcmlzZShBbnphaGwgPSBuKCksIE1pdHRlbHdlcnQgPSBtZWFuKEFnZSksIE1lZGlhbiA9IG1lZGlhbihBZ2UpLCBTdGFuZGFyZGFid2VpY2h1bmcgPSBzZChBZ2UpKSAlPiUNCm11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMikNCmBgYA0KDQpgYGB7cn0NCnRpdGFuaWMgJT4lDQogIGdyb3VwX2J5KFBjbGFzcykgJT4lDQogIGdncGxvdChhZXMoQWdlLCBjb2xvcj1QY2xhc3MpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbCA9IFBjbGFzcyksIGJpbnMgPSAyMCkgKw0KICBmYWNldF93cmFwKH5QY2xhc3MpICsNCiAgdGhlbWVfZ3JleSgpKw0KICBsYWJzKHg9ICJBbnphaGwgZGVyIFBjbGFzcyIseSA9ICJBbnphaGwiICkNCmBgYA0KV2VubiB3aXIgamV0enQgZGFzIEhpc3RvZ3JhbW0gZsO8ciBkaWUgUGFzc2FnaWVya2xhc3NlbiBiZXRyYWNodGVuLCBkYW5uIGVya2VubmVuIHdpciBkYXNzIGRpZSB6d2VpdGUgS2xhc3NlbiBhdWNoIGluIGRlbiB1bnRlcmVuIEFsdGVyc2JlcmVpY2hlbiBhdXNnZXByw6RndGUgQmluwrRzIGhhYmVuLCB3w6RocmVuZCBoaW5nZWdlbiBkaWUgZXJzdGUgS2xhc3NlIGluIGRpZXNlbSBCZXJlaWNoIGtlaW5lIGJpcyBudXIgbWluaW1hbGUgQmluwrRzIGhhdC4gQXVjaCBrYW5uIG1hbiBpbiBkZXIgZXJzdGVuIEtsYXNzZSBlcmtlbm5lbiBkYXNzIHdpciBoaWVyIGVpbmVuIEjDpHVmdW5nc3B1bmt0IGhhYmVuIGRlciB3ZWl0ZXIgcmVjaHRzIGxpZWd0IGFscyBiZWkgZGVuIGFuZGVyZW4gS2xhc3Nlbi4gV2lyIHZlcm11dGVuIGRhaGVyIGVoZXIgZWluZW4gRWluZmx1c3MgZGVyIFBhc3NhZ2llcmtsYXNzZW4gYXVmIGRpZSBBbHRlcnN2ZXJ0ZWlsdW5nIGFscyBlaW5lbiBFaW5mbHVzcyBkZXIgRWluc2NoaWZmdW5nc29ydGUuIE1hbiBrYW5uIGFuaGFuZCBkZXIgSGlzdG9ncmFtbWUgc2VoZW4sIGRhc3MgZGllIEFubmFobWUgZWluZXIgTm9ybWFsdmVydGVpbHVuZyBnZXJlY2h0ZmVydGlndCBpc3QuDQoNCg0KDQpgYGB7cn0NCnRpdGFuaWMgJT4lDQpncm91cF9ieShFbWJhcmtlZCwgUGNsYXNzKSAlPiUNCiAgc3VtbWFyaXNlKEFuemFobCA9IG4oKSwgTWl0dGVsd2VydCA9IG1lYW4oQWdlKSwgTWVkaWFuID0gbWVkaWFuKEFnZSksIFN0YW5kYXJkYWJ3ZWljaHVuZyA9IHNkKEFnZSkpICU+JQ0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpDQpgYGANCg0KQmV0cmFjaHRlbiB3aXIgaW0gRm9sZ2VuZGVuIG51biBkaWUgS3JldXptYXRyaXggbWl0IGRlbiBLb21iaW5hdGlvbmVuIHZvbiBLbGFzc2UgdW5kIEVpbnNjaGlmZnVuZ3NvcnQuIFdpciBrw7ZubmVuIGhpZXIgYmVyZWl0cyBlcmtlbm5lbiBkYXNzIHVuc2VyZSBTdGljaHByb2JlbiBpbiBkZXIgS29tYmluYXRpb24gQ2hlcmJvdXJnICgzLiBLbGFzc2UsIDIuIEtsYXNzZSksIFF1ZWVuc3Rvd24gKDEuIEtsYXNzZSArIDIuIEtsYXNzZSArIDMuS2xhc3NlKSB3ZW5pZ2VyIGFscyAyNSBQZXJzb25lbiBiZWluaGFsdGVuLiBEYXMgYmVkZXV0ZXQgZGFzIHdpciBpbiBkaWVzZW4gR3J1cHBlbiBiZWkgZGVyIEJlcmVjaG51bmcgZGVzIE1pdHRlbHdlcnRlcyBuaWNodCB2b20gemVudHJhbGVuIEdyZW56d2VydHNhdHogYXVzZ2VoZW4ga8O2bm5lbi4gRGllIEJlcmVjaG51bmcgZGVzIE1pdHRlbHdlcnRlcywgd2VsY2hlciBmw7xyIGRlbiBWZXJnbGVpY2ggZGVyIEdydXBwZW4gaGVyYW5nZXpvZ2VuIHdpcmQgaXN0IHJlaW5lciBadWZhbGwgdW5kIG5pY2h0IGF1ZmdydW5kIGRlciBTdHJ1a3R1ciB6dSBlcmtlbm5lbi4gQXVzIGRpZXNlbSBHcnVuZCB3aXJkIGbDvHIgZGllIHdlaXRlcmUgQW5hbHlzZSBkZXIgSGFmZW4gIlF1ZWVuc3Rvd24iIGhlcmF1c2dlbMO2c2NodCwgd2VpbCBoaWVyIGRpZSBBbnphaGwgYW4gRGF0ZW4genUga2xlaW4gaXN0IHVtIGVpbmUgQXVzc2FnZSB6dSB0cmVmZmVuLiBXaXIgYmVzY2hyw6Rua2VuIHVucyBpbSBGb2xnZW5kZW4gc29taXQgbnVyIGF1ZiBkaWUgYmVpZGVuIEjDpGZlbiBDaGVyYm91cmcgdW5kIFNvdXRoYW1wdG9uLCB1bmQgZGllIGRyZWkgS2xhc3Nlbi4gDQoNCmBgYHtyfQ0KZ2dwbG90KHRpdGFuaWMsIGFlcyh4PUFnZSkpKw0KZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDI1KSsNCnRoZW1lX2dyZXkoKSsNCmZhY2V0X3dyYXAoRW1iYXJrZWR+UGNsYXNzLCBuY29sID0gMykNCmBgYA0KQmVpIGRlbiBrb21iaW5pZXJ0ZW4gSGlzdG9ncmFtcGxvdHMgc2VoZW4gd2lyIGRpZSBzZWxiZW4gRWZmZWt0ZSB3aWUgYmVyZWl0cyBvYmVuIGluIGRlciBUYWJlbGxlIGVya2FubnQuIERlciBRdWVlbnN0b3duIEhhZmVuIGlzdCB6dSBkw7xubiBiZXNldHp0LiBEZXIgU291dGhhbXB0b24gSGFmZW4gaXN0IGF1ZmdydW5kIGRlciBHcsO2c3NlIGRlciBQYXNzYWdpZXJhbnphaGxlbiBkZXIgYmVzdGUgSGFmZW4gaW4gZGVuIERhdGVuLiBCZWkgZGVyIGVyc3RlbiB1bmQgZGVyIHp3ZWl0ZW4gS2xhc3NlIHNlaGVuIHdpciBhdWNoIGVpbmUgbmFoZXp1IG5vcm1hbHZlcnRlaWx0ZSBWZXJ0ZWlsdW5nIGluIGRlciBkcml0dGVuIEtsYXNzZW4gaGFiZW4gd2lyIGplZG9jaCBlaW5lIHJlY2h0c3NjaGllZmUgVmVydGVpbHVuZy4gRGEgd2lyIGplZG9jaCBpbiBkaWVzZW4gS2xhc3NlbiBlaW5lbiBhdXNyZWljaGVuZCBncm9zc2VuIERhdGVuc2F0eiBoYWJlbiwga8O2bm5lbiB3aXIgZGVuIHplbnRyYWxlbiBHcmVuendlcnRzYXR6IHZlcndlbmRlbiB1bmQgZGFtaXQgdm9uIGVpbmVyIE5vcm1hbHZlcnRlaWx1bmcgYXVzZ2VoZW4gZsO8ciBkaWUgQmVyZWNobnVuZyBkZXMgTWl0dGVsd2VydHMuIA0KDQpCZWkgQ2hlcmJvdXJnIHNlaGVuIGRpZSBEYXRlbiBpbm5lcmhhbGIgZGVyIEtsYXNzZW4gbm9ybWFsdmVydGVpbHQgYXVzLiBEaWUgendlaXRlIEtsYXNzZSBpbiBDaGVyYm91cmcgaXN0IGplZG9jaCB3ZWl0ZXJoaW4genUgc2Nod2FjaCBiZXNldHp0LCB3aXIgbGFzc2VuIGRpZXNlIGFiZXIgaW0gd2VpdGVyZW4gU2Nocml0dCBkcmlubmVuIHVtIGbDvHIgZGllIFNvdXRoYW1wdG9uIDIuIEtsYXNzZSBlaW5lbiBWZXJnbGVpY2hzd2VydCB6dSBoYWJlbi4NCg0KDQojIEJveHBsb3QNCg0KYGBge3J9DQp0aXRhbmljIDwtIHRpdGFuaWNbdGl0YW5pYyRFbWJhcmtlZCAhPSAiUXVlZW5zdG93biIsXQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KHRpdGFuaWMsIGFlcyhFbWJhcmtlZCwgQWdlLCBmaWxsPWZhY3RvcihQY2xhc3MpKSkgKw0KZ2VvbV9ib3hwbG90KCkgKw0KdGhlbWVfbWluaW1hbCgpKw0KbGFicyhmaWxsID0gIkNsYXNzIiwgeD0iUG9ydCIsIHk9IkFuemFobCBBZ2UiKQ0KYGBgDQpXZW5uIHdpciB1bnMgbnVuIGRpZSB2ZXJibGVpYmVuZGVuIERhdGVuIGltIEJveHBsb3QgYW5zY2hhdWVuLCBkYW5uIGvDtm5uZW4gd2lyIGVya2VubmVuIGRhc3Mgd2lyIHp3aXNjaGVuIGRlbiBQYXNzYWdpZXJrbGFzc2VuIGVpbmVuIFVudGVyc2NoaWVkIGluIGRlbiBEYXRlbiBoYWJlbiwgZC5oLiB3aXIgdmVybXV0ZW4gYXVjaCBpbiBkaWVzZXIgRGFyc3RlbGx1bmcgYmVpIGRlbiBQYXNzYWdpZXJrbGFzc2VuIGVpbmVuIFVudGVyc2NoaWVkLiBWZXJnbGVpY2hlbiB3aXIgYWJlciBkaWUgSMOkZmVuIG1pdGVpbmFuZGVyLCBkYW5uIGvDtm5uZW4gd2lyIHouQi4gYmVpIGRlciBlcnN0ZW4gS2xhc3NlIHNlaGVuIGRhcyB3aXIgaGllciBzZWhyIGdyb3NzZSBTY2huaXR0bWVuZ2VuIGhhYmVuIGF1Y2ggYmVpIGRlbiB6d2VpdGVuIHVuZCBkcml0dGVuIEtsYXNzZSBsaWVnZW4gZGllIFdlcnRlIGluZWluYW5kZXIsIHNpZSB3ZWljaGVuIGluIGRlciBWZXJ0ZWlsdW5nIHVudGVyZWluYW5kZXIgendhciBhYiwgYWJlciDDvGJlcmxhcHBlbiBldHdhcy4gT2IgZGVyIEVmZmVrdCBhdXNyZWljaHQgdW0gdm9uIGVpbmVtIFVudGVyc2NoaWVkIGhpZXIgenUgc3ByZWNoZW4gbcO8c3NlbiB3aXIgbm9jaCBoZXJhdXNmaW5kZW4uDQoNCiMgWndpc2NoZW5mYXppdA0KDQpCaXNoZXIga29ubnRlbiB3aXIgZm9sZ2VuZGUgUHVua3RlIGhlcmF1c2ZpbmRlbjogV2lyIGhhYmVuIGRlbiBRdWVlbnN0b3duIEhhZmVuIGF1cyB1bnNlcmVtIERhdGVuc2F0eiBnZXN0cmljaGVuIGF1ZmdydW5kIGRlciBtYW5nZWxuZGUgTWVuZ2UgYW4gRGF0ZW4gaW5uZXJoYWxiIGRlciBLbGFzc2UuIFp1ZGVtIGtvbm50ZW4gd2lyIGJlcmVpdHMgaGVyYXVzZmluZGVuIGRhc3Mgd2lyIGVpbmVuIFVudGVyc2NoaWVkIHp3aXNjaGVuIGRlbiBQYXNzYWdpZXJrbGFzc2VuIHZlcm11dGVuLCBuaWNodCBhYmVyIHp3aXNjaGVuIGRlbiBIw6RmZW4uDQoNCiMgUHJvZmlsZGlhZ3JhbW0NCmBgYHtyfQ0KDQojdGl0YW5pYyRFbWJhcmtlZA0KbGlicmFyeShodG1sdG9vbHMpDQpsaWJyYXJ5KGdncGxvdDIpDQp0aXRhbmljJFBjbGFzcyA8LSBhcy5mYWN0b3IodGl0YW5pYyRQY2xhc3MgKQ0KZ2dwbG90KHRpdGFuaWMsIA0KYWVzKHg9RW1iYXJrZWQsIA0KeT1BZ2UsDQpncm91cCA9IFBjbGFzcywNCmNvbG9yID0gUGNsYXNzLA0KYWVzdGhldGljcyA9ICJmaWxsIiANCikNCikrDQpzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgDQpnZW9tPSJwb2ludCIsIA0Kc2l6ZT0zDQopKw0Kc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIA0KZ2VvbT0ibGluZSIsDQpzaXplPSAxLjUNCikrDQpzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX2NsX25vcm1hbCwgZ2VvbT0iZXJyb3JiYXIiLHdpZHRoPS4yNSwgc2l6ZT0xKSsNCiAgDQpzdGF0X3N1bW1hcnkoYWVzKGxhYmVsPXJvdW5kKC4ueS4uKSksIA0KZnVuID0nbWVhbicsIA0KZ2VvbT0idGV4dCIsIA0Kc2l6ZT00LA0KcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gLTAuMTUsIHkgPSAwLjc1KQ0KKSsNCmxhYnModGl0bGUgPSAiRHVyc2Nobml0dHNhbHRlciBkZXIgUGFzc2FnaWVyZSBhbSBqZXdlaWxpZ2VuIFp1c3RpZWdzaGFmZW4iLA0KeD0iS2xhc3NlIiwgDQp5PSJBZ2UiKSsNCnRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3Qoc2l6ZSA9IDAuNSwgZmlsbCA9ICJncmF5OTEiLCBjb2xvdXIgPSAiYmxhY2siLCBsaW5ldHlwZT0nc29saWQnKSwNCnBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAnc29saWQnLCBjb2xvdXIgPSAiZGFya2dyYXkiKSwNCnBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAnc29saWQnLCBjb2xvdXIgPSAiZ3JheSIpLA0KKQ0KYGBgDQoNCkJldHJhY2h0ZW4gd2lyIGRhcyBQcm9maWRpYWdyYW1tIGRlciB2ZXJzY2hpZWRlbmVuIEtsYXNzZW4gdW5kIHVuZCBkZXMgRWluc2NoaWZmdW5nc29ydGVzLCBkYW5uIGVya2VubmVuIHdpciBkYXNzIHdpciBncnVuZHPDpHR6bGljaCBpbiBDaGVyYm91cmcgZWluZW4gZGV1dGxpY2ggZ2VyaW5nZXJlcyBBbHRlciBiZWltIEVpbnN0aWVnIGhhYmVuIGFscyBpbiBTb3V0aGFtcHRvbi4gRsO8ciBkaWUgZXJzdGUgS2xhc3NlIGlzdCBkZXIgTWl0dGVsd2VydCBhbSBnZXJpbmdzdGVuLiBXYXMgd2lyIGViZW5zbyBzZWhlbiBpc3QgamVkb2NoIGVpbmUgc2VociBzdGFya2Ugw5xiZXJsYWdlcnVuZyBiZXrDvGdsaWNoIGRlciBTcGFubmJyZWl0ZSBiZWkgZGVyIEFsdGVyc2tsYXNzZS4gSW4gU291dGhhbXB0b24gaGFiZW4gd2lyIGRhbm4gd2llZGVyIGVpbmUgc2Now7ZuZSBUcmVubnVuZywgc29kYXNzIHdpciB3ZW5uIHdpciBudXIgU291dGhhbXB0b24gYmV0cmFjaHRlbiBhdWNoIHZvbiBlaW5lbSBBbHRlcnN1bnRlcnNjaGllZCBkZXIgS2xhc3NlbiBhdXNnZWhlbiBrw7ZubnRlbi4gQmV0cmFjaHRlbiB3aXIgQ2hlcmJvdXJnIHdpcmQgZGllIFVudGVyc2NoZWlkdW5nIGbDvHIgZGllIHp3ZWl0ZSB1bmQgZHJpdHRlIEtsYXNzZSBzY2h3ZXIsIGFiZXIgZWluZSBVbnRlcnNjaGVpZHVuZyB6d2lzY2hlbiBkZXIgZXJzdGVuIHVuZCBkZXIgendlaXRlbiB1bmQgZHJpdHRlbiBLbGFzc2UgenVzYW1tZW4gc2llaHQgZ3V0IGF1cy4gDQoNClp1ciBEdXJjaGbDvGhydW5nIHVuc2VyZXMgVGVzdGVzIG3DvHNzZW4gd2lyIG51biBkaWUgVm9ycmF1c3NldHp1bmcgZGVyIFZhcmlhbnpob21vZ2VuaXTDpHQgcHLDvGZlbi4gRGllcyBtYWNoZW4gd2lyIG1pdCBkZW0gTGV2ZW5lLVRlc3QuDQoNCiMgTGV2ZW5lIC1UZXN0IA0KDQpgYGB7cn0NCmxpYnJhcnkoY2FyKQ0KbGV2ZW5lVGVzdChBZ2UgfiBFbWJhcmtlZCpQY2xhc3MsIGRhdGEgPSB0aXRhbmljLCBjZW50ZXIgPSAibWVhbiIpDQoNCg0KYGBgDQpEZXIgTGV2ZW5lIFRlc3QgbGllZmVydCB1bnMgbWl0IGVpbmVtIGVtcGlyaXNjaGVuIFdlcnQgdm9uIDMsMzQ3NyB1bmQgZWluZW0gREYgPSA1IGVpbmVuIHAtV2VydCB2b24gMC4wMDUzODgsIGQuaC4gZGVyIFVudGVyc2NoaWVkIGRlciBWYXJpYW56ZW4gaXN0IGJlaSB1bnNlcmVyIElycnR1bXN3YWhyc2NoZWlubGljaGtlaXQgdm9uIDAuMDUga2xlaW5lciwgc29kYXNzIHdpciBkYXZvbiBhdXNnZWhlbiBtw7xzc2VuIGRhc3MgZGllIFZhcmlhbnplbiB6d2lzY2hlbiBkZW4gR3J1cHBlbiBuaWNodCBpZGVudGlzY2ggc2luZC4gRGllIFZhcmlhbnplbiBzaW5kIHNvbWl0IGhldGVyb2dlbiwgc29kYXNzIHdpciBkaWVzIGluIHVuc2VyZXIgQU5PVkEgYmVhY2h0ZW4gIm3DvHNzdGVuIi4gIERhIGRpZSBWYXJpYW56ZW4gbGVpZGVyIG5pY2h0IGdsZWljaCBzaW5kLCBpc3QgZXMgenUgZW1wZmVobGVuIGVpbmUgS29ycmVrdHVyIG1pdGhpbGZlIGRlcyBXZWxjaC1UZXN0cyBkdXJjaHp1ZsO8aHJlbi4NCg0KDQojIEVyZ2Vibmlzc2UgZGVyIG1laHJmYWt0b3JpZWxsZSBWYXJpYW56YW5hbHlzZQ0KDQpgYGB7ciBoaWRlID0gVFJVRX0NCm1laHJBbm92YTEgPC0gbG0oQWdlIH4gRW1iYXJrZWQqUGNsYXNzLCBkYXRhID0gdGl0YW5pYykNCm15QW5vdmEgPC0gQW5vdmEobWVockFub3ZhMSAsIHR5cGUgPSAzKQ0KbXlBbm92YQ0KYGBgDQpgYGB7cn0NCg0KZW1iYXJrZWR3ZWxjaCA8LSBvbmV3YXkudGVzdChBZ2V+RW1iYXJrZWQsIGRhdGEgPSB0aXRhbmljLCB2YXIuZXF1YWwgPSBGKQ0KZW1iYXJrZWR3ZWxjaA0KYGBgDQpEZXIgRi1UZXN0IGbDvHIgZGllIEFiaMOkbmdpZ2tlaXQgZGVyIEFuYWx5c2UgYmV6w7xnbGljaCBkZXMgRWluZmx1c3NlcyBkZXMgQWx0ZXJzIHVuZCBkZW0gRWluc2NoaWZmdW5nc29ydCBiZWkgdW5nbGVpY2hlbiBWYXJpYW56ZW4gaXN0IG5pY2h0IHNpZ25pZmlrYW50LiBELmguIGJlaSBGKDEsMTgzLjE4KSA9ICAwLjg1NDgzIGVyaGFsdGVuIHdpciBlaW5lbiBwLXZhbHVlID0gMC4zNTY0LCBkaWVzZXIgV2VydCBpc3QgZ3LDtnNzZXIgYWxzIHVuc2VyZSBJcnJ0dW1zd2FocnNjaGVpbmxpY2hrZWl0IHZvbiAwLjA1LCBzb2Rhc3Mgd2lyIGhpZXIgdm9uIGtlaW5lbSBzaWduaWZpa2FudGVuIFRlc3QgYXVzZ2VoZW4ga8O2bm5lbi4gRGVyIEVpbnNjaGlmZnVuZ3NvcnQsIGhhdCBrZWluZW4gRWluZmx1c3MgYXVmIGRhcyBBbHRlciB1bnNlcmVyIFBhc3NhZ2llcmUuIA0KDQoNCmBgYHtyfQ0KDQpwY2xhc3N3ZWxjaCA8LSBvbmV3YXkudGVzdChBZ2V+UGNsYXNzLCBkYXRhID0gdGl0YW5pYywgdmFyLmVxdWFsID0gRikNCnBjbGFzc3dlbGNoDQpgYGANCkRlciBGLVRlc3QgZsO8ciBkaWUgQWJow6RuZ2lna2VpdCBkZXIgQW5hbHlzZSBiZXrDvGdsaWNoIGRlcyBFaW5mbHVzc2VzIGRlcyBBbHRlcnMgdW5kIGRlciBQYXNzYWdpZXJrbGFzc2UgYmVpIHVuZ2xlaWNoZW4gVmFyaWFuemVuIGlzdCBzaWduaWZpa2FudC4gRC5oLiBiZWkgRigyLDM1Mi4yMykgPSA1MS40NTMgZXJoYWx0ZW4gd2lyIGVpbmVuIHAtdmFsdWUgPCAyLjJlLTE2LCBkaWVzZXIgV2VydCBpc3Qga2xlaW5lciBhbHMgdW5zZXJlIElycnR1bXN3YWhyc2NoZWlubGljaGtlaXQgdm9uIDAuMDUsIHNvZGFzcyB3aXIgaGllciB2b24gZWluZW0gc2lnbmlmaWthbnRlbiBUZXN0IGF1c2dlaGVuIGvDtm5uZW4uIERpZSBQYXNzYWdpZXJrbGFzc2UsIGhhdCBzb21pdCBlaW5lbiBFaW5mbHVzcyBhdWYgZGFzIEFsdGVyIHVuc2VyZXIgUGFzc2FnaWVyZS4gDQoNCmBgYHtyfQ0KQVhCd2VsY2ggPC0gb25ld2F5LnRlc3QoQWdlfkVtYmFya2VkKlBjbGFzcywgZGF0YSA9IHRpdGFuaWMsIHZhci5lcXVhbCA9IEYpDQpBWEJ3ZWxjaCANCmBgYA0KRGVyIEYtVGVzdCBmw7xyIGRpZSBBYmjDpG5naWdrZWl0IGRlciBBbmFseXNlIGJlesO8Z2xpY2ggZGVzIEVpbmZsdXNzZXMgZGVzIEFsdGVycyB1bmQgZGVyIEtvbWJpbmF0aW9uIGF1cyBFaW5zY2hpZmZ1bmdzb3J0ICYgUGFzc2FnaWVya2xhc3NlIGJlaSB1bmdsZWljaGVuIFZhcmlhbnplbiBpc3Qgc2lnbmlmaWthbnQuIEQuaC4gYmVpIEYoNSwxMDQuNTYpID0gMjIuODA4IGVyaGFsdGVuIHdpciBlaW5lbiBwLXZhbHVlID0gMi4wNTFlLTE1LiBEaWVzZXIgV2VydCBpc3Qga2xlaW5lciBhbHMgdW5zZXJlIElycnR1bXN3YWhyc2NoZWlubGljaGtlaXQgdm9uIDAuMDUsIHNvZGFzcyB3aXIgaGllciB2b24gZWluZW0gc2lnbmlmaWthbnRlbiBUZXN0IGF1c2dlaGVuIGvDtm5uZW4uIERpZSBQYXNzYWdpZXJrbGFzc2UgaW4gS29tYmluYXRpb24gbWl0IGRlbSBFaW5zY2hpZmZ1bmdzb3J0IGhhdCBzb21pdCBlaW5lbiBFaW5mbHVzcyBhdWYgZGFzIEFsdGVyIHVuc2VyZXIgUGFzc2FnaWVyZS4gDQoNCg0KIyBQb3N0LUhvYy1UZXN0DQoNCkJpcyBoaWVyIGhlciBoYWJlbiB3aXIgaGVyYXVzZ2VmdW5kZW4gZGFzcyBkaWUgUGFzc2FnaWVya2xhc3NlIHVuZCBkaWUgSW50ZXJha3Rpb24gZGVyIFBhc3NhZ2llcmtsYXNzZSBtaXQgZGVtIEVpbnNjaGlmZnVuZ3NvcnQgc2lnbmlmaWthbnQgc2luZCBpbiBpaHJlbSBFaW5mbHVzcyBhdWYgZGFzIEFsdGVyIGRlciBQYXNzYWdpZXJlLiBJbSBGb2xnZW5kZW4gd29sbGVuIHdpciBoZXJhdXNmaW5kZW4gd2VsY2hlIFBhc3NhZ2llcmtsYXNzZSBlaW5lbiBFaW5mbHVzcyBoYXQgYXVmIGRhcyBBbHRlciBoYXQuIEhpZXJmw7xyIGbDvGhyZW4gd2lyIGVpbmVuIFR1a2V5SFNEIFRlc3QgZHVyY2guIFp1IGRpZXNlbSBad2VjayB3ZXJkZW4gVHVrZXkta29ycmlnaWVydGUgTWVocmZhY2h2ZXJnbGVpY2hlIGJlcmVjaG5ldC4NCg0KRGEgd2lyIGJlaW0gVHVrZXlIU0QgVGVzdHZlcmZhaHJlbiBtZWhyZXJlIHQtVGVzdCBkdXJjaGbDvGhyZW4gd2VsY2hlIG5pY2h0IHVuYWJow6RuZ2lnIHZvbmVpbmFuZGVyIHNpbmQsIGQuaC4gd2lyIGhhYmVuIGRhcyBSaXNpa28gZGVuIGlkZW50aXNjaGVuIFp1ZmFsbHNmZWhsZXIgbWVocm1hbHMgenUgbWVzc2VuIGtvcnJpZ2llcmVuIHdpciBiZWltIFR1a2V5SFNEIFRlc3QgYXV0b21hdGlzY2ggZGllIElycnVtc3dhaHJzY2hlaW5saWNoa2VpdC4gSGllcmJlaSB3aXJkIM6xIGR1cmNoIGRpZSBBbnphaGwgZGVyIFBhYXJ2ZXJnbGVpY2hlIGRpdmlkaWVydC4gV2lyIGvDtm5uZW4gYWxzbyBzb21pdCBkZW4gYWRqdXN0aWVydGVuIHAtVmFsdWUgZ2VnZW4gdW5zZXJlIElycnR1bXN3YWhyc2NoZWlubGljaGtlaXQgdm9uIEFscGhhID0gMC4wNSB0ZXN0ZW4uIEluIGRpZXNlbSBGYWxsIGlzdCBuID0gMTUsIHNvZGFzcyB3aXIgYWxwaGEvMTUgdGVpbGVuIHdlcmRlbi4NCg0KDQpgYGB7cn0NClBvc3RIb2MgPC0gYW92KEFnZX5FbWJhcmtlZCpQY2xhc3MsIGRhdGE9dGl0YW5pYykgDQoNClR1a2V5SFNEKFBvc3RIb2MpDQpgYGANCldpZSB3aXIgYmVyZWl0cyB2ZXJtdXRldCBoYWJlbiwgaGF0IGRlciBFaW5zY2hpZmZ1bmdzaGFmZW4ga2VpbmVuIHNpZ25pZmthbnRlbiBFaW5mbHVzcyBhdWYgZGFzIEFsdGVyIGRlciBQYXNzYWdpZXJlLiBIaW5nZWdlbiBrw7ZubmVuIHdpciBlcmtlbm5lbiBkYXMgYWxsZSBQYXNzYWdpZXJrbGFzc2VuIGVpbmVuIGdsb2JhbGVuIEVmZmVrdCBhdWYgZGFzIEFsdGVyIGRlciBQYXNzYWdpZXJlIGhhYmVuLiBIaWVyIGvDtm5uZW4gd2lyIHNvZ2FyIHZvbiBlaW5lbSBnbG9iYWxlbiBFZmZla3Qgc3ByZWNoZW4uIEQuaC4gZGllIFBhc3NhZ2llcmtsYXNzZW4gaGFiZW4gaW1tZXIgZWluZW4gRWZmZWt0IGF1ZiBkYXMgQWx0ZXIgdW5zZXJlciBQYXNzYWdpZXJlLiBXZW5uIHdpciB1bnMgZGVuIEJveHBsb3QgdW5kIGRlbiBNaXR0ZWx3ZXJ0cGxvdCB3aWVkZXIgaW4gRXJpbm5lcnVuZyBydWZlbiwga2FubiBtYW4gc2FnZW4gZGFzcyBpbiBkZXIgZXJzdGVuIEtsYXNzZSBpbW1lciBkaWUgw6RsdGVyZW4gUGVyc29uZW4gbWl0ZmFocmVuIGltIFZlcmdsZWljaCB6dSBkZW4gYW5kZXJlbiB1bmQgZGFzcyB3aXIgYXVjaCBpbiBkZXIgendlaXRlbiBLbGFzc2Ugw6RsdGVyZSBQYXNzYWdpZXJlIGhhYmVuIGFscyBpbiBkZXIgZHJpdHRlbiBLbGFzc2UuIA0KDQpCZXRyYWNodGVuIHdpciBpbSBuw6RjaHN0ZW4gU2Nocml0dCBkaWUgS29tYmluYXRpb24gZGVyIFBhc3NhZ2llcmtsYXNzZSBtaXQgZGVtIEVpbnNjaGlmZnVuZ3NoYWZlbi4gSGllciBzZWhlbiB3aXIgZGFzcyBmb2xnZW5kZSBLb21iaW5hdGlvbmVuIGtlaW5lbiBFZmZla3QgaGFiZW46DQoNClNvdXRoYW1wdG9uOjEgQ2xhc3MtQ2hlcmJvdXJnOjEgQ2xhc3MgPGJyPg0KU291dGhhbXB0b246MiBDbGFzcy1DaGVyYm91cmc6MiBDbGFzcyA8YnI+DQpDaGVyYm91cmc6MyBDbGFzcy1DaGVyYm91cmc6MiBDbGFzcyAgPGJyPg0KU291dGhhbXB0b246MyBDbGFzcy1DaGVyYm91cmc6MiBDbGFzcyA8YnI+DQpTb3V0aGFtcHRvbjozIENsYXNzLUNoZXJib3VyZzozIENsYXNzIDxicj4NCg0KQXVmZ3J1bmQgZGVyIExpc3RlIGvDtm5uZW4gd2lyIGF1Y2ggc2NobmVsbCBlcmtlbm5lbiBkYXNzIHdpciBrZWluZW4gZ2xvYmFsZW4gRWZmZWt0IGhhYmVuIGJlaSBkZXIgS29tYmluYXRvcmlrIGRlciBEYXRlbi4gV2lyIGvDtm5uZW4gc29taXQgbmljaHQgcGF1c2NoYWwgc2FnZW4gZGFzcyBlaW5lIEtvbWJpbmF0aW9uIGVpbmVuIGdsb2JhbGVuIEVmZmVrdCBoYXQgdW5kIHNvbWl0IHBhdXNjaGFsIGVpbmVuIEVmZmVrdCBoYXQgYXVmIGRhcyBBbHRlciBkZXIgUGFzc2FnaWVyZS4NCg0KIyBQYXJ0aWVsbGVzIEV0YS1RdWFkcmF0DQoNCkRhcyBwYXJ0aWVsbGUgRXRhLVF1YWRyYXQgKHBhcnRpZWxsZXMgzrcyKSBpc3QgZWluIE1hc3MgZsO8ciBkaWUgRWZmZWt0Z3LDtnNzZTogRXMgc2V0enQgZGllIFZhcmlhdGlvbiwgZGllIGR1cmNoIGVpbmVuIEZha3RvciBlcmtsw6RydCB3aXJkLCBpbiBCZXp1ZyBtaXQgamVuZXIgVmFyaWF0aW9uLCBkaWUgbmljaHQgZHVyY2ggYW5kZXJlIEZha3RvcmVuIGltIE1vZGVsbCBlcmtsw6RydCB3aXJkLiBEYXMgaGVpc3N0LCBlcyB3aXJkIGF1c3NjaGxpZXNzbGljaCBqZW5lIFZhcmlhdGlvbiBiZXRyYWNodGV0LCB3ZWxjaGUgbmljaHQgZHVyY2ggZGllIGFuZGVyZW4gRmFrdG9yZW4gaW0gTW9kZWxsIGVya2zDpHJ0IHdpcmQuIERhcyBwYXJ0aWVsbGUgRXRhLVF1YWRyYXQgemVpZ3QsIHdlbGNoZW4gQW50ZWlsIGRhdm9uIGVpbiBGYWt0b3IgZXJrbMOkcnQ6DQoNCmBgYHtyIGhpZGUgPSBUUlVFfQ0KbGlicmFyeShzanN0YXRzKQ0KZXRhIDwtIGVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKG1laHJBbm92YTEsIHBhcnRpYWwgPSBUUlVFKQ0KZXRhDQpgYGANCg0KIyBCZXJlY2hudW5nIGRlciBFZmZla3RzdMOkcmtlDQoNCjxiPiBFZmZla3RzdMOkcmtlIGbDvHIgZGVuIEVpbnNjaGlmZnVuZ3NoYWZlbiA8L2I+DQoNCmBgYHtyfQ0KDQplZmZlbWJhcmtlZCA8LSBzcXJ0KGV0YSRFdGEyWzFdLygxLWV0YSRFdGEyWzFdKSkNCg0Kc3ByaW50ZigiRWZmZWt0c3TDpHJrZSBmw7xyIGRlbiBFaW5zY2hpZmZ1bmdzaGFmZW46IGY9ICUuM2YiLCBlZmZlbWJhcmtlZCkNCg0KYGBgDQpadXIgQWJydW5kdW5nIGRlcyBHYW56ZW4gVGhlbWFzLCB6ZWlndCBhdWNoIGRpZSBFZmZla3RzdMOkcmtlIGRlcyBFaW5zY2hpZmZ1bmdzaGFmZW4ga2VpbmVuIEVpbmZsdXNzIGF1ZiBkYXMgQWx0ZXIgZGVyIFBhc3NhZ2llcmUuSGllciBsaWVndCBrZWluIEVmZmVrdCB2b3IuIA0KDQpmID0gLjEwIGVudHNwcmljaHQgZWluZW0gc2Nod2FjaGVuIEVmZmVrdCANCmYgPSAuMjUgZW50c3ByaWNodCBlaW5lbSBtaXR0bGVyZW4gRWZmZWt0IA0KZiA9IC40MCBlbnRzcHJpY2h0IGVpbmVtIHN0YXJrZW4gRWZmZWt0DQoNCjxiPiBFZmZla3RzdMOkcmtlIGbDvHIgZGllIFBhc3NhZ2llcmtsYXNzZSA8L2I+DQoNCmBgYHtyfQ0KDQplZmZwY2xhc3MgPC0gc3FydChldGEkRXRhMlsyXS8oMS1ldGEkRXRhMlsyXSkpDQoNCnNwcmludGYoIkVmZmVrdHN0w6Rya2UgZsO8cnMgQ2xhc3M6IGY9ICUuM2YiLCBlZmZwY2xhc3MpDQoNCmBgYA0KQmVpIGRlciBQYXNzYWdpZXJrbGFzc2UgbGllZ3QgbWl0IGYgPSAwLjQxNCBlaW4gc2VociBzdGFya2VyIEVmZmVrdCB2b3IuIA0KDQpmID0gLjEwIGVudHNwcmljaHQgZWluZW0gc2Nod2FjaGVuIEVmZmVrdCANCmYgPSAuMjUgZW50c3ByaWNodCBlaW5lbSBtaXR0bGVyZW4gRWZmZWt0IA0KZiA9IC40MCBlbnRzcHJpY2h0IGVpbmVtIHN0YXJrZW4gRWZmZWt0DQoNCjxiPiBFZmZla3RzdMOkcmtlIGbDvHIgZGllIEludGVyYWt0aW9uIDwvYj4NCg0KYGBge3J9DQoNCmVmZkF4QiA8LSBzcXJ0KGV0YSRFdGEyWzNdLygxLWV0YSRFdGEyWzNdKSkNCg0Kc3ByaW50ZigiRWZmZWt0c3TDpHJrZSBkZXIgSW50ZXJha3Rpb24gendpc2NoZW4gS2xhc3NlIHVuZCBIYWZlbjogZj0gJS4zZiIsIGVmZkF4QikNCg0KYGBgDQpBdWNoIGhhYmVuIHdpciBiZWkgZGVyIEludGVyYWt0aW9uIGRlciBLYXRlZ29yaWVuIGtlaW5lbiBFZmZla3QsIGRhIGRlciBXZXJ0IHZvbiBmID0gMC4wODEgPCAwLjEwIGxpZWd0Lg0KDQpmID0gLjEwIGVudHNwcmljaHQgZWluZW0gc2Nod2FjaGVuIEVmZmVrdCANCmYgPSAuMjUgZW50c3ByaWNodCBlaW5lbSBtaXR0bGVyZW4gRWZmZWt0IA0KZiA9IC40MCBlbnRzcHJpY2h0IGVpbmVtIHN0YXJrZW4gRWZmZWt0DQoNCiMgRWluZSBBdXNzYWdlDQoNCkRpZSBNaXR0ZWx3ZXJ0ZSBkZXIgR3J1cHBlbiBsYXNzZW4gc2ljaCBudXIgZHVyY2ggZGllIFBhc3NhZ2llcmtsYXNzZSBlcmtsw6RyZW4gdW5kIGRpZXMgYXVjaCBtaXQgZWluZW0gc3RhcmtlbiBFZmZla3QsIGRlciBFaW5zY2hpZmZ1bmdzaGFmZW4gaGF0IGtlaW5lbiBFaW5mbHVzcyBhdWYgZGllIEFsdGVyc3ZlcnRlaWx1bmcgYXVmIGRlbSBTY2hpZmYuIFNvbWl0IHdpcmQgZGllIEh5cG90aGVzZSBIMV9QY2xhc3MgYmVzdMOkdGlndCwgd8OkaHJlbmQgSDFfaGFyYm9yIHVuZCBIMV9pbnRlcmFjdGlvbiB2ZXJ3b3JmZW4gd2VyZGVuLg0KDQoNCg0KDQoNCg==