1 PHẦN 1: TÓM TẮT SÁCH

1.1 Giới thiệu chung về sách

Cuốn sách Generalized Linear Models With Examples in R do Peter K. Dunn và Gordon K. Smyth đồng tác giả là một tài liệu giảng dạy và tham khảo toàn diện về các mô hình thống kê, tập trung đặc biệt vào mô hình hồi quy tuyến tính và mô hình tuyến tính tổng quát (GLMs). Với cách tiếp cận thực tiễn, cuốn sách kết hợp hài hòa giữa lý thuyết thống kê, các phương pháp suy luận hiện đại, và minh họa bằng dữ liệu thực tế cùng các ứng dụng trong phần mềm R. Với triết lý “Tất cả các mô hình đều sai, nhưng một số mô hình có ích”, cuốn sách không chỉ cung cấp kiến thức thống kê kỹ thuật, mà còn định hướng người học phát triển năng lực tư duy phản biện và đánh giá mô hình một cách thực tế và linh hoạt.

1.2 Mục tiêu và đối tượng của sách

Mục tiêu chính của sách là giúp người học phát triển tư duy mô hình hóa thống kê: từ việc hiểu cấu trúc và vai trò của mô hình, cách diễn giải các hệ số mô hình, đến việc kiểm tra giả định, chẩn đoán mô hình, lựa chọn mô hình phù hợp và đánh giá hiệu suất. Cuốn sách được trình bày theo lối dẫn dắt trực quan, thường xuyên sử dụng các biểu đồ minh họa và bài toán thực hành để khuyến khích người học tương tác với dữ liệu.

Bắt đầu từ những nền tảng cơ bản như trực quan hóa dữ liệu, mô hình hồi quy đơn giản, cho đến các chủ đề nâng cao như lý thuyết tiệm cận, mô hình phân tán hàm mũ, và ứng dụng GLMs cho dữ liệu nhị phân, dữ liệu đếm và dữ liệu liên tục dương, sách cung cấp một lộ trình học tập đầy đủ và mạch lạc.Ngoài ra, một điểm nổi bật của tài liệu là việc chú trọng đến việc chẩn đoán mô hình – một kỹ năng thiết yếu nhưng thường bị xem nhẹ – thông qua việc phân tích phần dư, khoảng cách Cook, biểu đồ Q-Q và nhiều công cụ đánh giá khác.

Cuốn sách đặc biệt phù hợp cho sinh viên và học viên các ngành kinh tế, y sinh, khoa học xã hội, kỹ thuật; các nhà phân tích dữ liệu, nhà nghiên cứu hoặc giảng viên cần một tài liệu bài bản và có chiều sâu và những người sử dụng R như một công cụ chính để xử lý và mô hình hóa dữ liệu.


1.3 Nội dung chính

1.3.1 Giới thiệu về mô hình thống kê

1.3.1.1 Tóm tắt lý thuyết

Chương đầu tiên đóng vai trò định hướng cho toàn bộ nội dung của môn học và cung cấp nền tảng tri thức về cách hiểu và xử lý dữ liệu trong bối cảnh thống kê hiện đại. Thông qua việc giới thiệu khái niệm mô hình hồi quy, chương này không chỉ xây dựng kiến thức căn bản mà còn làm rõ tư duy thống kê cần thiết khi phân tích dữ liệu thực tế. Người đọc được dẫn dắt vào cách tiếp cận thực hành, nơi dữ liệu luôn phức tạp và không tuân theo các giả định lý tưởng. Do đó, chương 1 đặt nền móng về triết lý mô hình hóa, tầm quan trọng của mục tiêu phân tích, cũng như sự đánh đổi giữa tính chính xác và tính đơn giản trong việc xây dựng mô hình.

Chương này bao gồm các nội dung trọng tâm sau:

Giới thiệu về mô hình hồi quy

  • Mô hình hồi quy định lượng mối quan hệ giữa biến phụ thuộc và các biến độc lập.
  • Cho phép dự đoán kết quả và đánh giá ảnh hưởng của các yếu tố giải thích.
  • Việc xây dựng mô hình cần gắn với hiểu biết thực tiễn và bối cảnh cụ thể, không chỉ là bài toán toán học.

Diễn giải mô hình

  • Mục tiêu không chỉ là dự đoán mà còn là diễn giải ý nghĩa của các hệ số hồi quy.
  • Cảnh báo: không thể suy luận quan hệ nhân quả từ nghiên cứu quan sát nếu thiếu kiểm soát.
  • Dẫn chứng câu nói của George Box:
    > “Tất cả các mô hình đều sai, nhưng một số mô hình hữu ích.”

Mục tiêu phân tích định hình mô hình

  • Mô hình giải thích cần rõ ràng, dễ hiểu.
  • Mô hình dự báo tập trung vào độ chính xác.
  • Việc xác định mục tiêu giúp lựa chọn đúng cấu trúc mô hình và tiêu chí đánh giá.

Cân bằng giữa độ chính xác và tính tiết kiệm

  • Mô hình phức tạp dễ overfit – khớp tốt với dữ liệu huấn luyện nhưng kém tổng quát hóa.
  • Mô hình đơn giản thường ổn định hơn và dễ triển khai trong thực tiễn.
  • Cần tìm điểm cân bằng hợp lý giữa độ chính xác và khả năng áp dụng.

Thực nghiệm và quan sát

  • Nghiên cứu thực nghiệm:

    • Có kiểm soát và phân bổ ngẫu nhiên.
    • Cho phép suy luận nhân quả.
  • Nghiên cứu quan sát:

    • Dữ liệu được thu thập thụ động, không kiểm soát biến.
    • Chỉ cho thấy mối liên hệ, không chứng minh được nhân quả.

1.3.1.2 Ứng dụng trong R

Chương 1 giới thiệu dữ liệu ví dụ lungcap và các khái niệm thống kê cơ bản. Đồng thời, chương hướng dẫn sử dụng R để khám phá dữ liệu ban đầu với các thao tác như:

  • Tải dữ liệu bằng library(GLMsData)data(lungcap).
  • Kiểm tra tên biến (names()), cấu trúc và mã hóa biến yếu tố (head(), contrasts()).
  • Tính các thống kê mô tả như độ dài, tổng, trung bình, trung vị, độ lệch chuẩn, phương sai (length(), sum(), mean(), median(), sd(), var()).
  • Vẽ biểu đồ phân tán và tùy chỉnh đồ họa với plot(), ifelse(), pch, legend.

Chương sử dụng rộng rãi các hàm cơ bản của R trong môi trường base R, kết hợp với gói GLMsData để tải dữ liệu, nhằm hỗ trợ người đọc làm quen với thao tác phân tích dữ liệu ban đầu.

1.3.2 Mô hình hồi quy tuyến tính

1.3.2.1 Tóm tắt lý thuyết

Chương này mở đầu bằng việc giới thiệu mô hình hồi quy tuyến tính như một công cụ để mô tả mối quan hệ giữa một biến phụ thuộc (biến phản hồi) và một hoặc nhiều biến độc lập (biến giải thích). Ý tưởng cốt lõi là mô hình hóa giá trị trung bình của biến phản hồi dưới dạng một tổ hợp tuyến tính của các biến giải thích. Sai số (sự khác biệt giữa quan sát và giá trị dự báo) được giả định là ngẫu nhiên, có phân phối chuẩn và phương sai không đổi.

Nội dung chính của chương bao gồm:

Hồi quy tuyến tính đơn giản

Mô hình hồi quy tuyến tính đơn giản mô tả mối quan hệ giữa một biến phụ thuộc \(Y\) và một biến độc lập \(X\):

\[ Y_i = \beta_0 + \beta_1 X_i + \varepsilon_i \]

Trong đó:

  • \(\beta_0\): hệ số chặn (intercept)
  • \(\beta_1\): hệ số góc (slope)
  • \(\varepsilon_i\): sai số ngẫu nhiên

Các hệ số được ước lượng bằng phương pháp bình phương tối thiểu (OLS) nhằm tối thiểu hóa:

\[ \sum_{i=1}^n (Y_i - \hat{Y}_i)^2 \]

Hồi quy tuyến tính đa biến

Khi có nhiều biến giải thích, mô hình được mở rộng và biểu diễn dưới dạng ma trận:

\[ \mathbf{Y} = \mathbf{X} \boldsymbol{\beta} + \boldsymbol{\varepsilon} \]

Trong đó:

  • \(\mathbf{Y}\): vector phản hồi (\(n \times 1\))
  • \(\mathbf{X}\): ma trận thiết kế (\(n \times p\))
  • \(\boldsymbol{\beta}\): vector hệ số (\(p \times 1\))
  • \(\boldsymbol{\varepsilon}\): vector sai số

Công thức ước lượng hệ số hồi quy:

\[ \hat{\boldsymbol{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{Y} \]

Ước lượng sai số và đánh giá mô hình

Một số đại lượng thống kê quan trọng:

  • Ước lượng phương sai sai số:
    \[ \hat{\sigma}^2 = \frac{1}{n - p} \sum (Y_i - \hat{Y}_i)^2 \]
  • Sai số chuẩn của hệ số
  • Khoảng tin cậy và kiểm định giả thuyết

Phân tích phương sai (ANOVA)

Phân tích phương sai giúp đánh giá mô hình:

  • Tổng phương sai:
    \[ SST = SSR + SSE \]
  • Tỷ số kiểm định F:
    \[ F = \frac{SSR / (p - 1)}{SSE / (n - p)} \]

Mục tiêu là kiểm định xem mô hình có giải thích được phương sai tốt hơn mô hình không biến hay không.

So sánh mô hình và các nguyên tắc

  • Mô hình lồng nhau: So sánh mô hình đơn giản với mô hình mở rộng

  • ANOVA tuần tự: Xác định xem việc thêm biến có cải thiện đáng kể hay không

  • Nguyên tắc xây dựng mô hình hợp lý:

    • Hồi quy song song (parallel regressions)
    • Nguyên tắc độc lập
    • Nguyên tắc biên (marginal principle)

1.3.2.2 Ứng dụng trong R

Chương 2 giới thiệu cách sử dụng phần mềm R để xây dựng và phân tích mô hình hồi quy tuyến tính.

  • Hàm lm() dùng để ước lượng mô hình.
  • Hàm summary() hiển thị hệ số hồi quy, sai số chuẩn, \(R^2\) và các thống kê quan trọng.
  • Sử dụng hàm anova() thực hiện phân tích phương sai, kiểm tra sự cải thiện khi thêm biến giải thích.
  • Các hàm resid(), rstandard() lấy phần dư và phần dư chuẩn hóa.
  • Các đồ thị như plot(), qqnorm(), qqline() giúp đánh giá giả định mô hình và phát hiện điểm ngoại lệ.
  • Hàm AIC() tính tiêu chí Akaike để so sánh mô hình dựa trên độ phức tạp và độ phù hợp.
  • Hàm step() hỗ trợ chọn biến tự động dựa trên tiêu chí AIC.

1.3.3 Chẩn đoán và xây dựng mô hình tuyến tính

1.3.3.1 Tóm tắt lý thuyết

Chương 3 mở rộng kiến thức về mô hình hồi quy tuyến tính bằng cách tập trung vào công tác chẩn đoán mô hình, đánh giá mức độ phù hợp của mô hình với dữ liệu và xác định các vấn đề có thể ảnh hưởng đến độ chính xác hoặc ý nghĩa thống kê. Các công cụ phân tích phần dư, leverage, và biểu đồ chẩn đoán giúp xác định các điểm bất thường, sự vi phạm giả định và đưa ra giải pháp điều chỉnh. Ngoài ra, chương cũng trình bày các ứng dụng thực tế để minh họa rõ cách sử dụng mô hình hồi quy trong các tình huống cụ thể.

Nội dung chính bao gồm:

Thang đo dữ liệu: Tác động của kiểu thang đo (tỷ lệ, thứ bậc, danh mục) tới việc xây dựng và giải thích mô hình.

Phép xấp xỉ trong mô hình hóa: Các đơn giản hóa có chủ đích trong thống kê và nguy cơ sai lệch.

Leverage: Đại lượng đo lường mức độ ảnh hưởng của điểm quan sát tới giá trị dự báo, cùng với công thức đại số ma trận. Công thức ma trận để tính leverage:

\[ h_i = \mathbf{x}_i^\top (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{x}_i \]

Giá trị leverage cao cảnh báo điểm ngoại lai tiềm năng.

Phần dư và biểu đồ chẩn đoán:

  • Phần dư so với biến giải thích.
  • Partial residual plots.
  • Phần dư chuẩn hóa so với giá trị dự báo.
  • Biểu đồ Q–Q để kiểm tra phân phối chuẩn của phần dư.
  • Biểu đồ Lag với dữ liệu chuỗi thời gian.

Phân biệt phần dư

Phần dư chuẩn hóaphần dư student hóa khác nhau ở cách điều chỉnh phương sai. Tránh nhầm lẫn để đưa ra đánh giá chính xác hơn về quan sát bất thường.

Biện pháp khắc phục khi vi phạm giả định Các phương pháp thường dùng bao gồm:

  • Biến đổi biến: (log, căn bậc hai, v.v.)
  • Thêm biến mới: để giảm phần dư có hệ thống
  • Chọn mô hình thay thế: phù hợp hơn (ví dụ: mô hình phi tuyến).

1.3.3.2 Ứng dụng trên phần mềm R

Chương sử dụng phần mềm R để minh họa các kỹ thuật chẩn đoán và xây dựng mô hình hồi quy tuyến tính như sau:

  • Các hàm R tiêu chuẩn:

    • lm() để ước lượng mô hình hồi quy.
    • summary() để xem kết quả ước lượng chi tiết.
    • anova() thực hiện phân tích phương sai và so sánh mô hình lồng nhau.
    • Các hàm phân tích phần dư và chẩn đoán: rstandard(), cooks.distance(), covratio(), dffits(), dfbetas().
    • Vẽ biểu đồ Q-Q với qqnorm()qqline().
    • cor() để tính ma trận tương quan.
    • Đồ họa cơ bản: plot(), interaction.plot().
    • Sử dụng các hàm extractAIC(), drop1(), add1(), step() để chọn mô hình dựa trên AIC và BIC.
    • Phần về Regression Splines yêu cầu cài đặt gói splines.
    • Sử dụng các hàm như poly(), ns(), bs() để tạo cơ sở spline, giúp mô hình hóa quan hệ phi tuyến.

1.3.4 Phương pháp hợp lý cực đại

1.3.4.1 Tóm tắt lý thuyết

Chương 4 tập trung giới thiệu và phân tích phương pháp ước lượng khả năng lớn nhất (Maximum Likelihood Estimation - MLE) trong khuôn khổ Mô hình Hồi quy Tổng quát (Generalized Linear Models - GLMs).

Các nội dung chính bao gồm:

Tổng quan về MLE:

MLE tìm bộ tham số \(\boldsymbol{\beta}\) sao cho hàm khả năng \(L(\boldsymbol{\beta}) = P(\text{dữ liệu} \mid \boldsymbol{\beta})\) đạt cực đại.
Công thức:
\[ \hat{\boldsymbol{\beta}} = \arg \max_{\boldsymbol{\beta}} L(\boldsymbol{\beta}) = \arg \max_{\boldsymbol{\beta}} \prod_{i=1}^n f(y_i \mid \boldsymbol{\beta}) \] hoặc trong thực tế thường dùng log-likelihood:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \log f(y_i \mid \boldsymbol{\beta}) \]

Tính chất của ước lượng MLE:

  • Tính nhất quán: \(\hat{\boldsymbol{\beta}} \xrightarrow{p} \boldsymbol{\beta}_0\) khi \(n \to \infty\).
  • Phân phối tiệm cận chuẩn:
    \[ \sqrt{n}(\hat{\boldsymbol{\beta}} - \boldsymbol{\beta}_0) \xrightarrow{d} \mathcal{N}(0, I^{-1}(\boldsymbol{\beta}_0)) \]
    với \(I(\boldsymbol{\beta}_0)\) là ma trận thông tin Fisher.
  • Tính hiệu quả: MLE đạt phương sai nhỏ nhất trong lớp các ước lượng không chệch.

Mở rộng sang đa tham số:
Với mô hình có nhiều biến giải thích, ta tối ưu hàm khả năng đa biến theo \(\boldsymbol{\beta} = (\beta_1, \beta_2, \ldots, \beta_p)\).

Kiểm định giả thuyết dựa trên MLE:

  • Kiểm định toàn cục:
    \[ H_0: \boldsymbol{\beta} = \mathbf{0} \quad \text{vs} \quad H_a: \text{ít nhất một } \beta_j \neq 0 \]
  • Kiểm định Wald:
    \[ W = (\hat{\beta}_j / \text{SE}(\hat{\beta}_j))^2 \sim \chi^2_1 \]
  • Kiểm định likelihood ratio (LR):
    \[ LR = 2[\ell(\hat{\boldsymbol{\beta}}) - \ell(\hat{\boldsymbol{\beta}}_0)] \sim \chi^2_q \] với \(q\) là số tham số bị loại bỏ dưới \(H_0\).

Xây dựng khoảng tin cậy:
Khoảng tin cậy cho \(\beta_j\) thường dựa trên phân phối chuẩn tiệm cận:
\[ \hat{\beta}_j \pm z_{\alpha/2} \cdot \text{SE}(\hat{\beta}_j) \]

Tiêu chí lựa chọn mô hình:

  • Akaike Information Criterion (AIC):
    \[ \text{AIC} = -2\ell(\hat{\boldsymbol{\beta}}) + 2k \] với \(k\) là số tham số mô hình.
  • Bayesian Information Criterion (BIC):
    \[ \text{BIC} = -2\ell(\hat{\boldsymbol{\beta}}) + k \log n \] trong đó \(n\) là kích thước mẫu.

Chương 4 là nền tảng lý thuyết quan trọng, mở rộng từ hồi quy tuyến tính sang các mô hình phức tạp hơn thông qua MLE.

1.3.4.2 Ứng dụng trên phần mềm R

Mặc dù Chương 4 không trình bày chi tiết mã R hay các gói R, việc ứng dụng các kỹ thuật và mô hình trong chương này được thực hiện phổ biến trong R thông qua:

  • Hàm glm() trong base R: Đây là hàm chính để ước lượng các Mô hình Hồi quy Tổng quát (GLMs), bao gồm các mô hình sử dụng phương pháp MLE. Không cần cài thêm gói ngoài khi sử dụng các mô hình GLM cơ bản.

  • Các gói R bổ trợ cho GLMs nâng cao: Ví dụ, trong các chương sau (như Chương 9, Chương 10), gói MASS được dùng để phân tích các mô hình GLM cụ thể như GLM Nhị thức (binomial) và GLM Nhị thức âm (negative binomial) với hàm glm.nb() và các công cụ hỗ trợ như dose.p().

Tóm lại, Chương 4 đóng vai trò giới thiệu cơ sở lý thuyết của phương pháp MLE trong GLMs, còn việc thực hành và triển khai các mô hình dựa trên MLE trong R được thể hiện trong các chương tiếp theo với hàm glm() và các gói chuyên dụng.

1.3.5 Mô hình tuyến tính tổng quát (GLMs): Cấu trúc

1.3.5.1 Tóm tắt lý thuyết

Chương 5 tập trung giới thiệu các Mô hình Phân tán Theo Hàm Mũ (Exponential Dispersion Models - EDMs), nền tảng lý thuyết quan trọng cho Mô hình Tuyến tính Tổng quát (Generalized Linear Models - GLMs).

Nội dung chính của chương bao gồm

Định nghĩa các phân phối EDM (Exponential Dispersion Models):
Chương mô tả các phân phối phổ biến như Chuẩn, Nhị thức, Nhị thức Âm, Poisson, Gamma, Inverse Gaussian, Tweedie. Mỗi phân phối được đặc trưng bởi các thành phần quan trọng sau:

  • Hàm phương sai \(V(\mu)\)
  • Hàm tích lũy \(\kappa(\theta)\)
  • Tham số chính tắc \(\theta\)
  • Tham số phân tán \(\phi\)
  • Độ lệch đơn vị \(d(y, \mu)\)

Độ lệch (Deviance):
Là thước đo dùng để đánh giá mức độ phù hợp của mô hình với dữ liệu quan sát, điều chỉnh theo đặc điểm từng phân phối trong GLMs.

Độ lệch đơn vị (Unit Deviance):
Đo sự khác biệt giữa giá trị quan sát \(y\) và giá trị dự báo \(\mu\), với công thức chung tùy thuộc phân phối. Ví dụ, trong phân phối Gamma, độ lệch có dạng:
\[ d(y, \mu) = 2 \left( \frac{y - \mu}{\mu} - \log\frac{y}{\mu} \right) \]

Ước lượng xấp xỉ Saddlepoint:
Kỹ thuật toán học được sử dụng để xấp xỉ phân phối của các thống kê phức tạp trong GLMs, giúp nâng cao độ chính xác của kiểm định và ước lượng.

Thành phần hệ thống trong GLMs:

  • Phần tuyến tính (Linear predictor):
    \[ \eta = \mathbf{X}\boldsymbol{\beta} \]
    là tổ hợp tuyến tính của các biến giải thích.
  • Hàm liên kết (Link function):
    Chuyển đổi giá trị trung bình của biến phản hồi \(\mu = E(Y)\) sang không gian tuyến tính:
    \[ g(\mu) = \eta \]
    Ví dụ: hàm logit cho biến nhị phân, hàm log cho biến đếm.

Offset:
Biến giải thích đặc biệt có hệ số cố định bằng 1, dùng để điều chỉnh mô hình cho các biến quy mô hoặc thời gian mà không làm tăng số tham số cần ước lượng.

1.3.5.2 Ứng dụng trong R

Mặc dù Chương 5 chủ yếu trình bày lý thuyết nền tảng, việc ứng dụng các mô hình EDM cho GLMs trong thực tế được thực hiện qua các công cụ và gói R như sau:

  • Hàm glm() trong base R: Là công cụ chính để fit các mô hình GLM với nhiều phân phối khác nhau được giới thiệu trong chương, thông qua đối số family. Hàm này không yêu cầu cài đặt thêm gói bên ngoài.

  • Các gói R bổ sung: Để mở rộng khả năng phân tích, một số gói được sử dụng trong các chương sau:

    • MASS: Dùng cho GLM nhị thức (ví dụ Chương 9) với hàm dose.p() để tính ED50, và cho GLM nhị thức âm (Chương 10) với hàm glm.nb().
    • statmod: Hỗ trợ fit GLM Tweedie (Chương 12) bằng cách sử dụng family = tweedie() trong glm().

Tóm lại, lý thuyết từ Chương 5 là nền tảng quan trọng, còn việc thực thi các mô hình GLM dựa trên EDM được triển khai hiệu quả nhờ các hàm và gói R đã được chuẩn bị sẵn.

1.3.6 Mô hình tuyến tính tổng quát (GLMs): Ước lượng

1.3.6.1 Tóm tắt lý thuyết

Chương 6 tập trung vào quá trình ước lượng các tham số trong mô hình tuyến tính tổng quát (GLMs), đặc biệt là hệ số hồi quy \(\beta\) và tham số phân tán \(\phi\).

Nội dung chính của chương bao gồm:

Ước lượng hệ số hồi quy \(\boldsymbol{\beta}\):

Quá trình ước lượng \(\boldsymbol{\beta}\) được trình bày dưới dạng công thức ma trận, tương tự như hồi quy tuyến tính thông thường, qua đó thể hiện sự tương đồng trong các bước ước lượng cục bộ.
Công thức ước lượng \(\boldsymbol{\beta}\) thường được biểu diễn là:
\[ \hat{\boldsymbol{\beta}} = (\mathbf{X}^\top \mathbf{W} \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{W} \mathbf{z} \]
trong đó \(\mathbf{W}\) là ma trận trọng số và \(\mathbf{z}\) là biến phụ thuộc giả lập trong thuật toán IRLS (Iteratively Reweighted Least Squares).

Ước lượng tham số phân tán \(\phi\):

Tham số phân tán \(\phi\) có vai trò quan trọng trong việc đánh giá độ chính xác của mô hình và các kiểm định giả thuyết.
Có nhiều phương pháp ước lượng \(\phi\), ví dụ:
\[ \hat{\phi} = \frac{1}{n - p} \sum_{i=1}^n \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \]
trong đó \(n\) là số quan sát, \(p\) số biến giải thích, và \(V(\hat{\mu}_i)\) là hàm phương sai ứng với giá trị dự báo \(\hat{\mu}_i\).

Tầm quan trọng của thứ tự đưa biến giải thích vào mô hình:

Khi phân tích bảng deviance, thứ tự các biến được đưa vào mô hình ảnh hưởng tới cách diễn giải vai trò của từng biến và quyết định lựa chọn biến quan trọng trong mô hình. Do đó, việc cân nhắc thứ tự biến là cần thiết để xây dựng mô hình chính xác và ý nghĩa.

Chương 6 cung cấp cái nhìn sâu sắc về quá trình ước lượng trong GLMs, liên hệ chặt chẽ với hồi quy tuyến tính qua công thức ma trận, đồng thời làm rõ vai trò và phương pháp ước lượng tham số phân tán \(\phi\). Bên cạnh đó, việc nhấn mạnh thứ tự biến trong phân tích deviance giúp người phân tích xây dựng và hiểu mô hình chính xác hơn. Đây là nền tảng vững chắc để áp dụng GLMs trong nghiên cứu thực tế và phát triển các kỹ thuật phân tích nâng cao.

1.3.6.2 Ứng dụng trong R

Việc ước lượng các mô hình GLMs trong R chủ yếu được thực hiện qua hàm glm() trong base R mà không cần các gói bổ sung:

  • Hàm glm() cho phép ước lượng hệ số hồi quy \(\beta\) và xử lý các phân phối phổ biến như binomial, poisson, gaussian, quasibinomial, quasipoisson, Gamma, inverse.gaussian, quasi,…
  • Các hàm liên kết (link functions) tương ứng được hỗ trợ trực tiếp trong glm() mà không cần tải thêm gói ngoài.

1.3.7 Mô hình tuyến tính tổng quát (GLMs): Suy luận

1.3.7.1 Tóm tắt lý thuyết

Chương 7 tập trung vào suy luận thống kê cho các tham số hồi quy trong mô hình tuyến tính tổng quát (GLMs), đặc biệt là các hệ số \(\beta\). Suy luận thống kê ở đây bao gồm việc kiểm định giả thuyết về các hệ số, ước lượng sai số chuẩn, xây dựng khoảng tin cậy, và đánh giá mức độ phù hợp của mô hình thông qua các bảng phân tích deviance. Trong GLMs, tham số phân tán \(\phi\) thể hiện sự biến thiên của dữ liệu so với mô hình. Nếu \(\phi\) được biết hoặc giả định cố định (ví dụ trong phân phối Poisson \(\phi = 1\)), các kiểm định thống kê thường dựa trên phân phối \(\chi^2\). Nếu \(\phi\) chưa biết, ta phải ước lượng nó, và các kiểm định có thể dựa trên phân phối F thay vì \(\chi^2\).

Nội dung chính chương này bao gồm:

Bảng phân tích deviance (Analysis of Deviance):

Deviance đo lường sự khác biệt giữa mô hình hiện tại và mô hình đầy đủ hoặc mô hình null, là công cụ quan trọng để đánh giá vai trò của các biến giải thích trong GLM.

Kiểm định Tỷ số Khả năng xảy ra (Likelihood Ratio Test - LRT):

Dùng để so sánh hai mô hình lồng nhau (nested), thống kê LRT dựa trên chênh lệch deviance giữa hai mô hình:
\[ \Lambda = -2 \log \frac{L(\text{mô hình nhỏ})}{L(\text{mô hình lớn})} = D_{\text{nhỏ}} - D_{\text{lớn}} \]
với \(\Lambda \sim \chi^2_{\Delta df}\), trong đó \(\Delta df\) là sự chênh lệch bậc tự do giữa hai mô hình.

Ước lượng tham số và sai số chuẩn:

Các hệ số hồi quy \(\hat{\boldsymbol{\beta}}\) được ước lượng thông qua thuật toán IRLS. Sai số chuẩn \(SE(\hat{\beta}_j)\) phản ánh độ chính xác của các ước lượng này và được dùng trong kiểm định Wald.

Kiểm định Wald và khoảng tin cậy:

  • Kiểm định Wald:
    \[ z_j = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim \mathcal{N}(0,1) \]
    kiểm tra ý nghĩa từng hệ số.
  • Khoảng tin cậy:
    Khoảng tin cậy \(100(1-\alpha)\%\) cho \(\beta_j\) được xây dựng theo công thức:
    \[ \hat{\beta}_j \pm z_{\alpha/2} \times SE(\hat{\beta}_j) \]
    với \(z_{\alpha/2}\) là giá trị phân vị của phân phối chuẩn chuẩn hóa.

Tham số phân tán \(\phi\):

Nếu \(\phi\) biết hoặc giả định cố định (ví dụ Poisson \(\phi=1\)), các kiểm định dựa trên phân phối \(\chi^2\). Nếu \(\phi\) chưa biết và được ước lượng, kiểm định có thể sử dụng phân phối F thay vì \(\chi^2\).

1.3.7.2 Ứng dụng trong R

Chương 7 sử dụng chủ yếu các hàm có sẵn trong R cơ bản (base R) để thực hiện suy luận thống kê cho GLMs:

  • Hàm glm() (được giới thiệu ở Chương 6) để fit mô hình GLM.

  • Phân tích độ lệch (Analysis of Deviance):
    Dùng hàm anova(model, test = "Chisq") để tạo bảng phân tích deviance và tính giá trị \(p\) dựa trên phân phối \(\chi^2\).

  • Kiểm định Likelihood Ratio Test (LRT):
    Tính giá trị \(p\) với hàm pchisq().

  • Kiểm định Wald và tính khoảng tin cậy:
    Sử dụng các hàm pnorm(), qnorm() để tính giá trị \(p\) và xây dựng khoảng tin cậy cho các tham số.

Tóm lại, Chương 7 minh họa việc sử dụng các hàm cơ bản của R để thực hiện suy luận thống kê trong GLMs một cách hiệu quả và rõ ràng, không cần đến gói bổ sung nào trong nội dung này.

1.3.8 Mô hình tuyến tính tổng quát (GLMs): Chẩn đoán

1.3.8.1 Tóm tắt lý thuyết

Chương này tập trung vào việc đánh giá độ phù hợp và chất lượng của mô hình GLM thông qua các kỹ thuật chẩn đoán.

Nội dung chính của chương bao gồm:

Phần dư trong GLMs:

Phần dư thông thường \(r_i = y_i - \hat{\mu}_i\) không đủ để đánh giá chính xác do phương sai phụ thuộc vào giá trị dự báo \(\hat{\mu}_i\). Vì vậy, sử dụng các loại phần dư đặc biệt như:

Phần dư deviance chuẩn hóa:
\[ r_i^{(D)} = \frac{d_i}{\sqrt{\hat{\phi} (1 - h_{ii})}} \]
trong đó \(d_i\) là độ lệch deviance, \(\hat{\phi}\) là tham số phân tán, và \(h_{ii}\) là leverage.
Phần dư quantile: Giúp đánh giá tính đầy đủ của mô hình và phân phối sai số.

Đồ thị chẩn đoán:
Các đồ thị như phần dư deviance chuẩn hóa, phần dư làm việc (working residuals), và phần dư từng phần (partial residuals) được dùng để trực quan hóa sự phù hợp của mô hình, phát hiện vi phạm giả định hoặc quan sát bất thường.

Nhận diện quan sát gây ảnh hưởng:
Một số quan sát có thể ảnh hưởng lớn đến kết quả ước lượng hệ số. Các chỉ số sau được sử dụng để xác định:

  • Cook’s distance: Đánh giá ảnh hưởng tổng thể của điểm lên ước lượng.
  • dffits: Đánh giá ảnh hưởng điểm lên giá trị dự báo.
  • Leverage \(h_{ii}\): Đo mức độ ảnh hưởng của điểm lên mô hình.
  • dfbetas: Đo mức độ ảnh hưởng của điểm lên từng hệ số ước lượng.

1.3.8.2 Ứng dụng trong R

Chương 8 sử dụng chủ yếu các hàm có sẵn trong R cơ bản (base R) để thực hiện các phân tích chẩn đoán mô hình GLM:

  • Vẽ đồ thị chẩn đoán: Dùng hàm plot(model) để tạo các biểu đồ phần dư và kiểm tra sự phù hợp của mô hình.

  • Biểu đồ Q-Q cho phần dư: Sử dụng qqnorm(residuals(model, type = "deviance")) kết hợp với qqline(residuals(model, type = "deviance")) để kiểm tra phân phối của phần dư deviance.

  • Phần dư chuẩn hóa: Tính bằng hàm rstandard(model) để xác định các quan sát có phần dư bất thường.

  • Chỉ số ảnh hưởng (influence measures): Sử dụng cooks.distance(model) để đo độ ảnh hưởng của từng quan sát. Dùng influence.measures(model) để nhận diện các quan sát có ảnh hưởng lớn dựa trên nhiều chỉ số.

  • Fit lại mô hình khi loại bỏ quan sát có ảnh hưởng: Sử dụng hàm update(model, subset = -c(index_points)).

  • Trích xuất hệ số hồi quy: Dùng coef(model) để lấy các hệ số ước lượng của mô hình.

  • Bố trí đồ thị: Dùng par(mfrow = c(2, 2)) để tạo nhiều biểu đồ trên một cửa sổ đồ họa.

1.3.9 Mô hình tỷ lệ – Binomial GLMs

1.3.9.1 Tóm tắt lý thuyết

Chương 9 tập trung vào mô hình hóa dữ liệu dạng tỷ lệ hoặc số lần thành công trên tổng số lần thử bằng mô hình tuyến tính tổng quát với phân phối nhị thức (binomial GLM). Đây là dạng dữ liệu phổ biến trong nhiều lĩnh vực như sinh học, y học, kỹ thuật và khoa học xã hội.

Nội dung chính chương này bao gồm:

Dữ liệu và mô hình:

  • Biến phản hồi \(Y_i\) được mô hình hóa theo phân phối nhị thức:
    \[ Y_i \sim \text{Binomial}(n_i, \pi_i) \]
    với \(n_i\) là số lần thử và \(\pi_i\) là xác suất thành công.
  • Dữ liệu có thể được nhập vào R dưới dạng tỷ lệ kèm theo trọng số (weights), hoặc dưới dạng ma trận hai cột gồm số lần thành công và thất bại.
  • Mô hình thường sử dụng hàm liên kết logit:
    \[ \text{logit}(\pi_i) = \log\left(\frac{\pi_i}{1 - \pi_i}\right) = \mathbf{x}_i^\top \boldsymbol{\beta} \]
    Tuy nhiên, các hàm liên kết khác như cloglog hoặc biến đổi arcsin cũng có thể được sử dụng tùy theo tính chất dữ liệu.
  • Hệ số hồi quy \(\beta_j\) trong mô hình logit được diễn giải thông qua tỷ số odds (odds ratio):
    \[ \exp(\beta_j) \]
    biểu thị tỷ số thay đổi odds khi biến giải thích thay đổi một đơn vị.

Suy luận thống kê:
Việc suy luận cho các tham số \(\boldsymbol{\beta}\) được thực hiện thông qua các kiểm định như:

  • Kiểm định Wald
  • Phân tích độ lệch (deviance analysis)
  • Xây dựng khoảng tin cậy

Chẩn đoán mô hình:
Các phần dư được sử dụng để kiểm tra sự phù hợp của mô hình bao gồm:

  • Phần dư deviance
  • Phần dư quantile
  • Phần dư làm việc (working residuals)
    Các đồ thị phần dư và biểu đồ Q-Q giúp phát hiện các điểm quan sát bất thường hoặc dấu hiệu mô hình không phù hợp.

1.3.9.2 Ứng dụng trong R

  • Ước lượng mô hình: Việc fit mô hình GLM nhị thức chủ yếu dựa vào hàm glm() trong R cơ bản (base R), không yêu cầu cài đặt gói bổ sung cho phần chính của mô hình.

  • Các gói bổ sung

    • Gói GLMsData được sử dụng để tải các bộ dữ liệu minh họa trong các ví dụ, ví dụ:

    • Gói MASS (đi kèm với R nhưng cần gọi library(MASS)) được dùng cho các hàm chuyên biệt như dose.p() để tính toán liều hiệu quả trung bình (ED50).

  • Các hàm R chính trong Chương 9

    • glm() để fit mô hình GLM nhị thức.
    • anova() với đối số test = "Chisq" để phân tích deviance và kiểm định mô hình.
    • Các hàm chẩn đoán như plot(), qqnorm(), rstandard(), cooks.distance() để đánh giá và kiểm tra mô hình, thuộc R cơ bản hoặc các gói mặc định.
    • library() để tải các gói bổ trợ khi cần.

Tóm lại, Chương 9 cung cấp nền tảng lý thuyết và thực hành cho việc xây dựng, suy luận và chẩn đoán mô hình GLM nhị thức, đồng thời hướng dẫn cách sử dụng các công cụ trong R để thực hiện các phân tích này hiệu quả.

1.3.10 Mô hình cho dữ liệu đếm – Poisson & Negative Binomial

1.3.10.1 Tóm tắt lý thuyết

Chương 10 trình bày cách mô hình hóa dữ liệu đếm thông qua các mô hình tuyến tính tổng quát với phân phối Poisson hoặc Nhị thức âm (Negative Binomial). Dữ liệu đếm rất phổ biến trong thực nghiệm và quan sát, như số ca bệnh, số sự kiện xảy ra hay số lượng cá thể.

Nội dung chính của chương bao gồm:

Mô hình Poisson GLM:
Mô hình Poisson thường được sử dụng khi biến phản hồi là số lượng đếm với giả định phương sai bằng trung bình (equidispersion):
\[ Y_i \sim \text{Poisson}(\mu_i), \quad \text{với } \mathrm{E}[Y_i] = \mathrm{Var}(Y_i) = \mu_i \]
Hàm liên kết log được dùng phổ biến:
\[ \log(\mu_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \]
Hệ số hồi quy \(\beta_j\) được diễn giải như tỷ lệ thay đổi trung bình khi biến giải thích tăng một đơn vị:
\[ e^{\beta_j} \]
Ví dụ, \(\beta_j = 1.05\) tương đương tăng số lượng trung bình lên khoảng \(e^{1.05} \approx 2.86\) lần.

Xử lý overdispersion:
Trong thực tế, dữ liệu đếm thường có phương sai lớn hơn trung bình (overdispersion), làm cho mô hình Poisson không còn phù hợp. Các phương pháp phổ biến để xử lý bao gồm:

  • Quasi-Poisson: Điều chỉnh phương sai \(\mathrm{Var}(Y_i) = \phi \mu_i\) với \(\phi > 1\).
  • Negative Binomial GLM: Mô hình hóa phương sai mở rộng hơn, thường biểu diễn bằng:
    \[ \mathrm{Var}(Y_i) = \mu_i + \alpha \mu_i^2 \]
    với \(\alpha > 0\) là tham số điều chỉnh mức độ overdispersion.

Mô hình hóa bảng tần số:
Khi làm việc với bảng tần số, mô hình log-linear được dùng để kiểm tra sự phụ thuộc giữa các biến thay vì chỉ quan tâm đến tổng biên. Ví dụ: phân tích dữ liệu về thực phẩm biến đổi gen để kiểm tra tương tác giữa thu nhập và thái độ người tiêu dùng.

Suy luận và chẩn đoán:

  • Suy luận thống kê dựa trên các kiểm định Wald, phân tích deviance và kiểm định độ phù hợp mô hình (goodness-of-fit).
  • Chẩn đoán mô hình sử dụng các phần dư (deviance residuals, Pearson residuals), kiểm định goodness-of-fit và các chỉ số ảnh hưởng như Cook’s distance, leverage để phát hiện điểm ảnh hưởng hoặc quan sát bất thường.

1.3.10.2 Ứng dụng trong R

  • Ước lượng mô hình Poisson: Hàm glm() với đối số family = poisson trong R cơ bản (base R) được dùng để fit các mô hình Poisson GLM.

  • Mô hình Negative Binomial: Để fit mô hình Negative Binomial, cần sử dụng gói MASS (đi kèm với R nhưng phải gọi library(MASS)).

1.3.11 Mô hình GLM với Dữ liệu Liên tục Dương – Phân phối Gamma

1.3.11.1 Tóm tắt lý thuyết

Chương này mở rộng khuôn khổ GLM để xử lý các biến phản hồi là dữ liệu liên tục, dương với đặc điểm phương sai tăng theo trung bình. Các mô hình chính tập trung vào phân phối Gamma, Inverse Gaussian và một số trường hợp của phân phối Tweedie, thuộc họ Mô hình Phân tán Lũy thừa (Exponential Dispersion Models - EDM).

Mô hình Gamma GLM:

  • Biến phản hồi \(Y\) dương, có phương sai tỷ lệ với bình phương trung bình:
    \[ \mathrm{Var}(Y) = \phi \mu^2 \]
  • Hàm liên kết phổ biến gồm hàm logarit và hàm nghịch đảo:
    \[ g(\mu) = \log(\mu) \quad \text{hoặc} \quad g(\mu) = \frac{1}{\mu} \]
  • Mô hình được biểu diễn dưới dạng:
    \[ g(\mu_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \]

Kỹ thuật chẩn đoán mô hình:

  • Sử dụng phần dư chuẩn hóa và phần dư quantile để đánh giá tính phù hợp mô hình.
  • Đồ thị fitted values so với residuals và biểu đồ Q-Q giúp phát hiện sự không phù hợp hoặc quan sát bất thường.
  • Cook’s distance hỗ trợ xác định các điểm quan sát có ảnh hưởng lớn đến mô hình.

Chương này cung cấp nền tảng vững chắc để phân tích các biến liên tục dương có phương sai tăng, mở rộng đáng kể phạm vi ứng dụng GLM trong thực tế thống kê với sự linh hoạt của các hàm liên kết và công cụ chẩn đoán quen thuộc.

1.3.11.2 Ứng dụng trong R

Các hàm R chính trong Chương 11

  • glm() để fit mô hình GLM với phân phối Gamma (family = Gamma(link = "log")) hoặc Inverse Gaussian (family = inverse.gaussian(link = "log")).
  • summary() để xem tóm tắt mô hình, bao gồm hệ số, sai số chuẩn và kiểm định ý nghĩa.
  • coef() để trích xuất các hệ số từ mô hình.
  • printCoefmat() để hiển thị bảng hệ số có định dạng rõ ràng.
  • data() để tải các tập dữ liệu ví dụ như lime, perm, hoặc rrates từ gói GLMsData.
  • boxplot(), plot() để trực quan hóa dữ liệu và kết quả mô hình.
  • influence.measures() để phân tích ảnh hưởng của các điểm dữ liệu, bao gồm Cook’s distance (cook.d).

1.3.12 Mô hình Tweedie

1.3.12.1 Tóm tắt lý thuyết

Chương này mở rộng mô hình GLM để xử lý biến phản hồi là dữ liệu liên tục dương, bao gồm cả trường hợp có giá trị bằng 0, bằng cách sử dụng phân phối Tweedie — một họ phân phối linh hoạt thuộc họ Mô hình Phân tán Lũy thừa (EDM).

Nội dung chính của chương bao gồm:

  • Phân phối Tweedie:
    Phân phối Tweedie được đặc trưng bởi hàm phương sai:
    \[ V(\mu) = \mu^\xi \] với tham số chỉ mục \(\xi\) (Tweedie index parameter).

  • Ý nghĩa các giá trị \(\xi\):

    • \(\xi = 0\): phân phối Chuẩn (Normal)
    • \(\xi = 1\): phân phối Poisson
    • \(\xi = 2\): phân phối Gamma
    • \(\xi = 3\): phân phối Inverse Gaussian
    • \(1 < \xi < 2\): đặc biệt phù hợp cho dữ liệu liên tục dương có nhiều giá trị bằng 0 (zero-inflated continuous data).
  • Mô hình GLM Tweedie:
    Mô hình được xây dựng theo khuôn khổ GLM với:
    \[ g(\mu_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \] trong đó \(g(\cdot)\) là hàm liên kết phù hợp (thường là log).

  • Ước lượng tham số:

    • Trong R, mô hình được fit bằng hàm glm() với tham số family = tweedie() (cần gói statmod).
    • Tham số \(\xi\) được chỉ định qua var.power.
    • Tham số phân tán \(\phi\) thường được tự động ước lượng.
    • Trường hợp \(\xi\) chưa biết, có thể ước lượng thông qua tối đa hóa log-likelihood hoặc so sánh các mô hình bằng AIC.
  • Chẩn đoán mô hình:

    • Sử dụng phần dư chuẩn hóa và biểu đồ Q-Q để đánh giá tính phù hợp.
    • Kiểm định dựa trên deviance giúp đánh giá mức độ phù hợp của mô hình với dữ liệu quan sát.

Chương này cho phép áp dụng GLM vào các tập dữ liệu thực tế phức tạp hơn, đặc biệt trong các lĩnh vực có dữ liệu dương kèm nhiều giá trị 0 như bảo hiểm, sinh học, và nghiên cứu tiêu dùng.

1.3.12.2 Ứng dụng trong R

Các gói và hàm R chính trong Chương 12

  • glm() kết hợp với family = tweedie() để fit mô hình GLM Tweedie. Hàm tweedie() được cung cấp bởi gói statmod.
  • tweedie.profile() từ gói tweedie để ước lượng chỉ số Tweedie (ξ).
  • data() để tải các tập dữ liệu ví dụ như breakdown, poison, polythene, gpsleep, rrates, perm, lime, và quilpie từ gói GLMsData.

1.4 Kết luận

Cuốn sách này cung cấp một nền tảng vững chắc cả về lý thuyết và ứng dụng cho việc phân tích mô hình hồi quy tuyến tính và tuyến tính tổng quát bằng R. Với định hướng phát triển tư duy mô hình hóa, kỹ năng chẩn đoán và phản biện thống kê, đây là tài liệu lý tưởng cho những ai làm việc trong lĩnh vực phân tích dữ liệu thực nghiệm.


2 PHẦN 2: THỐNG KÊ MÔ TẢ DỮ LIỆU

2.1 Giới thiệu bộ dữ liệu

Tải dữ liệu

library("csv")
## Warning: package 'csv' was built under R version 4.4.3
library(data.table)
## Warning: package 'data.table' was built under R version 4.4.3
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
data.table(data)
##            X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
##        <int>       <char>      <int> <char>        <char>    <char>    <int>
##     1:     1   2007-12-18       7223      F             S         Y        2
##     2:     2   2007-12-20       7841      M             M         Y        5
##     3:     3   2007-12-21       8374      F             M         N        2
##     4:     4   2007-12-21       9619      M             M         Y        3
##     5:     5   2007-12-22       1900      F             S         Y        3
##    ---                                                                      
## 14055: 14055   2009-12-29       9102      F             M         Y        2
## 14056: 14056   2009-12-29       4822      F             M         Y        3
## 14057: 14057   2009-12-31        250      M             S         Y        1
## 14058: 14058   2009-12-31       6153      F             S         N        4
## 14059: 14059   2009-12-31       3656      M             S         N        3
##         AnnualIncome          City StateorProvince Country  ProductFamily
##               <char>        <char>          <char>  <char>         <char>
##     1:   $30K - $50K   Los Angeles              CA     USA           Food
##     2:   $70K - $90K   Los Angeles              CA     USA           Food
##     3:   $50K - $70K     Bremerton              WA     USA           Food
##     4:   $30K - $50K      Portland              OR     USA           Food
##     5: $130K - $150K Beverly Hills              CA     USA          Drink
##    ---                                                                   
## 14055:   $10K - $30K     Bremerton              WA     USA           Food
## 14056:   $10K - $30K   Walla Walla              WA     USA           Food
## 14057:   $30K - $50K      Portland              OR     USA          Drink
## 14058:   $50K - $70K       Spokane              WA     USA          Drink
## 14059:   $50K - $70K      Portland              OR     USA Non-Consumable
##        ProductDepartment      ProductCategory UnitsSold Revenue
##                   <char>               <char>     <int>   <num>
##     1:       Snack Foods          Snack Foods         5   27.38
##     2:           Produce           Vegetables         5   14.90
##     3:       Snack Foods          Snack Foods         3    5.52
##     4:            Snacks                Candy         4    4.44
##     5:         Beverages Carbonated Beverages         4   14.00
##    ---                                                         
## 14055:      Baking Goods         Baking Goods         3    9.64
## 14056:      Frozen Foods           Vegetables         3    7.45
## 14057:         Beverages Pure Juice Beverages         4    3.24
## 14058:             Dairy                Dairy         2    4.00
## 14059:         Household           Electrical         5   25.53

Giải thích các biến

Bộ dữ liệu ghi lại thông tin về các giao dịch mua hàng của khách hàng, bao gồm thông tin nhân khẩu học, thông tin sản phẩm, số lượng bán ra và doanh thu. Dữ liệu bao gồm 14059 quan sát và 16 biến. Dưới đây là mô tả chi tiết các biến có trong bộ dữ liệu:

Tên Biến Ý Nghĩa
PurchaseDate Ngày giao dịch mua hàng diễn ra (định dạng ngày/tháng/năm).
CustomerID Mã định danh duy nhất cho mỗi khách hàng.
Gender Giới tính của khách hàng: M (Nam), F (Nữ).
MaritalStatus Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn).
Homeowner Tình trạng sở hữu nhà: Y (Có), N (Không).
Children Số lượng con cái của khách hàng.
AnnualIncome Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K).
City Thành phố nơi khách hàng thực hiện giao dịch.
StateorProvince Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon).
Country Quốc gia.
ProductFamily Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng).
ProductDepartment Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v.
ProductCategory Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine.
UnitsSold Số lượng đơn vị sản phẩm đã bán trong giao dịch đó.
Revenue Doanh thu từ giao dịch (tính theo USD).

Trước khi tiến hành thống kê mô tả các biến trong bộ dữ liệu, ta tiến hành phân loại dữ liệu thành 2 nhóm bao gồm: dữ liệu định tính và dữ liệu định lượng như sau:

Phân loại biến theo kiểu dữ liệu:

Dữ liệu Định tính:

Tên Biến Ý Nghĩa
Gender Giới tính của khách hàng: M (Nam), F (Nữ).
MaritalStatus Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn).
Homeowner Tình trạng sở hữu nhà: Y (Có), N (Không).
AnnualIncome Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K).
City Thành phố nơi khách hàng thực hiện giao dịch.
StateorProvince Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon).
Country Quốc gia.
ProductFamily Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng).
ProductDepartment Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v.
ProductCategory Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine.

