library(dplyr) # <%<
library(ggplot2) #Diagramme

Hypothese

H0: Das Gewicht der Testpersonen unterscheidet sich nicht zu verschiedenen Messzeitpunkten. \[M_{T0} = M_{T1} = M_{T2}= M_{T3} \]

H1: Das Gewicht der Testpersonen unterscheidet sich zu verschiedenen Messzeitpunkten.

\[M_{T0} \neq M_{T1} \neq M_{T2}\neq M_{T3} \rightarrow \text{min. in einem Vergleich}\]

Voraussetzungen der einfaktoriellen Varianzanalyse mit Messwiederholung

Die abhängige Variable ist intervallskaliert -> Die Variable “Gewicht” ist ratioskaliert.

Die abhängige Variable ist normalverteilt innerhalb jedes Messzeitpunktes (Ab > 25 Probanden pro Messzeitpunkt sind Verletzungen in der Regel unproblematisch) -> siehe Histogrammm oder QQ-Plot

Sphärizität ist gegeben -> siehe Mauchly-Test auf Sphärizität

Voraussetzungsprüfung

Normalverteilung der Daten mithilfe des Histogrammes


mitmess %>%
  group_by(Zeitpunkt) %>%
  ggplot(aes(Gewicht, color=Zeitpunkt)) + 
  geom_histogram(aes(fill = Zeitpunkt), bins = 20) +
  facet_wrap(~Zeitpunkt) +
  theme_grey()+
  labs(x= "Gewicht in kg",y = "Anzahl" )

Die Daten sind augenscheinlich eher nicht normalverteilt. Daher sollte der Friedman bevorzugt werden. Allerdings im Rahmen der Übungen und unter Anbetracht der Größe der Daten wird die Normalverteilung als gegeben angesehen.

ggplot(mitmess, 
aes(Gewicht, 
color=Zeitpunkt
)
) +
geom_histogram(binwidth=1, 
aes(fill = Zeitpunkt), 
bins = 20,
show.legend = TRUE 
) +
geom_density(aes(y = ..count.., 
fill = Zeitpunkt
), 
alpha=0.2, 
colour = "black",
size = 0.3,
show.legend = TRUE
) +
theme(panel.background = element_rect(size = 0.5, fill = "gray91", colour = "gray", linetype='solid'),
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "gray45"),
panel.grid.minor = element_line(size = 0.5, linetype = 'solid', colour = "gray"),
plot.background = element_rect(fill = "moccasin")
)+
scale_fill_discrete(name = "Untersuchte Zeitpunkte", 
breaks = c("T0", "T1", "T2", "T3"),
labels = c("T0 - mit Start des Trainings", 
"T1 - nach 1 Woche Training", 
"T2 - nach 2 Wochen Training",
"T3 - nach 3 Wochen Training"
),
aesthetics = "fill" # Die System-Farben werden verwendet.
)+
guides(#fill = FALSE, # Mit "fill = FALSE" werden alle Legenden (automatisch,manuell) abgeschaltet.
color = FALSE
) + 
facet_wrap(~ Zeitpunkt, 
ncol = 2
) + 
labs(title = "Histogramme",
subtitle = "xxx",
x = "Gewicht",
y = "Anzahl"
) 

Deskriptive Statistik

Die Tabellegibt die Mittelwerte, Standardabweichungen und Grössen aller vier Messzeitpunkte wieder. Diese Informationen werden für die Berichterstattung verwendet.

mitmess %>%
group_by(Zeitpunkt) %>%
  summarize(Anzahl = n(), Mittelwert = mean(Gewicht), Median = median(Gewicht), Standardabweichung = sd(Gewicht)) %>%
  mutate_if(is.numeric, round, 2)
`summarise()` ungrouping output (override with `.groups` argument)

Es gibt einen Mittelwertsunterschied zwischen den Messzeitpunkten. Vor dem Training wogen die Teilnehmer im Mittel 85,97 kg (SD = 8.82, n=73). Nach einer Woche Training lag das Gewicht bei 81.86 (SD = 9.07,n=73). In der zweiten Woche bei 77.97 kg(SD=9.17,n=73). In der letzten Woche haben die Teilnehmer nur noch 73.03 kg im Schnitt(SD=9.39,n=73) gewogen. Damit haben Sie innerhalb von vier Wochen 12 kg abgenommen.

Hinweis Die Zahl der Daten sollte identsich sein. Hier sind es immer 73 Personen.

Mauchly-Test auf Sphärizität

Eine Voraussetzung für die Durchführung einer Varianzanalyse mit Messwiederholung ist die sogenannte “Compound symmetry”: Diese ist gegeben, wenn die Stichprobenvarianzen der einzelnen Messzeitpunkte homogen und die Korrelationen zwischen jedem Paar von Messzeitpunkten identisch sind, wenn folglich homogene Stichprobenvarianzen und -korrelationen vorliegen.

Sphärizität ist eine etwas weniger restriktive Form der “Compound symmetry”. Sphärizität liegt vor, wenn die Varianzen der Differenzen zwischen jeweils zwei Messzeitpunkten gleich sind. Dieser Test ist folglich erst ab drei Messzeitpunkten relevant (bei zwei Messzeitpunkten nur ein Paar). Um die Voraussetzung der Sphärizität zu überprüfen, wird der Mauchly-Test durchgeführt. Ist der Mauchly-Test nicht signifikant, so kann von Sphärizität ausgegangen werden. Wäre der Mauchly-Test aber signifikant, so läge keine Sphärizität vor.

Ist die Voraussetzung der Sphärizität nicht erfüllt, so werden die Freiheitsgrade der Signifikanztests angepasst, indem sie mit einem Korrekturfaktor Epsilon (ε) multipliziert werden. R gibt einerseits das Epsilon nach Greenhouse-Geisser aus, andererseits das Epsilon nach Huynh-Feldt. Das erstere ist etwas restriktiver und wird daher bei stärkeren Verletzungen der Annahme der Sphärizität eingesetzt: Ist das Epsilon nach Greenhouse-Geisser < .75, so wird die Korrektur nach Greenhouse-Geisser verwendet. Ist das Epsilon nach Greenhouse-Geisser > .75, so wird die Korrektur nach Huynh-Feldt eingesetzt.

H0 :Die Varianzen der Differenzen zwischen jeweils zwei Messzeitpunkten sind gleich.
H1 :Die Varianzen der Differenzen zwischen jeweils zwei Messzeitpunkten sind nicht gleich.

Ist das Epsilon: p > 0.05 => Ergebnis nicht Signifikant –> Sphärizität
Ist das Epsilon: p < 0.05 => Ergebnis Signifikant –> keine Sphärizität-> Wenn dies der Fall ist, müssen die Freiheitsgrade mit dem Korrekturfaktor angepasst werden.

-> Ist Epsilon < 0.75 ->Greenhouse-Geisser
-> Ist Epsilon > 0.75 ->Huynh-Feldt

Ergebnisse der einfaktoriellen Varianzanalyse mit Messwiederholung

Die Tabelle gibt den Signifikanztest für den sogenannten “Haupteffekt” der Messwiederholung aus. Ein Haupteffekt ist der direkte Effekt eines Faktors auf die abhängige Variable. Es geht bei Innersubjekteffekten um Unterschiede innerhalb von Personen, nicht zwischen Personen.

