Introduction

Une fois que la série est stationnaire, elle n’est pas nécessairement “parfaite”, dans le sens où d’autres éléments peuvent encore avoir de l’influence sur la série. Ces éléments sont notamment le coefficient auto-régressif (AR) et la moyenne mobile, ou moving average (MA), qui forment la structure de la série lorsqu’on ajoute l’ordre d’intégration (I) de la série, qu’on a vu dans la séance 2 sur la stationnarité. Une série idéale a la structure suivante :

\[ Y_t= \varepsilon_t \]

Dans ce cas, la série est parfaitement stationnaire. Dans certains cas, même lorsqu’elle est stationnaire, la série est influencée par son propre lag :

\[ Y_t=\phi Y_{t-1} + \varepsilon_t \]

On appelle cela des processus \(AR(1)\). On peut généraliser à \(p\) lags pour les \(AR(p)\):

\[ Y_t=\phi_1 Y_{t-1} + \phi_2 Y_{t-2} + \cdots + \phi_p Y_{t-p} + \varepsilon_t \\ Y_t = \sum_{p=1}^{P} \phi_1 Y_{t-p}+\varepsilon_t \]


Parfois, la série peut être influencée par ses propres chocs passés :

\[ Y_t= \varepsilon_t + \theta \varepsilon_{t-1} \]

Qu’on appelle les modèles \(MA(1)\) et qu’on peut généraliser à \(q\) délais pour les \(MA(q)\) :

\[\begin{equation} Y_t= \varepsilon_t + \theta _1\varepsilon_{t-1}+\theta _2\varepsilon_{t-2}+\cdots + \theta _q\varepsilon_{t-q} \\ Y_t= \sum_{q=0}^{Q}\theta _q\varepsilon_{t-q} \end{equation}\]


Et parfois, la série est influencée à la fois par ses propres lags et par ses chocs passés, on parle alors de modèle \(ARMA\) :

\[ Y_t=\phi Y_{t-1} + \varepsilon_t + \theta \varepsilon_{t-1} \]

Ici, dans le cas d’un modèle \(ARMA(1,1)\), mais qu’on peut généraliser en \(ARMA(p,q)\). \[ Y_t = \sum_{p=1}^{P} \phi_1 Y_{t-p}+\sum_{q=1}^{Q}\theta _q\varepsilon_{t-q}+\varepsilon_t \] Dans notre cas, on avait étudié dans les séances précédentes la courbe de Phillips et nous avons déterminé que l’inflation et le taux de chômage sont tous deux intégrés d’ordre 1 (il faut les passer en différence première pour les stationnariser).

setwd(dir = "C:/Users/fkraus/Desktop/TD/2025-2026/ECONOMETRIE/séance5")
data_schularick <-read_excel("C:/Users/fkraus/Desktop/data_schularick.xlsx")
donnees_france <- data_schularick %>%
  filter(country=="France")%>%
  select(year, unemp, cpi) %>%
  mutate(inflation = (log(cpi) - lag(log(cpi)))*100)%>%
 # mutate(dinflation = inflation - lag(inflation))%>%
  mutate(dunemp = unemp - lag(unemp))%>%
  na.omit()%>%
  filter(year > 1950)

On va maintenant s’interesser à la structure du taux de chômage dans un premier temps, en sachant que pour faire la régression de l’inflation expliquée par le chômage, il faut également vérifier la structure du taux d’inflation. C’est ce qu’on fera dans un deuxième temps.

Structure ARIMA du taux de chômage

ACF/PACF

Il est possible de repérer la structure ARIMA d’une série temporelle à l’aide de l’autocorrélogramme complet (ACF) et partiel (PACF) :

acf(donnees_france$dunemp)

pacf(donnees_france$dunemp)

Selection du modèle

A la main

Dans la pratique, on se reporte plutôt à des tests formels. Plus précisément, on applique des modèles AR de différents ordres \(p\), des modèles MA de différents ordres \(q\), et des modèles ARMA de différents ordres \(p\) et \(q\). Par exemple, pour un AR(1)

ar1 <- arima(donnees_france$dunemp, order=c(1,0,0))
ar1

Call:
arima(x = donnees_france$dunemp, order = c(1, 0, 0))

Coefficients:
         ar1  intercept
      0.2937     0.0768
s.e.  0.1138     0.1001

sigma^2 estimated as 0.3538:  log likelihood = -63.01,  aic = 132.01

