Pakete importieren

library(haven)
library(car)
library(PerformanceAnalytics)
library(psych)
library(knitr)
library(broom)
library(lmtest)
library(lm.beta)
library(readxl)

Daten einlesen


#Multiple_Regression <- read_excel("Multiple_Regression.xlsx")
#View(Multiple_Regression)
attach(Multiple_Regression)

1) Hypothese

Nullhypothese (H₀):

Alle Regressionskoeffizienten sind gleich null: \[ H_0: \beta_1 = \beta_2 = \beta_3 = 0 \] Die unabhängigen Variablen haben gemeinsam keinen Einfluss auf die Besucherzahl.

Alternativhypothese (H₁):

Mindestens ein Regressionskoeffizient ist ungleich null: \[ H_1: \text{Mindestens ein } \beta_j \neq 0 \] Mindestens eine der unabhängigen Variablen beeinflusst die Besucherzahl.

2) Grundlegende Konzepte: Was ist multiple Regression?

Die multiple Regression ist ein statistisches Verfahren, mit dem untersucht wird, wie mehrere unabhängige Variablen gemeinsam die Ausprägung einer abhängigen Variablen vorhersagen oder erklären können. Während die einfache lineare Regression nur einen Einflussfaktor betrachtet, analysiert die multiple Regression den Einfluss mehrerer Faktoren gleichzeitig. So kann man zum Beispiel erforschen, wie Mitgliedsbeitrag, Werbeausgaben und Produktqualität zusammen die Verkaufszahlen beeinflussen. Dabei zeigt das Verfahren nicht nur, wie stark jede einzelne Variable die abhängige Variable beeinflusst, sondern auch, wie gut das Gesamtmodell die tatsächlichen Werte vorhersagt. Die multiple Regression wird häufig in Sozialwissenschaften, Wirtschaft und Medizin genutzt, um komplexe Zusammenhänge zwischen verschiedenen Einflussgrößen und einem Ergebnis zu analysieren und fundierte Entscheidungen auf Basis der ermittelten Zusammenhänge zu treffen.

3) Prüfen der Voraussetzungen

4) Boxplot

par(mfrow=c(1,4))
boxplot(Fanartikelverkauf, main="Boxplot Fanartikelverkauf")
boxplot(Besucherzahlen, main="Boxplot Besucher")
boxplot(Werbeausgaben, main="Boxplot Werbeausgaben")
boxplot(Mitgliedsbeitrag, main="Boxplot Mitgliedsbeitrag")

Keine Ausreißer zu erkennen.

5) Deskriptive Statistik

psych::describe(Multiple_Regression)

Die Tabelle gibt einen Überblick über die deskriptiven Statistiken von fünf Variablen aus dem Datensatz. Für die abhängige Variable Besucher lag der Mittelwert bei M = 1877.89, mit einer Standardabweichung von SD = 350.52 (n = 36). Die Besucherzahlen variierten dabei zwischen 1172 und 2604. Der Mitgliedsbeitrag (Mitgliedsbeitrag) zeigte einen Mittelwert von M = 110.38 (SD = 1.61, n = 36), mit Werten von 107 bis 113. Für das Werbebudget (Werbeausgaben) wurde ein Mittelwert von M = 1274.44 (SD = 481.50, n = 36) bei einer Spannweite von 460 bis 2000 beobachtet. Die Variable Fanartikelverkauf hatte einen Mittelwert von M = 905.28 (SD = 159.47, n = 36), mit Werten zwischen 600 und 1250. Die ID-Variable dient lediglich der Identifikation der einzelnen Fälle und ist für die inhaltliche Analyse nicht relevant.

6) Scatterplot und Pearson

Ein lineares Modell geht davon aus, dass der Zusammenhang zwischen der abhängigen Variable und jeder unabhängigen Variable linear ist – und zwar unter der Kontrolle aller weiteren unabhängigen Variablen. Bei multipler Regression bedeutet das: Die Beziehung zwischen einer unabhängigen Variable und der Zielgröße sollte auch dann linear sein, wenn man die Effekte der anderen Einflussgrößen berücksichtigt.

Diese Bedingung lässt sich jedoch nicht allein mit einem einfachen Streudiagramm zwischen abhängiger und einer unabhängigen Variable prüfen. Im Gegensatz zur einfachen Regression können weitere Einflussfaktoren das Verhältnis verfälschen, sodass die tatsächliche Beziehung komplexer ist. Ein einfaches Streudiagramm bietet daher nur einen groben ersten Anhaltspunkt, ob eine lineare Beziehung vorliegen könnte, und wird häufig als erster, orientierender Schritt genutzt. Für eine genaue Überprüfung sind weiterführende grafische Methoden erforderlich.

library(car)

scatterplotMatrix(~Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben + Besucherzahlen, 
                       regLine=TRUE, smooth=FALSE, 
  diagonal=list(method="density"), by.groups=TRUE, 
  data=Multiple_Regression)

library(PerformanceAnalytics)
chart.Correlation(Multiple_Regression[1:4],
histogram=TRUE,
method = "pearson",
pch=19)

Die Streudiagramm-Matrix liefert einen ersten Eindruck davon, wie die abhängige Variable mit den einzelnen unabhängigen Variablen zusammenhängt. Dabei wird sichtbar, dass zwischen den unabhängigen Variablen und der Zielgröße zumindest auf den ersten Blick jeweils eine lineare Beziehung denkbar ist: Die Besucherzahl nimmt mit höheren Fanartikelverkäufen und einem größeren Werbebudget offenbar zu. Der Zusammenhang mit dem TicketMitgliedsbeitrag erscheint dagegen weniger ausgeprägt.

Um die Annahme der Linearität genauer zu überprüfen, empfiehlt es sich, für jede unabhängige Variable ein spezielles Streudiagramm zu erstellen, das sogenannte Component-plus-residual-Plot. Damit lässt sich erkennen, ob die Beziehung tatsächlich linear ist oder ob möglicherweise eine andere Form des Zusammenhangs vorliegt. Alternativ können auch partielle Regressionsdiagramme verwendet werden, die für jede Variable die Beziehung zum Rest des Modells darstellen.

# modell 
modell <- lm(Besucherzahlen ~ Mitgliedsbeitrag + Werbeausgaben + Fanartikelverkauf, data = Multiple_Regression)

# Component-plus-residual-Plot für Fanartikelverkauf
crPlots(modell, terms = ~ Fanartikelverkauf)

Das partielle Regressionsdiagramm für Fanartikelverkauf zeigt auf der Y-Achse das Residuum, das entsteht, wenn die Variable Besucher auf alle unabhängigen Variablen außer Fanartikelverkauf regressiert wird. Auf der X-Achse ist das Residuum dargestellt, das übrig bleibt, wenn Fanartikelverkauf auf alle anderen unabhängigen Variablen regressiert wird. Das bedeutet: Es wird jeweils der Teil betrachtet, der durch die anderen unabhängigen Variablen nicht erklärt werden kann. Diese beiden Residuen werden gegeneinander aufgetragen.

Zeigen die partiellen Regressionsdiagramme für alle unabhängigen Variablen eine lineare Beziehung, kann davon ausgegangen werden, dass die Linearitätsvoraussetzung erfüllt ist. In Abbildung 4 ist dies für Fanartikelverkauf der Fall. Auch bei den anderen unabhängigen Variablen zeigt sich diese Linearität, was aus Gründen der Übersichtlichkeit hier jedoch nicht weiter dargestellt wird.

7) Homoskedastizität

Homoskedastizität bedeutet, dass die Fehler für jeden Wert der unabhängigen Variablen eine konstante Varianz aufweisen. Das wird meist anhand eines Streudiagramms überprüft, in dem die Residuen gegen die vorhergesagten Werte aufgetragen werden. Die Voraussetzung ist erfüllt, wenn sich die Fehlerwerte über den gesamten Wertebereich der Vorhersagen zufällig und ohne erkennbares Muster verteilen und ihre Streuung in etwa gleich bleibt.

Falls die Streuung der Fehler nicht konstant ist, spricht man von Heteroskedastizität. In solchen Fällen erkennt man häufig ein bestimmtes Muster im Streudiagramm, beispielsweise eine trichterförmige oder trompetenartige Ausprägung.


regression1 <-  lm(Besucherzahlen ~ Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben )

zpred <- scale(fitted(regression1), center = T, scale = T)
sres <-rstandard(regression1)

plot (x=zpred, y=sres, main = "Streudiagramm der Residuen", 
      xlab ="Regression: Standardisierter geschätzter Wert", 
      ylab = "Regression: Standardisiertes Residuum",
      col = "darkblue")

abline (a=0, b=0)

Neben der visuellen Beurteilung gibt es auch verschiedene statistische Tests, mit denen Homoskedastizität geprüft werden kann, zum Beispiel den Breusch-Pagan-Test, den Cook-Weisberg-Test oder den White-Test. Wird bei diesen Tests die Nullhypothese nicht verworfen, spricht das für Homoskedastizität. Das Ergebnis gilt als unproblematisch, wenn der p-Wert größer als 0,05 ist. Wird dieser Wert nicht unterschritten, kann davon ausgegangen werden, dass die Annahme der Homoskedastizität erfüllt ist.

8) Unabhängigkeit des Fehlerwerts

Für die multiple Regression ist es wichtig, dass die Fehler verschiedener Beobachtungen unabhängig voneinander sind. Das bedeutet, dass die Fehlerwerte nicht miteinander in Verbindung stehen dürfen und keine systematischen Muster aufweisen, wie zum Beispiel zeitliche oder räumliche Abfolgen. Werden Abhängigkeiten festgestellt, kann dies beispielsweise an mehrfachen Messungen innerhalb derselben Gruppe oder an wiederkehrenden Zeitpunkten liegen.

Treten solche Abhängigkeiten auf, kann die Annahme der Unabhängigkeit verletzt sein, was sich meist durch auffällige Muster in den Residuen äußert. Bei unabhängigen Fehlern sind dagegen keine Regelmäßigkeiten erkennbar. Ist dies der Fall, kann davon ausgegangen werden, dass die Voraussetzung erfüllt ist.

Neben der visuellen Beurteilung gibt es auch statistische Tests zur Überprüfung der Unabhängigkeit der Fehler, wie etwa den Durbin-Watson-Test. Ein Wert nahe 2 deutet darauf hin, dass keine Autokorrelation vorliegt, während Werte nahe 0 oder 4 auf eine starke Abhängigkeit der Fehlerwerte hindeuten.

9) Normalverteilung des Fehlerwerts

Eine weitere Voraussetzung ist, dass die Fehlerwerte annähernd normalverteilt sind. Dies lässt sich oft gut anhand eines Histogramms der standardisierten Residuen beurteilen. Im Idealfall zeigt das Histogramm eine glockenförmige Verteilung. Weichen die Fehler stark von der Normalverteilung ab, zum Beispiel indem sie zweigipflig (bimodal) verteilt sind, kann dies problematisch für die Interpretation der Regressionsanalyse sein. Kleinere Abweichungen werden häufig als unkritisch betrachtet.