Da von keine Sphärizität ausgegangen werden kann, müssen die Freiheitsgrade korrigiert werden. Muss eine Korrektur der Tests verwendet werden, so wird entsprechend die Zeile “Greenhouse-Geisser” oder “Huynh-Feldt” berichtet, je nachdem welche der beiden Korrekturen angebracht ist.

library(afex)
Paket 㤼㸱afex㤼㸲 wurde unter R Version 3.6.3 erstelltLade n昼㸶tiges Paket: lme4
Paket 㤼㸱lme4㤼㸲 wurde unter R Version 3.6.3 erstelltLade n昼㸶tiges Paket: Matrix
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 methods overwritten by 'car':
  method                          from
  influence.merMod                lme4
  cooks.distance.influence.merMod lme4
  dfbeta.influence.merMod         lme4
  dfbetas.influence.merMod        lme4
************
Welcome to afex. For support visit: http://afex.singmann.science/
- Functions for ANOVAs: aov_car(), aov_ez(), and aov_4()
- Methods for calculating p-values with mixed(): 'KR', 'S', 'LRT', and 'PB'
- 'afex_aov' and 'mixed' objects can be passed to emmeans() for follow-up tests
- NEWS: library('emmeans') now needs to be called explicitly!
- Get and set global package options with: afex_options()
- Set orthogonal sum-to-zero contrasts globally: set_sum_contrasts()
- For example analyses see: browseVignettes("afex")
************

Attache Paket: 㤼㸱afex㤼㸲

The following object is masked from 㤼㸱package:lme4㤼㸲:

    lmer
anova <- aov_car(Gewicht~Error(ID/Zeitpunkt), data = mitmess, return ="univariate")
anova

Univariate Type III Repeated-Measures ANOVA Assuming Sphericity

             Sum Sq num Df Error SS den Df F value    Pr(>F)    
(Intercept) 1855225      1    23656     72  5646.7 < 2.2e-16 ***
Zeitpunkt      6682      3      287    216  1676.5 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Mauchly Tests for Sphericity

          Test statistic    p-value
Zeitpunkt        0.16501 8.7603e-26


Greenhouse-Geisser and Huynh-Feldt Corrections
 for Departure from Sphericity

           GG eps Pr(>F[GG])    
Zeitpunkt 0.50228  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

             HF eps   Pr(>F[HF])
Zeitpunkt 0.5106859 1.283111e-77

Ist das Epsilon: p > 0.05 => Ergebnis nicht Signifikant –> Sphärizität Ist das Epsilon: p < 0.05 => Ergebnis Signifikant –> keine Sphärizität-> Wenn dies der Fall ist, müssen die Freiheitsgrade mit dem Korrekturfaktor angepasst werden. -> Ist Epsilon < 0.75 ->Greenhouse-Geisser -> Ist Epsilon > 0.75 ->Huynh-Feldt

out5b <- aov_car(Gewicht~Error(ID/Zeitpunkt), data = mitmess)
out6a <- anova(out5b, es="pes", correction="none", intercept= TRUE)
out6b <- anova(out5b, es="pes", correction="GG")
out6c <- anova(out5b, es="pes", correction="HF")
out6 <- rbind("nicht Korrigiert"=out6a, "Greenhouse-Geisser"=out6b, "Huynh-Feldt"=out6c)
out6
Anova Table (Type 3 tests)

Response: Gewicht
                             num Df den Df    MSE      F     pes    Pr(>F)    
nicht Korrigiert.(Intercept) 1.0000  72.00 328.55 5646.7 0.98741 < 2.2e-16 ***
nicht Korrigiert.Zeitpunkt   3.0000 216.00   1.33 1676.5 0.95882 < 2.2e-16 ***
Greenhouse-Geisser           1.5068 108.49   2.64 1676.5 0.95882 < 2.2e-16 ***
Huynh-Feldt                  1.5321 110.31   2.60 1676.5 0.95882 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Die Korrektur in diesem Beispiel wird nach Greenhouse-Geisser durchgeführt, dass bedeutet die Freiheitsgrade werden mit dem Greenhouse-Geisser Eplison multipliziert.

\[df1 = 3*0.50228 \rightarrow 1.506\] \[df2 = 216*0.50228 \rightarrow 108.49\]

Die Freiheitsgrade entnehmen wir der dritte Zeile von “out6”.

Eine Varianzanalyse mit Messwiederholung zeigt, dass sich das Training der ProbandInnen je nach Messzeitpunkt unterscheidet. (F(1.506,108.49) = 1676.5, p = .000, n = 73).

ALTERNATIVE

nicht zu empfehlen

mitmess$Zeitpunkt = as.factor(mitmess$Zeitpunkt)
mitmess$ID = as.factor(mitmess$ID)
library(ez)
Paket 㤼㸱ez㤼㸲 wurde unter R Version 3.6.3 erstellt
anova1 <- ezANOVA(mitmess, dv = Gewicht, wid = ID, within = Zeitpunkt, detailed = TRUE)
anova1
$ANOVA

$`Mauchly's Test for Sphericity`

$`Sphericity Corrections`
NA
df1 <- anova1$ANOVA$DFn[2]*anova1$`Sphericity Corrections`$GGe
df1
[1] 1.506844
df2 <- anova1$ANOVA$DFd[2]*anova1$`Sphericity Corrections`$GGe
df2
[1] 108.4927

Post-hoc-Tests

Obwohl der F-Test zeigt, dass ein Haupteffekt der Training besteht, muss anhand von Post-hoc-Tests geklärt werden, zwischen welchen Messzeitpunkten signifikante Unterschiede bezüglich der Konzentrationsfähigkeit bestehen.

\[\frac{k*(k-1)}{2}=\frac{4*(4-1)}{2}= \frac{12}{2} =6\]

Bei der Berechnung von Post-hoc-Tests wird im Prinzip für jede Kombination von zwei Mittelwerten ein Vergleich durchgeführt. Im aktuellen Beispiel mit vier Gruppen sind dies 6 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 zehn solcher Paarvergleiche vorgenommen, so beträgt die Nicht-Eintreffens-Wahrscheinlichkeit des Alpha-Fehlers (.95)6 = .735.

Um die Wahrscheinlichkeit des Eintreffens des Alpha-Fehlers zu bestimmen, wird 1 - .735 = .265 gerechnet.

Die Wahrscheinlichkeit des Eintreffens des Alpha-Fehlers liegt somit bei 26.5%. Diese Fehlerwahrscheinlichkeit wird als “Familywise Error Rate” bezeichnet.

Hierbei wird α durch die Anzahl der Paarvergleiche dividiert. Im hier aufgeführten Fall ist dies .05/6 = .008.

pairwise.t.test(mitmess$Gewicht, 
                mitmess$Zeitpunkt, 
                p.adjust.method = "none", 
                paired = TRUE, 
                data = mitmess)

Es wird ersichtlich, dass alle vier Messzeitpunkt sich signifikant unterscheiden(p < .008). Daher lassen sich für eigenständige Gruppen bilden. Diese vier Gruppen sind generalisierbar.

Profildiagramm

ggplot(mitmess, aes(x=Zeitpunkt, y=Gewicht, group=1))+
  stat_summary(fun = mean, geom="point", size=3)+
  stat_summary(fun = mean, geom="line")+
  stat_summary(fun.data = mean_cl_normal, geom="errorbar",width=.2, size=.25)+
  labs(x="Zeitpunkt", y="Gewicht in kg")+
  theme_classic()