Dữ liệu Định lượng:

Tên Biến Ý Nghĩa
Children Số lượng con cái của khách hàng.
UnitsSold Số lượng đơn vị sản phẩm đã bán trong giao dịch đó.
Revenue Doanh thu từ giao dịch (tính theo USD).

2.2 Thống kê mô tả các biến trong bộ dữ liệu

2.2.1 Phân tích các biến định tính

2.2.1.1 Biến Gender

Lập bảng tần số và tần suất

#Bảng tần số
table(data$Gender)
## 
##    F    M 
## 7170 6889
#Bảng tần suất
table(data$Gender)/sum(table(data$Gender))
## 
##         F         M 
## 0.5099936 0.4900064

Vẽ đồ thị

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:data.table':
## 
##     between, first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data %>%
  group_by(Gender) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = Gender, y = n)) +
  geom_col(fill = "#89CFF0") +
  geom_text(aes(label = n), vjust = -0.5, color = "black") +
  theme_bw() +
  labs(y = "Number") 

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được

  • Tần số cho thấy có sự chênh lệch nhẹ về số lượng khách hàng giữa hai giới tính, với 7170 khách hàng nữ ghi nhận được so với 6889 khách hàng nam trong tập dữ liệu.
  • Về tần suất, tỷ lệ khách hàng nữ và nam trong tập dữ liệu này gần như tương đương, lần lượt chiếm khoảng 50.10% và 49.90% tổng số khách hàng, cho thấy một sự phân bố giới tính khá cân bằng.

2.2.1.2 Biến MaritalStatus

Lập bảng tần số và tần suất

#Bảng tần số
table(data$MaritalStatus)
## 
##    M    S 
## 6866 7193
#Bảng tần suất
table(data$MaritalStatus)/sum(table(data$MaritalStatus))
## 
##         M         S 
## 0.4883704 0.5116296

Vẽ đồ thị

data %>%
  group_by(MaritalStatus) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = MaritalStatus, y = n)) +
  geom_col(fill = "#FFDAB9", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black") +
  labs( x = "Marital Status", y = "Number") +
  theme_bw()

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được

  • Về tần số, số lượng khách hàng có tình trạng hôn nhân ‘Độc thân’ (S) là 7193 cao hơn so với số lượng khách hàng ‘Đã kết hôn’ (M) là 6866 trong tập dữ liệu này.
  • Xét về tần suất, tỷ lệ khách hàng ‘Độc thân’ (S) chiếm khoảng 51.16% tổng số khách hàng, trong khi tỷ lệ khách hàng ‘Đã kết hôn’ (M) là khoảng 48.84%. Điều này cho thấy số lượng khách hàng độc thân chiếm phần lớn hơn một chút trong tập dữ liệu này.

2.2.1.3 Biến Homeowner

Lập bảng tần số và tần suất

#Bảng tần số
table(data$Homeowner)
## 
##    N    Y 
## 5615 8444
#Bảng tần suất
table(data$Homeowner)/sum(table(data$Homeowner))
## 
##         N         Y 
## 0.3993883 0.6006117

Vẽ đồ thị

data %>%
  group_by(Homeowner) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = Homeowner, y = n)) +
  geom_col(fill = "#F08080", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black") +
  labs( x = "Homeowner", y = "Number") +
  theme_bw()

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được

  • Về tần số, số lượng khách hàng có sở hữu nhà (Y) là 8444, cao hơn đáng kể so với số lượng khách hàng không sở hữu nhà (N) là 5615 trong tập dữ liệu này.
  • Xét về tần suất, tỷ lệ khách hàng có sở hữu nhà (Y) chiếm khoảng 60.06% tổng số khách hàng, trong khi tỷ lệ khách hàng không sở hữu nhà (N) là khoảng 39.94%. Điều này cho thấy phần lớn khách hàng trong tập dữ liệu này thuộc nhóm sở hữu nhà.

2.2.1.4 Biến AnnualIncome

Lập bảng tần số và tần suất

#Bảng tần số
table(data$AnnualIncome)
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
#Bảng tần suất
table(data$AnnualIncome)/sum(table(data$AnnualIncome))
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##    0.21978804    0.04573583    0.05405790    0.01941817    0.32726367 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##    0.16857529    0.12155914    0.04360196

Vẽ đồ thị

data %>%
  group_by(AnnualIncome) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = AnnualIncome, y = n)) +
  geom_col(fill = "#F08080", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black") +
  labs( x = "AnnualIncome", y = "Number") +
  theme_bw()

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được

Nhóm thu nhập thấp nhất: Khoảng $10K - $30K chiếm tỷ lệ đáng kể với 3090 khách hàng, tương đương khoảng 21.98% tổng số khách hàng. Đây là nhóm thu nhập thấp nhất được ghi nhận và chiếm hơn một phần năm tổng số khách hàng.

Nhóm thu nhập thấp trung bình: Tiếp theo là khoảng $30K - $50K, đây là nhóm có số lượng khách hàng lớn nhất với 4601 người, chiếm khoảng 32.73%. Điều này cho thấy đây là mức thu nhập phổ biến nhất trong tập khách hàng.

Nhóm thu nhập trung bình: Khoảng $50K - $70K có 2370 khách hàng, chiếm khoảng 16.86%. Đây là nhóm thu nhập trung bình, thấp hơn đáng kể so với hai nhóm thu nhập thấp hơn.

Các nhóm thu nhập trung bình cao:

  • Khoảng $70K - $90K có 1709 khách hàng, chiếm khoảng 12.16%.
  • Khoảng $90K - $110K có 613 khách hàng, chiếm khoảng 4.36%. Số lượng khách hàng ở khoảng thu nhập này giảm đáng kể so với các nhóm thấp hơn.
  • Khoảng $110K - $130K có số lượng khách hàng thấp nhất trong các khoảng dưới $150K+, với chỉ 572 khách hàng, chiếm khoảng 4.05%.

Nhóm thu nhập cao: Khoảng $130K - $150K có 760 khách hàng, chiếm khoảng 5.41%. Số lượng khách hàng ở nhóm thu nhập này có sự tăng nhẹ so với khoảng $110K - $130K.

Nhóm thu nhập cao nhất: Cuối cùng, khoảng thu nhập $150K+ chỉ có 273 khách hàng, chiếm tỷ lệ rất nhỏ, khoảng 1.94%. Đây là nhóm khách hàng có thu nhập cao nhất nhưng lại chiếm phần trăm ít nhất trong tập dữ liệu.

Tổng quan:

Phân bố thu nhập của tập khách hàng này cho thấy sự tập trung đáng kể ở các mức thu nhập thấp và trung bình ($10K - $50K), chiếm hơn một nửa tổng số khách hàng. Khi mức thu nhập tăng dần, số lượng và tỷ lệ khách hàng có xu hướng giảm, đặc biệt là ở các khoảng thu nhập trên $90K. Nhóm khách hàng có thu nhập cao nhất ($150K+) chỉ chiếm một phần rất nhỏ.

2.2.1.5 Biến City

Lập bảng tần số và tần suất

#Bảng tần số
table(data$City)
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##           383           143           811           834           452 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##            75           845           926           654           194 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##           464           876          1386           621           866 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##           130           922           875          1257           633 
##      Victoria   Walla Walla        Yakima 
##           176           160           376
#Bảng tần suất
table(data$City)/sum(table(data$City))
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##   0.027242336   0.010171420   0.057685468   0.059321431   0.032150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##   0.005334661   0.060103848   0.065865282   0.046518245   0.013798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##   0.033003770   0.062308841   0.098584537   0.044170994   0.061597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##   0.009246746   0.065580767   0.062237712   0.089408920   0.045024539 
##      Victoria   Walla Walla        Yakima 
##   0.012518671   0.011380610   0.026744434

Vẽ đồ thị

library(ggplot2)
library(dplyr)
library(patchwork)
## Warning: package 'patchwork' was built under R version 4.4.3
# Giả sử 'data' là data frame của bạn
city_counts <- data %>%
  group_by(City) %>%
  summarise(n = n()) %>%
  arrange(desc(n)) # Sắp xếp theo số lượng giảm dần

n_cities <- nrow(city_counts)
mid_point <- ceiling(n_cities / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo số lượng)
top_half_cities <- head(city_counts, mid_point)

plot1_city_count <- ggplot(top_half_cities, aes(x = City, y = n)) +
  geom_col(fill = "#DB7093", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
  labs(x = "City", y = "Number") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo số lượng)
bottom_half_cities <- tail(city_counts, n_cities - mid_point)

plot2_city_count <- ggplot(bottom_half_cities, aes(x = City, y = n)) +
  geom_col(fill = "#DB7093", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
  labs(x = "City", y = "Number") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Kết hợp hai biểu đồ lại với nhau
plot1_city_count + plot2_city_count

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được

Các thành phố có số lượng giao dịch lớn:

  • Vancouver: Ghi nhận số lượng giao dịch cao nhất với 1386 giao dịch, chiếm khoảng 9.86% tổng số giao dịch.
  • Tacoma: Cũng có số lượng giao dịch đáng kể với 1257 giao dịch, chiếm khoảng 8.94% tổng số giao dịch.
  • Seattle: Có 922 giao dịch, chiếm khoảng 6.56% tổng số giao dịch.
  • Los Angeles: Ghi nhận 926 giao dịch, chiếm khoảng 6.59% tổng số giao dịch.
  • Portland: Có 876 giao dịch, chiếm khoảng 6.23% tổng số giao dịch.
  • San Diego: Có 866 giao dịch, chiếm khoảng 6.16% tổng số giao dịch.
  • Hidalgo: Có 845 giao dịch, chiếm khoảng 6.01% tổng số giao dịch.
  • Bremerton: Ghi nhận 834 giao dịch, chiếm khoảng 5.93% tổng số giao dịch.
  • Beverly Hills: Có 811 giao dịch, chiếm khoảng 5.77% tổng số giao dịch.

Các thành phố có số lượng giao dịch trung bình:

  • Salem: Có 1386 giao dịch, chiếm khoảng 9.86% tổng số giao dịch.
  • Spokane: Có 875 giao dịch, chiếm khoảng 6.22% tổng số giao dịch.
  • Merida: Có 654 giao dịch, chiếm khoảng 4.65% tổng số giao dịch.
  • San Andres: Có 621 giao dịch, chiếm khoảng 4.42% tổng số giao dịch.
  • Vancouver: Có 633 giao dịch, chiếm khoảng 4.50% tổng số giao dịch.
  • Orizaba: Có 464 giao dịch, chiếm khoảng 3.30% tổng số giao dịch.
  • Camacho: Có 452 giao dịch, chiếm khoảng 3.22% tổng số giao dịch.
  • Acapulco: Có 383 giao dịch, chiếm khoảng 2.72% tổng số giao dịch.
  • Yakima: Có 376 giao dịch, chiếm khoảng 2.67% tổng số giao dịch.
  • Mexico City: Có 194 giao dịch, chiếm khoảng 1.38% tổng số giao dịch.
  • Walla Walla: Có 160 giao dịch, chiếm khoảng 1.14% tổng số giao dịch.
  • Bellingham: Có 143 giao dịch, chiếm khoảng 1.01% tổng số giao dịch.

Các thành phố có số lượng giao dịch thấp:

  • Victoria: Có số lượng giao dịch thấp với 176 giao dịch, chiếm khoảng 1.25% tổng số giao dịch.
  • Guadalajara: Có số lượng giao dịch rất thấp với chỉ 75 giao dịch, chiếm khoảng 0.53% tổng số giao dịch.
  • Francisco: Có số lượng giao dịch thấp với 130 giao dịch, chiếm khoảng 0.92% tổng số giao dịch.

Tổng quan:

Phân tích cho thấy sự phân bố giao dịch không đồng đều giữa các thành phố. Một số thành phố như Vancouver và Tacoma chiếm tỷ lệ giao dịch cao nhất, cho thấy đây có thể là các thị trường quan trọng hoặc có lượng khách hàng hoạt động lớn hơn. Ngược lại, một số thành phố khác như Guadalajara và Victoria có số lượng giao dịch rất thấp.

2.2.1.6 Biến StateorProvince

Lập bảng tần số và tần suất

#Bảng tần số
table(data$StateorProvince)
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
#Bảng tần suất
table(data$StateorProvince)/sum(table(data$StateorProvince))
## 
##          BC          CA          DF    Guerrero     Jalisco          OR 
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378 
##    Veracruz          WA     Yucatan   Zacatecas 
## 0.033003770 0.324845295 0.046518245 0.092254072

Vẽ đồ thị

data %>%
  group_by(StateorProvince) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = StateorProvince, y = n)) +
  geom_col(fill = "#F08080", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black") +
  labs( x = "StateorProvince", y = "Number") +
  theme_bw()

Nhận xét Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được

Các Bang/Tỉnh có số lượng giao dịch lớn:

  • WA (Washington): Ghi nhận số lượng giao dịch cao nhất với 4567 giao dịch, chiếm khoảng 32.48% tổng số giao dịch. Đây là khu vực có hoạt động giao dịch vượt trội so với các khu vực khác.
  • CA (California): Đứng thứ hai với 2733 giao dịch, chiếm khoảng 19.44%. California cũng là một khu vực có lượng giao dịch rất đáng kể.
  • OR (Oregon): Có 2262 giao dịch, chiếm khoảng 16.09%. Oregon là một khu vực quan trọng khác về số lượng giao dịch.
  • Zacatecas: Ghi nhận 1297 giao dịch, chiếm khoảng 9.23%.

Các Bang/Tỉnh có số lượng giao dịch trung bình:

  • BC (British Columbia): Có 809 giao dịch, chiếm khoảng 5.75%.
  • DF (Distrito Federal): Có 815 giao dịch, chiếm khoảng 5.80%.
  • Yucatan: Có 654 giao dịch, chiếm khoảng 4.65%.
  • Veracruz: Có 464 giao dịch, chiếm khoảng 3.30%.
  • Guerrero: Có 383 giao dịch, chiếm khoảng 2.72%.

Các Bang/Tỉnh có số lượng giao dịch thấp:

  • Jalisco: Có số lượng giao dịch thấp nhất với chỉ 75 giao dịch, chiếm khoảng 0.53%.

Tổng quan:

Phân tích cho thấy sự tập trung giao dịch rất lớn ở ba bang/tỉnh là Washington (WA), California (CA), và Oregon (OR), chiếm phần lớn tổng số giao dịch. Zacatecas cũng đóng góp một lượng giao dịch đáng kể. Các khu vực còn lại có số lượng giao dịch ít hơn nhiều, đặc biệt là Jalisco.

2.2.1.7 Biến Country

Lập bảng tần số và tần suất

#Bảng tần số
table(data$Country)
## 
## Canada Mexico    USA 
##    809   3688   9562
#Bảng tần suất
table(data$Country)/sum(table(data$Country))
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372

Vẽ đồ thị

data %>%
  group_by(Country) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = Country, y = n)) +
  geom_col(fill = "#6495ED", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black") +
  labs( x = "Country", y = "Number") +
  theme_bw()

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được

Phân bố giao dịch theo quốc gia:

  • USA (Hoa Kỳ): Ghi nhận số lượng giao dịch cao nhất với 9562 giao dịch, chiếm khoảng 68.01% tổng số giao dịch. Hoa Kỳ là thị trường chiếm ưu thế tuyệt đối về số lượng giao dịch.
  • Mexico: Đứng thứ hai với 3688 giao dịch, chiếm khoảng 26.23% tổng số giao dịch. Mexico là thị trường lớn thứ hai, tuy nhiên vẫn có sự khác biệt đáng kể so với Hoa Kỳ.
  • Canada: Có số lượng giao dịch thấp nhất trong ba quốc gia với 809 giao dịch, chiếm khoảng 5.75% tổng số giao dịch.

Tổng quan:

Phân tích cho thấy sự tập trung giao dịch chủ yếu ở Hoa Kỳ, chiếm hơn hai phần ba tổng số giao dịch. Mexico là thị trường quan trọng thứ hai, đóng góp hơn một phần tư tổng số giao dịch. Canada có số lượng giao dịch thấp hơn đáng kể so với hai quốc gia còn lại. Thông tin này cho thấy Hoa Kỳ là thị trường mục tiêu chính, tiếp theo là Mexico, và Canada có thể là một thị trường nhỏ hơn hoặc có tiềm năng phát triển khác biệt.

2.2.1.8 Biến Product Family

Lập bảng tần số và tần suất

#Bảng tần số
table(data$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
#Bảng tần suất
table(data$ProductFamily)/sum(table(data$ProductFamily))
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813

Vẽ đồ thị

data %>%
  group_by(ProductFamily) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = ProductFamily, y = n)) +
  geom_col(fill = "#4682B4", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black") +
  labs( x = "Product Family", y = "Number") +
  theme_bw()

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được

Phân bố giao dịch theo nhóm sản phẩm:

  • Food (Thực phẩm): Ghi nhận số lượng giao dịch cao nhất với 10153 giao dịch, chiếm khoảng 72.22% tổng số giao dịch. Nhóm Thực phẩm chiếm phần lớn các giao dịch.
  • Non-Consumable (Không tiêu dùng): Đứng thứ hai với 2656 giao dịch, chiếm khoảng 18.89% tổng số giao dịch. Nhóm sản phẩm không tiêu dùng cũng có một lượng giao dịch đáng kể.
  • Drink (Đồ uống): Có số lượng giao dịch thấp nhất trong ba nhóm với 1250 giao dịch, chiếm khoảng 8.89% tổng số giao dịch.

Tổng quan:

Phân tích cho thấy nhóm sản phẩm Thực phẩm chiếm ưu thế tuyệt đối về số lượng giao dịch, chiếm gần ba phần tư tổng số giao dịch. Nhóm sản phẩm Không tiêu dùng đứng thứ hai, đóng góp gần một phần năm tổng số giao dịch. Nhóm Đồ uống có số lượng giao dịch thấp hơn đáng kể so với hai nhóm còn lại.

2.2.1.9 Biến Product Department

Lập bảng tần số và tần suất

#Bảng tần số
table(data$ProductDepartment)
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##                 356                 425                1072                 680 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##                 188                 977                 109                  59 
##            Checkout               Dairy                Deli                Eggs 
##                  82                 903                 699                 198 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##                1382                 893                1420                  89 
##         Periodicals             Produce             Seafood         Snack Foods 
##                 202                1994                 102                1600 
##              Snacks       Starchy Foods 
##                 352                 277
#Bảng tần suất
table(data$ProductDepartment)/sum(table(data$ProductDepartment))
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##         0.025321858         0.030229746         0.076250089         0.048367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##         0.013372217         0.069492852         0.007753041         0.004196600 
##            Checkout               Dairy                Deli                Eggs 
##         0.005832563         0.064229319         0.049719041         0.014083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##         0.098300021         0.063518031         0.101002916         0.006330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##         0.014368020         0.141830856         0.007255139         0.113806103 
##              Snacks       Starchy Foods 
##         0.025037343         0.019702682

Vẽ đồ thị

library(ggplot2)
library(dplyr)
library(patchwork)

# Giả sử 'data' là data frame của bạn
dept_counts <- data %>%
  group_by(ProductDepartment) %>%
  summarise(n = n()) %>%
  arrange(n) # Sắp xếp theo số lượng để chia

n_depts <- nrow(dept_counts)
mid_point <- ceiling(n_depts / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa đầu)
dept_counts_1 <- head(dept_counts, mid_point)

plot1 <- ggplot(dept_counts_1, aes(x = ProductDepartment, y = n)) +
  geom_col(fill = "#4169E1", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
  labs(x = "Product Department", y = "Number") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Dữ liệu cho biểu đồ thứ hai (nửa sau)
dept_counts_2 <- tail(dept_counts, n_depts - mid_point)

plot2 <- ggplot(dept_counts_2, aes(x = ProductDepartment, y = n)) +
  geom_col(fill = "#4169E1", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
  labs(x = "Product Department", y = "Number") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Kết hợp hai biểu đồ lại với nhau
plot1 + plot2

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được là:

Các bộ phận sản phẩm có số lượng giao dịch lớn:

  • Produce: Ghi nhận số lượng giao dịch cao nhất với 1994 giao dịch, chiếm khoảng 14.18% tổng số giao dịch.
  • Snack Foods: Đứng thứ hai với 1600 giao dịch, chiếm khoảng 11.38%.
  • Household: Có 1420 giao dịch, chiếm khoảng 10.10%.
  • Frozen Foods: Có 1382 giao dịch, chiếm khoảng 9.83%.
  • Baking Goods: Có 1072 giao dịch, chiếm khoảng 7.63%.
  • Canned Foods: Có 977 giao dịch, chiếm khoảng 6.94%.
  • Dairy: Có 903 giao dịch, chiếm khoảng 6.42%.
  • Health and Hygiene: Có 893 giao dịch, chiếm khoảng 6.35%.

Các bộ phận sản phẩm có số lượng giao dịch trung bình:

  • Beverages: Có 680 giao dịch, chiếm khoảng 4.84%.
  • Deli: Có 699 giao dịch, chiếm khoảng 4.97%.
  • Baked Goods: Có 425 giao dịch, chiếm khoảng 3.02%.
  • Snacks: Có 352 giao dịch, chiếm khoảng 2.50%.
  • Alcoholic Beverages: Có 356 giao dịch, chiếm khoảng 2.53%.
  • Starchy Foods: Có 277 giao dịch, chiếm khoảng 1.97%.
  • Periodicals: Có 202 giao dịch, chiếm khoảng 1.44%.
  • Eggs: Có 198 giao dịch, chiếm khoảng 1.41%.
  • Breakfast Foods: Có 188 giao dịch, chiếm khoảng 1.34%.
  • Pain Relievers: Có 192 giao dịch, chiếm khoảng 1.37%.
  • Cleaning Supplies: Có 189 giao dịch, chiếm khoảng 1.34%.
  • Pure Juice Beverages: Có 165 giao dịch, chiếm khoảng 1.17%.
  • Carbonated Beverages: Có 154 giao dịch, chiếm khoảng 1.10%.
  • Side Dishes: Có 153 giao dịch, chiếm khoảng 1.09%.
  • Plastic Products: Có 141 giao dịch, chiếm khoảng 1.00%.
  • Drinks: Có 135 giao dịch, chiếm khoảng 0.96%.
  • Hardware: Có 129 giao dịch, chiếm khoảng 0.92%.

Các bộ phận sản phẩm có số lượng giao dịch thấp:

  • Seafood: Có 102 giao dịch, chiếm khoảng 0.73%.
  • Canned Products: Có 109 giao dịch, chiếm khoảng 0.78%.
  • Meat: Có 89 giao dịch, chiếm khoảng 0.63%.
  • Checkout: Có 82 giao dịch, chiếm khoảng 0.58%.
  • Carousel: Có 59 giao dịch, chiếm khoảng 0.42%.

Tổng quan:

Phân tích cho thấy sự phân bố giao dịch khá đa dạng giữa các bộ phận sản phẩm. Bộ phận Produce có số lượng giao dịch cao nhất, theo sau là Snack FoodsHousehold. Một số bộ phận khác như Frozen Foods, Baking Goods, và Canned Foods cũng có lượng giao dịch đáng kể. Ngược lại, các bộ phận như Carousel, Checkout, và Meat có số lượng giao dịch thấp hơn nhiều.

2.2.1.10 Biến Product Category

Lập bảng tần số và tần suất

#Bảng tần số
table(data$ProductCategory)
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##                  484                  365                  356 
##                Bread      Breakfast Foods              Candles 
##                  425                  417                   45 
##                Candy     Canned Anchovies         Canned Clams 
##                  352                   44                   53 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##                   35                   40                   38 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##                  404                   87                  154 
##    Cleaning Supplies        Cold Remedies                Dairy 
##                  189                   93                  903 
##        Decongestants               Drinks                 Eggs 
##                   85                  135                  198 
##           Electrical      Frozen Desserts       Frozen Entrees 
##                  355                  323                  118 
##                Fruit             Hardware        Hot Beverages 
##                  765                  129                  226 
##              Hygiene     Jams and Jellies     Kitchen Products 
##                  197                  588                  217 
##            Magazines                 Meat        Miscellaneous 
##                  202                  761                   42 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##                   48                  192                  345 
##                Pizza     Plastic Products Pure Juice Beverages 
##                  194                  141                  165 
##              Seafood          Side Dishes          Snack Foods 
##                  102                  153                 1600 
##            Specialty        Starchy Foods           Vegetables 
##                  289                  277                 1728
#Bảng tần suất
table(data$ProductCategory)/sum(table(data$ProductCategory))
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##          0.034426346          0.025962017          0.025321858 
##                Bread      Breakfast Foods              Candles 
##          0.030229746          0.029660716          0.003200797 
##                Candy     Canned Anchovies         Canned Clams 
##          0.025037343          0.003129668          0.003769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##          0.002489508          0.002845153          0.002702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##          0.028736041          0.006188207          0.010953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##          0.013443346          0.006614980          0.064229319 
##        Decongestants               Drinks                 Eggs 
##          0.006045949          0.009602390          0.014083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##          0.025250729          0.022974607          0.008393200 
##                Fruit             Hardware        Hot Beverages 
##          0.054413543          0.009175617          0.016075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##          0.014012376          0.041823743          0.015434953 
##            Magazines                 Meat        Miscellaneous 
##          0.014368020          0.054129028          0.002987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##          0.003414183          0.013656732          0.024539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##          0.013798990          0.010029163          0.011736254 
##              Seafood          Side Dishes          Snack Foods 
##          0.007255139          0.010882709          0.113806103 
##            Specialty        Starchy Foods           Vegetables 
##          0.020556227          0.019702682          0.122910591

Vẽ đồ thị

library(ggplot2)
library(dplyr)
library(patchwork)

# Giả sử 'data' là data frame của bạn
category_counts <- data %>%
  group_by(ProductCategory) %>%
  summarise(n = n()) %>%
  arrange(n) # Sắp xếp theo số lượng để chia

n_categories <- nrow(category_counts)
mid_point <- ceiling(n_categories / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa đầu theo số lượng)
category_counts_1 <- head(category_counts, mid_point)

plot1_cat <- ggplot(category_counts_1, aes(x = ProductCategory, y = n)) +
  geom_col(fill = "#FFA07A", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
  labs(x = "Product Category", y = "Number") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))

# Dữ liệu cho biểu đồ thứ hai (nửa sau theo số lượng)
category_counts_2 <- tail(category_counts, n_categories - mid_point)

plot2_cat <- ggplot(category_counts_2, aes(x = ProductCategory, y = n)) +
  geom_col(fill = "#FFA07A", color = "black") +
  geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
  labs(x = "Product Category", y = "Number") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))