# regression1 <-  lm(Besucherzahlen ~ Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben )
# 
# zpred <- scale(fitted(regression1), center = T, scale = T)
# sres <-rstandard(regression1)

hist (sres, freq = T, breaks = 10, main ="Verteilung des Fehlerwerts", xlab= "Regression: Standardisiertes Residuum", ylab="Häufigkeiten", xlim = c(-3,3),ylim = c(0,12), col = "lightblue" )

10) Keine Multikollinearität

Für die multiple Regression ist es wesentlich, dass die unabhängigen Variablen nicht in einem starken linearen Zusammenhang zueinander stehen. Das bedeutet, keine unabhängige Variable darf sich durch eine Linearkombination der anderen vollständig erklären lassen. In der Praxis sind kleine Korrelationen normal, doch eine zu große Multikollinearität führt dazu, dass die Schätzung der Regressionskoeffizienten unsicher wird. Dann kann es passieren, dass eigentlich wichtige Einflussgrößen statistisch unauffällig erscheinen.

Zur Überprüfung von Multikollinearität werden zwei Kennzahlen genutzt: Toleranzwert und Varianzinflationsfaktor (VIF). Beide Größen geben Auskunft darüber, wie sehr eine unabhängige Variable von den übrigen abhängt. Sie stehen in einem Kehrwertverhältnis zueinander.

Toleranzwert:

\[ T_j = 1 - R_j^2 \]

Hierbei ist \(R_j^2\) das Bestimmtheitsmaß, das angibt, wie gut sich die Variable \(x_j\) durch die anderen unabhängigen Variablen erklären lässt.

Varianzinflationsfaktor (VIF):

\[ \text{VIF}_j = \frac{1}{T_j} \] ### Faustregel zur Beurteilung:

# regression1 <-  lm(Besucherzahlen ~ Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben )
# VIF berechnen
vif_values <- vif(regression1)


# Toleranz berechnen (1/VIF)
toleranz <- 1 / vif_values


# Zusammenfassen als DataFrame
ergebnisse <- data.frame(
  Variable = names(vif_values),
  VIF = round(vif_values, 3),
  Toleranz = round(toleranz, 3)
)
print(ergebnisse)

Werden diese Grenzwerte nicht eingehalten, liegt eine problematische Multikollinearität vor. In diesem Fall sollte das Regressionsmodell überarbeitet werden – zum Beispiel, indem betroffene Prädiktoren entfernt oder umgewandelt werden. Perfekte Multikollinearität, also eine vollständig lineare Beziehung, wird automatisch erkannt. Bei moderater Multikollinearität ist eine eigenständige Kontrolle und Anpassung notwendig. Sind alle Voraussetzungen akzeptabel erfüllt, kann das Modell weiter interpretiert werden.

11) Signifikanz des Regressionsmodells

Um zu bestimmen, ob das Regressionsmodell insgesamt statistisch bedeutsam ist, wird ein F-Test verwendet. Dieser Test prüft, ob die unabhängigen Variablen gemeinsam dazu beitragen, die abhängige Variable besser vorherzusagen, als es der Zufall könnte. Anders gesagt, bewertet der F-Test, ob das gesamte Modell einen signifikanten Erklärungswert für die abhängige Variable besitzt.

\[Besucherzahlen=\beta_0+\beta_1\cdot Mitgliedsbeitrag+\beta_2\cdot Werbeausgaben+\beta_3\cdot Verkauf+\epsilon_i\]

Wenn das Ergebnis des F-Tests signifikant ausfällt (typischerweise p < 0,05), zeigt das, dass das Modell insgesamt einen relevanten Beitrag zur Vorhersage leistet. In diesem Fall kann die Analyse weitergeführt werden, beispielsweise indem die einzelnen Einflussgrößen betrachtet werden. Ist das Modell insgesamt nicht signifikant, wäre eine weitere Analyse nicht sinnvoll.

12) Signifikanz der Regressionskoeffizienten und die Regressionsgrade

Hier wird die Multiple Regression durchgeführt. Achten Sie auf die Rundung.

# modell
regression1 <-  lm(Besucherzahlen ~ Mitgliedsbeitrag+Fanartikelverkauf+Werbeausgaben )


# Koeffizienten holen
koefs <- tidy(regression1)

# VIF und Toleranz berechnen 
vif_vals <- vif(regression1)
toleranz <- 1 / vif_vals

# Intercept
VIF_full <- c(NA, round(vif_vals, 3))        # Intercept hat keinen VIF
Toleranz_full <- c(NA, round(toleranz, 3))   # Intercept hat keine Toleranz

# Alles in eine Tabelle
ergebnisse <- data.frame(
  Variable = koefs$term,
  Regressionskoeffizient = round(koefs$estimate, 3),
  Standardfehler = round(koefs$std.error, 3),
  t_Wert = round(koefs$statistic, 3),
  p_Wert = round(koefs$p.value, 3),
  Toleranz = Toleranz_full,
  VIF = VIF_full
)

print(ergebnisse)

Im nächsten Schritt wird untersucht, ob die einzelnen Einflussgrößen (Regressionskoeffizienten) tatsächlich einen bedeutsamen Zusammenhang mit der Zielgröße haben. Dafür wird zu jedem einzelnen Koeffizienten ein t-Test durchgeführt. Das Ergebnis zeigt, ob die jeweilige Variable einen messbaren Einfluss auf die Besucherzahl ausübt.

Die Ergebnisse der t-Tests zeigen, dass die Regressionskoeffizienten für Mitgliedsbeitrag (t = -2,612, p = 0,014), Werbeausgaben (t = 9,657, p < 0,001), Fanartikelverkauf (t = 5,759, p < 0,001) sowie für die Konstante (Y-Achsenabschnitt; t = 2,797, p = 0,009) jeweils statistisch signifikant sind. Ein signifikanter Y-Achsenabschnitt bedeutet, dass die Regressionsgerade den Ursprung nicht schneidet. Die signifikanten Koeffizienten der unabhängigen Variablen zeigen, dass diese Faktoren einen relevanten Einfluss auf die Besucherzahl haben.

Daraus ergibt sich folgende Regressionsgleichung:

Besucherzahlen = 5091,21 – 43,23 · Mitgliedsbeitrag + 0,54 · Werbeausgaben + 0,97 · Fanartikelverkauf

Die Gleichung macht deutlich, dass der Mitgliedsbeitrag einen negativen Effekt hat: Erhöht sich der Mitgliedsbeitrag um eine Einheit (z. B. in Euro), sinkt die Besucherzahl im Mittel um 43,23 Personen, sofern die anderen Variablen konstant bleiben. Die positiven Koeffizienten für Werbeausgaben und Fanartikelverkauf bedeuten, dass mit jeder zusätzlichen Einheit im Werbebudget oder Fanartikelverkauf steigt die Besucherzahl jeweils um 0,54 bzw. 0,97 Personen steigt, wenn alle anderen Einflussgrößen gleich bleiben.

13) Modellgüte

Das Bestimmtheitsmaß ist eine Kennzahl, die beschreibt, wie gut eine Regressionsanalyse die beobachteten Daten wiedergibt. Es zeigt an, welcher Anteil der Gesamtschwankung der abhängigen Variable durch die gewählten Einflussgrößen erklärt werden kann. Ein R²-Wert von 0 bedeutet, dass das Modell keine Vorhersagekraft besitzt; ein Wert von 1 steht für eine perfekte Erklärung der Daten. Werte näher an 1 deuten also darauf hin, dass das Modell sehr gut geeignet ist, die beobachteten Zusammenhänge abzubilden.

Bei der multiplen Regression ist zu beachten, dass R² allein oft zu optimistisch ausfällt, weil es bei jeder zusätzlichen unabhängigen Variable automatisch steigt – selbst wenn diese keinen wirklichen Mehrwert bietet. Aus diesem Grund wird häufig das angepasste (korrigierte) R² berichtet. Dieses korrigiert den Wert nach unten, falls unnötig viele Einflussgrößen berücksichtigt werden, und ist dadurch ein zuverlässigeres Maß für die Modellgüte.

# Modellgüte berechnen
summary_model <- summary(regression1)

R <- sqrt(summary_model$r.squared)
R2 <- summary_model$r.squared
adjR2 <- summary_model$adj.r.squared
SE <- summary_model$sigma

# Durbin-Watson-Test
dw <- lmtest::dwtest(regression1)$statistic

# Alles in ein DataFrame 
modelguete <- data.frame(
  R = round(R, 3),
  R_Quadrat = round(R2, 3),
  Korrigiertes_R_Quadrat = round(adjR2, 3),
  Standardfehler_des_Schätzers = round(SE, 3),
  Durbin_Watson_Statistik = round(dw, 3)
)

print(modelguete)

Ein korrigiertes R² von 0,80 besagt zum Beispiel, dass 80 % der Streuung in den Daten durch die gewählten unabhängigen Variablen erklärt werden können.

14) Berechnung der Effektstärke

Um zu beurteilen, wie bedeutsam das Ergebnis einer Regression ist, berechnet man oft eine Effektstärke. Auch wenn ein hoher Anteil der Streuung in der Zielgröße erklärt wird, stellt sich die Frage, wie groß dieser Effekt im Vergleich zu typischen Standards einzuschätzen ist.

Es existieren verschiedene Maße für die Effektstärke. Zu den gebräuchlichsten zählt das nach Cohen benannte Maß \(f^2\), das insbesondere für Regressionsanalysen geeignet ist. Damit lässt sich abschätzen, ob der gefundene Zusammenhang schwach, mittel oder stark ist.

Die Effektstärke \(f^2\) kann aus dem Bestimmtheitsmaß \(R^2\) berechnet werden:

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

wobei:

Beispiel:
Angenommen, \(R^2 = 0,80\), ergibt sich:

\[ f^2 = \frac{0,80}{1 - 0,80} = \frac{0,80}{0,20} = 4,0 \]

Zur Einordnung schlägt Cohen (1992) folgende Schwellenwerte vor:

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

reg <- summary(regression1)

f<- reg$adj.r.squared/ (1-reg$adj.r.squared)
sprintf("Die Effektstärke liegt bei: %.2f", f)
[1] "Die Effektstärke liegt bei: 4.00"

Ein Wert von \(f^2 = 4,0\) steht damit für einen sehr starken Effekt.

15) Eine Aussage