Ea zeigt sich, dass die Gewichtsreduzierung mithilfe des Training erfolgreich ist.

Das partielle Eta-Quadrat

Das partielle Eta-Quadrat (partielles η2) ist ein Mass für die Effektgrösse:

Während bei eta² angegeben wird, wie viel der Gesamtvariation durch einen Effekt erklärt wird, ist es beim partiellen eta2 lediglich der Anteil der Effektvariation an der Summe aus Effekt- und Residualvariation.

\[ eta_p^2 = \frac{QS_{Treatment}}{QS_{Treatment}+QS_{Residual}}\]

sprintf("Partielle Eta-Quadrat für 'Zeitpunkt': eta= %.4f", out6a$pes[2])
[1] "Partielle Eta-Quadrat für 'Zeitpunkt': eta= 0.9588"

Im vorliegenden Beispiel beträgt das partielle Eta-Quadrat .9588. Das heisst, es wird 95,88% der Variation der Gewichtsreduktion durch die Messzeite aufgeklärt.

Berechnung der Effektstärke

Um die Bedeutsamkeit eines Ergebnisses zu beurteilen, werden Effektstärken berechnet. Im Beispiel sind zwar einige der Mittelwertsunterschiede zwar signifikant, doch es stellt sich die Frage, ob sie gross genug sind, um als bedeutend eingestuft zu werden.

Da R das partielle Eta-Quadrat ausgibt, wird dieses hier in die Effektstärke nach Cohen (1992) umgerechnet. In diesem Fall befindet sich die Effektstärke immer zwischen 0 und unendlich.

\[f=\sqrt\frac{\eta^{2}}{1-\eta^{2}}=\sqrt\frac{eta^{2}}{1-eta^{2}}\]


eff <- sqrt(out6a$pes[2]/(1-out6a$pes[2]))

sprintf("Effektstärke: f= %.3f",eff)

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} \]

Damit entsprechen die Effektstärken von 4.825 einem starken Effekt.

Eine Aussage

Eine Varianzanalyse mit Messwiederholung zeigt, dass sich das Training der ProbandInnen je nach Messzeitpunkt unterscheidet. (F(1.51,108.49) = 1676.5, p = .000, partielles η2 = .9588, n = 73). Der Mauchly-Test ergab, dass keine Sphärizität gegeben ist, weshalb die Greenhouse-Geisser-Korrektur angewendet wurde (ϵ = .50228), wodurch sich korrigierte Freiheitsgrade ergeben.

Der Post-Hoc-Test zeigt, dass das Training der ProbandInnen zum Messzeitpunkt T0 (vor dem Training)(M = 85.97, SD = 8.82, n = 73) signifikant höher als zu Messzeitpunkt T1(erste Woche)(M = 81.86, SD = 9.07, n = 73) , Messzeitpunkt T2(zweite Woche) (M = 77.97, SD = 9.17, n = 73) und Messzeitpunkt T3(dritte Woche)(M = 73.02, SD = 9.39, n = 73). Die Teilnehmer haben im Schnitt 12 kg abgenommen.

Es können vier Gruppen generalisiert werden. Zu Beginn des Trainings gewiegen die Teilnehmer am meistern und den vier Einheiten am wenigsten. Das Training ist ein Erfolg.

Die Effektstärke liegt bei f=4.82 und entspricht damit nach Cohen (1988) einem starken Effekt.