# Kết hợp hai biểu đồ lại với nhau
plot1_cat + plot2_cat

Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được là:

Các danh mục sản phẩm có số lượng giao dịch rất lớn:

  • Produce: Ghi nhận số lượng giao dịch cao nhất với 1994 giao dịch, chiếm khoảng 14.18% tổng số giao dịch.
  • Vegetables: Đứng thứ hai với 1728 giao dịch, chiếm khoảng 12.29%.
  • Snack Foods: Đứng thứ ba với 1600 giao dịch, chiếm khoảng 11.38%.
  • Household: Có 1420 giao dịch, chiếm khoảng 10.10%.
  • Frozen Foods: Có 1382 giao dịch, chiếm khoảng 9.83%.
  • Baking Goods: Có 1072 giao dịch, chiếm khoảng 7.63%.
  • Canned Foods: Có 977 giao dịch, chiếm khoảng 6.95%.
  • Dairy: Có 903 giao dịch, chiếm khoảng 6.42%.

Các danh mục sản phẩm có số lượng giao dịch trung bình:

  • Fruit: Có 765 giao dịch, chiếm khoảng 5.44%.
  • Meat: Có 761 giao dịch, chiếm khoảng 5.41%.
  • Jams and Jellies: Có 588 giao dịch, chiếm khoảng 4.18%.
  • Bread: Có 425 giao dịch, chiếm khoảng 3.02%.
  • Breakfast Foods: Có 417 giao dịch, chiếm khoảng 2.97%.
  • Bathroom Products: Có 365 giao dịch, chiếm khoảng 2.60%.
  • Alcoholic Beverages: Có 356 giao dịch, chiếm khoảng 2.53%.
  • Electrical: Có 355 giao dịch, chiếm khoảng 2.52%.
  • Candy: Có 352 giao dịch, chiếm khoảng 2.50%.
  • Paper Products: Có 345 giao dịch, chiếm khoảng 2.45%.
  • Frozen Desserts: Có 323 giao dịch, chiếm khoảng 2.30%.
  • Specialty: Có 289 giao dịch, chiếm khoảng 2.06%.
  • Starchy Foods: Có 277 giao dịch, chiếm khoảng 1.97%.
  • Hot Beverages: Có 226 giao dịch, chiếm khoảng 1.61%.
  • Kitchen Products: Có 217 giao dịch, chiếm khoảng 1.54%.
  • Magazines: Có 202 giao dịch, chiếm khoảng 1.44%.
  • Eggs: Có 198 giao dịch, chiếm khoảng 1.41%.
  • Hygiene: Có 197 giao dịch, chiếm khoảng 1.40%.
  • Pizza: Có 194 giao dịch, chiếm khoảng 1.38%.
  • Pain Relievers: Có 192 giao dịch, chiếm khoảng 1.37%.
  • Cleaning Supplies: Có 189 giao dịch, chiếm khoảng 1.34%.
  • Drinks: Có 135 giao dịch, chiếm khoảng 0.96%.
  • Hardware: Có 129 giao dịch, chiếm khoảng 0.92%.
  • Pure Juice Beverages: Có 165 giao dịch, chiếm khoảng 1.17%.
  • Carbonated Beverages: Có 154 giao dịch, chiếm khoảng 1.10%.
  • Side Dishes: Có 153 giao dịch, chiếm khoảng 1.09%.
  • Plastic Products: Có 141 giao dịch, chiếm khoảng 1.00%.

Các danh mục sản phẩm có số lượng giao dịch thấp:

  • Seafood: Có 102 giao dịch, chiếm khoảng 0.73%.
  • Cold Remedies: Có 93 giao dịch, chiếm khoảng 0.66%.
  • Canned Tuna: Có 87 giao dịch, chiếm khoảng 0.62%.
  • Decongestants: Có 85 giao dịch, chiếm khoảng 0.60%.
  • Canned Clams: Có 53 giao dịch, chiếm khoảng 0.38%.
  • Packaged Vegetables: Có 48 giao dịch, chiếm khoảng 0.34%.
  • Candles: Có 45 giao dịch, chiếm khoảng 0.32%.
  • Miscellaneous: Có 42 giao dịch, chiếm khoảng 0.30%.
  • Canned Anchovies: Có 44 giao dịch, chiếm khoảng 0.31%.
  • Canned Shrimp: Có 38 giao dịch, chiếm khoảng 0.27%.
  • Canned Sardines: Có 40 giao dịch, chiếm khoảng 0.28%.
  • Canned Oysters: Có 35 giao dịch, chiếm khoảng 0.25%.

Tổng quan:

Phân tích cho thấy sự phân bố giao dịch rất khác nhau giữa các danh mục sản phẩm. Các danh mục như Produce, Vegetables, Snack Foods, Household, và Frozen Foods có số lượng giao dịch cao nhất, cho thấy đây là những nhóm sản phẩm phổ biến nhất. Ngược lại, nhiều danh mục khác có số lượng giao dịch thấp hơn đáng kể, cho thấy mức độ quan tâm hoặc nhu cầu khác nhau từ phía khách hàng.

2.2.2 Phân tích các biến định lượng

2.2.2.1 Biến Children

Thống kê mô tả biến Children

Children <- summary(data$Children)
print(Children)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    1.00    3.00    2.53    4.00    5.00

Vẽ đồ thị

library(ggplot2)

ggplot(data, aes(x = factor(Children))) + # Chuyển sang factor để vẽ rời rạc
  geom_bar(fill = "skyblue", color = "black") +
  labs(
       x = "Số lượng con cái",
       y = "Số lượng khách hàng") +
  theme_bw() +
  geom_text(stat='count', aes(label=..count..), vjust=-0.5) # Thêm số lượng trên cột
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Dựa vào bảng thống kê mô tả cho và đồ thị ta có nhận xét như sau:

  • Giá trị nhỏ nhất (Min.): Số lượng con cái ít nhất là 0. Điều này cho thấy có những khách hàng không có con.
  • Tứ phân vị thứ nhất (1st Qu.): 25% khách hàng có số lượng con cái là 1 hoặc ít hơn.
  • Giá trị trung vị (Median): Giá trị ở giữa của phân bố là 3. Điều này có nghĩa là 50% khách hàng có số lượng con cái là 3 hoặc ít hơn.
    • Giá trị trung bình (Mean): Số lượng con cái trung bình là 2.53. Giá trị này thấp hơn giá trị trung vị, gợi ý rằng phân bố có thể hơi lệch trái, tức là có nhiều khách hàng có số lượng con cái ít hơn so với những người có số lượng con cái rất nhiều.
  • Tứ phân vị thứ ba (3rd Qu.): 75% khách hàng có số lượng con cái là 4 hoặc ít hơn.
  • Giá trị lớn nhất (Max.): Số lượng con cái nhiều nhất là 5.

Tóm lại:

Phân bố số lượng con cái của khách hàng tập trung chủ yếu trong khoảng từ 0 đến 4, với giá trị trung vị là 3. Giá trị trung bình (2.53) thấp hơn trung vị cho thấy sự hiện diện của nhiều khách hàng có ít con. Số lượng con cái dao động từ 0 đến 5 trong tập dữ liệu này.

2.2.2.2 Units Sold

Thống kê mô tả biến Units Sold

UnitsSold <- summary(data$UnitsSold)
print(UnitsSold)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   3.000   4.000   4.081   5.000   8.000

Vẽ đồ thị

library(ggplot2)

ggplot(data, aes(x = factor(UnitsSold))) + # Chuyển sang factor để vẽ rời rạc
  geom_bar(fill = "lightcoral", color = "black") +
  labs(
       x = "Số lượng đơn vị sản phẩm",
       y = "Số lượng giao dịch") +
  theme_bw() +
  geom_text(stat='count', aes(label=..count..), vjust=-0.5) # Thêm số lượng giao dịch trên cột

Dựa vào bảng thống kê mô tả cho và đồ thị ta có nhận xét như sau:

  • Giá trị nhỏ nhất (Min.): Số lượng đơn vị sản phẩm bán ra ít nhất trong một giao dịch là 1.
  • Tứ phân vị thứ nhất (1st Qu.): 25% giao dịch có số lượng đơn vị sản phẩm bán ra là 3 hoặc ít hơn.
  • Giá trị trung vị (Median): Giá trị ở giữa của phân bố là 4. Điều này có nghĩa là 50% giao dịch có số lượng đơn vị sản phẩm bán ra là 4 hoặc ít hơn.
  • Giá trị trung bình (Mean): Số lượng đơn vị sản phẩm bán ra trung bình trong một giao dịch là 4.081. Giá trị này hơi cao hơn giá trị trung vị, cho thấy phân bố có thể hơi lệch phải (đuôi bên phải dài hơn), có nghĩa là có một số giao dịch có số lượng đơn vị sản phẩm bán ra cao hơn đáng kể.
  • Tứ phân vị thứ ba (3rd Qu.): 75% giao dịch có số lượng đơn vị sản phẩm bán ra là 5 hoặc ít hơn.
  • Giá trị lớn nhất (Max.): Số lượng đơn vị sản phẩm bán ra nhiều nhất trong một giao dịch là 8.

Tóm lại:

Phân bố số lượng đơn vị sản phẩm bán ra trong các giao dịch tập trung chủ yếu trong khoảng từ 1 đến 5, với giá trị trung vị là 4. Giá trị trung bình (4.081) cao hơn một chút so với trung vị cho thấy có một vài giao dịch với số lượng lớn sản phẩm. Số lượng đơn vị sản phẩm bán ra dao động từ 1 đến 8 trong tập dữ liệu này.

2.2.2.3 Revenue

Thống kê mô tả biến Revenue

Revenue <- summary(data$Revenue)
print(Revenue)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.53    6.84   11.25   13.00   17.37   56.70

Vẽ đồ thị

ggplot(data, aes(x = Revenue)) +
  geom_histogram(binwidth = 1,
                 fill = "steelblue",
                 color = "black") +
  labs(
       x = "Doanh thu (USD)",
       y = "Số lượng giao dịch") +
  theme_bw()

Dựa vào bảng thống kê mô tả cho và đồ thị ta có nhận xét như sau:

  • Giá trị nhỏ nhất (Min.): Doanh thu thấp nhất từ một giao dịch là 0.53 USD.
  • Tứ phân vị thứ nhất (1st Qu.): 25% giao dịch có doanh thu là 6.84 USD hoặc thấp hơn.
  • Giá trị trung vị (Median): Mức doanh thu ở giữa của phân bố là 11.25 USD. Điều này có nghĩa là 50% giao dịch có doanh thu là 11.25 USD hoặc thấp hơn.
  • Giá trị trung bình (Mean): Doanh thu trung bình trên mỗi giao dịch là 13.00 USD. Giá trị này cao hơn giá trị trung vị, cho thấy phân bố doanh thu có thể hơi lệch phải (đuôi bên phải dài hơn), có nghĩa là có một số giao dịch có doanh thu rất cao kéo giá trị trung bình lên.
  • Tứ phân vị thứ ba (3rd Qu.): 75% giao dịch có doanh thu là 17.37 USD hoặc thấp hơn.
  • Giá trị lớn nhất (Max.): Doanh thu cao nhất từ một giao dịch là 56.70 USD.

Tóm lại:

Phân bố doanh thu từ các giao dịch tập trung chủ yếu trong khoảng từ 0.53 USD đến 17.37 USD, với mức doanh thu trung bình là 13.00 USD và giá trị trung vị là 11.25 USD. Sự khác biệt giữa giá trị trung bình và trung vị cho thấy có sự hiện diện của một số giao dịch có doanh thu cao hơn đáng kể. Doanh thu dao động từ 0.53 USD đến 56.70 USD trong tập dữ liệu này.