Eine multiple Regressionsanalyse ergab, dass sowohl die Zahl der verkauften Fanartikel, der Mitgliedsbeitrag als auch die Werbeausgaben einen Einfluss auf die Besucherzahl bei Vereinsveranstaltungen haben, F(3,32) = 47,65, p < .001, n = 36. Erhöht sich der Mitgliedsbeitrag um einen Euro, sinkt die Besucherzahl im Durchschnitt um 43,23 Personen. Werden die Werbeausgaben um einen Euro gesteigert, steigt die Besucherzahl um etwa 0,54 Personen. Jeder zusätzlich verkaufte Fanartikel führt durchschnittlich zu 0,97 weiteren Besuchern. Insgesamt erklären diese drei Faktoren 80 % der Streuung in den Besucherzahlen – ein Wert, der gemäß Cohen (1992) auf einen starken Effekt hinweist.

LS0tCnRpdGxlOiAiRGllIG11bHRpcGxlIFJlZ3Jlc3Npb24iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyMgUGFrZXRlIGltcG9ydGllcmVuCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGhhdmVuKQpsaWJyYXJ5KGNhcikKbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykKbGlicmFyeShwc3ljaCkKbGlicmFyeShrbml0cikKbGlicmFyeShicm9vbSkKbGlicmFyeShsbXRlc3QpCmxpYnJhcnkobG0uYmV0YSkKbGlicmFyeShyZWFkeGwpCmBgYAojIyBEYXRlbiBlaW5sZXNlbgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KCiNNdWx0aXBsZV9SZWdyZXNzaW9uIDwtIHJlYWRfZXhjZWwoIk11bHRpcGxlX1JlZ3Jlc3Npb24ueGxzeCIpCiNWaWV3KE11bHRpcGxlX1JlZ3Jlc3Npb24pCmF0dGFjaChNdWx0aXBsZV9SZWdyZXNzaW9uKQoKYGBgCgojIDEpIEh5cG90aGVzZSAKCioqTnVsbGh5cG90aGVzZSAoSOKCgCk6KioKCkFsbGUgUmVncmVzc2lvbnNrb2VmZml6aWVudGVuIHNpbmQgZ2xlaWNoIG51bGw6ClxbCkhfMDogXGJldGFfMSA9IFxiZXRhXzIgPSBcYmV0YV8zID0gMApcXQoqRGllIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGhhYmVuIGdlbWVpbnNhbSBrZWluZW4gRWluZmx1c3MgYXVmIGRpZSBCZXN1Y2hlcnphaGwuKgoKKipBbHRlcm5hdGl2aHlwb3RoZXNlIChI4oKBKToqKgoKTWluZGVzdGVucyBlaW4gUmVncmVzc2lvbnNrb2VmZml6aWVudCBpc3QgdW5nbGVpY2ggbnVsbDoKXFsKSF8xOiBcdGV4dHtNaW5kZXN0ZW5zIGVpbiB9IFxiZXRhX2ogXG5lcSAwClxdCipNaW5kZXN0ZW5zIGVpbmUgZGVyIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGJlZWluZmx1c3N0IGRpZSBCZXN1Y2hlcnphaGwuKgoKCgojIDIpCUdydW5kbGVnZW5kZSBLb256ZXB0ZTogV2FzIGlzdCBtdWx0aXBsZSBSZWdyZXNzaW9uPwoKRGllIG11bHRpcGxlIFJlZ3Jlc3Npb24gaXN0IGVpbiBzdGF0aXN0aXNjaGVzIFZlcmZhaHJlbiwgbWl0IGRlbSB1bnRlcnN1Y2h0IHdpcmQsIHdpZSBtZWhyZXJlIHVuYWJow6RuZ2lnZSBWYXJpYWJsZW4gZ2VtZWluc2FtIGRpZSBBdXNwcsOkZ3VuZyBlaW5lciBhYmjDpG5naWdlbiBWYXJpYWJsZW4gdm9yaGVyc2FnZW4gb2RlciBlcmtsw6RyZW4ga8O2bm5lbi4gV8OkaHJlbmQgZGllIGVpbmZhY2hlIGxpbmVhcmUgUmVncmVzc2lvbiBudXIgZWluZW4gRWluZmx1c3NmYWt0b3IgYmV0cmFjaHRldCwgYW5hbHlzaWVydCBkaWUgbXVsdGlwbGUgUmVncmVzc2lvbiBkZW4gRWluZmx1c3MgbWVocmVyZXIgRmFrdG9yZW4gZ2xlaWNoemVpdGlnLiBTbyBrYW5uIG1hbiB6dW0gQmVpc3BpZWwgZXJmb3JzY2hlbiwgd2llIE1pdGdsaWVkc2JlaXRyYWcsIFdlcmJlYXVzZ2FiZW4gdW5kIFByb2R1a3RxdWFsaXTDpHQgenVzYW1tZW4gZGllIFZlcmthdWZzemFobGVuIGJlZWluZmx1c3Nlbi4gRGFiZWkgemVpZ3QgZGFzIFZlcmZhaHJlbiBuaWNodCBudXIsIHdpZSBzdGFyayBqZWRlIGVpbnplbG5lIFZhcmlhYmxlIGRpZSBhYmjDpG5naWdlIFZhcmlhYmxlIGJlZWluZmx1c3N0LCBzb25kZXJuIGF1Y2gsIHdpZSBndXQgZGFzIEdlc2FtdG1vZGVsbCBkaWUgdGF0c8OkY2hsaWNoZW4gV2VydGUgdm9yaGVyc2FndC4gRGllIG11bHRpcGxlIFJlZ3Jlc3Npb24gd2lyZCBow6R1ZmlnIGluIFNvemlhbHdpc3NlbnNjaGFmdGVuLCBXaXJ0c2NoYWZ0IHVuZCBNZWRpemluIGdlbnV0enQsIHVtIGtvbXBsZXhlIFp1c2FtbWVuaMOkbmdlIHp3aXNjaGVuIHZlcnNjaGllZGVuZW4gRWluZmx1c3NncsO2w59lbiB1bmQgZWluZW0gRXJnZWJuaXMgenUgYW5hbHlzaWVyZW4gdW5kIGZ1bmRpZXJ0ZSBFbnRzY2hlaWR1bmdlbiBhdWYgQmFzaXMgZGVyIGVybWl0dGVsdGVuIFp1c2FtbWVuaMOkbmdlIHp1IHRyZWZmZW4uCgoKIyAzKQlQcsO8ZmVuIGRlciBWb3JhdXNzZXR6dW5nZW4KCi0gRGllIGFiaMOkbmdpZ2UgVmFyaWFibGUgaXN0IGludGVydmFsbHNrYWxpZXJ0LCBkaWUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gc2luZCBpbnRlcnZhbGxza2FsaWVydCBvZGVyIGFscyBEdW1teS1WYXJpYWJsZW4gY29kaWVydC4KCi0gKipVbmFiaMOkbmdpZ2UgVmFyaWFibGVuIChVVik6KiogIAogIC0gTWl0Z2xpZWRzYmVpdHJhZyAo4oKsKSAgCiAgLSBXZXJiZWF1c2dhYmVuICjigqwpICAKICAtIEZhbmFydGlrZWx2ZXJrYXVmCgotICoqQWJow6RuZ2lnZSBWYXJpYWJsZSAoQVYpOioqICAKICAtIEJlc3VjaGVyIChBbnphaGwpCgotICoqTGluZWFyaXTDpHQgZGVzIFp1c2FtbWVuaGFuZ3M6KiogIAogIEVzIHdpcmQgZWluIGxpbmVhcmVyIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgYWJow6RuZ2lnZW4gdW5kIGRlbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiBtb2RlbGxpZXJ0ICAKICBfKHNpZWhlIFNjYXR0ZXJwbG90IHVuZCBQZWFyc29uLUtvcnJlbGF0aW9uKV8KCi0gKipIb21vc2tlZGFzdGl6aXTDpHQ6KiogIAogIEbDvHIgamVkZW4gV2VydCBkZXIgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gaGF0IGRlciBGZWhsZXJ3ZXJ0IGRpZXNlbGJlIFZhcmlhbnogIAogIF8oc2llaGUgSG9tb3NrZWRhc3Rpeml0w6R0KV8KCi0gKipVbmFiaMOkbmdpZ2tlaXQgZGVzIEZlaGxlcndlcnRzOioqICAKICBEaWUgRmVobGVyd2VydGUgaMOkbmdlbiBuaWNodCB2b25laW5hbmRlciBhYiAgCiAgXyhzaWVoZSBTY2F0dGVycGxvdCB1bmQgUGVhcnNvbi1Lb3JyZWxhdGlvbilfCgotICoqTm9ybWFsdmVydGVpbHVuZyBkZXMgRmVobGVyd2VydHM6KiogIAogIERpZSBGZWhsZXJ3ZXJ0ZSBzaW5kIG7DpGhlcnVuZ3N3ZWlzZSBub3JtYWx2ZXJ0ZWlsdCAgCiAgXyhzaWVoZSBIaXN0b2dyYW1tKV8KCi0gKipLZWluZSBNdWx0aWtvbGxpbmVhcml0w6R0OioqICAKICBEaWUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4ga29ycmVsaWVyZW4gbmljaHQgenUgc3RhcmsgbWl0ZWluYW5kZXIgIAogIF8oc2llaGUgTXVsdGlrb2xsaW5lYXJpdMOkdClfCgoKIyA0KSBCb3hwbG90IAoKYGBge3J9CnBhcihtZnJvdz1jKDEsNCkpCmJveHBsb3QoRmFuYXJ0aWtlbHZlcmthdWYsIG1haW49IkJveHBsb3QgRmFuYXJ0aWtlbHZlcmthdWYiKQpib3hwbG90KEJlc3VjaGVyemFobGVuLCBtYWluPSJCb3hwbG90IEJlc3VjaGVyIikKYm94cGxvdChXZXJiZWF1c2dhYmVuLCBtYWluPSJCb3hwbG90IFdlcmJlYXVzZ2FiZW4iKQpib3hwbG90KE1pdGdsaWVkc2JlaXRyYWcsIG1haW49IkJveHBsb3QgTWl0Z2xpZWRzYmVpdHJhZyIpCmBgYAoKS2VpbmUgQXVzcmVpw59lciB6dSBlcmtlbm5lbi4KCiMgNSkgRGVza3JpcHRpdmUgU3RhdGlzdGlrCgpgYGB7cn0KcHN5Y2g6OmRlc2NyaWJlKE11bHRpcGxlX1JlZ3Jlc3Npb24pCmBgYAoKRGllIFRhYmVsbGUgZ2lidCBlaW5lbiDDnGJlcmJsaWNrIMO8YmVyIGRpZSBkZXNrcmlwdGl2ZW4gU3RhdGlzdGlrZW4gdm9uIGbDvG5mIFZhcmlhYmxlbiBhdXMgZGVtIERhdGVuc2F0ei4gRsO8ciBkaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBCZXN1Y2hlciBsYWcgZGVyIE1pdHRlbHdlcnQgYmVpIE0gPSAxODc3Ljg5LCBtaXQgZWluZXIgU3RhbmRhcmRhYndlaWNodW5nIHZvbiBTRCA9IDM1MC41MiAobiA9IDM2KS4gRGllIEJlc3VjaGVyemFobGVuIHZhcmlpZXJ0ZW4gZGFiZWkgendpc2NoZW4gMTE3MiB1bmQgMjYwNC4gRGVyIE1pdGdsaWVkc2JlaXRyYWcgKE1pdGdsaWVkc2JlaXRyYWcpIHplaWd0ZSBlaW5lbiBNaXR0ZWx3ZXJ0IHZvbiBNID0gMTEwLjM4IChTRCA9IDEuNjEsIG4gPSAzNiksIG1pdCBXZXJ0ZW4gdm9uIDEwNyBiaXMgMTEzLiBGw7xyIGRhcyBXZXJiZWJ1ZGdldCAoV2VyYmVhdXNnYWJlbikgd3VyZGUgZWluIE1pdHRlbHdlcnQgdm9uIE0gPSAxMjc0LjQ0IChTRCA9IDQ4MS41MCwgbiA9IDM2KSBiZWkgZWluZXIgU3Bhbm53ZWl0ZSB2b24gNDYwIGJpcyAyMDAwIGJlb2JhY2h0ZXQuIERpZSBWYXJpYWJsZSBGYW5hcnRpa2VsdmVya2F1ZiBoYXR0ZSBlaW5lbiBNaXR0ZWx3ZXJ0IHZvbiBNID0gOTA1LjI4IChTRCA9IDE1OS40NywgbiA9IDM2KSwgbWl0IFdlcnRlbiB6d2lzY2hlbiA2MDAgdW5kIDEyNTAuIERpZSBJRC1WYXJpYWJsZSBkaWVudCBsZWRpZ2xpY2ggZGVyIElkZW50aWZpa2F0aW9uIGRlciBlaW56ZWxuZW4gRsOkbGxlIHVuZCBpc3QgZsO8ciBkaWUgaW5oYWx0bGljaGUgQW5hbHlzZSBuaWNodCByZWxldmFudC4KCgojIDYpIFNjYXR0ZXJwbG90IHVuZCBQZWFyc29uCkVpbiBsaW5lYXJlcyBNb2RlbGwgZ2VodCBkYXZvbiBhdXMsIGRhc3MgZGVyIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgYWJow6RuZ2lnZW4gVmFyaWFibGUgdW5kIGplZGVyIHVuYWJow6RuZ2lnZW4gVmFyaWFibGUgbGluZWFyIGlzdCDigJMgdW5kIHp3YXIgdW50ZXIgZGVyIEtvbnRyb2xsZSBhbGxlciB3ZWl0ZXJlbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbi4gQmVpIG11bHRpcGxlciBSZWdyZXNzaW9uIGJlZGV1dGV0IGRhczogRGllIEJlemllaHVuZyB6d2lzY2hlbiBlaW5lciB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlIHVuZCBkZXIgWmllbGdyw7bDn2Ugc29sbHRlIGF1Y2ggZGFubiBsaW5lYXIgc2Vpbiwgd2VubiBtYW4gZGllIEVmZmVrdGUgZGVyIGFuZGVyZW4gRWluZmx1c3NncsO2w59lbiBiZXLDvGNrc2ljaHRpZ3QuCgpEaWVzZSBCZWRpbmd1bmcgbMOkc3N0IHNpY2ggamVkb2NoIG5pY2h0IGFsbGVpbiBtaXQgZWluZW0gZWluZmFjaGVuIFN0cmV1ZGlhZ3JhbW0gendpc2NoZW4gYWJow6RuZ2lnZXIgdW5kIGVpbmVyIHVuYWJow6RuZ2lnZW4gVmFyaWFibGUgcHLDvGZlbi4gSW0gR2VnZW5zYXR6IHp1ciBlaW5mYWNoZW4gUmVncmVzc2lvbiBrw7ZubmVuIHdlaXRlcmUgRWluZmx1c3NmYWt0b3JlbiBkYXMgVmVyaMOkbHRuaXMgdmVyZsOkbHNjaGVuLCBzb2Rhc3MgZGllIHRhdHPDpGNobGljaGUgQmV6aWVodW5nIGtvbXBsZXhlciBpc3QuIEVpbiBlaW5mYWNoZXMgU3RyZXVkaWFncmFtbSBiaWV0ZXQgZGFoZXIgbnVyIGVpbmVuIGdyb2JlbiBlcnN0ZW4gQW5oYWx0c3B1bmt0LCBvYiBlaW5lIGxpbmVhcmUgQmV6aWVodW5nIHZvcmxpZWdlbiBrw7ZubnRlLCB1bmQgd2lyZCBow6R1ZmlnIGFscyBlcnN0ZXIsIG9yaWVudGllcmVuZGVyIFNjaHJpdHQgZ2VudXR6dC4gRsO8ciBlaW5lIGdlbmF1ZSDDnGJlcnByw7xmdW5nIHNpbmQgd2VpdGVyZsO8aHJlbmRlIGdyYWZpc2NoZSBNZXRob2RlbiBlcmZvcmRlcmxpY2guCgoKYGBge3J9CmxpYnJhcnkoY2FyKQoKc2NhdHRlcnBsb3RNYXRyaXgofk1pdGdsaWVkc2JlaXRyYWcrRmFuYXJ0aWtlbHZlcmthdWYrV2VyYmVhdXNnYWJlbiArIEJlc3VjaGVyemFobGVuLCAKICAgICAgICAgICAgICAgICAgICAgICByZWdMaW5lPVRSVUUsIHNtb290aD1GQUxTRSwgCiAgZGlhZ29uYWw9bGlzdChtZXRob2Q9ImRlbnNpdHkiKSwgYnkuZ3JvdXBzPVRSVUUsIAogIGRhdGE9TXVsdGlwbGVfUmVncmVzc2lvbikKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQpjaGFydC5Db3JyZWxhdGlvbihNdWx0aXBsZV9SZWdyZXNzaW9uWzE6NF0sCmhpc3RvZ3JhbT1UUlVFLAptZXRob2QgPSAicGVhcnNvbiIsCnBjaD0xOSkKYGBgCgpEaWUgU3RyZXVkaWFncmFtbS1NYXRyaXggbGllZmVydCBlaW5lbiBlcnN0ZW4gRWluZHJ1Y2sgZGF2b24sIHdpZSBkaWUgYWJow6RuZ2lnZSBWYXJpYWJsZSBtaXQgZGVuIGVpbnplbG5lbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiB6dXNhbW1lbmjDpG5ndC4gRGFiZWkgd2lyZCBzaWNodGJhciwgZGFzcyB6d2lzY2hlbiBkZW4gdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gdW5kIGRlciBaaWVsZ3LDtsOfZSB6dW1pbmRlc3QgYXVmIGRlbiBlcnN0ZW4gQmxpY2sgamV3ZWlscyBlaW5lIGxpbmVhcmUgQmV6aWVodW5nIGRlbmtiYXIgaXN0OiBEaWUgQmVzdWNoZXJ6YWhsIG5pbW10IG1pdCBow7ZoZXJlbiBGYW5hcnRpa2VsdmVya8OkdWZlbiB1bmQgZWluZW0gZ3LDtsOfZXJlbiBXZXJiZWJ1ZGdldCBvZmZlbmJhciB6dS4gRGVyIFp1c2FtbWVuaGFuZyBtaXQgZGVtIFRpY2tldE1pdGdsaWVkc2JlaXRyYWcgZXJzY2hlaW50IGRhZ2VnZW4gd2VuaWdlciBhdXNnZXByw6RndC4KClVtIGRpZSBBbm5haG1lIGRlciBMaW5lYXJpdMOkdCBnZW5hdWVyIHp1IMO8YmVycHLDvGZlbiwgZW1wZmllaGx0IGVzIHNpY2gsIGbDvHIgamVkZSB1bmFiaMOkbmdpZ2UgVmFyaWFibGUgZWluIHNwZXppZWxsZXMgU3RyZXVkaWFncmFtbSB6dSBlcnN0ZWxsZW4sIGRhcyBzb2dlbmFubnRlIENvbXBvbmVudC1wbHVzLXJlc2lkdWFsLVBsb3QuIERhbWl0IGzDpHNzdCBzaWNoIGVya2VubmVuLCBvYiBkaWUgQmV6aWVodW5nIHRhdHPDpGNobGljaCBsaW5lYXIgaXN0IG9kZXIgb2IgbcO2Z2xpY2hlcndlaXNlIGVpbmUgYW5kZXJlIEZvcm0gZGVzIFp1c2FtbWVuaGFuZ3Mgdm9ybGllZ3QuIEFsdGVybmF0aXYga8O2bm5lbiBhdWNoIHBhcnRpZWxsZSBSZWdyZXNzaW9uc2RpYWdyYW1tZSB2ZXJ3ZW5kZXQgd2VyZGVuLCBkaWUgZsO8ciBqZWRlIFZhcmlhYmxlIGRpZSBCZXppZWh1bmcgenVtIFJlc3QgZGVzIE1vZGVsbHMgZGFyc3RlbGxlbi4KCgpgYGB7cn0KIyBtb2RlbGwgCm1vZGVsbCA8LSBsbShCZXN1Y2hlcnphaGxlbiB+IE1pdGdsaWVkc2JlaXRyYWcgKyBXZXJiZWF1c2dhYmVuICsgRmFuYXJ0aWtlbHZlcmthdWYsIGRhdGEgPSBNdWx0aXBsZV9SZWdyZXNzaW9uKQoKIyBDb21wb25lbnQtcGx1cy1yZXNpZHVhbC1QbG90IGbDvHIgRmFuYXJ0aWtlbHZlcmthdWYKY3JQbG90cyhtb2RlbGwsIHRlcm1zID0gfiBGYW5hcnRpa2VsdmVya2F1ZikKYGBgCgpEYXMgcGFydGllbGxlIFJlZ3Jlc3Npb25zZGlhZ3JhbW0gZsO8ciBGYW5hcnRpa2VsdmVya2F1ZiB6ZWlndCBhdWYgZGVyIFktQWNoc2UgZGFzIFJlc2lkdXVtLCBkYXMgZW50c3RlaHQsIHdlbm4gZGllIFZhcmlhYmxlIEJlc3VjaGVyIGF1ZiBhbGxlIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGF1w59lciBGYW5hcnRpa2VsdmVya2F1ZiByZWdyZXNzaWVydCB3aXJkLiBBdWYgZGVyIFgtQWNoc2UgaXN0IGRhcyBSZXNpZHV1bSBkYXJnZXN0ZWxsdCwgZGFzIMO8YnJpZyBibGVpYnQsIHdlbm4gRmFuYXJ0aWtlbHZlcmthdWYgYXVmIGFsbGUgYW5kZXJlbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiByZWdyZXNzaWVydCB3aXJkLiBEYXMgYmVkZXV0ZXQ6IEVzIHdpcmQgamV3ZWlscyBkZXIgVGVpbCBiZXRyYWNodGV0LCBkZXIgZHVyY2ggZGllIGFuZGVyZW4gdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gbmljaHQgZXJrbMOkcnQgd2VyZGVuIGthbm4uIERpZXNlIGJlaWRlbiBSZXNpZHVlbiB3ZXJkZW4gZ2VnZW5laW5hbmRlciBhdWZnZXRyYWdlbi4KClplaWdlbiBkaWUgcGFydGllbGxlbiBSZWdyZXNzaW9uc2RpYWdyYW1tZSBmw7xyIGFsbGUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gZWluZSBsaW5lYXJlIEJlemllaHVuZywga2FubiBkYXZvbiBhdXNnZWdhbmdlbiB3ZXJkZW4sIGRhc3MgZGllIExpbmVhcml0w6R0c3ZvcmF1c3NldHp1bmcgZXJmw7xsbHQgaXN0LiBJbiBBYmJpbGR1bmcgNCBpc3QgZGllcyBmw7xyIEZhbmFydGlrZWx2ZXJrYXVmIGRlciBGYWxsLiBBdWNoIGJlaSBkZW4gYW5kZXJlbiB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiB6ZWlndCBzaWNoIGRpZXNlIExpbmVhcml0w6R0LCB3YXMgYXVzIEdyw7xuZGVuIGRlciDDnGJlcnNpY2h0bGljaGtlaXQgaGllciBqZWRvY2ggbmljaHQgd2VpdGVyIGRhcmdlc3RlbGx0IHdpcmQuCgojIDcpIEhvbW9za2VkYXN0aXppdMOkdAoKSG9tb3NrZWRhc3Rpeml0w6R0IGJlZGV1dGV0LCBkYXNzIGRpZSBGZWhsZXIgZsO8ciBqZWRlbiBXZXJ0IGRlciB1bmFiaMOkbmdpZ2VuIFZhcmlhYmxlbiBlaW5lIGtvbnN0YW50ZSBWYXJpYW56IGF1ZndlaXNlbi4gRGFzIHdpcmQgbWVpc3QgYW5oYW5kIGVpbmVzIFN0cmV1ZGlhZ3JhbW1zIMO8YmVycHLDvGZ0LCBpbiBkZW0gZGllIFJlc2lkdWVuIGdlZ2VuIGRpZSB2b3JoZXJnZXNhZ3RlbiBXZXJ0ZSBhdWZnZXRyYWdlbiB3ZXJkZW4uIERpZSBWb3JhdXNzZXR6dW5nIGlzdCBlcmbDvGxsdCwgd2VubiBzaWNoIGRpZSBGZWhsZXJ3ZXJ0ZSDDvGJlciBkZW4gZ2VzYW10ZW4gV2VydGViZXJlaWNoIGRlciBWb3JoZXJzYWdlbiB6dWbDpGxsaWcgdW5kIG9obmUgZXJrZW5uYmFyZXMgTXVzdGVyIHZlcnRlaWxlbiB1bmQgaWhyZSBTdHJldXVuZyBpbiBldHdhIGdsZWljaCBibGVpYnQuCgpGYWxscyBkaWUgU3RyZXV1bmcgZGVyIEZlaGxlciBuaWNodCBrb25zdGFudCBpc3QsIHNwcmljaHQgbWFuIHZvbiBIZXRlcm9za2VkYXN0aXppdMOkdC4gSW4gc29sY2hlbiBGw6RsbGVuIGVya2VubnQgbWFuIGjDpHVmaWcgZWluIGJlc3RpbW10ZXMgTXVzdGVyIGltIFN0cmV1ZGlhZ3JhbW0sIGJlaXNwaWVsc3dlaXNlIGVpbmUgdHJpY2h0ZXJmw7ZybWlnZSBvZGVyIHRyb21wZXRlbmFydGlnZSBBdXNwcsOkZ3VuZy4KCmBgYHtyfQoKcmVncmVzc2lvbjEgPC0gIGxtKEJlc3VjaGVyemFobGVuIH4gTWl0Z2xpZWRzYmVpdHJhZytGYW5hcnRpa2VsdmVya2F1ZitXZXJiZWF1c2dhYmVuICkKCnpwcmVkIDwtIHNjYWxlKGZpdHRlZChyZWdyZXNzaW9uMSksIGNlbnRlciA9IFQsIHNjYWxlID0gVCkKc3JlcyA8LXJzdGFuZGFyZChyZWdyZXNzaW9uMSkKCnBsb3QgKHg9enByZWQsIHk9c3JlcywgbWFpbiA9ICJTdHJldWRpYWdyYW1tIGRlciBSZXNpZHVlbiIsIAogICAgICB4bGFiID0iUmVncmVzc2lvbjogU3RhbmRhcmRpc2llcnRlciBnZXNjaMOkdHp0ZXIgV2VydCIsIAogICAgICB5bGFiID0gIlJlZ3Jlc3Npb246IFN0YW5kYXJkaXNpZXJ0ZXMgUmVzaWR1dW0iLAogICAgICBjb2wgPSAiZGFya2JsdWUiKQoKYWJsaW5lIChhPTAsIGI9MCkKCmBgYAoKCk5lYmVuIGRlciB2aXN1ZWxsZW4gQmV1cnRlaWx1bmcgZ2lidCBlcyBhdWNoIHZlcnNjaGllZGVuZSBzdGF0aXN0aXNjaGUgVGVzdHMsIG1pdCBkZW5lbiBIb21vc2tlZGFzdGl6aXTDpHQgZ2VwcsO8ZnQgd2VyZGVuIGthbm4sIHp1bSBCZWlzcGllbCBkZW4gQnJldXNjaC1QYWdhbi1UZXN0LCBkZW4gQ29vay1XZWlzYmVyZy1UZXN0IG9kZXIgZGVuIFdoaXRlLVRlc3QuIFdpcmQgYmVpIGRpZXNlbiBUZXN0cyBkaWUgTnVsbGh5cG90aGVzZSBuaWNodCB2ZXJ3b3JmZW4sIHNwcmljaHQgZGFzIGbDvHIgSG9tb3NrZWRhc3Rpeml0w6R0LiBEYXMgRXJnZWJuaXMgZ2lsdCBhbHMgdW5wcm9ibGVtYXRpc2NoLCB3ZW5uIGRlciBwLVdlcnQgZ3LDtsOfZXIgYWxzIDAsMDUgaXN0LiBXaXJkIGRpZXNlciBXZXJ0IG5pY2h0IHVudGVyc2Nocml0dGVuLCBrYW5uIGRhdm9uIGF1c2dlZ2FuZ2VuIHdlcmRlbiwgZGFzcyBkaWUgQW5uYWhtZSBkZXIgSG9tb3NrZWRhc3Rpeml0w6R0IGVyZsO8bGx0IGlzdC4KCgojIDgpIFVuYWJow6RuZ2lna2VpdCBkZXMgRmVobGVyd2VydHMKCkbDvHIgZGllIG11bHRpcGxlIFJlZ3Jlc3Npb24gaXN0IGVzIHdpY2h0aWcsIGRhc3MgZGllIEZlaGxlciB2ZXJzY2hpZWRlbmVyIEJlb2JhY2h0dW5nZW4gdW5hYmjDpG5naWcgdm9uZWluYW5kZXIgc2luZC4gRGFzIGJlZGV1dGV0LCBkYXNzIGRpZSBGZWhsZXJ3ZXJ0ZSBuaWNodCBtaXRlaW5hbmRlciBpbiBWZXJiaW5kdW5nIHN0ZWhlbiBkw7xyZmVuIHVuZCBrZWluZSBzeXN0ZW1hdGlzY2hlbiBNdXN0ZXIgYXVmd2Vpc2VuLCB3aWUgenVtIEJlaXNwaWVsIHplaXRsaWNoZSBvZGVyIHLDpHVtbGljaGUgQWJmb2xnZW4uIFdlcmRlbiBBYmjDpG5naWdrZWl0ZW4gZmVzdGdlc3RlbGx0LCBrYW5uIGRpZXMgYmVpc3BpZWxzd2Vpc2UgYW4gbWVocmZhY2hlbiBNZXNzdW5nZW4gaW5uZXJoYWxiIGRlcnNlbGJlbiBHcnVwcGUgb2RlciBhbiB3aWVkZXJrZWhyZW5kZW4gWmVpdHB1bmt0ZW4gbGllZ2VuLgoKVHJldGVuIHNvbGNoZSBBYmjDpG5naWdrZWl0ZW4gYXVmLCBrYW5uIGRpZSBBbm5haG1lIGRlciBVbmFiaMOkbmdpZ2tlaXQgdmVybGV0enQgc2Vpbiwgd2FzIHNpY2ggbWVpc3QgZHVyY2ggYXVmZsOkbGxpZ2UgTXVzdGVyIGluIGRlbiBSZXNpZHVlbiDDpHXDn2VydC4gQmVpIHVuYWJow6RuZ2lnZW4gRmVobGVybiBzaW5kIGRhZ2VnZW4ga2VpbmUgUmVnZWxtw6TDn2lna2VpdGVuIGVya2VubmJhci4gSXN0IGRpZXMgZGVyIEZhbGwsIGthbm4gZGF2b24gYXVzZ2VnYW5nZW4gd2VyZGVuLCBkYXNzIGRpZSBWb3JhdXNzZXR6dW5nIGVyZsO8bGx0IGlzdC4KCk5lYmVuIGRlciB2aXN1ZWxsZW4gQmV1cnRlaWx1bmcgZ2lidCBlcyBhdWNoIHN0YXRpc3Rpc2NoZSBUZXN0cyB6dXIgw5xiZXJwcsO8ZnVuZyBkZXIgVW5hYmjDpG5naWdrZWl0IGRlciBGZWhsZXIsIHdpZSBldHdhIGRlbiBEdXJiaW4tV2F0c29uLVRlc3QuIEVpbiBXZXJ0IG5haGUgMiBkZXV0ZXQgZGFyYXVmIGhpbiwgZGFzcyBrZWluZSBBdXRva29ycmVsYXRpb24gdm9ybGllZ3QsIHfDpGhyZW5kIFdlcnRlIG5haGUgMCBvZGVyIDQgYXVmIGVpbmUgc3RhcmtlIEFiaMOkbmdpZ2tlaXQgZGVyIEZlaGxlcndlcnRlIGhpbmRldXRlbi4KCgojIDkpIE5vcm1hbHZlcnRlaWx1bmcgZGVzIEZlaGxlcndlcnRzCgpFaW5lIHdlaXRlcmUgVm9yYXVzc2V0enVuZyBpc3QsIGRhc3MgZGllIEZlaGxlcndlcnRlIGFubsOkaGVybmQgbm9ybWFsdmVydGVpbHQgc2luZC4gRGllcyBsw6Rzc3Qgc2ljaCBvZnQgZ3V0IGFuaGFuZCBlaW5lcyBIaXN0b2dyYW1tcyBkZXIgc3RhbmRhcmRpc2llcnRlbiBSZXNpZHVlbiBiZXVydGVpbGVuLiBJbSBJZGVhbGZhbGwgemVpZ3QgZGFzIEhpc3RvZ3JhbW0gZWluZSBnbG9ja2VuZsO2cm1pZ2UgVmVydGVpbHVuZy4gV2VpY2hlbiBkaWUgRmVobGVyIHN0YXJrIHZvbiBkZXIgTm9ybWFsdmVydGVpbHVuZyBhYiwgenVtIEJlaXNwaWVsIGluZGVtIHNpZSB6d2VpZ2lwZmxpZyAoYmltb2RhbCkgdmVydGVpbHQgc2luZCwga2FubiBkaWVzIHByb2JsZW1hdGlzY2ggZsO8ciBkaWUgSW50ZXJwcmV0YXRpb24gZGVyIFJlZ3Jlc3Npb25zYW5hbHlzZSBzZWluLiBLbGVpbmVyZSBBYndlaWNodW5nZW4gd2VyZGVuIGjDpHVmaWcgYWxzIHVua3JpdGlzY2ggYmV0cmFjaHRldC4KCgpgYGB7cn0KCiMgcmVncmVzc2lvbjEgPC0gIGxtKEJlc3VjaGVyemFobGVuIH4gTWl0Z2xpZWRzYmVpdHJhZytGYW5hcnRpa2VsdmVya2F1ZitXZXJiZWF1c2dhYmVuICkKIyAKIyB6cHJlZCA8LSBzY2FsZShmaXR0ZWQocmVncmVzc2lvbjEpLCBjZW50ZXIgPSBULCBzY2FsZSA9IFQpCiMgc3JlcyA8LXJzdGFuZGFyZChyZWdyZXNzaW9uMSkKCmhpc3QgKHNyZXMsIGZyZXEgPSBULCBicmVha3MgPSAxMCwgbWFpbiA9IlZlcnRlaWx1bmcgZGVzIEZlaGxlcndlcnRzIiwgeGxhYj0gIlJlZ3Jlc3Npb246IFN0YW5kYXJkaXNpZXJ0ZXMgUmVzaWR1dW0iLCB5bGFiPSJIw6R1Zmlna2VpdGVuIiwgeGxpbSA9IGMoLTMsMykseWxpbSA9IGMoMCwxMiksIGNvbCA9ICJsaWdodGJsdWUiICkKYGBgCgoKIyAxMCkgS2VpbmUgTXVsdGlrb2xsaW5lYXJpdMOkdAoKRsO8ciBkaWUgbXVsdGlwbGUgUmVncmVzc2lvbiBpc3QgZXMgd2VzZW50bGljaCwgZGFzcyBkaWUgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gbmljaHQgaW4gZWluZW0gc3RhcmtlbiBsaW5lYXJlbiBadXNhbW1lbmhhbmcgenVlaW5hbmRlciBzdGVoZW4uIERhcyBiZWRldXRldCwga2VpbmUgdW5hYmjDpG5naWdlIFZhcmlhYmxlIGRhcmYgc2ljaCBkdXJjaCBlaW5lIExpbmVhcmtvbWJpbmF0aW9uIGRlciBhbmRlcmVuIHZvbGxzdMOkbmRpZyBlcmtsw6RyZW4gbGFzc2VuLiBJbiBkZXIgUHJheGlzIHNpbmQga2xlaW5lIEtvcnJlbGF0aW9uZW4gbm9ybWFsLCBkb2NoIGVpbmUgenUgZ3Jvw59lIE11bHRpa29sbGluZWFyaXTDpHQgZsO8aHJ0IGRhenUsIGRhc3MgZGllIFNjaMOkdHp1bmcgZGVyIFJlZ3Jlc3Npb25za29lZmZpemllbnRlbiB1bnNpY2hlciB3aXJkLiBEYW5uIGthbm4gZXMgcGFzc2llcmVuLCBkYXNzIGVpZ2VudGxpY2ggd2ljaHRpZ2UgRWluZmx1c3NncsO2w59lbiBzdGF0aXN0aXNjaCB1bmF1ZmbDpGxsaWcgZXJzY2hlaW5lbi4KClp1ciDDnGJlcnByw7xmdW5nIHZvbiBNdWx0aWtvbGxpbmVhcml0w6R0IHdlcmRlbiB6d2VpIEtlbm56YWhsZW4gZ2VudXR6dDogKipUb2xlcmFuendlcnQqKiB1bmQgKipWYXJpYW56aW5mbGF0aW9uc2Zha3RvciAoVklGKSoqLiBCZWlkZSBHcsO2w59lbiBnZWJlbiBBdXNrdW5mdCBkYXLDvGJlciwgd2llIHNlaHIgZWluZSB1bmFiaMOkbmdpZ2UgVmFyaWFibGUgdm9uIGRlbiDDvGJyaWdlbiBhYmjDpG5ndC4gU2llIHN0ZWhlbiBpbiBlaW5lbSBLZWhyd2VydHZlcmjDpGx0bmlzIHp1ZWluYW5kZXIuCgoqKlRvbGVyYW56d2VydDoqKgoKJCQKVF9qID0gMSAtIFJfal4yCiQkCgpIaWVyYmVpIGlzdCBcKCBSX2peMiBcKSBkYXMgQmVzdGltbXRoZWl0c21hw58sIGRhcyBhbmdpYnQsIHdpZSBndXQgc2ljaCBkaWUgVmFyaWFibGUgXCggeF9qIFwpIGR1cmNoIGRpZSBhbmRlcmVuIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGVya2zDpHJlbiBsw6Rzc3QuCgoqKlZhcmlhbnppbmZsYXRpb25zZmFrdG9yIChWSUYpOioqCgokJApcdGV4dHtWSUZ9X2ogPSBcZnJhY3sxfXtUX2p9CiQkCiMjIyBGYXVzdHJlZ2VsIHp1ciBCZXVydGVpbHVuZzoKCi0gKipUb2xlcmFuendlcnQ6Kiogc29sbHRlICoqbmljaHQga2xlaW5lciBhbHMgMCwxMCoqIHNlaW4gIAotICoqVklGOioqIHNvbGx0ZSAqKm5pY2h0IGdyw7bDn2VyIGFscyAxMCoqIHNlaW4KCgpgYGB7cn0KIyByZWdyZXNzaW9uMSA8LSAgbG0oQmVzdWNoZXJ6YWhsZW4gfiBNaXRnbGllZHNiZWl0cmFnK0ZhbmFydGlrZWx2ZXJrYXVmK1dlcmJlYXVzZ2FiZW4gKQojIFZJRiBiZXJlY2huZW4KdmlmX3ZhbHVlcyA8LSB2aWYocmVncmVzc2lvbjEpCgoKIyBUb2xlcmFueiBiZXJlY2huZW4gKDEvVklGKQp0b2xlcmFueiA8LSAxIC8gdmlmX3ZhbHVlcwoKCiMgWnVzYW1tZW5mYXNzZW4gYWxzIERhdGFGcmFtZQplcmdlYm5pc3NlIDwtIGRhdGEuZnJhbWUoCiAgVmFyaWFibGUgPSBuYW1lcyh2aWZfdmFsdWVzKSwKICBWSUYgPSByb3VuZCh2aWZfdmFsdWVzLCAzKSwKICBUb2xlcmFueiA9IHJvdW5kKHRvbGVyYW56LCAzKQopCnByaW50KGVyZ2Vibmlzc2UpCmBgYAoKCldlcmRlbiBkaWVzZSBHcmVuendlcnRlIG5pY2h0IGVpbmdlaGFsdGVuLCBsaWVndCBlaW5lIHByb2JsZW1hdGlzY2hlIE11bHRpa29sbGluZWFyaXTDpHQgdm9yLiBJbiBkaWVzZW0gRmFsbCBzb2xsdGUgZGFzIFJlZ3Jlc3Npb25zbW9kZWxsIMO8YmVyYXJiZWl0ZXQgd2VyZGVuIOKAkyB6dW0gQmVpc3BpZWwsIGluZGVtIGJldHJvZmZlbmUgUHLDpGRpa3RvcmVuIGVudGZlcm50IG9kZXIgdW1nZXdhbmRlbHQgd2VyZGVuLiBQZXJmZWt0ZSBNdWx0aWtvbGxpbmVhcml0w6R0LCBhbHNvIGVpbmUgdm9sbHN0w6RuZGlnIGxpbmVhcmUgQmV6aWVodW5nLCB3aXJkIGF1dG9tYXRpc2NoIGVya2FubnQuIEJlaSBtb2RlcmF0ZXIgTXVsdGlrb2xsaW5lYXJpdMOkdCBpc3QgZWluZSBlaWdlbnN0w6RuZGlnZSBLb250cm9sbGUgdW5kIEFucGFzc3VuZyBub3R3ZW5kaWcuIFNpbmQgYWxsZSBWb3JhdXNzZXR6dW5nZW4gYWt6ZXB0YWJlbCBlcmbDvGxsdCwga2FubiBkYXMgTW9kZWxsIHdlaXRlciBpbnRlcnByZXRpZXJ0IHdlcmRlbi4KCgoKIyAxMSkgU2lnbmlmaWthbnogZGVzIFJlZ3Jlc3Npb25zbW9kZWxscwoKVW0genUgYmVzdGltbWVuLCBvYiBkYXMgUmVncmVzc2lvbnNtb2RlbGwgaW5zZ2VzYW10IHN0YXRpc3Rpc2NoIGJlZGV1dHNhbSBpc3QsIHdpcmQgZWluIEYtVGVzdCB2ZXJ3ZW5kZXQuIERpZXNlciBUZXN0IHByw7xmdCwgb2IgZGllIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGdlbWVpbnNhbSBkYXp1IGJlaXRyYWdlbiwgZGllIGFiaMOkbmdpZ2UgVmFyaWFibGUgYmVzc2VyIHZvcmhlcnp1c2FnZW4sIGFscyBlcyBkZXIgWnVmYWxsIGvDtm5udGUuIEFuZGVycyBnZXNhZ3QsIGJld2VydGV0IGRlciBGLVRlc3QsIG9iIGRhcyBnZXNhbXRlIE1vZGVsbCBlaW5lbiBzaWduaWZpa2FudGVuIEVya2zDpHJ1bmdzd2VydCBmw7xyIGRpZSBhYmjDpG5naWdlIFZhcmlhYmxlIGJlc2l0enQuCgokJEJlc3VjaGVyemFobGVuPVxiZXRhXzArXGJldGFfMVxjZG90IE1pdGdsaWVkc2JlaXRyYWcrXGJldGFfMlxjZG90IFdlcmJlYXVzZ2FiZW4rXGJldGFfM1xjZG90IFZlcmthdWYrXGVwc2lsb25faSQkCgoKV2VubiBkYXMgRXJnZWJuaXMgZGVzIEYtVGVzdHMgc2lnbmlmaWthbnQgYXVzZsOkbGx0ICh0eXBpc2NoZXJ3ZWlzZSBwIDwgMCwwNSksIHplaWd0IGRhcywgZGFzcyBkYXMgTW9kZWxsIGluc2dlc2FtdCBlaW5lbiByZWxldmFudGVuIEJlaXRyYWcgenVyIFZvcmhlcnNhZ2UgbGVpc3RldC4gSW4gZGllc2VtIEZhbGwga2FubiBkaWUgQW5hbHlzZSB3ZWl0ZXJnZWbDvGhydCB3ZXJkZW4sIGJlaXNwaWVsc3dlaXNlIGluZGVtIGRpZSBlaW56ZWxuZW4gRWluZmx1c3NncsO2w59lbiBiZXRyYWNodGV0IHdlcmRlbi4gSXN0IGRhcyBNb2RlbGwgaW5zZ2VzYW10IG5pY2h0IHNpZ25pZmlrYW50LCB3w6RyZSBlaW5lIHdlaXRlcmUgQW5hbHlzZSBuaWNodCBzaW5udm9sbC4KCgoKIyAxMikJU2lnbmlmaWthbnogZGVyIFJlZ3Jlc3Npb25za29lZmZpemllbnRlbiB1bmQgZGllIFJlZ3Jlc3Npb25zZ3JhZGUKCkhpZXIgd2lyZCBkaWUgTXVsdGlwbGUgUmVncmVzc2lvbiBkdXJjaGdlZsO8aHJ0LiBBY2h0ZW4gU2llIGF1ZiBkaWUgUnVuZHVuZy4gCgpgYGB7cn0KIyBtb2RlbGwKcmVncmVzc2lvbjEgPC0gIGxtKEJlc3VjaGVyemFobGVuIH4gTWl0Z2xpZWRzYmVpdHJhZytGYW5hcnRpa2VsdmVya2F1ZitXZXJiZWF1c2dhYmVuICkKCgojIEtvZWZmaXppZW50ZW4gaG9sZW4Ka29lZnMgPC0gdGlkeShyZWdyZXNzaW9uMSkKCiMgVklGIHVuZCBUb2xlcmFueiBiZXJlY2huZW4gCnZpZl92YWxzIDwtIHZpZihyZWdyZXNzaW9uMSkKdG9sZXJhbnogPC0gMSAvIHZpZl92YWxzCgojIEludGVyY2VwdApWSUZfZnVsbCA8LSBjKE5BLCByb3VuZCh2aWZfdmFscywgMykpICAgICAgICAjIEludGVyY2VwdCBoYXQga2VpbmVuIFZJRgpUb2xlcmFuel9mdWxsIDwtIGMoTkEsIHJvdW5kKHRvbGVyYW56LCAzKSkgICAjIEludGVyY2VwdCBoYXQga2VpbmUgVG9sZXJhbnoKCiMgQWxsZXMgaW4gZWluZSBUYWJlbGxlCmVyZ2Vibmlzc2UgPC0gZGF0YS5mcmFtZSgKICBWYXJpYWJsZSA9IGtvZWZzJHRlcm0sCiAgUmVncmVzc2lvbnNrb2VmZml6aWVudCA9IHJvdW5kKGtvZWZzJGVzdGltYXRlLCAzKSwKICBTdGFuZGFyZGZlaGxlciA9IHJvdW5kKGtvZWZzJHN0ZC5lcnJvciwgMyksCiAgdF9XZXJ0ID0gcm91bmQoa29lZnMkc3RhdGlzdGljLCAzKSwKICBwX1dlcnQgPSByb3VuZChrb2VmcyRwLnZhbHVlLCAzKSwKICBUb2xlcmFueiA9IFRvbGVyYW56X2Z1bGwsCiAgVklGID0gVklGX2Z1bGwKKQoKcHJpbnQoZXJnZWJuaXNzZSkKYGBgCkltIG7DpGNoc3RlbiBTY2hyaXR0IHdpcmQgdW50ZXJzdWNodCwgb2IgZGllIGVpbnplbG5lbiBFaW5mbHVzc2dyw7bDn2VuIChSZWdyZXNzaW9uc2tvZWZmaXppZW50ZW4pIHRhdHPDpGNobGljaCBlaW5lbiBiZWRldXRzYW1lbiBadXNhbW1lbmhhbmcgbWl0IGRlciBaaWVsZ3LDtsOfZSBoYWJlbi4gRGFmw7xyIHdpcmQgenUgamVkZW0gZWluemVsbmVuIEtvZWZmaXppZW50ZW4gZWluIHQtVGVzdCBkdXJjaGdlZsO8aHJ0LiBEYXMgRXJnZWJuaXMgemVpZ3QsIG9iIGRpZSBqZXdlaWxpZ2UgVmFyaWFibGUgZWluZW4gbWVzc2JhcmVuIEVpbmZsdXNzIGF1ZiBkaWUgQmVzdWNoZXJ6YWhsIGF1c8O8YnQuCgpEaWUgRXJnZWJuaXNzZSBkZXIgdC1UZXN0cyB6ZWlnZW4sIGRhc3MgZGllIFJlZ3Jlc3Npb25za29lZmZpemllbnRlbiBmw7xyIE1pdGdsaWVkc2JlaXRyYWcgKHQgPSAtMiw2MTIsIHAgPSAwLDAxNCksIFdlcmJlYXVzZ2FiZW4gKHQgPSA5LDY1NywgcCA8IDAsMDAxKSwgRmFuYXJ0aWtlbHZlcmthdWYgKHQgPSA1LDc1OSwgcCA8IDAsMDAxKSBzb3dpZSBmw7xyIGRpZSBLb25zdGFudGUgKFktQWNoc2VuYWJzY2huaXR0OyB0ID0gMiw3OTcsIHAgPSAwLDAwOSkgamV3ZWlscyBzdGF0aXN0aXNjaCBzaWduaWZpa2FudCBzaW5kLiBFaW4gc2lnbmlmaWthbnRlciBZLUFjaHNlbmFic2Nobml0dCBiZWRldXRldCwgZGFzcyBkaWUgUmVncmVzc2lvbnNnZXJhZGUgZGVuIFVyc3BydW5nIG5pY2h0IHNjaG5laWRldC4gRGllIHNpZ25pZmlrYW50ZW4gS29lZmZpemllbnRlbiBkZXIgdW5hYmjDpG5naWdlbiBWYXJpYWJsZW4gemVpZ2VuLCBkYXNzIGRpZXNlIEZha3RvcmVuIGVpbmVuIHJlbGV2YW50ZW4gRWluZmx1c3MgYXVmIGRpZSBCZXN1Y2hlcnphaGwgaGFiZW4uCgpEYXJhdXMgZXJnaWJ0IHNpY2ggZm9sZ2VuZGUgUmVncmVzc2lvbnNnbGVpY2h1bmc6CgoqKkJlc3VjaGVyemFobGVuID0gNTA5MSwyMSDigJMgNDMsMjMgwrcgTWl0Z2xpZWRzYmVpdHJhZyArIDAsNTQgwrcgV2VyYmVhdXNnYWJlbiArIDAsOTcgwrcgRmFuYXJ0aWtlbHZlcmthdWYqKgoKCkRpZSBHbGVpY2h1bmcgbWFjaHQgZGV1dGxpY2gsIGRhc3MgZGVyIE1pdGdsaWVkc2JlaXRyYWcgZWluZW4gbmVnYXRpdmVuIEVmZmVrdCBoYXQ6IEVyaMO2aHQgc2ljaCBkZXIgTWl0Z2xpZWRzYmVpdHJhZyB1bSBlaW5lIEVpbmhlaXQgKHou4oCvQi4gaW4gRXVybyksIHNpbmt0IGRpZSBCZXN1Y2hlcnphaGwgaW0gTWl0dGVsIHVtIDQzLDIzIFBlcnNvbmVuLCBzb2Zlcm4gZGllIGFuZGVyZW4gVmFyaWFibGVuIGtvbnN0YW50IGJsZWliZW4uIERpZSBwb3NpdGl2ZW4gS29lZmZpemllbnRlbiBmw7xyIFdlcmJlYXVzZ2FiZW4gdW5kIEZhbmFydGlrZWx2ZXJrYXVmIGJlZGV1dGVuLCBkYXNzIG1pdCBqZWRlciB6dXPDpHR6bGljaGVuIEVpbmhlaXQgaW0gV2VyYmVidWRnZXQgb2RlciBGYW5hcnRpa2VsdmVya2F1ZiBzdGVpZ3QgZGllIEJlc3VjaGVyemFobCBqZXdlaWxzIHVtIDAsNTQgYnp3LiAwLDk3IFBlcnNvbmVuIHN0ZWlndCwgd2VubiBhbGxlIGFuZGVyZW4gRWluZmx1c3NncsO2w59lbiBnbGVpY2ggYmxlaWJlbi4KCgojIDEzKSBNb2RlbGxnw7x0ZQpEYXMgQmVzdGltbXRoZWl0c21hw58gKipSwrIqKiBpc3QgZWluZSBLZW5uemFobCwgZGllIGJlc2NocmVpYnQsIHdpZSBndXQgZWluZSBSZWdyZXNzaW9uc2FuYWx5c2UgZGllIGJlb2JhY2h0ZXRlbiBEYXRlbiB3aWVkZXJnaWJ0LiBFcyB6ZWlndCBhbiwgd2VsY2hlciBBbnRlaWwgZGVyIEdlc2FtdHNjaHdhbmt1bmcgZGVyIGFiaMOkbmdpZ2VuIFZhcmlhYmxlIGR1cmNoIGRpZSBnZXfDpGhsdGVuIEVpbmZsdXNzZ3LDtsOfZW4gZXJrbMOkcnQgd2VyZGVuIGthbm4uIEVpbiBSwrItV2VydCB2b24gMCBiZWRldXRldCwgZGFzcyBkYXMgTW9kZWxsIGtlaW5lIFZvcmhlcnNhZ2VrcmFmdCBiZXNpdHp0OyBlaW4gV2VydCB2b24gMSBzdGVodCBmw7xyIGVpbmUgcGVyZmVrdGUgRXJrbMOkcnVuZyBkZXIgRGF0ZW4uIFdlcnRlIG7DpGhlciBhbiAxIGRldXRlbiBhbHNvIGRhcmF1ZiBoaW4sIGRhc3MgZGFzIE1vZGVsbCBzZWhyIGd1dCBnZWVpZ25ldCBpc3QsIGRpZSBiZW9iYWNodGV0ZW4gWnVzYW1tZW5ow6RuZ2UgYWJ6dWJpbGRlbi4KCgpCZWkgZGVyIG11bHRpcGxlbiBSZWdyZXNzaW9uIGlzdCB6dSBiZWFjaHRlbiwgZGFzcyBSwrIgYWxsZWluIG9mdCB6dSBvcHRpbWlzdGlzY2ggYXVzZsOkbGx0LCB3ZWlsIGVzIGJlaSBqZWRlciB6dXPDpHR6bGljaGVuIHVuYWJow6RuZ2lnZW4gVmFyaWFibGUgYXV0b21hdGlzY2ggc3RlaWd0IOKAkyBzZWxic3Qgd2VubiBkaWVzZSBrZWluZW4gd2lya2xpY2hlbiBNZWhyd2VydCBiaWV0ZXQuIEF1cyBkaWVzZW0gR3J1bmQgd2lyZCBow6R1ZmlnIGRhcyAqKmFuZ2VwYXNzdGUgKGtvcnJpZ2llcnRlKSBSwrIqKiBiZXJpY2h0ZXQuIERpZXNlcyBrb3JyaWdpZXJ0IGRlbiBXZXJ0IG5hY2ggdW50ZW4sIGZhbGxzIHVubsO2dGlnIHZpZWxlIEVpbmZsdXNzZ3LDtsOfZW4gYmVyw7xja3NpY2h0aWd0IHdlcmRlbiwgdW5kIGlzdCBkYWR1cmNoIGVpbiB6dXZlcmzDpHNzaWdlcmVzIE1hw58gZsO8ciBkaWUgTW9kZWxsZ8O8dGUuCmBgYHtyfQojIE1vZGVsbGfDvHRlIGJlcmVjaG5lbgpzdW1tYXJ5X21vZGVsIDwtIHN1bW1hcnkocmVncmVzc2lvbjEpCgpSIDwtIHNxcnQoc3VtbWFyeV9tb2RlbCRyLnNxdWFyZWQpClIyIDwtIHN1bW1hcnlfbW9kZWwkci5zcXVhcmVkCmFkalIyIDwtIHN1bW1hcnlfbW9kZWwkYWRqLnIuc3F1YXJlZApTRSA8LSBzdW1tYXJ5X21vZGVsJHNpZ21hCgojIER1cmJpbi1XYXRzb24tVGVzdApkdyA8LSBsbXRlc3Q6OmR3dGVzdChyZWdyZXNzaW9uMSkkc3RhdGlzdGljCgojIEFsbGVzIGluIGVpbiBEYXRhRnJhbWUgCm1vZGVsZ3VldGUgPC0gZGF0YS5mcmFtZSgKICBSID0gcm91bmQoUiwgMyksCiAgUl9RdWFkcmF0ID0gcm91bmQoUjIsIDMpLAogIEtvcnJpZ2llcnRlc19SX1F1YWRyYXQgPSByb3VuZChhZGpSMiwgMyksCiAgU3RhbmRhcmRmZWhsZXJfZGVzX1NjaMOkdHplcnMgPSByb3VuZChTRSwgMyksCiAgRHVyYmluX1dhdHNvbl9TdGF0aXN0aWsgPSByb3VuZChkdywgMykKKQoKcHJpbnQobW9kZWxndWV0ZSkKYGBgCgpFaW4ga29ycmlnaWVydGVzIFLCsiB2b24gMCw4MCBiZXNhZ3QgenVtIEJlaXNwaWVsLCBkYXNzIDgw4oCvJSBkZXIgU3RyZXV1bmcgaW4gZGVuIERhdGVuIGR1cmNoIGRpZSBnZXfDpGhsdGVuIHVuYWJow6RuZ2lnZW4gVmFyaWFibGVuIGVya2zDpHJ0IHdlcmRlbiBrw7ZubmVuLgoKCiMgMTQpCUJlcmVjaG51bmcgZGVyIEVmZmVrdHN0w6Rya2UKClVtIHp1IGJldXJ0ZWlsZW4sIHdpZSBiZWRldXRzYW0gZGFzIEVyZ2VibmlzIGVpbmVyIFJlZ3Jlc3Npb24gaXN0LCBiZXJlY2huZXQgbWFuIG9mdCBlaW5lIEVmZmVrdHN0w6Rya2UuIEF1Y2ggd2VubiBlaW4gaG9oZXIgQW50ZWlsIGRlciBTdHJldXVuZyBpbiBkZXIgWmllbGdyw7bDn2UgZXJrbMOkcnQgd2lyZCwgc3RlbGx0IHNpY2ggZGllIEZyYWdlLCB3aWUgZ3Jvw58gZGllc2VyIEVmZmVrdCBpbSBWZXJnbGVpY2ggenUgdHlwaXNjaGVuIFN0YW5kYXJkcyBlaW56dXNjaMOkdHplbiBpc3QuCgpFcyBleGlzdGllcmVuIHZlcnNjaGllZGVuZSBNYcOfZSBmw7xyIGRpZSBFZmZla3RzdMOkcmtlLiBadSBkZW4gZ2VicsOkdWNobGljaHN0ZW4gesOkaGx0IGRhcyBuYWNoIENvaGVuIGJlbmFubnRlIE1hw58gXCggZl4yIFwpLCBkYXMgaW5zYmVzb25kZXJlIGbDvHIgUmVncmVzc2lvbnNhbmFseXNlbiBnZWVpZ25ldCBpc3QuIERhbWl0IGzDpHNzdCBzaWNoIGFic2Now6R0emVuLCBvYiBkZXIgZ2VmdW5kZW5lIFp1c2FtbWVuaGFuZyBzY2h3YWNoLCBtaXR0ZWwgb2RlciBzdGFyayBpc3QuCgpEaWUgRWZmZWt0c3TDpHJrZSBcKCBmXjIgXCkga2FubiBhdXMgZGVtIEJlc3RpbW10aGVpdHNtYcOfIFwoIFJeMiBcKSBiZXJlY2huZXQgd2VyZGVuOgoKJCQKZl4yID0gXGZyYWN7Ul4yfXsxIC0gUl4yfQokJAoKd29iZWk6CgotIFwoIGZeMiBcKSBkaWUgRWZmZWt0c3TDpHJrZSBuYWNoIENvaGVuIGlzdAotIFwoIFJeMiBcKSBkYXMgQmVzdGltbXRoZWl0c21hw58gZGVyIFJlZ3Jlc3Npb24gaXN0CgpCZWlzcGllbDogIApBbmdlbm9tbWVuLCBcKCBSXjIgPSAwLDgwIFwpLCBlcmdpYnQgc2ljaDoKCiQkCmZeMiA9IFxmcmFjezAsODB9ezEgLSAwLDgwfSA9IFxmcmFjezAsODB9ezAsMjB9ID0gNCwwCiQkCgpadXIgRWlub3JkbnVuZyBzY2hsw6RndCBDb2hlbiAoMTk5MikgZm9sZ2VuZGUgU2Nod2VsbGVud2VydGUgdm9yOgoKXFsKXGJlZ2lue2FsaWdufQpcdGV4dHtTY2h3YWNoZXIgRWZmZWt0On0gXHF1YWQgJiAwLjEwIDwgfHxmfHwgPCAwLjI1IFxcClx0ZXh0e1NjaHdhY2hlciBiaXMgbWl0dGxlcmVyIEVmZmVrdDp9IFxxdWFkICYgMC4yNSA9IHx8Znx8IFxcClx0ZXh0e01pdHRsZXJlciBFZmZla3Q6fSBccXVhZCAmIDAuMjUgPCB8fGZ8fCA8IDAuNDAgXFwKXHRleHR7TWl0dGxlcmVyIGJpcyBzdGFya2VyIEVmZmVrdDp9IFxxdWFkICYgMC40MCA9IHx8Znx8IFxcClx0ZXh0e1N0YXJrZXIgRWZmZWt0On0gXHF1YWQgJiAwLjQwIDwgfHxmfHwKXGVuZHthbGlnbn0KXF0KYGBge3J9CnJlZyA8LSBzdW1tYXJ5KHJlZ3Jlc3Npb24xKQoKZjwtIHJlZyRhZGouci5zcXVhcmVkLyAoMS1yZWckYWRqLnIuc3F1YXJlZCkKc3ByaW50ZigiRGllIEVmZmVrdHN0w6Rya2UgbGllZ3QgYmVpOiAlLjJmIiwgZikKYGBgCgoKRWluIFdlcnQgdm9uIFwoIGZeMiA9IDQsMCBcKSBzdGVodCBkYW1pdCBmw7xyIGVpbmVuIHNlaHIgc3RhcmtlbiBFZmZla3QuCgoKIyAxNSkgRWluZSBBdXNzYWdlCkVpbmUgbXVsdGlwbGUgUmVncmVzc2lvbnNhbmFseXNlIGVyZ2FiLCBkYXNzIHNvd29obCBkaWUgWmFobCBkZXIgdmVya2F1ZnRlbiBGYW5hcnRpa2VsLCBkZXIgTWl0Z2xpZWRzYmVpdHJhZyBhbHMgYXVjaCBkaWUgV2VyYmVhdXNnYWJlbiBlaW5lbiBFaW5mbHVzcyBhdWYgZGllIEJlc3VjaGVyemFobCBiZWkgVmVyZWluc3ZlcmFuc3RhbHR1bmdlbiBoYWJlbiwgRigzLDMyKSA9IDQ3LDY1LCBwIDwgLjAwMSwgbiA9IDM2LiBFcmjDtmh0IHNpY2ggZGVyIE1pdGdsaWVkc2JlaXRyYWcgdW0gZWluZW4gRXVybywgc2lua3QgZGllIEJlc3VjaGVyemFobCBpbSBEdXJjaHNjaG5pdHQgdW0gNDMsMjMgUGVyc29uZW4uIFdlcmRlbiBkaWUgV2VyYmVhdXNnYWJlbiB1bSBlaW5lbiBFdXJvIGdlc3RlaWdlcnQsIHN0ZWlndCBkaWUgQmVzdWNoZXJ6YWhsIHVtIGV0d2EgMCw1NCBQZXJzb25lbi4gSmVkZXIgenVzw6R0emxpY2ggdmVya2F1ZnRlIEZhbmFydGlrZWwgZsO8aHJ0IGR1cmNoc2Nobml0dGxpY2ggenUgMCw5NyB3ZWl0ZXJlbiBCZXN1Y2hlcm4uIEluc2dlc2FtdCBlcmtsw6RyZW4gZGllc2UgZHJlaSBGYWt0b3JlbiA4MCAlIGRlciBTdHJldXVuZyBpbiBkZW4gQmVzdWNoZXJ6YWhsZW4g4oCTIGVpbiBXZXJ0LCBkZXIgZ2Vtw6TDnyBDb2hlbiAoMTk5MikgYXVmIGVpbmVuIHN0YXJrZW4gRWZmZWt0IGhpbndlaXN0Lgo=