rm(list=ls()) #clear environment
require(tidyverse)
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.0     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.1     ✔ tibble    3.1.8
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(ggplot2)
library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
library(plm)
## 
## Attaching package: 'plm'
## 
## The following objects are masked from 'package:dplyr':
## 
##     between, lag, lead
library(lmtest)
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.3
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(dplyr)

File dữ liệu: https://docs.google.com/spreadsheets/d/1AsJCgzlFcPCaM7-zXZdQh5r0sgR4_E6b1vLQSLJnfXk/edit?usp=sharing

1 Chương 1. Giới thiệu vấn đề cần mô phỏng

Trong điều kiện của một nền kinh tế mở, thương mại quốc tế trở nên phổ biến, việc thanh toán giữa quốc gia nhất thiết phải sử dụng tiền tệ của nước này hay nước khác. Để thực hiện việc chuyển đổi tiền tệ các nước, các quốc gia phải dựa vào tỷ giá hối đoái. Tỷ giá hối đoái là một trong những chính sách kinh tế vĩ mô quan trọng của mỗi quốc gia. Tỷ giá hối đoái luôn là một vấn đề phức tạp và nhạy cảm đối với mọi nền kinh tế, không ít nền kinh tế lâm vào tình trạng khó khăn do tỷ giá hối đoái gây ra. Chính vì vậy, nó luôn thu hút được sự chú ý đặc biệt của các nhà kinh tế, các học giả Việt Nam và trên thế giới. Đặc biệt là trong bối cảnh nền kinh tế trong nước và quốc tế như hiện nay thì việc nghiên cứu về tỷ giá hối đoái là một vấn đề có ý nghĩa lý luận và thực tiễn cao. Xuất phát từ những vấn đề trên, tác giả sẽ tiến hành nghiên cứu tác động của các yếu tố đến tỷ giá hối đoái của Việt Nam trong giai đoạn từ 01/2020 đến 08/2023 nhằm đưa ra các yếu tố có ảnh hưởng đến tỷ giá hối đoái và từ đó mô phỏng tỷ giá hối đoái Việt Nam. Tác giả quyết định chọn đề tài “Mô phỏng các nhân tố ảnh hưởng đến tỷ giá hối đoái tại Việt Nam”.

2 Chương 2. Giới thiệu dữ liệu nghiên cứu

Dữ liệu nghiên cứu được thu thập tại trang web Investing.com bao gồm: tỷ giá hối đoái, chỉ số VNI, giá dầu, giá vàng, giá cổ phiếu của ngân hàng Vietcombank và ngân hàng Vietinbank trong giai đoạn từ 01/2020 đến 08/2023 để xem xét sự tác động của các yếu tố đến tỷ giá hối đoái.

setwd("C:/MPNN2")
data <- read_excel("tieuluan.xlsx",1)
exr = data$EXR
vni = data$VNI
hnx = data$HNX
sp500 = data$SP500
xau = data$XAU
wti = data$WTI
vcb = data$VCB
ctg = data$CTG
data

Mô tả dữ liệu

Bộ dữ liệu bao gồm 904 quan sát

-EXR: Tỷ giá hối đoái (USD/VND)

-VNI: Chỉ số phản ánh biến động giá cổ phiếu được niêm yết trên sàn HoSE

-HNX: Chỉ số phản ánh biến động giá cổ phiếu được niêm yết trên sàn Hà Nội

-SP500: Chỉ số chứng khoán được dựa trên vốn hóa của 500 công ty đại chúng lớn nhất nước Mỹ

-XAU: Tỷ giá vàng (XAU/USD)

-WTI: Tỷ giá dầu (WTI/USD)

-VCB: Giá đóng cửa của cổ phiếu của ngân hàng TMCP Ngoại thương Việt Nam - Vietcombank

-CTG: Giá đóng cửa của cổ phiếu của ngân hàng TMCP Công thương Việt Nam - Vietinbank

3 Chương 3. Phương pháp và mô hình nghiên cứu

3.1 Phương pháp nghiên cứu

3.1.1 Mô hình hồi quy tuyến tính đa biến

Mô hình hồi quy tuyến tính đa biến xem xét mối quan hệ giữa một biến phụ thuộc Y và nhiều biến độc lập \(X_1, X_2, … ,X_n\). Chúng ta giả định rằng mối quan hệ giữa các biến là tuyến tính, điều này có nghĩa là biến phụ thuộc có thể được biểu diễn dưới dạng một tổng các biến độc lập nhân với các hệ số tương ứng.

Mô hình hồi quy tuyến tính đa biến có dạng: \[Y=β_0+β_1X_1+β_2X_2+⋯+β_nX_n+ϵ\] Trong đó:

\(Y\) là biến phụ thuộc \(X_1, X_2, … ,X_n\) là các biến độc lập \(β_0,β_1, β_2, …, β_n\) là các hệ số hồi quy tương ứng với các biến độc lập \(ϵ\) là sai số đại diện cho sai số giữa giá trị thực tế và giá trị dự đoán của biến phụ thuộc.

Mục tiêu của việc ước lượng hệ số hồi quy là tìm các giá trị \(β_0,β_1, β_2, …, β_n\) sao cho mô hình hồi quy phù hợp tốt với dữ liệu thực tế nhất. Quá trình này thường được thực hiện bằng phương pháp của bình phương tối thiểu (Ordinary Least Squares - OLS), tìm cách giảm thiểu tổng bình phương của sai số \(ϵ\).

Sau khi ước lượng hệ số hồi quy, chúng ta cần kiểm tra tính chính xác của mô hình. Các kiểm định thường được sử dụng bao gồm kiểm định hồi quy, kiểm tra t-Student cho từng hệ số, kiểm tra F-statistic, kiểm tra điều kiện phân phối của sai số,…

Sau khi đã kiểm tra và xác nhận tính chính xác của mô hình, chúng ta có thể sử dụng nó để dự đoán giá trị của biến phụ thuộc dựa trên giá trị của các biến độc lập.

3.1.2 Mô phỏng ngẫu nhiên bằng chuyển động Brown

Quá trình ngẫu nhiên W(t), được gọi là chuyển động Brown tiêu chuẩn nếu thỏa các điều kiện sau:

    1. W(0)=0
    1. Với mọi \(0≤t_1≤t_2\) thì \(W(t_2)−W(t_1)∼N(0,t_2−t_1)\)
    1. \(W(t_2)−W(t_1)\) độc lâp.

3.2 Mô hình nghiên cứu

Tác giả xây dựng mô hình với mục đích nghiên cứu sự tác động của các yếu tố đến tỷ giá hối đoái. Mô hình đề xuất như sau:

\[EXR= β_0 + β_1VNI + β_2HNX + β_3SP500 + β_4XAU + β_5WTI + β_6VCB + β_7CTG\]

Trong đó

  • \(β_0\): Hằng số của mô hình

  • \(β_1 ... β_7\): Hệ số hồi quy của các biến độc lập

Trong mô hình này sẽ phân tích sự tác động của các yếu tố đến tỷ giá hối đoái

  • Biến phụ thuộc: TỶ giá hối đoái (EXR)

  • Biến độc lập:

VNI: Chỉ số VN-index (điểm)

HNX: Chỉ số HNX-index (điểm)

SP500: Chỉ số S&P500-index (điểm)

WTI: Tỷ giá dầu (WTI/USD)

XAU: TỶ giá vàng (XAU/USD)

VCB: Giá đóng cửa của cổ phiếu ngân hàng Vietcombank (VND)

CTG: Giá đóng cửa của cổ phiếu ngân hàng Vietinbank (VND)

4 Chương 3. Phân tích dữ liệu và kết quả nghiên cứu

Biến EXR

  • Thống kê mô tả