H0 kann verworfen werden, H1 angenommen.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCg0KYGBge3Igd2FybmluZz1UUlVFfQ0KbGlicmFyeShkcGx5cikgIyA8JTwNCmxpYnJhcnkoZ2dwbG90MikgI0RpYWdyYW1tZQ0KYGBgDQoNCiMgSHlwb3RoZXNlDQoNCkgwOiBEYXMgR2V3aWNodCBkZXIgVGVzdHBlcnNvbmVuIHVudGVyc2NoZWlkZXQgc2ljaCBuaWNodCB6dSB2ZXJzY2hpZWRlbmVuIE1lc3N6ZWl0cHVua3Rlbi4NCiQkTV97VDB9ID0gTV97VDF9ID0gTV97VDJ9PSBNX3tUM30gJCQNCg0KSDE6IGRhcyBHZXdpY2h0IGRlciBUZXN0cGVyc29uZW4gdW50ZXJzY2hlaWRldCBzaWNoIHp1IHZlcnNjaGllZGVuZW4gTWVzc3plaXRwdW5rdGVuLg0KDQokJE1fe1QwfSBcbmVxIE1fe1QxfSBcbmVxIE1fe1QyfVxuZXEgTV97VDN9IFxyaWdodGFycm93IFx0ZXh0e21pbi4gaW4gZWluZW0gVmVyZ2xlaWNofSQkDQoNCiMgVm9yYXVzc2V0enVuZ2VuIGRlciBlaW5mYWt0b3JpZWxsZW4gVmFyaWFuemFuYWx5c2UgbWl0IE1lc3N3aWVkZXJob2x1bmcNCg0KRGllIGFiaMOkbmdpZ2UgVmFyaWFibGUgaXN0IGludGVydmFsbHNrYWxpZXJ0IC0+IERpZSBWYXJpYWJsZSAiR2V3aWNodCIgaXN0IHJhdGlvc2thbGllcnQuDQoNCkRpZSBhYmjDpG5naWdlIFZhcmlhYmxlIGlzdCBub3JtYWx2ZXJ0ZWlsdCBpbm5lcmhhbGIgamVkZXMgTWVzc3plaXRwdW5rdGVzIChBYiA+IDI1IFByb2JhbmRlbiBwcm8gTWVzc3plaXRwdW5rdCBzaW5kIFZlcmxldHp1bmdlbiBpbiBkZXIgUmVnZWwgdW5wcm9ibGVtYXRpc2NoKSAtPiBzaWVoZSBIaXN0b2dyYW1tbSBvZGVyIFFRLVBsb3QNCg0KU3Bow6RyaXppdMOkdCBpc3QgZ2VnZWJlbiAtPiBzaWVoZSBNYXVjaGx5LVRlc3QgYXVmIFNwaMOkcml6aXTDpHQNCg0KIyBWb3JhdXNzZXR6dW5nc3Byw7xmdW5nIA0KIyMjIyBOb3JtYWx2ZXJ0ZWlsdW5nIGRlciBEYXRlbiBtaXRoaWxmZSBkZXMgSGlzdG9ncmFtbWVzDQoNCg0KYGBge3J9DQoNCm1pdG1lc3MgJT4lDQogIGdyb3VwX2J5KFplaXRwdW5rdCkgJT4lDQogIGdncGxvdChhZXMoR2V3aWNodCwgY29sb3I9WmVpdHB1bmt0KSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGwgPSBaZWl0cHVua3QpLCBiaW5zID0gMjApICsNCiAgZmFjZXRfd3JhcCh+WmVpdHB1bmt0KSArDQogIHRoZW1lX2dyZXkoKSsNCiAgbGFicyh4PSAiR2V3aWNodCBpbiBrZyIseSA9ICJBbnphaGwiICkNCg0KYGBgDQpEaWUgRGF0ZW4gc2luZCBhdWdlbnNjaGVpbmxpY2ggZWhlciBuaWNodCBub3JtYWx2ZXJ0ZWlsdC4gRGFoZXIgc29sbHRlIGRlciBGcmllZG1hbiBiZXZvcnp1Z3Qgd2VyZGVuLiBBbGxlcmRpbmdzIGltIFJhaG1lbiBkZXIgw5xidW5nZW4gdW5kIHVudGVyIEFuYmV0cmFjaHQgZGVyIEdyw7bDn2UgZGVyIERhdGVuIHdpcmQgZGllIE5vcm1hbHZlcnRlaWx1bmcgYWxzIGdlZ2ViZW4gYW5nZXNlaGVuLg0KDQpgYGB7cn0NCmdncGxvdChtaXRtZXNzLCANCmFlcyhHZXdpY2h0LCANCmNvbG9yPVplaXRwdW5rdA0KKQ0KKSArDQpnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0xLCANCmFlcyhmaWxsID0gWmVpdHB1bmt0KSwgDQpiaW5zID0gMjAsDQpzaG93LmxlZ2VuZCA9IFRSVUUgDQopICsNCmdlb21fZGVuc2l0eShhZXMoeSA9IC4uY291bnQuLiwgDQpmaWxsID0gWmVpdHB1bmt0DQopLCANCmFscGhhPTAuMiwgDQpjb2xvdXIgPSAiYmxhY2siLA0Kc2l6ZSA9IDAuMywNCnNob3cubGVnZW5kID0gVFJVRQ0KKSArDQp0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KHNpemUgPSAwLjUsIGZpbGwgPSAiZ3JheTkxIiwgY29sb3VyID0gImdyYXkiLCBsaW5ldHlwZT0nc29saWQnKSwNCnBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAnc29saWQnLCBjb2xvdXIgPSAiZ3JheTQ1IiksDQpwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gJ3NvbGlkJywgY29sb3VyID0gImdyYXkiKSwNCnBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIm1vY2Nhc2luIikNCikrDQpzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiVW50ZXJzdWNodGUgWmVpdHB1bmt0ZSIsIA0KYnJlYWtzID0gYygiVDAiLCAiVDEiLCAiVDIiLCAiVDMiKSwNCmxhYmVscyA9IGMoIlQwIC0gbWl0IFN0YXJ0IGRlcyBUcmFpbmluZ3MiLCANCiJUMSAtIG5hY2ggMSBXb2NoZSBUcmFpbmluZyIsIA0KIlQyIC0gbmFjaCAyIFdvY2hlbiBUcmFpbmluZyIsDQoiVDMgLSBuYWNoIDMgV29jaGVuIFRyYWluaW5nIg0KKSwNCmFlc3RoZXRpY3MgPSAiZmlsbCIgIyBEaWUgU3lzdGVtLUZhcmJlbiB3ZXJkZW4gdmVyd2VuZGV0Lg0KKSsNCmd1aWRlcygjZmlsbCA9IEZBTFNFLCAjIE1pdCAiZmlsbCA9IEZBTFNFIiB3ZXJkZW4gYWxsZSBMZWdlbmRlbiAoYXV0b21hdGlzY2gsbWFudWVsbCkgYWJnZXNjaGFsdGV0Lg0KY29sb3IgPSBGQUxTRQ0KKSArIA0KZmFjZXRfd3JhcCh+IFplaXRwdW5rdCwgDQpuY29sID0gMg0KKSArIA0KbGFicyh0aXRsZSA9ICJIaXN0b2dyYW1tZSIsDQpzdWJ0aXRsZSA9ICJ4eHgiLA0KeCA9ICJHZXdpY2h0IiwNCnkgPSAiQW56YWhsIg0KKSANCmBgYA0KDQoNCg0KDQojCURlc2tyaXB0aXZlIFN0YXRpc3Rpaw0KRGllIFRhYmVsbGVnaWJ0IGRpZSBNaXR0ZWx3ZXJ0ZSwgU3RhbmRhcmRhYndlaWNodW5nZW4gdW5kIEdyw7Zzc2VuIGFsbGVyIHZpZXIgTWVzc3plaXRwdW5rdGUgd2llZGVyLiBEaWVzZSBJbmZvcm1hdGlvbmVuIHdlcmRlbiBmw7xyIGRpZSBCZXJpY2h0ZXJzdGF0dHVuZyB2ZXJ3ZW5kZXQuDQoNCg0KYGBge3Igd2FybmluZz1UUlVFfQ0KbWl0bWVzcyAlPiUNCmdyb3VwX2J5KFplaXRwdW5rdCkgJT4lDQogIHN1bW1hcml6ZShBbnphaGwgPSBuKCksIE1pdHRlbHdlcnQgPSBtZWFuKEdld2ljaHQpLCBNZWRpYW4gPSBtZWRpYW4oR2V3aWNodCksIFN0YW5kYXJkYWJ3ZWljaHVuZyA9IHNkKEdld2ljaHQpKSAlPiUNCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKQ0KYGBgDQpFcyBnaWJ0IGVpbmVuIE1pdHRlbHdlcnRzdW50ZXJzY2hpZWQgendpc2NoZW4gZGVuIE1lc3N6ZWl0cHVua3Rlbi4gVm9yIGRlbSBUcmFpbmluZyB3b2dlbiBkaWUgVGVpbG5laG1lciBpbSBNaXR0ZWwgODUsOTcga2cgKFNEID0gOC44Miwgbj03MykuIE5hY2ggZWluZXIgV29jaGUgVHJhaW5pbmcgbGFnIGRhcyBHZXdpY2h0IGJlaSA4MS44NiAoU0QgPSA5LjA3LG49NzMpLiBJbiBkZXIgendlaXRlbiBXb2NoZSBiZWkgNzcuOTcga2coU0Q9OS4xNyxuPTczKS4gSW4gZGVyIGxldHp0ZW4gV29jaGUgaGFiZW4gZGllIFRlaWxuZWhtZXIgbnVyIG5vY2ggNzMuMDMga2cgaW0gU2Nobml0dChTRD05LjM5LG49NzMpIGdld29nZW4uIERhbWl0IGhhYmVuIFNpZSBpbm5lcmhhbGIgdm9uIHZpZXIgV29jaGVuIDEyIGtnIGFiZ2Vub21tZW4uDQoNCg0KKkhpbndlaXMqIERpZSBaYWhsIGRlciBEYXRlbiBzb2xsdGUgaWRlbnRzaWNoIHNlaW4uIEhpZXIgc2luZCBlcyBpbW1lciA3MyBQZXJzb25lbi4NCg0KIyBNYXVjaGx5LVRlc3QgYXVmIFNwaMOkcml6aXTDpHQNCg0KDQpFaW5lIFZvcmF1c3NldHp1bmcgZsO8ciBkaWUgRHVyY2hmw7xocnVuZyBlaW5lciBWYXJpYW56YW5hbHlzZSBtaXQgTWVzc3dpZWRlcmhvbHVuZyBpc3QgZGllIHNvZ2VuYW5udGUgIkNvbXBvdW5kIHN5bW1ldHJ5IjogRGllc2UgaXN0IGdlZ2ViZW4sIHdlbm4gZGllIFN0aWNocHJvYmVudmFyaWFuemVuIGRlciBlaW56ZWxuZW4gTWVzc3plaXRwdW5rdGUgaG9tb2dlbiB1bmQgZGllIEtvcnJlbGF0aW9uZW4gendpc2NoZW4gamVkZW0gUGFhciB2b24gTWVzc3plaXRwdW5rdGVuIGlkZW50aXNjaCBzaW5kLCB3ZW5uIGZvbGdsaWNoIGhvbW9nZW5lIFN0aWNocHJvYmVudmFyaWFuemVuIHVuZCAta29ycmVsYXRpb25lbiB2b3JsaWVnZW4uPGJyPjxicj4NCg0KU3Bow6RyaXppdMOkdCBpc3QgZWluZSBldHdhcyB3ZW5pZ2VyIHJlc3RyaWt0aXZlIEZvcm0gZGVyICJDb21wb3VuZCBzeW1tZXRyeSIuIFNwaMOkcml6aXTDpHQgbGllZ3Qgdm9yLCB3ZW5uIGRpZSBWYXJpYW56ZW4gZGVyIERpZmZlcmVuemVuIHp3aXNjaGVuIGpld2VpbHMgendlaSBNZXNzemVpdHB1bmt0ZW4gZ2xlaWNoIHNpbmQuIERpZXNlciBUZXN0IGlzdCBmb2xnbGljaCBlcnN0IGFiIGRyZWkgTWVzc3plaXRwdW5rdGVuIHJlbGV2YW50IChiZWkgendlaSBNZXNzemVpdHB1bmt0ZW4gbnVyIGVpbiBQYWFyKS4gVW0gZGllIFZvcmF1c3NldHp1bmcgZGVyIFNwaMOkcml6aXTDpHQgenUgw7xiZXJwcsO8ZmVuLCB3aXJkIGRlciBNYXVjaGx5LVRlc3QgZHVyY2hnZWbDvGhydC4gSXN0IGRlciBNYXVjaGx5LVRlc3QgbmljaHQgc2lnbmlmaWthbnQsIHNvIGthbm4gdm9uIFNwaMOkcml6aXTDpHQgYXVzZ2VnYW5nZW4gd2VyZGVuLiBXw6RyZSBkZXIgTWF1Y2hseS1UZXN0IGFiZXIgc2lnbmlmaWthbnQsIHNvIGzDpGdlIGtlaW5lIFNwaMOkcml6aXTDpHQgdm9yLjxicj48YnI+DQoNCklzdCBkaWUgVm9yYXVzc2V0enVuZyBkZXIgU3Bow6RyaXppdMOkdCBuaWNodCBlcmbDvGxsdCwgc28gd2VyZGVuIGRpZSBGcmVpaGVpdHNncmFkZSBkZXIgU2lnbmlmaWthbnp0ZXN0cyBhbmdlcGFzc3QsIGluZGVtIHNpZSBtaXQgZWluZW0gS29ycmVrdHVyZmFrdG9yIEVwc2lsb24gKM61KSBtdWx0aXBsaXppZXJ0IHdlcmRlbi4gUiBnaWJ0IGVpbmVyc2VpdHMgZGFzIEVwc2lsb24gbmFjaCBHcmVlbmhvdXNlLUdlaXNzZXIgYXVzLCBhbmRlcmVyc2VpdHMgZGFzIEVwc2lsb24gbmFjaCBIdXluaC1GZWxkdC4gRGFzIGVyc3RlcmUgaXN0IGV0d2FzIHJlc3RyaWt0aXZlciB1bmQgd2lyZCBkYWhlciBiZWkgc3TDpHJrZXJlbiBWZXJsZXR6dW5nZW4gZGVyIEFubmFobWUgZGVyIFNwaMOkcml6aXTDpHQgZWluZ2VzZXR6dDogSXN0IGRhcyBFcHNpbG9uIG5hY2ggR3JlZW5ob3VzZS1HZWlzc2VyIDwgLjc1LCBzbyB3aXJkIGRpZSBLb3JyZWt0dXIgbmFjaCBHcmVlbmhvdXNlLUdlaXNzZXIgdmVyd2VuZGV0LiBJc3QgZGFzIEVwc2lsb24gbmFjaCBHcmVlbmhvdXNlLUdlaXNzZXIgPiAuNzUsIHNvIHdpcmQgZGllIEtvcnJla3R1ciBuYWNoIEh1eW5oLUZlbGR0IGVpbmdlc2V0enQuDQo8YnI+PGJyPg0KSDAgOkRpZSBWYXJpYW56ZW4gZGVyIERpZmZlcmVuemVuIHp3aXNjaGVuIGpld2VpbHMgendlaSBNZXNzemVpdHB1bmt0ZW4gc2luZCBnbGVpY2guIDxicj4NCkgxIDpEaWUgVmFyaWFuemVuIGRlciBEaWZmZXJlbnplbiB6d2lzY2hlbiBqZXdlaWxzIHp3ZWkgTWVzc3plaXRwdW5rdGVuIHNpbmQgbmljaHQgZ2xlaWNoLg0KPGJyPjxicj4NCklzdCBkYXMgRXBzaWxvbjogcCA+IDAuMDUgPT4gRXJnZWJuaXMgbmljaHQgU2lnbmlmaWthbnQg4oCTPiBTcGjDpHJpeml0w6R0PGJyPg0KSXN0IGRhcyBFcHNpbG9uOiBwIDwgMC4wNSA9PiBFcmdlYm5pcyBTaWduaWZpa2FudCDigJM+IGtlaW5lIFNwaMOkcml6aXTDpHQtPiBXZW5uIGRpZXMgZGVyIEZhbGwgaXN0LCBtw7xzc2VuIGRpZSBGcmVpaGVpdHNncmFkZSBtaXQgZGVtIEtvcnJla3R1cmZha3RvciBhbmdlcGFzc3Qgd2VyZGVuLiA8YnI+PGJyPg0KICAgICAgLT4gSXN0IEVwc2lsb24gPCAwLjc1ICAtPkdyZWVuaG91c2UtR2Vpc3NlciA8YnI+DQogICAgICAtPiBJc3QgRXBzaWxvbiA+IDAuNzUgIC0+SHV5bmgtRmVsZHQ8YnI+DQoNCg0KDQoNCiMgRXJnZWJuaXNzZSBkZXIgZWluZmFrdG9yaWVsbGVuIFZhcmlhbnphbmFseXNlIG1pdCBNZXNzd2llZGVyaG9sdW5nDQoNCkRpZSBUYWJlbGxlIGdpYnQgZGVuIFNpZ25pZmlrYW56dGVzdCBmw7xyIGRlbiBzb2dlbmFubnRlbiAiSGF1cHRlZmZla3QiIGRlciBNZXNzd2llZGVyaG9sdW5nIGF1cy4gRWluIEhhdXB0ZWZmZWt0IGlzdCBkZXIgZGlyZWt0ZSBFZmZla3QgZWluZXMgRmFrdG9ycyBhdWYgZGllIGFiaMOkbmdpZ2UgVmFyaWFibGUuIEVzIGdlaHQgYmVpIElubmVyc3ViamVrdGVmZmVrdGVuIHVtIFVudGVyc2NoaWVkZSBpbm5lcmhhbGIgdm9uIFBlcnNvbmVuLCBuaWNodCB6d2lzY2hlbiBQZXJzb25lbi4NCg0KRGEgdm9uIGtlaW5lIFNwaMOkcml6aXTDpHQgYXVzZ2VnYW5nZW4gd2VyZGVuIGthbm4sIG3DvHNzZW4gZGllIEZyZWloZWl0c2dyYWRlIGtvcnJpZ2llcnQgd2VyZGVuLiBNdXNzIGVpbmUgS29ycmVrdHVyIGRlciBUZXN0cyB2ZXJ3ZW5kZXQgd2VyZGVuLCBzbyB3aXJkIGVudHNwcmVjaGVuZCBkaWUgWmVpbGUgIkdyZWVuaG91c2UtR2Vpc3NlciIgb2RlciAiSHV5bmgtRmVsZHQiIGJlcmljaHRldCwgamUgbmFjaGRlbSB3ZWxjaGUgZGVyIGJlaWRlbiBLb3JyZWt0dXJlbiBhbmdlYnJhY2h0IGlzdC4gDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGFmZXgpDQpgYGANCg0KYGBge3J9DQphbm92YSA8LSBhb3ZfY2FyKEdld2ljaHR+RXJyb3IoSUQvWmVpdHB1bmt0KSwgZGF0YSA9IG1pdG1lc3MsIHJldHVybiA9InVuaXZhcmlhdGUiKQ0KYW5vdmENCmBgYA0KDQpJc3QgZGFzIEVwc2lsb246IHAgPiAwLjA1ID0+IEVyZ2VibmlzIG5pY2h0IFNpZ25pZmlrYW50IOKAkz4gU3Bow6RyaXppdMOkdA0KSXN0IGRhcyBFcHNpbG9uOiBwIDwgMC4wNSA9PiBFcmdlYm5pcyBTaWduaWZpa2FudCDigJM+IGtlaW5lIFNwaMOkcml6aXTDpHQtPiBXZW5uIGRpZXMgZGVyIEZhbGwgaXN0LCBtw7xzc2VuIGRpZSBGcmVpaGVpdHNncmFkZSBtaXQgZGVtIEtvcnJla3R1cmZha3RvciBhbmdlcGFzc3Qgd2VyZGVuLiANCiAgICAgIC0+IElzdCBFcHNpbG9uIDwgMC43NSAgLT5HcmVlbmhvdXNlLUdlaXNzZXIgDQogICAgICAtPiBJc3QgRXBzaWxvbiA+IDAuNzUgIC0+SHV5bmgtRmVsZHQNCiAgICAgDQogICAgIA0KYGBge3J9DQpvdXQ1YiA8LSBhb3ZfY2FyKEdld2ljaHR+RXJyb3IoSUQvWmVpdHB1bmt0KSwgZGF0YSA9IG1pdG1lc3MpDQpvdXQ2YSA8LSBhbm92YShvdXQ1YiwgZXM9InBlcyIsIGNvcnJlY3Rpb249Im5vbmUiLCBpbnRlcmNlcHQ9IFRSVUUpDQpvdXQ2YiA8LSBhbm92YShvdXQ1YiwgZXM9InBlcyIsIGNvcnJlY3Rpb249IkdHIikNCm91dDZjIDwtIGFub3ZhKG91dDViLCBlcz0icGVzIiwgY29ycmVjdGlvbj0iSEYiKQ0Kb3V0NiA8LSByYmluZCgibmljaHQgS29ycmlnaWVydCI9b3V0NmEsICJHcmVlbmhvdXNlLUdlaXNzZXIiPW91dDZiLCAiSHV5bmgtRmVsZHQiPW91dDZjKQ0Kb3V0Ng0KDQpgYGANCiAgICANCkRpZSBLb3JyZWt0dXIgaW4gZGllc2VtIEJlaXNwaWVsIHdpcmQgbmFjaCBHcmVlbmhvdXNlLUdlaXNzZXIgZHVyY2hnZWbDvGhydCwgZGFzcyBiZWRldXRldCBkaWUgRnJlaWhlaXRzZ3JhZGUgd2VyZGVuIG1pdCBkZW0gR3JlZW5ob3VzZS1HZWlzc2VyIEVwbGlzb24gbXVsdGlwbGl6aWVydC4gDQoNCiQkZGYxID0gMyowLjUwMjI4IFxyaWdodGFycm93ICAxLjUwNiQkDQokJGRmMiA9IDIxNiowLjUwMjI4IFxyaWdodGFycm93ICAxMDguNDkkJA0KDQoNCkRpZSBGcmVpaGVpdHNncmFkZSBlbnRuZWhtZW4gd2lyIGRlciBkcml0dGUgWmVpbGUgdm9uICJvdXQ2Ii4NCg0KKipFaW5lIFZhcmlhbnphbmFseXNlIG1pdCBNZXNzd2llZGVyaG9sdW5nIHplaWd0LCBkYXNzIHNpY2ggZGFzIFRyYWluaW5nIGRlciBQcm9iYW5kSW5uZW4gamUgbmFjaCBNZXNzemVpdHB1bmt0IHVudGVyc2NoZWlkZXQuIChGKDEuNTA2LDEwOC40OSkgPSAxNjc2LjUsIHAgPSAuMDAwLCBuID0gNzMpLioqDQoNCg0KDQoNCg0KIyMgQUxURVJOQVRJVkUgDQoNCioqbmljaHQgenUgZW1wZmVobGVuKioNCg0KYGBge3J9DQptaXRtZXNzJFplaXRwdW5rdCA9IGFzLmZhY3RvcihtaXRtZXNzJFplaXRwdW5rdCkNCm1pdG1lc3MkSUQgPSBhcy5mYWN0b3IobWl0bWVzcyRJRCkNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkoZXopDQphbm92YTEgPC0gZXpBTk9WQShtaXRtZXNzLCBkdiA9IEdld2ljaHQsIHdpZCA9IElELCB3aXRoaW4gPSBaZWl0cHVua3QsIGRldGFpbGVkID0gVFJVRSkNCmFub3ZhMQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmRmMSA8LSBhbm92YTEkQU5PVkEkREZuWzJdKmFub3ZhMSRgU3BoZXJpY2l0eSBDb3JyZWN0aW9uc2AkR0dlDQpkZjENCmBgYA0KDQoNCmBgYHtyfQ0KZGYyIDwtIGFub3ZhMSRBTk9WQSRERmRbMl0qYW5vdmExJGBTcGhlcmljaXR5IENvcnJlY3Rpb25zYCRHR2UNCmRmMg0KYGBgDQoNCg0KDQoNCiMgUG9zdC1ob2MtVGVzdHMNCg0KDQpPYndvaGwgZGVyIEYtVGVzdCB6ZWlndCwgZGFzcyBlaW4gSGF1cHRlZmZla3QgZGVyIFRyYWluaW5nIGJlc3RlaHQsIG11c3MgYW5oYW5kIHZvbiBQb3N0LWhvYy1UZXN0cyBnZWtsw6RydCB3ZXJkZW4sIHp3aXNjaGVuIHdlbGNoZW4gTWVzc3plaXRwdW5rdGVuIHNpZ25pZmlrYW50ZSBVbnRlcnNjaGllZGUgYmV6w7xnbGljaCBkZXIgS29uemVudHJhdGlvbnNmw6RoaWdrZWl0IGJlc3RlaGVuLg0KDQokJFxmcmFje2sqKGstMSl9ezJ9PVxmcmFjezQqKDQtMSl9ezJ9PSBcZnJhY3sxMn17Mn0gPTYkJA0KDQpCZWkgZGVyIEJlcmVjaG51bmcgdm9uIFBvc3QtaG9jLVRlc3RzIHdpcmQgaW0gUHJpbnppcCBmw7xyIGplZGUgS29tYmluYXRpb24gdm9uIHp3ZWkgTWl0dGVsd2VydGVuIGVpbiBWZXJnbGVpY2ggZHVyY2hnZWbDvGhydC4gSW0gYWt0dWVsbGVuIEJlaXNwaWVsIG1pdCB2aWVyIEdydXBwZW4gc2luZCBkaWVzIDYgVGVzdHMuPGJyPg0KDQpNdWx0aXBsZSBUZXN0cyBzaW5kIGplZG9jaCBwcm9ibGVtYXRpc2NoLCBkYSBkZXIgQWxwaGEtRmVobGVyIChkaWUgZsOkbHNjaGxpY2hlIEFibGVobnVuZyBkZXIgTnVsbGh5cG90aGVzZSkgbWl0IGRlciBBbnphaGwgZGVyIFZlcmdsZWljaGUgc3RlaWd0LiBXaXJkIG51ciBlaW4gdC1UZXN0IG1pdCBlaW5lbSBTaWduaWZpa2FuemxldmVsIHZvbiAuMDUgZHVyY2hnZWbDvGhydCwgc28gYmV0csOkZ3QgZGllIFdhaHJzY2hlaW5saWNoa2VpdCBkZXMgTmljaHQtRWludHJlZmZlbnMgZGVzIEFscGhhLUZlaGxlcnMgOTUlLjxicj4NCg0KV2VyZGVuIGplZG9jaCB6ZWhuIHNvbGNoZXIgUGFhcnZlcmdsZWljaGUgdm9yZ2Vub21tZW4sIHNvIGJldHLDpGd0IGRpZSBOaWNodC1FaW50cmVmZmVucy1XYWhyc2NoZWlubGljaGtlaXQgZGVzIEFscGhhLUZlaGxlcnMgKC45NSk2ID0gLjczNS4gPGJyPg0KDQpVbSBkaWUgV2FocnNjaGVpbmxpY2hrZWl0IGRlcyBFaW50cmVmZmVucyBkZXMgQWxwaGEtRmVobGVycyB6dSBiZXN0aW1tZW4sIHdpcmQgMSAtIC43MzUgPSAuMjY1IGdlcmVjaG5ldC4gPGJyPg0KDQoNCkRpZSBXYWhyc2NoZWlubGljaGtlaXQgZGVzIEVpbnRyZWZmZW5zIGRlcyBBbHBoYS1GZWhsZXJzIGxpZWd0IHNvbWl0IGJlaSAyNi41JS4gRGllc2UgRmVobGVyd2FocnNjaGVpbmxpY2hrZWl0IHdpcmQgYWxzICJGYW1pbHl3aXNlIEVycm9yIFJhdGUiIGJlemVpY2huZXQuPGJyPg0KDQpIaWVyYmVpIHdpcmQgzrEgZHVyY2ggZGllIEFuemFobCBkZXIgUGFhcnZlcmdsZWljaGUgZGl2aWRpZXJ0LiBJbSBoaWVyIGF1ZmdlZsO8aHJ0ZW4gRmFsbCBpc3QgZGllcyAuMDUvNiA9IC4wMDguIA0KDQpgYGB7cn0NCnBhaXJ3aXNlLnQudGVzdChtaXRtZXNzJEdld2ljaHQsIA0KICAgICAgICAgICAgICAgIG1pdG1lc3MkWmVpdHB1bmt0LCANCiAgICAgICAgICAgICAgICBwLmFkanVzdC5tZXRob2QgPSAibm9uZSIsIA0KICAgICAgICAgICAgICAgIHBhaXJlZCA9IFRSVUUsIA0KICAgICAgICAgICAgICAgIGRhdGEgPSBtaXRtZXNzKQ0KYGBgDQoNCkVzIHdpcmQgZXJzaWNodGxpY2gsIGRhc3MgYWxsZSB2aWVyIE1lc3N6ZWl0cHVua3Qgc2ljaCBzaWduaWZpa2FudCB1bnRlcnNjaGVpZGVuKHAgPCAuMDA4KS4gRGFoZXIgbGFzc2VuIHNpY2ggZsO8ciBlaWdlbnN0w6RuZGlnZSBHcnVwcGVuIGJpbGRlbi4gRGllc2UgdmllciBHcnVwcGVuIHNpbmQgZ2VuZXJhbGlzaWVyYmFyLiANCg0KDQoNCg0KIyBQcm9maWxkaWFncmFtbQ0KDQpgYGB7cn0NCmdncGxvdChtaXRtZXNzLCBhZXMoeD1aZWl0cHVua3QsIHk9R2V3aWNodCwgZ3JvdXA9MSkpKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbT0icG9pbnQiLCBzaXplPTMpKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbT0ibGluZSIpKw0KICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX2NsX25vcm1hbCwgZ2VvbT0iZXJyb3JiYXIiLHdpZHRoPS4yLCBzaXplPS4yNSkrDQogIGxhYnMoeD0iWmVpdHB1bmt0IiwgeT0iR2V3aWNodCBpbiBrZyIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KRWEgemVpZ3Qgc2ljaCwgZGFzcyBkaWUgR2V3aWNodHNyZWR1emllcnVuZyBtaXRoaWxmZSBkZXMgVHJhaW5pbmcgZXJmb2xncmVpY2ggaXN0Lg0KDQoNCg0KIyBEYXMgcGFydGllbGxlIEV0YS1RdWFkcmF0DQpEYXMgcGFydGllbGxlIEV0YS1RdWFkcmF0IChwYXJ0aWVsbGVzIM63MikgaXN0IGVpbiBNYXNzIGbDvHIgZGllIEVmZmVrdGdyw7Zzc2U6IA0KDQpXw6RocmVuZCBiZWkgZXRhwrIgYW5nZWdlYmVuIHdpcmQsIHdpZSB2aWVsIGRlciBHZXNhbXR2YXJpYXRpb24gZHVyY2ggZWluZW4gRWZmZWt0IGVya2zDpHJ0IHdpcmQsIGlzdCBlcyBiZWltIHBhcnRpZWxsZW4gZXRhMiBsZWRpZ2xpY2ggZGVyIEFudGVpbCBkZXIgRWZmZWt0dmFyaWF0aW9uIGFuIGRlciBTdW1tZSBhdXMgRWZmZWt0LSB1bmQgUmVzaWR1YWx2YXJpYXRpb24uDQoNCg0KDQokJCBldGFfcF4yID0gXGZyYWN7UVNfe1RyZWF0bWVudH19e1FTX3tUcmVhdG1lbnR9K1FTX3tSZXNpZHVhbH19JCQNCmBgYHtyfQ0KDQpzcHJpbnRmKCJQYXJ0aWVsbGUgRXRhLVF1YWRyYXQgZsO8ciAnWmVpdHB1bmt0JzogZXRhPSAlLjRmIiwgb3V0NmEkcGVzWzJdKQ0KDQpgYGANCg0KSW0gdm9ybGllZ2VuZGVuIEJlaXNwaWVsIGJldHLDpGd0IGRhcyBwYXJ0aWVsbGUgRXRhLVF1YWRyYXQgLjk1ODguIERhcyBoZWlzc3QsIGVzIHdpcmQgOTUsODglIGRlciBWYXJpYXRpb24gZGVyICBHZXdpY2h0c3JlZHVrdGlvbiBkdXJjaCBkaWUgTWVzc3plaXRlIGF1Zmdla2zDpHJ0Lg0KDQoNCg0KIyBCZXJlY2hudW5nIGRlciBFZmZla3RzdMOkcmtlDQoNCg0KVW0gZGllIEJlZGV1dHNhbWtlaXQgZWluZXMgRXJnZWJuaXNzZXMgenUgYmV1cnRlaWxlbiwgd2VyZGVuIEVmZmVrdHN0w6Rya2VuIGJlcmVjaG5ldC4gSW0gQmVpc3BpZWwgc2luZCB6d2FyIGVpbmlnZSBkZXIgTWl0dGVsd2VydHN1bnRlcnNjaGllZGUgendhciBzaWduaWZpa2FudCwgZG9jaCBlcyBzdGVsbHQgc2ljaCBkaWUgRnJhZ2UsIG9iIHNpZSBncm9zcyBnZW51ZyBzaW5kLCB1bSBhbHMgYmVkZXV0ZW5kIGVpbmdlc3R1ZnQgenUgd2VyZGVuLg0KDQpEYSBSIGRhcyBwYXJ0aWVsbGUgRXRhLVF1YWRyYXQgYXVzZ2lidCwgd2lyZCBkaWVzZXMgaGllciBpbiBkaWUgRWZmZWt0c3TDpHJrZSBuYWNoIENvaGVuICgxOTkyKSB1bWdlcmVjaG5ldC4gSW4gZGllc2VtIEZhbGwgYmVmaW5kZXQgc2ljaCBkaWUgRWZmZWt0c3TDpHJrZSBpbW1lciB6d2lzY2hlbiAwIHVuZCB1bmVuZGxpY2guDQoNCiQkZj1cc3FydFxmcmFje1xldGFeezJ9fXsxLVxldGFeezJ9fT1cc3FydFxmcmFje2V0YV57Mn19ezEtZXRhXnsyfX0kJA0KDQoNCmBgYHtyfQ0KDQplZmYgPC0gc3FydChvdXQ2YSRwZXNbMl0vKDEtb3V0NmEkcGVzWzJdKSkNCg0Kc3ByaW50ZigiRWZmZWt0c3TDpHJrZTogZj0gJS4zZiIsZWZmKQ0KYGBgDQpVbSB6dSBiZXVydGVpbGVuLCB3aWUgZ3Jvc3MgZGllc2VyIEVmZmVrdCBpc3QsIGthbm4gbWFuIHNpY2ggYW4gZGVyIEVpbnRlaWx1bmcgdm9uIENvaGVuICgxOTg4KSBvcmllbnRpZXJlbjoNCiQkDQpcYmVnaW57YWxpZ259DQpcdGV4dHtTY2h3YWNoZXIgRWZmZWt0OiB9IDAuMTAgJjwgfHxmfHwgPCAwLjI1ICAgICAgICAgICAgIFxcDQpcdGV4dHtTY2h3YWNoZXIgYmlzIG1pdHRsZXJlciBFZmZla3Q6IH0gMC4yNSAmPSB8fGZ8fCAgICAgIFxcDQpcdGV4dHtNaXR0bGVyZXIgRWZmZWt0OiB9IDAuMjUgJjwgfHxmfHwgPCAwLjQwICAgICAgICAgICAgIFxcDQpcdGV4dHtNaXR0bGVyZXIgYmlzIHN0YXJrZXIgRWZmZWt0OiB9MC40MCAmPSB8fGZ8fCAgICAgICAgIFxcDQpcdGV4dHtTdGFya2VyIEVmZmVrdDogfSAwLjQwICY8IHx8Znx8ICAgICAgICANClxlbmR7YWxpZ259DQokJA0KDQoNCkRhbWl0IGVudHNwcmVjaGVuIGRpZSBFZmZla3RzdMOkcmtlbiB2b24gNC44MjUgZWluZW0gc3RhcmtlbiBFZmZla3QuDQoNCg0KDQojIEVpbmUgQXVzc2FnZQ0KDQoNCkVpbmUgVmFyaWFuemFuYWx5c2UgbWl0IE1lc3N3aWVkZXJob2x1bmcgemVpZ3QsIGRhc3Mgc2ljaCBkYXMgVHJhaW5pbmcgZGVyIFByb2JhbmRJbm5lbiBqZSBuYWNoIE1lc3N6ZWl0cHVua3QgdW50ZXJzY2hlaWRldC4gKEYoMS41MSwxMDguNDkpID0gMTY3Ni41LCBwID0gLjAwMCwgcGFydGllbGxlcyDOtzIgPSAuOTU4OCwgbiA9IDczKS4gRGVyIE1hdWNobHktVGVzdCBlcmdhYiwgZGFzcyBrZWluZSBTcGjDpHJpeml0w6R0IGdlZ2ViZW4gaXN0LCB3ZXNoYWxiIGRpZSBHcmVlbmhvdXNlLUdlaXNzZXItS29ycmVrdHVyIGFuZ2V3ZW5kZXQgd3VyZGUgKM+1ID0gLjUwMjI4KSwgd29kdXJjaCBzaWNoIGtvcnJpZ2llcnRlIEZyZWloZWl0c2dyYWRlIGVyZ2ViZW4uDQoNCkRlciBQb3N0LUhvYy1UZXN0IHplaWd0LCBkYXNzIGRhcyBUcmFpbmluZyBkZXIgUHJvYmFuZElubmVuIHp1bSBNZXNzemVpdHB1bmt0IFQwICh2b3IgZGVtIFRyYWluaW5nKShNID0gODUuOTcsIFNEID0gOC44MiwgbiA9IDczKSBzaWduaWZpa2FudCBow7ZoZXIgYWxzIHp1IE1lc3N6ZWl0cHVua3QgVDEoZXJzdGUgV29jaGUpKE0gPSA4MS44NiwgU0QgPSA5LjA3LCBuID0gNzMpICwgTWVzc3plaXRwdW5rdCBUMih6d2VpdGUgV29jaGUpIChNID0gNzcuOTcsIFNEID0gOS4xNywgbiA9IDczKSB1bmQgTWVzc3plaXRwdW5rdCBUMyhkcml0dGUgV29jaGUpKE0gPSA3My4wMiwgU0QgPSA5LjM5LCBuID0gNzMpLiBEaWUgVGVpbG5laG1lciBoYWJlbiBpbSBTY2huaXR0IDEyIGtnIGFiZ2Vub21tZW4uDQoNCkVzIGvDtm5uZW4gdmllciBHcnVwcGVuIGdlbmVyYWxpc2llcnQgIHdlcmRlbi4gWnUgQmVnaW5uIGRlcyBUcmFpbmluZ3MgZ2V3aWVnZW4gZGllIFRlaWxuZWhtZXIgYW0gbWVpc3Rlcm4gdW5kIGRlbiB2aWVyIEVpbmhlaXRlbiBhbSB3ZW5pZ3N0ZW4uIERhcyBUcmFpbmluZyBpc3QgZWluIEVyZm9sZy4gDQoNCg0KRGllIEVmZmVrdHN0w6Rya2UgbGllZ3QgYmVpIGY9NC44MiB1bmQgZW50c3ByaWNodCBkYW1pdCBuYWNoIENvaGVuICgxOTg4KSBlaW5lbSBzdGFya2VuIEVmZmVrdC4NCg0KDQpIMCBrYW5uIHZlcndvcmZlbiB3ZXJkZW4sIEgxIGFuZ2Vub21tZW4uDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==