Đặt vấn đề
Trong bài thứ nhất của project R thực dụng, Nhi muốn bàn về quy trình ước tính cỡ mẫu sử dụng R. Cỡ mẫu là một chủ đề gây khó khăn cho nhiều anh chị em đồng nghiệp: một mặt đây là việc cần thiết khi xét đến thời gian và công sức phải bỏ ra để thu thập dữ liệu, nhưng mặt khác không phải ai cũng hiểu và làm đúng. Từ đó sinh ra việc sao chép một cách vô nghĩa những công thức từ thế hệ này sang thế hệ khác. Đáng tiếc rằng đến năm 2018 hiện nay việc sao chép này vẫn được làm một cách khá tùy tiện và bất hợp lý trong nhiều luận văn.
Để minh họa, Nhi trình bày một thí dụ có thật, trích từ luận án Tiến sỹ Y học có tựa đề “Nghiên cứu nồng độ leptin, adiponectin huyết tương và tỷ lệ leptin/adiponectin trên đối tượng thừa cân-béo phì” của BS.Võ Minh Phương (ĐH Y Dược Huế, năm 2018).
Bạn có thể đọc toàn văn luận án từ link sau đây:
http://hueuni.edu.vn/sdh/attachments/article/1241/NOIDUNGLA.pdf
Trước hết, Nhi muốn nhấn mạnh là bài viết này không nhằm mục đích phê bình cá nhân TS.BS Phương, hơn ai hết Nhi hiểu rõ bạn không có lỗi gì cả. Nhi chỉ muốn đề xuất một cách làm hợp lý hơn, để những đàn em sau này có thể tham khảo khi thực hiện luận văn cho mình và không vấp ngã như người đi trước.
Bình luận về cách làm cũ
Trong luận án, phần xác định cỡ mẫu được trình bày ngay đầu chương Đối tượng và phương pháp nghiên cứu (Mục 2.2, trang 52), điều này có nghĩa là tác giả đã thực hiện việc tính cỡ mẫu như một thủ tục hành chính, thậm chí trước khi biết mình muốn nghiên cứu về điều gì và như thế nào. Thật vậy, chưa có mục tiêu nghiên cứu nào được đặt ra sau phần Tổng quan Y văn trong chương 1, nên Cỡ mẫu không gắn kết với một giả thuyết nào cả. Trong khi đó thiết kế nghiên cứu, danh sách những biến số và phương pháp xử lý số liệu đều được trình bày sau phần tính cỡ mẫu. Đây là điểm bất hợp lý thứ nhất.
Tiếp theo, tác giả đã vận dụng công thức chưa phù hợp. Thực ra, ý nghĩa và mục tiêu của công thức quan trọng hơn nội dung của nó. Tác giả chưa thuyết phục được người đọc về câu hỏi: Mục tiêu của việc tính cỡ mẫu là gì ?
Lưu ý rằng xác định cỡ mẫu thực chất là một bài toán ngược, mục tiêu của cỡ mẫu thường là tối ưu hóa một tiêu chí nào đó liên quan đến phẩm chất của suy diễn thống kê, thí dụ kích thước hiệu ứng (Cohen’s d effect-size), sức mạnh thống kê (1-beta), giảm thiểu nguy cơ sai lầm Type I, type II… Trước hết, ta phải xác định mục tiêu, từ đó ta sẽ có phương trình để giải. Cỡ mẫu N chính là nghiệm của phương trình này. Nội dung phương trình này thường có nguồn gốc từ một trị số thống kê chuẩn hóa (Z-score) hoặc Effect-size như Cohen’s , hoặc phức tạp hơn khi sử dụng các hàm pnorm và qnorm trực tiếp cho Power, alpha…
Nếu bỏ qua bước giải thích này, cỡ mẫu và công thức là vô nghĩa, thậm chí nếu bạn dùng đúng công thức. Nội dung được trình bày, bao gồm kết quả cỡ mẫu được ước tính không đảm bảo điều gì cả cho những kiểm định thống kê và kết quả.
Trở lại với công thức, dù nó rất đơn giản nhưng người đọc không hiểu gì cả. Tác giả phát biểu “Công thức ước lượng một giá trị trung bình µ”,đây là cách giải thích rất tối nghĩa, vì như ta thấy, không có tham số µ nào xuất hiện trong nội dung công thức.
Trong công thức xuất hiện Z, đây là một trị số chuẩn hóa - nhưng có rất nhiều ý nghĩa, thí dụ Z có thể chỉ khác biệt trung bình giữa 2 phân nhóm sau chuẩn hóa, khác biệt giữa 2 tỉ lệ, hoặc khác biệt giữa trung bình 1 nhóm và 1 ngưỡng vô hiệu nào đó ?
Giả định một mục tiêu xác định N để mẫu có phân phối chuẩn, và Z là 1 giá trị đặc biệt nào đó, từ Z-score, µ và sigma thì công thức khả dĩ để tính cỡ mẫu là :
\[Z = \frac{x-\mu}{\sigma /\sqrt{n}}\]
Tuy nhiên trong tài liệu, tác giả đã sử dụng một công thức hoàn toàn khác và các tham số như Z và c được giải thích chưa rõ ràng, nhất là c được cho là mức độ chính xác của nghiên cứu, và sau đó được giả định = 0.05; Nhi không thể hiểu những nội dung này.
Sau đó, tác giả ước tính n dựa vào 1 tham số duy nhất là Sigma, với giá trị lấy từ y văn. Chỉ có 1 kết quả cỡ mẫu duy nhất.
Tính cỡ mẫu cho post-hoc test ANOVA đơn biến
Trong bài này, Nhi gợi ý một phương pháp ước tính cỡ mẫu khác hợp lý hơn.
Đầu tiên, mục tiêu của việc ước tính cỡ mẫu được nhắm vào 1 quy trình kiểm định / suy diễn mang tính trọng tâm của nghiên cứu. Sau khi đọc qua luận văn của TS.Bs. Phương, nhất là phần bàn luận thì Nhi nhận thấy một trong những mục tiêu chính trong nghiên cứu này là so sánh nồng độ leptin huyết tương giữa 3 phân nhóm độc lập: bệnh nhân béo phì, người thừa cân và những người bình thường (nhóm chứng).
Mục tiêu này dẫn chúng ta đến phương pháp suy diễn thống kê là post-hoc test trong thiết kế ANOVA đơn biến hay so sánh bắt cặp hàng loạt nhiều phân nhóm.
Trường hợp tổng quát, ta có k phân nhóm, tức là k(k-1)/2 cặp so sánh có thể, mỗi cặp so sánh như vậy tương ứng với một giả thuyết vô hiệu có nội dung: trung bình phân nhóm A = trung bình phân nhóm B
\[H_0:\mu_A=\mu_B\]
Hoặc giả thuyết cần chứng minh là:
\[H_1:\mu_A\lt\mu_B\]
Với µA và µB tương ứng với giá trị trung bình của 2 phân nhóm trong cặp so sánh
Trong trường hợp thiết kế ANOVA không cân xứng, cỡ mẫu các phân nhóm có thể không đồng nhất, do đó ta đặt thêm 1 tham số nữa là kappa chỉ tỉ lệ giữa cỡ mẫu 2 phân nhóm A và B:
\[n_B=\kappa n_A\]
Áp dụng công thức tính cỡ mẫu cho mục tiêu so sánh 2 giá trị trung bình có hiệu chỉnh cho việc bắt cặp nhiều lần, p_value 1 bên từ tài liệu : Chow S, Shao J, Wang H. 2008. Sample Size Calculations in Clinical Research. 2nd Ed. Chapman & Hall/CRC Biostatistics Series, trang 59, ta có
\[n_A=\left(\sigma_A^2+\sigma_B^2/\kappa\right)\left(\frac{z_{1-\alpha/\tau}+z_{1-\beta}}{\mu_A-\mu_B}\right)^2\]
Trong công thức này:
Sigma A,B là độ lệch chuẩn cho từng phân nhóm
MuA và MuB lần lượt là trung bình Leptin ở nhóm Chứng và nhóm Bệnh lý (MuA được phán đoán là nhỏ hơn muB)
sau này khi viết hàm ta sẽ thấy Z được tính bằng hàm qnorm (xác định phân vị của phân bố chuẩn)
Alpha là sai lầm Type I (thường được ấn định = 0.05)
Beta là sai lầm Type II, lưu ý: Power = 1- beta,
Tau là số cặp so sánh cần thực hiện, một hình thức hiệu chỉnh cho giá trị alpha
Như vậy để ước tính cỡ mẫu nA = nB, ta sẽ giải phương trình với nA là nghiệm số, cùng các tham số sigma, kappa, alpha, beta và z-score là giá trị chuẩn hóa khác biệt giữa muA và muB .
Chúng ta viết 1 hàm trong R có công dụng tính cỡ mẫu cho nA và nB
sample_estime=function(muA=NULL,sdA=NULL,
muB=NULL,sdB=NULL,
kappa=2,
tau=3,
alpha=0.05,
beta=0.2){
nA=(sdA^2+sdB^2/kappa)*((qnorm(1-alpha/tau)+qnorm(1-beta))/(muA-muB))^2
na=ceiling(nA)
nb=na/kappa
return(rbind(na,nb))
}
Nhi giả định giá trị của các tham số MuA và MuB, sdA và sdB tương ứng với trung bình và sd của Leptin ở phân nhóm người bình thường và bệnh nhân béo phì , ta có thể lấy thông tin này từ y văn, gọi là prior hay giả thuyết tiền định.
Giả sử một em sinh viên vào năm 2019 làm một nghiên cứu tương tự, em phải sử dụng thông tin từ luận án của TS BS Phương làm giả thuyết tiền định khi tính cỡ mẫu.
Trong luận văn này, Bs. Phương đã báo cáo kết quả như sau:
Nhóm bình thường: Leptin = 6.75 ± 5.17 µL/L
Nhóm thừa cân: Leptin = 9.74 ± 5.76
Nhóm béo phì: Leptin = 10.74 ± 5.61
Ta thi hành hàm tính cỡ mẫu cho cặp so sánh; Bình thường vs Béo phì, giả định cỡ mẫu đồng nhất: kappa=1
sample_estime(muA=6.75,
muB=10.74,
kappa=1,
sdA=5.17,
sdB=5.61,
tau=3,
alpha=0.05,
beta=0.20)
## [,1]
## na 33
## nb 33
Kết quả cho thấy mỗi nhóm cần có n=33 cho cặp so sánh này
Ta lại thử trên cặp so sánh thứ hai: Bình thường vs Thừa cân với tỉ lệ kappa=2
sample_estime(muA=6.75,
muB=9.74,
kappa=2,
sdA=5.17,
sdB=5.76,
tau=3,
alpha=0.05,
beta=0.20)
## [,1]
## na 43.0
## nb 21.5
Như vậy, ta có thể chọn n=43 nếu mục tiêu là so sánh nhóm chứng với cả 2 nhóm còn lại.
Mô phỏng nhiều giả thuyết
Quy trình tính cỡ mẫu không dừng ở đó. Do thông tin về tham số ta đưa vào công thức chỉ là giả định, nên ta không thể tự thỏa mãn quá dễ dàng với chỉ 1 giả định duy nhất. Quan trọng nhất là phải tính đường thoát thân sau này, khi trong quá trình thực hiện nghiên cứu vì lý do khách quan ta không thể đảm bảo đủ 60 bệnh nhân nhưng chỉ có 40 chẳng hạn, lúc này ta phải quay ngược lại biện luận để chứng minh 40 là đủ.
Chi bằng ngay từ ban đầu ta chuẩn bị cho tất cả mọi kịch bản có thể xảy ra : chúng ta cần mô phỏng hàng loạt giả định, thí dụ:
- Ta có thể giả định: Giá trị Leptin trung bình ở nhóm chứng giữ nguyên, nhưng ở nhóm Béo phì có thể dao động từ 8 đến 20 đơn vị, lúc đó cỡ mẫu sẽ thay đổi ra sao ?
library(tidyverse)
sim_df=data_frame(MuB=seq(8,20,0.5),nA=rep(NA,25))
for (i in (1:length(sim_df$MuB))){
sample_estime(muA=6.75,
muB=sim_df$MuB[i],
kappa=1,
sdA=5,
sdB=5,
tau=3,
alpha=0.05,
beta=0.20)->out
sim_df$nA[i]=out[1]
}
ggplot(sim_df,aes(x=MuB,y=nA))+geom_line()+geom_point(size=2,col="red")+theme_bw()