summary(exr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   22625   23019   23177   23253   23450   24871
sd(exr)
## [1] 417.0823

Biến EXR (tỷ giá hối đoái) có giá trị trung bình là 23253 tức giá trị trung bình của tỷ giá hối đoái là 23253VND/USD và giá trị trung vị là 23177 VND/USD. Biến này đạt giá trị nhỏ nhất là 22625 VND/USD và đạt lớn nhất là 24871 VND/USD. Với độ lệch chuẩn là 417,0823 VND/USD.

4.1 Xác định phân phối cho các biến độc lập

1. Biến VNI

  • Thống kê mô tả
summary(vni)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   659.2   966.6  1125.8  1138.8  1299.4  1528.6
sd(vni)
## [1] 211.6383

Biến VNI (chỉ số VNindex) có giá trị trung bình là 1138,8 tức là giá đóng cửa trung bình của chỉ số VN-index là 1138,8 điểm và giá trị trung vị là 1125,8. Biến này đạt giá trị thấp nhất là 659,2 điểm và đạt cao nhất là 1528,6 điểm. Với độ lệch chuẩn là 211,6383 điểm

  • Đồ thị Histogram
hist.vni = ggplot(data = data,aes(vni))+ geom_histogram(aes(y=after_stat(density)),color="black",fill="lavender", bins = 30)+ stat_function(fun = dnorm, args = list(mean = mean(vni,na.rm = TRUE),sd = sd(vni,na.rm = TRUE)), color ='darkgreen',linewidth = 1)
hist.vni

  • Đồ thị QQ-plot
qqnorm(vni)
qqline(vni)

  • Kiểm định phân phối chuẩn thông qua kiểm định Shapiro-Wilk Test

Cặp giả thuyết - đối thuyết

\(H_0\): Biến VNI tuân theo phân phối chuẩn

\(H_1\): Biến VNI không tuân theo phân phối chuẩn

shapiro.test(vni)
## 
##  Shapiro-Wilk normality test
## 
## data:  vni
## W = 0.97373, p-value = 1.066e-11

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến VNI không tuân theo phân phối chuẩn.

  • Kiểm định phân phối thông qua kiểm định Kolmogorov - Smirnov

Phân phối loga chuẩn

Cặp giả thuyết - đối thuyết

\(H_0\): Biến VNI tuân theo phân phối loga chuẩn

\(H_1\): Biến VNI không tuân theo phân phối loga chuẩn

ks.test(vni, y = 'plnorm')
## Warning in ks.test.default(vni, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  vni
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến VNI không tuân theo phân phối loga chuẩn.

Phân phối mũ

Cặp giả thuyết - đối thuyết

\(H_0\): Biến VNI tuân theo phân phối mũ

\(H_1\): Biến VNI không tuân theo phân phối mũ

ks.test(vni, y = 'pexp')
## Warning in ks.test.default(vni, y = "pexp"): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  vni
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến VNI không tuân theo phân phối mũ.

Phân phối đều

Cặp giả thuyết - đối thuyết

\(H_0\): Biến VNI tuân theo phân phối đều

\(H_1\): Biến VNI không tuân theo phân phối đều

ks.test(vni, y = 'punif')
## Warning in ks.test.default(vni, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  vni
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến VNI không tuân theo phân phối đều.

2. Biến HNX

  • Thống kê mô tả
summary(hnx)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   92.64  146.12  228.41  247.59  312.90  493.84
sd(hnx)
## [1] 107.4283

Biến HNX có giá trị trung bình là 247,59 điểm tức giá đóng cửa trung bình của chỉ số HNX là 247,59 điểm và giá trị trung vị là 228,41. Biến này đạt giá trị thấp nhất là 92,64 điểm và đạt cao nhất là 493,84 điểm. Với độ lệch chuẩn là 107,4283 điểm

  • Đồ thị Histogram
hist.hnx = ggplot(data = data,aes(hnx))+ geom_histogram(aes(y=after_stat(density)),color="black",fill="lavender", bins = 30)+ stat_function(fun = dnorm, args = list(mean = mean(hnx,na.rm = TRUE),sd = sd(hnx,na.rm = TRUE)), color ='brown',linewidth = 1)
hist.hnx

  • Đồ thị QQ-plot
qqnorm(hnx)
qqline(hnx)

  • Kiểm định phân phối chuẩn thông qua kiểm định Shapiro-Wilk Test

Cặp giả thuyết - đối thuyết

\(H_0\): Biến HNX tuân theo phân phối chuẩn

\(H_1\): Biến HNX không tuân theo phân phối chuẩn

shapiro.test(hnx)
## 
##  Shapiro-Wilk normality test
## 
## data:  hnx
## W = 0.93878, p-value < 2.2e-16

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến HNX không tuân theo phân phối chuẩn.

  • Kiểm định phân phối thông qua kiểm định Kolmogorov - Smirnov

Phân phối loga chuẩn

Cặp giả thuyết - đối thuyết

\(H_0\): Biến HNX tuân theo phân phối loga chuẩn

\(H_1\): Biến HNX không tuân theo phân phối loga chuẩn

ks.test(hnx, y = 'plnorm')
## Warning in ks.test.default(hnx, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  hnx
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến HNX không tuân theo phân phối loga chuẩn.

Phân phối mũ

Cặp giả thuyết - đối thuyết

\(H_0\): Biến HNX tuân theo phân phối mũ

\(H_1\): Biến HNX không tuân theo phân phối mũ

ks.test(hnx, y = 'pexp')
## Warning in ks.test.default(hnx, y = "pexp"): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  hnx
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến HNX không tuân theo phân phối mũ.

Phân phối đều

Cặp giả thuyết - đối thuyết

\(H_0\): Biến HNX tuân theo phân phối đều

\(H_1\): Biến HNX không tuân theo phân phối đều

ks.test(hnx, y = 'punif')
## Warning in ks.test.default(hnx, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  hnx
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến HNX không tuân theo phân phối đều.

3. Biến SP500

  • Thống kê mô tả
summary(sp500)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2237    3585    3986    3912    4321    4797
sd(sp500)
## [1] 522.9723

Biến SP500 có giá trị trung bình là 3912 tức giá đóng cửa trung bình của chỉ số S&P500 là 3912 điểm và giá trị trung vị là 3986. Biến này đạt giá trị thấp nhất là 2237 điểm và đạt cao nhất là 4797 điểm. Với độ lệch chuẩn là 522,9723 điểm

  • Đồ thị Histogram
hist.sp500 = ggplot(data = data,aes(sp500))+ geom_histogram(aes(y=after_stat(density)),color="black",fill="lavender", bins = 30)+ stat_function(fun = dnorm, args = list(mean = mean(sp500,na.rm = TRUE),sd = sd(sp500,na.rm = TRUE)), color ='brown',linewidth = 1)
hist.sp500

  • Đồ thị QQ-plot
qqnorm(sp500)
qqline(sp500)

  • Kiểm định phân phối chuẩn thông qua kiểm định Shapiro-Wilk Test

Cặp giả thuyết - đối thuyết

\(H_0\): Biến SP500 tuân theo phân phối chuẩn

\(H_1\): Biến SP500 không tuân theo phân phối chuẩn

shapiro.test(sp500)
## 
##  Shapiro-Wilk normality test
## 
## data:  sp500
## W = 0.95621, p-value = 8.801e-16

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến SP500 không tuân theo phân phối chuẩn.

  • Kiểm định phân phối thông qua kiểm định Kolmogorov - Smirnov

Phân phối loga chuẩn

Cặp giả thuyết - đối thuyết

\(H_0\): Biến SP500 tuân theo phân phối loga chuẩn

\(H_1\): Biến SP500 không tuân theo phân phối loga chuẩn

ks.test(sp500, y = 'plnorm')
## Warning in ks.test.default(sp500, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sp500
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến SP500 không tuân theo phân phối loga chuẩn.

Phân phối mũ

Cặp giả thuyết - đối thuyết

\(H_0\): Biến SP500 tuân theo phân phối mũ

\(H_1\): Biến SP500 không tuân theo phân phối mũ

ks.test(sp500, y = 'pexp')
## Warning in ks.test.default(sp500, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sp500
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến SP500 không tuân theo phân phối mũ.

Phân phối đều

Cặp giả thuyết - đối thuyết

\(H_0\): Biến SP500 tuân theo phân phối đều

\(H_1\): Biến SP500 không tuân theo phân phối đều

ks.test(sp500, y = 'punif')
## Warning in ks.test.default(sp500, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sp500
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến SP500 không tuân theo phân phối đều.

5. Biến XAU

  • Thống kê mô tả
summary(xau)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1471    1759    1816    1824    1902    2064
sd(xau)
## [1] 101.0509

Biến XAU có giá trị trung bình là 1824 tức tỷ giá trung bình của vàng là 1824USD và giá trị trung vị là 1471. Biến này đạt giá trị nhỏ nhất là 1471USD và đạt lớn nhất là 2064 USD. Với độ lệch chuẩn là 101,0509 USD

  • Đồ thị Histogram
hist.xau = ggplot(data = data,aes(xau))+ geom_histogram(aes(y=after_stat(density)),color="black",fill="lavender", bins = 30)+ stat_function(fun = dnorm, args = list(mean = mean(xau,na.rm = TRUE),sd = sd(xau,na.rm = TRUE)), color ='brown',linewidth = 1)
hist.xau

  • Đồ thị QQ-plot
qqnorm(xau)
qqline(xau)

  • Kiểm định phân phối chuẩn thông qua kiểm định Shapiro-Wilk Test

Cặp giả thuyết - đối thuyết

\(H_0\): Biến XAU tuân theo phân phối chuẩn

\(H_1\): Biến XAU không tuân theo phân phối chuẩn

shapiro.test(xau)
## 
##  Shapiro-Wilk normality test
## 
## data:  xau
## W = 0.99177, p-value = 6.268e-05

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến XAU không tuân theo phân phối chuẩn.

  • Kiểm định phân phối thông qua kiểm định Kolmogorov - Smirnov

Phân phối loga chuẩn

Cặp giả thuyết - đối thuyết

\(H_0\): Biến XAU tuân theo phân phối loga chuẩn

\(H_1\): Biến XAU không tuân theo phân phối loga chuẩn

ks.test(xau, y = 'plnorm')
## Warning in ks.test.default(xau, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  xau
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến XAU không tuân theo phân phối loga chuẩn.

Phân phối mũ

Cặp giả thuyết - đối thuyết

\(H_0\): Biến XAU tuân theo phân phối mũ

\(H_1\): Biến XAU không tuân theo phân phối mũ

ks.test(xau, y = 'pexp')
## Warning in ks.test.default(xau, y = "pexp"): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  xau
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến XAU không tuân theo phân phối mũ.

Phân phối đều

Cặp giả thuyết - đối thuyết

\(H_0\): Biến XAU tuân theo phân phối đều

\(H_1\): Biến XAU không tuân theo phân phối đều

ks.test(xau, y = 'punif')
## Warning in ks.test.default(xau, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  xau
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến XAU không tuân theo phân phối đều.

6. Biến WTI

  • Thống kê mô tả
summary(wti)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   24.07   66.18   75.28   75.70   86.17  128.26
sd(wti)
## [1] 19.4601

Biến WTI có giá trị trung bình là 75,70 tức tỷ giá trung bình của dầu là 75,70USD và giá trị trung vị là 75,28. Biến này đạt giá trị nhỏ nhất là 24,07 USD và đạt lớn nhất là 128,26 USD. Với độ lệch chuẩn là 17,4601 USD

  • Đồ thị Histogram
hist.wti = ggplot(data = data,aes(wti))+ geom_histogram(aes(y=after_stat(density)),color="black",fill="lavender", bins = 30)+ stat_function(fun = dnorm, args = list(mean = mean(wti,na.rm = TRUE),sd = sd(wti,na.rm = TRUE)), color ='brown',linewidth = 1)
hist.wti

  • Đồ thị QQ-plot
qqnorm(wti)
qqline(wti)

  • Kiểm định phân phối chuẩn thông qua kiểm định Shapiro-Wilk Test

Cặp giả thuyết - đối thuyết

\(H_0\): Biến WTI tuân theo phân phối chuẩn

\(H_1\): Biến WTI không tuân theo phân phối chuẩn

shapiro.test(wti)
## 
##  Shapiro-Wilk normality test
## 
## data:  wti
## W = 0.98233, p-value = 5.364e-09

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến WTI không tuân theo phân phối chuẩn.

  • Kiểm định phân phối thông qua kiểm định Kolmogorov - Smirnov

Phân phối loga chuẩn

Cặp giả thuyết - đối thuyết

\(H_0\): Biến WTI tuân theo phân phối loga chuẩn

\(H_1\): Biến WTI không tuân theo phân phối loga chuẩn

ks.test(wti, y = 'plnorm')
## Warning in ks.test.default(wti, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  wti
## D = 0.99927, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến WTI không tuân theo phân phối loga chuẩn.

Phân phối mũ

Cặp giả thuyết - đối thuyết

\(H_0\): Biến WTI tuân theo phân phối mũ

\(H_1\): Biến WTI không tuân theo phân phối mũ

ks.test(wti, y = 'pexp')
## Warning in ks.test.default(wti, y = "pexp"): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  wti
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến WTI không tuân theo phân phối mũ.

Phân phối đều

Cặp giả thuyết - đối thuyết

\(H_0\): Biến WTI tuân theo phân phối đều

\(H_1\): Biến WTI không tuân theo phân phối đều

ks.test(wti, y = 'punif')
## Warning in ks.test.default(wti, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  wti
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến WTI không tuân theo phân phối đều.

5. Biến VCB

  • Thống kê mô tả
summary(vcb)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   43925   69018   76368   76543   82400  106500
sd(vcb)
## [1] 11004.54

Biến VCB có giá trị trung bình là 76543 VND và giá trị trung vị là 76368. Biến này đạt giá trị nhỏ nhất là 43925VND và đạt lớn nhất là 106500VND. Với độ lệch chuẩn là 11004,54VND

  • Đồ thị Histogram
hist.vcb = ggplot(data = data,aes(vcb))+ geom_histogram(aes(y=after_stat(density)),color="black",fill="lavender", bins = 30)+ stat_function(fun = dnorm, args = list(mean = mean(vcb,na.rm = TRUE),sd = sd(vcb,na.rm = TRUE)), color ='brown',linewidth = 1)
hist.vcb

  • Đồ thị QQ-plot
qqnorm(vcb)
qqline(vcb)

  • Kiểm định phân phối chuẩn thông qua kiểm định Shapiro-Wilk Test

Cặp giả thuyết - đối thuyết

\(H_0\): Biến VCB tuân theo phân phối chuẩn

\(H_1\): Biến VCB không tuân theo phân phối chuẩn

shapiro.test(vcb)
## 
##  Shapiro-Wilk normality test
## 
## data:  vcb
## W = 0.98591, p-value = 1.226e-07

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến VCB không tuân theo phân phối chuẩn.

  • Kiểm định phân phối thông qua kiểm định Kolmogorov - Smirnov

Phân phối loga chuẩn

Cặp giả thuyết - đối thuyết

\(H_0\): Biến VCB tuân theo phân phối loga chuẩn

\(H_1\): Biến VCB không tuân theo phân phối loga chuẩn

ks.test(vcb, y = 'plnorm')
## Warning in ks.test.default(vcb, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  vcb
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến VCB không tuân theo phân phối loga chuẩn.

Phân phối mũ

Cặp giả thuyết - đối thuyết

\(H_0\): Biến VCB tuân theo phân phối mũ

\(H_1\): Biến VCB không tuân theo phân phối mũ

ks.test(vcb, y = 'pexp')
## Warning in ks.test.default(vcb, y = "pexp"): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  vcb
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến VCB không tuân theo phân phối mũ.

Phân phối đều

Cặp giả thuyết - đối thuyết

\(H_0\): Biến VCB tuân theo phân phối đều

\(H_1\): Biến VCB không tuân theo phân phối đều

ks.test(vcb, y = 'punif')
## Warning in ks.test.default(vcb, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  vcb
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến VCB không tuân theo phân phối đều.

6. Biến CTG

  • Thống kê mô tả
summary(ctg)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   12824   22692   28050   26748   30911   41141
sd(ctg)
## [1] 6202.461

Biến CTG có giá trị trung bình là 26748VND và giá trị trung vị là 28050. Biến này đạt giá trị nhỏ nhất là 12824VND và đạt lớn nhất là 41141VND. Với độ lệch chuẩn là 6202,461VND

  • Đồ thị Histogram
hist.ctg = ggplot(data = data,aes(ctg))+ geom_histogram(aes(y=after_stat(density)),color="black",fill="lavender", bins = 30)+ stat_function(fun = dnorm, args = list(mean = mean(ctg,na.rm = TRUE),sd = sd(ctg,na.rm = TRUE)), color ='brown',linewidth = 1)
hist.ctg

  • Đồ thị QQ-plot
qqnorm(ctg)
qqline(ctg)

  • Kiểm định phân phối chuẩn thông qua kiểm định Shapiro-Wilk Test

Cặp giả thuyết - đối thuyết

\(H_0\): Biến CTG tuân theo phân phối chuẩn

\(H_1\): Biến CTG không tuân theo phân phối chuẩn

shapiro.test(ctg)
## 
##  Shapiro-Wilk normality test
## 
## data:  ctg
## W = 0.9623, p-value = 1.627e-14

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến CTG không tuân theo phân phối chuẩn.

  • Kiểm định phân phối thông qua kiểm định Kolmogorov - Smirnov

Phân phối loga chuẩn

Cặp giả thuyết - đối thuyết

\(H_0\): Biến CTG tuân theo phân phối loga chuẩn

\(H_1\): Biến CTG không tuân theo phân phối loga chuẩn

ks.test(ctg, y = 'plnorm')
## Warning in ks.test.default(ctg, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  ctg
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến CTG không tuân theo phân phối loga chuẩn.

Phân phối mũ

Cặp giả thuyết - đối thuyết

\(H_0\): Biến CTG tuân theo phân phối mũ

\(H_1\): Biến CTG không tuân theo phân phối mũ

ks.test(ctg, y = 'pexp')
## Warning in ks.test.default(ctg, y = "pexp"): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  ctg
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến CTG không tuân theo phân phối mũ.

Phân phối đều

Cặp giả thuyết - đối thuyết

\(H_0\): Biến CTG tuân theo phân phối đều

\(H_1\): Biến CTG không tuân theo phân phối đều

ks.test(ctg, y = 'punif')
## Warning in ks.test.default(ctg, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  ctg
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy p-value < 0,05 nên ta không thừa nhận giả thuyết \(H_0\), tại mức ý nghĩa 5% thì biến CTG không tuân theo phân phối đều.

4.2 Mô hình hồi quy

mh <- lm(exr ~  vni + hnx + sp500 + xau + wti + vcb + ctg)
summary(mh)
## 
## Call:
## lm(formula = exr ~ vni + hnx + sp500 + xau + wti + vcb + ctg)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -643.44 -145.41  -22.71   95.89 1129.77 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  2.787e+04  2.333e+02 119.430  < 2e-16 ***
## vni         -4.600e+00  2.207e-01 -20.844  < 2e-16 ***
## hnx          2.135e+00  4.455e-01   4.793 1.92e-06 ***
## sp500        3.222e-01  4.972e-02   6.482 1.49e-10 ***
## xau         -2.209e+00  1.044e-01 -21.163  < 2e-16 ***
## wti          1.412e+01  1.131e+00  12.482  < 2e-16 ***
## vcb          1.936e-02  1.464e-03  13.222  < 2e-16 ***
## ctg          1.174e-02  3.551e-03   3.306 0.000984 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 252.5 on 896 degrees of freedom
## Multiple R-squared:  0.6363, Adjusted R-squared:  0.6334 
## F-statistic: 223.9 on 7 and 896 DF,  p-value: < 2.2e-16

Từ kết quả mô hình thể hiện các yếu tố có tác động đến tỷ giá hối đoái tại Việt Nam được xây dựng như sau:

\[EXR = 2,787e^{+04} - 4,600e^{+00} VNI + 2,135e^{+00} HNX + 3,222e^{-01} SP500 - 2,209e^{+00} XAU + 1,412e^{+01}WTI + 1,936e^{-02}VCB + 1,174e^{-02}CTG\]

Giá trị R-squared của mô hình là 0,89 tức biến độc lập trong mô hình giải thích được 89% sự biến thiên của biến phụ thuộc.

Thông qua kết quả hồi quy cho thấy có 6 biến có ý nghĩa thống kê tại mức ý nghĩa 5%. Trong điều kiện các yếu tố khác không đổi:

Biến VNI có mối tương quan ngược chiều với tỷ giá hối đoái (EXR) cho thấy khi chỉ số VNindex tăng 1 điểm thì tỷ giá hối đoái sẽ giảm \(4.600^{+00}\).

Biến HNX có mối tương quan cùng chiều với tỷ giá hối đoái (EXR) cho thấy khi chỉ số HNXindex tăng 1 điểm thì tỷ giá hối đoái sẽ tăng \(2,135e^{+00}\).

Biến SP500 có mối tương quan cùng chiều với tỷ giá hối đoái (EXR) cho thấy khi chỉ số HNXindex tăng 1 điểm thì tỷ giá hối đoái sẽ tăng \(3,222e^{-01}\).

Biến XAU có mối tương quan ngược chiều với tỷ giá hối đoái (EXR) cho thấy khi tỷ giá vàng tăng 1 USD thì tỷ giá hối đoái sẽ giảm \(2,209e^{-00}\).

Biến WTI có mối tương quan cùng chiều với tỷ giá hối đoái (EXR) cho thấy khi tỷ giá dầu tăng 1 USD thì tỷ giá hối đoái sẽ tăng \(1,412e^{+00}\).

Biến VCB có mối tương quan cùng chiều với tỷ giá hối đoái (EXR) cho thấy khi giá cổ phiếu VCB tăng 1 thì tỷ giá hối đoái sẽ tăng \(1,936e^{-02}\).

Biến CTG có mối tương quan cùng chiều với tỷ giá hối đoái (EXR) cho thấy khi giá cổ phiếu CTG tăng 1 thì tỷ giá hối đoái sẽ tăng \(1,174e^{-02}\).

4.3 Mô phỏng các biến độc lập

Sau khi kiểm định phân phối cho các biến độc lập thì kết quả cho thấy các biến độc lập đều không tuân theo phân phối nào. Vì thế tác giả sẽ sử dụng chuyển động Brown để mô phỏng lại các biến độc lập theo công thức sau:

\[S_t=S_0exp((μ−σ^{2}/2)t+σW_t\]

Trong đó

\(S_0\): Giá gốc ban đầu

μ: Giá trị trung bình của tỷ giá sinh lời kỳ vọng

σ: Độ biến động của tỷ giá sinh lời kỳ vọng

  • Tính tỷ suất sinh lời cho các biến
r_vni <- diff(log(vni))
r_hnx <- diff(log(hnx))
r_sp500 <- diff(log(sp500))
r_xau <- diff(log(xau))
r_wti <- diff(log(wti))
r_vcb <- diff(log(vcb))
r_ctg <- diff(log(ctg))

4.3.1 Mô phỏng biến VNI

set.seed(1000)

gbm.f = function(n,S0,mu,sigma){
  t = 1
  t.s = seq(0,t,length = n)
  dt = t/n
  Bt = sqrt(t)*cumsum(rnorm((n),0,1))
  St = S0*exp((mu-sigma^2/2)*t.s + sigma*Bt)
  St # Kết quả của GBM
}
n <- 10000
S0 <- data$VNI[1] #dữ liệu gốc
mu <- (1/(n*(1/n)))*sum(r_vni) #tính lợi nhuận kỳ vọng giá
sigma <- sqrt((sum((r_vni-mu)^2))*(1/(n-1)*(1/n))) #tính độ biến động giá
VNI <- gbm.f(n,S0,mu,sigma)
plot(VNI, type = 'l', col = 'green', main = "Chỉ số VN-Index", ylab = "VNI", xlab = "Ngày")

4.3.2 Mô phỏng biến HNX

set.seed(1000)

gbm.f = function(n,S0,mu,sigma){
  t = 1
  t.s = seq(0,t,length = n)
  dt = t/n
  Bt = sqrt(t)*cumsum(rnorm((n),0,1))
  St = S0*exp((mu-sigma^2/2)*t.s + sigma*Bt)
  St # Kết quả của GBM
}
n <- 10000
S0 <- hnx[1] #dữ liệu gốc
mu <- (1/(n*(1/n)))*sum(r_hnx) #tính lợi nhuận kỳ vọng giá
sigma <- sqrt((sum((r_hnx-mu)^2))*(1/(n-1)*(1/n))) #tính độ biến động giá
HNX <- gbm.f(n,S0,mu,sigma)
plot(HNX, type = 'l', col = 'green', main = "Chỉ số HNX-Index", ylab = "HNX", xlab = "Ngày")

4.3.3 Mô phỏng biến SP500

set.seed(1000)

gbm.f = function(n,S0,mu,sigma){
  t = 1
  t.s = seq(0,t,length = n)
  dt = t/n
  Bt = sqrt(t)*cumsum(rnorm((n),0,1))
  St = S0*exp((mu-sigma^2/2)*t.s + sigma*Bt)
  St # Kết quả của GBM
}
n <- 10000
S0 <- sp500[1] #dữ liệu gốc
mu <- (1/(n*(1/n)))*sum(r_sp500) #tính lợi nhuận kỳ vọng giá
sigma <- sqrt((sum((r_sp500-mu)^2))*(1/(n-1)*(1/n))) #tính độ biến động giá
SP500 <- gbm.f(n,S0,mu,sigma)
plot(SP500, type = 'l', col = 'green', main = "Chỉ số S&P500", ylab = "SP500", xlab = "Ngày")

4.3.4 Mô phỏng biến XAU

set.seed(1000)

gbm.f = function(n,S0,mu,sigma){
  t = 1
  t.s = seq(0,t,length = n)
  dt = t/n
  Bt = sqrt(t)*cumsum(rnorm((n),0,1))
  St = S0*exp((mu-sigma^2/2)*t.s + sigma*Bt)
  St # Kết quả của GBM
}
n <- 10000
S0 <- xau[1] #dữ liệu gốc
mu <- (1/(n*(1/n)))*sum(r_xau) #tính lợi nhuận kỳ vọng giá
sigma <- sqrt((sum((r_xau-mu)^2))*(1/(n-1)*(1/n))) #tính độ biến động giá
XAU <- gbm.f(n,S0,mu,sigma)
plot(XAU, type = 'l', col = 'green', main = "Tỷ giá vàng", ylab = "XAU", xlab = "Ngày")

4.3.5 Mô phỏng biến WTI

set.seed(1000)

gbm.f = function(n,S0,mu,sigma){
  t = 1
  t.s = seq(0,t,length = n)
  dt = t/n
  Bt = sqrt(t)*cumsum(rnorm((n),0,1))
  St = S0*exp((mu-sigma^2/2)*t.s + sigma*Bt)
  St # Kết quả của GBM
}
n <- 10000
S0 <- wti[1] #dữ liệu gốc
mu <- (1/(n*(1/n)))*sum(r_wti) #tính lợi nhuận kỳ vọng giá
sigma <- sqrt((sum((r_wti-mu)^2))*(1/(n-1)*(1/n))) #tính độ biến động giá
WTI <- gbm.f(n,S0,mu,sigma)
plot(WTI, type = 'l', col = 'green', main = "Tỷ giá dầu", ylab = "WTI", xlab = "Ngày")

4.3.6 Mô phỏng biến VCB

set.seed(1000)

gbm.f = function(n,S0,mu,sigma){
  t = 1
  t.s = seq(0,t,length = n)
  dt = t/n
  Bt = sqrt(t)*cumsum(rnorm((n),0,1))
  St = S0*exp((mu-sigma^2/2)*t.s + sigma*Bt)
  St # Kết quả của GBM
}
n <- 10000
S0 <- vcb[1] #dữ liệu gốc
mu <- (1/(n*(1/n)))*sum(r_vcb) #tính lợi nhuận kỳ vọng giá
sigma <- sqrt((sum((r_vcb-mu)^2))*(1/(n-1)*(1/n))) #tính độ biến động giá
VCB <- gbm.f(n,S0,mu,sigma)
plot(VCB, type = 'l', col = 'green', main = "Giá CP VCB", ylab = "VCB", xlab = "Ngày")

4.3.7 Mô phỏng biến CTG

set.seed(1000)

gbm.f = function(n,S0,mu,sigma){
  t = 1
  t.s = seq(0,t,length = n)
  dt = t/n
  Bt = sqrt(t)*cumsum(rnorm((n),0,1))
  St = S0*exp((mu-sigma^2/2)*t.s + sigma*Bt)
  St # Kết quả của GBM
}
n <- 10000
S0 <- ctg[1] #dữ liệu gốc
mu <- (1/(n*(1/n)))*sum(r_ctg) #tính lợi nhuận kỳ vọng giá
sigma <- sqrt((sum((r_ctg-mu)^2))*(1/(n-1)*(1/n))) #tính độ biến động giá
CTG <- gbm.f(n,S0,mu,sigma)
plot(CTG, type = 'l', col = 'green', main = "Giá CP CTG", ylab = "CTG", xlab = "Ngày")

4.4 Mô phỏng mô hình

Mô hình đã được xây dựng:

\[EXR = 2,787e^{+04} - 4,600e^{+00} VNI + 2,135e^{+00} HNX + 3,222e^{-01} SP500 - 2,209e^{+00} XAU + 1,412e^{+01}WTI + 1,936e^{-02}VCB + 1,174e^{-02}CTG\]

# Mô phỏng mô hình
EXR <- 2.787e+04 - 4.600e+00*VNI + 2.135e+00*HNX + 3.222e-01*SP500 - 2.209e+00*XAU + 1.412e+01*WTI + 1.936e-02*VCB + 1.174e-02*CTG
summary(EXR)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   23023   23036   23060   23073   23103   23211

Sau khi mô phỏng các yếu tố có ảnh hưởng đến tỷ giá hối đoái trong vòng 10000 ngày, ta thấy tỷ giá hối đoái có giá trị trung bình là 23073 VND/USD và có giá trị trung vị là 23060 VND/USD. Trong 10000 ngày tới, tỷ giá hối đoái đạt giá trị lớn nhất là 23211 VND/USD và nhỏ nhất là 23023 VND/USD.

plot(EXR, type = 'l', col = 'pink', main = "Tỷ giá hối đoái", ylab = "EXR", xlab = "Ngày")

Thông qua biểu đồ ta thấy tỷ giá hối đoái có biến động giảm tăng trong vòng 10000 ngày tới. Trong 6000 ngày đầu tỷ giá hối đoái có xu hướng giảm dần và ở 4000 ngày kế tiếp tỷ giá hối đoái lại có xu hướng tăng mạnh, có thể tăng lên đạt mức 23200 VND/USD.

  • Tác giả đặt quy ước khi mô phỏng tỷ giá hối đoái trong vòng 10000 ngày nếu kết quả tỷ giá cao hơn 23050 VND/USD thì được coi là cao và ngược lại nếu tỷ giá hối đoái có kết quả thấp hơn 23050VND/USD thì được xem là thấp. Việc dự báo này sẽ giúp các nhà hoạch định chính sách và ngân hàng nhà nước thúc đẩy các chính sách điều chỉnh tỷ giá hối đoái phù hợp.
EXRthap <- EXR[EXR < 23050]
EXRcao <- EXR[EXR >= 23050]
table(cut(EXR,breaks=2))
## 
##  (2.3e+04,2.31e+04] (2.31e+04,2.32e+04] 
##                8744                1256
table(cut(EXR,2,labels = c('thap','cao')))
## 
## thap  cao 
## 8744 1256
length(EXRthap)/length(EXR)
## [1] 0.4414

Từ kết quả trên ta thấy xác xuất tỷ giá hối đoái có giá dưới 23050VND/USD là 44,14%, hay nói cách khác trong 10000 ngày nữa thì xác suất để giá của tỷ giá hối đoái dưới 23050 VND/USD là 44,14%.

length(EXRcao)/length(EXR)
## [1] 0.5586

Từ kết quả trên ta thấy xác xuất tỷ giá hối đoái có giá bằng hoặc cao hơn 23050 VND/USD là 55,86%, hay nói cách khác trong 10000 ngày nữa thì xác suất để giá của tỷ giá hối đoái bằng và cao hơn 23050VND/USD là 55,86%.

5 Chương 4. Kết luận

Từ kết quả trên thông qua việc mô phỏng ngẫu nhiên các nhân tố bao gồm chỉ cố VN-index, HNX-index, S&P-index, tỷ giá vàng (XAU), tỷ giá dầu (WTI), giá cổ phiếu ngân hàng Vietcombank và ngân hàng Vietinbank có ảnh hưởng đến tỷ giá hối đoái của Việt Nam. Kết quả cho thấy rằng trong 10000 ngày nữa xác suất để tỷ giá hối đoái của Việt Nam có giá trên 23050VND/USD là cao. Có thể thấy trong tương lai khi tỷ giá hối đoái càng tăng thì sẽ có lợi cho các doanh nghiệp trong hoạt động xuất khẩu. Dựa vào việc dự báo này từ đây các nhà hoạch định chính sách và ngân hàng Nhà nước sẽ đưa ra lựa chọn chính sách tỷ giá hối đoái phù hợp đối với nền kinh tế Việt Nam trong tương lai.

LS0tDQp0aXRsZTogIk3DlCBQSOG7jk5HIEPDgUMgTkjDgk4gVOG7kCDhuqJOSCBIxq/hu55ORyDEkOG6vk4gVOG7tiBHScOBIEjhu5BJIMSQT8OBSSBU4bqgSSBWSeG7hlQgTkFNIg0KYXV0aG9yOiAiVHJp4buHdSBOZ3V54buFbiBNYWkgVGhpIg0KZGF0ZTogIjIwMjMtMDctMzAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUgDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KICANCi0tLQ0KDQpgYGB7cn0NCnJtKGxpc3Q9bHMoKSkgI2NsZWFyIGVudmlyb25tZW50DQpyZXF1aXJlKHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShwbG0pDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KKipGaWxlIGThu68gbGnhu4d1Kio6IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFBc0pDZ3psRmNQQ2FNNy16WFpkUWg1cjBzZ1I0X0U2YjF2TFFTTEpuZlhrL2VkaXQ/dXNwPXNoYXJpbmcNCg0KIyBDaMawxqFuZyAxLiBHaeG7m2kgdGhp4buHdSB24bqlbiDEkeG7gSBj4bqnbiBtw7QgcGjhu49uZw0KDQpUcm9uZyDEkWnhu4F1IGtp4buHbiBj4bunYSBt4buZdCBu4buBbiBraW5oIHThur8gbeG7nywgdGjGsMahbmcgbeG6oWkgcXXhu5FjIHThur8gdHLhu58gbsOqbiBwaOG7lSBiaeG6v24sIHZp4buHYyB0aGFuaCB0b8OhbiBnaeG7r2EgcXXhu5FjIGdpYSBuaOG6pXQgdGhp4bq/dCBwaOG6o2kgc+G7rSBk4bulbmcgdGnhu4FuIHThu4cgY+G7p2Egbsaw4bubYyBuw6B5IGhheSBuxrDhu5tjIGtow6FjLiDEkOG7gyB0aOG7sWMgaGnhu4duIHZp4buHYyBjaHV54buDbiDEkeG7lWkgdGnhu4FuIHThu4cgY8OhYyBuxrDhu5tjLCBjw6FjIHF14buRYyBnaWEgcGjhuqNpIGThu7FhIHbDoG8gdOG7tyBnacOhIGjhu5FpIMSRb8OhaS4gVOG7tyBnacOhIGjhu5FpIMSRb8OhaSBsw6AgbeG7mXQgdHJvbmcgbmjhu69uZyBjaMOtbmggc8OhY2gga2luaCB04bq/IHbEqSBtw7QgcXVhbiB0cuG7jW5nIGPhu6dhIG3hu5dpIHF14buRYyBnaWEuIFThu7cgZ2nDoSBo4buRaSDEkW/DoWkgbHXDtG4gbMOgIG3hu5l0IHbhuqVuIMSR4buBIHBo4bupYyB04bqhcCB2w6AgbmjhuqF5IGPhuqNtIMSR4buRaSB24bubaSBt4buNaSBu4buBbiBraW5oIHThur8sIGtow7RuZyDDrXQgbuG7gW4ga2luaCB04bq/IGzDom0gdsOgbyB0w6xuaCB0cuG6oW5nIGtow7Mga2jEg24gZG8gdOG7tyBnacOhIGjhu5FpIMSRb8OhaSBnw6J5IHJhLiBDaMOtbmggdsOsIHbhuq15LCBuw7MgbHXDtG4gdGh1IGjDunQgxJHGsOG7o2Mgc+G7sSBjaMO6IMO9IMSR4bq3YyBiaeG7h3QgY+G7p2EgY8OhYyBuaMOgIGtpbmggdOG6vywgY8OhYyBo4buNYyBnaeG6oyBWaeG7h3QgTmFtIHbDoCB0csOqbiB0aOG6vyBnaeG7m2kuIMSQ4bq3YyBiaeG7h3QgbMOgIHRyb25nIGLhu5FpIGPhuqNuaCBu4buBbiBraW5oIHThur8gdHJvbmcgbsaw4bubYyB2w6AgcXXhu5FjIHThur8gbmjGsCBoaeG7h24gbmF5IHRow6wgdmnhu4djIG5naGnDqm4gY+G7qXUgduG7gSB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIGzDoCBt4buZdCB24bqlbiDEkeG7gSBjw7Mgw70gbmdoxKlhIGzDvSBsdeG6rW4gdsOgIHRo4buxYyB0aeG7hW4gY2FvLiBYdeG6pXQgcGjDoXQgdOG7qyBuaOG7r25nIHbhuqVuIMSR4buBIHRyw6puLCB0w6FjIGdp4bqjIHPhur0gdGnhur9uIGjDoG5oIG5naGnDqm4gY+G7qXUgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSDEkeG6v24gdOG7tyBnacOhIGjhu5FpIMSRb8OhaSBj4bunYSBWaeG7h3QgTmFtIHRyb25nIGdpYWkgxJFv4bqhbiB04burIDAxLzIwMjAgxJHhur9uIDA4LzIwMjMgbmjhurFtIMSRxrBhIHJhIGPDoWMgeeG6v3UgdOG7kSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgdsOgIHThu6sgxJHDsyBtw7QgcGjhu49uZyB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIFZp4buHdCBOYW0uIFTDoWMgZ2nhuqMgcXV54bq/dCDEkeG7i25oIGNo4buNbiDEkeG7gSB0w6BpICoqIk3DtCBwaOG7j25nIGPDoWMgbmjDom4gdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdOG7tyBnacOhIGjhu5FpIMSRb8OhaSB04bqhaSBWaeG7h3QgTmFtIioqLg0KDQojIENoxrDGoW5nIDIuIEdp4bubaSB0aGnhu4d1IGThu68gbGnhu4d1IG5naGnDqm4gY+G7qXUNCg0KROG7ryBsaeG7h3UgbmdoacOqbiBj4bupdSDEkcaw4bujYyB0aHUgdGjhuq1wIHThuqFpIHRyYW5nIHdlYiAqSW52ZXN0aW5nLmNvbSogYmFvIGfhu5NtOiB04bu3IGdpw6EgaOG7kWkgxJFvw6FpLCBjaOG7iSBz4buRIFZOSSwgZ2nDoSBk4bqndSwgZ2nDoSB2w6BuZywgZ2nDoSBj4buVIHBoaeG6v3UgY+G7p2EgbmfDom4gaMOgbmcgVmlldGNvbWJhbmsgdsOgIG5nw6JuIGjDoG5nIFZpZXRpbmJhbmsgdHJvbmcgZ2lhaSDEkW/huqFuIHThu6sgMDEvMjAyMCDEkeG6v24gMDgvMjAyMyDEkeG7gyB4ZW0geMOpdCBz4buxIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhur9uIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkuDQoNCmBgYHtyfQ0Kc2V0d2QoIkM6L01QTk4yIikNCmRhdGEgPC0gcmVhZF9leGNlbCgidGlldWx1YW4ueGxzeCIsMSkNCmV4ciA9IGRhdGEkRVhSDQp2bmkgPSBkYXRhJFZOSQ0KaG54ID0gZGF0YSRITlgNCnNwNTAwID0gZGF0YSRTUDUwMA0KeGF1ID0gZGF0YSRYQVUNCnd0aSA9IGRhdGEkV1RJDQp2Y2IgPSBkYXRhJFZDQg0KY3RnID0gZGF0YSRDVEcNCmRhdGENCmBgYA0KDQoqKk3DtCB04bqjIGThu68gbGnhu4d1KioNCg0KQuG7mSBk4buvIGxp4buHdSBiYW8gZ+G7k20gOTA0IHF1YW4gc8OhdCANCg0KLSoqRVhSKio6IFThu7cgZ2nDoSBo4buRaSDEkW/DoWkgKFVTRC9WTkQpDQoNCi0qKlZOSSoqOiBDaOG7iSBz4buRIHBo4bqjbiDDoW5oIGJp4bq/biDEkeG7mW5nIGdpw6EgY+G7lSBwaGnhur91IMSRxrDhu6NjIG5pw6ptIHnhur90IHRyw6puIHPDoG4gSG9TRQ0KDQotKipITlgqKjogQ2jhu4kgc+G7kSBwaOG6o24gw6FuaCBiaeG6v24gxJHhu5luZyBnacOhIGPhu5UgcGhp4bq/dSDEkcaw4bujYyBuacOqbSB54bq/dCB0csOqbiBzw6BuIEjDoCBO4buZaQ0KDQotKipTUDUwMCoqOiBDaOG7iSBz4buRIGNo4bupbmcga2hvw6FuIMSRxrDhu6NjIGThu7FhIHRyw6puIHbhu5FuIGjDs2EgY+G7p2EgNTAwIGPDtG5nIHR5IMSR4bqhaSBjaMO6bmcgbOG7m24gbmjhuqV0IG7GsOG7m2MgTeG7uQ0KDQotKipYQVUqKjogVOG7tyBnacOhIHbDoG5nIChYQVUvVVNEKQ0KDQotKipXVEkqKjogVOG7tyBnacOhIGThuqd1IChXVEkvVVNEKQ0KDQotKipWQ0IqKjogR2nDoSDEkcOzbmcgY+G7rWEgY+G7p2EgY+G7lSBwaGnhur91IGPhu6dhIG5nw6JuIGjDoG5nIFRNQ1AgTmdv4bqhaSB0aMawxqFuZyBWaeG7h3QgTmFtIC0gVmlldGNvbWJhbmsNCg0KLSoqQ1RHKio6IEdpw6EgxJHDs25nIGPhu61hIGPhu6dhIGPhu5UgcGhp4bq/dSBj4bunYSBuZ8OibiBow6BuZyBUTUNQIEPDtG5nIHRoxrDGoW5nIFZp4buHdCBOYW0gLSBWaWV0aW5iYW5rDQoNCiMgQ2jGsMahbmcgMy4gUGjGsMahbmcgcGjDoXAgdsOgIG3DtCBow6xuaCBuZ2hpw6puIGPhu6l1DQoNCiMjIFBoxrDGoW5nIHBow6FwIG5naGnDqm4gY+G7qXUNCg0KIyMjIE3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCDEkWEgYmnhur9uDQoNCk3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCDEkWEgYmnhur9uIHhlbSB4w6l0IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbeG7mXQgYmnhur9uIHBo4bulIHRodeG7mWMgWSB2w6Agbmhp4buBdSBiaeG6v24gxJHhu5ljIGzhuq1wICRYXzEsIFhfMiwg4oCmICxYX24kLiBDaMO6bmcgdGEgZ2nhuqMgxJHhu4tuaCBy4bqxbmcgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biBsw6AgdHV54bq/biB0w61uaCwgxJFp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGJp4bq/biBwaOG7pSB0aHXhu5ljIGPDsyB0aOG7gyDEkcaw4bujYyBiaeG7g3UgZGnhu4VuIGTGsOG7m2kgZOG6oW5nIG3hu5l0IHThu5VuZyBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgbmjDom4gduG7m2kgY8OhYyBo4buHIHPhu5EgdMawxqFuZyDhu6luZy4NCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIMSRYSBiaeG6v24gY8OzIGThuqFuZzoNCiQkWT3Osl8wK86yXzFYXzErzrJfMlhfMivii68rzrJfblhfbivPtSQkDQpUcm9uZyDEkcOzOg0KDQokWSQgbMOgIGJp4bq/biBwaOG7pSB0aHXhu5ljICRYXzEsIFhfMiwg4oCmICxYX24kIGzDoCBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgJM6yXzAszrJfMSwgzrJfMiwg4oCmLCDOsl9uJCBsw6AgY8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5IHTGsMahbmcg4bupbmcgduG7m2kgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wICTPtSQgbMOgIHNhaSBz4buRIMSR4bqhaSBkaeG7h24gY2hvIHNhaSBz4buRIGdp4buvYSBnacOhIHRy4buLIHRo4buxYyB04bq/IHbDoCBnacOhIHRy4buLIGThu7EgxJFvw6FuIGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljLg0KDQpN4bulYyB0acOqdSBj4bunYSB2aeG7h2MgxrDhu5tjIGzGsOG7o25nIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIHTDrG0gY8OhYyBnacOhIHRy4buLICTOsl8wLM6yXzEsIM6yXzIsIOKApiwgzrJfbiQgc2FvIGNobyBtw7QgaMOsbmggaOG7k2kgcXV5IHBow7kgaOG7o3AgdOG7kXQgduG7m2kgZOG7ryBsaeG7h3UgdGjhu7FjIHThur8gbmjhuqV0LiBRdcOhIHRyw6xuaCBuw6B5IHRoxrDhu51uZyDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGLhurFuZyBwaMawxqFuZyBwaMOhcCBj4bunYSBiw6xuaCBwaMawxqFuZyB04buRaSB0aGnhu4N1IChPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIC0gT0xTKSwgdMOsbSBjw6FjaCBnaeG6o20gdGhp4buDdSB04buVbmcgYsOsbmggcGjGsMahbmcgY+G7p2Egc2FpIHPhu5EgJM+1JC4NCg0KU2F1IGtoaSDGsOG7m2MgbMaw4bujbmcgaOG7hyBz4buRIGjhu5NpIHF1eSwgY2jDum5nIHRhIGPhuqduIGtp4buDbSB0cmEgdMOtbmggY2jDrW5oIHjDoWMgY+G7p2EgbcO0IGjDrG5oLiBDw6FjIGtp4buDbSDEkeG7i25oIHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyBiYW8gZ+G7k20ga2nhu4NtIMSR4buLbmggaOG7k2kgcXV5LCBraeG7g20gdHJhIHQtU3R1ZGVudCBjaG8gdOG7q25nIGjhu4cgc+G7kSwga2nhu4NtIHRyYSBGLXN0YXRpc3RpYywga2nhu4NtIHRyYSDEkWnhu4F1IGtp4buHbiBwaMOibiBwaOG7kWkgY+G7p2Egc2FpIHPhu5Es4oCmDQoNClNhdSBraGkgxJHDoyBraeG7g20gdHJhIHbDoCB4w6FjIG5o4bqtbiB0w61uaCBjaMOtbmggeMOhYyBj4bunYSBtw7QgaMOsbmgsIGNow7puZyB0YSBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgbsOzIMSR4buDIGThu7EgxJFvw6FuIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAuDQoNCiMjIyBNw7QgcGjhu49uZyBuZ+G6q3Ugbmhpw6puIGLhurFuZyBjaHV54buDbiDEkeG7mW5nIEJyb3duIA0KDQpRdcOhIHRyw6xuaCBuZ+G6q3Ugbmhpw6puIFcodCksIMSRxrDhu6NjIGfhu41pIGzDoCBjaHV54buDbiDEkeG7mW5nIEJyb3duIHRpw6p1IGNodeG6qW4gbuG6v3UgdGjhu49hIGPDoWMgxJFp4buBdSBraeG7h24gc2F1Og0KDQotIDEuIFcoMCk9MA0KDQotIDIuIFbhu5tpIG3hu41pICQw4omkdF8x4omkdF8yJCB0aMOsICRXKHRfMiniiJJXKHRfMSniiLxOKDAsdF8y4oiSdF8xKSQNCg0KLSAzLiAkVyh0XzIp4oiSVyh0XzEpJCDEkeG7mWMgbMOicC4NCg0KDQojIyBNw7QgaMOsbmggbmdoacOqbiBj4bupdQ0KDQpUw6FjIGdp4bqjIHjDonkgZOG7sW5nIG3DtCBow6xuaCB24bubaSBt4bulYyDEkcOtY2ggbmdoacOqbiBj4bupdSBz4buxIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhur9uIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkuIE3DtCBow6xuaCDEkeG7gSB4deG6pXQgbmjGsCBzYXU6DQoNCiQkRVhSPSDOsl8wICsgzrJfMVZOSSArIM6yXzJITlggKyDOsl8zU1A1MDAgKyDOsl80WEFVICsgzrJfNVdUSSArIM6yXzZWQ0IgKyDOsl83Q1RHJCQNCg0KVHJvbmcgxJHDsyANCg0KLSAkzrJfMCQ6IEjhurFuZyBz4buRIGPhu6dhIG3DtCBow6xuaCANCg0KLSAkzrJfMSAuLi4gzrJfNyQ6IEjhu4cgc+G7kSBo4buTaSBxdXkgY+G7p2EgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIA0KDQpUcm9uZyBtw7QgaMOsbmggbsOgeSBz4bq9IHBow6JuIHTDrWNoIHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSDEkeG6v24gdOG7tyBnacOhIGjhu5FpIMSRb8OhaQ0KDQotIEJp4bq/biBwaOG7pSB0aHXhu5ljOiBU4bu2IGdpw6EgaOG7kWkgxJFvw6FpIChFWFIpDQoNCi0gQmnhur9uIMSR4buZYyBs4bqtcDogDQoNCioqVk5JOioqIENo4buJIHPhu5EgVk4taW5kZXggKMSRaeG7g20pDQoNCioqSE5YOioqIENo4buJIHPhu5EgSE5YLWluZGV4ICjEkWnhu4NtKQ0KDQoqKlNQNTAwOioqIENo4buJIHPhu5EgUyZQNTAwLWluZGV4ICjEkWnhu4NtKQ0KDQoqKldUSToqKiBU4bu3IGdpw6EgZOG6p3UgKFdUSS9VU0QpDQoNCioqWEFVOioqIFThu7YgZ2nDoSB2w6BuZyAoWEFVL1VTRCkNCg0KKipWQ0I6KiogR2nDoSDEkcOzbmcgY+G7rWEgY+G7p2EgY+G7lSBwaGnhur91IG5nw6JuIGjDoG5nIFZpZXRjb21iYW5rIChWTkQpDQoNCioqQ1RHOioqIEdpw6EgxJHDs25nIGPhu61hIGPhu6dhIGPhu5UgcGhp4bq/dSBuZ8OibiBow6BuZyBWaWV0aW5iYW5rIChWTkQpDQoNCg0KIyBDaMawxqFuZyAzLiBQaMOibiB0w61jaCBk4buvIGxp4buHdSB2w6Aga+G6v3QgcXXhuqMgbmdoacOqbiBj4bupdSANCg0KKipCaeG6v24gRVhSKioNCg0KLSBUaOG7kW5nIGvDqiBtw7QgdOG6ow0KDQpgYGB7cn0NCnN1bW1hcnkoZXhyKQ0Kc2QoZXhyKQ0KYGBgDQoNCkJp4bq/biBFWFIgKHThu7cgZ2nDoSBo4buRaSDEkW/DoWkpIGPDsyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDoCAyMzI1MyB04bupYyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgbMOgIDIzMjUzVk5EL1VTRCB2w6AgZ2nDoSB0cuG7iyB0cnVuZyB24buLIGzDoCAyMzE3NyBWTkQvVVNELiBCaeG6v24gbsOgeSDEkeG6oXQgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgbMOgIDIyNjI1IFZORC9VU0QgdsOgIMSR4bqhdCBs4bubbiBuaOG6pXQgbMOgIDI0ODcxIFZORC9VU0QuIFbhu5tpIMSR4buZIGzhu4djaCBjaHXhuqluIGzDoCA0MTcsMDgyMyBWTkQvVVNELg0KDQojIyBYw6FjIMSR4buLbmggcGjDom4gcGjhu5FpIGNobyBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXANCg0KKioxLiBCaeG6v24gVk5JKioNCg0KLSBUaOG7kW5nIGvDqiBtw7QgdOG6ow0KDQpgYGB7cn0NCnN1bW1hcnkodm5pKQ0Kc2Qodm5pKQ0KYGBgDQpCaeG6v24gVk5JIChjaOG7iSBz4buRIFZOaW5kZXgpIGPDsyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDoCAxMTM4LDggdOG7qWMgbMOgIGdpw6EgxJHDs25nIGPhu61hIHRydW5nIGLDrG5oIGPhu6dhIGNo4buJIHPhu5EgVk4taW5kZXggbMOgIDExMzgsOCDEkWnhu4NtIHbDoCBnacOhIHRy4buLIHRydW5nIHbhu4sgbMOgIDExMjUsOC4gQmnhur9uIG7DoHkgxJHhuqF0IGdpw6EgdHLhu4sgdGjhuqVwIG5o4bqldCBsw6AgNjU5LDIgxJFp4buDbSB2w6AgxJHhuqF0IGNhbyBuaOG6pXQgbMOgIDE1MjgsNiDEkWnhu4NtLiBW4bubaSDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgMjExLDYzODMgxJFp4buDbQ0KDQotIMSQ4buTIHRo4buLIEhpc3RvZ3JhbQ0KDQpgYGB7cn0NCmhpc3Qudm5pID0gZ2dwbG90KGRhdGEgPSBkYXRhLGFlcyh2bmkpKSsgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9YWZ0ZXJfc3RhdChkZW5zaXR5KSksY29sb3I9ImJsYWNrIixmaWxsPSJsYXZlbmRlciIsIGJpbnMgPSAzMCkrIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW4gPSBtZWFuKHZuaSxuYS5ybSA9IFRSVUUpLHNkID0gc2Qodm5pLG5hLnJtID0gVFJVRSkpLCBjb2xvciA9J2RhcmtncmVlbicsbGluZXdpZHRoID0gMSkNCmhpc3Qudm5pDQpgYGANCg0KLSDEkOG7kyB0aOG7iyBRUS1wbG90DQoNCmBgYHtyfQ0KcXFub3JtKHZuaSkNCnFxbGluZSh2bmkpDQpgYGANCg0KLSAgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4gdGjDtG5nIHF1YSBraeG7g20gxJHhu4tuaCBTaGFwaXJvLVdpbGsgVGVzdA0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dCAtIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogQmnhur9uIFZOSSB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gVk5JIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KHZuaSkNCmBgYA0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gVk5JIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLg0KDQotIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSB0aMO0bmcgcXVhIGtp4buDbSDEkeG7i25oIEtvbG1vZ29yb3YgLSBTbWlybm92DQoNCioqUGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbioqDQoNCkPhurdwIGdp4bqjIHRodXnhur90IC0gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBCaeG6v24gVk5JIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIFZOSSBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdCh2bmksIHkgPSAncGxub3JtJykNCmBgYA0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gVk5JIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4uDQogDQoqKlBow6JuIHBo4buRaSBtxakqKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dCAtIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogQmnhur9uIFZOSSB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBWTkkga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqQ0KDQpgYGB7cn0NCmtzLnRlc3Qodm5pLCB5ID0gJ3BleHAnKQ0KYGBgDQoNCiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAwLDA1IG7Dqm4gdGEga2jDtG5nIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSB0aMOsIGJp4bq/biBWTkkga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqS4NCg0KKipQaMOibiBwaOG7kWkgxJHhu4F1KioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBWTkkgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCiRIXzEkOiBCaeG6v24gVk5JIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUNCg0KYGBge3J9DQprcy50ZXN0KHZuaSwgeSA9ICdwdW5pZicpDQpgYGANCg0KIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA8IDAsMDUgbsOqbiB0YSBraMO0bmcgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIHRow6wgYmnhur9uIFZOSSBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1Lg0KDQoqKjIuIEJp4bq/biBITlgqKg0KDQotIFRo4buRbmcga8OqIG3DtCB04bqjDQoNCmBgYHtyfQ0Kc3VtbWFyeShobngpDQpzZChobngpDQpgYGANCkJp4bq/biBITlggY8OzIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggbMOgIDI0Nyw1OSDEkWnhu4NtIHThu6ljIGdpw6EgxJHDs25nIGPhu61hIHRydW5nIGLDrG5oIGPhu6dhIGNo4buJIHPhu5EgSE5YIGzDoCAyNDcsNTkgxJFp4buDbSB2w6AgZ2nDoSB0cuG7iyB0cnVuZyB24buLIGzDoCAyMjgsNDEuIEJp4bq/biBuw6B5IMSR4bqhdCBnacOhIHRy4buLIHRo4bqlcCBuaOG6pXQgbMOgIDkyLDY0IMSRaeG7g20gdsOgIMSR4bqhdCBjYW8gbmjhuqV0IGzDoCA0OTMsODQgxJFp4buDbS4gVuG7m2kgxJHhu5kgbOG7h2NoIGNodeG6qW4gbMOgIDEwNyw0MjgzIMSRaeG7g20NCg0KLSDEkOG7kyB0aOG7iyBIaXN0b2dyYW0NCg0KYGBge3J9DQpoaXN0LmhueCA9IGdncGxvdChkYXRhID0gZGF0YSxhZXMoaG54KSkrIGdlb21faGlzdG9ncmFtKGFlcyh5PWFmdGVyX3N0YXQoZGVuc2l0eSkpLGNvbG9yPSJibGFjayIsZmlsbD0ibGF2ZW5kZXIiLCBiaW5zID0gMzApKyBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdChtZWFuID0gbWVhbihobngsbmEucm0gPSBUUlVFKSxzZCA9IHNkKGhueCxuYS5ybSA9IFRSVUUpKSwgY29sb3IgPSdicm93bicsbGluZXdpZHRoID0gMSkNCmhpc3QuaG54DQpgYGANCg0KLSDEkOG7kyB0aOG7iyBRUS1wbG90DQoNCmBgYHtyfQ0KcXFub3JtKGhueCkNCnFxbGluZShobngpDQpgYGANCg0KLSAgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4gdGjDtG5nIHF1YSBraeG7g20gxJHhu4tuaCBTaGFwaXJvLVdpbGsgVGVzdA0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dCAtIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogQmnhur9uIEhOWCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gSE5YIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KGhueCkNCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAwLDA1IG7Dqm4gdGEga2jDtG5nIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSB0aMOsIGJp4bq/biBITlgga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4uDQoNCi0gS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIHRow7RuZyBxdWEga2nhu4NtIMSR4buLbmggS29sbW9nb3JvdiAtIFNtaXJub3YNCg0KKipQaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluKioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBITlggdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gSE5YIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KYGBge3J9DQprcy50ZXN0KGhueCwgeSA9ICdwbG5vcm0nKQ0KYGBgDQoNCiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAwLDA1IG7Dqm4gdGEga2jDtG5nIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSB0aMOsIGJp4bq/biBITlgga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbi4NCiANCioqUGjDom4gcGjhu5FpIG3FqSoqDQoNCkPhurdwIGdp4bqjIHRodXnhur90IC0gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBCaeG6v24gSE5YIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqQ0KDQokSF8xJDogQmnhur9uIEhOWCBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpDQoNCmBgYHtyfQ0Ka3MudGVzdChobngsIHkgPSAncGV4cCcpDQpgYGANCg0KIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA8IDAsMDUgbsOqbiB0YSBraMO0bmcgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIHRow6wgYmnhur9uIEhOWCBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpLg0KDQoqKlBow6JuIHBo4buRaSDEkeG7gXUqKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dCAtIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogQmnhur9uIEhOWCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUNCg0KJEhfMSQ6IEJp4bq/biBITlgga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpgYGB7cn0NCmtzLnRlc3QoaG54LCB5ID0gJ3B1bmlmJykNCmBgYA0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gSE5YIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUuDQoNCioqMy4gQmnhur9uIFNQNTAwKioNCg0KLSBUaOG7kW5nIGvDqiBtw7QgdOG6ow0KDQpgYGB7cn0NCnN1bW1hcnkoc3A1MDApDQpzZChzcDUwMCkNCmBgYA0KQmnhur9uIFNQNTAwIGPDsyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDoCAzOTEyIHThu6ljIGdpw6EgxJHDs25nIGPhu61hIHRydW5nIGLDrG5oIGPhu6dhIGNo4buJIHPhu5EgUyZQNTAwIGzDoCAzOTEyIMSRaeG7g20gdsOgIGdpw6EgdHLhu4sgdHJ1bmcgduG7iyBsw6AgMzk4Ni4gQmnhur9uIG7DoHkgxJHhuqF0IGdpw6EgdHLhu4sgdGjhuqVwIG5o4bqldCBsw6AgMjIzNyDEkWnhu4NtIHbDoCDEkeG6oXQgY2FvIG5o4bqldCBsw6AgNDc5NyDEkWnhu4NtLiBW4bubaSDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgNTIyLDk3MjMgxJFp4buDbQ0KDQotIMSQ4buTIHRo4buLIEhpc3RvZ3JhbQ0KDQpgYGB7cn0NCmhpc3Quc3A1MDAgPSBnZ3Bsb3QoZGF0YSA9IGRhdGEsYWVzKHNwNTAwKSkrIGdlb21faGlzdG9ncmFtKGFlcyh5PWFmdGVyX3N0YXQoZGVuc2l0eSkpLGNvbG9yPSJibGFjayIsZmlsbD0ibGF2ZW5kZXIiLCBiaW5zID0gMzApKyBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdChtZWFuID0gbWVhbihzcDUwMCxuYS5ybSA9IFRSVUUpLHNkID0gc2Qoc3A1MDAsbmEucm0gPSBUUlVFKSksIGNvbG9yID0nYnJvd24nLGxpbmV3aWR0aCA9IDEpDQpoaXN0LnNwNTAwDQpgYGANCg0KLSDEkOG7kyB0aOG7iyBRUS1wbG90DQoNCmBgYHtyfQ0KcXFub3JtKHNwNTAwKQ0KcXFsaW5lKHNwNTAwKQ0KYGBgDQoNCi0gIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluIHRow7RuZyBxdWEga2nhu4NtIMSR4buLbmggU2hhcGlyby1XaWxrIFRlc3QNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBTUDUwMCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gU1A1MDAga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KYGBge3J9DQpzaGFwaXJvLnRlc3Qoc3A1MDApDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gU1A1MDAga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4uDQoNCi0gS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIHRow7RuZyBxdWEga2nhu4NtIMSR4buLbmggS29sbW9nb3JvdiAtIFNtaXJub3YNCg0KKipQaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluKioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBTUDUwMCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBTUDUwMCBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdChzcDUwMCwgeSA9ICdwbG5vcm0nKQ0KYGBgDQoNCiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAwLDA1IG7Dqm4gdGEga2jDtG5nIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSB0aMOsIGJp4bq/biBTUDUwMCBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluLg0KIA0KKipQaMOibiBwaOG7kWkgbcWpKioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBTUDUwMCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBTUDUwMCBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpDQoNCmBgYHtyfQ0Ka3MudGVzdChzcDUwMCwgeSA9ICdwZXhwJykNCmBgYA0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gU1A1MDAga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqS4NCg0KKipQaMOibiBwaOG7kWkgxJHhu4F1KioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBTUDUwMCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUNCg0KJEhfMSQ6IEJp4bq/biBTUDUwMCBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCmBgYHtyfQ0Ka3MudGVzdChzcDUwMCwgeSA9ICdwdW5pZicpDQpgYGANCg0KIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA8IDAsMDUgbsOqbiB0YSBraMO0bmcgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIHRow6wgYmnhur9uIFNQNTAwIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUuDQoNCioqNS4gQmnhur9uIFhBVSoqDQoNCi0gVGjhu5FuZyBrw6ogbcO0IHThuqMNCg0KYGBge3J9DQpzdW1tYXJ5KHhhdSkNCnNkKHhhdSkNCmBgYA0KQmnhur9uIFhBVSBjw7MgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6AgMTgyNCB04bupYyB04bu3IGdpw6EgdHJ1bmcgYsOsbmggY+G7p2EgdsOgbmcgbMOgIDE4MjRVU0QgdsOgIGdpw6EgdHLhu4sgdHJ1bmcgduG7iyBsw6AgMTQ3MS4gQmnhur9uIG7DoHkgxJHhuqF0IGdpw6EgdHLhu4sgbmjhu48gbmjhuqV0IGzDoCAxNDcxVVNEIHbDoCDEkeG6oXQgbOG7m24gbmjhuqV0IGzDoCAyMDY0IFVTRC4gVuG7m2kgxJHhu5kgbOG7h2NoIGNodeG6qW4gbMOgIDEwMSwwNTA5IFVTRA0KDQotIMSQ4buTIHRo4buLIEhpc3RvZ3JhbQ0KDQpgYGB7cn0NCmhpc3QueGF1ID0gZ2dwbG90KGRhdGEgPSBkYXRhLGFlcyh4YXUpKSsgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9YWZ0ZXJfc3RhdChkZW5zaXR5KSksY29sb3I9ImJsYWNrIixmaWxsPSJsYXZlbmRlciIsIGJpbnMgPSAzMCkrIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW4gPSBtZWFuKHhhdSxuYS5ybSA9IFRSVUUpLHNkID0gc2QoeGF1LG5hLnJtID0gVFJVRSkpLCBjb2xvciA9J2Jyb3duJyxsaW5ld2lkdGggPSAxKQ0KaGlzdC54YXUNCmBgYA0KDQotIMSQ4buTIHRo4buLIFFRLXBsb3QNCg0KYGBge3J9DQpxcW5vcm0oeGF1KQ0KcXFsaW5lKHhhdSkNCmBgYA0KDQotICBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbiB0aMO0bmcgcXVhIGtp4buDbSDEkeG7i25oIFNoYXBpcm8tV2lsayBUZXN0DQoNCkPhurdwIGdp4bqjIHRodXnhur90IC0gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBCaeG6v24gWEFVIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBYQVUga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoeGF1KQ0KYGBgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA8IDAsMDUgbsOqbiB0YSBraMO0bmcgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIHRow6wgYmnhur9uIFhBVSBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbi4NCg0KLSBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgdGjDtG5nIHF1YSBraeG7g20gxJHhu4tuaCBLb2xtb2dvcm92IC0gU21pcm5vdg0KDQoqKlBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4qKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dCAtIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogQmnhur9uIFhBVSB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBYQVUga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQpgYGB7cn0NCmtzLnRlc3QoeGF1LCB5ID0gJ3Bsbm9ybScpDQpgYGANCg0KIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA8IDAsMDUgbsOqbiB0YSBraMO0bmcgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIHRow6wgYmnhur9uIFhBVSBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluLg0KIA0KKipQaMOibiBwaOG7kWkgbcWpKioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBYQVUgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpDQoNCiRIXzEkOiBCaeG6v24gWEFVIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakNCg0KYGBge3J9DQprcy50ZXN0KHhhdSwgeSA9ICdwZXhwJykNCmBgYA0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gWEFVIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakuDQoNCioqUGjDom4gcGjhu5FpIMSR4buBdSoqDQoNCkPhurdwIGdp4bqjIHRodXnhur90IC0gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBCaeG6v24gWEFVIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdQ0KDQokSF8xJDogQmnhur9uIFhBVSBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCmBgYHtyfQ0Ka3MudGVzdCh4YXUsIHkgPSAncHVuaWYnKQ0KYGBgDQoNCiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAwLDA1IG7Dqm4gdGEga2jDtG5nIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSB0aMOsIGJp4bq/biBYQVUga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdS4NCg0KKio2LiBCaeG6v24gV1RJKioNCg0KLSBUaOG7kW5nIGvDqiBtw7QgdOG6ow0KDQpgYGB7cn0NCnN1bW1hcnkod3RpKQ0Kc2Qod3RpKQ0KYGBgDQpCaeG6v24gV1RJIGPDsyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDoCA3NSw3MCB04bupYyB04bu3IGdpw6EgdHJ1bmcgYsOsbmggY+G7p2EgZOG6p3UgbMOgIDc1LDcwVVNEIHbDoCBnacOhIHRy4buLIHRydW5nIHbhu4sgbMOgIDc1LDI4LiBCaeG6v24gbsOgeSDEkeG6oXQgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgbMOgIDI0LDA3IFVTRCB2w6AgxJHhuqF0IGzhu5tuIG5o4bqldCBsw6AgMTI4LDI2IFVTRC4gVuG7m2kgxJHhu5kgbOG7h2NoIGNodeG6qW4gbMOgIDE3LDQ2MDEgVVNEDQoNCi0gxJDhu5MgdGjhu4sgSGlzdG9ncmFtDQoNCmBgYHtyfQ0KaGlzdC53dGkgPSBnZ3Bsb3QoZGF0YSA9IGRhdGEsYWVzKHd0aSkpKyBnZW9tX2hpc3RvZ3JhbShhZXMoeT1hZnRlcl9zdGF0KGRlbnNpdHkpKSxjb2xvcj0iYmxhY2siLGZpbGw9ImxhdmVuZGVyIiwgYmlucyA9IDMwKSsgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QobWVhbiA9IG1lYW4od3RpLG5hLnJtID0gVFJVRSksc2QgPSBzZCh3dGksbmEucm0gPSBUUlVFKSksIGNvbG9yID0nYnJvd24nLGxpbmV3aWR0aCA9IDEpDQpoaXN0Lnd0aQ0KYGBgDQoNCi0gxJDhu5MgdGjhu4sgUVEtcGxvdA0KDQpgYGB7cn0NCnFxbm9ybSh3dGkpDQpxcWxpbmUod3RpKQ0KYGBgDQoNCi0gIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluIHRow7RuZyBxdWEga2nhu4NtIMSR4buLbmggU2hhcGlyby1XaWxrIFRlc3QNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBXVEkgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIFdUSSBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdCh3dGkpDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gV1RJIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLg0KDQotIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSB0aMO0bmcgcXVhIGtp4buDbSDEkeG7i25oIEtvbG1vZ29yb3YgLSBTbWlybm92DQoNCioqUGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbioqDQoNCkPhurdwIGdp4bqjIHRodXnhur90IC0gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBCaeG6v24gV1RJIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIFdUSSBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdCh3dGksIHkgPSAncGxub3JtJykNCmBgYA0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gV1RJIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4uDQogDQoqKlBow6JuIHBo4buRaSBtxakqKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dCAtIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogQmnhur9uIFdUSSB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBXVEkga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqQ0KDQpgYGB7cn0NCmtzLnRlc3Qod3RpLCB5ID0gJ3BleHAnKQ0KYGBgDQoNCiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAwLDA1IG7Dqm4gdGEga2jDtG5nIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSB0aMOsIGJp4bq/biBXVEkga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqS4NCg0KKipQaMOibiBwaOG7kWkgxJHhu4F1KioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBXVEkgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCiRIXzEkOiBCaeG6v24gV1RJIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUNCg0KYGBge3J9DQprcy50ZXN0KHd0aSwgeSA9ICdwdW5pZicpDQpgYGANCg0KIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA8IDAsMDUgbsOqbiB0YSBraMO0bmcgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIHRow6wgYmnhur9uIFdUSSBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1Lg0KIA0KKio1LiBCaeG6v24gVkNCKioNCg0KLSBUaOG7kW5nIGvDqiBtw7QgdOG6ow0KDQpgYGB7cn0NCnN1bW1hcnkodmNiKQ0Kc2QodmNiKQ0KYGBgDQpCaeG6v24gVkNCIGPDsyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDoCA3NjU0MyBWTkQgdsOgIGdpw6EgdHLhu4sgdHJ1bmcgduG7iyBsw6AgNzYzNjguIEJp4bq/biBuw6B5IMSR4bqhdCBnacOhIHRy4buLIG5o4buPIG5o4bqldCBsw6AgNDM5MjVWTkQgdsOgIMSR4bqhdCBs4bubbiBuaOG6pXQgbMOgIDEwNjUwMFZORC4gVuG7m2kgxJHhu5kgbOG7h2NoIGNodeG6qW4gbMOgIDExMDA0LDU0Vk5EDQoNCi0gxJDhu5MgdGjhu4sgSGlzdG9ncmFtDQoNCmBgYHtyfQ0KaGlzdC52Y2IgPSBnZ3Bsb3QoZGF0YSA9IGRhdGEsYWVzKHZjYikpKyBnZW9tX2hpc3RvZ3JhbShhZXMoeT1hZnRlcl9zdGF0KGRlbnNpdHkpKSxjb2xvcj0iYmxhY2siLGZpbGw9ImxhdmVuZGVyIiwgYmlucyA9IDMwKSsgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QobWVhbiA9IG1lYW4odmNiLG5hLnJtID0gVFJVRSksc2QgPSBzZCh2Y2IsbmEucm0gPSBUUlVFKSksIGNvbG9yID0nYnJvd24nLGxpbmV3aWR0aCA9IDEpDQpoaXN0LnZjYg0KYGBgDQoNCi0gxJDhu5MgdGjhu4sgUVEtcGxvdA0KDQpgYGB7cn0NCnFxbm9ybSh2Y2IpDQpxcWxpbmUodmNiKQ0KYGBgDQoNCi0gIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluIHRow7RuZyBxdWEga2nhu4NtIMSR4buLbmggU2hhcGlyby1XaWxrIFRlc3QNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBWQ0IgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIFZDQiBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdCh2Y2IpDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gVkNCIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLg0KDQotIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSB0aMO0bmcgcXVhIGtp4buDbSDEkeG7i25oIEtvbG1vZ29yb3YgLSBTbWlybm92DQoNCioqUGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbioqDQoNCkPhurdwIGdp4bqjIHRodXnhur90IC0gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBCaeG6v24gVkNCIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIFZDQiBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdCh2Y2IsIHkgPSAncGxub3JtJykNCmBgYA0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gVkNCIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4uDQogDQoqKlBow6JuIHBo4buRaSBtxakqKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dCAtIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogQmnhur9uIFZDQiB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBWQ0Iga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqQ0KDQpgYGB7cn0NCmtzLnRlc3QodmNiLCB5ID0gJ3BleHAnKQ0KYGBgDQoNCiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAwLDA1IG7Dqm4gdGEga2jDtG5nIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSB0aMOsIGJp4bq/biBWQ0Iga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqS4NCg0KKipQaMOibiBwaOG7kWkgxJHhu4F1KioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBWQ0IgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCiRIXzEkOiBCaeG6v24gVkNCIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUNCg0KYGBge3J9DQprcy50ZXN0KHZjYiwgeSA9ICdwdW5pZicpDQpgYGANCg0KIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA8IDAsMDUgbsOqbiB0YSBraMO0bmcgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIHRow6wgYmnhur9uIFZDQiBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1Lg0KDQoqKjYuIEJp4bq/biBDVEcqKg0KDQotIFRo4buRbmcga8OqIG3DtCB04bqjDQoNCmBgYHtyfQ0Kc3VtbWFyeShjdGcpDQpzZChjdGcpDQpgYGANCkJp4bq/biBDVEcgY8OzIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggbMOgIDI2NzQ4Vk5EIHbDoCBnacOhIHRy4buLIHRydW5nIHbhu4sgbMOgIDI4MDUwLiBCaeG6v24gbsOgeSDEkeG6oXQgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgbMOgIDEyODI0Vk5EIHbDoCDEkeG6oXQgbOG7m24gbmjhuqV0IGzDoCA0MTE0MVZORC4gVuG7m2kgxJHhu5kgbOG7h2NoIGNodeG6qW4gbMOgIDYyMDIsNDYxVk5EDQoNCi0gxJDhu5MgdGjhu4sgSGlzdG9ncmFtDQoNCmBgYHtyfQ0KaGlzdC5jdGcgPSBnZ3Bsb3QoZGF0YSA9IGRhdGEsYWVzKGN0ZykpKyBnZW9tX2hpc3RvZ3JhbShhZXMoeT1hZnRlcl9zdGF0KGRlbnNpdHkpKSxjb2xvcj0iYmxhY2siLGZpbGw9ImxhdmVuZGVyIiwgYmlucyA9IDMwKSsgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QobWVhbiA9IG1lYW4oY3RnLG5hLnJtID0gVFJVRSksc2QgPSBzZChjdGcsbmEucm0gPSBUUlVFKSksIGNvbG9yID0nYnJvd24nLGxpbmV3aWR0aCA9IDEpDQpoaXN0LmN0Zw0KYGBgDQoNCi0gxJDhu5MgdGjhu4sgUVEtcGxvdA0KDQpgYGB7cn0NCnFxbm9ybShjdGcpDQpxcWxpbmUoY3RnKQ0KYGBgDQoNCi0gIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluIHRow7RuZyBxdWEga2nhu4NtIMSR4buLbmggU2hhcGlyby1XaWxrIFRlc3QNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBDVEcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIENURyBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChjdGcpDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gQ1RHIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLg0KDQotIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSB0aMO0bmcgcXVhIGtp4buDbSDEkeG7i25oIEtvbG1vZ29yb3YgLSBTbWlybm92DQoNCioqUGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbioqDQoNCkPhurdwIGdp4bqjIHRodXnhur90IC0gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBCaeG6v24gQ1RHIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIENURyBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdChjdGcsIHkgPSAncGxub3JtJykNCmBgYA0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIDwgMCwwNSBuw6puIHRhIGtow7RuZyB0aOG7q2Egbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkLCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgdGjDrCBiaeG6v24gQ1RHIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4uDQogDQoqKlBow6JuIHBo4buRaSBtxakqKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dCAtIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogQmnhur9uIENURyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBDVEcga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqQ0KDQpgYGB7cn0NCmtzLnRlc3QoY3RnLCB5ID0gJ3BleHAnKQ0KYGBgDQoNCiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAwLDA1IG7Dqm4gdGEga2jDtG5nIHRo4burYSBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQsIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSB0aMOsIGJp4bq/biBDVEcga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIG3FqS4NCg0KKipQaMOibiBwaOG7kWkgxJHhu4F1KioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QgLSDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IEJp4bq/biBDVEcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCiRIXzEkOiBCaeG6v24gQ1RHIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUNCg0KYGBge3J9DQprcy50ZXN0KGN0ZywgeSA9ICdwdW5pZicpDQpgYGANCg0KIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA8IDAsMDUgbsOqbiB0YSBraMO0bmcgdGjhu6thIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIHRow6wgYmnhur9uIENURyBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1Lg0KDQojIyBNw7QgaMOsbmggaOG7k2kgcXV5DQoNCmBgYHtyfQ0KbWggPC0gbG0oZXhyIH4gIHZuaSArIGhueCArIHNwNTAwICsgeGF1ICsgd3RpICsgdmNiICsgY3RnKQ0Kc3VtbWFyeShtaCkNCmBgYA0KDQpU4burIGvhur90IHF14bqjIG3DtCBow6xuaCB0aOG7gyBoaeG7h24gY8OhYyB54bq/dSB04buRIGPDsyB0w6FjIMSR4buZbmcgxJHhur9uIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgdOG6oWkgVmnhu4d0IE5hbSDEkcaw4bujYyB4w6J5IGThu7FuZyBuaMawIHNhdToNCg0KJCRFWFIgPSAyLDc4N2VeeyswNH0gLSA0LDYwMGVeeyswMH0gVk5JICsgMiwxMzVlXnsrMDB9IEhOWCArIDMsMjIyZV57LTAxfSBTUDUwMCAtIDIsMjA5ZV57KzAwfSBYQVUgKyAxLDQxMmVeeyswMX1XVEkgKyAxLDkzNmVeey0wMn1WQ0IgKyAxLDE3NGVeey0wMn1DVEckJA0KDQpHacOhIHRy4buLIFItc3F1YXJlZCBj4bunYSBtw7QgaMOsbmggbMOgIDAsODkgdOG7qWMgYmnhur9uIMSR4buZYyBs4bqtcCB0cm9uZyBtw7QgaMOsbmggZ2nhuqNpIHRow61jaCDEkcaw4bujYyA4OSUgc+G7sSBiaeG6v24gdGhpw6puIGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljLg0KDQpUaMO0bmcgcXVhIGvhur90IHF14bqjIGjhu5NpIHF1eSBjaG8gdGjhuqV5IGPDsyA2IGJp4bq/biBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JS4gVHJvbmcgxJFp4buBdSBraeG7h24gY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWk6IA0KDQoqQmnhur9uIFZOSSogY8OzIG3hu5FpIHTGsMahbmcgcXVhbiBuZ8aw4bujYyBjaGnhu4F1IHbhu5tpIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgKEVYUikgY2hvIHRo4bqleSBraGkgY2jhu4kgc+G7kSBWTmluZGV4IHTEg25nIDEgxJFp4buDbSB0aMOsIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgc+G6vSBnaeG6o20gJDQuNjAwXnsrMDB9JC4NCg0KKkJp4bq/biBITlgqIGPDsyBt4buRaSB0xrDGoW5nIHF1YW4gY8O5bmcgY2hp4buBdSB24bubaSB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIChFWFIpIGNobyB0aOG6pXkga2hpIGNo4buJIHPhu5EgSE5YaW5kZXggdMSDbmcgMSDEkWnhu4NtIHRow6wgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSBz4bq9IHTEg25nICQyLDEzNWVeeyswMH0kLg0KDQoqQmnhur9uIFNQNTAwKiBjw7MgbeG7kWkgdMawxqFuZyBxdWFuIGPDuW5nIGNoaeG7gXUgduG7m2kgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSAoRVhSKSBjaG8gdGjhuqV5IGtoaSBjaOG7iSBz4buRIEhOWGluZGV4IHTEg25nIDEgxJFp4buDbSB0aMOsIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgc+G6vSB0xINuZyAkMywyMjJlXnstMDF9JC4NCg0KKkJp4bq/biBYQVUqIGPDsyBt4buRaSB0xrDGoW5nIHF1YW4gbmfGsOG7o2MgY2hp4buBdSB24bubaSB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIChFWFIpIGNobyB0aOG6pXkga2hpIHThu7cgZ2nDoSB2w6BuZyB0xINuZyAxIFVTRCB0aMOsIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgc+G6vSBnaeG6o20gJDIsMjA5ZV57LTAwfSQuDQoNCipCaeG6v24gV1RJKiBjw7MgbeG7kWkgdMawxqFuZyBxdWFuIGPDuW5nIGNoaeG7gXUgduG7m2kgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSAoRVhSKSBjaG8gdGjhuqV5IGtoaSB04bu3IGdpw6EgZOG6p3UgdMSDbmcgMSBVU0QgdGjDrCB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIHPhur0gdMSDbmcgJDEsNDEyZV57KzAwfSQuDQoNCipCaeG6v24gVkNCKiBjw7MgbeG7kWkgdMawxqFuZyBxdWFuIGPDuW5nIGNoaeG7gXUgduG7m2kgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSAoRVhSKSBjaG8gdGjhuqV5IGtoaSBnacOhIGPhu5UgcGhp4bq/dSBWQ0IgdMSDbmcgMSB0aMOsIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgc+G6vSB0xINuZyAkMSw5MzZlXnstMDJ9JC4NCg0KKkJp4bq/biBDVEcqIGPDsyBt4buRaSB0xrDGoW5nIHF1YW4gY8O5bmcgY2hp4buBdSB24bubaSB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIChFWFIpIGNobyB0aOG6pXkga2hpIGdpw6EgY+G7lSBwaGnhur91IENURyB0xINuZyAxIHRow6wgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSBz4bq9IHTEg25nICQxLDE3NGVeey0wMn0kLg0KDQoNCiMjIE3DtCBwaOG7j25nIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcA0KDQpTYXUga2hpIGtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaG8gY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIHRow6wga+G6v3QgcXXhuqMgY2hvIHRo4bqleSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgxJHhu4F1IGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBuw6BvLiBWw6wgdGjhur8gdMOhYyBnaeG6oyBz4bq9IHPhu60gZOG7pW5nIGNodXnhu4NuIMSR4buZbmcgQnJvd24gxJHhu4MgbcO0IHBo4buPbmcgbOG6oWkgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIHRoZW8gY8O0bmcgdGjhu6ljIHNhdToNCg0KJCRTX3Q9U18wZXhwKCjOvOKIks+DXnsyfS8yKXQrz4NXX3QkJA0KDQpUcm9uZyDEkcOzDQoNCioqJFNfMCQqKjogR2nDoSBn4buRYyBiYW4gxJHhuqd1DQoNCioqzrwqKjogR2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSB04bu3IGdpw6Egc2luaCBs4budaSBr4buzIHbhu41uZw0KDQoqKs+DKio6IMSQ4buZIGJp4bq/biDEkeG7mW5nIGPhu6dhIHThu7cgZ2nDoSBzaW5oIGzhu51pIGvhu7MgduG7jW5nDQoNCi0gVMOtbmggdOG7tyBzdeG6pXQgc2luaCBs4budaSBjaG8gY8OhYyBiaeG6v24NCg0KYGBge3J9DQoNCnJfdm5pIDwtIGRpZmYobG9nKHZuaSkpDQpyX2hueCA8LSBkaWZmKGxvZyhobngpKQ0Kcl9zcDUwMCA8LSBkaWZmKGxvZyhzcDUwMCkpDQpyX3hhdSA8LSBkaWZmKGxvZyh4YXUpKQ0Kcl93dGkgPC0gZGlmZihsb2cod3RpKSkNCnJfdmNiIDwtIGRpZmYobG9nKHZjYikpDQpyX2N0ZyA8LSBkaWZmKGxvZyhjdGcpKQ0KYGBgDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gVk5JDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTAwMCkNCg0KZ2JtLmYgPSBmdW5jdGlvbihuLFMwLG11LHNpZ21hKXsNCiAgdCA9IDENCiAgdC5zID0gc2VxKDAsdCxsZW5ndGggPSBuKQ0KICBkdCA9IHQvbg0KICBCdCA9IHNxcnQodCkqY3Vtc3VtKHJub3JtKChuKSwwLDEpKQ0KICBTdCA9IFMwKmV4cCgobXUtc2lnbWFeMi8yKSp0LnMgKyBzaWdtYSpCdCkNCiAgU3QgIyBL4bq/dCBxdeG6oyBj4bunYSBHQk0NCn0NCm4gPC0gMTAwMDANClMwIDwtIGRhdGEkVk5JWzFdICNk4buvIGxp4buHdSBn4buRYw0KbXUgPC0gKDEvKG4qKDEvbikpKSpzdW0ocl92bmkpICN0w61uaCBs4bujaSBuaHXhuq1uIGvhu7MgduG7jW5nIGdpw6ENCnNpZ21hIDwtIHNxcnQoKHN1bSgocl92bmktbXUpXjIpKSooMS8obi0xKSooMS9uKSkpICN0w61uaCDEkeG7mSBiaeG6v24gxJHhu5luZyBnacOhDQpWTkkgPC0gZ2JtLmYobixTMCxtdSxzaWdtYSkNCnBsb3QoVk5JLCB0eXBlID0gJ2wnLCBjb2wgPSAnZ3JlZW4nLCBtYWluID0gIkNo4buJIHPhu5EgVk4tSW5kZXgiLCB5bGFiID0gIlZOSSIsIHhsYWIgPSAiTmfDoHkiKQ0KYGBgDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gSE5YDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTAwMCkNCg0KZ2JtLmYgPSBmdW5jdGlvbihuLFMwLG11LHNpZ21hKXsNCiAgdCA9IDENCiAgdC5zID0gc2VxKDAsdCxsZW5ndGggPSBuKQ0KICBkdCA9IHQvbg0KICBCdCA9IHNxcnQodCkqY3Vtc3VtKHJub3JtKChuKSwwLDEpKQ0KICBTdCA9IFMwKmV4cCgobXUtc2lnbWFeMi8yKSp0LnMgKyBzaWdtYSpCdCkNCiAgU3QgIyBL4bq/dCBxdeG6oyBj4bunYSBHQk0NCn0NCm4gPC0gMTAwMDANClMwIDwtIGhueFsxXSAjZOG7ryBsaeG7h3UgZ+G7kWMNCm11IDwtICgxLyhuKigxL24pKSkqc3VtKHJfaG54KSAjdMOtbmggbOG7o2kgbmh14bqtbiBr4buzIHbhu41uZyBnacOhDQpzaWdtYSA8LSBzcXJ0KChzdW0oKHJfaG54LW11KV4yKSkqKDEvKG4tMSkqKDEvbikpKSAjdMOtbmggxJHhu5kgYmnhur9uIMSR4buZbmcgZ2nDoQ0KSE5YIDwtIGdibS5mKG4sUzAsbXUsc2lnbWEpDQpwbG90KEhOWCwgdHlwZSA9ICdsJywgY29sID0gJ2dyZWVuJywgbWFpbiA9ICJDaOG7iSBz4buRIEhOWC1JbmRleCIsIHlsYWIgPSAiSE5YIiwgeGxhYiA9ICJOZ8OgeSIpDQpgYGANCg0KIyMjIE3DtCBwaOG7j25nIGJp4bq/biBTUDUwMA0KDQpgYGB7cn0NCnNldC5zZWVkKDEwMDApDQoNCmdibS5mID0gZnVuY3Rpb24obixTMCxtdSxzaWdtYSl7DQogIHQgPSAxDQogIHQucyA9IHNlcSgwLHQsbGVuZ3RoID0gbikNCiAgZHQgPSB0L24NCiAgQnQgPSBzcXJ0KHQpKmN1bXN1bShybm9ybSgobiksMCwxKSkNCiAgU3QgPSBTMCpleHAoKG11LXNpZ21hXjIvMikqdC5zICsgc2lnbWEqQnQpDQogIFN0ICMgS+G6v3QgcXXhuqMgY+G7p2EgR0JNDQp9DQpuIDwtIDEwMDAwDQpTMCA8LSBzcDUwMFsxXSAjZOG7ryBsaeG7h3UgZ+G7kWMNCm11IDwtICgxLyhuKigxL24pKSkqc3VtKHJfc3A1MDApICN0w61uaCBs4bujaSBuaHXhuq1uIGvhu7MgduG7jW5nIGdpw6ENCnNpZ21hIDwtIHNxcnQoKHN1bSgocl9zcDUwMC1tdSleMikpKigxLyhuLTEpKigxL24pKSkgI3TDrW5oIMSR4buZIGJp4bq/biDEkeG7mW5nIGdpw6ENClNQNTAwIDwtIGdibS5mKG4sUzAsbXUsc2lnbWEpDQpwbG90KFNQNTAwLCB0eXBlID0gJ2wnLCBjb2wgPSAnZ3JlZW4nLCBtYWluID0gIkNo4buJIHPhu5EgUyZQNTAwIiwgeWxhYiA9ICJTUDUwMCIsIHhsYWIgPSAiTmfDoHkiKQ0KYGBgDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gWEFVDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTAwMCkNCg0KZ2JtLmYgPSBmdW5jdGlvbihuLFMwLG11LHNpZ21hKXsNCiAgdCA9IDENCiAgdC5zID0gc2VxKDAsdCxsZW5ndGggPSBuKQ0KICBkdCA9IHQvbg0KICBCdCA9IHNxcnQodCkqY3Vtc3VtKHJub3JtKChuKSwwLDEpKQ0KICBTdCA9IFMwKmV4cCgobXUtc2lnbWFeMi8yKSp0LnMgKyBzaWdtYSpCdCkNCiAgU3QgIyBL4bq/dCBxdeG6oyBj4bunYSBHQk0NCn0NCm4gPC0gMTAwMDANClMwIDwtIHhhdVsxXSAjZOG7ryBsaeG7h3UgZ+G7kWMNCm11IDwtICgxLyhuKigxL24pKSkqc3VtKHJfeGF1KSAjdMOtbmggbOG7o2kgbmh14bqtbiBr4buzIHbhu41uZyBnacOhDQpzaWdtYSA8LSBzcXJ0KChzdW0oKHJfeGF1LW11KV4yKSkqKDEvKG4tMSkqKDEvbikpKSAjdMOtbmggxJHhu5kgYmnhur9uIMSR4buZbmcgZ2nDoQ0KWEFVIDwtIGdibS5mKG4sUzAsbXUsc2lnbWEpDQpwbG90KFhBVSwgdHlwZSA9ICdsJywgY29sID0gJ2dyZWVuJywgbWFpbiA9ICJU4bu3IGdpw6EgdsOgbmciLCB5bGFiID0gIlhBVSIsIHhsYWIgPSAiTmfDoHkiKQ0KYGBgDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gV1RJDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTAwMCkNCg0KZ2JtLmYgPSBmdW5jdGlvbihuLFMwLG11LHNpZ21hKXsNCiAgdCA9IDENCiAgdC5zID0gc2VxKDAsdCxsZW5ndGggPSBuKQ0KICBkdCA9IHQvbg0KICBCdCA9IHNxcnQodCkqY3Vtc3VtKHJub3JtKChuKSwwLDEpKQ0KICBTdCA9IFMwKmV4cCgobXUtc2lnbWFeMi8yKSp0LnMgKyBzaWdtYSpCdCkNCiAgU3QgIyBL4bq/dCBxdeG6oyBj4bunYSBHQk0NCn0NCm4gPC0gMTAwMDANClMwIDwtIHd0aVsxXSAjZOG7ryBsaeG7h3UgZ+G7kWMNCm11IDwtICgxLyhuKigxL24pKSkqc3VtKHJfd3RpKSAjdMOtbmggbOG7o2kgbmh14bqtbiBr4buzIHbhu41uZyBnacOhDQpzaWdtYSA8LSBzcXJ0KChzdW0oKHJfd3RpLW11KV4yKSkqKDEvKG4tMSkqKDEvbikpKSAjdMOtbmggxJHhu5kgYmnhur9uIMSR4buZbmcgZ2nDoQ0KV1RJIDwtIGdibS5mKG4sUzAsbXUsc2lnbWEpDQpwbG90KFdUSSwgdHlwZSA9ICdsJywgY29sID0gJ2dyZWVuJywgbWFpbiA9ICJU4bu3IGdpw6EgZOG6p3UiLCB5bGFiID0gIldUSSIsIHhsYWIgPSAiTmfDoHkiKQ0KYGBgDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gVkNCDQoNCg0KYGBge3J9DQpzZXQuc2VlZCgxMDAwKQ0KDQpnYm0uZiA9IGZ1bmN0aW9uKG4sUzAsbXUsc2lnbWEpew0KICB0ID0gMQ0KICB0LnMgPSBzZXEoMCx0LGxlbmd0aCA9IG4pDQogIGR0ID0gdC9uDQogIEJ0ID0gc3FydCh0KSpjdW1zdW0ocm5vcm0oKG4pLDAsMSkpDQogIFN0ID0gUzAqZXhwKChtdS1zaWdtYV4yLzIpKnQucyArIHNpZ21hKkJ0KQ0KICBTdCAjIEvhur90IHF14bqjIGPhu6dhIEdCTQ0KfQ0KbiA8LSAxMDAwMA0KUzAgPC0gdmNiWzFdICNk4buvIGxp4buHdSBn4buRYw0KbXUgPC0gKDEvKG4qKDEvbikpKSpzdW0ocl92Y2IpICN0w61uaCBs4bujaSBuaHXhuq1uIGvhu7MgduG7jW5nIGdpw6ENCnNpZ21hIDwtIHNxcnQoKHN1bSgocl92Y2ItbXUpXjIpKSooMS8obi0xKSooMS9uKSkpICN0w61uaCDEkeG7mSBiaeG6v24gxJHhu5luZyBnacOhDQpWQ0IgPC0gZ2JtLmYobixTMCxtdSxzaWdtYSkNCnBsb3QoVkNCLCB0eXBlID0gJ2wnLCBjb2wgPSAnZ3JlZW4nLCBtYWluID0gIkdpw6EgQ1AgVkNCIiwgeWxhYiA9ICJWQ0IiLCB4bGFiID0gIk5nw6B5IikNCmBgYA0KDQojIyMgTcO0IHBo4buPbmcgYmnhur9uIENURw0KDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTAwMCkNCg0KZ2JtLmYgPSBmdW5jdGlvbihuLFMwLG11LHNpZ21hKXsNCiAgdCA9IDENCiAgdC5zID0gc2VxKDAsdCxsZW5ndGggPSBuKQ0KICBkdCA9IHQvbg0KICBCdCA9IHNxcnQodCkqY3Vtc3VtKHJub3JtKChuKSwwLDEpKQ0KICBTdCA9IFMwKmV4cCgobXUtc2lnbWFeMi8yKSp0LnMgKyBzaWdtYSpCdCkNCiAgU3QgIyBL4bq/dCBxdeG6oyBj4bunYSBHQk0NCn0NCm4gPC0gMTAwMDANClMwIDwtIGN0Z1sxXSAjZOG7ryBsaeG7h3UgZ+G7kWMNCm11IDwtICgxLyhuKigxL24pKSkqc3VtKHJfY3RnKSAjdMOtbmggbOG7o2kgbmh14bqtbiBr4buzIHbhu41uZyBnacOhDQpzaWdtYSA8LSBzcXJ0KChzdW0oKHJfY3RnLW11KV4yKSkqKDEvKG4tMSkqKDEvbikpKSAjdMOtbmggxJHhu5kgYmnhur9uIMSR4buZbmcgZ2nDoQ0KQ1RHIDwtIGdibS5mKG4sUzAsbXUsc2lnbWEpDQpwbG90KENURywgdHlwZSA9ICdsJywgY29sID0gJ2dyZWVuJywgbWFpbiA9ICJHacOhIENQIENURyIsIHlsYWIgPSAiQ1RHIiwgeGxhYiA9ICJOZ8OgeSIpDQpgYGANCg0KIyMgTcO0IHBo4buPbmcgbcO0IGjDrG5oIA0KDQpNw7QgaMOsbmggxJHDoyDEkcaw4bujYyB4w6J5IGThu7FuZzogDQoNCiQkRVhSID0gMiw3ODdlXnsrMDR9IC0gNCw2MDBlXnsrMDB9IFZOSSArIDIsMTM1ZV57KzAwfSBITlggKyAzLDIyMmVeey0wMX0gU1A1MDAgLSAyLDIwOWVeeyswMH0gWEFVICsgMSw0MTJlXnsrMDF9V1RJICsgMSw5MzZlXnstMDJ9VkNCICsgMSwxNzRlXnstMDJ9Q1RHJCQNCg0KYGBge3J9DQojIE3DtCBwaOG7j25nIG3DtCBow6xuaA0KRVhSIDwtIDIuNzg3ZSswNCAtIDQuNjAwZSswMCpWTkkgKyAyLjEzNWUrMDAqSE5YICsgMy4yMjJlLTAxKlNQNTAwIC0gMi4yMDllKzAwKlhBVSArIDEuNDEyZSswMSpXVEkgKyAxLjkzNmUtMDIqVkNCICsgMS4xNzRlLTAyKkNURw0Kc3VtbWFyeShFWFIpDQpgYGANCg0KU2F1IGtoaSBtw7QgcGjhu49uZyBjw6FjIHnhur91IHThu5EgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIHRyb25nIHbDsm5nIDEwMDAwIG5nw6B5LCB0YSB0aOG6pXkgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSBjw7MgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6AgMjMwNzMgVk5EL1VTRCB2w6AgY8OzIGdpw6EgdHLhu4sgdHJ1bmcgduG7iyBsw6AgMjMwNjAgVk5EL1VTRC4gVHJvbmcgMTAwMDAgbmfDoHkgdOG7m2ksIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgxJHhuqF0IGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0IGzDoCAyMzIxMSBWTkQvVVNEIHbDoCBuaOG7jyBuaOG6pXQgbMOgIDIzMDIzIFZORC9VU0QuDQoNCmBgYHtyfQ0KcGxvdChFWFIsIHR5cGUgPSAnbCcsIGNvbCA9ICdwaW5rJywgbWFpbiA9ICJU4bu3IGdpw6EgaOG7kWkgxJFvw6FpIiwgeWxhYiA9ICJFWFIiLCB4bGFiID0gIk5nw6B5IikNCmBgYA0KDQpUaMO0bmcgcXVhIGJp4buDdSDEkeG7kyB0YSB0aOG6pXkgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSBjw7MgYmnhur9uIMSR4buZbmcgZ2nhuqNtIHTEg25nIHRyb25nIHbDsm5nIDEwMDAwIG5nw6B5IHThu5tpLiBUcm9uZyA2MDAwIG5nw6B5IMSR4bqndSB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIGPDsyB4dSBoxrDhu5tuZyBnaeG6o20gZOG6p24gdsOgIOG7nyA0MDAwIG5nw6B5IGvhur8gdGnhur9wIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgbOG6oWkgY8OzIHh1IGjGsOG7m25nIHTEg25nIG3huqFuaCwgY8OzIHRo4buDIHTEg25nIGzDqm4gxJHhuqF0IG3hu6ljIDIzMjAwIFZORC9VU0QuDQoNCg0KLSAqVMOhYyBnaeG6oyDEkeG6t3QgcXV5IMaw4bubYyBraGkgbcO0IHBo4buPbmcgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSB0cm9uZyB2w7JuZyAxMDAwMCBuZ8OgeSBu4bq/dSBr4bq/dCBxdeG6oyB04bu3IGdpw6EgY2FvIGjGoW4gMjMwNTAgVk5EL1VTRCB0aMOsIMSRxrDhu6NjIGNvaSBsw6AgY2FvIHbDoCBuZ8aw4bujYyBs4bqhaSBu4bq/dSB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIGPDsyBr4bq/dCBxdeG6oyB0aOG6pXAgaMahbiAyMzA1MFZORC9VU0QgdGjDrCDEkcaw4bujYyB4ZW0gbMOgIHRo4bqlcC4gVmnhu4djIGThu7EgYsOhbyBuw6B5IHPhur0gZ2nDunAgY8OhYyBuaMOgIGhv4bqhY2ggxJHhu4tuaCBjaMOtbmggc8OhY2ggdsOgIG5nw6JuIGjDoG5nIG5ow6Agbsaw4bubYyB0aMO6YyDEkeG6qXkgY8OhYyBjaMOtbmggc8OhY2ggxJFp4buBdSBjaOG7iW5oIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgcGjDuSBo4bujcC4qIA0KDQpgYGB7cn0NCkVYUnRoYXAgPC0gRVhSW0VYUiA8IDIzMDUwXQ0KRVhSY2FvIDwtIEVYUltFWFIgPj0gMjMwNTBdDQp0YWJsZShjdXQoRVhSLGJyZWFrcz0yKSkNCnRhYmxlKGN1dChFWFIsMixsYWJlbHMgPSBjKCd0aGFwJywnY2FvJykpKQ0KYGBgDQoNCmBgYHtyfQ0KbGVuZ3RoKEVYUnRoYXApL2xlbmd0aChFWFIpDQpgYGANClThu6sga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHjDoWMgeHXhuqV0IHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgY8OzIGdpw6EgZMaw4bubaSAyMzA1MFZORC9VU0QgbMOgIDQ0LDE0JSwgaGF5IG7Ds2kgY8OhY2gga2jDoWMgdHJvbmcgMTAwMDAgbmfDoHkgbuG7r2EgdGjDrCB4w6FjIHN14bqldCDEkeG7gyBnacOhIGPhu6dhIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgZMaw4bubaSAyMzA1MCBWTkQvVVNEIGzDoCA0NCwxNCUuDQoNCmBgYHtyfQ0KbGVuZ3RoKEVYUmNhbykvbGVuZ3RoKEVYUikNCmBgYA0KDQpU4burIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSB4w6FjIHh14bqldCB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIGPDsyBnacOhIGLhurFuZyBob+G6t2MgY2FvIGjGoW4gMjMwNTAgVk5EL1VTRCBsw6AgNTUsODYlLCBoYXkgbsOzaSBjw6FjaCBraMOhYyB0cm9uZyAxMDAwMCBuZ8OgeSBu4buvYSB0aMOsIHjDoWMgc3XhuqV0IMSR4buDIGdpw6EgY+G7p2EgdOG7tyBnacOhIGjhu5FpIMSRb8OhaSBi4bqxbmcgdsOgIGNhbyBoxqFuIDIzMDUwVk5EL1VTRCBsw6AgNTUsODYlLg0KDQojIENoxrDGoW5nIDQuIEvhur90IGx14bqtbg0KDQpU4burIGvhur90IHF14bqjIHRyw6puIHRow7RuZyBxdWEgdmnhu4djIG3DtCBwaOG7j25nIG5n4bqrdSBuaGnDqm4gY8OhYyBuaMOibiB04buRIGJhbyBn4buTbSBjaOG7iSBj4buRIFZOLWluZGV4LCBITlgtaW5kZXgsIFMmUC1pbmRleCwgdOG7tyBnacOhIHbDoG5nIChYQVUpLCB04bu3IGdpw6EgZOG6p3UgKFdUSSksIGdpw6EgY+G7lSBwaGnhur91IG5nw6JuIGjDoG5nIFZpZXRjb21iYW5rIHbDoCBuZ8OibiBow6BuZyBWaWV0aW5iYW5rIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gdOG7tyBnacOhIGjhu5FpIMSRb8OhaSBj4bunYSBWaeG7h3QgTmFtLiBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHLhurFuZyB0cm9uZyAxMDAwMCBuZ8OgeSBu4buvYSB4w6FjIHN14bqldCDEkeG7gyB04bu3IGdpw6EgaOG7kWkgxJFvw6FpIGPhu6dhIFZp4buHdCBOYW0gY8OzIGdpw6EgdHLDqm4gMjMwNTBWTkQvVVNEIGzDoCBjYW8uIEPDsyB0aOG7gyB0aOG6pXkgdHJvbmcgdMawxqFuZyBsYWkga2hpIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgY8OgbmcgdMSDbmcgdGjDrCBz4bq9IGPDsyBs4bujaSBjaG8gY8OhYyBkb2FuaCBuZ2hp4buHcCB0cm9uZyBob+G6oXQgxJHhu5luZyB4deG6pXQga2jhuql1LiBE4buxYSB2w6BvIHZp4buHYyBk4buxIGLDoW8gbsOgeSB04burIMSRw6J5IGPDoWMgbmjDoCBob+G6oWNoIMSR4buLbmggY2jDrW5oIHPDoWNoIHbDoCBuZ8OibiBow6BuZyBOaMOgIG7GsOG7m2Mgc+G6vSDEkcawYSByYSBs4buxYSBjaOG7jW4gY2jDrW5oIHPDoWNoIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgcGjDuSBo4bujcCDEkeG7kWkgduG7m2kgbuG7gW4ga2luaCB04bq/IFZp4buHdCBOYW0gdHJvbmcgdMawxqFuZyBsYWkuDQoNCg0KDQoNCg0KDQoNCg0K