LS0tDQp0aXRsZTogIioqTmhp4buHbSBW4bulIDEqKiINCmF1dGhvcjogIk5ndXnhu4VuIEzDqiBUaGnDqm4gS2ltIg0Kb3V0cHV0Og0KIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyAqKlBI4bqmTiAxOiBUw5NNIFThuq5UIFPDgUNIKioNCg0KIyMgKipHaeG7m2kgdGhp4buHdSBjaHVuZyB24buBIHPDoWNoKiogICANCiAgQ3Xhu5FuIHPDoWNoICpHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWxzIFdpdGggRXhhbXBsZXMgaW4gUiogZG8gUGV0ZXIgSy4gRHVubiB2w6AgR29yZG9uIEsuIFNteXRoIMSR4buTbmcgdMOhYyBnaeG6oyBsw6AgbeG7mXQgdMOgaSBsaeG7h3UgZ2nhuqNuZyBk4bqheSB2w6AgdGhhbSBraOG6o28gdG/DoG4gZGnhu4duIHbhu4EgY8OhYyBtw7QgaMOsbmggdGjhu5FuZyBrw6osIHThuq1wIHRydW5nIMSR4bq3YyBiaeG7h3QgdsOgbyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdsOgIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNcykuIFbhu5tpIGPDoWNoIHRp4bq/cCBj4bqtbiB0aOG7sWMgdGnhu4VuLCBjdeG7kW4gc8OhY2gga+G6v3QgaOG7o3AgaMOgaSBow7JhIGdp4buvYSBsw70gdGh1eeG6v3QgdGjhu5FuZyBrw6osIGPDoWMgcGjGsMahbmcgcGjDoXAgc3V5IGx14bqtbiBoaeG7h24gxJHhuqFpLCB2w6AgbWluaCBo4buNYSBi4bqxbmcgZOG7ryBsaeG7h3UgdGjhu7FjIHThur8gY8O5bmcgY8OhYyDhu6luZyBk4bulbmcgdHJvbmcgcGjhuqduIG3hu4FtIFIuDQogIFbhu5tpIHRyaeG6v3QgbMO9IF8iVOG6pXQgY+G6oyBjw6FjIG3DtCBow6xuaCDEkeG7gXUgc2FpLCBuaMawbmcgbeG7mXQgc+G7kSBtw7QgaMOsbmggY8OzIMOtY2giXywgY3Xhu5FuIHPDoWNoIGtow7RuZyBjaOG7iSBjdW5nIGPhuqVwIGtp4bq/biB0aOG7qWMgdGjhu5FuZyBrw6oga+G7uSB0aHXhuq10LCBtw6AgY8OybiDEkeG7i25oIGjGsOG7m25nIG5nxrDhu51pIGjhu41jIHBow6F0IHRyaeG7g24gbsSDbmcgbOG7sWMgdMawIGR1eSBwaOG6o24gYmnhu4duIHbDoCDEkcOhbmggZ2nDoSBtw7QgaMOsbmggbeG7mXQgY8OhY2ggdGjhu7FjIHThur8gdsOgIGxpbmggaG/huqF0Lg0KICANCiAgDQojIyAqKk3hu6VjIHRpw6p1IHbDoCDEkeG7kWkgdMaw4bujbmcgY+G7p2Egc8OhY2gqKg0KDQogIE3hu6VjIHRpw6p1IGNow61uaCBj4bunYSBzw6FjaCBsw6AgZ2nDunAgbmfGsOG7nWkgaOG7jWMgcGjDoXQgdHJp4buDbiB0xrAgZHV5IG3DtCBow6xuaCBow7NhIHRo4buRbmcga8OqOiB04burIHZp4buHYyBoaeG7g3UgY+G6pXUgdHLDumMgdsOgIHZhaSB0csOyIGPhu6dhIG3DtCBow6xuaCwgY8OhY2ggZGnhu4VuIGdp4bqjaSBjw6FjIGjhu4cgc+G7kSBtw7QgaMOsbmgsIMSR4bq/biB2aeG7h2Mga2nhu4NtIHRyYSBnaeG6oyDEkeG7i25oLCBjaOG6qW4gxJFvw6FuIG3DtCBow6xuaCwgbOG7sWEgY2jhu41uIG3DtCBow6xuaCBwaMO5IGjhu6NwIHbDoCDEkcOhbmggZ2nDoSBoaeG7h3Ugc3XhuqV0LiBDdeG7kW4gc8OhY2ggxJHGsOG7o2MgdHLDrG5oIGLDoHkgdGhlbyBs4buRaSBk4bqrbiBk4bqvdCB0cuG7sWMgcXVhbiwgdGjGsOG7nW5nIHh1ecOqbiBz4butIGThu6VuZyBjw6FjIGJp4buDdSDEkeG7kyBtaW5oIGjhu41hIHbDoCBiw6BpIHRvw6FuIHRo4buxYyBow6BuaCDEkeG7gyBraHV54bq/biBraMOtY2ggbmfGsOG7nWkgaOG7jWMgdMawxqFuZyB0w6FjIHbhu5tpIGThu68gbGnhu4d1Lg0KICANCiAgQuG6r3QgxJHhuqd1IHThu6sgbmjhu69uZyBu4buBbiB04bqjbmcgY8ahIGLhuqNuIG5oxrAgdHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSwgbcO0IGjDrG5oIGjhu5NpIHF1eSDEkcahbiBnaeG6o24sIGNobyDEkeG6v24gY8OhYyBjaOG7pyDEkeG7gSBuw6JuZyBjYW8gbmjGsCBsw70gdGh1eeG6v3QgdGnhu4dtIGPhuq1uLCBtw7QgaMOsbmggcGjDom4gdMOhbiBow6BtIG3FqSwgdsOgIOG7qW5nIGThu6VuZyBHTE1zIGNobyBk4buvIGxp4buHdSBuaOG7iyBwaMOibiwgZOG7ryBsaeG7h3UgxJHhur9tIHbDoCBk4buvIGxp4buHdSBsacOqbiB04bulYyBkxrDGoW5nLCBzw6FjaCBjdW5nIGPhuqVwIG3hu5l0IGzhu5kgdHLDrG5oIGjhu41jIHThuq1wIMSR4bqneSDEkeG7pyB2w6AgbeG6oWNoIGzhuqFjLk5nb8OgaSByYSwgbeG7mXQgxJFp4buDbSBu4buVaSBi4bqtdCBj4bunYSB0w6BpIGxp4buHdSBsw6Agdmnhu4djIGNow7ogdHLhu41uZyDEkeG6v24gdmnhu4djIGNo4bqpbiDEkW/DoW4gbcO0IGjDrG5oIOKAkyBt4buZdCBr4bu5IG7Eg25nIHRoaeG6v3QgeeG6v3UgbmjGsG5nIHRoxrDhu51uZyBi4buLIHhlbSBuaOG6uSDigJMgdGjDtG5nIHF1YSB2aeG7h2MgcGjDom4gdMOtY2ggcGjhuqduIGTGsCwga2hv4bqjbmcgY8OhY2ggQ29vaywgYmnhu4N1IMSR4buTIFEtUSB2w6Agbmhp4buBdSBjw7RuZyBj4bulIMSRw6FuaCBnacOhIGtow6FjLg0KICANCiAgQ3Xhu5FuIHPDoWNoIMSR4bq3YyBiaeG7h3QgcGjDuSBo4bujcCBjaG8gc2luaCB2acOqbiB2w6AgaOG7jWMgdmnDqm4gY8OhYyBuZ8Ogbmgga2luaCB04bq/LCB5IHNpbmgsIGtob2EgaOG7jWMgeMOjIGjhu5lpLCBr4bu5IHRodeG6rXQ7IGPDoWMgbmjDoCBwaMOibiB0w61jaCBk4buvIGxp4buHdSwgbmjDoCBuZ2hpw6puIGPhu6l1IGhv4bq3YyBnaeG6o25nIHZpw6puIGPhuqduIG3hu5l0IHTDoGkgbGnhu4d1IGLDoGkgYuG6o24gdsOgIGPDsyBjaGnhu4F1IHPDonUgdsOgIG5o4buvbmcgbmfGsOG7nWkgc+G7rSBk4bulbmcgUiBuaMawIG3hu5l0IGPDtG5nIGPhu6UgY2jDrW5oIMSR4buDIHjhu60gbMO9IHbDoCBtw7QgaMOsbmggaMOzYSBk4buvIGxp4buHdS4NCiAgDQotLS0NCg0KIyMgKipO4buZaSBkdW5nIGNow61uaCoqDQoNCiMjIyAqKkdp4bubaSB0aGnhu4d1IHbhu4EgbcO0IGjDrG5oIHRo4buRbmcga8OqKioNCiMjIyMgKipUw7NtIHThuq90IGzDvSB0aHV54bq/dCoqDQoNCkNoxrDGoW5nIMSR4bqndSB0acOqbiDEkcOzbmcgdmFpIHRyw7IgxJHhu4tuaCBoxrDhu5tuZyBjaG8gdG/DoG4gYuG7mSBu4buZaSBkdW5nIGPhu6dhIG3DtG4gaOG7jWMgdsOgIGN1bmcgY+G6pXAgbuG7gW4gdOG6o25nIHRyaSB0aOG7qWMgduG7gSBjw6FjaCBoaeG7g3UgdsOgIHjhu60gbMO9IGThu68gbGnhu4d1IHRyb25nIGLhu5FpIGPhuqNuaCB0aOG7kW5nIGvDqiBoaeG7h24gxJHhuqFpLiBUaMO0bmcgcXVhIHZp4buHYyBnaeG7m2kgdGhp4buHdSBraMOhaSBuaeG7h20gbcO0IGjDrG5oIGjhu5NpIHF1eSwgY2jGsMahbmcgbsOgeSBraMO0bmcgY2jhu4kgeMOieSBk4buxbmcga2nhur9uIHRo4bupYyBjxINuIGLhuqNuIG3DoCBjw7JuIGzDoG0gcsO1IHTGsCBkdXkgdGjhu5FuZyBrw6ogY+G6p24gdGhp4bq/dCBraGkgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdGjhu7FjIHThur8uDQpOZ8aw4budaSDEkeG7jWMgxJHGsOG7o2MgZOG6q24gZOG6r3QgdsOgbyBjw6FjaCB0aeG6v3AgY+G6rW4gdGjhu7FjIGjDoG5oLCBuxqFpIGThu68gbGnhu4d1IGx1w7RuIHBo4bupYyB04bqhcCB2w6Aga2jDtG5nIHR1w6JuIHRoZW8gY8OhYyBnaeG6oyDEkeG7i25oIGzDvSB0xrDhu59uZy4gRG8gxJHDsywgY2jGsMahbmcgMSDEkeG6t3QgbuG7gW4gbcOzbmcgduG7gSB0cmnhur90IGzDvSBtw7QgaMOsbmggaMOzYSwgdOG6p20gcXVhbiB0cuG7jW5nIGPhu6dhIG3hu6VjIHRpw6p1IHBow6JuIHTDrWNoLCBjxaluZyBuaMawIHPhu7EgxJHDoW5oIMSR4buVaSBnaeG7r2EgdMOtbmggY2jDrW5oIHjDoWMgdsOgIHTDrW5oIMSRxqFuIGdp4bqjbiB0cm9uZyB2aeG7h2MgeMOieSBk4buxbmcgbcO0IGjDrG5oLg0KDQpDaMawxqFuZyBuw6B5IGJhbyBn4buTbSBjw6FjIG7hu5lpIGR1bmcgdHLhu41uZyB0w6JtIHNhdToNCg0KKipHaeG7m2kgdGhp4buHdSB24buBIG3DtCBow6xuaCBo4buTaSBxdXkqKg0KDQotIE3DtCBow6xuaCBo4buTaSBxdXkgxJHhu4tuaCBsxrDhu6NuZyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGJp4bq/biBwaOG7pSB0aHXhu5ljIHbDoCBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAuDQotIENobyBwaMOpcCBk4buxIMSRb8OhbiBr4bq/dCBxdeG6oyB2w6AgxJHDoW5oIGdpw6Eg4bqjbmggaMaw4bufbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIGdp4bqjaSB0aMOtY2guDQotIFZp4buHYyB4w6J5IGThu7FuZyBtw7QgaMOsbmggY+G6p24gZ+G6r24gduG7m2kgaGnhu4N1IGJp4bq/dCB0aOG7sWMgdGnhu4VuIHbDoCBi4buRaSBj4bqjbmggY+G7pSB0aOG7gywga2jDtG5nIGNo4buJIGzDoCBiw6BpIHRvw6FuIHRvw6FuIGjhu41jLg0KDQoqKkRp4buFbiBnaeG6o2kgbcO0IGjDrG5oKioNCg0KLSBN4bulYyB0acOqdSBraMO0bmcgY2jhu4kgbMOgIGThu7EgxJFvw6FuIG3DoCBjw7JuIGzDoCBkaeG7hW4gZ2nhuqNpIMO9IG5naMSpYSBj4bunYSBjw6FjIGjhu4cgc+G7kSBo4buTaSBxdXkuDQotIEPhuqNuaCBiw6FvOiBraMO0bmcgdGjhu4Mgc3V5IGx14bqtbiBxdWFuIGjhu4cgbmjDom4gcXXhuqMgdOG7qyBuZ2hpw6puIGPhu6l1IHF1YW4gc8OhdCBu4bq/dSB0aGnhur91IGtp4buDbSBzb8OhdC4NCi0gROG6q24gY2jhu6luZyBjw6J1IG7Ds2kgY+G7p2EgR2VvcmdlIEJveDogIA0KICA+ICrigJxU4bqldCBj4bqjIGPDoWMgbcO0IGjDrG5oIMSR4buBdSBzYWksIG5oxrBuZyBt4buZdCBz4buRIG3DtCBow6xuaCBo4buvdSDDrWNoLuKAnSoNCg0KKipN4bulYyB0acOqdSBwaMOibiB0w61jaCDEkeG7i25oIGjDrG5oIG3DtCBow6xuaCoqDQoNCi0gTcO0IGjDrG5oIGdp4bqjaSB0aMOtY2ggY+G6p24gcsO1IHLDoG5nLCBk4buFIGhp4buDdS4NCi0gTcO0IGjDrG5oIGThu7EgYsOhbyB04bqtcCB0cnVuZyB2w6BvIMSR4buZIGNow61uaCB4w6FjLg0KLSBWaeG7h2MgeMOhYyDEkeG7i25oIG3hu6VjIHRpw6p1IGdpw7pwIGzhu7FhIGNo4buNbiDEkcO6bmcgY+G6pXUgdHLDumMgbcO0IGjDrG5oIHbDoCB0acOqdSBjaMOtIMSRw6FuaCBnacOhLg0KDQoqKkPDom4gYuG6sW5nIGdp4buvYSDEkeG7mSBjaMOtbmggeMOhYyB2w6AgdMOtbmggdGnhur90IGtp4buHbSoqDQoNCi0gTcO0IGjDrG5oIHBo4bupYyB04bqhcCBk4buFIG92ZXJmaXQg4oCTIGto4bubcCB04buRdCB24bubaSBk4buvIGxp4buHdSBodeG6pW4gbHV54buHbiBuaMawbmcga8OpbSB04buVbmcgcXXDoXQgaMOzYS4NCi0gTcO0IGjDrG5oIMSRxqFuIGdp4bqjbiB0aMaw4budbmcg4buVbiDEkeG7i25oIGjGoW4gdsOgIGThu4UgdHJp4buDbiBraGFpIHRyb25nIHRo4buxYyB0aeG7hW4uDQotIEPhuqduIHTDrG0gxJFp4buDbSBjw6JuIGLhurFuZyBo4bujcCBsw70gZ2nhu69hIMSR4buZIGNow61uaCB4w6FjIHbDoCBraOG6oyBuxINuZyDDoXAgZOG7pW5nLg0KDQoqKlRo4buxYyBuZ2hp4buHbSB2w6AgcXVhbiBzw6F0KioNCg0KLSAqKk5naGnDqm4gY+G7qXUgdGjhu7FjIG5naGnhu4dtKio6DQoNCiAgLSBDw7Mga2nhu4NtIHNvw6F0IHbDoCBwaMOibiBi4buVIG5n4bqrdSBuaGnDqm4uDQogIC0gQ2hvIHBow6lwIHN1eSBsdeG6rW4gbmjDom4gcXXhuqMuDQogIA0KLSAqKk5naGnDqm4gY+G7qXUgcXVhbiBzw6F0Kio6DQoNCiAgLSBE4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIHRo4bulIMSR4buZbmcsIGtow7RuZyBraeG7g20gc2/DoXQgYmnhur9uLg0KICAtIENo4buJIGNobyB0aOG6pXkgbeG7kWkgbGnDqm4gaOG7hywga2jDtG5nIGNo4bupbmcgbWluaCDEkcaw4bujYyBuaMOibiBxdeG6oy4NCg0KIyMjIyAqKuG7qG5nIGThu6VuZyB0cm9uZyBSKioNCg0KQ2jGsMahbmcgMSBnaeG7m2kgdGhp4buHdSBk4buvIGxp4buHdSB2w60gZOG7pSAqbHVuZ2NhcCogdsOgIGPDoWMga2jDoWkgbmnhu4dtIHRo4buRbmcga8OqIGPGoSBi4bqjbi4gxJDhu5NuZyB0aOG7nWksIGNoxrDGoW5nIGjGsOG7m25nIGThuqtuIHPhu60gZOG7pW5nIFIgxJHhu4Mga2jDoW0gcGjDoSBk4buvIGxp4buHdSBiYW4gxJHhuqd1IHbhu5tpIGPDoWMgdGhhbyB0w6FjIG5oxrA6DQoNCi0gVOG6o2kgZOG7ryBsaeG7h3UgYuG6sW5nIGBsaWJyYXJ5KEdMTXNEYXRhKWAgdsOgIGBkYXRhKGx1bmdjYXApYC4NCi0gS2nhu4NtIHRyYSB0w6puIGJp4bq/biAoYG5hbWVzKClgKSwgY+G6pXUgdHLDumMgdsOgIG3DoyBow7NhIGJp4bq/biB54bq/dSB04buRIChgaGVhZCgpYCwgYGNvbnRyYXN0cygpYCkuDQotIFTDrW5oIGPDoWMgdGjhu5FuZyBrw6ogbcO0IHThuqMgbmjGsCDEkeG7mSBkw6BpLCB04buVbmcsIHRydW5nIGLDrG5oLCB0cnVuZyB24buLLCDEkeG7mSBs4buHY2ggY2h14bqpbiwgcGjGsMahbmcgc2FpIChgbGVuZ3RoKClgLCBgc3VtKClgLCBgbWVhbigpYCwgYG1lZGlhbigpYCwgYHNkKClgLCBgdmFyKClgKS4NCi0gVuG6vSBiaeG7g3UgxJHhu5MgcGjDom4gdMOhbiB2w6AgdMO5eSBjaOG7iW5oIMSR4buTIGjhu41hIHbhu5tpIGBwbG90KClgLCBgaWZlbHNlKClgLCBgcGNoYCwgYGxlZ2VuZGAuDQoNCkNoxrDGoW5nIHPhu60gZOG7pW5nIHLhu5luZyByw6NpIGPDoWMgaMOgbSBjxqEgYuG6o24gY+G7p2EgUiB0cm9uZyBtw7RpIHRyxrDhu51uZyBiYXNlIFIsIGvhur90IGjhu6NwIHbhu5tpIGfDs2kgYEdMTXNEYXRhYCDEkeG7gyB04bqjaSBk4buvIGxp4buHdSwgbmjhurFtIGjhu5cgdHLhu6MgbmfGsOG7nWkgxJHhu41jIGzDoG0gcXVlbiB24bubaSB0aGFvIHTDoWMgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgYmFuIMSR4bqndS4NCg0KIyMjICoqTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oKioNCiMjIyMgKipUw7NtIHThuq90IGzDvSB0aHV54bq/dCoqDQoNCkNoxrDGoW5nIG7DoHkgbeG7nyDEkeG6p3UgYuG6sW5nIHZp4buHYyBnaeG7m2kgdGhp4buHdSBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggbmjGsCBt4buZdCBjw7RuZyBj4bulIMSR4buDIG3DtCB04bqjIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbeG7mXQgYmnhur9uIHBo4bulIHRodeG7mWMgKGJp4bq/biBwaOG6o24gaOG7k2kpIHbDoCBt4buZdCBob+G6t2Mgbmhp4buBdSBiaeG6v24gxJHhu5ljIGzhuq1wIChiaeG6v24gZ2nhuqNpIHRow61jaCkuIMOdIHTGsOG7n25nIGPhu5F0IGzDtWkgbMOgIG3DtCBow6xuaCBow7NhIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgYmnhur9uIHBo4bqjbiBo4buTaSBkxrDhu5tpIGThuqFuZyBt4buZdCB04buVIGjhu6NwIHR1eeG6v24gdMOtbmggY+G7p2EgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaC4gU2FpIHPhu5EgKHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBxdWFuIHPDoXQgdsOgIGdpw6EgdHLhu4sgZOG7sSBiw6FvKSDEkcaw4bujYyBnaeG6oyDEkeG7i25oIGzDoCBuZ+G6q3Ugbmhpw6puLCBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4gdsOgIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpLg0KDQpO4buZaSBkdW5nIGNow61uaCBj4bunYSBjaMawxqFuZyBiYW8gZ+G7k206DQoNCioqSOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHGoW4gZ2nhuqNuKioNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIMSRxqFuIGdp4bqjbiBtw7QgdOG6oyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3hu5l0IGJp4bq/biBwaOG7pSB0aHXhu5ljIFwoIFkgXCkgdsOgIG3hu5l0IGJp4bq/biDEkeG7mWMgbOG6rXAgXCggWCBcKToNCg0KJCQNCllfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIFhfaSArIFx2YXJlcHNpbG9uX2kNCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gXCggXGJldGFfMCBcKTogaOG7hyBz4buRIGNo4bq3biAoaW50ZXJjZXB0KQ0KLSBcKCBcYmV0YV8xIFwpOiBo4buHIHPhu5EgZ8OzYyAoc2xvcGUpDQotIFwoIFx2YXJlcHNpbG9uX2kgXCk6IHNhaSBz4buRIG5n4bqrdSBuaGnDqm4NCg0KQ8OhYyBo4buHIHPhu5EgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGLhurFuZyBwaMawxqFuZyBwaMOhcCBiw6xuaCBwaMawxqFuZyB04buRaSB0aGnhu4N1IChPTFMpIG5o4bqxbSB04buRaSB0aGnhu4N1IGjDs2E6DQoNCiQkDQpcc3VtX3tpPTF9Xm4gKFlfaSAtIFxoYXR7WX1faSleMg0KJCQNCg0KKipI4buTaSBxdXkgdHV54bq/biB0w61uaCDEkWEgYmnhur9uKioNCg0KS2hpIGPDsyBuaGnhu4F1IGJp4bq/biBnaeG6o2kgdGjDrWNoLCBtw7QgaMOsbmggxJHGsOG7o2MgbeG7nyBy4buZbmcgdsOgIGJp4buDdSBkaeG7hW4gZMaw4bubaSBk4bqhbmcgbWEgdHLhuq1uOg0KDQokJA0KXG1hdGhiZntZfSA9IFxtYXRoYmZ7WH0gXGJvbGRzeW1ib2x7XGJldGF9ICsgXGJvbGRzeW1ib2x7XHZhcmVwc2lsb259DQokJA0KDQpUcm9uZyDEkcOzOg0KDQotIFwoIFxtYXRoYmZ7WX0gXCk6IHZlY3RvciBwaOG6o24gaOG7k2kgKFwobiBcdGltZXMgMVwpKQ0KLSBcKCBcbWF0aGJme1h9IFwpOiBtYSB0cuG6rW4gdGhp4bq/dCBr4bq/IChcKG4gXHRpbWVzIHBcKSkNCi0gXCggXGJvbGRzeW1ib2x7XGJldGF9IFwpOiB2ZWN0b3IgaOG7hyBz4buRIChcKHAgXHRpbWVzIDFcKSkNCi0gXCggXGJvbGRzeW1ib2x7XHZhcmVwc2lsb259IFwpOiB2ZWN0b3Igc2FpIHPhu5ENCg0KQ8O0bmcgdGjhu6ljIMaw4bubYyBsxrDhu6NuZyBo4buHIHPhu5EgaOG7k2kgcXV5Og0KDQokJA0KXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19ID0gKFxtYXRoYmZ7WH1eXHRvcCBcbWF0aGJme1h9KV57LTF9IFxtYXRoYmZ7WH1eXHRvcCBcbWF0aGJme1l9DQokJA0KDQoqKsav4bubYyBsxrDhu6NuZyBzYWkgc+G7kSB2w6AgxJHDoW5oIGdpw6EgbcO0IGjDrG5oKioNCg0KTeG7mXQgc+G7kSDEkeG6oWkgbMaw4bujbmcgdGjhu5FuZyBrw6ogcXVhbiB0cuG7jW5nOg0KDQotIMav4bubYyBsxrDhu6NuZyBwaMawxqFuZyBzYWkgc2FpIHPhu5E6ICANCiAgJCQNCiAgXGhhdHtcc2lnbWF9XjIgPSBcZnJhY3sxfXtuIC0gcH0gXHN1bSAoWV9pIC0gXGhhdHtZfV9pKV4yDQogICQkDQotIFNhaSBz4buRIGNodeG6qW4gY+G7p2EgaOG7hyBz4buRDQotIEtob+G6o25nIHRpbiBj4bqteSB2w6Aga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QNCg0KKipQaMOibiB0w61jaCBwaMawxqFuZyBzYWkgKEFOT1ZBKSoqDQoNClBow6JuIHTDrWNoIHBoxrDGoW5nIHNhaSBnacO6cCDEkcOhbmggZ2nDoSBtw7QgaMOsbmg6DQoNCi0gVOG7lW5nIHBoxrDGoW5nIHNhaTogIA0KICAkJA0KICBTU1QgPSBTU1IgKyBTU0UNCiAgJCQNCi0gVOG7tyBz4buRIGtp4buDbSDEkeG7i25oIEY6ICANCiAgJCQNCiAgRiA9IFxmcmFje1NTUiAvIChwIC0gMSl9e1NTRSAvIChuIC0gcCl9DQogICQkDQoNCk3hu6VjIHRpw6p1IGzDoCBraeG7g20gxJHhu4tuaCB4ZW0gbcO0IGjDrG5oIGPDsyBnaeG6o2kgdGjDrWNoIMSRxrDhu6NjIHBoxrDGoW5nIHNhaSB04buRdCBoxqFuIG3DtCBow6xuaCBraMO0bmcgYmnhur9uIGhheSBraMO0bmcuDQoNCioqU28gc8OhbmggbcO0IGjDrG5oIHbDoCBjw6FjIG5ndXnDqm4gdOG6r2MqKg0KDQotICoqTcO0IGjDrG5oIGzhu5NuZyBuaGF1Kio6IFNvIHPDoW5oIG3DtCBow6xuaCDEkcahbiBnaeG6o24gduG7m2kgbcO0IGjDrG5oIG3hu58gcuG7mW5nDQotICoqQU5PVkEgdHXhuqduIHThu7EqKjogWMOhYyDEkeG7i25oIHhlbSB2aeG7h2MgdGjDqm0gYmnhur9uIGPDsyBj4bqjaSB0aGnhu4duIMSRw6FuZyBr4buDIGhheSBraMO0bmcNCi0gKipOZ3V5w6puIHThuq9jIHjDonkgZOG7sW5nIG3DtCBow6xuaCBo4bujcCBsw70qKjoNCg0KICAtIEjhu5NpIHF1eSBzb25nIHNvbmcgKHBhcmFsbGVsIHJlZ3Jlc3Npb25zKQ0KICAtIE5ndXnDqm4gdOG6r2MgxJHhu5ljIGzhuq1wDQogIC0gTmd1ecOqbiB04bqvYyBiacOqbiAobWFyZ2luYWwgcHJpbmNpcGxlKQ0KDQojIyMjICoq4buobmcgZOG7pW5nIHRyb25nIFIqKg0KDQpDaMawxqFuZyAyIGdp4bubaSB0aGnhu4d1IGPDoWNoIHPhu60gZOG7pW5nIHBo4bqnbiBt4buBbSAqKlIqKiDEkeG7gyB4w6J5IGThu7FuZyB2w6AgcGjDom4gdMOtY2ggbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oLg0KDQotIEjDoG0gYGxtKClgIGTDuW5nIMSR4buDIMaw4bubYyBsxrDhu6NuZyBtw7QgaMOsbmguDQotIEjDoG0gYHN1bW1hcnkoKWAgaGnhu4NuIHRo4buLIGjhu4cgc+G7kSBo4buTaSBxdXksIHNhaSBz4buRIGNodeG6qW4sIFwoUl4yXCkgdsOgIGPDoWMgdGjhu5FuZyBrw6ogcXVhbiB0cuG7jW5nLg0KLSBT4butIGThu6VuZyBow6BtIGBhbm92YSgpYCB0aOG7sWMgaGnhu4duIHBow6JuIHTDrWNoIHBoxrDGoW5nIHNhaSwga2nhu4NtIHRyYSBz4buxIGPhuqNpIHRoaeG7h24ga2hpIHRow6ptIGJp4bq/biBnaeG6o2kgdGjDrWNoLg0KLSBDw6FjIGjDoG0gYHJlc2lkKClgLCBgcnN0YW5kYXJkKClgIGzhuqV5IHBo4bqnbiBkxrAgdsOgIHBo4bqnbiBkxrAgY2h14bqpbiBow7NhLg0KLSBDw6FjIMSR4buTIHRo4buLIG5oxrAgYHBsb3QoKWAsIGBxcW5vcm0oKWAsIGBxcWxpbmUoKWAgZ2nDunAgxJHDoW5oIGdpw6EgZ2nhuqMgxJHhu4tuaCBtw7QgaMOsbmggdsOgIHBow6F0IGhp4buHbiDEkWnhu4NtIG5nb+G6oWkgbOG7hy4NCi0gSMOgbSBgQUlDKClgIHTDrW5oIHRpw6p1IGNow60gQWthaWtlIMSR4buDIHNvIHPDoW5oIG3DtCBow6xuaCBk4buxYSB0csOqbiDEkeG7mSBwaOG7qWMgdOG6oXAgdsOgIMSR4buZIHBow7kgaOG7o3AuDQotIEjDoG0gYHN0ZXAoKWAgaOG7lyB0cuG7oyBjaOG7jW4gYmnhur9uIHThu7EgxJHhu5luZyBk4buxYSB0csOqbiB0acOqdSBjaMOtIEFJQy4NCg0KIyMjICoqQ2jhuqluIMSRb8OhbiB2w6AgeMOieSBk4buxbmcgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmgqKg0KIyMjIyAqKlTDs20gdOG6r3QgbMO9IHRodXnhur90KioNCg0KQ2jGsMahbmcgMyBt4bufIHLhu5luZyBraeG6v24gdGjhu6ljIHbhu4EgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGLhurFuZyBjw6FjaCB04bqtcCB0cnVuZyB2w6BvIGPDtG5nIHTDoWMgY2jhuqluIMSRb8OhbiBtw7QgaMOsbmgsIMSRw6FuaCBnacOhIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIHbhu5tpIGThu68gbGnhu4d1IHbDoCB4w6FjIMSR4buLbmggY8OhYyB24bqlbiDEkeG7gSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIMSR4buZIGNow61uaCB4w6FjIGhv4bq3YyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIEPDoWMgY8O0bmcgY+G7pSBwaMOibiB0w61jaCBwaOG6p24gZMawLCBsZXZlcmFnZSwgdsOgIGJp4buDdSDEkeG7kyBjaOG6qW4gxJFvw6FuIGdpw7pwIHjDoWMgxJHhu4tuaCBjw6FjIMSRaeG7g20gYuG6pXQgdGjGsOG7nW5nLCBz4buxIHZpIHBo4bqhbSBnaeG6oyDEkeG7i25oIHbDoCDEkcawYSByYSBnaeG6o2kgcGjDoXAgxJFp4buBdSBjaOG7iW5oLiBOZ2/DoGkgcmEsIGNoxrDGoW5nIGPFqW5nIHRyw6xuaCBiw6B5IGPDoWMg4bupbmcgZOG7pW5nIHRo4buxYyB04bq/IMSR4buDIG1pbmggaOG7jWEgcsO1IGPDoWNoIHPhu60gZOG7pW5nIG3DtCBow6xuaCBo4buTaSBxdXkgdHJvbmcgY8OhYyB0w6xuaCBodeG7kW5nIGPhu6UgdGjhu4MuDQoNCk7hu5lpIGR1bmcgY2jDrW5oIGJhbyBn4buTbToNCg0KKipUaGFuZyDEkW8gZOG7ryBsaeG7h3U6KiogDQpUw6FjIMSR4buZbmcgY+G7p2Ega2nhu4N1IHRoYW5nIMSRbyAodOG7tyBs4buHLCB0aOG7qSBi4bqtYywgZGFuaCBt4bulYykgdOG7m2kgdmnhu4djIHjDonkgZOG7sW5nIHbDoCBnaeG6o2kgdGjDrWNoIG3DtCBow6xuaC4NCg0KKipQaMOpcCB44bqlcCB44buJIHRyb25nIG3DtCBow6xuaCBow7NhOioqIA0KQ8OhYyDEkcahbiBnaeG6o24gaMOzYSBjw7MgY2jhu6cgxJHDrWNoIHRyb25nIHRo4buRbmcga8OqIHbDoCBuZ3V5IGPGoSBzYWkgbOG7h2NoLg0KDQoqKkxldmVyYWdlOioqIA0KxJDhuqFpIGzGsOG7o25nIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSDEkWnhu4NtIHF1YW4gc8OhdCB04bubaSBnacOhIHRy4buLIGThu7EgYsOhbywgY8O5bmcgduG7m2kgY8O0bmcgdGjhu6ljIMSR4bqhaSBz4buRIG1hIHRy4bqtbi4gQ8O0bmcgdGjhu6ljIG1hIHRy4bqtbiDEkeG7gyB0w61uaCBsZXZlcmFnZToNCg0KJCQNCmhfaSA9IFxtYXRoYmZ7eH1faV5cdG9wIChcbWF0aGJme1h9Xlx0b3AgXG1hdGhiZntYfSleey0xfSBcbWF0aGJme3h9X2kNCiQkDQoNCkdpw6EgdHLhu4sgbGV2ZXJhZ2UgY2FvIGPhuqNuaCBiw6FvIMSRaeG7g20gbmdv4bqhaSBsYWkgdGnhu4FtIG7Eg25nLg0KDQoqKlBo4bqnbiBkxrAgdsOgIGJp4buDdSDEkeG7kyBjaOG6qW4gxJFvw6FuOioqDQoNCi0gUGjhuqduIGTGsCBzbyB24bubaSBiaeG6v24gZ2nhuqNpIHRow61jaC4NCi0gUGFydGlhbCByZXNpZHVhbCBwbG90cy4NCi0gUGjhuqduIGTGsCBjaHXhuqluIGjDs2Egc28gduG7m2kgZ2nDoSB0cuG7iyBk4buxIGLDoW8uDQotIEJp4buDdSDEkeG7kyBR4oCTUSDEkeG7gyBraeG7g20gdHJhIHBow6JuIHBo4buRaSBjaHXhuqluIGPhu6dhIHBo4bqnbiBkxrAuDQotIEJp4buDdSDEkeG7kyBMYWcgduG7m2kgZOG7ryBsaeG7h3UgY2h14buXaSB0aOG7nWkgZ2lhbi4NCg0KKipQaMOibiBiaeG7h3QgcGjhuqduIGTGsCoqDQoNCioqUGjhuqduIGTGsCBjaHXhuqluIGjDs2EqKiB2w6AgKipwaOG6p24gZMawIHN0dWRlbnQgaMOzYSoqIGtow6FjIG5oYXUg4bufIGPDoWNoIMSRaeG7gXUgY2jhu4luaCBwaMawxqFuZyBzYWkuIFRyw6FuaCBuaOG6p20gbOG6q24gxJHhu4MgxJHGsGEgcmEgxJHDoW5oIGdpw6EgY2jDrW5oIHjDoWMgaMahbiB24buBIHF1YW4gc8OhdCBi4bqldCB0aMaw4budbmcuDQoNCioqQmnhu4duIHBow6FwIGto4bqvYyBwaOG7pWMga2hpIHZpIHBo4bqhbSBnaeG6oyDEkeG7i25oKiogQ8OhYyBwaMawxqFuZyBwaMOhcCB0aMaw4budbmcgZMO5bmcgYmFvIGfhu5NtOiANCg0KLSAqKkJp4bq/biDEkeG7lWkgYmnhur9uOioqIChsb2csIGPEg24gYuG6rWMgaGFpLCB2LnYuKSANCi0gKipUaMOqbSBiaeG6v24gbeG7m2k6KiogxJHhu4MgZ2nhuqNtIHBo4bqnbiBkxrAgY8OzIGjhu4cgdGjhu5FuZyANCi0gKipDaOG7jW4gbcO0IGjDrG5oIHRoYXkgdGjhur86KiogcGjDuSBo4bujcCBoxqFuICh2w60gZOG7pTogbcO0IGjDrG5oIHBoaSB0dXnhur9uKS4NCg0KIyMjIyAqKuG7qG5nIGThu6VuZyB0csOqbiBwaOG6p24gbeG7gW0gUioqDQoNCkNoxrDGoW5nIHPhu60gZOG7pW5nIHBo4bqnbiBt4buBbSBSIMSR4buDIG1pbmggaOG7jWEgY8OhYyBr4bu5IHRodeG6rXQgY2jhuqluIMSRb8OhbiB2w6AgeMOieSBk4buxbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIG5oxrAgc2F1Og0KDQotICoqQ8OhYyBow6BtIFIgdGnDqnUgY2h14bqpbjoqKg0KDQogIC0gYGxtKClgIMSR4buDIMaw4bubYyBsxrDhu6NuZyBtw7QgaMOsbmggaOG7k2kgcXV5Lg0KICAtIGBzdW1tYXJ5KClgIMSR4buDIHhlbSBr4bq/dCBxdeG6oyDGsOG7m2MgbMaw4bujbmcgY2hpIHRp4bq/dC4NCiAgLSBgYW5vdmEoKWAgdGjhu7FjIGhp4buHbiBwaMOibiB0w61jaCBwaMawxqFuZyBzYWkgdsOgIHNvIHPDoW5oIG3DtCBow6xuaCBs4buTbmcgbmhhdS4NCiAgLSBDw6FjIGjDoG0gcGjDom4gdMOtY2ggcGjhuqduIGTGsCB2w6AgY2jhuqluIMSRb8OhbjogYHJzdGFuZGFyZCgpYCwgYGNvb2tzLmRpc3RhbmNlKClgLCBgY292cmF0aW8oKWAsIGBkZmZpdHMoKWAsIGBkZmJldGFzKClgLg0KICAtIFbhur0gYmnhu4N1IMSR4buTIFEtUSB24bubaSBgcXFub3JtKClgIHbDoCBgcXFsaW5lKClgLg0KICAtIGBjb3IoKWAgxJHhu4MgdMOtbmggbWEgdHLhuq1uIHTGsMahbmcgcXVhbi4NCiAgLSDEkOG7kyBo4buNYSBjxqEgYuG6o246IGBwbG90KClgLCBgaW50ZXJhY3Rpb24ucGxvdCgpYC4NCiAgLSBT4butIGThu6VuZyBjw6FjIGjDoG0gYGV4dHJhY3RBSUMoKWAsIGBkcm9wMSgpYCwgYGFkZDEoKWAsIGBzdGVwKClgIMSR4buDIGNo4buNbiBtw7QgaMOsbmggZOG7sWEgdHLDqm4gQUlDIHbDoCBCSUMuDQogIC0gUGjhuqduIHbhu4EgUmVncmVzc2lvbiBTcGxpbmVzIHnDqnUgY+G6p3UgY8OgaSDEkeG6t3QgZ8OzaSBgc3BsaW5lc2AuDQogIC0gU+G7rSBk4bulbmcgY8OhYyBow6BtIG5oxrAgYHBvbHkoKWAsIGBucygpYCwgYGJzKClgIMSR4buDIHThuqFvIGPGoSBz4bufIHNwbGluZSwgZ2nDunAgbcO0IGjDrG5oIGjDs2EgcXVhbiBo4buHIHBoaSB0dXnhur9uLg0KDQojIyMgKipQaMawxqFuZyBwaMOhcCBo4bujcCBsw70gY+G7sWMgxJHhuqFpKioNCg0KIyMjIyAqKlTDs20gdOG6r3QgbMO9IHRodXnhur90KioNCg0KQ2jGsMahbmcgNCB04bqtcCB0cnVuZyBnaeG7m2kgdGhp4buHdSB2w6AgcGjDom4gdMOtY2ggcGjGsMahbmcgcGjDoXAgxrDhu5tjIGzGsOG7o25nIGto4bqjIG7Eg25nIGzhu5tuIG5o4bqldCAoTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRpb24gLSBNTEUpIHRyb25nIGtodcO0biBraOG7lSBNw7QgaMOsbmggSOG7k2kgcXV5IFThu5VuZyBxdcOhdCAoR2VuZXJhbGl6ZWQgTGluZWFyIE1vZGVscyAtIEdMTXMpLiANCg0KQ8OhYyBu4buZaSBkdW5nIGNow61uaCBiYW8gZ+G7k206DQoNCioqVOG7lW5nIHF1YW4gduG7gSBNTEU6KiogIA0KDQogIE1MRSB0w6xtIGLhu5kgdGhhbSBz4buRIFwoXGJvbGRzeW1ib2x7XGJldGF9XCkgc2FvIGNobyBow6BtIGto4bqjIG7Eg25nIFwoTChcYm9sZHN5bWJvbHtcYmV0YX0pID0gUChcdGV4dHtk4buvIGxp4buHdX0gXG1pZCBcYm9sZHN5bWJvbHtcYmV0YX0pXCkgxJHhuqF0IGPhu7FjIMSR4bqhaS4gIA0KICBDw7RuZyB0aOG7qWM6ICANCiAgXFsNCiAgXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19ID0gXGFyZyBcbWF4X3tcYm9sZHN5bWJvbHtcYmV0YX19IEwoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxhcmcgXG1heF97XGJvbGRzeW1ib2x7XGJldGF9fSBccHJvZF97aT0xfV5uIGYoeV9pIFxtaWQgXGJvbGRzeW1ib2x7XGJldGF9KQ0KICBcXQ0KICBob+G6t2MgdHJvbmcgdGjhu7FjIHThur8gdGjGsOG7nW5nIGTDuW5nIGxvZy1saWtlbGlob29kOiAgDQogIFxbDQogIFxlbGwoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxzdW1fe2k9MX1ebiBcbG9nIGYoeV9pIFxtaWQgXGJvbGRzeW1ib2x7XGJldGF9KQ0KICBcXQ0KDQoqKlTDrW5oIGNo4bqldCBj4bunYSDGsOG7m2MgbMaw4bujbmcgTUxFOioqICANCg0KICAtICpUw61uaCBuaOG6pXQgcXXDoW46KiBcKFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fSBceHJpZ2h0YXJyb3d7cH0gXGJvbGRzeW1ib2x7XGJldGF9XzBcKSBraGkgXChuIFx0byBcaW5mdHlcKS4gIA0KICAtICpQaMOibiBwaOG7kWkgdGnhu4dtIGPhuq1uIGNodeG6qW46KiAgDQogICAgXFsNCiAgICBcc3FydHtufShcaGF0e1xib2xkc3ltYm9se1xiZXRhfX0gLSBcYm9sZHN5bWJvbHtcYmV0YX1fMCkgXHhyaWdodGFycm93e2R9IFxtYXRoY2Fse059KDAsIEleey0xfShcYm9sZHN5bWJvbHtcYmV0YX1fMCkpDQogICAgXF0gIA0KICAgIHbhu5tpIFwoSShcYm9sZHN5bWJvbHtcYmV0YX1fMClcKSBsw6AgbWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyLiAgDQogIC0gKlTDrW5oIGhp4buHdSBxdeG6ozoqIE1MRSDEkeG6oXQgcGjGsMahbmcgc2FpIG5o4buPIG5o4bqldCB0cm9uZyBs4bubcCBjw6FjIMaw4bubYyBsxrDhu6NuZyBraMO0bmcgY2jhu4djaC4NCg0KKipN4bufIHLhu5luZyBzYW5nIMSRYSB0aGFtIHPhu5E6KiogIA0KICBW4bubaSBtw7QgaMOsbmggY8OzIG5oaeG7gXUgYmnhur9uIGdp4bqjaSB0aMOtY2gsIHRhIHThu5FpIMawdSBow6BtIGto4bqjIG7Eg25nIMSRYSBiaeG6v24gdGhlbyBcKFxib2xkc3ltYm9se1xiZXRhfSA9IChcYmV0YV8xLCBcYmV0YV8yLCBcbGRvdHMsIFxiZXRhX3ApXCkuDQoNCioqS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgZOG7sWEgdHLDqm4gTUxFOioqICANCg0KICAtIEtp4buDbSDEkeG7i25oIHRvw6BuIGPhu6VjOiAgDQogICAgXFsNCiAgICBIXzA6IFxib2xkc3ltYm9se1xiZXRhfSA9IFxtYXRoYmZ7MH0gXHF1YWQgXHRleHR7dnN9IFxxdWFkIEhfYTogXHRleHR7w610IG5o4bqldCBt4buZdCB9IFxiZXRhX2ogXG5lcSAwDQogICAgXF0NCiAgLSBLaeG7g20gxJHhu4tuaCBXYWxkOiAgDQogICAgXFsNCiAgICBXID0gKFxoYXR7XGJldGF9X2ogLyBcdGV4dHtTRX0oXGhhdHtcYmV0YX1faikpXjIgXHNpbSBcY2hpXjJfMQ0KICAgIFxdDQogIC0gS2nhu4NtIMSR4buLbmggbGlrZWxpaG9vZCByYXRpbyAoTFIpOiAgDQogICAgXFsNCiAgICBMUiA9IDJbXGVsbChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX0pIC0gXGVsbChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX1fMCldIFxzaW0gXGNoaV4yX3ENCiAgICBcXQ0KICAgIHbhu5tpIFwocVwpIGzDoCBz4buRIHRoYW0gc+G7kSBi4buLIGxv4bqhaSBi4buPIGTGsOG7m2kgXChIXzBcKS4NCg0KKipYw6J5IGThu7FuZyBraG/huqNuZyB0aW4gY+G6rXk6KiogIA0KICBLaG/huqNuZyB0aW4gY+G6rXkgY2hvIFwoXGJldGFfalwpIHRoxrDhu51uZyBk4buxYSB0csOqbiBwaMOibiBwaOG7kWkgY2h14bqpbiB0aeG7h20gY+G6rW46ICANCiAgXFsNCiAgXGhhdHtcYmV0YX1faiBccG0gel97XGFscGhhLzJ9IFxjZG90IFx0ZXh0e1NFfShcaGF0e1xiZXRhfV9qKQ0KICBcXQ0KDQoqKlRpw6p1IGNow60gbOG7sWEgY2jhu41uIG3DtCBow6xuaDoqKiANCg0KICAtIEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24gKEFJQyk6ICANCiAgICBcWw0KICAgIFx0ZXh0e0FJQ30gPSAtMlxlbGwoXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19KSArIDJrDQogICAgXF0NCiAgICB24bubaSBcKGtcKSBsw6Agc+G7kSB0aGFtIHPhu5EgbcO0IGjDrG5oLiAgDQogIC0gQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChCSUMpOiAgDQogICAgXFsNCiAgICBcdGV4dHtCSUN9ID0gLTJcZWxsKFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fSkgKyBrIFxsb2cgbg0KICAgIFxdDQogICAgdHJvbmcgxJHDsyBcKG5cKSBsw6Aga8OtY2ggdGjGsOG7m2MgbeG6q3UuDQoNCkNoxrDGoW5nIDQgbMOgIG7hu4FuIHThuqNuZyBsw70gdGh1eeG6v3QgcXVhbiB0cuG7jW5nLCBt4bufIHLhu5luZyB04burIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHNhbmcgY8OhYyBtw7QgaMOsbmggcGjhu6ljIHThuqFwIGjGoW4gdGjDtG5nIHF1YSBNTEUuDQoNCiMjIyMgKirhu6huZyBk4bulbmcgdHLDqm4gcGjhuqduIG3hu4FtIFIqKg0KDQpN4bq3YyBkw7kgQ2jGsMahbmcgNCBraMO0bmcgdHLDrG5oIGLDoHkgY2hpIHRp4bq/dCBtw6MgUiBoYXkgY8OhYyBnw7NpIFIsIHZp4buHYyDhu6luZyBk4bulbmcgY8OhYyBr4bu5IHRodeG6rXQgdsOgIG3DtCBow6xuaCB0cm9uZyBjaMawxqFuZyBuw6B5IMSRxrDhu6NjIHRo4buxYyBoaeG7h24gcGjhu5UgYmnhur9uIHRyb25nIFIgdGjDtG5nIHF1YToNCg0KLSAqKkjDoG0gYGdsbSgpYCB0cm9uZyBiYXNlIFI6KiogxJDDonkgbMOgIGjDoG0gY2jDrW5oIMSR4buDIMaw4bubYyBsxrDhu6NuZyBjw6FjIE3DtCBow6xuaCBI4buTaSBxdXkgVOG7lW5nIHF1w6F0IChHTE1zKSwgYmFvIGfhu5NtIGPDoWMgbcO0IGjDrG5oIHPhu60gZOG7pW5nIHBoxrDGoW5nIHBow6FwIE1MRS4gS2jDtG5nIGPhuqduIGPDoGkgdGjDqm0gZ8OzaSBuZ2/DoGkga2hpIHPhu60gZOG7pW5nIGPDoWMgbcO0IGjDrG5oIEdMTSBjxqEgYuG6o24uDQogIA0KLSAqKkPDoWMgZ8OzaSBSIGLhu5UgdHLhu6MgY2hvIEdMTXMgbsOibmcgY2FvOioqIFbDrSBk4bulLCB0cm9uZyBjw6FjIGNoxrDGoW5nIHNhdSAobmjGsCBDaMawxqFuZyA5LCBDaMawxqFuZyAxMCksIGfDs2kgYE1BU1NgIMSRxrDhu6NjIGTDuW5nIMSR4buDIHBow6JuIHTDrWNoIGPDoWMgbcO0IGjDrG5oIEdMTSBj4bulIHRo4buDIG5oxrAgR0xNIE5o4buLIHRo4bupYyAoYmlub21pYWwpIHbDoCBHTE0gTmjhu4sgdGjhu6ljIMOibSAobmVnYXRpdmUgYmlub21pYWwpIHbhu5tpIGjDoG0gYGdsbS5uYigpYCB2w6AgY8OhYyBjw7RuZyBj4bulIGjhu5cgdHLhu6MgbmjGsCBgZG9zZS5wKClgLg0KICANClTDs20gbOG6oWksIENoxrDGoW5nIDQgxJHDs25nIHZhaSB0csOyIGdp4bubaSB0aGnhu4d1IGPGoSBz4bufIGzDvSB0aHV54bq/dCBj4bunYSBwaMawxqFuZyBwaMOhcCBNTEUgdHJvbmcgR0xNcywgY8OybiB2aeG7h2MgdGjhu7FjIGjDoG5oIHbDoCB0cmnhu4NuIGtoYWkgY8OhYyBtw7QgaMOsbmggZOG7sWEgdHLDqm4gTUxFIHRyb25nIFIgxJHGsOG7o2MgdGjhu4MgaGnhu4duIHRyb25nIGPDoWMgY2jGsMahbmcgdGnhur9wIHRoZW8gduG7m2kgaMOgbSBgZ2xtKClgIHbDoCBjw6FjIGfDs2kgY2h1ecOqbiBk4bulbmcuDQoNCg0KIyMjICoqTcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0IChHTE1zKTogQ+G6pXUgdHLDumMqKg0KDQojIyMjICoqVMOzbSB04bqvdCBsw70gdGh1eeG6v3QqKg0KQ2jGsMahbmcgNSB04bqtcCB0cnVuZyBnaeG7m2kgdGhp4buHdSBjw6FjIE3DtCBow6xuaCBQaMOibiB0w6FuIFRoZW8gSMOgbSBNxakgKEV4cG9uZW50aWFsIERpc3BlcnNpb24gTW9kZWxzIC0gRURNcyksIG7hu4FuIHThuqNuZyBsw70gdGh1eeG6v3QgcXVhbiB0cuG7jW5nIGNobyBNw7QgaMOsbmggVHV54bq/biB0w61uaCBU4buVbmcgcXXDoXQgKEdlbmVyYWxpemVkIExpbmVhciBNb2RlbHMgLSBHTE1zKS4gDQoNCk7hu5lpIGR1bmcgY2jDrW5oIGPhu6dhIGNoxrDGoW5nIGJhbyBn4buTbQ0KDQoqKsSQ4buLbmggbmdoxKlhIGPDoWMgcGjDom4gcGjhu5FpIEVETSAoRXhwb25lbnRpYWwgRGlzcGVyc2lvbiBNb2RlbHMpOioqICANCiAgQ2jGsMahbmcgbcO0IHThuqMgY8OhYyBwaMOibiBwaOG7kWkgcGjhu5UgYmnhur9uIG5oxrAgQ2h14bqpbiwgTmjhu4sgdGjhu6ljLCBOaOG7iyB0aOG7qWMgw4JtLCBQb2lzc29uLCBHYW1tYSwgSW52ZXJzZSBHYXVzc2lhbiwgVHdlZWRpZS4gTeG7l2kgcGjDom4gcGjhu5FpIMSRxrDhu6NjIMSR4bq3YyB0csawbmcgYuG7n2kgY8OhYyB0aMOgbmggcGjhuqduIHF1YW4gdHLhu41uZyBzYXU6IA0KICANCiAgLSBIw6BtIHBoxrDGoW5nIHNhaSBcKCBWKFxtdSkgXCkgIA0KICAtIEjDoG0gdMOtY2ggbMWpeSBcKCBca2FwcGEoXHRoZXRhKSBcKSAgDQogIC0gVGhhbSBz4buRIGNow61uaCB04bqvYyBcKCBcdGhldGEgXCkgIA0KICAtIFRoYW0gc+G7kSBwaMOibiB0w6FuIFwoIFxwaGkgXCkgIA0KICAtIMSQ4buZIGzhu4djaCDEkcahbiB24buLIFwoIGQoeSwgXG11KSBcKQ0KDQoqKsSQ4buZIGzhu4djaCAoRGV2aWFuY2UpOioqICANCiAgTMOgIHRoxrDhu5tjIMSRbyBkw7luZyDEkeG7gyDEkcOhbmggZ2nDoSBt4bupYyDEkeG7mSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCB24bubaSBk4buvIGxp4buHdSBxdWFuIHPDoXQsIMSRaeG7gXUgY2jhu4luaCB0aGVvIMSR4bq3YyDEkWnhu4NtIHThu6tuZyBwaMOibiBwaOG7kWkgdHJvbmcgR0xNcy4NCg0KKirEkOG7mSBs4buHY2ggxJHGoW4gduG7iyAoVW5pdCBEZXZpYW5jZSk6KiogIA0KICDEkG8gc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGdpw6EgdHLhu4sgcXVhbiBzw6F0IFwoIHkgXCkgdsOgIGdpw6EgdHLhu4sgZOG7sSBiw6FvIFwoIFxtdSBcKSwgduG7m2kgY8O0bmcgdGjhu6ljIGNodW5nIHTDuXkgdGh14buZYyBwaMOibiBwaOG7kWkuIFbDrSBk4bulLCB0cm9uZyBwaMOibiBwaOG7kWkgR2FtbWEsIMSR4buZIGzhu4djaCBjw7MgZOG6oW5nOiAgDQogIFxbDQogIGQoeSwgXG11KSA9IDIgXGxlZnQoIFxmcmFje3kgLSBcbXV9e1xtdX0gLSBcbG9nXGZyYWN7eX17XG11fSBccmlnaHQpDQogIFxdDQoNCioqxq/hu5tjIGzGsOG7o25nIHjhuqVwIHjhu4kgU2FkZGxlcG9pbnQ6KiogIA0KICBL4bu5IHRodeG6rXQgdG/DoW4gaOG7jWMgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgeOG6pXAgeOG7iSBwaMOibiBwaOG7kWkgY+G7p2EgY8OhYyB0aOG7kW5nIGvDqiBwaOG7qWMgdOG6oXAgdHJvbmcgR0xNcywgZ2nDunAgbsOibmcgY2FvIMSR4buZIGNow61uaCB4w6FjIGPhu6dhIGtp4buDbSDEkeG7i25oIHbDoCDGsOG7m2MgbMaw4bujbmcuDQoNCioqVGjDoG5oIHBo4bqnbiBo4buHIHRo4buRbmcgdHJvbmcgR0xNczoqKiAgDQoNCiAgLSAqKlBo4bqnbiB0dXnhur9uIHTDrW5oIChMaW5lYXIgcHJlZGljdG9yKToqKiAgDQogICAgXFsNCiAgICBcZXRhID0gXG1hdGhiZntYfVxib2xkc3ltYm9se1xiZXRhfQ0KICAgIFxdICANCiAgICBsw6AgdOG7lSBo4bujcCB0dXnhur9uIHTDrW5oIGPhu6dhIGPDoWMgYmnhur9uIGdp4bqjaSB0aMOtY2guICANCiAgLSAqKkjDoG0gbGnDqm4ga+G6v3QgKExpbmsgZnVuY3Rpb24pOioqICANCiAgICBDaHV54buDbiDEkeG7lWkgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBiaeG6v24gcGjhuqNuIGjhu5NpIFwoIFxtdSA9IEUoWSkgXCkgc2FuZyBraMO0bmcgZ2lhbiB0dXnhur9uIHTDrW5oOiAgDQogICAgXFsNCiAgICBnKFxtdSkgPSBcZXRhDQogICAgXF0gIA0KICAgIFbDrSBk4bulOiBow6BtIGxvZ2l0IGNobyBiaeG6v24gbmjhu4sgcGjDom4sIGjDoG0gbG9nIGNobyBiaeG6v24gxJHhur9tLiAgDQogICAgDQoqKk9mZnNldDoqKiAgDQogICAgQmnhur9uIGdp4bqjaSB0aMOtY2ggxJHhurdjIGJp4buHdCBjw7MgaOG7hyBz4buRIGPhu5EgxJHhu4tuaCBi4bqxbmcgMSwgZMO5bmcgxJHhu4MgxJFp4buBdSBjaOG7iW5oIG3DtCBow6xuaCBjaG8gY8OhYyBiaeG6v24gcXV5IG3DtCBob+G6t2MgdGjhu51pIGdpYW4gbcOgIGtow7RuZyBsw6BtIHTEg25nIHPhu5EgdGhhbSBz4buRIGPhuqduIMaw4bubYyBsxrDhu6NuZy4NCg0KIyMjIyAqKuG7qG5nIGThu6VuZyB0cm9uZyBSKioNCg0KTeG6t2MgZMO5IENoxrDGoW5nIDUgY2jhu6cgeeG6v3UgdHLDrG5oIGLDoHkgbMO9IHRodXnhur90IG7hu4FuIHThuqNuZywgdmnhu4djIOG7qW5nIGThu6VuZyBjw6FjIG3DtCBow6xuaCBFRE0gY2hvIEdMTXMgdHJvbmcgdGjhu7FjIHThur8gxJHGsOG7o2MgdGjhu7FjIGhp4buHbiBxdWEgY8OhYyBjw7RuZyBj4bulIHbDoCBnw7NpIFIgbmjGsCBzYXU6DQoNCi0gKipIw6BtIGBnbG0oKWAgdHJvbmcgYmFzZSBSOioqIEzDoCBjw7RuZyBj4bulIGNow61uaCDEkeG7gyBmaXQgY8OhYyBtw7QgaMOsbmggR0xNIHbhu5tpIG5oaeG7gXUgcGjDom4gcGjhu5FpIGtow6FjIG5oYXUgxJHGsOG7o2MgZ2nhu5tpIHRoaeG7h3UgdHJvbmcgY2jGsMahbmcsIHRow7RuZyBxdWEgxJHhu5FpIHPhu5EgYGZhbWlseWAuIEjDoG0gbsOgeSBraMO0bmcgecOqdSBj4bqndSBjw6BpIMSR4bq3dCB0aMOqbSBnw7NpIGLDqm4gbmdvw6BpLg0KDQotICoqQ8OhYyBnw7NpIFIgYuG7lSBzdW5nOioqIMSQ4buDIG3hu58gcuG7mW5nIGto4bqjIG7Eg25nIHBow6JuIHTDrWNoLCBt4buZdCBz4buRIGfDs2kgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgY8OhYyBjaMawxqFuZyBzYXU6DQogIC0gYE1BU1NgOiBEw7luZyBjaG8gR0xNIG5o4buLIHRo4bupYyAodsOtIGThu6UgQ2jGsMahbmcgOSkgduG7m2kgaMOgbSBgZG9zZS5wKClgIMSR4buDIHTDrW5oIEVENTAsIHbDoCBjaG8gR0xNIG5o4buLIHRo4bupYyDDom0gKENoxrDGoW5nIDEwKSB24bubaSBow6BtIGBnbG0ubmIoKWAuDQogIC0gYHN0YXRtb2RgOiBI4buXIHRy4bujIGZpdCBHTE0gVHdlZWRpZSAoQ2jGsMahbmcgMTIpIGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBmYW1pbHkgPSBgdHdlZWRpZSgpYCB0cm9uZyBgZ2xtKClgLg0KICANClTDs20gbOG6oWksIGzDvSB0aHV54bq/dCB04burIENoxrDGoW5nIDUgbMOgIG7hu4FuIHThuqNuZyBxdWFuIHRy4buNbmcsIGPDsm4gdmnhu4djIHRo4buxYyB0aGkgY8OhYyBtw7QgaMOsbmggR0xNIGThu7FhIHRyw6puIEVETSDEkcaw4bujYyB0cmnhu4NuIGtoYWkgaGnhu4d1IHF14bqjIG5o4budIGPDoWMgaMOgbSB2w6AgZ8OzaSBSIMSRw6MgxJHGsOG7o2MgY2h14bqpbiBi4buLIHPhurVuLg0KDQoNCg0KIyMjICoqTcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0IChHTE1zKTogxq/hu5tjIGzGsOG7o25nKioNCg0KIyMjIyAqKlTDs20gdOG6r3QgbMO9IHRodXnhur90KioNCg0KQ2jGsMahbmcgNiB04bqtcCB0cnVuZyB2w6BvIHF1w6EgdHLDrG5oIMaw4bubYyBsxrDhu6NuZyBjw6FjIHRoYW0gc+G7kSB0cm9uZyBtw7QgaMOsbmggdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgKEdMTXMpLCDEkeG6t2MgYmnhu4d0IGzDoCBo4buHIHPhu5EgaOG7k2kgcXV5IFwoXGJldGFcKSB2w6AgdGhhbSBz4buRIHBow6JuIHTDoW4gXChccGhpXCkuDQoNCk7hu5lpIGR1bmcgY2jDrW5oIGPhu6dhIGNoxrDGoW5nIGJhbyBn4buTbToNCg0KKirGr+G7m2MgbMaw4bujbmcgaOG7hyBz4buRIGjhu5NpIHF1eSBcKFxib2xkc3ltYm9se1xiZXRhfVwpOioqIA0KDQogIFF1w6EgdHLDrG5oIMaw4bubYyBsxrDhu6NuZyBcKFxib2xkc3ltYm9se1xiZXRhfVwpIMSRxrDhu6NjIHRyw6xuaCBiw6B5IGTGsOG7m2kgZOG6oW5nIGPDtG5nIHRo4bupYyBtYSB0cuG6rW4sIHTGsMahbmcgdOG7sSBuaMawIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHRow7RuZyB0aMaw4budbmcsIHF1YSDEkcOzIHRo4buDIGhp4buHbiBz4buxIHTGsMahbmcgxJHhu5NuZyB0cm9uZyBjw6FjIGLGsOG7m2MgxrDhu5tjIGzGsOG7o25nIGPhu6VjIGLhu5kuICANCiAgQ8O0bmcgdGjhu6ljIMaw4bubYyBsxrDhu6NuZyBcKFxib2xkc3ltYm9se1xiZXRhfVwpIHRoxrDhu51uZyDEkcaw4bujYyBiaeG7g3UgZGnhu4VuIGzDoDogIA0KICBcWw0KICBcaGF0e1xib2xkc3ltYm9se1xiZXRhfX0gPSAoXG1hdGhiZntYfV5cdG9wIFxtYXRoYmZ7V30gXG1hdGhiZntYfSleey0xfSBcbWF0aGJme1h9Xlx0b3AgXG1hdGhiZntXfSBcbWF0aGJme3p9DQogIFxdICANCiAgdHJvbmcgxJHDsyBcKFxtYXRoYmZ7V31cKSBsw6AgbWEgdHLhuq1uIHRy4buNbmcgc+G7kSB2w6AgXChcbWF0aGJme3p9XCkgbMOgIGJp4bq/biBwaOG7pSB0aHXhu5ljIGdp4bqjIGzhuq1wIHRyb25nIHRodeG6rXQgdG/DoW4gSVJMUyAoSXRlcmF0aXZlbHkgUmV3ZWlnaHRlZCBMZWFzdCBTcXVhcmVzKS4NCg0KKirGr+G7m2MgbMaw4bujbmcgdGhhbSBz4buRIHBow6JuIHTDoW4gXChccGhpXCk6KiogIA0KDQogIFRoYW0gc+G7kSBwaMOibiB0w6FuIFwoXHBoaVwpIGPDsyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgdmnhu4djIMSRw6FuaCBnacOhIMSR4buZIGNow61uaCB4w6FjIGPhu6dhIG3DtCBow6xuaCB2w6AgY8OhYyBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dC4gIA0KICBDw7Mgbmhp4buBdSBwaMawxqFuZyBwaMOhcCDGsOG7m2MgbMaw4bujbmcgXChccGhpXCksIHbDrSBk4bulOiAgDQogIFxbDQogIFxoYXR7XHBoaX0gPSBcZnJhY3sxfXtuIC0gcH0gXHN1bV97aT0xfV5uIFxmcmFjeyh5X2kgLSBcaGF0e1xtdX1faSleMn17VihcaGF0e1xtdX1faSl9DQogIFxdICANCiAgdHJvbmcgxJHDsyBcKG5cKSBsw6Agc+G7kSBxdWFuIHPDoXQsIFwocFwpIHPhu5EgYmnhur9uIGdp4bqjaSB0aMOtY2gsIHbDoCBcKFYoXGhhdHtcbXV9X2kpXCkgbMOgIGjDoG0gcGjGsMahbmcgc2FpIOG7qW5nIHbhu5tpIGdpw6EgdHLhu4sgZOG7sSBiw6FvIFwoXGhhdHtcbXV9X2lcKS4NCg0KKipU4bqnbSBxdWFuIHRy4buNbmcgY+G7p2EgdGjhu6kgdOG7sSDEkcawYSBiaeG6v24gZ2nhuqNpIHRow61jaCB2w6BvIG3DtCBow6xuaDoqKiAgDQoNCiAgS2hpIHBow6JuIHTDrWNoIGLhuqNuZyBkZXZpYW5jZSwgdGjhu6kgdOG7sSBjw6FjIGJp4bq/biDEkcaw4bujYyDEkcawYSB2w6BvIG3DtCBow6xuaCDhuqNuaCBoxrDhu59uZyB04bubaSBjw6FjaCBkaeG7hW4gZ2nhuqNpIHZhaSB0csOyIGPhu6dhIHThu6tuZyBiaeG6v24gdsOgIHF1eeG6v3QgxJHhu4tuaCBs4buxYSBjaOG7jW4gYmnhur9uIHF1YW4gdHLhu41uZyB0cm9uZyBtw7QgaMOsbmguIERvIMSRw7MsIHZp4buHYyBjw6JuIG5o4bqvYyB0aOG7qSB04buxIGJp4bq/biBsw6AgY+G6p24gdGhp4bq/dCDEkeG7gyB4w6J5IGThu7FuZyBtw7QgaMOsbmggY2jDrW5oIHjDoWMgdsOgIMO9IG5naMSpYS4NCg0KQ2jGsMahbmcgNiBjdW5nIGPhuqVwIGPDoWkgbmjDrG4gc8OidSBz4bqvYyB24buBIHF1w6EgdHLDrG5oIMaw4bubYyBsxrDhu6NuZyB0cm9uZyBHTE1zLCBsacOqbiBo4buHIGNo4bq3dCBjaOG6vSB24bubaSBo4buTaSBxdXkgdHV54bq/biB0w61uaCBxdWEgY8O0bmcgdGjhu6ljIG1hIHRy4bqtbiwgxJHhu5NuZyB0aOG7nWkgbMOgbSByw7UgdmFpIHRyw7IgdsOgIHBoxrDGoW5nIHBow6FwIMaw4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgcGjDom4gdMOhbiBcKFxwaGlcKS4gQsOqbiBj4bqhbmggxJHDsywgdmnhu4djIG5o4bqlbiBt4bqhbmggdGjhu6kgdOG7sSBiaeG6v24gdHJvbmcgcGjDom4gdMOtY2ggZGV2aWFuY2UgZ2nDunAgbmfGsOG7nWkgcGjDom4gdMOtY2ggeMOieSBk4buxbmcgdsOgIGhp4buDdSBtw7QgaMOsbmggY2jDrW5oIHjDoWMgaMahbi4gxJDDonkgbMOgIG7hu4FuIHThuqNuZyB24buvbmcgY2jhuq9jIMSR4buDIMOhcCBk4bulbmcgR0xNcyB0cm9uZyBuZ2hpw6puIGPhu6l1IHRo4buxYyB04bq/IHbDoCBwaMOhdCB0cmnhu4NuIGPDoWMga+G7uSB0aHXhuq10IHBow6JuIHTDrWNoIG7Dom5nIGNhby4NCg0KIyMjIyAqKuG7qG5nIGThu6VuZyB0cm9uZyBSKioNCg0KVmnhu4djIMaw4bubYyBsxrDhu6NuZyBjw6FjIG3DtCBow6xuaCBHTE1zIHRyb25nIFIgY2jhu6cgeeG6v3UgxJHGsOG7o2MgdGjhu7FjIGhp4buHbiBxdWEgaMOgbSBgZ2xtKClgIHRyb25nIGJhc2UgUiBtw6Aga2jDtG5nIGPhuqduIGPDoWMgZ8OzaSBi4buVIHN1bmc6DQoNCi0gSMOgbSBgZ2xtKClgIGNobyBwaMOpcCDGsOG7m2MgbMaw4bujbmcgaOG7hyBz4buRIGjhu5NpIHF1eSBcKFxiZXRhXCkgdsOgIHjhu60gbMO9IGPDoWMgcGjDom4gcGjhu5FpIHBo4buVIGJp4bq/biBuaMawIGJpbm9taWFsLCBwb2lzc29uLCBnYXVzc2lhbiwgcXVhc2liaW5vbWlhbCwgcXVhc2lwb2lzc29uLCBHYW1tYSwgaW52ZXJzZS5nYXVzc2lhbiwgcXVhc2ksLi4uICANCi0gQ8OhYyBow6BtIGxpw6puIGvhur90IChsaW5rIGZ1bmN0aW9ucykgdMawxqFuZyDhu6luZyDEkcaw4bujYyBo4buXIHRy4bujIHRy4buxYyB0aeG6v3AgdHJvbmcgYGdsbSgpYCBtw6Aga2jDtG5nIGPhuqduIHThuqNpIHRow6ptIGfDs2kgbmdvw6BpLg0KDQoNCiMjIyAqKk3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNcyk6IFN1eSBsdeG6rW4qKg0KDQojIyMjICoqVMOzbSB04bqvdCBsw70gdGh1eeG6v3QqKg0KDQpDaMawxqFuZyA3IHThuq1wIHRydW5nIHbDoG8gc3V5IGx14bqtbiB0aOG7kW5nIGvDqiBjaG8gY8OhYyB0aGFtIHPhu5EgaOG7k2kgcXV5IHRyb25nIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNcyksIMSR4bq3YyBiaeG7h3QgbMOgIGPDoWMgaOG7hyBz4buRIFwoXGJldGFcKS4gU3V5IGx14bqtbiB0aOG7kW5nIGvDqiDhu58gxJHDonkgYmFvIGfhu5NtIHZp4buHYyBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB24buBIGPDoWMgaOG7hyBz4buRLCDGsOG7m2MgbMaw4bujbmcgc2FpIHPhu5EgY2h14bqpbiwgeMOieSBk4buxbmcga2hv4bqjbmcgdGluIGPhuq15LCB2w6AgxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggdGjDtG5nIHF1YSBjw6FjIGLhuqNuZyBwaMOibiB0w61jaCBkZXZpYW5jZS4gVHJvbmcgR0xNcywgdGhhbSBz4buRIHBow6JuIHTDoW4gXChccGhpXCkgdGjhu4MgaGnhu4duIHPhu7EgYmnhur9uIHRoacOqbiBj4bunYSBk4buvIGxp4buHdSBzbyB24bubaSBtw7QgaMOsbmguIE7hur91IFwoXHBoaVwpIMSRxrDhu6NjIGJp4bq/dCBob+G6t2MgZ2nhuqMgxJHhu4tuaCBj4buRIMSR4buLbmggKHbDrSBk4bulIHRyb25nIHBow6JuIHBo4buRaSBQb2lzc29uIFwoXHBoaSA9IDFcKSksIGPDoWMga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogdGjGsOG7nW5nIGThu7FhIHRyw6puIHBow6JuIHBo4buRaSBcKFxjaGleMlwpLiBO4bq/dSBcKFxwaGlcKSBjaMawYSBiaeG6v3QsIHRhIHBo4bqjaSDGsOG7m2MgbMaw4bujbmcgbsOzLCB2w6AgY8OhYyBraeG7g20gxJHhu4tuaCBjw7MgdGjhu4MgZOG7sWEgdHLDqm4gcGjDom4gcGjhu5FpIEYgdGhheSB2w6wgXChcY2hpXjJcKS4NCg0KTuG7mWkgZHVuZyBjaMOtbmggY2jGsMahbmcgbsOgeSBiYW8gZ+G7k206DQoNCioqQuG6o25nIHBow6JuIHTDrWNoIGRldmlhbmNlIChBbmFseXNpcyBvZiBEZXZpYW5jZSk6KiogIA0KDQogIERldmlhbmNlIMSRbyBsxrDhu51uZyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgbcO0IGjDrG5oIGhp4buHbiB04bqhaSB2w6AgbcO0IGjDrG5oIMSR4bqneSDEkeG7pyBob+G6t2MgbcO0IGjDrG5oIG51bGwsIGzDoCBjw7RuZyBj4bulIHF1YW4gdHLhu41uZyDEkeG7gyDEkcOhbmggZ2nDoSB2YWkgdHLDsiBj4bunYSBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIHRyb25nIEdMTS4NCg0KKipLaeG7g20gxJHhu4tuaCBU4bu3IHPhu5EgS2jhuqMgbsSDbmcgeOG6o3kgcmEgKExpa2VsaWhvb2QgUmF0aW8gVGVzdCAtIExSVCk6KiogIA0KDQogIETDuW5nIMSR4buDIHNvIHPDoW5oIGhhaSBtw7QgaMOsbmggbOG7k25nIG5oYXUgKG5lc3RlZCksIHRo4buRbmcga8OqIExSVCBk4buxYSB0csOqbiBjaMOqbmggbOG7h2NoIGRldmlhbmNlIGdp4buvYSBoYWkgbcO0IGjDrG5oOiAgDQogIFxbDQogIFxMYW1iZGEgPSAtMiBcbG9nIFxmcmFje0woXHRleHR7bcO0IGjDrG5oIG5o4buPfSl9e0woXHRleHR7bcO0IGjDrG5oIGzhu5tufSl9ID0gRF97XHRleHR7bmjhu499fSAtIERfe1x0ZXh0e2zhu5tufX0NCiAgXF0gIA0KICB24bubaSBcKFxMYW1iZGEgXHNpbSBcY2hpXjJfe1xEZWx0YSBkZn1cKSwgdHJvbmcgxJHDsyBcKFxEZWx0YSBkZlwpIGzDoCBz4buxIGNow6puaCBs4buHY2ggYuG6rWMgdOG7sSBkbyBnaeG7r2EgaGFpIG3DtCBow6xuaC4NCg0KKirGr+G7m2MgbMaw4bujbmcgdGhhbSBz4buRIHbDoCBzYWkgc+G7kSBjaHXhuqluOioqICANCg0KICBDw6FjIGjhu4cgc+G7kSBo4buTaSBxdXkgXChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX1cKSDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgdGjDtG5nIHF1YSB0aHXhuq10IHRvw6FuIElSTFMuIFNhaSBz4buRIGNodeG6qW4gXChTRShcaGF0e1xiZXRhfV9qKVwpIHBo4bqjbiDDoW5oIMSR4buZIGNow61uaCB4w6FjIGPhu6dhIGPDoWMgxrDhu5tjIGzGsOG7o25nIG7DoHkgdsOgIMSRxrDhu6NjIGTDuW5nIHRyb25nIGtp4buDbSDEkeG7i25oIFdhbGQuDQoNCioqS2nhu4NtIMSR4buLbmggV2FsZCB2w6Aga2hv4bqjbmcgdGluIGPhuq15OioqICANCg0KICAtICoqS2nhu4NtIMSR4buLbmggV2FsZDoqKiAgDQogICAgXFsNCiAgICB6X2ogPSBcZnJhY3tcaGF0e1xiZXRhfV9qfXtTRShcaGF0e1xiZXRhfV9qKX0gXHNpbSBcbWF0aGNhbHtOfSgwLDEpDQogICAgXF0gIA0KICAgIGtp4buDbSB0cmEgw70gbmdoxKlhIHThu6tuZyBo4buHIHPhu5EuICANCiAgLSAqKktob+G6o25nIHRpbiBj4bqteToqKiAgDQogICAgS2hv4bqjbmcgdGluIGPhuq15IFwoMTAwKDEtXGFscGhhKVwlXCkgY2hvIFwoXGJldGFfalwpIMSRxrDhu6NjIHjDonkgZOG7sW5nIHRoZW8gY8O0bmcgdGjhu6ljOiAgDQogICAgXFsNCiAgICBcaGF0e1xiZXRhfV9qIFxwbSB6X3tcYWxwaGEvMn0gXHRpbWVzIFNFKFxoYXR7XGJldGF9X2opDQogICAgXF0gIA0KICAgIHbhu5tpIFwoel97XGFscGhhLzJ9XCkgbMOgIGdpw6EgdHLhu4sgcGjDom4gduG7iyBj4bunYSBwaMOibiBwaOG7kWkgY2h14bqpbiBjaHXhuqluIGjDs2EuDQoNCioqVGhhbSBz4buRIHBow6JuIHTDoW4gXChccGhpXCk6KiogIA0KDQogIE7hur91IFwoXHBoaVwpIGJp4bq/dCBob+G6t2MgZ2nhuqMgxJHhu4tuaCBj4buRIMSR4buLbmggKHbDrSBk4bulIFBvaXNzb24gXChccGhpPTFcKSksIGPDoWMga2nhu4NtIMSR4buLbmggZOG7sWEgdHLDqm4gcGjDom4gcGjhu5FpIFwoXGNoaV4yXCkuIE7hur91IFwoXHBoaVwpIGNoxrBhIGJp4bq/dCB2w6AgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nLCBraeG7g20gxJHhu4tuaCBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgcGjDom4gcGjhu5FpIEYgdGhheSB2w6wgXChcY2hpXjJcKS4NCg0KIyMjIyAqKuG7qG5nIGThu6VuZyB0cm9uZyBSKioNCg0KQ2jGsMahbmcgNyBz4butIGThu6VuZyBjaOG7pyB54bq/dSBjw6FjIGjDoG0gY8OzIHPhurVuIHRyb25nIFIgY8ahIGLhuqNuIChiYXNlIFIpIMSR4buDIHRo4buxYyBoaeG7h24gc3V5IGx14bqtbiB0aOG7kW5nIGvDqiBjaG8gR0xNczoNCg0KLSAqKkjDoG0gYGdsbSgpYCoqICjEkcaw4bujYyBnaeG7m2kgdGhp4buHdSDhu58gQ2jGsMahbmcgNikgxJHhu4MgZml0IG3DtCBow6xuaCBHTE0uDQoNCi0gKipQaMOibiB0w61jaCDEkeG7mSBs4buHY2ggKEFuYWx5c2lzIG9mIERldmlhbmNlKToqKiAgDQogIETDuW5nIGjDoG0gYGFub3ZhKG1vZGVsLCB0ZXN0ID0gIkNoaXNxIilgIMSR4buDIHThuqFvIGLhuqNuZyBwaMOibiB0w61jaCBkZXZpYW5jZSB2w6AgdMOtbmggZ2nDoSB0cuG7iyBcKHBcKSBk4buxYSB0csOqbiBwaMOibiBwaOG7kWkgXChcY2hpXjJcKS4NCg0KLSAqKktp4buDbSDEkeG7i25oIExpa2VsaWhvb2QgUmF0aW8gVGVzdCAoTFJUKToqKiAgDQogIFTDrW5oIGdpw6EgdHLhu4sgXChwXCkgduG7m2kgaMOgbSBgcGNoaXNxKClgLg0KDQotICoqS2nhu4NtIMSR4buLbmggV2FsZCB2w6AgdMOtbmgga2hv4bqjbmcgdGluIGPhuq15OioqICANCiAgU+G7rSBk4bulbmcgY8OhYyBow6BtIGBwbm9ybSgpYCwgYHFub3JtKClgIMSR4buDIHTDrW5oIGdpw6EgdHLhu4sgXChwXCkgdsOgIHjDonkgZOG7sW5nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gY8OhYyB0aGFtIHPhu5EuDQoNClTDs20gbOG6oWksIENoxrDGoW5nIDcgbWluaCBo4buNYSB2aeG7h2Mgc+G7rSBk4bulbmcgY8OhYyBow6BtIGPGoSBi4bqjbiBj4bunYSBSIMSR4buDIHRo4buxYyBoaeG7h24gc3V5IGx14bqtbiB0aOG7kW5nIGvDqiB0cm9uZyBHTE1zIG3hu5l0IGPDoWNoIGhp4buHdSBxdeG6oyB2w6AgcsO1IHLDoG5nLCBraMO0bmcgY+G6p24gxJHhur9uIGfDs2kgYuG7lSBzdW5nIG7DoG8gdHJvbmcgbuG7mWkgZHVuZyBuw6B5Lg0KDQojIyMgKipNw7QgaMOsbmggdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgKEdMTXMpOiBDaOG6qW4gxJFvw6FuKioNCiMjIyMgKipUw7NtIHThuq90IGzDvSB0aHV54bq/dCoqDQoNCkNoxrDGoW5nIG7DoHkgdOG6rXAgdHJ1bmcgdsOgbyB2aeG7h2MgxJHDoW5oIGdpw6EgxJHhu5kgcGjDuSBo4bujcCB2w6AgY2jhuqV0IGzGsOG7o25nIGPhu6dhIG3DtCBow6xuaCBHTE0gdGjDtG5nIHF1YSBjw6FjIGvhu7kgdGh14bqtdCBjaOG6qW4gxJFvw6FuLg0KDQpO4buZaSBkdW5nIGNow61uaCBj4bunYSBjaMawxqFuZyBiYW8gZ+G7k206DQoNCioqUGjhuqduIGTGsCB0cm9uZyBHTE1zOioqICANCg0KICBQaOG6p24gZMawIHRow7RuZyB0aMaw4budbmcgXChyX2kgPSB5X2kgLSBcaGF0e1xtdX1faVwpIGtow7RuZyDEkeG7pyDEkeG7gyDEkcOhbmggZ2nDoSBjaMOtbmggeMOhYyBkbyBwaMawxqFuZyBzYWkgcGjhu6UgdGh14buZYyB2w6BvIGdpw6EgdHLhu4sgZOG7sSBiw6FvIFwoXGhhdHtcbXV9X2lcKS4gVsOsIHbhuq15LCBz4butIGThu6VuZyBjw6FjIGxv4bqhaSBwaOG6p24gZMawIMSR4bq3YyBiaeG7h3QgbmjGsDogIA0KICANCioqUGjhuqduIGTGsCBkZXZpYW5jZSBjaHXhuqluIGjDs2E6KiogIA0KICAgIFxbDQogICAgcl9pXnsoRCl9ID0gXGZyYWN7ZF9pfXtcc3FydHtcaGF0e1xwaGl9ICgxIC0gaF97aWl9KX19DQogICAgXF0gIA0KICAgIHRyb25nIMSRw7MgXChkX2lcKSBsw6AgxJHhu5kgbOG7h2NoIGRldmlhbmNlLCBcKFxoYXR7XHBoaX1cKSBsw6AgdGhhbSBz4buRIHBow6JuIHTDoW4sIHbDoCBcKGhfe2lpfVwpIGzDoCBsZXZlcmFnZS4gIA0KKipQaOG6p24gZMawIHF1YW50aWxlOioqIEdpw7pwIMSRw6FuaCBnacOhIHTDrW5oIMSR4bqneSDEkeG7pyBj4bunYSBtw7QgaMOsbmggdsOgIHBow6JuIHBo4buRaSBzYWkgc+G7kS4NCg0KKirEkOG7kyB0aOG7iyBjaOG6qW4gxJFvw6FuOioqICANCiAgQ8OhYyDEkeG7kyB0aOG7iyBuaMawIHBo4bqnbiBkxrAgZGV2aWFuY2UgY2h14bqpbiBow7NhLCBwaOG6p24gZMawIGzDoG0gdmnhu4djICh3b3JraW5nIHJlc2lkdWFscyksIHbDoCBwaOG6p24gZMawIHThu6tuZyBwaOG6p24gKHBhcnRpYWwgcmVzaWR1YWxzKSDEkcaw4bujYyBkw7luZyDEkeG7gyB0cuG7sWMgcXVhbiBow7NhIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmgsIHBow6F0IGhp4buHbiB2aSBwaOG6oW0gZ2nhuqMgxJHhu4tuaCBob+G6t2MgcXVhbiBzw6F0IGLhuqV0IHRoxrDhu51uZy4NCg0KKipOaOG6rW4gZGnhu4duIHF1YW4gc8OhdCBnw6J5IOG6o25oIGjGsOG7n25nOioqICANCiAgTeG7mXQgc+G7kSBxdWFuIHPDoXQgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIGzhu5tuIMSR4bq/biBr4bq/dCBxdeG6oyDGsOG7m2MgbMaw4bujbmcgaOG7hyBz4buRLiBDw6FjIGNo4buJIHPhu5Egc2F1IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHjDoWMgxJHhu4tuaDogIA0KICANCiAgLSAqKkNvb2vigJlzIGRpc3RhbmNlOioqIMSQw6FuaCBnacOhIOG6o25oIGjGsOG7n25nIHThu5VuZyB0aOG7gyBj4bunYSDEkWnhu4NtIGzDqm4gxrDhu5tjIGzGsOG7o25nLiAgDQogIC0gKipkZmZpdHM6KiogxJDDoW5oIGdpw6Eg4bqjbmggaMaw4bufbmcgxJFp4buDbSBsw6puIGdpw6EgdHLhu4sgZOG7sSBiw6FvLiAgDQogIC0gKipMZXZlcmFnZSBcKGhfe2lpfVwpOioqIMSQbyBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSDEkWnhu4NtIGzDqm4gbcO0IGjDrG5oLiAgDQogIC0gKipkZmJldGFzOioqIMSQbyBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSDEkWnhu4NtIGzDqm4gdOG7q25nIGjhu4cgc+G7kSDGsOG7m2MgbMaw4bujbmcuDQoNCiMjIyMgKirhu6huZyBk4bulbmcgdHJvbmcgUioqDQoNCg0KQ2jGsMahbmcgOCBz4butIGThu6VuZyBjaOG7pyB54bq/dSBjw6FjIGjDoG0gY8OzIHPhurVuIHRyb25nIFIgY8ahIGLhuqNuIChiYXNlIFIpIMSR4buDIHRo4buxYyBoaeG7h24gY8OhYyBwaMOibiB0w61jaCBjaOG6qW4gxJFvw6FuIG3DtCBow6xuaCBHTE06DQoNCi0gKipW4bq9IMSR4buTIHRo4buLIGNo4bqpbiDEkW/DoW46KiogRMO5bmcgaMOgbSBgcGxvdChtb2RlbClgIMSR4buDIHThuqFvIGPDoWMgYmnhu4N1IMSR4buTIHBo4bqnbiBkxrAgdsOgIGtp4buDbSB0cmEgc+G7sSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaC4NCg0KLSAqKkJp4buDdSDEkeG7kyBRLVEgY2hvIHBo4bqnbiBkxrA6KiogU+G7rSBk4bulbmcgYHFxbm9ybShyZXNpZHVhbHMobW9kZWwsIHR5cGUgPSAiZGV2aWFuY2UiKSlgIGvhur90IGjhu6NwIHbhu5tpIGBxcWxpbmUocmVzaWR1YWxzKG1vZGVsLCB0eXBlID0gImRldmlhbmNlIikpYCDEkeG7gyBraeG7g20gdHJhIHBow6JuIHBo4buRaSBj4bunYSBwaOG6p24gZMawIGRldmlhbmNlLg0KDQotICoqUGjhuqduIGTGsCBjaHXhuqluIGjDs2E6KiogVMOtbmggYuG6sW5nIGjDoG0gYHJzdGFuZGFyZChtb2RlbClgIMSR4buDIHjDoWMgxJHhu4tuaCBjw6FjIHF1YW4gc8OhdCBjw7MgcGjhuqduIGTGsCBi4bqldCB0aMaw4budbmcuDQoNCi0gKipDaOG7iSBz4buRIOG6o25oIGjGsOG7n25nIChpbmZsdWVuY2UgbWVhc3VyZXMpOioqIFPhu60gZOG7pW5nIGBjb29rcy5kaXN0YW5jZShtb2RlbClgIMSR4buDIMSRbyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSB04burbmcgcXVhbiBzw6F0LiBEw7luZyBgaW5mbHVlbmNlLm1lYXN1cmVzKG1vZGVsKWAgxJHhu4Mgbmjhuq1uIGRp4buHbiBjw6FjIHF1YW4gc8OhdCBjw7Mg4bqjbmggaMaw4bufbmcgbOG7m24gZOG7sWEgdHLDqm4gbmhp4buBdSBjaOG7iSBz4buRLg0KDQotICoqRml0IGzhuqFpIG3DtCBow6xuaCBraGkgbG/huqFpIGLhu48gcXVhbiBzw6F0IGPDsyDhuqNuaCBoxrDhu59uZzoqKiBT4butIGThu6VuZyBow6BtIGB1cGRhdGUobW9kZWwsIHN1YnNldCA9IC1jKGluZGV4X3BvaW50cykpYC4NCg0KLSAqKlRyw61jaCB4deG6pXQgaOG7hyBz4buRIGjhu5NpIHF1eToqKiBEw7luZyBgY29lZihtb2RlbClgIMSR4buDIGzhuqV5IGPDoWMgaOG7hyBz4buRIMaw4bubYyBsxrDhu6NuZyBj4bunYSBtw7QgaMOsbmguDQoNCi0gKipC4buRIHRyw60gxJHhu5MgdGjhu4s6KiogRMO5bmcgYHBhcihtZnJvdyA9IGMoMiwgMikpYCDEkeG7gyB04bqhbyBuaGnhu4F1IGJp4buDdSDEkeG7kyB0csOqbiBt4buZdCBj4butYSBz4buVIMSR4buTIGjhu41hLg0KDQoNCiMjIyAqKk3DtCBow6xuaCB04bu3IGzhu4cg4oCTIEJpbm9taWFsIEdMTXMqKg0KDQojIyMjICoqVMOzbSB04bqvdCBsw70gdGh1eeG6v3QqKg0KDQpDaMawxqFuZyA5IHThuq1wIHRydW5nIHbDoG8gbcO0IGjDrG5oIGjDs2EgZOG7ryBsaeG7h3UgZOG6oW5nIHThu7cgbOG7hyBob+G6t2Mgc+G7kSBs4bqnbiB0aMOgbmggY8O0bmcgdHLDqm4gdOG7lW5nIHPhu5EgbOG6p24gdGjhu60gYuG6sW5nIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCB24bubaSBwaMOibiBwaOG7kWkgbmjhu4sgdGjhu6ljIChiaW5vbWlhbCBHTE0pLiDEkMOieSBsw6AgZOG6oW5nIGThu68gbGnhu4d1IHBo4buVIGJp4bq/biB0cm9uZyBuaGnhu4F1IGzEqW5oIHbhu7FjIG5oxrAgc2luaCBo4buNYywgeSBo4buNYywga+G7uSB0aHXhuq10IHbDoCBraG9hIGjhu41jIHjDoyBo4buZaS4NCg0KTuG7mWkgZHVuZyBjaMOtbmggY2jGsMahbmcgbsOgeSBiYW8gZ+G7k206DQoNCioqROG7ryBsaeG7h3UgdsOgIG3DtCBow6xuaDoqKiAgDQoNCiAgLSBCaeG6v24gcGjhuqNuIGjhu5NpIFwoWV9pXCkgxJHGsOG7o2MgbcO0IGjDrG5oIGjDs2EgdGhlbyBwaMOibiBwaOG7kWkgbmjhu4sgdGjhu6ljOiAgDQogICAgXFsNCiAgICBZX2kgXHNpbSBcdGV4dHtCaW5vbWlhbH0obl9pLCBccGlfaSkNCiAgICBcXSAgDQogICAgduG7m2kgXChuX2lcKSBsw6Agc+G7kSBs4bqnbiB0aOG7rSB2w6AgXChccGlfaVwpIGzDoCB4w6FjIHN14bqldCB0aMOgbmggY8O0bmcuICANCiAgLSBE4buvIGxp4buHdSBjw7MgdGjhu4MgxJHGsOG7o2Mgbmjhuq1wIHbDoG8gUiBkxrDhu5tpIGThuqFuZyB04bu3IGzhu4cga8OobSB0aGVvIHRy4buNbmcgc+G7kSAod2VpZ2h0cyksIGhv4bq3YyBkxrDhu5tpIGThuqFuZyBtYSB0cuG6rW4gaGFpIGPhu5l0IGfhu5NtIHPhu5EgbOG6p24gdGjDoG5oIGPDtG5nIHbDoCB0aOG6pXQgYuG6oWkuICANCiAgLSBNw7QgaMOsbmggdGjGsOG7nW5nIHPhu60gZOG7pW5nIGjDoG0gbGnDqm4ga+G6v3QgbG9naXQ6ICANCiAgICBcWw0KICAgIFx0ZXh0e2xvZ2l0fShccGlfaSkgPSBcbG9nXGxlZnQoXGZyYWN7XHBpX2l9ezEgLSBccGlfaX1ccmlnaHQpID0gXG1hdGhiZnt4fV9pXlx0b3AgXGJvbGRzeW1ib2x7XGJldGF9DQogICAgXF0gIA0KICAgIFR1eSBuaGnDqm4sIGPDoWMgaMOgbSBsacOqbiBr4bq/dCBraMOhYyBuaMawICoqY2xvZ2xvZyoqIGhv4bq3YyBiaeG6v24gxJHhu5VpICoqYXJjc2luKiogY8WpbmcgY8OzIHRo4buDIMSRxrDhu6NjIHPhu60gZOG7pW5nIHTDuXkgdGhlbyB0w61uaCBjaOG6pXQgZOG7ryBsaeG7h3UuICANCiAgLSBI4buHIHPhu5EgaOG7k2kgcXV5IFwoXGJldGFfalwpIHRyb25nIG3DtCBow6xuaCBsb2dpdCDEkcaw4bujYyBkaeG7hW4gZ2nhuqNpIHRow7RuZyBxdWEgKip04bu3IHPhu5Egb2RkcyAob2RkcyByYXRpbyk6KiogIA0KICAgIFxbDQogICAgXGV4cChcYmV0YV9qKQ0KICAgIFxdICANCiAgICBiaeG7g3UgdGjhu4sgdOG7tyBz4buRIHRoYXkgxJHhu5VpIG9kZHMga2hpIGJp4bq/biBnaeG6o2kgdGjDrWNoIHRoYXkgxJHhu5VpIG3hu5l0IMSRxqFuIHbhu4suDQoNCioqU3V5IGx14bqtbiB0aOG7kW5nIGvDqjoqKiAgDQogIFZp4buHYyBzdXkgbHXhuq1uIGNobyBjw6FjIHRoYW0gc+G7kSBcKFxib2xkc3ltYm9se1xiZXRhfVwpIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gdGjDtG5nIHF1YSBjw6FjIGtp4buDbSDEkeG7i25oIG5oxrA6ICANCiAgDQogIC0gKipLaeG7g20gxJHhu4tuaCBXYWxkKiogIA0KICAtICoqUGjDom4gdMOtY2ggxJHhu5kgbOG7h2NoIChkZXZpYW5jZSBhbmFseXNpcykqKiAgDQogIC0gKipYw6J5IGThu7FuZyBraG/huqNuZyB0aW4gY+G6rXkqKiANCg0KKipDaOG6qW4gxJFvw6FuIG3DtCBow6xuaDoqKiAgDQogIEPDoWMgcGjhuqduIGTGsCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBraeG7g20gdHJhIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggYmFvIGfhu5NtOiAgDQogIA0KICAtIFBo4bqnbiBkxrAgZGV2aWFuY2UgIA0KICAtIFBo4bqnbiBkxrAgcXVhbnRpbGUgIA0KICAtIFBo4bqnbiBkxrAgbMOgbSB2aeG7h2MgKHdvcmtpbmcgcmVzaWR1YWxzKSAgDQogIEPDoWMgxJHhu5MgdGjhu4sgcGjhuqduIGTGsCB2w6AgYmnhu4N1IMSR4buTIFEtUSBnacO6cCBwaMOhdCBoaeG7h24gY8OhYyDEkWnhu4NtIHF1YW4gc8OhdCBi4bqldCB0aMaw4budbmcgaG/hurdjIGThuqV1IGhp4buHdSBtw7QgaMOsbmgga2jDtG5nIHBow7kgaOG7o3AuDQoNCiMjIyMgKirhu6huZyBk4bulbmcgdHJvbmcgUioqDQoNCi0gKirGr+G7m2MgbMaw4bujbmcgbcO0IGjDrG5oOioqIFZp4buHYyBmaXQgbcO0IGjDrG5oIEdMTSBuaOG7iyB0aOG7qWMgY2jhu6cgeeG6v3UgZOG7sWEgdsOgbyBow6BtIGBnbG0oKWAgdHJvbmcgUiBjxqEgYuG6o24gKGJhc2UgUiksIGtow7RuZyB5w6p1IGPhuqd1IGPDoGkgxJHhurd0IGfDs2kgYuG7lSBzdW5nIGNobyBwaOG6p24gY2jDrW5oIGPhu6dhIG3DtCBow6xuaC4NCi0gKipDw6FjIGfDs2kgYuG7lSBzdW5nKiogIA0KDQogIC0gR8OzaSAqKkdMTXNEYXRhKiogxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6o2kgY8OhYyBi4buZIGThu68gbGnhu4d1IG1pbmggaOG7jWEgdHJvbmcgY8OhYyB2w60gZOG7pSwgdsOtIGThu6U6ICANCg0KICAtIEfDs2kgKipNQVNTKiogKMSRaSBrw6htIHbhu5tpIFIgbmjGsG5nIGPhuqduIGfhu41pIGBsaWJyYXJ5KE1BU1MpYCkgxJHGsOG7o2MgZMO5bmcgY2hvIGPDoWMgaMOgbSBjaHV5w6puIGJp4buHdCBuaMawIGBkb3NlLnAoKWAgxJHhu4MgdMOtbmggdG/DoW4gbGnhu4F1IGhp4buHdSBxdeG6oyB0cnVuZyBiw6xuaCAoRUQ1MCkuDQoNCi0gKipDw6FjIGjDoG0gUiBjaMOtbmggdHJvbmcgQ2jGsMahbmcgOSoqIA0KDQogIC0gYGdsbSgpYCDEkeG7gyBmaXQgbcO0IGjDrG5oIEdMTSBuaOG7iyB0aOG7qWMuICANCiAgLSBgYW5vdmEoKWAgduG7m2kgxJHhu5FpIHPhu5EgYHRlc3QgPSAiQ2hpc3EiYCDEkeG7gyBwaMOibiB0w61jaCBkZXZpYW5jZSB2w6Aga2nhu4NtIMSR4buLbmggbcO0IGjDrG5oLiAgDQogIC0gQ8OhYyBow6BtIGNo4bqpbiDEkW/DoW4gbmjGsCBgcGxvdCgpYCwgYHFxbm9ybSgpYCwgYHJzdGFuZGFyZCgpYCwgYGNvb2tzLmRpc3RhbmNlKClgIMSR4buDIMSRw6FuaCBnacOhIHbDoCBraeG7g20gdHJhIG3DtCBow6xuaCwgdGh14buZYyBSIGPGoSBi4bqjbiBob+G6t2MgY8OhYyBnw7NpIG3hurdjIMSR4buLbmguICANCiAgLSBgbGlicmFyeSgpYCDEkeG7gyB04bqjaSBjw6FjIGfDs2kgYuG7lSB0cuG7oyBraGkgY+G6p24uDQoNClTDs20gbOG6oWksIENoxrDGoW5nIDkgY3VuZyBj4bqlcCBu4buBbiB04bqjbmcgbMO9IHRodXnhur90IHbDoCB0aOG7sWMgaMOgbmggY2hvIHZp4buHYyB4w6J5IGThu7FuZywgc3V5IGx14bqtbiB2w6AgY2jhuqluIMSRb8OhbiBtw7QgaMOsbmggR0xNIG5o4buLIHRo4bupYywgxJHhu5NuZyB0aOG7nWkgaMaw4bubbmcgZOG6q24gY8OhY2ggc+G7rSBk4bulbmcgY8OhYyBjw7RuZyBj4bulIHRyb25nIFIgxJHhu4MgdGjhu7FjIGhp4buHbiBjw6FjIHBow6JuIHTDrWNoIG7DoHkgaGnhu4d1IHF14bqjLg0KDQojIyMgKipNw7QgaMOsbmggY2hvIGThu68gbGnhu4d1IMSR4bq/bSDigJMgUG9pc3NvbiAmIE5lZ2F0aXZlIEJpbm9taWFsKioNCg0KIyMjIyAqKlTDs20gdOG6r3QgbMO9IHRodXnhur90KioNCg0KQ2jGsMahbmcgMTAgdHLDrG5oIGLDoHkgY8OhY2ggbcO0IGjDrG5oIGjDs2EgZOG7ryBsaeG7h3UgxJHhur9tIHRow7RuZyBxdWEgY8OhYyBtw7QgaMOsbmggdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgduG7m2kgcGjDom4gcGjhu5FpIFBvaXNzb24gaG/hurdjIE5o4buLIHRo4bupYyDDom0gKE5lZ2F0aXZlIEJpbm9taWFsKS4gROG7ryBsaeG7h3UgxJHhur9tIHLhuqV0IHBo4buVIGJp4bq/biB0cm9uZyB0aOG7sWMgbmdoaeG7h20gdsOgIHF1YW4gc8OhdCwgbmjGsCBz4buRIGNhIGLhu4duaCwgc+G7kSBz4buxIGtp4buHbiB44bqjeSByYSBoYXkgc+G7kSBsxrDhu6NuZyBjw6EgdGjhu4MuDQoNCk7hu5lpIGR1bmcgY2jDrW5oIGPhu6dhIGNoxrDGoW5nIGJhbyBn4buTbToNCg0KKipNw7QgaMOsbmggUG9pc3NvbiBHTE06KiogIA0KICBNw7QgaMOsbmggUG9pc3NvbiB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcga2hpIGJp4bq/biBwaOG6o24gaOG7k2kgbMOgIHPhu5EgbMaw4bujbmcgxJHhur9tIHbhu5tpIGdp4bqjIMSR4buLbmggcGjGsMahbmcgc2FpIGLhurFuZyB0cnVuZyBiw6xuaCAoZXF1aWRpc3BlcnNpb24pOiAgDQogIFxbDQogIFlfaSBcc2ltIFx0ZXh0e1BvaXNzb259KFxtdV9pKSwgXHF1YWQgXHRleHR7duG7m2kgfSBcbWF0aHJte0V9W1lfaV0gPSBcbWF0aHJte1Zhcn0oWV9pKSA9IFxtdV9pDQogIFxdICANCiAgSMOgbSBsacOqbiBr4bq/dCBsb2cgxJHGsOG7o2MgZMO5bmcgcGjhu5UgYmnhur9uOiAgDQogIFxbDQogIFxsb2coXG11X2kpID0gXG1hdGhiZnt4fV9pXlx0b3AgXGJvbGRzeW1ib2x7XGJldGF9DQogIFxdICANCiAgSOG7hyBz4buRIGjhu5NpIHF1eSBcKFxiZXRhX2pcKSDEkcaw4bujYyBkaeG7hW4gZ2nhuqNpIG5oxrAgdOG7tyBs4buHIHRoYXkgxJHhu5VpIHRydW5nIGLDrG5oIGtoaSBiaeG6v24gZ2nhuqNpIHRow61jaCB0xINuZyBt4buZdCDEkcahbiB24buLOiAgDQogIFxbDQogIGVee1xiZXRhX2p9DQogIFxdICANCiAgVsOtIGThu6UsIFwoXGJldGFfaiA9IDEuMDVcKSB0xrDGoW5nIMSRxrDGoW5nIHTEg25nIHPhu5EgbMaw4bujbmcgdHJ1bmcgYsOsbmggbMOqbiBraG/huqNuZyBcKGVeezEuMDV9IFxhcHByb3ggMi44NlwpIGzhuqduLg0KDQoqKljhu60gbMO9IG92ZXJkaXNwZXJzaW9uOioqICANCiAgVHJvbmcgdGjhu7FjIHThur8sIGThu68gbGnhu4d1IMSR4bq/bSB0aMaw4budbmcgY8OzIHBoxrDGoW5nIHNhaSBs4bubbiBoxqFuIHRydW5nIGLDrG5oIChvdmVyZGlzcGVyc2lvbiksIGzDoG0gY2hvIG3DtCBow6xuaCBQb2lzc29uIGtow7RuZyBjw7JuIHBow7kgaOG7o3AuIEPDoWMgcGjGsMahbmcgcGjDoXAgcGjhu5UgYmnhur9uIMSR4buDIHjhu60gbMO9IGJhbyBn4buTbTogDQogIA0KICAtICoqUXVhc2ktUG9pc3NvbjoqKiDEkGnhu4F1IGNo4buJbmggcGjGsMahbmcgc2FpIFwoXG1hdGhybXtWYXJ9KFlfaSkgPSBccGhpIFxtdV9pXCkgduG7m2kgXChccGhpID4gMVwpLiAgDQogIC0gKipOZWdhdGl2ZSBCaW5vbWlhbCBHTE06KiogTcO0IGjDrG5oIGjDs2EgcGjGsMahbmcgc2FpIG3hu58gcuG7mW5nIGjGoW4sIHRoxrDhu51uZyBiaeG7g3UgZGnhu4VuIGLhurFuZzogIA0KICAgIFxbDQogICAgXG1hdGhybXtWYXJ9KFlfaSkgPSBcbXVfaSArIFxhbHBoYSBcbXVfaV4yDQogICAgXF0gIA0KICAgIHbhu5tpIFwoXGFscGhhID4gMFwpIGzDoCB0aGFtIHPhu5EgxJFp4buBdSBjaOG7iW5oIG3hu6ljIMSR4buZIG92ZXJkaXNwZXJzaW9uLg0KDQoqKk3DtCBow6xuaCBow7NhIGLhuqNuZyB04bqnbiBz4buROioqICANCiAgS2hpIGzDoG0gdmnhu4djIHbhu5tpIGLhuqNuZyB04bqnbiBz4buRLCBtw7QgaMOsbmggbG9nLWxpbmVhciDEkcaw4bujYyBkw7luZyDEkeG7gyBraeG7g20gdHJhIHPhu7EgcGjhu6UgdGh14buZYyBnaeG7r2EgY8OhYyBiaeG6v24gdGhheSB2w6wgY2jhu4kgcXVhbiB0w6JtIMSR4bq/biB04buVbmcgYmnDqm4uIFbDrSBk4bulOiBwaMOibiB0w61jaCBk4buvIGxp4buHdSB24buBIHRo4buxYyBwaOG6qW0gYmnhur9uIMSR4buVaSBnZW4gxJHhu4Mga2nhu4NtIHRyYSB0xrDGoW5nIHTDoWMgZ2nhu69hIHRodSBuaOG6rXAgdsOgIHRow6FpIMSR4buZIG5nxrDhu51pIHRpw6p1IGTDuW5nLg0KDQoqKlN1eSBsdeG6rW4gdsOgIGNo4bqpbiDEkW/DoW46KiogDQoNCiAgLSBTdXkgbHXhuq1uIHRo4buRbmcga8OqIGThu7FhIHRyw6puIGPDoWMga2nhu4NtIMSR4buLbmggV2FsZCwgcGjDom4gdMOtY2ggZGV2aWFuY2UgdsOgIGtp4buDbSDEkeG7i25oIMSR4buZIHBow7kgaOG7o3AgbcO0IGjDrG5oIChnb29kbmVzcy1vZi1maXQpLiAgDQogIC0gQ2jhuqluIMSRb8OhbiBtw7QgaMOsbmggc+G7rSBk4bulbmcgY8OhYyBwaOG6p24gZMawIChkZXZpYW5jZSByZXNpZHVhbHMsIFBlYXJzb24gcmVzaWR1YWxzKSwga2nhu4NtIMSR4buLbmggZ29vZG5lc3Mtb2YtZml0IHbDoCBjw6FjIGNo4buJIHPhu5Eg4bqjbmggaMaw4bufbmcgbmjGsCAqKkNvb2vigJlzIGRpc3RhbmNlKiosICoqbGV2ZXJhZ2UqKiDEkeG7gyBwaMOhdCBoaeG7h24gxJFp4buDbSDhuqNuaCBoxrDhu59uZyBob+G6t2MgcXVhbiBzw6F0IGLhuqV0IHRoxrDhu51uZy4NCg0KDQojIyMjICoq4buobmcgZOG7pW5nIHRyb25nIFIqKg0KDQotICoqxq/hu5tjIGzGsOG7o25nIG3DtCBow6xuaCBQb2lzc29uOioqIEjDoG0gYGdsbSgpYCB24bubaSDEkeG7kWkgc+G7kSBgZmFtaWx5ID0gcG9pc3NvbmAgdHJvbmcgUiBjxqEgYuG6o24gKGJhc2UgUikgxJHGsOG7o2MgZMO5bmcgxJHhu4MgZml0IGPDoWMgbcO0IGjDrG5oIFBvaXNzb24gR0xNLg0KDQotICoqTcO0IGjDrG5oIE5lZ2F0aXZlIEJpbm9taWFsOioqIMSQ4buDIGZpdCBtw7QgaMOsbmggTmVnYXRpdmUgQmlub21pYWwsIGPhuqduIHPhu60gZOG7pW5nIGfDs2kgKipNQVNTKiogKMSRaSBrw6htIHbhu5tpIFIgbmjGsG5nIHBo4bqjaSBn4buNaSBgbGlicmFyeShNQVNTKWApLiAgDQoNCiMjIyAqKk3DtCBow6xuaCBHTE0gduG7m2kgROG7ryBsaeG7h3UgTGnDqm4gdOG7pWMgRMawxqFuZyDigJMgUGjDom4gcGjhu5FpIEdhbW1hKioNCiMjIyMgKipUw7NtIHThuq90IGzDvSB0aHV54bq/dCoqDQoNCkNoxrDGoW5nIG7DoHkgbeG7nyBy4buZbmcga2h1w7RuIGto4buVIEdMTSDEkeG7gyB44butIGzDvSBjw6FjIGJp4bq/biBwaOG6o24gaOG7k2kgbMOgIGThu68gbGnhu4d1IGxpw6puIHThu6VjLCBkxrDGoW5nIHbhu5tpIMSR4bq3YyDEkWnhu4NtIHBoxrDGoW5nIHNhaSB0xINuZyB0aGVvIHRydW5nIGLDrG5oLiBDw6FjIG3DtCBow6xuaCBjaMOtbmggdOG6rXAgdHJ1bmcgdsOgbyBwaMOibiBwaOG7kWkgR2FtbWEsIEludmVyc2UgR2F1c3NpYW4gdsOgIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwIGPhu6dhIHBow6JuIHBo4buRaSBUd2VlZGllLCB0aHXhu5ljIGjhu40gTcO0IGjDrG5oIFBow6JuIHTDoW4gTMWpeSB0aOG7q2EgKEV4cG9uZW50aWFsIERpc3BlcnNpb24gTW9kZWxzIC0gRURNKS4NCg0KKipNw7QgaMOsbmggR2FtbWEgR0xNOioqDQoNCiAgLSBCaeG6v24gcGjhuqNuIGjhu5NpIFwoWVwpIGTGsMahbmcsIGPDsyBwaMawxqFuZyBzYWkgdOG7tyBs4buHIHbhu5tpIGLDrG5oIHBoxrDGoW5nIHRydW5nIGLDrG5oOiAgDQogICAgXFsNCiAgICBcbWF0aHJte1Zhcn0oWSkgPSBccGhpIFxtdV4yDQogICAgXF0NCiAgLSBIw6BtIGxpw6puIGvhur90IHBo4buVIGJp4bq/biBn4buTbSBow6BtIGxvZ2FyaXQgdsOgIGjDoG0gbmdo4buLY2ggxJHhuqNvOiAgDQogICAgXFsNCiAgICBnKFxtdSkgPSBcbG9nKFxtdSkgXHF1YWQgXHRleHR7aG/hurdjfSBccXVhZCBnKFxtdSkgPSBcZnJhY3sxfXtcbXV9DQogICAgXF0NCiAgLSBNw7QgaMOsbmggxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBkxrDhu5tpIGThuqFuZzogIA0KICAgIFxbDQogICAgZyhcbXVfaSkgPSBcbWF0aGJme3h9X2leXHRvcCBcYm9sZHN5bWJvbHtcYmV0YX0NCiAgICBcXQ0KDQoqKkvhu7kgdGh14bqtdCBjaOG6qW4gxJFvw6FuIG3DtCBow6xuaDoqKiAgDQoNCiAgLSBT4butIGThu6VuZyBwaOG6p24gZMawIGNodeG6qW4gaMOzYSB2w6AgcGjhuqduIGTGsCBxdWFudGlsZSDEkeG7gyDEkcOhbmggZ2nDoSB0w61uaCBwaMO5IGjhu6NwIG3DtCBow6xuaC4gIA0KICAtIMSQ4buTIHRo4buLIGZpdHRlZCB2YWx1ZXMgc28gduG7m2kgcmVzaWR1YWxzIHbDoCBiaeG7g3UgxJHhu5MgUS1RIGdpw7pwIHBow6F0IGhp4buHbiBz4buxIGtow7RuZyBwaMO5IGjhu6NwIGhv4bq3YyBxdWFuIHPDoXQgYuG6pXQgdGjGsOG7nW5nLiAgDQogIC0gQ29va+KAmXMgZGlzdGFuY2UgaOG7lyB0cuG7oyB4w6FjIMSR4buLbmggY8OhYyDEkWnhu4NtIHF1YW4gc8OhdCBjw7Mg4bqjbmggaMaw4bufbmcgbOG7m24gxJHhur9uIG3DtCBow6xuaC4NCg0KQ2jGsMahbmcgbsOgeSBjdW5nIGPhuqVwIG7hu4FuIHThuqNuZyB24buvbmcgY2jhuq9jIMSR4buDIHBow6JuIHTDrWNoIGPDoWMgYmnhur9uIGxpw6puIHThu6VjIGTGsMahbmcgY8OzIHBoxrDGoW5nIHNhaSB0xINuZywgbeG7nyBy4buZbmcgxJHDoW5nIGvhu4MgcGjhuqFtIHZpIOG7qW5nIGThu6VuZyBHTE0gdHJvbmcgdGjhu7FjIHThur8gdGjhu5FuZyBrw6ogduG7m2kgc+G7sSBsaW5oIGhv4bqhdCBj4bunYSBjw6FjIGjDoG0gbGnDqm4ga+G6v3QgdsOgIGPDtG5nIGPhu6UgY2jhuqluIMSRb8OhbiBxdWVuIHRodeG7mWMuDQoNCiMjIyMgKirhu6huZyBk4bulbmcgdHJvbmcgUioqDQoNCioqQ8OhYyBow6BtIFIgY2jDrW5oIHRyb25nIENoxrDGoW5nIDExKiogIA0KDQogIC0gYGdsbSgpYCDEkeG7gyBmaXQgbcO0IGjDrG5oIEdMTSB24bubaSBwaMOibiBwaOG7kWkgR2FtbWEgKGBmYW1pbHkgPSBHYW1tYShsaW5rID0gImxvZyIpYCkgaG/hurdjIEludmVyc2UgR2F1c3NpYW4gKGBmYW1pbHkgPSBpbnZlcnNlLmdhdXNzaWFuKGxpbmsgPSAibG9nIilgKS4gIA0KICAtIGBzdW1tYXJ5KClgIMSR4buDIHhlbSB0w7NtIHThuq90IG3DtCBow6xuaCwgYmFvIGfhu5NtIGjhu4cgc+G7kSwgc2FpIHPhu5EgY2h14bqpbiB2w6Aga2nhu4NtIMSR4buLbmggw70gbmdoxKlhLiAgDQogIC0gYGNvZWYoKWAgxJHhu4MgdHLDrWNoIHh14bqldCBjw6FjIGjhu4cgc+G7kSB04burIG3DtCBow6xuaC4gIA0KICAtIGBwcmludENvZWZtYXQoKWAgxJHhu4MgaGnhu4NuIHRo4buLIGLhuqNuZyBo4buHIHPhu5EgY8OzIMSR4buLbmggZOG6oW5nIHLDtSByw6BuZy4gIA0KICAtIGBkYXRhKClgIMSR4buDIHThuqNpIGPDoWMgdOG6rXAgZOG7ryBsaeG7h3UgdsOtIGThu6UgbmjGsCBgbGltZWAsIGBwZXJtYCwgaG/hurdjIGBycmF0ZXNgIHThu6sgZ8OzaSBgR0xNc0RhdGFgLiAgDQogIC0gYGJveHBsb3QoKWAsIGBwbG90KClgIMSR4buDIHRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UgdsOgIGvhur90IHF14bqjIG3DtCBow6xuaC4gIA0KICAtIGBpbmZsdWVuY2UubWVhc3VyZXMoKWAgxJHhu4MgcGjDom4gdMOtY2gg4bqjbmggaMaw4bufbmcgY+G7p2EgY8OhYyDEkWnhu4NtIGThu68gbGnhu4d1LCBiYW8gZ+G7k20gQ29vaydzIGRpc3RhbmNlIChgY29vay5kYCkuDQoNCiMjIyAqKk3DtCBow6xuaCBUd2VlZGllKioNCiMjIyMgKipUw7NtIHThuq90IGzDvSB0aHV54bq/dCoqDQoNCkNoxrDGoW5nIG7DoHkgbeG7nyBy4buZbmcgbcO0IGjDrG5oIEdMTSDEkeG7gyB44butIGzDvSBiaeG6v24gcGjhuqNuIGjhu5NpIGzDoCBk4buvIGxp4buHdSBsacOqbiB04bulYyBkxrDGoW5nLCBiYW8gZ+G7k20gY+G6oyB0csaw4budbmcgaOG7o3AgY8OzIGdpw6EgdHLhu4sgYuG6sW5nIDAsIGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBwaMOibiBwaOG7kWkgVHdlZWRpZSDigJQgbeG7mXQgaOG7jSBwaMOibiBwaOG7kWkgbGluaCBob+G6oXQgdGh14buZYyBo4buNIE3DtCBow6xuaCBQaMOibiB0w6FuIEzFqXkgdGjhu6thIChFRE0pLg0KDQpO4buZaSBkdW5nIGNow61uaCBj4bunYSBjaMawxqFuZyBiYW8gZ+G7k206DQoNCi0gKipQaMOibiBwaOG7kWkgVHdlZWRpZToqKiAgDQogIFBow6JuIHBo4buRaSBUd2VlZGllIMSRxrDhu6NjIMSR4bq3YyB0csawbmcgYuG7n2kgaMOgbSBwaMawxqFuZyBzYWk6ICANCiAgXFsNCiAgVihcbXUpID0gXG11Xlx4aQ0KICBcXQ0KICB24bubaSB0aGFtIHPhu5EgY2jhu4kgbeG7pWMgXChceGlcKSAoVHdlZWRpZSBpbmRleCBwYXJhbWV0ZXIpLg0KDQotICoqw50gbmdoxKlhIGPDoWMgZ2nDoSB0cuG7iyBcKFx4aVwpOioqICANCiAgLSBcKFx4aSA9IDBcKTogcGjDom4gcGjhu5FpIENodeG6qW4gKE5vcm1hbCkgIA0KICAtIFwoXHhpID0gMVwpOiBwaMOibiBwaOG7kWkgUG9pc3NvbiAgDQogIC0gXChceGkgPSAyXCk6IHBow6JuIHBo4buRaSBHYW1tYSAgDQogIC0gXChceGkgPSAzXCk6IHBow6JuIHBo4buRaSBJbnZlcnNlIEdhdXNzaWFuICANCiAgLSBcKDEgPCBceGkgPCAyXCk6IMSR4bq3YyBiaeG7h3QgcGjDuSBo4bujcCBjaG8gZOG7ryBsaeG7h3UgbGnDqm4gdOG7pWMgZMawxqFuZyBjw7Mgbmhp4buBdSBnacOhIHRy4buLIGLhurFuZyAwICh6ZXJvLWluZmxhdGVkIGNvbnRpbnVvdXMgZGF0YSkuDQoNCi0gKipNw7QgaMOsbmggR0xNIFR3ZWVkaWU6KiogIA0KICBNw7QgaMOsbmggxJHGsOG7o2MgeMOieSBk4buxbmcgdGhlbyBraHXDtG4ga2jhu5UgR0xNIHbhu5tpOiAgDQogIFxbDQogIGcoXG11X2kpID0gXG1hdGhiZnt4fV9pXlx0b3AgXGJvbGRzeW1ib2x7XGJldGF9DQogIFxdDQogIHRyb25nIMSRw7MgXChnKFxjZG90KVwpIGzDoCBow6BtIGxpw6puIGvhur90IHBow7kgaOG7o3AgKHRoxrDhu51uZyBsw6AgbG9nKS4NCg0KLSAqKsav4bubYyBsxrDhu6NuZyB0aGFtIHPhu5E6KiogIA0KICAtIFRyb25nIFIsIG3DtCBow6xuaCDEkcaw4bujYyBmaXQgYuG6sW5nIGjDoG0gYGdsbSgpYCB24bubaSB0aGFtIHPhu5EgYGZhbWlseSA9IHR3ZWVkaWUoKWAgKGPhuqduIGfDs2kgYHN0YXRtb2RgKS4gIA0KICAtIFRoYW0gc+G7kSBcKFx4aVwpIMSRxrDhu6NjIGNo4buJIMSR4buLbmggcXVhIGB2YXIucG93ZXJgLiAgDQogIC0gVGhhbSBz4buRIHBow6JuIHTDoW4gXChccGhpXCkgdGjGsOG7nW5nIMSRxrDhu6NjIHThu7EgxJHhu5luZyDGsOG7m2MgbMaw4bujbmcuICANCiAgLSBUcsaw4budbmcgaOG7o3AgXChceGlcKSBjaMawYSBiaeG6v3QsIGPDsyB0aOG7gyDGsOG7m2MgbMaw4bujbmcgdGjDtG5nIHF1YSB04buRaSDEkWEgaMOzYSBsb2ctbGlrZWxpaG9vZCBob+G6t2Mgc28gc8OhbmggY8OhYyBtw7QgaMOsbmggYuG6sW5nIEFJQy4NCg0KLSAqKkNo4bqpbiDEkW/DoW4gbcO0IGjDrG5oOioqICANCiAgLSBT4butIGThu6VuZyBwaOG6p24gZMawIGNodeG6qW4gaMOzYSB2w6AgYmnhu4N1IMSR4buTIFEtUSDEkeG7gyDEkcOhbmggZ2nDoSB0w61uaCBwaMO5IGjhu6NwLiAgDQogIC0gS2nhu4NtIMSR4buLbmggZOG7sWEgdHLDqm4gZGV2aWFuY2UgZ2nDunAgxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggduG7m2kgZOG7ryBsaeG7h3UgcXVhbiBzw6F0Lg0KDQpDaMawxqFuZyBuw6B5IGNobyBwaMOpcCDDoXAgZOG7pW5nIEdMTSB2w6BvIGPDoWMgdOG6rXAgZOG7ryBsaeG7h3UgdGjhu7FjIHThur8gcGjhu6ljIHThuqFwIGjGoW4sIMSR4bq3YyBiaeG7h3QgdHJvbmcgY8OhYyBsxKluaCB24buxYyBjw7MgZOG7ryBsaeG7h3UgZMawxqFuZyBrw6htIG5oaeG7gXUgZ2nDoSB0cuG7iyAwIG5oxrAgYuG6o28gaGnhu4NtLCBzaW5oIGjhu41jLCB2w6AgbmdoacOqbiBj4bupdSB0acOqdSBkw7luZy4NCg0KIyMjIyAqKuG7qG5nIGThu6VuZyB0cm9uZyBSKioNCg0KKipDw6FjIGfDs2kgdsOgIGjDoG0gUiBjaMOtbmggdHJvbmcgQ2jGsMahbmcgMTIqKg0KDQogIC0gYGdsbSgpYCBr4bq/dCBo4bujcCB24bubaSBgZmFtaWx5ID0gdHdlZWRpZSgpYCDEkeG7gyBmaXQgbcO0IGjDrG5oIEdMTSBUd2VlZGllLiBIw6BtIGB0d2VlZGllKClgIMSRxrDhu6NjIGN1bmcgY+G6pXAgYuG7n2kgZ8OzaSBgc3RhdG1vZGAuDQogIC0gYHR3ZWVkaWUucHJvZmlsZSgpYCB04burIGfDs2kgYHR3ZWVkaWVgIMSR4buDIMaw4bubYyBsxrDhu6NuZyBjaOG7iSBz4buRIFR3ZWVkaWUgKM6+KS4NCiAgLSBgZGF0YSgpYCDEkeG7gyB04bqjaSBjw6FjIHThuq1wIGThu68gbGnhu4d1IHbDrSBk4bulIG5oxrAgYGJyZWFrZG93bmAsIGBwb2lzb25gLCBgcG9seXRoZW5lYCwgYGdwc2xlZXBgLCBgcnJhdGVzYCwgYHBlcm1gLCBgbGltZWAsIHbDoCBgcXVpbHBpZWAgdOG7qyBnw7NpIGBHTE1zRGF0YWAuDQoNCiMjICoqS+G6v3QgbHXhuq1uKioNCg0KQ3Xhu5FuIHPDoWNoIG7DoHkgY3VuZyBj4bqlcCBt4buZdCBu4buBbiB04bqjbmcgduG7r25nIGNo4bqvYyBj4bqjIHbhu4EgbMO9IHRodXnhur90IHbDoCDhu6luZyBk4bulbmcgY2hvIHZp4buHYyBwaMOibiB0w61jaCBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdsOgIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0IGLhurFuZyBSLiBW4bubaSDEkeG7i25oIGjGsOG7m25nIHBow6F0IHRyaeG7g24gdMawIGR1eSBtw7QgaMOsbmggaMOzYSwga+G7uSBuxINuZyBjaOG6qW4gxJFvw6FuIHbDoCBwaOG6o24gYmnhu4duIHRo4buRbmcga8OqLCDEkcOieSBsw6AgdMOgaSBsaeG7h3UgbMO9IHTGsOG7n25nIGNobyBuaOG7r25nIGFpIGzDoG0gdmnhu4djIHRyb25nIGzEqW5oIHbhu7FjIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHRo4buxYyBuZ2hp4buHbS4NCg0KLS0tDQoNCiMgKipQSOG6pk4gMjogVEjhu5BORyBLw4ogTcOUIFThuqIgROG7riBMSeG7hlUqKg0KDQojIyAqKkdp4bubaSB0aGnhu4d1IGLhu5kgZOG7ryBsaeG7h3UqKg0KDQoqKlThuqNpIGThu68gbGnhu4d1KioNCmBgYHtyfQ0KbGlicmFyeSgiY3N2IikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmRhdGEgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0FkbWluL0Rvd25sb2Fkcy9TdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMuY3N2IiwgaGVhZGVyID0gVCkNCmRhdGEudGFibGUoZGF0YSkNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2ggY8OhYyBiaeG6v24qKg0KDQpC4buZIGThu68gbGnhu4d1IGdoaSBs4bqhaSB0aMO0bmcgdGluIHbhu4EgY8OhYyBnaWFvIGThu4tjaCBtdWEgaMOgbmcgY+G7p2Ega2jDoWNoIGjDoG5nLCBiYW8gZ+G7k20gdGjDtG5nIHRpbiBuaMOibiBraOG6qXUgaOG7jWMsIHRow7RuZyB0aW4gc+G6o24gcGjhuqltLCBz4buRIGzGsOG7o25nIGLDoW4gcmEgdsOgIGRvYW5oIHRodS4gROG7ryBsaeG7h3UgYmFvIGfhu5NtIDE0MDU5IHF1YW4gc8OhdCB2w6AgMTYgYmnhur9uLiBExrDhu5tpIMSRw6J5IGzDoCBtw7QgdOG6oyBjaGkgdGnhur90IGPDoWMgYmnhur9uIGPDsyB0cm9uZyBi4buZIGThu68gbGnhu4d1Og0KDQp8ICAgICoqVMOqbiBCaeG6v24qKiAgICAgICAgICAgfCAgICAqKsOdIE5naMSpYSoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipQdXJjaGFzZURhdGUqKiAgICAgICAgIHwgTmfDoHkgZ2lhbyBk4buLY2ggbXVhIGjDoG5nIGRp4buFbiByYSAoxJHhu4tuaCBk4bqhbmcgbmfDoHkvdGjDoW5nL27Eg20pLiAgICAgICAgICAgICAgICAgfA0KfCAqKkN1c3RvbWVySUQqKiAgICAgICAgICB8IE3DoyDEkeG7i25oIGRhbmggZHV5IG5o4bqldCBjaG8gbeG7l2kga2jDoWNoIGjDoG5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqR2VuZGVyKiogICAgICAgICAgICAgICB8IEdp4bubaSB0w61uaCBj4bunYSBraMOhY2ggaMOgbmc6ICoqTSoqIChOYW0pLCAqKkYqKiAoTuG7rykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKk1hcml0YWxTdGF0dXMqKiAgICAgICAgfCBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom46ICoqUyoqICjEkOG7mWMgdGjDom4pLCAqKk0qKiAoxJDDoyBr4bq/dCBow7RuKS4gICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkhvbWVvd25lcioqICAgICAgICAgICAgfCBUw6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoDogKipZKiogKEPDsyksICoqTioqIChLaMO0bmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQ2hpbGRyZW4qKiAgICAgICAgICAgICB8IFPhu5EgbMaw4bujbmcgY29uIGPDoWkgY+G7p2Ega2jDoWNoIGjDoG5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkFubnVhbEluY29tZSoqICAgICAgICAgfCBN4bupYyB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gdGhlbyBraG/huqNuZyAoVsOtIGThu6U6ICoqJDMwSyAtICQ1MEsqKikuICAgICAgICAgICAgICAgICAgfA0KfCAqKkNpdHkqKiAgICAgICAgICAgICAgICAgfCBUaMOgbmggcGjhu5EgbsahaSBraMOhY2ggaMOgbmcgdGjhu7FjIGhp4buHbiBnaWFvIGThu4tjaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlN0YXRlb3JQcm92aW5jZSoqICAgICAgfCBCYW5nIGhv4bq3YyB04buJbmggKHbDrSBk4bulOiAqKkNBKiogY2hvIENhbGlmb3JuaWEsICoqT1IqKiBjaG8gT3JlZ29uKS4gICAgICAgICAgICAgICB8DQp8ICoqQ291bnRyeSoqICAgICAgICAgICAgICB8IFF14buRYyBnaWEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUHJvZHVjdEZhbWlseSoqICAgICAgICB8IE5ow7NtIHPhuqNuIHBo4bqpbSBjaMOtbmg6ICoqRm9vZCoqIChUaOG7sWMgcGjhuqltKSwgKipEcmluayoqICjEkOG7kyB14buRbmcpLCAqKk5vbi1Db25zdW1hYmxlKiogKEtow7RuZyB0acOqdSBkw7luZykuIHwNCnwgKipQcm9kdWN0RGVwYXJ0bWVudCoqICAgIHwgQuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIG5oxrAgKipTbmFjayBGb29kcyoqLCAqKkZyb3plbiBGb29kcyoqLCB2LnYuICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUHJvZHVjdENhdGVnb3J5KiogICAgICB8IERhbmggbeG7pWMgc+G6o24gcGjhuqltIGPhu6UgdGjhu4MgaMahbiwgdsOtIGThu6U6ICoqQ2FuZHkqKiwgKipCZWVyIGFuZCBXaW5lKiouICAgICAgICAgICAgICB8DQp8ICoqVW5pdHNTb2xkKiogICAgICAgICAgICB8IFPhu5EgbMaw4bujbmcgxJHGoW4gduG7iyBz4bqjbiBwaOG6qW0gxJHDoyBiw6FuIHRyb25nIGdpYW8gZOG7i2NoIMSRw7MuICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipSZXZlbnVlKiogICAgICAgICAgICAgIHwgRG9hbmggdGh1IHThu6sgZ2lhbyBk4buLY2ggKHTDrW5oIHRoZW8gVVNEKS4gICB8DQoNCg0KDQpUcsaw4bubYyBraGkgdGnhur9uIGjDoG5oIHRo4buRbmcga8OqIG3DtCB04bqjIGPDoWMgYmnhur9uIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UsIHRhIHRp4bq/biBow6BuaCBwaMOibiBsb+G6oWkgZOG7ryBsaeG7h3UgdGjDoG5oIDIgbmjDs20gYmFvIGfhu5NtOiBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oIHbDoCBk4buvIGxp4buHdSDEkeG7i25oIGzGsOG7o25nIG5oxrAgc2F1Og0KDQoqKlBow6JuIGxv4bqhaSBiaeG6v24gdGhlbyBraeG7g3UgZOG7ryBsaeG7h3U6KioNCg0KKipE4buvIGxp4buHdSDEkOG7i25oIHTDrW5oOioqDQoNCnwgICAgKipUw6puIEJp4bq/bioqICAgICAgICAgICB8ICAgICoqw50gTmdoxKlhKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAqKkdlbmRlcioqICAgICAgICAgICAgICAgfCBHaeG7m2kgdMOtbmggY+G7p2Ega2jDoWNoIGjDoG5nOiAqKk0qKiAoTmFtKSwgKipGKiogKE7hu68pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipNYXJpdGFsU3RhdHVzKiogICAgICAgIHwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuOiAqKlMqKiAoxJDhu5ljIHRow6JuKSwgKipNKiogKMSQw6Mga+G6v3QgaMO0bikuICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipIb21lb3duZXIqKiAgICAgICAgICAgIHwgVMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6A6ICoqWSoqIChDw7MpLCAqKk4qKiAoS2jDtG5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkFubnVhbEluY29tZSoqICAgICAgICAgfCBN4bupYyB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gdGhlbyBraG/huqNuZyAoVsOtIGThu6U6ICoqJDMwSyAtICQ1MEsqKikuICAgICAgICAgICAgICAgICAgfA0KfCAqKkNpdHkqKiAgICAgICAgICAgICAgICAgfCBUaMOgbmggcGjhu5EgbsahaSBraMOhY2ggaMOgbmcgdGjhu7FjIGhp4buHbiBnaWFvIGThu4tjaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlN0YXRlb3JQcm92aW5jZSoqICAgICAgfCBCYW5nIGhv4bq3YyB04buJbmggKHbDrSBk4bulOiAqKkNBKiogY2hvIENhbGlmb3JuaWEsICoqT1IqKiBjaG8gT3JlZ29uKS4gICAgICAgICAgICAgICB8DQp8ICoqQ291bnRyeSoqICAgICAgICAgICAgICB8IFF14buRYyBnaWEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUHJvZHVjdEZhbWlseSoqICAgICAgICB8IE5ow7NtIHPhuqNuIHBo4bqpbSBjaMOtbmg6ICoqRm9vZCoqIChUaOG7sWMgcGjhuqltKSwgKipEcmluayoqICjEkOG7kyB14buRbmcpLCAqKk5vbi1Db25zdW1hYmxlKiogKEtow7RuZyB0acOqdSBkw7luZykuIHwNCnwgKipQcm9kdWN0RGVwYXJ0bWVudCoqICAgIHwgQuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIG5oxrAgKipTbmFjayBGb29kcyoqLCAqKkZyb3plbiBGb29kcyoqLCB2LnYuICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUHJvZHVjdENhdGVnb3J5KiogICAgICB8IERhbmggbeG7pWMgc+G6o24gcGjhuqltIGPhu6UgdGjhu4MgaMahbiwgdsOtIGThu6U6ICoqQ2FuZHkqKiwgKipCZWVyIGFuZCBXaW5lKiouICAgICAgICAgICAgICB8DQoNCioqROG7ryBsaeG7h3UgxJDhu4tuaCBsxrDhu6NuZzoqKg0KDQp8ICAgICoqVMOqbiBCaeG6v24qKiAgICAgICAgICAgfCAgICAqKsOdIE5naMSpYSoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipDaGlsZHJlbioqICAgICAgICAgICAgIHwgU+G7kSBsxrDhu6NuZyBjb24gY8OhaSBj4bunYSBraMOhY2ggaMOgbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqVW5pdHNTb2xkKiogICAgICAgICAgICB8IFPhu5EgbMaw4bujbmcgxJHGoW4gduG7iyBz4bqjbiBwaOG6qW0gxJHDoyBiw6FuIHRyb25nIGdpYW8gZOG7i2NoIMSRw7MuICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipSZXZlbnVlKiogICAgICAgICAgICAgIHwgRG9hbmggdGh1IHThu6sgZ2lhbyBk4buLY2ggKHTDrW5oIHRoZW8gVVNEKS4gICB8DQoNCg0KIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBjw6FjIGJp4bq/biB0cm9uZyBi4buZIGThu68gbGnhu4d1KioNCg0KIyMjICoqUGjDom4gdMOtY2ggY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQoNCiMjIyMgKipCaeG6v24gR2VuZGVyKioNCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhJEdlbmRlcikNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhJEdlbmRlcikvc3VtKHRhYmxlKGRhdGEkR2VuZGVyKSkNCmBgYA0KDQoqKlbhur0gxJHhu5MgdGjhu4sqKg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQpkYXRhICU+JQ0KICBncm91cF9ieShHZW5kZXIpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IEdlbmRlciwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzg5Q0ZGMCIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgKw0KICB0aGVtZV9idygpICsNCiAgbGFicyh5ID0gIk51bWJlciIpIA0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IMSRxrDhu6NjDQoNCi0gVOG6p24gc+G7kSBjaG8gdGjhuqV5IGPDsyBz4buxIGNow6puaCBs4buHY2ggbmjhurkgduG7gSBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBnaeG7r2EgaGFpIGdp4bubaSB0w61uaCwgduG7m2kgNzE3MCBraMOhY2ggaMOgbmcgbuG7ryBnaGkgbmjhuq1uIMSRxrDhu6NjIHNvIHbhu5tpIDY4ODkga2jDoWNoIGjDoG5nIG5hbSB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4NCi0gVuG7gSB04bqnbiBzdeG6pXQsIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbuG7ryB2w6AgbmFtIHRyb25nIHThuq1wIGThu68gbGnhu4d1IG7DoHkgZ+G6p24gbmjGsCB0xrDGoW5nIMSRxrDGoW5nLCBs4bqnbiBsxrDhu6N0IGNoaeG6v20ga2hv4bqjbmcgNTAuMTAlIHbDoCA0OS45MCUgdOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nLCBjaG8gdGjhuqV5IG3hu5l0IHPhu7EgcGjDom4gYuG7kSBnaeG7m2kgdMOtbmgga2jDoSBjw6JuIGLhurFuZy4NCg0KIyMjIyAqKkJp4bq/biBNYXJpdGFsU3RhdHVzKioNCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhJE1hcml0YWxTdGF0dXMpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YSRNYXJpdGFsU3RhdHVzKS9zdW0odGFibGUoZGF0YSRNYXJpdGFsU3RhdHVzKSkNCmBgYA0KDQoqKlbhur0gxJHhu5MgdGjhu4sqKg0KYGBge3J9DQpkYXRhICU+JQ0KICBncm91cF9ieShNYXJpdGFsU3RhdHVzKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBNYXJpdGFsU3RhdHVzLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjRkZEQUI5IiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyggeCA9ICJNYXJpdGFsIFN0YXR1cyIsIHkgPSAiTnVtYmVyIikgKw0KICB0aGVtZV9idygpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKiBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyB0YSB0aOG6pXkgxJHGsOG7o2MNCg0KLSBW4buBIHThuqduIHPhu5EsIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGPDsyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gJ8SQ4buZYyB0aMOibicgKFMpIGzDoCA3MTkzIGNhbyBoxqFuIHNvIHbhu5tpIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nICfEkMOjIGvhur90IGjDtG4nIChNKSBsw6AgNjg2NiB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBuw6B5Lg0KLSBYw6l0IHbhu4EgdOG6p24gc3XhuqV0LCB04bu3IGzhu4cga2jDoWNoIGjDoG5nICfEkOG7mWMgdGjDom4nIChTKSBjaGnhur9tIGtob+G6o25nIDUxLjE2JSB04buVbmcgc+G7kSBraMOhY2ggaMOgbmcsIHRyb25nIGtoaSB04bu3IGzhu4cga2jDoWNoIGjDoG5nICfEkMOjIGvhur90IGjDtG4nIChNKSBsw6Aga2hv4bqjbmcgNDguODQlLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyDEkeG7mWMgdGjDom4gY2hp4bq/bSBwaOG6p24gbOG7m24gaMahbiBt4buZdCBjaMO6dCB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBuw6B5Lg0KDQojIyMjICoqQmnhur9uIEhvbWVvd25lcioqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YSRIb21lb3duZXIpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YSRIb21lb3duZXIpL3N1bSh0YWJsZShkYXRhJEhvbWVvd25lcikpDQpgYGANCg0KKipW4bq9IMSR4buTIHRo4buLKioNCmBgYHtyfQ0KZGF0YSAlPiUNCiAgZ3JvdXBfYnkoSG9tZW93bmVyKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBIb21lb3duZXIsIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiNGMDgwODAiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKCB4ID0gIkhvbWVvd25lciIsIHkgPSAiTnVtYmVyIikgKw0KICB0aGVtZV9idygpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKiBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyB0YSB0aOG6pXkgxJHGsOG7o2MNCg0KLSBW4buBIHThuqduIHPhu5EsIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGPDsyBz4bufIGjhu691IG5ow6AgKFkpIGzDoCA4NDQ0LCBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChOKSBsw6AgNTYxNSB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBuw6B5Lg0KLSBYw6l0IHbhu4EgdOG6p24gc3XhuqV0LCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyBz4bufIGjhu691IG5ow6AgKFkpIGNoaeG6v20ga2hv4bqjbmcgNjAuMDYlIHThu5VuZyBz4buRIGtow6FjaCBow6BuZywgdHJvbmcga2hpIHThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIHPhu58gaOG7r3UgbmjDoCAoTikgbMOgIGtob+G6o25nIDM5Ljk0JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIGtow6FjaCBow6BuZyB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBuw6B5IHRodeG7mWMgbmjDs20gc+G7nyBo4buvdSBuaMOgLg0KDQoNCiMjIyMgKipCaeG6v24gQW5udWFsSW5jb21lKioNCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGEkQW5udWFsSW5jb21lKQ0KI0LhuqNuZyB04bqnbiBzdeG6pXQNCnRhYmxlKGRhdGEkQW5udWFsSW5jb21lKS9zdW0odGFibGUoZGF0YSRBbm51YWxJbmNvbWUpKQ0KYGBgDQoNCioqVuG6vSDEkeG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KZGF0YSAlPiUNCiAgZ3JvdXBfYnkoQW5udWFsSW5jb21lKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBbm51YWxJbmNvbWUsIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiNGMDgwODAiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKCB4ID0gIkFubnVhbEluY29tZSIsIHkgPSAiTnVtYmVyIikgKw0KICB0aGVtZV9idygpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKiBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyB0YSB0aOG6pXkgxJHGsOG7o2MNCg0KKipOaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCBuaOG6pXQ6KiogS2hv4bqjbmcgKiokMTBLIC0gJDMwSyoqIGNoaeG6v20gdOG7tyBs4buHIMSRw6FuZyBr4buDIHbhu5tpIDMwOTAga2jDoWNoIGjDoG5nLCB0xrDGoW5nIMSRxrDGoW5nIGtob+G6o25nIDIxLjk4JSB04buVbmcgc+G7kSBraMOhY2ggaMOgbmcuIMSQw6J5IGzDoCBuaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCBuaOG6pXQgxJHGsOG7o2MgZ2hpIG5o4bqtbiB2w6AgY2hp4bq/bSBoxqFuIG3hu5l0IHBo4bqnbiBuxINtIHThu5VuZyBz4buRIGtow6FjaCBow6BuZy4NCg0KKipOaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCB0cnVuZyBiw6xuaDoqKiBUaeG6v3AgdGhlbyBsw6Aga2hv4bqjbmcgKiokMzBLIC0gJDUwSyoqLCDEkcOieSBsw6AgbmjDs20gY8OzIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGzhu5tuIG5o4bqldCB24bubaSA0NjAxIG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIDMyLjczJS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgxJHDonkgbMOgIG3hu6ljIHRodSBuaOG6rXAgcGjhu5UgYmnhur9uIG5o4bqldCB0cm9uZyB04bqtcCBraMOhY2ggaMOgbmcuDQoNCioqTmjDs20gdGh1IG5o4bqtcCB0cnVuZyBiw6xuaDoqKiBLaG/huqNuZyAqKiQ1MEsgLSAkNzBLKiogY8OzIDIzNzAga2jDoWNoIGjDoG5nLCBjaGnhur9tIGtob+G6o25nIDE2Ljg2JS4gxJDDonkgbMOgIG5ow7NtIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmgsIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGhhaSBuaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCBoxqFuLg0KDQoqKkPDoWMgbmjDs20gdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCBjYW86KioNCg0KIC0gS2hv4bqjbmcgKiokNzBLIC0gJDkwSyoqIGPDsyAxNzA5IGtow6FjaCBow6BuZywgY2hp4bq/bSBraG/huqNuZyAxMi4xNiUuDQogLSBLaG/huqNuZyAqKiQ5MEsgLSAkMTEwSyoqIGPDsyA2MTMga2jDoWNoIGjDoG5nLCBjaGnhur9tIGtob+G6o25nIDQuMzYlLiBT4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyDhu58ga2hv4bqjbmcgdGh1IG5o4bqtcCBuw6B5IGdp4bqjbSDEkcOhbmcga+G7gyBzbyB24bubaSBjw6FjIG5ow7NtIHRo4bqlcCBoxqFuLg0KIC0gS2hv4bqjbmcgKiokMTEwSyAtICQxMzBLKiogY8OzIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIHRo4bqlcCBuaOG6pXQgdHJvbmcgY8OhYyBraG/huqNuZyBkxrDhu5tpICoqJDE1MEsrKiosIHbhu5tpIGNo4buJIDU3MiBraMOhY2ggaMOgbmcsIGNoaeG6v20ga2hv4bqjbmcgNC4wNSUuDQogDQoqKk5ow7NtIHRodSBuaOG6rXAgY2FvOioqIEtob+G6o25nICoqJDEzMEsgLSAkMTUwSyoqIGPDsyA3NjAga2jDoWNoIGjDoG5nLCBjaGnhur9tIGtob+G6o25nIDUuNDElLiBT4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyDhu58gbmjDs20gdGh1IG5o4bqtcCBuw6B5IGPDsyBz4buxIHTEg25nIG5o4bq5IHNvIHbhu5tpIGtob+G6o25nICoqJDExMEsgLSAkMTMwSyoqLg0KDQoqKk5ow7NtIHRodSBuaOG6rXAgY2FvIG5o4bqldDoqKiBDdeG7kWkgY8O5bmcsIGtob+G6o25nIHRodSBuaOG6rXAgKiokMTUwSysqKiBjaOG7iSBjw7MgMjczIGtow6FjaCBow6BuZywgY2hp4bq/bSB04bu3IGzhu4cgcuG6pXQgbmjhu48sIGtob+G6o25nIDEuOTQlLiDEkMOieSBsw6AgbmjDs20ga2jDoWNoIGjDoG5nIGPDsyB0aHUgbmjhuq1wIGNhbyBuaOG6pXQgbmjGsG5nIGzhuqFpIGNoaeG6v20gcGjhuqduIHRyxINtIMOtdCBuaOG6pXQgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UuDQoNCioqVOG7lW5nIHF1YW46KioNCg0KUGjDom4gYuG7kSB0aHUgbmjhuq1wIGPhu6dhIHThuq1wIGtow6FjaCBow6BuZyBuw6B5IGNobyB0aOG6pXkgc+G7sSB04bqtcCB0cnVuZyDEkcOhbmcga+G7gyDhu58gY8OhYyBt4bupYyB0aHUgbmjhuq1wIHRo4bqlcCB2w6AgdHJ1bmcgYsOsbmggKiooJDEwSyAtICQ1MEspKiosIGNoaeG6v20gaMahbiBt4buZdCBu4butYSB04buVbmcgc+G7kSBraMOhY2ggaMOgbmcuIEtoaSBt4bupYyB0aHUgbmjhuq1wIHTEg25nIGThuqduLCBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyB4dSBoxrDhu5tuZyBnaeG6o20sIMSR4bq3YyBiaeG7h3QgbMOgIOG7nyBjw6FjIGtob+G6o25nIHRodSBuaOG6rXAgdHLDqm4gKiokOTBLKiouIE5ow7NtIGtow6FjaCBow6BuZyBjw7MgdGh1IG5o4bqtcCBjYW8gbmjhuqV0ICoqKCQxNTBLKykqKiBjaOG7iSBjaGnhur9tIG3hu5l0IHBo4bqnbiBy4bqldCBuaOG7jy4NCg0KDQojIyMjICoqQmnhur9uIENpdHkqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKlwNCg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGEkQ2l0eSkNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhJENpdHkpL3N1bSh0YWJsZShkYXRhJENpdHkpKQ0KYGBgDQoNCioqVuG6vSDEkeG7kyB0aOG7iyoqXA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHBhdGNod29yaykNCg0KDQojIEdp4bqjIHPhu60gJ2RhdGEnIGzDoCBkYXRhIGZyYW1lIGPhu6dhIGLhuqFuDQpjaXR5X2NvdW50cyA8LSBkYXRhICU+JQ0KICBncm91cF9ieShDaXR5KSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICMgU+G6r3AgeOG6v3AgdGhlbyBz4buRIGzGsOG7o25nIGdp4bqjbSBk4bqnbg0KDQpuX2NpdGllcyA8LSBucm93KGNpdHlfY291bnRzKQ0KbWlkX3BvaW50IDwtIGNlaWxpbmcobl9jaXRpZXMgLyAyKQ0KDQojIEThu68gbGnhu4d1IGNobyBiaeG7g3UgxJHhu5MgdGjhu6kgbmjhuqV0IChu4butYSB0csOqbiB0aGVvIHPhu5EgbMaw4bujbmcpDQp0b3BfaGFsZl9jaXRpZXMgPC0gaGVhZChjaXR5X2NvdW50cywgbWlkX3BvaW50KQ0KDQpwbG90MV9jaXR5X2NvdW50IDwtIGdncGxvdCh0b3BfaGFsZl9jaXRpZXMsIGFlcyh4ID0gQ2l0eSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0RCNzA5MyIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSArDQogIGxhYnMoeCA9ICJDaXR5IiwgeSA9ICJOdW1iZXIiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSA4KSkNCg0KIyBE4buvIGxp4buHdSBjaG8gYmnhu4N1IMSR4buTIHRo4bupIGhhaSAobuG7rWEgZMaw4bubaSB0aGVvIHPhu5EgbMaw4bujbmcpDQpib3R0b21faGFsZl9jaXRpZXMgPC0gdGFpbChjaXR5X2NvdW50cywgbl9jaXRpZXMgLSBtaWRfcG9pbnQpDQoNCnBsb3QyX2NpdHlfY291bnQgPC0gZ2dwbG90KGJvdHRvbV9oYWxmX2NpdGllcywgYWVzKHggPSBDaXR5LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjREI3MDkzIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsNCiAgbGFicyh4ID0gIkNpdHkiLCB5ID0gIk51bWJlciIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDgpKQ0KDQojIEvhur90IGjhu6NwIGhhaSBiaeG7g3UgxJHhu5MgbOG6oWkgduG7m2kgbmhhdQ0KcGxvdDFfY2l0eV9jb3VudCArIHBsb3QyX2NpdHlfY291bnQNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IMSRxrDhu6NjDQoNCioqQ8OhYyB0aMOgbmggcGjhu5EgY8OzIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggbOG7m246KioNCg0KLSAqKlZhbmNvdXZlcioqOiBHaGkgbmjhuq1uIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggY2FvIG5o4bqldCB24bubaSAxMzg2IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDkuODYlIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KLSAqKlRhY29tYSoqOiBDxaluZyBjw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCDEkcOhbmcga+G7gyB24bubaSAxMjU3IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDguOTQlIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KLSAqKlNlYXR0bGUqKjogQ8OzIDkyMiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyA2LjU2JSB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4NCi0gKipMb3MgQW5nZWxlcyoqOiBHaGkgbmjhuq1uIDkyNiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyA2LjU5JSB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4NCi0gKipQb3J0bGFuZCoqOiBDw7MgODc2IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDYuMjMlIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KLSAqKlNhbiBEaWVnbyoqOiBDw7MgODY2IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDYuMTYlIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KLSAqKkhpZGFsZ28qKjogQ8OzIDg0NSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyA2LjAxJSB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4NCi0gKipCcmVtZXJ0b24qKjogR2hpIG5o4bqtbiA4MzQgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNS45MyUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQotICoqQmV2ZXJseSBIaWxscyoqOiBDw7MgODExIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDUuNzclIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KDQoqKkPDoWMgdGjDoG5oIHBo4buRIGPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRydW5nIGLDrG5oOioqDQoNCi0gKipTYWxlbSoqOiBDw7MgMTM4NiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyA5Ljg2JSB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4NCi0gKipTcG9rYW5lKio6IEPDsyA4NzUgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNi4yMiUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQotICoqTWVyaWRhKio6IEPDsyA2NTQgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNC42NSUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQotICoqU2FuIEFuZHJlcyoqOiBDw7MgNjIxIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDQuNDIlIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KLSAqKlZhbmNvdXZlcioqOiBDw7MgNjMzIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDQuNTAlIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KLSAqKk9yaXphYmEqKjogQ8OzIDQ2NCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAzLjMwJSB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4NCi0gKipDYW1hY2hvKio6IEPDsyA0NTIgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMy4yMiUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQotICoqQWNhcHVsY28qKjogQ8OzIDM4MyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAyLjcyJSB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4NCi0gKipZYWtpbWEqKjogQ8OzIDM3NiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAyLjY3JSB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4NCi0gKipNZXhpY28gQ2l0eSoqOiBDw7MgMTk0IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEuMzglIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KLSAqKldhbGxhIFdhbGxhKio6IEPDsyAxNjAgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS4xNCUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQotICoqQmVsbGluZ2hhbSoqOiBDw7MgMTQzIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEuMDElIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KDQoqKkPDoWMgdGjDoG5oIHBo4buRIGPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRo4bqlcDoqKg0KDQotICoqVmljdG9yaWEqKjogQ8OzIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggdGjhuqVwIHbhu5tpIDE3NiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjI1JSB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4NCi0gKipHdWFkYWxhamFyYSoqOiBDw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCBy4bqldCB0aOG6pXAgduG7m2kgY2jhu4kgNzUgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMC41MyUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQotICoqRnJhbmNpc2NvKio6IEPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRo4bqlcCB24bubaSAxMzAgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMC45MiUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQoNCioqVOG7lW5nIHF1YW46KioNCg0KUGjDom4gdMOtY2ggY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5EgZ2lhbyBk4buLY2gga2jDtG5nIMSR4buTbmcgxJHhu4F1IGdp4buvYSBjw6FjIHRow6BuaCBwaOG7kS4gTeG7mXQgc+G7kSB0aMOgbmggcGjhu5EgbmjGsCBWYW5jb3V2ZXIgdsOgIFRhY29tYSBjaGnhur9tIHThu7cgbOG7hyBnaWFvIGThu4tjaCBjYW8gbmjhuqV0LCBjaG8gdGjhuqV5IMSRw6J5IGPDsyB0aOG7gyBsw6AgY8OhYyB0aOG7iyB0csaw4budbmcgcXVhbiB0cuG7jW5nIGhv4bq3YyBjw7MgbMaw4bujbmcga2jDoWNoIGjDoG5nIGhv4bqhdCDEkeG7mW5nIGzhu5tuIGjGoW4uIE5nxrDhu6NjIGzhuqFpLCBt4buZdCBz4buRIHRow6BuaCBwaOG7kSBraMOhYyBuaMawIEd1YWRhbGFqYXJhIHbDoCBWaWN0b3JpYSBjw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCBy4bqldCB0aOG6pXAuDQoNCiMjIyMgKipCaeG6v24gU3RhdGVvclByb3ZpbmNlKioNCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGEkU3RhdGVvclByb3ZpbmNlKQ0KI0LhuqNuZyB04bqnbiBzdeG6pXQNCnRhYmxlKGRhdGEkU3RhdGVvclByb3ZpbmNlKS9zdW0odGFibGUoZGF0YSRTdGF0ZW9yUHJvdmluY2UpKQ0KYGBgDQoNCg0KKipW4bq9IMSR4buTIHRo4buLKioNCg0KYGBge3J9DQpkYXRhICU+JQ0KICBncm91cF9ieShTdGF0ZW9yUHJvdmluY2UpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IFN0YXRlb3JQcm92aW5jZSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0YwODA4MCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoIHggPSAiU3RhdGVvclByb3ZpbmNlIiwgeSA9ICJOdW1iZXIiKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KiogROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IMSRxrDhu6NjDQoNCioqQ8OhYyBCYW5nL1Thu4luaCBjw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCBs4bubbjoqKg0KDQotICoqV0EgKFdhc2hpbmd0b24pOioqIEdoaSBuaOG6rW4gc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCBjYW8gbmjhuqV0IHbhu5tpIDQ1NjcgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMzIuNDglIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLiDEkMOieSBsw6Aga2h1IHbhu7FjIGPDsyBob+G6oXQgxJHhu5luZyBnaWFvIGThu4tjaCB2xrDhu6N0IHRy4buZaSBzbyB24bubaSBjw6FjIGtodSB24buxYyBraMOhYy4NCi0gKipDQSAoQ2FsaWZvcm5pYSk6KiogxJDhu6luZyB0aOG7qSBoYWkgduG7m2kgMjczMyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxOS40NCUuIENhbGlmb3JuaWEgY8WpbmcgbMOgIG3hu5l0IGtodSB24buxYyBjw7MgbMaw4bujbmcgZ2lhbyBk4buLY2ggcuG6pXQgxJHDoW5nIGvhu4MuDQotICoqT1IgKE9yZWdvbik6KiogQ8OzIDIyNjIgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMTYuMDklLiBPcmVnb24gbMOgIG3hu5l0IGtodSB24buxYyBxdWFuIHRy4buNbmcga2jDoWMgduG7gSBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoLg0KLSAqKlphY2F0ZWNhczoqKiBHaGkgbmjhuq1uIDEyOTcgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgOS4yMyUuDQoNCioqQ8OhYyBCYW5nL1Thu4luaCBjw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCB0cnVuZyBiw6xuaDoqKg0KDQotICoqQkMgKEJyaXRpc2ggQ29sdW1iaWEpOioqIEPDsyA4MDkgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNS43NSUuDQotICoqREYgKERpc3RyaXRvIEZlZGVyYWwpOioqIEPDsyA4MTUgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNS44MCUuDQotICoqWXVjYXRhbjoqKiBDw7MgNjU0IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDQuNjUlLg0KLSAqKlZlcmFjcnV6OioqIEPDsyA0NjQgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMy4zMCUuDQotICoqR3VlcnJlcm86KiogQ8OzIDM4MyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAyLjcyJS4NCg0KKipDw6FjIEJhbmcvVOG7iW5oIGPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRo4bqlcDoqKg0KDQotICoqSmFsaXNjbzoqKiBDw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCB0aOG6pXAgbmjhuqV0IHbhu5tpIGNo4buJIDc1IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDAuNTMlLg0KDQoqKlThu5VuZyBxdWFuOioqDQoNClBow6JuIHTDrWNoIGNobyB0aOG6pXkgc+G7sSB04bqtcCB0cnVuZyBnaWFvIGThu4tjaCBy4bqldCBs4bubbiDhu58gYmEgYmFuZy904buJbmggbMOgIFdhc2hpbmd0b24gKFdBKSwgQ2FsaWZvcm5pYSAoQ0EpLCB2w6AgT3JlZ29uIChPUiksIGNoaeG6v20gcGjhuqduIGzhu5tuIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLiBaYWNhdGVjYXMgY8WpbmcgxJHDs25nIGfDs3AgbeG7mXQgbMaw4bujbmcgZ2lhbyBk4buLY2ggxJHDoW5nIGvhu4MuIEPDoWMga2h1IHbhu7FjIGPDsm4gbOG6oWkgY8OzIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggw610IGjGoW4gbmhp4buBdSwgxJHhurdjIGJp4buHdCBsw6AgSmFsaXNjby4gDQoNCiMjIyMgKipCaeG6v24gQ291bnRyeSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhJENvdW50cnkpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YSRDb3VudHJ5KS9zdW0odGFibGUoZGF0YSRDb3VudHJ5KSkNCmBgYA0KDQoqKlbhur0gxJHhu5MgdGjhu4sqKiANCg0KYGBge3J9DQpkYXRhICU+JQ0KICBncm91cF9ieShDb3VudHJ5KSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBDb3VudHJ5LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjNjQ5NUVEIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyggeCA9ICJDb3VudHJ5IiwgeSA9ICJOdW1iZXIiKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTIHRhIHRo4bqleSDEkcaw4bujYw0KDQoqKlBow6JuIGLhu5EgZ2lhbyBk4buLY2ggdGhlbyBxdeG7kWMgZ2lhOioqDQoNCi0gKipVU0EgKEhvYSBL4buzKToqKiBHaGkgbmjhuq1uIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggY2FvIG5o4bqldCB24bubaSA5NTYyIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nICoqNjguMDElKiogdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guIEhvYSBL4buzIGzDoCB0aOG7iyB0csaw4budbmcgY2hp4bq/bSDGsHUgdGjhur8gdHV54buHdCDEkeG7kWkgduG7gSBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoLg0KLSAqKk1leGljbzoqKiDEkOG7qW5nIHRo4bupIGhhaSB24bubaSAzNjg4IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nICoqMjYuMjMlKiogdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guIE1leGljbyBsw6AgdGjhu4sgdHLGsOG7nW5nIGzhu5tuIHRo4bupIGhhaSwgdHV5IG5oacOqbiB24bqrbiBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4Mgc28gduG7m2kgSG9hIEvhu7MuDQotICoqQ2FuYWRhOioqIEPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRo4bqlcCBuaOG6pXQgdHJvbmcgYmEgcXXhu5FjIGdpYSB24bubaSA4MDkgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgKio1Ljc1JSoqIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KDQoqKlThu5VuZyBxdWFuOioqDQoNClBow6JuIHTDrWNoIGNobyB0aOG6pXkgc+G7sSB04bqtcCB0cnVuZyBnaWFvIGThu4tjaCBjaOG7pyB54bq/dSDhu58gSG9hIEvhu7MsIGNoaeG6v20gaMahbiBoYWkgcGjhuqduIGJhIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLiBNZXhpY28gbMOgIHRo4buLIHRyxrDhu51uZyBxdWFuIHRy4buNbmcgdGjhu6kgaGFpLCDEkcOzbmcgZ8OzcCBoxqFuIG3hu5l0IHBo4bqnbiB0xrAgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guIENhbmFkYSBjw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBoYWkgcXXhu5FjIGdpYSBjw7JuIGzhuqFpLiBUaMO0bmcgdGluIG7DoHkgY2hvIHRo4bqleSBIb2EgS+G7syBsw6AgdGjhu4sgdHLGsOG7nW5nIG3hu6VjIHRpw6p1IGNow61uaCwgdGnhur9wIHRoZW8gbMOgIE1leGljbywgdsOgIENhbmFkYSBjw7MgdGjhu4MgbMOgIG3hu5l0IHRo4buLIHRyxrDhu51uZyBuaOG7jyBoxqFuIGhv4bq3YyBjw7MgdGnhu4FtIG7Eg25nIHBow6F0IHRyaeG7g24ga2jDoWMgYmnhu4d0LiANCg0KIyMjIyAqKkJp4bq/biBQcm9kdWN0IEZhbWlseSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhJFByb2R1Y3RGYW1pbHkpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YSRQcm9kdWN0RmFtaWx5KS9zdW0odGFibGUoZGF0YSRQcm9kdWN0RmFtaWx5KSkNCmBgYA0KDQoqKlbhur0gxJHhu5MgdGjhu4sqKg0KDQpgYGB7cn0NCmRhdGEgJT4lDQogIGdyb3VwX2J5KFByb2R1Y3RGYW1pbHkpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IFByb2R1Y3RGYW1pbHksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM0NjgyQjQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKCB4ID0gIlByb2R1Y3QgRmFtaWx5IiwgeSA9ICJOdW1iZXIiKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTIHRhIHRo4bqleSDEkcaw4bujYw0KDQoqKlBow6JuIGLhu5EgZ2lhbyBk4buLY2ggdGhlbyBuaMOzbSBz4bqjbiBwaOG6qW06KioNCg0KLSAqKkZvb2QgKFRo4buxYyBwaOG6qW0pOioqIEdoaSBuaOG6rW4gc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCBjYW8gbmjhuqV0IHbhu5tpIDEwMTUzIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nICoqNzIuMjIlKiogdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guIE5ow7NtIFRo4buxYyBwaOG6qW0gY2hp4bq/bSBwaOG6p24gbOG7m24gY8OhYyBnaWFvIGThu4tjaC4NCi0gKipOb24tQ29uc3VtYWJsZSAoS2jDtG5nIHRpw6p1IGTDuW5nKToqKiDEkOG7qW5nIHRo4bupIGhhaSB24bubaSAyNjU2IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nICoqMTguODklKiogdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guIE5ow7NtIHPhuqNuIHBo4bqpbSBraMO0bmcgdGnDqnUgZMO5bmcgY8WpbmcgY8OzIG3hu5l0IGzGsOG7o25nIGdpYW8gZOG7i2NoIMSRw6FuZyBr4buDLg0KLSAqKkRyaW5rICjEkOG7kyB14buRbmcpOioqIEPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRo4bqlcCBuaOG6pXQgdHJvbmcgYmEgbmjDs20gduG7m2kgMTI1MCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAqKjguODklKiogdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQoNCioqVOG7lW5nIHF1YW46KioNCg0KUGjDom4gdMOtY2ggY2hvIHRo4bqleSBuaMOzbSBz4bqjbiBwaOG6qW0gVGjhu7FjIHBo4bqpbSBjaGnhur9tIMawdSB0aOG6vyB0dXnhu4d0IMSR4buRaSB24buBIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2gsIGNoaeG6v20gZ+G6p24gYmEgcGjhuqduIHTGsCB04buVbmcgc+G7kSBnaWFvIGThu4tjaC4gTmjDs20gc+G6o24gcGjhuqltIEtow7RuZyB0acOqdSBkw7luZyDEkeG7qW5nIHRo4bupIGhhaSwgxJHDs25nIGfDs3AgZ+G6p24gbeG7mXQgcGjhuqduIG7Eg20gdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guIE5ow7NtIMSQ4buTIHXhu5FuZyBjw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBoYWkgbmjDs20gY8OybiBs4bqhaS4gDQoNCiMjIyMgKipCaeG6v24gUHJvZHVjdCBEZXBhcnRtZW50KioNCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhJFByb2R1Y3REZXBhcnRtZW50KQ0KI0LhuqNuZyB04bqnbiBzdeG6pXQNCnRhYmxlKGRhdGEkUHJvZHVjdERlcGFydG1lbnQpL3N1bSh0YWJsZShkYXRhJFByb2R1Y3REZXBhcnRtZW50KSkNCmBgYA0KDQoqKlbhur0gxJHhu5MgdGjhu4sqKg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShwYXRjaHdvcmspDQoNCiMgR2nhuqMgc+G7rSAnZGF0YScgbMOgIGRhdGEgZnJhbWUgY+G7p2EgYuG6oW4NCmRlcHRfY291bnRzIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KFByb2R1Y3REZXBhcnRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBhcnJhbmdlKG4pICMgU+G6r3AgeOG6v3AgdGhlbyBz4buRIGzGsOG7o25nIMSR4buDIGNoaWENCg0Kbl9kZXB0cyA8LSBucm93KGRlcHRfY291bnRzKQ0KbWlkX3BvaW50IDwtIGNlaWxpbmcobl9kZXB0cyAvIDIpDQoNCiMgROG7ryBsaeG7h3UgY2hvIGJp4buDdSDEkeG7kyB0aOG7qSBuaOG6pXQgKG7hu61hIMSR4bqndSkNCmRlcHRfY291bnRzXzEgPC0gaGVhZChkZXB0X2NvdW50cywgbWlkX3BvaW50KQ0KDQpwbG90MSA8LSBnZ3Bsb3QoZGVwdF9jb3VudHNfMSwgYWVzKHggPSBQcm9kdWN0RGVwYXJ0bWVudCwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzQxNjlFMSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSArDQogIGxhYnMoeCA9ICJQcm9kdWN0IERlcGFydG1lbnQiLCB5ID0gIk51bWJlciIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDgpKQ0KDQojIEThu68gbGnhu4d1IGNobyBiaeG7g3UgxJHhu5MgdGjhu6kgaGFpIChu4butYSBzYXUpDQpkZXB0X2NvdW50c18yIDwtIHRhaWwoZGVwdF9jb3VudHMsIG5fZGVwdHMgLSBtaWRfcG9pbnQpDQoNCnBsb3QyIDwtIGdncGxvdChkZXB0X2NvdW50c18yLCBhZXMoeCA9IFByb2R1Y3REZXBhcnRtZW50LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjNDE2OUUxIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsNCiAgbGFicyh4ID0gIlByb2R1Y3QgRGVwYXJ0bWVudCIsIHkgPSAiTnVtYmVyIikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gOCkpDQoNCiMgS+G6v3QgaOG7o3AgaGFpIGJp4buDdSDEkeG7kyBs4bqhaSB24bubaSBuaGF1DQpwbG90MSArIHBsb3QyDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTIHRhIHRo4bqleSDEkcaw4bujYyBsw6A6DQoNCioqQ8OhYyBi4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0gY8OzIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggbOG7m246KioNCg0KLSAqKlByb2R1Y2U6KiogR2hpIG5o4bqtbiBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIGNhbyBuaOG6pXQgduG7m2kgMTk5NCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxNC4xOCUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2guDQotICoqU25hY2sgRm9vZHM6KiogxJDhu6luZyB0aOG7qSBoYWkgduG7m2kgMTYwMCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxMS4zOCUuDQotICoqSG91c2Vob2xkOioqIEPDsyAxNDIwIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEwLjEwJS4NCi0gKipGcm96ZW4gRm9vZHM6KiogQ8OzIDEzODIgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgOS44MyUuDQotICoqQmFraW5nIEdvb2RzOioqIEPDsyAxMDcyIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDcuNjMlLg0KLSAqKkNhbm5lZCBGb29kczoqKiBDw7MgOTc3IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDYuOTQlLg0KLSAqKkRhaXJ5OioqIEPDsyA5MDMgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNi40MiUuDQotICoqSGVhbHRoIGFuZCBIeWdpZW5lOioqIEPDsyA4OTMgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNi4zNSUuDQoNCioqQ8OhYyBi4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0gY8OzIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggdHJ1bmcgYsOsbmg6KioNCg0KLSAqKkJldmVyYWdlczoqKiBDw7MgNjgwIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDQuODQlLg0KLSAqKkRlbGk6KiogQ8OzIDY5OSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyA0Ljk3JS4NCi0gKipCYWtlZCBHb29kczoqKiBDw7MgNDI1IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDMuMDIlLg0KLSAqKlNuYWNrczoqKiBDw7MgMzUyIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDIuNTAlLg0KLSAqKkFsY29ob2xpYyBCZXZlcmFnZXM6KiogQ8OzIDM1NiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAyLjUzJS4NCi0gKipTdGFyY2h5IEZvb2RzOioqIEPDsyAyNzcgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS45NyUuDQotICoqUGVyaW9kaWNhbHM6KiogQ8OzIDIwMiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjQ0JS4NCi0gKipFZ2dzOioqIEPDsyAxOTggZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS40MSUuDQotICoqQnJlYWtmYXN0IEZvb2RzOioqIEPDsyAxODggZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS4zNCUuDQotICoqUGFpbiBSZWxpZXZlcnM6KiogQ8OzIDE5MiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjM3JS4NCi0gKipDbGVhbmluZyBTdXBwbGllczoqKiBDw7MgMTg5IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEuMzQlLg0KLSAqKlB1cmUgSnVpY2UgQmV2ZXJhZ2VzOioqIEPDsyAxNjUgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS4xNyUuDQotICoqQ2FyYm9uYXRlZCBCZXZlcmFnZXM6KiogQ8OzIDE1NCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjEwJS4NCi0gKipTaWRlIERpc2hlczoqKiBDw7MgMTUzIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEuMDklLg0KLSAqKlBsYXN0aWMgUHJvZHVjdHM6KiogQ8OzIDE0MSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjAwJS4NCi0gKipEcmlua3M6KiogQ8OzIDEzNSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjk2JS4NCi0gKipIYXJkd2FyZToqKiBDw7MgMTI5IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDAuOTIlLg0KDQoqKkPDoWMgYuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIGPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRo4bqlcDoqKg0KDQotICoqU2VhZm9vZDoqKiBDw7MgMTAyIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDAuNzMlLg0KLSAqKkNhbm5lZCBQcm9kdWN0czoqKiBDw7MgMTA5IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDAuNzglLg0KLSAqKk1lYXQ6KiogQ8OzIDg5IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDAuNjMlLg0KLSAqKkNoZWNrb3V0OioqIEPDsyA4MiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjU4JS4NCi0gKipDYXJvdXNlbDoqKiBDw7MgNTkgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMC40MiUuDQoNCioqVOG7lW5nIHF1YW46KioNCg0KUGjDom4gdMOtY2ggY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5EgZ2lhbyBk4buLY2gga2jDoSDEkWEgZOG6oW5nIGdp4buvYSBjw6FjIGLhu5kgcGjhuq1uIHPhuqNuIHBo4bqpbS4gQuG7mSBwaOG6rW4gKipQcm9kdWNlKiogY8OzIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggY2FvIG5o4bqldCwgdGhlbyBzYXUgbMOgICoqU25hY2sgRm9vZHMqKiB2w6AgKipIb3VzZWhvbGQqKi4gTeG7mXQgc+G7kSBi4buZIHBo4bqtbiBraMOhYyBuaMawICoqRnJvemVuIEZvb2RzKiosICoqQmFraW5nIEdvb2RzKiosIHbDoCAqKkNhbm5lZCBGb29kcyoqIGPFqW5nIGPDsyBsxrDhu6NuZyBnaWFvIGThu4tjaCDEkcOhbmcga+G7gy4gTmfGsOG7o2MgbOG6oWksIGPDoWMgYuG7mSBwaOG6rW4gbmjGsCAqKkNhcm91c2VsKiosICoqQ2hlY2tvdXQqKiwgdsOgICoqTWVhdCoqIGPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRo4bqlcCBoxqFuIG5oaeG7gXUuDQoNCiMjIyMgKipCaeG6v24gUHJvZHVjdCBDYXRlZ29yeSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YSRQcm9kdWN0Q2F0ZWdvcnkpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YSRQcm9kdWN0Q2F0ZWdvcnkpL3N1bSh0YWJsZShkYXRhJFByb2R1Y3RDYXRlZ29yeSkpDQpgYGANCg0KKipW4bq9IMSR4buTIHRo4buLKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShwYXRjaHdvcmspDQoNCiMgR2nhuqMgc+G7rSAnZGF0YScgbMOgIGRhdGEgZnJhbWUgY+G7p2EgYuG6oW4NCmNhdGVnb3J5X2NvdW50cyA8LSBkYXRhICU+JQ0KICBncm91cF9ieShQcm9kdWN0Q2F0ZWdvcnkpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGFycmFuZ2UobikgIyBT4bqvcCB44bq/cCB0aGVvIHPhu5EgbMaw4bujbmcgxJHhu4MgY2hpYQ0KDQpuX2NhdGVnb3JpZXMgPC0gbnJvdyhjYXRlZ29yeV9jb3VudHMpDQptaWRfcG9pbnQgPC0gY2VpbGluZyhuX2NhdGVnb3JpZXMgLyAyKQ0KDQojIEThu68gbGnhu4d1IGNobyBiaeG7g3UgxJHhu5MgdGjhu6kgbmjhuqV0IChu4butYSDEkeG6p3UgdGhlbyBz4buRIGzGsOG7o25nKQ0KY2F0ZWdvcnlfY291bnRzXzEgPC0gaGVhZChjYXRlZ29yeV9jb3VudHMsIG1pZF9wb2ludCkNCg0KcGxvdDFfY2F0IDwtIGdncGxvdChjYXRlZ29yeV9jb3VudHNfMSwgYWVzKHggPSBQcm9kdWN0Q2F0ZWdvcnksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiNGRkEwN0EiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSkgKw0KICBsYWJzKHggPSAiUHJvZHVjdCBDYXRlZ29yeSIsIHkgPSAiTnVtYmVyIikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gNikpDQoNCiMgROG7ryBsaeG7h3UgY2hvIGJp4buDdSDEkeG7kyB0aOG7qSBoYWkgKG7hu61hIHNhdSB0aGVvIHPhu5EgbMaw4bujbmcpDQpjYXRlZ29yeV9jb3VudHNfMiA8LSB0YWlsKGNhdGVnb3J5X2NvdW50cywgbl9jYXRlZ29yaWVzIC0gbWlkX3BvaW50KQ0KDQpwbG90Ml9jYXQgPC0gZ2dwbG90KGNhdGVnb3J5X2NvdW50c18yLCBhZXMoeCA9IFByb2R1Y3RDYXRlZ29yeSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0ZGQTA3QSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSArDQogIGxhYnMoeCA9ICJQcm9kdWN0IENhdGVnb3J5IiwgeSA9ICJOdW1iZXIiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSA2KSkNCg0KIyBL4bq/dCBo4bujcCBoYWkgYmnhu4N1IMSR4buTIGzhuqFpIHbhu5tpIG5oYXUNCnBsb3QxX2NhdCArIHBsb3QyX2NhdA0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IMSRxrDhu6NjIGzDoDoNCg0KKipDw6FjIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIGPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHLhuqV0IGzhu5tuOioqDQoNCi0gKipQcm9kdWNlOioqIEdoaSBuaOG6rW4gc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCBjYW8gbmjhuqV0IHbhu5tpIDE5OTQgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMTQuMTglIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoLg0KLSAqKlZlZ2V0YWJsZXM6KiogxJDhu6luZyB0aOG7qSBoYWkgduG7m2kgMTcyOCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxMi4yOSUuDQotICoqU25hY2sgRm9vZHM6KiogxJDhu6luZyB0aOG7qSBiYSB24bubaSAxNjAwIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDExLjM4JS4NCi0gKipIb3VzZWhvbGQ6KiogQ8OzIDE0MjAgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMTAuMTAlLg0KLSAqKkZyb3plbiBGb29kczoqKiBDw7MgMTM4MiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyA5LjgzJS4NCi0gKipCYWtpbmcgR29vZHM6KiogQ8OzIDEwNzIgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNy42MyUuDQotICoqQ2FubmVkIEZvb2RzOioqIEPDsyA5NzcgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNi45NSUuDQotICoqRGFpcnk6KiogQ8OzIDkwMyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyA2LjQyJS4NCg0KKipDw6FjIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIGPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRydW5nIGLDrG5oOioqDQoNCi0gKipGcnVpdDoqKiBDw7MgNzY1IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDUuNDQlLg0KLSAqKk1lYXQ6KiogQ8OzIDc2MSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyA1LjQxJS4NCi0gKipKYW1zIGFuZCBKZWxsaWVzOioqIEPDsyA1ODggZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgNC4xOCUuDQotICoqQnJlYWQ6KiogQ8OzIDQyNSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAzLjAyJS4NCi0gKipCcmVha2Zhc3QgRm9vZHM6KiogQ8OzIDQxNyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAyLjk3JS4NCi0gKipCYXRocm9vbSBQcm9kdWN0czoqKiBDw7MgMzY1IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDIuNjAlLg0KLSAqKkFsY29ob2xpYyBCZXZlcmFnZXM6KiogQ8OzIDM1NiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAyLjUzJS4NCi0gKipFbGVjdHJpY2FsOioqIEPDsyAzNTUgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMi41MiUuDQotICoqQ2FuZHk6KiogQ8OzIDM1MiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAyLjUwJS4NCi0gKipQYXBlciBQcm9kdWN0czoqKiBDw7MgMzQ1IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDIuNDUlLg0KLSAqKkZyb3plbiBEZXNzZXJ0czoqKiBDw7MgMzIzIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDIuMzAlLg0KLSAqKlNwZWNpYWx0eToqKiBDw7MgMjg5IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDIuMDYlLg0KLSAqKlN0YXJjaHkgRm9vZHM6KiogQ8OzIDI3NyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjk3JS4NCi0gKipIb3QgQmV2ZXJhZ2VzOioqIEPDsyAyMjYgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS42MSUuDQotICoqS2l0Y2hlbiBQcm9kdWN0czoqKiBDw7MgMjE3IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEuNTQlLg0KLSAqKk1hZ2F6aW5lczoqKiBDw7MgMjAyIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEuNDQlLg0KLSAqKkVnZ3M6KiogQ8OzIDE5OCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjQxJS4NCi0gKipIeWdpZW5lOioqIEPDsyAxOTcgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS40MCUuDQotICoqUGl6emE6KiogQ8OzIDE5NCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjM4JS4NCi0gKipQYWluIFJlbGlldmVyczoqKiBDw7MgMTkyIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEuMzclLg0KLSAqKkNsZWFuaW5nIFN1cHBsaWVzOioqIEPDsyAxODkgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS4zNCUuDQotICoqRHJpbmtzOioqIEPDsyAxMzUgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMC45NiUuDQotICoqSGFyZHdhcmU6KiogQ8OzIDEyOSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjkyJS4NCi0gKipQdXJlIEp1aWNlIEJldmVyYWdlczoqKiBDw7MgMTY1IGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDEuMTclLg0KLSAqKkNhcmJvbmF0ZWQgQmV2ZXJhZ2VzOioqIEPDsyAxNTQgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS4xMCUuDQotICoqU2lkZSBEaXNoZXM6KiogQ8OzIDE1MyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAxLjA5JS4NCi0gKipQbGFzdGljIFByb2R1Y3RzOioqIEPDsyAxNDEgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMS4wMCUuDQoNCioqQ8OhYyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBjw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCB0aOG6pXA6KioNCg0KLSAqKlNlYWZvb2Q6KiogQ8OzIDEwMiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjczJS4NCi0gKipDb2xkIFJlbWVkaWVzOioqIEPDsyA5MyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjY2JS4NCi0gKipDYW5uZWQgVHVuYToqKiBDw7MgODcgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMC42MiUuDQotICoqRGVjb25nZXN0YW50czoqKiBDw7MgODUgZ2lhbyBk4buLY2gsIGNoaeG6v20ga2hv4bqjbmcgMC42MCUuDQotICoqQ2FubmVkIENsYW1zOioqIEPDsyA1MyBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjM4JS4NCi0gKipQYWNrYWdlZCBWZWdldGFibGVzOioqIEPDsyA0OCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjM0JS4NCi0gKipDYW5kbGVzOioqIEPDsyA0NSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjMyJS4NCi0gKipNaXNjZWxsYW5lb3VzOioqIEPDsyA0MiBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjMwJS4NCi0gKipDYW5uZWQgQW5jaG92aWVzOioqIEPDsyA0NCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjMxJS4NCi0gKipDYW5uZWQgU2hyaW1wOioqIEPDsyAzOCBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjI3JS4NCi0gKipDYW5uZWQgU2FyZGluZXM6KiogQ8OzIDQwIGdpYW8gZOG7i2NoLCBjaGnhur9tIGtob+G6o25nIDAuMjglLg0KLSAqKkNhbm5lZCBPeXN0ZXJzOioqIEPDsyAzNSBnaWFvIGThu4tjaCwgY2hp4bq/bSBraG/huqNuZyAwLjI1JS4NCg0KDQoqKlThu5VuZyBxdWFuOioqDQoNClBow6JuIHTDrWNoIGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIGdpYW8gZOG7i2NoIHLhuqV0IGtow6FjIG5oYXUgZ2nhu69hIGPDoWMgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0uIEPDoWMgZGFuaCBt4bulYyBuaMawICoqUHJvZHVjZSoqLCAqKlZlZ2V0YWJsZXMqKiwgKipTbmFjayBGb29kcyoqLCAqKkhvdXNlaG9sZCoqLCB2w6AgKipGcm96ZW4gRm9vZHMqKiBjw7Mgc+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCBjYW8gbmjhuqV0LCBjaG8gdGjhuqV5IMSRw6J5IGzDoCBuaOG7r25nIG5ow7NtIHPhuqNuIHBo4bqpbSBwaOG7lSBiaeG6v24gbmjhuqV0LiBOZ8aw4bujYyBs4bqhaSwgbmhp4buBdSBkYW5oIG3hu6VjIGtow6FjIGPDsyBz4buRIGzGsOG7o25nIGdpYW8gZOG7i2NoIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDLCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIHF1YW4gdMOibSBob+G6t2Mgbmh1IGPhuqd1IGtow6FjIG5oYXUgdOG7qyBwaMOtYSBraMOhY2ggaMOgbmcuIA0KDQojIyMgKipQaMOibiB0w61jaCBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nKioNCg0KIyMjIyAqKkJp4bq/biBDaGlsZHJlbioqDQoNCioqVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIENoaWxkcmVuKioNCmBgYHtyfQ0KQ2hpbGRyZW4gPC0gc3VtbWFyeShkYXRhJENoaWxkcmVuKQ0KcHJpbnQoQ2hpbGRyZW4pDQpgYGANCg0KKipW4bq9IMSR4buTIHRo4buLKioNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBmYWN0b3IoQ2hpbGRyZW4pKSkgKyAjIENodXnhu4NuIHNhbmcgZmFjdG9yIMSR4buDIHbhur0gcuG7nWkgcuG6oWMNCiAgZ2VvbV9iYXIoZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoDQogICAgICAgeCA9ICJT4buRIGzGsOG7o25nIGNvbiBjw6FpIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIikgKw0KICB0aGVtZV9idygpICsNCiAgZ2VvbV90ZXh0KHN0YXQ9J2NvdW50JywgYWVzKGxhYmVsPS4uY291bnQuLiksIHZqdXN0PS0wLjUpICMgVGjDqm0gc+G7kSBsxrDhu6NuZyB0csOqbiBj4buZdA0KYGBgDQoNCioqROG7sWEgdsOgbyBi4bqjbmcgdGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIHbDoCDEkeG7kyB0aOG7iyB0YSBjw7Mgbmjhuq1uIHjDqXQgbmjGsCBzYXU6KioNCg0KLSAqKkdpw6EgdHLhu4sgbmjhu48gbmjhuqV0IChNaW4uKToqKiBT4buRIGzGsOG7o25nIGNvbiBjw6FpIMOtdCBuaOG6pXQgbMOgICoqMCoqLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7Mgbmjhu69uZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBjb24uDQotICoqVOG7qSBwaMOibiB24buLIHRo4bupIG5o4bqldCAoMXN0IFF1Lik6KiogMjUlIGtow6FjaCBow6BuZyBjw7Mgc+G7kSBsxrDhu6NuZyBjb24gY8OhaSBsw6AgKioxKiogaG/hurdjIMOtdCBoxqFuLg0KLSAqKkdpw6EgdHLhu4sgdHJ1bmcgduG7iyAoTWVkaWFuKToqKiBHacOhIHRy4buLIOG7nyBnaeG7r2EgY+G7p2EgcGjDom4gYuG7kSBsw6AgKiozKiouIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCA1MCUga2jDoWNoIGjDoG5nIGPDsyBz4buRIGzGsOG7o25nIGNvbiBjw6FpIGzDoCAqKjMqKiBob+G6t2Mgw610IGjGoW4uDQogICogKipHacOhIHRy4buLIHRydW5nIGLDrG5oIChNZWFuKToqKiBT4buRIGzGsOG7o25nIGNvbiBjw6FpIHRydW5nIGLDrG5oIGzDoCAqKjIuNTMqKi4gR2nDoSB0cuG7iyBuw6B5IHRo4bqlcCBoxqFuIGdpw6EgdHLhu4sgdHJ1bmcgduG7iywgZ+G7o2kgw70gcuG6sW5nIHBow6JuIGLhu5EgY8OzIHRo4buDIGjGoWkgbOG7h2NoIHRyw6FpLCB04bupYyBsw6AgY8OzIG5oaeG7gXUga2jDoWNoIGjDoG5nIGPDsyBz4buRIGzGsOG7o25nIGNvbiBjw6FpIMOtdCBoxqFuIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgY8OzIHPhu5EgbMaw4bujbmcgY29uIGPDoWkgcuG6pXQgbmhp4buBdS4NCi0gKipU4bupIHBow6JuIHbhu4sgdGjhu6kgYmEgKDNyZCBRdS4pOioqIDc1JSBraMOhY2ggaMOgbmcgY8OzIHPhu5EgbMaw4bujbmcgY29uIGPDoWkgbMOgICoqNCoqIGhv4bq3YyDDrXQgaMahbi4NCi0gKipHacOhIHRy4buLIGzhu5tuIG5o4bqldCAoTWF4Lik6KiogU+G7kSBsxrDhu6NuZyBjb24gY8OhaSBuaGnhu4F1IG5o4bqldCBsw6AgKio1KiouDQoNCioqVMOzbSBs4bqhaToqKg0KDQpQaMOibiBi4buRIHPhu5EgbMaw4bujbmcgY29uIGPDoWkgY+G7p2Ega2jDoWNoIGjDoG5nIHThuq1wIHRydW5nIGNo4bunIHnhur91IHRyb25nIGtob+G6o25nIHThu6sgMCDEkeG6v24gNCwgduG7m2kgZ2nDoSB0cuG7iyB0cnVuZyB24buLIGzDoCAzLiBHacOhIHRy4buLIHRydW5nIGLDrG5oICgyLjUzKSB0aOG6pXAgaMahbiB0cnVuZyB24buLIGNobyB0aOG6pXkgc+G7sSBoaeG7h24gZGnhu4duIGPhu6dhIG5oaeG7gXUga2jDoWNoIGjDoG5nIGPDsyDDrXQgY29uLiBT4buRIGzGsOG7o25nIGNvbiBjw6FpIGRhbyDEkeG7mW5nIHThu6sgMCDEkeG6v24gNSB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBuw6B5Lg0KDQojIyMjICoqVW5pdHMgU29sZCoqDQoNCioqVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIFVuaXRzIFNvbGQqKg0KYGBge3J9DQpVbml0c1NvbGQgPC0gc3VtbWFyeShkYXRhJFVuaXRzU29sZCkNCnByaW50KFVuaXRzU29sZCkNCmBgYA0KDQoNCioqVuG6vSDEkeG7kyB0aOG7iyoqDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gZmFjdG9yKFVuaXRzU29sZCkpKSArICMgQ2h1eeG7g24gc2FuZyBmYWN0b3IgxJHhu4MgduG6vSBy4budaSBy4bqhYw0KICBnZW9tX2JhcihmaWxsID0gImxpZ2h0Y29yYWwiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicygNCiAgICAgICB4ID0gIlPhu5EgbMaw4bujbmcgxJHGoW4gduG7iyBz4bqjbiBwaOG6qW0iLA0KICAgICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBnaWFvIGThu4tjaCIpICsNCiAgdGhlbWVfYncoKSArDQogIGdlb21fdGV4dChzdGF0PSdjb3VudCcsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMC41KSAjIFRow6ptIHPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2ggdHLDqm4gY+G7mXQNCmBgYA0KDQoqKkThu7FhIHbDoG8gYuG6o25nIHRo4buRbmcga8OqIG3DtCB04bqjIGNobyB2w6AgxJHhu5MgdGjhu4sgdGEgY8OzIG5o4bqtbiB4w6l0IG5oxrAgc2F1OioqDQoNCi0gKipHacOhIHRy4buLIG5o4buPIG5o4bqldCAoTWluLik6KiogU+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSBiw6FuIHJhIMOtdCBuaOG6pXQgdHJvbmcgbeG7mXQgZ2lhbyBk4buLY2ggbMOgICoqMSoqLg0KLSAqKlThu6kgcGjDom4gduG7iyB0aOG7qSBuaOG6pXQgKDFzdCBRdS4pOioqIDI1JSBnaWFvIGThu4tjaCBjw7Mgc+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSBiw6FuIHJhIGzDoCAqKjMqKiBob+G6t2Mgw610IGjGoW4uDQotICoqR2nDoSB0cuG7iyB0cnVuZyB24buLIChNZWRpYW4pOioqIEdpw6EgdHLhu4sg4bufIGdp4buvYSBj4bunYSBwaMOibiBi4buRIGzDoCAqKjQqKi4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIDUwJSBnaWFvIGThu4tjaCBjw7Mgc+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSBiw6FuIHJhIGzDoCAqKjQqKiBob+G6t2Mgw610IGjGoW4uDQotICoqR2nDoSB0cuG7iyB0cnVuZyBiw6xuaCAoTWVhbik6KiogU+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSBiw6FuIHJhIHRydW5nIGLDrG5oIHRyb25nIG3hu5l0IGdpYW8gZOG7i2NoIGzDoCAqKjQuMDgxKiouIEdpw6EgdHLhu4sgbsOgeSBoxqFpIGNhbyBoxqFuIGdpw6EgdHLhu4sgdHJ1bmcgduG7iywgY2hvIHRo4bqleSBwaMOibiBi4buRIGPDsyB0aOG7gyBoxqFpIGzhu4djaCBwaOG6o2kgKMSRdcO0aSBiw6puIHBo4bqjaSBkw6BpIGjGoW4pLCBjw7MgbmdoxKlhIGzDoCBjw7MgbeG7mXQgc+G7kSBnaWFvIGThu4tjaCBjw7Mgc+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSBiw6FuIHJhIGNhbyBoxqFuIMSRw6FuZyBr4buDLg0KLSAqKlThu6kgcGjDom4gduG7iyB0aOG7qSBiYSAoM3JkIFF1Lik6KiogNzUlIGdpYW8gZOG7i2NoIGPDsyBz4buRIGzGsOG7o25nIMSRxqFuIHbhu4sgc+G6o24gcGjhuqltIGLDoW4gcmEgbMOgICoqNSoqIGhv4bq3YyDDrXQgaMahbi4NCi0gKipHacOhIHRy4buLIGzhu5tuIG5o4bqldCAoTWF4Lik6KiogU+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSBiw6FuIHJhIG5oaeG7gXUgbmjhuqV0IHRyb25nIG3hu5l0IGdpYW8gZOG7i2NoIGzDoCAqKjgqKi4NCg0KKipUw7NtIGzhuqFpOioqDQoNClBow6JuIGLhu5Egc+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSBiw6FuIHJhIHRyb25nIGPDoWMgZ2lhbyBk4buLY2ggdOG6rXAgdHJ1bmcgY2jhu6cgeeG6v3UgdHJvbmcga2hv4bqjbmcgdOG7qyAxIMSR4bq/biA1LCB24bubaSBnacOhIHRy4buLIHRydW5nIHbhu4sgbMOgIDQuIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggKDQuMDgxKSBjYW8gaMahbiBt4buZdCBjaMO6dCBzbyB24bubaSB0cnVuZyB24buLIGNobyB0aOG6pXkgY8OzIG3hu5l0IHbDoGkgZ2lhbyBk4buLY2ggduG7m2kgc+G7kSBsxrDhu6NuZyBs4bubbiBz4bqjbiBwaOG6qW0uIFPhu5EgbMaw4bujbmcgxJHGoW4gduG7iyBz4bqjbiBwaOG6qW0gYsOhbiByYSBkYW8gxJHhu5luZyB04burIDEgxJHhur9uIDggdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeS4NCg0KIyMjIyAqKlJldmVudWUqKg0KDQoqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBSZXZlbnVlKioNCmBgYHtyfQ0KUmV2ZW51ZSA8LSBzdW1tYXJ5KGRhdGEkUmV2ZW51ZSkNCnByaW50KFJldmVudWUpDQpgYGANCg0KKipW4bq9IMSR4buTIHRo4buLKioNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gUmV2ZW51ZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICBmaWxsID0gInN0ZWVsYmx1ZSIsDQogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKA0KICAgICAgIHggPSAiRG9hbmggdGh1IChVU0QpIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmcgZ2lhbyBk4buLY2giKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQoqKkThu7FhIHbDoG8gYuG6o25nIHRo4buRbmcga8OqIG3DtCB04bqjIGNobyB2w6AgxJHhu5MgdGjhu4sgdGEgY8OzIG5o4bqtbiB4w6l0IG5oxrAgc2F1OioqDQoNCi0gKipHacOhIHRy4buLIG5o4buPIG5o4bqldCAoTWluLik6KiogRG9hbmggdGh1IHRo4bqlcCBuaOG6pXQgdOG7qyBt4buZdCBnaWFvIGThu4tjaCBsw6AgKiowLjUzIFVTRCoqLg0KLSAqKlThu6kgcGjDom4gduG7iyB0aOG7qSBuaOG6pXQgKDFzdCBRdS4pOioqIDI1JSBnaWFvIGThu4tjaCBjw7MgZG9hbmggdGh1IGzDoCAqKjYuODQgVVNEKiogaG/hurdjIHRo4bqlcCBoxqFuLg0KLSAqKkdpw6EgdHLhu4sgdHJ1bmcgduG7iyAoTWVkaWFuKToqKiBN4bupYyBkb2FuaCB0aHUg4bufIGdp4buvYSBj4bunYSBwaMOibiBi4buRIGzDoCAqKjExLjI1IFVTRCoqLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgNTAlIGdpYW8gZOG7i2NoIGPDsyBkb2FuaCB0aHUgbMOgICoqMTEuMjUgVVNEKiogaG/hurdjIHRo4bqlcCBoxqFuLg0KLSAqKkdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggKE1lYW4pOioqIERvYW5oIHRodSB0cnVuZyBiw6xuaCB0csOqbiBt4buXaSBnaWFvIGThu4tjaCBsw6AgKioxMy4wMCBVU0QqKi4gR2nDoSB0cuG7iyBuw6B5IGNhbyBoxqFuIGdpw6EgdHLhu4sgdHJ1bmcgduG7iywgY2hvIHRo4bqleSBwaMOibiBi4buRIGRvYW5oIHRodSBjw7MgdGjhu4MgaMahaSBs4buHY2ggcGjhuqNpICjEkXXDtGkgYsOqbiBwaOG6o2kgZMOgaSBoxqFuKSwgY8OzIG5naMSpYSBsw6AgY8OzIG3hu5l0IHPhu5EgZ2lhbyBk4buLY2ggY8OzIGRvYW5oIHRodSBy4bqldCBjYW8ga8OpbyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDqm4uDQotICoqVOG7qSBwaMOibiB24buLIHRo4bupIGJhICgzcmQgUXUuKToqKiA3NSUgZ2lhbyBk4buLY2ggY8OzIGRvYW5oIHRodSBsw6AgKioxNy4zNyBVU0QqKiBob+G6t2MgdGjhuqVwIGjGoW4uDQotICoqR2nDoSB0cuG7iyBs4bubbiBuaOG6pXQgKE1heC4pOioqIERvYW5oIHRodSBjYW8gbmjhuqV0IHThu6sgbeG7mXQgZ2lhbyBk4buLY2ggbMOgICoqNTYuNzAgVVNEKiouDQoNCioqVMOzbSBs4bqhaToqKg0KDQpQaMOibiBi4buRIGRvYW5oIHRodSB04burIGPDoWMgZ2lhbyBk4buLY2ggdOG6rXAgdHJ1bmcgY2jhu6cgeeG6v3UgdHJvbmcga2hv4bqjbmcgdOG7qyAwLjUzIFVTRCDEkeG6v24gMTcuMzcgVVNELCB24bubaSBt4bupYyBkb2FuaCB0aHUgdHJ1bmcgYsOsbmggbMOgIDEzLjAwIFVTRCB2w6AgZ2nDoSB0cuG7iyB0cnVuZyB24buLIGzDoCAxMS4yNSBVU0QuIFPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBnacOhIHRy4buLIHRydW5nIGLDrG5oIHbDoCB0cnVuZyB24buLIGNobyB0aOG6pXkgY8OzIHPhu7EgaGnhu4duIGRp4buHbiBj4bunYSBt4buZdCBz4buRIGdpYW8gZOG7i2NoIGPDsyBkb2FuaCB0aHUgY2FvIGjGoW4gxJHDoW5nIGvhu4MuIERvYW5oIHRodSBkYW8gxJHhu5luZyB04burIDAuNTMgVVNEIMSR4bq/biA1Ni43MCBVU0QgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeS4NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K