Le modèle donne le coefficient associé au premier retard (ar1) et à la constante (intercept), ainsi qu’un critère important : AIC. Le but dans la sélection du modèle est de choisir le modèle qui minimise ce critère parmi l’ensemble des modèles qu’on a testé. On peut donner l’exemple avec tous les modèles jusqu’à deux lags.

ar1 <- arima(donnees_france$dunemp, order=c(1,0,0))
ar2 <- arima(donnees_france$dunemp, order=c(2,0,0))

ma1 <- arima(donnees_france$dunemp, order=c(0,0,1))
ma2 <- arima(donnees_france$dunemp, order=c(0,0,2))

arma12<- arima(donnees_france$dunemp, order=c(1,0,2))
arma21<- arima(donnees_france$dunemp, order=c(2,0,1))
arma22<- arima(donnees_france$dunemp, order=c(2,0,2))

aic <- data.frame(
  "ar1"= ar1$aic, "ar2"= ar2$aic, "ma1"= ma1$aic,
  "ma2"= ma2$aic, "arma12"= arma12$aic, "arma21"= arma21$aic,"arma22"= arma22$aic
)
aic

(Vous pouvez tester avec des retards jusqu’à 3 à la main, et vous verrez que le nombre de modèle à estimer est exponentiel avec le nombre de retards).

Ici, la sélection faite à la main indique que le modèle AR(1) est celui qui minimise le critère AIC, donc la série de taux de chômage semble suivre un modèle auto-régressif d’ordre 1. Pour rappel, la série est également intégrée d’ordre 1, donc le taux de chômage suit un processus ARIMA(1,1,0).

Selection automatique

On peut également automatiser la sélection du modèle avec la fonction auto.arima() dans R, du package forecast.

require(forecast)
auto<- auto.arima(donnees_france$dunemp,
           max.p = 10, 
           max.q = 10, 
           max.d = 0)
auto
Series: donnees_france$dunemp 
ARIMA(1,0,0) with zero mean 

Coefficients:
         ar1
      0.3061
s.e.  0.1131

sigma^2 = 0.3619:  log likelihood = -63.29
AIC=130.59   AICc=130.77   BIC=135.09

La sélection automatique du modèle nous donne également le modèle AR(1) comme celui minimisant le critère AIC. On peut donc regarder la dynamique des résidus du modèle AR(1) - qui représentent donc la série de taux de chômage indépendante de cette composante - et la comparer à la dynamique de la série qui contient cette influence.

residus_ar1 <- residuals(auto)

nouvelles_donnees <- cbind(donnees_france, residus_ar1)

nouvelles_donnees %>% ggplot(aes(x=year, y=dunemp))+
  geom_line(lwd=1)+
  geom_line(aes(y=residus_ar1), color="red", lwd=1, lty=2)+
  theme_bw()

Et on peut faire la même chose pour l’inflation.

Structure ARIMA du taux d’inflation

auto_inflation<- auto.arima(donnees_france$inflation,
           max.p = 10, 
           max.q = 10, 
           max.d = 0)
auto_inflation
Series: donnees_france$inflation 
ARIMA(2,0,2) with non-zero mean 

Coefficients:
          ar1     ar2     ma1     ma2    mean
      -0.2690  0.5610  1.3530  0.5548  4.4512
s.e.   0.1376  0.1797  0.1533  0.1755  1.1217

sigma^2 = 5.881:  log likelihood = -159.7
AIC=331.4   AICc=332.73   BIC=344.89
residus_inflation <- residuals(auto_inflation)
nouvelles_donnees2 <- cbind(nouvelles_donnees, residus_inflation)

La série ne suit aucune structure temporelle de type ARMA.

Régression

On peut donc faire la régression avec les données indépendantes de leur structure, et comparer avec la régression qui ne prend pas en compte la structure :

reg1 <- feols(residus_inflation ~ residus_ar1, data= nouvelles_donnees2)
reg2 <-feols(inflation ~ dunemp, data= nouvelles_donnees2)
etable(reg1, reg2)
                             reg1              reg2
Dependent Var.: residus_inflation         inflation
                                                   
Constant         -0.1155 (0.2840) 4.060*** (0.4607)
residus_ar1      -0.1488 (0.4755)                  
dunemp                              1.663* (0.7335)
_______________ _________________ _________________
S.E. type                     IID               IID
Observations                   70                70
R2                        0.00144           0.07031
Adj. R2                  -0.01325           0.05664
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Ici, on voit que la régression qui ne prend pas en compte la structure auto-régressive des données donne un coefficient positif et significatif. Quand on isole correctement les variables de leur structure ARIMA, on voit que le coefficient n’est pas significativement différent de 0.