Theo kết quả này, giá trị trung bình của Leptin trong nhóm Béo phì càng thấp thì cỡ mẫu cần thiết càng cao, thậm chí có thể hơn 100, thậm chí 200 nếu MuB < 10. Dĩ nhiên đây chỉ là giả định, nhưng trong y văn đúng là có những báo cáo cho thấy Leptin ở người béo phì dao động trong khoảng này.
- Trong một kịch bản khác: Giả sử nồng độ Leptin ở người bình thường dao động từ 4-7 đơn vị, trong khi đó giá trị trung bình này dao động từ 8-20 đơn vị ở người béo phì, cỡ mẫu sẽ thay đổi ra sao ?
MuA_sim=c(4.5,5,5.5,6)
sim_df=data_frame(MuB=rep(seq(8,20,0.5),4),nA=rep(NA,100),MuA=c(rep(4,25),rep(5,25),rep(6,25),rep(7,25)))
for (i in (1:length(sim_df$MuB))){
sample_estime(muA=sim_df$MuA[i],
muB=sim_df$MuB[i],
kappa=1,
sdA=5,
sdB=5,
tau=2,
alpha=0.05,
beta=0.20)->out
sim_df$nA[i]=out[1]
}
sim_df$MuA=factor(sim_df$MuA)
ggplot(sim_df,aes(x=MuB,y=nA))+
geom_line(aes(col=MuA))+
geom_point(size=2,aes(col=MuA))+
theme_bw()

Kết quả mô phỏng cho thấy nếu giá trị Leptin ở nhóm chứng càng cao thì cỡ mẫu càng cao, nhưng nếu giá trị Leptin ở người béo phì > 10 đơn vị thì cỡ mẫu không thể vượt quá 50, bất kể giá trị nào của nhóm chứng trong khoảng 4-7
- Cuối cùng, ta có thể mô phỏng cả ảnh hưởng của sự thay đổi alpha và beta (hay 1-beta) lên cỡ mẫu. Thí dụ ta tăng ngưỡng alpha lên cao dần, từ 0.05 đến 0.01, 0.005 hay thậm chí 0.0001
Việc mô phỏng này có thể quan trọng, nếu vì sự hạn chế về tính khả thi mà ta buộc phải hy sinh kì vọng ban đầu của mình, thí dụ Power không thể tới 0.8 nhưng chỉ là 0.75 ? Hoặc ta kì vọng rất cao (Power =0.9, alpha=0.01)và muốn kiểm tra điều này có khả thi hay không ?
sim_df=data_frame(alpha=rep(c(0.001,0.005,0.01,0.05),5),
beta=rep(c(0.05,0.1,0.2,0.25,0.3),4),
nA=rep(NA,20))
for (i in (1:length(sim_df$alpha))){
sample_estime(muA=6.75,
muB=10.74,
kappa=1,
sdA=5.17,
sdB=5.61,
tau=3,
alpha=sim_df$alpha[i],
beta=sim_df$beta[i])->out
sim_df$nA[i]=out[1]
}
ggplot(sim_df,aes(x=1-beta,y=nA))+
geom_line(aes(col=factor(alpha)))+
geom_point(size=2,aes(col=factor(alpha)))+
theme_bw()

Kết quả mô phỏng cho thấy alpha càng thấp và/hoặc 1-beta càng cao thì cỡ mẫu yêu cầu càng lớn. Tuy nhiên nếu ta hài lòng với Power = 0.8 thì thậm chí tăng ngưỡng alpha lên 0.001 cũng không đưa đến một cỡ mẫu bất khả thi.
Diễn đạt
Quy trình tính toán, mô phỏng nêu trên có thể được diễn đạt trong văn bản như sau:
Cơ sở : Do mục tiêu chính của nghiên cứu là khảo sát sự khác biệt của Leptin giữa 3 phân nhóm: Bình thường/Thừa cân và Béo phì, việc ước tính cỡ mẫu dựa trên cơ sở đảm bảo tối ưu sức mạnh thống kê của phép so sánh lặp lại trên 3 cặp so sánh với giả thuyết vô hiệu là trung bình Leptin như nhau.
Cách thức: Chúng tôi sử dụng công thức ước tính cỡ mẫu:
\[n_A=\left(\sigma_A^2+\sigma_B^2/\kappa\right)\left(\frac{z_{1-\alpha/\tau}+z_{1-\beta}}{\mu_A-\mu_B}\right)^2\]
Trong đó nA là cỡ mẫu của nhóm chứng trong cặp so sánh A/B, µA,sigmaA và µB ,sigmaB lần lượt là trung bình và độ lệch chuẩn của nồng độ Leptin, Z là trị số thống kê chuẩn hóa được tính theo công thức:
(qnorm(1-alpha/tau)+qnorm(1-beta)
Tham số alpha tương ứng với sai lầm Type I, Beta là sai lầm Type II và sức mạnh thống kê Power =1-beta.
- Dựa theo thông tin từ nghiên cứu của Võ Minh Phương và cs., chúng tôi thực hiện một số mô phỏng, sau đó đối chiếu với quỹ thời gian và nguồn lực của dự án, và đi đến kết luận:
Nhóm chứng cần 50 cá thể, 2 phân nhóm Thừa cân và Béo phì cần ít nhất 30 bệnh nhân để đảm bảo phát hiện được khác biệt giữa bệnh nhân và nhóm chứng với sức mạnh thống kê 80% và nguy cơ sai lầm Type I< 0.05.
Nhận xét
Quy trình xác định cỡ mẫu trong đề cương/luận văn cần được trình bày một cách hợp lý hơn với những nội dung như sau:
Nên dựa trên cơ sở một câu hỏi nghiên cứu cụ thể, từ đó phát biểu giả thuyết vô hiệu (so sánh hơn/kém/tương đương), và dẫn đến một công thức tính toán rõ nghĩa.
Giá trị của các tham số cần được biện luận sử dụng thông tin từ y văn, giả thuyết tiền định, nghiên cứu pilot hoặc kết quả mô phỏng.
Không chỉ trình bày một giá trị duy nhất, nhưng nên có một hay nhiều kết quả mô phỏng cho các kịch bản khác nhau, bao gồm khả năng dao động ngẫu nhiên của các tham số, tỉ lệ mất mát dữ liệu.
Cuối cùng, kết quả mô phỏng và giả định sẽ được kiểm tra về tính khả thi, như thời gian, kinh phí, nhân lực và phương tiện… từ đó quyết định một con số cỡ mẫu tối ưu cân bằng giữa kì vọng và tính khả thi.
LS0tDQp0aXRsZTogIsav4bubYyB0w61uaCBj4buhIG3huqt1IGNobyBBTk9WQSDEkcahbiBiaeG6v24iDQphdXRob3I6ICJMw6ogTmfhu41jIEto4bqjIE5oaSINCmRhdGU6ICIxMCBUaMOhbmcgNiAyMDE4Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogInNpbXBsZXgiDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQotLS0NCg0KIVtdKGFub3Zhc2FtcGxlc2l6ZS5wbmcpDQoNCiMgxJDhurd0IHbhuqVuIMSR4buBDQoNClRyb25nIGLDoGkgdGjhu6kgbmjhuqV0IGPhu6dhIHByb2plY3QgUiB0aOG7sWMgZOG7pW5nLCBOaGkgbXXhu5FuIGLDoG4gduG7gSBxdXkgdHLDrG5oIMaw4bubYyB0w61uaCBj4buhIG3huqt1IHPhu60gZOG7pW5nIFIuIEPhu6EgbeG6q3UgbMOgIG3hu5l0IGNo4bunIMSR4buBIGfDonkga2jDsyBraMSDbiBjaG8gbmhp4buBdSBhbmggY2jhu4sgZW0gxJHhu5NuZyBuZ2hp4buHcDogbeG7mXQgbeG6t3QgxJHDonkgbMOgIHZp4buHYyBj4bqnbiB0aGnhur90IGtoaSB4w6l0IMSR4bq/biB0aOG7nWkgZ2lhbiB2w6AgY8O0bmcgc+G7qWMgcGjhuqNpIGLhu48gcmEgxJHhu4MgdGh1IHRo4bqtcCBk4buvIGxp4buHdSwgbmjGsG5nIG3hurd0IGtow6FjIGtow7RuZyBwaOG6o2kgYWkgY8WpbmcgIGhp4buDdSB2w6AgbMOgbSDEkcO6bmcuIFThu6sgxJHDsyBzaW5oIHJhIHZp4buHYyBzYW8gY2jDqXAgbeG7mXQgY8OhY2ggdsO0IG5naMSpYSBuaOG7r25nIGPDtG5nIHRo4bupYyB04burIHRo4bq/IGjhu4cgbsOgeSBzYW5nIHRo4bq/IGjhu4cga2jDoWMuIMSQw6FuZyB0aeG6v2MgcuG6sW5nIMSR4bq/biBuxINtIDIwMTggaGnhu4duIG5heSB2aeG7h2Mgc2FvIGNow6lwIG7DoHkgduG6q24gxJHGsOG7o2MgbMOgbSBt4buZdCBjw6FjaCBraMOhIHTDuXkgdGnhu4duIHbDoCBi4bqldCBo4bujcCBsw70gdHJvbmcgbmhp4buBdSBsdeG6rW4gdsSDbi4NCg0KxJDhu4MgbWluaCBo4buNYSwgTmhpIHRyw6xuaCBiw6B5IG3hu5l0IHRow60gZOG7pSBjw7MgdGjhuq10LCB0csOtY2ggdOG7qyBsdeG6rW4gw6FuIFRp4bq/biBz4bu5IFkgaOG7jWMgIGPDsyB04buxYSDEkeG7gSAiTmdoacOqbiBj4bupdSBu4buTbmcgxJHhu5kgbGVwdGluLCBhZGlwb25lY3RpbiBodXnhur90IHTGsMahbmcgdsOgIHThu7cgbOG7hyBsZXB0aW4vYWRpcG9uZWN0aW4gdHLDqm4gxJHhu5FpIHTGsOG7o25nIHRo4burYSBjw6JuLWLDqW8gcGjDrCIgY+G7p2EgQlMuVsO1IE1pbmggUGjGsMahbmcgKMSQSCBZIETGsOG7o2MgSHXhur8sIG7Eg20gMjAxOCkuIA0KDQpC4bqhbiBjw7MgdGjhu4MgxJHhu41jIHRvw6BuIHbEg24gbHXhuq1uIMOhbiB04burIGxpbmsgc2F1IMSRw6J5Og0KDQo8aHR0cDovL2h1ZXVuaS5lZHUudm4vc2RoL2F0dGFjaG1lbnRzL2FydGljbGUvMTI0MS9OT0lEVU5HTEEucGRmPg0KDQpUcsaw4bubYyBo4bq/dCwgTmhpIG114buRbiBuaOG6pW4gbeG6oW5oIGzDoCBiw6BpIHZp4bq/dCBuw6B5IGtow7RuZyBuaOG6sW0gbeG7pWMgxJHDrWNoIHBow6ogYsOsbmggY8OhIG5ow6JuIFRTLkJTIFBoxrDGoW5nLCBoxqFuIGFpIGjhur90IE5oaSBoaeG7g3UgcsO1ICBi4bqhbiBraMO0bmcgY8OzIGzhu5dpIGfDrCBj4bqjLiBOaGkgY2jhu4kgbXXhu5FuIMSR4buBIHh14bqldCBt4buZdCBjw6FjaCBsw6BtIGjhu6NwIGzDvSBoxqFuLCDEkeG7gyBuaOG7r25nIMSRw6BuIGVtIHNhdSBuw6B5IGPDsyB0aOG7gyB0aGFtIGto4bqjbyBraGkgdGjhu7FjIGhp4buHbiBsdeG6rW4gdsSDbiBjaG8gbcOsbmggdsOgIGtow7RuZyB24bqlcCBuZ8OjIG5oxrAgbmfGsOG7nWkgxJFpIHRyxrDhu5tjLg0KDQojIELDrG5oIGx14bqtbiB24buBIGPDoWNoIGzDoG0gY8WpDQoNClRyb25nIGx14bqtbiDDoW4sIHBo4bqnbiB4w6FjIMSR4buLbmggY+G7oSBt4bqrdSDEkcaw4bujYyB0csOsbmggYsOgeSBuZ2F5IMSR4bqndSBjaMawxqFuZyDEkOG7kWkgdMaw4bujbmcgdsOgIHBoxrDGoW5nIHBow6FwIG5naGnDqm4gY+G7qXUgKE3hu6VjIDIuMiwgdHJhbmcgNTIpLCDEkWnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgdMOhYyBnaeG6oyDEkcOjIHRo4buxYyBoaeG7h24gdmnhu4djIHTDrW5oIGPhu6EgbeG6q3UgbmjGsCBt4buZdCB0aOG7pyB04bulYyBow6BuaCBjaMOtbmgsIHRo4bqtbSBjaMOtIHRyxrDhu5tjIGtoaSBiaeG6v3QgbcOsbmggbXXhu5FuIG5naGnDqm4gY+G7qXUgduG7gSDEkWnhu4F1IGfDrCB2w6AgbmjGsCB0aOG6vyBuw6BvLiBUaOG6rXQgduG6rXksIGNoxrBhIGPDsyBt4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1IG7DoG8gxJHGsOG7o2MgxJHhurd0IHJhIHNhdSBwaOG6p24gVOG7lW5nIHF1YW4gWSB2xINuIHRyb25nIGNoxrDGoW5nIDEsIG7Dqm4gQ+G7oSBt4bqrdSBraMO0bmcgZ+G6r24ga+G6v3QgduG7m2kgbeG7mXQgZ2nhuqMgdGh1eeG6v3QgbsOgbyBj4bqjLiBUcm9uZyBraGkgxJHDsyB0aGnhur90IGvhur8gbmdoacOqbiBj4bupdSwgZGFuaCBzw6FjaCBuaOG7r25nIGJp4bq/biBz4buRIHbDoCBwaMawxqFuZyBwaMOhcCB44butIGzDvSBz4buRIGxp4buHdSDEkeG7gXUgxJHGsOG7o2MgdHLDrG5oIGLDoHkgc2F1IHBo4bqnbiB0w61uaCBj4buhIG3huqt1LiDEkMOieSBsw6AgxJFp4buDbSBi4bqldCBo4bujcCBsw70gdGjhu6kgbmjhuqV0LiANCg0KIVtdKHNhbXBsZUVyci5wbmcpDQoNClRp4bq/cCB0aGVvLCB0w6FjIGdp4bqjIMSRw6MgduG6rW4gZOG7pW5nIGPDtG5nIHRo4bupYyBjaMawYSBwaMO5IGjhu6NwLiBUaOG7sWMgcmEsIMO9IG5naMSpYSB2w6AgbeG7pWMgdGnDqnUgY+G7p2EgY8O0bmcgdGjhu6ljIHF1YW4gdHLhu41uZyBoxqFuIG7hu5lpIGR1bmcgY+G7p2EgbsOzLiBUw6FjIGdp4bqjIGNoxrBhIHRodXnhur90IHBo4bulYyDEkcaw4bujYyBuZ8aw4budaSDEkeG7jWMgduG7gSBjw6J1IGjhu49pOiBN4bulYyB0acOqdSBj4bunYSB2aeG7h2MgdMOtbmggY+G7oSBt4bqrdSBsw6AgZ8OsID8NCg0KTMawdSDDvSBy4bqxbmcgeMOhYyDEkeG7i25oIGPhu6EgbeG6q3UgdGjhu7FjIGNo4bqldCBsw6AgbeG7mXQgYsOgaSB0b8OhbiBuZ8aw4bujYywgbeG7pWMgdGnDqnUgY+G7p2EgY+G7oSBt4bqrdSB0aMaw4budbmcgbMOgIHThu5FpIMawdSBow7NhIG3hu5l0IHRpw6p1IGNow60gbsOgbyDEkcOzIGxpw6puIHF1YW4gxJHhur9uIHBo4bqpbSBjaOG6pXQgY+G7p2Egc3V5IGRp4buFbiB0aOG7kW5nIGvDqiwgdGjDrSBk4bulIGvDrWNoIHRoxrDhu5tjIGhp4buHdSDhu6luZyAoQ29oZW4ncyBkIGVmZmVjdC1zaXplKSwgc+G7qWMgbeG6oW5oIHRo4buRbmcga8OqICgxLWJldGEpLCBnaeG6o20gdGhp4buDdSBuZ3V5IGPGoSBzYWkgbOG6p20gVHlwZSBJLCB0eXBlIElJLi4uIFRyxrDhu5tjIGjhur90LCB0YSBwaOG6o2kgeMOhYyDEkeG7i25oIG3hu6VjIHRpw6p1LCB04burIMSRw7MgdGEgc+G6vSBjw7MgcGjGsMahbmcgdHLDrG5oIMSR4buDIGdp4bqjaS4gQ+G7oSBt4bqrdSBOIGNow61uaCBsw6AgbmdoaeG7h20gY+G7p2EgcGjGsMahbmcgdHLDrG5oIG7DoHkuIE7hu5lpIGR1bmcgcGjGsMahbmcgdHLDrG5oIG7DoHkgdGjGsOG7nW5nIGPDsyBuZ3Xhu5NuIGfhu5FjIHThu6sgbeG7mXQgdHLhu4sgc+G7kSB0aOG7kW5nIGvDqiBjaHXhuqluIGjDs2EgKFotc2NvcmUpIGhv4bq3YyBFZmZlY3Qtc2l6ZSBuaMawIENvaGVuJ3MgLCBob+G6t2MgcGjhu6ljIHThuqFwIGjGoW4ga2hpIHPhu60gZOG7pW5nIGPDoWMgaMOgbSBwbm9ybSB2w6AgcW5vcm0gIHRy4buxYyB0aeG6v3AgY2hvIFBvd2VyLCBhbHBoYS4uLg0KDQpO4bq/dSBi4buPIHF1YSBixrDhu5tjIGdp4bqjaSB0aMOtY2ggbsOgeSwgY+G7oSBt4bqrdSB2w6AgY8O0bmcgdGjhu6ljIGzDoCB2w7QgbmdoxKlhLCB0aOG6rW0gY2jDrSBu4bq/dSBi4bqhbiBkw7luZyDEkcO6bmcgY8O0bmcgdGjhu6ljLiBO4buZaSBkdW5nIMSRxrDhu6NjIHRyw6xuaCBiw6B5LCBiYW8gZ+G7k20ga+G6v3QgcXXhuqMgY+G7oSBt4bqrdSDEkcaw4bujYyDGsOG7m2MgdMOtbmgga2jDtG5nIMSR4bqjbSBi4bqjbyDEkWnhu4F1IGfDrCBj4bqjIGNobyBuaOG7r25nIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIHbDoCBr4bq/dCBxdeG6oy4NCg0KVHLhu58gbOG6oWkgduG7m2kgY8O0bmcgdGjhu6ljLCBkw7kgbsOzIHLhuqV0IMSRxqFuIGdp4bqjbiBuaMawbmcgIG5nxrDhu51pIMSR4buNYyBraMO0bmcgaGnhu4N1IGfDrCBj4bqjLiBUw6FjIGdp4bqjIHBow6F0IGJp4buDdSAiQ8O0bmcgdGjhu6ljIMaw4bubYyBsxrDhu6NuZyBt4buZdCBnacOhIHRy4buLIHRydW5nIGLDrG5oIMK1IizEkcOieSBsw6AgY8OhY2ggZ2nhuqNpIHRow61jaCBy4bqldCB04buRaSBuZ2jEqWEsIHbDrCBuaMawIHRhIHRo4bqleSwga2jDtG5nIGPDsyB0aGFtIHPhu5EgwrUgbsOgbyB4deG6pXQgaGnhu4duIHRyb25nIG7hu5lpIGR1bmcgY8O0bmcgdGjhu6ljLiANCg0KVHJvbmcgY8O0bmcgdGjhu6ljIHh14bqldCBoaeG7h24gWiwgxJHDonkgbMOgIG3hu5l0IHRy4buLIHPhu5EgY2h14bqpbiBow7NhIC0gbmjGsG5nIGPDsyBy4bqldCBuaGnhu4F1IMO9IG5naMSpYSwgdGjDrSBk4bulIFogY8OzIHRo4buDIGNo4buJIGtow6FjIGJp4buHdCB0cnVuZyBiw6xuaCBnaeG7r2EgMiBwaMOibiBuaMOzbSBzYXUgY2h14bqpbiBow7NhLCBraMOhYyBiaeG7h3QgZ2nhu69hIDIgdOG7iSBs4buHLCBob+G6t2Mga2jDoWMgYmnhu4d0IGdp4buvYSB0cnVuZyBiw6xuaCAxIG5ow7NtIHbDoCAxIG5nxrDhu6FuZyB2w7QgaGnhu4d1IG7DoG8gxJHDsyA/IA0KDQpHaeG6oyDEkeG7i25oIG3hu5l0IG3hu6VjIHRpw6p1IHjDoWMgxJHhu4tuaCBOIMSR4buDIG3huqt1IGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbiwgdsOgIFogbMOgIDEgZ2nDoSB0cuG7iyDEkeG6t2MgYmnhu4d0IG7DoG8gxJHDsywgdOG7qyBaLXNjb3JlLCDCtSB2w6Agc2lnbWEgdGjDrCBjw7RuZyB0aOG7qWMga2jhuqMgZMSpIMSR4buDIHTDrW5oIGPhu6EgbeG6q3UgbMOgIDoNCg0KJCRaID0gXGZyYWN7eC1cbXV9e1xzaWdtYSAvXHNxcnR7bn19JCQNCg0KVHV5IG5oacOqbiB0cm9uZyB0w6BpIGxp4buHdSwgdMOhYyBnaeG6oyDEkcOjIHPhu60gZOG7pW5nIG3hu5l0IGPDtG5nIHRo4bupYyBob8OgbiB0b8OgbiBraMOhYyB2w6AgY8OhYyB0aGFtIHPhu5EgbmjGsCBaIHbDoCBjIMSRxrDhu6NjIGdp4bqjaSB0aMOtY2ggY2jGsGEgcsO1IHLDoG5nLCBuaOG6pXQgbMOgIGMgxJHGsOG7o2MgY2hvIGzDoCBt4bupYyDEkeG7mSBjaMOtbmggeMOhYyBj4bunYSBuZ2hpw6puIGPhu6l1LCB2w6Agc2F1IMSRw7MgxJHGsOG7o2MgZ2nhuqMgxJHhu4tuaCA9IDAuMDU7IE5oaSBraMO0bmcgdGjhu4MgaGnhu4N1IG5o4buvbmcgbuG7mWkgZHVuZyBuw6B5Lg0KDQpTYXUgxJHDsywgdMOhYyBnaeG6oyDGsOG7m2MgdMOtbmggbiBk4buxYSB2w6BvIDEgdGhhbSBz4buRIGR1eSBuaOG6pXQgbMOgIFNpZ21hLCB24bubaSBnacOhIHRy4buLIGzhuqV5IHThu6sgeSB2xINuLiBDaOG7iSBjw7MgMSBr4bq/dCBxdeG6oyBj4buhIG3huqt1IGR1eSBuaOG6pXQuDQoNCiMgVMOtbmggY+G7oSBt4bqrdSBjaG8gcG9zdC1ob2MgdGVzdCBBTk9WQSDEkcahbiBiaeG6v24NCg0KVHJvbmcgYsOgaSBuw6B5LCBOaGkgZ+G7o2kgw70gbeG7mXQgcGjGsMahbmcgcGjDoXAgxrDhu5tjIHTDrW5oIGPhu6EgbeG6q3Uga2jDoWMgaOG7o3AgbMO9IGjGoW4uDQoNCsSQ4bqndSB0acOqbiwgbeG7pWMgdGnDqnUgY+G7p2Egdmnhu4djIMaw4bubYyB0w61uaCBj4buhIG3huqt1IMSRxrDhu6NjIG5o4bqvbSB2w6BvIDEgcXV5IHRyw6xuaCBraeG7g20gxJHhu4tuaCAvIHN1eSBkaeG7hW4gbWFuZyB0w61uaCB0cuG7jW5nIHTDom0gY+G7p2EgbmdoacOqbiBj4bupdS4gU2F1IGtoaSDEkeG7jWMgcXVhIGx14bqtbiB2xINuIGPhu6dhIFRTLkJzLiBQaMawxqFuZywgbmjhuqV0IGzDoCBwaOG6p24gYsOgbiBsdeG6rW4gdGjDrCBOaGkgbmjhuq1uIHRo4bqleSBt4buZdCB0cm9uZyBuaOG7r25nIG3hu6VjIHRpw6p1IGNow61uaCB0cm9uZyBuZ2hpw6puIGPhu6l1IG7DoHkgbMOgIHNvIHPDoW5oIG7hu5NuZyDEkeG7mSBsZXB0aW4gaHV54bq/dCB0xrDGoW5nIGdp4buvYSAzIHBow6JuIG5ow7NtIMSR4buZYyBs4bqtcDogYuG7h25oIG5ow6JuIGLDqW8gcGjDrCwgbmfGsOG7nWkgdGjhu6thIGPDom4gdsOgIG5o4buvbmcgbmfGsOG7nWkgYsOsbmggdGjGsOG7nW5nIChuaMOzbSBjaOG7qW5nKS4gDQoNCk3hu6VjIHRpw6p1IG7DoHkgZOG6q24gY2jDum5nIHRhIMSR4bq/biBwaMawxqFuZyBwaMOhcCBzdXkgZGnhu4VuIHRo4buRbmcga8OqIGzDoCBwb3N0LWhvYyB0ZXN0IHRyb25nIHRoaeG6v3Qga+G6vyBBTk9WQSDEkcahbiBiaeG6v24gaGF5IHNvIHPDoW5oIGLhuq90IGPhurdwIGjDoG5nIGxv4bqhdCBuaGnhu4F1IHBow6JuIG5ow7NtLiANCg0KVHLGsOG7nW5nIGjhu6NwIHThu5VuZyBxdcOhdCwgdGEgY8OzIGsgcGjDom4gbmjDs20sIHThu6ljIGzDoCBrKGstMSkvMiBj4bq3cCBzbyBzw6FuaCBjw7MgdGjhu4MsIG3hu5dpIGPhurdwIHNvIHPDoW5oIG5oxrAgduG6rXkgdMawxqFuZyDhu6luZyB24bubaSBt4buZdCBnaeG6oyB0aHV54bq/dCB2w7QgaGnhu4d1IGPDsyBu4buZaSBkdW5nOiB0cnVuZyBiw6xuaCBwaMOibiBuaMOzbSBBID0gdHJ1bmcgYsOsbmggcGjDom4gbmjDs20gQg0KDQokJEhfMDpcbXVfQT1cbXVfQiQkDQoNCkhv4bq3YyBnaeG6oyB0aHV54bq/dCBj4bqnbiBjaOG7qW5nIG1pbmggbMOgOiANCg0KJCRIXzE6XG11X0FcbHRcbXVfQiQkDQoNClbhu5tpIMK1QSB2w6AgwrVCIHTGsMahbmcg4bupbmcgduG7m2kgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSAyIHBow6JuIG5ow7NtIHRyb25nIGPhurdwIHNvIHPDoW5oIA0KDQpUcm9uZyB0csaw4budbmcgaOG7o3AgdGhp4bq/dCBr4bq/IEFOT1ZBIGtow7RuZyBjw6JuIHjhu6luZywgY+G7oSBt4bqrdSBjw6FjIHBow6JuIG5ow7NtIGPDsyB0aOG7gyBraMO0bmcgxJHhu5NuZyBuaOG6pXQsIGRvIMSRw7MgdGEgxJHhurd0IHRow6ptIDEgdGhhbSBz4buRIG7hu69hIGzDoCBrYXBwYSBjaOG7iSB04buJIGzhu4cgZ2nhu69hIGPhu6EgbeG6q3UgMiBwaMOibiBuaMOzbSBBIHbDoCBCOg0KDQokJG5fQj1ca2FwcGEgbl9BJCQNCg0Kw4FwIGThu6VuZyBjw7RuZyB0aOG7qWMgdMOtbmggY+G7oSBt4bqrdSBjaG8gbeG7pWMgdGnDqnUgc28gc8OhbmggMiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPDsyBoaeG7h3UgY2jhu4luaCBjaG8gdmnhu4djIGLhuq90IGPhurdwIG5oaeG7gXUgbOG6p24sIHBfdmFsdWUgMSBiw6puIHThu6sgdMOgaSBsaeG7h3UgOiBDaG93IFMsIFNoYW8gSiwgV2FuZyBILiAyMDA4LiBTYW1wbGUgU2l6ZSBDYWxjdWxhdGlvbnMgaW4gQ2xpbmljYWwgUmVzZWFyY2guIDJuZCBFZC4gQ2hhcG1hbiAmIEhhbGwvQ1JDIEJpb3N0YXRpc3RpY3MgU2VyaWVzLCB0cmFuZyA1OSwgdGEgY8OzIA0KDQokJG5fQT1cbGVmdChcc2lnbWFfQV4yK1xzaWdtYV9CXjIvXGthcHBhXHJpZ2h0KVxsZWZ0KFxmcmFje3pfezEtXGFscGhhL1x0YXV9K3pfezEtXGJldGF9fXtcbXVfQS1cbXVfQn1ccmlnaHQpXjIkJA0KDQpUcm9uZyBjw7RuZyB0aOG7qWMgbsOgeToNCg0KMSkgU2lnbWEgQSxCIGzDoCDEkeG7mSBs4buHY2ggY2h14bqpbiBjaG8gdOG7q25nIHBow6JuIG5ow7NtIA0KDQoyKSBNdUEgdsOgIE11QiBs4bqnbiBsxrDhu6N0IGzDoCB0cnVuZyBiw6xuaCBMZXB0aW4g4bufIG5ow7NtIENo4bupbmcgdsOgIG5ow7NtIELhu4duaCBsw70gKE11QSDEkcaw4bujYyBwaMOhbiDEkW/DoW4gbMOgIG5o4buPIGjGoW4gbXVCKQ0KDQozKSBzYXUgbsOgeSBraGkgdmnhur90IGjDoG0gdGEgc+G6vSB0aOG6pXkgWiDEkcaw4bujYyB0w61uaCBi4bqxbmcgaMOgbSBxbm9ybSAoeMOhYyDEkeG7i25oIHBow6JuIHbhu4sgY+G7p2EgcGjDom4gYuG7kSBjaHXhuqluKQ0KDQo0KSBBbHBoYSBsw6Agc2FpIGzhuqdtIFR5cGUgSSAodGjGsOG7nW5nIMSRxrDhu6NjIOG6pW4gxJHhu4tuaCA9IDAuMDUpDQoNCjUpIEJldGEgbMOgIHNhaSBs4bqnbSBUeXBlIElJLCBsxrB1IMO9OiBQb3dlciA9IDEtIGJldGEsDQoNCjYpIFRhdSBsw6Agc+G7kSBj4bq3cCBzbyBzw6FuaCBj4bqnbiB0aOG7sWMgaGnhu4duLCBt4buZdCBow6xuaCB0aOG7qWMgaGnhu4d1IGNo4buJbmggY2hvIGdpw6EgdHLhu4sgYWxwaGENCg0KTmjGsCB24bqteSDEkeG7gyDGsOG7m2MgdMOtbmggY+G7oSBt4bqrdSBuQSA9IG5CLCB0YSBz4bq9IGdp4bqjaSBwaMawxqFuZyB0csOsbmggduG7m2kgbkEgbMOgIG5naGnhu4dtIHPhu5EsIGPDuW5nIGPDoWMgdGhhbSBz4buRIHNpZ21hLCBrYXBwYSwgYWxwaGEsIGJldGEgdsOgIHotc2NvcmUgbMOgIGdpw6EgdHLhu4sgY2h14bqpbiBow7NhIGtow6FjIGJp4buHdCBnaeG7r2EgbXVBIHbDoCBtdUIgLg0KDQpDaMO6bmcgdGEgdmnhur90IDEgaMOgbSB0cm9uZyBSIGPDsyBjw7RuZyBk4bulbmcgdMOtbmggY+G7oSBt4bqrdSBjaG8gbkEgdsOgIG5CDQoNCmBgYHtyLG1lc3NhZ2UgPSBGQUxTRSx3YXJuaW5nPUZBTFNFfQ0Kc2FtcGxlX2VzdGltZT1mdW5jdGlvbihtdUE9TlVMTCxzZEE9TlVMTCwNCiAgICAgICAgICAgICAgICAgICAgICAgbXVCPU5VTEwsc2RCPU5VTEwsDQogICAgICAgICAgICAgICAgICAgICAgIGthcHBhPTIsDQogICAgICAgICAgICAgICAgICAgICAgIHRhdT0zLA0KICAgICAgICAgICAgICAgICAgICAgICBhbHBoYT0wLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICBiZXRhPTAuMil7DQogIG5BPShzZEFeMitzZEJeMi9rYXBwYSkqKChxbm9ybSgxLWFscGhhL3RhdSkrcW5vcm0oMS1iZXRhKSkvKG11QS1tdUIpKV4yDQogIG5hPWNlaWxpbmcobkEpDQogIG5iPW5hL2thcHBhDQogIHJldHVybihyYmluZChuYSxuYikpDQp9DQpgYGANCg0KTmhpIGdp4bqjIMSR4buLbmggZ2nDoSB0cuG7iyBj4bunYSBjw6FjIHRoYW0gc+G7kSBNdUEgdsOgIE11Qiwgc2RBIHbDoCBzZEIgdMawxqFuZyDhu6luZyB24bubaSB0cnVuZyBiw6xuaCB2w6Agc2QgY+G7p2EgTGVwdGluIOG7nyBwaMOibiBuaMOzbSBuZ8aw4budaSBiw6xuaCB0aMaw4budbmcgdsOgIGLhu4duaCBuaMOibiBiw6lvIHBow6wgLCB0YSBjw7MgdGjhu4MgbOG6pXkgdGjDtG5nIHRpbiBuw6B5IHThu6sgeSB2xINuLCBn4buNaSBsw6AgcHJpb3IgaGF5IGdp4bqjIHRodXnhur90IHRp4buBbiDEkeG7i25oLg0KDQpHaeG6oyBz4butIG3hu5l0IGVtIHNpbmggdmnDqm4gdsOgbyBuxINtIDIwMTkgbMOgbSBt4buZdCBuZ2hpw6puIGPhu6l1IHTGsMahbmcgdOG7sSwgZW0gcGjhuqNpIHPhu60gZOG7pW5nIHRow7RuZyB0aW4gdOG7qyBsdeG6rW4gw6FuIGPhu6dhIFRTIEJTIFBoxrDGoW5nIGzDoG0gZ2nhuqMgdGh1eeG6v3QgdGnhu4FuIMSR4buLbmgga2hpIHTDrW5oIGPhu6EgbeG6q3UuDQoNClRyb25nIGx14bqtbiB2xINuIG7DoHksIEJzLiBQaMawxqFuZyDEkcOjIGLDoW8gY8OhbyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KMSkgTmjDs20gYsOsbmggdGjGsOG7nW5nOiBMZXB0aW4gPSA2Ljc1IMKxIDUuMTcgwrVML0wNCg0KMikgTmjDs20gdGjhu6thIGPDom46IExlcHRpbiA9IDkuNzQgwrEgNS43Ng0KDQozKSBOaMOzbSBiw6lvIHBow6w6IExlcHRpbiA9IDEwLjc0IMKxIDUuNjENCg0KVGEgdGhpIGjDoG5oIGjDoG0gdMOtbmggY+G7oSBt4bqrdSBjaG8gY+G6t3Agc28gc8Ohbmg7IELDrG5oIHRoxrDhu51uZyB2cyBCw6lvIHBow6wsIGdp4bqjIMSR4buLbmggY+G7oSBt4bqrdSDEkeG7k25nIG5o4bqldDoga2FwcGE9MQ0KDQpgYGB7cixtZXNzYWdlID0gRkFMU0Usd2FybmluZz1GQUxTRX0NCnNhbXBsZV9lc3RpbWUobXVBPTYuNzUsDQogICAgICAgICAgICAgIG11Qj0xMC43NCwNCiAgICAgICAgICAgICAga2FwcGE9MSwNCiAgICAgICAgICAgICAgc2RBPTUuMTcsDQogICAgICAgICAgICAgIHNkQj01LjYxLA0KICAgICAgICAgICAgICB0YXU9MywNCiAgICAgICAgICAgICAgYWxwaGE9MC4wNSwNCiAgICAgICAgICAgICAgYmV0YT0wLjIwKQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgbeG7l2kgbmjDs20gY+G6p24gY8OzIG49MzMgY2hvIGPhurdwIHNvIHPDoW5oIG7DoHkNCg0KVGEgbOG6oWkgdGjhu60gdHLDqm4gY+G6t3Agc28gc8OhbmggdGjhu6kgaGFpOiBCw6xuaCB0aMaw4budbmcgdnMgVGjhu6thIGPDom4gduG7m2kgdOG7iSBs4buHIGthcHBhPTINCg0KYGBge3IsbWVzc2FnZSA9IEZBTFNFLHdhcm5pbmc9RkFMU0V9DQpzYW1wbGVfZXN0aW1lKG11QT02Ljc1LA0KICAgICAgICAgICAgICBtdUI9OS43NCwNCiAgICAgICAgICAgICAga2FwcGE9MiwNCiAgICAgICAgICAgICAgc2RBPTUuMTcsDQogICAgICAgICAgICAgIHNkQj01Ljc2LA0KICAgICAgICAgICAgICB0YXU9MywNCiAgICAgICAgICAgICAgYWxwaGE9MC4wNSwNCiAgICAgICAgICAgICAgYmV0YT0wLjIwKQ0KYGBgDQoNCk5oxrAgduG6rXksIHRhIGPDsyB0aOG7gyBjaOG7jW4gbj00MyBu4bq/dSBt4bulYyB0acOqdSBsw6Agc28gc8OhbmggbmjDs20gY2jhu6luZyB24bubaSBj4bqjIDIgbmjDs20gY8OybiBs4bqhaS4NCg0KIyBNw7QgcGjhu49uZyBuaGnhu4F1IGdp4bqjIHRodXnhur90DQoNClF1eSB0csOsbmggdMOtbmggY+G7oSBt4bqrdSBraMO0bmcgZOG7q25nIOG7nyDEkcOzLiBEbyB0aMO0bmcgdGluIHbhu4EgdGhhbSBz4buRIHRhIMSRxrBhIHbDoG8gY8O0bmcgdGjhu6ljIGNo4buJIGzDoCBnaeG6oyDEkeG7i25oLCBuw6puIHRhIGtow7RuZyB0aOG7gyB04buxIHRo4buPYSBtw6NuIHF1w6EgZOG7hSBkw6BuZyB24bubaSBjaOG7iSAxIGdp4bqjIMSR4buLbmggZHV5IG5o4bqldC4gUXVhbiB0cuG7jW5nIG5o4bqldCBsw6AgcGjhuqNpIHTDrW5oIMSRxrDhu51uZyB0aG/DoXQgdGjDom4gc2F1IG7DoHksIGtoaSB0cm9uZyBxdcOhIHRyw6xuaCB0aOG7sWMgaGnhu4duIG5naGnDqm4gY+G7qXUgdsOsIGzDvSBkbyBraMOhY2ggcXVhbiB0YSBraMO0bmcgdGjhu4MgxJHhuqNtIGLhuqNvIMSR4bunIDYwIGLhu4duaCBuaMOibiBuaMawbmcgY2jhu4kgY8OzIDQwIGNo4bqzbmcgaOG6oW4sIGzDumMgbsOgeSB0YSBwaOG6o2kgcXVheSBuZ8aw4bujYyBs4bqhaSBiaeG7h24gbHXhuq1uIMSR4buDIGNo4bupbmcgbWluaCA0MCBsw6AgxJHhu6cuDQoNCkNoaSBi4bqxbmcgbmdheSB04burIGJhbiDEkeG6p3UgdGEgY2h14bqpbiBi4buLIGNobyB04bqldCBj4bqjIG3hu41pIGvhu4tjaCBi4bqjbiBjw7MgdGjhu4MgeOG6o3kgcmEgOiBjaMO6bmcgdGEgY+G6p24gbcO0IHBo4buPbmcgaMOgbmcgbG/huqF0IGdp4bqjIMSR4buLbmgsIHRow60gZOG7pToNCg0KMSkgVGEgY8OzIHRo4buDIGdp4bqjIMSR4buLbmg6IEdpw6EgdHLhu4sgTGVwdGluIHRydW5nIGLDrG5oIOG7nyBuaMOzbSBjaOG7qW5nIGdp4buvIG5ndXnDqm4sIG5oxrBuZyDhu58gbmjDs20gQsOpbyBwaMOsIGPDsyB0aOG7gyBkYW8gxJHhu5luZyB04burIDggxJHhur9uIDIwIMSRxqFuIHbhu4ssIGzDumMgxJHDsyBj4buhIG3huqt1IHPhur0gdGhheSDEkeG7lWkgcmEgc2FvID8NCg0KYGBge3IsbWVzc2FnZSA9IEZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0Kc2ltX2RmPWRhdGFfZnJhbWUoTXVCPXNlcSg4LDIwLDAuNSksbkE9cmVwKE5BLDI1KSkNCg0KZm9yIChpIGluICgxOmxlbmd0aChzaW1fZGYkTXVCKSkpew0KICBzYW1wbGVfZXN0aW1lKG11QT02Ljc1LA0KICAgICAgICAgICAgICAgIG11Qj1zaW1fZGYkTXVCW2ldLA0KICAgICAgICAgICAgICAgIGthcHBhPTEsDQogICAgICAgICAgICAgICAgc2RBPTUsDQogICAgICAgICAgICAgICAgc2RCPTUsDQogICAgICAgICAgICAgICAgdGF1PTMsDQogICAgICAgICAgICAgICAgYWxwaGE9MC4wNSwNCiAgICAgICAgICAgICAgICBiZXRhPTAuMjApLT5vdXQNCiAgc2ltX2RmJG5BW2ldPW91dFsxXQ0KfQ0KDQpnZ3Bsb3Qoc2ltX2RmLGFlcyh4PU11Qix5PW5BKSkrZ2VvbV9saW5lKCkrZ2VvbV9wb2ludChzaXplPTIsY29sPSJyZWQiKSt0aGVtZV9idygpDQoNCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIG7DoHksIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgTGVwdGluIHRyb25nIG5ow7NtIELDqW8gcGjDrCBjw6BuZyB0aOG6pXAgdGjDrCBj4buhIG3huqt1IGPhuqduIHRoaeG6v3QgY8OgbmcgY2FvLCB0aOG6rW0gY2jDrSBjw7MgdGjhu4MgaMahbiAxMDAsIHRo4bqtbSBjaMOtIDIwMCBu4bq/dSBNdUIgPCAxMC4gRMSpIG5oacOqbiDEkcOieSBjaOG7iSBsw6AgZ2nhuqMgxJHhu4tuaCwgbmjGsG5nIHRyb25nIHkgdsSDbiDEkcO6bmcgbMOgIGPDsyBuaOG7r25nIGLDoW8gY8OhbyBjaG8gdGjhuqV5IExlcHRpbiDhu58gbmfGsOG7nWkgYsOpbyBwaMOsIGRhbyDEkeG7mW5nIHRyb25nIGtob+G6o25nIG7DoHkuDQoNCjIpIFRyb25nIG3hu5l0IGvhu4tjaCBi4bqjbiBraMOhYzogR2nhuqMgc+G7rSBu4buTbmcgxJHhu5kgTGVwdGluIOG7nyBuZ8aw4budaSBiw6xuaCB0aMaw4budbmcgZGFvIMSR4buZbmcgdOG7qyA0LTcgxJHGoW4gduG7iywgdHJvbmcga2hpIMSRw7MgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBuw6B5IGRhbyDEkeG7mW5nIHThu6sgOC0yMCDEkcahbiB24buLIOG7nyBuZ8aw4budaSBiw6lvIHBow6wsIGPhu6EgbeG6q3Ugc+G6vSB0aGF5IMSR4buVaSByYSBzYW8gPw0KDQpgYGB7cixtZXNzYWdlID0gRkFMU0Usd2FybmluZz1GQUxTRX0NCk11QV9zaW09Yyg0LjUsNSw1LjUsNikNCg0Kc2ltX2RmPWRhdGFfZnJhbWUoTXVCPXJlcChzZXEoOCwyMCwwLjUpLDQpLG5BPXJlcChOQSwxMDApLE11QT1jKHJlcCg0LDI1KSxyZXAoNSwyNSkscmVwKDYsMjUpLHJlcCg3LDI1KSkpDQoNCmZvciAoaSBpbiAoMTpsZW5ndGgoc2ltX2RmJE11QikpKXsNCiAgc2FtcGxlX2VzdGltZShtdUE9c2ltX2RmJE11QVtpXSwNCiAgICAgICAgICAgICAgICBtdUI9c2ltX2RmJE11QltpXSwNCiAgICAgICAgICAgICAgICBrYXBwYT0xLA0KICAgICAgICAgICAgICAgIHNkQT01LA0KICAgICAgICAgICAgICAgIHNkQj01LA0KICAgICAgICAgICAgICAgIHRhdT0yLA0KICAgICAgICAgICAgICAgIGFscGhhPTAuMDUsDQogICAgICAgICAgICAgICAgYmV0YT0wLjIwKS0+b3V0DQogIHNpbV9kZiRuQVtpXT1vdXRbMV0NCn0NCg0Kc2ltX2RmJE11QT1mYWN0b3Ioc2ltX2RmJE11QSkNCg0KZ2dwbG90KHNpbV9kZixhZXMoeD1NdUIseT1uQSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbD1NdUEpKSsNCiAgZ2VvbV9wb2ludChzaXplPTIsYWVzKGNvbD1NdUEpKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCkvhur90IHF14bqjIG3DtCBwaOG7j25nIGNobyB0aOG6pXkgbuG6v3UgZ2nDoSB0cuG7iyBMZXB0aW4g4bufIG5ow7NtIGNo4bupbmcgY8OgbmcgY2FvIHRow6wgY+G7oSBt4bqrdSBjw6BuZyBjYW8sIG5oxrBuZyBu4bq/dSBnacOhIHRy4buLIExlcHRpbiDhu58gbmfGsOG7nWkgYsOpbyBwaMOsID4gMTAgxJHGoW4gduG7iyB0aMOsIGPhu6EgbeG6q3Uga2jDtG5nIHRo4buDIHbGsOG7o3QgcXXDoSA1MCwgYuG6pXQga+G7gyBnacOhIHRy4buLIG7DoG8gY+G7p2EgbmjDs20gY2jhu6luZyB0cm9uZyBraG/huqNuZyA0LTcgDQoNCjMpIEN14buRaSBjw7luZywgdGEgY8OzIHRo4buDIG3DtCBwaOG7j25nIGPhuqMg4bqjbmggaMaw4bufbmcgY+G7p2Egc+G7sSB0aGF5IMSR4buVaSBhbHBoYSB2w6AgYmV0YSAoaGF5IDEtYmV0YSkgbMOqbiBj4buhIG3huqt1LiBUaMOtIGThu6UgdGEgdMSDbmcgbmfGsOG7oW5nIGFscGhhIGzDqm4gY2FvIGThuqduLCB04burIDAuMDUgxJHhur9uIDAuMDEsIDAuMDA1IGhheSB0aOG6rW0gY2jDrSAwLjAwMDEgDQoNClZp4buHYyBtw7QgcGjhu49uZyBuw6B5IGPDsyB0aOG7gyBxdWFuIHRy4buNbmcsIG7hur91IHbDrCBz4buxIGjhuqFuIGNo4bq/IHbhu4EgdMOtbmgga2jhuqMgdGhpIG3DoCB0YSBideG7mWMgcGjhuqNpIGh5IHNpbmgga8OsIHbhu41uZyBiYW4gxJHhuqd1IGPhu6dhIG3DrG5oLCB0aMOtIGThu6UgUG93ZXIga2jDtG5nIHRo4buDIHThu5tpIDAuOCBuaMawbmcgY2jhu4kgbMOgIDAuNzUgPyBIb+G6t2MgdGEga8OsIHbhu41uZyBy4bqldCBjYW8gKFBvd2VyID0wLjksIGFscGhhPTAuMDEpdsOgIG114buRbiBraeG7g20gdHJhIMSRaeG7gXUgbsOgeSBjw7Mga2jhuqMgdGhpIGhheSBraMO0bmcgPw0KDQpgYGB7cixtZXNzYWdlID0gRkFMU0Usd2FybmluZz1GQUxTRX0NCnNpbV9kZj1kYXRhX2ZyYW1lKGFscGhhPXJlcChjKDAuMDAxLDAuMDA1LDAuMDEsMC4wNSksNSksDQogICAgICAgICAgICAgICAgICBiZXRhPXJlcChjKDAuMDUsMC4xLDAuMiwwLjI1LDAuMyksNCksDQogICAgICAgICAgICAgICAgICBuQT1yZXAoTkEsMjApKQ0KDQpmb3IgKGkgaW4gKDE6bGVuZ3RoKHNpbV9kZiRhbHBoYSkpKXsNCiAgc2FtcGxlX2VzdGltZShtdUE9Ni43NSwNCiAgICAgICAgICAgICAgICBtdUI9MTAuNzQsDQogICAgICAgICAgICAgICAga2FwcGE9MSwNCiAgICAgICAgICAgICAgICBzZEE9NS4xNywNCiAgICAgICAgICAgICAgICBzZEI9NS42MSwNCiAgICAgICAgICAgICAgICB0YXU9MywNCiAgICAgICAgICAgICAgICBhbHBoYT1zaW1fZGYkYWxwaGFbaV0sDQogICAgICAgICAgICAgICAgYmV0YT1zaW1fZGYkYmV0YVtpXSktPm91dA0KICBzaW1fZGYkbkFbaV09b3V0WzFdDQp9DQoNCmdncGxvdChzaW1fZGYsYWVzKHg9MS1iZXRhLHk9bkEpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2w9ZmFjdG9yKGFscGhhKSkpKw0KICBnZW9tX3BvaW50KHNpemU9MixhZXMoY29sPWZhY3RvcihhbHBoYSkpKSsNCiAgdGhlbWVfYncoKQ0KDQpgYGANCg0KS+G6v3QgcXXhuqMgbcO0IHBo4buPbmcgY2hvIHRo4bqleSBhbHBoYSBjw6BuZyB0aOG6pXAgdsOgL2hv4bq3YyAxLWJldGEgY8OgbmcgY2FvIHRow6wgY+G7oSBt4bqrdSB5w6p1IGPhuqd1IGPDoG5nIGzhu5tuLiBUdXkgbmhpw6puIG7hur91IHRhIGjDoGkgbMOybmcgduG7m2kgUG93ZXIgPSAwLjggdGjDrCB0aOG6rW0gY2jDrSB0xINuZyBuZ8aw4buhbmcgYWxwaGEgbMOqbiAwLjAwMSBjxaluZyBraMO0bmcgxJHGsGEgxJHhur9uIG3hu5l0IGPhu6EgbeG6q3UgYuG6pXQga2jhuqMgdGhpLg0KDQojIERp4buFbiDEkeG6oXQNCg0KUXV5IHRyw6xuaCB0w61uaCB0b8OhbiwgbcO0IHBo4buPbmcgbsOqdSB0csOqbiBjw7MgdGjhu4MgxJHGsOG7o2MgZGnhu4VuIMSR4bqhdCB0cm9uZyB2xINuIGLhuqNuIG5oxrAgc2F1Og0KDQoxKSBDxqEgc+G7nyA6IERvIG3hu6VjIHRpw6p1IGNow61uaCBj4bunYSBuZ2hpw6puIGPhu6l1IGzDoCBraOG6o28gc8OhdCBz4buxIGtow6FjIGJp4buHdCBj4bunYSBMZXB0aW4gZ2nhu69hIDMgcGjDom4gbmjDs206IELDrG5oIHRoxrDhu51uZy9UaOG7q2EgY8OibiB2w6AgQsOpbyBwaMOsLCB2aeG7h2MgxrDhu5tjIHTDrW5oIGPhu6EgbeG6q3UgZOG7sWEgdHLDqm4gY8ahIHPhu58gxJHhuqNtIGLhuqNvIHThu5FpIMawdSBz4bupYyBt4bqhbmggdGjhu5FuZyBrw6ogY+G7p2EgcGjDqXAgc28gc8OhbmggbOG6t3AgbOG6oWkgdHLDqm4gMyBj4bq3cCBzbyBzw6FuaCB24bubaSBnaeG6oyB0aHV54bq/dCB2w7QgaGnhu4d1IGzDoCB0cnVuZyBiw6xuaCBMZXB0aW4gbmjGsCBuaGF1LiANCg0KMikgQ8OhY2ggdGjhu6ljOiBDaMO6bmcgdMO0aSBz4butIGThu6VuZyBjw7RuZyB0aOG7qWMgxrDhu5tjIHTDrW5oIGPhu6EgbeG6q3U6DQoNCiQkbl9BPVxsZWZ0KFxzaWdtYV9BXjIrXHNpZ21hX0JeMi9ca2FwcGFccmlnaHQpXGxlZnQoXGZyYWN7el97MS1cYWxwaGEvXHRhdX0rel97MS1cYmV0YX19e1xtdV9BLVxtdV9CfVxyaWdodCleMiQkDQoNClRyb25nIMSRw7MgbkEgbMOgIGPhu6EgbeG6q3UgY+G7p2EgbmjDs20gY2jhu6luZyB0cm9uZyBj4bq3cCBzbyBzw6FuaCBBL0IsIMK1QSxzaWdtYUEgdsOgIMK1QiAsc2lnbWFCIGzhuqduIGzGsOG7o3QgbMOgIHRydW5nIGLDrG5oIHbDoCDEkeG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBu4buTbmcgxJHhu5kgTGVwdGluLCBaIGzDoCB0cuG7iyBz4buRIHRo4buRbmcga8OqIGNodeG6qW4gaMOzYSDEkcaw4bujYyB0w61uaCB0aGVvIGPDtG5nIHRo4bupYzogDQoNCihxbm9ybSgxLWFscGhhL3RhdSkrcW5vcm0oMS1iZXRhKQ0KDQpUaGFtIHPhu5EgYWxwaGEgdMawxqFuZyDhu6luZyB24bubaSBzYWkgbOG6p20gVHlwZSBJLCBCZXRhIGzDoCBzYWkgbOG6p20gVHlwZSBJSSB2w6Agc+G7qWMgbeG6oW5oIHRo4buRbmcga8OqIFBvd2VyID0xLWJldGEuDQoNCjMpIEThu7FhIHRoZW8gdGjDtG5nIHRpbiB04burIG5naGnDqm4gY+G7qXUgY+G7p2EgVsO1IE1pbmggUGjGsMahbmcgdsOgIGNzLiwgY2jDum5nIHTDtGkgdGjhu7FjIGhp4buHbiBt4buZdCBz4buRIG3DtCBwaOG7j25nLCBzYXUgxJHDsyDEkeG7kWkgY2hp4bq/dSB24bubaSBxdeG7uSB0aOG7nWkgZ2lhbiB2w6Agbmd14buTbiBs4buxYyBj4bunYSBk4buxIMOhbiwgdsOgIMSRaSDEkeG6v24ga+G6v3QgbHXhuq1uOg0KDQpOaMOzbSBjaOG7qW5nIGPhuqduIDUwIGPDoSB0aOG7gywgMiBwaMOibiBuaMOzbSBUaOG7q2EgY8OibiB2w6AgQsOpbyBwaMOsIGPhuqduIMOtdCBuaOG6pXQgMzAgYuG7h25oIG5ow6JuIMSR4buDIMSR4bqjbSBi4bqjbyBwaMOhdCBoaeG7h24gxJHGsOG7o2Mga2jDoWMgYmnhu4d0IGdp4buvYSBi4buHbmggbmjDom4gdsOgIG5ow7NtIGNo4bupbmcgduG7m2kgc+G7qWMgbeG6oW5oIHRo4buRbmcga8OqIDgwJSB2w6Agbmd1eSBjxqEgc2FpIGzhuqdtIFR5cGUgSTwgMC4wNS4NCg0KIyBOaOG6rW4geMOpdA0KDQpRdXkgdHLDrG5oIHjDoWMgxJHhu4tuaCBj4buhIG3huqt1IHRyb25nIMSR4buBIGPGsMahbmcvbHXhuq1uIHbEg24gY+G6p24gxJHGsOG7o2MgdHLDrG5oIGLDoHkgbeG7mXQgY8OhY2ggaOG7o3AgbMO9IGjGoW4gduG7m2kgbmjhu69uZyBu4buZaSBkdW5nIG5oxrAgc2F1Og0KDQoxKSBOw6puIGThu7FhIHRyw6puIGPGoSBz4bufIG3hu5l0IGPDonUgaOG7j2kgbmdoacOqbiBj4bupdSBj4bulIHRo4buDLCB04burIMSRw7MgcGjDoXQgYmnhu4N1IGdp4bqjIHRodXnhur90IHbDtCBoaeG7h3UgKHNvIHPDoW5oIGjGoW4va8OpbS90xrDGoW5nIMSRxrDGoW5nKSwgdsOgIGThuqtuIMSR4bq/biBt4buZdCBjw7RuZyB0aOG7qWMgdMOtbmggdG/DoW4gcsO1IG5naMSpYS4NCg0KMikgR2nDoSB0cuG7iyBj4bunYSBjw6FjIHRoYW0gc+G7kSBj4bqnbiDEkcaw4bujYyBiaeG7h24gbHXhuq1uIHPhu60gZOG7pW5nIHRow7RuZyB0aW4gdOG7qyB5IHbEg24sIGdp4bqjIHRodXnhur90IHRp4buBbiDEkeG7i25oLCBuZ2hpw6puIGPhu6l1IHBpbG90IGhv4bq3YyBr4bq/dCBxdeG6oyBtw7QgcGjhu49uZy4NCg0KMykgS2jDtG5nIGNo4buJIHRyw6xuaCBiw6B5IG3hu5l0IGdpw6EgdHLhu4sgZHV5IG5o4bqldCwgbmjGsG5nIG7Dqm4gY8OzIG3hu5l0IGhheSBuaGnhu4F1IGvhur90IHF14bqjIG3DtCBwaOG7j25nIGNobyBjw6FjIGvhu4tjaCBi4bqjbiBraMOhYyBuaGF1LCBiYW8gZ+G7k20ga2jhuqMgbsSDbmcgZGFvIMSR4buZbmcgbmfhuqt1IG5oacOqbiBj4bunYSBjw6FjIHRoYW0gc+G7kSwgdOG7iSBs4buHIG3huqV0IG3DoXQgZOG7ryBsaeG7h3UuDQoNCjQpIEN14buRaSBjw7luZywga+G6v3QgcXXhuqMgbcO0IHBo4buPbmcgdsOgIGdp4bqjIMSR4buLbmggc+G6vSDEkcaw4bujYyBraeG7g20gdHJhIHbhu4EgdMOtbmgga2jhuqMgdGhpLCBuaMawIHRo4budaSBnaWFuLCBraW5oIHBow60sIG5ow6JuIGzhu7FjIHbDoCBwaMawxqFuZyB0aeG7h24uLi4gdOG7qyDEkcOzIHF1eeG6v3QgxJHhu4tuaCBt4buZdCBjb24gc+G7kSBj4buhIG3huqt1IHThu5FpIMawdSBjw6JuIGLhurFuZyBnaeG7r2Ega8OsIHbhu41uZyB2w6AgdMOtbmgga2jhuqMgdGhpLg0K