checkresiduals(reg1)

    Ljung-Box test

data:  Residuals from feols
Q* = 16.409, df = 10, p-value = 0.08851

Model df: 0.   Total lags used: 10

checkresiduals(reg2)

    Ljung-Box test

data:  Residuals from feols
Q* = 87.576, df = 10, p-value = 1.621e-14

Model df: 0.   Total lags used: 10

Ici, le fait d’utiliser la structure correcte ARIMA n’a pas énormément changer l’allure des résidus de la régression. C’est normal car le modèle de régression n’a pas tant changé. La seule différence qu’on peut constater est que les résidus suivent un peu plus une loi normale quand on ajoute la structure ARIMA, mais ce qu’on avait montré dans la séance précédente, c’était que le modèle était relativement correcte dans l’ensemble, mais manque de pouvoir prédictif (ou, du moins, peut être mieux expliqué).

On peut également noter un élément important : les modèles ARIMA permettent d’expliquer la dynamique d’une série à partir de son processus passé. Il est donc possible de faire des prévisions avec ARIMA, c’est-à-dire prédire les valeurs futures d’une série temporelle, sur la base de son historique (voir séance 6).

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2sgOiBNb2TDqGxlcyBBUk1BICINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KaHRtbF9ub3RlYm9vazogDQogICAgdG9jOiB0cnVlICMgcG91ciBhZmZpY2hlciB1bmUgdGFibGUgZGVzIG1hdGnDqHJlcyBhdSBkw6lidXQgZHUgZG9jdW1lbnQgKFRhYmxlIG9mIENvbnRlbnQpDQogICAgdG9jX2RlcHRoOiA0ICMgbGUgbml2ZWF1IGQnYWZmaWNoYWdlIGRlcyB0aXRyZXMsIHNvdXMtdGl0cmVzLCBzZWN0aW9uLi4uIA0KICAgIHRvY19mbG9hdDogZmFsc2UNCi0tLQ0KDQojIEludHJvZHVjdGlvbg0KVW5lIGZvaXMgcXVlIGxhIHPDqXJpZSBlc3Qgc3RhdGlvbm5haXJlLCBlbGxlIG7igJllc3QgcGFzIG7DqWNlc3NhaXJlbWVudCDigJxwYXJmYWl0ZeKAnSwgZGFucyBsZSBzZW5zIG/DuSBk4oCZYXV0cmVzIMOpbMOpbWVudHMgcGV1dmVudCBlbmNvcmUgYXZvaXIgZGUgbOKAmWluZmx1ZW5jZSBzdXIgbGEgc8OpcmllLiBDZXMgw6lsw6ltZW50cyBzb250IG5vdGFtbWVudCBsZSBjb2VmZmljaWVudCBhdXRvLXLDqWdyZXNzaWYgKEFSKSBldCBsYSBtb3llbm5lIG1vYmlsZSwgb3UgKm1vdmluZyBhdmVyYWdlKiAoTUEpLCBxdWkgZm9ybWVudCBsYSBzdHJ1Y3R1cmUgZGUgbGEgc8OpcmllIGxvcnNxdSdvbiBham91dGUgbCdvcmRyZSBkJ2ludMOpZ3JhdGlvbiAoSSkgZGUgbGEgc8OpcmllLCBxdSdvbiBhIHZ1IGRhbnMgbGEgc8OpYW5jZSAyIHN1ciBsYSBzdGF0aW9ubmFyaXTDqS4NClVuZSBzw6lyaWUgaWTDqWFsZSBhIGxhIHN0cnVjdHVyZSBzdWl2YW50ZSA6DQoNCiQkDQpZX3Q9IFx2YXJlcHNpbG9uX3QNCiQkDQoNCkRhbnMgY2UgY2FzLCBsYSBzw6lyaWUgZXN0IHBhcmZhaXRlbWVudCBzdGF0aW9ubmFpcmUuIERhbnMgY2VydGFpbnMgY2FzLCBtw6ptZSBsb3JzcXXigJllbGxlIGVzdCBzdGF0aW9ubmFpcmUsIGxhIHPDqXJpZSBlc3QgaW5mbHVlbmPDqWUgcGFyIHNvbiBwcm9wcmUgbGFnIDoNCg0KJCQNCllfdD1ccGhpIFlfe3QtMX0gKyBcdmFyZXBzaWxvbl90DQokJA0KDQpPbiBhcHBlbGxlIGNlbGEgZGVzIHByb2Nlc3N1cyAkQVIoMSkkLiBPbiBwZXV0IGfDqW7DqXJhbGlzZXIgw6AgJHAkIGxhZ3MgcG91ciBsZXMgJEFSKHApJDogDQoNCiQkDQpZX3Q9XHBoaV8xIFlfe3QtMX0gKyBccGhpXzIgWV97dC0yfSArIFxjZG90cyArIFxwaGlfcCBZX3t0LXB9ICArIFx2YXJlcHNpbG9uX3QgXFwNCllfdCA9IFxzdW1fe3A9MX1ee1B9IFxwaGlfMSBZX3t0LXB9K1x2YXJlcHNpbG9uX3QNCiQkDQoNCi0tLQ0KDQpQYXJmb2lzLCBsYSBzw6lyaWUgcGV1dCDDqnRyZSBpbmZsdWVuY8OpZSBwYXIgc2VzIHByb3ByZXMgY2hvY3MgcGFzc8OpcyA6DQoNCiQkDQpZX3Q9IFx2YXJlcHNpbG9uX3QgKyBcdGhldGEgXHZhcmVwc2lsb25fe3QtMX0NCiQkDQoNClF14oCZb24gYXBwZWxsZSBsZXMgbW9kw6hsZXMgJE1BKDEpJCBldCBxdeKAmW9uIHBldXQgZ8OpbsOpcmFsaXNlciDDoCAkcSQgZMOpbGFpcyBwb3VyIGxlcyAkTUEocSkkIDoNCg0KXGJlZ2lue2VxdWF0aW9ufQ0KWV90PSBcdmFyZXBzaWxvbl90ICsgXHRoZXRhIF8xXHZhcmVwc2lsb25fe3QtMX0rXHRoZXRhIF8yXHZhcmVwc2lsb25fe3QtMn0rXGNkb3RzICsgXHRoZXRhIF9xXHZhcmVwc2lsb25fe3QtcX0gXFwNCg0KWV90PSAgXHN1bV97cT0wfV57UX1cdGhldGEgX3FcdmFyZXBzaWxvbl97dC1xfQ0KXGVuZHtlcXVhdGlvbn0NCg0KDQotLS0NCg0KRXQgcGFyZm9pcywgbGEgc8OpcmllIGVzdCBpbmZsdWVuY8OpZSDDoCBsYSBmb2lzIHBhciBzZXMgcHJvcHJlcyBsYWdzIGV0IHBhciBzZXMgY2hvY3MgcGFzc8Opcywgb24gcGFybGUgYWxvcnMgZGUgbW9kw6hsZSAkQVJNQSQgOg0KDQokJA0KWV90PVxwaGkgWV97dC0xfSArIFx2YXJlcHNpbG9uX3QgKyBcdGhldGEgXHZhcmVwc2lsb25fe3QtMX0NCiQkDQoNCkljaSwgZGFucyBsZSBjYXMgZOKAmXVuIG1vZMOobGUgJEFSTUEoMSwxKSQsIG1haXMgcXXigJlvbiBwZXV0IGfDqW7DqXJhbGlzZXIgZW4gJEFSTUEocCxxKSQuDQokJA0KWV90ID0gXHN1bV97cD0xfV57UH0gXHBoaV8xIFlfe3QtcH0rXHN1bV97cT0xfV57UX1cdGhldGEgX3FcdmFyZXBzaWxvbl97dC1xfStcdmFyZXBzaWxvbl90IA0KJCQNCkRhbnMgbm90cmUgY2FzLCBvbiBhdmFpdCDDqXR1ZGnDqSBkYW5zIGxlcyBzw6lhbmNlcyBwcsOpY8OpZGVudGVzIGxhIGNvdXJiZSBkZSBQaGlsbGlwcyBldCBub3VzIGF2b25zIGTDqXRlcm1pbsOpIHF1ZSBsJ2luZmxhdGlvbiBldCBsZSB0YXV4IGRlIGNow7RtYWdlIHNvbnQgdG91cyBkZXV4IGludMOpZ3LDqXMgZCdvcmRyZSAxIChpbCBmYXV0IGxlcyBwYXNzZXIgZW4gZGlmZsOpcmVuY2UgcHJlbWnDqHJlIHBvdXIgbGVzIHN0YXRpb25uYXJpc2VyKS4NCg0KYGBge3J9DQpzZXR3ZChkaXIgPSAiQzovVXNlcnMvZmtyYXVzL0Rlc2t0b3AvVEQvMjAyNS0yMDI2L0VDT05PTUVUUklFL3PDqWFuY2U1IikNCmRhdGFfc2NodWxhcmljayA8LXJlYWRfZXhjZWwoIkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL2RhdGFfc2NodWxhcmljay54bHN4IikNCmRvbm5lZXNfZnJhbmNlIDwtIGRhdGFfc2NodWxhcmljayAlPiUNCiAgZmlsdGVyKGNvdW50cnk9PSJGcmFuY2UiKSU+JQ0KICBzZWxlY3QoeWVhciwgdW5lbXAsIGNwaSkgJT4lDQogIG11dGF0ZShpbmZsYXRpb24gPSAobG9nKGNwaSkgLSBsYWcobG9nKGNwaSkpKSoxMDApJT4lDQogIyBtdXRhdGUoZGluZmxhdGlvbiA9IGluZmxhdGlvbiAtIGxhZyhpbmZsYXRpb24pKSU+JQ0KICBtdXRhdGUoZHVuZW1wID0gdW5lbXAgLSBsYWcodW5lbXApKSU+JQ0KICBuYS5vbWl0KCklPiUNCiAgZmlsdGVyKHllYXIgPiAxOTUwKQ0KYGBgDQoNCk9uIHZhIG1haW50ZW5hbnQgcydpbnRlcmVzc2VyIMOgIGxhIHN0cnVjdHVyZSBkdSB0YXV4IGRlIGNow7RtYWdlIGRhbnMgdW4gcHJlbWllciB0ZW1wcywgZW4gc2FjaGFudCBxdWUgcG91ciBmYWlyZSBsYSByw6lncmVzc2lvbiBkZSBsJ2luZmxhdGlvbiBleHBsaXF1w6llIHBhciBsZSBjaMO0bWFnZSwgaWwgZmF1dCDDqWdhbGVtZW50IHbDqXJpZmllciBsYSBzdHJ1Y3R1cmUgZHUgdGF1eCBkJ2luZmxhdGlvbi4gQydlc3QgY2UgcXUnb24gZmVyYSBkYW5zIHVuIGRldXhpw6htZSB0ZW1wcy4NCg0KIyBTdHJ1Y3R1cmUgQVJJTUEgZHUgdGF1eCBkZSBjaMO0bWFnZQ0KIyMgQUNGL1BBQ0YNCklsIGVzdCBwb3NzaWJsZSBkZSByZXDDqXJlciBsYSBzdHJ1Y3R1cmUgQVJJTUEgZCd1bmUgc8OpcmllIHRlbXBvcmVsbGUgw6AgbCdhaWRlIGRlIGwnYXV0b2NvcnLDqWxvZ3JhbW1lIGNvbXBsZXQgKEFDRikgZXQgcGFydGllbCAoUEFDRikgOg0KYGBge3J9DQphY2YoZG9ubmVlc19mcmFuY2UkZHVuZW1wKQ0KcGFjZihkb25uZWVzX2ZyYW5jZSRkdW5lbXApDQpgYGANCiMjIFNlbGVjdGlvbiBkdSBtb2TDqGxlDQoNCiMjIyBBIGxhIG1haW4NCkRhbnMgbGEgcHJhdGlxdWUsIG9uIHNlIHJlcG9ydGUgcGx1dMO0dCDDoCBkZXMgdGVzdHMgZm9ybWVscy4gUGx1cyBwcsOpY2lzw6ltZW50LCBvbiBhcHBsaXF1ZSBkZXMgbW9kw6hsZXMgQVIgZGUgZGlmZsOpcmVudHMgb3JkcmVzICRwJCwgZGVzIG1vZMOobGVzIE1BIGRlIGRpZmbDqXJlbnRzIG9yZHJlcyAkcSQsIGV0IGRlcyBtb2TDqGxlcyBBUk1BIGRlIGRpZmbDqXJlbnRzIG9yZHJlcyAkcCQgZXQgJHEkLiBQYXIgZXhlbXBsZSwgcG91ciB1biBBUigxKQ0KYGBge3J9DQphcjEgPC0gYXJpbWEoZG9ubmVlc19mcmFuY2UkZHVuZW1wLCBvcmRlcj1jKDEsMCwwKSkNCmFyMQ0KYGBgDQpMZSBtb2TDqGxlIGRvbm5lIGxlIGNvZWZmaWNpZW50IGFzc29jacOpIGF1IHByZW1pZXIgcmV0YXJkIChhcjEpIGV0IMOgIGxhIGNvbnN0YW50ZSAoaW50ZXJjZXB0KSwgYWluc2kgcXUndW4gY3JpdMOocmUgaW1wb3J0YW50IDogQUlDLiBMZSBidXQgZGFucyBsYSBzw6lsZWN0aW9uIGR1IG1vZMOobGUgZXN0IGRlIGNob2lzaXIgbGUgbW9kw6hsZSBxdWkgbWluaW1pc2UgY2UgY3JpdMOocmUgcGFybWkgbCdlbnNlbWJsZSBkZXMgbW9kw6hsZXMgcXUnb24gYSB0ZXN0w6kuIE9uIHBldXQgZG9ubmVyIGwnZXhlbXBsZSBhdmVjIHRvdXMgbGVzIG1vZMOobGVzIGp1c3F1J8OgIGRldXggKmxhZ3MqLg0KYGBge3J9DQphcjEgPC0gYXJpbWEoZG9ubmVlc19mcmFuY2UkZHVuZW1wLCBvcmRlcj1jKDEsMCwwKSkNCmFyMiA8LSBhcmltYShkb25uZWVzX2ZyYW5jZSRkdW5lbXAsIG9yZGVyPWMoMiwwLDApKQ0KDQptYTEgPC0gYXJpbWEoZG9ubmVlc19mcmFuY2UkZHVuZW1wLCBvcmRlcj1jKDAsMCwxKSkNCm1hMiA8LSBhcmltYShkb25uZWVzX2ZyYW5jZSRkdW5lbXAsIG9yZGVyPWMoMCwwLDIpKQ0KDQphcm1hMTI8LSBhcmltYShkb25uZWVzX2ZyYW5jZSRkdW5lbXAsIG9yZGVyPWMoMSwwLDIpKQ0KYXJtYTIxPC0gYXJpbWEoZG9ubmVlc19mcmFuY2UkZHVuZW1wLCBvcmRlcj1jKDIsMCwxKSkNCmFybWEyMjwtIGFyaW1hKGRvbm5lZXNfZnJhbmNlJGR1bmVtcCwgb3JkZXI9YygyLDAsMikpDQoNCmFpYyA8LSBkYXRhLmZyYW1lKA0KICAiYXIxIj0gYXIxJGFpYywgImFyMiI9IGFyMiRhaWMsICJtYTEiPSBtYTEkYWljLA0KICAibWEyIj0gbWEyJGFpYywgImFybWExMiI9IGFybWExMiRhaWMsICJhcm1hMjEiPSBhcm1hMjEkYWljLCJhcm1hMjIiPSBhcm1hMjIkYWljDQopDQphaWMNCmBgYA0KDQooVm91cyBwb3V2ZXogdGVzdGVyIGF2ZWMgZGVzIHJldGFyZHMganVzcXUnw6AgMyDDoCBsYSBtYWluLCBldCB2b3VzIHZlcnJleiBxdWUgbGUgbm9tYnJlIGRlIG1vZMOobGUgw6AgZXN0aW1lciBlc3QgZXhwb25lbnRpZWwgYXZlYyBsZSBub21icmUgZGUgcmV0YXJkcykuDQoNCkljaSwgbGEgc8OpbGVjdGlvbiBmYWl0ZSDDoCBsYSBtYWluIGluZGlxdWUgcXVlIGxlIG1vZMOobGUgQVIoMSkgZXN0IGNlbHVpIHF1aSBtaW5pbWlzZSBsZSBjcml0w6hyZSBBSUMsIGRvbmMgbGEgc8OpcmllIGRlIHRhdXggZGUgY2jDtG1hZ2Ugc2VtYmxlIHN1aXZyZSB1biBtb2TDqGxlIGF1dG8tcsOpZ3Jlc3NpZiBkJ29yZHJlIDEuICpQb3VyIHJhcHBlbCwgbGEgc8OpcmllIGVzdCDDqWdhbGVtZW50IGludMOpZ3LDqWUgZCdvcmRyZSAxLCBkb25jIGxlIHRhdXggZGUgY2jDtG1hZ2Ugc3VpdCB1biBwcm9jZXNzdXMgQVJJTUEoMSwxLDApLioNCg0KIyMjIFNlbGVjdGlvbiBhdXRvbWF0aXF1ZQ0KDQpPbiBwZXV0IMOpZ2FsZW1lbnQgYXV0b21hdGlzZXIgbGEgc8OpbGVjdGlvbiBkdSBtb2TDqGxlIGF2ZWMgbGEgZm9uY3Rpb24gYGF1dG8uYXJpbWEoKWAgZGFucyBSLCBkdSBwYWNrYWdlIGBmb3JlY2FzdGAuDQpgYGB7cn0NCnJlcXVpcmUoZm9yZWNhc3QpDQphdXRvPC0gYXV0by5hcmltYShkb25uZWVzX2ZyYW5jZSRkdW5lbXAsDQogICAgICAgICAgIG1heC5wID0gMTAsIA0KICAgICAgICAgICBtYXgucSA9IDEwLCANCiAgICAgICAgICAgbWF4LmQgPSAwKQ0KYXV0bw0KYGBgDQpMYSBzw6lsZWN0aW9uIGF1dG9tYXRpcXVlIGR1IG1vZMOobGUgbm91cyBkb25uZSDDqWdhbGVtZW50IGxlIG1vZMOobGUgQVIoMSkgY29tbWUgY2VsdWkgbWluaW1pc2FudCBsZSBjcml0w6hyZSBBSUMuIE9uIHBldXQgZG9uYyByZWdhcmRlciBsYSBkeW5hbWlxdWUgZGVzIHLDqXNpZHVzIGR1IG1vZMOobGUgQVIoMSkgLSBxdWkgcmVwcsOpc2VudGVudCBkb25jIGxhIHPDqXJpZSBkZSB0YXV4IGRlIGNow7RtYWdlIGluZMOpcGVuZGFudGUgZGUgY2V0dGUgY29tcG9zYW50ZSAtIGV0IGxhIGNvbXBhcmVyIMOgIGxhIGR5bmFtaXF1ZSBkZSBsYSBzw6lyaWUgcXVpIGNvbnRpZW50IGNldHRlIGluZmx1ZW5jZS4NCg0KYGBge3J9DQpyZXNpZHVzX2FyMSA8LSByZXNpZHVhbHMoYXV0bykNCg0Kbm91dmVsbGVzX2Rvbm5lZXMgPC0gY2JpbmQoZG9ubmVlc19mcmFuY2UsIHJlc2lkdXNfYXIxKQ0KDQpub3V2ZWxsZXNfZG9ubmVlcyAlPiUgZ2dwbG90KGFlcyh4PXllYXIsIHk9ZHVuZW1wKSkrDQogIGdlb21fbGluZShsd2Q9MSkrDQogIGdlb21fbGluZShhZXMoeT1yZXNpZHVzX2FyMSksIGNvbG9yPSJyZWQiLCBsd2Q9MSwgbHR5PTIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KRXQgb24gcGV1dCBmYWlyZSBsYSBtw6ptZSBjaG9zZSBwb3VyIGwnaW5mbGF0aW9uLg0KDQojIFN0cnVjdHVyZSBBUklNQSBkdSB0YXV4IGQnaW5mbGF0aW9uDQoNCg0KYGBge3J9DQphdXRvX2luZmxhdGlvbjwtIGF1dG8uYXJpbWEoZG9ubmVlc19mcmFuY2UkaW5mbGF0aW9uLA0KICAgICAgICAgICBtYXgucCA9IDEwLCANCiAgICAgICAgICAgbWF4LnEgPSAxMCwgDQogICAgICAgICAgIG1heC5kID0gMCkNCmF1dG9faW5mbGF0aW9uDQoNCnJlc2lkdXNfaW5mbGF0aW9uIDwtIHJlc2lkdWFscyhhdXRvX2luZmxhdGlvbikNCm5vdXZlbGxlc19kb25uZWVzMiA8LSBjYmluZChub3V2ZWxsZXNfZG9ubmVlcywgcmVzaWR1c19pbmZsYXRpb24pDQoNCmBgYA0KTGEgc8OpcmllIG5lIHN1aXQgYXVjdW5lIHN0cnVjdHVyZSB0ZW1wb3JlbGxlIGRlIHR5cGUgQVJNQS4gDQoNCiMgUsOpZ3Jlc3Npb24NCk9uIHBldXQgZG9uYyBmYWlyZSBsYSByw6lncmVzc2lvbiBhdmVjIGxlcyBkb25uw6llcyBpbmTDqXBlbmRhbnRlcyBkZSBsZXVyIHN0cnVjdHVyZSwgZXQgY29tcGFyZXIgYXZlYyBsYSByw6lncmVzc2lvbiBxdWkgbmUgcHJlbmQgcGFzIGVuIGNvbXB0ZSBsYSBzdHJ1Y3R1cmUgOg0KYGBge3J9DQpyZWcxIDwtIGZlb2xzKHJlc2lkdXNfaW5mbGF0aW9uIH4gcmVzaWR1c19hcjEsIGRhdGE9IG5vdXZlbGxlc19kb25uZWVzMikNCnJlZzIgPC1mZW9scyhpbmZsYXRpb24gfiBkdW5lbXAsIGRhdGE9IG5vdXZlbGxlc19kb25uZWVzMikNCmV0YWJsZShyZWcxLCByZWcyKQ0KYGBgDQpJY2ksIG9uIHZvaXQgcXVlIGxhIHLDqWdyZXNzaW9uIHF1aSBuZSBwcmVuZCBwYXMgZW4gY29tcHRlIGxhIHN0cnVjdHVyZSBhdXRvLXLDqWdyZXNzaXZlIGRlcyBkb25uw6llcyBkb25uZSB1biBjb2VmZmljaWVudCBwb3NpdGlmIGV0IHNpZ25pZmljYXRpZi4gUXVhbmQgb24gaXNvbGUgY29ycmVjdGVtZW50IGxlcyB2YXJpYWJsZXMgZGUgbGV1ciBzdHJ1Y3R1cmUgQVJJTUEsIG9uIHZvaXQgcXVlIGxlIGNvZWZmaWNpZW50IG4nZXN0IHBhcyBzaWduaWZpY2F0aXZlbWVudCBkaWZmw6lyZW50IGRlIDAuDQoNCmBgYHtyfQ0KY2hlY2tyZXNpZHVhbHMocmVnMSkNCmNoZWNrcmVzaWR1YWxzKHJlZzIpDQpgYGANCkljaSwgbGUgZmFpdCBkJ3V0aWxpc2VyIGxhIHN0cnVjdHVyZSBjb3JyZWN0ZSBBUklNQSBuJ2EgcGFzIMOpbm9ybcOpbWVudCBjaGFuZ2VyIGwnYWxsdXJlIGRlcyByw6lzaWR1cyBkZSBsYSByw6lncmVzc2lvbi4gQydlc3Qgbm9ybWFsIGNhciBsZSBtb2TDqGxlIGRlIHLDqWdyZXNzaW9uIG4nYSBwYXMgdGFudCBjaGFuZ8OpLiBMYSBzZXVsZSBkaWZmw6lyZW5jZSBxdSdvbiBwZXV0IGNvbnN0YXRlciBlc3QgcXVlIGxlcyByw6lzaWR1cyBzdWl2ZW50IHVuIHBldSBwbHVzIHVuZSBsb2kgbm9ybWFsZSBxdWFuZCBvbiBham91dGUgbGEgc3RydWN0dXJlIEFSSU1BLCBtYWlzIGNlIHF1J29uIGF2YWl0IG1vbnRyw6kgZGFucyBsYSBzw6lhbmNlIHByw6ljw6lkZW50ZSwgYyfDqXRhaXQgcXVlIGxlIG1vZMOobGUgw6l0YWl0IHJlbGF0aXZlbWVudCBjb3JyZWN0ZSBkYW5zIGwnZW5zZW1ibGUsIG1haXMgbWFucXVlIGRlIHBvdXZvaXIgcHLDqWRpY3RpZiAob3UsIGR1IG1vaW5zLCBwZXV0IMOqdHJlIG1pZXV4IGV4cGxpcXXDqSkuDQoNCk9uIHBldXQgw6lnYWxlbWVudCBub3RlciB1biDDqWzDqW1lbnQgaW1wb3J0YW50IDogbGVzIG1vZMOobGVzIEFSSU1BIHBlcm1ldHRlbnQgZCdleHBsaXF1ZXIgbGEgZHluYW1pcXVlIGQndW5lIHPDqXJpZSDDoCBwYXJ0aXIgZGUgc29uIHByb2Nlc3N1cyBwYXNzw6kuIElsIGVzdCBkb25jIHBvc3NpYmxlIGRlIGZhaXJlIGRlcyBwcsOpdmlzaW9ucyBhdmVjIEFSSU1BLCBjJ2VzdC3DoC1kaXJlIHByw6lkaXJlIGxlcyB2YWxldXJzIGZ1dHVyZXMgZCd1bmUgc8OpcmllIHRlbXBvcmVsbGUsIHN1ciBsYSBiYXNlIGRlIHNvbiBoaXN0b3JpcXVlICh2b2lyIHPDqWFuY2UgNikuDQoNCg0K